#!/usr/bin/env bash # smoke.sh [#hash] — serve the map (throwaway pins and regions) and run a browser smoke script. # WORLD= (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"