diff --git a/scripts/dev-start.sh b/scripts/dev-start.sh new file mode 100755 index 0000000..f49b1fa --- /dev/null +++ b/scripts/dev-start.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +# Start local dev stack: node backend (sqlite) + react frontend, ws storage mode. +# Usage: ./scripts/dev-start.sh +# Stop: ./scripts/dev-stop.sh +set -euo pipefail +cd "$(dirname "$0")/.." +mkdir -p tmp data + +# kill anything on the ports (zombies) +for port in 3999 4001; do + pids=$(lsof -ti :$port 2>/dev/null || true) + if [ -n "$pids" ]; then + echo "port $port in use by: $pids — leaving as-is." + echo " (run ./scripts/dev-stop.sh first to restart clean)" + fi +done + +# backend: better-sqlite3, :4001 +if ! lsof -ti :4001 >/dev/null 2>&1; then + echo "starting backend :4001..." + DB_PATH=$(pwd)/data/tracker.sqlite PORT=4001 \ + nohup npm run server:dev > tmp/server.log 2>&1 & + echo $! > tmp/server.pid +else + echo "backend already on :4001" +fi + +# frontend: ws storage, :3999 +if ! lsof -ti :3999 >/dev/null 2>&1; then + echo "starting frontend :3999..." + REACT_APP_STORAGE=ws \ + REACT_APP_BACKEND_URL=http://127.0.0.1:4001 \ + REACT_APP_BACKEND_WS=ws://127.0.0.1:4001/ws \ + BROWSER=none PORT=3999 \ + nohup npm start > tmp/fe.log 2>&1 & + echo $! > tmp/fe.pid +else + echo "frontend already on :3999" +fi + +# wait for ports to listen +echo "waiting for ports..." +for port in 4001 3999; do + for i in {1..30}; do + lsof -ti :$port >/dev/null 2>&1 && break + sleep 1 + done +done + +echo "" +echo "backend : http://127.0.0.1:4001 (curl http://127.0.0.1:4001/health)" +echo "frontend : http://127.0.0.1:3999 (admin / player /display)" +echo "logs : tmp/server.log tmp/fe.log" +echo "stop : ./scripts/dev-stop.sh" diff --git a/scripts/dev-stop.sh b/scripts/dev-stop.sh new file mode 100755 index 0000000..4e67595 --- /dev/null +++ b/scripts/dev-stop.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +# Stop local dev stack. Usage: ./scripts/dev-stop.sh +set -uo pipefail +cd "$(dirname "$0")/.." + +stopped=0 +for port in 3999 4001; do + pids=$(lsof -ti :$port 2>/dev/null || true) + if [ -n "$pids" ]; then + echo "stopping :$port (pid: $pids)" + kill $pids 2>/dev/null || true + stopped=1 + fi +done + +# also kill recorded pids +for f in tmp/server.pid tmp/fe.pid; do + if [ -f "$f" ]; then + pid=$(cat "$f") + kill "$pid" 2>/dev/null || true + rm -f "$f" + fi +done + +# node --watch spawns children — sweep by port pattern +pids=$(pgrep -f "node --watch index.js|react-scripts start" 2>/dev/null || true) +if [ -n "$pids" ]; then + echo "sweeping node dev procs: $pids" + kill $pids 2>/dev/null || true +fi + +if [ "$stopped" = "0" ]; then + echo "nothing running." +fi +echo "stopped."