@statewalker/cellb 0.8.8 → 0.9.1
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 +11 -7
- package/dist/adapters/node-sqlite-module.d.ts +6 -0
- package/dist/adapters/node-sqlite-module.js +12 -0
- package/dist/adapters/node-sqlite-module.js.map +1 -1
- package/dist/adapters/node-sqlite.js +3 -3
- package/dist/adapters/node-sqlite.js.map +1 -1
- package/dist/adapters/wasm-sqlite.d.ts +2 -0
- package/dist/adapters/wasm-sqlite.js +15 -0
- package/dist/adapters/wasm-sqlite.js.map +1 -1
- package/dist/bindings/cjs-module.d.ts +7 -0
- package/dist/bindings/cjs-module.js +96 -0
- package/dist/bindings/cjs-module.js.map +1 -0
- package/dist/bindings/cron.js +9 -2
- package/dist/bindings/cron.js.map +1 -1
- package/dist/bindings/module-registry.d.ts +43 -0
- package/dist/bindings/module-registry.js +192 -0
- package/dist/bindings/module-registry.js.map +1 -0
- package/dist/bindings/worker-loader.d.ts +23 -5
- package/dist/bindings/worker-loader.js +75 -4
- package/dist/bindings/worker-loader.js.map +1 -1
- package/dist/bucket/sqlite-object-store.js +2 -2
- package/dist/bucket/sqlite-object-store.js.map +1 -1
- package/dist/core/alarms.js +12 -2
- package/dist/core/alarms.js.map +1 -1
- package/dist/core/handles.d.ts +21 -1
- package/dist/core/handles.js +49 -3
- package/dist/core/handles.js.map +1 -1
- package/dist/core/namespace.js +4 -1
- package/dist/core/namespace.js.map +1 -1
- package/dist/core/runtime.d.ts +8 -0
- package/dist/core/runtime.js +3 -3
- package/dist/core/runtime.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/isolate/browser.d.ts +1 -1
- package/dist/isolate/browser.js +3 -1
- package/dist/isolate/browser.js.map +1 -1
- package/dist/isolate/function-imports.d.ts +10 -0
- package/dist/isolate/function-imports.js +93 -0
- package/dist/isolate/function-imports.js.map +1 -0
- package/dist/isolate/host.js +20 -2
- package/dist/isolate/host.js.map +1 -1
- package/dist/isolate/isolate-worker.js +18 -2
- package/dist/isolate/isolate-worker.js.map +1 -1
- package/dist/isolate/isolate.js +11 -0
- package/dist/isolate/isolate.js.map +1 -1
- package/dist/isolate/node-entry.js +33 -0
- package/dist/isolate/node-entry.js.map +1 -1
- package/dist/isolate/protocol.d.ts +1 -0
- package/dist/isolate/protocol.js +242 -13
- package/dist/isolate/protocol.js.map +1 -1
- package/dist/isolate/writable-globals.d.ts +9 -0
- package/dist/isolate/writable-globals.js +45 -0
- package/dist/isolate/writable-globals.js.map +1 -0
- package/dist/node-compat/bundle-files.d.ts +26 -0
- package/dist/node-compat/bundle-files.js +210 -0
- package/dist/node-compat/bundle-files.js.map +1 -0
- package/dist/node-compat/fs.d.ts +13 -1
- package/dist/node-compat/fs.js +54 -15
- package/dist/node-compat/fs.js.map +1 -1
- package/dist/project/browser-host.d.ts +2 -0
- package/dist/project/browser-host.js +2 -0
- package/dist/project/browser-host.js.map +1 -1
- package/dist/project/browser-load.js +1 -0
- package/dist/project/browser-load.js.map +1 -1
- package/dist/project/browser-modules.d.ts +8 -2
- package/dist/project/browser-modules.js +30 -6
- package/dist/project/browser-modules.js.map +1 -1
- package/dist/project/built-project.d.ts +7 -0
- package/dist/project/built-project.js.map +1 -1
- package/dist/project/cloudflare-workers.d.ts +9 -0
- package/dist/project/cloudflare-workers.js +14 -0
- package/dist/project/cloudflare-workers.js.map +1 -1
- package/dist/project/module-rules.js +31 -10
- package/dist/project/module-rules.js.map +1 -1
- package/dist/project/node-project.d.ts +2 -0
- package/dist/project/node-project.js +157 -25
- package/dist/project/node-project.js.map +1 -1
- package/dist/project/site-loader.js +2 -1
- package/dist/project/site-loader.js.map +1 -1
- package/dist/project/uint8array-base64.d.ts +7 -0
- package/dist/project/uint8array-base64.js +96 -0
- package/dist/project/uint8array-base64.js.map +1 -0
- package/dist/project/workers-globals-module.d.ts +1 -0
- package/dist/project/workers-globals-module.js +3 -0
- package/dist/project/workers-globals-module.js.map +1 -1
- package/dist/project/wrangler.js +8 -9
- package/dist/project/wrangler.js.map +1 -1
- package/dist/ws/upgrade.js +18 -1
- package/dist/ws/upgrade.js.map +1 -1
- package/package.json +10 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-loader.js","sourceRoot":"","sources":["../../src/bindings/worker-loader.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n classHandle,\n cross,\n ctxExports,\n type DurableObjectClass,\n entrypointStub,\n ISOLATED,\n type IsolatedClass,\n pipeTo,\n REFUSE,\n rpcPromise,\n} from \"../core/handles.js\";\n\n/** workerd's refusal of a loaded Worker's entrypoint passed on to another Worker. */\nconst DYNAMIC_ENTRYPOINT =\n \"Entrypoints to dynamically-loaded workers cannot be transferred to other Workers, because the system does not know how to reload this Worker from scratch. Instead, have the parent Worker expose an entrypoint which constructs the dynamic worker and forwards to it.\";\n\n/** What `env.LOADER.get(id, () => code)` returns from its callback (workerd's WorkerCode). */\nexport interface WorkerCode {\n compatibilityDate?: string;\n compatibilityFlags?: string[];\n mainModule: string;\n modules: Record<\n string,\n | string\n | { js?: string; esModule?: string; text?: string; json?: unknown; wasm?: BufferSource }\n | { data: BufferSource }\n >;\n env?: Record<string, unknown>;\n globalOutbound?: unknown;\n /** Tail Workers: stubs whose `tail(events)` receives each invocation's logs and exceptions. */\n tails?: { tail(events: TailEvent[]): unknown }[];\n}\n\nexport interface TailLog {\n message: unknown[];\n level: string;\n timestamp: number;\n}\n\nexport interface TailEvent {\n scriptName: string;\n outcome: \"ok\" | \"exception\";\n eventTimestamp: number;\n event: { request?: { url: string; method: string } } | null;\n logs: TailLog[];\n exceptions: { name: string; message: string; timestamp: number }[];\n diagnosticsChannelEvents: unknown[];\n}\n\n/**\n * One `WorkerCode.modules` entry as ES module source; text and JSON become a default export,\n * wasm bytes a compiled `WebAssembly.Module`.\n */\nexport function moduleText(entry: WorkerCode[\"modules\"][string]): string {\n if (typeof entry === \"string\") return entry;\n const m = entry as Exclude<typeof entry, { data: BufferSource }>; // workerLoader refuses data\n if (m.wasm) {\n const bytes = ArrayBuffer.isView(m.wasm)\n ? new Uint8Array(m.wasm.buffer, m.wasm.byteOffset, m.wasm.byteLength)\n : new Uint8Array(m.wasm);\n let bin = \"\";\n for (const b of bytes) bin += String.fromCharCode(b);\n return `export default new WebAssembly.Module(Uint8Array.from(atob(\"${btoa(bin)}\"), (c) => c.charCodeAt(0)));`;\n }\n return m.js ?? m.esModule ?? `export default ${JSON.stringify(m.text ?? m.json)};`;\n}\n\n/**\n * The `fetch` loaded code sees, from `WorkerCode.globalOutbound`: omitted → the loader's own\n * (undefined: no override); `null` → every fetch throws; a Fetcher → each fetch goes through it.\n */\nexport function outboundFetch(code: WorkerCode): typeof fetch | undefined {\n const o = code.globalOutbound as { fetch?: typeof fetch } | null | undefined;\n if (o === undefined) return undefined;\n if (o === null)\n return (async () => {\n throw new Error(\n \"This worker is not permitted to access the internet via global functions like fetch(). It must use capabilities (such as bindings in 'env') to talk to the outside world.\",\n );\n }) as typeof fetch;\n if (typeof o.fetch === \"function\")\n return ((input: RequestInfo | URL, init?: RequestInit) =>\n o.fetch!(input, init)) as typeof fetch;\n throw new TypeError(\"globalOutbound must be null or a Fetcher\");\n}\n\n/** Where the `console` of loaded code writes (the host forwards to the real console too). */\nexport type LogSink = (level: string, args: unknown[]) => void;\n\n/** Compiles a WorkerCode into a module namespace (host specific: esbuild on Node, webrun-modules in browsers). */\nexport type ModuleLoader = (\n id: string,\n code: WorkerCode,\n logs?: LogSink,\n) => Promise<Record<string, unknown>>;\n\n/**\n * The Worker Loader binding (`worker_loaders` in wrangler config): runtime-loaded code,\n * cached by id; the callback runs only when the id is not loaded yet.\n */\nexport function workerLoader(load: ModuleLoader, opts: { classes?: ModuleLoader } = {}) {\n // With isolated loading, Durable Object classes (facets) still load in this realm.\n const classCache = new Map<string, Promise<{ module: Record<string, unknown>; env: unknown }>>();\n type Loaded = {\n module: Record<string, unknown>;\n env: unknown;\n /** ctx.exports of the loaded code (empty for an isolated module: the isolate builds its own). */\n exports: Record<string, unknown>;\n code: WorkerCode;\n logs: TailLog[];\n };\n const cache = new Map<string, Promise<Loaded>>();\n let anonymous = 0;\n const loader = {\n /** Compiles and runs code without the id cache (a fresh Worker per call). */\n load(code: WorkerCode) {\n return loader.get(\n `__load-${++anonymous}-${Math.random().toString(36).slice(2)}`,\n () => code,\n false,\n );\n },\n get(id: string, getCode: () => WorkerCode | Promise<WorkerCode>, cached = true) {\n let own: Promise<Loaded> | undefined; // load(): memoized per handle, not in the id cache\n const loaded = () => {\n let p = cached ? cache.get(id) : own;\n if (!p) {\n p = (async () => {\n const code = await getCode();\n // celld takes module source and wasm bytes only, not `data` modules.\n for (const [name, m] of Object.entries(code.modules))\n if (typeof m === \"object\" && \"data\" in m)\n throw new Error(`worker loader: module \"${name}\" must be a string or wasm bytes`);\n const logs: TailLog[] = [];\n const sink: LogSink = (level, message) =>\n logs.push({ level, message, timestamp: Date.now() });\n const module = await load(id, code, sink);\n const env = code.env ?? {};\n return { module, env, exports: ctxExports(module, env), code, logs };\n })();\n p.catch(() => cache.delete(id));\n if (cached) cache.set(id, p);\n else own = p;\n }\n return p;\n };\n /**\n * Runs one invocation of loaded code, then hands its logs/exceptions to the Tail Workers.\n * Returns the run's result as is (an RpcPromise stays one, for pipelining).\n */\n const traced = (l: Loaded, request: Request | undefined, run: () => unknown): unknown => {\n const from = l.logs.length;\n const t0 = Date.now();\n let r: unknown;\n try {\n r = run();\n } catch (e) {\n r = Promise.reject(e);\n }\n const report = (exceptions: TailEvent[\"exceptions\"]) => {\n const event: TailEvent = {\n scriptName: id,\n outcome: exceptions.length ? \"exception\" : \"ok\",\n eventTimestamp: t0,\n event: request ? { request: { url: request.url, method: request.method } } : null,\n logs: l.logs.splice(from),\n exceptions,\n diagnosticsChannelEvents: [],\n };\n for (const t of l.code.tails ?? []) void Promise.resolve(t.tail([event])).catch(() => {});\n };\n Promise.resolve(r).then(\n () => report([]),\n (e) =>\n report([\n {\n name: (e as Error)?.name ?? \"Error\",\n message: String((e as Error)?.message ?? e),\n timestamp: Date.now(),\n },\n ]),\n );\n return r;\n };\n return {\n getDurableObjectClass(name: string) {\n const classesLoaded = () => {\n let p = classCache.get(id);\n if (!p) {\n p = (async () => {\n const code = await getCode();\n return { module: await opts.classes!(id, code), env: code.env ?? {} };\n })();\n classCache.set(id, p);\n }\n return p;\n };\n return classHandle(async () => {\n if (!opts.classes) {\n const iso = (await loaded()).module[ISOLATED as unknown as string] as\n | ((name: string) => IsolatedClass)\n | undefined;\n if (iso) return { isolated: iso(name) };\n }\n const { module, env } = opts.classes ? await classesLoaded() : await loaded();\n const cls = module[name];\n if (typeof cls !== \"function\")\n throw new Error(`Loaded worker \"${id}\" does not export class \"${name}\"`);\n return { cls: cls as DurableObjectClass, env };\n });\n },\n /** Releases the loaded Worker: the id leaves the cache; a later get() loads again. */\n dispose() {\n cache.delete(id);\n },\n getEntrypoint(name = \"default\", options: { props?: unknown } = {}) {\n // Props cross now (workerd serializes them here): a refusal is a rejected promise,\n // so `await` and `assert.rejects` see it.\n try {\n cross(options.props);\n } catch (e) {\n const refused = Promise.reject(e);\n refused.catch(() => {});\n return refused as never;\n }\n return new Proxy(\n {},\n {\n get(_t, prop) {\n if (prop === REFUSE) return DYNAMIC_ENTRYPOINT;\n if (prop === \"then\" || typeof prop === \"symbol\") return undefined;\n return (...args: unknown[]) => {\n // Boxed, so awaiting the load does not await the call: calls on its\n // RpcPromise are pipelined.\n const run = loaded().then((l) => {\n const stub = entrypointStub(l.module[name], l.env, options.props, l.exports);\n const request =\n prop === \"fetch\"\n ? new Request(args[0] as RequestInfo, args[1] as RequestInit)\n : undefined;\n return {\n r: traced(l, request, () =>\n stub[prop as string](...(request ? [request] : args)),\n ),\n };\n });\n return rpcPromise(\n run.then((b) => b.r),\n (path, a) => run.then((b) => pipeTo(b.r, path, a)),\n );\n };\n },\n },\n );\n },\n };\n },\n };\n return loader;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"worker-loader.js","sourceRoot":"","sources":["../../src/bindings/worker-loader.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n classHandle,\n cross,\n ctxExports,\n type DurableObjectClass,\n entrypointStub,\n ISOLATED,\n type IsolatedClass,\n ON_ABORT,\n pipeTo,\n REFUSE,\n rpcPromise,\n} from \"../core/handles.js\";\nimport { commonJsModule } from \"./cjs-module.js\";\n\n/** workerd's refusal of a loaded Worker's entrypoint passed on to another Worker. */\nconst DYNAMIC_ENTRYPOINT =\n \"Entrypoints to dynamically-loaded workers cannot be transferred to other Workers, because the system does not know how to reload this Worker from scratch. Instead, have the parent Worker expose an entrypoint which constructs the dynamic worker and forwards to it.\";\n\n/** What `env.LOADER.get(id, () => code)` returns from its callback (workerd's WorkerCode). */\nexport interface WorkerCode {\n compatibilityDate?: string;\n compatibilityFlags?: string[];\n mainModule: string;\n modules: Record<\n string,\n | string\n | {\n js?: string;\n esModule?: string;\n cjs?: string;\n text?: string;\n json?: unknown;\n /** The bytes, or (from `compileWasmModules`) the compiled module. */\n wasm?: BufferSource | WebAssembly.Module;\n }\n | { data: BufferSource }\n >;\n env?: Record<string, unknown>;\n globalOutbound?: unknown;\n /** Tail Workers: stubs whose `tail(events)` receives each invocation's logs and exceptions. */\n tails?: { tail(events: TailEvent[]): unknown }[];\n}\n\nexport interface TailLog {\n message: unknown[];\n level: string;\n timestamp: number;\n}\n\nexport interface TailEvent {\n scriptName: string;\n outcome: \"ok\" | \"exception\";\n eventTimestamp: number;\n event: { request?: { url: string; method: string } } | null;\n logs: TailLog[];\n exceptions: { name: string; message: string; timestamp: number }[];\n diagnosticsChannelEvents: unknown[];\n}\n\n/**\n * One `WorkerCode.modules` entry as ES module source; text and JSON become a default export,\n * wasm bytes a compiled `WebAssembly.Module`, and a CommonJS module's `module.exports` the\n * default export. `name` names a CommonJS module in stack traces.\n */\nexport function moduleText(\n entry: WorkerCode[\"modules\"][string],\n name = \"module.cjs\",\n names?: ReadonlySet<string>,\n): string {\n if (typeof entry === \"string\") return entry;\n const m = entry as Exclude<typeof entry, { data: BufferSource }>; // workerLoader refuses data\n if (typeof m.cjs === \"string\") return commonJsModule(m.cjs, name, names);\n if (m.wasm instanceof WebAssembly.Module)\n return `export default globalThis.${WASM_TABLE}[${JSON.stringify(wasmModuleKey(m.wasm))}];`;\n if (m.wasm) {\n const bytes = ArrayBuffer.isView(m.wasm)\n ? new Uint8Array(m.wasm.buffer, m.wasm.byteOffset, m.wasm.byteLength)\n : new Uint8Array(m.wasm);\n let bin = \"\";\n for (const b of bytes) bin += String.fromCharCode(b);\n return `export default new WebAssembly.Module(Uint8Array.from(atob(\"${btoa(bin)}\"), (c) => c.charCodeAt(0)));`;\n }\n return m.js ?? m.esModule ?? `export default ${JSON.stringify(m.text ?? m.json)};`;\n}\n\n/** The realm's table of compiled wasm modules of loaded code, by key. */\nexport const WASM_TABLE = \"__cellsWasmModules\";\nconst keys = new WeakMap<WebAssembly.Module, string>();\nlet lastKey = 0;\n\n/** The key of `mod` in this realm's wasm table (registered on first use). */\nexport function wasmModuleKey(mod: WebAssembly.Module): string {\n let key = keys.get(mod);\n if (!key) {\n key = `w${++lastKey}`;\n keys.set(mod, key);\n registerWasmModules({ [key]: mod });\n }\n return key;\n}\n\n/** Puts compiled modules in this realm's wasm table (an isolate receives its loader's). */\nexport function registerWasmModules(modules: Record<string, WebAssembly.Module>): void {\n const g = globalThis as Record<string, unknown>;\n g[WASM_TABLE] ??= {};\n Object.assign(g[WASM_TABLE] as Record<string, WebAssembly.Module>, modules);\n}\n\n/** The table entries the wasm modules of `code` use (what an isolate needs of this realm's table). */\nexport function wasmModulesOf(code: WorkerCode): Record<string, WebAssembly.Module> {\n const out: Record<string, WebAssembly.Module> = {};\n for (const m of Object.values(code.modules))\n if (typeof m === \"object\" && \"wasm\" in m && m.wasm instanceof WebAssembly.Module)\n out[wasmModuleKey(m.wasm)] = m.wasm;\n return out;\n}\n\nconst compiled = new WeakMap<object, Promise<WebAssembly.Module>>();\n\n/**\n * `code` with each `wasm` module compiled (asynchronously, once per bytes object: Kitesurf hands\n * the same ArrayBuffer to every page's Worker), so loaders put a compiled module in the realm's\n * table instead of the bytes as base64 text, which a large module makes slow to build, parse,\n * decode and compile synchronously on every load.\n */\nexport async function compileWasmModules(code: WorkerCode): Promise<WorkerCode> {\n let modules: WorkerCode[\"modules\"] | undefined;\n for (const [name, m] of Object.entries(code.modules)) {\n if (typeof m !== \"object\" || !(\"wasm\" in m) || !m.wasm) continue;\n if (m.wasm instanceof WebAssembly.Module) continue;\n const bytes = m.wasm;\n let p = compiled.get(bytes);\n if (!p) {\n p = WebAssembly.compile(bytes);\n compiled.set(bytes, p);\n p.catch(() => compiled.delete(bytes));\n }\n modules ??= { ...code.modules };\n modules[name] = { ...m, wasm: await p };\n }\n return modules ? { ...code, modules } : code;\n}\n\n/**\n * The `fetch` loaded code sees, from `WorkerCode.globalOutbound`: omitted → the loader's own\n * (undefined: no override); `null` → every fetch throws; a Fetcher → each fetch goes through it.\n */\nexport function outboundFetch(code: WorkerCode): typeof fetch | undefined {\n const o = code.globalOutbound as { fetch?: typeof fetch } | null | undefined;\n if (o === undefined) return undefined;\n if (o === null)\n return (async () => {\n throw new Error(\n \"This worker is not permitted to access the internet via global functions like fetch(). It must use capabilities (such as bindings in 'env') to talk to the outside world.\",\n );\n }) as typeof fetch;\n if (typeof o.fetch === \"function\")\n return ((input: RequestInfo | URL, init?: RequestInit) =>\n o.fetch!(input, init)) as typeof fetch;\n throw new TypeError(\"globalOutbound must be null or a Fetcher\");\n}\n\n/** Where the `console` of loaded code writes (the host forwards to the real console too). */\nexport type LogSink = (level: string, args: unknown[]) => void;\n\n/** Compiles a WorkerCode into a module namespace (host specific: esbuild on Node, webrun-modules in browsers). */\nexport type ModuleLoader = (\n id: string,\n code: WorkerCode,\n logs?: LogSink,\n) => Promise<Record<string, unknown>>;\n\n/**\n * The Worker Loader binding (`worker_loaders` in wrangler config): runtime-loaded code,\n * cached by id; the callback runs only when the id is not loaded yet.\n */\nexport function workerLoader(load: ModuleLoader, opts: { classes?: ModuleLoader } = {}) {\n // With isolated loading, Durable Object classes (facets) still load in this realm.\n const classCache = new Map<string, Promise<{ module: Record<string, unknown>; env: unknown }>>();\n type Loaded = {\n module: Record<string, unknown>;\n env: unknown;\n /** ctx.exports of the loaded code (empty for an isolated module: the isolate builds its own). */\n exports: Record<string, unknown>;\n code: WorkerCode;\n logs: TailLog[];\n };\n const cache = new Map<string, Promise<Loaded>>();\n let anonymous = 0;\n const loader = {\n /** Compiles and runs code without the id cache (a fresh Worker per call). */\n load(code: WorkerCode) {\n return loader.get(\n `__load-${++anonymous}-${Math.random().toString(36).slice(2)}`,\n () => code,\n false,\n );\n },\n get(id: string, getCode: () => WorkerCode | Promise<WorkerCode>, cached = true) {\n let own: Promise<Loaded> | undefined; // load(): memoized per handle, not in the id cache\n const loaded = () => {\n let p = cached ? cache.get(id) : own;\n if (!p) {\n p = (async () => {\n const code = await getCode();\n // celld takes module source and wasm bytes only, not `data` modules.\n for (const [name, m] of Object.entries(code.modules))\n if (typeof m === \"object\" && \"data\" in m)\n throw new Error(`worker loader: module \"${name}\" must be a string or wasm bytes`);\n const logs: TailLog[] = [];\n const sink: LogSink = (level, message) =>\n logs.push({ level, message, timestamp: Date.now() });\n const module = await load(id, code, sink);\n // Its isolate ended (`abortIsolate()`): the next get() of this id loads it again.\n (\n (module as Record<symbol, unknown>)[ON_ABORT] as\n | ((forget: () => void) => void)\n | undefined\n )?.(() => {\n if (cache.get(id) === p) cache.delete(id);\n if (own === p) own = undefined;\n });\n const env = code.env ?? {};\n return { module, env, exports: ctxExports(module, env), code, logs };\n })();\n p.catch(() => cache.delete(id));\n if (cached) cache.set(id, p);\n else own = p;\n }\n return p;\n };\n /**\n * Runs one invocation of loaded code, then hands its logs/exceptions to the Tail Workers.\n * Returns the run's result as is (an RpcPromise stays one, for pipelining).\n */\n const traced = (l: Loaded, request: Request | undefined, run: () => unknown): unknown => {\n const from = l.logs.length;\n const t0 = Date.now();\n let r: unknown;\n try {\n r = run();\n } catch (e) {\n r = Promise.reject(e);\n }\n const report = (exceptions: TailEvent[\"exceptions\"]) => {\n const event: TailEvent = {\n scriptName: id,\n outcome: exceptions.length ? \"exception\" : \"ok\",\n eventTimestamp: t0,\n event: request ? { request: { url: request.url, method: request.method } } : null,\n logs: l.logs.splice(from),\n exceptions,\n diagnosticsChannelEvents: [],\n };\n for (const t of l.code.tails ?? []) void Promise.resolve(t.tail([event])).catch(() => {});\n };\n Promise.resolve(r).then(\n () => report([]),\n (e) =>\n report([\n {\n name: (e as Error)?.name ?? \"Error\",\n message: String((e as Error)?.message ?? e),\n timestamp: Date.now(),\n },\n ]),\n );\n return r;\n };\n return {\n getDurableObjectClass(name: string) {\n const classesLoaded = () => {\n let p = classCache.get(id);\n if (!p) {\n p = (async () => {\n const code = await getCode();\n return { module: await opts.classes!(id, code), env: code.env ?? {} };\n })();\n classCache.set(id, p);\n }\n return p;\n };\n return classHandle(async () => {\n if (!opts.classes) {\n const iso = (await loaded()).module[ISOLATED as unknown as string] as\n | ((name: string) => IsolatedClass)\n | undefined;\n if (iso) return { isolated: iso(name) };\n }\n const { module, env } = opts.classes ? await classesLoaded() : await loaded();\n const cls = module[name];\n if (typeof cls !== \"function\")\n throw new Error(`Loaded worker \"${id}\" does not export class \"${name}\"`);\n return { cls: cls as DurableObjectClass, env };\n });\n },\n /** Releases the loaded Worker: the id leaves the cache; a later get() loads again. */\n dispose() {\n cache.delete(id);\n },\n getEntrypoint(name = \"default\", options: { props?: unknown } = {}) {\n // Props cross now (workerd serializes them here): a refusal is a rejected promise,\n // so `await` and `assert.rejects` see it.\n try {\n cross(options.props);\n } catch (e) {\n const refused = Promise.reject(e);\n refused.catch(() => {});\n return refused as never;\n }\n const entrypoint: Record<string, unknown> = new Proxy(\n {},\n {\n get(_t, prop) {\n if (prop === REFUSE) return DYNAMIC_ENTRYPOINT;\n if (prop === \"then\" || typeof prop === \"symbol\") return undefined;\n // workerd's `dup()`: this entrypoint holds nothing to release, so it is itself.\n if (prop === \"dup\") return () => entrypoint;\n return (...args: unknown[]) => {\n // Boxed, so awaiting the load does not await the call: calls on its\n // RpcPromise are pipelined.\n const run = loaded().then((l) => {\n const stub = entrypointStub(l.module[name], l.env, options.props, l.exports);\n const request =\n prop === \"fetch\"\n ? new Request(args[0] as RequestInfo, args[1] as RequestInit)\n : undefined;\n return {\n r: traced(l, request, () =>\n stub[prop as string](...(request ? [request] : args)),\n ),\n };\n });\n return rpcPromise(\n run.then((b) => b.r),\n (path, a) => run.then((b) => pipeTo(b.r, path, a)),\n );\n };\n },\n },\n );\n return entrypoint;\n },\n };\n },\n };\n return loader;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { requireNodeSqlite } from "../adapters/node-sqlite-module.js";
|
|
1
|
+
import { nodeSqliteBytes, requireNodeSqlite } from "../adapters/node-sqlite-module.js";
|
|
2
2
|
import { PreconditionFailedError } from "./object-store.js";
|
|
3
3
|
const { DatabaseSync } = requireNodeSqlite();
|
|
4
4
|
/**
|
|
@@ -42,7 +42,7 @@ export function sqliteObjectStore(file) {
|
|
|
42
42
|
.prepare("SELECT next_etag FROM store_sequence WHERE singleton = 1")
|
|
43
43
|
.get();
|
|
44
44
|
db.prepare("UPDATE store_sequence SET next_etag = ? WHERE singleton = 1").run(next_etag + 1);
|
|
45
|
-
db.prepare("INSERT OR REPLACE INTO objects (key, body, etag, modified_ms, attributes) VALUES (?, ?, ?, ?, ?)").run(key, body, next_etag, Date.now(), toAttributes(attrs));
|
|
45
|
+
db.prepare("INSERT OR REPLACE INTO objects (key, body, etag, modified_ms, attributes) VALUES (?, ?, ?, ?, ?)").run(key, nodeSqliteBytes(body), next_etag, Date.now(), toAttributes(attrs));
|
|
46
46
|
db.exec("COMMIT");
|
|
47
47
|
return String(next_etag);
|
|
48
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-object-store.js","sourceRoot":"","sources":["../../src/bucket/sqlite-object-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite-object-store.js","sourceRoot":"","sources":["../../src/bucket/sqlite-object-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { nodeSqliteBytes, requireNodeSqlite } from \"../adapters/node-sqlite-module.js\";\nimport type { ObjectAttributes, ObjectStore } from \"./object-store.js\";\nimport { PreconditionFailedError } from \"./object-store.js\";\n\nconst { DatabaseSync } = requireNodeSqlite();\n\n/**\n * celld dev's local bucket: `<project>/.celld/dev/objects.sqlite3` (objects(key, body, etag\n * INTEGER, modified_ms, attributes) + store_sequence). Reading and writing it lets a\n * cellb node and `celld dev` share one bucket, so cells move between them.\n * Conditional writes are real (one SQLite transaction).\n */\nexport function sqliteObjectStore(file: string): ObjectStore & { close(): void } {\n const db = new DatabaseSync(file);\n db.exec(`CREATE TABLE IF NOT EXISTS objects (\n key TEXT PRIMARY KEY, body BLOB NOT NULL, etag INTEGER NOT NULL,\n modified_ms INTEGER NOT NULL, attributes TEXT NOT NULL)`);\n db.exec(`CREATE TABLE IF NOT EXISTS store_sequence (\n singleton INTEGER PRIMARY KEY CHECK (singleton = 1), next_etag INTEGER NOT NULL)`);\n db.exec(\"INSERT OR IGNORE INTO store_sequence (singleton, next_etag) VALUES (1, 1)\");\n db.exec(\"PRAGMA busy_timeout = 5000\");\n return {\n async get(key) {\n const r = db\n .prepare(\"SELECT body, etag, modified_ms, attributes FROM objects WHERE key = ?\")\n .get(key) as\n | { body: Uint8Array; etag: number; modified_ms: number; attributes: string }\n | undefined;\n return r\n ? {\n body: new Uint8Array(r.body),\n etag: String(r.etag),\n modifiedMs: Number(r.modified_ms),\n attrs: fromAttributes(r.attributes),\n }\n : undefined;\n },\n async put(key, body, cond, attrs) {\n db.exec(\"BEGIN IMMEDIATE\");\n try {\n const cur = db.prepare(\"SELECT etag FROM objects WHERE key = ?\").get(key) as\n | { etag: number }\n | undefined;\n if (cond?.ifNoneMatch === \"*\" && cur) throw new PreconditionFailedError(key);\n if (cond?.ifMatch !== undefined && String(cur?.etag) !== cond.ifMatch)\n throw new PreconditionFailedError(key);\n const { next_etag } = db\n .prepare(\"SELECT next_etag FROM store_sequence WHERE singleton = 1\")\n .get() as {\n next_etag: number;\n };\n db.prepare(\"UPDATE store_sequence SET next_etag = ? WHERE singleton = 1\").run(\n next_etag + 1,\n );\n db.prepare(\n \"INSERT OR REPLACE INTO objects (key, body, etag, modified_ms, attributes) VALUES (?, ?, ?, ?, ?)\",\n ).run(key, nodeSqliteBytes(body), next_etag, Date.now(), toAttributes(attrs));\n db.exec(\"COMMIT\");\n return String(next_etag);\n } catch (e) {\n db.exec(\"ROLLBACK\");\n throw e;\n }\n },\n async list(prefix) {\n return (\n db\n .prepare(\"SELECT key FROM objects WHERE key >= ? AND key < ? ORDER BY key\")\n .all(prefix, `${prefix}\\uffff`) as {\n key: string;\n }[]\n ).map((r) => r.key);\n },\n async delete(key) {\n db.prepare(\"DELETE FROM objects WHERE key = ?\").run(key);\n },\n close() {\n db.close();\n },\n };\n}\n\n// celld dev's `attributes` column: a JSON array of {kind, name, value} — \"metadata\" entries\n// (user metadata, name = key) and one entry per content header (\"content-type\", …).\ntype HeaderField =\n | \"contentType\"\n | \"contentLanguage\"\n | \"contentDisposition\"\n | \"contentEncoding\"\n | \"cacheControl\";\nconst HEADERS: [HeaderField, string][] = [\n [\"contentType\", \"content-type\"],\n [\"contentLanguage\", \"content-language\"],\n [\"contentDisposition\", \"content-disposition\"],\n [\"contentEncoding\", \"content-encoding\"],\n [\"cacheControl\", \"cache-control\"],\n];\nfunction toAttributes(attrs?: ObjectAttributes): string {\n const out: { kind: string; name: string | null; value: string }[] = [];\n for (const [name, value] of Object.entries(attrs?.metadata ?? {}))\n out.push({ kind: \"metadata\", name, value });\n for (const [field, kind] of HEADERS) {\n const v = attrs?.[field];\n if (typeof v === \"string\") out.push({ kind, name: null, value: v });\n }\n return JSON.stringify(out);\n}\nfunction fromAttributes(raw: string): ObjectAttributes | undefined {\n let list: { kind: string; name: string | null; value: string }[];\n try {\n list = JSON.parse(raw);\n } catch {\n return undefined;\n }\n if (!Array.isArray(list) || !list.length) return undefined;\n const attrs: ObjectAttributes = {};\n for (const e of list) {\n if (e.kind === \"metadata\" && e.name) {\n attrs.metadata = attrs.metadata ?? {};\n attrs.metadata[e.name] = e.value;\n }\n const h = HEADERS.find(([, kind]) => kind === e.kind);\n if (h) (attrs as Record<string, unknown>)[h[0]] = e.value;\n }\n return attrs;\n}\n"]}
|
package/dist/core/alarms.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/** The longest delay setTimeout takes (2^31 - 1 ms, about 24.8 days). */
|
|
2
|
+
const MAX_TIMER_MS = 2 ** 31 - 1;
|
|
1
3
|
/**
|
|
2
4
|
* Runtime-wide alarm scheduler. Every object's alarm lives in its own `_cf_METADATA`
|
|
3
5
|
* (the truth); this index — one small SQLite database next to the cells — lets a
|
|
@@ -58,13 +60,21 @@ export class AlarmScheduler {
|
|
|
58
60
|
]);
|
|
59
61
|
this.#arm({ ...entry, at });
|
|
60
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* A timer waits at most `MAX_TIMER_MS`: Node's setTimeout fires a longer delay after 1 ms,
|
|
65
|
+
* which woke an alarm set weeks ahead every millisecond. Further-off alarms wait in steps
|
|
66
|
+
* and fire once, when due.
|
|
67
|
+
*/
|
|
61
68
|
#arm(e) {
|
|
62
69
|
this.#clear(e.cellKey);
|
|
63
70
|
const delay = Math.max(0, e.at - this.#clock.now());
|
|
64
71
|
this.#timers.set(e.cellKey, this.#clock.setTimeout(() => {
|
|
65
72
|
this.#timers.delete(e.cellKey);
|
|
66
|
-
|
|
67
|
-
|
|
73
|
+
if (this.#clock.now() < e.at)
|
|
74
|
+
this.#arm(e);
|
|
75
|
+
else
|
|
76
|
+
void this.#fire(e);
|
|
77
|
+
}, Math.min(delay, MAX_TIMER_MS)));
|
|
68
78
|
}
|
|
69
79
|
#clear(cellKey) {
|
|
70
80
|
const t = this.#timers.get(cellKey);
|
package/dist/core/alarms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alarms.js","sourceRoot":"","sources":["../../src/core/alarms.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"alarms.js","sourceRoot":"","sources":["../../src/core/alarms.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Clock, SyncSqlDriver } from \"../ports.js\";\n\n/** The longest delay setTimeout takes (2^31 - 1 ms, about 24.8 days). */\nconst MAX_TIMER_MS = 2 ** 31 - 1;\n\nexport interface AlarmEntry {\n cellKey: string;\n className: string;\n idHex: string;\n at: number;\n}\n\n/**\n * Runtime-wide alarm scheduler. Every object's alarm lives in its own `_cf_METADATA`\n * (the truth); this index — one small SQLite database next to the cells — lets a\n * restarted runtime wake objects whose alarms are due without anyone touching them\n * (catch-up after a crash, a closed tab or a frozen page).\n */\nexport class AlarmScheduler {\n readonly #timers = new Map<string, unknown>();\n readonly #clock: Clock;\n readonly #openIndex?: () => SyncSqlDriver;\n #indexDb: SyncSqlDriver | null | undefined;\n readonly #fire: (e: AlarmEntry) => Promise<void>;\n\n constructor(opts: {\n clock: Clock;\n openIndex?: () => SyncSqlDriver;\n fire: (e: AlarmEntry) => Promise<void>;\n }) {\n this.#clock = opts.clock;\n this.#openIndex = opts.openIndex;\n this.#fire = opts.fire;\n }\n\n /**\n * The index is opened lazily and is best effort: if it cannot be opened (e.g. another\n * process holds it in EXCLUSIVE locking mode) alarms still fire for live objects; only\n * the catch-up after a restart is lost for this runtime.\n */\n get #index(): SyncSqlDriver | undefined {\n if (this.#indexDb === undefined) {\n try {\n const db = this.#openIndex?.() ?? null;\n db?.exec(\n \"CREATE TABLE IF NOT EXISTS alarms (cell_key TEXT PRIMARY KEY, class_name TEXT, id_hex TEXT, at INTEGER)\",\n [],\n );\n this.#indexDb = db;\n } catch {\n this.#indexDb = null;\n }\n }\n return this.#indexDb ?? undefined;\n }\n\n /** Re-arms every alarm recorded in the index (due ones fire at once). */\n restore(): void {\n for (const [cellKey, className, idHex, at] of this.#index?.exec(\"SELECT * FROM alarms\", [])\n .rows ?? [])\n this.#arm({\n cellKey: String(cellKey),\n className: String(className),\n idHex: String(idHex),\n at: Number(at),\n });\n }\n\n set(entry: Omit<AlarmEntry, \"at\">, at: number | null): void {\n this.#clear(entry.cellKey);\n if (at === null) {\n this.#index?.exec(\"DELETE FROM alarms WHERE cell_key = ?\", [entry.cellKey]);\n return;\n }\n this.#index?.exec(\"INSERT OR REPLACE INTO alarms VALUES (?, ?, ?, ?)\", [\n entry.cellKey,\n entry.className,\n entry.idHex,\n at,\n ]);\n this.#arm({ ...entry, at });\n }\n\n /**\n * A timer waits at most `MAX_TIMER_MS`: Node's setTimeout fires a longer delay after 1 ms,\n * which woke an alarm set weeks ahead every millisecond. Further-off alarms wait in steps\n * and fire once, when due.\n */\n #arm(e: AlarmEntry): void {\n this.#clear(e.cellKey);\n const delay = Math.max(0, e.at - this.#clock.now());\n this.#timers.set(\n e.cellKey,\n this.#clock.setTimeout(\n () => {\n this.#timers.delete(e.cellKey);\n if (this.#clock.now() < e.at) this.#arm(e);\n else void this.#fire(e);\n },\n Math.min(delay, MAX_TIMER_MS),\n ),\n );\n }\n\n #clear(cellKey: string): void {\n const t = this.#timers.get(cellKey);\n if (t !== undefined) this.#clock.clearTimeout(t);\n this.#timers.delete(cellKey);\n }\n\n stop(): void {\n for (const t of this.#timers.values()) this.#clock.clearTimeout(t);\n this.#timers.clear();\n }\n\n /** Closes the index database (after the objects that record into it have closed). */\n close(): void {\n this.stop();\n const db = this.#indexDb;\n this.#indexDb = null; // stays closed: later records are dropped\n db?.close();\n }\n}\n"]}
|
package/dist/core/handles.d.ts
CHANGED
|
@@ -18,6 +18,11 @@ export interface ClassHandle {
|
|
|
18
18
|
}
|
|
19
19
|
/** Key of the isolate's class factory on a module facade (see getDurableObjectClass). */
|
|
20
20
|
export declare const ISOLATED: unique symbol;
|
|
21
|
+
/**
|
|
22
|
+
* On a loaded Worker's module whose isolate can end (`abortIsolate`): registers what to do when
|
|
23
|
+
* it does (the Worker Loader forgets the module, so the next `get()` loads the code again).
|
|
24
|
+
*/
|
|
25
|
+
export declare const ON_ABORT: unique symbol;
|
|
21
26
|
/** A Durable Object class that runs in an isolate: its instances and storage live there. */
|
|
22
27
|
export interface IsolatedClass {
|
|
23
28
|
fetch(cellKey: string, req: Request): Promise<Response>;
|
|
@@ -38,10 +43,16 @@ export declare const STUB: unique symbol;
|
|
|
38
43
|
export declare const REFUSE: unique symbol;
|
|
39
44
|
/** Answered by a `ctx.exports.X({ props })` stub or class handle: `{ name, props }` (storable). */
|
|
40
45
|
export declare const EXPORT: unique symbol;
|
|
46
|
+
/**
|
|
47
|
+
* A copy of `v` for a call in one realm, as workerd's RPC makes it: a Request, Response or
|
|
48
|
+
* ReadableStream is passed itself (its body moves with it), Headers are copied, and anything
|
|
49
|
+
* else is structured-cloned.
|
|
50
|
+
*/
|
|
51
|
+
export declare function copyInRealm(v: unknown): unknown;
|
|
41
52
|
/**
|
|
42
53
|
* What crosses a stub, as in workerd: functions, `RpcTarget`s, stubs and class handles by
|
|
43
54
|
* reference (`ref` says what stands for one on the far side; in one realm, the value itself),
|
|
44
|
-
* arrays and plain objects walked, anything else
|
|
55
|
+
* arrays and plain objects walked, anything else copied (`copy`; in one realm, `copyInRealm`).
|
|
45
56
|
*/
|
|
46
57
|
export declare function cross<T>(v: T, ref?: (v: object) => unknown, copy?: (v: unknown) => unknown): T;
|
|
47
58
|
/**
|
|
@@ -77,6 +88,15 @@ export declare function asyncStub(call: (method: string, args: unknown[]) => unk
|
|
|
77
88
|
* of a plain object receive `(…args, env, ctx)`, as its `fetch` receives `(request, env, ctx)`.
|
|
78
89
|
*/
|
|
79
90
|
export declare function entrypointStub(target: unknown, env: unknown, props: unknown, exports?: unknown): Record<string, any>;
|
|
91
|
+
/** An event handler of a Worker's default export: `fetch(request, env, ctx)` and the like. */
|
|
92
|
+
export type DefaultHandler = (arg: unknown, env: unknown, ctx: object) => unknown;
|
|
93
|
+
/**
|
|
94
|
+
* The default export's handler for one event (`fetch`, `scheduled`, `queue`), or `undefined`.
|
|
95
|
+
* An object's method is called with `(arg, env, ctx)`. A class (`export default class extends
|
|
96
|
+
* WorkerEntrypoint`) gets a fresh instance per event, built with `(ctx, env)` (`ctx.props` empty),
|
|
97
|
+
* and its method is called with the event's argument alone, as on workerd.
|
|
98
|
+
*/
|
|
99
|
+
export declare function defaultHandler(def: unknown, name: string): DefaultHandler | undefined;
|
|
80
100
|
/**
|
|
81
101
|
* `ctx.exports`: loopback handles of a Worker's named exports. An entrypoint's (a
|
|
82
102
|
* WorkerEntrypoint class, or an object with methods) is a stub (`ctx.exports.Greeter.greet()`),
|
package/dist/core/handles.js
CHANGED
|
@@ -3,6 +3,11 @@ import { carryWebSocketHeaders } from "../ws/upgrade.js";
|
|
|
3
3
|
import { isRpcTarget, isWorkerEntrypoint } from "./durable-object.js";
|
|
4
4
|
/** Key of the isolate's class factory on a module facade (see getDurableObjectClass). */
|
|
5
5
|
export const ISOLATED = Symbol.for("cellb.isolated-classes");
|
|
6
|
+
/**
|
|
7
|
+
* On a loaded Worker's module whose isolate can end (`abortIsolate`): registers what to do when
|
|
8
|
+
* it does (the Worker Loader forgets the module, so the next `get()` loads the code again).
|
|
9
|
+
*/
|
|
10
|
+
export const ON_ABORT = Symbol.for("cellb.on-abort");
|
|
6
11
|
export function classHandle(resolve) {
|
|
7
12
|
return { __cellsClassHandle: true, resolve };
|
|
8
13
|
}
|
|
@@ -17,12 +22,31 @@ export const STUB = Symbol.for("cellb.stub");
|
|
|
17
22
|
export const REFUSE = Symbol.for("cellb.refuse");
|
|
18
23
|
/** Answered by a `ctx.exports.X({ props })` stub or class handle: `{ name, props }` (storable). */
|
|
19
24
|
export const EXPORT = Symbol.for("cellb.export");
|
|
25
|
+
// The realm's own classes (Worker code may see subclasses of them as its globals).
|
|
26
|
+
const NativeRequest = globalThis.Request;
|
|
27
|
+
const NativeResponse = globalThis.Response;
|
|
28
|
+
const NativeHeaders = globalThis.Headers;
|
|
29
|
+
const NativeReadableStream = globalThis.ReadableStream;
|
|
30
|
+
/**
|
|
31
|
+
* A copy of `v` for a call in one realm, as workerd's RPC makes it: a Request, Response or
|
|
32
|
+
* ReadableStream is passed itself (its body moves with it), Headers are copied, and anything
|
|
33
|
+
* else is structured-cloned.
|
|
34
|
+
*/
|
|
35
|
+
export function copyInRealm(v) {
|
|
36
|
+
if (v instanceof NativeHeaders)
|
|
37
|
+
return new Headers(v);
|
|
38
|
+
if (v instanceof NativeRequest ||
|
|
39
|
+
v instanceof NativeResponse ||
|
|
40
|
+
v instanceof NativeReadableStream)
|
|
41
|
+
return v;
|
|
42
|
+
return structuredClone(v);
|
|
43
|
+
}
|
|
20
44
|
/**
|
|
21
45
|
* What crosses a stub, as in workerd: functions, `RpcTarget`s, stubs and class handles by
|
|
22
46
|
* reference (`ref` says what stands for one on the far side; in one realm, the value itself),
|
|
23
|
-
* arrays and plain objects walked, anything else
|
|
47
|
+
* arrays and plain objects walked, anything else copied (`copy`; in one realm, `copyInRealm`).
|
|
24
48
|
*/
|
|
25
|
-
export function cross(v, ref = (x) => x, copy =
|
|
49
|
+
export function cross(v, ref = (x) => x, copy = copyInRealm) {
|
|
26
50
|
if (v === undefined || v === null || (typeof v !== "object" && typeof v !== "function"))
|
|
27
51
|
return copy(v);
|
|
28
52
|
const refused = v[REFUSE];
|
|
@@ -117,12 +141,15 @@ export function pipeTo(r, path, args) {
|
|
|
117
141
|
* `call` returns.
|
|
118
142
|
*/
|
|
119
143
|
export function asyncStub(call, fetch) {
|
|
120
|
-
|
|
144
|
+
const stub = new Proxy({}, {
|
|
121
145
|
get(_t, prop) {
|
|
122
146
|
if (prop === STUB)
|
|
123
147
|
return true;
|
|
124
148
|
if (prop === "then" || typeof prop === "symbol")
|
|
125
149
|
return undefined;
|
|
150
|
+
// workerd's `stub.dup()`: in one realm, a stub holds nothing to release, so it is itself.
|
|
151
|
+
if (prop === "dup")
|
|
152
|
+
return () => stub;
|
|
126
153
|
if (prop === "fetch")
|
|
127
154
|
return (input, init) => {
|
|
128
155
|
const req = new Request(input, init);
|
|
@@ -138,6 +165,7 @@ export function asyncStub(call, fetch) {
|
|
|
138
165
|
return (...args) => rpcCall(() => call(String(prop), cross(args)), cross);
|
|
139
166
|
},
|
|
140
167
|
});
|
|
168
|
+
return stub;
|
|
141
169
|
}
|
|
142
170
|
/**
|
|
143
171
|
* A stub of a WorkerEntrypoint (or a default export object): a fresh instance per call,
|
|
@@ -177,6 +205,24 @@ export function entrypointStub(target, env, props, exports) {
|
|
|
177
205
|
: instance.fetch(req, env, objectCtx());
|
|
178
206
|
});
|
|
179
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* The default export's handler for one event (`fetch`, `scheduled`, `queue`), or `undefined`.
|
|
210
|
+
* An object's method is called with `(arg, env, ctx)`. A class (`export default class extends
|
|
211
|
+
* WorkerEntrypoint`) gets a fresh instance per event, built with `(ctx, env)` (`ctx.props` empty),
|
|
212
|
+
* and its method is called with the event's argument alone, as on workerd.
|
|
213
|
+
*/
|
|
214
|
+
export function defaultHandler(def, name) {
|
|
215
|
+
if (typeof def === "function") {
|
|
216
|
+
if (typeof def.prototype?.[name] !== "function")
|
|
217
|
+
return undefined;
|
|
218
|
+
const Entry = def;
|
|
219
|
+
return (arg, env, ctx) => new Entry({ ...ctx, props: ctx.props ?? {} }, env)[name](arg);
|
|
220
|
+
}
|
|
221
|
+
const method = def?.[name];
|
|
222
|
+
if (typeof method !== "function")
|
|
223
|
+
return undefined;
|
|
224
|
+
return (arg, env, ctx) => method.call(def, arg, env, ctx);
|
|
225
|
+
}
|
|
180
226
|
/** workerd's refusal of `ctx.exports.<Entrypoint>` passed on without `({ props })`. */
|
|
181
227
|
const LOOPBACK = 'Could not serialize object of type "LoopbackServiceStub". This type does not support serialization.';
|
|
182
228
|
/**
|
package/dist/core/handles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handles.js","sourceRoot":"","sources":["../../src/core/handles.ts"],"names":[],"mappings":"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","sourcesContent":["import { deserialize, type HostObjects, serialize } from \"../v8/serialize.js\";\nimport { carryWebSocketHeaders } from \"../ws/upgrade.js\";\nimport { isRpcTarget, isWorkerEntrypoint } from \"./durable-object.js\";\nimport type { DurableObjectState } from \"./state.js\";\n\nexport type DurableObjectClass = new (ctx: DurableObjectState, env: any) => any;\n\n/**\n * A class handle — what `worker.getDurableObjectClass(name)` (Worker Loader) and\n * `ctx.exports.App` return, and what `ctx.facets.get(name, () => ({ class }))` accepts.\n * Resolution may be asynchronous (loaded code is compiled on first use).\n */\nexport interface ClassHandle {\n readonly __cellsClassHandle: true;\n resolve(): Promise<\n { cls: DurableObjectClass; env: unknown; props?: unknown } | { isolated: IsolatedClass }\n >;\n}\n\n/** Key of the isolate's class factory on a module facade (see getDurableObjectClass). */\nexport const ISOLATED = Symbol.for(\"cellb.isolated-classes\");\n\n/** A Durable Object class that runs in an isolate: its instances and storage live there. */\nexport interface IsolatedClass {\n fetch(cellKey: string, req: Request): Promise<Response>;\n call(cellKey: string, method: string, args: unknown[]): Promise<unknown>;\n restart(cellKey: string): Promise<void>;\n delete(cellKey: string): Promise<void>;\n /**\n * Tells the isolate which root epoch the facet's log is written under, and the name of the\n * `id` given to `ctx.facets.get` (the facet's `ctx.id.name`; none: the facet's cell key).\n */\n attach?(cellKey: string, epoch?: number, idName?: string): Promise<void>;\n}\n\nexport function classHandle(resolve: ClassHandle[\"resolve\"]): ClassHandle {\n return { __cellsClassHandle: true, resolve };\n}\n\nexport function isClassHandle(v: unknown): v is ClassHandle {\n return (\n !!v &&\n (typeof v === \"object\" || typeof v === \"function\") &&\n (v as ClassHandle).__cellsClassHandle === true\n );\n}\n\n/** Answered `true` by cellb's stubs: they cross by reference. */\nexport const STUB = Symbol.for(\"cellb.stub\");\n/** Answered by a value that may not cross, with workerd's reason. */\nexport const REFUSE = Symbol.for(\"cellb.refuse\");\n/** Answered by a `ctx.exports.X({ props })` stub or class handle: `{ name, props }` (storable). */\nexport const EXPORT = Symbol.for(\"cellb.export\");\n\n/**\n * What crosses a stub, as in workerd: functions, `RpcTarget`s, stubs and class handles by\n * reference (`ref` says what stands for one on the far side; in one realm, the value itself),\n * arrays and plain objects walked, anything else structured-cloned (`copy`).\n */\nexport function cross<T>(\n v: T,\n ref: (v: object) => unknown = (x) => x,\n copy: (v: unknown) => unknown = structuredClone,\n): T {\n if (v === undefined || v === null || (typeof v !== \"object\" && typeof v !== \"function\"))\n return copy(v) as T;\n const refused = (v as Record<symbol, unknown>)[REFUSE];\n if (typeof refused === \"string\") throw new DOMException(refused, \"DataCloneError\");\n if (\n typeof v === \"function\" ||\n isRpcTarget(v) ||\n (v as Record<symbol, unknown>)[STUB] === true ||\n isClassHandle(v)\n )\n return ref(v) as T;\n if (Array.isArray(v)) return v.map((x) => cross(x, ref, copy)) as T;\n if (Object.getPrototypeOf(v) === Object.prototype) {\n const out: Record<string, unknown> = {};\n for (const [k, x] of Object.entries(v)) out[k] = cross(x, ref, copy);\n return out as T;\n }\n return copy(v) as T;\n}\n\n/**\n * A value sent to an object on another node (cells-http, celld's tunnel), checked first: only\n * copies travel between nodes, so a function, `RpcTarget` or stub is refused, not sent as `{}`.\n */\nexport function toAnotherNode<T>(v: T): T {\n cross(\n v,\n () => {\n const e = new DOMException(\n \"Functions, RpcTargets and stubs cannot be sent to another node: they pass by reference only within one runtime.\",\n \"DataCloneError\",\n );\n // An own `name`, so it survives the error's trip back over the link.\n throw Object.defineProperty(e, \"name\", { value: e.name, enumerable: true });\n },\n (x) => x,\n );\n return v;\n}\n\n/** Where a call on an RpcPromise goes: the property path from its result, and the arguments. */\nexport type Pipe = (path: string[], args: unknown[]) => unknown;\n\nconst RPC_PROMISE = Symbol(\"cellb.rpc-promise\");\n\n/**\n * workerd's RpcPromise: what a call on a stub returns. It is awaited as a promise, and used\n * before it settles (promise pipelining): a property read gives the RpcPromise of that path,\n * and a call on a path goes through `pipe` at once, without waiting for `result`.\n */\nexport function rpcPromise(result: Promise<unknown>, pipe: Pipe): any {\n const at = (path: string[]): any => {\n let value: Promise<unknown> | undefined;\n // The result itself is a Promise-like object, not callable (node:assert calls a function\n // given to `rejects`); a property path is callable.\n return new Proxy(path.length ? () => {} : Object.create(Promise.prototype), {\n apply: (_t, _this, args) => rpcCall(() => pipe(path, args)),\n get(_t, prop) {\n if (prop === RPC_PROMISE) return true;\n if (prop === \"then\" || prop === \"catch\" || prop === \"finally\") {\n value ??= result.then((v) => path.reduce((o: any, k) => o[k], v));\n return value[prop].bind(value);\n }\n if (typeof prop === \"symbol\") return undefined;\n return at([...path, prop]);\n },\n });\n };\n return at([]);\n}\n\n/**\n * Runs a call and returns its result as an RpcPromise (`map` applies to the settled value);\n * calls on it go to the result: at once if the result is an RpcPromise itself, else once it\n * settles.\n */\nexport function rpcCall(call: () => unknown, map?: (v: unknown) => unknown): any {\n let r: unknown;\n try {\n r = call();\n } catch (e) {\n r = Promise.reject(e);\n }\n const result = Promise.resolve(r);\n return rpcPromise(map ? result.then(map) : result, (path, args) => pipeTo(r, path, args));\n}\n\n/** Calls `path` of `r` (a value, a promise of one, or an RpcPromise) with `args`. */\nexport function pipeTo(r: unknown, path: string[], args: unknown[]): unknown {\n const callAt = (v: any) => {\n if (!path.length) return v(...args);\n const receiver = path.slice(0, -1).reduce((o, k) => o[k], v);\n return receiver[path[path.length - 1]](...args);\n };\n return (r as Record<symbol, unknown>)?.[RPC_PROMISE]\n ? callAt(r)\n : Promise.resolve(r).then(callAt);\n}\n\n/**\n * A stub over an asynchronously obtained target: `fetch` and JS-RPC methods, arguments\n * and results crossing as between isolates. A method's result is an RpcPromise over what\n * `call` returns.\n */\nexport function asyncStub(\n call: (method: string, args: unknown[]) => unknown,\n fetch: (req: Request) => Promise<Response>,\n): Record<string, any> {\n return new Proxy(\n {},\n {\n get(_t, prop) {\n if (prop === STUB) return true;\n if (prop === \"then\" || typeof prop === \"symbol\") return undefined;\n if (prop === \"fetch\")\n return (input: RequestInfo | URL, init?: RequestInit) => {\n const req = new Request(input as RequestInfo, init);\n // A browser drops `Upgrade` and `Sec-WebSocket-*` from the copy: carried over, so a\n // WebSocket reaches a facet (partyserver forwards its upgrade request as it is).\n const from =\n init?.headers !== undefined\n ? new Headers(init.headers)\n : input instanceof Request\n ? input.headers\n : undefined;\n return fetch(from ? carryWebSocketHeaders(from, req) : req);\n };\n return (...args: unknown[]) => rpcCall(() => call(String(prop), cross(args)), cross);\n },\n },\n );\n}\n\n/**\n * A stub of a WorkerEntrypoint (or a default export object): a fresh instance per call,\n * as workerd creates one per request; `ctx.props` carries copied startup properties. Methods\n * of a plain object receive `(…args, env, ctx)`, as its `fetch` receives `(request, env, ctx)`.\n */\nexport function entrypointStub(\n target: unknown,\n env: unknown,\n props: unknown,\n exports?: unknown,\n): Record<string, any> {\n const objectCtx = () => ({\n waitUntil() {},\n passThroughOnException() {},\n props: cross(props ?? {}),\n });\n const make = () => {\n if (typeof target === \"function\") {\n const ctx = {\n props: cross(props ?? {}),\n exports,\n waitUntil() {},\n passThroughOnException() {},\n };\n return new (target as new (c: unknown, e: unknown) => any)(ctx, env);\n }\n return target as any;\n };\n return asyncStub(\n (method, args) => {\n const instance = make();\n const fn = instance?.[method];\n if (typeof fn !== \"function\")\n throw new TypeError(`The RPC receiver does not implement the method \"${method}\".`);\n return fn.apply(instance, typeof target === \"function\" ? args : [...args, env, objectCtx()]);\n },\n async (req) => {\n const instance = make();\n if (typeof instance?.fetch !== \"function\")\n throw new Error(\"Handler does not export a fetch() function.\");\n return typeof target === \"function\"\n ? instance.fetch(req)\n : instance.fetch(req, env, objectCtx());\n },\n );\n}\n\n/** workerd's refusal of `ctx.exports.<Entrypoint>` passed on without `({ props })`. */\nconst LOOPBACK =\n 'Could not serialize object of type \"LoopbackServiceStub\". This type does not support serialization.';\n\n/**\n * `ctx.exports`: loopback handles of a Worker's named exports. An entrypoint's (a\n * WorkerEntrypoint class, or an object with methods) is a stub (`ctx.exports.Greeter.greet()`),\n * and called with `{ props }` gives one with props; a Durable Object class's is a facet class\n * handle, also callable with `{ props }`.\n */\nexport function ctxExports(worker: Record<string, unknown>, env: unknown): Record<string, unknown> {\n const exports: Record<string, unknown> = {};\n for (const [name, value] of Object.entries(worker)) {\n if (name === \"default\" || !value || (typeof value !== \"function\" && typeof value !== \"object\"))\n continue;\n if (typeof value === \"object\" || isWorkerEntrypoint(value)) {\n const withProps = (o: { props?: unknown } = {}) => {\n const stub = entrypointStub(value, env, o.props, exports);\n return new Proxy(stub, {\n get: (t, prop) => (prop === EXPORT ? { name, props: o.props } : t[prop as string]),\n });\n };\n const stub = withProps();\n exports[name] = new Proxy(withProps, {\n get: (_t, prop) => (prop === REFUSE ? LOOPBACK : stub[prop as string]),\n });\n } else {\n const handle = (o: { props?: unknown } = {}) =>\n Object.assign(\n classHandle(async () => ({ cls: value as DurableObjectClass, env, props: o.props })),\n { [EXPORT]: { name, props: o.props } },\n );\n exports[name] = Object.assign(\n handle,\n classHandle(async () => ({ cls: value as DurableObjectClass, env })),\n );\n }\n }\n return exports;\n}\n\n/**\n * Stubs in Durable Object storage (workerd's `allow_irrevocable_stub_storage`), as V8 host\n * objects: a `ctx.exports.X({ props })` stub or class handle is stored as `[name, props]` and\n * read back as `ctx.exports[name]({ props })`. Other stubs and `RpcTarget`s are refused rather\n * than stored as `{}`.\n */\nexport function storedExports(exports: Record<string, unknown>): HostObjects {\n const host: HostObjects = {\n encode(v) {\n const e = (v as Record<symbol, { name: string; props: unknown } | undefined>)[EXPORT];\n if (e) return serialize([e.name, e.props], host);\n if ((v as Record<symbol, unknown>)[STUB] === true || isRpcTarget(v))\n throw new DOMException(\n \"Only ctx.exports.<name>({ props }) stubs and class handles can be stored.\",\n \"DataCloneError\",\n );\n return undefined;\n },\n decode(bytes) {\n const [name, props] = deserialize(bytes, host) as [string, unknown];\n return (exports[name] as (o: { props: unknown }) => unknown)({ props });\n },\n };\n return host;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"handles.js","sourceRoot":"","sources":["../../src/core/handles.ts"],"names":[],"mappings":"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","sourcesContent":["import { deserialize, type HostObjects, serialize } from \"../v8/serialize.js\";\nimport { carryWebSocketHeaders } from \"../ws/upgrade.js\";\nimport { isRpcTarget, isWorkerEntrypoint } from \"./durable-object.js\";\nimport type { DurableObjectState } from \"./state.js\";\n\nexport type DurableObjectClass = new (ctx: DurableObjectState, env: any) => any;\n\n/**\n * A class handle — what `worker.getDurableObjectClass(name)` (Worker Loader) and\n * `ctx.exports.App` return, and what `ctx.facets.get(name, () => ({ class }))` accepts.\n * Resolution may be asynchronous (loaded code is compiled on first use).\n */\nexport interface ClassHandle {\n readonly __cellsClassHandle: true;\n resolve(): Promise<\n { cls: DurableObjectClass; env: unknown; props?: unknown } | { isolated: IsolatedClass }\n >;\n}\n\n/** Key of the isolate's class factory on a module facade (see getDurableObjectClass). */\nexport const ISOLATED = Symbol.for(\"cellb.isolated-classes\");\n/**\n * On a loaded Worker's module whose isolate can end (`abortIsolate`): registers what to do when\n * it does (the Worker Loader forgets the module, so the next `get()` loads the code again).\n */\nexport const ON_ABORT = Symbol.for(\"cellb.on-abort\");\n\n/** A Durable Object class that runs in an isolate: its instances and storage live there. */\nexport interface IsolatedClass {\n fetch(cellKey: string, req: Request): Promise<Response>;\n call(cellKey: string, method: string, args: unknown[]): Promise<unknown>;\n restart(cellKey: string): Promise<void>;\n delete(cellKey: string): Promise<void>;\n /**\n * Tells the isolate which root epoch the facet's log is written under, and the name of the\n * `id` given to `ctx.facets.get` (the facet's `ctx.id.name`; none: the facet's cell key).\n */\n attach?(cellKey: string, epoch?: number, idName?: string): Promise<void>;\n}\n\nexport function classHandle(resolve: ClassHandle[\"resolve\"]): ClassHandle {\n return { __cellsClassHandle: true, resolve };\n}\n\nexport function isClassHandle(v: unknown): v is ClassHandle {\n return (\n !!v &&\n (typeof v === \"object\" || typeof v === \"function\") &&\n (v as ClassHandle).__cellsClassHandle === true\n );\n}\n\n/** Answered `true` by cellb's stubs: they cross by reference. */\nexport const STUB = Symbol.for(\"cellb.stub\");\n/** Answered by a value that may not cross, with workerd's reason. */\nexport const REFUSE = Symbol.for(\"cellb.refuse\");\n/** Answered by a `ctx.exports.X({ props })` stub or class handle: `{ name, props }` (storable). */\nexport const EXPORT = Symbol.for(\"cellb.export\");\n\n// The realm's own classes (Worker code may see subclasses of them as its globals).\nconst NativeRequest = globalThis.Request;\nconst NativeResponse = globalThis.Response;\nconst NativeHeaders = globalThis.Headers;\nconst NativeReadableStream = globalThis.ReadableStream;\n\n/**\n * A copy of `v` for a call in one realm, as workerd's RPC makes it: a Request, Response or\n * ReadableStream is passed itself (its body moves with it), Headers are copied, and anything\n * else is structured-cloned.\n */\nexport function copyInRealm(v: unknown): unknown {\n if (v instanceof NativeHeaders) return new Headers(v);\n if (\n v instanceof NativeRequest ||\n v instanceof NativeResponse ||\n v instanceof NativeReadableStream\n )\n return v;\n return structuredClone(v);\n}\n\n/**\n * What crosses a stub, as in workerd: functions, `RpcTarget`s, stubs and class handles by\n * reference (`ref` says what stands for one on the far side; in one realm, the value itself),\n * arrays and plain objects walked, anything else copied (`copy`; in one realm, `copyInRealm`).\n */\nexport function cross<T>(\n v: T,\n ref: (v: object) => unknown = (x) => x,\n copy: (v: unknown) => unknown = copyInRealm,\n): T {\n if (v === undefined || v === null || (typeof v !== \"object\" && typeof v !== \"function\"))\n return copy(v) as T;\n const refused = (v as Record<symbol, unknown>)[REFUSE];\n if (typeof refused === \"string\") throw new DOMException(refused, \"DataCloneError\");\n if (\n typeof v === \"function\" ||\n isRpcTarget(v) ||\n (v as Record<symbol, unknown>)[STUB] === true ||\n isClassHandle(v)\n )\n return ref(v) as T;\n if (Array.isArray(v)) return v.map((x) => cross(x, ref, copy)) as T;\n if (Object.getPrototypeOf(v) === Object.prototype) {\n const out: Record<string, unknown> = {};\n for (const [k, x] of Object.entries(v)) out[k] = cross(x, ref, copy);\n return out as T;\n }\n return copy(v) as T;\n}\n\n/**\n * A value sent to an object on another node (cells-http, celld's tunnel), checked first: only\n * copies travel between nodes, so a function, `RpcTarget` or stub is refused, not sent as `{}`.\n */\nexport function toAnotherNode<T>(v: T): T {\n cross(\n v,\n () => {\n const e = new DOMException(\n \"Functions, RpcTargets and stubs cannot be sent to another node: they pass by reference only within one runtime.\",\n \"DataCloneError\",\n );\n // An own `name`, so it survives the error's trip back over the link.\n throw Object.defineProperty(e, \"name\", { value: e.name, enumerable: true });\n },\n (x) => x,\n );\n return v;\n}\n\n/** Where a call on an RpcPromise goes: the property path from its result, and the arguments. */\nexport type Pipe = (path: string[], args: unknown[]) => unknown;\n\nconst RPC_PROMISE = Symbol(\"cellb.rpc-promise\");\n\n/**\n * workerd's RpcPromise: what a call on a stub returns. It is awaited as a promise, and used\n * before it settles (promise pipelining): a property read gives the RpcPromise of that path,\n * and a call on a path goes through `pipe` at once, without waiting for `result`.\n */\nexport function rpcPromise(result: Promise<unknown>, pipe: Pipe): any {\n const at = (path: string[]): any => {\n let value: Promise<unknown> | undefined;\n // The result itself is a Promise-like object, not callable (node:assert calls a function\n // given to `rejects`); a property path is callable.\n return new Proxy(path.length ? () => {} : Object.create(Promise.prototype), {\n apply: (_t, _this, args) => rpcCall(() => pipe(path, args)),\n get(_t, prop) {\n if (prop === RPC_PROMISE) return true;\n if (prop === \"then\" || prop === \"catch\" || prop === \"finally\") {\n value ??= result.then((v) => path.reduce((o: any, k) => o[k], v));\n return value[prop].bind(value);\n }\n if (typeof prop === \"symbol\") return undefined;\n return at([...path, prop]);\n },\n });\n };\n return at([]);\n}\n\n/**\n * Runs a call and returns its result as an RpcPromise (`map` applies to the settled value);\n * calls on it go to the result: at once if the result is an RpcPromise itself, else once it\n * settles.\n */\nexport function rpcCall(call: () => unknown, map?: (v: unknown) => unknown): any {\n let r: unknown;\n try {\n r = call();\n } catch (e) {\n r = Promise.reject(e);\n }\n const result = Promise.resolve(r);\n return rpcPromise(map ? result.then(map) : result, (path, args) => pipeTo(r, path, args));\n}\n\n/** Calls `path` of `r` (a value, a promise of one, or an RpcPromise) with `args`. */\nexport function pipeTo(r: unknown, path: string[], args: unknown[]): unknown {\n const callAt = (v: any) => {\n if (!path.length) return v(...args);\n const receiver = path.slice(0, -1).reduce((o, k) => o[k], v);\n return receiver[path[path.length - 1]](...args);\n };\n return (r as Record<symbol, unknown>)?.[RPC_PROMISE]\n ? callAt(r)\n : Promise.resolve(r).then(callAt);\n}\n\n/**\n * A stub over an asynchronously obtained target: `fetch` and JS-RPC methods, arguments\n * and results crossing as between isolates. A method's result is an RpcPromise over what\n * `call` returns.\n */\nexport function asyncStub(\n call: (method: string, args: unknown[]) => unknown,\n fetch: (req: Request) => Promise<Response>,\n): Record<string, any> {\n const stub: Record<string, any> = new Proxy(\n {},\n {\n get(_t, prop) {\n if (prop === STUB) return true;\n if (prop === \"then\" || typeof prop === \"symbol\") return undefined;\n // workerd's `stub.dup()`: in one realm, a stub holds nothing to release, so it is itself.\n if (prop === \"dup\") return () => stub;\n if (prop === \"fetch\")\n return (input: RequestInfo | URL, init?: RequestInit) => {\n const req = new Request(input as RequestInfo, init);\n // A browser drops `Upgrade` and `Sec-WebSocket-*` from the copy: carried over, so a\n // WebSocket reaches a facet (partyserver forwards its upgrade request as it is).\n const from =\n init?.headers !== undefined\n ? new Headers(init.headers)\n : input instanceof Request\n ? input.headers\n : undefined;\n return fetch(from ? carryWebSocketHeaders(from, req) : req);\n };\n return (...args: unknown[]) => rpcCall(() => call(String(prop), cross(args)), cross);\n },\n },\n );\n return stub;\n}\n\n/**\n * A stub of a WorkerEntrypoint (or a default export object): a fresh instance per call,\n * as workerd creates one per request; `ctx.props` carries copied startup properties. Methods\n * of a plain object receive `(…args, env, ctx)`, as its `fetch` receives `(request, env, ctx)`.\n */\nexport function entrypointStub(\n target: unknown,\n env: unknown,\n props: unknown,\n exports?: unknown,\n): Record<string, any> {\n const objectCtx = () => ({\n waitUntil() {},\n passThroughOnException() {},\n props: cross(props ?? {}),\n });\n const make = () => {\n if (typeof target === \"function\") {\n const ctx = {\n props: cross(props ?? {}),\n exports,\n waitUntil() {},\n passThroughOnException() {},\n };\n return new (target as new (c: unknown, e: unknown) => any)(ctx, env);\n }\n return target as any;\n };\n return asyncStub(\n (method, args) => {\n const instance = make();\n const fn = instance?.[method];\n if (typeof fn !== \"function\")\n throw new TypeError(`The RPC receiver does not implement the method \"${method}\".`);\n return fn.apply(instance, typeof target === \"function\" ? args : [...args, env, objectCtx()]);\n },\n async (req) => {\n const instance = make();\n if (typeof instance?.fetch !== \"function\")\n throw new Error(\"Handler does not export a fetch() function.\");\n return typeof target === \"function\"\n ? instance.fetch(req)\n : instance.fetch(req, env, objectCtx());\n },\n );\n}\n\n/** An event handler of a Worker's default export: `fetch(request, env, ctx)` and the like. */\nexport type DefaultHandler = (arg: unknown, env: unknown, ctx: object) => unknown;\n\n/**\n * The default export's handler for one event (`fetch`, `scheduled`, `queue`), or `undefined`.\n * An object's method is called with `(arg, env, ctx)`. A class (`export default class extends\n * WorkerEntrypoint`) gets a fresh instance per event, built with `(ctx, env)` (`ctx.props` empty),\n * and its method is called with the event's argument alone, as on workerd.\n */\nexport function defaultHandler(def: unknown, name: string): DefaultHandler | undefined {\n if (typeof def === \"function\") {\n if (typeof def.prototype?.[name] !== \"function\") return undefined;\n const Entry = def as new (ctx: object, env: unknown) => Record<string, (a: unknown) => unknown>;\n return (arg, env, ctx) =>\n new Entry({ ...ctx, props: (ctx as { props?: unknown }).props ?? {} }, env)[name](arg);\n }\n const method = (def as Record<string, unknown> | null | undefined)?.[name];\n if (typeof method !== \"function\") return undefined;\n return (arg, env, ctx) => method.call(def, arg, env, ctx);\n}\n\n/** workerd's refusal of `ctx.exports.<Entrypoint>` passed on without `({ props })`. */\nconst LOOPBACK =\n 'Could not serialize object of type \"LoopbackServiceStub\". This type does not support serialization.';\n\n/**\n * `ctx.exports`: loopback handles of a Worker's named exports. An entrypoint's (a\n * WorkerEntrypoint class, or an object with methods) is a stub (`ctx.exports.Greeter.greet()`),\n * and called with `{ props }` gives one with props; a Durable Object class's is a facet class\n * handle, also callable with `{ props }`.\n */\nexport function ctxExports(worker: Record<string, unknown>, env: unknown): Record<string, unknown> {\n const exports: Record<string, unknown> = {};\n for (const [name, value] of Object.entries(worker)) {\n if (name === \"default\" || !value || (typeof value !== \"function\" && typeof value !== \"object\"))\n continue;\n if (typeof value === \"object\" || isWorkerEntrypoint(value)) {\n const withProps = (o: { props?: unknown } = {}) => {\n const stub = entrypointStub(value, env, o.props, exports);\n return new Proxy(stub, {\n get: (t, prop) => (prop === EXPORT ? { name, props: o.props } : t[prop as string]),\n });\n };\n const stub = withProps();\n exports[name] = new Proxy(withProps, {\n get: (_t, prop) => (prop === REFUSE ? LOOPBACK : stub[prop as string]),\n });\n } else {\n const handle = (o: { props?: unknown } = {}) =>\n Object.assign(\n classHandle(async () => ({ cls: value as DurableObjectClass, env, props: o.props })),\n { [EXPORT]: { name, props: o.props } },\n );\n exports[name] = Object.assign(\n handle,\n classHandle(async () => ({ cls: value as DurableObjectClass, env })),\n );\n }\n }\n return exports;\n}\n\n/**\n * Stubs in Durable Object storage (workerd's `allow_irrevocable_stub_storage`), as V8 host\n * objects: a `ctx.exports.X({ props })` stub or class handle is stored as `[name, props]` and\n * read back as `ctx.exports[name]({ props })`. Other stubs and `RpcTarget`s are refused rather\n * than stored as `{}`.\n */\nexport function storedExports(exports: Record<string, unknown>): HostObjects {\n const host: HostObjects = {\n encode(v) {\n const e = (v as Record<symbol, { name: string; props: unknown } | undefined>)[EXPORT];\n if (e) return serialize([e.name, e.props], host);\n if ((v as Record<symbol, unknown>)[STUB] === true || isRpcTarget(v))\n throw new DOMException(\n \"Only ctx.exports.<name>({ props }) stubs and class handles can be stored.\",\n \"DataCloneError\",\n );\n return undefined;\n },\n decode(bytes) {\n const [name, props] = deserialize(bytes, host) as [string, unknown];\n return (exports[name] as (o: { props: unknown }) => unknown)({ props });\n },\n };\n return host;\n}\n"]}
|
package/dist/core/namespace.js
CHANGED
|
@@ -129,7 +129,7 @@ function createStub(id, endpoint) {
|
|
|
129
129
|
return endpoint().fetch(source ? carryWebSocketHeaders(source, req) : req);
|
|
130
130
|
},
|
|
131
131
|
});
|
|
132
|
-
|
|
132
|
+
const stub = new Proxy(target, {
|
|
133
133
|
get(t, prop, recv) {
|
|
134
134
|
if (prop in t)
|
|
135
135
|
return Reflect.get(t, prop, recv);
|
|
@@ -138,5 +138,8 @@ function createStub(id, endpoint) {
|
|
|
138
138
|
return (...args) => rpcCall(() => endpoint().call(String(prop), args));
|
|
139
139
|
},
|
|
140
140
|
});
|
|
141
|
+
// workerd's `stub.dup()`: a Durable Object stub holds nothing to release, so it is itself.
|
|
142
|
+
Object.defineProperty(target, "dup", { value: () => stub });
|
|
143
|
+
return stub;
|
|
141
144
|
}
|
|
142
145
|
//# sourceMappingURL=namespace.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/core/namespace.ts"],"names":[],"mappings":"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","sourcesContent":["import { carryWebSocketHeaders } from \"../ws/upgrade.js\";\nimport { cross, rpcCall, STUB } from \"./handles.js\";\nimport { type DurableObjectId, idFromName, newUniqueId, validateId } from \"./id.js\";\nimport { closingWith, type ObjectHost } from \"./object-host.js\";\nimport type { DurableObjectState } from \"./state.js\";\n\n/** What a stub talks to: a local ObjectHost or a remote cell host behind a port. */\nexport interface ObjectEndpoint {\n fetch(req: Request): Promise<Response>;\n call(method: string, args: unknown[]): Promise<unknown>;\n /** Present only for in-process objects (enables runInDurableObject). */\n local?: ObjectHost;\n}\n\n/**\n * An in-process object. `ready` (for a cell not open yet): a promise its first events await\n * before the host opens the cell's database (its store is making room), or undefined.\n */\nexport function localEndpoint(\n host: () => ObjectHost,\n ready?: () => Promise<void> | undefined,\n): () => ObjectEndpoint {\n return () => {\n const wait = ready?.();\n if (!wait) return endpointOf(host());\n return {\n get local() {\n return host();\n },\n fetch: async (req) => {\n await wait;\n return endpointOf(host()).fetch(req);\n },\n call: async (method, args) => {\n const copied = cross(args); // the arguments as they are now, as for an open cell\n await wait;\n return deliverCall(host(), method, copied);\n },\n };\n };\n}\n\nfunction endpointOf(h: ObjectHost): ObjectEndpoint {\n return {\n local: h,\n fetch: (req) =>\n h.deliver(async (obj) => {\n if (typeof obj.fetch !== \"function\")\n throw new Error(\"Handler does not export a fetch() function.\");\n let res: Response;\n try {\n const r = await obj.fetch(closingWith(req, h.closing));\n res = r instanceof Response ? r : new Response(String(r)); // a non-Response is sent as text (celld)\n } catch (e) {\n // celld: the stub's fetch() rejects with \"rejected: <name>: <message> [at …]\".\n const err = e as Error;\n throw new Error(`rejected: ${err?.name ?? \"Error\"}: ${err?.message ?? String(e)}`, {\n cause: e,\n });\n }\n // A WebSocket answer to a request that did not ask for one fails (workerd, celld):\n // the stub rejects and the server end sees an abnormal close.\n const ws = (res as { webSocket?: unknown }).webSocket;\n if (res.status === 101 && ws && req.headers.get(\"upgrade\")?.toLowerCase() !== \"websocket\")\n throw new Error(\n \"rejected: Error: a WebSocket response to a request without Upgrade: websocket\",\n );\n return res;\n }),\n call: async (method, args) => deliverCall(h, method, cross(args)),\n };\n}\n\nasync function deliverCall(h: ObjectHost, method: string, copied: unknown[]): Promise<unknown> {\n const r = await h.deliver((obj) => {\n const m = obj[method];\n if (typeof m !== \"function\") throw new TypeError(`${method} is not a function`); // celld's wording\n return m.apply(obj, copied);\n });\n return cross(r);\n}\n\nexport class DurableObjectNamespace {\n readonly #key: string;\n readonly #endpoint: (id: DurableObjectId) => () => ObjectEndpoint;\n\n constructor(namespaceKey: string, endpoint: (id: DurableObjectId) => () => ObjectEndpoint) {\n this.#key = namespaceKey;\n this.#endpoint = endpoint;\n }\n idFromName(name: string): DurableObjectId {\n return idFromName(this.#key, name);\n }\n newUniqueId(opts?: { jurisdiction?: string }): DurableObjectId {\n if (opts?.jurisdiction != null)\n throw new Error(\"Jurisdiction restrictions are not implemented\");\n return newUniqueId(this.#key);\n }\n idFromString(hex: string): DurableObjectId {\n return validateId(this.#key, hex);\n }\n /** The key ids of this namespace derive from (see id.ts). */\n get namespaceKey(): string {\n return this.#key;\n }\n get(id: DurableObjectId): DurableObjectStub {\n return createStub(id, this.#endpoint(id));\n }\n getByName(name: string): DurableObjectStub {\n return this.get(this.idFromName(name));\n }\n}\n\nexport type DurableObjectStub = {\n readonly id: DurableObjectId;\n readonly name?: string;\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;\n} & Record<string, any>;\n\nconst kEndpoint = Symbol(\"cellb.endpoint\");\n\n/**\n * Test hook (same idea as vitest-pool-workers' runInDurableObject): runs `fn`\n * inside a LOCAL object, through the input/output gates, without cloning `fn`.\n */\nexport function runInDurableObject<T>(\n stub: DurableObjectStub,\n fn: (instance: any, state: DurableObjectState) => T | Promise<T>,\n): Promise<T> {\n const ep = (stub as any)[kEndpoint] as (() => ObjectEndpoint) | undefined;\n const local = ep?.().local;\n if (!local) throw new TypeError(\"runInDurableObject needs a stub of an in-process cellb object\");\n return local.deliver(fn);\n}\n\n/** Stub = Proxy: `fetch` → fetch handler, any other property → JS-RPC call (an RpcPromise). */\nfunction createStub(id: DurableObjectId, endpoint: () => ObjectEndpoint): DurableObjectStub {\n const target = { id, name: id.name };\n // Only id and name are own enumerable keys, as in workerd and celld: Object.keys(stub) is\n // [id, name], and two stubs of one object are deep-equal.\n Object.defineProperty(target, kEndpoint, { value: endpoint });\n Object.defineProperty(target, STUB, { value: true });\n Object.defineProperty(target, \"fetch\", {\n value(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const req = new Request(input as any, init);\n // Cloudflare's `cf` request property (RequestInit.cf or Request#cf) is not part of\n // the Fetch standard: re-attach it so objects can read `request.cf`.\n const cf = (init as { cf?: unknown } | undefined)?.cf ?? (input as { cf?: unknown }).cf;\n if (cf !== undefined) Object.defineProperty(req, \"cf\", { value: cf, enumerable: true });\n // Keep a WebSocket upgrade that browsers strip from new Request() (forbidden headers).\n const source = init?.headers\n ? new Headers(init.headers)\n : input instanceof Request\n ? input.headers\n : undefined;\n return endpoint().fetch(source ? carryWebSocketHeaders(source, req) : req);\n },\n });\n return new Proxy(target, {\n get(t, prop, recv) {\n if (prop in t) return Reflect.get(t, prop, recv);\n if (prop === \"then\" || typeof prop === \"symbol\") return undefined;\n return (...args: unknown[]) => rpcCall(() => endpoint().call(String(prop), args));\n },\n }) as unknown as DurableObjectStub;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/core/namespace.ts"],"names":[],"mappings":"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","sourcesContent":["import { carryWebSocketHeaders } from \"../ws/upgrade.js\";\nimport { cross, rpcCall, STUB } from \"./handles.js\";\nimport { type DurableObjectId, idFromName, newUniqueId, validateId } from \"./id.js\";\nimport { closingWith, type ObjectHost } from \"./object-host.js\";\nimport type { DurableObjectState } from \"./state.js\";\n\n/** What a stub talks to: a local ObjectHost or a remote cell host behind a port. */\nexport interface ObjectEndpoint {\n fetch(req: Request): Promise<Response>;\n call(method: string, args: unknown[]): Promise<unknown>;\n /** Present only for in-process objects (enables runInDurableObject). */\n local?: ObjectHost;\n}\n\n/**\n * An in-process object. `ready` (for a cell not open yet): a promise its first events await\n * before the host opens the cell's database (its store is making room), or undefined.\n */\nexport function localEndpoint(\n host: () => ObjectHost,\n ready?: () => Promise<void> | undefined,\n): () => ObjectEndpoint {\n return () => {\n const wait = ready?.();\n if (!wait) return endpointOf(host());\n return {\n get local() {\n return host();\n },\n fetch: async (req) => {\n await wait;\n return endpointOf(host()).fetch(req);\n },\n call: async (method, args) => {\n const copied = cross(args); // the arguments as they are now, as for an open cell\n await wait;\n return deliverCall(host(), method, copied);\n },\n };\n };\n}\n\nfunction endpointOf(h: ObjectHost): ObjectEndpoint {\n return {\n local: h,\n fetch: (req) =>\n h.deliver(async (obj) => {\n if (typeof obj.fetch !== \"function\")\n throw new Error(\"Handler does not export a fetch() function.\");\n let res: Response;\n try {\n const r = await obj.fetch(closingWith(req, h.closing));\n res = r instanceof Response ? r : new Response(String(r)); // a non-Response is sent as text (celld)\n } catch (e) {\n // celld: the stub's fetch() rejects with \"rejected: <name>: <message> [at …]\".\n const err = e as Error;\n throw new Error(`rejected: ${err?.name ?? \"Error\"}: ${err?.message ?? String(e)}`, {\n cause: e,\n });\n }\n // A WebSocket answer to a request that did not ask for one fails (workerd, celld):\n // the stub rejects and the server end sees an abnormal close.\n const ws = (res as { webSocket?: unknown }).webSocket;\n if (res.status === 101 && ws && req.headers.get(\"upgrade\")?.toLowerCase() !== \"websocket\")\n throw new Error(\n \"rejected: Error: a WebSocket response to a request without Upgrade: websocket\",\n );\n return res;\n }),\n call: async (method, args) => deliverCall(h, method, cross(args)),\n };\n}\n\nasync function deliverCall(h: ObjectHost, method: string, copied: unknown[]): Promise<unknown> {\n const r = await h.deliver((obj) => {\n const m = obj[method];\n if (typeof m !== \"function\") throw new TypeError(`${method} is not a function`); // celld's wording\n return m.apply(obj, copied);\n });\n return cross(r);\n}\n\nexport class DurableObjectNamespace {\n readonly #key: string;\n readonly #endpoint: (id: DurableObjectId) => () => ObjectEndpoint;\n\n constructor(namespaceKey: string, endpoint: (id: DurableObjectId) => () => ObjectEndpoint) {\n this.#key = namespaceKey;\n this.#endpoint = endpoint;\n }\n idFromName(name: string): DurableObjectId {\n return idFromName(this.#key, name);\n }\n newUniqueId(opts?: { jurisdiction?: string }): DurableObjectId {\n if (opts?.jurisdiction != null)\n throw new Error(\"Jurisdiction restrictions are not implemented\");\n return newUniqueId(this.#key);\n }\n idFromString(hex: string): DurableObjectId {\n return validateId(this.#key, hex);\n }\n /** The key ids of this namespace derive from (see id.ts). */\n get namespaceKey(): string {\n return this.#key;\n }\n get(id: DurableObjectId): DurableObjectStub {\n return createStub(id, this.#endpoint(id));\n }\n getByName(name: string): DurableObjectStub {\n return this.get(this.idFromName(name));\n }\n}\n\nexport type DurableObjectStub = {\n readonly id: DurableObjectId;\n readonly name?: string;\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;\n} & Record<string, any>;\n\nconst kEndpoint = Symbol(\"cellb.endpoint\");\n\n/**\n * Test hook (same idea as vitest-pool-workers' runInDurableObject): runs `fn`\n * inside a LOCAL object, through the input/output gates, without cloning `fn`.\n */\nexport function runInDurableObject<T>(\n stub: DurableObjectStub,\n fn: (instance: any, state: DurableObjectState) => T | Promise<T>,\n): Promise<T> {\n const ep = (stub as any)[kEndpoint] as (() => ObjectEndpoint) | undefined;\n const local = ep?.().local;\n if (!local) throw new TypeError(\"runInDurableObject needs a stub of an in-process cellb object\");\n return local.deliver(fn);\n}\n\n/** Stub = Proxy: `fetch` → fetch handler, any other property → JS-RPC call (an RpcPromise). */\nfunction createStub(id: DurableObjectId, endpoint: () => ObjectEndpoint): DurableObjectStub {\n const target = { id, name: id.name };\n // Only id and name are own enumerable keys, as in workerd and celld: Object.keys(stub) is\n // [id, name], and two stubs of one object are deep-equal.\n Object.defineProperty(target, kEndpoint, { value: endpoint });\n Object.defineProperty(target, STUB, { value: true });\n Object.defineProperty(target, \"fetch\", {\n value(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const req = new Request(input as any, init);\n // Cloudflare's `cf` request property (RequestInit.cf or Request#cf) is not part of\n // the Fetch standard: re-attach it so objects can read `request.cf`.\n const cf = (init as { cf?: unknown } | undefined)?.cf ?? (input as { cf?: unknown }).cf;\n if (cf !== undefined) Object.defineProperty(req, \"cf\", { value: cf, enumerable: true });\n // Keep a WebSocket upgrade that browsers strip from new Request() (forbidden headers).\n const source = init?.headers\n ? new Headers(init.headers)\n : input instanceof Request\n ? input.headers\n : undefined;\n return endpoint().fetch(source ? carryWebSocketHeaders(source, req) : req);\n },\n });\n const stub = new Proxy(target, {\n get(t, prop, recv) {\n if (prop in t) return Reflect.get(t, prop, recv);\n if (prop === \"then\" || typeof prop === \"symbol\") return undefined;\n return (...args: unknown[]) => rpcCall(() => endpoint().call(String(prop), args));\n },\n }) as unknown as DurableObjectStub;\n // workerd's `stub.dup()`: a Durable Object stub holds nothing to release, so it is itself.\n Object.defineProperty(target, \"dup\", { value: () => stub });\n return stub;\n}\n"]}
|
package/dist/core/runtime.d.ts
CHANGED
|
@@ -5,8 +5,16 @@ import { DurableObjectId } from "./id.js";
|
|
|
5
5
|
import { type ObjectEndpoint } from "./namespace.js";
|
|
6
6
|
import { type RejectionHandler } from "./worker-rejections.js";
|
|
7
7
|
export interface WorkerModule {
|
|
8
|
+
/**
|
|
9
|
+
* An object with handlers (`fetch(req, env, ctx)`), or a class (`export default class extends
|
|
10
|
+
* WorkerEntrypoint`): an instance per request, built with `(ctx, env)`, whose `fetch(req)`
|
|
11
|
+
* answers. A class matches through its `prototype`, so `default.fetch` stays readable.
|
|
12
|
+
*/
|
|
8
13
|
default: {
|
|
9
14
|
fetch?(req: Request, env: any, ctx: ExecutionContext): Response | Promise<Response>;
|
|
15
|
+
prototype?: {
|
|
16
|
+
fetch?(req: Request): Response | Promise<Response>;
|
|
17
|
+
};
|
|
10
18
|
};
|
|
11
19
|
[exportName: string]: unknown;
|
|
12
20
|
}
|
package/dist/core/runtime.js
CHANGED
|
@@ -5,7 +5,7 @@ import { takeClientPort } from "../ws/server.js";
|
|
|
5
5
|
import { withUpgrade } from "../ws/upgrade.js";
|
|
6
6
|
import { AlarmScheduler } from "./alarms.js";
|
|
7
7
|
import { asyncRoot } from "./async-context.js";
|
|
8
|
-
import { ctxExports, storedExports } from "./handles.js";
|
|
8
|
+
import { ctxExports, defaultHandler, storedExports } from "./handles.js";
|
|
9
9
|
import { DurableObjectId, namespaceKey } from "./id.js";
|
|
10
10
|
import { DurableObjectNamespace, localEndpoint } from "./namespace.js";
|
|
11
11
|
import { CellOwnedElsewhereError, closingWith, ObjectClosedError, ObjectHost, } from "./object-host.js";
|
|
@@ -354,7 +354,7 @@ export function createCellRuntime(opts) {
|
|
|
354
354
|
await storage.close?.();
|
|
355
355
|
},
|
|
356
356
|
async fetch(req) {
|
|
357
|
-
const handler = opts.worker.default
|
|
357
|
+
const handler = defaultHandler(opts.worker.default, "fetch");
|
|
358
358
|
if (!handler)
|
|
359
359
|
return new Response("Worker has no fetch handler", { status: 500 });
|
|
360
360
|
// A closed runtime serves nothing: its cells are closed, or another runtime's now.
|
|
@@ -371,7 +371,7 @@ export function createCellRuntime(opts) {
|
|
|
371
371
|
if (req.cf === undefined)
|
|
372
372
|
Object.defineProperty(req, "cf", { value: {}, enumerable: true });
|
|
373
373
|
try {
|
|
374
|
-
const r = await rejections(() => handler
|
|
374
|
+
const r = await rejections(() => handler(req, env, ctx));
|
|
375
375
|
// A non-Response is sent as text (celld), not a failure.
|
|
376
376
|
return r instanceof Response ? r : new Response(String(r));
|
|
377
377
|
}
|