worldmap-viewer

git clone https://git.godosa.eu/worldmap-viewer

master

raw · 2109 bytes

#!/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"