@prisma/composer-prisma-cloud 0.30.0-dev.2 → 0.30.0-dev.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/pack.mjs +1 -1
- package/dist/auth/pack.mjs.map +1 -1
- package/dist/auth/testing.mjs +1 -1
- package/dist/auth/testing.mjs.map +1 -1
- package/dist/buckets-main.mjs +2 -1
- package/dist/buckets-main.mjs.map +1 -1
- package/dist/compute-main.mjs +243 -231
- package/dist/compute-main.mjs.map +1 -1
- package/dist/control.mjs +1 -1
- package/dist/control.mjs.map +1 -1
- package/dist/{segments-BW2SYdBf-CtmcRzwy.mjs → daemon-D9BV062Q-ZTmWho_N.mjs} +2 -11
- package/dist/daemon-D9BV062Q-ZTmWho_N.mjs.map +1 -0
- package/dist/local-target.mjs +296 -89
- package/dist/local-target.mjs.map +1 -1
- package/dist/postgres-main.mjs +2 -1
- package/dist/postgres-main.mjs.map +1 -1
- package/dist/{s3-credentials-resource-BZjtuopJ-D0fKtjEH.mjs → s3-credentials-resource-BZjtuopJ-azxxffwQ.mjs} +4 -4
- package/dist/{s3-credentials-resource-BZjtuopJ-D0fKtjEH.mjs.map → s3-credentials-resource-BZjtuopJ-azxxffwQ.mjs.map} +1 -1
- package/dist/segments-CA7TOJ1U-CoICbb95.mjs +14 -0
- package/dist/segments-CA7TOJ1U-CoICbb95.mjs.map +1 -0
- package/package.json +18 -18
- package/dist/segments-BW2SYdBf-CtmcRzwy.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute-main.mjs","names":["net","getPort"],"sources":["../../../1-prisma-cloud/0-lowering/dev-emulators/dist/compute-main.mjs"],"sourcesContent":["import { h as readJsonFile, m as StateFile, r as SERVICE_READY_TIMEOUT_ENV, t as isValidSegment, u as readOwnVersion } from \"./segments-BW2SYdBf.mjs\";\nimport * as fs from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport getPort, { clearLockedPorts, portNumbers } from \"get-port\";\nimport * as http from \"node:http\";\nimport * as net from \"node:net\";\n//#region src/compute-main.ts\n/**\n* The Compute emulator daemon (local-dev spec § 2 `compute-main.ts`): a small\n* local counterpart of the platform's compute service. Owns service child\n* processes (spawned `bun bootstrap.js` from a real packaged artifact),\n* supervises them (crash backoff, held after repeated fast crashes), and\n* serves a loopback JSON admin API plus per-service log streaming.\n*\n* Runs as its own OS process, started by `daemon.ts`'s `ensureDaemon` via\n* `process.execPath <this file> --port <n> --state-dir <dir>`. Everything it\n* needs travels on argv and each request's own body — it reads no\n* environment variable of its own.\n*/\nconst MIN_SERVICE_PORT = 3e3;\nconst MAX_SERVICE_PORT = 65535;\nconst TERMINATE_GRACE_MS = 5e3;\nconst STABLE_UPTIME_MS = 3e4;\nconst BASE_BACKOFF_MS = 1e3;\nconst MAX_BACKOFF_MS = 3e4;\nconst MAX_CONSECUTIVE_FAST_EXITS = 5;\nconst LOG_POLL_INTERVAL_MS = 100;\nconst DEFAULT_READY_TIMEOUT_MS = 3e4;\nconst DEFAULT_READY_POLL_MS = 50;\nconst READY_PROBE_TIMEOUT_MS = 1e3;\nconst APPS_STATE_MODE = 384;\nconst BUN_NOT_FOUND_MESSAGE = \"local dev runs services under bun — the Prisma Compute runtime — and `bun` was not found on PATH. Install it: https://bun.sh.\";\nfunction isServiceStatus(value) {\n\treturn value === \"running\" || value === \"backoff\" || value === \"held\" || value === \"stopped\";\n}\nfunction isStringRecord(value) {\n\treturn typeof value === \"object\" && value !== null && Object.values(value).every((v) => typeof v === \"string\");\n}\nfunction isServiceRecord(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (!(\"id\" in value) || typeof value.id !== \"string\") return false;\n\tif (!(\"address\" in value) || typeof value.address !== \"string\") return false;\n\tif (!(\"port\" in value) || typeof value.port !== \"number\") return false;\n\tif (!(\"status\" in value) || !isServiceStatus(value.status)) return false;\n\tif (!(\"logPath\" in value) || typeof value.logPath !== \"string\") return false;\n\tif (\"pid\" in value && value.pid !== void 0 && typeof value.pid !== \"number\") return false;\n\tif (\"lastExitCode\" in value && value.lastExitCode !== void 0 && typeof value.lastExitCode !== \"number\") return false;\n\tif (\"artifactHash\" in value && value.artifactHash !== void 0 && typeof value.artifactHash !== \"string\") return false;\n\tif (\"artifactDir\" in value && value.artifactDir !== void 0 && typeof value.artifactDir !== \"string\") return false;\n\tif (\"env\" in value && value.env !== void 0 && !isStringRecord(value.env)) return false;\n\tif (\"listens\" in value && value.listens !== void 0 && typeof value.listens !== \"boolean\") return false;\n\treturn true;\n}\nfunction isAppRecord(value) {\n\treturn typeof value === \"object\" && value !== null && \"services\" in value && typeof value.services === \"object\" && value.services !== null && Object.values(value.services).every(isServiceRecord);\n}\nfunction isAppsState(value) {\n\treturn typeof value === \"object\" && value !== null && Object.values(value).every(isAppRecord);\n}\nfunction isDeploymentBody(value) {\n\treturn typeof value === \"object\" && value !== null && \"address\" in value && typeof value.address === \"string\" && \"artifactDir\" in value && typeof value.artifactDir === \"string\" && \"artifactHash\" in value && typeof value.artifactHash === \"string\" && \"env\" in value && isStringRecord(value.env) && \"port\" in value && typeof value.port === \"number\" && (!(\"listens\" in value) || value.listens === void 0 || typeof value.listens === \"boolean\");\n}\nfunction sleep(ms) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n/** Append-only per-service log file — child stdout/stderr plus `[emulator]` supervision lines. No rotation in v1. */\nvar ServiceLog = class {\n\tfilePath;\n\tfd;\n\tconstructor(filePath) {\n\t\tthis.filePath = filePath;\n\t}\n\tensureOpen() {\n\t\tif (this.fd === void 0) {\n\t\t\tfs.mkdirSync(path.dirname(this.filePath), { recursive: true });\n\t\t\tthis.fd = fs.openSync(this.filePath, \"a\");\n\t\t}\n\t\treturn this.fd;\n\t}\n\twriteRaw(chunk) {\n\t\tfs.writeSync(this.ensureOpen(), chunk);\n\t}\n\twriteLine(line) {\n\t\tfs.writeSync(this.ensureOpen(), `${line}\\n`);\n\t}\n\t/** Empties the file — a fresh service start begins a clean log; past sessions' and past deployments' output is not kept. */\n\tclear() {\n\t\tfs.ftruncateSync(this.ensureOpen(), 0);\n\t}\n\t/** Closes the fd if one was ever opened. Idempotent. */\n\tclose() {\n\t\tif (this.fd === void 0) return;\n\t\tfs.closeSync(this.fd);\n\t\tthis.fd = void 0;\n\t}\n};\nfunction parseArgs(argv) {\n\tlet port;\n\tlet stateDir;\n\tlet readyTimeoutMs = DEFAULT_READY_TIMEOUT_MS;\n\tlet readyPollMs = DEFAULT_READY_POLL_MS;\n\tfor (let i = 0; i < argv.length; i++) if (argv[i] === \"--port\") port = Number(argv[i + 1]);\n\telse if (argv[i] === \"--state-dir\") stateDir = argv[i + 1];\n\telse if (argv[i] === \"--ready-timeout-ms\") readyTimeoutMs = Number(argv[i + 1]);\n\telse if (argv[i] === \"--ready-poll-ms\") readyPollMs = Number(argv[i + 1]);\n\tif (port === void 0 || Number.isNaN(port)) throw new Error(\"compute-main: --port <n> is required\");\n\tif (stateDir === void 0) throw new Error(\"compute-main: --state-dir <dir> is required\");\n\tif (!Number.isFinite(readyTimeoutMs) || readyTimeoutMs <= 0) throw new Error(\"compute-main: --ready-timeout-ms must be a positive number\");\n\tif (!Number.isFinite(readyPollMs) || readyPollMs <= 0) throw new Error(\"compute-main: --ready-poll-ms must be a positive number\");\n\treturn {\n\t\tport,\n\t\tstateDir,\n\t\treadyTimeoutMs,\n\t\treadyPollMs\n\t};\n}\nfunction acceptsConnection(port, host) {\n\treturn new Promise((resolve) => {\n\t\tconst socket = net.connect({\n\t\t\tport,\n\t\t\thost\n\t\t});\n\t\tsocket.setTimeout(READY_PROBE_TIMEOUT_MS);\n\t\tconst settle = (accepted) => {\n\t\t\tsocket.destroy();\n\t\t\tresolve(accepted);\n\t\t};\n\t\tsocket.once(\"connect\", () => settle(true));\n\t\tsocket.once(\"error\", () => settle(false));\n\t\tsocket.once(\"timeout\", () => settle(false));\n\t});\n}\n/** Both loopback families: a service may bind IPv4 only, IPv6 only, or both, and `localhost` in its URL reaches either. */\nasync function acceptsLoopbackConnection(port) {\n\tconst [v4, v6] = await Promise.all([acceptsConnection(port, \"127.0.0.1\"), acceptsConnection(port, \"::1\")]);\n\treturn v4 || v6;\n}\n/** Polls `port` every `pollMs` until it accepts a connection, the child exits, or `timeoutMs` passes. */\nasync function waitUntilListening(child, port, timeoutMs, pollMs) {\n\tlet exit;\n\tchild.once(\"exit\", (code, signal) => {\n\t\texit = {\n\t\t\tkind: \"exited\",\n\t\t\tcode,\n\t\t\tsignal\n\t\t};\n\t});\n\tconst deadline = Date.now() + timeoutMs;\n\tfor (;;) {\n\t\tif (exit) return exit;\n\t\tif (await acceptsLoopbackConnection(port)) return exit ?? { kind: \"listening\" };\n\t\tif (Date.now() >= deadline) return exit ?? { kind: \"timed-out\" };\n\t\tawait sleep(pollMs);\n\t}\n}\n/** Resolves `bun` from THIS request's env PATH — never the daemon's own. POSIX-only (Windows is out of scope). */\nfunction resolveBunOnPath(env) {\n\tconst pathVar = env[\"PATH\"];\n\tif (!pathVar) return void 0;\n\tfor (const dir of pathVar.split(path.delimiter)) {\n\t\tif (dir === \"\") continue;\n\t\tconst candidate = path.join(dir, \"bun\");\n\t\ttry {\n\t\t\tfs.accessSync(candidate, fs.constants.X_OK);\n\t\t\treturn candidate;\n\t\t} catch {}\n\t}\n}\nfunction main() {\n\tconst { port, stateDir, readyTimeoutMs, readyPollMs } = parseArgs(process.argv.slice(2));\n\tconst ownVersion = readOwnVersion();\n\tconst appsJsonPath = path.join(stateDir, \"apps.json\");\n\tconst stateFile = new StateFile(appsJsonPath, APPS_STATE_MODE);\n\tlet state = {};\n\tconst runtimes = /* @__PURE__ */ new Map();\n\tconst logGeneration = /* @__PURE__ */ new Map();\n\tfunction runtimeKey(app, id) {\n\t\treturn `${app}/${id}`;\n\t}\n\tfunction getRuntime(app, id) {\n\t\tconst key = runtimeKey(app, id);\n\t\tlet rt = runtimes.get(key);\n\t\tif (!rt) {\n\t\t\trt = {\n\t\t\t\tchild: void 0,\n\t\t\t\tconsecutiveFastExits: 0,\n\t\t\t\tstartedAt: void 0,\n\t\t\t\tstableTimer: void 0,\n\t\t\t\tbackoffTimer: void 0,\n\t\t\t\texpectedExit: false,\n\t\t\t\tlog: void 0,\n\t\t\t\tstart: void 0,\n\t\t\t\tstopping: void 0,\n\t\t\t\tdeleted: false\n\t\t\t};\n\t\t\truntimes.set(key, rt);\n\t\t}\n\t\treturn rt;\n\t}\n\tfunction serviceLogPath(app, id) {\n\t\treturn path.join(stateDir, \"logs\", app, `${id}.log`);\n\t}\n\tfunction getLog(app, id, logPath) {\n\t\tconst rt = getRuntime(app, id);\n\t\tif (!rt.log) rt.log = new ServiceLog(logPath);\n\t\treturn rt.log;\n\t}\n\tfunction schedulePersist() {\n\t\tstateFile.write(state);\n\t}\n\tfunction clearStableTimer(rt) {\n\t\tif (rt.stableTimer) clearTimeout(rt.stableTimer);\n\t\trt.stableTimer = void 0;\n\t}\n\tfunction clearBackoffTimer(rt) {\n\t\tif (rt.backoffTimer) clearTimeout(rt.backoffTimer);\n\t\trt.backoffTimer = void 0;\n\t}\n\tfunction usedServicePorts() {\n\t\tconst ports = /* @__PURE__ */ new Set();\n\t\tfor (const app of Object.values(state)) for (const svc of Object.values(app.services)) ports.add(svc.port);\n\t\treturn ports;\n\t}\n\t/**\n\t* The smallest genuinely free port at or above `MIN_SERVICE_PORT`,\n\t* excluding this daemon's own persisted allocations — persistence and\n\t* the range policy stay ours; whether a candidate is actually bindable\n\t* is `get-port`'s (spec § 2's dependency razor).\n\t*/\n\tasync function smallestUnusedServicePort() {\n\t\treturn getPort({\n\t\t\tport: portNumbers(MIN_SERVICE_PORT, MAX_SERVICE_PORT),\n\t\t\texclude: usedServicePorts()\n\t\t});\n\t}\n\tasync function getOrCreateService(app, id) {\n\t\tlet appRec = state[app];\n\t\tif (!appRec) {\n\t\t\tappRec = { services: {} };\n\t\t\tstate[app] = appRec;\n\t\t}\n\t\tlet svc = appRec.services[id];\n\t\tif (svc) return svc;\n\t\tsvc = {\n\t\t\tid,\n\t\t\taddress: id,\n\t\t\tport: await smallestUnusedServicePort(),\n\t\t\tstatus: \"stopped\",\n\t\t\tlogPath: serviceLogPath(app, id)\n\t\t};\n\t\tappRec.services[id] = svc;\n\t\tschedulePersist();\n\t\treturn svc;\n\t}\n\tfunction waitForExit(child) {\n\t\treturn new Promise((resolve) => {\n\t\t\tchild.once(\"exit\", () => resolve());\n\t\t});\n\t}\n\t/** SIGTERM, wait up to `graceMs`, SIGKILL. Marks the exit as expected so supervision doesn't fire. */\n\tasync function killChild(rt, graceMs) {\n\t\tconst child = rt.child;\n\t\tif (!child || child.pid === void 0) return;\n\t\trt.expectedExit = true;\n\t\tconst exited = waitForExit(child);\n\t\tchild.kill(\"SIGTERM\");\n\t\tconst timedOut = Symbol(\"timeout\");\n\t\tif (await Promise.race([exited.then(() => void 0), sleep(graceMs).then(() => timedOut)]) === timedOut) {\n\t\t\tchild.kill(\"SIGKILL\");\n\t\t\tawait exited;\n\t\t}\n\t}\n\tfunction handleChildExit(app, id, svc, rt, child, code) {\n\t\tif (child !== rt.child) return;\n\t\tclearStableTimer(rt);\n\t\trt.child = void 0;\n\t\tdelete svc.pid;\n\t\tif (code !== null) svc.lastExitCode = code;\n\t\tif (rt.expectedExit) {\n\t\t\trt.expectedExit = false;\n\t\t\tschedulePersist();\n\t\t\treturn;\n\t\t}\n\t\tconst uptime = rt.startedAt !== void 0 ? Date.now() - rt.startedAt : 0;\n\t\tif (uptime >= STABLE_UPTIME_MS) rt.consecutiveFastExits = 0;\n\t\tconst attemptNumber = rt.consecutiveFastExits;\n\t\tif (uptime < STABLE_UPTIME_MS) rt.consecutiveFastExits += 1;\n\t\tif (rt.consecutiveFastExits >= MAX_CONSECUTIVE_FAST_EXITS) {\n\t\t\tsvc.status = \"held\";\n\t\t\tschedulePersist();\n\t\t\tgetLog(app, id, svc.logPath).writeLine(`[emulator] held after ${String(MAX_CONSECUTIVE_FAST_EXITS)} consecutive fast exits — send a new deployment to resume`);\n\t\t\treturn;\n\t\t}\n\t\tconst delayMs = Math.min(MAX_BACKOFF_MS, BASE_BACKOFF_MS * 2 ** attemptNumber);\n\t\tsvc.status = \"backoff\";\n\t\tschedulePersist();\n\t\tgetLog(app, id, svc.logPath).writeLine(`[emulator] exited (code ${code === null ? \"null\" : String(code)}) — restarting in ${String(delayMs / 1e3)}s`);\n\t\trt.backoffTimer = setTimeout(() => {\n\t\t\trt.backoffTimer = void 0;\n\t\t\tspawnService(app, id, svc, rt, false);\n\t\t}, delayMs);\n\t}\n\t/** Records `run` as the service's start in flight, replacing any earlier one. */\n\tfunction beginStart(rt, fresh, run) {\n\t\tconst token = { processExited: false };\n\t\tconst result = run(token).finally(() => {\n\t\t\tif (rt.start?.token === token) rt.start = void 0;\n\t\t});\n\t\trt.start = {\n\t\t\ttoken,\n\t\t\tfresh,\n\t\t\tresult\n\t\t};\n\t\treturn result;\n\t}\n\t/** The start in flight, unless its process has already exited. */\n\tfunction joinableStart(rt) {\n\t\treturn rt.start?.token.processExited === false ? rt.start : void 0;\n\t}\n\t/** Undefined while `token` is still the service's start. Otherwise what that start reports: a newer start's result, or \"stopped\" after a stop or an app delete. */\n\tfunction supersededOutcome(svc, rt, token) {\n\t\tif (!rt.deleted && rt.start?.token === token) return void 0;\n\t\tif (!rt.deleted && rt.start) return rt.start.result;\n\t\treturn Promise.resolve({\n\t\t\tok: false,\n\t\t\tmessage: `service \"${svc.address}\" was stopped before it accepted connections`\n\t\t});\n\t}\n\t/**\n\t* Spawns the service's child and resolves once it accepts connections on\n\t* its port — only then is it `running`. A child that exits first, or never\n\t* listens within the readiness timeout, fails the start with a message\n\t* naming the service and its log.\n\t*/\n\tfunction spawnService(app, id, svc, rt, fresh) {\n\t\treturn beginStart(rt, fresh, (token) => spawnAndWaitUntilListening(app, id, svc, rt, fresh, token));\n\t}\n\tasync function spawnAndWaitUntilListening(app, id, svc, rt, fresh, token) {\n\t\tconst env = svc.env ?? {};\n\t\tconst artifactDir = svc.artifactDir ?? \".\";\n\t\tconst bunPath = resolveBunOnPath(env);\n\t\tif (!bunPath) {\n\t\t\tsvc.status = \"stopped\";\n\t\t\tdelete svc.pid;\n\t\t\tschedulePersist();\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\tmessage: BUN_NOT_FOUND_MESSAGE\n\t\t\t};\n\t\t}\n\t\tconst log = getLog(app, id, svc.logPath);\n\t\tif (fresh) {\n\t\t\tlog.clear();\n\t\t\tlogGeneration.set(svc.logPath, (logGeneration.get(svc.logPath) ?? 0) + 1);\n\t\t}\n\t\tconst child = spawn(bunPath, [\"bootstrap.js\"], {\n\t\t\tcwd: artifactDir,\n\t\t\tenv,\n\t\t\tstdio: [\n\t\t\t\t\"ignore\",\n\t\t\t\t\"pipe\",\n\t\t\t\t\"pipe\"\n\t\t\t]\n\t\t});\n\t\trt.child = child;\n\t\trt.expectedExit = false;\n\t\trt.startedAt = Date.now();\n\t\tclearStableTimer(rt);\n\t\trt.stableTimer = setTimeout(() => {\n\t\t\trt.consecutiveFastExits = 0;\n\t\t}, STABLE_UPTIME_MS);\n\t\tchild.stdout?.on(\"data\", (chunk) => log.writeRaw(chunk));\n\t\tchild.stderr?.on(\"data\", (chunk) => log.writeRaw(chunk));\n\t\tchild.on(\"exit\", (code) => handleChildExit(app, id, svc, rt, child, code));\n\t\tchild.once(\"exit\", () => {\n\t\t\ttoken.processExited = true;\n\t\t});\n\t\tif (child.pid !== void 0) svc.pid = child.pid;\n\t\tif (svc.listens === false) {\n\t\t\tsvc.status = \"running\";\n\t\t\tschedulePersist();\n\t\t\treturn { ok: true };\n\t\t}\n\t\tschedulePersist();\n\t\tconst port = String(svc.port);\n\t\tconst outcome = await waitUntilListening(child, svc.port, readyTimeoutMs, readyPollMs);\n\t\tconst superseded = supersededOutcome(svc, rt, token);\n\t\tif (superseded) return superseded;\n\t\tconst service = `service \"${svc.address}\"`;\n\t\tif (outcome.kind === \"exited\") return {\n\t\t\tok: false,\n\t\t\tmessage: `${service} exited (${outcome.code !== null ? `code ${String(outcome.code)}` : outcome.signal ?? \"no exit code\"}) before it accepted connections on its port ${port}. Its log: ${svc.logPath}`\n\t\t};\n\t\tif (outcome.kind === \"timed-out\") {\n\t\t\tconst seconds = String(readyTimeoutMs / 1e3);\n\t\t\tconst message = `${service} did not accept connections on its port ${port} within ${seconds}s. Its log: ${svc.logPath}. If it needs longer to start, set ${SERVICE_READY_TIMEOUT_ENV} (milliseconds) and restart the compute emulator. If it never listens on a port, declare it with compute({ listens: false }).`;\n\t\t\tif (fresh) {\n\t\t\t\tlog.writeLine(`[emulator] did not accept connections on port ${port} within ${seconds}s — stopped`);\n\t\t\t\tawait stopService(svc, rt);\n\t\t\t} else {\n\t\t\t\tlog.writeLine(`[emulator] restart did not accept connections on port ${port} within ${seconds}s — held; send a new deployment to resume`);\n\t\t\t\tawait stopService(svc, rt, \"held\");\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\tmessage\n\t\t\t};\n\t\t}\n\t\tsvc.status = \"running\";\n\t\tschedulePersist();\n\t\treturn { ok: true };\n\t}\n\tasync function stopService(svc, rt, finalStatus = \"stopped\") {\n\t\trt.start = void 0;\n\t\tclearBackoffTimer(rt);\n\t\tclearStableTimer(rt);\n\t\tconst stopping = killChild(rt, TERMINATE_GRACE_MS).then(() => {\n\t\t\tsvc.status = finalStatus;\n\t\t\tdelete svc.pid;\n\t\t\tschedulePersist();\n\t\t});\n\t\trt.stopping = stopping;\n\t\ttry {\n\t\t\tawait stopping;\n\t\t} finally {\n\t\t\tif (rt.stopping === stopping) rt.stopping = void 0;\n\t\t}\n\t}\n\tasync function stopsFinished(rt) {\n\t\twhile (rt.stopping) await rt.stopping;\n\t}\n\t/**\n\t* The session-resume signal: Alchemy's no-op reconcile never fires a\n\t* deployment PUT, so nothing else restarts a service a previous session\n\t* stopped. Reuses the exact deployment-PUT start rules — same spawn\n\t* path, same supervision reset, and an explicit resume clears `held`\n\t* the same way a deployment PUT does — but from the service's already\n\t* STORED deployment spec, since no new one arrives with a start.\n\t*/\n\tasync function startService(app, id, svc) {\n\t\tif (svc.artifactHash === void 0) return { ok: true };\n\t\tconst rt = getRuntime(app, id);\n\t\tconst inFlight = joinableStart(rt);\n\t\tif (inFlight) return inFlight.result;\n\t\tif (svc.status === \"running\" && rt.stopping === void 0) return { ok: true };\n\t\treturn beginStart(rt, true, async (token) => {\n\t\t\tclearBackoffTimer(rt);\n\t\t\tawait stopsFinished(rt);\n\t\t\tconst superseded = supersededOutcome(svc, rt, token);\n\t\t\tif (superseded) return superseded;\n\t\t\tclearStableTimer(rt);\n\t\t\trt.consecutiveFastExits = 0;\n\t\t\treturn spawnAndWaitUntilListening(app, id, svc, rt, true, token);\n\t\t});\n\t}\n\tfunction json(res, status, body) {\n\t\tconst text = JSON.stringify(body);\n\t\tres.writeHead(status, { \"content-type\": \"application/json\" });\n\t\tres.end(text);\n\t}\n\tfunction text(res, status, body) {\n\t\tres.writeHead(status, { \"content-type\": \"text/plain; charset=utf-8\" });\n\t\tres.end(body);\n\t}\n\tfunction badSegment(res, segment) {\n\t\ttext(res, 400, `invalid path segment \"${segment}\": must match /^[a-z0-9][a-z0-9-]*$/ and be at most 63 characters`);\n\t}\n\tfunction readBody(req) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst chunks = [];\n\t\t\treq.on(\"data\", (chunk) => chunks.push(chunk));\n\t\t\treq.on(\"end\", () => resolve(Buffer.concat(chunks)));\n\t\t\treq.on(\"error\", reject);\n\t\t});\n\t}\n\tfunction serviceView(svc) {\n\t\treturn {\n\t\t\tid: svc.id,\n\t\t\taddress: svc.address,\n\t\t\tport: svc.port,\n\t\t\turl: `http://localhost:${String(svc.port)}`,\n\t\t\tstatus: svc.status,\n\t\t\t...svc.pid !== void 0 ? { pid: svc.pid } : {},\n\t\t\t...svc.lastExitCode !== void 0 ? { lastExitCode: svc.lastExitCode } : {},\n\t\t\t...svc.artifactHash !== void 0 ? { artifactHash: svc.artifactHash } : {},\n\t\t\tlogPath: svc.logPath\n\t\t};\n\t}\n\tfunction envEquals(a, b) {\n\t\tif (!a) return false;\n\t\tconst aKeys = Object.keys(a);\n\t\tconst bKeys = Object.keys(b);\n\t\tif (aKeys.length !== bKeys.length) return false;\n\t\treturn aKeys.every((k) => a[k] === b[k]);\n\t}\n\tasync function handleDeployment(req, res, app, id) {\n\t\tconst raw = await readBody(req);\n\t\tlet parsed;\n\t\ttry {\n\t\t\tparsed = JSON.parse(raw.toString(\"utf8\"));\n\t\t} catch {\n\t\t\treturn text(res, 400, \"malformed JSON body\");\n\t\t}\n\t\tif (!isDeploymentBody(parsed)) return text(res, 400, \"malformed deployment body\");\n\t\tconst svc = await getOrCreateService(app, id);\n\t\tconst rt = getRuntime(app, id);\n\t\tconst listens = parsed.listens ?? true;\n\t\tconst changed = svc.artifactHash !== parsed.artifactHash || !envEquals(svc.env, parsed.env) || (svc.listens ?? true) !== listens;\n\t\tlet result;\n\t\tconst inFlight = joinableStart(rt);\n\t\tif (!changed && inFlight?.fresh === true) result = await inFlight.result;\n\t\telse if (!changed && rt.start === void 0 && rt.stopping === void 0 && svc.status === \"running\") result = { ok: true };\n\t\telse {\n\t\t\tsvc.address = parsed.address;\n\t\t\tsvc.port = parsed.port;\n\t\t\tsvc.artifactHash = parsed.artifactHash;\n\t\t\tsvc.env = parsed.env;\n\t\t\tsvc.artifactDir = parsed.artifactDir;\n\t\t\tsvc.listens = listens;\n\t\t\tclearBackoffTimer(rt);\n\t\t\tschedulePersist();\n\t\t\tresult = await beginStart(rt, true, async (token) => {\n\t\t\t\tawait stopsFinished(rt);\n\t\t\t\tawait killChild(rt, TERMINATE_GRACE_MS);\n\t\t\t\tconst superseded = supersededOutcome(svc, rt, token);\n\t\t\t\tif (superseded) return superseded;\n\t\t\t\tsvc.status = \"stopped\";\n\t\t\t\tdelete svc.pid;\n\t\t\t\tclearStableTimer(rt);\n\t\t\t\trt.consecutiveFastExits = 0;\n\t\t\t\treturn spawnAndWaitUntilListening(app, id, svc, rt, true, token);\n\t\t\t});\n\t\t}\n\t\tif (!result.ok) return text(res, 500, result.message ?? \"failed to start the service\");\n\t\tres.writeHead(204);\n\t\tres.end();\n\t}\n\t/** Byte offset a follow should start at to show the last `tailLines` complete lines; `<= 0` (or an empty file) starts at the current end, no backlog. */\n\tfunction startOffsetForTail(logPath, tailLines) {\n\t\tlet size = 0;\n\t\ttry {\n\t\t\tsize = fs.statSync(logPath).size;\n\t\t} catch {\n\t\t\treturn 0;\n\t\t}\n\t\tif (tailLines <= 0 || size === 0) return size;\n\t\tconst fd = fs.openSync(logPath, \"r\");\n\t\ttry {\n\t\t\tconst buf = Buffer.alloc(size);\n\t\t\tfs.readSync(fd, buf, 0, size, 0);\n\t\t\tlet seen = 0;\n\t\t\tfor (let i = size - 1; i >= 0; i -= 1) {\n\t\t\t\tif (buf[i] !== 10) continue;\n\t\t\t\tif (i === size - 1) continue;\n\t\t\t\tseen += 1;\n\t\t\t\tif (seen === tailLines) return i + 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t} finally {\n\t\t\tfs.closeSync(fd);\n\t\t}\n\t}\n\tfunction handleFollowLogs(res, logPath, tailLines) {\n\t\tfs.mkdirSync(path.dirname(logPath), { recursive: true });\n\t\tif (!fs.existsSync(logPath)) fs.closeSync(fs.openSync(logPath, \"a\"));\n\t\tres.writeHead(200, { \"content-type\": \"text/plain; charset=utf-8\" });\n\t\tlet offset = startOffsetForTail(logPath, tailLines);\n\t\tlet generation = logGeneration.get(logPath) ?? 0;\n\t\tlet stopped = false;\n\t\tlet timer;\n\t\tconst tick = () => {\n\t\t\tif (stopped) return;\n\t\t\tconst currentGeneration = logGeneration.get(logPath) ?? 0;\n\t\t\tif (currentGeneration !== generation) {\n\t\t\t\tgeneration = currentGeneration;\n\t\t\t\toffset = 0;\n\t\t\t}\n\t\t\tlet stat;\n\t\t\ttry {\n\t\t\t\tstat = fs.statSync(logPath);\n\t\t\t} catch {\n\t\t\t\tstat = void 0;\n\t\t\t}\n\t\t\tif (stat && stat.size < offset) offset = 0;\n\t\t\tif (stat && stat.size > offset) {\n\t\t\t\tconst fd = fs.openSync(logPath, \"r\");\n\t\t\t\tconst buf = Buffer.alloc(stat.size - offset);\n\t\t\t\tfs.readSync(fd, buf, 0, buf.length, offset);\n\t\t\t\tfs.closeSync(fd);\n\t\t\t\toffset = stat.size;\n\t\t\t\tres.write(buf);\n\t\t\t}\n\t\t\tif (!stopped) timer = setTimeout(tick, LOG_POLL_INTERVAL_MS);\n\t\t};\n\t\ttick();\n\t\tconst stop = () => {\n\t\t\tstopped = true;\n\t\t\tif (timer) clearTimeout(timer);\n\t\t};\n\t\tres.on(\"close\", stop);\n\t}\n\tasync function handleRequest(req, res) {\n\t\tconst url = new URL(req.url ?? \"/\", `http://127.0.0.1:${String(port)}`);\n\t\tconst method = req.method ?? \"GET\";\n\t\tconst segments = url.pathname.split(\"/\").filter((s) => s.length > 0).map((s) => decodeURIComponent(s));\n\t\tif (method === \"GET\" && segments.length === 1 && segments[0] === \"health\") return json(res, 200, { version: ownVersion });\n\t\tif (segments[0] === \"apps\" && segments.length >= 2) {\n\t\t\tconst app = segments[1];\n\t\t\tif (app === void 0 || !isValidSegment(app)) return badSegment(res, app ?? \"\");\n\t\t\tif (method === \"PUT\" && segments.length === 4 && segments[2] === \"services\") {\n\t\t\t\tconst id = segments[3];\n\t\t\t\tif (id === void 0 || !isValidSegment(id)) return badSegment(res, id ?? \"\");\n\t\t\t\tconst svc = await getOrCreateService(app, id);\n\t\t\t\treturn json(res, 200, {\n\t\t\t\t\tport: svc.port,\n\t\t\t\t\turl: `http://localhost:${String(svc.port)}`\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (method === \"PUT\" && segments.length === 5 && segments[2] === \"services\" && segments[4] === \"deployment\") {\n\t\t\t\tconst id = segments[3];\n\t\t\t\tif (id === void 0 || !isValidSegment(id)) return badSegment(res, id ?? \"\");\n\t\t\t\treturn handleDeployment(req, res, app, id);\n\t\t\t}\n\t\t\tif (method === \"GET\" && segments.length === 3 && segments[2] === \"services\") {\n\t\t\t\tconst appRec = state[app];\n\t\t\t\treturn json(res, 200, appRec ? Object.values(appRec.services).map(serviceView) : []);\n\t\t\t}\n\t\t\tif (method === \"GET\" && segments.length === 5 && segments[2] === \"services\" && segments[4] === \"logs\") {\n\t\t\t\tconst id = segments[3];\n\t\t\t\tif (id === void 0 || !isValidSegment(id)) return badSegment(res, id ?? \"\");\n\t\t\t\tconst svc = state[app]?.services[id];\n\t\t\t\tif (!svc) return text(res, 404, `no such service \"${id}\" in app \"${app}\"`);\n\t\t\t\tif (url.searchParams.get(\"follow\") === \"1\") {\n\t\t\t\t\tconst tailParam = url.searchParams.get(\"tail\");\n\t\t\t\t\tconst tailLines = tailParam === null ? 0 : Math.max(0, Number.parseInt(tailParam, 10) || 0);\n\t\t\t\t\thandleFollowLogs(res, svc.logPath, tailLines);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst content = fs.existsSync(svc.logPath) ? fs.readFileSync(svc.logPath) : Buffer.alloc(0);\n\t\t\t\tres.writeHead(200, { \"content-type\": \"text/plain; charset=utf-8\" });\n\t\t\t\tres.end(content);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (method === \"POST\" && segments.length === 3 && segments[2] === \"stop\") {\n\t\t\t\tconst appRec = state[app];\n\t\t\t\tif (appRec) await Promise.all(Object.entries(appRec.services).map(([id, svc]) => stopService(svc, getRuntime(app, id))));\n\t\t\t\tres.writeHead(204);\n\t\t\t\tres.end();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (method === \"POST\" && segments.length === 3 && segments[2] === \"start\") {\n\t\t\t\tconst appRec = state[app];\n\t\t\t\tconst failures = (appRec ? await Promise.all(Object.entries(appRec.services).map(([id, svc]) => startService(app, id, svc))) : []).flatMap((r) => r.ok ? [] : [r.message ?? \"failed to start\"]);\n\t\t\t\tif (failures.length > 0) return text(res, 500, failures.join(\"\\n\"));\n\t\t\t\tres.writeHead(204);\n\t\t\t\tres.end();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (method === \"DELETE\" && segments.length === 2) {\n\t\t\t\tconst appRec = state[app];\n\t\t\t\tif (appRec) {\n\t\t\t\t\tfor (const id of Object.keys(appRec.services)) getRuntime(app, id).deleted = true;\n\t\t\t\t\tawait Promise.all(Object.entries(appRec.services).map(([id, svc]) => stopService(svc, getRuntime(app, id))));\n\t\t\t\t\tfor (const id of Object.keys(appRec.services)) {\n\t\t\t\t\t\tconst key = runtimeKey(app, id);\n\t\t\t\t\t\truntimes.get(key)?.log?.close();\n\t\t\t\t\t\truntimes.delete(key);\n\t\t\t\t\t}\n\t\t\t\t\tdelete state[app];\n\t\t\t\t\tschedulePersist();\n\t\t\t\t\tclearLockedPorts();\n\t\t\t\t}\n\t\t\t\tawait fs.promises.rm(path.join(stateDir, \"logs\", app), {\n\t\t\t\t\trecursive: true,\n\t\t\t\t\tforce: true\n\t\t\t\t});\n\t\t\t\tres.writeHead(204);\n\t\t\t\tres.end();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tres.writeHead(404);\n\t\tres.end();\n\t}\n\tconst server = http.createServer((req, res) => {\n\t\thandleRequest(req, res).catch((err) => {\n\t\t\tif (!res.headersSent) res.writeHead(500, { \"content-type\": \"text/plain\" });\n\t\t\tres.end(err instanceof Error ? err.message : String(err));\n\t\t});\n\t});\n\tlet shuttingDown = false;\n\tasync function shutdown() {\n\t\tif (shuttingDown) return;\n\t\tshuttingDown = true;\n\t\tconst kills = [];\n\t\tfor (const rt of runtimes.values()) {\n\t\t\tclearBackoffTimer(rt);\n\t\t\tclearStableTimer(rt);\n\t\t\tif (rt.child) kills.push(killChild(rt, TERMINATE_GRACE_MS));\n\t\t}\n\t\tawait Promise.all(kills);\n\t\tawait stateFile.flush();\n\t\tserver.close();\n\t\tprocess.exit(0);\n\t}\n\tprocess.on(\"SIGTERM\", () => void shutdown());\n\tprocess.on(\"SIGINT\", () => void shutdown());\n\treadJsonFile(appsJsonPath, isAppsState).then((loaded) => {\n\t\tif (loaded) {\n\t\t\tfor (const appRec of Object.values(loaded)) for (const svc of Object.values(appRec.services)) if (svc.status === \"running\" || svc.status === \"backoff\") {\n\t\t\t\tsvc.status = \"stopped\";\n\t\t\t\tdelete svc.pid;\n\t\t\t}\n\t\t\tstate = loaded;\n\t\t}\n\t\tserver.listen(port, \"127.0.0.1\", () => {\n\t\t\tconsole.log(`[dev-emulators] compute-main listening on 127.0.0.1:${String(port)}`);\n\t\t});\n\t}).catch((err) => {\n\t\tconsole.error(\"compute-main: failed to load state\", err);\n\t\tprocess.exit(1);\n\t});\n}\nmain();\n//#endregion\nexport {};\n\n//# sourceMappingURL=compute-main.mjs.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compute-main.mjs","names":["net","getPort"],"sources":["../../../1-prisma-cloud/0-lowering/dev-emulators/dist/compute-main.mjs"],"sourcesContent":["import { l as readOwnVersion, m as readJsonFile, n as SERVICE_READY_TIMEOUT_ENV, p as StateFile } from \"./daemon-D9BV062Q.mjs\";\nimport * as fs from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport getPort, { clearLockedPorts, portNumbers } from \"get-port\";\nimport { randomBytes } from \"node:crypto\";\nimport * as http from \"node:http\";\nimport * as net from \"node:net\";\n//#region src/compute-main.ts\n/**\n* The Compute emulator daemon (local-dev spec § 2 `compute-main.ts`): a small\n* local counterpart of the platform's compute service. Holds service\n* instances under ids it generates, owns their child processes (spawned\n* `bun bootstrap.js` from a real packaged artifact), supervises them (crash\n* backoff, held after repeated fast crashes), and serves a loopback JSON\n* admin API plus per-instance log streaming. An instance's labels are its\n* creator's to read: they are stored and returned verbatim, never\n* interpreted.\n*\n* Runs as its own OS process, started by `daemon.ts`'s `ensureDaemon` via\n* `process.execPath <this file> --port <n> --state-dir <dir>`. Everything it\n* needs travels on argv and each request's own body — it reads no\n* environment variable of its own.\n*/\nconst MIN_SERVICE_PORT = 3e3;\nconst MAX_SERVICE_PORT = 65535;\nconst TERMINATE_GRACE_MS = 5e3;\nconst STABLE_UPTIME_MS = 3e4;\nconst BASE_BACKOFF_MS = 1e3;\nconst MAX_BACKOFF_MS = 3e4;\nconst MAX_CONSECUTIVE_FAST_EXITS = 5;\nconst LOG_POLL_INTERVAL_MS = 100;\nconst DEFAULT_READY_TIMEOUT_MS = 3e4;\nconst DEFAULT_READY_POLL_MS = 50;\nconst READY_PROBE_TIMEOUT_MS = 1e3;\nconst STATE_MODE = 384;\nconst BUN_NOT_FOUND_MESSAGE = \"local dev runs services under bun — the Prisma Compute runtime — and `bun` was not found on PATH. Install it: https://bun.sh.\";\nconst INSTANCE_ID_RE = /^svc_[0-9a-f]{16}$/;\nfunction newInstanceId() {\n\treturn `svc_${randomBytes(8).toString(\"hex\")}`;\n}\nfunction isInstanceStatus(value) {\n\treturn value === \"running\" || value === \"backoff\" || value === \"held\" || value === \"stopped\";\n}\nfunction isStringRecord(value) {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value) && Object.values(value).every((v) => typeof v === \"string\");\n}\nfunction isPort(value) {\n\treturn typeof value === \"number\" && Number.isInteger(value) && value >= 1 && value <= MAX_SERVICE_PORT;\n}\nfunction isOptional(value, key, check) {\n\treturn !(key in value) || Reflect.get(value, key) === void 0 || check(Reflect.get(value, key));\n}\nfunction isInstanceRecord(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (!(\"id\" in value) || typeof value.id !== \"string\") return false;\n\tif (!(\"labels\" in value) || !isStringRecord(value.labels)) return false;\n\tif (!(\"port\" in value) || !isPort(value.port)) return false;\n\tif (!(\"status\" in value) || !isInstanceStatus(value.status)) return false;\n\tif (!(\"logPath\" in value) || typeof value.logPath !== \"string\") return false;\n\treturn isOptional(value, \"pid\", (v) => typeof v === \"number\") && isOptional(value, \"lastExitCode\", (v) => typeof v === \"number\") && isOptional(value, \"artifactHash\", (v) => typeof v === \"string\") && isOptional(value, \"artifactDir\", (v) => typeof v === \"string\") && isOptional(value, \"env\", isStringRecord) && isOptional(value, \"listens\", (v) => typeof v === \"boolean\");\n}\nfunction isInstancesState(value) {\n\treturn typeof value === \"object\" && value !== null && \"instances\" in value && typeof value.instances === \"object\" && value.instances !== null && Object.values(value.instances).every(isInstanceRecord);\n}\nfunction isCreateBody(value) {\n\treturn typeof value === \"object\" && value !== null && \"labels\" in value && isStringRecord(value.labels) && isOptional(value, \"port\", isPort);\n}\nfunction isDeploymentBody(value) {\n\treturn typeof value === \"object\" && value !== null && \"artifactDir\" in value && typeof value.artifactDir === \"string\" && \"artifactHash\" in value && typeof value.artifactHash === \"string\" && \"env\" in value && isStringRecord(value.env) && (!(\"listens\" in value) || value.listens === void 0 || typeof value.listens === \"boolean\");\n}\nfunction isIdsBody(value) {\n\treturn typeof value === \"object\" && value !== null && \"ids\" in value && Array.isArray(value.ids) && value.ids.every((id) => typeof id === \"string\");\n}\nfunction sleep(ms) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n/** Append-only per-instance log file — child stdout/stderr plus `[emulator]` supervision lines. No rotation in v1. */\nvar InstanceLog = class {\n\tfilePath;\n\tfd;\n\tconstructor(filePath) {\n\t\tthis.filePath = filePath;\n\t}\n\tensureOpen() {\n\t\tif (this.fd === void 0) {\n\t\t\tfs.mkdirSync(path.dirname(this.filePath), { recursive: true });\n\t\t\tthis.fd = fs.openSync(this.filePath, \"a\");\n\t\t}\n\t\treturn this.fd;\n\t}\n\twriteRaw(chunk) {\n\t\tfs.writeSync(this.ensureOpen(), chunk);\n\t}\n\twriteLine(line) {\n\t\tfs.writeSync(this.ensureOpen(), `${line}\\n`);\n\t}\n\t/** Empties the file — a fresh start begins a clean log; past sessions' and past deployments' output is not kept. */\n\tclear() {\n\t\tfs.ftruncateSync(this.ensureOpen(), 0);\n\t}\n\t/** Closes the fd if one was ever opened. Idempotent. */\n\tclose() {\n\t\tif (this.fd === void 0) return;\n\t\tfs.closeSync(this.fd);\n\t\tthis.fd = void 0;\n\t}\n};\nfunction parseArgs(argv) {\n\tlet port;\n\tlet stateDir;\n\tlet readyTimeoutMs = DEFAULT_READY_TIMEOUT_MS;\n\tlet readyPollMs = DEFAULT_READY_POLL_MS;\n\tfor (let i = 0; i < argv.length; i++) if (argv[i] === \"--port\") port = Number(argv[i + 1]);\n\telse if (argv[i] === \"--state-dir\") stateDir = argv[i + 1];\n\telse if (argv[i] === \"--ready-timeout-ms\") readyTimeoutMs = Number(argv[i + 1]);\n\telse if (argv[i] === \"--ready-poll-ms\") readyPollMs = Number(argv[i + 1]);\n\tif (port === void 0 || Number.isNaN(port)) throw new Error(\"compute-main: --port <n> is required\");\n\tif (stateDir === void 0) throw new Error(\"compute-main: --state-dir <dir> is required\");\n\tif (!Number.isFinite(readyTimeoutMs) || readyTimeoutMs <= 0) throw new Error(\"compute-main: --ready-timeout-ms must be a positive number\");\n\tif (!Number.isFinite(readyPollMs) || readyPollMs <= 0) throw new Error(\"compute-main: --ready-poll-ms must be a positive number\");\n\treturn {\n\t\tport,\n\t\tstateDir,\n\t\treadyTimeoutMs,\n\t\treadyPollMs\n\t};\n}\nfunction acceptsConnection(port, host) {\n\treturn new Promise((resolve) => {\n\t\tconst socket = net.connect({\n\t\t\tport,\n\t\t\thost\n\t\t});\n\t\tsocket.setTimeout(READY_PROBE_TIMEOUT_MS);\n\t\tconst settle = (accepted) => {\n\t\t\tsocket.destroy();\n\t\t\tresolve(accepted);\n\t\t};\n\t\tsocket.once(\"connect\", () => settle(true));\n\t\tsocket.once(\"error\", () => settle(false));\n\t\tsocket.once(\"timeout\", () => settle(false));\n\t});\n}\n/** Both loopback families: a service may bind IPv4 only, IPv6 only, or both, and `localhost` in its URL reaches either. */\nasync function acceptsLoopbackConnection(port) {\n\tconst [v4, v6] = await Promise.all([acceptsConnection(port, \"127.0.0.1\"), acceptsConnection(port, \"::1\")]);\n\treturn v4 || v6;\n}\n/** Polls `port` every `pollMs` until it accepts a connection, the child exits, or `timeoutMs` passes. */\nasync function waitUntilListening(child, port, timeoutMs, pollMs) {\n\tlet exit;\n\tchild.once(\"exit\", (code, signal) => {\n\t\texit = {\n\t\t\tkind: \"exited\",\n\t\t\tcode,\n\t\t\tsignal\n\t\t};\n\t});\n\tconst deadline = Date.now() + timeoutMs;\n\tfor (;;) {\n\t\tif (exit) return exit;\n\t\tif (await acceptsLoopbackConnection(port)) return exit ?? { kind: \"listening\" };\n\t\tif (Date.now() >= deadline) return exit ?? { kind: \"timed-out\" };\n\t\tawait sleep(pollMs);\n\t}\n}\n/** Resolves `bun` from THIS request's env PATH — never the daemon's own. POSIX-only (Windows is out of scope). */\nfunction resolveBunOnPath(env) {\n\tconst pathVar = env[\"PATH\"];\n\tif (!pathVar) return void 0;\n\tfor (const dir of pathVar.split(path.delimiter)) {\n\t\tif (dir === \"\") continue;\n\t\tconst candidate = path.join(dir, \"bun\");\n\t\ttry {\n\t\t\tfs.accessSync(candidate, fs.constants.X_OK);\n\t\t\treturn candidate;\n\t\t} catch {}\n\t}\n}\nfunction main() {\n\tconst { port, stateDir, readyTimeoutMs, readyPollMs } = parseArgs(process.argv.slice(2));\n\tconst ownVersion = readOwnVersion();\n\tconst statePath = path.join(stateDir, \"instances.json\");\n\tconst stateFile = new StateFile(statePath, STATE_MODE);\n\tconst logsDir = path.join(stateDir, \"logs\");\n\tlet state = { instances: {} };\n\tconst runtimes = /* @__PURE__ */ new Map();\n\tconst logGeneration = /* @__PURE__ */ new Map();\n\tfunction getRuntime(id) {\n\t\tlet rt = runtimes.get(id);\n\t\tif (!rt) {\n\t\t\trt = {\n\t\t\t\tchild: void 0,\n\t\t\t\tconsecutiveFastExits: 0,\n\t\t\t\tstartedAt: void 0,\n\t\t\t\tstableTimer: void 0,\n\t\t\t\tbackoffTimer: void 0,\n\t\t\t\texpectedExit: false,\n\t\t\t\tlog: void 0,\n\t\t\t\tstart: void 0,\n\t\t\t\tstopping: void 0,\n\t\t\t\tdeleted: false\n\t\t\t};\n\t\t\truntimes.set(id, rt);\n\t\t}\n\t\treturn rt;\n\t}\n\tfunction getLog(inst) {\n\t\tconst rt = getRuntime(inst.id);\n\t\tif (!rt.log) rt.log = new InstanceLog(inst.logPath);\n\t\treturn rt.log;\n\t}\n\tfunction schedulePersist() {\n\t\tstateFile.write(state);\n\t}\n\tfunction clearStableTimer(rt) {\n\t\tif (rt.stableTimer) clearTimeout(rt.stableTimer);\n\t\trt.stableTimer = void 0;\n\t}\n\tfunction clearBackoffTimer(rt) {\n\t\tif (rt.backoffTimer) clearTimeout(rt.backoffTimer);\n\t\trt.backoffTimer = void 0;\n\t}\n\tfunction heldPorts() {\n\t\treturn new Set(Object.values(state.instances).map((inst) => inst.port));\n\t}\n\t/**\n\t* The requested port when no instance holds it and it is bindable,\n\t* otherwise the smallest such port at or above `MIN_SERVICE_PORT`. Which\n\t* ports instances hold is ours; whether a candidate is actually bindable is\n\t* `get-port`'s (spec § 2's dependency razor).\n\t*/\n\tasync function allocatePort(requested) {\n\t\tconst exclude = heldPorts();\n\t\tif (requested !== void 0 && !exclude.has(requested)) {\n\t\t\tconst given = await getPort({\n\t\t\t\tport: requested,\n\t\t\t\texclude\n\t\t\t});\n\t\t\tif (given === requested) return given;\n\t\t}\n\t\treturn getPort({\n\t\t\tport: portNumbers(MIN_SERVICE_PORT, MAX_SERVICE_PORT),\n\t\t\texclude\n\t\t});\n\t}\n\tasync function createInstance(body) {\n\t\tconst id = newInstanceId();\n\t\tconst inst = {\n\t\t\tid,\n\t\t\tlabels: { ...body.labels },\n\t\t\tport: await allocatePort(body.port),\n\t\t\tstatus: \"stopped\",\n\t\t\tlogPath: path.join(logsDir, `${id}.log`)\n\t\t};\n\t\tstate.instances[id] = inst;\n\t\tschedulePersist();\n\t\treturn inst;\n\t}\n\tfunction waitForExit(child) {\n\t\treturn new Promise((resolve) => {\n\t\t\tchild.once(\"exit\", () => resolve());\n\t\t});\n\t}\n\t/** SIGTERM, wait up to `graceMs`, SIGKILL. Marks the exit as expected so supervision doesn't fire. */\n\tasync function killChild(rt, graceMs) {\n\t\tconst child = rt.child;\n\t\tif (!child || child.pid === void 0) return;\n\t\trt.expectedExit = true;\n\t\tconst exited = waitForExit(child);\n\t\tchild.kill(\"SIGTERM\");\n\t\tconst timedOut = Symbol(\"timeout\");\n\t\tif (await Promise.race([exited.then(() => void 0), sleep(graceMs).then(() => timedOut)]) === timedOut) {\n\t\t\tchild.kill(\"SIGKILL\");\n\t\t\tawait exited;\n\t\t}\n\t}\n\tfunction handleChildExit(inst, rt, child, code) {\n\t\tif (child !== rt.child) return;\n\t\tclearStableTimer(rt);\n\t\trt.child = void 0;\n\t\tdelete inst.pid;\n\t\tif (code !== null) inst.lastExitCode = code;\n\t\tif (rt.expectedExit) {\n\t\t\trt.expectedExit = false;\n\t\t\tschedulePersist();\n\t\t\treturn;\n\t\t}\n\t\tconst uptime = rt.startedAt !== void 0 ? Date.now() - rt.startedAt : 0;\n\t\tif (uptime >= STABLE_UPTIME_MS) rt.consecutiveFastExits = 0;\n\t\tconst attemptNumber = rt.consecutiveFastExits;\n\t\tif (uptime < STABLE_UPTIME_MS) rt.consecutiveFastExits += 1;\n\t\tif (rt.consecutiveFastExits >= MAX_CONSECUTIVE_FAST_EXITS) {\n\t\t\tinst.status = \"held\";\n\t\t\tschedulePersist();\n\t\t\tgetLog(inst).writeLine(`[emulator] held after ${String(MAX_CONSECUTIVE_FAST_EXITS)} consecutive fast exits — send a new deployment to resume`);\n\t\t\treturn;\n\t\t}\n\t\tconst delayMs = Math.min(MAX_BACKOFF_MS, BASE_BACKOFF_MS * 2 ** attemptNumber);\n\t\tinst.status = \"backoff\";\n\t\tschedulePersist();\n\t\tgetLog(inst).writeLine(`[emulator] exited (code ${code === null ? \"null\" : String(code)}) — restarting in ${String(delayMs / 1e3)}s`);\n\t\trt.backoffTimer = setTimeout(() => {\n\t\t\trt.backoffTimer = void 0;\n\t\t\tspawnInstance(inst, rt, false);\n\t\t}, delayMs);\n\t}\n\t/** Records `run` as the instance's start in flight, replacing any earlier one. */\n\tfunction beginStart(rt, fresh, run) {\n\t\tconst token = { processExited: false };\n\t\tconst result = run(token).finally(() => {\n\t\t\tif (rt.start?.token === token) rt.start = void 0;\n\t\t});\n\t\trt.start = {\n\t\t\ttoken,\n\t\t\tfresh,\n\t\t\tresult\n\t\t};\n\t\treturn result;\n\t}\n\t/** The start in flight, unless its process has already exited. */\n\tfunction joinableStart(rt) {\n\t\treturn rt.start?.token.processExited === false ? rt.start : void 0;\n\t}\n\t/** Undefined while `token` is still the instance's start. Otherwise what that start reports: a newer start's result, or \"stopped\" after a stop or a delete. */\n\tfunction supersededOutcome(inst, rt, token) {\n\t\tif (!rt.deleted && rt.start?.token === token) return void 0;\n\t\tif (!rt.deleted && rt.start) return rt.start.result;\n\t\treturn Promise.resolve({\n\t\t\tok: false,\n\t\t\tmessage: `instance \"${inst.id}\" was stopped before it accepted connections`\n\t\t});\n\t}\n\t/**\n\t* Spawns the instance's child and resolves once it accepts connections on\n\t* its port — only then is it `running`. A child that exits first, or never\n\t* listens within the readiness timeout, fails the start with a message\n\t* naming the instance and its log.\n\t*/\n\tfunction spawnInstance(inst, rt, fresh) {\n\t\treturn beginStart(rt, fresh, (token) => spawnAndWaitUntilListening(inst, rt, fresh, token));\n\t}\n\tasync function spawnAndWaitUntilListening(inst, rt, fresh, token) {\n\t\tconst env = inst.env ?? {};\n\t\tconst artifactDir = inst.artifactDir ?? \".\";\n\t\tconst bunPath = resolveBunOnPath(env);\n\t\tif (!bunPath) {\n\t\t\tinst.status = \"stopped\";\n\t\t\tdelete inst.pid;\n\t\t\tschedulePersist();\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\tmessage: BUN_NOT_FOUND_MESSAGE\n\t\t\t};\n\t\t}\n\t\tconst log = getLog(inst);\n\t\tif (fresh) {\n\t\t\tlog.clear();\n\t\t\tlogGeneration.set(inst.logPath, (logGeneration.get(inst.logPath) ?? 0) + 1);\n\t\t}\n\t\tconst child = spawn(bunPath, [\"bootstrap.js\"], {\n\t\t\tcwd: artifactDir,\n\t\t\tenv,\n\t\t\tstdio: [\n\t\t\t\t\"ignore\",\n\t\t\t\t\"pipe\",\n\t\t\t\t\"pipe\"\n\t\t\t]\n\t\t});\n\t\trt.child = child;\n\t\trt.expectedExit = false;\n\t\trt.startedAt = Date.now();\n\t\tclearStableTimer(rt);\n\t\trt.stableTimer = setTimeout(() => {\n\t\t\trt.consecutiveFastExits = 0;\n\t\t}, STABLE_UPTIME_MS);\n\t\tchild.stdout?.on(\"data\", (chunk) => log.writeRaw(chunk));\n\t\tchild.stderr?.on(\"data\", (chunk) => log.writeRaw(chunk));\n\t\tchild.on(\"exit\", (code) => handleChildExit(inst, rt, child, code));\n\t\tchild.once(\"exit\", () => {\n\t\t\ttoken.processExited = true;\n\t\t});\n\t\tif (child.pid !== void 0) inst.pid = child.pid;\n\t\tif (inst.listens === false) {\n\t\t\tinst.status = \"running\";\n\t\t\tschedulePersist();\n\t\t\treturn { ok: true };\n\t\t}\n\t\tschedulePersist();\n\t\tconst port = String(inst.port);\n\t\tconst outcome = await waitUntilListening(child, inst.port, readyTimeoutMs, readyPollMs);\n\t\tconst superseded = supersededOutcome(inst, rt, token);\n\t\tif (superseded) return superseded;\n\t\tconst instance = `instance \"${inst.id}\"`;\n\t\tif (outcome.kind === \"exited\") return {\n\t\t\tok: false,\n\t\t\tmessage: `${instance} exited (${outcome.code !== null ? `code ${String(outcome.code)}` : outcome.signal ?? \"no exit code\"}) before it accepted connections on its port ${port}. Its log: ${inst.logPath}`\n\t\t};\n\t\tif (outcome.kind === \"timed-out\") {\n\t\t\tconst seconds = String(readyTimeoutMs / 1e3);\n\t\t\tconst message = `${instance} did not accept connections on its port ${port} within ${seconds}s. Its log: ${inst.logPath}. If it needs longer to start, set ${SERVICE_READY_TIMEOUT_ENV} (milliseconds) and restart the compute emulator. If it never listens on its port, deploy it with listens: false.`;\n\t\t\tif (fresh) {\n\t\t\t\tlog.writeLine(`[emulator] did not accept connections on port ${port} within ${seconds}s — stopped`);\n\t\t\t\tawait stopInstance(inst, rt);\n\t\t\t} else {\n\t\t\t\tlog.writeLine(`[emulator] restart did not accept connections on port ${port} within ${seconds}s — held; send a new deployment to resume`);\n\t\t\t\tawait stopInstance(inst, rt, \"held\");\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\tmessage\n\t\t\t};\n\t\t}\n\t\tinst.status = \"running\";\n\t\tschedulePersist();\n\t\treturn { ok: true };\n\t}\n\tasync function stopInstance(inst, rt, finalStatus = \"stopped\") {\n\t\trt.start = void 0;\n\t\tclearBackoffTimer(rt);\n\t\tclearStableTimer(rt);\n\t\tconst stopping = killChild(rt, TERMINATE_GRACE_MS).then(() => {\n\t\t\tinst.status = finalStatus;\n\t\t\tdelete inst.pid;\n\t\t\tschedulePersist();\n\t\t});\n\t\trt.stopping = stopping;\n\t\ttry {\n\t\t\tawait stopping;\n\t\t} finally {\n\t\t\tif (rt.stopping === stopping) rt.stopping = void 0;\n\t\t}\n\t}\n\tasync function stopsFinished(rt) {\n\t\twhile (rt.stopping) await rt.stopping;\n\t}\n\t/**\n\t* The session-resume signal: Alchemy's no-op reconcile never fires a\n\t* deployment PUT, so nothing else restarts an instance a previous session\n\t* stopped. Reuses the exact deployment-PUT start rules — same spawn\n\t* path, same supervision reset, and an explicit resume clears `held`\n\t* the same way a deployment PUT does — but from the instance's already\n\t* STORED deployment, since no new one arrives with a start.\n\t*/\n\tasync function startInstance(inst) {\n\t\tif (inst.artifactHash === void 0) return { ok: true };\n\t\tconst rt = getRuntime(inst.id);\n\t\tconst inFlight = joinableStart(rt);\n\t\tif (inFlight) return inFlight.result;\n\t\tif (inst.status === \"running\" && rt.stopping === void 0) return { ok: true };\n\t\treturn beginStart(rt, true, async (token) => {\n\t\t\tclearBackoffTimer(rt);\n\t\t\tawait stopsFinished(rt);\n\t\t\tconst superseded = supersededOutcome(inst, rt, token);\n\t\t\tif (superseded) return superseded;\n\t\t\tclearStableTimer(rt);\n\t\t\trt.consecutiveFastExits = 0;\n\t\t\treturn spawnAndWaitUntilListening(inst, rt, true, token);\n\t\t});\n\t}\n\tasync function deleteInstance(inst) {\n\t\tconst rt = getRuntime(inst.id);\n\t\trt.deleted = true;\n\t\tawait stopInstance(inst, rt);\n\t\trt.log?.close();\n\t\truntimes.delete(inst.id);\n\t\tdelete state.instances[inst.id];\n\t\tschedulePersist();\n\t\tclearLockedPorts();\n\t\tawait fs.promises.rm(inst.logPath, { force: true });\n\t}\n\tfunction json(res, status, body) {\n\t\tconst text = JSON.stringify(body);\n\t\tres.writeHead(status, { \"content-type\": \"application/json\" });\n\t\tres.end(text);\n\t}\n\tfunction text(res, status, body) {\n\t\tres.writeHead(status, { \"content-type\": \"text/plain; charset=utf-8\" });\n\t\tres.end(body);\n\t}\n\tfunction noContent(res) {\n\t\tres.writeHead(204);\n\t\tres.end();\n\t}\n\tfunction readBody(req) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst chunks = [];\n\t\t\treq.on(\"data\", (chunk) => chunks.push(chunk));\n\t\t\treq.on(\"end\", () => resolve(Buffer.concat(chunks)));\n\t\t\treq.on(\"error\", reject);\n\t\t});\n\t}\n\tasync function readJsonBody(req) {\n\t\tconst raw = await readBody(req);\n\t\ttry {\n\t\t\treturn JSON.parse(raw.toString(\"utf8\"));\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t}\n\tfunction instanceView(inst) {\n\t\treturn {\n\t\t\tid: inst.id,\n\t\t\tlabels: inst.labels,\n\t\t\tport: inst.port,\n\t\t\turl: `http://localhost:${String(inst.port)}`,\n\t\t\tstatus: inst.status,\n\t\t\t...inst.pid !== void 0 ? { pid: inst.pid } : {},\n\t\t\t...inst.lastExitCode !== void 0 ? { lastExitCode: inst.lastExitCode } : {},\n\t\t\t...inst.artifactHash !== void 0 ? { artifactHash: inst.artifactHash } : {},\n\t\t\tlogPath: inst.logPath\n\t\t};\n\t}\n\tfunction envEquals(a, b) {\n\t\tif (!a) return false;\n\t\tconst aKeys = Object.keys(a);\n\t\tconst bKeys = Object.keys(b);\n\t\tif (aKeys.length !== bKeys.length) return false;\n\t\treturn aKeys.every((k) => a[k] === b[k]);\n\t}\n\tasync function handleDeployment(req, res, inst) {\n\t\tconst body = await readJsonBody(req);\n\t\tif (!isDeploymentBody(body)) return text(res, 400, \"malformed deployment body\");\n\t\tconst rt = getRuntime(inst.id);\n\t\tconst listens = body.listens ?? true;\n\t\tconst changed = inst.artifactHash !== body.artifactHash || !envEquals(inst.env, body.env) || (inst.listens ?? true) !== listens;\n\t\tlet result;\n\t\tconst inFlight = joinableStart(rt);\n\t\tif (!changed && inFlight?.fresh === true) result = await inFlight.result;\n\t\telse if (!changed && rt.start === void 0 && rt.stopping === void 0 && inst.status === \"running\") result = { ok: true };\n\t\telse {\n\t\t\tinst.artifactHash = body.artifactHash;\n\t\t\tinst.env = body.env;\n\t\t\tinst.artifactDir = body.artifactDir;\n\t\t\tinst.listens = listens;\n\t\t\tclearBackoffTimer(rt);\n\t\t\tschedulePersist();\n\t\t\tresult = await beginStart(rt, true, async (token) => {\n\t\t\t\tawait stopsFinished(rt);\n\t\t\t\tawait killChild(rt, TERMINATE_GRACE_MS);\n\t\t\t\tconst superseded = supersededOutcome(inst, rt, token);\n\t\t\t\tif (superseded) return superseded;\n\t\t\t\tinst.status = \"stopped\";\n\t\t\t\tdelete inst.pid;\n\t\t\t\tclearStableTimer(rt);\n\t\t\t\trt.consecutiveFastExits = 0;\n\t\t\t\treturn spawnAndWaitUntilListening(inst, rt, true, token);\n\t\t\t});\n\t\t}\n\t\tif (!result.ok) return text(res, 500, result.message ?? \"failed to start the instance\");\n\t\tnoContent(res);\n\t}\n\t/** Byte offset a follow should start at to show the last `tailLines` complete lines; `<= 0` (or an empty file) starts at the current end, no backlog. */\n\tfunction startOffsetForTail(logPath, tailLines) {\n\t\tlet size = 0;\n\t\ttry {\n\t\t\tsize = fs.statSync(logPath).size;\n\t\t} catch {\n\t\t\treturn 0;\n\t\t}\n\t\tif (tailLines <= 0 || size === 0) return size;\n\t\tconst fd = fs.openSync(logPath, \"r\");\n\t\ttry {\n\t\t\tconst buf = Buffer.alloc(size);\n\t\t\tfs.readSync(fd, buf, 0, size, 0);\n\t\t\tlet seen = 0;\n\t\t\tfor (let i = size - 1; i >= 0; i -= 1) {\n\t\t\t\tif (buf[i] !== 10) continue;\n\t\t\t\tif (i === size - 1) continue;\n\t\t\t\tseen += 1;\n\t\t\t\tif (seen === tailLines) return i + 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t} finally {\n\t\t\tfs.closeSync(fd);\n\t\t}\n\t}\n\tfunction handleFollowLogs(res, logPath, tailLines) {\n\t\tfs.mkdirSync(path.dirname(logPath), { recursive: true });\n\t\tif (!fs.existsSync(logPath)) fs.closeSync(fs.openSync(logPath, \"a\"));\n\t\tres.writeHead(200, { \"content-type\": \"text/plain; charset=utf-8\" });\n\t\tlet offset = startOffsetForTail(logPath, tailLines);\n\t\tlet generation = logGeneration.get(logPath) ?? 0;\n\t\tlet stopped = false;\n\t\tlet timer;\n\t\tconst tick = () => {\n\t\t\tif (stopped) return;\n\t\t\tconst currentGeneration = logGeneration.get(logPath) ?? 0;\n\t\t\tif (currentGeneration !== generation) {\n\t\t\t\tgeneration = currentGeneration;\n\t\t\t\toffset = 0;\n\t\t\t}\n\t\t\tlet stat;\n\t\t\ttry {\n\t\t\t\tstat = fs.statSync(logPath);\n\t\t\t} catch {\n\t\t\t\tstat = void 0;\n\t\t\t}\n\t\t\tif (stat && stat.size < offset) offset = 0;\n\t\t\tif (stat && stat.size > offset) {\n\t\t\t\tconst fd = fs.openSync(logPath, \"r\");\n\t\t\t\tconst buf = Buffer.alloc(stat.size - offset);\n\t\t\t\tfs.readSync(fd, buf, 0, buf.length, offset);\n\t\t\t\tfs.closeSync(fd);\n\t\t\t\toffset = stat.size;\n\t\t\t\tres.write(buf);\n\t\t\t}\n\t\t\tif (!stopped) timer = setTimeout(tick, LOG_POLL_INTERVAL_MS);\n\t\t};\n\t\ttick();\n\t\tconst stop = () => {\n\t\t\tstopped = true;\n\t\t\tif (timer) clearTimeout(timer);\n\t\t};\n\t\tres.on(\"close\", stop);\n\t}\n\tfunction handleLogs(url, res, inst) {\n\t\tif (url.searchParams.get(\"follow\") === \"1\") {\n\t\t\tconst tailParam = url.searchParams.get(\"tail\");\n\t\t\tconst tailLines = tailParam === null ? 0 : Math.max(0, Number.parseInt(tailParam, 10) || 0);\n\t\t\thandleFollowLogs(res, inst.logPath, tailLines);\n\t\t\treturn;\n\t\t}\n\t\tconst content = fs.existsSync(inst.logPath) ? fs.readFileSync(inst.logPath) : Buffer.alloc(0);\n\t\tres.writeHead(200, { \"content-type\": \"text/plain; charset=utf-8\" });\n\t\tres.end(content);\n\t}\n\t/** The instances `ids` name, or the ids no instance has. */\n\tfunction instancesByIds(ids) {\n\t\tconst unknown = ids.filter((id) => state.instances[id] === void 0);\n\t\tif (unknown.length > 0) return { unknown };\n\t\treturn { found: ids.flatMap((id) => state.instances[id] ?? []) };\n\t}\n\tfunction unknownInstances(res, ids) {\n\t\ttext(res, 404, `no such instance: ${ids.map((id) => `\"${id}\"`).join(\", \")}`);\n\t}\n\tasync function handleBulk(req, res, action) {\n\t\tconst body = await readJsonBody(req);\n\t\tif (!isIdsBody(body)) return text(res, 400, \"malformed body: expected { \\\"ids\\\": string[] }\");\n\t\tif (action === \"stop\") {\n\t\t\tconst known = body.ids.flatMap((id) => state.instances[id] ?? []);\n\t\t\tawait Promise.all(known.map((inst) => stopInstance(inst, getRuntime(inst.id))));\n\t\t\treturn noContent(res);\n\t\t}\n\t\tconst selected = instancesByIds(body.ids);\n\t\tif (\"unknown\" in selected) return unknownInstances(res, selected.unknown);\n\t\tconst failures = (await Promise.all(selected.found.map(startInstance))).flatMap((r) => r.ok ? [] : [r.message ?? \"failed to start\"]);\n\t\tif (failures.length > 0) return text(res, 500, failures.join(\"\\n\"));\n\t\tnoContent(res);\n\t}\n\tasync function handleRequest(req, res) {\n\t\tconst url = new URL(req.url ?? \"/\", `http://127.0.0.1:${String(port)}`);\n\t\tconst method = req.method ?? \"GET\";\n\t\tconst segments = url.pathname.split(\"/\").filter((s) => s.length > 0).map((s) => decodeURIComponent(s));\n\t\tif (method === \"GET\" && segments.length === 1 && segments[0] === \"health\") return json(res, 200, { version: ownVersion });\n\t\tif (segments[0] !== \"instances\") {\n\t\t\tres.writeHead(404);\n\t\t\tres.end();\n\t\t\treturn;\n\t\t}\n\t\tif (segments.length === 1) {\n\t\t\tif (method === \"GET\") return json(res, 200, Object.values(state.instances).map(instanceView));\n\t\t\tif (method === \"POST\") {\n\t\t\t\tconst body = await readJsonBody(req);\n\t\t\t\tif (!isCreateBody(body)) return text(res, 400, \"malformed body: expected { \\\"labels\\\": Record<string, string>, \\\"port\\\"?: number }\");\n\t\t\t\treturn json(res, 201, instanceView(await createInstance(body)));\n\t\t\t}\n\t\t}\n\t\tif (method === \"POST\" && segments.length === 2 && segments[1] === \"start\") return handleBulk(req, res, \"start\");\n\t\tif (method === \"POST\" && segments.length === 2 && segments[1] === \"stop\") return handleBulk(req, res, \"stop\");\n\t\tconst id = segments[1];\n\t\tif (id !== void 0 && !INSTANCE_ID_RE.test(id)) return text(res, 400, `invalid instance id \"${id}\"`);\n\t\tconst inst = id === void 0 ? void 0 : state.instances[id];\n\t\tif (method === \"DELETE\" && segments.length === 2) {\n\t\t\tif (inst) await deleteInstance(inst);\n\t\t\treturn noContent(res);\n\t\t}\n\t\tif (!inst) return unknownInstances(res, id === void 0 ? [] : [id]);\n\t\tif (method === \"GET\" && segments.length === 2) return json(res, 200, instanceView(inst));\n\t\tif (method === \"PUT\" && segments.length === 3 && segments[2] === \"deployment\") return handleDeployment(req, res, inst);\n\t\tif (method === \"GET\" && segments.length === 3 && segments[2] === \"logs\") return handleLogs(url, res, inst);\n\t\tres.writeHead(404);\n\t\tres.end();\n\t}\n\tconst server = http.createServer((req, res) => {\n\t\thandleRequest(req, res).catch((err) => {\n\t\t\tif (!res.headersSent) res.writeHead(500, { \"content-type\": \"text/plain\" });\n\t\t\tres.end(err instanceof Error ? err.message : String(err));\n\t\t});\n\t});\n\tlet shuttingDown = false;\n\tasync function shutdown() {\n\t\tif (shuttingDown) return;\n\t\tshuttingDown = true;\n\t\tconst kills = [];\n\t\tfor (const rt of runtimes.values()) {\n\t\t\tclearBackoffTimer(rt);\n\t\t\tclearStableTimer(rt);\n\t\t\tif (rt.child) kills.push(killChild(rt, TERMINATE_GRACE_MS));\n\t\t}\n\t\tawait Promise.all(kills);\n\t\tawait stateFile.flush();\n\t\tserver.close();\n\t\tprocess.exit(0);\n\t}\n\tprocess.on(\"SIGTERM\", () => void shutdown());\n\tprocess.on(\"SIGINT\", () => void shutdown());\n\tdiscardStateFromEarlierVersions(stateDir, statePath, logsDir).then(() => readJsonFile(statePath, isInstancesState)).then((loaded) => {\n\t\tif (loaded) {\n\t\t\tfor (const inst of Object.values(loaded.instances)) if (inst.status === \"running\" || inst.status === \"backoff\") {\n\t\t\t\tinst.status = \"stopped\";\n\t\t\t\tdelete inst.pid;\n\t\t\t}\n\t\t\tstate = loaded;\n\t\t}\n\t\tserver.listen(port, \"127.0.0.1\", () => {\n\t\t\tconsole.log(`[dev-emulators] compute-main listening on 127.0.0.1:${String(port)}`);\n\t\t});\n\t}).catch((err) => {\n\t\tconsole.error(\"compute-main: failed to load state\", err);\n\t\tprocess.exit(1);\n\t});\n}\n/**\n* Removes state files this version does not write, and log directories: an\n* earlier version kept its state in another JSON file and grouped its logs in\n* directories. Local dev state is never migrated across versions; those\n* instances are simply gone.\n*/\nasync function discardStateFromEarlierVersions(stateDir, statePath, logsDir) {\n\tconst stateFiles = await fs.promises.readdir(stateDir).catch(() => []);\n\tawait Promise.all(stateFiles.map((name) => path.join(stateDir, name)).filter((file) => file.endsWith(\".json\") && file !== statePath).map((file) => fs.promises.rm(file, { force: true })));\n\tconst logEntries = await fs.promises.readdir(logsDir, { withFileTypes: true }).catch(() => []);\n\tawait Promise.all(logEntries.filter((entry) => entry.isDirectory()).map((entry) => fs.promises.rm(path.join(logsDir, entry.name), { recursive: true })));\n}\nmain();\n//#endregion\nexport {};\n\n//# sourceMappingURL=compute-main.mjs.map"],"mappings":"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"}
|
package/dist/control.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { c as paramBindingFor, l as paramName } from "./casts-DpaahrlC-Ykus3kCE.
|
|
|
2
2
|
import { a as encode, c as paramEntries, d as serializeInput, n as configKey, o as encodeParamPointer, r as decodeParamPointer, s as isParamPointerRow } from "./serializer-CE3hLPYz-DfUFvkm9.mjs";
|
|
3
3
|
import { a as provisionedEdges, n as SELF_ORIGIN, r as STREAMS_API_KEY, t as RESERVED_PROVIDER_PARAMS } from "./provisioned-edges-CPrUiJ1K--R7PIGoz.mjs";
|
|
4
4
|
import { n as requiredPackHeadOf } from "./required-pack-head-CMMJ2LaU-CfWu5JMj.mjs";
|
|
5
|
-
import { A as call, C as ServiceKey, D as ManagementClient, E as isWithin, F as resolveDefaultBranchId, I as PrismaCredentials, L as fromEnv, M as collectPages, N as drivePagesAsync, O as PrismaApiError, P as layer, R as managementApiBaseUrl, S as providers, T as appAfterEnvironment, _ as resolveTargetRef, a as PRISMA_CLOUD_EXTENSION_ID, d as collectPreflightNames, f as containerDescriptor, g as resolveOrmConfig, h as prismaCloudContainerOf, i as OrmMigrationProvider, j as claimDatabaseUrlKeys, k as RESERVED_DATABASE_URL_KEYS, l as S3Credentials, m as packHeadRefHashes, n as GeneratedParamProvider, o as PgWarm, r as OrmMigration, s as PgWarmProvider, t as GeneratedParam, u as S3CredentialsProvider, v as serviceAppName, w as ServiceKeyProvider, y as targetStorageHash } from "./s3-credentials-resource-BZjtuopJ-
|
|
5
|
+
import { A as call, C as ServiceKey, D as ManagementClient, E as isWithin, F as resolveDefaultBranchId, I as PrismaCredentials, L as fromEnv, M as collectPages, N as drivePagesAsync, O as PrismaApiError, P as layer, R as managementApiBaseUrl, S as providers, T as appAfterEnvironment, _ as resolveTargetRef, a as PRISMA_CLOUD_EXTENSION_ID, d as collectPreflightNames, f as containerDescriptor, g as resolveOrmConfig, h as prismaCloudContainerOf, i as OrmMigrationProvider, j as claimDatabaseUrlKeys, k as RESERVED_DATABASE_URL_KEYS, l as S3Credentials, m as packHeadRefHashes, n as GeneratedParamProvider, o as PgWarm, r as OrmMigration, s as PgWarmProvider, t as GeneratedParam, u as S3CredentialsProvider, v as serviceAppName, w as ServiceKeyProvider, y as targetStorageHash } from "./s3-credentials-resource-BZjtuopJ-azxxffwQ.mjs";
|
|
6
6
|
import { r as isPostgresResourceNode } from "./orm-postgres-ChW2Ewj7-Dnas0G3L.mjs";
|
|
7
7
|
import { isParamSource } from "@prisma/composer";
|
|
8
8
|
import { blindCast } from "@prisma/composer/casts";
|