diff options
Diffstat (limited to 'viewer/tools/smoke.sh')
| -rwxr-xr-x | viewer/tools/smoke.sh | 45 |
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" |
