@statewalker/cellb 0.2.0 → 0.3.0
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/README.md +7 -5
- package/dist/isolate/host.d.ts +1 -1
- package/dist/isolate/host.js +17 -6
- package/dist/isolate/host.js.map +1 -1
- package/dist/isolate/isolate.js +8 -0
- package/dist/isolate/isolate.js.map +1 -1
- package/dist/isolate/protocol.d.ts +3 -2
- package/dist/isolate/protocol.js +47 -51
- package/dist/isolate/protocol.js.map +1 -1
- package/dist/peer/celld-peer.d.ts +17 -0
- package/dist/peer/celld-peer.js +49 -7
- package/dist/peer/celld-peer.js.map +1 -1
- package/dist/project/wrangler.js +1 -1
- package/dist/project/wrangler.js.map +1 -1
- package/dist/transport/port.d.ts +3 -4
- package/dist/transport/port.js +21 -79
- package/dist/transport/port.js.map +1 -1
- package/dist/ws/client.d.ts +23 -8
- package/dist/ws/client.js +50 -189
- package/dist/ws/client.js.map +1 -1
- package/dist/ws/frames.d.ts +17 -8
- package/dist/ws/frames.js +3 -7
- package/dist/ws/frames.js.map +1 -1
- package/dist/ws/server.js +13 -4
- package/dist/ws/server.js.map +1 -1
- package/package.json +5 -6
package/dist/peer/celld-peer.js
CHANGED
|
@@ -142,6 +142,48 @@ function reply(res, status, headers, body) {
|
|
|
142
142
|
res.end(body);
|
|
143
143
|
}
|
|
144
144
|
const stale = (res) => reply(res, 409, { "x-cells-route-error": "stale-owner", "content-type": "text/plain" }, "stale route");
|
|
145
|
+
/** RFC 7230 `token`: what a subprotocol name may be. */
|
|
146
|
+
const TOKEN = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
|
|
147
|
+
/**
|
|
148
|
+
* The subprotocols a `Sec-WebSocket-Protocol` header offers, as a client may ask for them: the
|
|
149
|
+
* valid tokens, each once (case-insensitively), in the offered order. A header a client sent
|
|
150
|
+
* through celld is not trusted to be well formed, and the client class refuses a malformed list.
|
|
151
|
+
*/
|
|
152
|
+
export function offeredProtocols(header) {
|
|
153
|
+
const seen = new Set();
|
|
154
|
+
const out = [];
|
|
155
|
+
for (const raw of (header ?? "").split(",")) {
|
|
156
|
+
const p = raw.trim();
|
|
157
|
+
if (!TOKEN.test(p) || seen.has(p.toLowerCase()))
|
|
158
|
+
continue;
|
|
159
|
+
seen.add(p.toLowerCase());
|
|
160
|
+
out.push(p);
|
|
161
|
+
}
|
|
162
|
+
return out;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* The cell's side of a tunneled WebSocket: a client socket on the port of the 101's
|
|
166
|
+
* WebSocketPair end. It asks for the subprotocols the far client offered (`offered`, the
|
|
167
|
+
* `Sec-WebSocket-Protocol` header): a client refuses a subprotocol it did not ask for, and the
|
|
168
|
+
* cell picks one of those. Should the socket not be made, the port is closed, and the cell's
|
|
169
|
+
* end with it.
|
|
170
|
+
*/
|
|
171
|
+
export function cellSocket(res, offered) {
|
|
172
|
+
const port = takeClientPort(res.webSocket);
|
|
173
|
+
try {
|
|
174
|
+
const WS = createWebSocketClass(async () => ({
|
|
175
|
+
port,
|
|
176
|
+
protocol: res.headers.get("Sec-WebSocket-Protocol") ?? undefined,
|
|
177
|
+
}));
|
|
178
|
+
const cell = new WS("ws://cell/", offeredProtocols(offered));
|
|
179
|
+
cell.binaryType = "arraybuffer";
|
|
180
|
+
return cell;
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
port.close();
|
|
184
|
+
throw error;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
145
187
|
/**
|
|
146
188
|
* Serves celld's peer tunnel for `runtime` on `host:port` (0: any free port). `node` is this
|
|
147
189
|
* node's name in the fleet (the same as celldBucket's `node`).
|
|
@@ -265,13 +307,13 @@ export async function startCelldPeerServer(opts) {
|
|
|
265
307
|
}
|
|
266
308
|
if (res.status !== 101 || !res.webSocket)
|
|
267
309
|
return fail(res.status, await res.text());
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
310
|
+
let cell;
|
|
311
|
+
try {
|
|
312
|
+
cell = cellSocket(res, protocols);
|
|
313
|
+
}
|
|
314
|
+
catch (e) {
|
|
315
|
+
return fail(400, String(e?.message ?? e));
|
|
316
|
+
}
|
|
275
317
|
const pending = [];
|
|
276
318
|
let open = false;
|
|
277
319
|
wss.handleUpgrade(req, socket, head, (client) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"celld-peer.js","sourceRoot":"","sources":["../../src/peer/celld-peer.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, createHmac, randomBytes, timingSafeEqual } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport type { Duplex } from \"node:stream\";\nimport type { ObjectStore } from \"../bucket/object-store.js\";\nimport { toAnotherNode } from \"../core/handles.js\";\nimport type { CellRuntime } from \"../core/runtime.js\";\nimport { deserialize, serialize } from \"../v8/serialize.js\";\nimport { createWebSocketClass } from \"../ws/client.js\";\nimport { CellsResponse, type CfWebSocket, takeClientPort, WebSocketPair } from \"../ws/server.js\";\nimport { withUpgrade } from \"../ws/upgrade.js\";\n\n/**\n * celld's peer protocol (peer_auth.rs, main/peer_tunnel.rs, protocol 5) for a cellb node\n * hosted in Node, so celld nodes can route a cell's requests to it when it owns the cell.\n *\n * Authentication: every peer request carries an HMAC-SHA-256 over\n * \"cells-peer-request-v1\\n5\\n<method>\\n<path?query>\\n<sha256(body)>\\n<source>\\n<target>\\n<ts>\\n<nonce>\"\n * keyed by the fleet secret in `fleet/peer-auth.json`, with headers x-cells-peer-{version,\n * source,target,timestamp,nonce,body-sha256,signature}; ±30 s clock window, nonce replay cache,\n * and the target must be this node.\n *\n * Tunnel: `GET /peer/tunnel` with `Upgrade: celld-tunnel` (kind `do` or `rpc`) is answered with\n * 101; then the connection carries plain HTTP/1.1 requests, one call each, with control headers\n * x-cells-scope (the cell, \"<Class>:<idhex>\"), x-cells-do-name, x-cells-request-id:\n * do — the application request as is; the reply streams back.\n * rpc — POST, method in x-cells-rpc-method, arguments V8-serialized (an array) or JSON; the\n * reply is the V8-serialized result, or a tagged error (0, then [error, props]).\n * A cell this node does not own answers 409 with `x-cells-route-error: stale-owner`, so celld\n * re-resolves the owner.\n */\nconst PROTOCOL = \"5\";\nconst DOMAIN = \"cells-peer-request-v1\";\nconst CLOCK_WINDOW_MS = 30_000;\nconst PEER_HEADERS = {\n version: \"x-cells-peer-version\",\n source: \"x-cells-peer-source\",\n target: \"x-cells-peer-target\",\n timestamp: \"x-cells-peer-timestamp\",\n nonce: \"x-cells-peer-nonce\",\n bodySha: \"x-cells-peer-body-sha256\",\n signature: \"x-cells-peer-signature\",\n} as const;\nconst CONTROL = [\n \"x-cells-scope\",\n \"x-cells-do-name\",\n \"x-cells-request-id\",\n \"x-cells-capacity-handoff\",\n];\n\n/** The fleet's peer secret (celld creates it in the bucket). */\nexport async function loadPeerKey(store: ObjectStore): Promise<Uint8Array> {\n const o = await store.get(\"fleet/peer-auth.json\");\n if (!o) throw new Error(\"the fleet has no peer authentication secret; start a celld node first\");\n const { version, key } = JSON.parse(new TextDecoder().decode(o.body)) as {\n version: number;\n key: string;\n };\n if (version !== 1 || !/^[0-9a-f]{64}$/.test(key))\n throw new Error(\"unexpected fleet/peer-auth.json\");\n return Uint8Array.from(Buffer.from(key, \"hex\"));\n}\n\nconst sha256hex = (b: Uint8Array) => createHash(\"sha256\").update(b).digest(\"hex\");\nconst mac = (\n key: Uint8Array,\n c: {\n method: string;\n path: string;\n bodySha: string;\n source: string;\n target: string;\n ts: string;\n nonce: string;\n },\n) =>\n createHmac(\"sha256\", key)\n .update(\n `${DOMAIN}\\n${PROTOCOL}\\n${c.method}\\n${c.path}\\n${c.bodySha}\\n${c.source}\\n${c.target}\\n${c.ts}\\n${c.nonce}`,\n )\n .digest();\n\n/** Headers that sign one peer request from `source` to `target`. */\nexport function signPeerRequest(\n key: Uint8Array,\n source: string,\n target: string,\n method: string,\n pathAndQuery: string,\n body: Uint8Array = new Uint8Array(),\n) {\n const ts = String(Date.now());\n const nonce = randomBytes(16).toString(\"hex\");\n const bodySha = sha256hex(body);\n const signature = mac(key, {\n method,\n path: pathAndQuery,\n bodySha,\n source,\n target,\n ts,\n nonce,\n }).toString(\"hex\");\n return {\n [PEER_HEADERS.version]: PROTOCOL,\n [PEER_HEADERS.source]: source,\n [PEER_HEADERS.target]: target,\n [PEER_HEADERS.timestamp]: ts,\n [PEER_HEADERS.nonce]: nonce,\n [PEER_HEADERS.bodySha]: bodySha,\n [PEER_HEADERS.signature]: signature,\n };\n}\n\n/** celld's verification; returns a status and message on failure. */\nexport function verifyPeerRequest(\n key: Uint8Array,\n self: string,\n method: string,\n pathAndQuery: string,\n headers: Record<string, string | string[] | undefined>,\n body: Uint8Array,\n seen: Map<string, number>,\n): { status: number; message: string; stale?: boolean } | undefined {\n const h = (n: string) => (typeof headers[n] === \"string\" ? (headers[n] as string) : undefined);\n const version = h(PEER_HEADERS.version);\n if (version === undefined) return { status: 401, message: \"peer authentication failed\" };\n if (version !== PROTOCOL)\n return { status: 426, message: \"peer protocol version is incompatible\" };\n const [source, target, ts, nonce, bodySha, signature] = [\n PEER_HEADERS.source,\n PEER_HEADERS.target,\n PEER_HEADERS.timestamp,\n PEER_HEADERS.nonce,\n PEER_HEADERS.bodySha,\n PEER_HEADERS.signature,\n ].map(h);\n if (!source || !target || !ts || !nonce || !bodySha || !signature)\n return { status: 401, message: \"peer authentication failed\" };\n const now = Date.now();\n if (!/^\\d+$/.test(ts) || Math.abs(now - Number(ts)) > CLOCK_WINDOW_MS)\n return { status: 401, message: \"peer authentication failed\" };\n if (\n sha256hex(body) !== bodySha ||\n !/^[0-9a-f]{32}$/.test(nonce) ||\n !/^[0-9a-f]{64}$/.test(signature)\n )\n return { status: 401, message: \"peer authentication failed\" };\n const expected = mac(key, { method, path: pathAndQuery, bodySha, source, target, ts, nonce });\n if (!timingSafeEqual(expected, Buffer.from(signature, \"hex\")))\n return { status: 401, message: \"peer authentication failed\" };\n if (target !== self)\n return { status: 409, message: \"peer request targets a different node session\", stale: true };\n for (const [n, t] of seen) if (now - t > 2 * CLOCK_WINDOW_MS) seen.delete(n);\n if (seen.has(nonce)) return { status: 409, message: \"peer request replay rejected\" };\n seen.set(nonce, now);\n return undefined;\n}\n\nconst readBody = async (req: IncomingMessage) => {\n const chunks: Buffer[] = [];\n for await (const c of req) chunks.push(c as Buffer);\n return new Uint8Array(Buffer.concat(chunks));\n};\n\n/** The cell a scope names, as a stub of this runtime (undefined: not a class we host). */\nfunction stubFor(runtime: CellRuntime, scope: string, name: string | undefined): any {\n const m = /^([^:]+):([0-9a-f]{64})$/.exec(scope);\n if (!m) return undefined;\n const binding = Object.entries(runtime.durableObjectBindings).find(\n ([, cls]) => cls === m[1],\n )?.[0];\n if (!binding) return undefined;\n const ns = runtime.env[binding] as any;\n return name !== undefined ? ns.getByName(name) : ns.get(ns.idFromString(m[2]));\n}\n\nconst notOwner = (e: unknown) =>\n /owned by another|OwnedElsewhere|lease/i.test(String((e as Error)?.message ?? e)) ||\n (e as Error)?.name === \"CellOwnedElsewhereError\";\n\nfunction reply(\n res: ServerResponse,\n status: number,\n headers: Record<string, string>,\n body?: Uint8Array | string,\n) {\n res.writeHead(status, { [PEER_HEADERS.version]: PROTOCOL, ...headers });\n res.end(body);\n}\nconst stale = (res: ServerResponse) =>\n reply(\n res,\n 409,\n { \"x-cells-route-error\": \"stale-owner\", \"content-type\": \"text/plain\" },\n \"stale route\",\n );\n\nexport interface CelldPeerServer {\n /** host:port celld dials (put it in the node record: celldBucket({ addr })). */\n addr: string;\n close(): Promise<void>;\n}\n\n/**\n * Serves celld's peer tunnel for `runtime` on `host:port` (0: any free port). `node` is this\n * node's name in the fleet (the same as celldBucket's `node`).\n */\nexport async function startCelldPeerServer(opts: {\n runtime: CellRuntime;\n store: ObjectStore;\n node: string;\n host?: string;\n port?: number;\n /** Answers celld's signed probe (celldBucket(...).probe): `celld diagnose --peer` reaches us. */\n probe?: (challenge: string) => Promise<unknown>;\n}): Promise<CelldPeerServer> {\n const key = await loadPeerKey(opts.store);\n const seen = new Map<string, number>();\n const host = opts.host ?? \"127.0.0.1\";\n\n const serveDo = async (req: IncomingMessage, res: ServerResponse) => {\n const scope = String(req.headers[\"x-cells-scope\"] ?? \"\");\n const name = req.headers[\"x-cells-do-name\"] as string | undefined;\n const stub = stubFor(opts.runtime, scope, name);\n if (!stub) return reply(res, 400, {}, \"malformed cell scope\");\n const headers = new Headers();\n for (const [k, v] of Object.entries(req.headers))\n if (typeof v === \"string\" && !CONTROL.includes(k)) headers.set(k, v);\n const method = req.method ?? \"GET\";\n const body = method === \"GET\" || method === \"HEAD\" ? undefined : await readBody(req);\n const url = /^https?:\\/\\//.test(req.url ?? \"\")\n ? (req.url as string)\n : `http://${req.headers.host ?? \"cell\"}${req.url ?? \"/\"}`;\n try {\n const r: Response = await stub.fetch(new Request(url, { method, headers, body }));\n const out: Record<string, string> = {};\n r.headers.forEach((v, k) => {\n if (k !== \"content-length\" && k !== \"transfer-encoding\" && k !== \"connection\") out[k] = v;\n });\n reply(res, r.status, out, new Uint8Array(await r.arrayBuffer()));\n } catch (e) {\n if (notOwner(e)) return stale(res);\n reply(res, 500, { \"content-type\": \"text/plain\" }, String((e as Error)?.message ?? e));\n }\n };\n\n const serveRpc = async (req: IncomingMessage, res: ServerResponse) => {\n const scope = String(req.headers[\"x-cells-scope\"] ?? \"\");\n const stub = stubFor(opts.runtime, scope, req.headers[\"x-cells-do-name\"] as string | undefined);\n const method = req.headers[\"x-cells-rpc-method\"] as string | undefined;\n if (!stub) return reply(res, 400, {}, \"malformed cell scope\");\n if (!method) return reply(res, 400, {}, \"RPC method header is missing\");\n const raw = await readBody(req);\n const structured = req.headers[\"content-type\"] === \"application/octet-stream\";\n let args: unknown[];\n if (structured) {\n if (raw[0] !== 0xff) return reply(res, 501, {}, \"RPC stubs cannot cross to cellb\");\n args = deserialize(raw) as unknown[];\n } else args = JSON.parse(new TextDecoder().decode(raw)) as unknown[];\n try {\n const result = await stub[method](...(Array.isArray(args) ? args : [args]));\n if (structured)\n reply(\n res,\n 200,\n { \"content-type\": \"application/octet-stream\" },\n serialize(toAnotherNode(result)),\n );\n else reply(res, 200, { \"content-type\": \"application/json\" }, JSON.stringify(result ?? null));\n } catch (e) {\n if (notOwner(e)) return stale(res);\n if (!structured)\n return reply(\n res,\n 500,\n { \"content-type\": \"text/plain\" },\n `RPC failed: ${String((e as Error)?.message ?? e)}`,\n );\n // celld's callee exception: tag 0, then [error, own properties incl. name]\n const err = e instanceof Error ? e : new Error(String(e));\n const props = e instanceof Error ? { ...e, name: e.name } : { name: \"Error\" };\n const sc = serialize([err, props]);\n const tagged = new Uint8Array(sc.length + 1);\n tagged.set(sc, 1);\n reply(res, 200, { \"content-type\": \"application/octet-stream\" }, tagged);\n }\n };\n\n // One inner HTTP/1.1 server per tunnel kind: an upgraded socket becomes its connection.\n // celld's inner RPC requests carry no Host header: Node would answer 400 by default.\n const inner = {\n do: createServer({ requireHostHeader: false }, (q, s) => void serveDo(q, s)),\n rpc: createServer({ requireHostHeader: false }, (q, s) => void serveRpc(q, s)),\n };\n for (const s of Object.values(inner)) s.keepAliveTimeout = 0;\n // A tunneled WebSocket (celld: the client's own handshake crosses the tunnel and the owner\n // answers it): the cell's 101 + webSocket is bridged to the raw connection, framed by `ws`.\n const { WebSocketServer } = await import(\"ws\");\n const wss = new WebSocketServer({ noServer: true });\n inner.do.on(\"upgrade\", async (req: IncomingMessage, socket: Duplex, head: Buffer) => {\n const fail = (status: number, body: string, extra: Record<string, string> = {}) => {\n const lines = [\n `HTTP/1.1 ${status} ${status === 409 ? \"Conflict\" : \"Error\"}`,\n `${PEER_HEADERS.version}: ${PROTOCOL}`,\n `content-length: ${Buffer.byteLength(body)}`,\n \"connection: close\",\n ];\n for (const [k, v] of Object.entries(extra)) lines.push(`${k}: ${v}`);\n socket.end(`${lines.join(\"\\r\\n\")}\\r\\n\\r\\n${body}`);\n };\n const stub = stubFor(\n opts.runtime,\n String(req.headers[\"x-cells-scope\"] ?? \"\"),\n req.headers[\"x-cells-do-name\"] as string | undefined,\n );\n if (!stub) return fail(400, \"malformed cell scope\");\n const headers = new Headers();\n for (const [k, v] of Object.entries(req.headers))\n if (typeof v === \"string\" && !CONTROL.includes(k)) headers.set(k, v);\n const url = /^https?:\\/\\//.test(req.url ?? \"\")\n ? (req.url as string)\n : `http://${req.headers.host ?? \"cell\"}${req.url ?? \"/\"}`;\n const protocols = req.headers[\"sec-websocket-protocol\"] as string | undefined;\n let res: Response & { webSocket?: CfWebSocket | null };\n try {\n res = await stub.fetch(\n withUpgrade(\n new Request(url, { headers }),\n \"websocket\",\n protocols ? { \"Sec-WebSocket-Protocol\": protocols } : undefined,\n ),\n );\n } catch (e) {\n return notOwner(e)\n ? fail(409, \"stale route\", { \"x-cells-route-error\": \"stale-owner\" })\n : fail(500, String((e as Error)?.message ?? e));\n }\n if (res.status !== 101 || !res.webSocket) return fail(res.status, await res.text());\n const port = takeClientPort(res.webSocket);\n const WS = createWebSocketClass(async () => ({\n port,\n protocol: res.headers.get(\"Sec-WebSocket-Protocol\") ?? undefined,\n }));\n const cell = new WS(\"ws://cell/\") as WebSocket;\n cell.binaryType = \"arraybuffer\";\n const pending: (string | ArrayBuffer)[] = [];\n let open = false;\n wss.handleUpgrade(req, socket, head, (client) => {\n cell.onopen = () => {\n open = true;\n for (const m of pending.splice(0)) cell.send(m);\n };\n client.on(\"message\", (data: Buffer, isBinary: boolean) => {\n const m = isBinary ? (new Uint8Array(data).buffer as ArrayBuffer) : data.toString();\n if (open) cell.send(m);\n else pending.push(m);\n });\n cell.onmessage = (ev: MessageEvent) =>\n client.send(ev.data instanceof ArrayBuffer ? Buffer.from(ev.data) : ev.data);\n client.on(\"close\", (code: number, reason: Buffer) =>\n cell.close(\n code >= 1000 && code < 5000 && code !== 1005 && code !== 1006 ? code : 1000,\n reason.toString(),\n ),\n );\n cell.onclose = (ev: CloseEvent) =>\n client.close(\n ev.code >= 1000 && ev.code !== 1005 && ev.code !== 1006 ? ev.code : 1000,\n ev.reason,\n );\n });\n });\n\n const server: Server = createServer(async (req, res) => {\n if (req.url === \"/peer/probe\" && req.method === \"GET\" && opts.probe) {\n const denied = verifyPeerRequest(\n key,\n opts.node,\n \"GET\",\n \"/peer/probe\",\n req.headers,\n new Uint8Array(),\n seen,\n );\n if (denied)\n return reply(res, denied.status, { \"content-type\": \"text/plain\" }, denied.message);\n try {\n const answer = await opts.probe(String(req.headers[\"x-cells-probe-challenge\"] ?? \"\"));\n return reply(res, 200, { \"content-type\": \"application/json\" }, JSON.stringify(answer));\n } catch (e) {\n return reply(\n res,\n 400,\n { \"content-type\": \"text/plain\" },\n String((e as Error)?.message ?? e),\n );\n }\n }\n reply(res, 404, {}, \"not found\");\n });\n server.on(\"upgrade\", (req: IncomingMessage, socket: Duplex, head: Buffer) => {\n const path = req.url ?? \"/\";\n const refuse = (status: number, message: string, extra: Record<string, string> = {}) => {\n const lines = [\n `HTTP/1.1 ${status} ${message}`,\n `${PEER_HEADERS.version}: ${PROTOCOL}`,\n \"connection: close\",\n \"content-length: 0\",\n ];\n for (const [k, v] of Object.entries(extra)) lines.push(`${k}: ${v}`);\n socket.end(`${lines.join(\"\\r\\n\")}\\r\\n\\r\\n`);\n };\n if (path !== \"/peer/tunnel\" || req.headers.upgrade !== \"celld-tunnel\")\n return refuse(404, \"Not Found\");\n const denied = verifyPeerRequest(\n key,\n opts.node,\n req.method ?? \"GET\",\n path,\n req.headers,\n new Uint8Array(),\n seen,\n );\n if (denied)\n return refuse(\n denied.status,\n denied.message,\n denied.stale ? { \"x-cells-route-error\": \"stale-owner\" } : {},\n );\n if (req.headers[\"x-cells-tunnel-version\"] !== \"5\") return refuse(426, \"Upgrade Required\");\n const kind = req.headers[\"x-cells-tunnel-kind\"];\n if (kind !== \"do\" && kind !== \"rpc\") return refuse(400, \"Bad Request\");\n socket.write(\n [\n \"HTTP/1.1 101 Switching Protocols\",\n \"upgrade: celld-tunnel\",\n \"connection: upgrade\",\n \"x-cells-tunnel-version: 5\",\n `${PEER_HEADERS.version}: ${PROTOCOL}`,\n ].join(\"\\r\\n\") + \"\\r\\n\\r\\n\",\n );\n if (head?.length) socket.unshift(head);\n inner[kind].emit(\"connection\", socket);\n });\n await new Promise<void>((r) => server.listen(opts.port ?? 0, host, () => r()));\n const port = (server.address() as { port: number }).port;\n return {\n addr: `${host}:${port}`,\n close: () =>\n new Promise<void>((r) => {\n server.closeAllConnections?.();\n for (const s of Object.values(inner)) s.closeAllConnections?.();\n server.close(() => r());\n }),\n };\n}\n\n/**\n * The calling half (celld's node A): open a signed tunnel to the owner node and send one call\n * through it — `fetch` on a `do` tunnel, JS RPC on an `rpc` tunnel (V8-serialized arguments;\n * the reply decoded as celld encodes it, a callee exception rethrown with its properties).\n */\n/** A signed `celld-tunnel` upgrade to the owner node: the raw connection after its 101. */\nasync function openTunnel(\n key: Uint8Array,\n source: string,\n owner: { node: string; addr: string },\n kind: \"do\" | \"rpc\",\n): Promise<import(\"node:net\").Socket> {\n const { request } = await import(\"node:http\");\n const [host, port] = [\n owner.addr.slice(0, owner.addr.lastIndexOf(\":\")),\n Number(owner.addr.slice(owner.addr.lastIndexOf(\":\") + 1)),\n ];\n const socket = await new Promise<import(\"node:net\").Socket>((resolve, reject) => {\n const req = request({\n host,\n port,\n path: \"/peer/tunnel\",\n method: \"GET\",\n headers: {\n upgrade: \"celld-tunnel\",\n connection: \"upgrade\",\n \"x-cells-tunnel-version\": \"5\",\n \"x-cells-tunnel-kind\": kind,\n ...signPeerRequest(key, source, owner.node, \"GET\", \"/peer/tunnel\"),\n },\n });\n req.on(\"upgrade\", (_res, sock) => resolve(sock as import(\"node:net\").Socket));\n req.on(\"response\", (res) =>\n reject(\n Object.assign(new Error(`peer tunnel refused: ${res.statusCode}`), {\n stale: res.headers[\"x-cells-route-error\"] === \"stale-owner\",\n }),\n ),\n );\n req.on(\"error\", reject);\n req.end();\n });\n return socket;\n}\n\nasync function tunnelCall(\n key: Uint8Array,\n source: string,\n owner: { node: string; addr: string },\n kind: \"do\" | \"rpc\",\n inner: { method: string; path: string; headers: Record<string, string>; body?: Uint8Array },\n): Promise<{ status: number; headers: Record<string, string>; body: Uint8Array }> {\n const { request } = await import(\"node:http\");\n const socket = await openTunnel(key, source, owner, kind);\n try {\n return await new Promise((resolve, reject) => {\n const req = request(\n // no agent: the request runs on the upgraded socket itself\n {\n createConnection: () => socket,\n method: inner.method,\n path: inner.path,\n headers: inner.headers,\n },\n async (res) => {\n const chunks: Buffer[] = [];\n for await (const c of res) chunks.push(c as Buffer);\n const headers: Record<string, string> = {};\n for (const [k, v] of Object.entries(res.headers))\n if (typeof v === \"string\") headers[k] = v;\n resolve({\n status: res.statusCode ?? 500,\n headers,\n body: new Uint8Array(Buffer.concat(chunks)),\n });\n },\n );\n req.on(\"error\", reject);\n req.end(inner.body);\n });\n } finally {\n socket.destroy();\n }\n}\n\n/**\n * Routing to cells celld nodes own, for CellRuntimeOptions.peers: `ownerOf` reads the cell's\n * own.json, `endpoint` reaches the owner's address from its node record through the tunnel.\n */\nexport function celldPeers(opts: { store: ObjectStore; node: string }) {\n let key: Promise<Uint8Array> | undefined;\n const json = async <T>(k: string) => {\n const o = await opts.store.get(k);\n return o ? (JSON.parse(new TextDecoder().decode(o.body)) as T) : undefined;\n };\n const staleError = (cellKey: string) =>\n Object.assign(new Error(`${cellKey} is owned by another node`), {\n name: \"CellOwnedElsewhereError\",\n });\n return {\n async ownerOf(cellKey: string) {\n const own = await json<{ node: string }>(`cells/${cellKey.replace(\"/\", \":\")}/own.json`);\n return own?.node && own.node !== opts.node ? own.node : undefined;\n },\n link(): never {\n throw new Error(\"celld owners are reached through endpoint()\");\n },\n async endpoint(owner: string, cellKey: string, name: string | undefined) {\n const lease = await json<{ addr: string; expires_ms: number }>(`nodes/${owner}.json`);\n if (!lease?.addr || lease.expires_ms <= Date.now()) return undefined;\n key ??= loadPeerKey(opts.store);\n const k = await key;\n const target = { node: owner, addr: lease.addr };\n const scope = cellKey.replace(\"/\", \":\");\n const control = (h: Record<string, string>) => ({\n ...h,\n \"x-cells-scope\": scope,\n ...(name !== undefined ? { \"x-cells-do-name\": name } : {}),\n });\n // A WebSocket to a cell celld owns: the client handshake crosses a `do` tunnel and `ws`\n // speaks the frames on it; the caller gets a 101 with a WebSocketPair end bridged to it.\n const tunnelWebSocket = async (req: Request, url: URL) => {\n const socket = await openTunnel(k, opts.node, target, \"do\");\n const { WebSocket: WsClient } = await import(\"ws\");\n const protocols = req.headers\n .get(\"sec-websocket-protocol\")\n ?.split(\",\")\n .map((p) => p.trim())\n .filter(Boolean);\n const remote = new WsClient(`ws://${url.host}${url.pathname}${url.search}`, protocols, {\n createConnection: () => socket,\n headers: control({}),\n });\n await new Promise<void>((resolve, reject) => {\n remote.once(\"open\", () => resolve());\n remote.once(\n \"unexpected-response\",\n (_q: unknown, res: { statusCode?: number; headers: Record<string, unknown> }) =>\n reject(\n res.headers[\"x-cells-route-error\"] === \"stale-owner\"\n ? staleError(cellKey)\n : new Error(`WebSocket through the tunnel refused: ${res.statusCode}`),\n ),\n );\n remote.once(\"error\", reject);\n });\n const pair = new WebSocketPair();\n const [client, server] = [pair[0], pair[1]];\n server.accept();\n server.addEventListener(\"message\", (e) => remote.send((e as MessageEvent).data));\n remote.on(\"message\", (d: Buffer, isBinary: boolean) =>\n server.send(isBinary ? new Uint8Array(d) : d.toString()),\n );\n const code = (c: number) => (c >= 1000 && c !== 1005 && c !== 1006 ? c : 1000);\n server.addEventListener(\"close\", (e) =>\n remote.close(code((e as CloseEvent).code), (e as CloseEvent).reason),\n );\n remote.on(\"close\", (c: number, reason: Buffer) => server.close(code(c), reason.toString()));\n return new CellsResponse(null, {\n status: 101,\n webSocket: client,\n headers: remote.protocol ? { \"Sec-WebSocket-Protocol\": remote.protocol } : {},\n }) as Response;\n };\n return {\n async fetch(req: Request) {\n const url = new URL(req.url);\n if (req.headers.get(\"upgrade\")?.toLowerCase() === \"websocket\")\n return tunnelWebSocket(req, url);\n const headers: Record<string, string> = {};\n req.headers.forEach((v, h) => {\n if (!h.startsWith(\"x-cells-\")) headers[h] = v;\n });\n headers.host ??= url.host;\n const body =\n req.method === \"GET\" || req.method === \"HEAD\"\n ? undefined\n : new Uint8Array(await req.arrayBuffer());\n const r = await tunnelCall(k, opts.node, target, \"do\", {\n method: req.method,\n path: url.pathname + url.search,\n headers: control(headers),\n body,\n });\n if (r.status === 409 && r.headers[\"x-cells-route-error\"] === \"stale-owner\")\n throw staleError(cellKey);\n const out = new Headers();\n for (const [h, v] of Object.entries(r.headers))\n if (!h.startsWith(\"x-cells-\")) out.set(h, v);\n return new Response(r.status === 204 || r.status === 304 ? null : (r.body as BodyInit), {\n status: r.status,\n headers: out,\n });\n },\n async call(method: string, args: unknown[]) {\n const body = serialize(toAnotherNode(args));\n const r = await tunnelCall(k, opts.node, target, \"rpc\", {\n method: \"POST\",\n path: \"/\",\n headers: control({\n \"x-cells-rpc-method\": method,\n \"content-type\": \"application/octet-stream\",\n \"content-length\": String(body.length),\n }),\n body,\n });\n if (r.status === 409 && r.headers[\"x-cells-route-error\"] === \"stale-owner\")\n throw staleError(cellKey);\n if (r.status !== 200)\n throw new Error(\n `remote RPC failed with ${r.status}: ${new TextDecoder().decode(r.body)}`,\n );\n if (r.body[0] === 0xff) return deserialize(r.body);\n if (r.body[0] === 0) {\n const [error, props] = deserialize(r.body.subarray(1)) as [\n unknown,\n Record<string, unknown>,\n ];\n if (error instanceof Error) Object.assign(error, props, { remote: true });\n throw error;\n }\n throw new Error(\"RPC stubs cannot cross from celld to cellb\");\n },\n };\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"celld-peer.js","sourceRoot":"","sources":["../../src/peer/celld-peer.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, createHmac, randomBytes, timingSafeEqual } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport type { Duplex } from \"node:stream\";\nimport type { ObjectStore } from \"../bucket/object-store.js\";\nimport { toAnotherNode } from \"../core/handles.js\";\nimport type { CellRuntime } from \"../core/runtime.js\";\nimport { deserialize, serialize } from \"../v8/serialize.js\";\nimport { createWebSocketClass } from \"../ws/client.js\";\nimport { CellsResponse, type CfWebSocket, takeClientPort, WebSocketPair } from \"../ws/server.js\";\nimport { withUpgrade } from \"../ws/upgrade.js\";\n\n/**\n * celld's peer protocol (peer_auth.rs, main/peer_tunnel.rs, protocol 5) for a cellb node\n * hosted in Node, so celld nodes can route a cell's requests to it when it owns the cell.\n *\n * Authentication: every peer request carries an HMAC-SHA-256 over\n * \"cells-peer-request-v1\\n5\\n<method>\\n<path?query>\\n<sha256(body)>\\n<source>\\n<target>\\n<ts>\\n<nonce>\"\n * keyed by the fleet secret in `fleet/peer-auth.json`, with headers x-cells-peer-{version,\n * source,target,timestamp,nonce,body-sha256,signature}; ±30 s clock window, nonce replay cache,\n * and the target must be this node.\n *\n * Tunnel: `GET /peer/tunnel` with `Upgrade: celld-tunnel` (kind `do` or `rpc`) is answered with\n * 101; then the connection carries plain HTTP/1.1 requests, one call each, with control headers\n * x-cells-scope (the cell, \"<Class>:<idhex>\"), x-cells-do-name, x-cells-request-id:\n * do — the application request as is; the reply streams back.\n * rpc — POST, method in x-cells-rpc-method, arguments V8-serialized (an array) or JSON; the\n * reply is the V8-serialized result, or a tagged error (0, then [error, props]).\n * A cell this node does not own answers 409 with `x-cells-route-error: stale-owner`, so celld\n * re-resolves the owner.\n */\nconst PROTOCOL = \"5\";\nconst DOMAIN = \"cells-peer-request-v1\";\nconst CLOCK_WINDOW_MS = 30_000;\nconst PEER_HEADERS = {\n version: \"x-cells-peer-version\",\n source: \"x-cells-peer-source\",\n target: \"x-cells-peer-target\",\n timestamp: \"x-cells-peer-timestamp\",\n nonce: \"x-cells-peer-nonce\",\n bodySha: \"x-cells-peer-body-sha256\",\n signature: \"x-cells-peer-signature\",\n} as const;\nconst CONTROL = [\n \"x-cells-scope\",\n \"x-cells-do-name\",\n \"x-cells-request-id\",\n \"x-cells-capacity-handoff\",\n];\n\n/** The fleet's peer secret (celld creates it in the bucket). */\nexport async function loadPeerKey(store: ObjectStore): Promise<Uint8Array> {\n const o = await store.get(\"fleet/peer-auth.json\");\n if (!o) throw new Error(\"the fleet has no peer authentication secret; start a celld node first\");\n const { version, key } = JSON.parse(new TextDecoder().decode(o.body)) as {\n version: number;\n key: string;\n };\n if (version !== 1 || !/^[0-9a-f]{64}$/.test(key))\n throw new Error(\"unexpected fleet/peer-auth.json\");\n return Uint8Array.from(Buffer.from(key, \"hex\"));\n}\n\nconst sha256hex = (b: Uint8Array) => createHash(\"sha256\").update(b).digest(\"hex\");\nconst mac = (\n key: Uint8Array,\n c: {\n method: string;\n path: string;\n bodySha: string;\n source: string;\n target: string;\n ts: string;\n nonce: string;\n },\n) =>\n createHmac(\"sha256\", key)\n .update(\n `${DOMAIN}\\n${PROTOCOL}\\n${c.method}\\n${c.path}\\n${c.bodySha}\\n${c.source}\\n${c.target}\\n${c.ts}\\n${c.nonce}`,\n )\n .digest();\n\n/** Headers that sign one peer request from `source` to `target`. */\nexport function signPeerRequest(\n key: Uint8Array,\n source: string,\n target: string,\n method: string,\n pathAndQuery: string,\n body: Uint8Array = new Uint8Array(),\n) {\n const ts = String(Date.now());\n const nonce = randomBytes(16).toString(\"hex\");\n const bodySha = sha256hex(body);\n const signature = mac(key, {\n method,\n path: pathAndQuery,\n bodySha,\n source,\n target,\n ts,\n nonce,\n }).toString(\"hex\");\n return {\n [PEER_HEADERS.version]: PROTOCOL,\n [PEER_HEADERS.source]: source,\n [PEER_HEADERS.target]: target,\n [PEER_HEADERS.timestamp]: ts,\n [PEER_HEADERS.nonce]: nonce,\n [PEER_HEADERS.bodySha]: bodySha,\n [PEER_HEADERS.signature]: signature,\n };\n}\n\n/** celld's verification; returns a status and message on failure. */\nexport function verifyPeerRequest(\n key: Uint8Array,\n self: string,\n method: string,\n pathAndQuery: string,\n headers: Record<string, string | string[] | undefined>,\n body: Uint8Array,\n seen: Map<string, number>,\n): { status: number; message: string; stale?: boolean } | undefined {\n const h = (n: string) => (typeof headers[n] === \"string\" ? (headers[n] as string) : undefined);\n const version = h(PEER_HEADERS.version);\n if (version === undefined) return { status: 401, message: \"peer authentication failed\" };\n if (version !== PROTOCOL)\n return { status: 426, message: \"peer protocol version is incompatible\" };\n const [source, target, ts, nonce, bodySha, signature] = [\n PEER_HEADERS.source,\n PEER_HEADERS.target,\n PEER_HEADERS.timestamp,\n PEER_HEADERS.nonce,\n PEER_HEADERS.bodySha,\n PEER_HEADERS.signature,\n ].map(h);\n if (!source || !target || !ts || !nonce || !bodySha || !signature)\n return { status: 401, message: \"peer authentication failed\" };\n const now = Date.now();\n if (!/^\\d+$/.test(ts) || Math.abs(now - Number(ts)) > CLOCK_WINDOW_MS)\n return { status: 401, message: \"peer authentication failed\" };\n if (\n sha256hex(body) !== bodySha ||\n !/^[0-9a-f]{32}$/.test(nonce) ||\n !/^[0-9a-f]{64}$/.test(signature)\n )\n return { status: 401, message: \"peer authentication failed\" };\n const expected = mac(key, { method, path: pathAndQuery, bodySha, source, target, ts, nonce });\n if (!timingSafeEqual(expected, Buffer.from(signature, \"hex\")))\n return { status: 401, message: \"peer authentication failed\" };\n if (target !== self)\n return { status: 409, message: \"peer request targets a different node session\", stale: true };\n for (const [n, t] of seen) if (now - t > 2 * CLOCK_WINDOW_MS) seen.delete(n);\n if (seen.has(nonce)) return { status: 409, message: \"peer request replay rejected\" };\n seen.set(nonce, now);\n return undefined;\n}\n\nconst readBody = async (req: IncomingMessage) => {\n const chunks: Buffer[] = [];\n for await (const c of req) chunks.push(c as Buffer);\n return new Uint8Array(Buffer.concat(chunks));\n};\n\n/** The cell a scope names, as a stub of this runtime (undefined: not a class we host). */\nfunction stubFor(runtime: CellRuntime, scope: string, name: string | undefined): any {\n const m = /^([^:]+):([0-9a-f]{64})$/.exec(scope);\n if (!m) return undefined;\n const binding = Object.entries(runtime.durableObjectBindings).find(\n ([, cls]) => cls === m[1],\n )?.[0];\n if (!binding) return undefined;\n const ns = runtime.env[binding] as any;\n return name !== undefined ? ns.getByName(name) : ns.get(ns.idFromString(m[2]));\n}\n\nconst notOwner = (e: unknown) =>\n /owned by another|OwnedElsewhere|lease/i.test(String((e as Error)?.message ?? e)) ||\n (e as Error)?.name === \"CellOwnedElsewhereError\";\n\nfunction reply(\n res: ServerResponse,\n status: number,\n headers: Record<string, string>,\n body?: Uint8Array | string,\n) {\n res.writeHead(status, { [PEER_HEADERS.version]: PROTOCOL, ...headers });\n res.end(body);\n}\nconst stale = (res: ServerResponse) =>\n reply(\n res,\n 409,\n { \"x-cells-route-error\": \"stale-owner\", \"content-type\": \"text/plain\" },\n \"stale route\",\n );\n\nexport interface CelldPeerServer {\n /** host:port celld dials (put it in the node record: celldBucket({ addr })). */\n addr: string;\n close(): Promise<void>;\n}\n\n/** RFC 7230 `token`: what a subprotocol name may be. */\nconst TOKEN = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\n\n/**\n * The subprotocols a `Sec-WebSocket-Protocol` header offers, as a client may ask for them: the\n * valid tokens, each once (case-insensitively), in the offered order. A header a client sent\n * through celld is not trusted to be well formed, and the client class refuses a malformed list.\n */\nexport function offeredProtocols(header: string | undefined): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const raw of (header ?? \"\").split(\",\")) {\n const p = raw.trim();\n if (!TOKEN.test(p) || seen.has(p.toLowerCase())) continue;\n seen.add(p.toLowerCase());\n out.push(p);\n }\n return out;\n}\n\n/**\n * The cell's side of a tunneled WebSocket: a client socket on the port of the 101's\n * WebSocketPair end. It asks for the subprotocols the far client offered (`offered`, the\n * `Sec-WebSocket-Protocol` header): a client refuses a subprotocol it did not ask for, and the\n * cell picks one of those. Should the socket not be made, the port is closed, and the cell's\n * end with it.\n */\nexport function cellSocket(\n res: Response & { webSocket: CfWebSocket },\n offered: string | undefined,\n): WebSocket {\n const port = takeClientPort(res.webSocket);\n try {\n const WS = createWebSocketClass(async () => ({\n port,\n protocol: res.headers.get(\"Sec-WebSocket-Protocol\") ?? undefined,\n }));\n const cell = new WS(\"ws://cell/\", offeredProtocols(offered)) as WebSocket;\n cell.binaryType = \"arraybuffer\";\n return cell;\n } catch (error) {\n port.close();\n throw error;\n }\n}\n\n/**\n * Serves celld's peer tunnel for `runtime` on `host:port` (0: any free port). `node` is this\n * node's name in the fleet (the same as celldBucket's `node`).\n */\nexport async function startCelldPeerServer(opts: {\n runtime: CellRuntime;\n store: ObjectStore;\n node: string;\n host?: string;\n port?: number;\n /** Answers celld's signed probe (celldBucket(...).probe): `celld diagnose --peer` reaches us. */\n probe?: (challenge: string) => Promise<unknown>;\n}): Promise<CelldPeerServer> {\n const key = await loadPeerKey(opts.store);\n const seen = new Map<string, number>();\n const host = opts.host ?? \"127.0.0.1\";\n\n const serveDo = async (req: IncomingMessage, res: ServerResponse) => {\n const scope = String(req.headers[\"x-cells-scope\"] ?? \"\");\n const name = req.headers[\"x-cells-do-name\"] as string | undefined;\n const stub = stubFor(opts.runtime, scope, name);\n if (!stub) return reply(res, 400, {}, \"malformed cell scope\");\n const headers = new Headers();\n for (const [k, v] of Object.entries(req.headers))\n if (typeof v === \"string\" && !CONTROL.includes(k)) headers.set(k, v);\n const method = req.method ?? \"GET\";\n const body = method === \"GET\" || method === \"HEAD\" ? undefined : await readBody(req);\n const url = /^https?:\\/\\//.test(req.url ?? \"\")\n ? (req.url as string)\n : `http://${req.headers.host ?? \"cell\"}${req.url ?? \"/\"}`;\n try {\n const r: Response = await stub.fetch(new Request(url, { method, headers, body }));\n const out: Record<string, string> = {};\n r.headers.forEach((v, k) => {\n if (k !== \"content-length\" && k !== \"transfer-encoding\" && k !== \"connection\") out[k] = v;\n });\n reply(res, r.status, out, new Uint8Array(await r.arrayBuffer()));\n } catch (e) {\n if (notOwner(e)) return stale(res);\n reply(res, 500, { \"content-type\": \"text/plain\" }, String((e as Error)?.message ?? e));\n }\n };\n\n const serveRpc = async (req: IncomingMessage, res: ServerResponse) => {\n const scope = String(req.headers[\"x-cells-scope\"] ?? \"\");\n const stub = stubFor(opts.runtime, scope, req.headers[\"x-cells-do-name\"] as string | undefined);\n const method = req.headers[\"x-cells-rpc-method\"] as string | undefined;\n if (!stub) return reply(res, 400, {}, \"malformed cell scope\");\n if (!method) return reply(res, 400, {}, \"RPC method header is missing\");\n const raw = await readBody(req);\n const structured = req.headers[\"content-type\"] === \"application/octet-stream\";\n let args: unknown[];\n if (structured) {\n if (raw[0] !== 0xff) return reply(res, 501, {}, \"RPC stubs cannot cross to cellb\");\n args = deserialize(raw) as unknown[];\n } else args = JSON.parse(new TextDecoder().decode(raw)) as unknown[];\n try {\n const result = await stub[method](...(Array.isArray(args) ? args : [args]));\n if (structured)\n reply(\n res,\n 200,\n { \"content-type\": \"application/octet-stream\" },\n serialize(toAnotherNode(result)),\n );\n else reply(res, 200, { \"content-type\": \"application/json\" }, JSON.stringify(result ?? null));\n } catch (e) {\n if (notOwner(e)) return stale(res);\n if (!structured)\n return reply(\n res,\n 500,\n { \"content-type\": \"text/plain\" },\n `RPC failed: ${String((e as Error)?.message ?? e)}`,\n );\n // celld's callee exception: tag 0, then [error, own properties incl. name]\n const err = e instanceof Error ? e : new Error(String(e));\n const props = e instanceof Error ? { ...e, name: e.name } : { name: \"Error\" };\n const sc = serialize([err, props]);\n const tagged = new Uint8Array(sc.length + 1);\n tagged.set(sc, 1);\n reply(res, 200, { \"content-type\": \"application/octet-stream\" }, tagged);\n }\n };\n\n // One inner HTTP/1.1 server per tunnel kind: an upgraded socket becomes its connection.\n // celld's inner RPC requests carry no Host header: Node would answer 400 by default.\n const inner = {\n do: createServer({ requireHostHeader: false }, (q, s) => void serveDo(q, s)),\n rpc: createServer({ requireHostHeader: false }, (q, s) => void serveRpc(q, s)),\n };\n for (const s of Object.values(inner)) s.keepAliveTimeout = 0;\n // A tunneled WebSocket (celld: the client's own handshake crosses the tunnel and the owner\n // answers it): the cell's 101 + webSocket is bridged to the raw connection, framed by `ws`.\n const { WebSocketServer } = await import(\"ws\");\n const wss = new WebSocketServer({ noServer: true });\n inner.do.on(\"upgrade\", async (req: IncomingMessage, socket: Duplex, head: Buffer) => {\n const fail = (status: number, body: string, extra: Record<string, string> = {}) => {\n const lines = [\n `HTTP/1.1 ${status} ${status === 409 ? \"Conflict\" : \"Error\"}`,\n `${PEER_HEADERS.version}: ${PROTOCOL}`,\n `content-length: ${Buffer.byteLength(body)}`,\n \"connection: close\",\n ];\n for (const [k, v] of Object.entries(extra)) lines.push(`${k}: ${v}`);\n socket.end(`${lines.join(\"\\r\\n\")}\\r\\n\\r\\n${body}`);\n };\n const stub = stubFor(\n opts.runtime,\n String(req.headers[\"x-cells-scope\"] ?? \"\"),\n req.headers[\"x-cells-do-name\"] as string | undefined,\n );\n if (!stub) return fail(400, \"malformed cell scope\");\n const headers = new Headers();\n for (const [k, v] of Object.entries(req.headers))\n if (typeof v === \"string\" && !CONTROL.includes(k)) headers.set(k, v);\n const url = /^https?:\\/\\//.test(req.url ?? \"\")\n ? (req.url as string)\n : `http://${req.headers.host ?? \"cell\"}${req.url ?? \"/\"}`;\n const protocols = req.headers[\"sec-websocket-protocol\"] as string | undefined;\n let res: Response & { webSocket?: CfWebSocket | null };\n try {\n res = await stub.fetch(\n withUpgrade(\n new Request(url, { headers }),\n \"websocket\",\n protocols ? { \"Sec-WebSocket-Protocol\": protocols } : undefined,\n ),\n );\n } catch (e) {\n return notOwner(e)\n ? fail(409, \"stale route\", { \"x-cells-route-error\": \"stale-owner\" })\n : fail(500, String((e as Error)?.message ?? e));\n }\n if (res.status !== 101 || !res.webSocket) return fail(res.status, await res.text());\n let cell: WebSocket;\n try {\n cell = cellSocket(res as Response & { webSocket: CfWebSocket }, protocols);\n } catch (e) {\n return fail(400, String((e as Error)?.message ?? e));\n }\n const pending: (string | ArrayBuffer)[] = [];\n let open = false;\n wss.handleUpgrade(req, socket, head, (client) => {\n cell.onopen = () => {\n open = true;\n for (const m of pending.splice(0)) cell.send(m);\n };\n client.on(\"message\", (data: Buffer, isBinary: boolean) => {\n const m = isBinary ? (new Uint8Array(data).buffer as ArrayBuffer) : data.toString();\n if (open) cell.send(m);\n else pending.push(m);\n });\n cell.onmessage = (ev: MessageEvent) =>\n client.send(ev.data instanceof ArrayBuffer ? Buffer.from(ev.data) : ev.data);\n client.on(\"close\", (code: number, reason: Buffer) =>\n cell.close(\n code >= 1000 && code < 5000 && code !== 1005 && code !== 1006 ? code : 1000,\n reason.toString(),\n ),\n );\n cell.onclose = (ev: CloseEvent) =>\n client.close(\n ev.code >= 1000 && ev.code !== 1005 && ev.code !== 1006 ? ev.code : 1000,\n ev.reason,\n );\n });\n });\n\n const server: Server = createServer(async (req, res) => {\n if (req.url === \"/peer/probe\" && req.method === \"GET\" && opts.probe) {\n const denied = verifyPeerRequest(\n key,\n opts.node,\n \"GET\",\n \"/peer/probe\",\n req.headers,\n new Uint8Array(),\n seen,\n );\n if (denied)\n return reply(res, denied.status, { \"content-type\": \"text/plain\" }, denied.message);\n try {\n const answer = await opts.probe(String(req.headers[\"x-cells-probe-challenge\"] ?? \"\"));\n return reply(res, 200, { \"content-type\": \"application/json\" }, JSON.stringify(answer));\n } catch (e) {\n return reply(\n res,\n 400,\n { \"content-type\": \"text/plain\" },\n String((e as Error)?.message ?? e),\n );\n }\n }\n reply(res, 404, {}, \"not found\");\n });\n server.on(\"upgrade\", (req: IncomingMessage, socket: Duplex, head: Buffer) => {\n const path = req.url ?? \"/\";\n const refuse = (status: number, message: string, extra: Record<string, string> = {}) => {\n const lines = [\n `HTTP/1.1 ${status} ${message}`,\n `${PEER_HEADERS.version}: ${PROTOCOL}`,\n \"connection: close\",\n \"content-length: 0\",\n ];\n for (const [k, v] of Object.entries(extra)) lines.push(`${k}: ${v}`);\n socket.end(`${lines.join(\"\\r\\n\")}\\r\\n\\r\\n`);\n };\n if (path !== \"/peer/tunnel\" || req.headers.upgrade !== \"celld-tunnel\")\n return refuse(404, \"Not Found\");\n const denied = verifyPeerRequest(\n key,\n opts.node,\n req.method ?? \"GET\",\n path,\n req.headers,\n new Uint8Array(),\n seen,\n );\n if (denied)\n return refuse(\n denied.status,\n denied.message,\n denied.stale ? { \"x-cells-route-error\": \"stale-owner\" } : {},\n );\n if (req.headers[\"x-cells-tunnel-version\"] !== \"5\") return refuse(426, \"Upgrade Required\");\n const kind = req.headers[\"x-cells-tunnel-kind\"];\n if (kind !== \"do\" && kind !== \"rpc\") return refuse(400, \"Bad Request\");\n socket.write(\n [\n \"HTTP/1.1 101 Switching Protocols\",\n \"upgrade: celld-tunnel\",\n \"connection: upgrade\",\n \"x-cells-tunnel-version: 5\",\n `${PEER_HEADERS.version}: ${PROTOCOL}`,\n ].join(\"\\r\\n\") + \"\\r\\n\\r\\n\",\n );\n if (head?.length) socket.unshift(head);\n inner[kind].emit(\"connection\", socket);\n });\n await new Promise<void>((r) => server.listen(opts.port ?? 0, host, () => r()));\n const port = (server.address() as { port: number }).port;\n return {\n addr: `${host}:${port}`,\n close: () =>\n new Promise<void>((r) => {\n server.closeAllConnections?.();\n for (const s of Object.values(inner)) s.closeAllConnections?.();\n server.close(() => r());\n }),\n };\n}\n\n/**\n * The calling half (celld's node A): open a signed tunnel to the owner node and send one call\n * through it — `fetch` on a `do` tunnel, JS RPC on an `rpc` tunnel (V8-serialized arguments;\n * the reply decoded as celld encodes it, a callee exception rethrown with its properties).\n */\n/** A signed `celld-tunnel` upgrade to the owner node: the raw connection after its 101. */\nasync function openTunnel(\n key: Uint8Array,\n source: string,\n owner: { node: string; addr: string },\n kind: \"do\" | \"rpc\",\n): Promise<import(\"node:net\").Socket> {\n const { request } = await import(\"node:http\");\n const [host, port] = [\n owner.addr.slice(0, owner.addr.lastIndexOf(\":\")),\n Number(owner.addr.slice(owner.addr.lastIndexOf(\":\") + 1)),\n ];\n const socket = await new Promise<import(\"node:net\").Socket>((resolve, reject) => {\n const req = request({\n host,\n port,\n path: \"/peer/tunnel\",\n method: \"GET\",\n headers: {\n upgrade: \"celld-tunnel\",\n connection: \"upgrade\",\n \"x-cells-tunnel-version\": \"5\",\n \"x-cells-tunnel-kind\": kind,\n ...signPeerRequest(key, source, owner.node, \"GET\", \"/peer/tunnel\"),\n },\n });\n req.on(\"upgrade\", (_res, sock) => resolve(sock as import(\"node:net\").Socket));\n req.on(\"response\", (res) =>\n reject(\n Object.assign(new Error(`peer tunnel refused: ${res.statusCode}`), {\n stale: res.headers[\"x-cells-route-error\"] === \"stale-owner\",\n }),\n ),\n );\n req.on(\"error\", reject);\n req.end();\n });\n return socket;\n}\n\nasync function tunnelCall(\n key: Uint8Array,\n source: string,\n owner: { node: string; addr: string },\n kind: \"do\" | \"rpc\",\n inner: { method: string; path: string; headers: Record<string, string>; body?: Uint8Array },\n): Promise<{ status: number; headers: Record<string, string>; body: Uint8Array }> {\n const { request } = await import(\"node:http\");\n const socket = await openTunnel(key, source, owner, kind);\n try {\n return await new Promise((resolve, reject) => {\n const req = request(\n // no agent: the request runs on the upgraded socket itself\n {\n createConnection: () => socket,\n method: inner.method,\n path: inner.path,\n headers: inner.headers,\n },\n async (res) => {\n const chunks: Buffer[] = [];\n for await (const c of res) chunks.push(c as Buffer);\n const headers: Record<string, string> = {};\n for (const [k, v] of Object.entries(res.headers))\n if (typeof v === \"string\") headers[k] = v;\n resolve({\n status: res.statusCode ?? 500,\n headers,\n body: new Uint8Array(Buffer.concat(chunks)),\n });\n },\n );\n req.on(\"error\", reject);\n req.end(inner.body);\n });\n } finally {\n socket.destroy();\n }\n}\n\n/**\n * Routing to cells celld nodes own, for CellRuntimeOptions.peers: `ownerOf` reads the cell's\n * own.json, `endpoint` reaches the owner's address from its node record through the tunnel.\n */\nexport function celldPeers(opts: { store: ObjectStore; node: string }) {\n let key: Promise<Uint8Array> | undefined;\n const json = async <T>(k: string) => {\n const o = await opts.store.get(k);\n return o ? (JSON.parse(new TextDecoder().decode(o.body)) as T) : undefined;\n };\n const staleError = (cellKey: string) =>\n Object.assign(new Error(`${cellKey} is owned by another node`), {\n name: \"CellOwnedElsewhereError\",\n });\n return {\n async ownerOf(cellKey: string) {\n const own = await json<{ node: string }>(`cells/${cellKey.replace(\"/\", \":\")}/own.json`);\n return own?.node && own.node !== opts.node ? own.node : undefined;\n },\n link(): never {\n throw new Error(\"celld owners are reached through endpoint()\");\n },\n async endpoint(owner: string, cellKey: string, name: string | undefined) {\n const lease = await json<{ addr: string; expires_ms: number }>(`nodes/${owner}.json`);\n if (!lease?.addr || lease.expires_ms <= Date.now()) return undefined;\n key ??= loadPeerKey(opts.store);\n const k = await key;\n const target = { node: owner, addr: lease.addr };\n const scope = cellKey.replace(\"/\", \":\");\n const control = (h: Record<string, string>) => ({\n ...h,\n \"x-cells-scope\": scope,\n ...(name !== undefined ? { \"x-cells-do-name\": name } : {}),\n });\n // A WebSocket to a cell celld owns: the client handshake crosses a `do` tunnel and `ws`\n // speaks the frames on it; the caller gets a 101 with a WebSocketPair end bridged to it.\n const tunnelWebSocket = async (req: Request, url: URL) => {\n const socket = await openTunnel(k, opts.node, target, \"do\");\n const { WebSocket: WsClient } = await import(\"ws\");\n const protocols = req.headers\n .get(\"sec-websocket-protocol\")\n ?.split(\",\")\n .map((p) => p.trim())\n .filter(Boolean);\n const remote = new WsClient(`ws://${url.host}${url.pathname}${url.search}`, protocols, {\n createConnection: () => socket,\n headers: control({}),\n });\n await new Promise<void>((resolve, reject) => {\n remote.once(\"open\", () => resolve());\n remote.once(\n \"unexpected-response\",\n (_q: unknown, res: { statusCode?: number; headers: Record<string, unknown> }) =>\n reject(\n res.headers[\"x-cells-route-error\"] === \"stale-owner\"\n ? staleError(cellKey)\n : new Error(`WebSocket through the tunnel refused: ${res.statusCode}`),\n ),\n );\n remote.once(\"error\", reject);\n });\n const pair = new WebSocketPair();\n const [client, server] = [pair[0], pair[1]];\n server.accept();\n server.addEventListener(\"message\", (e) => remote.send((e as MessageEvent).data));\n remote.on(\"message\", (d: Buffer, isBinary: boolean) =>\n server.send(isBinary ? new Uint8Array(d) : d.toString()),\n );\n const code = (c: number) => (c >= 1000 && c !== 1005 && c !== 1006 ? c : 1000);\n server.addEventListener(\"close\", (e) =>\n remote.close(code((e as CloseEvent).code), (e as CloseEvent).reason),\n );\n remote.on(\"close\", (c: number, reason: Buffer) => server.close(code(c), reason.toString()));\n return new CellsResponse(null, {\n status: 101,\n webSocket: client,\n headers: remote.protocol ? { \"Sec-WebSocket-Protocol\": remote.protocol } : {},\n }) as Response;\n };\n return {\n async fetch(req: Request) {\n const url = new URL(req.url);\n if (req.headers.get(\"upgrade\")?.toLowerCase() === \"websocket\")\n return tunnelWebSocket(req, url);\n const headers: Record<string, string> = {};\n req.headers.forEach((v, h) => {\n if (!h.startsWith(\"x-cells-\")) headers[h] = v;\n });\n headers.host ??= url.host;\n const body =\n req.method === \"GET\" || req.method === \"HEAD\"\n ? undefined\n : new Uint8Array(await req.arrayBuffer());\n const r = await tunnelCall(k, opts.node, target, \"do\", {\n method: req.method,\n path: url.pathname + url.search,\n headers: control(headers),\n body,\n });\n if (r.status === 409 && r.headers[\"x-cells-route-error\"] === \"stale-owner\")\n throw staleError(cellKey);\n const out = new Headers();\n for (const [h, v] of Object.entries(r.headers))\n if (!h.startsWith(\"x-cells-\")) out.set(h, v);\n return new Response(r.status === 204 || r.status === 304 ? null : (r.body as BodyInit), {\n status: r.status,\n headers: out,\n });\n },\n async call(method: string, args: unknown[]) {\n const body = serialize(toAnotherNode(args));\n const r = await tunnelCall(k, opts.node, target, \"rpc\", {\n method: \"POST\",\n path: \"/\",\n headers: control({\n \"x-cells-rpc-method\": method,\n \"content-type\": \"application/octet-stream\",\n \"content-length\": String(body.length),\n }),\n body,\n });\n if (r.status === 409 && r.headers[\"x-cells-route-error\"] === \"stale-owner\")\n throw staleError(cellKey);\n if (r.status !== 200)\n throw new Error(\n `remote RPC failed with ${r.status}: ${new TextDecoder().decode(r.body)}`,\n );\n if (r.body[0] === 0xff) return deserialize(r.body);\n if (r.body[0] === 0) {\n const [error, props] = deserialize(r.body.subarray(1)) as [\n unknown,\n Record<string, unknown>,\n ];\n if (error instanceof Error) Object.assign(error, props, { remote: true });\n throw error;\n }\n throw new Error(\"RPC stubs cannot cross from celld to cellb\");\n },\n };\n },\n };\n}\n"]}
|
package/dist/project/wrangler.js
CHANGED
|
@@ -166,7 +166,7 @@ export function createProjectRuntime(config, module, host) {
|
|
|
166
166
|
const close = runtime.close.bind(runtime);
|
|
167
167
|
runtime.close = async () => {
|
|
168
168
|
await close();
|
|
169
|
-
isolated.close?.();
|
|
169
|
+
await isolated.close?.();
|
|
170
170
|
};
|
|
171
171
|
}
|
|
172
172
|
for (const l of config.worker_loaders ?? []) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrangler.js","sourceRoot":"","sources":["../../src/project/wrangler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FilesApi } from \"@statewalker/webrun-files\";\nimport { type AssetFiles, type AssetsConfig, createAssets } from \"../bindings/assets.js\";\nimport { celldKv } from \"../bindings/celld-kv.js\";\nimport { celldQueues, type QueueConsumerConfig } from \"../bindings/celld-queues.js\";\nimport { celldWorkflows } from \"../bindings/celld-workflows.js\";\nimport { startCronTriggers } from \"../bindings/cron.js\";\nimport { r2Bucket, r2BucketOn } from \"../bindings/r2.js\";\nimport { celldR2Backend } from \"../bindings/r2-celld.js\";\nimport { type ModuleLoader, workerLoader } from \"../bindings/worker-loader.js\";\nimport { type WorkersAiOptions, workersAi } from \"../bindings/workers-ai.js\";\nimport { entrypointStub } from \"../core/handles.js\";\nimport type { DurableObjectNamespace } from \"../core/namespace.js\";\nimport {\n type CellRuntime,\n type CellRuntimeOptions,\n createCellRuntime,\n type WorkerModule,\n} from \"../core/runtime.js\";\nimport { splitSqlStatements } from \"../core/sql-split.js\";\nimport { filesApiBlobService } from \"../miniflare-compat/blob-service.js\";\nimport { simulatorFetcher } from \"../miniflare-compat/simulator-fetcher.js\";\nimport { D1DatabaseObject, makeD1Binding } from \"../miniflare-compat/vendored.js\";\nimport { systemClock } from \"../ports.js\";\n\n/** The subset of wrangler.json(c) that celld deploys (and cellb reads). */\nexport interface WranglerConfig {\n name?: string;\n main?: string;\n compatibility_date?: string;\n compatibility_flags?: string[];\n vars?: Record<string, unknown>;\n durable_objects?: { bindings?: { name: string; class_name: string; script_name?: string }[] };\n migrations?: {\n tag: string;\n new_sqlite_classes?: string[];\n new_classes?: string[];\n renamed_classes?: { from: string; to: string }[];\n deleted_classes?: string[];\n }[];\n kv_namespaces?: { binding: string; id?: string }[];\n d1_databases?: { binding: string; database_name?: string; database_id?: string }[];\n r2_buckets?: { binding: string; bucket_name: string }[];\n queues?: {\n producers?: { binding: string; queue: string; delivery_delay?: number }[];\n consumers?: QueueConsumerConfig[];\n };\n workflows?: WorkflowConfig[];\n triggers?: { crons?: string[] };\n assets?: AssetsConfig;\n services?: { binding: string; service: string; entrypoint?: string; props?: unknown }[];\n worker_loaders?: { binding: string }[];\n /** Workers AI: served by the host's OpenAI-compatible endpoint (`ProjectHost.ai`), if any. */\n ai?: { binding: string };\n /** Containers (celld runs them with Docker or Podman): not supported, reported. */\n containers?: { class_name: string; image?: string }[];\n}\n\n/** wrangler `workflows` entries. */\nexport interface WorkflowConfig {\n binding: string;\n name: string;\n class_name: string;\n}\n\n/** Runs the Worker's `queue(batch, env, ctx)` handler for a batch celld's queue cell leased. */\ninterface QueueDispatcher {\n deliver(batch: unknown): Promise<void>;\n}\n\nexport interface ProjectHost\n extends Pick<CellRuntimeOptions, \"openSql\" | \"storage\" | \"clock\" | \"peers\" | \"route\"> {\n /** Files of `assets.directory` (path \"/a/b.html\" → bytes), loaded by the host. */\n assetFiles?: AssetFiles;\n /** Runs each loaded Worker in its own realm (celld isolates); classes still use `loadModules`. */\n isolatedModules?: ModuleLoader;\n /** Compiles code given to a Worker Loader binding (esbuild on Node, webrun-modules in browsers). */\n loadModules?: ModuleLoader;\n /** Blob store of the KV simulator (large values): OPFS in a browser, a directory or S3 on a server. */\n files: FilesApi;\n /** The OpenAI-compatible endpoint behind the `ai` binding; without it the binding is unsupported. */\n ai?: WorkersAiOptions;\n}\n\nexport interface ProjectRuntime {\n runtime: CellRuntime;\n /** Configuration entries cellb does not support yet (reported, not silently ignored). */\n unsupported: string[];\n}\n\n/**\n * What `env` of `cloudflare:workers` holds while the Worker's module is evaluated, before the\n * runtime exists: the vars, and the bindings that need no runtime (`ai`; Flue's entry reads\n * `env.AI` at load).\n */\nexport function loadTimeEnv(\n config: WranglerConfig,\n ai?: WorkersAiOptions,\n): Record<string, unknown> {\n const env: Record<string, unknown> = { ...config.vars };\n if (config.ai && ai) env[config.ai.binding] = workersAi(ai);\n return env;\n}\n\n// Internal bindings carrying the runtime-supplied objects behind KV and D1.\nconst KV_OBJECTS = \"__CELLS_KV_OBJECTS\";\nconst D1_OBJECTS = \"__CELLS_D1_OBJECTS\";\nconst QUEUE_OBJECTS = \"__CELLS_QUEUE_OBJECTS\";\nconst WORKFLOW_OBJECTS = \"__CELLS_WORKFLOW_OBJECTS\";\n\n/**\n * Builds a runtime from a wrangler config and the Worker's module namespace — the same\n * inputs celld deploys. Hosts differ only in `host` (storage) and in how they load `main`.\n */\nexport function createProjectRuntime(\n config: WranglerConfig,\n module: WorkerModule,\n host: ProjectHost,\n): ProjectRuntime {\n config = withResourceIds(config);\n const unsupported: string[] = [];\n const durableObjects: NonNullable<CellRuntimeOptions[\"durableObjects\"]> = {};\n const sqliteClasses = new Set<string>();\n for (const m of config.migrations ?? []) {\n for (const c of m.new_sqlite_classes ?? []) sqliteClasses.add(c);\n for (const c of m.new_classes ?? []) sqliteClasses.add(c); // KV-backed on Cloudflare; SQLite here (superset)\n for (const r of m.renamed_classes ?? [])\n unsupported.push(`migrations.renamed_classes (${r.from} → ${r.to})`);\n }\n for (const c of config.containers ?? [])\n unsupported.push(`containers[${c.class_name}] (cellb runs no containers)`);\n for (const b of config.durable_objects?.bindings ?? []) {\n if (b.script_name) unsupported.push(`durable_objects.bindings[${b.name}].script_name`);\n durableObjects[b.name] = { className: b.class_name };\n }\n const worker: WorkerModule = { ...module };\n let kv: ReturnType<typeof celldKv> | undefined;\n if (config.kv_namespaces?.length) {\n kv = celldKv(host.files);\n worker.__KvNamespace = kv.KvNamespaceCell as never;\n durableObjects[KV_OBJECTS] = { className: \"__KvNamespace\" };\n }\n if (config.d1_databases?.length) {\n worker.__D1Database = D1DatabaseObject;\n durableObjects[D1_OBJECTS] = { className: \"__D1Database\" };\n }\n // Queues: every queue is a cell of a runtime-supplied class (as on celld).\n const consumers = new Map((config.queues?.consumers ?? []).map((c) => [c.queue, c]));\n // celld's own queue code (vendor/celld/queues.js): its queue cell, producer and consumer\n // batch, so a queue's cell (and pending messages) is celld's format.\n let queueDispatcher: QueueDispatcher | undefined;\n let queues: ReturnType<typeof celldQueues> | undefined;\n if (config.queues?.producers?.length || consumers.size) {\n queues = celldQueues({\n namespace: () => runtime.env[QUEUE_OBJECTS] as never,\n consumers: [...consumers.values()],\n compatibilityDate: config.compatibility_date,\n runConsumer: (batch) => queueDispatcher!.deliver(batch as never),\n });\n worker.__Queue = queues.QueueCell as never;\n durableObjects[QUEUE_OBJECTS] = { className: \"__Queue\" };\n }\n // Workflows: every instance is a cell of a runtime-supplied class (as on celld).\n // celld's own workflow code (vendor/celld/workflows.js): its instance cell and binding.\n let workflows: ReturnType<typeof celldWorkflows> | undefined;\n if (config.workflows?.length) {\n workflows = celldWorkflows({\n script: config.name ?? \"worker\",\n workflows: Object.fromEntries(config.workflows.map((w) => [w.name, w.class_name])),\n exports: () => module as Record<string, unknown>,\n env: () => runtime.env,\n namespace: () => runtime.env[WORKFLOW_OBJECTS],\n });\n worker[workflows.className] = workflows.WorkflowCell as never;\n durableObjects[WORKFLOW_OBJECTS] = { className: workflows.className };\n }\n if (config.ai && !host.ai)\n unsupported.push(\n `ai[${config.ai.binding}] (Workers AI: give the host an OpenAI-compatible \\`ai\\`)`,\n );\n for (const s of config.services ?? [])\n if (s.service !== config.name)\n unsupported.push(\n `services[${s.binding}] → \"${s.service}\" (only this script's own entrypoints)`,\n );\n const sqlExtensions: string[] = [];\n let deleteAllPreservesAlarm = false;\n for (const f of config.compatibility_flags ?? []) {\n if (f === \"delete_all_preserves_alarm\") deleteAllPreservesAlarm = true;\n else if (f === \"delete_all_deletes_alarm\")\n continue; // the default\n else if (f === \"sqlite_vec\")\n sqlExtensions.push(\"sqlite_vec\"); // vec0 virtual tables, as on celld\n else if (f === \"nodejs_compat\" || f === \"nodejs_compat_v2\")\n continue; // the host's bundler maps node:*\n else if (f === \"websocket_standard_binary_type\")\n continue; // the host picks the project's WebSocketPair\n else unsupported.push(`compatibility_flags: ${f}`);\n }\n\n const runtime = createCellRuntime({\n worker,\n durableObjects,\n vars: { ...config.vars, MINIFLARE_BLOBS: filesApiBlobService(host.files) },\n openSql: host.openSql,\n sqlExtensions,\n deleteAllPreservesAlarm,\n scriptName: config.name ?? \"worker\",\n // celld's fleet-wide namespaces for the resources several scripts can share.\n namespaceKeys: {\n __KvNamespace: \"cells:v1:kv:__KvNamespace\",\n __D1Database: \"cells:v1:d1:__D1Database\",\n __Queue: \"cells:v1:queue:__Queue\",\n },\n storage: host.storage,\n clock: host.clock,\n peers: host.peers,\n route: host.route,\n });\n const env = runtime.env as Record<string, unknown>;\n if (config.ai && host.ai) env[config.ai.binding] = workersAi(host.ai);\n // KV: celld's own client against celld's own namespace cell (cell name \"<id>/<shard>\").\n for (const ns of config.kv_namespaces ?? [])\n env[ns.binding] = new kv!.KvNamespace(() => env[KV_OBJECTS], `${ns.id}/0`);\n for (const p of config.queues?.producers ?? [])\n env[p.binding] = queues!.producer(p.queue, p.delivery_delay ?? 0);\n if (consumers.size) {\n const handler = (module.default as { queue?: (b: unknown, e: unknown, c: unknown) => unknown })\n .queue;\n if (typeof handler !== \"function\")\n unsupported.push(\"queues.consumers without a queue() handler\");\n queueDispatcher = {\n deliver: async (batch) => {\n const pending: Promise<unknown>[] = [];\n await handler?.call(module.default, batch, env, {\n waitUntil: (p: Promise<unknown>) => pending.push(p),\n passThroughOnException() {},\n });\n await Promise.allSettled(pending);\n },\n };\n }\n // The isolates of loaded Workers end with the runtime (on Node, a worker thread's port would\n // keep the process alive; in a browser, a Dedicated Worker would outlive the runtime).\n const isolated = host.isolatedModules as (ModuleLoader & { close?(): void }) | undefined;\n if (config.worker_loaders?.length && isolated?.close) {\n const close = runtime.close.bind(runtime);\n runtime.close = async () => {\n await close();\n isolated.close?.();\n };\n }\n for (const l of config.worker_loaders ?? []) {\n if (!host.loadModules)\n unsupported.push(`worker_loaders[${l.binding}] (the host provides no module loader)`);\n else\n env[l.binding] = host.isolatedModules\n ? workerLoader(host.isolatedModules) // facets of loaded code run in the isolate as well\n : workerLoader(host.loadModules);\n }\n // Cron Triggers (validated at load time like `celld deploy` does).\n const crons = config.triggers?.crons ?? [];\n if (crons.length) {\n const scheduled = (\n module.default as { scheduled?: (c: unknown, e: unknown, x: unknown) => unknown }\n ).scheduled;\n if (typeof scheduled !== \"function\")\n unsupported.push(\"triggers.crons without a scheduled() handler\");\n else {\n const db = host.openSql(\"__cellb/cron\");\n const stop = startCronTriggers(\n crons,\n (c, x) => runtime.runEvent(() => scheduled.call(module.default, c, env, x)),\n host.clock ?? systemClock,\n cronState(db),\n );\n const close = runtime.close.bind(runtime);\n runtime.close = async () => {\n stop();\n db.close();\n await close();\n };\n }\n }\n // Static assets: routed before the Worker; `assets.binding` exposes env.ASSETS.\n if (config.assets) {\n const hasWorker = typeof (module.default as { fetch?: unknown })?.fetch === \"function\";\n if (host.assetFiles?.has(\"/.assetsignore\"))\n throw new Error(\n `${config.assets.directory ?? \"assets\"}/.assetsignore is not supported by celld; remove it`,\n );\n const assets = createAssets(host.assetFiles ?? new Map(), config.assets, hasWorker);\n if (config.assets.binding) env[config.assets.binding] = assets.binding;\n const workerFetch = runtime.fetch.bind(runtime);\n runtime.fetch = async (req) =>\n assets.route(req) ??\n (hasWorker ? workerFetch(req) : new Response(\"Not found\", { status: 404 }));\n }\n for (const w of config.workflows ?? []) env[w.binding] = workflows!.binding(w.name);\n // Service bindings to this script's own entrypoints (a celld fleet runs one application):\n // default export or a named WorkerEntrypoint, with fetch() and JS RPC.\n for (const s of config.services ?? []) {\n if (s.service !== config.name) continue;\n const target = s.entrypoint ? module[s.entrypoint] : module.default;\n if (!target)\n unsupported.push(`services[${s.binding}].entrypoint \"${s.entrypoint}\" is not exported`);\n else env[s.binding] = entrypointStub(target, env, s.props);\n }\n // R2 objects live directly in the host's store, as celld keeps them in the fleet bucket.\n // With a celld fleet bucket, R2 objects live in it as celld keeps them; else in the FilesApi.\n for (const r2 of config.r2_buckets ?? [])\n env[r2.binding] = host.storage?.objects\n ? r2BucketOn(celldR2Backend(host.storage.objects, r2.bucket_name), r2.binding)\n : r2Bucket(host.files, `/r2/${r2.bucket_name}`, r2.binding);\n for (const d1 of config.d1_databases ?? [])\n env[d1.binding] = celldExec(\n makeD1Binding({\n fetcher: simulatorFetcher(\n env[D1_OBJECTS] as DurableObjectNamespace,\n d1.database_id as string, // set by withResourceIds\n ) as never,\n }) as D1Like,\n );\n for (const name of [...sqliteClasses])\n if (!Object.values(durableObjects).some((d) => d.className === name)) {\n // A migrated class without a binding is fine (reachable through other code paths only).\n }\n return { runtime, unsupported };\n}\n\ninterface D1Like {\n exec(sql: string): Promise<{ count: number; duration: number }>;\n prepare(sql: string): { run(): Promise<unknown> };\n}\n\n/**\n * `D1Database#exec` as celld implements it: statements are split by SQL syntax.\n * workerd's d1-api.ts splits on NEWLINES (Cloudflare's documented behaviour), so a\n * multi-line `CREATE TABLE` fails there but works on celld — and celld is the\n * reference here (verified on celld 0.6.2 by the d1 example in conformance/).\n */\nfunction celldExec<T extends D1Like>(db: T): T {\n const exec = async (sql: string) => {\n const t0 = Date.now();\n const statements = splitSqlStatements(sql).filter((s) => s.trim());\n for (const statement of statements) {\n if (/^\\s*BEGIN\\b/i.test(statement))\n throw new Error(\n \"D1_EXEC_ERROR: the SQL ends in an incomplete statement, which did not run: terminate the last statement with a semicolon\",\n );\n guard(statement);\n await db.prepare(statement).run();\n }\n return { count: statements.length, duration: Date.now() - t0 };\n };\n return celldD1(db, exec) as T;\n}\n\n/**\n * celld's D1 rules on top of workerd's client (celld docs/services/d1.md, checked by the\n * d1-details project): ATTACH/DETACH and TEMP objects are \"not authorized\", VACUUM is\n * \"authorization denied\"; there is one primary and no replica, so sessions return the\n * bookmark \"celld:primary\" and every result reports served_by_primary/served_by_region\n * \"local\"; a read-only statement reports last_row_id and changes as 0.\n */\nfunction guard(sql: string): void {\n if (/^\\s*(ATTACH|DETACH)\\b/i.test(sql) || /^\\s*CREATE\\s+(TEMP|TEMPORARY)\\b/i.test(sql))\n throw new Error(\"D1_ERROR: not authorized\");\n if (/^\\s*VACUUM\\b/i.test(sql)) throw new Error(\"D1_ERROR: authorization denied\");\n}\n\nfunction celldMeta(r: any): any {\n if (!r?.meta) return r;\n r.meta.served_by_primary = true;\n r.meta.served_by_region = \"local\";\n if (r.meta.changed_db === false) {\n r.meta.last_row_id = 0;\n r.meta.changes = 0;\n }\n return r;\n}\n\nfunction celldStatement(stmt: any): any {\n return new Proxy(stmt, {\n get(t, p, r) {\n const v = Reflect.get(t, p, r);\n if (p === \"bind\") return (...a: unknown[]) => celldStatement(v.apply(t, a));\n if (p === \"run\" || p === \"all\")\n return async (...a: unknown[]) => celldMeta(await v.apply(t, a));\n return typeof v === \"function\" ? v.bind(t) : v;\n },\n });\n}\n\nfunction celldD1(db: any, exec?: (sql: string) => Promise<unknown>): any {\n return new Proxy(db, {\n get(t, p, r) {\n if (p === \"exec\" && exec) return exec;\n const v = Reflect.get(t, p, r);\n if (p === \"prepare\")\n return (sql: string) => {\n guard(sql);\n return celldStatement(v.call(t, sql));\n };\n if (p === \"batch\")\n return async (stmts: unknown[], ...a: unknown[]) =>\n ((await v.call(t, stmts, ...a)) as unknown[]).map(celldMeta);\n if (p === \"withSession\")\n return () => {\n const session = celldD1(t);\n return new Proxy(session, {\n get: (s, q, rr) =>\n q === \"getBookmark\" ? () => \"celld:primary\" : Reflect.get(s, q, rr),\n });\n };\n if (p === \"getBookmark\") return () => \"celld:primary\";\n return typeof v === \"function\" ? v.bind(t) : v;\n },\n });\n}\n\n/** Last fired occurrence per cron expression, in a small SQLite database of the host. */\nfunction cronState(db: ReturnType<ProjectHost[\"openSql\"]>) {\n db.exec(\n \"CREATE TABLE IF NOT EXISTS cron_state (expression TEXT PRIMARY KEY, scheduled_time INTEGER)\",\n [],\n );\n return {\n get: (e: string) => {\n const row = db.exec(\"SELECT scheduled_time FROM cron_state WHERE expression = ?\", [e])\n .rows[0];\n return row ? Number(row[0]) : undefined;\n },\n set: (e: string, t: number) =>\n void db.exec(\"INSERT OR REPLACE INTO cron_state (expression, scheduled_time) VALUES (?, ?)\", [\n e,\n t,\n ]),\n };\n}\n\n/**\n * KV namespaces and D1 databases may omit their ids: wrangler provisions them on deploy, and\n * framework builds (Astro's Cloudflare adapter, for one) emit such entries. A KV namespace\n * then takes its binding name as id; a D1 database its `database_name`, else its binding name.\n * Entries with ids are kept as they are, so storage shared with celld keeps its names.\n */\nexport function withResourceIds(config: WranglerConfig): WranglerConfig {\n const kv = config.kv_namespaces;\n const d1 = config.d1_databases;\n if (!kv?.some((n) => !n.id) && !d1?.some((d) => !d.database_id)) return config;\n return {\n ...config,\n kv_namespaces: kv?.map((n) => (n.id ? n : { ...n, id: n.binding })),\n d1_databases: d1?.map((d) =>\n d.database_id ? d : { ...d, database_id: d.database_name ?? d.binding },\n ),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"wrangler.js","sourceRoot":"","sources":["../../src/project/wrangler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FilesApi } from \"@statewalker/webrun-files\";\nimport { type AssetFiles, type AssetsConfig, createAssets } from \"../bindings/assets.js\";\nimport { celldKv } from \"../bindings/celld-kv.js\";\nimport { celldQueues, type QueueConsumerConfig } from \"../bindings/celld-queues.js\";\nimport { celldWorkflows } from \"../bindings/celld-workflows.js\";\nimport { startCronTriggers } from \"../bindings/cron.js\";\nimport { r2Bucket, r2BucketOn } from \"../bindings/r2.js\";\nimport { celldR2Backend } from \"../bindings/r2-celld.js\";\nimport { type ModuleLoader, workerLoader } from \"../bindings/worker-loader.js\";\nimport { type WorkersAiOptions, workersAi } from \"../bindings/workers-ai.js\";\nimport { entrypointStub } from \"../core/handles.js\";\nimport type { DurableObjectNamespace } from \"../core/namespace.js\";\nimport {\n type CellRuntime,\n type CellRuntimeOptions,\n createCellRuntime,\n type WorkerModule,\n} from \"../core/runtime.js\";\nimport { splitSqlStatements } from \"../core/sql-split.js\";\nimport { filesApiBlobService } from \"../miniflare-compat/blob-service.js\";\nimport { simulatorFetcher } from \"../miniflare-compat/simulator-fetcher.js\";\nimport { D1DatabaseObject, makeD1Binding } from \"../miniflare-compat/vendored.js\";\nimport { systemClock } from \"../ports.js\";\n\n/** The subset of wrangler.json(c) that celld deploys (and cellb reads). */\nexport interface WranglerConfig {\n name?: string;\n main?: string;\n compatibility_date?: string;\n compatibility_flags?: string[];\n vars?: Record<string, unknown>;\n durable_objects?: { bindings?: { name: string; class_name: string; script_name?: string }[] };\n migrations?: {\n tag: string;\n new_sqlite_classes?: string[];\n new_classes?: string[];\n renamed_classes?: { from: string; to: string }[];\n deleted_classes?: string[];\n }[];\n kv_namespaces?: { binding: string; id?: string }[];\n d1_databases?: { binding: string; database_name?: string; database_id?: string }[];\n r2_buckets?: { binding: string; bucket_name: string }[];\n queues?: {\n producers?: { binding: string; queue: string; delivery_delay?: number }[];\n consumers?: QueueConsumerConfig[];\n };\n workflows?: WorkflowConfig[];\n triggers?: { crons?: string[] };\n assets?: AssetsConfig;\n services?: { binding: string; service: string; entrypoint?: string; props?: unknown }[];\n worker_loaders?: { binding: string }[];\n /** Workers AI: served by the host's OpenAI-compatible endpoint (`ProjectHost.ai`), if any. */\n ai?: { binding: string };\n /** Containers (celld runs them with Docker or Podman): not supported, reported. */\n containers?: { class_name: string; image?: string }[];\n}\n\n/** wrangler `workflows` entries. */\nexport interface WorkflowConfig {\n binding: string;\n name: string;\n class_name: string;\n}\n\n/** Runs the Worker's `queue(batch, env, ctx)` handler for a batch celld's queue cell leased. */\ninterface QueueDispatcher {\n deliver(batch: unknown): Promise<void>;\n}\n\nexport interface ProjectHost\n extends Pick<CellRuntimeOptions, \"openSql\" | \"storage\" | \"clock\" | \"peers\" | \"route\"> {\n /** Files of `assets.directory` (path \"/a/b.html\" → bytes), loaded by the host. */\n assetFiles?: AssetFiles;\n /** Runs each loaded Worker in its own realm (celld isolates); classes still use `loadModules`. */\n isolatedModules?: ModuleLoader;\n /** Compiles code given to a Worker Loader binding (esbuild on Node, webrun-modules in browsers). */\n loadModules?: ModuleLoader;\n /** Blob store of the KV simulator (large values): OPFS in a browser, a directory or S3 on a server. */\n files: FilesApi;\n /** The OpenAI-compatible endpoint behind the `ai` binding; without it the binding is unsupported. */\n ai?: WorkersAiOptions;\n}\n\nexport interface ProjectRuntime {\n runtime: CellRuntime;\n /** Configuration entries cellb does not support yet (reported, not silently ignored). */\n unsupported: string[];\n}\n\n/**\n * What `env` of `cloudflare:workers` holds while the Worker's module is evaluated, before the\n * runtime exists: the vars, and the bindings that need no runtime (`ai`; Flue's entry reads\n * `env.AI` at load).\n */\nexport function loadTimeEnv(\n config: WranglerConfig,\n ai?: WorkersAiOptions,\n): Record<string, unknown> {\n const env: Record<string, unknown> = { ...config.vars };\n if (config.ai && ai) env[config.ai.binding] = workersAi(ai);\n return env;\n}\n\n// Internal bindings carrying the runtime-supplied objects behind KV and D1.\nconst KV_OBJECTS = \"__CELLS_KV_OBJECTS\";\nconst D1_OBJECTS = \"__CELLS_D1_OBJECTS\";\nconst QUEUE_OBJECTS = \"__CELLS_QUEUE_OBJECTS\";\nconst WORKFLOW_OBJECTS = \"__CELLS_WORKFLOW_OBJECTS\";\n\n/**\n * Builds a runtime from a wrangler config and the Worker's module namespace — the same\n * inputs celld deploys. Hosts differ only in `host` (storage) and in how they load `main`.\n */\nexport function createProjectRuntime(\n config: WranglerConfig,\n module: WorkerModule,\n host: ProjectHost,\n): ProjectRuntime {\n config = withResourceIds(config);\n const unsupported: string[] = [];\n const durableObjects: NonNullable<CellRuntimeOptions[\"durableObjects\"]> = {};\n const sqliteClasses = new Set<string>();\n for (const m of config.migrations ?? []) {\n for (const c of m.new_sqlite_classes ?? []) sqliteClasses.add(c);\n for (const c of m.new_classes ?? []) sqliteClasses.add(c); // KV-backed on Cloudflare; SQLite here (superset)\n for (const r of m.renamed_classes ?? [])\n unsupported.push(`migrations.renamed_classes (${r.from} → ${r.to})`);\n }\n for (const c of config.containers ?? [])\n unsupported.push(`containers[${c.class_name}] (cellb runs no containers)`);\n for (const b of config.durable_objects?.bindings ?? []) {\n if (b.script_name) unsupported.push(`durable_objects.bindings[${b.name}].script_name`);\n durableObjects[b.name] = { className: b.class_name };\n }\n const worker: WorkerModule = { ...module };\n let kv: ReturnType<typeof celldKv> | undefined;\n if (config.kv_namespaces?.length) {\n kv = celldKv(host.files);\n worker.__KvNamespace = kv.KvNamespaceCell as never;\n durableObjects[KV_OBJECTS] = { className: \"__KvNamespace\" };\n }\n if (config.d1_databases?.length) {\n worker.__D1Database = D1DatabaseObject;\n durableObjects[D1_OBJECTS] = { className: \"__D1Database\" };\n }\n // Queues: every queue is a cell of a runtime-supplied class (as on celld).\n const consumers = new Map((config.queues?.consumers ?? []).map((c) => [c.queue, c]));\n // celld's own queue code (vendor/celld/queues.js): its queue cell, producer and consumer\n // batch, so a queue's cell (and pending messages) is celld's format.\n let queueDispatcher: QueueDispatcher | undefined;\n let queues: ReturnType<typeof celldQueues> | undefined;\n if (config.queues?.producers?.length || consumers.size) {\n queues = celldQueues({\n namespace: () => runtime.env[QUEUE_OBJECTS] as never,\n consumers: [...consumers.values()],\n compatibilityDate: config.compatibility_date,\n runConsumer: (batch) => queueDispatcher!.deliver(batch as never),\n });\n worker.__Queue = queues.QueueCell as never;\n durableObjects[QUEUE_OBJECTS] = { className: \"__Queue\" };\n }\n // Workflows: every instance is a cell of a runtime-supplied class (as on celld).\n // celld's own workflow code (vendor/celld/workflows.js): its instance cell and binding.\n let workflows: ReturnType<typeof celldWorkflows> | undefined;\n if (config.workflows?.length) {\n workflows = celldWorkflows({\n script: config.name ?? \"worker\",\n workflows: Object.fromEntries(config.workflows.map((w) => [w.name, w.class_name])),\n exports: () => module as Record<string, unknown>,\n env: () => runtime.env,\n namespace: () => runtime.env[WORKFLOW_OBJECTS],\n });\n worker[workflows.className] = workflows.WorkflowCell as never;\n durableObjects[WORKFLOW_OBJECTS] = { className: workflows.className };\n }\n if (config.ai && !host.ai)\n unsupported.push(\n `ai[${config.ai.binding}] (Workers AI: give the host an OpenAI-compatible \\`ai\\`)`,\n );\n for (const s of config.services ?? [])\n if (s.service !== config.name)\n unsupported.push(\n `services[${s.binding}] → \"${s.service}\" (only this script's own entrypoints)`,\n );\n const sqlExtensions: string[] = [];\n let deleteAllPreservesAlarm = false;\n for (const f of config.compatibility_flags ?? []) {\n if (f === \"delete_all_preserves_alarm\") deleteAllPreservesAlarm = true;\n else if (f === \"delete_all_deletes_alarm\")\n continue; // the default\n else if (f === \"sqlite_vec\")\n sqlExtensions.push(\"sqlite_vec\"); // vec0 virtual tables, as on celld\n else if (f === \"nodejs_compat\" || f === \"nodejs_compat_v2\")\n continue; // the host's bundler maps node:*\n else if (f === \"websocket_standard_binary_type\")\n continue; // the host picks the project's WebSocketPair\n else unsupported.push(`compatibility_flags: ${f}`);\n }\n\n const runtime = createCellRuntime({\n worker,\n durableObjects,\n vars: { ...config.vars, MINIFLARE_BLOBS: filesApiBlobService(host.files) },\n openSql: host.openSql,\n sqlExtensions,\n deleteAllPreservesAlarm,\n scriptName: config.name ?? \"worker\",\n // celld's fleet-wide namespaces for the resources several scripts can share.\n namespaceKeys: {\n __KvNamespace: \"cells:v1:kv:__KvNamespace\",\n __D1Database: \"cells:v1:d1:__D1Database\",\n __Queue: \"cells:v1:queue:__Queue\",\n },\n storage: host.storage,\n clock: host.clock,\n peers: host.peers,\n route: host.route,\n });\n const env = runtime.env as Record<string, unknown>;\n if (config.ai && host.ai) env[config.ai.binding] = workersAi(host.ai);\n // KV: celld's own client against celld's own namespace cell (cell name \"<id>/<shard>\").\n for (const ns of config.kv_namespaces ?? [])\n env[ns.binding] = new kv!.KvNamespace(() => env[KV_OBJECTS], `${ns.id}/0`);\n for (const p of config.queues?.producers ?? [])\n env[p.binding] = queues!.producer(p.queue, p.delivery_delay ?? 0);\n if (consumers.size) {\n const handler = (module.default as { queue?: (b: unknown, e: unknown, c: unknown) => unknown })\n .queue;\n if (typeof handler !== \"function\")\n unsupported.push(\"queues.consumers without a queue() handler\");\n queueDispatcher = {\n deliver: async (batch) => {\n const pending: Promise<unknown>[] = [];\n await handler?.call(module.default, batch, env, {\n waitUntil: (p: Promise<unknown>) => pending.push(p),\n passThroughOnException() {},\n });\n await Promise.allSettled(pending);\n },\n };\n }\n // The isolates of loaded Workers end with the runtime (on Node, a worker thread's port would\n // keep the process alive; in a browser, a Dedicated Worker would outlive the runtime).\n const isolated = host.isolatedModules as\n | (ModuleLoader & { close?(): void | Promise<void> })\n | undefined;\n if (config.worker_loaders?.length && isolated?.close) {\n const close = runtime.close.bind(runtime);\n runtime.close = async () => {\n await close();\n await isolated.close?.();\n };\n }\n for (const l of config.worker_loaders ?? []) {\n if (!host.loadModules)\n unsupported.push(`worker_loaders[${l.binding}] (the host provides no module loader)`);\n else\n env[l.binding] = host.isolatedModules\n ? workerLoader(host.isolatedModules) // facets of loaded code run in the isolate as well\n : workerLoader(host.loadModules);\n }\n // Cron Triggers (validated at load time like `celld deploy` does).\n const crons = config.triggers?.crons ?? [];\n if (crons.length) {\n const scheduled = (\n module.default as { scheduled?: (c: unknown, e: unknown, x: unknown) => unknown }\n ).scheduled;\n if (typeof scheduled !== \"function\")\n unsupported.push(\"triggers.crons without a scheduled() handler\");\n else {\n const db = host.openSql(\"__cellb/cron\");\n const stop = startCronTriggers(\n crons,\n (c, x) => runtime.runEvent(() => scheduled.call(module.default, c, env, x)),\n host.clock ?? systemClock,\n cronState(db),\n );\n const close = runtime.close.bind(runtime);\n runtime.close = async () => {\n stop();\n db.close();\n await close();\n };\n }\n }\n // Static assets: routed before the Worker; `assets.binding` exposes env.ASSETS.\n if (config.assets) {\n const hasWorker = typeof (module.default as { fetch?: unknown })?.fetch === \"function\";\n if (host.assetFiles?.has(\"/.assetsignore\"))\n throw new Error(\n `${config.assets.directory ?? \"assets\"}/.assetsignore is not supported by celld; remove it`,\n );\n const assets = createAssets(host.assetFiles ?? new Map(), config.assets, hasWorker);\n if (config.assets.binding) env[config.assets.binding] = assets.binding;\n const workerFetch = runtime.fetch.bind(runtime);\n runtime.fetch = async (req) =>\n assets.route(req) ??\n (hasWorker ? workerFetch(req) : new Response(\"Not found\", { status: 404 }));\n }\n for (const w of config.workflows ?? []) env[w.binding] = workflows!.binding(w.name);\n // Service bindings to this script's own entrypoints (a celld fleet runs one application):\n // default export or a named WorkerEntrypoint, with fetch() and JS RPC.\n for (const s of config.services ?? []) {\n if (s.service !== config.name) continue;\n const target = s.entrypoint ? module[s.entrypoint] : module.default;\n if (!target)\n unsupported.push(`services[${s.binding}].entrypoint \"${s.entrypoint}\" is not exported`);\n else env[s.binding] = entrypointStub(target, env, s.props);\n }\n // R2 objects live directly in the host's store, as celld keeps them in the fleet bucket.\n // With a celld fleet bucket, R2 objects live in it as celld keeps them; else in the FilesApi.\n for (const r2 of config.r2_buckets ?? [])\n env[r2.binding] = host.storage?.objects\n ? r2BucketOn(celldR2Backend(host.storage.objects, r2.bucket_name), r2.binding)\n : r2Bucket(host.files, `/r2/${r2.bucket_name}`, r2.binding);\n for (const d1 of config.d1_databases ?? [])\n env[d1.binding] = celldExec(\n makeD1Binding({\n fetcher: simulatorFetcher(\n env[D1_OBJECTS] as DurableObjectNamespace,\n d1.database_id as string, // set by withResourceIds\n ) as never,\n }) as D1Like,\n );\n for (const name of [...sqliteClasses])\n if (!Object.values(durableObjects).some((d) => d.className === name)) {\n // A migrated class without a binding is fine (reachable through other code paths only).\n }\n return { runtime, unsupported };\n}\n\ninterface D1Like {\n exec(sql: string): Promise<{ count: number; duration: number }>;\n prepare(sql: string): { run(): Promise<unknown> };\n}\n\n/**\n * `D1Database#exec` as celld implements it: statements are split by SQL syntax.\n * workerd's d1-api.ts splits on NEWLINES (Cloudflare's documented behaviour), so a\n * multi-line `CREATE TABLE` fails there but works on celld — and celld is the\n * reference here (verified on celld 0.6.2 by the d1 example in conformance/).\n */\nfunction celldExec<T extends D1Like>(db: T): T {\n const exec = async (sql: string) => {\n const t0 = Date.now();\n const statements = splitSqlStatements(sql).filter((s) => s.trim());\n for (const statement of statements) {\n if (/^\\s*BEGIN\\b/i.test(statement))\n throw new Error(\n \"D1_EXEC_ERROR: the SQL ends in an incomplete statement, which did not run: terminate the last statement with a semicolon\",\n );\n guard(statement);\n await db.prepare(statement).run();\n }\n return { count: statements.length, duration: Date.now() - t0 };\n };\n return celldD1(db, exec) as T;\n}\n\n/**\n * celld's D1 rules on top of workerd's client (celld docs/services/d1.md, checked by the\n * d1-details project): ATTACH/DETACH and TEMP objects are \"not authorized\", VACUUM is\n * \"authorization denied\"; there is one primary and no replica, so sessions return the\n * bookmark \"celld:primary\" and every result reports served_by_primary/served_by_region\n * \"local\"; a read-only statement reports last_row_id and changes as 0.\n */\nfunction guard(sql: string): void {\n if (/^\\s*(ATTACH|DETACH)\\b/i.test(sql) || /^\\s*CREATE\\s+(TEMP|TEMPORARY)\\b/i.test(sql))\n throw new Error(\"D1_ERROR: not authorized\");\n if (/^\\s*VACUUM\\b/i.test(sql)) throw new Error(\"D1_ERROR: authorization denied\");\n}\n\nfunction celldMeta(r: any): any {\n if (!r?.meta) return r;\n r.meta.served_by_primary = true;\n r.meta.served_by_region = \"local\";\n if (r.meta.changed_db === false) {\n r.meta.last_row_id = 0;\n r.meta.changes = 0;\n }\n return r;\n}\n\nfunction celldStatement(stmt: any): any {\n return new Proxy(stmt, {\n get(t, p, r) {\n const v = Reflect.get(t, p, r);\n if (p === \"bind\") return (...a: unknown[]) => celldStatement(v.apply(t, a));\n if (p === \"run\" || p === \"all\")\n return async (...a: unknown[]) => celldMeta(await v.apply(t, a));\n return typeof v === \"function\" ? v.bind(t) : v;\n },\n });\n}\n\nfunction celldD1(db: any, exec?: (sql: string) => Promise<unknown>): any {\n return new Proxy(db, {\n get(t, p, r) {\n if (p === \"exec\" && exec) return exec;\n const v = Reflect.get(t, p, r);\n if (p === \"prepare\")\n return (sql: string) => {\n guard(sql);\n return celldStatement(v.call(t, sql));\n };\n if (p === \"batch\")\n return async (stmts: unknown[], ...a: unknown[]) =>\n ((await v.call(t, stmts, ...a)) as unknown[]).map(celldMeta);\n if (p === \"withSession\")\n return () => {\n const session = celldD1(t);\n return new Proxy(session, {\n get: (s, q, rr) =>\n q === \"getBookmark\" ? () => \"celld:primary\" : Reflect.get(s, q, rr),\n });\n };\n if (p === \"getBookmark\") return () => \"celld:primary\";\n return typeof v === \"function\" ? v.bind(t) : v;\n },\n });\n}\n\n/** Last fired occurrence per cron expression, in a small SQLite database of the host. */\nfunction cronState(db: ReturnType<ProjectHost[\"openSql\"]>) {\n db.exec(\n \"CREATE TABLE IF NOT EXISTS cron_state (expression TEXT PRIMARY KEY, scheduled_time INTEGER)\",\n [],\n );\n return {\n get: (e: string) => {\n const row = db.exec(\"SELECT scheduled_time FROM cron_state WHERE expression = ?\", [e])\n .rows[0];\n return row ? Number(row[0]) : undefined;\n },\n set: (e: string, t: number) =>\n void db.exec(\"INSERT OR REPLACE INTO cron_state (expression, scheduled_time) VALUES (?, ?)\", [\n e,\n t,\n ]),\n };\n}\n\n/**\n * KV namespaces and D1 databases may omit their ids: wrangler provisions them on deploy, and\n * framework builds (Astro's Cloudflare adapter, for one) emit such entries. A KV namespace\n * then takes its binding name as id; a D1 database its `database_name`, else its binding name.\n * Entries with ids are kept as they are, so storage shared with celld keeps its names.\n */\nexport function withResourceIds(config: WranglerConfig): WranglerConfig {\n const kv = config.kv_namespaces;\n const d1 = config.d1_databases;\n if (!kv?.some((n) => !n.id) && !d1?.some((d) => !d.database_id)) return config;\n return {\n ...config,\n kv_namespaces: kv?.map((n) => (n.id ? n : { ...n, id: n.binding })),\n d1_databases: d1?.map((d) =>\n d.database_id ? d : { ...d, database_id: d.database_name ?? d.binding },\n ),\n };\n}\n"]}
|
package/dist/transport/port.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { overPipe } from "@statewalker/webrun-rpc";
|
|
1
|
+
import type { overPipe } from "@statewalker/webrun-rpc";
|
|
2
2
|
import type { CellRuntime } from "../core/runtime.js";
|
|
3
3
|
import { type CellsHttpOptions, type RemoteRuntime } from "./cells-http.js";
|
|
4
4
|
import { type Send } from "./cells-link.js";
|
|
@@ -8,9 +8,8 @@ import { type Send } from "./cells-link.js";
|
|
|
8
8
|
*/
|
|
9
9
|
export type CellPort = Parameters<typeof overPipe>[0];
|
|
10
10
|
/**
|
|
11
|
-
* Cell-host side: serves the runtime's HTTP surface over a port
|
|
12
|
-
*
|
|
13
|
-
* Duplex, streaming bodies). Resolves to an async disposer.
|
|
11
|
+
* Cell-host side: serves the runtime's HTTP surface over a port. Resolves to an async
|
|
12
|
+
* disposer.
|
|
14
13
|
*/
|
|
15
14
|
export declare function serveRuntime(port: CellPort, runtime: CellRuntime, opts?: CellsHttpOptions): Promise<() => Promise<void>>;
|
|
16
15
|
/** Front side (page, SW bridge, another tab): a RemoteRuntime over a port. */
|