@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.
Files changed (92) hide show
  1. package/README.md +11 -7
  2. package/dist/adapters/node-sqlite-module.d.ts +6 -0
  3. package/dist/adapters/node-sqlite-module.js +12 -0
  4. package/dist/adapters/node-sqlite-module.js.map +1 -1
  5. package/dist/adapters/node-sqlite.js +3 -3
  6. package/dist/adapters/node-sqlite.js.map +1 -1
  7. package/dist/adapters/wasm-sqlite.d.ts +2 -0
  8. package/dist/adapters/wasm-sqlite.js +15 -0
  9. package/dist/adapters/wasm-sqlite.js.map +1 -1
  10. package/dist/bindings/cjs-module.d.ts +7 -0
  11. package/dist/bindings/cjs-module.js +96 -0
  12. package/dist/bindings/cjs-module.js.map +1 -0
  13. package/dist/bindings/cron.js +9 -2
  14. package/dist/bindings/cron.js.map +1 -1
  15. package/dist/bindings/module-registry.d.ts +43 -0
  16. package/dist/bindings/module-registry.js +192 -0
  17. package/dist/bindings/module-registry.js.map +1 -0
  18. package/dist/bindings/worker-loader.d.ts +23 -5
  19. package/dist/bindings/worker-loader.js +75 -4
  20. package/dist/bindings/worker-loader.js.map +1 -1
  21. package/dist/bucket/sqlite-object-store.js +2 -2
  22. package/dist/bucket/sqlite-object-store.js.map +1 -1
  23. package/dist/core/alarms.js +12 -2
  24. package/dist/core/alarms.js.map +1 -1
  25. package/dist/core/handles.d.ts +21 -1
  26. package/dist/core/handles.js +49 -3
  27. package/dist/core/handles.js.map +1 -1
  28. package/dist/core/namespace.js +4 -1
  29. package/dist/core/namespace.js.map +1 -1
  30. package/dist/core/runtime.d.ts +8 -0
  31. package/dist/core/runtime.js +3 -3
  32. package/dist/core/runtime.js.map +1 -1
  33. package/dist/index.d.ts +5 -0
  34. package/dist/index.js +5 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/isolate/browser.d.ts +1 -1
  37. package/dist/isolate/browser.js +3 -1
  38. package/dist/isolate/browser.js.map +1 -1
  39. package/dist/isolate/function-imports.d.ts +10 -0
  40. package/dist/isolate/function-imports.js +93 -0
  41. package/dist/isolate/function-imports.js.map +1 -0
  42. package/dist/isolate/host.js +20 -2
  43. package/dist/isolate/host.js.map +1 -1
  44. package/dist/isolate/isolate-worker.js +18 -2
  45. package/dist/isolate/isolate-worker.js.map +1 -1
  46. package/dist/isolate/isolate.js +11 -0
  47. package/dist/isolate/isolate.js.map +1 -1
  48. package/dist/isolate/node-entry.js +33 -0
  49. package/dist/isolate/node-entry.js.map +1 -1
  50. package/dist/isolate/protocol.d.ts +1 -0
  51. package/dist/isolate/protocol.js +242 -13
  52. package/dist/isolate/protocol.js.map +1 -1
  53. package/dist/isolate/writable-globals.d.ts +9 -0
  54. package/dist/isolate/writable-globals.js +45 -0
  55. package/dist/isolate/writable-globals.js.map +1 -0
  56. package/dist/node-compat/bundle-files.d.ts +26 -0
  57. package/dist/node-compat/bundle-files.js +210 -0
  58. package/dist/node-compat/bundle-files.js.map +1 -0
  59. package/dist/node-compat/fs.d.ts +13 -1
  60. package/dist/node-compat/fs.js +54 -15
  61. package/dist/node-compat/fs.js.map +1 -1
  62. package/dist/project/browser-host.d.ts +2 -0
  63. package/dist/project/browser-host.js +2 -0
  64. package/dist/project/browser-host.js.map +1 -1
  65. package/dist/project/browser-load.js +1 -0
  66. package/dist/project/browser-load.js.map +1 -1
  67. package/dist/project/browser-modules.d.ts +8 -2
  68. package/dist/project/browser-modules.js +30 -6
  69. package/dist/project/browser-modules.js.map +1 -1
  70. package/dist/project/built-project.d.ts +7 -0
  71. package/dist/project/built-project.js.map +1 -1
  72. package/dist/project/cloudflare-workers.d.ts +9 -0
  73. package/dist/project/cloudflare-workers.js +14 -0
  74. package/dist/project/cloudflare-workers.js.map +1 -1
  75. package/dist/project/module-rules.js +31 -10
  76. package/dist/project/module-rules.js.map +1 -1
  77. package/dist/project/node-project.d.ts +2 -0
  78. package/dist/project/node-project.js +157 -25
  79. package/dist/project/node-project.js.map +1 -1
  80. package/dist/project/site-loader.js +2 -1
  81. package/dist/project/site-loader.js.map +1 -1
  82. package/dist/project/uint8array-base64.d.ts +7 -0
  83. package/dist/project/uint8array-base64.js +96 -0
  84. package/dist/project/uint8array-base64.js.map +1 -0
  85. package/dist/project/workers-globals-module.d.ts +1 -0
  86. package/dist/project/workers-globals-module.js +3 -0
  87. package/dist/project/workers-globals-module.js.map +1 -1
  88. package/dist/project/wrangler.js +8 -9
  89. package/dist/project/wrangler.js.map +1 -1
  90. package/dist/ws/upgrade.js +18 -1
  91. package/dist/ws/upgrade.js.map +1 -1
  92. package/package.json +10 -10
