Something went wrong. Try again.
geometric packing game (tetris-ish) on an icosahedron
Something went wrong. Try again.
2.6 kB · 99 lines
TypeScript
at appview
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100import { createServer, type RequestListener } from "node:http";import { startApplicationRuntime, stopApplicationRuntime } from "../appview/src/runtime.ts";
const runtime = await startApplicationRuntime();
// Rate limiting must always receive the direct socket peer. X-Real-IP is// evaluated later by the API only when that peer is explicitly trusted.delete process.env.ADDRESS_HEADER;
delete process.env.XFF_DEPTH;
let handler: RequestListener;
try { const generated = await import(new URL("../build/handler.js", import.meta.url).href); // SAFETY: adapter-node exports its generated HTTP handler as a Node RequestListener. handler = generated.handler as RequestListener;} catch (error) { await stopApplicationRuntime();
throw error;}
const server = createServer(handler);let stopping: Promise<void> | null = null;
server.on("error", (error) => { log("error", "http_server_failed", { error: error.name }); process.exitCode = 1; void shutdown();});
try { await new Promise<void>((resolve, reject) => { server.once("error", reject); server.listen(runtime.port, runtime.host, () => { server.off("error", reject); resolve(); }); });} catch (error) { await stopApplicationRuntime();
throw error;}
log("info", "site_listening", { host: runtime.host, port: runtime.port, database: process.env.DATABASE_PATH ?? "appview/data/appview.sqlite", ingestionEnabled: runtime.worker.status().enabled,});
process.on("SIGTERM", () => { void shutdown(); });
process.on("SIGINT", () => { void shutdown(); });
function shutdown(): Promise<void> { if (stopping) return stopping;
stopping = (async () => { const forceClose = setTimeout(() => { log("error", "http_shutdown_timed_out"); server.closeAllConnections(); }, 10_000);
const forceExit = setTimeout(() => { log("error", "shutdown_timed_out"); process.exit(1); }, 14_000);
forceClose.unref(); forceExit.unref();
const httpClosed = new Promise<void>((resolve) => { if (!server.listening) { resolve();
return; }
server.close((error) => { if (error) log("warn", "http_server_close_failed", { error: error.name }); resolve(); }); });
await httpClosed; await stopApplicationRuntime(); clearTimeout(forceClose); clearTimeout(forceExit); })();
return stopping;}
function log(level: "info" | "warn" | "error", event: string, fields: Readonly<Record<string, string | number | boolean>> = {}): void { console[level](JSON.stringify({ at: new Date().toISOString(), level, event, ...fields }));}