This repository has no description
3.8 kB
112 lines
1{ ... }:
2{
3 perSystem =
4 { pkgs, ... }:
5 let
6 src = pkgs.fetchFromGitHub {
7 owner = "audibleblink";
8 repo = "worldview";
9 rev = "8fc39cf28d2334d4902bc552ec4a18f3c746af20";
10 hash = "sha256-effKF2cxG6r5Aw4DT6ZuJzbpRCBeFTQS3wxdh57AHEI=";
11 };
12 in
13 {
14 packages.worldview = pkgs.writeShellApplication {
15 name = "worldview";
16 runtimeInputs = [
17 pkgs.bun
18 pkgs.ungoogled-chromium
19 pkgs.python3
20 pkgs.curl
21 pkgs.gnused
22 ];
23 text = ''
24 # Required env vars
25 if [ -z "''${GOOGLE_MAPS_TILE_API_KEY:-}" ]; then
26 echo "ERROR: GOOGLE_MAPS_TILE_API_KEY is not set" >&2
27 echo "Get one at: https://console.cloud.google.com/google/maps-apis/credentials" >&2
28 echo "Export it: export GOOGLE_MAPS_TILE_API_KEY=your_key_here" >&2
29 exit 1
30 fi
31
32 get_free_port() {
33 python3 -c 'import socket; s=socket.socket(); s.bind(("",0)); print(s.getsockname()[1]); s.close()'
34 }
35
36 FRONTEND_PORT=$(get_free_port)
37 BACKEND_PORT=$(get_free_port)
38
39 WORKDIR="''${XDG_DATA_HOME:-$HOME/.local/share}/worldview"
40 mkdir -p "$WORKDIR"
41
42 # Copy source if not yet present or if version changed
43 MARKER="$WORKDIR/.version"
44 CURRENT_REV="8fc39cf28d2334d4902bc552ec4a18f3c746af20"
45 if [ ! -f "$MARKER" ] || [ "$(cat "$MARKER")" != "$CURRENT_REV" ]; then
46 echo "Setting up worldview source..."
47 rm -rf "$WORKDIR/src"
48 cp -r ${src} "$WORKDIR/src"
49 chmod -R u+w "$WORKDIR/src"
50 echo "$CURRENT_REV" > "$MARKER"
51 rm -f "$WORKDIR/.installed"
52 fi
53
54 cd "$WORKDIR/src"
55
56 # Install dependencies if needed
57 if [ ! -f "$WORKDIR/.installed" ]; then
58 echo "Installing dependencies..."
59 bun install
60 touch "$WORKDIR/.installed"
61 fi
62
63 # Patch hardcoded ports in source
64 sed -i 's|const PORT = [0-9]*;|const PORT = '"$FRONTEND_PORT"';|' src/server.ts
65 sed -i 's|http://localhost:[0-9]*"|http://localhost:'"$BACKEND_PORT"'"|g' src/config.ts
66
67 cleanup() {
68 echo "Shutting down..."
69 # Kill entire process group to catch bun child processes
70 kill -- -$$ 2>/dev/null || true
71 }
72 trap cleanup EXIT INT TERM
73
74 export GOOGLE_MAPS_TILE_API_KEY
75 export SERVER_PORT="$BACKEND_PORT"
76 ''${AISSTREAM_API_KEY:+export AISSTREAM_API_KEY}
77
78 # Start backend server
79 bun run --hot src/server/index.ts &
80
81 # Start frontend dev server
82 bun run --hot src/server.ts &
83
84 # Wait for frontend to be ready
85 for _ in $(seq 1 30); do
86 if curl -s "http://localhost:$FRONTEND_PORT" > /dev/null 2>&1; then
87 break
88 fi
89 sleep 1
90 done
91
92 echo "WorldView is running at http://localhost:$FRONTEND_PORT"
93
94 # Open in chromium app mode with a dedicated profile
95 CHROME_DIR="$WORKDIR/chromium-profile"
96 # Remove stale singleton locks from crashed sessions
97 rm -f "$CHROME_DIR/SingletonLock" "$CHROME_DIR/SingletonCookie" "$CHROME_DIR/SingletonSocket"
98 mkdir -p "$CHROME_DIR"
99 chromium \
100 --user-data-dir="$CHROME_DIR" \
101 --no-first-run \
102 --no-default-browser-check \
103 --disable-gpu-compositing \
104 --app="http://localhost:$FRONTEND_PORT" &
105 CHROME_PID=$!
106
107 # Wait for chromium to exit (closing the window kills the process)
108 wait "$CHROME_PID" 2>/dev/null || true
109 '';
110 };
111 };
112}