master
AdityaAngajala Publish 0.3.0 6d39e2e 2mo ago
import { createReadStream, statSync } from "node:fs";
import { createServer } from "node:http";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";

const directory = dirname(fileURLToPath(import.meta.url));
const port = Number.parseInt(process.env.CIRCUIT_PORT || "8124", 10);
const files = new Map([
  ["/", ["index.html", "text/html; charset=utf-8"]],
  ["/index.html", ["index.html", "text/html; charset=utf-8"]],
  ["/v9", ["index-v9.html", "text/html; charset=utf-8"]],
  ["/index-v9.html", ["index-v9.html", "text/html; charset=utf-8"]],
  ["/v8", ["index-v8.html", "text/html; charset=utf-8"]],
  ["/index-v8.html", ["index-v8.html", "text/html; charset=utf-8"]],
  ["/v7", ["index-v7.html", "text/html; charset=utf-8"]],
  ["/index-v7.html", ["index-v7.html", "text/html; charset=utf-8"]],
  ["/v6", ["index-v6.html", "text/html; charset=utf-8"]],
  ["/index-v6.html", ["index-v6.html", "text/html; charset=utf-8"]],
  ["/circuit-animation-conductor.js", ["circuit-animation-conductor.js", "text/javascript; charset=utf-8"]],
  ["/circuit-animation-handshake.js", ["circuit-animation-handshake.js", "text/javascript; charset=utf-8"]],
  ["/circuit-animation-growth.js", ["circuit-animation-growth.js", "text/javascript; charset=utf-8"]],
  ["/circuit-animation-reflection.js", ["circuit-animation-reflection.js", "text/javascript; charset=utf-8"]],
  ["/circuit-reveal-flow.js", ["circuit-reveal-flow.js", "text/javascript; charset=utf-8"]],
  ["/circuit-reveal-scroll.js", ["circuit-reveal-scroll.js", "text/javascript; charset=utf-8"]],
  ["/circuit-field-stream.js", ["circuit-field-stream.js", "text/javascript; charset=utf-8"]],
  ["/circuit-field-hybrid-v8.js", ["circuit-field-hybrid-v8.js", "text/javascript; charset=utf-8"]],
  ["/circuit-field-hybrid-client-v8.js", ["circuit-field-hybrid-client-v8.js", "text/javascript; charset=utf-8"]],
  ["/circuit-field-hybrid-worker-v8.js", ["circuit-field-hybrid-worker-v8.js", "text/javascript; charset=utf-8"]],
  ["/circuit-field-hybrid-v9.js", ["circuit-field-hybrid-v9.js", "text/javascript; charset=utf-8"]],
  ["/circuit-field-hybrid-client-v9.js", ["circuit-field-hybrid-client-v9.js", "text/javascript; charset=utf-8"]],
  ["/circuit-field-hybrid-worker-v9.js", ["circuit-field-hybrid-worker-v9.js", "text/javascript; charset=utf-8"]],
  ["/circuit-trace-stager-v8.js", ["circuit-trace-stager-v8.js", "text/javascript; charset=utf-8"]],
  ["/circuit-field-stream-client.js", ["circuit-field-stream-client.js", "text/javascript; charset=utf-8"]],
  ["/circuit-field-stream-worker.js", ["circuit-field-stream-worker.js", "text/javascript; charset=utf-8"]],
  ["/circuit-reveal-stream.js", ["circuit-reveal-stream.js", "text/javascript; charset=utf-8"]],
  ["/circuit-reveal-stream-v8.js", ["circuit-reveal-stream-v8.js", "text/javascript; charset=utf-8"]],
  ["/circuit-background-v4.js", ["circuit-background-v4.js", "text/javascript; charset=utf-8"]],
  ["/circuit-background-v5.js", ["circuit-background-v5.js", "text/javascript; charset=utf-8"]],
  ["/circuit-background-v6.js", ["circuit-background-v6.js", "text/javascript; charset=utf-8"]],
  ["/circuit-background-v7.js", ["circuit-background-v7.js", "text/javascript; charset=utf-8"]],
  ["/circuit-background-v8.js", ["circuit-background-v8.js", "text/javascript; charset=utf-8"]],
  ["/circuit-background-v9.js", ["circuit-background-v9.js", "text/javascript; charset=utf-8"]],
  ["/circuit-geometry-v9.js", ["circuit-geometry-v9.js", "text/javascript; charset=utf-8"]],
  ["/circuit-obstacles-v9.js", ["circuit-obstacles-v9.js", "text/javascript; charset=utf-8"]],
  ["/circuit-background-v3.js", ["circuit-background-v3.js", "text/javascript; charset=utf-8"]],
  ["/circuit-background-v2.js", ["circuit-background-v2.js", "text/javascript; charset=utf-8"]],
]);

function headers(contentType) {
  return {
    "Content-Type": contentType,
    "Cache-Control": "no-store, no-cache, must-revalidate, proxy-revalidate",
    Pragma: "no-cache",
    "Surrogate-Control": "no-store",
    "X-Content-Type-Options": "nosniff",
  };
}

const server = createServer((request, response) => {
  const url = new URL(request.url || "/", `http://${request.headers.host || "localhost"}`);

  if (url.pathname === "/health") {
    response.writeHead(200, headers("application/json; charset=utf-8"));
    response.end(
      JSON.stringify({ ok: true, service: "circuit-generator-codex", uptime: process.uptime() }),
    );
    return;
  }

  const match = files.get(url.pathname);
  if (!match) {
    response.writeHead(404, headers("text/plain; charset=utf-8"));
    response.end("Not found\n");
    return;
  }

  const [filename, contentType] = match;
  const path = join(directory, filename);
  const size = statSync(path).size;
  response.writeHead(200, { ...headers(contentType), "Content-Length": size });
  if (request.method === "HEAD") {
    response.end();
    return;
  }
  createReadStream(path).pipe(response);
});

server.listen(port, "0.0.0.0", () => {
  console.log(`[circuit-generator-codex] listening on http://0.0.0.0:${port}`);
});