#!/usr/bin/env bash # host-on-sx live server launcher. Loads the kernel stdlib, the subsystem # libraries, and the host modules into one sx_server process, then calls # (host/serve PORT ...) which binds the native http-listen server to the # Dream-shaped host app. Runs in the FOREGROUND (http-listen blocks), so this # doubles as a container entrypoint and a local launcher. # # Usage: # bash lib/host/serve.sh # serve on $HOST_PORT (default 8910) # HOST_PORT=8920 bash lib/host/serve.sh # pick a port # # The module list is kept identical to lib/host/conformance.sh so what serves is # exactly what the suites verify. set -uo pipefail cd "$(git rev-parse --show-toplevel)" SX_SERVER="${SX_SERVER:-hosts/ocaml/_build/default/bin/sx_server.exe}" if [ ! -x "$SX_SERVER" ]; then SX_SERVER="/root/rose-ash/hosts/ocaml/_build/default/bin/sx_server.exe" fi if [ ! -x "$SX_SERVER" ]; then echo "ERROR: sx_server.exe not found." >&2 exit 1 fi PORT="${HOST_PORT:-8910}" # Modules: every load line from conformance.sh's MODULES list, minus the ledger # (not needed to serve). server.sx supplies host/serve. MODULES=( "spec/stdlib.sx" "lib/r7rs.sx" "lib/apl/runtime.sx" "lib/datalog/tokenizer.sx" "lib/datalog/parser.sx" "lib/datalog/unify.sx" "lib/datalog/db.sx" "lib/datalog/builtins.sx" "lib/datalog/aggregates.sx" "lib/datalog/strata.sx" "lib/datalog/eval.sx" "lib/datalog/api.sx" "lib/datalog/magic.sx" "lib/acl/schema.sx" "lib/acl/facts.sx" "lib/acl/engine.sx" "lib/acl/explain.sx" "lib/acl/audit.sx" "lib/acl/federation.sx" "lib/acl/api.sx" "lib/relations/schema.sx" "lib/relations/engine.sx" "lib/relations/api.sx" "lib/relations/explain.sx" "lib/relations/federation.sx" "lib/relations/tree.sx" "lib/feed/normalize.sx" "lib/feed/stream.sx" "lib/feed/api.sx" "lib/dream/types.sx" "lib/dream/json.sx" "lib/dream/auth.sx" "lib/dream/error.sx" "lib/dream/router.sx" "lib/host/handler.sx" "lib/host/middleware.sx" "lib/host/sxtp.sx" "lib/host/router.sx" "lib/host/feed.sx" "lib/host/relations.sx" "lib/host/server.sx" ) EPOCH=1 { for M in "${MODULES[@]}"; do echo "(epoch $EPOCH)"; echo "(load \"$M\")"; EPOCH=$((EPOCH+1)) done echo "(epoch $EPOCH)" # Anonymous read endpoints: feed timeline + relations container reads. Guarded # write groups (auth/ACL or internal-HMAC) are added here once their injected # policy is supplied at wiring time. echo "(eval \"(host/serve $PORT (list host/feed-routes host/relations-routes))\")" } | exec "$SX_SERVER"