aboutsummaryrefslogtreecommitdiffziptar.gz
path: root/viewer/tools/smoke.sh
diff options
context:
space:
mode:
Diffstat (limited to 'viewer/tools/smoke.sh')
-rwxr-xr-xviewer/tools/smoke.sh45
1 files changed, 45 insertions, 0 deletions
diff --git a/viewer/tools/smoke.sh b/viewer/tools/smoke.sh
new file mode 100755
index 0000000..6ec48f6
--- /dev/null
+++ b/viewer/tools/smoke.sh
@@ -0,0 +1,45 @@
+#!/usr/bin/env bash
+# smoke.sh <tools/smoke/x.mjs> [#hash] — serve the map (throwaway pins and regions) and run a browser smoke script.
+# WORLD=<world folder> (default: the current folder); PYTHON (default python3); RES=4: that build (default: the viewer's
+# pick); REAL_REGIONS=1: the world's own refined regions (read-only: edits get 403); PUBLIC=1: as serve.py --public.
+set -euo pipefail
+here=$(cd "$(dirname "$0")" && pwd)
+repo=$(cd "$here/../.." && pwd)
+world=$(cd "${WORLD:-.}" && pwd)
+py=${PYTHON:-python3}
+port=${PORT:-8790}
+res_arg=${RES:-}
+real=${REAL_REGIONS:-}
+public=${PUBLIC:-}
+script="$(cd "$(dirname "$1")" && pwd)/$(basename "$1")" # resolve before cd
+log=$(mktemp)
+pins=$(mktemp -d)
+cd "$repo"
+"$py" -u -c "
+import pathlib, tempfile, serve
+ROOT = pathlib.Path('$world')
+from mapgen import config as C
+res = int('$res_arg') if '$res_arg' else serve.pick_res(ROOT, C.load(ROOT)[0])
+tmp = pathlib.Path('$pins')
+regions = {'regions_read_only': True} if '$real' else {'regions_path': tmp / 'regions.json', 'regions_dir': tmp / 'regions'}
+s = serve.make_server(ROOT, res, $port, pins_path=tmp / 'pins.json', exports_dir=tmp / 'exports', workers=2,
+ **regions) # render processes, as serve.main
+s.public = bool('$public')
+import threading; threading.Thread(target=s.tiles.warm, daemon=True).start() # as serve.main does
+print('up', res, flush=True)
+s.serve_forever()" >"$log" 2>&1 &
+pid=$!
+trap 'kill $pid 2>/dev/null || true; rm -rf "$log" "$pins"' EXIT
+for _ in $(seq 240); do grep -q '^up' "$log" && break; sleep 0.5; done
+grep -q '^up' "$log" || { cat "$log"; exit 3; }
+out=$(mktemp)
+trap 'kill $pid 2>/dev/null || true; rm -rf "$log" "$pins" "$out"' EXIT
+for attempt in 1 2 3; do # headless Firefox sometimes cannot create a WebGL context: retry for that case only
+ set +e
+ node "$here/bidi.mjs" "http://127.0.0.1:$port/${2:-}" "$script" | tee "$out"
+ code=${PIPESTATUS[0]}
+ set -e
+ if [ "$code" -eq 0 ] || ! grep -q 'Error creating WebGL context' "$out"; then exit "$code"; fi
+ echo "(headless WebGL unavailable — retrying)"; sleep 3
+done
+exit "$code"