@@ -1 +1 @@
1
- {"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/bindings/cron.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cron Triggers in celld's dialect (docs/services/cron-triggers.md, = Cloudflare's):\n * five fields — minute, hour, day of month, month, day of week — UTC, one-minute resolution.\n * `*`, values, `a-b`, `a,b`, `/n`; month and weekday names; weekdays 1–7 from SUNDAY;\n * day of month `L`, `L-<n>`, `LW`, `L-<n>W`, `<d>W`; day of week `<dow>L`, `<dow>#<n>`.\n * When both day fields are restricted they form a union. Refused like celld: descending\n * ranges, lists containing `*`, steps wider than the field.\n */\nconst MONTHS = [\"JAN\", \"FEB\", \"MAR\", \"APR\", \"MAY\", \"JUN\", \"JUL\", \"AUG\", \"SEP\", \"OCT\", \"NOV\", \"DEC\"];\nconst DAYS = [\"SUN\", \"MON\", \"TUE\", \"WED\", \"THU\", \"FRI\", \"SAT\"];\n\ninterface Field {\n any: boolean;\n values: Set<number>;\n}\n\nfunction parseSimple(\n text: string,\n min: number,\n max: number,\n names?: string[],\n nameBase = 1,\n): Field {\n if (text === \"*\") return { any: true, values: new Set(range(min, max)) };\n const parts = text.split(\",\");\n if (parts.length > 1 && parts.includes(\"*\"))\n throw new Error(`cron: a list cannot contain \"*\": ${text}`);\n const values = new Set<number>();\n const value = (v: string) => {\n const i = names?.indexOf(v.toUpperCase()) ?? -1;\n const n = i >= 0 ? i + nameBase : Number(v);\n if (!Number.isInteger(n) || n < min || n > max)\n throw new Error(`cron: value out of range: ${v}`);\n return n;\n };\n for (const part of parts) {\n const [base, stepText] = part.split(\"/\");\n const step = stepText === undefined ? 1 : Number(stepText);\n if (!Number.isInteger(step) || step < 1 || step > max - min)\n throw new Error(`cron: bad step: ${part}`);\n let lo: number;\n let hi: number;\n if (base === \"*\") [lo, hi] = [min, max];\n else if (base.includes(\"-\")) {\n const [a, b] = base.split(\"-\");\n [lo, hi] = [value(a), value(b)];\n if (lo > hi) throw new Error(`cron: descending range: ${base}`);\n } else {\n lo = value(base);\n hi = stepText === undefined ? lo : max;\n }\n for (let v = lo; v <= hi; v += step) values.add(v);\n }\n return { any: false, values };\n}\n\nconst range = (a: number, b: number) => Array.from({ length: b - a + 1 }, (_, i) => a + i);\nconst daysInMonth = (y: number, m: number) => new Date(Date.UTC(y, m + 1, 0)).getUTCDate();\n\ntype DayRule = (y: number, m: number, d: number) => boolean;\n\nfunction parseDom(text: string): { any: boolean; match: DayRule } {\n if (text === \"*\") return { any: true, match: () => true };\n const rules: DayRule[] = [];\n for (const part of text.split(\",\")) {\n const up = part.toUpperCase();\n const last = /^L(?:-(\\d+))?(W?)$/.exec(up);\n const weekdayOf = /^(\\d+)W$/.exec(up);\n if (last) {\n const m = last;\n const back = Number(m[1] ?? 0);\n const weekday = m[2] === \"W\";\n rules.push((y, mo, d) => {\n const target = daysInMonth(y, mo) - back;\n return d === (weekday ? nearestWeekday(y, mo, target) : target);\n });\n } else if (weekdayOf) {\n const day = Number(weekdayOf[1]);\n rules.push((y, mo, d) => d === nearestWeekday(y, mo, Math.min(day, daysInMonth(y, mo))));\n } else {\n const f = parseSimple(part, 1, 31);\n rules.push((_y, _m, d) => f.values.has(d));\n }\n }\n return { any: false, match: (y, mo, d) => rules.some((r) => r(y, mo, d)) };\n}\n\nfunction nearestWeekday(y: number, m: number, day: number): number {\n const dow = new Date(Date.UTC(y, m, day)).getUTCDay();\n if (dow === 6) return day > 1 ? day - 1 : day + 2;\n if (dow === 0) return day < daysInMonth(y, m) ? day + 1 : day - 2;\n return day;\n}\n\nfunction parseDow(text: string): { any: boolean; match: DayRule } {\n if (text === \"*\") return { any: true, match: () => true };\n const rules: DayRule[] = [];\n const dowOf = (v: string) => {\n const i = DAYS.indexOf(v.toUpperCase());\n const n = i >= 0 ? i + 1 : Number(v);\n if (!Number.isInteger(n) || n < 1 || n > 7) throw new Error(`cron: weekday out of range: ${v}`);\n return n - 1; // JS getUTCDay(): 0 = Sunday\n };\n for (const part of text.split(\",\")) {\n const lastOf = /^(\\w+)L$/i.exec(part);\n const nthOf = /^(\\w+)#(\\d)$/.exec(part);\n if (lastOf && !/^\\d+$/.test(part)) {\n const dow = dowOf(lastOf[1]);\n rules.push(\n (y, mo, d) =>\n new Date(Date.UTC(y, mo, d)).getUTCDay() === dow && d + 7 > daysInMonth(y, mo),\n );\n } else if (nthOf) {\n const dow = dowOf(nthOf[1]);\n const nth = Number(nthOf[2]);\n rules.push(\n (y, mo, d) => new Date(Date.UTC(y, mo, d)).getUTCDay() === dow && Math.ceil(d / 7) === nth,\n );\n } else {\n const f = parseSimple(part, 1, 7, DAYS, 1);\n rules.push((y, mo, d) => f.values.has(new Date(Date.UTC(y, mo, d)).getUTCDay() + 1));\n }\n }\n return { any: false, match: (y, mo, d) => rules.some((r) => r(y, mo, d)) };\n}\n\nexport interface CronSchedule {\n readonly text: string;\n matches(t: number): boolean;\n /** First occurrence strictly after `t` (ms), at a whole minute. */\n next(t: number): number;\n}\n\nexport function parseCron(text: string): CronSchedule {\n const fields = text.trim().split(/\\s+/);\n if (fields.length !== 5) throw new Error(`cron: expected 5 fields: ${text}`);\n const minute = parseSimple(fields[0], 0, 59);\n const hour = parseSimple(fields[1], 0, 23);\n const dom = parseDom(fields[2]);\n const month = parseSimple(fields[3], 1, 12, MONTHS, 1);\n const dow = parseDow(fields[4]);\n const dayOk = (y: number, m: number, d: number) =>\n dom.any && dow.any\n ? true\n : dom.any\n ? dow.match(y, m, d)\n : dow.any\n ? dom.match(y, m, d)\n : dom.match(y, m, d) || dow.match(y, m, d);\n const matches = (t: number) => {\n const x = new Date(t);\n return (\n minute.values.has(x.getUTCMinutes()) &&\n hour.values.has(x.getUTCHours()) &&\n month.values.has(x.getUTCMonth() + 1) &&\n dayOk(x.getUTCFullYear(), x.getUTCMonth(), x.getUTCDate())\n );\n };\n return {\n text,\n matches,\n next(t: number) {\n let c = Math.floor(t / 60_000) * 60_000 + 60_000;\n const limit = c + 5 * 366 * 86_400_000;\n while (c < limit) {\n const x = new Date(c);\n if (\n !month.values.has(x.getUTCMonth() + 1) ||\n !dayOk(x.getUTCFullYear(), x.getUTCMonth(), x.getUTCDate())\n ) {\n c = Date.UTC(x.getUTCFullYear(), x.getUTCMonth(), x.getUTCDate() + 1); // next day, 00:00\n continue;\n }\n if (matches(c)) return c;\n c += 60_000;\n }\n throw new Error(`cron: no occurrence within 5 years: ${text}`);\n },\n };\n}\n\nexport interface CronClock {\n now(): number;\n setTimeout(fn: () => void, ms: number): unknown;\n clearTimeout(h: unknown): void;\n}\n\n/**\n * Runs the Worker's `scheduled(controller, env, ctx)` for each expression, as celld does:\n * one invocation at a time with its `waitUntil()` work drained before the next; a throwing\n * handler retries after 4 s, doubling, until six failures, `controller.noRetry()` or the next\n * occurrence; `scheduledTime` names the occurrence, not the attempt.\n */\n/** Where the last fired occurrence of each expression is kept (for the downtime catch-up). */\nexport interface CronStateStore {\n get(expression: string): number | undefined;\n set(expression: string, scheduledTime: number): void;\n}\n\nexport function startCronTriggers(\n expressions: string[],\n handler: (\n controller: unknown,\n ctx: { waitUntil(p: Promise<unknown>): void; passThroughOnException(): void },\n ) => unknown,\n clock: CronClock,\n state?: CronStateStore,\n): () => void {\n const schedules = expressions.map(parseCron);\n const timers = new Set<unknown>();\n let chain: Promise<void> = Promise.resolve();\n let stopped = false;\n const at = (t: number, fn: () => void) => {\n const h = clock.setTimeout(\n () => {\n timers.delete(h);\n if (!stopped) fn();\n },\n Math.max(0, t - clock.now()),\n );\n timers.add(h);\n };\n const run = (\n s: CronSchedule,\n scheduledTime: number,\n failures: number,\n nextOccurrence: number,\n ) => {\n chain = chain.then(async () => {\n let retry = true;\n const pending: Promise<unknown>[] = [];\n const controller = {\n cron: s.text,\n scheduledTime,\n type: \"scheduled\",\n noRetry: () => {\n retry = false;\n },\n };\n try {\n await handler(controller, {\n waitUntil: (p) => pending.push(p),\n passThroughOnException() {},\n });\n await Promise.allSettled(pending);\n } catch {\n await Promise.allSettled(pending);\n const delay = 4_000 * 2 ** failures;\n if (retry && failures + 1 < 6 && clock.now() + delay < nextOccurrence)\n at(clock.now() + delay, () => run(s, scheduledTime, failures + 1, nextOccurrence));\n }\n });\n };\n const arm = (s: CronSchedule, from: number) => {\n const t = s.next(from);\n at(t, () => {\n state?.set(s.text, t);\n run(s, t, 0, s.next(t));\n arm(s, t);\n });\n };\n // After downtime: run ONE missed occurrence (the latest) and skip the rest, as celld does.\n for (const s of schedules) {\n const last = state?.get(s.text);\n if (last === undefined) continue;\n let missed: number | undefined;\n const now = clock.now();\n for (let t = s.next(last), n = 0; t <= now && n < 600_000; t = s.next(t), n++) missed = t;\n if (missed !== undefined) {\n state?.set(s.text, missed);\n run(s, missed, 0, s.next(missed));\n }\n }\n for (const s of schedules) arm(s, clock.now());\n return () => {\n stopped = true;\n for (const h of timers) clock.clearTimeout(h);\n timers.clear();\n };\n}\n"]}
1
+ {"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/bindings/cron.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cron Triggers in celld's dialect (docs/services/cron-triggers.md, = Cloudflare's):\n * five fields — minute, hour, day of month, month, day of week — UTC, one-minute resolution.\n * `*`, values, `a-b`, `a,b`, `/n`; month and weekday names; weekdays 1–7 from SUNDAY;\n * day of month `L`, `L-<n>`, `LW`, `L-<n>W`, `<d>W`; day of week `<dow>L`, `<dow>#<n>`.\n * When both day fields are restricted they form a union. Refused like celld: descending\n * ranges, lists containing `*`, steps wider than the field.\n */\nconst MONTHS = [\"JAN\", \"FEB\", \"MAR\", \"APR\", \"MAY\", \"JUN\", \"JUL\", \"AUG\", \"SEP\", \"OCT\", \"NOV\", \"DEC\"];\nconst DAYS = [\"SUN\", \"MON\", \"TUE\", \"WED\", \"THU\", \"FRI\", \"SAT\"];\n\ninterface Field {\n any: boolean;\n values: Set<number>;\n}\n\nfunction parseSimple(\n text: string,\n min: number,\n max: number,\n names?: string[],\n nameBase = 1,\n): Field {\n if (text === \"*\") return { any: true, values: new Set(range(min, max)) };\n const parts = text.split(\",\");\n if (parts.length > 1 && parts.includes(\"*\"))\n throw new Error(`cron: a list cannot contain \"*\": ${text}`);\n const values = new Set<number>();\n const value = (v: string) => {\n const i = names?.indexOf(v.toUpperCase()) ?? -1;\n const n = i >= 0 ? i + nameBase : Number(v);\n if (!Number.isInteger(n) || n < min || n > max)\n throw new Error(`cron: value out of range: ${v}`);\n return n;\n };\n for (const part of parts) {\n const [base, stepText] = part.split(\"/\");\n const step = stepText === undefined ? 1 : Number(stepText);\n if (!Number.isInteger(step) || step < 1 || step > max - min)\n throw new Error(`cron: bad step: ${part}`);\n let lo: number;\n let hi: number;\n if (base === \"*\") [lo, hi] = [min, max];\n else if (base.includes(\"-\")) {\n const [a, b] = base.split(\"-\");\n [lo, hi] = [value(a), value(b)];\n if (lo > hi) throw new Error(`cron: descending range: ${base}`);\n } else {\n lo = value(base);\n hi = stepText === undefined ? lo : max;\n }\n for (let v = lo; v <= hi; v += step) values.add(v);\n }\n return { any: false, values };\n}\n\nconst range = (a: number, b: number) => Array.from({ length: b - a + 1 }, (_, i) => a + i);\nconst daysInMonth = (y: number, m: number) => new Date(Date.UTC(y, m + 1, 0)).getUTCDate();\n\ntype DayRule = (y: number, m: number, d: number) => boolean;\n\nfunction parseDom(text: string): { any: boolean; match: DayRule } {\n if (text === \"*\") return { any: true, match: () => true };\n const rules: DayRule[] = [];\n for (const part of text.split(\",\")) {\n const up = part.toUpperCase();\n const last = /^L(?:-(\\d+))?(W?)$/.exec(up);\n const weekdayOf = /^(\\d+)W$/.exec(up);\n if (last) {\n const m = last;\n const back = Number(m[1] ?? 0);\n const weekday = m[2] === \"W\";\n rules.push((y, mo, d) => {\n const target = daysInMonth(y, mo) - back;\n return d === (weekday ? nearestWeekday(y, mo, target) : target);\n });\n } else if (weekdayOf) {\n const day = Number(weekdayOf[1]);\n rules.push((y, mo, d) => d === nearestWeekday(y, mo, Math.min(day, daysInMonth(y, mo))));\n } else {\n const f = parseSimple(part, 1, 31);\n rules.push((_y, _m, d) => f.values.has(d));\n }\n }\n return { any: false, match: (y, mo, d) => rules.some((r) => r(y, mo, d)) };\n}\n\nfunction nearestWeekday(y: number, m: number, day: number): number {\n const dow = new Date(Date.UTC(y, m, day)).getUTCDay();\n if (dow === 6) return day > 1 ? day - 1 : day + 2;\n if (dow === 0) return day < daysInMonth(y, m) ? day + 1 : day - 2;\n return day;\n}\n\nfunction parseDow(text: string): { any: boolean; match: DayRule } {\n if (text === \"*\") return { any: true, match: () => true };\n const rules: DayRule[] = [];\n const dowOf = (v: string) => {\n const i = DAYS.indexOf(v.toUpperCase());\n const n = i >= 0 ? i + 1 : Number(v);\n if (!Number.isInteger(n) || n < 1 || n > 7) throw new Error(`cron: weekday out of range: ${v}`);\n return n - 1; // JS getUTCDay(): 0 = Sunday\n };\n for (const part of text.split(\",\")) {\n const lastOf = /^(\\w+)L$/i.exec(part);\n const nthOf = /^(\\w+)#(\\d)$/.exec(part);\n if (lastOf && !/^\\d+$/.test(part)) {\n const dow = dowOf(lastOf[1]);\n rules.push(\n (y, mo, d) =>\n new Date(Date.UTC(y, mo, d)).getUTCDay() === dow && d + 7 > daysInMonth(y, mo),\n );\n } else if (nthOf) {\n const dow = dowOf(nthOf[1]);\n const nth = Number(nthOf[2]);\n rules.push(\n (y, mo, d) => new Date(Date.UTC(y, mo, d)).getUTCDay() === dow && Math.ceil(d / 7) === nth,\n );\n } else {\n const f = parseSimple(part, 1, 7, DAYS, 1);\n rules.push((y, mo, d) => f.values.has(new Date(Date.UTC(y, mo, d)).getUTCDay() + 1));\n }\n }\n return { any: false, match: (y, mo, d) => rules.some((r) => r(y, mo, d)) };\n}\n\nexport interface CronSchedule {\n readonly text: string;\n matches(t: number): boolean;\n /** First occurrence strictly after `t` (ms), at a whole minute. */\n next(t: number): number;\n}\n\nexport function parseCron(text: string): CronSchedule {\n const fields = text.trim().split(/\\s+/);\n if (fields.length !== 5) throw new Error(`cron: expected 5 fields: ${text}`);\n const minute = parseSimple(fields[0], 0, 59);\n const hour = parseSimple(fields[1], 0, 23);\n const dom = parseDom(fields[2]);\n const month = parseSimple(fields[3], 1, 12, MONTHS, 1);\n const dow = parseDow(fields[4]);\n const dayOk = (y: number, m: number, d: number) =>\n dom.any && dow.any\n ? true\n : dom.any\n ? dow.match(y, m, d)\n : dow.any\n ? dom.match(y, m, d)\n : dom.match(y, m, d) || dow.match(y, m, d);\n const matches = (t: number) => {\n const x = new Date(t);\n return (\n minute.values.has(x.getUTCMinutes()) &&\n hour.values.has(x.getUTCHours()) &&\n month.values.has(x.getUTCMonth() + 1) &&\n dayOk(x.getUTCFullYear(), x.getUTCMonth(), x.getUTCDate())\n );\n };\n return {\n text,\n matches,\n next(t: number) {\n let c = Math.floor(t / 60_000) * 60_000 + 60_000;\n const limit = c + 5 * 366 * 86_400_000;\n while (c < limit) {\n const x = new Date(c);\n if (\n !month.values.has(x.getUTCMonth() + 1) ||\n !dayOk(x.getUTCFullYear(), x.getUTCMonth(), x.getUTCDate())\n ) {\n c = Date.UTC(x.getUTCFullYear(), x.getUTCMonth(), x.getUTCDate() + 1); // next day, 00:00\n continue;\n }\n if (matches(c)) return c;\n c += 60_000;\n }\n throw new Error(`cron: no occurrence within 5 years: ${text}`);\n },\n };\n}\n\nexport interface CronClock {\n now(): number;\n setTimeout(fn: () => void, ms: number): unknown;\n clearTimeout(h: unknown): void;\n}\n\n/**\n * Runs the Worker's `scheduled(controller, env, ctx)` for each expression, as celld does:\n * one invocation at a time with its `waitUntil()` work drained before the next; a throwing\n * handler retries after 4 s, doubling, until six failures, `controller.noRetry()` or the next\n * occurrence; `scheduledTime` names the occurrence, not the attempt.\n */\n/** Where the last fired occurrence of each expression is kept (for the downtime catch-up). */\nexport interface CronStateStore {\n get(expression: string): number | undefined;\n set(expression: string, scheduledTime: number): void;\n}\n\nexport function startCronTriggers(\n expressions: string[],\n handler: (\n controller: unknown,\n ctx: { waitUntil(p: Promise<unknown>): void; passThroughOnException(): void },\n ) => unknown,\n clock: CronClock,\n state?: CronStateStore,\n): () => void {\n const schedules = expressions.map(parseCron);\n const timers = new Set<unknown>();\n let chain: Promise<void> = Promise.resolve();\n let stopped = false;\n // A timer waits at most 2^31 - 1 ms: setTimeout fires a longer delay after 1 ms, which ran\n // a trigger whose occurrences are further apart (any monthly or yearly one) at once, and\n // then each following occurrence about every millisecond.\n const at = (t: number, fn: () => void) => {\n const h = clock.setTimeout(\n () => {\n timers.delete(h);\n if (stopped) return;\n if (clock.now() < t) at(t, fn);\n else fn();\n },\n Math.min(Math.max(0, t - clock.now()), 2 ** 31 - 1),\n );\n timers.add(h);\n };\n const run = (\n s: CronSchedule,\n scheduledTime: number,\n failures: number,\n nextOccurrence: number,\n ) => {\n chain = chain.then(async () => {\n let retry = true;\n const pending: Promise<unknown>[] = [];\n const controller = {\n cron: s.text,\n scheduledTime,\n type: \"scheduled\",\n noRetry: () => {\n retry = false;\n },\n };\n try {\n await handler(controller, {\n waitUntil: (p) => pending.push(p),\n passThroughOnException() {},\n });\n await Promise.allSettled(pending);\n } catch {\n await Promise.allSettled(pending);\n const delay = 4_000 * 2 ** failures;\n if (retry && failures + 1 < 6 && clock.now() + delay < nextOccurrence)\n at(clock.now() + delay, () => run(s, scheduledTime, failures + 1, nextOccurrence));\n }\n });\n };\n const arm = (s: CronSchedule, from: number) => {\n const t = s.next(from);\n at(t, () => {\n state?.set(s.text, t);\n run(s, t, 0, s.next(t));\n arm(s, t);\n });\n };\n // After downtime: run ONE missed occurrence (the latest) and skip the rest, as celld does.\n for (const s of schedules) {\n const last = state?.get(s.text);\n if (last === undefined) continue;\n let missed: number | undefined;\n const now = clock.now();\n for (let t = s.next(last), n = 0; t <= now && n < 600_000; t = s.next(t), n++) missed = t;\n if (missed !== undefined) {\n state?.set(s.text, missed);\n run(s, missed, 0, s.next(missed));\n }\n }\n for (const s of schedules) arm(s, clock.now());\n return () => {\n stopped = true;\n for (const h of timers) clock.clearTimeout(h);\n timers.clear();\n };\n}\n"]}
@@ -0,0 +1,43 @@
1
+ /** The name of the loaded module `spec` names from module `importer`, or `undefined`. */
2
+ export declare function resolveModuleName(spec: string, importer: string, names: ReadonlySet<string>): string | undefined;
3
+ /** The same function as source text, for a registry module generated into a bundle. */
4
+ export declare const RESOLVE_MODULE_NAME_SOURCE = "(spec, importer, names) => {\n if (names.has(spec)) return spec;\n if (!/^\\.{0,2}\\//.test(spec)) return undefined;\n const name = new URL(spec, \"file:///\" + importer).pathname.slice(1);\n return names.has(name) ? name : undefined;\n}";
5
+ /** The identifier rewritten calls use. */
6
+ export declare const IMPORT_FROM = "__cellbImportFrom";
7
+ /** What an ES module exports by name, and the specifiers it re-exports everything from. */
8
+ export interface ModuleExports {
9
+ names: string[];
10
+ stars: string[];
11
+ }
12
+ /**
13
+ * One parse of ES module `source` (named `name`): its text with each `import(spec)` the bundler
14
+ * cannot link routed through `__cellbImportFrom` (`routed`, undefined when there is none), and
15
+ * its exports. `undefined` when it does not parse (the loader then reports its syntax error).
16
+ */
17
+ export declare function analyzeModule(source: string, name: string): {
18
+ routed: string | undefined;
19
+ exports: ModuleExports;
20
+ } | undefined;
21
+ /**
22
+ * `source` (an ES module named `name`) with each `import(spec)` that the bundler cannot link (a
23
+ * computed specifier, or a literal that is not a relative path) calling `__cellbImportFrom(spec,
24
+ * name)`. Returns `undefined` when there is none (or the module does not parse: the loader then
25
+ * reports its syntax error).
26
+ */
27
+ export declare function routeDynamicImports(source: string, name: string): string | undefined;
28
+ /** The exports of ES module `source` (`undefined` if it does not parse). */
29
+ export declare function moduleExports(source: string): ModuleExports | undefined;
30
+ /** `prelude` put in front of `source` on its first line (after a hashbang), so lines keep their numbers. */
31
+ export declare function prefixModule(source: string, prelude: string): string;
32
+ /**
33
+ * Each module's export names, `export *` followed within the modules (as far as they resolve).
34
+ * A module that does not parse, or a star from outside them, adds nothing. `modules` are the
35
+ * modules' texts, or their exports already found (`analyzeModule`).
36
+ */
37
+ export declare function exportNamesByModule(modules: Record<string, string> | Map<string, ModuleExports>): Record<string, string[]>;
38
+ /**
39
+ * An ES module that stands for loaded module `name` where code imports it by a specifier no
40
+ * bundler saw (an `import()` in code built with `Function`): it takes the bundled module's
41
+ * namespace from the realm's registry (`globalThis.__cellbLoadedModules`) and re-exports it.
42
+ */
43
+ export declare function loadedModuleShim(name: string, exportNames: string[]): string;
@@ -0,0 +1,192 @@
1
+ /**
2
+ * `import()` in a loaded Worker resolves against its own modules, as on workerd: the specifier
3
+ * names a module of the `WorkerCode` exactly (Kitesurf names page modules by their URL), or is
4
+ * a path relative to the importing module. The loaders bundle (esbuild on Node) or link (Blob URLs
5
+ * in a browser) the modules, which handles a literal relative `import("./x.js")`; a computed
6
+ * specifier, or one that is a module's whole name, is resolved at run time instead.
7
+ *
8
+ * `routeDynamicImports` rewrites those `import(spec)` calls of a module to
9
+ * `__cellbImportFrom(spec, "<module name>")`; each loader defines `__cellbImportFrom` with
10
+ * `resolveModuleName` over its own modules, falling back to the realm's `import()`.
11
+ */
12
+ import { parse } from "acorn";
13
+ /** The name of the loaded module `spec` names from module `importer`, or `undefined`. */
14
+ export function resolveModuleName(spec, importer, names) {
15
+ if (names.has(spec))
16
+ return spec;
17
+ if (!/^\.{0,2}\//.test(spec))
18
+ return undefined;
19
+ const name = new URL(spec, `file:///${importer}`).pathname.slice(1);
20
+ return names.has(name) ? name : undefined;
21
+ }
22
+ /** The same function as source text, for a registry module generated into a bundle. */
23
+ export const RESOLVE_MODULE_NAME_SOURCE = `(spec, importer, names) => {
24
+ if (names.has(spec)) return spec;
25
+ if (!/^\\.{0,2}\\//.test(spec)) return undefined;
26
+ const name = new URL(spec, "file:///" + importer).pathname.slice(1);
27
+ return names.has(name) ? name : undefined;
28
+ }`;
29
+ /** The identifier rewritten calls use. */
30
+ export const IMPORT_FROM = "__cellbImportFrom";
31
+ /**
32
+ * One parse of ES module `source` (named `name`): its text with each `import(spec)` the bundler
33
+ * cannot link routed through `__cellbImportFrom` (`routed`, undefined when there is none), and
34
+ * its exports. `undefined` when it does not parse (the loader then reports its syntax error).
35
+ */
36
+ export function analyzeModule(source, name) {
37
+ let ast;
38
+ try {
39
+ ast = parse(source, { ecmaVersion: "latest", sourceType: "module", allowHashBang: true });
40
+ }
41
+ catch {
42
+ return undefined;
43
+ }
44
+ return { routed: routed(ast, source, name), exports: exportsOf(ast) };
45
+ }
46
+ /**
47
+ * `source` (an ES module named `name`) with each `import(spec)` that the bundler cannot link (a
48
+ * computed specifier, or a literal that is not a relative path) calling `__cellbImportFrom(spec,
49
+ * name)`. Returns `undefined` when there is none (or the module does not parse: the loader then
50
+ * reports its syntax error).
51
+ */
52
+ export function routeDynamicImports(source, name) {
53
+ if (!source.includes("import"))
54
+ return undefined;
55
+ return analyzeModule(source, name)?.routed;
56
+ }
57
+ /** The exports of ES module `source` (`undefined` if it does not parse). */
58
+ export function moduleExports(source) {
59
+ return analyzeModule(source, "")?.exports;
60
+ }
61
+ function routed(ast, source, name) {
62
+ const calls = [];
63
+ const visit = (n) => {
64
+ if (!n || typeof n.type !== "string")
65
+ return;
66
+ if (n.type === "ImportExpression") {
67
+ const literal = n.source.type === "Literal" && typeof n.source.value === "string"
68
+ ? n.source.value
69
+ : undefined;
70
+ if (literal === undefined || !/^\.{1,2}\//.test(literal))
71
+ calls.push({ start: n.start, sourceEnd: n.source.end });
72
+ }
73
+ for (const key of Object.keys(n)) {
74
+ const v = n[key];
75
+ if (Array.isArray(v))
76
+ for (const c of v)
77
+ visit(c);
78
+ else if (v && typeof v === "object" && typeof v.type === "string")
79
+ visit(v);
80
+ }
81
+ };
82
+ if (source.includes("import"))
83
+ visit(ast);
84
+ if (!calls.length)
85
+ return undefined;
86
+ let out = source;
87
+ // From the end, so earlier positions stay valid: `import(spec` → `__cellbImportFrom(spec, name`.
88
+ for (const { start, sourceEnd } of calls.sort((a, b) => b.start - a.start))
89
+ out =
90
+ out.slice(0, start) +
91
+ IMPORT_FROM +
92
+ out.slice(start + "import".length, sourceEnd) +
93
+ `, ${JSON.stringify(name)}` +
94
+ out.slice(sourceEnd);
95
+ return out;
96
+ }
97
+ function exportsOf(ast) {
98
+ const names = new Set();
99
+ const stars = [];
100
+ const nameOf = (n) => (n.type === "Identifier" ? n.name : String(n.value));
101
+ const bound = (p) => {
102
+ if (!p)
103
+ return;
104
+ if (p.type === "Identifier")
105
+ names.add(p.name);
106
+ else if (p.type === "ObjectPattern")
107
+ for (const q of p.properties)
108
+ bound(q.type === "RestElement" ? q.argument : q.value);
109
+ else if (p.type === "ArrayPattern")
110
+ for (const q of p.elements)
111
+ bound(q);
112
+ else if (p.type === "RestElement")
113
+ bound(p.argument);
114
+ else if (p.type === "AssignmentPattern")
115
+ bound(p.left);
116
+ };
117
+ for (const node of ast.body) {
118
+ if (node.type === "ExportDefaultDeclaration")
119
+ names.add("default");
120
+ else if (node.type === "ExportAllDeclaration") {
121
+ if (node.exported)
122
+ names.add(nameOf(node.exported));
123
+ else
124
+ stars.push(String(node.source.value));
125
+ }
126
+ else if (node.type === "ExportNamedDeclaration") {
127
+ const d = node.declaration;
128
+ if (d?.type === "VariableDeclaration")
129
+ for (const v of d.declarations)
130
+ bound(v.id);
131
+ else if (d?.id)
132
+ names.add(d.id.name);
133
+ for (const s of node.specifiers ?? [])
134
+ names.add(nameOf(s.exported));
135
+ }
136
+ }
137
+ return { names: [...names], stars };
138
+ }
139
+ /** `prelude` put in front of `source` on its first line (after a hashbang), so lines keep their numbers. */
140
+ export function prefixModule(source, prelude) {
141
+ if (!source.startsWith("#!"))
142
+ return prelude + source;
143
+ const nl = source.indexOf("\n");
144
+ return nl < 0
145
+ ? `${source}\n${prelude}`
146
+ : `${source.slice(0, nl + 1)}${prelude}${source.slice(nl + 1)}`;
147
+ }
148
+ /**
149
+ * Each module's export names, `export *` followed within the modules (as far as they resolve).
150
+ * A module that does not parse, or a star from outside them, adds nothing. `modules` are the
151
+ * modules' texts, or their exports already found (`analyzeModule`).
152
+ */
153
+ export function exportNamesByModule(modules) {
154
+ const own = modules instanceof Map
155
+ ? modules
156
+ : new Map(Object.entries(modules).map(([n, text]) => [
157
+ n,
158
+ moduleExports(text) ?? { names: [], stars: [] },
159
+ ]));
160
+ const names = new Set(own.keys());
161
+ const all = (name, seen) => {
162
+ const out = new Set(own.get(name)?.names ?? []);
163
+ if (seen.has(name))
164
+ return out;
165
+ seen.add(name);
166
+ for (const spec of own.get(name)?.stars ?? []) {
167
+ const target = resolveModuleName(spec, name, names);
168
+ if (target === undefined)
169
+ continue;
170
+ for (const n of all(target, seen))
171
+ if (n !== "default")
172
+ out.add(n);
173
+ }
174
+ return out;
175
+ };
176
+ return Object.fromEntries([...names].map((n) => [n, [...all(n, new Set())]]));
177
+ }
178
+ /**
179
+ * An ES module that stands for loaded module `name` where code imports it by a specifier no
180
+ * bundler saw (an `import()` in code built with `Function`): it takes the bundled module's
181
+ * namespace from the realm's registry (`globalThis.__cellbLoadedModules`) and re-exports it.
182
+ */
183
+ export function loadedModuleShim(name, exportNames) {
184
+ const ident = /^[A-Za-z_$][\w$]*$/;
185
+ const named = exportNames.filter((n) => n !== "default" && ident.test(n));
186
+ return [
187
+ `const ns = await globalThis.__cellbLoadedModules.load(${JSON.stringify(name)});`,
188
+ ...(exportNames.includes("default") ? ["export default ns.default;"] : []),
189
+ ...(named.length ? [`export const { ${named.join(", ")} } = ns;`] : []),
190
+ ].join("\n");
191
+ }
192
+ //# sourceMappingURL=module-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-registry.js","sourceRoot":"","sources":["../../src/bindings/module-registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `import()` in a loaded Worker resolves against its own modules, as on workerd: the specifier\n * names a module of the `WorkerCode` exactly (Kitesurf names page modules by their URL), or is\n * a path relative to the importing module. The loaders bundle (esbuild on Node) or link (Blob URLs\n * in a browser) the modules, which handles a literal relative `import(\"./x.js\")`; a computed\n * specifier, or one that is a module's whole name, is resolved at run time instead.\n *\n * `routeDynamicImports` rewrites those `import(spec)` calls of a module to\n * `__cellbImportFrom(spec, \"<module name>\")`; each loader defines `__cellbImportFrom` with\n * `resolveModuleName` over its own modules, falling back to the realm's `import()`.\n */\nimport { parse } from \"acorn\";\n\n/** The name of the loaded module `spec` names from module `importer`, or `undefined`. */\nexport function resolveModuleName(\n spec: string,\n importer: string,\n names: ReadonlySet<string>,\n): string | undefined {\n if (names.has(spec)) return spec;\n if (!/^\\.{0,2}\\//.test(spec)) return undefined;\n const name = new URL(spec, `file:///${importer}`).pathname.slice(1);\n return names.has(name) ? name : undefined;\n}\n\n/** The same function as source text, for a registry module generated into a bundle. */\nexport const RESOLVE_MODULE_NAME_SOURCE = `(spec, importer, names) => {\n if (names.has(spec)) return spec;\n if (!/^\\\\.{0,2}\\\\//.test(spec)) return undefined;\n const name = new URL(spec, \"file:///\" + importer).pathname.slice(1);\n return names.has(name) ? name : undefined;\n}`;\n\n/** The identifier rewritten calls use. */\nexport const IMPORT_FROM = \"__cellbImportFrom\";\n\n/** What an ES module exports by name, and the specifiers it re-exports everything from. */\nexport interface ModuleExports {\n names: string[];\n stars: string[];\n}\n\n/**\n * One parse of ES module `source` (named `name`): its text with each `import(spec)` the bundler\n * cannot link routed through `__cellbImportFrom` (`routed`, undefined when there is none), and\n * its exports. `undefined` when it does not parse (the loader then reports its syntax error).\n */\nexport function analyzeModule(\n source: string,\n name: string,\n): { routed: string | undefined; exports: ModuleExports } | undefined {\n let ast: any;\n try {\n ast = parse(source, { ecmaVersion: \"latest\", sourceType: \"module\", allowHashBang: true });\n } catch {\n return undefined;\n }\n return { routed: routed(ast, source, name), exports: exportsOf(ast) };\n}\n\n/**\n * `source` (an ES module named `name`) with each `import(spec)` that the bundler cannot link (a\n * computed specifier, or a literal that is not a relative path) calling `__cellbImportFrom(spec,\n * name)`. Returns `undefined` when there is none (or the module does not parse: the loader then\n * reports its syntax error).\n */\nexport function routeDynamicImports(source: string, name: string): string | undefined {\n if (!source.includes(\"import\")) return undefined;\n return analyzeModule(source, name)?.routed;\n}\n\n/** The exports of ES module `source` (`undefined` if it does not parse). */\nexport function moduleExports(source: string): ModuleExports | undefined {\n return analyzeModule(source, \"\")?.exports;\n}\n\nfunction routed(ast: any, source: string, name: string): string | undefined {\n const calls: { start: number; sourceEnd: number }[] = [];\n const visit = (n: any) => {\n if (!n || typeof n.type !== \"string\") return;\n if (n.type === \"ImportExpression\") {\n const literal =\n n.source.type === \"Literal\" && typeof n.source.value === \"string\"\n ? (n.source.value as string)\n : undefined;\n if (literal === undefined || !/^\\.{1,2}\\//.test(literal))\n calls.push({ start: n.start, sourceEnd: n.source.end });\n }\n for (const key of Object.keys(n)) {\n const v = n[key];\n if (Array.isArray(v)) for (const c of v) visit(c);\n else if (v && typeof v === \"object\" && typeof v.type === \"string\") visit(v);\n }\n };\n if (source.includes(\"import\")) visit(ast);\n if (!calls.length) return undefined;\n let out = source;\n // From the end, so earlier positions stay valid: `import(spec` → `__cellbImportFrom(spec, name`.\n for (const { start, sourceEnd } of calls.sort((a, b) => b.start - a.start))\n out =\n out.slice(0, start) +\n IMPORT_FROM +\n out.slice(start + \"import\".length, sourceEnd) +\n `, ${JSON.stringify(name)}` +\n out.slice(sourceEnd);\n return out;\n}\n\nfunction exportsOf(ast: any): ModuleExports {\n const names = new Set<string>();\n const stars: string[] = [];\n const nameOf = (n: any) => (n.type === \"Identifier\" ? n.name : String(n.value));\n const bound = (p: any) => {\n if (!p) return;\n if (p.type === \"Identifier\") names.add(p.name);\n else if (p.type === \"ObjectPattern\")\n for (const q of p.properties) bound(q.type === \"RestElement\" ? q.argument : q.value);\n else if (p.type === \"ArrayPattern\") for (const q of p.elements) bound(q);\n else if (p.type === \"RestElement\") bound(p.argument);\n else if (p.type === \"AssignmentPattern\") bound(p.left);\n };\n for (const node of ast.body) {\n if (node.type === \"ExportDefaultDeclaration\") names.add(\"default\");\n else if (node.type === \"ExportAllDeclaration\") {\n if (node.exported) names.add(nameOf(node.exported));\n else stars.push(String(node.source.value));\n } else if (node.type === \"ExportNamedDeclaration\") {\n const d = node.declaration;\n if (d?.type === \"VariableDeclaration\") for (const v of d.declarations) bound(v.id);\n else if (d?.id) names.add(d.id.name);\n for (const s of node.specifiers ?? []) names.add(nameOf(s.exported));\n }\n }\n return { names: [...names], stars };\n}\n\n/** `prelude` put in front of `source` on its first line (after a hashbang), so lines keep their numbers. */\nexport function prefixModule(source: string, prelude: string): string {\n if (!source.startsWith(\"#!\")) return prelude + source;\n const nl = source.indexOf(\"\\n\");\n return nl < 0\n ? `${source}\\n${prelude}`\n : `${source.slice(0, nl + 1)}${prelude}${source.slice(nl + 1)}`;\n}\n\n/**\n * Each module's export names, `export *` followed within the modules (as far as they resolve).\n * A module that does not parse, or a star from outside them, adds nothing. `modules` are the\n * modules' texts, or their exports already found (`analyzeModule`).\n */\nexport function exportNamesByModule(\n modules: Record<string, string> | Map<string, ModuleExports>,\n): Record<string, string[]> {\n const own =\n modules instanceof Map\n ? modules\n : new Map(\n Object.entries(modules).map(([n, text]) => [\n n,\n moduleExports(text) ?? { names: [], stars: [] },\n ]),\n );\n const names = new Set(own.keys());\n const all = (name: string, seen: Set<string>): Set<string> => {\n const out = new Set(own.get(name)?.names ?? []);\n if (seen.has(name)) return out;\n seen.add(name);\n for (const spec of own.get(name)?.stars ?? []) {\n const target = resolveModuleName(spec, name, names);\n if (target === undefined) continue;\n for (const n of all(target, seen)) if (n !== \"default\") out.add(n);\n }\n return out;\n };\n return Object.fromEntries([...names].map((n) => [n, [...all(n, new Set())]]));\n}\n\n/**\n * An ES module that stands for loaded module `name` where code imports it by a specifier no\n * bundler saw (an `import()` in code built with `Function`): it takes the bundled module's\n * namespace from the realm's registry (`globalThis.__cellbLoadedModules`) and re-exports it.\n */\nexport function loadedModuleShim(name: string, exportNames: string[]): string {\n const ident = /^[A-Za-z_$][\\w$]*$/;\n const named = exportNames.filter((n) => n !== \"default\" && ident.test(n));\n return [\n `const ns = await globalThis.__cellbLoadedModules.load(${JSON.stringify(name)});`,\n ...(exportNames.includes(\"default\") ? [\"export default ns.default;\"] : []),\n ...(named.length ? [`export const { ${named.join(\", \")} } = ns;`] : []),\n ].join(\"\\n\");\n}\n"]}
@@ -6,9 +6,11 @@ export interface WorkerCode {
6
6
  modules: Record<string, string | {
7
7
  js?: string;
8
8
  esModule?: string;
9
+ cjs?: string;
9
10
  text?: string;
10
11
  json?: unknown;
11
- wasm?: BufferSource;
12
+ /** The bytes, or (from `compileWasmModules`) the compiled module. */
13
+ wasm?: BufferSource | WebAssembly.Module;
12
14
  } | {
13
15
  data: BufferSource;
14
16
  }>;
@@ -44,9 +46,25 @@ export interface TailEvent {
44
46
  }
45
47
  /**
46
48
  * One `WorkerCode.modules` entry as ES module source; text and JSON become a default export,
47
- * wasm bytes a compiled `WebAssembly.Module`.
49
+ * wasm bytes a compiled `WebAssembly.Module`, and a CommonJS module's `module.exports` the
50
+ * default export. `name` names a CommonJS module in stack traces.
48
51
  */
49
- export declare function moduleText(entry: WorkerCode["modules"][string]): string;
52
+ export declare function moduleText(entry: WorkerCode["modules"][string], name?: string, names?: ReadonlySet<string>): string;
53
+ /** The realm's table of compiled wasm modules of loaded code, by key. */
54
+ export declare const WASM_TABLE = "__cellsWasmModules";
55
+ /** The key of `mod` in this realm's wasm table (registered on first use). */
56
+ export declare function wasmModuleKey(mod: WebAssembly.Module): string;
57
+ /** Puts compiled modules in this realm's wasm table (an isolate receives its loader's). */
58
+ export declare function registerWasmModules(modules: Record<string, WebAssembly.Module>): void;
59
+ /** The table entries the wasm modules of `code` use (what an isolate needs of this realm's table). */
60
+ export declare function wasmModulesOf(code: WorkerCode): Record<string, WebAssembly.Module>;
61
+ /**
62
+ * `code` with each `wasm` module compiled (asynchronously, once per bytes object: Kitesurf hands
63
+ * the same ArrayBuffer to every page's Worker), so loaders put a compiled module in the realm's
64
+ * table instead of the bytes as base64 text, which a large module makes slow to build, parse,
65
+ * decode and compile synchronously on every load.
66
+ */
67
+ export declare function compileWasmModules(code: WorkerCode): Promise<WorkerCode>;
50
68
  /**
51
69
  * The `fetch` loaded code sees, from `WorkerCode.globalOutbound`: omitted → the loader's own
52
70
  * (undefined: no override); `null` → every fetch throws; a Fetcher → each fetch goes through it.
@@ -70,7 +88,7 @@ export declare function workerLoader(load: ModuleLoader, opts?: {
70
88
  dispose(): void;
71
89
  getEntrypoint(name?: string, options?: {
72
90
  props?: unknown;
73
- }): {};
91
+ }): Record<string, unknown>;
74
92
  };
75
93
  get(id: string, getCode: () => WorkerCode | Promise<WorkerCode>, cached?: boolean): {
76
94
  getDurableObjectClass(name: string): import("../core/handles.js").ClassHandle;
@@ -78,6 +96,6 @@ export declare function workerLoader(load: ModuleLoader, opts?: {
78
96
  dispose(): void;
79
97
  getEntrypoint(name?: string, options?: {
80
98
  props?: unknown;
81
- }): {};
99
+ }): Record<string, unknown>;
82
100
  };
83
101
  };
@@ -1,14 +1,20 @@
1
- import { classHandle, cross, ctxExports, entrypointStub, ISOLATED, pipeTo, REFUSE, rpcPromise, } from "../core/handles.js";
1
+ import { classHandle, cross, ctxExports, entrypointStub, ISOLATED, ON_ABORT, pipeTo, REFUSE, rpcPromise, } from "../core/handles.js";
2
+ import { commonJsModule } from "./cjs-module.js";
2
3
  /** workerd's refusal of a loaded Worker's entrypoint passed on to another Worker. */
3
4
  const DYNAMIC_ENTRYPOINT = "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.";
4
5
  /**
5
6
  * One `WorkerCode.modules` entry as ES module source; text and JSON become a default export,
6
- * wasm bytes a compiled `WebAssembly.Module`.
7
+ * wasm bytes a compiled `WebAssembly.Module`, and a CommonJS module's `module.exports` the
8
+ * default export. `name` names a CommonJS module in stack traces.
7
9
  */
8
- export function moduleText(entry) {
10
+ export function moduleText(entry, name = "module.cjs", names) {
9
11
  if (typeof entry === "string")
10
12
  return entry;
11
13
  const m = entry; // workerLoader refuses data
14
+ if (typeof m.cjs === "string")
15
+ return commonJsModule(m.cjs, name, names);
16
+ if (m.wasm instanceof WebAssembly.Module)
17
+ return `export default globalThis.${WASM_TABLE}[${JSON.stringify(wasmModuleKey(m.wasm))}];`;
12
18
  if (m.wasm) {
13
19
  const bytes = ArrayBuffer.isView(m.wasm)
14
20
  ? new Uint8Array(m.wasm.buffer, m.wasm.byteOffset, m.wasm.byteLength)
@@ -20,6 +26,60 @@ export function moduleText(entry) {
20
26
  }
21
27
  return m.js ?? m.esModule ?? `export default ${JSON.stringify(m.text ?? m.json)};`;
22
28
  }
29
+ /** The realm's table of compiled wasm modules of loaded code, by key. */
30
+ export const WASM_TABLE = "__cellsWasmModules";
31
+ const keys = new WeakMap();
32
+ let lastKey = 0;
33
+ /** The key of `mod` in this realm's wasm table (registered on first use). */
34
+ export function wasmModuleKey(mod) {
35
+ let key = keys.get(mod);
36
+ if (!key) {
37
+ key = `w${++lastKey}`;
38
+ keys.set(mod, key);
39
+ registerWasmModules({ [key]: mod });
40
+ }
41
+ return key;
42
+ }
43
+ /** Puts compiled modules in this realm's wasm table (an isolate receives its loader's). */
44
+ export function registerWasmModules(modules) {
45
+ const g = globalThis;
46
+ g[WASM_TABLE] ??= {};
47
+ Object.assign(g[WASM_TABLE], modules);
48
+ }
49
+ /** The table entries the wasm modules of `code` use (what an isolate needs of this realm's table). */
50
+ export function wasmModulesOf(code) {
51
+ const out = {};
52
+ for (const m of Object.values(code.modules))
53
+ if (typeof m === "object" && "wasm" in m && m.wasm instanceof WebAssembly.Module)
54
+ out[wasmModuleKey(m.wasm)] = m.wasm;
55
+ return out;
56
+ }
57
+ const compiled = new WeakMap();
58
+ /**
59
+ * `code` with each `wasm` module compiled (asynchronously, once per bytes object: Kitesurf hands
60
+ * the same ArrayBuffer to every page's Worker), so loaders put a compiled module in the realm's
61
+ * table instead of the bytes as base64 text, which a large module makes slow to build, parse,
62
+ * decode and compile synchronously on every load.
63
+ */
64
+ export async function compileWasmModules(code) {
65
+ let modules;
66
+ for (const [name, m] of Object.entries(code.modules)) {
67
+ if (typeof m !== "object" || !("wasm" in m) || !m.wasm)
68
+ continue;
69
+ if (m.wasm instanceof WebAssembly.Module)
70
+ continue;
71
+ const bytes = m.wasm;
72
+ let p = compiled.get(bytes);
73
+ if (!p) {
74
+ p = WebAssembly.compile(bytes);
75
+ compiled.set(bytes, p);
76
+ p.catch(() => compiled.delete(bytes));
77
+ }
78
+ modules ??= { ...code.modules };
79
+ modules[name] = { ...m, wasm: await p };
80
+ }
81
+ return modules ? { ...code, modules } : code;
82
+ }
23
83
  /**
24
84
  * The `fetch` loaded code sees, from `WorkerCode.globalOutbound`: omitted → the loader's own
25
85
  * (undefined: no override); `null` → every fetch throws; a Fetcher → each fetch goes through it.
@@ -64,6 +124,13 @@ export function workerLoader(load, opts = {}) {
64
124
  const logs = [];
65
125
  const sink = (level, message) => logs.push({ level, message, timestamp: Date.now() });
66
126
  const module = await load(id, code, sink);
127
+ // Its isolate ended (`abortIsolate()`): the next get() of this id loads it again.
128
+ module[ON_ABORT]?.(() => {
129
+ if (cache.get(id) === p)
130
+ cache.delete(id);
131
+ if (own === p)
132
+ own = undefined;
133
+ });
67
134
  const env = code.env ?? {};
68
135
  return { module, env, exports: ctxExports(module, env), code, logs };
69
136
  })();
@@ -152,12 +219,15 @@ export function workerLoader(load, opts = {}) {
152
219
  refused.catch(() => { });
153
220
  return refused;
154
221
  }
155
- return new Proxy({}, {
222
+ const entrypoint = new Proxy({}, {
156
223
  get(_t, prop) {
157
224
  if (prop === REFUSE)
158
225
  return DYNAMIC_ENTRYPOINT;
159
226
  if (prop === "then" || typeof prop === "symbol")
160
227
  return undefined;
228
+ // workerd's `dup()`: this entrypoint holds nothing to release, so it is itself.
229
+ if (prop === "dup")
230
+ return () => entrypoint;
161
231
  return (...args) => {
162
232
  // Boxed, so awaiting the load does not await the call: calls on its
163
233
  // RpcPromise are pipelined.
@@ -174,6 +244,7 @@ export function workerLoader(load, opts = {}) {
174
244
  };
175
245
  },
176
246
  });
247
+ return entrypoint;
177
248
  },
178
249
  };
179
250
  },