@void/platform 0.20.1 → 0.20.2

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 (32) hide show
  1. package/README.md +10 -1
  2. package/dist/email-protocol.d.mts +48 -0
  3. package/dist/email-protocol.mjs +278 -0
  4. package/dist/index.d.mts +152 -13
  5. package/dist/index.mjs +346 -20
  6. package/dist/installer.d.mts +4 -2
  7. package/dist/installer.mjs +13 -4
  8. package/dist/runtime/api/README.md +1 -1
  9. package/dist/runtime/api/index.js +67382 -54178
  10. package/dist/runtime/api/index.js.map +4 -4
  11. package/dist/runtime/dispatch/README.md +1 -1
  12. package/dist/runtime/dispatch/index.js +26 -8
  13. package/dist/runtime/dispatch/index.js.map +2 -2
  14. package/dist/runtime/drizzle/0041_military_beyonder.sql +119 -0
  15. package/dist/runtime/drizzle/0042_dark_the_anarchist.sql +1 -0
  16. package/dist/runtime/drizzle/0043_nostalgic_meggan.sql +21 -0
  17. package/dist/runtime/drizzle/0044_smart_mentor.sql +15 -0
  18. package/dist/runtime/drizzle/0045_platform_settings.sql +5 -0
  19. package/dist/runtime/drizzle/0046_email_domains_platform_credential.sql +8 -0
  20. package/dist/runtime/drizzle/0047_email_gateway.sql +226 -0
  21. package/dist/runtime/drizzle/0048_project_teams.sql +133 -0
  22. package/dist/runtime/drizzle/compatibility.json +4 -0
  23. package/dist/runtime/drizzle/meta/_journal.json +56 -0
  24. package/dist/runtime/emailGateway/README.md +1 -0
  25. package/dist/runtime/emailGateway/index.js +5893 -0
  26. package/dist/runtime/emailGateway/index.js.map +8 -0
  27. package/dist/runtime/manifest.json +70 -11
  28. package/dist/runtime/proxy/README.md +1 -1
  29. package/dist/runtime/proxy/index.js +1629 -2242
  30. package/dist/runtime/proxy/index.js.map +4 -4
  31. package/dist/runtime/tail/README.md +1 -1
  32. package/package.json +5 -1
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../../node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/_internal/utils.mjs", "../../../../../node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/node/internal/perf_hooks/performance.mjs", "../../../../../node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/node/perf_hooks.mjs", "../../../../../node_modules/.pnpm/@cloudflare+unenv-preset@2.16.1_unenv@2.0.0-rc.24_workerd@1.20260910.1/node_modules/@cloudflare/unenv-preset/dist/runtime/polyfill/performance.mjs", "../../../../../node_modules/.pnpm/email-validator@2.0.4/node_modules/email-validator/index.js", "../../../../../platform/packages/proxy/src/index.ts", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/index.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/hono.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/hono-base.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/compose.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/context.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/request.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/http-exception.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/request/constants.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/body.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/buffer.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/crypto.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/url.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/html.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/constants.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/index.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/utils.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/matcher.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/node.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/trie.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/prepared-router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/smart-router/index.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/smart-router/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/trie-router/index.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/trie-router/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/trie-router/node.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/middleware/cors/index.js", "../../../../../platform/packages/proxy/src/ai.ts", "../../../../../platform/packages/proxy/src/body.ts", "../../../../../platform/packages/proxy/src/capabilities.ts", "../../../../../platform/packages/proxy/src/d1.ts", "../../../../../platform/packages/proxy/src/dispatch.ts", "../../../../../platform/packages/proxy/src/resolve.ts", "../../../../../platform/packages/proxy/src/email-relay.ts", "../../../../../platform/packages/proxy/src/email-router.ts", "../../../../../platform/packages/api/src/reserved-slugs.ts", "../../../../../platform/packages/proxy/src/email-lease.ts", "../../../../../platform/packages/proxy/src/email.ts", "../../../../../platform/packages/proxy/src/kv.ts", "../../../../../platform/packages/proxy/src/platform-lifecycle.ts", "../../../../../platform/packages/proxy/src/r2.ts", "../../../../../platform/packages/proxy/src/revalidate.ts"],
3
+ "sources": ["../../../../../node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/_internal/utils.mjs", "../../../../../node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/node/internal/perf_hooks/performance.mjs", "../../../../../node_modules/.pnpm/@cloudflare+unenv-preset@2.16.1_unenv@2.0.0-rc.24_workerd@1.20260910.1/node_modules/@cloudflare/unenv-preset/dist/runtime/polyfill/performance.mjs", "../../email-protocol.mjs", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/compose.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/request/constants.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/buffer.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/body.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/url.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/request.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/html.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/context.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/constants.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/hono-base.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/utils.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/matcher.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/node.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/trie.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/smart-router/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/trie-router/node.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/trie-router/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/hono.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/middleware/cors/index.js", "../../../../../platform/packages/proxy/src/body.ts", "../../../../../platform/packages/proxy/src/ai.ts", "../../../../../platform/packages/proxy/src/capabilities.ts", "../../../../../platform/packages/proxy/src/dispatch.ts", "../../../../../platform/packages/proxy/src/resolve.ts", "../../../../../platform/packages/proxy/src/d1.ts", "../../../../../platform/packages/proxy/src/email-request-body.ts", "../../../../../platform/packages/proxy/src/email.ts", "../../../../../platform/packages/proxy/src/email-admission.ts", "../../../../../platform/packages/proxy/src/email-lease.ts", "../../../../../platform/packages/proxy/src/email-provider-deadline.ts", "../../../../../platform/packages/proxy/src/human-stream.ts", "../../../../../platform/packages/proxy/src/kv.ts", "../../../../../platform/packages/proxy/src/platform-lifecycle.ts", "../../../../../platform/packages/proxy/src/r2.ts", "../../../../../platform/packages/proxy/src/revalidate.ts", "../../../../../platform/packages/proxy/src/index.ts"],
4
4
  "sourceRoot": "/home/runner/work/void/void/packages/platform/dist/runtime/proxy",
5
- "sourcesContent": ["/* @__NO_SIDE_EFFECTS__ */\nexport function rawHeaders(headers) {\n\tconst rawHeaders = [];\n\tfor (const key in headers) {\n\t\tif (Array.isArray(headers[key])) {\n\t\t\tfor (const h of headers[key]) {\n\t\t\t\trawHeaders.push(key, h);\n\t\t\t}\n\t\t} else {\n\t\t\trawHeaders.push(key, headers[key]);\n\t\t}\n\t}\n\treturn rawHeaders;\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function mergeFns(...functions) {\n\treturn function(...args) {\n\t\tfor (const fn of functions) {\n\t\t\tfn(...args);\n\t\t}\n\t};\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function createNotImplementedError(name) {\n\treturn new Error(`[unenv] ${name} is not implemented yet!`);\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function notImplemented(name) {\n\tconst fn = () => {\n\t\tthrow createNotImplementedError(name);\n\t};\n\treturn Object.assign(fn, { __unenv__: true });\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function notImplementedAsync(name) {\n\tconst fn = notImplemented(name);\n\tfn.__promisify__ = () => notImplemented(name + \".__promisify__\");\n\tfn.native = fn;\n\treturn fn;\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function notImplementedClass(name) {\n\treturn class {\n\t\t__unenv__ = true;\n\t\tconstructor() {\n\t\t\tthrow new Error(`[unenv] ${name} is not implemented yet!`);\n\t\t}\n\t};\n}\n", "import { createNotImplementedError } from \"../../../_internal/utils.mjs\";\nconst _timeOrigin = globalThis.performance?.timeOrigin ?? Date.now();\nconst _performanceNow = globalThis.performance?.now ? globalThis.performance.now.bind(globalThis.performance) : () => Date.now() - _timeOrigin;\nconst nodeTiming = {\n\tname: \"node\",\n\tentryType: \"node\",\n\tstartTime: 0,\n\tduration: 0,\n\tnodeStart: 0,\n\tv8Start: 0,\n\tbootstrapComplete: 0,\n\tenvironment: 0,\n\tloopStart: 0,\n\tloopExit: 0,\n\tidleTime: 0,\n\tuvMetricsInfo: {\n\t\tloopCount: 0,\n\t\tevents: 0,\n\t\teventsWaiting: 0\n\t},\n\tdetail: undefined,\n\ttoJSON() {\n\t\treturn this;\n\t}\n};\n// PerformanceEntry\nexport class PerformanceEntry {\n\t__unenv__ = true;\n\tdetail;\n\tentryType = \"event\";\n\tname;\n\tstartTime;\n\tconstructor(name, options) {\n\t\tthis.name = name;\n\t\tthis.startTime = options?.startTime || _performanceNow();\n\t\tthis.detail = options?.detail;\n\t}\n\tget duration() {\n\t\treturn _performanceNow() - this.startTime;\n\t}\n\ttoJSON() {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tentryType: this.entryType,\n\t\t\tstartTime: this.startTime,\n\t\t\tduration: this.duration,\n\t\t\tdetail: this.detail\n\t\t};\n\t}\n}\n// PerformanceMark\nexport const PerformanceMark = class PerformanceMark extends PerformanceEntry {\n\tentryType = \"mark\";\n\tconstructor() {\n\t\t// @ts-ignore\n\t\tsuper(...arguments);\n\t}\n\tget duration() {\n\t\treturn 0;\n\t}\n};\n// PerformanceMark\nexport class PerformanceMeasure extends PerformanceEntry {\n\tentryType = \"measure\";\n}\n// PerformanceResourceTiming\nexport class PerformanceResourceTiming extends PerformanceEntry {\n\tentryType = \"resource\";\n\tserverTiming = [];\n\tconnectEnd = 0;\n\tconnectStart = 0;\n\tdecodedBodySize = 0;\n\tdomainLookupEnd = 0;\n\tdomainLookupStart = 0;\n\tencodedBodySize = 0;\n\tfetchStart = 0;\n\tinitiatorType = \"\";\n\tname = \"\";\n\tnextHopProtocol = \"\";\n\tredirectEnd = 0;\n\tredirectStart = 0;\n\trequestStart = 0;\n\tresponseEnd = 0;\n\tresponseStart = 0;\n\tsecureConnectionStart = 0;\n\tstartTime = 0;\n\ttransferSize = 0;\n\tworkerStart = 0;\n\tresponseStatus = 0;\n}\n// PerformanceObserverEntryList\nexport class PerformanceObserverEntryList {\n\t__unenv__ = true;\n\tgetEntries() {\n\t\treturn [];\n\t}\n\tgetEntriesByName(_name, _type) {\n\t\treturn [];\n\t}\n\tgetEntriesByType(type) {\n\t\treturn [];\n\t}\n}\n// Performance\nexport class Performance {\n\t__unenv__ = true;\n\ttimeOrigin = _timeOrigin;\n\teventCounts = new Map();\n\t_entries = [];\n\t_resourceTimingBufferSize = 0;\n\tnavigation = undefined;\n\ttiming = undefined;\n\ttimerify(_fn, _options) {\n\t\tthrow createNotImplementedError(\"Performance.timerify\");\n\t}\n\tget nodeTiming() {\n\t\treturn nodeTiming;\n\t}\n\teventLoopUtilization() {\n\t\treturn {};\n\t}\n\tmarkResourceTiming() {\n\t\t// TODO: create a new PerformanceResourceTiming entry\n\t\t// so that performance.getEntries, getEntriesByName, and getEntriesByType return it\n\t\t// see: https://nodejs.org/api/perf_hooks.html#performancemarkresourcetimingtiminginfo-requestedurl-initiatortype-global-cachemode-bodyinfo-responsestatus-deliverytype\n\t\treturn new PerformanceResourceTiming(\"\");\n\t}\n\tonresourcetimingbufferfull = null;\n\tnow() {\n\t\t// https://developer.mozilla.org/en-US/docs/Web/API/Performance/now\n\t\tif (this.timeOrigin === _timeOrigin) {\n\t\t\treturn _performanceNow();\n\t\t}\n\t\treturn Date.now() - this.timeOrigin;\n\t}\n\tclearMarks(markName) {\n\t\tthis._entries = markName ? this._entries.filter((e) => e.name !== markName) : this._entries.filter((e) => e.entryType !== \"mark\");\n\t}\n\tclearMeasures(measureName) {\n\t\tthis._entries = measureName ? this._entries.filter((e) => e.name !== measureName) : this._entries.filter((e) => e.entryType !== \"measure\");\n\t}\n\tclearResourceTimings() {\n\t\tthis._entries = this._entries.filter((e) => e.entryType !== \"resource\" || e.entryType !== \"navigation\");\n\t}\n\tgetEntries() {\n\t\treturn this._entries;\n\t}\n\tgetEntriesByName(name, type) {\n\t\treturn this._entries.filter((e) => e.name === name && (!type || e.entryType === type));\n\t}\n\tgetEntriesByType(type) {\n\t\treturn this._entries.filter((e) => e.entryType === type);\n\t}\n\tmark(name, options) {\n\t\t// @ts-expect-error constructor is not protected\n\t\tconst entry = new PerformanceMark(name, options);\n\t\tthis._entries.push(entry);\n\t\treturn entry;\n\t}\n\tmeasure(measureName, startOrMeasureOptions, endMark) {\n\t\tlet start;\n\t\tlet end;\n\t\tif (typeof startOrMeasureOptions === \"string\") {\n\t\t\tstart = this.getEntriesByName(startOrMeasureOptions, \"mark\")[0]?.startTime;\n\t\t\tend = this.getEntriesByName(endMark, \"mark\")[0]?.startTime;\n\t\t} else {\n\t\t\tstart = Number.parseFloat(startOrMeasureOptions?.start) || this.now();\n\t\t\tend = Number.parseFloat(startOrMeasureOptions?.end) || this.now();\n\t\t}\n\t\tconst entry = new PerformanceMeasure(measureName, {\n\t\t\tstartTime: start,\n\t\t\tdetail: {\n\t\t\t\tstart,\n\t\t\t\tend\n\t\t\t}\n\t\t});\n\t\tthis._entries.push(entry);\n\t\treturn entry;\n\t}\n\tsetResourceTimingBufferSize(maxSize) {\n\t\tthis._resourceTimingBufferSize = maxSize;\n\t}\n\taddEventListener(type, listener, options) {\n\t\tthrow createNotImplementedError(\"Performance.addEventListener\");\n\t}\n\tremoveEventListener(type, listener, options) {\n\t\tthrow createNotImplementedError(\"Performance.removeEventListener\");\n\t}\n\tdispatchEvent(event) {\n\t\tthrow createNotImplementedError(\"Performance.dispatchEvent\");\n\t}\n\ttoJSON() {\n\t\treturn this;\n\t}\n}\n// PerformanceObserver\nexport class PerformanceObserver {\n\t__unenv__ = true;\n\tstatic supportedEntryTypes = [];\n\t_callback = null;\n\tconstructor(callback) {\n\t\tthis._callback = callback;\n\t}\n\ttakeRecords() {\n\t\treturn [];\n\t}\n\tdisconnect() {\n\t\tthrow createNotImplementedError(\"PerformanceObserver.disconnect\");\n\t}\n\tobserve(options) {\n\t\tthrow createNotImplementedError(\"PerformanceObserver.observe\");\n\t}\n\tbind(fn) {\n\t\treturn fn;\n\t}\n\trunInAsyncScope(fn, thisArg, ...args) {\n\t\treturn fn.call(thisArg, ...args);\n\t}\n\tasyncId() {\n\t\treturn 0;\n\t}\n\ttriggerAsyncId() {\n\t\treturn 0;\n\t}\n\temitDestroy() {\n\t\treturn this;\n\t}\n}\n// workerd implements a subset of globalThis.performance (as of last check, only timeOrigin set to 0 + now() implemented)\n// We already use performance.now() from globalThis.performance, if provided (see top of this file)\n// If we detect this condition, we can just use polyfill instead.\nexport const performance = globalThis.performance && \"addEventListener\" in globalThis.performance ? globalThis.performance : new Performance();\n", "import { IntervalHistogram, RecordableHistogram } from \"./internal/perf_hooks/histogram.mjs\";\nimport { performance, Performance, PerformanceEntry, PerformanceMark, PerformanceMeasure, PerformanceObserverEntryList, PerformanceObserver, PerformanceResourceTiming } from \"./internal/perf_hooks/performance.mjs\";\nexport * from \"./internal/perf_hooks/performance.mjs\";\n// prettier-ignore\nimport { NODE_PERFORMANCE_GC_MAJOR, NODE_PERFORMANCE_GC_MINOR, NODE_PERFORMANCE_GC_INCREMENTAL, NODE_PERFORMANCE_GC_WEAKCB, NODE_PERFORMANCE_GC_FLAGS_NO, NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED, NODE_PERFORMANCE_GC_FLAGS_FORCED, NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING, NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE, NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY, NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE, NODE_PERFORMANCE_ENTRY_TYPE_GC, NODE_PERFORMANCE_ENTRY_TYPE_HTTP, NODE_PERFORMANCE_ENTRY_TYPE_HTTP2, NODE_PERFORMANCE_ENTRY_TYPE_NET, NODE_PERFORMANCE_ENTRY_TYPE_DNS, NODE_PERFORMANCE_MILESTONE_TIME_ORIGIN_TIMESTAMP, NODE_PERFORMANCE_MILESTONE_TIME_ORIGIN, NODE_PERFORMANCE_MILESTONE_ENVIRONMENT, NODE_PERFORMANCE_MILESTONE_NODE_START, NODE_PERFORMANCE_MILESTONE_V8_START, NODE_PERFORMANCE_MILESTONE_LOOP_START, NODE_PERFORMANCE_MILESTONE_LOOP_EXIT, NODE_PERFORMANCE_MILESTONE_BOOTSTRAP_COMPLETE } from \"./internal/perf_hooks/constants.mjs\";\n// prettier-ignore\nexport const constants = {\n\tNODE_PERFORMANCE_GC_MAJOR,\n\tNODE_PERFORMANCE_GC_MINOR,\n\tNODE_PERFORMANCE_GC_INCREMENTAL,\n\tNODE_PERFORMANCE_GC_WEAKCB,\n\tNODE_PERFORMANCE_GC_FLAGS_NO,\n\tNODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED,\n\tNODE_PERFORMANCE_GC_FLAGS_FORCED,\n\tNODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING,\n\tNODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE,\n\tNODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY,\n\tNODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE,\n\tNODE_PERFORMANCE_ENTRY_TYPE_GC,\n\tNODE_PERFORMANCE_ENTRY_TYPE_HTTP,\n\tNODE_PERFORMANCE_ENTRY_TYPE_HTTP2,\n\tNODE_PERFORMANCE_ENTRY_TYPE_NET,\n\tNODE_PERFORMANCE_ENTRY_TYPE_DNS,\n\tNODE_PERFORMANCE_MILESTONE_TIME_ORIGIN_TIMESTAMP,\n\tNODE_PERFORMANCE_MILESTONE_TIME_ORIGIN,\n\tNODE_PERFORMANCE_MILESTONE_ENVIRONMENT,\n\tNODE_PERFORMANCE_MILESTONE_NODE_START,\n\tNODE_PERFORMANCE_MILESTONE_V8_START,\n\tNODE_PERFORMANCE_MILESTONE_LOOP_START,\n\tNODE_PERFORMANCE_MILESTONE_LOOP_EXIT,\n\tNODE_PERFORMANCE_MILESTONE_BOOTSTRAP_COMPLETE\n};\nexport const monitorEventLoopDelay = function(_options) {\n\treturn new IntervalHistogram();\n};\nexport const createHistogram = function(_options) {\n\treturn new RecordableHistogram();\n};\nexport default {\n\tPerformance,\n\tPerformanceMark,\n\tPerformanceEntry,\n\tPerformanceMeasure,\n\tPerformanceObserverEntryList,\n\tPerformanceObserver,\n\tPerformanceResourceTiming,\n\tperformance,\n\tconstants,\n\tcreateHistogram,\n\tmonitorEventLoopDelay\n};\n", "import {\n performance,\n Performance,\n PerformanceEntry,\n PerformanceMark,\n PerformanceMeasure,\n PerformanceObserver,\n PerformanceObserverEntryList,\n PerformanceResourceTiming\n} from \"node:perf_hooks\";\nif (!(\"__unenv__\" in performance)) {\n const proto = Performance.prototype;\n for (const key of Object.getOwnPropertyNames(proto)) {\n if (key !== \"constructor\" && !(key in performance)) {\n const desc = Object.getOwnPropertyDescriptor(proto, key);\n if (desc) {\n Object.defineProperty(performance, key, desc);\n }\n }\n }\n}\nglobalThis.performance = performance;\nglobalThis.Performance = Performance;\nglobalThis.PerformanceEntry = PerformanceEntry;\nglobalThis.PerformanceMark = PerformanceMark;\nglobalThis.PerformanceMeasure = PerformanceMeasure;\nglobalThis.PerformanceObserver = PerformanceObserver;\nglobalThis.PerformanceObserverEntryList = PerformanceObserverEntryList;\nglobalThis.PerformanceResourceTiming = PerformanceResourceTiming;\n", "\"use strict\";\r\n\r\nvar tester = /^[-!#$%&'*+\\/0-9=?A-Z^_a-z{|}~](\\.?[-!#$%&'*+\\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\\.?[a-zA-Z0-9])*\\.[a-zA-Z](-?[a-zA-Z0-9])+$/;\r\n// Thanks to:\r\n// http://fightingforalostcause.net/misc/2006/compare-email-regex.php\r\n// http://thedailywtf.com/Articles/Validating_Email_Addresses.aspx\r\n// http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses/201378#201378\r\nexports.validate = function(email)\r\n{\r\n\tif (!email)\r\n\t\treturn false;\r\n\t\t\r\n\tif(email.length>254)\r\n\t\treturn false;\r\n\r\n\tvar valid = tester.test(email);\r\n\tif(!valid)\r\n\t\treturn false;\r\n\r\n\t// Further checking of some things regex can't handle\r\n\tvar parts = email.split(\"@\");\r\n\tif(parts[0].length>64)\r\n\t\treturn false;\r\n\r\n\tvar domainParts = parts[1].split(\".\");\r\n\tif(domainParts.some(function(part) { return part.length>63; }))\r\n\t\treturn false;\r\n\r\n\treturn true;\r\n}", "import { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { ai } from './ai.ts';\nimport { asNumber, asString, isProxyBody } from './body.ts';\nimport { proxyCapabilityEnabled } from './capabilities.ts';\nimport { d1 } from './d1.ts';\nimport { emailRelay } from './email-relay.ts';\nimport { routeInbound } from './email-router.ts';\nimport {\n email,\n MAX_MIME_BYTES,\n MAX_RECIPIENT_LENGTH,\n MAX_SENDER_LENGTH,\n readEmailDomainMirror,\n} from './email.ts';\nimport { kv } from './kv.ts';\nimport { PLATFORM_DISABLED_KEY, PLATFORM_DISABLED_VALUE } from './platform-lifecycle.ts';\nimport { r2 } from './r2.ts';\nimport { verifyPrerenderBuild, verifyProjectOwner } from './resolve.ts';\nimport { revalidate } from './revalidate.ts';\nimport type { Env, JwtPayload, ProxyBody, ProxyEnv } from './types.ts';\n\nconst app = new Hono<ProxyEnv>();\n\napp.use('/*', async (context, next) => {\n const healthProbeToken = context.env.PLATFORM_HEALTH_PROBE_TOKEN;\n const installerProbe =\n healthProbeToken !== undefined &&\n healthProbeToken !== '' &&\n context.req.path === '/health' &&\n context.req.header('X-Void-Platform-Probe') === healthProbeToken;\n if (\n !installerProbe &&\n (context.env.PLATFORM_TRAFFIC_STATE === 'staging' ||\n context.env.PLATFORM_TRAFFIC_STATE === 'sandbox-drain' ||\n (context.env.PLATFORM_INSTALLATION_ID &&\n (await context.env.ROUTING.get(PLATFORM_DISABLED_KEY)) === PLATFORM_DISABLED_VALUE))\n ) {\n return context.json({ error: 'Platform disabled' }, 503);\n }\n await next();\n});\n\n// CORS\napp.use(\n '/*',\n cors({\n origin: '*',\n allowMethods: ['POST', 'OPTIONS'],\n allowHeaders: ['content-type', 'authorization'],\n }),\n);\n\n// Health check\napp.get('/health', (context) =>\n context.json({\n ok: true,\n bindings: {\n ai: !!context.env.AI,\n kv: !!context.env.ROUTING,\n jwt: !!context.env.JWT_SECRET,\n api: !!context.env.API,\n sendEmail: !!context.env.SEND_EMAIL,\n emailDomain: !!context.env.EMAIL_SENDER_DOMAIN,\n },\n }),\n);\n\n// Reject non-POST for all other routes\napp.all('/*', async (context, next) => {\n if (context.req.method !== 'POST') {\n return context.json({ error: 'method not allowed' }, 405);\n }\n await next();\n});\n\n// Sentinel string the api worker signs with JWT_SECRET for platform-internal\n// calls (e.g. POST /email/internal/send). Only the proxy and api hold\n// JWT_SECRET \u2014 user workers do not \u2014 so this gate keeps user code from\n// reaching internal endpoints. Mirrors the same value in\n// `packages/api/src/email/send-verification.ts`; bumping requires a\n// coordinated proxy + api deploy.\nconst PLATFORM_INTERNAL_EMAIL_SENTINEL = 'void-platform-internal-email-v1';\n\n/**\n * Largest base64 payload the platform-internal auth path will hash. Mirrors\n * `MAX_MIME_BYTES` in `email.ts` (10 MiB), expressed as its base64 length with\n * `+4` for padding rounding.\n */\nconst MAX_PLATFORM_MIME_BASE64_LENGTH = Math.ceil((10 * 1024 * 1024 * 4) / 3) + 4;\n\n// Bind a fresh timestamp into the HMAC and require the request to land\n// within this many seconds of \"now\" \u2014 without it, a single observed\n// platformToken would replay forever (the sentinel never changes). Five\n// minutes covers normal clock skew without giving an attacker who\n// observed a token a meaningful replay window.\nconst PLATFORM_TOKEN_MAX_SKEW_SECONDS = 5 * 60;\n\n/**\n * Exact length of a well-formed `platformToken`. The only signer\n * (`signSentinelAtBound` in `packages/api/src/email/send-verification.ts`)\n * emits an HMAC-SHA256 tag \u2014 32 bytes \u2014 as unpadded base64url, and\n * ceil(32 * 4 / 3) = 43 characters is the only length that encodes to. Any\n * other length can never verify, so it is refused before `verifyHmac` runs:\n * `base64urlDecode` copies the token twice through global `replace` (V8\n * materializes one part per match) and then `Uint8Array.from` iterates\n * `atob`'s output one character at a time \u2014 measured, a 30 MB token is\n * ~1.5 GB of transient heap and ~2 s, and a 4 MB one kills a 128 MB heap,\n * the shared proxy isolate's ceiling. This gate runs ahead of any\n * credential check, so without the bound an unauthenticated caller chose\n * that cost.\n */\nconst PLATFORM_TOKEN_LENGTH = 43;\n\n// Auth middleware \u2014 parses body, authenticates, sets projectId\napp.post('/*', async (context, next) => {\n const path = new URL(context.req.url).pathname;\n\n // /email/relay \u2014 the custom-domain inbound hop (design doc 0078, \"Custom\n // domains on Cloudflare\"). A relay worker in the CUSTOMER's account POSTs\n // the raw MIME as the request body \u2014 not JSON \u2014 with the envelope in\n // headers:\n //\n // Authorization: Bearer <relay secret>\n // X-Void-Email-Domain / X-Void-Email-From / X-Void-Email-To\n //\n // so this branch MUST run ahead of the JSON parse below. Modelled on the\n // /email/internal/ branch: every size bound runs BEFORE any crypto, so an\n // unauthenticated caller cannot choose how much hashing or KV work a\n // malformed request buys.\n if (path === '/email/relay') {\n const relayDomain = context.req.header('X-Void-Email-Domain');\n const relayFrom = context.req.header('X-Void-Email-From');\n const relayTo = context.req.header('X-Void-Email-To');\n const relayAuth = context.req.header('Authorization');\n if (!relayDomain || !relayFrom || !relayTo || !relayAuth) {\n return context.json({ error: 'relay envelope required' }, 400);\n }\n // Each header is bounded before it is used. 256 is generous: the\n // bearer is a 43-char secret and RFC 5321 caps an address at 254.\n if (\n relayDomain.length > 256 ||\n relayFrom.length > 256 ||\n relayTo.length > 256 ||\n relayAuth.length > 256\n ) {\n return context.json({ error: 'relay envelope required' }, 400);\n }\n // The MIME cap is checked against the DECLARED length before the body\n // is touched; the handler re-bounds while streaming, since a declared\n // length can lie. A missing length is refused outright \u2014 the relay\n // knows rawSize and always sets it.\n const contentLengthRaw = context.req.header('content-length');\n if (!contentLengthRaw) {\n return context.json({ error: 'content-length required' }, 400);\n }\n const contentLength = Number(contentLengthRaw);\n if (!Number.isInteger(contentLength) || contentLength < 0) {\n return context.json({ error: 'content-length required' }, 400);\n }\n if (contentLength > MAX_MIME_BYTES) {\n return context.json({ error: 'mime too large' }, 413);\n }\n const relaySecret = relayAuth.startsWith('Bearer ') ? relayAuth.slice(7) : null;\n if (!relaySecret) {\n return context.json({ error: 'invalid relay credentials' }, 403);\n }\n // Attribution binds to the envelope RECIPIENT's domain, never to the\n // relay's declared domain header: a catch-all rule can be zone-wide, so\n // a relay can receive mail addressed to a different domain on the same\n // zone \u2014 and its secret must not author that mail. The declared header\n // must equal the recipient's domain; a mismatch means the relay or its\n // wiring is wrong, and the cheap string check runs before any KV work.\n const recipientDomain = relayTo.slice(relayTo.lastIndexOf('@') + 1).toLowerCase();\n if (recipientDomain.length === 0 || recipientDomain !== relayDomain.toLowerCase()) {\n return context.json({ error: 'relay domain mismatch' }, 403);\n }\n // secret \u2192 domain \u2192 project. The mirror carries only the sha256 of the\n // relay secret, so knowledge is proved without KV holding anything\n // reusable; the compare is constant-time against that hash. Read\n // uncached: a revoked or rotated secret must stop working at KV speed.\n const mirror = await readEmailDomainMirror(context.env.ROUTING, recipientDomain);\n if (!mirror) {\n return context.json({ error: 'invalid relay credentials' }, 403);\n }\n const presented = await sha256Hex(relaySecret);\n if (!constantTimeEqual(presented, mirror.relaySecretSha256)) {\n return context.json({ error: 'invalid relay credentials' }, 403);\n }\n if (mirror.status !== 'active') {\n return context.json({ error: 'email domain is not active' }, 403);\n }\n context.set('projectId', mirror.projectId);\n await next();\n return;\n }\n\n let body: ProxyBody;\n try {\n const json = await context.req.json<unknown>();\n if (!isProxyBody(json)) {\n return context.json({ error: 'invalid JSON body' }, 400);\n }\n body = json;\n } catch {\n return context.json({ error: 'invalid JSON body' }, 400);\n }\n context.set('body', body);\n\n // Platform-internal endpoints (e.g. /email/internal/send) authenticate\n // via an HMAC of `<sentinel>.<unixSeconds>.<sha256(from|to|mimeBase64)>`\n // under JWT_SECRET. They have no projectId \u2014 they exist for api \u2192 proxy\n // calls that don't belong to a user project (verification mail, etc.).\n // User-token requests can never reach this path because the sentinel is\n // not a projectId.\n //\n // **Content binding.** The hash binds the token to the (from, to,\n // mimeBase64) tuple it authorizes. Without it, a captured platformToken\n // inside the 5-minute skew window could be replayed against a different\n // recipient or arbitrary MIME bytes \u2014 the timestamp alone has no relation\n // to what the request actually asks the proxy to do. With it, an attacker\n // who observes one verification email's token can only ever resend that\n // exact email; recipient, content, and quota are all locked.\n //\n // The api worker MUST sign:\n // `<sentinel>.<unixSeconds>.<hex sha256 of from|to|mimeBase64>`\n // see `packages/api/src/email/send-verification.ts` for the reference\n // signer. The fields are joined with a literal `|` so a tampering attempt\n // can't slide bytes between them.\n //\n // The prefix is pinned to `/email/internal/` only. A bare `/internal/`\n // prefix would be a footgun: any future handler mounted at root\n // `/internal` would silently inherit sentinel-only auth with no projectId\n // set. Today no such handler exists; if one ever does, it should be\n // mounted under its own feature-prefixed namespace.\n if (path.startsWith('/email/internal/')) {\n const platformToken = asString(body.platformToken);\n const platformTimestamp = asNumber(body.platformTimestamp);\n if (!platformToken || platformTimestamp === null) {\n return context.json({ error: 'platform token required' }, 403);\n }\n // A token of the wrong length is present but can never be valid, so it\n // takes the same opaque refusal as the skew and size gates below \u2014\n // `required` is reserved for an absent token. Checked before anything\n // else touches the token; see `PLATFORM_TOKEN_LENGTH`.\n if (platformToken.length !== PLATFORM_TOKEN_LENGTH) {\n return context.json({ error: 'invalid platform token' }, 403);\n }\n const nowSec = Math.floor(Date.now() / 1000);\n if (Math.abs(nowSec - platformTimestamp) > PLATFORM_TOKEN_MAX_SKEW_SECONDS) {\n // Stale or future-dated token. Don't distinguish for the caller \u2014\n // both look like an invalid token from outside.\n return context.json({ error: 'invalid platform token' }, 403);\n }\n // Bind the token to the body's (from|to|mimeBase64). Pull the raw\n // strings here (asString returns null for non-strings) and compute the\n // same sha256 the api worker computes when signing.\n const bindingFrom = asString(body.from);\n const bindingTo = asString(body.to);\n const bindingMime = asString(body.mimeBase64);\n if (!bindingFrom || !bindingTo || !bindingMime) {\n // No fields to bind \u2014 the request body is malformed for any\n // /email/internal/* handler we expose today. Reject at the auth\n // boundary so the handler doesn't have to re-decide what to do with a\n // partially-authed request.\n return context.json({ error: 'invalid platform token' }, 403);\n }\n // Bound the input BEFORE hashing it. This runs before the token is\n // verified, so an unauthenticated caller would otherwise choose how much\n // sha256 work we do. The bound is the base64 length of the same\n // MAX_MIME_BYTES the handlers enforce; the handler still re-checks the\n // decoded size, this only refuses to hash what can never be valid.\n if (bindingMime.length > MAX_PLATFORM_MIME_BASE64_LENGTH) {\n return context.json({ error: 'invalid platform token' }, 403);\n }\n // The two addresses are hashed alongside the MIME and were the only\n // part of the input left unbounded. The template below flattens\n // `from|to|mime` into one full-size string and `TextEncoder` copies it\n // again (measured: +1x on the heap and +1x external for the pair), so\n // without this an unauthenticated caller with a small MIME still chose\n // two more full-size copies plus the sha256 over them. The bounds are\n // the ones `/email/send` applies to its sender and recipients, and they\n // refuse nothing the only signer sends: `/email/internal/send` accepts\n // exactly `noreply@<EMAIL_SENDER_DOMAIN>` as `from`, and `to` is one\n // address the api worker already bounded at the same 320 when it was\n // registered (`api/src/routes/email.ts`) \u2014 RFC 5321 caps a path at 256\n // octets anyway. Same opaque refusal: from outside, a body that cannot\n // be signed and a body that was not are one case.\n if (bindingFrom.length > MAX_SENDER_LENGTH || bindingTo.length > MAX_RECIPIENT_LENGTH) {\n return context.json({ error: 'invalid platform token' }, 403);\n }\n const contentHash = await sha256Hex(`${bindingFrom}|${bindingTo}|${bindingMime}`);\n const signed = `${PLATFORM_INTERNAL_EMAIL_SENTINEL}.${platformTimestamp}.${contentHash}`;\n if (!(await verifyHmac(signed, platformToken, context.env.JWT_SECRET))) {\n return context.json({ error: 'invalid platform token' }, 403);\n }\n // Internal endpoints don't operate on a project \u2014 leave projectId unset.\n // Downstream handlers must not call context.get('projectId').\n await next();\n return;\n }\n\n const authHeader = context.req.header('authorization');\n if (authHeader?.startsWith('Bearer ')) {\n // HTTPS path (local dev) \u2014 validate JWT\n const token = authHeader.slice(7);\n const payload = await verifyJwt(token, context.env.JWT_SECRET);\n if (!payload) {\n return context.json({ error: 'invalid or expired token' }, 401);\n }\n const projectId = asString(body.projectId);\n if (!projectId) {\n return context.json({ error: 'projectId required' }, 400);\n }\n if (payload.aud === 'prerender') {\n // Prerender credentials are short-lived and already pinned to one\n // project by the API that minted them. Never turn one into a general\n // owner token by accepting a caller-selected projectId.\n if (!payload.project || payload.project !== projectId) {\n return context.json({ error: 'forbidden' }, 403);\n }\n if (\n payload.build &&\n !(await verifyPrerenderBuild(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n payload.build,\n ))\n ) {\n return context.json({ error: 'prerender token build is no longer active' }, 403);\n }\n } else {\n // Full API tokens retain the local-development ownership lookup.\n const owns = await verifyProjectOwner(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n payload.sub,\n );\n if (!owns) {\n return context.json({ error: 'forbidden' }, 403);\n }\n }\n context.set('projectId', projectId);\n } else {\n // Service binding path (production) \u2014 verify HMAC-signed project token\n const projectId = asString(body.projectId);\n const aiToken = asString(body.aiToken);\n if (!projectId || !aiToken) {\n return context.json({ error: 'projectId and aiToken required' }, 400);\n }\n if (!(await verifyHmac(projectId, aiToken, context.env.JWT_SECRET))) {\n return context.json({ error: 'invalid project token' }, 403);\n }\n context.set('projectId', projectId);\n }\n\n await next();\n});\n\n// AI usage limit check \u2014 only applies to AI routes\napp.post('/ai/*', async (context, next) => {\n if (await context.env.ROUTING.get(`ai-block:${context.get('projectId')}`, { cacheTtl: 60 })) {\n return context.json({ error: 'AI usage limit exceeded' }, 429);\n }\n await next();\n});\n\n// Managed Sandbox is unavailable; retain its authenticated error response.\napp.post('/sandbox/*', (context) =>\n context.json(\n {\n error: 'platform capability unavailable',\n capability: 'sandbox',\n message: 'This Void platform does not enable sandbox.',\n },\n 501,\n ),\n);\n\n// Same gate for the email group. A deployed worker on a platform without\n// the email module still holds `__VOID_PROXY` and a valid project token, so\n// an explicit-`from` `sendEmail()` reaches `/email/send` and would otherwise\n// answer with the sender-domain / send-binding configuration failures \u2014 or\n// send, if the operator left the bindings in place. `/email/internal/send`\n// is covered too: its only caller is the api's verification mail, which\n// sits behind the api's own `email` capability gate.\napp.post('/email/*', async (context, next) => {\n if (!proxyCapabilityEnabled(context.env.PLATFORM_CAPABILITIES, 'email')) {\n return context.json(\n {\n error: 'platform capability unavailable',\n capability: 'email',\n message: 'This Void platform does not enable email.',\n },\n 501,\n );\n }\n await next();\n});\n\n// Route groups\napp.route('/ai', ai);\napp.route('/d1', d1);\napp.route('/kv', kv);\napp.route('/r2', r2);\napp.route('/revalidate', revalidate);\napp.route('/email', email);\napp.route('/email', emailRelay);\n\nexport default {\n fetch: app.fetch,\n /**\n * Inbound email entry point \u2014 bound as the catch-all CF Email Routing rule\n * on the platform mail zone. See `email-router.ts`.\n */\n async email(message: ForwardableEmailMessage, env: Env, ctx: ExecutionContext): Promise<void> {\n await routeInbound(message, env, ctx);\n },\n};\n\n// --- HMAC verification ---\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nlet cachedVerifyKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getVerifyKey(secret: string): Promise<CryptoKey> {\n if (cachedVerifyKey && cachedKeySecret === secret) {\n return cachedVerifyKey;\n }\n cachedVerifyKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify'],\n );\n cachedKeySecret = secret;\n return cachedVerifyKey;\n}\n\nasync function sha256Hex(input: string): Promise<string> {\n const digest = await crypto.subtle.digest('SHA-256', encoder.encode(input));\n const bytes = new Uint8Array(digest);\n let out = '';\n for (const b of bytes) {\n out += b.toString(16).padStart(2, '0');\n }\n return out;\n}\n\n/**\n * Constant-time equality for two sha256-hex strings. Length is checked\n * first: both sides are 64-char hex digests in every legitimate use (the\n * mirror's `relaySecretSha256` and the presented secret's hash), so the\n * early out leaks nothing an attacker doesn't already know.\n */\nfunction constantTimeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n let diff = 0;\n for (let i = 0; i < a.length; i++) {\n diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return diff === 0;\n}\n\nasync function verifyHmac(data: string, signature: string, secret: string): Promise<boolean> {\n try {\n const key = await getVerifyKey(secret);\n const sigBytes = base64urlDecode(signature);\n return crypto.subtle.verify('HMAC', key, sigBytes.buffer as ArrayBuffer, encoder.encode(data));\n } catch {\n return false;\n }\n}\n\n// --- JWT verification ---\n\nfunction base64urlDecode(str: string): Uint8Array {\n const padded = str.replace(/-/g, '+').replace(/_/g, '/');\n const binary = atob(padded);\n return Uint8Array.from(binary, (context) => context.charCodeAt(0));\n}\n\nasync function verifyJwt(token: string, secret: string): Promise<JwtPayload | null> {\n const parts = token.split('.');\n if (parts.length !== 3) {\n return null;\n }\n\n const [header, body, signature] = parts;\n\n try {\n const key = await getVerifyKey(secret);\n const sigBytes = base64urlDecode(signature);\n const valid = await crypto.subtle.verify(\n 'HMAC',\n key,\n sigBytes.buffer as ArrayBuffer,\n encoder.encode(`${header}.${body}`),\n );\n if (!valid) {\n return null;\n }\n\n const payload = JSON.parse(decoder.decode(base64urlDecode(body))) as JwtPayload;\n\n const now = Math.floor(Date.now() / 1000);\n if (payload.exp <= now) {\n return null;\n }\n\n if (payload.aud !== 'api' && payload.aud !== 'prerender') {\n return null;\n }\n\n return payload;\n } catch {\n return null;\n }\n}\n", "// src/index.ts\nimport { Hono } from \"./hono.js\";\nimport { Context } from \"./context.js\";\nexport {\n Context,\n Hono\n};\n", "// src/hono.ts\nimport { HonoBase } from \"./hono-base.js\";\nimport { RegExpRouter } from \"./router/reg-exp-router/index.js\";\nimport { SmartRouter } from \"./router/smart-router/index.js\";\nimport { TrieRouter } from \"./router/trie-router/index.js\";\nvar Hono = class extends HonoBase {\n /**\n * Creates an instance of the Hono class.\n *\n * @param options - Optional configuration options for the Hono instance.\n */\n constructor(options = {}) {\n super(options);\n this.router = options.router ?? new SmartRouter({\n routers: [new RegExpRouter(), new TrieRouter()]\n });\n }\n};\nexport {\n Hono\n};\n", "// src/hono-base.ts\nimport { compose } from \"./compose.js\";\nimport { Context } from \"./context.js\";\nimport { METHODS, METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE } from \"./router.js\";\nimport { COMPOSED_HANDLER } from \"./utils/constants.js\";\nimport { getPath, getPathNoStrict, mergePath } from \"./utils/url.js\";\nvar notFoundHandler = (c) => {\n return c.text(\"404 Not Found\", 404);\n};\nvar errorHandler = (err, c) => {\n if (\"getResponse\" in err) {\n const res = err.getResponse();\n return c.newResponse(res.body, res);\n }\n console.error(err);\n return c.text(\"Internal Server Error\", 500);\n};\nvar Hono = class _Hono {\n get;\n post;\n put;\n delete;\n options;\n patch;\n query;\n all;\n on;\n use;\n /*\n This class is like an abstract class and does not have a router.\n To use it, inherit the class and implement router in the constructor.\n */\n router;\n getPath;\n // Cannot use `#` because it requires visibility at JavaScript runtime.\n _basePath = \"/\";\n #path = \"/\";\n routes = [];\n constructor(options = {}) {\n const allMethods = [...METHODS, METHOD_NAME_ALL_LOWERCASE];\n allMethods.forEach((method) => {\n this[method] = (args1, ...args) => {\n const methodName = method.toUpperCase();\n if (typeof args1 === \"string\") {\n this.#path = args1;\n } else {\n this.#addRoute(methodName, this.#path, args1);\n }\n args.forEach((handler) => {\n this.#addRoute(methodName, this.#path, handler);\n });\n return this;\n };\n });\n this.on = (method, path, ...handlers) => {\n for (const p of [path].flat()) {\n this.#path = p;\n for (const m of [method].flat()) {\n const methodName = m.toUpperCase();\n for (const handler of handlers) {\n this.#addRoute(methodName, this.#path, handler);\n }\n }\n }\n return this;\n };\n this.use = (arg1, ...handlers) => {\n if (typeof arg1 === \"string\") {\n this.#path = arg1;\n } else {\n this.#path = \"*\";\n handlers.unshift(arg1);\n }\n handlers.forEach((handler) => {\n this.#addRoute(METHOD_NAME_ALL, this.#path, handler);\n });\n return this;\n };\n const { strict, ...optionsWithoutStrict } = options;\n Object.assign(this, optionsWithoutStrict);\n this.getPath = strict ?? true ? options.getPath ?? getPath : getPathNoStrict;\n }\n #clone() {\n const clone = new _Hono({\n router: this.router,\n getPath: this.getPath\n });\n clone.errorHandler = this.errorHandler;\n clone.#notFoundHandler = this.#notFoundHandler;\n clone.routes = this.routes;\n return clone;\n }\n #notFoundHandler = notFoundHandler;\n // Cannot use `#` because it requires visibility at JavaScript runtime.\n errorHandler = errorHandler;\n /**\n * `.route()` allows grouping other Hono instance in routes.\n *\n * @see {@link https://hono.dev/docs/api/routing#grouping}\n *\n * @param {string} path - base Path\n * @param {Hono} app - other Hono instance\n * @returns {Hono} routed Hono instance\n *\n * @example\n * ```ts\n * const app = new Hono()\n * const app2 = new Hono()\n *\n * app2.get(\"/user\", (c) => c.text(\"user\"))\n * app.route(\"/api\", app2) // GET /api/user\n * ```\n */\n route(path, app) {\n const subApp = this.basePath(path);\n app.routes.map((r) => {\n let handler;\n if (app.errorHandler === errorHandler) {\n handler = r.handler;\n } else {\n handler = async (c, next) => (await compose([], app.errorHandler)(c, () => r.handler(c, next))).res;\n handler[COMPOSED_HANDLER] = r.handler;\n }\n subApp.#addRoute(r.method, r.path, handler, r.basePath);\n });\n return this;\n }\n /**\n * `.basePath()` allows base paths to be specified.\n *\n * @see {@link https://hono.dev/docs/api/routing#base-path}\n *\n * @param {string} path - base Path\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * const api = new Hono().basePath('/api')\n * ```\n */\n basePath(path) {\n const subApp = this.#clone();\n subApp._basePath = mergePath(this._basePath, path);\n return subApp;\n }\n /**\n * `.onError()` handles an error and returns a customized Response.\n *\n * @see {@link https://hono.dev/docs/api/hono#error-handling}\n *\n * @param {ErrorHandler} handler - request Handler for error\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * app.onError((err, c) => {\n * console.error(`${err}`)\n * return c.text('Custom Error Message', 500)\n * })\n * ```\n */\n onError = (handler) => {\n this.errorHandler = handler;\n return this;\n };\n /**\n * `.notFound()` allows you to customize a Not Found Response.\n *\n * @see {@link https://hono.dev/docs/api/hono#not-found}\n *\n * @param {NotFoundHandler} handler - request handler for not-found\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * app.notFound((c) => {\n * return c.text('Custom 404 Message', 404)\n * })\n * ```\n */\n notFound = (handler) => {\n this.#notFoundHandler = handler;\n return this;\n };\n /**\n * `.mount()` allows you to mount applications built with other frameworks into your Hono application.\n *\n * @see {@link https://hono.dev/docs/api/hono#mount}\n *\n * @param {string} path - base Path\n * @param {Function} applicationHandler - other Request Handler\n * @param {MountOptions} [options] - options of `.mount()`\n * @returns {Hono} mounted Hono instance\n *\n * @example\n * ```ts\n * import { Router as IttyRouter } from 'itty-router'\n * import { Hono } from 'hono'\n * // Create itty-router application\n * const ittyRouter = IttyRouter()\n * // GET /itty-router/hello\n * ittyRouter.get('/hello', () => new Response('Hello from itty-router'))\n *\n * const app = new Hono()\n * app.mount('/itty-router', ittyRouter.handle)\n * ```\n *\n * @example\n * ```ts\n * const app = new Hono()\n * // Send the request to another application without modification.\n * app.mount('/app', anotherApp, {\n * replaceRequest: (req) => req,\n * })\n * ```\n */\n mount(path, applicationHandler, options) {\n let replaceRequest;\n let optionHandler;\n if (options) {\n if (typeof options === \"function\") {\n optionHandler = options;\n } else {\n optionHandler = options.optionHandler;\n if (options.replaceRequest === false) {\n replaceRequest = (request) => request;\n } else {\n replaceRequest = options.replaceRequest;\n }\n }\n }\n const getOptions = optionHandler ? (c) => {\n const options2 = optionHandler(c);\n return Array.isArray(options2) ? options2 : [options2];\n } : (c) => {\n let executionContext = void 0;\n try {\n executionContext = c.executionCtx;\n } catch {\n }\n return [c.env, executionContext];\n };\n replaceRequest ||= (() => {\n const mergedPath = mergePath(this._basePath, path);\n const pathPrefixLength = mergedPath === \"/\" ? 0 : mergedPath.length;\n return (request) => {\n const url = new URL(request.url);\n url.pathname = this.getPath(request).slice(pathPrefixLength) || \"/\";\n return new Request(url, request);\n };\n })();\n const handler = async (c, next) => {\n const res = await applicationHandler(replaceRequest(c.req.raw), ...getOptions(c));\n if (res) {\n return res;\n }\n await next();\n };\n this.#addRoute(METHOD_NAME_ALL, mergePath(path, \"*\"), handler);\n return this;\n }\n #addRoute(method, path, handler, baseRoutePath) {\n path = mergePath(this._basePath, path);\n const r = {\n basePath: baseRoutePath !== void 0 ? mergePath(this._basePath, baseRoutePath) : this._basePath,\n path,\n method,\n handler\n };\n this.router.add(method, path, [handler, r]);\n this.routes.push(r);\n }\n #handleError(err, c) {\n if (err instanceof Error) {\n return this.errorHandler(err, c);\n }\n throw err;\n }\n #dispatch(request, executionCtx, env, method) {\n if (method === \"HEAD\") {\n return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, \"GET\")))();\n }\n const path = this.getPath(request, { env });\n const matchResult = this.router.match(method, path);\n const c = new Context(request, {\n path,\n matchResult,\n env,\n executionCtx,\n notFoundHandler: this.#notFoundHandler\n });\n if (matchResult[0].length === 1) {\n let res;\n try {\n res = matchResult[0][0][0][0](c, async () => {\n c.res = await this.#notFoundHandler(c);\n });\n } catch (err) {\n return this.#handleError(err, c);\n }\n return res instanceof Promise ? res.then(\n (resolved) => resolved || (c.finalized ? c.res : this.#notFoundHandler(c))\n ).catch((err) => this.#handleError(err, c)) : res ?? this.#notFoundHandler(c);\n }\n const composed = compose(matchResult[0], this.errorHandler, this.#notFoundHandler);\n return (async () => {\n try {\n const context = await composed(c);\n if (!context.finalized) {\n throw new Error(\n \"Context is not finalized. Did you forget to return a Response object or `await next()`?\"\n );\n }\n return context.res;\n } catch (err) {\n return this.#handleError(err, c);\n }\n })();\n }\n /**\n * `.fetch()` will be entry point of your app.\n *\n * @see {@link https://hono.dev/docs/api/hono#fetch}\n *\n * @param {Request} request - request Object of request\n * @param {Env} env - env Object\n * @param {ExecutionContext} executionCtx - context of execution\n * @returns {Response | Promise<Response>} response of request\n *\n */\n fetch = (request, ...rest) => {\n return this.#dispatch(request, rest[1], rest[0], request.method);\n };\n /**\n * `.request()` is a useful method for testing.\n * You can pass a URL or pathname to send a GET request.\n * app will return a Response object.\n * ```ts\n * test('GET /hello is ok', async () => {\n * const res = await app.request('/hello')\n * expect(res.status).toBe(200)\n * })\n * ```\n * @see https://hono.dev/docs/api/hono#request\n */\n request = (input, requestInit, Env, executionCtx) => {\n if (input instanceof Request) {\n return this.fetch(requestInit ? new Request(input, requestInit) : input, Env, executionCtx);\n }\n input = input.toString();\n return this.fetch(\n new Request(\n /^https?:\\/\\//.test(input) ? input : `http://localhost${mergePath(\"/\", input)}`,\n requestInit\n ),\n Env,\n executionCtx\n );\n };\n /**\n * `.fire()` automatically adds a global fetch event listener.\n * This can be useful for environments that adhere to the Service Worker API, such as non-ES module Cloudflare Workers.\n * @deprecated\n * Use `fire` from `hono/service-worker` instead.\n * ```ts\n * import { Hono } from 'hono'\n * import { fire } from 'hono/service-worker'\n *\n * const app = new Hono()\n * // ...\n * fire(app)\n * ```\n * @see https://hono.dev/docs/api/hono#fire\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API\n * @see https://developers.cloudflare.com/workers/reference/migrate-to-module-workers/\n */\n fire = () => {\n addEventListener(\"fetch\", (event) => {\n event.respondWith(this.#dispatch(event.request, event, void 0, event.request.method));\n });\n };\n};\nexport {\n Hono as HonoBase\n};\n", "// src/compose.ts\nvar compose = (middleware, onError, onNotFound) => {\n return (context, next) => {\n let index = -1;\n return dispatch(0);\n async function dispatch(i) {\n if (i <= index) {\n throw new Error(\"next() called multiple times\");\n }\n index = i;\n let res;\n let isError = false;\n let handler;\n if (middleware[i]) {\n handler = middleware[i][0][0];\n context.req.routeIndex = i;\n } else {\n handler = i === middleware.length && next || void 0;\n }\n if (handler) {\n try {\n res = await handler(context, () => dispatch(i + 1));\n } catch (err) {\n if (err instanceof Error && onError) {\n context.error = err;\n res = await onError(err, context);\n isError = true;\n } else {\n throw err;\n }\n }\n } else {\n if (context.finalized === false && onNotFound) {\n res = await onNotFound(context);\n }\n }\n if (res && (context.finalized === false || isError)) {\n context.res = res;\n }\n return context;\n }\n };\n};\nexport {\n compose\n};\n", "// src/context.ts\nimport { HonoRequest } from \"./request.js\";\nimport { HtmlEscapedCallbackPhase, resolveCallback } from \"./utils/html.js\";\nvar TEXT_PLAIN = \"text/plain; charset=UTF-8\";\nvar setDefaultContentType = (contentType, headers) => {\n return {\n \"Content-Type\": contentType,\n ...headers\n };\n};\nvar createResponseInstance = (body, init) => new Response(body, init);\nvar Context = class {\n #rawRequest;\n #req;\n /**\n * `.env` can get bindings (environment variables, secrets, KV namespaces, D1 database, R2 bucket etc.) in Cloudflare Workers.\n *\n * @see {@link https://hono.dev/docs/api/context#env}\n *\n * @example\n * ```ts\n * // Environment object for Cloudflare Workers\n * app.get('*', async c => {\n * const counter = c.env.COUNTER\n * })\n * ```\n */\n env = {};\n #var;\n finalized = false;\n /**\n * `.error` can get the error object from the middleware if the Handler throws an error.\n *\n * @see {@link https://hono.dev/docs/api/context#error}\n *\n * @example\n * ```ts\n * app.use('*', async (c, next) => {\n * await next()\n * if (c.error) {\n * // do something...\n * }\n * })\n * ```\n */\n error;\n #status;\n #executionCtx;\n #res;\n #layout;\n #renderer;\n #notFoundHandler;\n #preparedHeaders;\n #matchResult;\n #path;\n /**\n * Creates an instance of the Context class.\n *\n * @param req - The Request object.\n * @param options - Optional configuration options for the context.\n */\n constructor(req, options) {\n this.#rawRequest = req;\n if (options) {\n this.#executionCtx = options.executionCtx;\n this.env = options.env;\n this.#notFoundHandler = options.notFoundHandler;\n this.#path = options.path;\n this.#matchResult = options.matchResult;\n }\n }\n /**\n * `.req` is the instance of {@link HonoRequest}.\n */\n get req() {\n this.#req ??= new HonoRequest(this.#rawRequest, this.#path, this.#matchResult);\n return this.#req;\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#event}\n * The FetchEvent associated with the current request.\n *\n * @throws Will throw an error if the context does not have a FetchEvent.\n */\n get event() {\n if (this.#executionCtx && \"respondWith\" in this.#executionCtx) {\n return this.#executionCtx;\n } else {\n throw Error(\"This context has no FetchEvent\");\n }\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#executionctx}\n * The ExecutionContext associated with the current request.\n *\n * @throws Will throw an error if the context does not have an ExecutionContext.\n */\n get executionCtx() {\n if (this.#executionCtx) {\n return this.#executionCtx;\n } else {\n throw Error(\"This context has no ExecutionContext\");\n }\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#res}\n * The Response object for the current request.\n */\n get res() {\n return this.#res ||= createResponseInstance(null, {\n headers: this.#preparedHeaders ??= new Headers()\n });\n }\n /**\n * Sets the Response object for the current request.\n *\n * @param _res - The Response object to set.\n */\n set res(_res) {\n if (this.#res && _res) {\n _res = createResponseInstance(_res.body, _res);\n for (const [k, v] of this.#res.headers.entries()) {\n if (k === \"content-type\") {\n continue;\n }\n if (k === \"set-cookie\") {\n const cookies = this.#res.headers.getSetCookie();\n _res.headers.delete(\"set-cookie\");\n for (const cookie of cookies) {\n _res.headers.append(\"set-cookie\", cookie);\n }\n } else {\n _res.headers.set(k, v);\n }\n }\n }\n this.#res = _res;\n this.finalized = true;\n }\n /**\n * `.render()` can create a response within a layout.\n *\n * @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n *\n * @example\n * ```ts\n * app.get('/', (c) => {\n * return c.render('Hello!')\n * })\n * ```\n */\n render = (...args) => {\n this.#renderer ??= (content) => this.html(content);\n return this.#renderer(...args);\n };\n /**\n * Sets the layout for the response.\n *\n * @param layout - The layout to set.\n * @returns The layout function.\n */\n setLayout = (layout) => this.#layout = layout;\n /**\n * Gets the current layout for the response.\n *\n * @returns The current layout function.\n */\n getLayout = () => this.#layout;\n /**\n * `.setRenderer()` can set the layout in the custom middleware.\n *\n * @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n *\n * @example\n * ```tsx\n * app.use('*', async (c, next) => {\n * c.setRenderer((content) => {\n * return c.html(\n * <html>\n * <body>\n * <p>{content}</p>\n * </body>\n * </html>\n * )\n * })\n * await next()\n * })\n * ```\n */\n setRenderer = (renderer) => {\n this.#renderer = renderer;\n };\n /**\n * `.header()` can set headers.\n *\n * @see {@link https://hono.dev/docs/api/context#header}\n *\n * @example\n * ```ts\n * app.get('/welcome', (c) => {\n * // Set headers\n * c.header('X-Message', 'Hello!')\n * c.header('Content-Type', 'text/plain')\n *\n * // Append multiple headers using the append option (e.g. Vary)\n * c.header('Vary', 'Accept-Encoding', { append: true })\n * c.header('Vary', 'User-Agent', { append: true })\n *\n * return c.body('Thank you for coming')\n * })\n * ```\n */\n header = (name, value, options) => {\n if (this.finalized) {\n this.#res = createResponseInstance(this.#res.body, this.#res);\n }\n const headers = this.#res ? this.#res.headers : this.#preparedHeaders ??= new Headers();\n if (value === void 0) {\n headers.delete(name);\n } else if (options?.append) {\n headers.append(name, value);\n } else {\n headers.set(name, value);\n }\n };\n status = (status) => {\n this.#status = status;\n };\n /**\n * `.set()` can set the value specified by the key.\n *\n * @see {@link https://hono.dev/docs/api/context#set-get}\n *\n * @example\n * ```ts\n * app.use('*', async (c, next) => {\n * c.set('message', 'Hono is hot!!')\n * await next()\n * })\n * ```\n */\n set = (key, value) => {\n this.#var ??= /* @__PURE__ */ new Map();\n this.#var.set(key, value);\n };\n /**\n * `.get()` can use the value specified by the key.\n *\n * @see {@link https://hono.dev/docs/api/context#set-get}\n *\n * @example\n * ```ts\n * app.get('/', (c) => {\n * const message = c.get('message')\n * return c.text(`The message is \"${message}\"`)\n * })\n * ```\n */\n get = (key) => {\n return this.#var ? this.#var.get(key) : void 0;\n };\n /**\n * `.var` can access the value of a variable.\n *\n * @see {@link https://hono.dev/docs/api/context#var}\n *\n * @example\n * ```ts\n * const result = c.var.client.oneMethod()\n * ```\n */\n // c.var.propName is a read-only\n get var() {\n if (!this.#var) {\n return {};\n }\n return Object.fromEntries(this.#var);\n }\n #newResponse(data, arg, headers) {\n let responseHeaders = this.#res ? new Headers(this.#res.headers) : this.#preparedHeaders;\n if (typeof arg === \"object\" && arg.headers) {\n responseHeaders ??= new Headers();\n for (const [key, value] of new Headers(arg.headers)) {\n if (key === \"set-cookie\") {\n responseHeaders.append(key, value);\n } else {\n responseHeaders.set(key, value);\n }\n }\n }\n if (headers) {\n if (!responseHeaders) {\n let count = 0;\n for (const k in headers) {\n if (++count > 1 || typeof headers[k] !== \"string\") {\n responseHeaders = new Headers();\n break;\n }\n }\n }\n if (responseHeaders) {\n for (const k in headers) {\n const v = headers[k];\n if (typeof v === \"string\") {\n responseHeaders.set(k, v);\n } else {\n responseHeaders.delete(k);\n for (const v2 of v) {\n responseHeaders.append(k, v2);\n }\n }\n }\n }\n }\n const status = typeof arg === \"number\" ? arg : arg?.status ?? this.#status;\n return createResponseInstance(data, {\n status,\n headers: responseHeaders ?? headers\n });\n }\n newResponse = (...args) => this.#newResponse(...args);\n /**\n * `.body()` can return the HTTP response.\n * You can set headers with `.header()` and set HTTP status code with `.status`.\n * This can also be set in `.text()`, `.json()` and so on.\n *\n * @see {@link https://hono.dev/docs/api/context#body}\n *\n * @example\n * ```ts\n * app.get('/welcome', (c) => {\n * // Set headers\n * c.header('X-Message', 'Hello!')\n * c.header('Content-Type', 'text/plain')\n * // Set HTTP status code\n * c.status(201)\n *\n * // Return the response body\n * return c.body('Thank you for coming')\n * })\n * ```\n */\n body = (data, arg, headers) => this.#newResponse(data, arg, headers);\n /**\n * `.text()` can render text as `Content-Type:text/plain`.\n *\n * @see {@link https://hono.dev/docs/api/context#text}\n *\n * @example\n * ```ts\n * app.get('/say', (c) => {\n * return c.text('Hello!')\n * })\n * ```\n */\n text = (text, arg, headers) => {\n return !this.#preparedHeaders && !this.#status && !arg && !headers && !this.finalized ? new Response(text) : this.#newResponse(\n text,\n arg,\n setDefaultContentType(TEXT_PLAIN, headers)\n );\n };\n /**\n * `.json()` can render JSON as `Content-Type:application/json`.\n *\n * @see {@link https://hono.dev/docs/api/context#json}\n *\n * @example\n * ```ts\n * app.get('/api', (c) => {\n * return c.json({ message: 'Hello!' })\n * })\n * ```\n */\n json = (object, arg, headers) => {\n return this.#newResponse(\n JSON.stringify(object),\n arg,\n setDefaultContentType(\"application/json\", headers)\n );\n };\n html = (html, arg, headers) => {\n const res = (html2) => this.#newResponse(html2, arg, setDefaultContentType(\"text/html; charset=UTF-8\", headers));\n return typeof html === \"object\" ? resolveCallback(html, HtmlEscapedCallbackPhase.Stringify, false, {}).then(res) : res(html);\n };\n /**\n * `.redirect()` can Redirect, default status code is 302.\n *\n * @see {@link https://hono.dev/docs/api/context#redirect}\n *\n * @example\n * ```ts\n * app.get('/redirect', (c) => {\n * return c.redirect('/')\n * })\n * app.get('/redirect-permanently', (c) => {\n * return c.redirect('/', 301)\n * })\n * ```\n */\n redirect = (location, status) => {\n const locationString = String(location);\n this.header(\n \"Location\",\n // Multibyes should be encoded\n // eslint-disable-next-line no-control-regex\n !/[^\\x00-\\xFF]/.test(locationString) ? locationString : encodeURI(locationString)\n );\n return this.newResponse(null, status ?? 302);\n };\n /**\n * `.notFound()` can return the Not Found Response.\n *\n * @see {@link https://hono.dev/docs/api/context#notfound}\n *\n * @example\n * ```ts\n * app.get('/notfound', (c) => {\n * return c.notFound()\n * })\n * ```\n */\n notFound = () => {\n this.#notFoundHandler ??= () => createResponseInstance();\n return this.#notFoundHandler(this);\n };\n};\nexport {\n Context,\n TEXT_PLAIN\n};\n", "// src/request.ts\nimport { HTTPException } from \"./http-exception.js\";\nimport { GET_MATCH_RESULT } from \"./request/constants.js\";\nimport { parseBody } from \"./utils/body.js\";\nimport { getQueryParam, getQueryParams, tryDecodeURIComponent } from \"./utils/url.js\";\nvar HonoRequest = class {\n /**\n * `.raw` can get the raw Request object.\n *\n * @see {@link https://hono.dev/docs/api/request#raw}\n *\n * @example\n * ```ts\n * // For Cloudflare Workers\n * app.post('/', async (c) => {\n * const metadata = c.req.raw.cf?.hostMetadata?\n * ...\n * })\n * ```\n */\n raw;\n #validatedData;\n // Short name of validatedData\n #matchResult;\n routeIndex = 0;\n /**\n * `.path` can get the pathname of the request.\n *\n * @see {@link https://hono.dev/docs/api/request#path}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const pathname = c.req.path // `/about/me`\n * })\n * ```\n */\n path;\n bodyCache = {};\n constructor(request, path = \"/\", matchResult = [[]]) {\n this.raw = request;\n this.path = path;\n this.#matchResult = matchResult;\n }\n param(key) {\n return key ? this.#getDecodedParam(key) : this.#getAllDecodedParams();\n }\n #getDecodedParam(key) {\n const paramKey = this.#matchResult[0][this.routeIndex]?.[1][key];\n const param = this.#getParamValue(paramKey);\n return param && tryDecodeURIComponent(param);\n }\n #getAllDecodedParams() {\n const decoded = {};\n const keys = Object.keys(this.#matchResult[0][this.routeIndex]?.[1] ?? {});\n for (const key of keys) {\n const value = this.#getParamValue(this.#matchResult[0][this.routeIndex][1][key]);\n if (value !== void 0) {\n decoded[key] = tryDecodeURIComponent(value);\n }\n }\n return decoded;\n }\n #getParamValue(paramKey) {\n return this.#matchResult[1] ? this.#matchResult[1][paramKey] : paramKey;\n }\n query(key) {\n return getQueryParam(this.url, key);\n }\n queries(key) {\n return getQueryParams(this.url, key);\n }\n header(name) {\n if (name) {\n return this.raw.headers.get(name) ?? void 0;\n }\n const headerData = /* @__PURE__ */ Object.create(null);\n this.raw.headers.forEach((value, key) => {\n headerData[key] = value;\n });\n return headerData;\n }\n async parseBody(options) {\n return parseBody(this, options);\n }\n #cachedBody = (key) => {\n const { bodyCache, raw } = this;\n const cachedBody = bodyCache[key];\n if (cachedBody) {\n return cachedBody;\n }\n for (const anyCachedKey in bodyCache) {\n return bodyCache[anyCachedKey].then((body) => {\n if (anyCachedKey === \"json\") {\n body = JSON.stringify(body);\n }\n return new Response(body)[key]();\n });\n }\n return bodyCache[key] = raw[key]();\n };\n /**\n * `.json()` can parse Request body of type `application/json`\n *\n * @see {@link https://hono.dev/docs/api/request#json}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.json()\n * })\n * ```\n */\n json() {\n return this.#cachedBody(\"text\").then((text) => JSON.parse(text));\n }\n /**\n * `.text()` can parse Request body of type `text/plain`\n *\n * @see {@link https://hono.dev/docs/api/request#text}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.text()\n * })\n * ```\n */\n text() {\n return this.#cachedBody(\"text\");\n }\n /**\n * `.arrayBuffer()` parse Request body as an `ArrayBuffer`\n *\n * @see {@link https://hono.dev/docs/api/request#arraybuffer}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.arrayBuffer()\n * })\n * ```\n */\n arrayBuffer() {\n return this.#cachedBody(\"arrayBuffer\");\n }\n /**\n * `.bytes()` parses the request body as a `Uint8Array`.\n *\n * @see {@link https://hono.dev/docs/api/request#bytes}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.bytes()\n * })\n * ```\n */\n bytes() {\n return this.#cachedBody(\"arrayBuffer\").then((buffer) => new Uint8Array(buffer));\n }\n /**\n * Parses the request body as a `Blob`.\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.blob();\n * });\n * ```\n * @see https://hono.dev/docs/api/request#blob\n */\n blob() {\n return this.#cachedBody(\"blob\");\n }\n /**\n * Parses the request body as `FormData`.\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.formData();\n * });\n * ```\n * @see https://hono.dev/docs/api/request#formdata\n */\n formData() {\n return this.#cachedBody(\"formData\");\n }\n /**\n * Adds validated data to the request.\n *\n * @param target - The target of the validation.\n * @param data - The validated data to add.\n */\n addValidatedData(target, data) {\n ;\n (this.#validatedData ??= {})[target] = data;\n }\n valid(target) {\n return this.#validatedData?.[target];\n }\n /**\n * `.url()` can get the request url strings.\n *\n * @see {@link https://hono.dev/docs/api/request#url}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const url = c.req.url // `http://localhost:8787/about/me`\n * ...\n * })\n * ```\n */\n get url() {\n return this.raw.url;\n }\n /**\n * `.method()` can get the method name of the request.\n *\n * @see {@link https://hono.dev/docs/api/request#method}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const method = c.req.method // `GET`\n * })\n * ```\n */\n get method() {\n return this.raw.method;\n }\n get [GET_MATCH_RESULT]() {\n return this.#matchResult;\n }\n /**\n * `.matchedRoutes()` can return a matched route in the handler\n *\n * @deprecated\n *\n * Use matchedRoutes helper defined in \"hono/route\" instead.\n *\n * @see {@link https://hono.dev/docs/api/request#matchedroutes}\n *\n * @example\n * ```ts\n * app.use('*', async function logger(c, next) {\n * await next()\n * c.req.matchedRoutes.forEach(({ handler, method, path }, i) => {\n * const name = handler.name || (handler.length < 2 ? '[handler]' : '[middleware]')\n * console.log(\n * method,\n * ' ',\n * path,\n * ' '.repeat(Math.max(10 - path.length, 0)),\n * name,\n * i === c.req.routeIndex ? '<- respond from here' : ''\n * )\n * })\n * })\n * ```\n */\n get matchedRoutes() {\n return this.#matchResult[0].map(([[, route]]) => route);\n }\n /**\n * `routePath()` can retrieve the path registered within the handler\n *\n * @deprecated\n *\n * Use routePath helper defined in \"hono/route\" instead.\n *\n * @see {@link https://hono.dev/docs/api/request#routepath}\n *\n * @example\n * ```ts\n * app.get('/posts/:id', (c) => {\n * return c.json({ path: c.req.routePath })\n * })\n * ```\n */\n get routePath() {\n return this.#matchResult[0].map(([[, route]]) => route)[this.routeIndex].path;\n }\n};\nvar cloneRawRequest = async (req) => {\n if (!req.raw.bodyUsed) {\n return req.raw.clone();\n }\n const cacheKey = Object.keys(req.bodyCache)[0];\n if (!cacheKey) {\n throw new HTTPException(500, {\n message: \"Cannot clone request: body was already consumed and not cached. Please use HonoRequest methods (e.g., req.json(), req.text()) instead of consuming req.raw directly.\"\n });\n }\n let body = await req[cacheKey]();\n const headers = req.header();\n if (cacheKey === \"json\") {\n body = JSON.stringify(body);\n delete headers[\"content-length\"];\n } else if (body instanceof FormData) {\n delete headers[\"content-type\"];\n delete headers[\"content-length\"];\n }\n const requestInit = {\n body,\n cache: req.raw.cache,\n credentials: req.raw.credentials,\n headers,\n integrity: req.raw.integrity,\n keepalive: req.raw.keepalive,\n method: req.method,\n mode: req.raw.mode,\n redirect: req.raw.redirect,\n referrer: req.raw.referrer,\n referrerPolicy: req.raw.referrerPolicy,\n signal: req.raw.signal\n };\n return new Request(req.url, requestInit);\n};\nexport {\n HonoRequest,\n cloneRawRequest\n};\n", "// src/http-exception.ts\nvar HTTPException = class extends Error {\n res;\n status;\n /**\n * Creates an instance of `HTTPException`.\n * @param status - HTTP status code for the exception. Defaults to 500.\n * @param options - Additional options for the exception.\n */\n constructor(status = 500, options) {\n super(options?.message, { cause: options?.cause });\n this.res = options?.res;\n this.status = status;\n }\n /**\n * Returns the response object associated with the exception.\n * If a response object is not provided, a new response is created with the error message and status code.\n * @returns The response object.\n */\n getResponse() {\n if (this.res) {\n const newResponse = new Response(this.res.body, {\n status: this.status,\n headers: this.res.headers\n });\n return newResponse;\n }\n return new Response(this.message, {\n status: this.status\n });\n }\n};\nexport {\n HTTPException\n};\n", "// src/request/constants.ts\nvar GET_MATCH_RESULT = /* @__PURE__ */ Symbol();\nexport {\n GET_MATCH_RESULT\n};\n", "// src/utils/body.ts\nimport { bufferToFormData } from \"./buffer.js\";\nvar MAX_NESTING_DEPTH = 32;\nvar MAX_NESTED_OBJECTS = 1e4;\nvar isRawRequest = (request) => \"headers\" in request;\nvar parseBody = async (request, options = /* @__PURE__ */ Object.create(null)) => {\n const { all = false, dot = false } = options;\n const headers = isRawRequest(request) ? request.headers : request.raw.headers;\n const contentType = headers.get(\"Content-Type\");\n const mediaType = contentType?.split(\";\")[0].trim().toLowerCase();\n if (mediaType === \"multipart/form-data\" || mediaType === \"application/x-www-form-urlencoded\") {\n return parseFormData(request, { all, dot });\n }\n return {};\n};\nasync function parseFormData(request, options) {\n if (!isRawRequest(request) && request.bodyCache.formData) {\n return convertFormDataToBodyData(\n await request.bodyCache.formData,\n options\n );\n }\n const headers = isRawRequest(request) ? request.headers : request.raw.headers;\n const arrayBuffer = await request.arrayBuffer();\n const formDataPromise = bufferToFormData(arrayBuffer, headers.get(\"Content-Type\") || \"\");\n if (!isRawRequest(request)) {\n request.bodyCache.formData = formDataPromise;\n }\n const formData = await formDataPromise;\n if (formData) {\n return convertFormDataToBodyData(formData, options);\n }\n return {};\n}\nfunction convertFormDataToBodyData(formData, options) {\n const form = /* @__PURE__ */ Object.create(null);\n const nestingState = { count: 0 };\n formData.forEach((value, key) => {\n const shouldParseAllValues = options.all || key.endsWith(\"[]\");\n if (!shouldParseAllValues) {\n form[key] = value;\n } else {\n handleParsingAllValues(form, key, value);\n }\n });\n if (options.dot) {\n Object.entries(form).forEach(([key, value]) => {\n const shouldParseDotValues = key.includes(\".\");\n if (shouldParseDotValues) {\n handleParsingNestedValues(form, key, value, nestingState);\n delete form[key];\n }\n });\n }\n return form;\n}\nvar handleParsingAllValues = (form, key, value) => {\n if (form[key] !== void 0) {\n if (Array.isArray(form[key])) {\n ;\n form[key].push(value);\n } else {\n form[key] = [form[key], value];\n }\n } else {\n if (!key.endsWith(\"[]\")) {\n form[key] = value;\n } else {\n form[key] = [value];\n }\n }\n};\nvar handleParsingNestedValues = (form, key, value, state) => {\n if (/(?:^|\\.)__proto__\\./.test(key)) {\n return;\n }\n let nestedForm = form;\n const keys = key.split(\".\", MAX_NESTING_DEPTH + 2);\n if (keys.length > MAX_NESTING_DEPTH + 1) {\n throwNestingLimitExceeded();\n }\n keys.forEach((key2, index) => {\n if (index === keys.length - 1) {\n nestedForm[key2] = value;\n } else {\n if (!nestedForm[key2] || typeof nestedForm[key2] !== \"object\" || Array.isArray(nestedForm[key2]) || nestedForm[key2] instanceof File) {\n if (state.count++ >= MAX_NESTED_OBJECTS) {\n throwNestingLimitExceeded();\n }\n nestedForm[key2] = /* @__PURE__ */ Object.create(null);\n }\n nestedForm = nestedForm[key2];\n }\n });\n};\nvar throwNestingLimitExceeded = () => {\n throw new Error(\"Nesting limit exceeded\");\n};\nexport {\n parseBody\n};\n", "// src/utils/buffer.ts\nimport { sha256 } from \"./crypto.js\";\nvar equal = (a, b) => {\n if (a === b) {\n return true;\n }\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n const va = new DataView(a);\n const vb = new DataView(b);\n let i = va.byteLength;\n while (i--) {\n if (va.getUint8(i) !== vb.getUint8(i)) {\n return false;\n }\n }\n return true;\n};\nvar constantTimeEqualString = (a, b) => {\n const aLen = a.length;\n const bLen = b.length;\n const maxLen = Math.max(aLen, bLen);\n let out = aLen ^ bLen;\n for (let i = 0; i < maxLen; i++) {\n const aChar = i < aLen ? a.charCodeAt(i) : 0;\n const bChar = i < bLen ? b.charCodeAt(i) : 0;\n out |= aChar ^ bChar;\n }\n return out === 0;\n};\nvar timingSafeEqualString = async (a, b, hashFunction) => {\n if (!hashFunction) {\n hashFunction = sha256;\n }\n const [sa, sb] = await Promise.all([hashFunction(a), hashFunction(b)]);\n if (sa == null || sb == null || typeof sa !== \"string\" || typeof sb !== \"string\") {\n return false;\n }\n const hashEqual = constantTimeEqualString(sa, sb);\n const originalEqual = constantTimeEqualString(a, b);\n return hashEqual && originalEqual;\n};\nvar timingSafeEqual = async (a, b, hashFunction) => {\n if (typeof a === \"string\" && typeof b === \"string\") {\n return timingSafeEqualString(a, b, hashFunction);\n }\n if (!hashFunction) {\n hashFunction = sha256;\n }\n const [sa, sb] = await Promise.all([hashFunction(a), hashFunction(b)]);\n if (!sa || !sb || typeof sa !== \"string\" || typeof sb !== \"string\") {\n return false;\n }\n return timingSafeEqualString(sa, sb);\n};\nvar bufferToString = (buffer) => {\n if (buffer instanceof ArrayBuffer) {\n const enc = new TextDecoder(\"utf-8\");\n return enc.decode(buffer);\n }\n return buffer;\n};\nvar bufferToFormData = (arrayBuffer, contentType) => {\n const response = new Response(arrayBuffer, {\n headers: {\n // Normalize the media type (case-insensitive) while keeping parameters like the boundary\n \"Content-Type\": contentType.replace(/^[^;]+/, (mediaType) => mediaType.toLowerCase())\n }\n });\n return response.formData();\n};\nexport {\n bufferToFormData,\n bufferToString,\n equal,\n timingSafeEqual\n};\n", "// src/utils/crypto.ts\nvar sha256 = async (data) => {\n const algorithm = { name: \"SHA-256\", alias: \"sha256\" };\n const hash = await createHash(data, algorithm);\n return hash;\n};\nvar sha1 = async (data) => {\n const algorithm = { name: \"SHA-1\", alias: \"sha1\" };\n const hash = await createHash(data, algorithm);\n return hash;\n};\nvar md5 = async (data) => {\n const algorithm = { name: \"MD5\", alias: \"md5\" };\n const hash = await createHash(data, algorithm);\n return hash;\n};\nvar createHash = async (data, algorithm) => {\n let sourceBuffer;\n if (ArrayBuffer.isView(data) || data instanceof ArrayBuffer) {\n sourceBuffer = data;\n } else {\n if (typeof data === \"object\") {\n data = JSON.stringify(data);\n }\n sourceBuffer = new TextEncoder().encode(String(data));\n }\n if (crypto && crypto.subtle) {\n const buffer = await crypto.subtle.digest(\n {\n name: algorithm.name\n },\n sourceBuffer\n );\n const hash = Array.prototype.map.call(new Uint8Array(buffer), (x) => (\"00\" + x.toString(16)).slice(-2)).join(\"\");\n return hash;\n }\n return null;\n};\nexport {\n createHash,\n md5,\n sha1,\n sha256\n};\n", "// src/utils/url.ts\nvar splitPath = (path) => {\n const paths = path.split(\"/\");\n if (paths[0] === \"\") {\n paths.shift();\n }\n return paths;\n};\nvar splitRoutingPath = (routePath) => {\n const { groups, path } = extractGroupsFromPath(routePath);\n const paths = splitPath(path);\n return replaceGroupMarks(paths, groups);\n};\nvar extractGroupsFromPath = (path) => {\n const groups = [];\n path = path.replace(/\\{[^}]+\\}/g, (match, index) => {\n const mark = `@${index}`;\n groups.push([mark, match]);\n return mark;\n });\n return { groups, path };\n};\nvar replaceGroupMarks = (paths, groups) => {\n for (let i = groups.length - 1; i >= 0; i--) {\n const [mark] = groups[i];\n for (let j = paths.length - 1; j >= 0; j--) {\n if (paths[j].includes(mark)) {\n paths[j] = paths[j].replace(mark, groups[i][1]);\n break;\n }\n }\n }\n return paths;\n};\nvar patternCache = {};\nvar getPattern = (label, next) => {\n if (label === \"*\") {\n return \"*\";\n }\n const match = label.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n if (match) {\n const cacheKey = `${label}#${next}`;\n if (!patternCache[cacheKey]) {\n if (match[2]) {\n patternCache[cacheKey] = next && next[0] !== \":\" && next[0] !== \"*\" ? [cacheKey, match[1], new RegExp(`^${match[2]}(?=/${next})`)] : [label, match[1], new RegExp(`^${match[2]}$`)];\n } else {\n patternCache[cacheKey] = [label, match[1], true];\n }\n }\n return patternCache[cacheKey];\n }\n return null;\n};\nvar tryDecode = (str, decoder) => {\n try {\n return decoder(str);\n } catch {\n return str.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match) => {\n try {\n return decoder(match);\n } catch {\n return match;\n }\n });\n }\n};\nvar tryDecodeURI = (str) => tryDecode(str, decodeURI);\nvar getPath = (request) => {\n const url = request.url;\n const start = url.indexOf(\"/\", url.indexOf(\":\") + 4);\n let i = start;\n for (; i < url.length; i++) {\n const charCode = url.charCodeAt(i);\n if (charCode === 37) {\n const queryIndex = url.indexOf(\"?\", i);\n const hashIndex = url.indexOf(\"#\", i);\n const end = queryIndex === -1 ? hashIndex === -1 ? void 0 : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex);\n const path = url.slice(start, end);\n return tryDecodeURI(path.includes(\"%25\") ? path.replace(/%25/g, \"%2525\") : path);\n } else if (charCode === 63 || charCode === 35) {\n break;\n }\n }\n return url.slice(start, i);\n};\nvar getQueryStrings = (url) => {\n const queryIndex = url.indexOf(\"?\", 8);\n if (queryIndex === -1) {\n return \"\";\n }\n const hashIndex = url.indexOf(\"#\", 8);\n return hashIndex === -1 ? url.slice(queryIndex) : queryIndex < hashIndex ? url.slice(queryIndex, hashIndex) : \"\";\n};\nvar getPathNoStrict = (request) => {\n const result = getPath(request);\n return result.length > 1 && result.at(-1) === \"/\" ? result.slice(0, -1) : result;\n};\nvar mergePath = (base, sub, ...rest) => {\n if (rest.length) {\n sub = mergePath(sub, ...rest);\n }\n return `${base?.[0] === \"/\" ? \"\" : \"/\"}${base}${sub === \"/\" ? \"\" : `${base?.at(-1) === \"/\" ? \"\" : \"/\"}${sub?.[0] === \"/\" ? sub.slice(1) : sub}`}`;\n};\nvar checkOptionalParameter = (path) => {\n if (path.charCodeAt(path.length - 1) !== 63 || !path.includes(\":\")) {\n return null;\n }\n const segments = path.split(\"/\");\n const results = [];\n let basePath = \"\";\n segments.forEach((segment) => {\n if (segment !== \"\" && !/\\:/.test(segment)) {\n basePath += \"/\" + segment;\n } else if (/\\:/.test(segment)) {\n if (segment.charCodeAt(segment.length - 1) === 63) {\n if (results.length === 0 && basePath === \"\") {\n results.push(\"/\");\n } else {\n results.push(basePath);\n }\n const optionalSegment = segment.slice(0, -1);\n basePath += \"/\" + optionalSegment;\n results.push(basePath);\n } else {\n basePath += \"/\" + segment;\n }\n }\n });\n return results.filter((v, i, a) => a.indexOf(v) === i);\n};\nvar tryDecodeURIComponent = (str) => str.indexOf(\"%\") !== -1 ? tryDecode(str, decodeURIComponent_) : str;\nvar _decodeURI = (value) => {\n if (value.indexOf(\"+\") !== -1) {\n value = value.replace(/\\+/g, \" \");\n }\n return tryDecodeURIComponent(value);\n};\nvar _getQueryParam = (url, key, multiple) => {\n const hashIndex = url.indexOf(\"#\", 8);\n if (hashIndex !== -1) {\n url = url.slice(0, hashIndex);\n }\n let encoded;\n if (!multiple && key && key.indexOf(\"%\") === -1 && key.indexOf(\"+\") === -1) {\n let keyIndex2 = url.indexOf(\"?\", 8);\n if (keyIndex2 === -1) {\n return void 0;\n }\n if (!url.startsWith(key, keyIndex2 + 1)) {\n keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1);\n }\n while (keyIndex2 !== -1) {\n const trailingKeyCode = url.charCodeAt(keyIndex2 + key.length + 1);\n if (trailingKeyCode === 61) {\n const valueIndex = keyIndex2 + key.length + 2;\n const endIndex = url.indexOf(\"&\", valueIndex);\n return _decodeURI(url.slice(valueIndex, endIndex === -1 ? void 0 : endIndex));\n } else if (trailingKeyCode == 38 || isNaN(trailingKeyCode)) {\n return \"\";\n }\n keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1);\n }\n encoded = /[%+]/.test(url);\n if (!encoded) {\n return void 0;\n }\n }\n const results = /* @__PURE__ */ Object.create(null);\n encoded ??= /[%+]/.test(url);\n let keyIndex = url.indexOf(\"?\", 8);\n while (keyIndex !== -1) {\n const nextKeyIndex = url.indexOf(\"&\", keyIndex + 1);\n let valueIndex = url.indexOf(\"=\", keyIndex);\n if (valueIndex > nextKeyIndex && nextKeyIndex !== -1) {\n valueIndex = -1;\n }\n let name = url.slice(\n keyIndex + 1,\n valueIndex === -1 ? nextKeyIndex === -1 ? void 0 : nextKeyIndex : valueIndex\n );\n if (encoded) {\n name = _decodeURI(name);\n }\n keyIndex = nextKeyIndex;\n if (name === \"\") {\n continue;\n }\n let value;\n if (valueIndex === -1) {\n value = \"\";\n } else {\n value = url.slice(valueIndex + 1, nextKeyIndex === -1 ? void 0 : nextKeyIndex);\n if (encoded) {\n value = _decodeURI(value);\n }\n }\n if (multiple) {\n if (!(results[name] && Array.isArray(results[name]))) {\n results[name] = [];\n }\n ;\n results[name].push(value);\n } else {\n results[name] ??= value;\n }\n }\n return key ? results[key] : results;\n};\nvar getQueryParam = _getQueryParam;\nvar getQueryParams = (url, key) => {\n return _getQueryParam(url, key, true);\n};\nvar decodeURIComponent_ = decodeURIComponent;\nexport {\n checkOptionalParameter,\n decodeURIComponent_,\n getPath,\n getPathNoStrict,\n getPattern,\n getQueryParam,\n getQueryParams,\n getQueryStrings,\n mergePath,\n splitPath,\n splitRoutingPath,\n tryDecode,\n tryDecodeURI,\n tryDecodeURIComponent\n};\n", "// src/utils/html.ts\nvar HtmlEscapedCallbackPhase = {\n Stringify: 1,\n BeforeStream: 2,\n Stream: 3\n};\nvar raw = (value, callbacks) => {\n const escapedString = new String(value);\n escapedString.isEscaped = true;\n escapedString.callbacks = callbacks;\n return escapedString;\n};\nvar escapeRe = /[&<>'\"]/;\nvar stringBufferToString = async (buffer, callbacks) => {\n let str = \"\";\n callbacks ||= [];\n const resolvedBuffer = await Promise.all(buffer);\n for (let i = resolvedBuffer.length - 1; ; i--) {\n str += resolvedBuffer[i];\n i--;\n if (i < 0) {\n break;\n }\n let r = resolvedBuffer[i];\n if (typeof r === \"object\") {\n callbacks.push(...r.callbacks || []);\n }\n const isEscaped = r.isEscaped;\n r = await (typeof r === \"object\" ? r.toString() : r);\n if (typeof r === \"object\") {\n callbacks.push(...r.callbacks || []);\n }\n if (r.isEscaped ?? isEscaped) {\n str += r;\n } else {\n const buf = [str];\n escapeToBuffer(r, buf);\n str = buf[0];\n }\n }\n return raw(str, callbacks);\n};\nvar escapeToBuffer = (str, buffer) => {\n const match = str.search(escapeRe);\n if (match === -1) {\n buffer[0] += str;\n return;\n }\n let escape;\n let index;\n let lastIndex = 0;\n for (index = match; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escape = \"&quot;\";\n break;\n case 39:\n escape = \"&#39;\";\n break;\n case 38:\n escape = \"&amp;\";\n break;\n case 60:\n escape = \"&lt;\";\n break;\n case 62:\n escape = \"&gt;\";\n break;\n default:\n continue;\n }\n buffer[0] += str.substring(lastIndex, index) + escape;\n lastIndex = index + 1;\n }\n buffer[0] += str.substring(lastIndex, index);\n};\nvar resolveCallbackSync = (str) => {\n const callbacks = str.callbacks;\n if (!callbacks?.length) {\n return str;\n }\n const buffer = [str];\n const context = {};\n callbacks.forEach((c) => c({ phase: HtmlEscapedCallbackPhase.Stringify, buffer, context }));\n return buffer[0];\n};\nvar resolveCallback = async (str, phase, preserveCallbacks, context, buffer) => {\n if (typeof str === \"object\" && !(str instanceof String)) {\n if (!(str instanceof Promise)) {\n str = str.toString();\n }\n if (str instanceof Promise) {\n str = await str;\n }\n }\n const callbacks = str.callbacks;\n if (!callbacks?.length) {\n return Promise.resolve(str);\n }\n if (buffer) {\n buffer[0] += str;\n } else {\n buffer = [str];\n }\n const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context }))).then(\n (res) => Promise.all(\n res.filter(Boolean).map((str2) => resolveCallback(str2, phase, false, context, buffer))\n ).then(() => buffer[0])\n );\n if (preserveCallbacks) {\n return raw(await resStr, callbacks);\n } else {\n return resStr;\n }\n};\nexport {\n HtmlEscapedCallbackPhase,\n escapeToBuffer,\n raw,\n resolveCallback,\n resolveCallbackSync,\n stringBufferToString\n};\n", "// src/router.ts\nvar METHOD_NAME_ALL = \"ALL\";\nvar METHOD_NAME_ALL_LOWERCASE = \"all\";\nvar METHODS = [\"get\", \"post\", \"put\", \"delete\", \"options\", \"patch\", \"query\"];\nvar MESSAGE_MATCHER_IS_ALREADY_BUILT = \"Can not add a route since the matcher is already built.\";\nvar UnsupportedPathError = class extends Error {\n};\nexport {\n MESSAGE_MATCHER_IS_ALREADY_BUILT,\n METHODS,\n METHOD_NAME_ALL,\n METHOD_NAME_ALL_LOWERCASE,\n UnsupportedPathError\n};\n", "// src/utils/constants.ts\nvar COMPOSED_HANDLER = \"__COMPOSED_HANDLER\";\nexport {\n COMPOSED_HANDLER\n};\n", "// src/router/reg-exp-router/index.ts\nimport { RegExpRouter } from \"./router.js\";\nimport { PreparedRegExpRouter, buildInitParams, serializeInitParams } from \"./prepared-router.js\";\nexport {\n PreparedRegExpRouter,\n RegExpRouter,\n buildInitParams,\n serializeInitParams\n};\n", "// src/router/reg-exp-router/router.ts\nimport {\n MESSAGE_MATCHER_IS_ALREADY_BUILT,\n METHOD_NAME_ALL,\n UnsupportedPathError\n} from \"../../router.js\";\nimport { checkOptionalParameter } from \"../../utils/url.js\";\nimport { createNullObject } from \"../utils.js\";\nimport { match, emptyParam } from \"./matcher.js\";\nimport {\n LABEL_REG_EXP_STR,\n ONLY_WILDCARD_REG_EXP_STR,\n PATH_ERROR,\n TAIL_WILDCARD_REG_EXP_STR\n} from \"./node.js\";\nimport { Trie } from \"./trie.js\";\nvar wildcardRegExpCache = createNullObject();\nfunction buildWildcardRegExp(path) {\n return wildcardRegExpCache[path] ??= new RegExp(\n `^${path.replace(\n /\\/:[^/{}]+(?:\\{\\[\\^\\/]\\+})?(?=[/{]|$)|\\/?\\*$|([.\\\\+*[^\\]$()?{}|])/g,\n (match2, metaChar) => metaChar ? `\\\\${metaChar}` : match2 === \"/*\" ? TAIL_WILDCARD_REG_EXP_STR : match2 === \"*\" ? ONLY_WILDCARD_REG_EXP_STR : `/:${LABEL_REG_EXP_STR}`\n )}$`\n );\n}\nfunction findMiddleware(middleware, path) {\n for (const k of Object.keys(middleware).sort((a, b) => b.length - a.length)) {\n if (buildWildcardRegExp(k).test(path)) {\n return [...middleware[k]];\n }\n }\n return void 0;\n}\nvar RegExpRouter = class {\n name = \"RegExpRouter\";\n #middleware;\n #routes;\n #tries;\n constructor() {\n this.#middleware = { [METHOD_NAME_ALL]: createNullObject() };\n this.#routes = { [METHOD_NAME_ALL]: createNullObject() };\n this.#tries = { [METHOD_NAME_ALL]: new Trie() };\n }\n #insertPath(method, path) {\n try {\n this.#tries[method].insert(path, !/\\*|\\/:/.test(path));\n } catch (e) {\n throw e === PATH_ERROR ? new UnsupportedPathError(path) : e;\n }\n }\n add(method, path, handler) {\n const middleware = this.#middleware;\n const routes = this.#routes;\n if (!middleware) {\n throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n }\n if (!middleware[method]) {\n this.#tries[method] = new Trie();\n for (const handlerMap of [middleware, routes]) {\n handlerMap[method] = createNullObject();\n for (const p in handlerMap[METHOD_NAME_ALL]) {\n handlerMap[method][p] = [...handlerMap[METHOD_NAME_ALL][p]];\n this.#insertPath(method, p);\n }\n }\n }\n if (path === \"/*\") {\n path = \"*\";\n }\n const methods = method === METHOD_NAME_ALL ? Object.keys(middleware) : [method];\n if (/\\*$/.test(path)) {\n const re = buildWildcardRegExp(path);\n for (const m of methods) {\n if (!middleware[m][path]) {\n this.#insertPath(m, path);\n middleware[m][path] = findMiddleware(middleware[m], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || [];\n }\n }\n for (const handlerMap of [middleware, routes]) {\n for (const m of methods) {\n for (const p in handlerMap[m]) {\n re.test(p) && handlerMap[m][p].push([handler, path]);\n }\n }\n }\n return;\n }\n const paths = checkOptionalParameter(path) || [path];\n for (const path2 of paths) {\n for (const m of methods) {\n if (!routes[m][path2]) {\n this.#insertPath(m, path2);\n routes[m][path2] = findMiddleware(middleware[m], path2) || findMiddleware(middleware[METHOD_NAME_ALL], path2) || [];\n }\n routes[m][path2].push([handler, path2]);\n }\n }\n }\n match = match;\n buildAllMatchers() {\n const matchers = createNullObject();\n for (const method of Object.keys(this.#routes)) {\n matchers[method] = this.#buildMatcher(method);\n }\n this.#middleware = this.#routes = this.#tries = void 0;\n wildcardRegExpCache = createNullObject();\n return matchers;\n }\n #buildMatcher(method) {\n const middleware = this.#middleware[method];\n const routes = this.#routes[method];\n const trie = this.#tries[method];\n const staticMap = createNullObject();\n const handlerData = [];\n const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp();\n for (const r of [middleware, routes]) {\n for (const path in r) {\n const handlers = r[path];\n const pathData = trie.paths[path];\n if (!pathData) {\n staticMap[path] = [handlers.map(([h]) => [h, createNullObject()]), emptyParam];\n continue;\n }\n handlerData[pathData[0]] = handlers.map(([h, handlerPath]) => [\n h,\n trie.paths[handlerPath][1].reduceRight((map, [key], i) => {\n map[key] = paramReplacementMap[pathData[1][i][1]];\n return map;\n }, createNullObject())\n ]);\n }\n }\n return [regexp, indexReplacementMap.map((i) => handlerData[i]), staticMap];\n }\n};\nexport {\n RegExpRouter\n};\n", "// src/router/utils.ts\nvar createNullObject = () => /* @__PURE__ */ Object.create(null);\nexport {\n createNullObject\n};\n", "// src/router/reg-exp-router/matcher.ts\nimport { METHOD_NAME_ALL } from \"../../router.js\";\nvar emptyParam = [];\nfunction match(method, path) {\n const matchers = this.buildAllMatchers();\n const match2 = ((method2, path2) => {\n const matcher = matchers[method2] || matchers[METHOD_NAME_ALL];\n const staticMatch = matcher[2][path2];\n if (staticMatch) {\n return staticMatch;\n }\n const match3 = path2.match(matcher[0]);\n if (!match3) {\n return [[], emptyParam];\n }\n const index = match3.indexOf(\"\", 1);\n return [matcher[1][index], match3];\n });\n this.match = match2;\n return match2(method, path);\n}\nexport {\n emptyParam,\n match\n};\n", "// src/router/reg-exp-router/node.ts\nimport { createNullObject } from \"../utils.js\";\nvar LABEL_REG_EXP_STR = \"[^/]+\";\nvar ONLY_WILDCARD_REG_EXP_STR = \".*\";\nvar TAIL_WILDCARD_REG_EXP_STR = \"(?:|/.*)\";\nvar PATH_ERROR = /* @__PURE__ */ Symbol();\nvar regExpMetaChars = new Set(\".\\\\+*[^]$()\");\nfunction compareKey(a, b) {\n if (a.length === 1) {\n return b.length === 1 ? a < b ? -1 : 1 : -1;\n }\n if (b.length === 1) {\n return 1;\n }\n if (a === ONLY_WILDCARD_REG_EXP_STR || a === TAIL_WILDCARD_REG_EXP_STR) {\n return b === TAIL_WILDCARD_REG_EXP_STR ? -1 : 1;\n } else if (b === ONLY_WILDCARD_REG_EXP_STR || b === TAIL_WILDCARD_REG_EXP_STR) {\n return -1;\n }\n if (a === LABEL_REG_EXP_STR) {\n return 1;\n } else if (b === LABEL_REG_EXP_STR) {\n return -1;\n }\n return a.length === b.length ? a < b ? -1 : 1 : b.length - a.length;\n}\nvar Node = class _Node {\n // handler index of a dynamic path, or -1 for a static path terminal\n #index;\n #varIndex;\n #children = createNullObject();\n insert(tokens, index, paramMap, context, isStatic) {\n let node = this;\n for (let i = 0, len = tokens.length; i < len; i++) {\n const token = tokens[i];\n const pattern = token.length === 1 ? token === \"*\" ? i === len - 1 ? [\"\", \"\", ONLY_WILDCARD_REG_EXP_STR] : [\"\", \"\", LABEL_REG_EXP_STR] : null : token === \"/*\" ? [\"\", \"\", TAIL_WILDCARD_REG_EXP_STR] : token.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n let nextNode;\n if (pattern) {\n const name = pattern[1];\n let regexpStr = pattern[2] || LABEL_REG_EXP_STR;\n if (name && pattern[2]) {\n if (regexpStr === \".*\") {\n throw PATH_ERROR;\n }\n regexpStr = regexpStr.replace(/^\\((?!\\?:)(?=[^)]+\\)$)/, \"(?:\");\n if (/\\((?!\\?:)/.test(regexpStr)) {\n throw PATH_ERROR;\n }\n if (regexpStr.length === 1 && regExpMetaChars.has(regexpStr)) {\n throw PATH_ERROR;\n }\n }\n nextNode = node.#children[regexpStr];\n if (!nextNode) {\n if (regexpStr !== ONLY_WILDCARD_REG_EXP_STR && regexpStr !== TAIL_WILDCARD_REG_EXP_STR) {\n for (const k in node.#children) {\n if (\n // a single-char pattern coexists with single-char literals as a literal does\n (regexpStr.length > 1 || k.length > 1) && k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR\n ) {\n throw PATH_ERROR;\n }\n }\n }\n nextNode = node.#children[regexpStr] = new _Node();\n }\n if (name !== \"\") {\n nextNode.#varIndex ??= context.varIndex++;\n paramMap.push([name, nextNode.#varIndex]);\n }\n } else {\n nextNode = node.#children[token];\n if (!nextNode) {\n for (const k in node.#children) {\n if (k.length > 1 && k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR) {\n throw PATH_ERROR;\n }\n }\n nextNode = node.#children[token] = new _Node();\n }\n }\n node = nextNode;\n }\n if (node.#index !== void 0) {\n throw PATH_ERROR;\n }\n node.#index = isStatic ? -1 : index;\n }\n buildRegExpStr() {\n const childKeys = Object.keys(this.#children).sort(compareKey);\n const strList = childKeys.map((k) => {\n const c = this.#children[k];\n const childStr = c.buildRegExpStr();\n return childStr === \"\" ? \"\" : (typeof c.#varIndex === \"number\" ? `(${k})@${c.#varIndex}` : regExpMetaChars.has(k) ? `\\\\${k}` : k) + childStr;\n }).filter(Boolean);\n if (typeof this.#index === \"number\" && this.#index !== -1) {\n strList.unshift(`#${this.#index}`);\n }\n if (strList.length === 0) {\n return \"\";\n }\n if (strList.length === 1) {\n return strList[0];\n }\n return \"(?:\" + strList.join(\"|\") + \")\";\n }\n};\nexport {\n LABEL_REG_EXP_STR,\n Node,\n ONLY_WILDCARD_REG_EXP_STR,\n PATH_ERROR,\n TAIL_WILDCARD_REG_EXP_STR\n};\n", "// src/router/reg-exp-router/trie.ts\nimport { createNullObject } from \"../utils.js\";\nimport { Node } from \"./node.js\";\nvar Trie = class {\n #context = { varIndex: 0 };\n #root = new Node();\n #index = 0;\n // dynamic path -> [handler index, param assoc]; static paths are not registered\n paths = createNullObject();\n insert(path, isStatic) {\n if (isStatic) {\n this.#root.insert(path.split(\"\"), 0, [], this.#context, true);\n return;\n }\n const paramAssoc = [];\n const groups = [];\n let markedPath = path;\n for (let i = 0; ; ) {\n let replaced = false;\n markedPath = markedPath.replace(/\\{[^}]+\\}/g, (m) => {\n const mark = `@\\\\${i}`;\n groups[i] = [mark, m];\n i++;\n replaced = true;\n return mark;\n });\n if (!replaced) {\n break;\n }\n }\n const tokens = markedPath.match(/(?::[^\\/]+)|(?:\\/\\*$)|./g) || [];\n for (let i = groups.length - 1; i >= 0; i--) {\n const [mark] = groups[i];\n for (let j = tokens.length - 1; j >= 0; j--) {\n if (tokens[j].indexOf(mark) !== -1) {\n tokens[j] = tokens[j].replace(mark, groups[i][1]);\n break;\n }\n }\n }\n this.#root.insert(tokens, this.#index, paramAssoc, this.#context, false);\n this.paths[path] = [this.#index++, paramAssoc];\n }\n buildRegExp() {\n let regexp = this.#root.buildRegExpStr();\n if (regexp === \"\") {\n return [/^$/, [], []];\n }\n let captureIndex = 0;\n const indexReplacementMap = [];\n const paramReplacementMap = [];\n regexp = regexp.replace(/#(\\d+)|@(\\d+)|\\.\\*\\$/g, (_, handlerIndex, paramIndex) => {\n if (handlerIndex !== void 0) {\n indexReplacementMap[++captureIndex] = Number(handlerIndex);\n return \"$()\";\n }\n if (paramIndex !== void 0) {\n paramReplacementMap[Number(paramIndex)] = ++captureIndex;\n return \"\";\n }\n return \"\";\n });\n return [new RegExp(`^${regexp}`), indexReplacementMap, paramReplacementMap];\n }\n};\nexport {\n Trie\n};\n", "// src/router/reg-exp-router/prepared-router.ts\nimport { METHOD_NAME_ALL } from \"../../router.js\";\nimport { match, emptyParam } from \"./matcher.js\";\nimport { RegExpRouter } from \"./router.js\";\nvar PreparedRegExpRouter = class {\n name = \"PreparedRegExpRouter\";\n #matchers;\n #relocateMap;\n constructor(matchers, relocateMap) {\n this.#matchers = matchers;\n this.#relocateMap = relocateMap;\n }\n #addWildcard(method, handlerData) {\n const matcher = this.#matchers[method];\n matcher[1].forEach((list) => list && list.push(handlerData));\n Object.values(matcher[2]).forEach((list) => list[0].push(handlerData));\n }\n #addPath(method, path, handler, indexes, map) {\n const matcher = this.#matchers[method];\n if (!map) {\n matcher[2][path][0].push([handler, {}]);\n } else {\n indexes.forEach((index) => {\n if (typeof index === \"number\") {\n matcher[1][index].push([handler, map]);\n } else {\n ;\n matcher[2][index || path][0].push([handler, map]);\n }\n });\n }\n }\n add(method, path, handler) {\n if (!this.#matchers[method]) {\n const all = this.#matchers[METHOD_NAME_ALL];\n const staticMap = {};\n for (const key in all[2]) {\n staticMap[key] = [all[2][key][0].slice(), emptyParam];\n }\n this.#matchers[method] = [\n all[0],\n all[1].map((list) => Array.isArray(list) ? list.slice() : 0),\n staticMap\n ];\n }\n if (path === \"/*\" || path === \"*\") {\n const handlerData = [handler, {}];\n if (method === METHOD_NAME_ALL) {\n for (const m in this.#matchers) {\n this.#addWildcard(m, handlerData);\n }\n } else {\n this.#addWildcard(method, handlerData);\n }\n return;\n }\n const data = this.#relocateMap[path];\n if (!data) {\n throw new Error(`Path ${path} is not registered`);\n }\n for (const [indexes, map] of data) {\n if (method === METHOD_NAME_ALL) {\n for (const m in this.#matchers) {\n this.#addPath(m, path, handler, indexes, map);\n }\n } else {\n this.#addPath(method, path, handler, indexes, map);\n }\n }\n }\n buildAllMatchers() {\n return this.#matchers;\n }\n match = match;\n};\nvar buildInitParams = ({ paths }) => {\n const RegExpRouterWithMatcherExport = class extends RegExpRouter {\n buildAndExportAllMatchers() {\n return this.buildAllMatchers();\n }\n };\n const router = new RegExpRouterWithMatcherExport();\n for (const path of paths) {\n router.add(METHOD_NAME_ALL, path, path);\n }\n const matchers = router.buildAndExportAllMatchers();\n const all = matchers[METHOD_NAME_ALL];\n const relocateMap = {};\n for (const path of paths) {\n if (path === \"/*\" || path === \"*\") {\n continue;\n }\n all[1].forEach((list, i) => {\n list.forEach(([p, map]) => {\n if (p === path) {\n if (relocateMap[path]) {\n relocateMap[path][0][1] = {\n ...relocateMap[path][0][1],\n ...map\n };\n } else {\n relocateMap[path] = [[[], map]];\n }\n if (relocateMap[path][0][0].findIndex((j) => j === i) === -1) {\n relocateMap[path][0][0].push(i);\n }\n }\n });\n });\n for (const path2 in all[2]) {\n all[2][path2][0].forEach(([p]) => {\n if (p === path) {\n relocateMap[path] ||= [[[]]];\n const value = path2 === path ? \"\" : path2;\n if (relocateMap[path][0][0].findIndex((v) => v === value) === -1) {\n relocateMap[path][0][0].push(value);\n }\n }\n });\n }\n }\n for (let i = 0, len = all[1].length; i < len; i++) {\n all[1][i] = all[1][i] ? [] : 0;\n }\n for (const path in all[2]) {\n all[2][path][0] = [];\n }\n return [matchers, relocateMap];\n};\nvar serializeInitParams = ([matchers, relocateMap]) => {\n const matchersStr = JSON.stringify(\n matchers,\n (_, value) => value instanceof RegExp ? `##${value.toString()}##` : value\n ).replace(/\"##(.+?)##\"/g, (_, str) => str.replace(/\\\\\\\\/g, \"\\\\\"));\n const relocateMapStr = JSON.stringify(relocateMap);\n return `[${matchersStr},${relocateMapStr}]`;\n};\nexport {\n PreparedRegExpRouter,\n buildInitParams,\n serializeInitParams\n};\n", "// src/router/smart-router/index.ts\nimport { SmartRouter } from \"./router.js\";\nexport {\n SmartRouter\n};\n", "// src/router/smart-router/router.ts\nimport { MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError } from \"../../router.js\";\nvar SmartRouter = class {\n name = \"SmartRouter\";\n #routers = [];\n #routes = [];\n constructor(init) {\n this.#routers = init.routers;\n }\n add(method, path, handler) {\n if (!this.#routes) {\n throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n }\n this.#routes.push([method, path, handler]);\n }\n match(method, path) {\n if (!this.#routes) {\n throw new Error(\"Fatal error\");\n }\n const routers = this.#routers;\n const routes = this.#routes;\n const len = routers.length;\n let i = 0;\n let res;\n for (; i < len; i++) {\n const router = routers[i];\n try {\n for (let i2 = 0, len2 = routes.length; i2 < len2; i2++) {\n router.add(...routes[i2]);\n }\n res = router.match(method, path);\n } catch (e) {\n if (e instanceof UnsupportedPathError) {\n continue;\n }\n throw e;\n }\n this.match = router.match.bind(router);\n this.#routers = [router];\n this.#routes = void 0;\n break;\n }\n if (i === len) {\n throw new Error(\"Fatal error\");\n }\n this.name = `SmartRouter + ${this.activeRouter.name}`;\n return res;\n }\n get activeRouter() {\n if (this.#routes || this.#routers.length !== 1) {\n throw new Error(\"No active router has been determined yet.\");\n }\n return this.#routers[0];\n }\n};\nexport {\n SmartRouter\n};\n", "// src/router/trie-router/index.ts\nimport { TrieRouter } from \"./router.js\";\nexport {\n TrieRouter\n};\n", "// src/router/trie-router/router.ts\nimport { checkOptionalParameter } from \"../../utils/url.js\";\nimport { Node } from \"./node.js\";\nvar TrieRouter = class {\n name = \"TrieRouter\";\n #node = new Node();\n add(method, path, handler) {\n for (const result of checkOptionalParameter(path) || [path]) {\n this.#node.insert(method, result, handler);\n }\n }\n match(method, path) {\n return this.#node.search(method, path);\n }\n};\nexport {\n TrieRouter\n};\n", "// src/router/trie-router/node.ts\nimport { METHOD_NAME_ALL } from \"../../router.js\";\nimport { getPattern, splitPath, splitRoutingPath } from \"../../utils/url.js\";\nimport { createNullObject } from \"../utils.js\";\nvar emptyParams = createNullObject();\nvar order = 0;\nvar Node = class _Node {\n #methods = [];\n #children = createNullObject();\n #patterns = [];\n #pattern;\n #params = emptyParams;\n insert(method, path, handler) {\n let curNode = this;\n const parts = splitRoutingPath(path);\n const possibleKeys = /* @__PURE__ */ new Set();\n let i = 0;\n for (const p of parts) {\n const nextP = parts[++i];\n const pattern = getPattern(p, nextP) || (nextP === void 0 && p && p.indexOf(\"*\") === p.length - 1 ? p : null);\n const isParam = Array.isArray(pattern);\n const key = isParam ? pattern[0] : pattern || p;\n const child = curNode.#children[key] ||= new _Node();\n if (pattern && !child.#pattern) {\n child.#pattern = pattern;\n curNode.#patterns.push(child);\n }\n curNode = child;\n if (isParam) {\n possibleKeys.add(pattern[1]);\n }\n }\n curNode.#methods.push({\n [method]: {\n handler,\n possibleKeys: [...possibleKeys],\n score: ++order\n }\n });\n }\n #pushHandlerSets(handlerSets, node, method, nodeParams, params) {\n for (let i = 0, len = node.#methods.length; i < len; i++) {\n const m = node.#methods[i];\n const handlerSet = m[method] || m[METHOD_NAME_ALL];\n if (handlerSet) {\n handlerSet.params = createNullObject();\n handlerSets.push(handlerSet);\n for (let i2 = 0, len2 = handlerSet.possibleKeys.length; i2 < len2; i2++) {\n const key = handlerSet.possibleKeys[i2];\n handlerSet.params[key] = params?.[key] && !i2 ? params[key] : nodeParams[key] ?? params?.[key];\n }\n }\n }\n }\n search(method, path) {\n const handlerSets = [];\n this.#params = emptyParams;\n const curNode = this;\n let curNodes = [curNode];\n const parts = splitPath(path);\n const curNodesQueue = [];\n const len = parts.length;\n let partOffsets = null;\n for (let i = 0; i < len; i++) {\n const part = parts[i];\n const isLast = i === len - 1;\n const tempNodes = [];\n for (let j = 0, len2 = curNodes.length; j < len2; j++) {\n const node = curNodes[j];\n const nextNode = node.#children[part];\n if (nextNode) {\n nextNode.#params = node.#params;\n if (isLast) {\n if (nextNode.#children[\"*\"]) {\n this.#pushHandlerSets(handlerSets, nextNode.#children[\"*\"], method, node.#params);\n }\n this.#pushHandlerSets(handlerSets, nextNode, method, node.#params);\n } else {\n tempNodes.push(nextNode);\n }\n }\n for (const child of node.#patterns) {\n const pattern = child.#pattern;\n const params = node.#params === emptyParams ? {} : { ...node.#params };\n if (typeof pattern === \"string\") {\n if (pattern === \"*\" || part.startsWith(pattern.slice(0, -1))) {\n this.#pushHandlerSets(handlerSets, child, method, node.#params);\n if (pattern === \"*\") {\n child.#params = params;\n tempNodes.push(child);\n }\n }\n continue;\n }\n const [, name, matcher] = pattern;\n if (!part && matcher === true) {\n continue;\n }\n if (matcher !== true) {\n if (!partOffsets) {\n partOffsets = [];\n let offset = path[0] === \"/\" ? 1 : 0;\n for (let p = 0; p < len; p++) {\n partOffsets[p] = offset;\n offset += parts[p].length + 1;\n }\n }\n const restPathString = path.slice(partOffsets[i]);\n const m = matcher.exec(restPathString);\n if (m) {\n params[name] = m[0];\n this.#pushHandlerSets(handlerSets, child, method, node.#params, params);\n if (m[0].length === restPathString.length && child.#children[\"*\"]) {\n this.#pushHandlerSets(\n handlerSets,\n child.#children[\"*\"],\n method,\n node.#params,\n params\n );\n }\n for (const _ in child.#children) {\n child.#params = params;\n const componentCount = m[0].match(/\\//g)?.length ?? 0;\n const targetCurNodes = curNodesQueue[componentCount] ||= [];\n targetCurNodes.push(child);\n break;\n }\n continue;\n }\n }\n if (matcher === true || matcher.test(part)) {\n params[name] = part;\n if (isLast) {\n this.#pushHandlerSets(handlerSets, child, method, params, node.#params);\n if (child.#children[\"*\"]) {\n this.#pushHandlerSets(\n handlerSets,\n child.#children[\"*\"],\n method,\n params,\n node.#params\n );\n }\n } else {\n child.#params = params;\n tempNodes.push(child);\n }\n }\n }\n }\n const shifted = curNodesQueue.shift();\n curNodes = shifted ? tempNodes.concat(shifted) : tempNodes;\n }\n if (handlerSets[1]) {\n handlerSets.sort((a, b) => {\n return a.score - b.score;\n });\n }\n return [handlerSets.map(({ handler, params }) => [handler, params])];\n }\n};\nexport {\n Node\n};\n", "// src/middleware/cors/index.ts\nvar cors = (options) => {\n const opts = {\n origin: \"*\",\n allowMethods: [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\", \"QUERY\"],\n allowHeaders: [],\n exposeHeaders: [],\n ...options\n };\n const exposeHeadersStr = opts.exposeHeaders?.length ? opts.exposeHeaders.join(\",\") : void 0;\n const allowHeadersStr = opts.allowHeaders?.length ? opts.allowHeaders.join(\",\") : void 0;\n const findAllowOrigin = ((optsOrigin) => {\n if (typeof optsOrigin === \"string\") {\n if (optsOrigin === \"*\") {\n return () => optsOrigin;\n } else {\n return (origin) => optsOrigin === origin ? origin : null;\n }\n } else if (typeof optsOrigin === \"function\") {\n return optsOrigin;\n } else {\n return (origin) => optsOrigin.includes(origin) ? origin : null;\n }\n })(opts.origin);\n const findAllowMethods = ((optsAllowMethods) => {\n if (typeof optsAllowMethods === \"function\") {\n return async (origin, c) => (await optsAllowMethods(origin, c)).join(\",\");\n } else if (Array.isArray(optsAllowMethods)) {\n const methodsStr = optsAllowMethods.join(\",\");\n return () => methodsStr;\n } else {\n return () => \"\";\n }\n })(opts.allowMethods);\n return async function cors2(c, next) {\n function set(key, value) {\n c.res.headers.set(key, value);\n }\n const allowOrigin = await findAllowOrigin(c.req.header(\"origin\") || \"\", c);\n if (allowOrigin) {\n set(\"Access-Control-Allow-Origin\", allowOrigin);\n }\n if (opts.credentials) {\n set(\"Access-Control-Allow-Credentials\", \"true\");\n }\n if (exposeHeadersStr) {\n set(\"Access-Control-Expose-Headers\", exposeHeadersStr);\n }\n if (c.req.method === \"OPTIONS\") {\n if (opts.origin !== \"*\") {\n c.res.headers.append(\"Vary\", \"Origin\");\n }\n if (opts.maxAge != null) {\n set(\"Access-Control-Max-Age\", opts.maxAge.toString());\n }\n const allowMethods = await findAllowMethods(c.req.header(\"origin\") || \"\", c);\n if (allowMethods) {\n set(\"Access-Control-Allow-Methods\", allowMethods);\n }\n let headersStr = allowHeadersStr;\n if (!headersStr) {\n const requestHeaders = c.req.header(\"Access-Control-Request-Headers\");\n if (requestHeaders) {\n headersStr = requestHeaders.split(\",\").map((h) => h.trim()).join(\",\");\n }\n }\n if (headersStr) {\n set(\"Access-Control-Allow-Headers\", headersStr);\n c.res.headers.append(\"Vary\", \"Access-Control-Request-Headers\");\n }\n c.res.headers.delete(\"Content-Length\");\n c.res.headers.delete(\"Content-Type\");\n return new Response(null, {\n headers: c.res.headers,\n status: 204,\n statusText: \"No Content\"\n });\n }\n await next();\n if (opts.origin !== \"*\") {\n c.header(\"Vary\", \"Origin\", { append: true });\n }\n };\n};\nexport {\n cors\n};\n", "import { Hono } from 'hono';\nimport { asRecord, asString } from './body.ts';\nimport type { AiGateway, ProxyEnv } from './types.ts';\n\nconst DEFAULT_GATEWAY_ID = 'void';\nconst PROVIDER_AUTH_DEFAULTS: Record<string, { header: string; prefix: string }> = {\n 'google-ai-studio': { header: 'x-goog-api-key', prefix: '' },\n};\nconst VOID_FILE_MARKER = '__voidFile';\n\ntype SerializedFileInput = Readonly<{\n [VOID_FILE_MARKER]: true;\n data: string;\n name?: string;\n type?: string;\n}>;\n\ntype SerializedProviderBody = Readonly<\n | { type: 'none' }\n | { type: 'json'; value: unknown }\n | { type: 'text'; data: string; contentType?: string }\n | { type: 'base64'; data: string; contentType?: string }\n | { type: 'form'; entries: Array<{ name: string; value: string | SerializedFileInput }> }\n>;\n\nclass BadRequestError extends Error {}\n\nconst ai = new Hono<ProxyEnv>();\n\nfunction hasStreamFlag(value: unknown): value is { stream?: boolean } {\n return typeof value === 'object' && value !== null && 'stream' in value;\n}\n\nfunction isBinaryView(value: unknown): value is ArrayBufferView {\n return ArrayBuffer.isView(value);\n}\n\nfunction isSerializedFileInput(value: unknown): value is SerializedFileInput {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as Record<string, unknown>)[VOID_FILE_MARKER] === true &&\n typeof (value as Record<string, unknown>).data === 'string' &&\n ((value as Record<string, unknown>).name === undefined ||\n typeof (value as Record<string, unknown>).name === 'string') &&\n ((value as Record<string, unknown>).type === undefined ||\n typeof (value as Record<string, unknown>).type === 'string')\n );\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n let binary: string;\n try {\n binary = atob(base64);\n } catch {\n throw new BadRequestError('invalid file data');\n }\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction gatewayEndpointUrl(baseUrl: string, endpoint: string): string {\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint.slice(1) : endpoint;\n return `${normalizedBase}/${normalizedEndpoint}`;\n}\n\nfunction isUnsafeProviderPath(path: string): boolean {\n if (/^(?:[a-z][a-z0-9+.-]*:)?\\/\\//i.test(path) || path.includes('\\\\')) {\n return true;\n }\n\n const pathname = path.split(/[?#]/, 1)[0] ?? '';\n for (const segment of pathname.split('/')) {\n try {\n if (decodeURIComponent(segment) === '..') {\n return true;\n }\n } catch {\n return true;\n }\n }\n\n return false;\n}\n\nfunction providerBody(value: unknown): SerializedProviderBody {\n const record = asRecord(value);\n const type = asString(record.type);\n if (\n type === 'none' ||\n type === 'json' ||\n type === 'text' ||\n type === 'base64' ||\n type === 'form'\n ) {\n return record as SerializedProviderBody;\n }\n return { type: 'none' };\n}\n\nfunction appendSerializedFormValue(\n form: FormData,\n name: string,\n value: string | SerializedFileInput,\n): void {\n if (isSerializedFileInput(value)) {\n const blob = new Blob([base64ToBytes(value.data)], {\n type: value.type ?? 'application/octet-stream',\n });\n form.append(name, blob, value.name ?? name);\n return;\n }\n form.append(name, value);\n}\n\nfunction providerRequestBody(body: SerializedProviderBody): {\n body?: BodyInit;\n contentType?: string;\n} {\n if (body.type === 'none') {\n return {};\n }\n\n if (body.type === 'json') {\n return { body: JSON.stringify(body.value), contentType: 'application/json' };\n }\n\n if (body.type === 'text') {\n return { body: body.data, contentType: body.contentType };\n }\n\n if (body.type === 'base64') {\n return {\n body: base64ToBytes(body.data).buffer as ArrayBuffer,\n contentType: body.contentType,\n };\n }\n\n const form = new FormData();\n for (const entry of body.entries) {\n appendSerializedFormValue(form, entry.name, entry.value);\n }\n return { body: form };\n}\n\nfunction headersFromRecord(value: unknown): Headers {\n const headers = new Headers();\n for (const [key, headerValue] of Object.entries(asRecord(value))) {\n if (typeof headerValue === 'string') {\n headers.set(key, headerValue);\n }\n }\n return headers;\n}\n\nfunction providerAuthDefaults(provider: string): { header: string; prefix: string } {\n return PROVIDER_AUTH_DEFAULTS[provider] ?? { header: 'authorization', prefix: 'Bearer ' };\n}\n\nfunction gatewayOptions(\n value: unknown,\n projectId: string,\n gatewayId: string,\n): Record<string, unknown> {\n const options = asRecord(value);\n const gateway = asRecord(options.gateway);\n const metadata = asRecord(gateway.metadata);\n\n return {\n ...options,\n gateway: {\n ...gateway,\n id: gatewayId,\n metadata: {\n ...metadata,\n projectId,\n },\n },\n };\n}\n\nfunction applyProviderHeaders({\n headers,\n provider,\n providerKey,\n projectId,\n apiKeyHeader,\n apiKeyPrefix,\n contentType,\n}: {\n headers: Headers;\n provider: string;\n providerKey: string;\n projectId: string;\n apiKeyHeader?: string | null;\n apiKeyPrefix?: string | null;\n contentType?: string;\n}): Headers {\n const defaults = providerAuthDefaults(provider);\n const keyHeader = apiKeyHeader ?? defaults.header;\n const keyPrefix = apiKeyPrefix ?? defaults.prefix;\n\n headers.set(keyHeader, `${keyPrefix}${providerKey}`);\n headers.set('cf-aig-metadata-projectId', projectId);\n if (contentType && !headers.has('content-type')) {\n headers.set('content-type', contentType);\n }\n return headers;\n}\n\nfunction headersForContentType(contentType: string | null | undefined): HeadersInit | undefined {\n return contentType ? { 'content-type': contentType } : undefined;\n}\n\nfunction filteredResponseHeaders(response: Response): Headers {\n const headers = new Headers();\n const contentType = response.headers.get('content-type');\n const cacheControl = response.headers.get('cache-control');\n if (contentType) {\n headers.set('content-type', contentType);\n }\n if (cacheControl) {\n headers.set('cache-control', cacheControl);\n }\n return headers;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction responseFromThrown(value: unknown): Response | null {\n if (value instanceof Response) {\n return value;\n }\n\n if (!isRecord(value)) {\n return null;\n }\n\n if (value.response instanceof Response) {\n return value.response;\n }\n\n return responseFromThrown(value.cause);\n}\n\nfunction statusFromThrown(value: unknown): number | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const status = value.status ?? value.statusCode;\n if (typeof status === 'number' && Number.isInteger(status) && status >= 400 && status <= 599) {\n return status;\n }\n\n return statusFromThrown(value.cause);\n}\n\nfunction messageFromThrown(value: unknown): string {\n if (value instanceof Error) {\n return value.message;\n }\n\n return String(value);\n}\n\nfunction hasResponseMethod(value: unknown): value is { response(): Response | Promise<Response> } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'response' in value &&\n typeof (value as { response?: unknown }).response === 'function'\n );\n}\n\nasync function responseFromAiResult(result: unknown, streamAsSse: boolean): Promise<Response> {\n if (result instanceof Response) {\n return result;\n }\n\n if (hasResponseMethod(result)) {\n return result.response();\n }\n\n if (result instanceof ReadableStream) {\n return new Response(result, {\n headers: streamAsSse\n ? {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache',\n }\n : { 'content-type': 'application/octet-stream' },\n });\n }\n\n if (result instanceof Blob) {\n return new Response(result, { headers: headersForContentType(result.type) });\n }\n\n if (result instanceof ArrayBuffer || isBinaryView(result)) {\n return new Response(result, { headers: { 'content-type': 'application/octet-stream' } });\n }\n\n return Response.json(result);\n}\n\nasync function responseFromAiError(err: unknown): Promise<Response> {\n const response = responseFromThrown(err);\n if (response) {\n return responseFromGateway(response, false);\n }\n\n const status = statusFromThrown(err) ?? 502;\n return Response.json({ error: messageFromThrown(err) }, { status });\n}\n\nasync function responseFromGateway(response: Response, streamAsSse: boolean): Promise<Response> {\n if (streamAsSse && response.body) {\n return new Response(response.body, {\n headers: {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache',\n 'access-control-allow-origin': '*',\n },\n });\n }\n\n return new Response(response.body, {\n status: response.status,\n headers: filteredResponseHeaders(response),\n });\n}\n\nai.post('/run', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const model = asString(body.model);\n\n if (!model) {\n return context.json({ error: 'model required' }, 400);\n }\n\n const options = gatewayOptions(\n body.options,\n projectId,\n context.env.AI_GATEWAY_ID ?? DEFAULT_GATEWAY_ID,\n );\n\n try {\n const result = await context.env.AI.run(model, body.inputs, options);\n return responseFromAiResult(result, hasStreamFlag(body.inputs) && body.inputs.stream === true);\n } catch (err) {\n const message = messageFromThrown(err);\n console.error('AI inference error:', message);\n return responseFromAiError(err);\n }\n});\n\nai.post('/provider', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const provider = asString(body.provider);\n const path = asString(body.path);\n const method = asString(body.method) ?? 'POST';\n const providerKey = asString(body.providerKey);\n const apiKeyHeader = asString(body.apiKeyHeader);\n const apiKeyPrefix = asString(body.apiKeyPrefix);\n\n if (!provider) {\n return context.json({ error: 'provider required' }, 400);\n }\n if (!path) {\n return context.json({ error: 'path required' }, 400);\n }\n if (!providerKey) {\n return context.json({ error: 'providerKey required' }, 400);\n }\n if (isUnsafeProviderPath(path)) {\n return context.json({ error: 'path must be relative' }, 400);\n }\n\n try {\n const gateway = context.env.AI.gateway(context.env.AI_GATEWAY_ID ?? DEFAULT_GATEWAY_ID);\n const baseUrl = await gateway.getUrl(provider);\n const requestBody = providerRequestBody(providerBody(body.body));\n const headers = applyProviderHeaders({\n headers: headersFromRecord(body.headers),\n provider,\n providerKey,\n projectId,\n apiKeyHeader,\n apiKeyPrefix,\n contentType: requestBody.contentType,\n });\n const response = await fetch(gatewayEndpointUrl(baseUrl, path), {\n method,\n headers,\n body: requestBody.body,\n });\n\n if (!response.ok) {\n const text = await response.text();\n let error: string;\n try {\n const json = JSON.parse(text);\n error = json.error?.message ?? text;\n } catch {\n error = text;\n }\n return context.json({ error }, response.status as 400);\n }\n\n return responseFromGateway(response, false);\n } catch (err) {\n if (err instanceof BadRequestError) {\n return context.json({ error: err.message }, 400);\n }\n const message = err instanceof Error ? err.message : String(err);\n console.error('AI Gateway error:', message);\n return context.json({ error: 'gateway error' }, 502);\n }\n});\n\nai.post('/models', async (context) => {\n const body = context.get('body');\n try {\n const result = await context.env.AI.models(body.inputs);\n return context.json(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error('AI inference error:', message);\n return context.json({ error: 'inference error' }, 502);\n }\n});\n\nai.post('/toMarkdown', async (context) => {\n const body = context.get('body');\n try {\n const result = await context.env.AI.toMarkdown(body.inputs, body.options);\n return context.json(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error('AI inference error:', message);\n return context.json({ error: 'inference error' }, 502);\n }\n});\n\nexport { ai };\n", "import type { ProxyBody } from './types.ts';\n\nexport function isProxyBody(value: unknown): value is ProxyBody {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\nexport function asNumber(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null;\n}\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n return isProxyBody(value) ? value : {};\n}\n\nexport function isQueryValue(value: unknown): value is string | number | boolean {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n}\n", "export function proxyCapabilityEnabled(value: string | undefined, capability: string): boolean {\n if (capability === 'sandbox') {\n return false;\n }\n if (!value) {\n return true;\n }\n try {\n const parsed = JSON.parse(value) as unknown;\n return (\n !!parsed &&\n typeof parsed === 'object' &&\n !Array.isArray(parsed) &&\n (parsed as Record<string, unknown>)[capability] === true\n );\n } catch {\n return false;\n }\n}\n", "import { Hono } from 'hono';\nimport { asString } from './body.ts';\nimport { dispatchToWorker } from './dispatch.ts';\nimport { resolveResource } from './resolve.ts';\nimport type { ProxyEnv } from './types.ts';\n\nconst CF_API = 'https://api.cloudflare.com/client/v4';\n\nconst d1 = new Hono<ProxyEnv>();\n\nd1.post('/query', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const sql = asString(body.sql);\n\n if (!binding || !sql) {\n return context.json({ error: 'binding and sql required' }, 400);\n }\n\n // Try WfP dispatch first (native bindings, ~1-5ms)\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/d1/query', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API (for old deploys without /__void handler)\n let dbId: string;\n try {\n dbId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'd1', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/d1/database/${dbId}/query`,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${context.env.CF_API_TOKEN}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ sql, params: body.params ?? [] }),\n },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'D1 query failed', status: cfRes.status }, 502);\n }\n\n const cfData = (await cfRes.json()) as {\n result?: ReadonlyArray<{\n results?: ReadonlyArray<Record<string, unknown>>;\n meta?: Record<string, unknown>;\n }>;\n };\n const queryResult = cfData.result?.[0];\n\n if (!queryResult) {\n return context.json({ error: 'unexpected D1 response' }, 502);\n }\n\n switch (body.method) {\n case 'first':\n return context.json(queryResult.results?.[0] ?? null);\n case 'raw': {\n const columns = queryResult.results?.length ? Object.keys(queryResult.results[0]) : [];\n const values = (queryResult.results ?? []).map((row) => Object.values(row));\n return context.json({ columns, results: values, meta: queryResult.meta });\n }\n case 'run':\n return context.json({ success: true, meta: queryResult.meta });\n case 'all':\n default:\n return context.json({\n results: queryResult.results ?? [],\n success: true,\n meta: queryResult.meta,\n });\n }\n});\n\nd1.post('/batch', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding || !Array.isArray(body.statements)) {\n return context.json({ error: 'binding and statements required' }, 400);\n }\n\n // Try WfP dispatch first (native db.batch() with transactional guarantees)\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/d1/batch', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // There is no sequential fallback: D1Database.batch() promises one atomic\n // native batch. If the active worker cannot provide that capability, fail\n // before issuing any statement rather than partially applying the batch.\n return context.json({ error: 'atomic D1 batch unavailable for active deployment' }, 503);\n});\n\nexport { d1 };\n", "import type { Env } from './types.ts';\n\ntype WorkerResolution = Readonly<{ workerName: string; deploymentId: string }>;\n\ntype DispatchOptions = Readonly<{\n /** Read-only operations may retry through their REST fallback after a transport failure. */\n fallbackOnDispatchError?: boolean;\n}>;\n\n/**\n * Resolve the active deployment's worker through the API service binding.\n *\n * This lookup intentionally runs for every operation. The project id is stable,\n * while rollback changes the active deployment and therefore the worker name.\n */\nasync function resolveWorker(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n): Promise<WorkerResolution | null> {\n const token = await hmacSign(projectId, jwtSecret);\n const res = await api.fetch(`https://api/internal/resolve-worker/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n });\n\n if (res.status === 404 || res.status === 409) {\n return null;\n }\n if (!res.ok) {\n throw new Error(`worker resolution failed with status ${res.status}`);\n }\n\n const data = await res.json<Partial<WorkerResolution>>();\n if (typeof data.workerName !== 'string' || typeof data.deploymentId !== 'string') {\n throw new Error('worker resolution returned an invalid response');\n }\n return { workerName: data.workerName, deploymentId: data.deploymentId };\n}\n\n/**\n * Dispatch a binding operation to the user's deployed worker via Workers for Platforms.\n * The user worker handles it via native D1/KV/R2 bindings at the `/__void/*` route.\n *\n * Returns the Response if successful, or null if the worker doesn't support /__void\n * (404 = old deploy without the handler \u2192 caller should fall back to REST API).\n */\nexport async function dispatchToWorker(\n env: Env,\n projectId: string,\n path: string,\n body: Record<string, unknown>,\n options: DispatchOptions = {},\n): Promise<Response | null> {\n let resolution: WorkerResolution | null;\n try {\n resolution = await resolveWorker(env.API, env.JWT_SECRET, projectId);\n } catch {\n return options.fallbackOnDispatchError\n ? null\n : Response.json({ error: 'active worker resolution failed' }, { status: 502 });\n }\n if (!resolution) {\n return null;\n }\n\n const proxyToken = await hmacSign(projectId, env.JWT_SECRET);\n let worker: Fetcher;\n try {\n worker = env.DISPATCH.get(resolution.workerName);\n } catch {\n return null;\n }\n\n try {\n const res = await worker.fetch(`https://worker/__void${path}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': proxyToken,\n },\n body: JSON.stringify(body),\n });\n\n // 404 means old deploy without /__void handler \u2192 fall back\n if (res.status === 404) {\n return null;\n }\n\n return res;\n } catch {\n // A write may already have committed before a response/transport failure.\n // Only explicitly read-only callers may replay through a REST fallback.\n return options.fallbackOnDispatchError\n ? null\n : Response.json(\n { error: 'worker dispatch failed; operation result is unknown' },\n { status: 502 },\n );\n }\n}\n\n// --- HMAC signing (mirrors resolve.ts) ---\n\nconst encoder = new TextEncoder();\nlet cachedSignKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getSignKey(secret: string): Promise<CryptoKey> {\n if (cachedSignKey && cachedKeySecret === secret) {\n return cachedSignKey;\n }\n cachedSignKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n cachedKeySecret = secret;\n return cachedSignKey;\n}\n\nasync function hmacSign(data: string, secret: string): Promise<string> {\n const key = await getSignKey(secret);\n const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(data));\n const binary = String.fromCharCode(...new Uint8Array(sig));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n", "// In-memory cache: resource mappings are stable (only change on deploy).\n// Persists across requests within the same CF worker isolate.\nconst cache = new Map<string, string>();\n\n/** @internal Exposed for testing only. */\nexport function clearResolveCache() {\n cache.clear();\n}\n\n/**\n * Resolves a project's binding to its Cloudflare resource ID via the API service binding.\n * Results are cached in-memory per isolate \u2014 the first call per binding hits the API,\n * subsequent calls return instantly.\n */\nexport async function resolveResource(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n type: 'd1' | 'kv' | 'r2',\n bindingName: string,\n): Promise<string> {\n const cacheKey = `${projectId}:${type}:${bindingName}`;\n const cached = cache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const token = await hmacSign(projectId, jwtSecret);\n const res = await api.fetch(`https://api/internal/resolve-resource/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({ type, binding: bindingName }),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => res.statusText);\n throw new Error(`Resource resolution failed (${res.status}): ${text}`);\n }\n\n const data = await res.json<{ cf_id: string }>();\n cache.set(cacheKey, data.cf_id);\n return data.cf_id;\n}\n\n/**\n * Verifies that a user owns a project via the API service binding.\n * Called on the JWT auth path to prevent cross-tenant access.\n */\nexport async function verifyProjectOwner(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n userId: string,\n): Promise<boolean> {\n try {\n const token = await hmacSign(projectId, jwtSecret);\n const res = await api.fetch(`https://api/internal/verify-owner/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({ userId }),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\n/** Check that a build-bound prerender credential is still in flight. */\nexport async function verifyPrerenderBuild(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n buildId: string,\n): Promise<boolean> {\n try {\n const token = await hmacSign(projectId, jwtSecret);\n const res = await api.fetch(`https://api/internal/verify-prerender-build/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({ buildId }),\n });\n return res.ok;\n } catch {\n // Project-data access fails closed if the revocation authority is\n // unavailable. A build can retry without widening its credential.\n return false;\n }\n}\n\n// --- HMAC signing (mirrors packages/api/src/auth/hmac.ts) ---\n\nconst encoder = new TextEncoder();\nlet cachedSignKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getSignKey(secret: string): Promise<CryptoKey> {\n if (cachedSignKey && cachedKeySecret === secret) {\n return cachedSignKey;\n }\n cachedSignKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n cachedKeySecret = secret;\n return cachedSignKey;\n}\n\nasync function hmacSign(data: string, secret: string): Promise<string> {\n const key = await getSignKey(secret);\n const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(data));\n const binary = String.fromCharCode(...new Uint8Array(sig));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n", "/**\n * POST /email/relay \u2014 the inbound hop for custom sender domains (design doc\n * 0078, \"Custom domains on Cloudflare\").\n *\n * A relay worker deployed into the CUSTOMER's Cloudflare account (one per\n * registered domain) receives the zone's catch-all mail and streams the raw\n * MIME here, with the envelope in headers:\n *\n * POST /email/relay\n * Authorization: Bearer <relay secret>\n * X-Void-Email-Domain / X-Void-Email-From / X-Void-Email-To\n * <raw MIME body \u2014 no base64, no JSON envelope>\n *\n * Auth happens in the global auth middleware in `index.ts` (header and\n * content-length bounds BEFORE any crypto, then the mirror lookup, the\n * constant-time secret compare, the `active` status check, and\n * `context.set('projectId', \u2026)`). This handler reads the body, builds the\n * `EmailEnvelope` from the header envelope + body, and runs the second half\n * of `routeInbound` \u2014 `routeRelayed` in `email-router.ts` \u2014 for the\n * mirror's project.\n *\n * The relay worker answers any non-2xx with `message.setReject` and a\n * generic reason, so this endpoint's response is one bit: 200 accepted,\n * anything else rejected. Failure detail stays in proxy logs; the response\n * body never carries it.\n */\n\nimport { Hono } from 'hono';\nimport { MAX_INBOUND_HEADERS, routeRelayed } from './email-router.ts';\nimport type { EmailEnvelope } from './email-router.ts';\nimport { MAX_MIME_BYTES } from './email.ts';\nimport type { ProxyEnv } from './types.ts';\n\nconst app = new Hono<ProxyEnv>();\n\napp.post('/relay', async (context) => {\n // Set by the auth branch; the envelope headers were presence- and\n // length-checked there. Read them here rather than trusting the body \u2014\n // the relay derives them from the CF envelope, and the MIME's own From:/\n // To: headers are the sender's bytes.\n const projectId = context.get('projectId');\n const from = context.req.header('X-Void-Email-From') ?? '';\n const to = context.req.header('X-Void-Email-To') ?? '';\n // The auth branch proved the declared domain header equals the envelope\n // recipient's domain; attribute on the envelope, never on the claim.\n const domain = to.slice(to.lastIndexOf('@') + 1).toLowerCase();\n\n const body = context.req.raw.body;\n if (!body) {\n return context.json({ error: 'mime body required' }, 400);\n }\n // The middleware checked the DECLARED content-length; a declared length\n // can lie, so the read is bounded again here.\n const raw = await readMimeBody(body);\n if (raw === null) {\n return context.json({ error: 'mime too large' }, 413);\n }\n const headers = parseRelayedHeaders(raw);\n if (headers === null) {\n return context.json({ error: 'too many headers' }, 413);\n }\n\n const envelope: EmailEnvelope = {\n from,\n to,\n headers,\n raw,\n rawSize: raw.byteLength,\n viaDomain: domain,\n };\n\n // Hono's `context.executionCtx` throws when the worker was invoked\n // without one (unit tests call `app.fetch(request, env)`). Fall back to a\n // collector whose promises are flushed before the response, so tests\n // observe the same log-recv effects production defers.\n const pending: Array<Promise<unknown>> = [];\n let ctx: ExecutionContext = {\n waitUntil(p: Promise<unknown>) {\n pending.push(p);\n },\n passThroughOnException() {},\n } as unknown as ExecutionContext;\n try {\n ctx = context.executionCtx as unknown as ExecutionContext;\n } catch {\n // No ExecutionContext on this invocation \u2014 keep the collector.\n }\n\n const outcome = await routeRelayed(context.env, ctx, { projectId, domain, envelope });\n if (pending.length > 0) {\n await Promise.allSettled(pending);\n }\n if (outcome.reject) {\n return context.json({ error: 'message rejected' }, 403);\n }\n return context.json({ ok: true });\n});\n\n/**\n * Bounded read of the request body \u2014 the same accumulation pattern as\n * `readStreamToBytes` in `email-router.ts`, against the outbound MIME cap\n * (the contract's \"existing MIME size cap\"), returning null instead of\n * throwing so the caller answers a plain 413.\n */\nasync function readMimeBody(stream: ReadableStream<Uint8Array>): Promise<Uint8Array | null> {\n const reader = stream.getReader();\n const chunks: Array<Uint8Array> = [];\n let total = 0;\n for (;;) {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n total += value.byteLength;\n if (total > MAX_MIME_BYTES) {\n // Cancel so the peer stops sending; the size refusal is already\n // decided.\n try {\n await reader.cancel();\n } catch {\n // Cancellation is best-effort.\n }\n return null;\n }\n chunks.push(value);\n }\n const out = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n out.set(c, offset);\n offset += c.byteLength;\n }\n return out;\n}\n\nconst LF = 0x0a;\nconst CR = 0x0d;\n\n/**\n * RFC 7230 tchar \u2014 the only names `new Headers()` accepts. A line whose\n * name fails this is skipped WITH its continuations.\n */\nconst HEADER_NAME_RE = /^[!#$%&'*+\\-.^_`|~0-9a-z]+$/;\n\n/**\n * Rebuild the envelope's header bag from the raw MIME header block \u2014 the\n * relay carries no parsed headers, and the platform lane's `buildEnvelope`\n * equivalent for this lane has to read the same bytes the tenant will.\n *\n * The block ends at the first empty line. Continuation lines (leading WSP)\n * unfold onto the header they extend; a name repeated folds with `\", \"`,\n * matching how workerd's `Headers` presents a duplicated header on the\n * platform lane. `Object.fromEntries` defines each name as an OWN data\n * property for the same reason `buildEnvelope` uses it: a `__proto__`\n * header must never touch the prototype chain.\n *\n * The tenant worker rebuilds a `Headers` from this record inside\n * `createMessageProxy`, and a throw there fails dispatch \u2014 so any name that\n * is not a tchar token, and any value `new Headers()` would refuse (NUL,\n * CR, LF, DEL and the other C0/C1 controls, or a code point above the\n * ByteString ceiling), is SKIPPED rather than passed through. The raw MIME\n * stays authoritative: `parseEmail` in the tenant sees everything.\n *\n * Returns null when the block holds more DISTINCT names than\n * `MAX_INBOUND_HEADERS` \u2014 the same refusal the platform lane makes.\n */\n/**\n * Cap TOTAL header pieces (distinct names + repeat occurrences + folds).\n * `MAX_INBOUND_HEADERS` alone bounds only new map keys: one valid name\n * repeated hundreds of thousands of times inside the MIME cap would still\n * allocate and join an unbounded number of pieces here, in the shared\n * proxy isolate. The count is charged per piece \u2014 the allocation unit \u2014\n * so repeats and folds hit the same wall as distinct names.\n */\nconst MAX_INBOUND_HEADER_LINES = 4096;\n\nfunction parseRelayedHeaders(raw: Uint8Array): Record<string, string> | null {\n const block = new TextDecoder().decode(raw.subarray(0, headerBlockEnd(raw)));\n // Pieces per name, each pushed with its join separator \u2014 `\", \"` for a\n // repeat occurrence, `\" \"` for a fold \u2014 and joined ONCE at the end;\n // concatenating the accumulated value per line is quadratic CPU on a\n // block of repeated same-name headers.\n const folded = new Map<string, Array<string>>();\n // Total pieces across all names \u2014 the allocation unit the cap charges.\n let totalPieces = 0;\n // The name the current continuation line extends, or null when the\n // previous line was skipped.\n let current: string | null = null;\n let pos = 0;\n while (pos < block.length) {\n let nl = block.indexOf('\\n', pos);\n if (nl === -1) {\n nl = block.length;\n }\n let line = block.slice(pos, nl);\n pos = nl + 1;\n if (line.endsWith('\\r')) {\n line = line.slice(0, -1);\n }\n if (line === '') {\n break;\n }\n if (line.startsWith(' ') || line.startsWith('\\t')) {\n if (current !== null && headerValueSafe(line)) {\n totalPieces += 1;\n if (totalPieces > MAX_INBOUND_HEADER_LINES) {\n return null;\n }\n const pieces = folded.get(current) ?? [];\n pieces.push(` ${line.trim()}`);\n folded.set(current, pieces);\n }\n continue;\n }\n const colon = line.indexOf(':');\n if (colon === -1) {\n current = null;\n continue;\n }\n const name = line.slice(0, colon).trim().toLowerCase();\n const value = line.slice(colon + 1).trim();\n if (!HEADER_NAME_RE.test(name) || !headerValueSafe(value)) {\n current = null;\n continue;\n }\n const pieces = folded.get(name);\n totalPieces += 1;\n if (totalPieces > MAX_INBOUND_HEADER_LINES) {\n return null;\n }\n if (pieces !== undefined) {\n pieces.push(`, ${value}`);\n } else {\n if (folded.size >= MAX_INBOUND_HEADERS) {\n return null;\n }\n folded.set(name, [value]);\n }\n current = name;\n }\n return Object.fromEntries(\n Array.from(folded, ([name, pieces]): [string, string] => [name, pieces.join('')]),\n );\n}\n\n/** Byte offset where the header block ends (the first empty line). */\nfunction headerBlockEnd(raw: Uint8Array): number {\n let lineStart = 0;\n while (lineStart < raw.length) {\n const lf = raw.indexOf(LF, lineStart);\n const lineEnd = lf === -1 ? raw.length : lf;\n let contentEnd = lineEnd;\n if (contentEnd > lineStart && raw[contentEnd - 1] === CR) {\n contentEnd--;\n }\n if (contentEnd === lineStart) {\n return lineStart;\n }\n lineStart = lf === -1 ? raw.length : lf + 1;\n }\n return raw.length;\n}\n\n/**\n * True when `new Headers()` accepts the value: HTAB, visible ASCII, and\n * Latin-1 (the ByteString range) are legal; every other control and any\n * code point above 0xff is not.\n */\nfunction headerValueSafe(value: string): boolean {\n for (let i = 0; i < value.length; i++) {\n const code = value.charCodeAt(i);\n if (code === 0x09) {\n continue;\n }\n if (code < 0x20 || code === 0x7f || code > 0xff) {\n return false;\n }\n }\n return true;\n}\n\nexport { app as emailRelay };\n", "/**\n * Inbound email router for the platform mail zone.\n *\n * Bound as the catch-all CF Email Routing rule on the zone named by the\n * `EMAIL_SENDER_DOMAIN` var (`mail.void.cloud` in production,\n * `mail.staging.void.cloud` in staging). Every inbound message hits this\n * worker; we parse `<slug>+<tag>` from the\n * recipient local-part, look up the project's worker name in `ROUTING` KV,\n * serialize the message into an `EmailEnvelope` (RPC-safe), and dispatch\n * into the user worker via the WfP namespace stub's `email(envelope)` RPC\n * method. The user worker returns an `EmailAction[]` describing what its\n * handler decided; we enact each action on the real\n * `ForwardableEmailMessage`.\n *\n * Why an envelope/action contract instead of passing the real message?\n * `ForwardableEmailMessage` is not in workerd's RPC `BaseType` allowlist\n * (see types/defines/rpc.d.ts) and isn't `JSG_SERIALIZABLE` (see\n * src/workerd/jsg/ser.c++:241-330). Calling `stub.email(realMessage)`\n * throws `DataCloneError` before any bytes are sent. The envelope shape\n * uses only RPC-safe primitives (string, plain object, ReadableStream\n * <Uint8Array>, number) so marshaling succeeds. Async metering log fires\n * via ctx.waitUntil after the handler returns.\n */\n\nimport { isReservedEmailSlug } from '@voidcloud/api/reserved-slugs';\nimport { EmailMessage } from 'cloudflare:email';\nimport { validate as isValidEmailSyntax } from 'email-validator';\nimport { dropEmailDomainLease, leaseBearer, leaseEmailDomainCredential } from './email-lease.ts';\nimport {\n MAX_MIME_BYTES,\n readEmailDomainMirror,\n readMimeFromAddrSpec,\n readSenderDomain,\n readSendRawAddressList,\n recordInboundDelivery,\n} from './email.ts';\nimport type { SendRawResult } from './email.ts';\nimport type { Env } from './types.ts';\n\n// Built via new RegExp to dodge oxlint no-control-regex rule.\n// oxlint-disable-next-line no-control-regex\nconst CONTROL_CHARS_RE = new RegExp('[\\\\u0000-\\\\u001f\\\\u007f]+', 'g');\n\n/**\n * Strip CR/LF/NUL/control chars before logging or sending to remote MTAs.\n *\n * Slice FIRST, then replace. Several inputs here arrive over RPC from the\n * tenant worker (a reject reason, a non-object action, an unknown action\n * type) and are bounded by nothing but the 32 MiB transport cap. A global\n * regex replace materializes one part per match, so a control-heavy string\n * costs far more than one copy: measured, a 30 MB `\\0a\\0a\u2026` reason is\n * ~1 GB of transient heap and 800+ ms, and a 4 MB one already exhausts a\n * 128 MB heap \u2014 the shared proxy isolate's ceiling \u2014 before any outbound\n * gate has run. Slicing first bounds the replace to `maxLen` code units.\n *\n * The result is therefore at most `maxLen` chars and may be SHORTER: a run of\n * controls inside the window collapses to one space and the window is not\n * refilled from beyond `maxLen`. Every caller renders a log line or a DSN\n * reason, where a shorter window loses nothing that matters. Slicing at a\n * UTF-16 index can split a surrogate pair either way \u2014 the old order sliced\n * at the same kind of boundary after replacing \u2014 so this does not change\n * that class of edge.\n */\nfunction sanitize(value: string, maxLen: number): string {\n return value.slice(0, maxLen).replace(CONTROL_CHARS_RE, ' ');\n}\n\n/**\n * Render a tenant-supplied value of UNKNOWN type for a log line, without\n * ever coercing its contents.\n *\n * `sanitize(String(value), n)` is bounded only when `value` is already a\n * string. Everything else the RPC transport can carry is an amplifier or a\n * CPU sink that runs to completion before the slice: `String()` of a typed\n * array or an Array joins every element with commas (measured: a 30 MB\n * `Uint8Array` is a 107M-char string, +385 MB of heap, ~580 ms, and an OOM\n * under the 128 MB isolate ceiling; a nested array flattens recursively\n * to the same), and `String()` of a BigInt is a decimal conversion that is\n * superlinear in its size (measured: 4 MiB is 1.9 s, 32 MiB is 20 s of CPU\n * \u2014 the whole RPC cap, spent ahead of every outbound gate). Both reach here\n * from any hand-built entrypoint, as an action, an action's `type`, or an\n * address that failed validation.\n *\n * So: a string is sliced then stripped; a number, boolean, `undefined` or\n * `null` renders as itself (all a few chars); and anything else \u2014 bigint,\n * function, symbol, any object \u2014 renders as its KIND only. The object tag\n * comes from `Object.prototype.toString`, which reads nothing a tenant can\n * set: it consults only `Symbol.toStringTag`, and symbol-keyed properties do\n * not cross RPC (structured clone drops them). `constructor.name` would\n * not be safe \u2014 `constructor` is an ordinary string key the tenant can send\n * with any value. The tag is sliced anyway so a local caller cannot make it\n * long either.\n */\nfunction describeUntrusted(value: unknown, maxLen: number): string {\n switch (typeof value) {\n case 'string':\n return sanitize(value, maxLen);\n case 'number':\n case 'boolean':\n case 'undefined':\n return String(value);\n case 'object':\n return value === null ? 'null' : sanitize(Object.prototype.toString.call(value), 64);\n default:\n // bigint, function, symbol\n return `[${typeof value}]`;\n }\n}\n\ninterface RoutingEntry {\n workerName?: string;\n projectId?: string;\n /**\n * Per-project dispatch limits (`{ cpuMs?, subRequests? }`), written by the\n * api worker and applied by `packages/dispatch` on every HTTP request.\n * Inbound mail dispatches into the same tenant worker, so it has to pass\n * the same limits \u2014 otherwise anyone who can send mail to a project's\n * address runs that tenant's worker at the namespace default.\n */\n limits?: Record<string, number>;\n /**\n * Platform-wide suspension marker, written by `applyRoutingSuspension` in\n * the api worker and answered with a 429 by `packages/dispatch`. Inbound\n * mail honors it too: running a suspended tenant's code on platform CPU is\n * exactly what suspension exists to stop.\n */\n suspended?: string;\n // Other routing fields exist on this KV value (used by HTTP dispatch);\n // we only care about these here.\n}\n\n/**\n * Mirrors `void/email`'s EmailEnvelope. RPC-safe primitives only.\n *\n * `raw` is a `Uint8Array` (not a `ReadableStream`) because we pre-buffer\n * the message body in `buildEnvelope`. The framework-side `EmailEnvelope`\n * type accepts both shapes for forward-compat, but every value we send\n * over the wire today is a Uint8Array. Both forms ARE in workerd's RPC\n * `BaseType` allowlist, so either marshals; the buffered form survives\n * being read more than once on the user worker (parseEmail consumes the\n * stream, and we want the receiving framework to be free to replay).\n */\ninterface EmailEnvelope {\n from: string;\n to: string;\n headers: Record<string, string>;\n raw: Uint8Array;\n rawSize: number;\n /**\n * The registered custom domain this message arrived on, set only on the\n * relay lane (`/email/relay` \u2014 design doc 0078, \"Custom domains on\n * Cloudflare\"). Undefined on the platform mail zone. The framework's\n * dispatcher runs in no-prefix mode for a relayed envelope (Mode B item\n * 4): the recipient carries no `<slug>+` prefix to strip.\n */\n viaDomain?: string;\n}\n\n/** Exported for the relay lane (`email-relay.ts`), which builds its own. */\nexport type { EmailEnvelope };\n\n/** Mirrors `void/email`'s EmailAction. */\ntype EmailAction =\n | { type: 'reject'; reason: string }\n | { type: 'forward'; to: string; headers?: Record<string, string> }\n | { type: 'reply'; from: string; to: string; raw: Uint8Array };\n\ninterface EmailEntrypointStub {\n /**\n * Standard CF handler-named RPC method on the user worker's\n * WorkerEntrypoint subclass. Receives an envelope (RPC-safe primitives)\n * and returns the action queue the framework's dispatcher recorded.\n */\n email?(envelope: EmailEnvelope): Promise<Array<EmailAction> | undefined>;\n fetch?(req: Request | string, init?: RequestInit): Promise<Response>;\n}\n\n/**\n * Cap inbound bytes well below CF's ~25 MB ceiling. The envelope is buffered\n * here AND copied again across RPC into the user worker, so two of these have\n * to fit in the proxy isolate's heap. 10 MB is generous for normal mail and\n * keeps headroom for everything else the isolate is doing.\n *\n * The framework's test harness (`createInboundTestHarness`) restates this\n * and `MAX_INBOUND_HEADERS` and refuses a synthetic message the way this\n * router does, before the handler runs, so a test cannot pass a handler\n * against a message the router never dispatches; exported so the router\n * test pins the pairs equal.\n */\nexport const MAX_INBOUND_BYTES = 10 * 1024 * 1024;\n\n/**\n * Cap the number of DISTINCT header names on an inbound message.\n *\n * `MAX_INBOUND_BYTES` bounds the header bag's BYTES (headers are part of\n * `raw`) but not its COUNT, and count is what `buildEnvelope` pays for:\n * `Object.fromEntries` defines one own property per distinct name on a\n * dictionary-mode object, ~75\u2013110 B of V8 heap each (measured; the range\n * is the table's doubling cycle), against a wire minimum of 7 bytes per\n * line (`abcd:\\r\\n`). The byte cap therefore admits ~1.5M distinct names,\n * and materializing those is a hard OOM under the 128 MB isolate ceiling\n * (measured: 1.5M keys is 158 MB retained and ~580 ms in Node, ~1.2 s of\n * CPU in workerd; 1.3M still fits, at 82 MB) \u2014 in the SHARED proxy isolate,\n * ahead of dispatch, from any remote sender who fills a message with short\n * headers. The same bag is then walked again by the RPC serializer and\n * copied into a `Headers` by the tenant's `createMessageProxy`, so the cap\n * here bounds both of those too.\n *\n * Real mail carries well under 100 distinct names. workerd's `Headers`\n * folds repeated names (`Received`, `DKIM-Signature`, `ARC-*`) into ONE\n * entry each, so hop count does not raise the number. 1024 is 10x that,\n * and the amplified cost at 1024 (~140 KB) is noise next to the raw buffer.\n *\n * Checked by walking `message.headers` and stopping at the cap, BEFORE the\n * body is buffered and before `Object.fromEntries` builds anything. In\n * workerd, `entries()` snapshots the whole bag once into a `kj::Array`\n * (`Headers::getDisplayedHeaders`, C++ memory the V8 heap limit does not\n * see; there is no `size`) \u2014 work `fromEntries` was paying anyway. The\n * early stop is what keeps the V8-side cost of an over-cap message to\n * `MAX_INBOUND_HEADERS + 1` pairs.\n */\nexport const MAX_INBOUND_HEADERS = 1024;\n\n/**\n * Cap user-supplied reject reasons \u2014 surfaced to remote MTAs and our logs.\n * The framework's `createMessageProxy` restates this figure and applies the\n * same slice-and-strip when the reason is recorded, so a native\n * (own-account) replay carries the string this router would; exported so\n * the router test pins the two equal.\n */\nexport const MAX_REJECT_REASON_LENGTH = 1000;\n\n/**\n * Cap the number of actions one dispatch may return.\n *\n * The list arrives over RPC from a tenant worker and is walked here, in the\n * SHARED proxy isolate, before `checkOutboundGate` has looked at a single\n * entry \u2014 so an unbounded list is per-entry validation work (address regex,\n * `new Headers()`, `sanitize()` on every drop log) that is never metered and,\n * because the drop path just `continue`s, endlessly repeatable by anyone who\n * can send mail to the project's address. The framework caps the queue at the\n * same number, but that cap lives inside the tenant's own worker: a\n * Workers-for-Platforms tenant can ship any `WorkerEntrypoint` whose `email()`\n * returns any array at all, so the framework-side cap is a developer-experience\n * guardrail and THIS one is the boundary. Same belt-and-suspenders split as\n * `MAX_RECIPIENTS` on the outbound path in `email.ts`.\n *\n * Checked against the RAW list BEFORE the loop allocates, for the same reason\n * `MAX_RECIPIENTS` is checked before normalization: the loop is what costs.\n *\n * Matches the outbound `MAX_RECIPIENTS` deliberately. An inbound forward or\n * reply IS the outbound fan-out primitive \u2014 same per-project allowlist, same\n * burst and monthly counters \u2014 so the two paths must not offer different\n * ceilings on the same capability.\n */\nconst MAX_ACTIONS = 100;\n\n/**\n * Cap a single address inside an action (`forward.to`, `reply.from`,\n * `reply.to`). `MAX_ACTIONS` alone still leaves a 100 x <address length>\n * amplifier: every address is scanned by `isValidEmailAddress` and, on the\n * drop path, copied twice more by `sanitize()`. Checked BEFORE the scan for\n * exactly that reason. RFC 5321 caps a forward-path at 256 octets, so 320 is\n * generous for anything deliverable \u2014 and it is the outbound\n * `MAX_RECIPIENT_LENGTH` value, for the reason given above.\n */\nconst MAX_ACTION_ADDRESS_LENGTH = 320;\n\n/**\n * Bound a forward's header bag. `new Headers(...)` lowercases and copies\n * every name and validates every value, so an unbounded bag is the same\n * unmetered work as an unbounded address list \u2014 and it survives RPC as a\n * plain object, so nothing upstream has looked at its size. The framework's\n * `createMessageProxy` restates both figures and refuses the bag at the\n * handler's own call, so a test does not report a forward this router would\n * drop; exported so the router test pins the pairs equal.\n */\nexport const MAX_FORWARD_HEADERS = 32;\nexport const MAX_FORWARD_HEADER_LENGTH = 1024;\n\n/**\n * Cap one reply's MIME bytes: `MAX_MIME_BYTES`, the `/email/send` bound in\n * `email.ts`, which is itself the twin of the framework's\n * `MAX_MESSAGE_BYTES` in `runtime/email/mime.ts` \u2014 the CF ceiling the\n * design doc records as ~10 MB base64-inflated.\n *\n * The framework checks this inside `reply()`, but that runs in the tenant's\n * own worker: a hand-written Workers-for-Platforms entrypoint returns any\n * `Uint8Array` the 32 MiB RPC transport carries, and until this check the\n * router's only bound on `reply.raw` was `instanceof Uint8Array` \u2014 it then\n * scanned the whole value for `From:` and streamed it into\n * `message.reply()`, where CF's own limit fails it late and opaquely (the\n * failure is logged here and the reply silently never goes out). Checked\n * BEFORE `readMimeFromAddrSpec`, whose scan is linear in `raw`.\n */\nconst MAX_REPLY_BYTES = MAX_MIME_BYTES;\n\n/**\n * Cumulative reply-byte budget for ONE delivery. Twin of the framework's\n * `MAX_REPLY_BYTES_TOTAL` in `runtime/email/inbound.ts`, same figure and\n * same rule: a reply that would overrun the budget is refused and NOT\n * charged, so a later, smaller reply that fits the remainder still goes.\n * Only the offending reply is dropped \u2014 like every other per-reply refusal\n * here (bad address, sender pin, MIME From) and unlike an invalid forward\n * header bag, which drops the whole list because partially enacting an\n * injection attempt is the worse failure. An oversized reply is a resource\n * bound, and the in-budget replies cost no more than a compliant list.\n */\nconst MAX_REPLY_BYTES_TOTAL = 2 * MAX_REPLY_BYTES;\n\n// workerd's RPC layer throws TypeError with messages like\n// \"The RPC receiver does not implement the method 'X'\". Match a couple of\n// shapes to survive minor wording shifts in workerd. Lessons.md notes this\n// is the only signal distinguishing pre-WorkerEntrypoint deploys from\n// genuine handler errors.\nconst RPC_METHOD_MISSING = /does not implement the method|receiver does not.*method/i;\n\nclass InboundTooLargeError extends Error {\n constructor(public readonly size: number) {\n super(`inbound message exceeds ${MAX_INBOUND_BYTES} bytes (got ${size})`);\n this.name = 'InboundTooLargeError';\n }\n}\n\nclass InboundTooManyHeadersError extends Error {\n constructor() {\n super(`inbound message carries more than ${MAX_INBOUND_HEADERS} headers`);\n this.name = 'InboundTooManyHeadersError';\n }\n}\n\n/**\n * The address rule for `forward.to`, `reply.from` and `reply.to`:\n * `email-validator`, the SAME package the framework's `validateAddressParts`\n * applies when a handler's `forward(to)` or hand-built `reply()` records the\n * action (`packages/void/src/runtime/email/mime.ts`). One rule on both sides\n * means nothing the framework records is dropped here for its shape \u2014 a drop\n * here happens after the actions before it have fired, and a handler's test\n * harness has already reported the action as a success. The hand-written\n * regex this replaces had drifted from the framework's by one character at\n * a time (the dot in the domain, `:`, the control range), and both still\n * admitted `a..b@example.com`, which no dot-atom allows.\n *\n * The package refuses everything the regex did \u2014 whitespace, quotes,\n * parens, brackets, every C0 control and DEL, a second `@` \u2014 and also a\n * quoted or non-ASCII local part, a dot-less domain, a malformed dot-atom\n * (leading, trailing or doubled dots), a TLD that does not start with a\n * letter or is one character, more than 254 characters, a local part over\n * 64, or a label over 63. CF does strict validation on forward/reply too;\n * failing fast here keeps address fragments away from `EmailMessage` and\n * the SMTP layers downstream.\n *\n * Length FIRST: the package scans the whole string, so testing it on an\n * unbounded address is the work `MAX_ACTION_ADDRESS_LENGTH` exists to stop.\n * Guarding here covers `forward.to`, `reply.from` and `reply.to` at every\n * call site.\n *\n * Exported for the router test only: the framework's `validateAddressParts`\n * is the record-time twin of this rule, and the test pins that the two\n * `package.json`s stay on the same rule \u2014 every address one side accepts,\n * the other accepts, with zero divergences.\n */\nexport function isValidEmailAddress(s: unknown): s is string {\n return typeof s === 'string' && s.length <= MAX_ACTION_ADDRESS_LENGTH && isValidEmailSyntax(s);\n}\n\n/**\n * Render a rejected address for a log line. The value is whatever failed\n * `isValidEmailAddress`, so it need not be a string at all \u2014 a typed array\n * or an Array as `to` used to be joined whole by `String()` before the\n * slice. `describeUntrusted` renders a string within\n * `MAX_ACTION_ADDRESS_LENGTH` code units and anything else by kind.\n */\nfunction logAddress(value: unknown): string {\n return describeUntrusted(value, MAX_ACTION_ADDRESS_LENGTH);\n}\n\n/**\n * True when a forward's header bag is within bounds. Logs and returns false\n * otherwise, which DROPS THE WHOLE LIST at the call site \u2014 the same response\n * `new Headers()` throwing already gets, and for the same reason: an\n * over-sized bag on one forward says the handler is hostile, and partially\n * enacting the rest of its list is the worse failure mode.\n *\n * SHAPE FIRST, before anything enumerates. The declared type is a record,\n * but the value crossed RPC from the tenant, so it can be a string, a\n * `String`, an Array or a typed array \u2014 each has one indexed own property\n * PER ELEMENT, and `Object.entries` / `Object.keys` / `for\u2026in` all\n * materialize the whole key set before a count can be read (V8 builds the\n * for-in enum cache up front; `break` does not help). Measured ~100 B per\n * element: a 1.5 MiB string is an OOM in a 128 MB isolate, from a payload\n * 20x below the RPC cap. The old `new Headers(<any of these>)` threw in\n * O(1); this keeps that. workerd RPC only delivers `Object.prototype`\n * objects (it refuses to serialize a null-prototype one), so a plain-object\n * test is exact; null is accepted too for callers that never crossed RPC.\n */\nfunction forwardHeadersWithinBounds(headers: unknown): headers is Record<string, string> {\n if (typeof headers !== 'object' || headers === null) {\n console.error('[email-router] action list dropped: forward headers is not a plain object');\n return false;\n }\n const proto = Object.getPrototypeOf(headers);\n if (proto !== Object.prototype && proto !== null) {\n console.error('[email-router] action list dropped: forward headers is not a plain object');\n return false;\n }\n // `Object.keys`, not `Object.entries`: one pointer per key on top of the\n // deserialized object the isolate already holds, versus a fresh 2-tuple\n // per entry. The count is read before any value is touched.\n const names = Object.keys(headers);\n if (names.length > MAX_FORWARD_HEADERS) {\n console.error(\n `[email-router] action list dropped: forward has ${names.length} headers (max ${MAX_FORWARD_HEADERS})`,\n );\n return false;\n }\n for (const name of names) {\n const value = (headers as Record<string, unknown>)[name];\n // The NAME is bounded too: `new Headers()` accepts an arbitrarily long\n // token, so an unbounded name is the same amplifier as an unbounded value.\n if (name.length > MAX_FORWARD_HEADER_LENGTH) {\n console.error(\n `[email-router] action list dropped: forward header name exceeds ${MAX_FORWARD_HEADER_LENGTH} characters`,\n );\n return false;\n }\n // A non-string value evades the length check below, and `new Headers()`\n // does not throw on it: workerd RPC delivers Arrays, typed arrays, and\n // numbers verbatim, and `new Headers({ x: <Array> })` coerces the value\n // with `String()` \u2014 an Array joins to one comma-separated string ~30x\n // its wire size (measured: a Date-filled Array OOMs the 128 MB isolate\n // from a ~4 MiB RPC payload). The declared type is `Record<string,\n // string>`; anything else is refused before it reaches `new Headers()`.\n if (typeof value !== 'string') {\n console.error(\n `[email-router] action list dropped: forward header \"${sanitize(name, 64)}\" value is not a string`,\n );\n return false;\n }\n if (value.length > MAX_FORWARD_HEADER_LENGTH) {\n console.error(\n `[email-router] action list dropped: forward header \"${sanitize(name, 64)}\" value exceeds ${MAX_FORWARD_HEADER_LENGTH} characters`,\n );\n return false;\n }\n }\n return true;\n}\n\n/**\n * Sender pin for `reply` actions \u2014 the inbound analogue of the outbound\n * `from` pin in `email.ts` (`strictFromRe` plus the local-part compare\n * against the project's slug).\n *\n * `message.reply()` hands `action.from` straight to `new EmailMessage(...)`,\n * and `action.from` is whatever the tenant's worker returned over RPC \u2014 the\n * framework's safe default is not a control point. CF Email Routing's own\n * reply rule is DOMAIN-level only, and every tenant plus the platform's\n * reserved `noreply` slug share one mail zone, so without this pin any\n * project can emit mail as any other project or as the platform. (`noreply`\n * being a reserved slug, this path is the ONLY way to emit it at all.)\n *\n * `domain` is taken from the RECEIVED `message.to`, deliberately NOT from\n * `EMAIL_SENDER_DOMAIN`: the received domain is what CF pinned when it\n * accepted the message, and `routeInbound` treats a missing\n * `EMAIL_SENDER_DOMAIN` as non-fatal (see `label` above). Reading the var\n * here would import the outbound path's fail-closed behavior into a router\n * that must keep routing.\n */\ninterface ReplySenderPin {\n /** Routed project slug, already lowercased by the caller. */\n slug: string;\n /** Domain of the received recipient, already lowercased. */\n domain: string;\n /**\n * The RECEIVING project. The pin's second accepted shape (design doc\n * 0078, \"What changes in the existing rules\") \u2014 any address on a domain\n * registered to the project \u2014 is checked against the `email-domain:` KV\n * mirror, which must map the from-domain to this project.\n */\n projectId: string | undefined;\n /** ROUTING KV for the mirror lookup. */\n kv: KVNamespace;\n /**\n * Per-message memo of fromDomain \u2192 registered-to-the-receiving-project,\n * so a burst of replies from one custom domain costs one KV read.\n */\n registeredDomains: Map<string, boolean>;\n}\n\n/**\n * True when `from` is a sender this project is allowed to speak as:\n * `<slug>@<domain>` or `<slug>+<tag>@<domain>` on the received domain,\n * case-insensitively \u2014 or any address on a custom domain whose\n * `email-domain:<domain>` mirror is `active` and maps to the receiving\n * project (the registered-domain shape).\n *\n * A BARE `<tag>@<domain>` is refused. The framework strips the `<slug>+`\n * prefix from `message.to` before a handler sees it, so a handler that\n * hand-rolls `from: message.to` produces that shape and CF accepts it\n * today \u2014 refusing it is a deliberate, breaking narrowing. It has to be:\n * a bare local-part is indistinguishable from another tenant's slug and\n * from the reserved `noreply`, so permitting the shape would re-open the\n * impersonation this pin closes. `replyEmail`'s default\n * (`<slug>+noreply@<domain>`) and the wire form `<slug>+<tag>@<domain>`\n * both keep working, and the un-stripped recipient stays available to\n * handlers on `message.__voidPlatformTo`.\n */\nasync function isPermittedReplySender(from: string, pin: ReplySenderPin): Promise<boolean> {\n // The address is forwarded VERBATIM to `EmailMessage`, so the comparison\n // has to run on bytes that cannot change under case folding. U+212A\n // KELVIN SIGN lowercases to 'k' and U+0130 to 'i', so a non-ASCII\n // local-part can satisfy a lowercased compare and still reach the shared\n // envelope sender intact. Same guard, same reason, as `email.ts`.\n if (!/^[\\x21-\\x7e]+$/.test(from)) {\n return false;\n }\n const lower = from.toLowerCase();\n const at = lower.indexOf('@');\n if (at <= 0) {\n return false;\n }\n const fromDomain = lower.slice(at + 1);\n if (fromDomain === pin.domain) {\n // Split on the first '+' exactly as the recipient is split in\n // `routeInbound`, so the sender's slug is read the same way the routed\n // slug was.\n const localPrefix = lower.slice(0, at).split('+')[0] ?? '';\n if (localPrefix.length > 0 && localPrefix === pin.slug) {\n return true;\n }\n // Fall through: the received domain may itself be registered to the\n // receiving project \u2014 on the relay lane it always is \u2014 in which case\n // any address on it is a permitted sender.\n }\n return isRegisteredDomainSender(fromDomain, pin);\n}\n\n/**\n * The registered-domain shape: true when the `email-domain:<fromDomain>`\n * mirror is `active` and names the receiving project. Fails closed on a KV\n * error \u2014 `validateActions` has no try/catch, and a throw here would\n * escape `routeInbound` and retry the delivery instead of dropping the\n * reply.\n */\nasync function isRegisteredDomainSender(fromDomain: string, pin: ReplySenderPin): Promise<boolean> {\n if (!pin.projectId) {\n return false;\n }\n const cached = pin.registeredDomains.get(fromDomain);\n if (cached !== undefined) {\n return cached;\n }\n const mirror = await readEmailDomainMirror(pin.kv, fromDomain, { cacheTtl: 60 }).catch(\n () => null,\n );\n const registered =\n mirror !== null && mirror.projectId === pin.projectId && mirror.status === 'active';\n pin.registeredDomains.set(fromDomain, registered);\n return registered;\n}\n\nfunction readCounter(raw: string | null): number {\n // Mirror packages/proxy/src/email.ts. NaN-poison defense.\n if (!raw) {\n return 0;\n }\n const n = parseInt(raw, 10);\n return Number.isFinite(n) && n >= 0 ? n : 0;\n}\n\nfunction monthBucket(now: Date): string {\n return `${now.getUTCFullYear()}-${String(now.getUTCMonth() + 1).padStart(2, '0')}`;\n}\n\nfunction minuteBucket(now: Date): string {\n return `${now.getUTCFullYear()}${String(now.getUTCMonth() + 1).padStart(2, '0')}${String(\n now.getUTCDate(),\n ).padStart(2, '0')}T${String(now.getUTCHours()).padStart(2, '0')}${String(\n now.getUTCMinutes(),\n ).padStart(2, '0')}`;\n}\n\nfunction monthTtlSeconds(now: Date): number {\n const endOfMonth = Date.UTC(now.getUTCFullYear(), now.getUTCMonth() + 1, 1, 0, 0, 0, 0);\n const seconds = Math.ceil((endOfMonth - now.getTime()) / 1000) + 60 * 60;\n return Math.max(60, seconds);\n}\n\nasync function readAllowlist(kv: KVNamespace, projectId: string): Promise<Set<string>> {\n const raw = await kv.get(`email-allowlist:${projectId}`, { cacheTtl: 60 });\n if (!raw) {\n return new Set();\n }\n try {\n const arr = JSON.parse(raw) as unknown;\n if (!Array.isArray(arr)) {\n return new Set();\n }\n const out = new Set<string>();\n for (const v of arr) {\n if (typeof v === 'string') {\n out.add(v.toLowerCase());\n }\n }\n return out;\n } catch {\n return new Set();\n }\n}\n\nasync function getBurstLimit(kv: KVNamespace, projectId: string): Promise<number> {\n const raw = await kv.get(`email-burst-limit:${projectId}`, { cacheTtl: 60 });\n if (raw) {\n const n = parseInt(raw, 10);\n if (Number.isFinite(n) && n > 0) {\n return n;\n }\n }\n return 10;\n}\n\nasync function getMonthlyLimit(kv: KVNamespace, projectId: string): Promise<number> {\n const raw = await kv.get(`email-limit:${projectId}`, { cacheTtl: 60 });\n if (raw) {\n const n = parseInt(raw, 10);\n if (Number.isFinite(n) && n > 0) {\n return n;\n }\n }\n return 200;\n}\n\n/**\n * Per-message context derived ONCE in `routeInbound` and threaded through\n * `enactActions` so each forward/reply gets the same project guards as\n * `/email/send` (allowlist, suspend kill-switch, burst, monthly quotas).\n *\n * The counters are mutated as actions are enacted so a message that\n * forwards to two addresses charges quota for two \u2014 matching the\n * outbound semantics.\n */\ninterface OutboundGate {\n /** undefined when routing has no projectId; gate is then closed. */\n projectId: string | undefined;\n /** Relay lane (custom-domain sends): the recipient allowlist does not gate; quotas still apply. */\n skipAllowlist: boolean;\n allowlist: Set<string>;\n burstKey: string;\n burstLimit: number;\n burstCurrent: number;\n monthKey: string;\n monthLimit: number;\n monthCurrent: number;\n /** Once true, we've hit a quota and refuse any further forward/reply. */\n quotaExhausted: boolean;\n}\n\nexport async function routeInbound(\n message: ForwardableEmailMessage,\n env: Env,\n ctx: ExecutionContext,\n): Promise<void> {\n // Every reject reason is prefixed with the zone this router serves, so a\n // bounce tells the remote MTA which platform environment refused it. The\n // zone is configuration (`EMAIL_SENDER_DOMAIN`), not a constant \u2014 see\n // `readSenderDomain`. Unlike the outbound send path, a missing value is\n // NOT fatal here: nothing about inbound routing depends on the domain, so\n // failing closed would drop legitimate mail over a cosmetic var. Fall back\n // to a neutral label instead.\n const label = readSenderDomain(env) ?? 'void email';\n\n const to = String(message.to ?? '').toLowerCase();\n const local = to.split('@')[0] ?? '';\n // <slug>+<tag> \u2014 split on the first '+'. If there's no '+', the whole\n // local-part is the slug and the user worker sees the tag-less address.\n const plus = local.indexOf('+');\n const slug = plus === -1 ? local : local.slice(0, plus);\n // Domain CF pinned when it accepted this message. It is the expected\n // domain for any `reply` sender \u2014 see `ReplySenderPin`.\n const atIdx = to.indexOf('@');\n const receivedDomain = atIdx === -1 ? '' : to.slice(atIdx + 1);\n\n if (!slug) {\n message.setReject(`${label}: missing project slug in recipient`);\n return;\n }\n\n // `noreply@`, `postmaster@`, `abuse@`, \u2026 are the domain's own addresses,\n // not a tenant's: the bounces and replies to the platform's verification\n // mail come back to `noreply@<domain>`. `RESERVED_SLUGS` keeps a NEW\n // project from claiming one, but the routing blob below is keyed by slug\n // and a project registered before those were reserved still has one \u2014 it\n // would receive that mail. Refused before the KV read so no routing\n // entry, whatever its origin, can hand a reserved mailbox to a worker.\n // The reject matches what an unclaimed slug gets today: there is no\n // platform mailbox behind these addresses either.\n if (isReservedEmailSlug(slug)) {\n message.setReject(`${label}: \"${sanitize(slug, 64)}\" is a reserved platform address`);\n return;\n }\n\n // Look up project routing \u2014 same KV the HTTP dispatcher uses.\n const routingJson = await env.ROUTING.get(slug);\n if (!routingJson) {\n message.setReject(`${label}: no project found for slug \"${sanitize(slug, 64)}\"`);\n return;\n }\n\n let parsedRouting: unknown;\n try {\n parsedRouting = JSON.parse(routingJson);\n } catch {\n message.setReject(`${label}: routing data corrupt`);\n return;\n }\n // `JSON.parse` also succeeds on `null`, on a bare number and on a string,\n // none of which carry a suspension marker to read. Every producer of this\n // value writes a `JSON.stringify`d object, so there is no legitimate writer\n // of a non-object entry \u2014 treat one as corrupt rather than reaching for\n // `.suspended` on it. Reading it as \"not suspended\" would disable the\n // platform-wide gate for exactly the project whose entry got corrupted,\n // which is the same reason the outbound path fails closed on `corrupt`.\n if (typeof parsedRouting !== 'object' || parsedRouting === null) {\n message.setReject(`${label}: routing data corrupt`);\n return;\n }\n const routing = parsedRouting as RoutingEntry;\n\n // Platform-wide suspension \u2014 the marker `packages/dispatch` answers with a\n // 429. Checked BEFORE dispatch (and before the email-only kill-switch) so\n // a suspended tenant's code never runs on platform CPU, and so a project\n // suspended for abuse loses inbound and outbound mail at the same moment\n // it loses HTTP.\n if (routing.suspended) {\n // The marker is declared `string`, but it arrives from KV \u2014 a non-string\n // value would crash `sanitize`, which turns a suspended project into an\n // unhandled handler error instead of a clean refusal.\n const reason = typeof routing.suspended === 'string' ? routing.suspended : 'suspended';\n message.setReject(\n `${label}: project \"${sanitize(slug, 64)}\" is suspended (${sanitize(reason, 64)})`,\n );\n return;\n }\n\n const workerName = routing.workerName;\n if (!workerName) {\n // Static-only deploys (KV/R2 path) don't have a worker \u2014 nothing to\n // dispatch inbound mail to.\n message.setReject(`${label}: project \"${sanitize(slug, 64)}\" has no worker (static deploy)`);\n return;\n }\n // Declared `string`, but it arrives from KV like `suspended` does. Every\n // failure handler below renders the name through `sanitize`, which throws\n // on a non-string \u2014 a worker that cannot be reached would then surface as\n // an unhandled handler error instead of a reject. `buildRoutingJson` only\n // ever writes a string, so anything else is corrupt data, refused the same\n // way as a non-object blob.\n if (typeof workerName !== 'string') {\n message.setReject(`${label}: routing data corrupt`);\n return;\n }\n\n // `projectId` arrives from KV the same way. The email-only kill-switch\n // below is keyed `email-suspended:<projectId>`, and a template literal\n // coerces whatever is there \u2014 a number, an object, an empty string \u2014 into\n // a key that names no real project, so the lookup misses and a suspended\n // tenant keeps receiving mail. Every failure handler after dispatch also\n // renders the id through `sanitize`, which throws on a non-string. Every\n // writer of a worker routing has put a string id in the blob since the\n // first one (`buildRoutingJson` types it, and there is no static-deploy\n // reading for a missing id the way there is for a missing `workerName`),\n // so absent, empty or mistyped is corrupt data and is refused the same\n // way \u2014 the suspension state cannot be read, so the message must not run.\n if (typeof routing.projectId !== 'string' || routing.projectId === '') {\n message.setReject(`${label}: routing data corrupt`);\n return;\n }\n\n // Email-only suspend kill-switch \u2014 the narrower control, set by the admin\n // UI to stop mail without taking the whole project offline. Gates inbound\n // as well as outbound so a suspended project doesn't keep accepting +\n // dispatching mail (which costs CPU and storage on the user worker).\n // No cacheTtl: this is an abuse-response control; we eat the extra KV\n // get per inbound message so a suspend takes effect immediately\n // (subject only to KV's ~near-instant per-colo consistency).\n if (await env.ROUTING.get(`email-suspended:${routing.projectId}`)) {\n message.setReject(`${label}: project \"${sanitize(slug, 64)}\" inbound is suspended`);\n return;\n }\n\n let stub: EmailEntrypointStub;\n try {\n // Pass the project's dispatch limits, exactly as the HTTP router does in\n // `packages/dispatch`. Without them, anyone who can send mail to a\n // project's address runs that tenant's worker at the namespace default\n // instead of the CPU/sub-request ceiling the project is configured for.\n stub = (routing.limits\n ? env.DISPATCH.get(workerName, {}, { limits: routing.limits })\n : env.DISPATCH.get(workerName)) as unknown as EmailEntrypointStub;\n } catch (e) {\n console.error(`[email-router] DISPATCH.get(${sanitize(workerName, 320)}) failed:`, e);\n message.setReject(`${label}: project worker unavailable`);\n return;\n }\n\n // Note: we can't pre-check `typeof stub.email === 'function'` \u2014 RPC stub\n // proxies report 'function' for every property access. The actual\n // existence check happens at call time, where workerd throws\n // `TypeError: The RPC receiver does not implement the method \"...\"` if\n // the user worker doesn't expose it. We catch that below.\n\n // Early size guard \u2014 `rawSize` is set by CF before the body streams.\n // Reject before buffering so a flood of oversized messages can't OOM the\n // isolate. We still enforce the cap during streaming below in case\n // `rawSize` ever lies.\n if (typeof message.rawSize === 'number' && message.rawSize > MAX_INBOUND_BYTES) {\n message.setReject(`${label}: message too large (max ${MAX_INBOUND_BYTES} bytes)`);\n return;\n }\n\n // Serialize to an envelope. Headers go as a plain object (RPC-safe);\n // raw is pre-buffered to a Uint8Array so the user worker can re-read it\n // (parseEmail consumes the stream \u2014 buffering also lets us replay if\n // multiple downstream consumers need it).\n let envelope: EmailEnvelope;\n try {\n envelope = await buildEnvelope(message);\n } catch (e) {\n if (e instanceof InboundTooLargeError) {\n message.setReject(`${label}: message too large (max ${MAX_INBOUND_BYTES} bytes)`);\n return;\n }\n if (e instanceof InboundTooManyHeadersError) {\n message.setReject(`${label}: too many headers (max ${MAX_INBOUND_HEADERS})`);\n return;\n }\n console.error(`[email-router] failed to read message body for ${sanitize(slug, 64)}:`, e);\n message.setReject(`${label}: could not read inbound message body`);\n return;\n }\n\n // Build the outbound gate context BEFORE dispatch so every forward/reply\n // recorded by the user handler runs through the same per-project guards\n // as `/email/send` (HIGH H1). CF Email Routing destinations are\n // account-wide, so without a per-project allowlist any tenant could\n // weaponize inbound mail to fan out to addresses verified by another\n // project \u2014 nullifying the architectural premise that the platform's\n // per-project allowlist is the security boundary.\n let gate: OutboundGate;\n try {\n gate = await loadOutboundGate(env, routing.projectId);\n } catch (e) {\n console.error(\n `[email-router] failed to load outbound gate for ${sanitize(routing.projectId ?? '', 64)}:`,\n e,\n );\n // Closing the gate (no allowlist, exhausted quota) means forward/reply\n // actions get dropped with a logged error \u2014 the user message is still\n // accepted by CF (we don't reject), matching the documented behavior\n // that quota exhaustion never breaks message acceptance.\n gate = {\n projectId: routing.projectId,\n skipAllowlist: false,\n allowlist: new Set(),\n burstKey: '',\n burstLimit: 0,\n burstCurrent: 0,\n monthKey: '',\n monthLimit: 0,\n monthCurrent: 0,\n quotaExhausted: true,\n };\n }\n\n let actions: Array<EmailAction>;\n try {\n // This await materializes the tenant's WHOLE return value in this isolate\n // before any bound below can look at it. workerd deserializes an RPC\n // result eagerly, in one call, with no size hook; the only transport\n // bound is the callee-side 32 MiB cap on SERIALIZED bytes, and a dense\n // array turns 32 MiB of nulls into 128 MiB of caller heap, or of `{}`\n // into ~500 MiB (measured, workerd 1.20260701.1, pointer-compressed V8).\n // No proxy-side code can bound that; a contract change binds only\n // cooperative tenants. Accepted limit \u2014 design doc 0078, \"RPC result\n // materialization\", records the numbers and the architectural options.\n const result = await stub.email!(envelope);\n if (result === undefined || result === null) {\n actions = [];\n } else if (Array.isArray(result)) {\n actions = result;\n } else {\n // Handler authors who return e.g. `{ actions: [...] }` instead of\n // the bare array would otherwise see a silent no-op. Warn so the\n // mistake is debuggable.\n console.warn(\n `[email-router] ${sanitize(workerName, 320)} email handler returned non-array; treating as no-op`,\n );\n actions = [];\n }\n } catch (e) {\n // The thrown value is the tenant's: a handler can throw an Error with any\n // message, or any value that crosses RPC. Only a bounded prefix is\n // inspected \u2014 workerd's own \"does not implement\" text is well under 320\n // characters \u2014 because `receiver does not.*method` backtracks\n // quadratically on a long message (measured: 1 MB = 21 s of CPU), and a\n // non-Error throw is described by kind, never coerced whole.\n const msg = e instanceof Error ? e.message.slice(0, 320) : describeUntrusted(e, 320);\n if (RPC_METHOD_MISSING.test(msg)) {\n console.error(\n `[email-router] ${sanitize(workerName, 320)} has no .email() (needs redeploy):`,\n sanitize(msg, 320),\n );\n message.setReject(`${label}: project has no email handler`);\n // We log the dispatch attempt asynchronously even on rejects.\n ctx.waitUntil(\n logRecv(env, routing.projectId, message, [{ type: 'reject', reason: 'no-handler' }]),\n );\n return;\n }\n console.error(`[email-router] dispatch to ${sanitize(workerName, 320)} failed:`, msg);\n message.setReject(`${label}: project handler error`);\n ctx.waitUntil(\n logRecv(env, routing.projectId, message, [{ type: 'reject', reason: 'dispatch-error' }]),\n );\n return;\n }\n\n await enactActions(env, message, actions, gate, {\n slug,\n domain: receivedDomain,\n projectId: routing.projectId,\n kv: env.ROUTING,\n registeredDomains: new Map(),\n });\n\n // Async log to the metering pipeline. Best-effort. Logged after every\n // dispatch \u2014 including reject-only outcomes \u2014 so operators have a\n // complete audit trail.\n ctx.waitUntil(logRecv(env, routing.projectId, message, actions));\n}\n\n/**\n * The outcome the `/email/relay` HTTP handler maps onto its response. The\n * relay worker answers any non-2xx with `message.setReject`, so every\n * refusal below \u2014 unrouteable project, suspension, dispatch failure,\n * handler reject \u2014 collapses to this one bit; the specific reason stays in\n * proxy logs and never crosses back to the MTA.\n */\nexport interface RelayRouteOutcome {\n reject: boolean;\n}\n\n/**\n * The relay lane of inbound routing (design doc 0078, \"Custom domains on\n * Cloudflare\"). The message arrived via POST /email/relay from the relay\n * worker in the CUSTOMER's account \u2014 the index.ts auth branch has already\n * proved the relay secret against the domain's mirror and resolved the\n * project \u2014 so this is the second half of `routeInbound`: the same\n * suspension gates, dispatch limits, envelope dispatch, action enaction and\n * delivery log, but keyed by the mirror's project instead of a slug parsed\n * from the recipient, and enacted on a synthetic message instead of a real\n * `ForwardableEmailMessage`.\n *\n * The framework dispatcher runs in no-prefix mode for the relayed envelope\n * (the recipient carries no `<slug>+` prefix; see `viaDomain` on the\n * envelope).\n */\nexport async function routeRelayed(\n env: Env,\n ctx: ExecutionContext,\n input: { projectId: string; domain: string; envelope: EmailEnvelope },\n): Promise<RelayRouteOutcome> {\n const { projectId, domain, envelope } = input;\n\n // The platform lane resolves routing by the slug parsed from the\n // recipient; a relayed recipient carries no slug, so resolve the\n // project's slug via the `email-slug:<projectId>` mirror the api writes\n // on project create, then read the same routing blob by slug.\n const slug = await env.ROUTING.get(`email-slug:${projectId}`);\n if (!slug) {\n console.error(`[email-relay] no slug mirror for project ${sanitize(projectId, 64)}`);\n return { reject: true };\n }\n const routingJson = await env.ROUTING.get(slug);\n if (!routingJson) {\n console.error(\n `[email-relay] no routing entry for slug ${sanitize(slug, 64)} (project ${sanitize(projectId, 64)})`,\n );\n return { reject: true };\n }\n let parsedRouting: unknown;\n try {\n parsedRouting = JSON.parse(routingJson);\n } catch {\n console.error(`[email-relay] routing data corrupt for slug ${sanitize(slug, 64)}`);\n return { reject: true };\n }\n // Same corrupt-data rule as the platform lane: every writer of this blob\n // emits a `JSON.stringify`d object, so a non-object parse has no\n // legitimate writer.\n if (typeof parsedRouting !== 'object' || parsedRouting === null) {\n console.error(`[email-relay] routing data corrupt for slug ${sanitize(slug, 64)}`);\n return { reject: true };\n }\n const routing = parsedRouting as RoutingEntry;\n\n // The mirror's projectId is the authenticated identity (the relay secret\n // proved it); the routing blob's is data. A disagreement is corrupt data\n // \u2014 fail closed rather than dispatch one project's mail into another's\n // worker.\n if (routing.projectId !== projectId) {\n console.error(\n `[email-relay] routing blob names another project for slug ${sanitize(slug, 64)}`,\n );\n return { reject: true };\n }\n\n // Platform-wide suspension, then the email-only kill-switch \u2014 the same\n // gates as the platform lane, so a suspended project loses relayed\n // inbound at the same moment it loses everything else.\n if (routing.suspended) {\n console.error(`[email-relay] project ${sanitize(projectId, 64)} is suspended`);\n return { reject: true };\n }\n const workerName = routing.workerName;\n if (!workerName || typeof workerName !== 'string') {\n // Static-only deploys have no worker to dispatch to; a truthy\n // non-string is KV-corrupt data. Same refusal either way.\n console.error(`[email-relay] project ${sanitize(projectId, 64)} has no worker (static deploy)`);\n return { reject: true };\n }\n // No cacheTtl, as on the platform lane: an abuse-response control where\n // convergence latency is the whole point.\n if (await env.ROUTING.get(`email-suspended:${projectId}`)) {\n console.error(`[email-relay] project ${sanitize(projectId, 64)} inbound is suspended`);\n return { reject: true };\n }\n\n let stub: EmailEntrypointStub;\n try {\n // Same per-project dispatch limits pass-through as the platform lane.\n stub = (routing.limits\n ? env.DISPATCH.get(workerName, {}, { limits: routing.limits })\n : env.DISPATCH.get(workerName)) as unknown as EmailEntrypointStub;\n } catch (e) {\n console.error(`[email-relay] DISPATCH.get(${sanitize(workerName, 320)}) failed:`, e);\n return { reject: true };\n }\n\n // Built before dispatch so the dispatch-failure paths can log the\n // delivery against it, exactly as `routeInbound` logs against the real\n // message. The domain + authenticated project id key its REST send path\n // (the customer account's send_raw with the domain's leased credential).\n const relayed = createRelayedMessage(env, envelope, { domain, projectId });\n\n // Unlike the platform lane, the recipient allowlist does not gate these\n // actions (design doc 0078, \"What changes in the existing rules\"): the\n // send leaves through the customer's own account, credential, DKIM and\n // quota \u2014 the reputation at stake is theirs. The burst cap and the kill\n // switch still apply.\n let gate: OutboundGate;\n try {\n gate = await loadOutboundGate(env, projectId, { skipAllowlist: true });\n } catch (e) {\n console.error(`[email-relay] failed to load outbound gate for ${sanitize(projectId, 64)}:`, e);\n gate = {\n projectId,\n skipAllowlist: true,\n allowlist: new Set(),\n burstKey: '',\n burstLimit: 0,\n burstCurrent: 0,\n monthKey: '',\n monthLimit: 0,\n monthCurrent: 0,\n quotaExhausted: true,\n };\n }\n\n let actions: Array<EmailAction>;\n try {\n // The RPC materialization note on the platform lane's dispatch applies\n // unchanged here.\n const result = await stub.email!(envelope);\n if (result === undefined || result === null) {\n actions = [];\n } else if (Array.isArray(result)) {\n actions = result;\n } else {\n console.warn(\n `[email-relay] ${sanitize(workerName, 320)} email handler returned non-array; treating as no-op`,\n );\n actions = [];\n }\n } catch (e) {\n // Same bounded classification as the platform lane.\n const msg = e instanceof Error ? e.message.slice(0, 320) : describeUntrusted(e, 320);\n if (RPC_METHOD_MISSING.test(msg)) {\n console.error(\n `[email-relay] ${sanitize(workerName, 320)} has no .email() (needs redeploy):`,\n sanitize(msg, 320),\n );\n ctx.waitUntil(\n logRecv(env, projectId, relayed.message, [{ type: 'reject', reason: 'no-handler' }]),\n );\n return { reject: true };\n }\n console.error(`[email-relay] dispatch to ${sanitize(workerName, 320)} failed:`, msg);\n ctx.waitUntil(\n logRecv(env, projectId, relayed.message, [{ type: 'reject', reason: 'dispatch-error' }]),\n );\n return { reject: true };\n }\n\n await enactActions(env, relayed.message, actions, gate, {\n slug: slug.toLowerCase(),\n domain,\n projectId,\n kv: env.ROUTING,\n registeredDomains: new Map(),\n });\n\n // Same audit trail as the platform lane \u2014 including reject-only outcomes.\n ctx.waitUntil(logRecv(env, projectId, relayed.message, actions));\n return { reject: relayed.rejectedReason() !== null };\n}\n\n/**\n * A `ForwardableEmailMessage` stand-in for a relayed message. The relay\n * lane holds no CF email event \u2014 the message arrived over HTTP \u2014 so the\n * methods enact differently than on the platform lane:\n *\n * - `setReject` is recorded; the `/email/relay` handler answers non-2xx\n * and the relay worker rejects at the SMTP layer with a generic reason.\n * - `forward` sends the original MIME bytes, and `__voidRelayReply` (called\n * by `enactSanitized` in place of a native `message.reply`) sends the\n * recorded reply bytes \u2014 both through the CUSTOMER's Cloudflare account\n * as REST `send_raw` bearing the domain's leased credential (design doc\n * 0078, \"Inbound identity\": the reply leaves from the customer-domain\n * address that received the message, over the REST path). The platform's\n * own `send_email` binding cannot carry either: Email Service rejects a\n * sender outside the sending account's verified zones, which a\n * customer-domain reply \u2014 and a forward from the original external\n * sender \u2014 both are under the PLATFORM's account, so they failed there\n * after `/email/relay` had already answered 2xx. The same verified-zone\n * rule bars that external sender under the CUSTOMER account too, so a\n * forward's send_raw `from` is the envelope recipient (the registered-\n * domain address that received the mail); the MIME goes byte-identical\n * and the real `From:` header is what the destination sees and replies\n * to. A forward's header overrides cannot be merged into the raw MIME\n * here and are dropped.\n * Every action has already passed `enactActions`' per-project gates.\n */\nfunction createRelayedMessage(\n env: Env,\n envelope: EmailEnvelope,\n relay: { domain: string; projectId: string },\n): { message: ForwardableEmailMessage; rejectedReason: () => string | null } {\n let reason: string | null = null;\n\n // One REST send for both action kinds. Throws on any failure \u2014 the enact\n // loop's per-action try/catch logs it and the message stays accepted,\n // exactly as a failed native forward/reply does on the platform lane.\n async function sendRaw(from: string, to: string, raw: Uint8Array): Promise<void> {\n // The send goes through the account that owns the FROM domain: a\n // forward's substituted MAIL FROM is the envelope recipient (on the\n // receiving domain), but a reply's from may sit on ANY active domain\n // registered to the project (isPermittedReplySender) \u2014 and two domains\n // of one project can live in different customer accounts. Email\n // Service rejects a sender outside the sending account's verified\n // zones, so keying the mirror + lease off the receiving domain would\n // submit a cross-account reply under the wrong credential and have CF\n // reject it.\n const senderDomain = from.slice(from.indexOf('@') + 1).toLowerCase();\n // Re-read the mirror at send time (uncached, like the relay auth\n // branch): the account id comes from it, and a row revoked or\n // re-registered to another project between the auth and this send must\n // not push mail into the account the mirror named then.\n const mirror = await readEmailDomainMirror(env.ROUTING, senderDomain);\n if (!mirror || mirror.projectId !== relay.projectId || mirror.status !== 'active') {\n throw new Error('email domain registration is no longer active');\n }\n if (!mirror.accountId) {\n throw new Error('email domain registration is incomplete');\n }\n const lease = await leaseEmailDomainCredential(env, senderDomain);\n if (!lease) {\n throw new Error('could not lease the domain credential');\n }\n // send_raw carries the MIME as a JSON string. Decode FATALLY, as the\n // outbound fork does: relayed mail is remote-sender bytes, and a lenient\n // decode would silently alter a non-UTF-8 body.\n const mimeMessage = new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(raw);\n let res: Response;\n try {\n res = await fetch(\n `https://api.cloudflare.com/client/v4/accounts/${mirror.accountId}/email/sending/send_raw`,\n {\n method: 'POST',\n headers: {\n authorization: `Bearer ${leaseBearer(lease)}`,\n 'content-type': 'application/json',\n },\n body: JSON.stringify({ from, recipients: [to], mime_message: mimeMessage }),\n },\n );\n } catch {\n throw new Error('email sending request failed');\n }\n // A refused credential evicts the cached lease so the next action\n // re-leases. CF's error body is never echoed or logged \u2014 it is not ours\n // to surface.\n if (res.status === 401 || res.status === 403) {\n dropEmailDomainLease(senderDomain);\n }\n if (!res.ok) {\n throw new Error(`email sending API returned ${res.status}`);\n }\n let data: unknown = null;\n try {\n data = await res.json();\n } catch {\n data = null;\n }\n const success =\n typeof data === 'object' && data !== null && (data as { success?: unknown }).success === true;\n if (!success) {\n throw new Error('email sending API refused the message');\n }\n // success:true with the one recipient on a failure list is NOT sent \u2014\n // the same per-recipient read the outbound fork makes.\n const result = (data as { result?: SendRawResult | null }).result;\n const target = to.toLowerCase();\n if (readSendRawAddressList(result?.permanent_bounces).has(target)) {\n throw new Error('recipient permanently bounced');\n }\n if (readSendRawAddressList(result?.suppressed_recipients).has(target)) {\n throw new Error('recipient is on the suppression list');\n }\n }\n\n const message = {\n from: envelope.from,\n to: envelope.to,\n rawSize: envelope.rawSize,\n headers: new Headers(envelope.headers),\n raw: envelopeRawStream(envelope.raw),\n setReject(r: string) {\n reason = r;\n },\n async forward(to: string, _headers?: Headers) {\n // send_raw rejects a MAIL FROM outside the account's verified\n // zones, which the original external sender is \u2014 submit the\n // envelope recipient (the registered-domain address that received\n // the mail). The MIME bytes are untouched, so the real From:\n // header is what the destination sees and replies to.\n await sendRaw(envelope.to, to, envelope.raw);\n },\n // The reply channel `enactSanitized` prefers when present. A native\n // reply needs both the CF email event this lane never had and a genuine\n // EmailMessage \u2014 whose class exposes no body accessor, so the recorded\n // reply bytes could not cross it anyway; they arrive on the action.\n async __voidRelayReply(from: string, to: string, raw: Uint8Array) {\n await sendRaw(from, to, raw);\n },\n };\n return {\n message: message as unknown as ForwardableEmailMessage,\n rejectedReason: () => reason,\n };\n}\n\nfunction envelopeRawStream(bytes: Uint8Array): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(bytes);\n controller.close();\n },\n });\n}\n\n/**\n * Read the per-project allowlist + burst/monthly counters once, up-front,\n * so `enactActions` can apply the same gates `/email/send` uses without\n * reissuing KV reads inside the loop. The counter values mutate as\n * actions enact; we write the totals back at the end via\n * `commitGateCounters`. `skipAllowlist` (relay lane) skips the allowlist\n * read entirely \u2014 custom-domain sends are not allowlist-gated.\n */\nasync function loadOutboundGate(\n env: Env,\n projectId: string | undefined,\n opts?: { skipAllowlist?: boolean },\n): Promise<OutboundGate> {\n const skipAllowlist = opts?.skipAllowlist ?? false;\n if (!projectId) {\n // No projectId on the routing entry \u2192 can't authorize anything.\n return {\n projectId: undefined,\n skipAllowlist,\n allowlist: new Set(),\n burstKey: '',\n burstLimit: 0,\n burstCurrent: 0,\n monthKey: '',\n monthLimit: 0,\n monthCurrent: 0,\n quotaExhausted: true,\n };\n }\n const allowlist = skipAllowlist ? new Set<string>() : await readAllowlist(env.ROUTING, projectId);\n const now = new Date();\n const burstKey = `email-burst:${projectId}:${minuteBucket(now)}`;\n const monthKey = `email-sent:${projectId}:${monthBucket(now)}`;\n const [burstLimit, monthLimit, burstRaw, monthRaw] = await Promise.all([\n getBurstLimit(env.ROUTING, projectId),\n getMonthlyLimit(env.ROUTING, projectId),\n env.ROUTING.get(burstKey),\n env.ROUTING.get(monthKey),\n ]);\n return {\n projectId,\n skipAllowlist,\n allowlist,\n burstKey,\n burstLimit,\n burstCurrent: readCounter(burstRaw),\n monthKey,\n monthLimit,\n monthCurrent: readCounter(monthRaw),\n quotaExhausted: false,\n };\n}\n\n/**\n * Persist the post-mutation counters back to KV. Wrapped in per-key\n * try/catch \u2014 a failed put logs and continues; the design accepts\n * overshoot when KV is flaky (mirrors `/email/send`).\n */\nasync function commitGateCounters(env: Env, gate: OutboundGate): Promise<void> {\n if (!gate.projectId) {\n return;\n }\n const now = new Date();\n await Promise.all([\n env.ROUTING.put(gate.monthKey, String(gate.monthCurrent), {\n expirationTtl: monthTtlSeconds(now),\n }).catch((e) => {\n console.error(\n `[email-router] monthly counter put failed for ${sanitize(gate.projectId ?? '', 64)}:`,\n e,\n );\n }),\n env.ROUTING.put(gate.burstKey, String(gate.burstCurrent), {\n expirationTtl: 5 * 60,\n }).catch((e) => {\n console.error(\n `[email-router] burst counter put failed for ${sanitize(gate.projectId ?? '', 64)}:`,\n e,\n );\n }),\n ]);\n}\n\nasync function logRecv(\n env: Env,\n projectId: string | undefined,\n message: ForwardableEmailMessage,\n actions: Array<EmailAction>,\n): Promise<void> {\n if (!projectId) {\n console.error(\n `[email-router] cannot log inbound delivery: routing entry has no projectId (to=${sanitize(String(message.to ?? ''), 320)})`,\n );\n return;\n }\n // Guard the RAW list the same way `validateActions` does. A user worker can\n // return anything, this runs OUTSIDE the try below, and it is scheduled on\n // `ctx.waitUntil` \u2014 so a null entry used to escape as an unhandled rejection\n // and silently cost the delivery its recv counter and its audit line.\n const status = actions.some((a) => a && typeof a === 'object' && a.type === 'reject')\n ? 'rejected'\n : actions.length === 0\n ? 'accepted'\n : 'handled';\n try {\n await recordInboundDelivery(env, projectId, {\n from: String(message.from ?? ''),\n to: String(message.to ?? ''),\n // sanitize() in email.ts handles control-char stripping before logging;\n // don't pre-truncate here so the full subject is available if logging\n // ever moves to structured storage.\n subject: message.headers.get('Subject') ?? '',\n byteSize: message.rawSize ?? 0,\n status,\n });\n } catch (e) {\n console.error('[email-router] log-recv failed:', e);\n }\n}\n\nasync function buildEnvelope(message: ForwardableEmailMessage): Promise<EmailEnvelope> {\n // Header COUNT first, before the body is buffered and before any property\n // is defined: the bag is walked once, stops at the cap, and the collected\n // pairs feed `fromEntries` below. See `MAX_INBOUND_HEADERS`.\n const entries: Array<[string, string]> = [];\n for (const entry of message.headers) {\n if (entries.length >= MAX_INBOUND_HEADERS) {\n throw new InboundTooManyHeadersError();\n }\n entries.push(entry);\n }\n const raw = await readStreamToBytes(message.raw);\n // `Object.fromEntries`, NOT `Object.create(null)`: workerd's RPC\n // serializer refuses any object whose prototype is not `Object.prototype`\n // (\"Could not serialize object of type \\\"Object\\\"\"), so a null-prototype\n // bag made every `stub.email(envelope)` throw. `fromEntries` defines each\n // key as an OWN data property (`CreateDataProperty`), so a remote header\n // named `__proto__` becomes a plain key on both sides of the RPC and never\n // touches the prototype chain \u2014 verified over a real workerd RPC hop.\n const headers: Record<string, string> = Object.fromEntries(entries);\n return {\n from: String(message.from ?? ''),\n to: String(message.to ?? ''),\n headers,\n raw,\n rawSize: message.rawSize ?? raw.byteLength,\n };\n}\n\nasync function readStreamToBytes(stream: ReadableStream<Uint8Array>): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Array<Uint8Array> = [];\n let total = 0;\n for (;;) {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n total += value.byteLength;\n if (total > MAX_INBOUND_BYTES) {\n // Cancel the stream so CF stops sending; throw a typed error the\n // caller can recognize and turn into a clean SMTP reject.\n try {\n await reader.cancel();\n } catch {\n // Cancellation is best-effort.\n }\n throw new InboundTooLargeError(total);\n }\n chunks.push(value);\n }\n const out = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n out.set(c, offset);\n offset += c.byteLength;\n }\n return out;\n}\n\n/**\n * Sanitized + validated action ready for enaction.\n *\n * `forward` / `reply` carry pre-constructed `Headers` objects so the\n * enaction loop can't throw on header construction after another\n * forward/reply already fired. See `validateActions` below for why\n * validation is split from enaction (HIGH H2).\n */\ntype SanitizedAction =\n | { type: 'reject'; reason: string }\n | { type: 'forward'; to: string; headers?: Headers }\n | { type: 'reply'; from: string; to: string; raw: Uint8Array };\n\n/**\n * Two-phase action enaction.\n *\n * **Phase A \u2014 validation (this fn).** Walk the action array, validate\n * each action shape end-to-end, including header construction (via\n * `new Headers(...)`, which throws on CRLF / NUL / unsafe chars).\n * Build a sanitized list. Drop INVALID actions, but if header\n * construction throws on any forward/reply we DROP THE ENTIRE LIST\n * (return `null`) \u2014 the message is still accepted by CF, but no\n * side effects fire. Rationale: header validation throwing implies\n * the user handler tried to inject SMTP headers; partially enacting\n * the rest of the list (e.g. firing a reply) is a worse failure mode\n * than dropping it all and logging.\n *\n * **Phase B \u2014 enaction (`enactSanitized`).** Walks the validated list,\n * performs side effects. Each forward/reply still has its own\n * runtime try/catch for transient CF errors, but no sync throws\n * happen between sanitized actions, so an early forward/reply\n * succeeding can't leak side effects on a downstream throw.\n *\n * Stops walking at the first `reject` (terminal in CF's runtime).\n */\nasync function validateActions(\n actions: Array<EmailAction>,\n replySender: ReplySenderPin,\n): Promise<Array<SanitizedAction> | null> {\n // Before the loop allocates anything. `out` is not even built yet: the\n // per-entry work below (address regex, `new Headers()`, `sanitize()` on\n // every drop log) is what an over-long list is buying, and it is bought in\n // the shared proxy isolate ahead of any quota gate.\n if (actions.length > MAX_ACTIONS) {\n console.error(\n `[email-router] action list dropped: ${actions.length} actions returned (max ${MAX_ACTIONS})`,\n );\n return null;\n }\n const out: Array<SanitizedAction> = [];\n // Bytes of the replies accepted so far, against `MAX_REPLY_BYTES_TOTAL`.\n let replyBytesUsed = 0;\n for (const action of actions) {\n if (!action || typeof action !== 'object') {\n // Never `String(action)` here: a string is bounded by `sanitize`, but a\n // BigInt's decimal conversion is not \u2014 see `describeUntrusted`.\n console.error(`[email-router] dropping non-object action: ${describeUntrusted(action, 320)}`);\n continue;\n }\n if (action.type === 'reject') {\n // CRLF / control chars in the reason would inject into the SMTP DSN\n // we hand back to the remote MTA. `sanitize` truncates, then strips,\n // so a multi-megabyte control-heavy reason never gets a full pass.\n const raw = typeof action.reason === 'string' ? action.reason : '';\n const reason =\n raw.length > 0 ? sanitize(raw, MAX_REJECT_REASON_LENGTH) : 'rejected by handler';\n out.push({ type: 'reject', reason });\n // Reject is terminal \u2014 stop validating subsequent actions so they\n // don't appear in tail logs as if they could have fired.\n return out;\n }\n if (action.type === 'forward') {\n if (!isValidEmailAddress(action.to)) {\n console.error(\n `[email-router] forward dropped: invalid \"to\" address ${logAddress(action.to)}`,\n );\n continue;\n }\n let headers: Headers | undefined;\n if (action.headers) {\n if (!forwardHeadersWithinBounds(action.headers)) {\n return null;\n }\n try {\n headers = new Headers(action.headers);\n } catch (e) {\n // Header construction throws on CRLF / NUL / unsafe chars. We\n // can't safely partial-enact: a forward earlier in the list\n // may already have fired by the time we reach the bad headers\n // (under the old single-pass impl). Pre-validate the entire\n // list and drop everything if any header construction throws.\n console.error(\n `[email-router] action list dropped: forward headers invalid:`,\n e instanceof Error ? sanitize(e.message, 320) : sanitize(String(e), 320),\n );\n return null;\n }\n }\n out.push({ type: 'forward', to: action.to, headers });\n } else if (action.type === 'reply') {\n if (!isValidEmailAddress(action.from) || !isValidEmailAddress(action.to)) {\n console.error(\n `[email-router] reply dropped: invalid address (from=${logAddress(action.from)} to=${logAddress(action.to)})`,\n );\n continue;\n }\n // Sender pin (F1). The recipient is gated later by\n // `checkOutboundGate`; this gates who we are allowed to BE. Dropped\n // here rather than at enaction so an impersonating reply never\n // reaches the quota counters.\n if (!(await isPermittedReplySender(action.from, replySender))) {\n console.error(\n `[email-router] reply dropped: sender not owned by project \"${sanitize(replySender.slug, 64)}\" (from=${logAddress(action.from)})`,\n );\n continue;\n }\n // The envelope is pinned; now pin what the recipient will SEE. The\n // bytes are the tenant's, and `new EmailMessage(from, to, raw)` never\n // compares them with `from`, so a `From:` header naming a sibling\n // project would pass the sender pin above. Same check, same reason,\n // as `/email/send` in `email.ts`; `replyEmail()` always renders the\n // header from the address it records, so only a hand-built reply\n // can fail here.\n if (!(action.raw instanceof Uint8Array)) {\n console.error(\n `[email-router] reply dropped: raw is not a Uint8Array (from=${logAddress(action.from)})`,\n );\n continue;\n }\n // Size before the scan below, which is linear in `raw`. Both bounds\n // mirror the framework's `reply()`; see the constants for why the\n // proxy re-checks them and why an overrun drops only this reply.\n const replyBytes = action.raw.byteLength;\n if (replyBytes > MAX_REPLY_BYTES) {\n console.error(\n `[email-router] reply dropped: raw is ${replyBytes} bytes (max ${MAX_REPLY_BYTES}) (from=${logAddress(action.from)})`,\n );\n continue;\n }\n if (replyBytesUsed + replyBytes > MAX_REPLY_BYTES_TOTAL) {\n console.error(\n `[email-router] reply dropped: cumulative reply bytes ${replyBytesUsed + replyBytes} exceed this delivery's budget of ${MAX_REPLY_BYTES_TOTAL} (from=${logAddress(action.from)})`,\n );\n continue;\n }\n const mimeFrom = readMimeFromAddrSpec(action.raw);\n if (!mimeFrom.ok || mimeFrom.addrSpec.toLowerCase() !== action.from.toLowerCase()) {\n console.error(\n `[email-router] reply dropped: MIME From is not the envelope sender (from=${logAddress(action.from)}, ${mimeFrom.ok ? 'header names another address' : mimeFrom.reason})`,\n );\n continue;\n }\n replyBytesUsed += replyBytes;\n out.push({ type: 'reply', from: action.from, to: action.to, raw: action.raw });\n } else {\n // Unknown action type \u2014 log so handler authors notice rather than\n // silently doing nothing. The `type` is whatever the tenant put there;\n // `describeUntrusted` renders a string within 320 chars and a typed\n // array, Array, or BigInt by kind, never by contents.\n console.warn(\n `[email-router] dropping unknown action type: ${describeUntrusted((action as { type?: unknown }).type, 320)}`,\n );\n }\n }\n return out;\n}\n\n/**\n * Enact each sanitized action on the real ForwardableEmailMessage.\n *\n * Contract for forward/reply (HIGH H1 \u2014 per-project gating):\n * Every forward/reply MUST go through the same per-project guards as\n * `/email/send`:\n * - `gate.allowlist` \u2014 recipient lowercased must be in the project's\n * verified-destinations allowlist.\n * - Burst counter: `gate.burstCurrent + 1 > gate.burstLimit` blocks.\n * - Monthly counter: `gate.monthCurrent + 1 > gate.monthLimit` blocks.\n *\n * CF Email Routing destinations are account-wide. Without these gates,\n * inbound mail becomes a fan-out primitive against any tenant's verified\n * addresses (not just the receiving project's). The platform's\n * per-project allowlist is the security boundary; CF's account-wide\n * verified flag is NOT a substitute. See lessons.md\n * \"Per-project consent on shared third-party verification flags\".\n *\n * Those gates cover the RECIPIENT. The `reply` SENDER is pinned one phase\n * earlier, in `validateActions` via `isPermittedReplySender`, so a reply\n * impersonating another tenant (or the platform's reserved `noreply`) is\n * dropped before it can reach these counters.\n *\n * Suspend kill-switch is enforced upstream (in `routeInbound` before\n * dispatch); a suspended project's inbound mail never reaches this fn,\n * so the suspend check happens once and not per-action.\n *\n * Quota exhaustion DOES NOT change message acceptance. The inbound\n * message stays accepted by CF; we just stop firing further forward/reply\n * actions and log. Hard rejecting on quota would silently drop legitimate\n * inbound mail under a noisy outbound-action handler \u2014 worse than letting\n * the action drop on the floor with a logged warning.\n */\nasync function enactActions(\n env: Env,\n message: ForwardableEmailMessage,\n actions: Array<EmailAction>,\n gate: OutboundGate,\n replySender: ReplySenderPin,\n): Promise<void> {\n const sanitized = await validateActions(actions, replySender);\n if (sanitized === null) {\n // Header construction failed mid-validation \u2014 drop the whole list\n // (already logged in validateActions). Don't even attempt to commit\n // counters since no side effects fired.\n return;\n }\n await enactSanitized(env, message, sanitized, gate);\n}\n\nasync function enactSanitized(\n env: Env,\n message: ForwardableEmailMessage,\n actions: Array<SanitizedAction>,\n gate: OutboundGate,\n): Promise<void> {\n let counterDirty = false;\n for (const action of actions) {\n if (action.type === 'reject') {\n message.setReject(action.reason);\n // Reject is terminal \u2014 flush any counters we already incremented\n // before exiting so the burst window reflects forward/reply work\n // that already fired ahead of the reject.\n if (counterDirty) {\n await commitGateCounters(env, gate);\n }\n return;\n }\n if (action.type === 'forward') {\n if (!checkOutboundGate(gate, action.to, 'forward')) {\n continue;\n }\n try {\n await message.forward(action.to, action.headers);\n gate.burstCurrent += 1;\n gate.monthCurrent += 1;\n counterDirty = true;\n } catch (e) {\n console.error(\n `[email-router] forward to ${sanitize(action.to, 320)} failed:`,\n e instanceof Error ? sanitize(e.message, 320) : sanitize(String(e), 320),\n );\n }\n } else if (action.type === 'reply') {\n if (!checkOutboundGate(gate, action.to, 'reply')) {\n continue;\n }\n try {\n // The relay lane's stand-in holds no CF email event, so a reply is\n // a fresh REST send of the recorded bytes through the customer\n // account (send_raw with the domain's leased credential \u2014 design\n // doc 0078, \"Inbound identity\"), not a native reply on a real\n // message. The stand-in advertises that channel as\n // `__voidRelayReply`; a native EmailMessage could not carry the\n // bytes anyway (no public body accessor).\n const relayReply = (\n message as unknown as {\n __voidRelayReply?: (from: string, to: string, raw: Uint8Array) => Promise<void>;\n }\n ).__voidRelayReply;\n if (relayReply !== undefined) {\n await relayReply(action.from, action.to, action.raw);\n } else {\n // EmailMessage's `raw` parameter is `string | ReadableStream`;\n // wrap the action's bytes as a one-shot stream rather than\n // decoding to UTF-8 (which would corrupt non-text MIME parts).\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(action.raw);\n controller.close();\n },\n });\n const reply = new EmailMessage(action.from, action.to, stream);\n await message.reply(reply as never);\n }\n gate.burstCurrent += 1;\n gate.monthCurrent += 1;\n counterDirty = true;\n } catch (e) {\n console.error(\n `[email-router] reply ${sanitize(action.from, 320)}->${sanitize(action.to, 320)} failed:`,\n e instanceof Error ? sanitize(e.message, 320) : sanitize(String(e), 320),\n );\n }\n }\n }\n if (counterDirty) {\n await commitGateCounters(env, gate);\n }\n}\n\n/**\n * Allowlist + quota check for a single forward/reply target. Mutates\n * `gate.quotaExhausted` once a quota is hit so we don't keep\n * re-evaluating cap math for the rest of the action list.\n *\n * Returns `false` (and logs) when the action should be dropped.\n */\nfunction checkOutboundGate(gate: OutboundGate, target: string, kind: 'forward' | 'reply'): boolean {\n if (gate.quotaExhausted) {\n console.error(\n `[email-router] ${kind} dropped: project quota exhausted (target=${sanitize(target, 320)})`,\n );\n return false;\n }\n if (!gate.projectId) {\n // No projectId on routing \u2192 no per-project guard available. Refuse\n // rather than fall back to \"trust CF's account-wide flag\", which is\n // exactly the security boundary HIGH H1 closes.\n console.error(\n `[email-router] ${kind} dropped: no projectId on routing entry (target=${sanitize(target, 320)})`,\n );\n return false;\n }\n const lowered = target.toLowerCase();\n if (!gate.skipAllowlist && !gate.allowlist.has(lowered)) {\n console.error(\n `[email-router] ${kind} dropped: recipient not in project allowlist (target=${sanitize(target, 320)})`,\n );\n return false;\n }\n if (gate.burstCurrent + 1 > gate.burstLimit) {\n console.error(`[email-router] ${kind} dropped: burst limit ${gate.burstLimit}/min exceeded`);\n gate.quotaExhausted = true;\n return false;\n }\n if (gate.monthCurrent + 1 > gate.monthLimit) {\n console.error(`[email-router] ${kind} dropped: monthly limit ${gate.monthLimit} exceeded`);\n gate.quotaExhausted = true;\n return false;\n }\n return true;\n}\n", "/**\n * Slugs that are EMAIL identities on the platform mail domain.\n *\n * A project's outbound `from` is `<slug>[+tag]@<EMAIL_SENDER_DOMAIN>` and\n * inbound mail to `<slug>[+tag]@` is dispatched into its worker, so owning a\n * slug owns that mailbox. `noreply` is the platform's own verification\n * sender (the proxy's `/email/internal/send` allow-list is exactly\n * `noreply@<domain>`), and `postmaster` / `abuse` / `bounce` / `security`\n * are the addresses recipients and mail providers treat as authoritative for\n * the whole domain. A project holding one of these could send mail that is\n * indistinguishable from ours, and would receive the bounces and replies to\n * it.\n *\n * `RESERVED_SLUGS` (`routes/projects.ts`) folds this set in, so no NEW\n * project can claim one. These five were reserved only when email shipped,\n * though, and the create-time check cannot reach a project registered\n * before that \u2014 so every consumer on the email path also refuses the slug\n * outright: the hourly `email-slug:` backfill writes no mirror for it (and\n * removes one written earlier), the proxy refuses `/email/send` for it, and\n * the inbound router rejects mail addressed to it. Kept in its own module\n * so the proxy (`@voidcloud/api/reserved-slugs`) shares one list with the\n * api rather than carrying a copy that can drift.\n *\n * The rest of `RESERVED_SLUGS` (`www`, `api`, `mail`, `smtp`, \u2026) is NOT\n * here: that set has been reserved since the platform's first commit, so\n * no project can hold one of those, and a hostname collision is not a\n * mailbox.\n */\nexport const EMAIL_RESERVED_SLUGS: ReadonlySet<string> = new Set([\n 'abuse',\n 'bounce',\n 'noreply',\n 'postmaster',\n 'security',\n]);\n\n/**\n * True when `slug` may not send or receive mail on the platform domain.\n * Callers pass a slug that is already lowercase: the api validates the\n * shape at create time, the proxy's `SLUG_RE` re-validates the KV mirror,\n * and the inbound router lowercases the recipient before splitting it.\n */\nexport function isReservedEmailSlug(slug: string): boolean {\n return EMAIL_RESERVED_SLUGS.has(slug);\n}\n", "/**\n * Credential lease client for custom sender domains (design doc 0078,\n * \"Custom domains on Cloudflare\").\n *\n * The proxy never decrypts a domain's stored credential \u2014 the OAuth grant's\n * refresh token or the pasted API token lives encrypted on the api's\n * `email_domains` row and only the api reads it. When a send's from-domain\n * is a registered custom domain, the proxy LEASES a short-lived credential\n * from the api instead:\n *\n * POST {API}/internal/email/domain-credential { domain }\n * \u2192 { kind: 'api_token', token } | { kind: 'oauth_grant', accessToken }\n *\n * The call uses the platform-internal auth pattern the proxy already uses\n * to call the api (`resolve.ts`, the revalidation bridge): an HMAC under\n * JWT_SECRET in the `x-void-internal` header. The signed value is the\n * domain \u2014 the one value both sides of this call already hold.\n *\n * The api owns the OAuth refresh chain (serialized per row, the rotated\n * refresh token persisted atomically with it) and returns a fresh access\n * token on every lease \u2014 there is no access-token cache on the api side.\n * The proxy caches the leased credential in-memory per domain for at most\n * 45 minutes; the OAuth access token (~1 hour) outlives that, so a cached\n * lease is never used past its own validity.\n *\n * A leased credential is a customer secret: it is never logged, never\n * interpolated into an error message, and never leaves this module except\n * as the `Authorization: Bearer` value of the send_raw call.\n */\n\nimport type { Env } from './types.ts';\n\nexport type EmailDomainLease =\n | { kind: 'api_token'; token: string }\n | { kind: 'oauth_grant'; accessToken: string };\n\n/** The contract's ceiling for the proxy-side cache: at most 45 minutes. */\nconst LEASE_CACHE_TTL_MS = 45 * 60 * 1000;\n\ninterface LeaseCacheEntry {\n lease: EmailDomainLease;\n expiresAt: number;\n}\n\n// In-memory per-isolate cache, keyed by domain. Same pattern as\n// resolve.ts's resource cache.\nconst leaseCache = new Map<string, LeaseCacheEntry>();\n\n/** @internal Exposed for testing only. */\nexport function clearEmailDomainLeaseCache(): void {\n leaseCache.clear();\n}\n\n/**\n * Drop one cached lease. Called when Cloudflare refused the credential\n * (401/403 from send_raw) so the next send re-leases instead of replaying a\n * credential the api may already have marked revoked.\n */\nexport function dropEmailDomainLease(domain: string): void {\n leaseCache.delete(domain);\n}\n\n/** The bearer value for the send_raw Authorization header. */\nexport function leaseBearer(lease: EmailDomainLease): string {\n return lease.kind === 'api_token' ? lease.token : lease.accessToken;\n}\n\n/**\n * Lease a send credential for a registered domain from the api. Returns\n * null on any failure \u2014 the caller maps that to a retryable UPSTREAM_ERROR;\n * the api owns the row's status transitions (`token_revoked`, \u2026) on real\n * credential failures, via its own refresh path.\n */\nexport async function leaseEmailDomainCredential(\n env: Pick<Env, 'API' | 'JWT_SECRET'>,\n domain: string,\n): Promise<EmailDomainLease | null> {\n const cached = leaseCache.get(domain);\n if (cached && cached.expiresAt > Date.now()) {\n return cached.lease;\n }\n let res: Response;\n try {\n const token = await hmacSign(domain, env.JWT_SECRET);\n res = await env.API.fetch('https://api/internal/email/domain-credential', {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({ domain }),\n });\n } catch {\n return null;\n }\n if (!res.ok) {\n return null;\n }\n let data: unknown;\n try {\n data = await res.json();\n } catch {\n return null;\n }\n const lease = parseLease(data);\n if (!lease) {\n return null;\n }\n leaseCache.set(domain, { lease, expiresAt: Date.now() + LEASE_CACHE_TTL_MS });\n return lease;\n}\n\nfunction parseLease(data: unknown): EmailDomainLease | null {\n if (typeof data !== 'object' || data === null) {\n return null;\n }\n const kind = (data as { kind?: unknown }).kind;\n if (kind === 'api_token') {\n const token = (data as { token?: unknown }).token;\n return typeof token === 'string' && token.length > 0 ? { kind, token } : null;\n }\n if (kind === 'oauth_grant') {\n const accessToken = (data as { accessToken?: unknown }).accessToken;\n return typeof accessToken === 'string' && accessToken.length > 0 ? { kind, accessToken } : null;\n }\n return null;\n}\n\n// --- HMAC signing (mirrors resolve.ts) ---\n\nconst encoder = new TextEncoder();\nlet cachedSignKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getSignKey(secret: string): Promise<CryptoKey> {\n if (cachedSignKey && cachedKeySecret === secret) {\n return cachedSignKey;\n }\n cachedSignKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n cachedKeySecret = secret;\n return cachedSignKey;\n}\n\nasync function hmacSign(data: string, secret: string): Promise<string> {\n const key = await getSignKey(secret);\n const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(data));\n const binary = String.fromCharCode(...new Uint8Array(sig));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n", "import { isReservedEmailSlug } from '@voidcloud/api/reserved-slugs';\nimport { EmailMessage } from 'cloudflare:email';\nimport { Hono } from 'hono';\nimport type { Context } from 'hono';\nimport { asString } from './body.ts';\nimport { dropEmailDomainLease, leaseBearer, leaseEmailDomainCredential } from './email-lease.ts';\nimport type { Env, ProxyEnv } from './types.ts';\n\nconst app = new Hono<ProxyEnv>();\n\n/**\n * Cap inbound MIME bytes well below CF's ~10 MB base64-inflated ceiling. The\n * framework enforces the same cap client-side; this is the proxy-side belt to\n * the framework's suspenders.\n */\nexport const MAX_MIME_BYTES = 10 * 1024 * 1024;\n\n/**\n * Cap the recipient list. Every entry costs a trimmed+lowercased copy, a\n * `seen` Set entry, and \u2014 for an address this project's allowlist rejects \u2014\n * one delivery object whose message interpolates the address, all of which\n * is then serialized into the response. That is ~360 bytes of isolate heap\n * per recipient, so an uncapped list reaches the 128 MB per-isolate ceiling\n * from a ~2.5 MB request body. A tenant worker holds a valid project HMAC,\n * so it can POST that body to the public proxy hostname, and the\n * all-rejected path returns ABOVE the burst and monthly gates \u2014 the work is\n * never metered and the request is endlessly repeatable. The proxy isolate\n * is shared with every other tenant's in-flight AI/D1/KV/R2 traffic, so the\n * kill is cross-tenant. The MIME cap does not bound this: `bcc` recipients\n * are deliberately kept out of the rendered headers, so a huge bcc list\n * costs nothing against `MAX_MIME_BYTES`.\n *\n * Checked against the RAW array BEFORE the normalization loop below. The\n * loop is what allocates, so deduping first would already have paid the\n * per-entry cost for a list of duplicates.\n */\nconst MAX_RECIPIENTS = 100;\n\n/**\n * Cap a single recipient string. `MAX_RECIPIENTS` alone still leaves a\n * 100 x <address length> amplifier, because `.trim().toLowerCase()` copies\n * the entry \u2014 and the allowlist-rejection message interpolates it a second\n * time \u2014 before anything has looked at its size. Checked BEFORE that\n * normalization for exactly that reason. RFC 5321 caps a forward-path at\n * 256 octets, so 320 is generous for any address that could be delivered.\n */\nexport const MAX_RECIPIENT_LENGTH = 320;\n\n/**\n * Cap the envelope sender for the same reason. It is one string, so there\n * is no list amplifier, but `from.toLowerCase()` below copies it whole\n * (measured: V8 returns a fresh full-size string even when nothing\n * changed), and a sender the strict regex accepts \u2014 an unbounded `+tag`\n * is one \u2014 is then echoed verbatim into the MIME `From:` refusal and\n * serialized into the response, three more copies of it. All of that runs\n * above the allowlist and quota gates, so it is never metered. Checked\n * with the other raw-input size gates, before any configuration or KV\n * read. Same figure as `MAX_RECIPIENT_LENGTH`, for the same RFC 5321\n * reason.\n *\n * Both are exported for the platform-token gate in `index.ts`, which\n * applies them to `/email/internal/send`'s `from` and `to` BEFORE hashing\n * the pair into the content binding \u2014 the same reason and the same\n * figures, on the one path that runs ahead of any credential check.\n */\nexport const MAX_SENDER_LENGTH = 320;\n\n/**\n * The platform mail domain for this environment \u2014 `mail.void.cloud` in\n * production, `mail.staging.void.cloud` in staging. Configured as the\n * `EMAIL_SENDER_DOMAIN` var on both the proxy and api workers, and mirrored\n * into deployed user workers as the `__VOID_EMAIL_DOMAIN` plain-text binding\n * so the framework builds its default `from` against the same zone.\n *\n * There is deliberately NO baked-in default. A staging proxy that fell back\n * to `mail.void.cloud` would accept a `from` on the production zone, and the\n * production sender regex would reject every legitimate staging sender \u2014 the\n * exact reason the domain stopped being a constant. Missing configuration\n * fails the send CLOSED.\n */\nexport function readSenderDomain(env: Pick<Env, 'EMAIL_SENDER_DOMAIN'>): string | null {\n const raw = env.EMAIL_SENDER_DOMAIN;\n if (typeof raw !== 'string') {\n return null;\n }\n const domain = raw.trim().toLowerCase();\n return domain.length > 0 ? domain : null;\n}\n\n/** Regex metacharacters, escaped before a config value is interpolated. */\nconst RE_METACHARS_RE = /[.*+?^${}()|[\\]\\\\]/g;\n\nfunction escapeRegExp(value: string): string {\n return value.replace(RE_METACHARS_RE, '\\\\$&');\n}\n\n/**\n * Memoized per-domain sender regexes. Keyed by the configured\n * `EMAIL_SENDER_DOMAIN`, which is worker configuration and not user input,\n * so the map holds exactly one entry per isolate in practice.\n */\nconst strictFromCache = new Map<string, RegExp>();\n\n/**\n * Strict shape for the outbound `from` envelope address. The slug+domain\n * pinning logic below splits on `+` and the first `@`, but those splits do\n * NOT reject CR/LF, quotes, angle brackets, or display-name forms. Without\n * this regex, a `from` like `slug+x\\r\\nX-Header: y@<domain>` would pass slug\n * pinning and then reach `new EmailMessage(from, ...)`, opening an SMTP\n * header injection primitive against the shared sender. The regex pins the\n * entire string to: lowercase ASCII local-part, optional `+<safe-tag>`\n * (constrained to RFC-5321 dot-atom-text + `=` and `/`), then exactly\n * `@<EMAIL_SENDER_DOMAIN>`. Display names, encoded-words, and angle brackets\n * are intentionally not supported \u2014 the framework doesn't emit them for a\n * default `from`, and explicit user-supplied names are already disallowed by\n * the slug pin.\n *\n * The `+tag` class is a positive class rather than `[^@\\s]+` so even\n * non-printable ASCII (NUL, BEL, DEL, \u2026) can't ride into `EmailMessage`.\n *\n * The domain is escaped before interpolation so a misconfigured value can\n * never widen the pattern (an unescaped `.` would match any character).\n */\nexport function strictFromRe(domain: string): RegExp {\n const cached = strictFromCache.get(domain);\n if (cached) {\n return cached;\n }\n const re = new RegExp(`^[a-z0-9._-]+(?:\\\\+[a-z0-9._=/-]+)?@${escapeRegExp(domain)}$`);\n strictFromCache.set(domain, re);\n return re;\n}\n\n/**\n * Valid project slug shape. The api worker writes `email-slug:<projectId>`\n * KV mirror entries; we read them and pin the `from` local-part against\n * the value. A poisoned KV (corrupted write, attacker-controlled bypass\n * of the api worker) returning e.g. `BADSLUG!` would then be accepted as\n * the source-of-truth slug and let `from: badslug!@<domain>` through \u2014 and\n * crucially, the strict-from regex above doesn't allow `!` in the\n * local-part, so the comparison would silently fail every future request\n * for that project without anyone noticing the bad data. Validate the slug\n * shape on read so a bad value surfaces as UPSTREAM_ERROR with a clear\n * message instead.\n */\nconst SLUG_RE = /^[a-z0-9._-]+$/;\n\n/**\n * Strip CR/LF/NUL/control chars before logging or surfacing to remote MTAs.\n *\n * Built via new RegExp so oxlint's no-control-regex rule (which fires\n * on even Unicode-escaped control refs in regex literals) does not\n * reject the pattern. Behavior is identical to a literal regex.\n *\n * Slice FIRST, then replace \u2014 the same order as `sanitize` in\n * `email-router.ts`, for the same reason: a global replace materializes one\n * part per match, so a control-heavy input costs far more than one copy\n * (measured: a 5 MB `\\na\\na\u2026` value is +170 MB of transient heap through the\n * old replace-then-slice order, past the 128 MB isolate ceiling; slice-first\n * is 0 ms). Most callers already pass bounded values; `requestId` at intake\n * and the inbound `Subject:` header did not. The result is at most `maxLen`\n * chars and may be shorter \u2014 a control run inside the window collapses to\n * one space and nothing is refilled from beyond it \u2014 which loses nothing on\n * a log line.\n */\n// oxlint-disable-next-line no-control-regex\nconst CONTROL_CHARS_RE = new RegExp('[\\\\u0000-\\\\u001f\\\\u007f]+', 'g');\nfunction sanitizeForLog(value: string, maxLen = 200): string {\n return value.slice(0, maxLen).replace(CONTROL_CHARS_RE, ' ');\n}\n\n/**\n * Cap the caller-supplied log correlation id. The framework sends 16 hex\n * chars (`newRequestId` in `void/email`), but a hand-built tenant worker can\n * send any string the request body carries, and the only consumer is the\n * `[email-log]` line \u2014 one per delivery, so up to `MAX_RECIPIENTS` copies of\n * it per request \u2014 in the shared proxy log stream. It is diagnostic, so it\n * is bounded and sanitized ONCE at intake rather than refused with a 400:\n * a missing or non-string id already logs as `unknown` instead of failing\n * the send, and a truncated id is no less useful to correlate on. The\n * control-char strip is what stops a `\\n` in the id from forging a second\n * `[email-log]` line under another project's id. 128 leaves room for a\n * UUID or a prefixed id without inviting anything longer.\n */\nconst MAX_REQUEST_ID_LENGTH = 128;\n\n/**\n * Wrap a Uint8Array as a single-chunk ReadableStream. CF's EmailMessage\n * constructor accepts `string | ReadableStream`; passing a Uint8Array\n * directly is a TS error. Streaming a single chunk avoids decoding to\n * UTF-8 (which would corrupt non-text MIME parts that happen to be\n * stored in their decoded form).\n */\nfunction bytesToStream(bytes: Uint8Array): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(bytes);\n controller.close();\n },\n });\n}\n\n/**\n * The addr-spec named by the message-level `From:` header, or why there is\n * no single one to name.\n *\n * `/send` pins the ENVELOPE sender (`from`) to the calling project's slug,\n * but the bytes a recipient's mail client shows as the sender are the MIME\n * `From:` header inside `mimeBase64`, and a tenant worker holding its own\n * project HMAC can post any bytes it likes there. Cloudflare's local\n * `send_email` simulator (miniflare `send_email.worker.ts`) throws\n * `From: header does not match mail from` for exactly this, and its author\n * says the messages mirror production \u2014 but nothing in the public docs\n * promises it, the same simulator takes the LAST of several `From:` headers\n * and the FIRST mailbox of a list, and the proxy is the platform's tenancy\n * boundary. So the proxy checks itself: exactly one `From:` header, holding\n * exactly one mailbox, whose addr-spec is the authorized envelope sender.\n *\n * Scope is deliberately narrow. The display name (a quoted-string or RFC\n * 2047 encoded-words before `<\u2026>`) is NOT inspected \u2014 closing display-name\n * spoofing would need a real RFC 5322 scanner tracking `buildMime` forever,\n * and stays handed back. The structural specials outside quotes\n * (`, ; : ( ) [ ] \\` and a bare `@` before `<`) are refused only because\n * each one would make \"which mailbox is this\" ambiguous \u2014 a list, a group,\n * a comment or a phrase that reads as an address \u2014 and `buildMime` never\n * emits any of them unquoted. `Sender:`, `Reply-To:` and `Resent-From:` are\n * not pinned: no client presents them as the author, and a reply sent to a\n * sibling project's inbound address is something anyone can do without the\n * proxy.\n *\n * Every line of the header block is visited so a `From:` cannot hide\n * behind an unrelated header, and continuation lines (leading WSP) are\n * unfolded onto the header they extend. The scan stops at the first empty\n * line \u2014 a `From:` inside a MIME part's own headers is that part's, not the\n * message's \u2014 or at the end of `raw`, which `MAX_MIME_BYTES` already\n * bounds. The work is one linear pass over bytes that are already in\n * memory; only the `From:` value is ever decoded to a string, and the\n * tokenizer below is a single pass with no backtracking, so a display\n * name of any length (which `buildMime` allows) costs what it weighs.\n *\n * \"What it weighs\" has to mean BYTES, not lines. The scan keeps nothing\n * per line \u2014 only the byte offsets of the one `From:` it found \u2014 because\n * `MAX_MIME_BYTES` bounds bytes and a folded header can hold one line per\n * three of them (` \\r\\n`): 3.5 million continuations fit in 10 MiB, and an\n * earlier shape that retained one `subarray` view per continuation held\n * ~125 bytes of heap each \u2014 437 MB, measured, in an isolate of 128 MB that\n * every tenant's AI/D1/KV/R2 traffic shares. The same message with no\n * `From:` cost 1 MB, so the amplifier was the `From:` itself. The value is\n * unfolded with ONE copy of the header's byte range, and no copy at all\n * when it did not fold.\n *\n * Header names are matched the way lenient parsers (postal-mime, which\n * miniflare uses) match them \u2014 bytes before the first `:` with trailing\n * WSP trimmed, case-insensitively \u2014 so `From :` counts as a second `From:`\n * rather than slipping past as an unknown header. A bare CR inside a line\n * fails the scan: `buildMime` rejects CR/LF in every value, and a parser\n * that splits on LF alone would read the bytes after it as part of the\n * same header.\n */\nexport type MimeFrom =\n | { ok: true; addrSpec: string }\n | { ok: false; reason: 'missing' | 'multiple' | 'malformed' };\n\nconst LF = 0x0a;\nconst CR = 0x0d;\nconst SP = 0x20;\nconst HTAB = 0x09;\nconst COLON = 0x3a;\nconst FROM_NAME = [0x66, 0x72, 0x6f, 0x6d]; // \"from\"\n\n/**\n * Where the value of the header line `raw[start, end)` begins if the line\n * is named `From` \u2014 the byte after its first `:` \u2014 or -1 if it is not.\n * The name is the bytes before that colon with trailing WSP trimmed,\n * compared case-insensitively; since it has to be exactly `from`, the\n * colon is looked for only across the WSP run that may follow those four\n * bytes, so the check reads at most the name and never searches the line.\n */\nfunction fromValueStart(raw: Uint8Array, start: number, end: number): number {\n if (end - start <= FROM_NAME.length) {\n return -1;\n }\n for (let i = 0; i < FROM_NAME.length; i++) {\n // ASCII case fold: `A`..`Z` \u2192 `a`..`z`. Non-letters fold to themselves.\n if ((raw[start + i] | 0x20) !== FROM_NAME[i]) {\n return -1;\n }\n }\n let colon = start + FROM_NAME.length;\n while (colon < end && (raw[colon] === SP || raw[colon] === HTAB)) {\n colon++;\n }\n return colon < end && raw[colon] === COLON ? colon + 1 : -1;\n}\n\n/** Operator-readable detail for each way the pin can fail to find a sender. */\nconst MIME_FROM_REFUSALS: Record<Extract<MimeFrom, { ok: false }>['reason'], string> = {\n missing: 'the message has no From header',\n multiple: 'the message has more than one From header',\n malformed: 'the From header must hold a single mailbox',\n};\n\nexport function readMimeFromAddrSpec(raw: Uint8Array): MimeFrom {\n const n = raw.byteLength;\n // The `From:` header as offsets into `raw`: its value starts after the\n // colon and ends where the content of its last line ends. `folded` says\n // whether a continuation line extended it, `inFrom` whether the line\n // being visited may.\n let fromCount = 0;\n let valueStart = -1;\n let valueEnd = -1;\n let folded = false;\n let inFrom = false;\n // The next CR at or after `lineStart`. Searched for lazily, each search\n // starting past the previous hit, so finding the bare CR that fails the\n // scan stays linear across a block of CR-less lines.\n let nextCr = raw.indexOf(CR);\n let lineStart = 0;\n while (lineStart < n) {\n const lf = raw.indexOf(LF, lineStart);\n const lineEnd = lf === -1 ? n : lf;\n let contentEnd = lineEnd;\n if (contentEnd > lineStart && raw[contentEnd - 1] === CR) {\n contentEnd--;\n }\n if (contentEnd === lineStart) {\n break; // empty line: end of the header block\n }\n if (nextCr !== -1 && nextCr < lineStart) {\n nextCr = raw.indexOf(CR, lineStart);\n }\n if (nextCr !== -1 && nextCr < contentEnd) {\n return { ok: false, reason: 'malformed' };\n }\n if (raw[lineStart] === SP || raw[lineStart] === HTAB) {\n if (inFrom) {\n valueEnd = contentEnd;\n folded = true;\n }\n } else {\n const start = fromValueStart(raw, lineStart, contentEnd);\n inFrom = start !== -1;\n if (inFrom) {\n fromCount++;\n valueStart = start;\n valueEnd = contentEnd;\n folded = false;\n }\n }\n lineStart = lf === -1 ? n : lf + 1;\n }\n if (fromCount === 0) {\n return { ok: false, reason: 'missing' };\n }\n if (fromCount > 1) {\n return { ok: false, reason: 'multiple' };\n }\n // Unfold (RFC 5322 \u00A72.2.3): the value is the header's byte range with\n // its line breaks removed, each continuation keeping its leading WSP.\n // Every CR still inside the range ends a line \u2014 the scan refused any\n // other \u2014 so dropping CR and LF is the whole job, done in place on one\n // copy of the range. A header that did not fold needs no copy.\n let value = raw.subarray(valueStart, valueEnd);\n if (folded) {\n value = raw.slice(valueStart, valueEnd);\n let kept = 0;\n for (let i = 0; i < value.length; i++) {\n const byte = value[i];\n if (byte !== CR && byte !== LF) {\n value[kept++] = byte;\n }\n }\n value = value.subarray(0, kept);\n }\n const addrSpec = singleMailboxAddrSpec(new TextDecoder().decode(value));\n return addrSpec === null ? { ok: false, reason: 'malformed' } : { ok: true, addrSpec };\n}\n\n/**\n * The addr-spec of a header value that holds exactly one mailbox \u2014 either a\n * bare `addr-spec` or `[phrase] <addr-spec>` \u2014 or `null` when the value is\n * anything else. One pass; quoted-strings (with `\\` escapes) are skipped\n * whole, and their contents are never interpreted.\n */\nfunction singleMailboxAddrSpec(value: string): string | null {\n let inQuotes = false;\n let escaped = false;\n let lt = -1;\n let gt = -1;\n let firstAt = -1;\n for (let i = 0; i < value.length; i++) {\n const ch = value[i];\n if (inQuotes) {\n if (escaped) {\n escaped = false;\n } else if (ch === '\\\\') {\n escaped = true;\n } else if (ch === '\"') {\n inQuotes = false;\n }\n continue;\n }\n switch (ch) {\n case '\"':\n // A quoted-string belongs to the phrase, which ends at `<`.\n if (lt !== -1) {\n return null;\n }\n inQuotes = true;\n break;\n case '<':\n if (lt !== -1) {\n return null;\n }\n lt = i;\n break;\n case '>':\n if (lt === -1 || gt !== -1) {\n return null;\n }\n gt = i;\n break;\n case '@':\n if (firstAt === -1) {\n firstAt = i;\n }\n break;\n case ',':\n case ';':\n case ':':\n case '(':\n case ')':\n case '[':\n case ']':\n case '\\\\':\n return null;\n default:\n break;\n }\n }\n if (inQuotes) {\n return null;\n }\n let addrSpec: string;\n if (lt === -1) {\n addrSpec = value.trim();\n } else {\n // `<` present: it needs its `>`, nothing but WSP may follow, and the\n // phrase before it must not read as an address of its own.\n if (gt === -1 || value.slice(gt + 1).trim().length !== 0) {\n return null;\n }\n if (firstAt !== -1 && firstAt < lt) {\n return null;\n }\n addrSpec = value.slice(lt + 1, gt);\n }\n // One printable-ASCII token. Rules out an empty `<>`, WSP inside the\n // brackets, and a code point that only LOOKS like the sender before the\n // caller lower-cases it for the compare.\n return /^[\\x21-\\x7e]+$/.test(addrSpec) ? addrSpec : null;\n}\n\n/**\n * Platform-wide suspension marker.\n *\n * `routing.suspended` is written into a project's routing blob by\n * `applyRoutingSuspension` / `setProjectsRoutingSuspension` in the api\n * worker and enforced with a 429 by `packages/dispatch`. Email is the other\n * tenant-facing egress path, so it has to honor the same marker: without\n * this check a project suspended for abuse keeps sending through the\n * platform's own account-level `send_email` binding. The narrower\n * `email-suspended:<projectId>` switch below stays as the email-only\n * kill-switch.\n *\n * No `cacheTtl`, for the same reason as `email-suspended:` \u2014 this is an\n * abuse-response control where convergence latency is the whole point.\n *\n * A MISSING routing blob is NOT read as a suspension. The marker is only\n * ever written INTO an existing entry, so a project with no routing entry\n * has nothing suspended; failing closed on absence would instead break every\n * send made before the first routing write.\n *\n * An UNPARSEABLE blob is a different case and is reported as `corrupt` so\n * the caller can fail closed. Every producer of this value\n * (`api/src/routing.ts`, `api/src/routes/deploy.ts`, `api/src/index.ts`)\n * writes a `JSON.stringify`d object, so there is no legitimate writer of a\n * malformed entry and therefore no false positive to trade against. Reading a parse\n * failure as \"not suspended\" would silently disable the platform-wide\n * suspension gate for exactly the project whose entry got corrupted.\n */\ntype RoutingSuspension =\n | { kind: 'absent' }\n | { kind: 'clear' }\n | { kind: 'suspended'; reason: string }\n | { kind: 'corrupt' };\n\nasync function readRoutingSuspension(kv: KVNamespace, slug: string): Promise<RoutingSuspension> {\n const raw = await kv.get(slug);\n if (!raw) {\n return { kind: 'absent' };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return { kind: 'corrupt' };\n }\n // `JSON.parse('null')` and friends parse cleanly but carry no marker to\n // read, and no producer emits them either \u2014 treat them as corrupt rather\n // than reaching for `.suspended` on a non-object.\n if (typeof parsed !== 'object' || parsed === null) {\n return { kind: 'corrupt' };\n }\n // The marker is read by TRUTHINESS, the same test the two sibling readers\n // apply \u2014 `packages/dispatch` (`if (routing.suspended)` \u2192 429) and the\n // inbound router in `email-router.ts` (truthy \u2192 reject). A falsy present\n // value (`null`, `false`, `''`, `0`) is \"not suspended\" to both of them, so\n // it is `clear` here too: no writer emits one today (an unsuspend DELETES\n // the key), but a future clear that stamps `suspended: null` must not\n // brick every send. A TRUTHY value that is not a string has no writer\n // either \u2014 every producer stamps a non-empty reason string \u2014 yet both\n // siblings refuse on it, so it is `corrupt` rather than `clear`: the send\n // path must not be the one gate that reads a marker the edge and inbound\n // paths are blocking on as an open door.\n const suspended = (parsed as { suspended?: unknown }).suspended;\n if (!suspended) {\n return { kind: 'clear' };\n }\n if (typeof suspended !== 'string') {\n return { kind: 'corrupt' };\n }\n return { kind: 'suspended', reason: suspended };\n}\n\n/**\n * Outbound email send. The framework runtime POSTs:\n *\n * {\n * projectId, aiToken, // auth (validated by middleware)\n * from, // envelope sender (must be on an Email-Routing-enabled zone)\n * recipients: string[], // unique normalized recipient addresses\n * mimeBase64, // raw MIME, base64-encoded\n * byteSize, // declared raw byte count\n * requestId, fromDomain? // for logs\n * }\n *\n * The proxy:\n * 1. Validates structure + size\n * 2. Checks platform suspension (`routing.suspended`) and the per-project\n * email suspend kill-switch\n * 3. Checks the per-project verified-destinations allowlist\n * (mirrored from `email_destinations` into `email-allowlist:<id>` KV)\n * 4. Runs burst + monthly outbound quota gates against the *allowed*\n * recipient count (denied-by-allowlist sends don't burn quota)\n * 5. Calls `env.SEND_EMAIL.send()` per allowed recipient\n * 6. Returns a `SendEmailResult`-shaped JSON the framework passes through\n *\n * Quotas + allowlists live exclusively in the proxy. The user worker does\n * not have a `send_email` binding.\n */\napp.post('/send', async (context) => {\n const projectId = context.get('projectId');\n const body = context.get('body');\n\n const from = asString(body.from);\n const mimeBase64 = asString(body.mimeBase64);\n // Bounded and sanitized here, once, so `logSend` never interpolates the\n // raw value; see `MAX_REQUEST_ID_LENGTH`.\n const requestIdRaw = asString(body.requestId);\n const requestId =\n requestIdRaw === null ? 'unknown' : sanitizeForLog(requestIdRaw, MAX_REQUEST_ID_LENGTH);\n const recipientsRaw = Array.isArray(body.recipients) ? body.recipients : null;\n\n if (!from || !mimeBase64 || !recipientsRaw) {\n return context.json(\n { ok: false, error: { code: 'UPSTREAM_ERROR', message: 'invalid body' } },\n 400,\n );\n }\n\n // Bound the list before the normalization loop below allocates per entry.\n // Answered with the same 413 the MIME size guard uses \u2014 the framework\n // dispatches on `error.code`, not the status, and INVALID_TO is already\n // its code for an unusable recipient set.\n if (recipientsRaw.length > MAX_RECIPIENTS) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_TO',\n message: `too many recipients (max ${MAX_RECIPIENTS}, got ${recipientsRaw.length})`,\n },\n },\n 413,\n );\n }\n\n // Bound the sender before anything copies it \u2014 the lowercase, the strict\n // regex and the refusal that echoes it all sit below. Same 413 as the\n // recipient bound; INVALID_FROM is the framework's code for an unusable\n // sender. The address is deliberately not echoed back.\n if (from.length > MAX_SENDER_LENGTH) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `sender exceeds ${MAX_SENDER_LENGTH} characters`,\n },\n },\n 413,\n );\n }\n\n // Fail closed on missing sender configuration \u2014 never fall back to a\n // baked-in domain (see readSenderDomain). Resolved before any KV work so a\n // misconfigured environment can't burn quota counters on a send that can't\n // possibly be authorized.\n const senderDomain = readSenderDomain(context.env);\n if (!senderDomain) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'UPSTREAM_ERROR',\n message: 'email sender domain is not configured',\n },\n },\n 502,\n );\n }\n\n // Same reasoning for the send binding itself. Wrangler does not inherit\n // `send_email` into a named env, so a binding missing from one env block\n // would otherwise surface as a throw AFTER both counters were incremented.\n const sendBinding = context.env.SEND_EMAIL;\n if (typeof sendBinding?.send !== 'function') {\n return context.json(\n {\n ok: false,\n error: {\n code: 'UPSTREAM_ERROR',\n message: 'email sending is not configured',\n },\n },\n 502,\n );\n }\n\n // Recipients must be unique strings; the framework already dedups but we\n // re-validate so a buggy client can't double-charge quota or pollute logs.\n const recipients: Array<string> = [];\n const seen = new Set<string>();\n for (const r of recipientsRaw) {\n if (typeof r !== 'string') {\n continue;\n }\n // Before `.trim().toLowerCase()` \u2014 that call is the allocation.\n // The address is deliberately not echoed back.\n if (r.length > MAX_RECIPIENT_LENGTH) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_TO',\n message: `recipient exceeds ${MAX_RECIPIENT_LENGTH} characters`,\n },\n },\n 413,\n );\n }\n const lower = r.trim().toLowerCase();\n if (!lower || seen.has(lower)) {\n continue;\n }\n seen.add(lower);\n recipients.push(lower);\n }\n if (recipients.length === 0) {\n return context.json(\n { ok: false, error: { code: 'INVALID_TO', message: 'no recipients' } },\n 200,\n );\n }\n\n // Pre-decode size guard \u2014 base64 expands ~4/3, so a base64 string longer\n // than `MAX_MIME_BYTES * 4 / 3 + 4` (the +4 absorbs padding rounding)\n // can't possibly decode to anything within the limit. Reject before\n // allocating a 75 MB Uint8Array for what we'd reject anyway. Defends\n // against adversarial OOM via outsized payloads.\n if (mimeBase64.length > Math.ceil((MAX_MIME_BYTES * 4) / 3) + 4) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'MIME_ERROR',\n message: `mime exceeds ${MAX_MIME_BYTES} bytes (base64 length ${mimeBase64.length})`,\n },\n },\n 413,\n );\n }\n\n let raw: Uint8Array;\n try {\n raw = base64Decode(mimeBase64);\n } catch {\n return context.json(\n { ok: false, error: { code: 'MIME_ERROR', message: 'invalid base64 mime' } },\n 400,\n );\n }\n // Defense-in-depth: the pre-decode check is conservative (uses base64\n // length), so a small over-by-one slip past it would still trip here.\n if (raw.byteLength > MAX_MIME_BYTES) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'MIME_ERROR',\n message: `mime exceeds ${MAX_MIME_BYTES} bytes (got ${raw.byteLength})`,\n },\n },\n 413,\n );\n }\n\n // Custom sender domains (design doc 0078, \"Custom domains on\n // Cloudflare\"): a `from` whose domain is NOT the platform sender domain\n // belongs to a registered `email_domains` row, not to the shared zone.\n // The slug pin and strict regex below only make sense ON `senderDomain`,\n // so the paths fork here \u2014 after the size and structure gates that apply\n // to both. A `from` with no usable domain part falls through to the\n // shared-path guards, which refuse it.\n const fromAt = from.indexOf('@');\n const fromDomain = fromAt === -1 ? '' : from.slice(fromAt + 1).toLowerCase();\n if (fromDomain !== '' && fromDomain !== senderDomain) {\n return sendViaCustomDomain(\n context,\n projectId,\n from,\n fromDomain,\n senderDomain,\n recipients,\n raw,\n requestId,\n );\n }\n\n // Resolve the project's slug via the `email-slug:<projectId>` mirror\n // the API writes on project create. We use this to enforce that the\n // `from` address belongs to the calling project \u2014 without this check,\n // project A could submit `from: <slug-of-B>+...@<domain>` and\n // impersonate B (the account-level send_email binding accepts any\n // sender on the zone).\n //\n // No cacheTtl: slug\u2194projectId is permanent, so KV's edge cache (60s\n // free-tier window) gives us locality without us pinning it.\n const expectedSlug = await context.env.ROUTING.get(`email-slug:${projectId}`);\n if (!expectedSlug) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'UPSTREAM_ERROR',\n message: 'project slug unknown \u2014 refusing to send',\n },\n },\n 502,\n );\n }\n // Defense-in-depth: reject malformed slugs from KV so a poisoned mirror\n // can't smuggle a bad `from` past the strict regex below or DoS future\n // sends with mismatched comparisons.\n if (!SLUG_RE.test(expectedSlug)) {\n console.error(\n `[email-send] project ${projectId} slug malformed in KV: ${sanitizeForLog(expectedSlug, 64)}`,\n );\n return context.json(\n {\n ok: false,\n error: {\n code: 'UPSTREAM_ERROR',\n message: 'project slug malformed in routing',\n },\n },\n 502,\n );\n }\n // A slug that is an email identity of the domain itself (`noreply`, the\n // platform's own verification sender; `postmaster`, `abuse`, \u2026) may not\n // send at all. `RESERVED_SLUGS` stops NEW projects from claiming one, but\n // a project registered before those were reserved still holds its slug,\n // and the mirror alone would let it send as `noreply@<domain>` \u2014\n // indistinguishable from the platform. The api's backfill withholds and\n // removes the mirror for such a project; this refusal covers the mirror\n // that already exists until that pass runs, and any write that bypasses\n // the backfill. Refused as a bad `from` rather than a 502: nothing\n // upstream is missing, the identity is simply not the project's to use.\n if (isReservedEmailSlug(expectedSlug)) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `project slug \"${expectedSlug}\" is a reserved email identity on ${senderDomain} \u2014 refusing to send`,\n },\n },\n 403,\n );\n }\n // Lowercase once for the strict regex + slug compare; the regex anchors\n // the whole string and intentionally rejects CR/LF, quotes, brackets,\n // and display-name forms before we touch EmailMessage.\n // The envelope is forwarded verbatim, so validation has to run on bytes that\n // cannot change under case folding. U+212A KELVIN SIGN lowercases to 'k' and\n // U+0130 to 'i', so a non-ASCII `from` can satisfy a lowercased regex and\n // still reach the shared envelope sender intact. Refuse it before that.\n if (!/^[\\x21-\\x7e]+$/.test(from)) {\n return context.json(\n {\n ok: false,\n error: { code: 'INVALID_FROM', message: 'from address must be printable ASCII' },\n },\n 403,\n );\n }\n const fromLower = from.toLowerCase();\n if (!strictFromRe(senderDomain).test(fromLower)) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `from address must be <${expectedSlug}>[+tag]@${senderDomain}`,\n },\n },\n 200,\n );\n }\n const fromLocal = fromLower.slice(0, fromLower.indexOf('@'));\n const localPrefix = fromLocal.split('+')[0] ?? '';\n if (localPrefix !== expectedSlug.toLowerCase()) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `from address must be <${expectedSlug}>[+tag]@${senderDomain}`,\n },\n },\n 200,\n );\n }\n\n // The envelope is pinned; now pin what the recipient will actually SEE.\n // A mismatch here is a request the framework never produces \u2014 `buildMime`\n // renders `From:` from the same `from.email` it posts as the envelope \u2014 so\n // it is refused outright rather than reported per recipient. Runs before\n // the suspension and allowlist reads for the same reason as the slug pin:\n // no KV work for a request that can never be authorized. The refusal may\n // echo `from`: it is at most `MAX_SENDER_LENGTH` printable-ASCII bytes by\n // now.\n const mimeFrom = readMimeFromAddrSpec(raw);\n if (!mimeFrom.ok || mimeFrom.addrSpec.toLowerCase() !== fromLower) {\n const detail = mimeFrom.ok\n ? 'the From header address does not match the envelope sender'\n : MIME_FROM_REFUSALS[mimeFrom.reason];\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `mime From must be the envelope sender ${from}: ${detail}`,\n },\n },\n 403,\n );\n }\n\n // Platform-wide suspension \u2014 the same marker dispatch answers with a 429.\n // Checked before the email-only kill-switch so an account suspended for\n // abuse loses every egress path at once.\n const platformSuspension = await readRoutingSuspension(context.env.ROUTING, expectedSlug);\n // A blob we cannot parse leaves the marker's state unknown, so it fails\n // closed exactly like a poisoned slug mirror above: operator-visible 502,\n // no send, no quota burned.\n if (platformSuspension.kind === 'corrupt') {\n console.error(\n `[email-send] project ${projectId} routing blob malformed in KV for slug ${sanitizeForLog(expectedSlug, 64)}`,\n );\n return context.json(\n {\n ok: false,\n error: {\n code: 'UPSTREAM_ERROR',\n message: 'project routing entry malformed',\n },\n },\n 502,\n );\n }\n if (platformSuspension.kind === 'suspended') {\n return context.json(\n {\n ok: false,\n error: {\n code: 'QUOTA_EXCEEDED',\n message: `project is suspended (${sanitizeForLog(platformSuspension.reason, 64)})`,\n },\n },\n 200,\n );\n }\n\n // Suspend kill-switch \u2014 set by admin UI for abuse response. Also gates\n // inbound (see email-router.ts). No cacheTtl: this is an abuse-response\n // control where convergence latency is the whole point \u2014 we want to\n // pay for the extra KV get on every send so a suspend takes effect\n // immediately (subject only to KV's ~near-instant per-colo consistency).\n if (await context.env.ROUTING.get(`email-suspended:${projectId}`)) {\n return context.json(\n { ok: false, error: { code: 'QUOTA_EXCEEDED', message: 'project email is suspended' } },\n 200,\n );\n }\n\n // Per-project verified-destinations allowlist. KV mirror of the\n // email_destinations table maintained by the API on every CRUD; cacheTtl\n // bounds convergence at ~60s per colo. A cache miss (allowlist key\n // missing entirely) reads as empty, so a brand-new project with no\n // verified destinations gets every recipient rejected \u2014 matches the\n // design intent.\n const allowlist = await readAllowlist(context.env.ROUTING, projectId);\n\n const allowed: Array<string> = [];\n const deliveries: Array<RecipientResult> = [];\n for (const r of recipients) {\n if (allowlist.has(r)) {\n allowed.push(r);\n } else {\n deliveries.push({\n recipient: r,\n ok: false,\n error: {\n code: 'UNVERIFIED_DESTINATION',\n message: `recipient '${r}' is not a verified destination for this project`,\n },\n });\n }\n }\n if (allowed.length === 0) {\n return context.json({ ok: false, deliveries }, 200);\n }\n\n // Burst cap \u2014 fixed-window per-minute counter. Caps the spike before it\n // reaches CF's MTA so a noisy project can't trip the per-zone rate limit\n // for the shared platform sender.\n const now = new Date();\n const burstKey = `email-burst:${projectId}:${minuteBucket(now)}`;\n const burstCurrent = readCounter(await context.env.ROUTING.get(burstKey));\n const burstLimit = await getBurstLimit(context.env.ROUTING, projectId);\n if (burstCurrent + allowed.length > burstLimit) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'QUOTA_EXCEEDED',\n message: `outbound burst limit ${burstLimit}/min exceeded`,\n },\n },\n 429,\n );\n }\n\n // Monthly counter. YYYY-MM bucket auto-rolls.\n const counterKey = `email-sent:${projectId}:${monthBucket(now)}`;\n const monthCurrent = readCounter(await context.env.ROUTING.get(counterKey));\n const monthLimit = await getMonthlyLimit(context.env.ROUTING, projectId);\n if (monthCurrent + allowed.length > monthLimit) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'QUOTA_EXCEEDED',\n message: `monthly outbound limit ${monthLimit} exceeded`,\n },\n },\n 429,\n );\n }\n\n // Optimistic increment of both counters.\n //\n // **Both caps are best-effort, and the monthly one is NOT a backstop for\n // the burst one.** Each counter is a KV read-modify-write, so concurrent\n // isolates read the same value and overshoot by\n // `(parallel_isolates \u00D7 per_request_recipients)`. A wider window does not\n // fix that: KV accepts at most one write per second per key, so once the\n // send rate passes ~1 request/second the month counter stops advancing for\n // the rest of that second and every request inside it charges against the\n // same stale read. KV answers those rejected writes with a 429, which the\n // `.catch()` below swallows. The bypass scales with request rate and\n // degrades the monthly cap by the same factor as the burst cap. It does\n // not round to nothing.\n //\n // What these gates buy is a bound on accidental floods and a cheap reject\n // for the ordinary case. The real abuse control is the suspend\n // kill-switch (`email-suspended:` and the platform-wide\n // `routing.suspended` marker), which is why both are read uncached on\n // every send. Making either cap strict means moving the counter into a\n // Durable Object (or fronting it with CF rate limiting) \u2014 a platform\n // architecture decision, deliberately not taken here.\n //\n // Each put is wrapped independently so one failed write cannot drop the\n // other. A failed put means the next request reads a stale count and the\n // overshoot widens, which is accepted for the same reason as above.\n await Promise.all([\n context.env.ROUTING.put(counterKey, String(monthCurrent + allowed.length), {\n expirationTtl: monthTtlSeconds(now),\n }).catch((e) => {\n console.error(`[email-send] monthly counter put failed for ${projectId}:`, e);\n }),\n context.env.ROUTING.put(burstKey, String(burstCurrent + allowed.length), {\n expirationTtl: 5 * 60,\n }).catch((e) => {\n console.error(`[email-send] burst counter put failed for ${projectId}:`, e);\n }),\n ]);\n\n // Send fan-out. CF's `send_email` binding takes one recipient per\n // EmailMessage \u2014 we already split by recipient above.\n for (const r of allowed) {\n try {\n // EmailMessage accepts string | ReadableStream \u2014 wrap our buffered\n // bytes as a single-chunk stream. We can't reuse one stream across\n // recipients because streams are one-shot, so build per send.\n const msg = new EmailMessage(from, r, bytesToStream(raw));\n // Some CF builds don't return the messageId; we surface \"\" rather\n // than crash and let the framework decide whether to fall back.\n const result = await sendBinding.send(msg);\n deliveries.push({\n recipient: r,\n ok: true,\n messageId: typeof result?.messageId === 'string' ? result.messageId : '',\n });\n } catch (e) {\n deliveries.push({\n recipient: r,\n ok: false,\n error: {\n code: classifyUpstream(e, projectId),\n message: e instanceof Error ? e.message : String(e),\n },\n });\n }\n }\n\n // Inline log (analytics-engine wiring TODO).\n logSend(projectId, requestId, deliveries);\n\n // If any recipient failed (allowlist miss OR upstream error), surface as\n // a mid-batch failure so callers can retry per-recipient.\n const anyFailed = deliveries.some((d) => !d.ok);\n if (anyFailed) {\n return context.json({ ok: false, deliveries }, 200);\n }\n return context.json({\n ok: true,\n ids: deliveries.map((d) => ({\n recipient: d.recipient,\n messageId: (d as { messageId: string }).messageId,\n })),\n });\n});\n\n// -----------------------------------------------------------------------------\n// Custom sender domains \u2014 a `/send` fork for `from` domains registered to\n// the project (design doc 0078, \"Custom domains on Cloudflare\").\n// -----------------------------------------------------------------------------\n\n/**\n * The Email Sending REST `send_raw` result. snake_case \u2014 the REST schema\n * names the id `message_id`, unlike the `send_email` binding's camelCase\n * `messageId` (and the api's `SendRawResult` in `email/cf-customer.ts`,\n * which declares the same field). `delivered` and `queued` are both\n * success for our purposes; `permanent_bounces` and\n * `suppressed_recipients` are per-recipient permanent failures.\n */\nexport interface SendRawResult {\n message_id?: unknown;\n permanent_bounces?: unknown;\n suppressed_recipients?: unknown;\n}\n\n/** A send_raw address list as a lowercase set; non-string entries are dropped. */\nexport function readSendRawAddressList(value: unknown): Set<string> {\n const out = new Set<string>();\n if (Array.isArray(value)) {\n for (const entry of value) {\n if (typeof entry === 'string') {\n out.add(entry.toLowerCase());\n }\n }\n }\n return out;\n}\n\n/**\n * Custom-domain outbound send. Reached from `/send` when the from-address\n * domain is not the platform sender domain.\n *\n * Authorization is the domain mirror, not the slug pin: the api mirrors\n * every `email_domains` row to `email-domain:<domain>` in ROUTING KV, and\n * the send proceeds only when that mirror maps the domain to the CALLING\n * project and the row is `active`. The message then leaves through the\n * CUSTOMER's Cloudflare account \u2014 `POST\n * /accounts/{accountId}/email/sending/send_raw` bearing a credential leased\n * from the api (`email-lease.ts`) \u2014 so DKIM alignment and the daily quota\n * are the customer's own.\n *\n * The platform's abuse and quota controls apply unchanged and run BEFORE\n * the external call: platform-wide routing suspension, the email-only\n * kill-switch, and the burst + monthly counters. The one shared-path gate\n * deliberately absent is the verified-destination allowlist (decision 6):\n * the customer's own Email Sending onboarding lifts Cloudflare's\n * verified-destination gate, and the reputation at stake is theirs.\n */\nasync function sendViaCustomDomain(\n context: Context<ProxyEnv>,\n projectId: string,\n from: string,\n fromDomain: string,\n senderDomain: string,\n recipients: Array<string>,\n raw: Uint8Array,\n requestId: string,\n): Promise<Response> {\n // The envelope is forwarded verbatim to the customer's account, so the\n // printable-ASCII guard runs here for the same reason as on the shared\n // path (case folding must not change the bytes downstream sees).\n if (!/^[\\x21-\\x7e]+$/.test(from)) {\n return context.json(\n {\n ok: false,\n error: { code: 'INVALID_FROM', message: 'from address must be printable ASCII' },\n },\n 403,\n );\n }\n const fromLower = from.toLowerCase();\n\n // The mirror IS the authorization: it names the one project this domain\n // belongs to. A missing row, another project's row, and a row that never\n // reached (or left) `active` all refuse identically. The message names\n // the configured sender domain too: a `from` on another environment's\n // platform zone lands here, and naming the zone is what makes that\n // misconfiguration debuggable.\n const mirror = await readEmailDomainMirror(context.env.ROUTING, fromDomain, { cacheTtl: 60 });\n if (!mirror || mirror.projectId !== projectId || mirror.status !== 'active') {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `from address must be on the configured sender domain (${senderDomain}) or a domain registered to this project`,\n },\n },\n 403,\n );\n }\n if (!mirror.accountId) {\n return context.json(\n {\n ok: false,\n error: { code: 'UPSTREAM_ERROR', message: 'email domain registration is incomplete' },\n },\n 502,\n );\n }\n\n // Pin what the recipient will SEE, exactly as the shared path does: the\n // MIME `From:` must be the envelope sender. The mirror already bounds the\n // domain to this project; this keeps the header from naming a different\n // mailbox on it. Runs before the suspension and quota reads for the same\n // reason as the shared path's pin: no KV work for a request that can\n // never be authorized.\n const mimeFrom = readMimeFromAddrSpec(raw);\n if (!mimeFrom.ok || mimeFrom.addrSpec.toLowerCase() !== fromLower) {\n const detail = mimeFrom.ok\n ? 'the From header address does not match the envelope sender'\n : MIME_FROM_REFUSALS[mimeFrom.reason];\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `mime From must be the envelope sender ${from}: ${detail}`,\n },\n },\n 403,\n );\n }\n\n // The suspension and quota gates below key on the project exactly as the\n // shared path does; the slug mirror is the join to the routing blob the\n // suspension marker lives on. Fail closed the same way when it is missing\n // or malformed.\n const slug = await context.env.ROUTING.get(`email-slug:${projectId}`);\n if (!slug) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'UPSTREAM_ERROR',\n message: 'project slug unknown \u2014 refusing to send',\n },\n },\n 502,\n );\n }\n if (!SLUG_RE.test(slug)) {\n console.error(\n `[email-send] project ${projectId} slug malformed in KV: ${sanitizeForLog(slug, 64)}`,\n );\n return context.json(\n {\n ok: false,\n error: {\n code: 'UPSTREAM_ERROR',\n message: 'project slug malformed in routing',\n },\n },\n 502,\n );\n }\n\n // Platform-wide suspension \u2014 same marker, same codes as the shared path.\n const platformSuspension = await readRoutingSuspension(context.env.ROUTING, slug);\n if (platformSuspension.kind === 'corrupt') {\n console.error(\n `[email-send] project ${projectId} routing blob malformed in KV for slug ${sanitizeForLog(slug, 64)}`,\n );\n return context.json(\n {\n ok: false,\n error: {\n code: 'UPSTREAM_ERROR',\n message: 'project routing entry malformed',\n },\n },\n 502,\n );\n }\n if (platformSuspension.kind === 'suspended') {\n return context.json(\n {\n ok: false,\n error: {\n code: 'QUOTA_EXCEEDED',\n message: `project is suspended (${sanitizeForLog(platformSuspension.reason, 64)})`,\n },\n },\n 200,\n );\n }\n\n // Email-only kill-switch. No cacheTtl, for the same reason as the shared\n // path: an abuse-response control where convergence latency is the point.\n if (await context.env.ROUTING.get(`email-suspended:${projectId}`)) {\n return context.json(\n { ok: false, error: { code: 'QUOTA_EXCEEDED', message: 'project email is suspended' } },\n 200,\n );\n }\n\n // Burst + monthly quota checks against the whole recipient list \u2014 with no\n // allowlist filtering on this path, every recipient counts. Same\n // counters, same limits, same codes as the shared path.\n const now = new Date();\n const burstKey = `email-burst:${projectId}:${minuteBucket(now)}`;\n const burstCurrent = readCounter(await context.env.ROUTING.get(burstKey));\n const burstLimit = await getBurstLimit(context.env.ROUTING, projectId);\n if (burstCurrent + recipients.length > burstLimit) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'QUOTA_EXCEEDED',\n message: `outbound burst limit ${burstLimit}/min exceeded`,\n },\n },\n 429,\n );\n }\n const counterKey = `email-sent:${projectId}:${monthBucket(now)}`;\n const monthCurrent = readCounter(await context.env.ROUTING.get(counterKey));\n const monthLimit = await getMonthlyLimit(context.env.ROUTING, projectId);\n if (monthCurrent + recipients.length > monthLimit) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'QUOTA_EXCEEDED',\n message: `monthly outbound limit ${monthLimit} exceeded`,\n },\n },\n 429,\n );\n }\n\n // send_raw carries the MIME as a JSON string. Decode FATALLY: the\n // framework's builder emits 7-bit-clean MIME, and a body that is not\n // valid UTF-8 would be silently altered by a lenient decode \u2014 refuse it\n // instead. Local validation, so it runs before any quota is burned.\n let mimeMessage: string;\n try {\n mimeMessage = new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(raw);\n } catch {\n return context.json(\n { ok: false, error: { code: 'MIME_ERROR', message: 'mime must be valid UTF-8' } },\n 400,\n );\n }\n\n // Lease the domain's credential from the api. A lease failure is a\n // platform-side condition (the api owns the row's status transitions on\n // real credential failures), so it costs the project no quota \u2014 the\n // counters increment below, ahead of the one external call, the same\n // optimistic increment the shared path uses.\n const lease = await leaseEmailDomainCredential(context.env, fromDomain);\n if (!lease) {\n return context.json(\n {\n ok: false,\n error: { code: 'UPSTREAM_ERROR', message: 'could not lease the domain credential' },\n },\n 502,\n );\n }\n\n await Promise.all([\n context.env.ROUTING.put(counterKey, String(monthCurrent + recipients.length), {\n expirationTtl: monthTtlSeconds(now),\n }).catch((e) => {\n console.error(`[email-send] monthly counter put failed for ${projectId}:`, e);\n }),\n context.env.ROUTING.put(burstKey, String(burstCurrent + recipients.length), {\n expirationTtl: 5 * 60,\n }).catch((e) => {\n console.error(`[email-send] burst counter put failed for ${projectId}:`, e);\n }),\n ]);\n\n // One REST call carries every recipient \u2014 unlike the platform binding's\n // one EmailMessage per recipient. The response's message id is shared by\n // the whole list.\n let failure: { code: string; message: string } | null = null;\n let messageId = '';\n // Per-recipient permanent outcomes from the send_raw result: a recipient\n // on either list was NOT sent to, and reporting it as delivered would\n // tell the framework (and the log) a lie it cannot retry its way out of.\n let bounced = new Set<string>();\n let suppressed = new Set<string>();\n let cfRes: Response | null = null;\n try {\n cfRes = await fetch(\n `https://api.cloudflare.com/client/v4/accounts/${mirror.accountId}/email/sending/send_raw`,\n {\n method: 'POST',\n headers: {\n authorization: `Bearer ${leaseBearer(lease)}`,\n 'content-type': 'application/json',\n },\n body: JSON.stringify({ from, recipients, mime_message: mimeMessage }),\n },\n );\n } catch {\n failure = { code: 'UPSTREAM_ERROR', message: 'email sending request failed' };\n }\n if (cfRes) {\n if (!cfRes.ok) {\n // A refused credential (401/403) evicts the cached lease so the next\n // send re-leases; the api marks the row on its own probe path. CF's\n // error body is never echoed or logged \u2014 it is not ours to surface.\n if (cfRes.status === 401 || cfRes.status === 403) {\n dropEmailDomainLease(fromDomain);\n }\n failure = {\n code: cfRes.status === 429 ? 'QUOTA_EXCEEDED' : 'UPSTREAM_ERROR',\n message: `email sending API returned ${cfRes.status}`,\n };\n } else {\n let data: unknown = null;\n try {\n data = await cfRes.json();\n } catch {\n data = null;\n }\n const success =\n typeof data === 'object' &&\n data !== null &&\n (data as { success?: unknown }).success === true;\n if (!success) {\n failure = { code: 'UPSTREAM_ERROR', message: 'email sending API refused the message' };\n } else {\n const result = (data as { result?: SendRawResult | null }).result;\n const id = result?.message_id;\n messageId = typeof id === 'string' ? id : '';\n bounced = readSendRawAddressList(result?.permanent_bounces);\n suppressed = readSendRawAddressList(result?.suppressed_recipients);\n }\n }\n }\n\n const deliveries: Array<RecipientResult> = [];\n for (const r of recipients) {\n if (failure) {\n deliveries.push({ recipient: r, ok: false, error: failure });\n } else if (bounced.has(r)) {\n deliveries.push({\n recipient: r,\n ok: false,\n error: {\n code: 'UNVERIFIED_DESTINATION',\n message: `recipient '${r}' permanently bounced`,\n },\n });\n } else if (suppressed.has(r)) {\n deliveries.push({\n recipient: r,\n ok: false,\n error: {\n code: 'UNVERIFIED_DESTINATION',\n message: `recipient '${r}' is on the suppression list`,\n },\n });\n } else {\n deliveries.push({ recipient: r, ok: true, messageId });\n }\n }\n\n logSend(projectId, requestId, deliveries);\n\n // Same mid-batch contract as the shared path: any per-recipient failure\n // (bounce, suppression, or a whole-call failure) answers ok:false with\n // the per-recipient list so the caller retries exactly the failed ones.\n if (deliveries.some((d) => !d.ok)) {\n return context.json({ ok: false, deliveries }, 200);\n }\n return context.json({\n ok: true,\n ids: deliveries.map((d) => ({\n recipient: d.recipient,\n messageId: (d as { messageId: string }).messageId,\n })),\n });\n}\n\n// -----------------------------------------------------------------------------\n// Inbound delivery log \u2014 kept here because it's invoked from email-router.ts\n// inside the same worker (bypasses HTTP/auth).\n// -----------------------------------------------------------------------------\n\n/**\n * Inbound delivery log. Inlined here rather than via service binding because\n * the email-router lives in this same worker; routing through env.API would\n * 404 (and earlier did so silently).\n */\nexport async function recordInboundDelivery(\n env: { ROUTING: KVNamespace },\n projectId: string,\n info: { from: string; to: string; subject: string; byteSize: number; status: string },\n): Promise<void> {\n const now = new Date();\n const counterKey = `email-recv:${projectId}:${monthBucket(now)}`;\n const current = readCounter(await env.ROUTING.get(counterKey));\n await env.ROUTING.put(counterKey, String(current + 1), {\n expirationTtl: monthTtlSeconds(now),\n });\n console.log(\n `[email-recv] ${projectId} ${sanitizeForLog(info.from, 320)} -> ${sanitizeForLog(info.to, 320)} ${info.status} (${info.byteSize}B) @${Date.now()} subject=\"${sanitizeForLog(info.subject)}\"`,\n );\n}\n\n// -----------------------------------------------------------------------------\n// Helpers\n// -----------------------------------------------------------------------------\n\ninterface RecipientResult {\n recipient: string;\n ok: boolean;\n messageId?: string;\n error?: { code: string; message: string };\n}\n\n/**\n * Map an error thrown by the platform's `send_email` binding to a\n * framework-facing error code. Mirrors `classifyBindingError` in\n * `void/email` (the framework's own-binding lane): Email Service throws\n * `Error`s carrying a `code` (the `E_*` table in Cloudflare's Workers API\n * reference), and that code is read FIRST \u2014 the message regex below is the\n * fallback for the older, message-only Email Routing sender. Anything else\n * is UPSTREAM_ERROR, which the framework retries.\n *\n * The two sender codes are where the lanes deliberately differ. `from` is\n * pinned to `<slug>[+tag]@<senderDomain>` above, so an\n * `E_SENDER_NOT_VERIFIED` / `E_SENDER_DOMAIN_NOT_AVAILABLE` here means the\n * PLATFORM's mail zone is not onboarded or verified: the tenant's `from`\n * passed the pin and nothing about it is theirs to fix. INVALID_FROM is\n * documented as \"not the project sender\" and as pre-flight, so it would be\n * false on both counts; the send stays UPSTREAM_ERROR (retryable once the\n * platform is repaired) with Cloudflare's message kept, and the code is\n * logged because `logSend` records only ours.\n *\n * UNVERIFIED_DESTINATION is special \u2014 the framework treats it as\n * \"don't retry; the user has to verify the address first.\" A false\n * positive here turns retryable transient errors into permanent\n * non-retries, so the match is intentionally narrow.\n *\n * Anchored to the literal CF phrasing (\"destination address \u2026 not\n * (yet) verified\"), bounded character classes to keep `.*` from\n * jumping across log lines / multi-error stack traces, and a leading\n * `^[^\\n]{0,200}` cap so a long preamble can't drag a tail-of-line\n * \"destination address foo not verified\" into a false positive on a\n * transient upstream error message that happens to mention the same\n * domain or address.\n */\nconst UNVERIFIED_DESTINATION_RE =\n /^[^\\n]{0,200}destination address[^\\n]{0,200}not (?:yet )?verified/i;\n\nfunction classifyUpstream(e: unknown, projectId: string): string {\n const message = e instanceof Error ? e.message : String(e);\n const code =\n typeof (e as { code?: unknown })?.code === 'string' ? (e as { code: string }).code : '';\n switch (code) {\n case 'E_RECIPIENT_NOT_ALLOWED':\n return 'UNVERIFIED_DESTINATION';\n case 'E_RATE_LIMIT_EXCEEDED':\n case 'E_DAILY_LIMIT_EXCEEDED':\n return 'QUOTA_EXCEEDED';\n case 'E_SENDER_NOT_VERIFIED':\n case 'E_SENDER_DOMAIN_NOT_AVAILABLE':\n console.error(\n `[email-send] project ${projectId} send binding refused the platform sender (${code}): ${sanitizeForLog(message)}`,\n );\n return 'UPSTREAM_ERROR';\n default:\n break;\n }\n if (UNVERIFIED_DESTINATION_RE.test(message)) {\n return 'UNVERIFIED_DESTINATION';\n }\n return 'UPSTREAM_ERROR';\n}\n\nfunction logSend(projectId: string, requestId: string, deliveries: Array<RecipientResult>): void {\n for (const d of deliveries) {\n const status = d.ok ? 'sent' : (d.error?.code ?? 'unknown_error');\n const id = d.messageId ?? '';\n console.log(\n `[email-log] ${projectId} ${requestId} ${sanitizeForLog(d.recipient, 320)} ${status} ${id} @${Date.now()}`,\n );\n }\n}\n\n/**\n * Reads `email-allowlist:<projectId>` from ROUTING KV. The API writes a JSON\n * array of lowercased verified addresses on every destination CRUD, on the\n * platform confirmation click, and \u2014 as the repair for a write it swallowed \u2014\n * on a destinations listing that finds the key stale. Never on deploy.\n * cacheTtl bounds per-colo convergence at ~60s.\n */\nasync function readAllowlist(kv: KVNamespace, projectId: string): Promise<Set<string>> {\n const raw = await kv.get(`email-allowlist:${projectId}`, { cacheTtl: 60 });\n if (!raw) {\n return new Set();\n }\n try {\n const arr = JSON.parse(raw) as unknown;\n if (!Array.isArray(arr)) {\n return new Set();\n }\n const out = new Set<string>();\n for (const v of arr) {\n if (typeof v === 'string') {\n out.add(v.toLowerCase());\n }\n }\n return out;\n } catch {\n return new Set();\n }\n}\n\n/**\n * The api's `email_domains` row projected into ROUTING KV at\n * `email-domain:<domain>` (design doc 0078, \"Custom domains on\n * Cloudflare\"). Written on every row create/update, deleted on row delete;\n * the proxy has no database access, so this mirror is its ONLY view of a\n * registered custom domain. `relaySecretSha256` is the sha256 (hex) of the\n * domain's relay secret \u2014 the secret itself never reaches KV.\n *\n * Read by the `/email/relay` auth branch (index.ts), by the custom-domain\n * `/send` fork, and by the reply-sender pin (email-router.ts). The shape is\n * a wire contract with the api (`api/src/email/domains.ts`).\n */\nexport interface EmailDomainMirror {\n projectId: string;\n status: string;\n relaySecretSha256: string;\n relayWorkerName: string | null;\n accountId: string | null;\n zoneId: string | null;\n mode: string | null;\n}\n\n/**\n * Read the mirror for `domain` (already lowercased by the caller). Returns\n * null on absence AND on a malformed entry \u2014 the proxy trusts only the\n * fields it validates, and a poisoned KV value fails closed like a missing\n * one. `cacheTtl` follows the allowlist pattern (~60s per-colo\n * convergence); the relay auth branch reads WITHOUT it so a revoked or\n * rotated secret stops working at KV speed.\n */\nexport async function readEmailDomainMirror(\n kv: KVNamespace,\n domain: string,\n options?: { cacheTtl?: number },\n): Promise<EmailDomainMirror | null> {\n const raw = await kv.get(`email-domain:${domain}`, options);\n if (!raw) {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return null;\n }\n const entry = parsed as Record<string, unknown>;\n if (\n typeof entry.projectId !== 'string' ||\n entry.projectId === '' ||\n typeof entry.status !== 'string' ||\n typeof entry.relaySecretSha256 !== 'string'\n ) {\n return null;\n }\n return {\n projectId: entry.projectId,\n status: entry.status,\n relaySecretSha256: entry.relaySecretSha256,\n relayWorkerName: typeof entry.relayWorkerName === 'string' ? entry.relayWorkerName : null,\n accountId: typeof entry.accountId === 'string' ? entry.accountId : null,\n zoneId: typeof entry.zoneId === 'string' ? entry.zoneId : null,\n mode: typeof entry.mode === 'string' ? entry.mode : null,\n };\n}\n\n/**\n * Defends against poisoned KV values: `parseInt('NaN'|'abc',10)` returns\n * NaN, which would (a) make `NaN > limit` false \u2192 bypass and (b) write\n * literal `\"NaN\"` back if used in arithmetic. Always coerces to a finite\n * non-negative integer, falling back to 0.\n */\nfunction readCounter(raw: string | null): number {\n if (!raw) {\n return 0;\n }\n const n = parseInt(raw, 10);\n return Number.isFinite(n) && n >= 0 ? n : 0;\n}\n\nfunction base64Decode(b64: string): Uint8Array {\n // workerd `atob` is fast for body-sized payloads; fall back to manual\n // decode only when needed.\n const binary = atob(b64);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n out[i] = binary.charCodeAt(i);\n }\n return out;\n}\n\nfunction monthBucket(now: Date): string {\n return `${now.getUTCFullYear()}-${String(now.getUTCMonth() + 1).padStart(2, '0')}`;\n}\n\nfunction minuteBucket(now: Date): string {\n return `${now.getUTCFullYear()}${String(now.getUTCMonth() + 1).padStart(2, '0')}${String(\n now.getUTCDate(),\n ).padStart(2, '0')}T${String(now.getUTCHours()).padStart(2, '0')}${String(\n now.getUTCMinutes(),\n ).padStart(2, '0')}`;\n}\n\n/**\n * Seconds until shortly after the end of the current UTC month (1 hour\n * buffer absorbs late writes around the boundary). KV requires\n * `expirationTtl >= 60`.\n */\nfunction monthTtlSeconds(now: Date): number {\n const endOfMonth = Date.UTC(now.getUTCFullYear(), now.getUTCMonth() + 1, 1, 0, 0, 0, 0);\n const seconds = Math.ceil((endOfMonth - now.getTime()) / 1000) + 60 * 60;\n return Math.max(60, seconds);\n}\n\nasync function getBurstLimit(kv: KVNamespace, projectId: string): Promise<number> {\n const raw = await kv.get(`email-burst-limit:${projectId}`, { cacheTtl: 60 });\n if (raw) {\n const n = parseInt(raw, 10);\n if (Number.isFinite(n) && n > 0) {\n return n;\n }\n }\n return 10;\n}\n\nasync function getMonthlyLimit(kv: KVNamespace, projectId: string): Promise<number> {\n const raw = await kv.get(`email-limit:${projectId}`, { cacheTtl: 60 });\n if (raw) {\n const n = parseInt(raw, 10);\n if (Number.isFinite(n) && n > 0) {\n return n;\n }\n }\n return 200;\n}\n\n/**\n * Platform-internal send endpoint. Used by the api worker to dispatch\n * destination-verification emails: when project A adds an address that\n * a different project already verified via CF, we issue our own\n * confirmation email to the recipient instead of inheriting CF's\n * verification flag.\n *\n * Auth: HMAC of a fixed sentinel string + timestamp + sha256 of\n * (from|to|mimeBase64) under JWT_SECRET. The auth middleware in\n * `index.ts` validates the sentinel + timestamp window; this handler\n * additionally verifies the content-binding hash matches the body\n * fields it actually intends to act on. Without the content binding,\n * a captured platformToken inside the 5-minute skew window could be\n * replayed against a different (from, to, mime) tuple \u2014 the timestamp\n * alone has no relation to what the request asks the proxy to do.\n *\n * Token contract \u2014 the api worker MUST sign:\n * `<sentinel>.<unixSeconds>.<sha256(from|to|mimeBase64) hex>`\n * with HMAC-SHA-256 under `JWT_SECRET`, where `mimeBase64` is the\n * EXACT string sent in the body and the three fields are joined by a\n * literal `|`. The proxy reconstructs and verifies. Mirroring this\n * format is required in `packages/api/src/email/send-verification.ts`.\n * Bumping the contract requires a coordinated proxy + api deploy.\n *\n * Only the proxy and api hold JWT_SECRET \u2014 user workers do not, so this\n * endpoint cannot be reached from a user worker.\n *\n * The `from` address is locked to a single allow-listed sender:\n * `noreply@<EMAIL_SENDER_DOMAIN>`. Earlier revisions trusted the body's\n * `from` and would have let a compromised api worker (or\n * misuse-via-coordinated-bug) send arbitrary platform-branded mail.\n * The verification-email use case is the only legitimate caller and it\n * always sends from `noreply@`; harden by allow-list rather than\n * relying on downstream filters.\n *\n * Body shape (validated below):\n * { platformToken, platformTimestamp, from, to, mimeBase64 }.\n *\n * Quotas, allowlists, and the suspend kill-switch DO NOT apply here:\n * those are per-project guards, and platform verification mail is\n * account-level. Volume is bounded by the api worker's per-project KV\n * rate limit on `POST /destinations`, applied before tokens are issued.\n */\n\n/** The single allowed platform-internal `from` local-part. */\nconst INTERNAL_FROM_LOCAL_PART = 'noreply';\n\napp.post('/internal/send', async (context) => {\n const body = context.get('body');\n\n // Fail closed on missing sender configuration, exactly as `/send` does \u2014\n // otherwise the allow-list below would have no domain to pin against.\n const senderDomain = readSenderDomain(context.env);\n if (!senderDomain) {\n return context.json({ ok: false, error: 'email sender domain is not configured' }, 502);\n }\n\n const from = asString(body.from);\n const to = asString(body.to);\n const mimeBase64 = asString(body.mimeBase64);\n if (!from || !to || !mimeBase64) {\n return context.json({ ok: false, error: 'invalid body' }, 400);\n }\n\n // Pin the platform-internal `from` to a single allow-listed envelope on\n // the configured zone: `noreply@<EMAIL_SENDER_DOMAIN>`.\n // The envelope is forwarded verbatim, so validation has to run on bytes that\n // cannot change under case folding. U+212A KELVIN SIGN lowercases to 'k' and\n // U+0130 to 'i', so a non-ASCII `from` can satisfy a lowercased regex and\n // still reach the shared envelope sender intact. Refuse it before that.\n if (!/^[\\x21-\\x7e]+$/.test(from)) {\n return context.json({ ok: false, error: 'from not allowed for internal send' }, 403);\n }\n if (from.toLowerCase() !== `${INTERNAL_FROM_LOCAL_PART}@${senderDomain}`) {\n return context.json({ ok: false, error: 'from not allowed for internal send' }, 403);\n }\n\n const sendBinding = context.env.SEND_EMAIL;\n if (typeof sendBinding?.send !== 'function') {\n return context.json({ ok: false, error: 'email sending is not configured' }, 502);\n }\n\n let raw: Uint8Array;\n try {\n raw = base64Decode(mimeBase64);\n } catch {\n return context.json({ ok: false, error: 'invalid base64 mime' }, 400);\n }\n if (raw.byteLength > MAX_MIME_BYTES) {\n return context.json({ ok: false, error: 'too large' }, 413);\n }\n\n try {\n const msg = new EmailMessage(from, to, bytesToStream(raw));\n await sendBinding.send(msg);\n return context.json({ ok: true });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(\n `[email-internal] send failed from=${sanitizeForLog(from, 320)} to=${sanitizeForLog(to, 320)}: ${sanitizeForLog(message, 320)}`,\n );\n return context.json({ ok: false, error: 'upstream error' }, 502);\n }\n});\n\nexport { app as email };\n", "import { Hono } from 'hono';\nimport { asString, isQueryValue } from './body.ts';\nimport { dispatchToWorker } from './dispatch.ts';\nimport { resolveResource } from './resolve.ts';\nimport type { ProxyEnv } from './types.ts';\n\nconst CF_API = 'https://api.cloudflare.com/client/v4';\n\nconst kv = new Hono<ProxyEnv>();\n\nkv.post('/get', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/get', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/values/${encodeURIComponent(key)}`,\n { headers: { Authorization: `Bearer ${context.env.CF_API_TOKEN}` } },\n );\n\n if (cfRes.status === 404) {\n return context.json(null);\n }\n\n if (!cfRes.ok) {\n return context.json({ error: 'KV get failed', status: cfRes.status }, 502);\n }\n\n const type = asString(body.type) ?? 'text';\n if (type === 'json') {\n return context.json(await cfRes.json());\n }\n if (type === 'arrayBuffer') {\n return new Response(await cfRes.arrayBuffer(), {\n headers: { 'content-type': 'application/octet-stream' },\n });\n }\n if (type === 'stream') {\n return new Response(cfRes.body, {\n headers: { 'content-type': 'application/octet-stream' },\n });\n }\n // Default: text\n return context.json(await cfRes.text());\n});\n\nkv.post('/put', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/put', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const params = new URLSearchParams();\n if (isQueryValue(body.expiration)) {\n params.set('expiration', String(body.expiration));\n }\n if (isQueryValue(body.expiration_ttl)) {\n params.set('expiration_ttl', String(body.expiration_ttl));\n }\n const queryString = params.toString() ? `?${params.toString()}` : '';\n\n let value: string | ArrayBuffer;\n let contentType = 'text/plain';\n if (body.base64 === true && typeof body.value === 'string') {\n // Decode base64-encoded binary data from the client\n const binary = atob(body.value);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n value = bytes.buffer;\n contentType = 'application/octet-stream';\n } else {\n value = typeof body.value === 'string' ? body.value : JSON.stringify(body.value);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/values/${encodeURIComponent(key)}${queryString}`,\n {\n method: 'PUT',\n headers: {\n Authorization: `Bearer ${context.env.CF_API_TOKEN}`,\n 'Content-Type': contentType,\n },\n body: value,\n },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'KV put failed', status: cfRes.status }, 502);\n }\n\n return context.json({ success: true });\n});\n\nkv.post('/delete', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/delete', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/values/${encodeURIComponent(key)}`,\n {\n method: 'DELETE',\n headers: { Authorization: `Bearer ${context.env.CF_API_TOKEN}` },\n },\n );\n\n // 404 is fine \u2014 delete is idempotent\n if (!cfRes.ok && cfRes.status !== 404) {\n return context.json({ error: 'KV delete failed', status: cfRes.status }, 502);\n }\n\n return context.json({ success: true });\n});\n\nkv.post('/list', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding) {\n return context.json({ error: 'binding required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/list', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const params = new URLSearchParams();\n const prefix = asString(body.prefix);\n if (prefix) {\n params.set('prefix', prefix);\n }\n if (isQueryValue(body.limit)) {\n params.set('limit', String(body.limit));\n }\n const cursor = asString(body.cursor);\n if (cursor) {\n params.set('cursor', cursor);\n }\n const queryString = params.toString() ? `?${params.toString()}` : '';\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/keys${queryString}`,\n { headers: { Authorization: `Bearer ${context.env.CF_API_TOKEN}` } },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'KV list failed', status: cfRes.status }, 502);\n }\n\n const data = (await cfRes.json()) as {\n result?: ReadonlyArray<{ name: string }>;\n result_info?: { cursor?: string };\n };\n return context.json({\n keys: data.result ?? [],\n list_complete: !data.result_info?.cursor,\n cursor: data.result_info?.cursor ?? null,\n });\n});\n\nexport { kv };\n", "// Keep these wire values aligned with @void/platform. This private runtime is\n// bundled into that package, but must not import the package being built.\nexport const PLATFORM_DISABLED_KEY = '__void/platform/disabled/v1';\nexport const PLATFORM_DISABLED_VALUE = 'disabled';\n", "import { Hono } from 'hono';\nimport { asString, isQueryValue } from './body.ts';\nimport { dispatchToWorker } from './dispatch.ts';\nimport { resolveResource } from './resolve.ts';\nimport type { ProxyEnv } from './types.ts';\n\nconst CF_API = 'https://api.cloudflare.com/client/v4';\n\nconst r2 = new Hono<ProxyEnv>();\n\nfunction cfHeaders(token: string) {\n return { Authorization: `Bearer ${token}` };\n}\n\nr2.post('/get', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/get', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n { headers: cfHeaders(context.env.CF_API_TOKEN) },\n );\n\n if (cfRes.status === 404) {\n return context.json(null);\n }\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 get failed', status: cfRes.status }, 502);\n }\n\n // Stream the object body back, preserve metadata in headers\n const headers = new Headers();\n headers.set('content-type', cfRes.headers.get('content-type') ?? 'application/octet-stream');\n if (cfRes.headers.has('content-length')) {\n headers.set('content-length', cfRes.headers.get('content-length')!);\n }\n if (cfRes.headers.has('etag')) {\n headers.set('etag', cfRes.headers.get('etag')!);\n }\n if (cfRes.headers.has('last-modified')) {\n headers.set('last-modified', cfRes.headers.get('last-modified')!);\n }\n\n return new Response(cfRes.body, { headers });\n});\n\nr2.on('POST', ['/put', '/put-conditional'], async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n const base64 = asString(body.base64);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const conditional = body.onlyIf !== undefined || context.req.path.endsWith('/put-conditional');\n const dispatchRes = await dispatchToWorker(\n context.env,\n projectId,\n conditional ? '/r2/put-conditional' : '/r2/put',\n body,\n );\n if (dispatchRes) {\n return dispatchRes;\n }\n\n if (conditional) {\n return context.json(\n {\n error:\n 'R2 conditional writes require an active deployment with the current Void remote-binding handler. Update your Void platform and redeploy the project.',\n },\n 501,\n );\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n // Decode base64 value from JSON body, or use text value\n const data = base64\n ? Uint8Array.from(atob(base64), (ch) => ch.charCodeAt(0))\n : new TextEncoder().encode((body.value as string) ?? '');\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n {\n method: 'PUT',\n headers: {\n ...cfHeaders(context.env.CF_API_TOKEN),\n 'Content-Type': asString(body.contentType) ?? 'application/octet-stream',\n },\n body: data,\n },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 put failed', status: cfRes.status }, 502);\n }\n\n return context.json({ success: true });\n});\n\nr2.post('/delete', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding) {\n return context.json({ error: 'binding required' }, 400);\n }\n\n const keys =\n Array.isArray(body.keys) && body.keys.every((key): key is string => typeof key === 'string')\n ? body.keys\n : typeof body.key === 'string'\n ? [body.key]\n : [];\n\n if (keys.length === 0) {\n return context.json({ error: 'key or keys required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/delete', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n for (const key of keys) {\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n {\n method: 'DELETE',\n headers: cfHeaders(context.env.CF_API_TOKEN),\n },\n );\n if (!cfRes.ok && cfRes.status !== 404) {\n return context.json({ error: 'R2 delete failed', status: cfRes.status }, 502);\n }\n }\n\n return context.json({ success: true });\n});\n\nr2.post('/list', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding) {\n return context.json({ error: 'binding required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/list', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const params = new URLSearchParams();\n const prefix = asString(body.prefix);\n if (prefix) {\n params.set('prefix', prefix);\n }\n if (isQueryValue(body.limit)) {\n params.set('per_page', String(body.limit));\n }\n const cursor = asString(body.cursor);\n if (cursor) {\n params.set('cursor', cursor);\n }\n const delimiter = asString(body.delimiter);\n if (delimiter) {\n params.set('delimiter', delimiter);\n }\n const queryString = params.toString() ? `?${params.toString()}` : '';\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects${queryString}`,\n { headers: cfHeaders(context.env.CF_API_TOKEN) },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 list failed', status: cfRes.status }, 502);\n }\n\n const data = (await cfRes.json()) as {\n result?: ReadonlyArray<{ key: string; size: number; last_modified?: string }>;\n result_info?: { cursor?: string };\n };\n\n return context.json({\n objects: (data.result ?? []).map((object) => ({\n key: object.key,\n size: object.size,\n lastModified: object.last_modified ?? '',\n })),\n truncated: !!data.result_info?.cursor,\n cursor: data.result_info?.cursor ?? null,\n });\n});\n\nr2.post('/head', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/head', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n {\n method: 'HEAD',\n headers: cfHeaders(context.env.CF_API_TOKEN),\n },\n );\n\n if (cfRes.status === 404) {\n return context.json(null);\n }\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 head failed', status: cfRes.status }, 502);\n }\n\n return context.json({\n key,\n size: parseInt(cfRes.headers.get('content-length') ?? '0'),\n etag: cfRes.headers.get('etag') ?? '',\n lastModified: cfRes.headers.get('last-modified') ?? '',\n contentType: cfRes.headers.get('content-type') ?? 'application/octet-stream',\n });\n});\n\nexport { r2 };\n", "import { Hono } from 'hono';\nimport type { ProxyEnv } from './types.ts';\n\nconst app = new Hono<ProxyEnv>();\n\n/**\n * Forward revalidation requests to the API via service binding.\n *\n * The auth middleware has already verified the HMAC token and set projectId.\n * We forward the token so the API can verify it independently.\n */\napp.post('/', async (context) => {\n const projectId = context.get('projectId');\n const body = context.get('body');\n\n const response = await context.env.API.fetch(`https://api/internal/revalidate/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': body.aiToken as string,\n },\n body: JSON.stringify({\n paths: body.paths,\n all: body.all,\n }),\n });\n\n return new Response(response.body, {\n status: response.status,\n headers: response.headers,\n });\n});\n\nexport { app as revalidate };\n"],
6
- "mappings": "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",
7
- "names": ["init_performance", "init_performance", "PerformanceMark", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "match", "decoder", "raw", "init_performance", "init_performance", "init_performance", "app", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "Node", "_Node", "Node", "Hono", "init_performance", "init_performance", "init_performance", "Hono", "init_performance", "init_performance", "init_performance", "init_performance", "hmacSign", "encoder", "cachedSignKey", "cachedKeySecret", "getSignKey", "Hono", "init_performance", "init_performance", "init_performance", "EmailMessage", "init_performance", "hmacSign", "encoder", "cachedSignKey", "cachedKeySecret", "getSignKey", "init_performance", "Hono", "raw", "kv", "CONTROL_CHARS_RE", "isValidEmailSyntax", "readCounter", "raw", "monthBucket", "minuteBucket", "monthTtlSeconds", "readAllowlist", "kv", "getBurstLimit", "getMonthlyLimit", "EmailMessage", "app", "Hono", "raw", "LF", "CR", "pieces", "init_performance", "CF_API", "Hono", "init_performance", "init_performance", "CF_API", "Hono", "init_performance", "app", "Hono", "app", "Hono", "encoder", "cachedKeySecret"]
5
+ "sourcesContent": ["/* @__NO_SIDE_EFFECTS__ */\nexport function rawHeaders(headers) {\n\tconst rawHeaders = [];\n\tfor (const key in headers) {\n\t\tif (Array.isArray(headers[key])) {\n\t\t\tfor (const h of headers[key]) {\n\t\t\t\trawHeaders.push(key, h);\n\t\t\t}\n\t\t} else {\n\t\t\trawHeaders.push(key, headers[key]);\n\t\t}\n\t}\n\treturn rawHeaders;\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function mergeFns(...functions) {\n\treturn function(...args) {\n\t\tfor (const fn of functions) {\n\t\t\tfn(...args);\n\t\t}\n\t};\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function createNotImplementedError(name) {\n\treturn new Error(`[unenv] ${name} is not implemented yet!`);\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function notImplemented(name) {\n\tconst fn = () => {\n\t\tthrow createNotImplementedError(name);\n\t};\n\treturn Object.assign(fn, { __unenv__: true });\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function notImplementedAsync(name) {\n\tconst fn = notImplemented(name);\n\tfn.__promisify__ = () => notImplemented(name + \".__promisify__\");\n\tfn.native = fn;\n\treturn fn;\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function notImplementedClass(name) {\n\treturn class {\n\t\t__unenv__ = true;\n\t\tconstructor() {\n\t\t\tthrow new Error(`[unenv] ${name} is not implemented yet!`);\n\t\t}\n\t};\n}\n", "import { createNotImplementedError } from \"../../../_internal/utils.mjs\";\nconst _timeOrigin = globalThis.performance?.timeOrigin ?? Date.now();\nconst _performanceNow = globalThis.performance?.now ? globalThis.performance.now.bind(globalThis.performance) : () => Date.now() - _timeOrigin;\nconst nodeTiming = {\n\tname: \"node\",\n\tentryType: \"node\",\n\tstartTime: 0,\n\tduration: 0,\n\tnodeStart: 0,\n\tv8Start: 0,\n\tbootstrapComplete: 0,\n\tenvironment: 0,\n\tloopStart: 0,\n\tloopExit: 0,\n\tidleTime: 0,\n\tuvMetricsInfo: {\n\t\tloopCount: 0,\n\t\tevents: 0,\n\t\teventsWaiting: 0\n\t},\n\tdetail: undefined,\n\ttoJSON() {\n\t\treturn this;\n\t}\n};\n// PerformanceEntry\nexport class PerformanceEntry {\n\t__unenv__ = true;\n\tdetail;\n\tentryType = \"event\";\n\tname;\n\tstartTime;\n\tconstructor(name, options) {\n\t\tthis.name = name;\n\t\tthis.startTime = options?.startTime || _performanceNow();\n\t\tthis.detail = options?.detail;\n\t}\n\tget duration() {\n\t\treturn _performanceNow() - this.startTime;\n\t}\n\ttoJSON() {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tentryType: this.entryType,\n\t\t\tstartTime: this.startTime,\n\t\t\tduration: this.duration,\n\t\t\tdetail: this.detail\n\t\t};\n\t}\n}\n// PerformanceMark\nexport const PerformanceMark = class PerformanceMark extends PerformanceEntry {\n\tentryType = \"mark\";\n\tconstructor() {\n\t\t// @ts-ignore\n\t\tsuper(...arguments);\n\t}\n\tget duration() {\n\t\treturn 0;\n\t}\n};\n// PerformanceMark\nexport class PerformanceMeasure extends PerformanceEntry {\n\tentryType = \"measure\";\n}\n// PerformanceResourceTiming\nexport class PerformanceResourceTiming extends PerformanceEntry {\n\tentryType = \"resource\";\n\tserverTiming = [];\n\tconnectEnd = 0;\n\tconnectStart = 0;\n\tdecodedBodySize = 0;\n\tdomainLookupEnd = 0;\n\tdomainLookupStart = 0;\n\tencodedBodySize = 0;\n\tfetchStart = 0;\n\tinitiatorType = \"\";\n\tname = \"\";\n\tnextHopProtocol = \"\";\n\tredirectEnd = 0;\n\tredirectStart = 0;\n\trequestStart = 0;\n\tresponseEnd = 0;\n\tresponseStart = 0;\n\tsecureConnectionStart = 0;\n\tstartTime = 0;\n\ttransferSize = 0;\n\tworkerStart = 0;\n\tresponseStatus = 0;\n}\n// PerformanceObserverEntryList\nexport class PerformanceObserverEntryList {\n\t__unenv__ = true;\n\tgetEntries() {\n\t\treturn [];\n\t}\n\tgetEntriesByName(_name, _type) {\n\t\treturn [];\n\t}\n\tgetEntriesByType(type) {\n\t\treturn [];\n\t}\n}\n// Performance\nexport class Performance {\n\t__unenv__ = true;\n\ttimeOrigin = _timeOrigin;\n\teventCounts = new Map();\n\t_entries = [];\n\t_resourceTimingBufferSize = 0;\n\tnavigation = undefined;\n\ttiming = undefined;\n\ttimerify(_fn, _options) {\n\t\tthrow createNotImplementedError(\"Performance.timerify\");\n\t}\n\tget nodeTiming() {\n\t\treturn nodeTiming;\n\t}\n\teventLoopUtilization() {\n\t\treturn {};\n\t}\n\tmarkResourceTiming() {\n\t\t// TODO: create a new PerformanceResourceTiming entry\n\t\t// so that performance.getEntries, getEntriesByName, and getEntriesByType return it\n\t\t// see: https://nodejs.org/api/perf_hooks.html#performancemarkresourcetimingtiminginfo-requestedurl-initiatortype-global-cachemode-bodyinfo-responsestatus-deliverytype\n\t\treturn new PerformanceResourceTiming(\"\");\n\t}\n\tonresourcetimingbufferfull = null;\n\tnow() {\n\t\t// https://developer.mozilla.org/en-US/docs/Web/API/Performance/now\n\t\tif (this.timeOrigin === _timeOrigin) {\n\t\t\treturn _performanceNow();\n\t\t}\n\t\treturn Date.now() - this.timeOrigin;\n\t}\n\tclearMarks(markName) {\n\t\tthis._entries = markName ? this._entries.filter((e) => e.name !== markName) : this._entries.filter((e) => e.entryType !== \"mark\");\n\t}\n\tclearMeasures(measureName) {\n\t\tthis._entries = measureName ? this._entries.filter((e) => e.name !== measureName) : this._entries.filter((e) => e.entryType !== \"measure\");\n\t}\n\tclearResourceTimings() {\n\t\tthis._entries = this._entries.filter((e) => e.entryType !== \"resource\" || e.entryType !== \"navigation\");\n\t}\n\tgetEntries() {\n\t\treturn this._entries;\n\t}\n\tgetEntriesByName(name, type) {\n\t\treturn this._entries.filter((e) => e.name === name && (!type || e.entryType === type));\n\t}\n\tgetEntriesByType(type) {\n\t\treturn this._entries.filter((e) => e.entryType === type);\n\t}\n\tmark(name, options) {\n\t\t// @ts-expect-error constructor is not protected\n\t\tconst entry = new PerformanceMark(name, options);\n\t\tthis._entries.push(entry);\n\t\treturn entry;\n\t}\n\tmeasure(measureName, startOrMeasureOptions, endMark) {\n\t\tlet start;\n\t\tlet end;\n\t\tif (typeof startOrMeasureOptions === \"string\") {\n\t\t\tstart = this.getEntriesByName(startOrMeasureOptions, \"mark\")[0]?.startTime;\n\t\t\tend = this.getEntriesByName(endMark, \"mark\")[0]?.startTime;\n\t\t} else {\n\t\t\tstart = Number.parseFloat(startOrMeasureOptions?.start) || this.now();\n\t\t\tend = Number.parseFloat(startOrMeasureOptions?.end) || this.now();\n\t\t}\n\t\tconst entry = new PerformanceMeasure(measureName, {\n\t\t\tstartTime: start,\n\t\t\tdetail: {\n\t\t\t\tstart,\n\t\t\t\tend\n\t\t\t}\n\t\t});\n\t\tthis._entries.push(entry);\n\t\treturn entry;\n\t}\n\tsetResourceTimingBufferSize(maxSize) {\n\t\tthis._resourceTimingBufferSize = maxSize;\n\t}\n\taddEventListener(type, listener, options) {\n\t\tthrow createNotImplementedError(\"Performance.addEventListener\");\n\t}\n\tremoveEventListener(type, listener, options) {\n\t\tthrow createNotImplementedError(\"Performance.removeEventListener\");\n\t}\n\tdispatchEvent(event) {\n\t\tthrow createNotImplementedError(\"Performance.dispatchEvent\");\n\t}\n\ttoJSON() {\n\t\treturn this;\n\t}\n}\n// PerformanceObserver\nexport class PerformanceObserver {\n\t__unenv__ = true;\n\tstatic supportedEntryTypes = [];\n\t_callback = null;\n\tconstructor(callback) {\n\t\tthis._callback = callback;\n\t}\n\ttakeRecords() {\n\t\treturn [];\n\t}\n\tdisconnect() {\n\t\tthrow createNotImplementedError(\"PerformanceObserver.disconnect\");\n\t}\n\tobserve(options) {\n\t\tthrow createNotImplementedError(\"PerformanceObserver.observe\");\n\t}\n\tbind(fn) {\n\t\treturn fn;\n\t}\n\trunInAsyncScope(fn, thisArg, ...args) {\n\t\treturn fn.call(thisArg, ...args);\n\t}\n\tasyncId() {\n\t\treturn 0;\n\t}\n\ttriggerAsyncId() {\n\t\treturn 0;\n\t}\n\temitDestroy() {\n\t\treturn this;\n\t}\n}\n// workerd implements a subset of globalThis.performance (as of last check, only timeOrigin set to 0 + now() implemented)\n// We already use performance.now() from globalThis.performance, if provided (see top of this file)\n// If we detect this condition, we can just use polyfill instead.\nexport const performance = globalThis.performance && \"addEventListener\" in globalThis.performance ? globalThis.performance : new Performance();\n", "import {\n performance,\n Performance,\n PerformanceEntry,\n PerformanceMark,\n PerformanceMeasure,\n PerformanceObserver,\n PerformanceObserverEntryList,\n PerformanceResourceTiming\n} from \"node:perf_hooks\";\nif (!(\"__unenv__\" in performance)) {\n const proto = Performance.prototype;\n for (const key of Object.getOwnPropertyNames(proto)) {\n if (key !== \"constructor\" && !(key in performance)) {\n const desc = Object.getOwnPropertyDescriptor(proto, key);\n if (desc) {\n Object.defineProperty(performance, key, desc);\n }\n }\n }\n}\nglobalThis.performance = performance;\nglobalThis.Performance = Performance;\nglobalThis.PerformanceEntry = PerformanceEntry;\nglobalThis.PerformanceMark = PerformanceMark;\nglobalThis.PerformanceMeasure = PerformanceMeasure;\nglobalThis.PerformanceObserver = PerformanceObserver;\nglobalThis.PerformanceObserverEntryList = PerformanceObserverEntryList;\nglobalThis.PerformanceResourceTiming = PerformanceResourceTiming;\n", "//#region src/email-protocol.ts\n/** Worker-safe wire contract shared by the platform gateway and tenant entry. */\nconst EMAIL_PROTOCOL_VERSION = 1;\nconst EMAIL_RECEIPT_PATH = \"/__void/email/receipt/v1\";\nconst EMAIL_MAX_ACTIONS = 100;\nconst EMAIL_MAX_METADATA_BYTES = 8192;\nconst EMAIL_MAX_RESPONSE_BYTES = 8388608;\nconst EMAIL_MAX_REPLY_BYTES = 5242880;\nconst EMAIL_MAX_INBOUND_BYTES = 10485760;\nconst EMAIL_MAX_INBOUND_HEADERS = 1024;\nconst EMAIL_MAX_INBOUND_HEADER_BYTES = 131072;\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder(\"utf-8\", { fatal: true });\nfunction assertFlatJson(bytes, maxDepth, maxFields) {\n\tlet depth = 0;\n\tlet fields = 0;\n\tlet quoted = false;\n\tlet escaped = false;\n\tfor (const byte of bytes) if (quoted) {\n\t\tif (escaped) escaped = false;\n\t\telse if (byte === 92) escaped = true;\n\t\telse if (byte === 34) quoted = false;\n\t} else if (byte === 34) quoted = true;\n\telse if (byte === 123 || byte === 91) {\n\t\tif (++depth > maxDepth) throw new Error(\"email metadata too deep\");\n\t} else if (byte === 125 || byte === 93) {\n\t\tif (--depth < 0) throw new Error(\"invalid email metadata\");\n\t} else if (byte === 58 && ++fields > maxFields) throw new Error(\"too many email metadata fields\");\n\tif (quoted || depth !== 0) throw new Error(\"invalid email metadata\");\n}\nfunction encodeEmailEnvelope(envelope) {\n\tconst metadata = encoder.encode(JSON.stringify({\n\t\tfrom: envelope.from,\n\t\tto: envelope.to,\n\t\theaders: envelope.headers,\n\t\trawSize: envelope.rawSize,\n\t\t...envelope.viaDomain ? { viaDomain: envelope.viaDomain } : {}\n\t}));\n\tif (metadata.byteLength > 131072 || envelope.raw.byteLength > 10485760) throw new Error(\"email envelope too large\");\n\tconst bytes = new Uint8Array(4 + metadata.byteLength + envelope.raw.byteLength);\n\tnew DataView(bytes.buffer).setUint32(0, metadata.byteLength);\n\tbytes.set(metadata, 4);\n\tbytes.set(envelope.raw, 4 + metadata.byteLength);\n\treturn bytes;\n}\nasync function readEmailEnvelope(stream, deadlineMs = 15e3) {\n\tif (!stream) throw new Error(\"missing email envelope\");\n\tconst reader = stream.getReader();\n\tconst limit = 10616836;\n\tlet bytes = /* @__PURE__ */ new Uint8Array(1024);\n\tlet total = 0;\n\tconst deadline = Date.now() + deadlineMs;\n\ttry {\n\t\tfor (;;) {\n\t\t\tconst remaining = deadline - Date.now();\n\t\t\tif (remaining <= 0) throw new Error(\"email envelope timeout\");\n\t\t\tlet timer;\n\t\t\tconst chunk = await Promise.race([reader.read(), new Promise((_, reject) => {\n\t\t\t\ttimer = setTimeout(() => reject(/* @__PURE__ */ new Error(\"email envelope timeout\")), remaining);\n\t\t\t})]).finally(() => {\n\t\t\t\tif (timer !== void 0) clearTimeout(timer);\n\t\t\t});\n\t\t\tif (chunk.done) break;\n\t\t\tconst nextTotal = total + chunk.value.byteLength;\n\t\t\tif (nextTotal > limit) throw new Error(\"email envelope too large\");\n\t\t\tif (nextTotal > bytes.byteLength) {\n\t\t\t\tlet capacity = bytes.byteLength;\n\t\t\t\twhile (capacity < nextTotal) capacity = Math.min(limit, capacity * 2);\n\t\t\t\tconst grown = new Uint8Array(capacity);\n\t\t\t\tgrown.set(bytes.subarray(0, total));\n\t\t\t\tbytes = grown;\n\t\t\t}\n\t\t\tbytes.set(chunk.value, total);\n\t\t\ttotal = nextTotal;\n\t\t}\n\t} catch (error) {\n\t\treader.cancel().catch(() => {});\n\t\tthrow error;\n\t} finally {\n\t\ttry {\n\t\t\treader.releaseLock();\n\t\t} catch {}\n\t}\n\tif (total < 4) throw new Error(\"truncated email envelope\");\n\tconst metadataLength = new DataView(bytes.buffer).getUint32(0);\n\tif (metadataLength > 131072 || total < 4 + metadataLength) throw new Error(\"invalid email envelope\");\n\tconst metadataBytes = bytes.subarray(4, 4 + metadataLength);\n\tassertFlatJson(metadataBytes, 2, 1032);\n\tconst metadata = JSON.parse(decoder.decode(metadataBytes));\n\tif (!metadata || typeof metadata !== \"object\" || Array.isArray(metadata)) throw new Error(\"invalid email envelope\");\n\tconst value = metadata;\n\tconst raw = bytes.subarray(4 + metadataLength, total);\n\tif (raw.byteLength > 10485760 || typeof value.from !== \"string\" || value.from.length > 320 || typeof value.to !== \"string\" || value.to.length > 320 || typeof value.rawSize !== \"number\" || value.rawSize !== raw.byteLength || !value.headers || typeof value.headers !== \"object\" || Array.isArray(value.headers) || Object.keys(value.headers).length > 1024 || Object.values(value.headers).some((header) => typeof header !== \"string\") || value.viaDomain !== void 0 && (typeof value.viaDomain !== \"string\" || value.viaDomain.length > 253)) throw new Error(\"invalid email envelope\");\n\treturn {\n\t\tfrom: value.from,\n\t\tto: value.to,\n\t\theaders: value.headers,\n\t\traw,\n\t\trawSize: raw.byteLength,\n\t\t...value.viaDomain ? { viaDomain: value.viaDomain } : {}\n\t};\n}\nfunction base64url(bytes) {\n\tlet binary = \"\";\n\tfor (const byte of bytes) binary += String.fromCharCode(byte);\n\treturn btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replaceAll(\"=\", \"\");\n}\nfunction unbase64url(value) {\n\tif (!/^[A-Za-z0-9_-]+$/.test(value) || value.length > 1024) throw new Error(\"invalid receipt\");\n\tconst binary = atob(value.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\") + \"=\".repeat((4 - value.length % 4) % 4));\n\treturn Uint8Array.from(binary, (char) => char.charCodeAt(0));\n}\nasync function receiptKey(secret, usage) {\n\tif (!secret) throw new Error(\"Email signing key is not configured\");\n\treturn crypto.subtle.importKey(\"raw\", encoder.encode(secret), {\n\t\tname: \"HMAC\",\n\t\thash: \"SHA-256\"\n\t}, false, [usage]);\n}\nasync function signEmailReceipt(claims, signingSecret) {\n\tconst payload = encoder.encode(JSON.stringify(claims));\n\tconst signature = new Uint8Array(await crypto.subtle.sign(\"HMAC\", await receiptKey(signingSecret, \"sign\"), payload));\n\treturn `${base64url(payload)}.${base64url(signature)}`;\n}\nasync function verifyEmailReceipt(token, signingSecret, expected, now = Date.now()) {\n\ttry {\n\t\tif (token.length > 1536) return null;\n\t\tconst parts = token.split(\".\");\n\t\tif (parts.length !== 2) return null;\n\t\tconst payload = unbase64url(parts[0]);\n\t\tconst signature = unbase64url(parts[1]);\n\t\tif (payload.byteLength > 768 || signature.byteLength !== 32) return null;\n\t\tif (!await crypto.subtle.verify(\"HMAC\", await receiptKey(signingSecret, \"verify\"), Uint8Array.from(signature), Uint8Array.from(payload))) return null;\n\t\tconst claims = JSON.parse(decoder.decode(payload));\n\t\tif (typeof claims !== \"object\" || claims === null) return null;\n\t\tconst value = claims;\n\t\tif (value.version !== 1 || typeof value.receiptId !== \"string\" || !/^[a-f0-9-]{16,64}$/.test(value.receiptId) || value.projectId !== expected.projectId || value.deploymentId !== expected.deploymentId || value.recipient !== expected.recipient || typeof value.expiresAt !== \"number\" || !Number.isSafeInteger(value.expiresAt) || value.expiresAt < now || value.expiresAt > now + 6e4) return null;\n\t\treturn value;\n\t} catch {\n\t\treturn null;\n\t}\n}\nfunction frame(kind, payload) {\n\tconst bytes = new Uint8Array(5 + payload.byteLength);\n\tnew DataView(bytes.buffer).setUint32(0, payload.byteLength);\n\tbytes[4] = kind;\n\tbytes.set(payload, 5);\n\treturn bytes;\n}\nfunction encodeEmailActionMetadata(action) {\n\treturn encoder.encode(JSON.stringify(action.type === \"reply\" ? {\n\t\ttype: action.type,\n\t\tfrom: action.from,\n\t\tto: action.to\n\t} : action));\n}\nfunction emailActionWireSizeFromMetadata(action, metadata) {\n\treturn 5 + metadata.byteLength + (action.type === \"reply\" ? 5 + action.raw.byteLength : 0);\n}\nfunction encodeEmailActions(actions) {\n\tif (actions.length > 100) throw new Error(\"too many email actions\");\n\tlet index = 0;\n\tlet pending = null;\n\tlet total = 0;\n\treturn new ReadableStream({ pull(controller) {\n\t\tif (pending) {\n\t\t\tcontroller.enqueue(pending);\n\t\t\tpending = null;\n\t\t\treturn;\n\t\t}\n\t\tif (index === actions.length) {\n\t\t\tcontroller.enqueue(frame(0, /* @__PURE__ */ new Uint8Array()));\n\t\t\tcontroller.close();\n\t\t\treturn;\n\t\t}\n\t\tconst action = actions[index++];\n\t\tconst metadata = encodeEmailActionMetadata(action);\n\t\tif (metadata.byteLength > 8192) throw new Error(\"email action metadata too large\");\n\t\tif (action.type === \"reply\") {\n\t\t\tif (action.raw.byteLength > 5242880) throw new Error(\"email reply too large\");\n\t\t\tpending = frame(2, action.raw);\n\t\t}\n\t\ttotal += emailActionWireSizeFromMetadata(action, metadata);\n\t\tif (total + 5 > 8388608) throw new Error(\"email actions too large\");\n\t\tcontroller.enqueue(frame(1, metadata));\n\t} });\n}\n/** Read each frame with fixed ceilings before parsing metadata or allocating a reply. */\nasync function readEmailActions(stream, deadlineMs = 15e3) {\n\tconst reader = stream.getReader();\n\tconst actions = [];\n\tlet stash = /* @__PURE__ */ new Uint8Array(0);\n\tlet total = 0;\n\tconst deadline = Date.now() + deadlineMs;\n\tasync function readChunk() {\n\t\tconst remaining = deadline - Date.now();\n\t\tif (remaining <= 0) throw new Error(\"email response timeout\");\n\t\tlet timer;\n\t\treturn Promise.race([reader.read(), new Promise((_, reject) => {\n\t\t\ttimer = setTimeout(() => reject(/* @__PURE__ */ new Error(\"email response timeout\")), remaining);\n\t\t})]).finally(() => {\n\t\t\tif (timer !== void 0) clearTimeout(timer);\n\t\t});\n\t}\n\tasync function exact(length) {\n\t\tconst result = new Uint8Array(length);\n\t\tlet offset = 0;\n\t\twhile (offset < length) {\n\t\t\tif (stash.byteLength === 0) {\n\t\t\t\tconst chunk = await readChunk();\n\t\t\t\tif (chunk.done) throw new Error(\"truncated email response\");\n\t\t\t\ttotal += chunk.value.byteLength;\n\t\t\t\tif (total > 8388608) throw new Error(\"email response too large\");\n\t\t\t\tstash = chunk.value;\n\t\t\t}\n\t\t\tconst used = Math.min(stash.byteLength, length - offset);\n\t\t\tresult.set(stash.subarray(0, used), offset);\n\t\t\tstash = stash.subarray(used);\n\t\t\toffset += used;\n\t\t}\n\t\treturn result;\n\t}\n\ttry {\n\t\tfor (;;) {\n\t\t\tconst head = await exact(5);\n\t\t\tconst length = new DataView(head.buffer).getUint32(0);\n\t\t\tconst kind = head[4];\n\t\t\tif (kind === 0) {\n\t\t\t\tif (length !== 0 || stash.byteLength !== 0) throw new Error(\"invalid email response tail\");\n\t\t\t\tif (!(await readChunk()).done) throw new Error(\"invalid email response tail\");\n\t\t\t\tif (actions.some((action) => action.type === \"reject\") && actions.length !== 1) throw new Error(\"email reject cannot accompany delivery actions\");\n\t\t\t\treturn actions;\n\t\t\t}\n\t\t\tif (kind !== 1 || length > 8192 || actions.length >= 100) throw new Error(\"invalid email action frame\");\n\t\t\tconst metadataBytes = await exact(length);\n\t\t\tassertFlatJson(metadataBytes, 2, 40);\n\t\t\tconst value = JSON.parse(decoder.decode(metadataBytes));\n\t\t\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"invalid email action\");\n\t\t\tconst action = value;\n\t\t\tif (action.type === \"reply\") {\n\t\t\t\tif (typeof action.from !== \"string\" || typeof action.to !== \"string\" || Object.keys(action).length !== 3) throw new Error(\"invalid email reply\");\n\t\t\t\tconst rawHead = await exact(5);\n\t\t\t\tconst rawLength = new DataView(rawHead.buffer).getUint32(0);\n\t\t\t\tif (rawHead[4] !== 2 || rawLength > 5242880) throw new Error(\"invalid email reply frame\");\n\t\t\t\tactions.push({\n\t\t\t\t\ttype: \"reply\",\n\t\t\t\t\tfrom: action.from,\n\t\t\t\t\tto: action.to,\n\t\t\t\t\traw: await exact(rawLength)\n\t\t\t\t});\n\t\t\t} else if (action.type === \"forward\") {\n\t\t\t\tif (typeof action.to !== \"string\" || Object.keys(action).length > 3 || action.headers !== void 0 && (typeof action.headers !== \"object\" || action.headers === null || Array.isArray(action.headers))) throw new Error(\"invalid email forward\");\n\t\t\t\tconst headers = action.headers;\n\t\t\t\tif (headers && (Object.keys(headers).length > 32 || Object.values(headers).some((v) => typeof v !== \"string\"))) throw new Error(\"invalid email headers\");\n\t\t\t\tactions.push({\n\t\t\t\t\ttype: \"forward\",\n\t\t\t\t\tto: action.to,\n\t\t\t\t\t...headers ? { headers } : {}\n\t\t\t\t});\n\t\t\t} else if (action.type === \"reject\") {\n\t\t\t\tif (typeof action.reason !== \"string\" || Object.keys(action).length !== 2) throw new Error(\"invalid email reject\");\n\t\t\t\tactions.push({\n\t\t\t\t\ttype: \"reject\",\n\t\t\t\t\treason: action.reason\n\t\t\t\t});\n\t\t\t} else throw new Error(\"unknown email action\");\n\t\t}\n\t} catch (error) {\n\t\treader.cancel().catch(() => {});\n\t\tthrow error;\n\t} finally {\n\t\ttry {\n\t\t\treader.releaseLock();\n\t\t} catch {}\n\t}\n}\n//#endregion\nexport { EMAIL_MAX_ACTIONS, EMAIL_MAX_INBOUND_BYTES, EMAIL_MAX_INBOUND_HEADERS, EMAIL_MAX_INBOUND_HEADER_BYTES, EMAIL_MAX_METADATA_BYTES, EMAIL_MAX_REPLY_BYTES, EMAIL_MAX_RESPONSE_BYTES, EMAIL_PROTOCOL_VERSION, EMAIL_RECEIPT_PATH, encodeEmailActions, encodeEmailEnvelope, readEmailActions, readEmailEnvelope, signEmailReceipt, verifyEmailReceipt };\n", "// src/compose.ts\nvar compose = (middleware, onError, onNotFound) => {\n return (context, next) => {\n let index = -1;\n return dispatch(0);\n async function dispatch(i) {\n if (i <= index) {\n throw new Error(\"next() called multiple times\");\n }\n index = i;\n let res;\n let isError = false;\n let handler;\n if (middleware[i]) {\n handler = middleware[i][0][0];\n context.req.routeIndex = i;\n } else {\n handler = i === middleware.length && next || void 0;\n }\n if (handler) {\n try {\n res = await handler(context, () => dispatch(i + 1));\n } catch (err) {\n if (err instanceof Error && onError) {\n context.error = err;\n res = await onError(err, context);\n isError = true;\n } else {\n throw err;\n }\n }\n } else {\n if (context.finalized === false && onNotFound) {\n res = await onNotFound(context);\n }\n }\n if (res && (context.finalized === false || isError)) {\n context.res = res;\n }\n return context;\n }\n };\n};\nexport {\n compose\n};\n", "// src/request/constants.ts\nvar GET_MATCH_RESULT = /* @__PURE__ */ Symbol();\nexport {\n GET_MATCH_RESULT\n};\n", "// src/utils/buffer.ts\nimport { sha256 } from \"./crypto.js\";\nvar equal = (a, b) => {\n if (a === b) {\n return true;\n }\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n const va = new DataView(a);\n const vb = new DataView(b);\n let i = va.byteLength;\n while (i--) {\n if (va.getUint8(i) !== vb.getUint8(i)) {\n return false;\n }\n }\n return true;\n};\nvar constantTimeEqualString = (a, b) => {\n const aLen = a.length;\n const bLen = b.length;\n const maxLen = Math.max(aLen, bLen);\n let out = aLen ^ bLen;\n for (let i = 0; i < maxLen; i++) {\n const aChar = i < aLen ? a.charCodeAt(i) : 0;\n const bChar = i < bLen ? b.charCodeAt(i) : 0;\n out |= aChar ^ bChar;\n }\n return out === 0;\n};\nvar timingSafeEqualString = async (a, b, hashFunction) => {\n if (!hashFunction) {\n hashFunction = sha256;\n }\n const [sa, sb] = await Promise.all([hashFunction(a), hashFunction(b)]);\n if (sa == null || sb == null || typeof sa !== \"string\" || typeof sb !== \"string\") {\n return false;\n }\n const hashEqual = constantTimeEqualString(sa, sb);\n const originalEqual = constantTimeEqualString(a, b);\n return hashEqual && originalEqual;\n};\nvar timingSafeEqual = async (a, b, hashFunction) => {\n if (typeof a === \"string\" && typeof b === \"string\") {\n return timingSafeEqualString(a, b, hashFunction);\n }\n if (!hashFunction) {\n hashFunction = sha256;\n }\n const [sa, sb] = await Promise.all([hashFunction(a), hashFunction(b)]);\n if (!sa || !sb || typeof sa !== \"string\" || typeof sb !== \"string\") {\n return false;\n }\n return timingSafeEqualString(sa, sb);\n};\nvar bufferToString = (buffer) => {\n if (buffer instanceof ArrayBuffer) {\n const enc = new TextDecoder(\"utf-8\");\n return enc.decode(buffer);\n }\n return buffer;\n};\nvar bufferToFormData = (arrayBuffer, contentType) => {\n const response = new Response(arrayBuffer, {\n headers: {\n // Normalize the media type (case-insensitive) while keeping parameters like the boundary\n \"Content-Type\": contentType.replace(/^[^;]+/, (mediaType) => mediaType.toLowerCase())\n }\n });\n return response.formData();\n};\nexport {\n bufferToFormData,\n bufferToString,\n equal,\n timingSafeEqual\n};\n", "// src/utils/body.ts\nimport { bufferToFormData } from \"./buffer.js\";\nvar MAX_NESTING_DEPTH = 32;\nvar MAX_NESTED_OBJECTS = 1e4;\nvar isRawRequest = (request) => \"headers\" in request;\nvar parseBody = async (request, options = /* @__PURE__ */ Object.create(null)) => {\n const { all = false, dot = false } = options;\n const headers = isRawRequest(request) ? request.headers : request.raw.headers;\n const contentType = headers.get(\"Content-Type\");\n const mediaType = contentType?.split(\";\")[0].trim().toLowerCase();\n if (mediaType === \"multipart/form-data\" || mediaType === \"application/x-www-form-urlencoded\") {\n return parseFormData(request, { all, dot });\n }\n return {};\n};\nasync function parseFormData(request, options) {\n if (!isRawRequest(request) && request.bodyCache.formData) {\n return convertFormDataToBodyData(\n await request.bodyCache.formData,\n options\n );\n }\n const headers = isRawRequest(request) ? request.headers : request.raw.headers;\n const arrayBuffer = await request.arrayBuffer();\n const formDataPromise = bufferToFormData(arrayBuffer, headers.get(\"Content-Type\") || \"\");\n if (!isRawRequest(request)) {\n request.bodyCache.formData = formDataPromise;\n }\n const formData = await formDataPromise;\n if (formData) {\n return convertFormDataToBodyData(formData, options);\n }\n return {};\n}\nfunction convertFormDataToBodyData(formData, options) {\n const form = /* @__PURE__ */ Object.create(null);\n const nestingState = { count: 0 };\n formData.forEach((value, key) => {\n const shouldParseAllValues = options.all || key.endsWith(\"[]\");\n if (!shouldParseAllValues) {\n form[key] = value;\n } else {\n handleParsingAllValues(form, key, value);\n }\n });\n if (options.dot) {\n Object.entries(form).forEach(([key, value]) => {\n const shouldParseDotValues = key.includes(\".\");\n if (shouldParseDotValues) {\n handleParsingNestedValues(form, key, value, nestingState);\n delete form[key];\n }\n });\n }\n return form;\n}\nvar handleParsingAllValues = (form, key, value) => {\n if (form[key] !== void 0) {\n if (Array.isArray(form[key])) {\n ;\n form[key].push(value);\n } else {\n form[key] = [form[key], value];\n }\n } else {\n if (!key.endsWith(\"[]\")) {\n form[key] = value;\n } else {\n form[key] = [value];\n }\n }\n};\nvar handleParsingNestedValues = (form, key, value, state) => {\n if (/(?:^|\\.)__proto__\\./.test(key)) {\n return;\n }\n let nestedForm = form;\n const keys = key.split(\".\", MAX_NESTING_DEPTH + 2);\n if (keys.length > MAX_NESTING_DEPTH + 1) {\n throwNestingLimitExceeded();\n }\n keys.forEach((key2, index) => {\n if (index === keys.length - 1) {\n nestedForm[key2] = value;\n } else {\n if (!nestedForm[key2] || typeof nestedForm[key2] !== \"object\" || Array.isArray(nestedForm[key2]) || nestedForm[key2] instanceof File) {\n if (state.count++ >= MAX_NESTED_OBJECTS) {\n throwNestingLimitExceeded();\n }\n nestedForm[key2] = /* @__PURE__ */ Object.create(null);\n }\n nestedForm = nestedForm[key2];\n }\n });\n};\nvar throwNestingLimitExceeded = () => {\n throw new Error(\"Nesting limit exceeded\");\n};\nexport {\n parseBody\n};\n", "// src/utils/url.ts\nvar splitPath = (path) => {\n const paths = path.split(\"/\");\n if (paths[0] === \"\") {\n paths.shift();\n }\n return paths;\n};\nvar splitRoutingPath = (routePath) => {\n const { groups, path } = extractGroupsFromPath(routePath);\n const paths = splitPath(path);\n return replaceGroupMarks(paths, groups);\n};\nvar extractGroupsFromPath = (path) => {\n const groups = [];\n path = path.replace(/\\{[^}]+\\}/g, (match, index) => {\n const mark = `@${index}`;\n groups.push([mark, match]);\n return mark;\n });\n return { groups, path };\n};\nvar replaceGroupMarks = (paths, groups) => {\n for (let i = groups.length - 1; i >= 0; i--) {\n const [mark] = groups[i];\n for (let j = paths.length - 1; j >= 0; j--) {\n if (paths[j].includes(mark)) {\n paths[j] = paths[j].replace(mark, groups[i][1]);\n break;\n }\n }\n }\n return paths;\n};\nvar patternCache = {};\nvar getPattern = (label, next) => {\n if (label === \"*\") {\n return \"*\";\n }\n const match = label.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n if (match) {\n const cacheKey = `${label}#${next}`;\n if (!patternCache[cacheKey]) {\n if (match[2]) {\n patternCache[cacheKey] = next && next[0] !== \":\" && next[0] !== \"*\" ? [cacheKey, match[1], new RegExp(`^${match[2]}(?=/${next})`)] : [label, match[1], new RegExp(`^${match[2]}$`)];\n } else {\n patternCache[cacheKey] = [label, match[1], true];\n }\n }\n return patternCache[cacheKey];\n }\n return null;\n};\nvar tryDecode = (str, decoder) => {\n try {\n return decoder(str);\n } catch {\n return str.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match) => {\n try {\n return decoder(match);\n } catch {\n return match;\n }\n });\n }\n};\nvar tryDecodeURI = (str) => tryDecode(str, decodeURI);\nvar getPath = (request) => {\n const url = request.url;\n const start = url.indexOf(\"/\", url.indexOf(\":\") + 4);\n let i = start;\n for (; i < url.length; i++) {\n const charCode = url.charCodeAt(i);\n if (charCode === 37) {\n const queryIndex = url.indexOf(\"?\", i);\n const hashIndex = url.indexOf(\"#\", i);\n const end = queryIndex === -1 ? hashIndex === -1 ? void 0 : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex);\n const path = url.slice(start, end);\n return tryDecodeURI(path.includes(\"%25\") ? path.replace(/%25/g, \"%2525\") : path);\n } else if (charCode === 63 || charCode === 35) {\n break;\n }\n }\n return url.slice(start, i);\n};\nvar getQueryStrings = (url) => {\n const queryIndex = url.indexOf(\"?\", 8);\n if (queryIndex === -1) {\n return \"\";\n }\n const hashIndex = url.indexOf(\"#\", 8);\n return hashIndex === -1 ? url.slice(queryIndex) : queryIndex < hashIndex ? url.slice(queryIndex, hashIndex) : \"\";\n};\nvar getPathNoStrict = (request) => {\n const result = getPath(request);\n return result.length > 1 && result.at(-1) === \"/\" ? result.slice(0, -1) : result;\n};\nvar mergePath = (base, sub, ...rest) => {\n if (rest.length) {\n sub = mergePath(sub, ...rest);\n }\n return `${base?.[0] === \"/\" ? \"\" : \"/\"}${base}${sub === \"/\" ? \"\" : `${base?.at(-1) === \"/\" ? \"\" : \"/\"}${sub?.[0] === \"/\" ? sub.slice(1) : sub}`}`;\n};\nvar checkOptionalParameter = (path) => {\n if (path.charCodeAt(path.length - 1) !== 63 || !path.includes(\":\")) {\n return null;\n }\n const segments = path.split(\"/\");\n const results = [];\n let basePath = \"\";\n segments.forEach((segment) => {\n if (segment !== \"\" && !/\\:/.test(segment)) {\n basePath += \"/\" + segment;\n } else if (/\\:/.test(segment)) {\n if (segment.charCodeAt(segment.length - 1) === 63) {\n if (results.length === 0 && basePath === \"\") {\n results.push(\"/\");\n } else {\n results.push(basePath);\n }\n const optionalSegment = segment.slice(0, -1);\n basePath += \"/\" + optionalSegment;\n results.push(basePath);\n } else {\n basePath += \"/\" + segment;\n }\n }\n });\n return results.filter((v, i, a) => a.indexOf(v) === i);\n};\nvar tryDecodeURIComponent = (str) => str.indexOf(\"%\") !== -1 ? tryDecode(str, decodeURIComponent_) : str;\nvar _decodeURI = (value) => {\n if (value.indexOf(\"+\") !== -1) {\n value = value.replace(/\\+/g, \" \");\n }\n return tryDecodeURIComponent(value);\n};\nvar _getQueryParam = (url, key, multiple) => {\n const hashIndex = url.indexOf(\"#\", 8);\n if (hashIndex !== -1) {\n url = url.slice(0, hashIndex);\n }\n let encoded;\n if (!multiple && key && key.indexOf(\"%\") === -1 && key.indexOf(\"+\") === -1) {\n let keyIndex2 = url.indexOf(\"?\", 8);\n if (keyIndex2 === -1) {\n return void 0;\n }\n if (!url.startsWith(key, keyIndex2 + 1)) {\n keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1);\n }\n while (keyIndex2 !== -1) {\n const trailingKeyCode = url.charCodeAt(keyIndex2 + key.length + 1);\n if (trailingKeyCode === 61) {\n const valueIndex = keyIndex2 + key.length + 2;\n const endIndex = url.indexOf(\"&\", valueIndex);\n return _decodeURI(url.slice(valueIndex, endIndex === -1 ? void 0 : endIndex));\n } else if (trailingKeyCode == 38 || isNaN(trailingKeyCode)) {\n return \"\";\n }\n keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1);\n }\n encoded = /[%+]/.test(url);\n if (!encoded) {\n return void 0;\n }\n }\n const results = /* @__PURE__ */ Object.create(null);\n encoded ??= /[%+]/.test(url);\n let keyIndex = url.indexOf(\"?\", 8);\n while (keyIndex !== -1) {\n const nextKeyIndex = url.indexOf(\"&\", keyIndex + 1);\n let valueIndex = url.indexOf(\"=\", keyIndex);\n if (valueIndex > nextKeyIndex && nextKeyIndex !== -1) {\n valueIndex = -1;\n }\n let name = url.slice(\n keyIndex + 1,\n valueIndex === -1 ? nextKeyIndex === -1 ? void 0 : nextKeyIndex : valueIndex\n );\n if (encoded) {\n name = _decodeURI(name);\n }\n keyIndex = nextKeyIndex;\n if (name === \"\") {\n continue;\n }\n let value;\n if (valueIndex === -1) {\n value = \"\";\n } else {\n value = url.slice(valueIndex + 1, nextKeyIndex === -1 ? void 0 : nextKeyIndex);\n if (encoded) {\n value = _decodeURI(value);\n }\n }\n if (multiple) {\n if (!(results[name] && Array.isArray(results[name]))) {\n results[name] = [];\n }\n ;\n results[name].push(value);\n } else {\n results[name] ??= value;\n }\n }\n return key ? results[key] : results;\n};\nvar getQueryParam = _getQueryParam;\nvar getQueryParams = (url, key) => {\n return _getQueryParam(url, key, true);\n};\nvar decodeURIComponent_ = decodeURIComponent;\nexport {\n checkOptionalParameter,\n decodeURIComponent_,\n getPath,\n getPathNoStrict,\n getPattern,\n getQueryParam,\n getQueryParams,\n getQueryStrings,\n mergePath,\n splitPath,\n splitRoutingPath,\n tryDecode,\n tryDecodeURI,\n tryDecodeURIComponent\n};\n", "// src/request.ts\nimport { HTTPException } from \"./http-exception.js\";\nimport { GET_MATCH_RESULT } from \"./request/constants.js\";\nimport { parseBody } from \"./utils/body.js\";\nimport { getQueryParam, getQueryParams, tryDecodeURIComponent } from \"./utils/url.js\";\nvar HonoRequest = class {\n /**\n * `.raw` can get the raw Request object.\n *\n * @see {@link https://hono.dev/docs/api/request#raw}\n *\n * @example\n * ```ts\n * // For Cloudflare Workers\n * app.post('/', async (c) => {\n * const metadata = c.req.raw.cf?.hostMetadata?\n * ...\n * })\n * ```\n */\n raw;\n #validatedData;\n // Short name of validatedData\n #matchResult;\n routeIndex = 0;\n /**\n * `.path` can get the pathname of the request.\n *\n * @see {@link https://hono.dev/docs/api/request#path}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const pathname = c.req.path // `/about/me`\n * })\n * ```\n */\n path;\n bodyCache = {};\n constructor(request, path = \"/\", matchResult = [[]]) {\n this.raw = request;\n this.path = path;\n this.#matchResult = matchResult;\n }\n param(key) {\n return key ? this.#getDecodedParam(key) : this.#getAllDecodedParams();\n }\n #getDecodedParam(key) {\n const paramKey = this.#matchResult[0][this.routeIndex]?.[1][key];\n const param = this.#getParamValue(paramKey);\n return param && tryDecodeURIComponent(param);\n }\n #getAllDecodedParams() {\n const decoded = {};\n const keys = Object.keys(this.#matchResult[0][this.routeIndex]?.[1] ?? {});\n for (const key of keys) {\n const value = this.#getParamValue(this.#matchResult[0][this.routeIndex][1][key]);\n if (value !== void 0) {\n decoded[key] = tryDecodeURIComponent(value);\n }\n }\n return decoded;\n }\n #getParamValue(paramKey) {\n return this.#matchResult[1] ? this.#matchResult[1][paramKey] : paramKey;\n }\n query(key) {\n return getQueryParam(this.url, key);\n }\n queries(key) {\n return getQueryParams(this.url, key);\n }\n header(name) {\n if (name) {\n return this.raw.headers.get(name) ?? void 0;\n }\n const headerData = /* @__PURE__ */ Object.create(null);\n this.raw.headers.forEach((value, key) => {\n headerData[key] = value;\n });\n return headerData;\n }\n async parseBody(options) {\n return parseBody(this, options);\n }\n #cachedBody = (key) => {\n const { bodyCache, raw } = this;\n const cachedBody = bodyCache[key];\n if (cachedBody) {\n return cachedBody;\n }\n for (const anyCachedKey in bodyCache) {\n return bodyCache[anyCachedKey].then((body) => {\n if (anyCachedKey === \"json\") {\n body = JSON.stringify(body);\n }\n return new Response(body)[key]();\n });\n }\n return bodyCache[key] = raw[key]();\n };\n /**\n * `.json()` can parse Request body of type `application/json`\n *\n * @see {@link https://hono.dev/docs/api/request#json}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.json()\n * })\n * ```\n */\n json() {\n return this.#cachedBody(\"text\").then((text) => JSON.parse(text));\n }\n /**\n * `.text()` can parse Request body of type `text/plain`\n *\n * @see {@link https://hono.dev/docs/api/request#text}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.text()\n * })\n * ```\n */\n text() {\n return this.#cachedBody(\"text\");\n }\n /**\n * `.arrayBuffer()` parse Request body as an `ArrayBuffer`\n *\n * @see {@link https://hono.dev/docs/api/request#arraybuffer}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.arrayBuffer()\n * })\n * ```\n */\n arrayBuffer() {\n return this.#cachedBody(\"arrayBuffer\");\n }\n /**\n * `.bytes()` parses the request body as a `Uint8Array`.\n *\n * @see {@link https://hono.dev/docs/api/request#bytes}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.bytes()\n * })\n * ```\n */\n bytes() {\n return this.#cachedBody(\"arrayBuffer\").then((buffer) => new Uint8Array(buffer));\n }\n /**\n * Parses the request body as a `Blob`.\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.blob();\n * });\n * ```\n * @see https://hono.dev/docs/api/request#blob\n */\n blob() {\n return this.#cachedBody(\"blob\");\n }\n /**\n * Parses the request body as `FormData`.\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.formData();\n * });\n * ```\n * @see https://hono.dev/docs/api/request#formdata\n */\n formData() {\n return this.#cachedBody(\"formData\");\n }\n /**\n * Adds validated data to the request.\n *\n * @param target - The target of the validation.\n * @param data - The validated data to add.\n */\n addValidatedData(target, data) {\n ;\n (this.#validatedData ??= {})[target] = data;\n }\n valid(target) {\n return this.#validatedData?.[target];\n }\n /**\n * `.url()` can get the request url strings.\n *\n * @see {@link https://hono.dev/docs/api/request#url}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const url = c.req.url // `http://localhost:8787/about/me`\n * ...\n * })\n * ```\n */\n get url() {\n return this.raw.url;\n }\n /**\n * `.method()` can get the method name of the request.\n *\n * @see {@link https://hono.dev/docs/api/request#method}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const method = c.req.method // `GET`\n * })\n * ```\n */\n get method() {\n return this.raw.method;\n }\n get [GET_MATCH_RESULT]() {\n return this.#matchResult;\n }\n /**\n * `.matchedRoutes()` can return a matched route in the handler\n *\n * @deprecated\n *\n * Use matchedRoutes helper defined in \"hono/route\" instead.\n *\n * @see {@link https://hono.dev/docs/api/request#matchedroutes}\n *\n * @example\n * ```ts\n * app.use('*', async function logger(c, next) {\n * await next()\n * c.req.matchedRoutes.forEach(({ handler, method, path }, i) => {\n * const name = handler.name || (handler.length < 2 ? '[handler]' : '[middleware]')\n * console.log(\n * method,\n * ' ',\n * path,\n * ' '.repeat(Math.max(10 - path.length, 0)),\n * name,\n * i === c.req.routeIndex ? '<- respond from here' : ''\n * )\n * })\n * })\n * ```\n */\n get matchedRoutes() {\n return this.#matchResult[0].map(([[, route]]) => route);\n }\n /**\n * `routePath()` can retrieve the path registered within the handler\n *\n * @deprecated\n *\n * Use routePath helper defined in \"hono/route\" instead.\n *\n * @see {@link https://hono.dev/docs/api/request#routepath}\n *\n * @example\n * ```ts\n * app.get('/posts/:id', (c) => {\n * return c.json({ path: c.req.routePath })\n * })\n * ```\n */\n get routePath() {\n return this.#matchResult[0].map(([[, route]]) => route)[this.routeIndex].path;\n }\n};\nvar cloneRawRequest = async (req) => {\n if (!req.raw.bodyUsed) {\n return req.raw.clone();\n }\n const cacheKey = Object.keys(req.bodyCache)[0];\n if (!cacheKey) {\n throw new HTTPException(500, {\n message: \"Cannot clone request: body was already consumed and not cached. Please use HonoRequest methods (e.g., req.json(), req.text()) instead of consuming req.raw directly.\"\n });\n }\n let body = await req[cacheKey]();\n const headers = req.header();\n if (cacheKey === \"json\") {\n body = JSON.stringify(body);\n delete headers[\"content-length\"];\n } else if (body instanceof FormData) {\n delete headers[\"content-type\"];\n delete headers[\"content-length\"];\n }\n const requestInit = {\n body,\n cache: req.raw.cache,\n credentials: req.raw.credentials,\n headers,\n integrity: req.raw.integrity,\n keepalive: req.raw.keepalive,\n method: req.method,\n mode: req.raw.mode,\n redirect: req.raw.redirect,\n referrer: req.raw.referrer,\n referrerPolicy: req.raw.referrerPolicy,\n signal: req.raw.signal\n };\n return new Request(req.url, requestInit);\n};\nexport {\n HonoRequest,\n cloneRawRequest\n};\n", "// src/utils/html.ts\nvar HtmlEscapedCallbackPhase = {\n Stringify: 1,\n BeforeStream: 2,\n Stream: 3\n};\nvar raw = (value, callbacks) => {\n const escapedString = new String(value);\n escapedString.isEscaped = true;\n escapedString.callbacks = callbacks;\n return escapedString;\n};\nvar escapeRe = /[&<>'\"]/;\nvar stringBufferToString = async (buffer, callbacks) => {\n let str = \"\";\n callbacks ||= [];\n const resolvedBuffer = await Promise.all(buffer);\n for (let i = resolvedBuffer.length - 1; ; i--) {\n str += resolvedBuffer[i];\n i--;\n if (i < 0) {\n break;\n }\n let r = resolvedBuffer[i];\n if (typeof r === \"object\") {\n callbacks.push(...r.callbacks || []);\n }\n const isEscaped = r.isEscaped;\n r = await (typeof r === \"object\" ? r.toString() : r);\n if (typeof r === \"object\") {\n callbacks.push(...r.callbacks || []);\n }\n if (r.isEscaped ?? isEscaped) {\n str += r;\n } else {\n const buf = [str];\n escapeToBuffer(r, buf);\n str = buf[0];\n }\n }\n return raw(str, callbacks);\n};\nvar escapeToBuffer = (str, buffer) => {\n const match = str.search(escapeRe);\n if (match === -1) {\n buffer[0] += str;\n return;\n }\n let escape;\n let index;\n let lastIndex = 0;\n for (index = match; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escape = \"&quot;\";\n break;\n case 39:\n escape = \"&#39;\";\n break;\n case 38:\n escape = \"&amp;\";\n break;\n case 60:\n escape = \"&lt;\";\n break;\n case 62:\n escape = \"&gt;\";\n break;\n default:\n continue;\n }\n buffer[0] += str.substring(lastIndex, index) + escape;\n lastIndex = index + 1;\n }\n buffer[0] += str.substring(lastIndex, index);\n};\nvar resolveCallbackSync = (str) => {\n const callbacks = str.callbacks;\n if (!callbacks?.length) {\n return str;\n }\n const buffer = [str];\n const context = {};\n callbacks.forEach((c) => c({ phase: HtmlEscapedCallbackPhase.Stringify, buffer, context }));\n return buffer[0];\n};\nvar resolveCallback = async (str, phase, preserveCallbacks, context, buffer) => {\n if (typeof str === \"object\" && !(str instanceof String)) {\n if (!(str instanceof Promise)) {\n str = str.toString();\n }\n if (str instanceof Promise) {\n str = await str;\n }\n }\n const callbacks = str.callbacks;\n if (!callbacks?.length) {\n return Promise.resolve(str);\n }\n if (buffer) {\n buffer[0] += str;\n } else {\n buffer = [str];\n }\n const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context }))).then(\n (res) => Promise.all(\n res.filter(Boolean).map((str2) => resolveCallback(str2, phase, false, context, buffer))\n ).then(() => buffer[0])\n );\n if (preserveCallbacks) {\n return raw(await resStr, callbacks);\n } else {\n return resStr;\n }\n};\nexport {\n HtmlEscapedCallbackPhase,\n escapeToBuffer,\n raw,\n resolveCallback,\n resolveCallbackSync,\n stringBufferToString\n};\n", "// src/context.ts\nimport { HonoRequest } from \"./request.js\";\nimport { HtmlEscapedCallbackPhase, resolveCallback } from \"./utils/html.js\";\nvar TEXT_PLAIN = \"text/plain; charset=UTF-8\";\nvar setDefaultContentType = (contentType, headers) => {\n return {\n \"Content-Type\": contentType,\n ...headers\n };\n};\nvar createResponseInstance = (body, init) => new Response(body, init);\nvar Context = class {\n #rawRequest;\n #req;\n /**\n * `.env` can get bindings (environment variables, secrets, KV namespaces, D1 database, R2 bucket etc.) in Cloudflare Workers.\n *\n * @see {@link https://hono.dev/docs/api/context#env}\n *\n * @example\n * ```ts\n * // Environment object for Cloudflare Workers\n * app.get('*', async c => {\n * const counter = c.env.COUNTER\n * })\n * ```\n */\n env = {};\n #var;\n finalized = false;\n /**\n * `.error` can get the error object from the middleware if the Handler throws an error.\n *\n * @see {@link https://hono.dev/docs/api/context#error}\n *\n * @example\n * ```ts\n * app.use('*', async (c, next) => {\n * await next()\n * if (c.error) {\n * // do something...\n * }\n * })\n * ```\n */\n error;\n #status;\n #executionCtx;\n #res;\n #layout;\n #renderer;\n #notFoundHandler;\n #preparedHeaders;\n #matchResult;\n #path;\n /**\n * Creates an instance of the Context class.\n *\n * @param req - The Request object.\n * @param options - Optional configuration options for the context.\n */\n constructor(req, options) {\n this.#rawRequest = req;\n if (options) {\n this.#executionCtx = options.executionCtx;\n this.env = options.env;\n this.#notFoundHandler = options.notFoundHandler;\n this.#path = options.path;\n this.#matchResult = options.matchResult;\n }\n }\n /**\n * `.req` is the instance of {@link HonoRequest}.\n */\n get req() {\n this.#req ??= new HonoRequest(this.#rawRequest, this.#path, this.#matchResult);\n return this.#req;\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#event}\n * The FetchEvent associated with the current request.\n *\n * @throws Will throw an error if the context does not have a FetchEvent.\n */\n get event() {\n if (this.#executionCtx && \"respondWith\" in this.#executionCtx) {\n return this.#executionCtx;\n } else {\n throw Error(\"This context has no FetchEvent\");\n }\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#executionctx}\n * The ExecutionContext associated with the current request.\n *\n * @throws Will throw an error if the context does not have an ExecutionContext.\n */\n get executionCtx() {\n if (this.#executionCtx) {\n return this.#executionCtx;\n } else {\n throw Error(\"This context has no ExecutionContext\");\n }\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#res}\n * The Response object for the current request.\n */\n get res() {\n return this.#res ||= createResponseInstance(null, {\n headers: this.#preparedHeaders ??= new Headers()\n });\n }\n /**\n * Sets the Response object for the current request.\n *\n * @param _res - The Response object to set.\n */\n set res(_res) {\n if (this.#res && _res) {\n _res = createResponseInstance(_res.body, _res);\n for (const [k, v] of this.#res.headers.entries()) {\n if (k === \"content-type\") {\n continue;\n }\n if (k === \"set-cookie\") {\n const cookies = this.#res.headers.getSetCookie();\n _res.headers.delete(\"set-cookie\");\n for (const cookie of cookies) {\n _res.headers.append(\"set-cookie\", cookie);\n }\n } else {\n _res.headers.set(k, v);\n }\n }\n }\n this.#res = _res;\n this.finalized = true;\n }\n /**\n * `.render()` can create a response within a layout.\n *\n * @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n *\n * @example\n * ```ts\n * app.get('/', (c) => {\n * return c.render('Hello!')\n * })\n * ```\n */\n render = (...args) => {\n this.#renderer ??= (content) => this.html(content);\n return this.#renderer(...args);\n };\n /**\n * Sets the layout for the response.\n *\n * @param layout - The layout to set.\n * @returns The layout function.\n */\n setLayout = (layout) => this.#layout = layout;\n /**\n * Gets the current layout for the response.\n *\n * @returns The current layout function.\n */\n getLayout = () => this.#layout;\n /**\n * `.setRenderer()` can set the layout in the custom middleware.\n *\n * @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n *\n * @example\n * ```tsx\n * app.use('*', async (c, next) => {\n * c.setRenderer((content) => {\n * return c.html(\n * <html>\n * <body>\n * <p>{content}</p>\n * </body>\n * </html>\n * )\n * })\n * await next()\n * })\n * ```\n */\n setRenderer = (renderer) => {\n this.#renderer = renderer;\n };\n /**\n * `.header()` can set headers.\n *\n * @see {@link https://hono.dev/docs/api/context#header}\n *\n * @example\n * ```ts\n * app.get('/welcome', (c) => {\n * // Set headers\n * c.header('X-Message', 'Hello!')\n * c.header('Content-Type', 'text/plain')\n *\n * // Append multiple headers using the append option (e.g. Vary)\n * c.header('Vary', 'Accept-Encoding', { append: true })\n * c.header('Vary', 'User-Agent', { append: true })\n *\n * return c.body('Thank you for coming')\n * })\n * ```\n */\n header = (name, value, options) => {\n if (this.finalized) {\n this.#res = createResponseInstance(this.#res.body, this.#res);\n }\n const headers = this.#res ? this.#res.headers : this.#preparedHeaders ??= new Headers();\n if (value === void 0) {\n headers.delete(name);\n } else if (options?.append) {\n headers.append(name, value);\n } else {\n headers.set(name, value);\n }\n };\n status = (status) => {\n this.#status = status;\n };\n /**\n * `.set()` can set the value specified by the key.\n *\n * @see {@link https://hono.dev/docs/api/context#set-get}\n *\n * @example\n * ```ts\n * app.use('*', async (c, next) => {\n * c.set('message', 'Hono is hot!!')\n * await next()\n * })\n * ```\n */\n set = (key, value) => {\n this.#var ??= /* @__PURE__ */ new Map();\n this.#var.set(key, value);\n };\n /**\n * `.get()` can use the value specified by the key.\n *\n * @see {@link https://hono.dev/docs/api/context#set-get}\n *\n * @example\n * ```ts\n * app.get('/', (c) => {\n * const message = c.get('message')\n * return c.text(`The message is \"${message}\"`)\n * })\n * ```\n */\n get = (key) => {\n return this.#var ? this.#var.get(key) : void 0;\n };\n /**\n * `.var` can access the value of a variable.\n *\n * @see {@link https://hono.dev/docs/api/context#var}\n *\n * @example\n * ```ts\n * const result = c.var.client.oneMethod()\n * ```\n */\n // c.var.propName is a read-only\n get var() {\n if (!this.#var) {\n return {};\n }\n return Object.fromEntries(this.#var);\n }\n #newResponse(data, arg, headers) {\n let responseHeaders = this.#res ? new Headers(this.#res.headers) : this.#preparedHeaders;\n if (typeof arg === \"object\" && arg.headers) {\n responseHeaders ??= new Headers();\n for (const [key, value] of new Headers(arg.headers)) {\n if (key === \"set-cookie\") {\n responseHeaders.append(key, value);\n } else {\n responseHeaders.set(key, value);\n }\n }\n }\n if (headers) {\n if (!responseHeaders) {\n let count = 0;\n for (const k in headers) {\n if (++count > 1 || typeof headers[k] !== \"string\") {\n responseHeaders = new Headers();\n break;\n }\n }\n }\n if (responseHeaders) {\n for (const k in headers) {\n const v = headers[k];\n if (typeof v === \"string\") {\n responseHeaders.set(k, v);\n } else {\n responseHeaders.delete(k);\n for (const v2 of v) {\n responseHeaders.append(k, v2);\n }\n }\n }\n }\n }\n const status = typeof arg === \"number\" ? arg : arg?.status ?? this.#status;\n return createResponseInstance(data, {\n status,\n headers: responseHeaders ?? headers\n });\n }\n newResponse = (...args) => this.#newResponse(...args);\n /**\n * `.body()` can return the HTTP response.\n * You can set headers with `.header()` and set HTTP status code with `.status`.\n * This can also be set in `.text()`, `.json()` and so on.\n *\n * @see {@link https://hono.dev/docs/api/context#body}\n *\n * @example\n * ```ts\n * app.get('/welcome', (c) => {\n * // Set headers\n * c.header('X-Message', 'Hello!')\n * c.header('Content-Type', 'text/plain')\n * // Set HTTP status code\n * c.status(201)\n *\n * // Return the response body\n * return c.body('Thank you for coming')\n * })\n * ```\n */\n body = (data, arg, headers) => this.#newResponse(data, arg, headers);\n /**\n * `.text()` can render text as `Content-Type:text/plain`.\n *\n * @see {@link https://hono.dev/docs/api/context#text}\n *\n * @example\n * ```ts\n * app.get('/say', (c) => {\n * return c.text('Hello!')\n * })\n * ```\n */\n text = (text, arg, headers) => {\n return !this.#preparedHeaders && !this.#status && !arg && !headers && !this.finalized ? new Response(text) : this.#newResponse(\n text,\n arg,\n setDefaultContentType(TEXT_PLAIN, headers)\n );\n };\n /**\n * `.json()` can render JSON as `Content-Type:application/json`.\n *\n * @see {@link https://hono.dev/docs/api/context#json}\n *\n * @example\n * ```ts\n * app.get('/api', (c) => {\n * return c.json({ message: 'Hello!' })\n * })\n * ```\n */\n json = (object, arg, headers) => {\n return this.#newResponse(\n JSON.stringify(object),\n arg,\n setDefaultContentType(\"application/json\", headers)\n );\n };\n html = (html, arg, headers) => {\n const res = (html2) => this.#newResponse(html2, arg, setDefaultContentType(\"text/html; charset=UTF-8\", headers));\n return typeof html === \"object\" ? resolveCallback(html, HtmlEscapedCallbackPhase.Stringify, false, {}).then(res) : res(html);\n };\n /**\n * `.redirect()` can Redirect, default status code is 302.\n *\n * @see {@link https://hono.dev/docs/api/context#redirect}\n *\n * @example\n * ```ts\n * app.get('/redirect', (c) => {\n * return c.redirect('/')\n * })\n * app.get('/redirect-permanently', (c) => {\n * return c.redirect('/', 301)\n * })\n * ```\n */\n redirect = (location, status) => {\n const locationString = String(location);\n this.header(\n \"Location\",\n // Multibyes should be encoded\n // eslint-disable-next-line no-control-regex\n !/[^\\x00-\\xFF]/.test(locationString) ? locationString : encodeURI(locationString)\n );\n return this.newResponse(null, status ?? 302);\n };\n /**\n * `.notFound()` can return the Not Found Response.\n *\n * @see {@link https://hono.dev/docs/api/context#notfound}\n *\n * @example\n * ```ts\n * app.get('/notfound', (c) => {\n * return c.notFound()\n * })\n * ```\n */\n notFound = () => {\n this.#notFoundHandler ??= () => createResponseInstance();\n return this.#notFoundHandler(this);\n };\n};\nexport {\n Context,\n TEXT_PLAIN\n};\n", "// src/router.ts\nvar METHOD_NAME_ALL = \"ALL\";\nvar METHOD_NAME_ALL_LOWERCASE = \"all\";\nvar METHODS = [\"get\", \"post\", \"put\", \"delete\", \"options\", \"patch\", \"query\"];\nvar MESSAGE_MATCHER_IS_ALREADY_BUILT = \"Can not add a route since the matcher is already built.\";\nvar UnsupportedPathError = class extends Error {\n};\nexport {\n MESSAGE_MATCHER_IS_ALREADY_BUILT,\n METHODS,\n METHOD_NAME_ALL,\n METHOD_NAME_ALL_LOWERCASE,\n UnsupportedPathError\n};\n", "// src/utils/constants.ts\nvar COMPOSED_HANDLER = \"__COMPOSED_HANDLER\";\nexport {\n COMPOSED_HANDLER\n};\n", "// src/hono-base.ts\nimport { compose } from \"./compose.js\";\nimport { Context } from \"./context.js\";\nimport { METHODS, METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE } from \"./router.js\";\nimport { COMPOSED_HANDLER } from \"./utils/constants.js\";\nimport { getPath, getPathNoStrict, mergePath } from \"./utils/url.js\";\nvar notFoundHandler = (c) => {\n return c.text(\"404 Not Found\", 404);\n};\nvar errorHandler = (err, c) => {\n if (\"getResponse\" in err) {\n const res = err.getResponse();\n return c.newResponse(res.body, res);\n }\n console.error(err);\n return c.text(\"Internal Server Error\", 500);\n};\nvar Hono = class _Hono {\n get;\n post;\n put;\n delete;\n options;\n patch;\n query;\n all;\n on;\n use;\n /*\n This class is like an abstract class and does not have a router.\n To use it, inherit the class and implement router in the constructor.\n */\n router;\n getPath;\n // Cannot use `#` because it requires visibility at JavaScript runtime.\n _basePath = \"/\";\n #path = \"/\";\n routes = [];\n constructor(options = {}) {\n const allMethods = [...METHODS, METHOD_NAME_ALL_LOWERCASE];\n allMethods.forEach((method) => {\n this[method] = (args1, ...args) => {\n const methodName = method.toUpperCase();\n if (typeof args1 === \"string\") {\n this.#path = args1;\n } else {\n this.#addRoute(methodName, this.#path, args1);\n }\n args.forEach((handler) => {\n this.#addRoute(methodName, this.#path, handler);\n });\n return this;\n };\n });\n this.on = (method, path, ...handlers) => {\n for (const p of [path].flat()) {\n this.#path = p;\n for (const m of [method].flat()) {\n const methodName = m.toUpperCase();\n for (const handler of handlers) {\n this.#addRoute(methodName, this.#path, handler);\n }\n }\n }\n return this;\n };\n this.use = (arg1, ...handlers) => {\n if (typeof arg1 === \"string\") {\n this.#path = arg1;\n } else {\n this.#path = \"*\";\n handlers.unshift(arg1);\n }\n handlers.forEach((handler) => {\n this.#addRoute(METHOD_NAME_ALL, this.#path, handler);\n });\n return this;\n };\n const { strict, ...optionsWithoutStrict } = options;\n Object.assign(this, optionsWithoutStrict);\n this.getPath = strict ?? true ? options.getPath ?? getPath : getPathNoStrict;\n }\n #clone() {\n const clone = new _Hono({\n router: this.router,\n getPath: this.getPath\n });\n clone.errorHandler = this.errorHandler;\n clone.#notFoundHandler = this.#notFoundHandler;\n clone.routes = this.routes;\n return clone;\n }\n #notFoundHandler = notFoundHandler;\n // Cannot use `#` because it requires visibility at JavaScript runtime.\n errorHandler = errorHandler;\n /**\n * `.route()` allows grouping other Hono instance in routes.\n *\n * @see {@link https://hono.dev/docs/api/routing#grouping}\n *\n * @param {string} path - base Path\n * @param {Hono} app - other Hono instance\n * @returns {Hono} routed Hono instance\n *\n * @example\n * ```ts\n * const app = new Hono()\n * const app2 = new Hono()\n *\n * app2.get(\"/user\", (c) => c.text(\"user\"))\n * app.route(\"/api\", app2) // GET /api/user\n * ```\n */\n route(path, app) {\n const subApp = this.basePath(path);\n app.routes.map((r) => {\n let handler;\n if (app.errorHandler === errorHandler) {\n handler = r.handler;\n } else {\n handler = async (c, next) => (await compose([], app.errorHandler)(c, () => r.handler(c, next))).res;\n handler[COMPOSED_HANDLER] = r.handler;\n }\n subApp.#addRoute(r.method, r.path, handler, r.basePath);\n });\n return this;\n }\n /**\n * `.basePath()` allows base paths to be specified.\n *\n * @see {@link https://hono.dev/docs/api/routing#base-path}\n *\n * @param {string} path - base Path\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * const api = new Hono().basePath('/api')\n * ```\n */\n basePath(path) {\n const subApp = this.#clone();\n subApp._basePath = mergePath(this._basePath, path);\n return subApp;\n }\n /**\n * `.onError()` handles an error and returns a customized Response.\n *\n * @see {@link https://hono.dev/docs/api/hono#error-handling}\n *\n * @param {ErrorHandler} handler - request Handler for error\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * app.onError((err, c) => {\n * console.error(`${err}`)\n * return c.text('Custom Error Message', 500)\n * })\n * ```\n */\n onError = (handler) => {\n this.errorHandler = handler;\n return this;\n };\n /**\n * `.notFound()` allows you to customize a Not Found Response.\n *\n * @see {@link https://hono.dev/docs/api/hono#not-found}\n *\n * @param {NotFoundHandler} handler - request handler for not-found\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * app.notFound((c) => {\n * return c.text('Custom 404 Message', 404)\n * })\n * ```\n */\n notFound = (handler) => {\n this.#notFoundHandler = handler;\n return this;\n };\n /**\n * `.mount()` allows you to mount applications built with other frameworks into your Hono application.\n *\n * @see {@link https://hono.dev/docs/api/hono#mount}\n *\n * @param {string} path - base Path\n * @param {Function} applicationHandler - other Request Handler\n * @param {MountOptions} [options] - options of `.mount()`\n * @returns {Hono} mounted Hono instance\n *\n * @example\n * ```ts\n * import { Router as IttyRouter } from 'itty-router'\n * import { Hono } from 'hono'\n * // Create itty-router application\n * const ittyRouter = IttyRouter()\n * // GET /itty-router/hello\n * ittyRouter.get('/hello', () => new Response('Hello from itty-router'))\n *\n * const app = new Hono()\n * app.mount('/itty-router', ittyRouter.handle)\n * ```\n *\n * @example\n * ```ts\n * const app = new Hono()\n * // Send the request to another application without modification.\n * app.mount('/app', anotherApp, {\n * replaceRequest: (req) => req,\n * })\n * ```\n */\n mount(path, applicationHandler, options) {\n let replaceRequest;\n let optionHandler;\n if (options) {\n if (typeof options === \"function\") {\n optionHandler = options;\n } else {\n optionHandler = options.optionHandler;\n if (options.replaceRequest === false) {\n replaceRequest = (request) => request;\n } else {\n replaceRequest = options.replaceRequest;\n }\n }\n }\n const getOptions = optionHandler ? (c) => {\n const options2 = optionHandler(c);\n return Array.isArray(options2) ? options2 : [options2];\n } : (c) => {\n let executionContext = void 0;\n try {\n executionContext = c.executionCtx;\n } catch {\n }\n return [c.env, executionContext];\n };\n replaceRequest ||= (() => {\n const mergedPath = mergePath(this._basePath, path);\n const pathPrefixLength = mergedPath === \"/\" ? 0 : mergedPath.length;\n return (request) => {\n const url = new URL(request.url);\n url.pathname = this.getPath(request).slice(pathPrefixLength) || \"/\";\n return new Request(url, request);\n };\n })();\n const handler = async (c, next) => {\n const res = await applicationHandler(replaceRequest(c.req.raw), ...getOptions(c));\n if (res) {\n return res;\n }\n await next();\n };\n this.#addRoute(METHOD_NAME_ALL, mergePath(path, \"*\"), handler);\n return this;\n }\n #addRoute(method, path, handler, baseRoutePath) {\n path = mergePath(this._basePath, path);\n const r = {\n basePath: baseRoutePath !== void 0 ? mergePath(this._basePath, baseRoutePath) : this._basePath,\n path,\n method,\n handler\n };\n this.router.add(method, path, [handler, r]);\n this.routes.push(r);\n }\n #handleError(err, c) {\n if (err instanceof Error) {\n return this.errorHandler(err, c);\n }\n throw err;\n }\n #dispatch(request, executionCtx, env, method) {\n if (method === \"HEAD\") {\n return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, \"GET\")))();\n }\n const path = this.getPath(request, { env });\n const matchResult = this.router.match(method, path);\n const c = new Context(request, {\n path,\n matchResult,\n env,\n executionCtx,\n notFoundHandler: this.#notFoundHandler\n });\n if (matchResult[0].length === 1) {\n let res;\n try {\n res = matchResult[0][0][0][0](c, async () => {\n c.res = await this.#notFoundHandler(c);\n });\n } catch (err) {\n return this.#handleError(err, c);\n }\n return res instanceof Promise ? res.then(\n (resolved) => resolved || (c.finalized ? c.res : this.#notFoundHandler(c))\n ).catch((err) => this.#handleError(err, c)) : res ?? this.#notFoundHandler(c);\n }\n const composed = compose(matchResult[0], this.errorHandler, this.#notFoundHandler);\n return (async () => {\n try {\n const context = await composed(c);\n if (!context.finalized) {\n throw new Error(\n \"Context is not finalized. Did you forget to return a Response object or `await next()`?\"\n );\n }\n return context.res;\n } catch (err) {\n return this.#handleError(err, c);\n }\n })();\n }\n /**\n * `.fetch()` will be entry point of your app.\n *\n * @see {@link https://hono.dev/docs/api/hono#fetch}\n *\n * @param {Request} request - request Object of request\n * @param {Env} env - env Object\n * @param {ExecutionContext} executionCtx - context of execution\n * @returns {Response | Promise<Response>} response of request\n *\n */\n fetch = (request, ...rest) => {\n return this.#dispatch(request, rest[1], rest[0], request.method);\n };\n /**\n * `.request()` is a useful method for testing.\n * You can pass a URL or pathname to send a GET request.\n * app will return a Response object.\n * ```ts\n * test('GET /hello is ok', async () => {\n * const res = await app.request('/hello')\n * expect(res.status).toBe(200)\n * })\n * ```\n * @see https://hono.dev/docs/api/hono#request\n */\n request = (input, requestInit, Env, executionCtx) => {\n if (input instanceof Request) {\n return this.fetch(requestInit ? new Request(input, requestInit) : input, Env, executionCtx);\n }\n input = input.toString();\n return this.fetch(\n new Request(\n /^https?:\\/\\//.test(input) ? input : `http://localhost${mergePath(\"/\", input)}`,\n requestInit\n ),\n Env,\n executionCtx\n );\n };\n /**\n * `.fire()` automatically adds a global fetch event listener.\n * This can be useful for environments that adhere to the Service Worker API, such as non-ES module Cloudflare Workers.\n * @deprecated\n * Use `fire` from `hono/service-worker` instead.\n * ```ts\n * import { Hono } from 'hono'\n * import { fire } from 'hono/service-worker'\n *\n * const app = new Hono()\n * // ...\n * fire(app)\n * ```\n * @see https://hono.dev/docs/api/hono#fire\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API\n * @see https://developers.cloudflare.com/workers/reference/migrate-to-module-workers/\n */\n fire = () => {\n addEventListener(\"fetch\", (event) => {\n event.respondWith(this.#dispatch(event.request, event, void 0, event.request.method));\n });\n };\n};\nexport {\n Hono as HonoBase\n};\n", "// src/router/utils.ts\nvar createNullObject = () => /* @__PURE__ */ Object.create(null);\nexport {\n createNullObject\n};\n", "// src/router/reg-exp-router/matcher.ts\nimport { METHOD_NAME_ALL } from \"../../router.js\";\nvar emptyParam = [];\nfunction match(method, path) {\n const matchers = this.buildAllMatchers();\n const match2 = ((method2, path2) => {\n const matcher = matchers[method2] || matchers[METHOD_NAME_ALL];\n const staticMatch = matcher[2][path2];\n if (staticMatch) {\n return staticMatch;\n }\n const match3 = path2.match(matcher[0]);\n if (!match3) {\n return [[], emptyParam];\n }\n const index = match3.indexOf(\"\", 1);\n return [matcher[1][index], match3];\n });\n this.match = match2;\n return match2(method, path);\n}\nexport {\n emptyParam,\n match\n};\n", "// src/router/reg-exp-router/node.ts\nimport { createNullObject } from \"../utils.js\";\nvar LABEL_REG_EXP_STR = \"[^/]+\";\nvar ONLY_WILDCARD_REG_EXP_STR = \".*\";\nvar TAIL_WILDCARD_REG_EXP_STR = \"(?:|/.*)\";\nvar PATH_ERROR = /* @__PURE__ */ Symbol();\nvar regExpMetaChars = new Set(\".\\\\+*[^]$()\");\nfunction compareKey(a, b) {\n if (a.length === 1) {\n return b.length === 1 ? a < b ? -1 : 1 : -1;\n }\n if (b.length === 1) {\n return 1;\n }\n if (a === ONLY_WILDCARD_REG_EXP_STR || a === TAIL_WILDCARD_REG_EXP_STR) {\n return b === TAIL_WILDCARD_REG_EXP_STR ? -1 : 1;\n } else if (b === ONLY_WILDCARD_REG_EXP_STR || b === TAIL_WILDCARD_REG_EXP_STR) {\n return -1;\n }\n if (a === LABEL_REG_EXP_STR) {\n return 1;\n } else if (b === LABEL_REG_EXP_STR) {\n return -1;\n }\n return a.length === b.length ? a < b ? -1 : 1 : b.length - a.length;\n}\nvar Node = class _Node {\n // handler index of a dynamic path, or -1 for a static path terminal\n #index;\n #varIndex;\n #children = createNullObject();\n insert(tokens, index, paramMap, context, isStatic) {\n let node = this;\n for (let i = 0, len = tokens.length; i < len; i++) {\n const token = tokens[i];\n const pattern = token.length === 1 ? token === \"*\" ? i === len - 1 ? [\"\", \"\", ONLY_WILDCARD_REG_EXP_STR] : [\"\", \"\", LABEL_REG_EXP_STR] : null : token === \"/*\" ? [\"\", \"\", TAIL_WILDCARD_REG_EXP_STR] : token.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n let nextNode;\n if (pattern) {\n const name = pattern[1];\n let regexpStr = pattern[2] || LABEL_REG_EXP_STR;\n if (name && pattern[2]) {\n if (regexpStr === \".*\") {\n throw PATH_ERROR;\n }\n regexpStr = regexpStr.replace(/^\\((?!\\?:)(?=[^)]+\\)$)/, \"(?:\");\n if (/\\((?!\\?:)/.test(regexpStr)) {\n throw PATH_ERROR;\n }\n if (regexpStr.length === 1 && regExpMetaChars.has(regexpStr)) {\n throw PATH_ERROR;\n }\n }\n nextNode = node.#children[regexpStr];\n if (!nextNode) {\n if (regexpStr !== ONLY_WILDCARD_REG_EXP_STR && regexpStr !== TAIL_WILDCARD_REG_EXP_STR) {\n for (const k in node.#children) {\n if (\n // a single-char pattern coexists with single-char literals as a literal does\n (regexpStr.length > 1 || k.length > 1) && k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR\n ) {\n throw PATH_ERROR;\n }\n }\n }\n nextNode = node.#children[regexpStr] = new _Node();\n }\n if (name !== \"\") {\n nextNode.#varIndex ??= context.varIndex++;\n paramMap.push([name, nextNode.#varIndex]);\n }\n } else {\n nextNode = node.#children[token];\n if (!nextNode) {\n for (const k in node.#children) {\n if (k.length > 1 && k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR) {\n throw PATH_ERROR;\n }\n }\n nextNode = node.#children[token] = new _Node();\n }\n }\n node = nextNode;\n }\n if (node.#index !== void 0) {\n throw PATH_ERROR;\n }\n node.#index = isStatic ? -1 : index;\n }\n buildRegExpStr() {\n const childKeys = Object.keys(this.#children).sort(compareKey);\n const strList = childKeys.map((k) => {\n const c = this.#children[k];\n const childStr = c.buildRegExpStr();\n return childStr === \"\" ? \"\" : (typeof c.#varIndex === \"number\" ? `(${k})@${c.#varIndex}` : regExpMetaChars.has(k) ? `\\\\${k}` : k) + childStr;\n }).filter(Boolean);\n if (typeof this.#index === \"number\" && this.#index !== -1) {\n strList.unshift(`#${this.#index}`);\n }\n if (strList.length === 0) {\n return \"\";\n }\n if (strList.length === 1) {\n return strList[0];\n }\n return \"(?:\" + strList.join(\"|\") + \")\";\n }\n};\nexport {\n LABEL_REG_EXP_STR,\n Node,\n ONLY_WILDCARD_REG_EXP_STR,\n PATH_ERROR,\n TAIL_WILDCARD_REG_EXP_STR\n};\n", "// src/router/reg-exp-router/trie.ts\nimport { createNullObject } from \"../utils.js\";\nimport { Node } from \"./node.js\";\nvar Trie = class {\n #context = { varIndex: 0 };\n #root = new Node();\n #index = 0;\n // dynamic path -> [handler index, param assoc]; static paths are not registered\n paths = createNullObject();\n insert(path, isStatic) {\n if (isStatic) {\n this.#root.insert(path.split(\"\"), 0, [], this.#context, true);\n return;\n }\n const paramAssoc = [];\n const groups = [];\n let markedPath = path;\n for (let i = 0; ; ) {\n let replaced = false;\n markedPath = markedPath.replace(/\\{[^}]+\\}/g, (m) => {\n const mark = `@\\\\${i}`;\n groups[i] = [mark, m];\n i++;\n replaced = true;\n return mark;\n });\n if (!replaced) {\n break;\n }\n }\n const tokens = markedPath.match(/(?::[^\\/]+)|(?:\\/\\*$)|./g) || [];\n for (let i = groups.length - 1; i >= 0; i--) {\n const [mark] = groups[i];\n for (let j = tokens.length - 1; j >= 0; j--) {\n if (tokens[j].indexOf(mark) !== -1) {\n tokens[j] = tokens[j].replace(mark, groups[i][1]);\n break;\n }\n }\n }\n this.#root.insert(tokens, this.#index, paramAssoc, this.#context, false);\n this.paths[path] = [this.#index++, paramAssoc];\n }\n buildRegExp() {\n let regexp = this.#root.buildRegExpStr();\n if (regexp === \"\") {\n return [/^$/, [], []];\n }\n let captureIndex = 0;\n const indexReplacementMap = [];\n const paramReplacementMap = [];\n regexp = regexp.replace(/#(\\d+)|@(\\d+)|\\.\\*\\$/g, (_, handlerIndex, paramIndex) => {\n if (handlerIndex !== void 0) {\n indexReplacementMap[++captureIndex] = Number(handlerIndex);\n return \"$()\";\n }\n if (paramIndex !== void 0) {\n paramReplacementMap[Number(paramIndex)] = ++captureIndex;\n return \"\";\n }\n return \"\";\n });\n return [new RegExp(`^${regexp}`), indexReplacementMap, paramReplacementMap];\n }\n};\nexport {\n Trie\n};\n", "// src/router/reg-exp-router/router.ts\nimport {\n MESSAGE_MATCHER_IS_ALREADY_BUILT,\n METHOD_NAME_ALL,\n UnsupportedPathError\n} from \"../../router.js\";\nimport { checkOptionalParameter } from \"../../utils/url.js\";\nimport { createNullObject } from \"../utils.js\";\nimport { match, emptyParam } from \"./matcher.js\";\nimport {\n LABEL_REG_EXP_STR,\n ONLY_WILDCARD_REG_EXP_STR,\n PATH_ERROR,\n TAIL_WILDCARD_REG_EXP_STR\n} from \"./node.js\";\nimport { Trie } from \"./trie.js\";\nvar wildcardRegExpCache = createNullObject();\nfunction buildWildcardRegExp(path) {\n return wildcardRegExpCache[path] ??= new RegExp(\n `^${path.replace(\n /\\/:[^/{}]+(?:\\{\\[\\^\\/]\\+})?(?=[/{]|$)|\\/?\\*$|([.\\\\+*[^\\]$()?{}|])/g,\n (match2, metaChar) => metaChar ? `\\\\${metaChar}` : match2 === \"/*\" ? TAIL_WILDCARD_REG_EXP_STR : match2 === \"*\" ? ONLY_WILDCARD_REG_EXP_STR : `/:${LABEL_REG_EXP_STR}`\n )}$`\n );\n}\nfunction findMiddleware(middleware, path) {\n for (const k of Object.keys(middleware).sort((a, b) => b.length - a.length)) {\n if (buildWildcardRegExp(k).test(path)) {\n return [...middleware[k]];\n }\n }\n return void 0;\n}\nvar RegExpRouter = class {\n name = \"RegExpRouter\";\n #middleware;\n #routes;\n #tries;\n constructor() {\n this.#middleware = { [METHOD_NAME_ALL]: createNullObject() };\n this.#routes = { [METHOD_NAME_ALL]: createNullObject() };\n this.#tries = { [METHOD_NAME_ALL]: new Trie() };\n }\n #insertPath(method, path) {\n try {\n this.#tries[method].insert(path, !/\\*|\\/:/.test(path));\n } catch (e) {\n throw e === PATH_ERROR ? new UnsupportedPathError(path) : e;\n }\n }\n add(method, path, handler) {\n const middleware = this.#middleware;\n const routes = this.#routes;\n if (!middleware) {\n throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n }\n if (!middleware[method]) {\n this.#tries[method] = new Trie();\n for (const handlerMap of [middleware, routes]) {\n handlerMap[method] = createNullObject();\n for (const p in handlerMap[METHOD_NAME_ALL]) {\n handlerMap[method][p] = [...handlerMap[METHOD_NAME_ALL][p]];\n this.#insertPath(method, p);\n }\n }\n }\n if (path === \"/*\") {\n path = \"*\";\n }\n const methods = method === METHOD_NAME_ALL ? Object.keys(middleware) : [method];\n if (/\\*$/.test(path)) {\n const re = buildWildcardRegExp(path);\n for (const m of methods) {\n if (!middleware[m][path]) {\n this.#insertPath(m, path);\n middleware[m][path] = findMiddleware(middleware[m], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || [];\n }\n }\n for (const handlerMap of [middleware, routes]) {\n for (const m of methods) {\n for (const p in handlerMap[m]) {\n re.test(p) && handlerMap[m][p].push([handler, path]);\n }\n }\n }\n return;\n }\n const paths = checkOptionalParameter(path) || [path];\n for (const path2 of paths) {\n for (const m of methods) {\n if (!routes[m][path2]) {\n this.#insertPath(m, path2);\n routes[m][path2] = findMiddleware(middleware[m], path2) || findMiddleware(middleware[METHOD_NAME_ALL], path2) || [];\n }\n routes[m][path2].push([handler, path2]);\n }\n }\n }\n match = match;\n buildAllMatchers() {\n const matchers = createNullObject();\n for (const method of Object.keys(this.#routes)) {\n matchers[method] = this.#buildMatcher(method);\n }\n this.#middleware = this.#routes = this.#tries = void 0;\n wildcardRegExpCache = createNullObject();\n return matchers;\n }\n #buildMatcher(method) {\n const middleware = this.#middleware[method];\n const routes = this.#routes[method];\n const trie = this.#tries[method];\n const staticMap = createNullObject();\n const handlerData = [];\n const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp();\n for (const r of [middleware, routes]) {\n for (const path in r) {\n const handlers = r[path];\n const pathData = trie.paths[path];\n if (!pathData) {\n staticMap[path] = [handlers.map(([h]) => [h, createNullObject()]), emptyParam];\n continue;\n }\n handlerData[pathData[0]] = handlers.map(([h, handlerPath]) => [\n h,\n trie.paths[handlerPath][1].reduceRight((map, [key], i) => {\n map[key] = paramReplacementMap[pathData[1][i][1]];\n return map;\n }, createNullObject())\n ]);\n }\n }\n return [regexp, indexReplacementMap.map((i) => handlerData[i]), staticMap];\n }\n};\nexport {\n RegExpRouter\n};\n", "// src/router/smart-router/router.ts\nimport { MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError } from \"../../router.js\";\nvar SmartRouter = class {\n name = \"SmartRouter\";\n #routers = [];\n #routes = [];\n constructor(init) {\n this.#routers = init.routers;\n }\n add(method, path, handler) {\n if (!this.#routes) {\n throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n }\n this.#routes.push([method, path, handler]);\n }\n match(method, path) {\n if (!this.#routes) {\n throw new Error(\"Fatal error\");\n }\n const routers = this.#routers;\n const routes = this.#routes;\n const len = routers.length;\n let i = 0;\n let res;\n for (; i < len; i++) {\n const router = routers[i];\n try {\n for (let i2 = 0, len2 = routes.length; i2 < len2; i2++) {\n router.add(...routes[i2]);\n }\n res = router.match(method, path);\n } catch (e) {\n if (e instanceof UnsupportedPathError) {\n continue;\n }\n throw e;\n }\n this.match = router.match.bind(router);\n this.#routers = [router];\n this.#routes = void 0;\n break;\n }\n if (i === len) {\n throw new Error(\"Fatal error\");\n }\n this.name = `SmartRouter + ${this.activeRouter.name}`;\n return res;\n }\n get activeRouter() {\n if (this.#routes || this.#routers.length !== 1) {\n throw new Error(\"No active router has been determined yet.\");\n }\n return this.#routers[0];\n }\n};\nexport {\n SmartRouter\n};\n", "// src/router/trie-router/node.ts\nimport { METHOD_NAME_ALL } from \"../../router.js\";\nimport { getPattern, splitPath, splitRoutingPath } from \"../../utils/url.js\";\nimport { createNullObject } from \"../utils.js\";\nvar emptyParams = createNullObject();\nvar order = 0;\nvar Node = class _Node {\n #methods = [];\n #children = createNullObject();\n #patterns = [];\n #pattern;\n #params = emptyParams;\n insert(method, path, handler) {\n let curNode = this;\n const parts = splitRoutingPath(path);\n const possibleKeys = /* @__PURE__ */ new Set();\n let i = 0;\n for (const p of parts) {\n const nextP = parts[++i];\n const pattern = getPattern(p, nextP) || (nextP === void 0 && p && p.indexOf(\"*\") === p.length - 1 ? p : null);\n const isParam = Array.isArray(pattern);\n const key = isParam ? pattern[0] : pattern || p;\n const child = curNode.#children[key] ||= new _Node();\n if (pattern && !child.#pattern) {\n child.#pattern = pattern;\n curNode.#patterns.push(child);\n }\n curNode = child;\n if (isParam) {\n possibleKeys.add(pattern[1]);\n }\n }\n curNode.#methods.push({\n [method]: {\n handler,\n possibleKeys: [...possibleKeys],\n score: ++order\n }\n });\n }\n #pushHandlerSets(handlerSets, node, method, nodeParams, params) {\n for (let i = 0, len = node.#methods.length; i < len; i++) {\n const m = node.#methods[i];\n const handlerSet = m[method] || m[METHOD_NAME_ALL];\n if (handlerSet) {\n handlerSet.params = createNullObject();\n handlerSets.push(handlerSet);\n for (let i2 = 0, len2 = handlerSet.possibleKeys.length; i2 < len2; i2++) {\n const key = handlerSet.possibleKeys[i2];\n handlerSet.params[key] = params?.[key] && !i2 ? params[key] : nodeParams[key] ?? params?.[key];\n }\n }\n }\n }\n search(method, path) {\n const handlerSets = [];\n this.#params = emptyParams;\n const curNode = this;\n let curNodes = [curNode];\n const parts = splitPath(path);\n const curNodesQueue = [];\n const len = parts.length;\n let partOffsets = null;\n for (let i = 0; i < len; i++) {\n const part = parts[i];\n const isLast = i === len - 1;\n const tempNodes = [];\n for (let j = 0, len2 = curNodes.length; j < len2; j++) {\n const node = curNodes[j];\n const nextNode = node.#children[part];\n if (nextNode) {\n nextNode.#params = node.#params;\n if (isLast) {\n if (nextNode.#children[\"*\"]) {\n this.#pushHandlerSets(handlerSets, nextNode.#children[\"*\"], method, node.#params);\n }\n this.#pushHandlerSets(handlerSets, nextNode, method, node.#params);\n } else {\n tempNodes.push(nextNode);\n }\n }\n for (const child of node.#patterns) {\n const pattern = child.#pattern;\n const params = node.#params === emptyParams ? {} : { ...node.#params };\n if (typeof pattern === \"string\") {\n if (pattern === \"*\" || part.startsWith(pattern.slice(0, -1))) {\n this.#pushHandlerSets(handlerSets, child, method, node.#params);\n if (pattern === \"*\") {\n child.#params = params;\n tempNodes.push(child);\n }\n }\n continue;\n }\n const [, name, matcher] = pattern;\n if (!part && matcher === true) {\n continue;\n }\n if (matcher !== true) {\n if (!partOffsets) {\n partOffsets = [];\n let offset = path[0] === \"/\" ? 1 : 0;\n for (let p = 0; p < len; p++) {\n partOffsets[p] = offset;\n offset += parts[p].length + 1;\n }\n }\n const restPathString = path.slice(partOffsets[i]);\n const m = matcher.exec(restPathString);\n if (m) {\n params[name] = m[0];\n this.#pushHandlerSets(handlerSets, child, method, node.#params, params);\n if (m[0].length === restPathString.length && child.#children[\"*\"]) {\n this.#pushHandlerSets(\n handlerSets,\n child.#children[\"*\"],\n method,\n node.#params,\n params\n );\n }\n for (const _ in child.#children) {\n child.#params = params;\n const componentCount = m[0].match(/\\//g)?.length ?? 0;\n const targetCurNodes = curNodesQueue[componentCount] ||= [];\n targetCurNodes.push(child);\n break;\n }\n continue;\n }\n }\n if (matcher === true || matcher.test(part)) {\n params[name] = part;\n if (isLast) {\n this.#pushHandlerSets(handlerSets, child, method, params, node.#params);\n if (child.#children[\"*\"]) {\n this.#pushHandlerSets(\n handlerSets,\n child.#children[\"*\"],\n method,\n params,\n node.#params\n );\n }\n } else {\n child.#params = params;\n tempNodes.push(child);\n }\n }\n }\n }\n const shifted = curNodesQueue.shift();\n curNodes = shifted ? tempNodes.concat(shifted) : tempNodes;\n }\n if (handlerSets[1]) {\n handlerSets.sort((a, b) => {\n return a.score - b.score;\n });\n }\n return [handlerSets.map(({ handler, params }) => [handler, params])];\n }\n};\nexport {\n Node\n};\n", "// src/router/trie-router/router.ts\nimport { checkOptionalParameter } from \"../../utils/url.js\";\nimport { Node } from \"./node.js\";\nvar TrieRouter = class {\n name = \"TrieRouter\";\n #node = new Node();\n add(method, path, handler) {\n for (const result of checkOptionalParameter(path) || [path]) {\n this.#node.insert(method, result, handler);\n }\n }\n match(method, path) {\n return this.#node.search(method, path);\n }\n};\nexport {\n TrieRouter\n};\n", "// src/hono.ts\nimport { HonoBase } from \"./hono-base.js\";\nimport { RegExpRouter } from \"./router/reg-exp-router/index.js\";\nimport { SmartRouter } from \"./router/smart-router/index.js\";\nimport { TrieRouter } from \"./router/trie-router/index.js\";\nvar Hono = class extends HonoBase {\n /**\n * Creates an instance of the Hono class.\n *\n * @param options - Optional configuration options for the Hono instance.\n */\n constructor(options = {}) {\n super(options);\n this.router = options.router ?? new SmartRouter({\n routers: [new RegExpRouter(), new TrieRouter()]\n });\n }\n};\nexport {\n Hono\n};\n", "// src/middleware/cors/index.ts\nvar cors = (options) => {\n const opts = {\n origin: \"*\",\n allowMethods: [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\", \"QUERY\"],\n allowHeaders: [],\n exposeHeaders: [],\n ...options\n };\n const exposeHeadersStr = opts.exposeHeaders?.length ? opts.exposeHeaders.join(\",\") : void 0;\n const allowHeadersStr = opts.allowHeaders?.length ? opts.allowHeaders.join(\",\") : void 0;\n const findAllowOrigin = ((optsOrigin) => {\n if (typeof optsOrigin === \"string\") {\n if (optsOrigin === \"*\") {\n return () => optsOrigin;\n } else {\n return (origin) => optsOrigin === origin ? origin : null;\n }\n } else if (typeof optsOrigin === \"function\") {\n return optsOrigin;\n } else {\n return (origin) => optsOrigin.includes(origin) ? origin : null;\n }\n })(opts.origin);\n const findAllowMethods = ((optsAllowMethods) => {\n if (typeof optsAllowMethods === \"function\") {\n return async (origin, c) => (await optsAllowMethods(origin, c)).join(\",\");\n } else if (Array.isArray(optsAllowMethods)) {\n const methodsStr = optsAllowMethods.join(\",\");\n return () => methodsStr;\n } else {\n return () => \"\";\n }\n })(opts.allowMethods);\n return async function cors2(c, next) {\n function set(key, value) {\n c.res.headers.set(key, value);\n }\n const allowOrigin = await findAllowOrigin(c.req.header(\"origin\") || \"\", c);\n if (allowOrigin) {\n set(\"Access-Control-Allow-Origin\", allowOrigin);\n }\n if (opts.credentials) {\n set(\"Access-Control-Allow-Credentials\", \"true\");\n }\n if (exposeHeadersStr) {\n set(\"Access-Control-Expose-Headers\", exposeHeadersStr);\n }\n if (c.req.method === \"OPTIONS\") {\n if (opts.origin !== \"*\") {\n c.res.headers.append(\"Vary\", \"Origin\");\n }\n if (opts.maxAge != null) {\n set(\"Access-Control-Max-Age\", opts.maxAge.toString());\n }\n const allowMethods = await findAllowMethods(c.req.header(\"origin\") || \"\", c);\n if (allowMethods) {\n set(\"Access-Control-Allow-Methods\", allowMethods);\n }\n let headersStr = allowHeadersStr;\n if (!headersStr) {\n const requestHeaders = c.req.header(\"Access-Control-Request-Headers\");\n if (requestHeaders) {\n headersStr = requestHeaders.split(\",\").map((h) => h.trim()).join(\",\");\n }\n }\n if (headersStr) {\n set(\"Access-Control-Allow-Headers\", headersStr);\n c.res.headers.append(\"Vary\", \"Access-Control-Request-Headers\");\n }\n c.res.headers.delete(\"Content-Length\");\n c.res.headers.delete(\"Content-Type\");\n return new Response(null, {\n headers: c.res.headers,\n status: 204,\n statusText: \"No Content\"\n });\n }\n await next();\n if (opts.origin !== \"*\") {\n c.header(\"Vary\", \"Origin\", { append: true });\n }\n };\n};\nexport {\n cors\n};\n", "import type { ProxyBody } from './types.ts';\n\nexport function isProxyBody(value: unknown): value is ProxyBody {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n return isProxyBody(value) ? value : {};\n}\n\nexport function isQueryValue(value: unknown): value is string | number | boolean {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n}\n", "import { Hono } from 'hono';\nimport { asRecord, asString } from './body.ts';\nimport type { AiGateway, ProxyEnv } from './types.ts';\n\nconst DEFAULT_GATEWAY_ID = 'void';\nconst PROVIDER_AUTH_DEFAULTS: Record<string, { header: string; prefix: string }> = {\n 'google-ai-studio': { header: 'x-goog-api-key', prefix: '' },\n};\nconst VOID_FILE_MARKER = '__voidFile';\n\ntype SerializedFileInput = Readonly<{\n [VOID_FILE_MARKER]: true;\n data: string;\n name?: string;\n type?: string;\n}>;\n\ntype SerializedProviderBody = Readonly<\n | { type: 'none' }\n | { type: 'json'; value: unknown }\n | { type: 'text'; data: string; contentType?: string }\n | { type: 'base64'; data: string; contentType?: string }\n | { type: 'form'; entries: Array<{ name: string; value: string | SerializedFileInput }> }\n>;\n\nclass BadRequestError extends Error {}\n\nconst ai = new Hono<ProxyEnv>();\n\nfunction hasStreamFlag(value: unknown): value is { stream?: boolean } {\n return typeof value === 'object' && value !== null && 'stream' in value;\n}\n\nfunction isBinaryView(value: unknown): value is ArrayBufferView {\n return ArrayBuffer.isView(value);\n}\n\nfunction isSerializedFileInput(value: unknown): value is SerializedFileInput {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as Record<string, unknown>)[VOID_FILE_MARKER] === true &&\n typeof (value as Record<string, unknown>).data === 'string' &&\n ((value as Record<string, unknown>).name === undefined ||\n typeof (value as Record<string, unknown>).name === 'string') &&\n ((value as Record<string, unknown>).type === undefined ||\n typeof (value as Record<string, unknown>).type === 'string')\n );\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n let binary: string;\n try {\n binary = atob(base64);\n } catch {\n throw new BadRequestError('invalid file data');\n }\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction gatewayEndpointUrl(baseUrl: string, endpoint: string): string {\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint.slice(1) : endpoint;\n return `${normalizedBase}/${normalizedEndpoint}`;\n}\n\nfunction isUnsafeProviderPath(path: string): boolean {\n if (/^(?:[a-z][a-z0-9+.-]*:)?\\/\\//i.test(path) || path.includes('\\\\')) {\n return true;\n }\n\n const pathname = path.split(/[?#]/, 1)[0] ?? '';\n for (const segment of pathname.split('/')) {\n try {\n if (decodeURIComponent(segment) === '..') {\n return true;\n }\n } catch {\n return true;\n }\n }\n\n return false;\n}\n\nfunction providerBody(value: unknown): SerializedProviderBody {\n const record = asRecord(value);\n const type = asString(record.type);\n if (\n type === 'none' ||\n type === 'json' ||\n type === 'text' ||\n type === 'base64' ||\n type === 'form'\n ) {\n return record as SerializedProviderBody;\n }\n return { type: 'none' };\n}\n\nfunction appendSerializedFormValue(\n form: FormData,\n name: string,\n value: string | SerializedFileInput,\n): void {\n if (isSerializedFileInput(value)) {\n const blob = new Blob([base64ToBytes(value.data)], {\n type: value.type ?? 'application/octet-stream',\n });\n form.append(name, blob, value.name ?? name);\n return;\n }\n form.append(name, value);\n}\n\nfunction providerRequestBody(body: SerializedProviderBody): {\n body?: BodyInit;\n contentType?: string;\n} {\n if (body.type === 'none') {\n return {};\n }\n\n if (body.type === 'json') {\n return { body: JSON.stringify(body.value), contentType: 'application/json' };\n }\n\n if (body.type === 'text') {\n return { body: body.data, contentType: body.contentType };\n }\n\n if (body.type === 'base64') {\n return {\n body: base64ToBytes(body.data).buffer as ArrayBuffer,\n contentType: body.contentType,\n };\n }\n\n const form = new FormData();\n for (const entry of body.entries) {\n appendSerializedFormValue(form, entry.name, entry.value);\n }\n return { body: form };\n}\n\nfunction headersFromRecord(value: unknown): Headers {\n const headers = new Headers();\n for (const [key, headerValue] of Object.entries(asRecord(value))) {\n if (typeof headerValue === 'string') {\n headers.set(key, headerValue);\n }\n }\n return headers;\n}\n\nfunction providerAuthDefaults(provider: string): { header: string; prefix: string } {\n return PROVIDER_AUTH_DEFAULTS[provider] ?? { header: 'authorization', prefix: 'Bearer ' };\n}\n\nfunction gatewayOptions(\n value: unknown,\n projectId: string,\n gatewayId: string,\n): Record<string, unknown> {\n const options = asRecord(value);\n const gateway = asRecord(options.gateway);\n const metadata = asRecord(gateway.metadata);\n\n return {\n ...options,\n gateway: {\n ...gateway,\n id: gatewayId,\n metadata: {\n ...metadata,\n projectId,\n },\n },\n };\n}\n\nfunction applyProviderHeaders({\n headers,\n provider,\n providerKey,\n projectId,\n apiKeyHeader,\n apiKeyPrefix,\n contentType,\n}: {\n headers: Headers;\n provider: string;\n providerKey: string;\n projectId: string;\n apiKeyHeader?: string | null;\n apiKeyPrefix?: string | null;\n contentType?: string;\n}): Headers {\n const defaults = providerAuthDefaults(provider);\n const keyHeader = apiKeyHeader ?? defaults.header;\n const keyPrefix = apiKeyPrefix ?? defaults.prefix;\n\n headers.set(keyHeader, `${keyPrefix}${providerKey}`);\n headers.set('cf-aig-metadata-projectId', projectId);\n if (contentType && !headers.has('content-type')) {\n headers.set('content-type', contentType);\n }\n return headers;\n}\n\nfunction headersForContentType(contentType: string | null | undefined): HeadersInit | undefined {\n return contentType ? { 'content-type': contentType } : undefined;\n}\n\nfunction filteredResponseHeaders(response: Response): Headers {\n const headers = new Headers();\n const contentType = response.headers.get('content-type');\n const cacheControl = response.headers.get('cache-control');\n if (contentType) {\n headers.set('content-type', contentType);\n }\n if (cacheControl) {\n headers.set('cache-control', cacheControl);\n }\n return headers;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction responseFromThrown(value: unknown): Response | null {\n if (value instanceof Response) {\n return value;\n }\n\n if (!isRecord(value)) {\n return null;\n }\n\n if (value.response instanceof Response) {\n return value.response;\n }\n\n return responseFromThrown(value.cause);\n}\n\nfunction statusFromThrown(value: unknown): number | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const status = value.status ?? value.statusCode;\n if (typeof status === 'number' && Number.isInteger(status) && status >= 400 && status <= 599) {\n return status;\n }\n\n return statusFromThrown(value.cause);\n}\n\nfunction messageFromThrown(value: unknown): string {\n if (value instanceof Error) {\n return value.message;\n }\n\n return String(value);\n}\n\nfunction hasResponseMethod(value: unknown): value is { response(): Response | Promise<Response> } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'response' in value &&\n typeof (value as { response?: unknown }).response === 'function'\n );\n}\n\nasync function responseFromAiResult(result: unknown, streamAsSse: boolean): Promise<Response> {\n if (result instanceof Response) {\n return result;\n }\n\n if (hasResponseMethod(result)) {\n return result.response();\n }\n\n if (result instanceof ReadableStream) {\n return new Response(result, {\n headers: streamAsSse\n ? {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache',\n }\n : { 'content-type': 'application/octet-stream' },\n });\n }\n\n if (result instanceof Blob) {\n return new Response(result, { headers: headersForContentType(result.type) });\n }\n\n if (result instanceof ArrayBuffer || isBinaryView(result)) {\n return new Response(result, { headers: { 'content-type': 'application/octet-stream' } });\n }\n\n return Response.json(result);\n}\n\nasync function responseFromAiError(err: unknown): Promise<Response> {\n const response = responseFromThrown(err);\n if (response) {\n return responseFromGateway(response, false);\n }\n\n const status = statusFromThrown(err) ?? 502;\n return Response.json({ error: messageFromThrown(err) }, { status });\n}\n\nasync function responseFromGateway(response: Response, streamAsSse: boolean): Promise<Response> {\n if (streamAsSse && response.body) {\n return new Response(response.body, {\n headers: {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache',\n 'access-control-allow-origin': '*',\n },\n });\n }\n\n return new Response(response.body, {\n status: response.status,\n headers: filteredResponseHeaders(response),\n });\n}\n\nai.post('/run', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const model = asString(body.model);\n\n if (!model) {\n return context.json({ error: 'model required' }, 400);\n }\n\n const options = gatewayOptions(\n body.options,\n projectId,\n context.env.AI_GATEWAY_ID ?? DEFAULT_GATEWAY_ID,\n );\n\n try {\n const result = await context.env.AI.run(model, body.inputs, options);\n return responseFromAiResult(result, hasStreamFlag(body.inputs) && body.inputs.stream === true);\n } catch (err) {\n const message = messageFromThrown(err);\n console.error('AI inference error:', message);\n return responseFromAiError(err);\n }\n});\n\nai.post('/provider', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const provider = asString(body.provider);\n const path = asString(body.path);\n const method = asString(body.method) ?? 'POST';\n const providerKey = asString(body.providerKey);\n const apiKeyHeader = asString(body.apiKeyHeader);\n const apiKeyPrefix = asString(body.apiKeyPrefix);\n\n if (!provider) {\n return context.json({ error: 'provider required' }, 400);\n }\n if (!path) {\n return context.json({ error: 'path required' }, 400);\n }\n if (!providerKey) {\n return context.json({ error: 'providerKey required' }, 400);\n }\n if (isUnsafeProviderPath(path)) {\n return context.json({ error: 'path must be relative' }, 400);\n }\n\n try {\n const gateway = context.env.AI.gateway(context.env.AI_GATEWAY_ID ?? DEFAULT_GATEWAY_ID);\n const baseUrl = await gateway.getUrl(provider);\n const requestBody = providerRequestBody(providerBody(body.body));\n const headers = applyProviderHeaders({\n headers: headersFromRecord(body.headers),\n provider,\n providerKey,\n projectId,\n apiKeyHeader,\n apiKeyPrefix,\n contentType: requestBody.contentType,\n });\n const response = await fetch(gatewayEndpointUrl(baseUrl, path), {\n method,\n headers,\n body: requestBody.body,\n });\n\n if (!response.ok) {\n const text = await response.text();\n let error: string;\n try {\n const json = JSON.parse(text);\n error = json.error?.message ?? text;\n } catch {\n error = text;\n }\n return context.json({ error }, response.status as 400);\n }\n\n return responseFromGateway(response, false);\n } catch (err) {\n if (err instanceof BadRequestError) {\n return context.json({ error: err.message }, 400);\n }\n const message = err instanceof Error ? err.message : String(err);\n console.error('AI Gateway error:', message);\n return context.json({ error: 'gateway error' }, 502);\n }\n});\n\nai.post('/models', async (context) => {\n const body = context.get('body');\n try {\n const result = await context.env.AI.models(body.inputs);\n return context.json(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error('AI inference error:', message);\n return context.json({ error: 'inference error' }, 502);\n }\n});\n\nai.post('/toMarkdown', async (context) => {\n const body = context.get('body');\n try {\n const result = await context.env.AI.toMarkdown(body.inputs, body.options);\n return context.json(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error('AI inference error:', message);\n return context.json({ error: 'inference error' }, 502);\n }\n});\n\nexport { ai };\n", "export function proxyCapabilityEnabled(value: string | undefined, capability: string): boolean {\n if (capability === 'sandbox') {\n return false;\n }\n if (!value) {\n return true;\n }\n try {\n const parsed = JSON.parse(value) as unknown;\n return (\n !!parsed &&\n typeof parsed === 'object' &&\n !Array.isArray(parsed) &&\n (parsed as Record<string, unknown>)[capability] === true\n );\n } catch {\n return false;\n }\n}\n", "import type { Env } from './types.ts';\n\ntype WorkerResolution = Readonly<{ workerName: string; deploymentId: string }>;\n\ntype DispatchOptions = Readonly<{\n /** Read-only operations may retry through their REST fallback after a transport failure. */\n fallbackOnDispatchError?: boolean;\n}>;\n\n/**\n * Resolve the active deployment's worker through the API service binding.\n *\n * This lookup intentionally runs for every operation. The project id is stable,\n * while rollback changes the active deployment and therefore the worker name.\n */\nasync function resolveWorker(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n): Promise<WorkerResolution | null> {\n const token = await hmacSign(projectId, jwtSecret);\n const res = await api.fetch(`https://api/internal/resolve-worker/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n });\n\n if (res.status === 404 || res.status === 409) {\n return null;\n }\n if (!res.ok) {\n throw new Error(`worker resolution failed with status ${res.status}`);\n }\n\n const data = await res.json<Partial<WorkerResolution>>();\n if (typeof data.workerName !== 'string' || typeof data.deploymentId !== 'string') {\n throw new Error('worker resolution returned an invalid response');\n }\n return { workerName: data.workerName, deploymentId: data.deploymentId };\n}\n\n/**\n * Dispatch a binding operation to the user's deployed worker via Workers for Platforms.\n * The user worker handles it via native D1/KV/R2 bindings at the `/__void/*` route.\n *\n * Returns the Response if successful, or null if the worker doesn't support /__void\n * (404 = old deploy without the handler \u2192 caller should fall back to REST API).\n */\nexport async function dispatchToWorker(\n env: Env,\n projectId: string,\n path: string,\n body: Record<string, unknown>,\n options: DispatchOptions = {},\n): Promise<Response | null> {\n let resolution: WorkerResolution | null;\n try {\n resolution = await resolveWorker(env.API, env.JWT_SECRET, projectId);\n } catch {\n return options.fallbackOnDispatchError\n ? null\n : Response.json({ error: 'active worker resolution failed' }, { status: 502 });\n }\n if (!resolution) {\n return null;\n }\n\n const proxyToken = await hmacSign(projectId, env.JWT_SECRET);\n let worker: Fetcher;\n try {\n worker = env.DISPATCH.get(resolution.workerName);\n } catch {\n return null;\n }\n\n try {\n const res = await worker.fetch(`https://worker/__void${path}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': proxyToken,\n },\n body: JSON.stringify(body),\n });\n\n // 404 means old deploy without /__void handler \u2192 fall back\n if (res.status === 404) {\n return null;\n }\n\n return res;\n } catch {\n // A write may already have committed before a response/transport failure.\n // Only explicitly read-only callers may replay through a REST fallback.\n return options.fallbackOnDispatchError\n ? null\n : Response.json(\n { error: 'worker dispatch failed; operation result is unknown' },\n { status: 502 },\n );\n }\n}\n\n// --- HMAC signing (mirrors resolve.ts) ---\n\nconst encoder = new TextEncoder();\nlet cachedSignKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getSignKey(secret: string): Promise<CryptoKey> {\n if (cachedSignKey && cachedKeySecret === secret) {\n return cachedSignKey;\n }\n cachedSignKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n cachedKeySecret = secret;\n return cachedSignKey;\n}\n\nasync function hmacSign(data: string, secret: string): Promise<string> {\n const key = await getSignKey(secret);\n const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(data));\n const binary = String.fromCharCode(...new Uint8Array(sig));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n", "// In-memory cache: resource mappings are stable (only change on deploy).\n// Persists across requests within the same CF worker isolate.\nconst cache = new Map<string, string>();\n\n/** @internal Exposed for testing only. */\nexport function clearResolveCache() {\n cache.clear();\n}\n\n/**\n * Resolves a project's binding to its Cloudflare resource ID via the API service binding.\n * Results are cached in-memory per isolate \u2014 the first call per binding hits the API,\n * subsequent calls return instantly.\n */\nexport async function resolveResource(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n type: 'd1' | 'kv' | 'r2',\n bindingName: string,\n): Promise<string> {\n const cacheKey = `${projectId}:${type}:${bindingName}`;\n const cached = cache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const token = await hmacSign(projectId, jwtSecret);\n const res = await api.fetch(`https://api/internal/resolve-resource/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({ type, binding: bindingName }),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => res.statusText);\n throw new Error(`Resource resolution failed (${res.status}): ${text}`);\n }\n\n const data = await res.json<{ cf_id: string }>();\n cache.set(cacheKey, data.cf_id);\n return data.cf_id;\n}\n\n/**\n * Verifies that an actor still has deploy-equivalent project access through\n * the API service binding. The endpoint keeps its legacy name during rollout.\n */\nexport async function verifyProjectDeployAccess(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n userId: string,\n jwt?: string,\n accessAssertion?: string,\n proxyOrigin?: string,\n): Promise<boolean> {\n try {\n if (!proxyOrigin || new URL(proxyOrigin).origin !== proxyOrigin) {\n return false;\n }\n const token = await hmacSign(ownerVerificationMessage(projectId, proxyOrigin), jwtSecret);\n const res = await api.fetch(`https://api/internal/verify-owner/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({\n userId,\n ...(jwt ? { jwt } : {}),\n ...(accessAssertion ? { accessAssertion } : {}),\n proxyOrigin,\n }),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport function ownerVerificationMessage(projectId: string, proxyOrigin: string): string {\n return `void-proxy-owner-v2\\n${projectId}\\n${proxyOrigin}`;\n}\n\n/** Revalidate the authority from which a scoped prerender credential was derived. */\nexport async function verifyPrerenderAuthority(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n userId: string,\n provenance: { buildId?: string; credentialId?: string },\n): Promise<boolean> {\n try {\n const token = await hmacSign(projectId, jwtSecret);\n const res = await api.fetch(`https://api/internal/verify-prerender-build/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({ userId, ...provenance }),\n });\n if (res.status === 400 && !provenance.buildId && !provenance.credentialId) {\n // The previous API revision required provenance here. Preserve manual\n // prerenders while the proxy and API revisions overlap during rollout.\n const body = await res.json<{ error?: unknown }>().catch(() => null);\n return body?.error === 'userId and credential provenance required';\n }\n return res.ok;\n } catch {\n // Project-data access fails closed if the revocation authority is\n // unavailable. A build can retry without widening its credential.\n return false;\n }\n}\n\n// --- HMAC signing (mirrors packages/api/src/auth/hmac.ts) ---\n\nconst encoder = new TextEncoder();\nlet cachedSignKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getSignKey(secret: string): Promise<CryptoKey> {\n if (cachedSignKey && cachedKeySecret === secret) {\n return cachedSignKey;\n }\n cachedSignKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n cachedKeySecret = secret;\n return cachedSignKey;\n}\n\nasync function hmacSign(data: string, secret: string): Promise<string> {\n const key = await getSignKey(secret);\n const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(data));\n const binary = String.fromCharCode(...new Uint8Array(sig));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n", "import { Hono } from 'hono';\nimport { asString } from './body.ts';\nimport { dispatchToWorker } from './dispatch.ts';\nimport { resolveResource } from './resolve.ts';\nimport type { ProxyEnv } from './types.ts';\n\nconst CF_API = 'https://api.cloudflare.com/client/v4';\n\nconst d1 = new Hono<ProxyEnv>();\n\nd1.post('/query', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const sql = asString(body.sql);\n\n if (!binding || !sql) {\n return context.json({ error: 'binding and sql required' }, 400);\n }\n\n // Try WfP dispatch first (native bindings, ~1-5ms)\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/d1/query', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API (for old deploys without /__void handler)\n let dbId: string;\n try {\n dbId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'd1', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/d1/database/${dbId}/query`,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${context.env.CF_API_TOKEN}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ sql, params: body.params ?? [] }),\n },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'D1 query failed', status: cfRes.status }, 502);\n }\n\n const cfData = (await cfRes.json()) as {\n result?: ReadonlyArray<{\n results?: ReadonlyArray<Record<string, unknown>>;\n meta?: Record<string, unknown>;\n }>;\n };\n const queryResult = cfData.result?.[0];\n\n if (!queryResult) {\n return context.json({ error: 'unexpected D1 response' }, 502);\n }\n\n switch (body.method) {\n case 'first':\n return context.json(queryResult.results?.[0] ?? null);\n case 'raw': {\n const columns = queryResult.results?.length ? Object.keys(queryResult.results[0]) : [];\n const values = (queryResult.results ?? []).map((row) => Object.values(row));\n return context.json({ columns, results: values, meta: queryResult.meta });\n }\n case 'run':\n return context.json({ success: true, meta: queryResult.meta });\n case 'all':\n default:\n return context.json({\n results: queryResult.results ?? [],\n success: true,\n meta: queryResult.meta,\n });\n }\n});\n\nd1.post('/batch', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding || !Array.isArray(body.statements)) {\n return context.json({ error: 'binding and statements required' }, 400);\n }\n\n // Try WfP dispatch first (native db.batch() with transactional guarantees)\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/d1/batch', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // There is no sequential fallback: D1Database.batch() promises one atomic\n // native batch. If the active worker cannot provide that capability, fail\n // before issuing any statement rather than partially applying the batch.\n return context.json({ error: 'atomic D1 batch unavailable for active deployment' }, 503);\n});\n\nexport { d1 };\n", "const EMAIL_REQUEST_DEADLINE_MS = 5_000;\nconst decoder = new TextDecoder('utf-8', { fatal: true, ignoreBOM: false });\n\nasync function beforeDeadline<T>(deadline: number, run: () => Promise<T>): Promise<T> {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new Error('email request timeout');\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n return Promise.race([\n run(),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error('email request timeout')), remaining);\n }),\n ]).finally(() => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n });\n}\n\n/** Bound public email request bodies before JSON parsing or authentication. */\nexport async function readEmailRequestJson(\n request: Request,\n maxBytes = 2 * 1024,\n): Promise<unknown> {\n const declaredLength = request.headers.get('content-length');\n if (\n request.headers.has('content-encoding') ||\n !request.body ||\n (declaredLength !== null &&\n (!/^\\d+$/.test(declaredLength) || Number(declaredLength) > maxBytes))\n ) {\n void request.body?.cancel().catch(() => {});\n throw new Error('invalid email request body');\n }\n const expectedLength = declaredLength === null ? null : Number(declaredLength);\n const reader = request.body.getReader();\n let bytes = new Uint8Array(Math.min(1024, maxBytes));\n const deadline = Date.now() + EMAIL_REQUEST_DEADLINE_MS;\n let size = 0;\n try {\n for (;;) {\n const chunk = await beforeDeadline(deadline, () => reader.read());\n if (chunk.done) {\n break;\n }\n const nextSize = size + chunk.value.byteLength;\n if (nextSize > maxBytes) {\n throw new Error('email request body too large');\n }\n if (nextSize > bytes.byteLength) {\n const grown = new Uint8Array(Math.min(maxBytes, Math.max(nextSize, bytes.byteLength * 2)));\n grown.set(bytes.subarray(0, size));\n bytes = grown;\n }\n bytes.set(chunk.value, size);\n size = nextSize;\n }\n } finally {\n // An uncooperative stream may never settle cancellation. Start cleanup,\n // but do not let it extend the hard request-body deadline.\n void reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n if (size === 0 || (expectedLength !== null && size !== expectedLength)) {\n throw new Error('invalid email request body length');\n }\n return JSON.parse(decoder.decode(bytes.subarray(0, size)));\n}\n", "import { isReservedEmailSlug } from '@voidcloud/api/reserved-slugs';\nimport { EmailMessage } from 'cloudflare:email';\nimport { Hono } from 'hono';\nimport type { Context } from 'hono';\nimport { asString } from './body.ts';\nimport {\n admitEmail,\n emailPayloadDigest,\n finishEmailAttempt,\n startEmailAttempt,\n} from './email-admission.ts';\nimport { leaseBearer, leaseEmailDomainCredential } from './email-lease.ts';\nimport {\n EMAIL_PROVIDER_DEADLINE_MS,\n EmailProviderTimeoutError,\n createEmailProviderDeadline,\n type EmailProviderDeadline,\n} from './email-provider-deadline.ts';\nimport type { Env, ProxyEnv } from './types.ts';\n\nconst app = new Hono<ProxyEnv>();\n// The SDK aborts at 60s. Body/auth can precede this handler, and final ledger\n// writes need time after provider work stops.\nconst EMAIL_SEND_DEADLINE_MS = 50_000;\nconst EMAIL_SEND_FINALIZATION_MARGIN_MS = 5_000;\n\n/**\n * Cap inbound MIME bytes well below CF's ~10 MB base64-inflated ceiling. The\n * framework enforces the same cap client-side; this is the proxy-side belt to\n * the framework's suspenders.\n */\nexport const MAX_MIME_BYTES = 5 * 1024 * 1024;\nconst MAX_CUSTOM_HEADER_BYTES = 16 * 1024;\nconst BUILTIN_MIME_HEADERS = new Set([\n 'from',\n 'to',\n 'cc',\n 'bcc',\n 'subject',\n 'reply-to',\n 'date',\n 'message-id',\n 'in-reply-to',\n 'references',\n 'mime-version',\n 'content-type',\n 'content-transfer-encoding',\n 'content-disposition',\n]);\n\n/** Bound only app-defined top-level fields, including folded continuation lines. */\nexport function customMimeHeaderBytesWithinLimit(raw: Uint8Array): boolean {\n let used = 0;\n let custom = false;\n for (let start = 0; start < raw.byteLength;) {\n let end = start;\n while (end < raw.byteLength && raw[end] !== 10) {\n end++;\n }\n const lineEnd = end > start && raw[end - 1] === 13 ? end - 1 : end;\n if (lineEnd === start) {\n return true;\n }\n if (raw[start] !== 32 && raw[start] !== 9) {\n let colon = start;\n while (colon < lineEnd && raw[colon] !== 58) {\n colon++;\n }\n const name = new TextDecoder().decode(raw.subarray(start, colon)).toLowerCase();\n custom = colon < lineEnd && !BUILTIN_MIME_HEADERS.has(name);\n }\n if (custom) {\n used += lineEnd - start + 2;\n if (used > MAX_CUSTOM_HEADER_BYTES) {\n return false;\n }\n }\n start = end + 1;\n }\n return true;\n}\n\n/** Bound the raw list before normalization allocates one copy and Set entry per recipient. */\nconst MAX_RECIPIENTS = 50;\n\n/**\n * Bound each address before normalization copies it. RFC 5321 caps a\n * forward-path at 256 octets, so 320 characters leaves room for validation.\n */\nconst MAX_RECIPIENT_LENGTH = 320;\n\n/**\n * Cap the envelope sender for the same reason. It is one string, so there\n * is no list amplifier, but `from.toLowerCase()` below copies it whole\n * (measured: V8 returns a fresh full-size string even when nothing\n * changed), and a sender the strict regex accepts \u2014 an unbounded `+tag`\n * is one \u2014 is then echoed verbatim into the MIME `From:` refusal and\n * serialized into the response. Check it before those copies. The limit\n * matches `MAX_RECIPIENT_LENGTH`.\n */\nconst MAX_SENDER_LENGTH = 320;\n\n/**\n * The platform mail domain for this environment. It is configured as the\n * `EMAIL_SENDER_DOMAIN` var and mirrored into deployed user workers as the\n * `__VOID_EMAIL_DOMAIN` plain-text binding so the framework builds its default\n * `from` against the same zone.\n *\n * There is deliberately NO baked-in default. A staging proxy that fell back\n * to `mail.void.cloud` would accept a `from` on the production zone, and the\n * production sender regex would reject every legitimate staging sender \u2014 the\n * exact reason the domain stopped being a constant. Missing configuration\n * fails the send CLOSED.\n */\nexport function readSenderDomain(env: Pick<Env, 'EMAIL_SENDER_DOMAIN'>): string | null {\n const raw = env.EMAIL_SENDER_DOMAIN;\n if (typeof raw !== 'string') {\n return null;\n }\n const domain = raw.trim().toLowerCase();\n return domain.length > 0 ? domain : null;\n}\n\n/** Regex metacharacters, escaped before a config value is interpolated. */\nconst RE_METACHARS_RE = /[.*+?^${}()|[\\]\\\\]/g;\n\nfunction escapeRegExp(value: string): string {\n return value.replace(RE_METACHARS_RE, '\\\\$&');\n}\n\n/**\n * Memoized per-domain sender regexes. Keyed by the configured\n * `EMAIL_SENDER_DOMAIN`, which is worker configuration and not user input,\n * so the map holds exactly one entry per isolate in practice.\n */\nconst strictFromCache = new Map<string, RegExp>();\n\n/**\n * Strict shape for the outbound `from` envelope address. The slug+domain\n * pinning logic below splits on `+` and the first `@`, but those splits do\n * NOT reject CR/LF, quotes, angle brackets, or display-name forms. Without\n * this regex, a `from` like `slug+x\\r\\nX-Header: y@<domain>` would pass slug\n * pinning and then reach `new EmailMessage(from, ...)`, opening an SMTP\n * header injection primitive against the shared sender. The regex pins the\n * entire string to: lowercase ASCII local-part, zero or more `+<safe-tag>`\n * segments (constrained to RFC-5321 dot-atom-text + `=` and `/`), then exactly\n * `@<EMAIL_SENDER_DOMAIN>`. Display names, encoded-words, and angle brackets\n * are intentionally not supported \u2014 the framework doesn't emit them for a\n * default `from`, and explicit user-supplied names are already disallowed by\n * the slug pin.\n *\n * The `+tag` class is a positive class rather than `[^@\\s]+` so even\n * non-printable ASCII (NUL, BEL, DEL, \u2026) can't ride into `EmailMessage`.\n *\n * The domain is escaped before interpolation so a misconfigured value can\n * never widen the pattern (an unescaped `.` would match any character).\n */\nexport function strictFromRe(domain: string): RegExp {\n const cached = strictFromCache.get(domain);\n if (cached) {\n return cached;\n }\n const re = new RegExp(`^[a-z0-9._-]+(?:\\\\+[a-z0-9._=/-]+)*@${escapeRegExp(domain)}$`);\n strictFromCache.set(domain, re);\n return re;\n}\n\n/**\n * Strip CR/LF/NUL/control chars before logging or surfacing to remote MTAs.\n *\n * Built via new RegExp so oxlint's no-control-regex rule (which fires\n * on even Unicode-escaped control refs in regex literals) does not\n * reject the pattern. Behavior is identical to a literal regex.\n *\n * Slice FIRST, then replace \u2014 the same order as `sanitize` in\n * `email-router.ts`, for the same reason: a global replace materializes one\n * part per match, so a control-heavy input costs far more than one copy\n * (measured: a 5 MB `\\na\\na\u2026` value is +170 MB of transient heap through the\n * old replace-then-slice order, past the 128 MB isolate ceiling; slice-first\n * is 0 ms). Most callers already pass bounded values; `requestId` at intake\n * and the inbound `Subject:` header did not. The result is at most `maxLen`\n * chars and may be shorter \u2014 a control run inside the window collapses to\n * one space and nothing is refilled from beyond it \u2014 which loses nothing on\n * a log line.\n */\n// oxlint-disable-next-line no-control-regex\nconst CONTROL_CHARS_RE = new RegExp('[\\\\u0000-\\\\u001f\\\\u007f]+', 'g');\nfunction sanitizeForLog(value: string, maxLen = 200): string {\n return value.slice(0, maxLen).replace(CONTROL_CHARS_RE, ' ');\n}\n\n/**\n * Cap the caller-supplied log correlation id. The framework sends 16 hex\n * chars (`newRequestId` in `void/email`), but a hand-built tenant worker can\n * send any string the request body carries, and the only consumer is the\n * `[email-log]` line \u2014 one per delivery, so up to `MAX_RECIPIENTS` copies of\n * it per request \u2014 in the shared proxy log stream. It is diagnostic, so it\n * is bounded and sanitized ONCE at intake rather than refused with a 400:\n * a missing or non-string id already logs as `unknown` instead of failing\n * the send, and a truncated id is no less useful to correlate on. The\n * control-char strip is what stops a `\\n` in the id from forging a second\n * `[email-log]` line under another project's id. 128 leaves room for a\n * UUID or a prefixed id without inviting anything longer.\n */\nconst MAX_REQUEST_ID_LENGTH = 128;\n\n/**\n * Wrap a Uint8Array as a single-chunk ReadableStream. CF's EmailMessage\n * constructor accepts `string | ReadableStream`; passing a Uint8Array\n * directly is a TS error. Streaming a single chunk avoids decoding to\n * UTF-8 (which would corrupt non-text MIME parts that happen to be\n * stored in their decoded form).\n */\nfunction bytesToStream(bytes: Uint8Array): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(bytes);\n controller.close();\n },\n });\n}\n\n/**\n * The addr-spec named by the message-level `From:` header, or why there is\n * no single one to name.\n *\n * `/send` pins the ENVELOPE sender (`from`) to the calling project's slug,\n * but the bytes a recipient's mail client shows as the sender are the MIME\n * `From:` header inside `mimeBase64`, and a tenant worker holding its own\n * project HMAC can post any bytes it likes there. Cloudflare's local\n * `send_email` simulator (miniflare `send_email.worker.ts`) throws\n * `From: header does not match mail from` for exactly this, and its author\n * says the messages mirror production \u2014 but nothing in the public docs\n * promises it, the same simulator takes the LAST of several `From:` headers\n * and the FIRST mailbox of a list, and the proxy is the platform's tenancy\n * boundary. So the proxy checks itself: exactly one `From:` header, holding\n * exactly one mailbox, whose addr-spec is the authorized envelope sender.\n *\n * Scope is deliberately narrow. The display name (a quoted-string or RFC\n * 2047 encoded-words before `<\u2026>`) is NOT inspected \u2014 closing display-name\n * spoofing would need a real RFC 5322 scanner tracking `buildMime` forever,\n * and stays handed back. The structural specials outside quotes\n * (`, ; : ( ) [ ] \\` and a bare `@` before `<`) are refused only because\n * each one would make \"which mailbox is this\" ambiguous \u2014 a list, a group,\n * a comment or a phrase that reads as an address \u2014 and `buildMime` never\n * emits any of them unquoted. `Sender:`, `Reply-To:` and `Resent-From:` are\n * not pinned: no client presents them as the author, and a reply sent to a\n * sibling project's inbound address is something anyone can do without the\n * proxy.\n *\n * Every line of the header block is visited so a `From:` cannot hide\n * behind an unrelated header, and continuation lines (leading WSP) are\n * unfolded onto the header they extend. The scan stops at the first empty\n * line \u2014 a `From:` inside a MIME part's own headers is that part's, not the\n * message's \u2014 or at the end of `raw`, which `MAX_MIME_BYTES` already\n * bounds. The work is one linear pass over bytes that are already in\n * memory; only the `From:` value is ever decoded to a string, and the\n * tokenizer below is a single pass with no backtracking, so a display\n * name of any length (which `buildMime` allows) costs what it weighs.\n *\n * \"What it weighs\" has to mean BYTES, not lines. The scan keeps nothing\n * per line \u2014 only the byte offsets of the one `From:` it found \u2014 because\n * `MAX_MIME_BYTES` bounds bytes and a folded header can hold one line per\n * three of them (` \\r\\n`): 3.5 million continuations fit in 10 MiB, and an\n * earlier shape that retained one `subarray` view per continuation held\n * ~125 bytes of heap each \u2014 437 MB, measured, in an isolate of 128 MB that\n * every tenant's AI/D1/KV/R2 traffic shares. The same message with no\n * `From:` cost 1 MB, so the amplifier was the `From:` itself. The value is\n * unfolded with ONE copy of the header's byte range, and no copy at all\n * when it did not fold.\n *\n * Header names are matched the way lenient parsers (postal-mime, which\n * miniflare uses) match them \u2014 bytes before the first `:` with trailing\n * WSP trimmed, case-insensitively \u2014 so `From :` counts as a second `From:`\n * rather than slipping past as an unknown header. A bare CR inside a line\n * fails the scan: `buildMime` rejects CR/LF in every value, and a parser\n * that splits on LF alone would read the bytes after it as part of the\n * same header.\n */\nexport type MimeFrom =\n | { ok: true; addrSpec: string }\n | { ok: false; reason: 'missing' | 'multiple' | 'malformed' };\n\nconst LF = 0x0a;\nconst CR = 0x0d;\nconst SP = 0x20;\nconst HTAB = 0x09;\nconst COLON = 0x3a;\nconst FROM_NAME = [0x66, 0x72, 0x6f, 0x6d]; // \"from\"\n\n/**\n * Where the value of the header line `raw[start, end)` begins if the line\n * is named `From` \u2014 the byte after its first `:` \u2014 or -1 if it is not.\n * The name is the bytes before that colon with trailing WSP trimmed,\n * compared case-insensitively; since it has to be exactly `from`, the\n * colon is looked for only across the WSP run that may follow those four\n * bytes, so the check reads at most the name and never searches the line.\n */\nfunction fromValueStart(raw: Uint8Array, start: number, end: number): number {\n if (end - start <= FROM_NAME.length) {\n return -1;\n }\n for (let i = 0; i < FROM_NAME.length; i++) {\n // ASCII case fold: `A`..`Z` \u2192 `a`..`z`. Non-letters fold to themselves.\n if ((raw[start + i] | 0x20) !== FROM_NAME[i]) {\n return -1;\n }\n }\n let colon = start + FROM_NAME.length;\n while (colon < end && (raw[colon] === SP || raw[colon] === HTAB)) {\n colon++;\n }\n return colon < end && raw[colon] === COLON ? colon + 1 : -1;\n}\n\n/** Operator-readable detail for each way the pin can fail to find a sender. */\nconst MIME_FROM_REFUSALS: Record<Extract<MimeFrom, { ok: false }>['reason'], string> = {\n missing: 'the message has no From header',\n multiple: 'the message has more than one From header',\n malformed: 'the From header must hold a single mailbox',\n};\n\nexport function readMimeFromAddrSpec(raw: Uint8Array): MimeFrom {\n const n = raw.byteLength;\n // The `From:` header as offsets into `raw`: its value starts after the\n // colon and ends where the content of its last line ends. `folded` says\n // whether a continuation line extended it, `inFrom` whether the line\n // being visited may.\n let fromCount = 0;\n let valueStart = -1;\n let valueEnd = -1;\n let folded = false;\n let inFrom = false;\n // The next CR at or after `lineStart`. Searched for lazily, each search\n // starting past the previous hit, so finding the bare CR that fails the\n // scan stays linear across a block of CR-less lines.\n let nextCr = raw.indexOf(CR);\n let lineStart = 0;\n while (lineStart < n) {\n const lf = raw.indexOf(LF, lineStart);\n const lineEnd = lf === -1 ? n : lf;\n let contentEnd = lineEnd;\n if (contentEnd > lineStart && raw[contentEnd - 1] === CR) {\n contentEnd--;\n }\n if (contentEnd === lineStart) {\n break; // empty line: end of the header block\n }\n if (nextCr !== -1 && nextCr < lineStart) {\n nextCr = raw.indexOf(CR, lineStart);\n }\n if (nextCr !== -1 && nextCr < contentEnd) {\n return { ok: false, reason: 'malformed' };\n }\n if (raw[lineStart] === SP || raw[lineStart] === HTAB) {\n if (inFrom) {\n valueEnd = contentEnd;\n folded = true;\n }\n } else {\n const start = fromValueStart(raw, lineStart, contentEnd);\n inFrom = start !== -1;\n if (inFrom) {\n fromCount++;\n valueStart = start;\n valueEnd = contentEnd;\n folded = false;\n }\n }\n lineStart = lf === -1 ? n : lf + 1;\n }\n if (fromCount === 0) {\n return { ok: false, reason: 'missing' };\n }\n if (fromCount > 1) {\n return { ok: false, reason: 'multiple' };\n }\n // Unfold (RFC 5322 \u00A72.2.3): the value is the header's byte range with\n // its line breaks removed, each continuation keeping its leading WSP.\n // Every CR still inside the range ends a line \u2014 the scan refused any\n // other \u2014 so dropping CR and LF is the whole job, done in place on one\n // copy of the range. A header that did not fold needs no copy.\n let value = raw.subarray(valueStart, valueEnd);\n if (folded) {\n value = raw.slice(valueStart, valueEnd);\n let kept = 0;\n for (let i = 0; i < value.length; i++) {\n const byte = value[i];\n if (byte !== CR && byte !== LF) {\n value[kept++] = byte;\n }\n }\n value = value.subarray(0, kept);\n }\n const addrSpec = singleMailboxAddrSpec(new TextDecoder().decode(value));\n return addrSpec === null ? { ok: false, reason: 'malformed' } : { ok: true, addrSpec };\n}\n\n/**\n * The addr-spec of a header value that holds exactly one mailbox \u2014 either a\n * bare `addr-spec` or `[phrase] <addr-spec>` \u2014 or `null` when the value is\n * anything else. One pass; quoted-strings (with `\\` escapes) are skipped\n * whole, and their contents are never interpreted.\n */\nfunction singleMailboxAddrSpec(value: string): string | null {\n let inQuotes = false;\n let escaped = false;\n let lt = -1;\n let gt = -1;\n let firstAt = -1;\n for (let i = 0; i < value.length; i++) {\n const ch = value[i];\n if (inQuotes) {\n if (escaped) {\n escaped = false;\n } else if (ch === '\\\\') {\n escaped = true;\n } else if (ch === '\"') {\n inQuotes = false;\n }\n continue;\n }\n switch (ch) {\n case '\"':\n // A quoted-string belongs to the phrase, which ends at `<`.\n if (lt !== -1) {\n return null;\n }\n inQuotes = true;\n break;\n case '<':\n if (lt !== -1) {\n return null;\n }\n lt = i;\n break;\n case '>':\n if (lt === -1 || gt !== -1) {\n return null;\n }\n gt = i;\n break;\n case '@':\n if (firstAt === -1) {\n firstAt = i;\n }\n break;\n case ',':\n case ';':\n case ':':\n case '(':\n case ')':\n case '[':\n case ']':\n case '\\\\':\n return null;\n default:\n break;\n }\n }\n if (inQuotes) {\n return null;\n }\n let addrSpec: string;\n if (lt === -1) {\n addrSpec = value.trim();\n } else {\n // `<` present: it needs its `>`, nothing but WSP may follow, and the\n // phrase before it must not read as an address of its own.\n if (gt === -1 || value.slice(gt + 1).trim().length !== 0) {\n return null;\n }\n if (firstAt !== -1 && firstAt < lt) {\n return null;\n }\n addrSpec = value.slice(lt + 1, gt);\n }\n // One printable-ASCII token. Rules out an empty `<>`, WSP inside the\n // brackets, and a code point that only LOOKS like the sender before the\n // caller lower-cases it for the compare.\n return /^[\\x21-\\x7e]+$/.test(addrSpec) ? addrSpec : null;\n}\n\n/**\n * Outbound email send. The framework runtime POSTs:\n *\n * {\n * projectId, aiToken, // auth (validated by middleware)\n * from, // envelope sender (must be on an Email-Routing-enabled zone)\n * recipients: string[], // unique normalized recipient addresses\n * mimeBase64, // raw MIME, base64-encoded\n * requestId // for logs and default operation identity\n * }\n *\n * The proxy validates and normalizes the request, routes custom senders to\n * `send_raw`, and otherwise asks the API to admit each recipient before using\n * the platform `send_email` binding.\n *\n * The user worker does not have a `send_email` binding.\n */\napp.post('/send', async (context) => {\n const sendDeadline = createEmailProviderDeadline(EMAIL_SEND_DEADLINE_MS);\n const projectId = context.get('projectId');\n const body = context.get('body');\n\n const from = asString(body.from);\n const mimeBase64 = asString(body.mimeBase64);\n // Bounded and sanitized here, once, so `logSend` never interpolates the\n // raw value; see `MAX_REQUEST_ID_LENGTH`.\n const requestIdRaw = asString(body.requestId);\n const requestId =\n requestIdRaw === null ? 'unknown' : sanitizeForLog(requestIdRaw, MAX_REQUEST_ID_LENGTH);\n const callerKey = asString(body.idempotencyKey);\n if (\n callerKey !== null &&\n (callerKey.length === 0 || callerKey.length > 128 || !/^[\\x20-\\x7e]+$/.test(callerKey))\n ) {\n return context.json(\n { ok: false, error: { code: 'INVALID_TO', message: 'invalid idempotency key' } },\n 400,\n );\n }\n const operationKey =\n callerKey ??\n (requestIdRaw && requestIdRaw.length <= 128 && /^[\\x20-\\x7e]+$/.test(requestIdRaw)\n ? requestIdRaw\n : crypto.randomUUID());\n const recipientsRaw = Array.isArray(body.recipients) ? body.recipients : null;\n\n if (!from || !mimeBase64 || !recipientsRaw) {\n return context.json(\n { ok: false, error: { code: 'UPSTREAM_ERROR', message: 'invalid body' } },\n 400,\n );\n }\n\n // Bound the list before the normalization loop below allocates per entry.\n // Answered with the same 413 the MIME size guard uses \u2014 the framework\n // dispatches on `error.code`, not the status, and INVALID_TO is already\n // its code for an unusable recipient set.\n if (recipientsRaw.length > MAX_RECIPIENTS) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_TO',\n message: `too many recipients (max ${MAX_RECIPIENTS}, got ${recipientsRaw.length})`,\n },\n },\n 413,\n );\n }\n\n // Bound the sender before anything copies it \u2014 the lowercase, the strict\n // regex and the refusal that echoes it all sit below. Same 413 as the\n // recipient bound; INVALID_FROM is the framework's code for an unusable\n // sender. The address is deliberately not echoed back.\n if (from.length > MAX_SENDER_LENGTH) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `sender exceeds ${MAX_SENDER_LENGTH} characters`,\n },\n },\n 413,\n );\n }\n\n // Fail closed on missing sender configuration before admission.\n const senderDomain = readSenderDomain(context.env);\n if (!senderDomain) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'UPSTREAM_ERROR',\n message: 'email sender domain is not configured',\n },\n },\n 502,\n );\n }\n\n // Recipients must be unique strings; the framework already dedups but we\n // re-validate so a buggy client cannot create duplicate attempts or logs.\n const recipients: Array<string> = [];\n const seen = new Set<string>();\n for (const r of recipientsRaw) {\n if (typeof r !== 'string') {\n continue;\n }\n // Before `.trim().toLowerCase()` \u2014 that call is the allocation.\n // The address is deliberately not echoed back.\n if (r.length > MAX_RECIPIENT_LENGTH) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_TO',\n message: `recipient exceeds ${MAX_RECIPIENT_LENGTH} characters`,\n },\n },\n 413,\n );\n }\n const lower = r.trim().toLowerCase();\n if (!lower || seen.has(lower)) {\n continue;\n }\n seen.add(lower);\n recipients.push(lower);\n }\n if (recipients.length === 0) {\n return context.json(\n { ok: false, error: { code: 'INVALID_TO', message: 'no recipients' } },\n 200,\n );\n }\n\n // Pre-decode size guard \u2014 base64 expands ~4/3, so a base64 string longer\n // than `MAX_MIME_BYTES * 4 / 3 + 4` (the +4 absorbs padding rounding)\n // can't possibly decode to anything within the limit. Reject before\n // allocating a 75 MB Uint8Array for what we'd reject anyway. Defends\n // against adversarial OOM via outsized payloads.\n if (mimeBase64.length > Math.ceil((MAX_MIME_BYTES * 4) / 3) + 4) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'MIME_ERROR',\n message: `mime exceeds ${MAX_MIME_BYTES} bytes (base64 length ${mimeBase64.length})`,\n },\n },\n 413,\n );\n }\n\n let raw: Uint8Array;\n try {\n raw = base64Decode(mimeBase64);\n } catch {\n return context.json(\n { ok: false, error: { code: 'MIME_ERROR', message: 'invalid base64 mime' } },\n 400,\n );\n }\n // Defense-in-depth: the pre-decode check is conservative (uses base64\n // length), so a small over-by-one slip past it would still trip here.\n if (raw.byteLength > MAX_MIME_BYTES) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'MIME_ERROR',\n message: `mime exceeds ${MAX_MIME_BYTES} bytes (got ${raw.byteLength})`,\n },\n },\n 413,\n );\n }\n if (!customMimeHeaderBytesWithinLimit(raw)) {\n return context.json(\n {\n ok: false,\n error: { code: 'MIME_ERROR', message: 'custom headers exceed the 16 KiB limit' },\n },\n 413,\n );\n }\n\n // A sender outside the shared platform domain uses the custom-domain path.\n const fromAt = from.indexOf('@');\n const fromDomain = fromAt === -1 ? '' : from.slice(fromAt + 1).toLowerCase();\n if (fromDomain !== '' && fromDomain !== senderDomain) {\n return sendViaCustomDomain(\n context,\n projectId,\n from,\n fromDomain,\n senderDomain,\n recipients,\n raw,\n requestId,\n operationKey,\n sendDeadline,\n );\n }\n\n // Custom-domain sends use send_raw and do not depend on this binding.\n // Check the platform binding before shared-domain admission starts.\n const sendBinding = context.env.SEND_EMAIL;\n if (typeof sendBinding?.send !== 'function') {\n return context.json(\n {\n ok: false,\n error: {\n code: 'UPSTREAM_ERROR',\n message: 'email sending is not configured',\n },\n },\n 502,\n );\n }\n\n // Sender ownership is checked against PostgreSQL by the admission service.\n const expectedSlug = from.split('@')[0]?.split('+')[0] ?? '';\n // Lowercase once for the strict regex + slug compare; the regex anchors\n // the whole string and intentionally rejects CR/LF, quotes, brackets,\n // and display-name forms before we touch EmailMessage.\n // The envelope is forwarded verbatim, so validation has to run on bytes that\n // cannot change under case folding. U+212A KELVIN SIGN lowercases to 'k' and\n // U+0130 to 'i', so a non-ASCII `from` can satisfy a lowercased regex and\n // still reach the shared envelope sender intact. Refuse it before that.\n if (!/^[\\x21-\\x7e]+$/.test(from)) {\n return context.json(\n {\n ok: false,\n error: { code: 'INVALID_FROM', message: 'from address must be printable ASCII' },\n },\n 403,\n );\n }\n const fromLower = from.toLowerCase();\n if (!strictFromRe(senderDomain).test(fromLower)) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `from address must be <${expectedSlug}>[+tag]@${senderDomain}`,\n },\n },\n 200,\n );\n }\n const fromLocal = fromLower.slice(0, fromLower.indexOf('@'));\n const localPrefix = fromLocal.split('+')[0] ?? '';\n if (localPrefix !== expectedSlug.toLowerCase()) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `from address must be <${expectedSlug}>[+tag]@${senderDomain}`,\n },\n },\n 200,\n );\n }\n\n // The envelope is pinned; now pin what the recipient will actually SEE.\n // A mismatch here is a request the framework never produces \u2014 `buildMime`\n // renders `From:` from the same `from.email` it posts as the envelope \u2014 so\n // it is refused outright rather than reported per recipient. Runs before\n // the admission call for the same reason as the slug pin. The refusal may\n // echo `from`: it is at most `MAX_SENDER_LENGTH` printable-ASCII bytes by\n // now.\n const mimeFrom = readMimeFromAddrSpec(raw);\n if (!mimeFrom.ok || mimeFrom.addrSpec.toLowerCase() !== fromLower) {\n const detail = mimeFrom.ok\n ? 'the From header address does not match the envelope sender'\n : MIME_FROM_REFUSALS[mimeFrom.reason];\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `mime From must be the envelope sender ${from}: ${detail}`,\n },\n },\n 403,\n );\n }\n\n // The API transaction is authoritative for project state, sender identity,\n // recipient consent, suspension, and attempt quotas.\n let admission;\n try {\n admission = await admitEmail(\n context.env,\n {\n projectId,\n kind: 'direct',\n key: operationKey,\n digest: await emailPayloadDigest('direct', from, recipients, raw),\n from,\n recipients,\n transport: 'binding',\n },\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n } catch (error) {\n const conflict = error instanceof Error && error.message === 'IDEMPOTENCY_CONFLICT';\n return context.json(\n {\n ok: false,\n error: {\n code: conflict ? 'IDEMPOTENCY_CONFLICT' : 'UPSTREAM_ERROR',\n message: conflict\n ? 'idempotency key has different content'\n : 'email admission unavailable',\n },\n },\n conflict ? 409 : 503,\n );\n }\n const deliveries: Array<RecipientResult> = admission.recipients\n .filter((r) => r.state !== 'reserved')\n .map((r) => ({\n recipient: r.recipient,\n ok: r.state === 'provider_accepted',\n state: r.state,\n messageId: r.providerReference ?? undefined,\n error:\n r.state === 'provider_accepted'\n ? undefined\n : {\n code:\n r.errorCode ??\n (r.state === 'outcome_unknown' || r.state === 'attempt_started'\n ? 'OUTCOME_UNKNOWN'\n : r.state === 'cancelled'\n ? 'UPSTREAM_ERROR'\n : 'UNVERIFIED_DESTINATION'),\n message:\n r.state === 'outcome_unknown' || r.state === 'attempt_started'\n ? 'provider outcome unknown; inspect email logs before retrying'\n : r.state === 'cancelled'\n ? 'email attempt was cancelled before provider submission'\n : 'recipient was not admitted',\n },\n }));\n if (admission.replay) {\n for (const row of admission.recipients.filter((r) => r.state === 'reserved')) {\n deliveries.push({\n recipient: row.recipient,\n ok: false,\n state: 'reserved',\n error: {\n code: 'OUTCOME_UNKNOWN',\n message: 'email action remains reserved; inspect email logs before retrying',\n },\n });\n }\n return emailActionResponse(context, admission.operationId, deliveries);\n }\n const allowed = admission.recipients\n .filter((r) => r.state === 'reserved')\n .map((r) => r.recipient);\n // Send fan-out. CF's `send_email` binding takes one recipient per\n // EmailMessage \u2014 we already split by recipient above.\n for (let index = 0; index < allowed.length; index++) {\n const r = allowed[index];\n if (sendDeadline.expired(EMAIL_SEND_FINALIZATION_MARGIN_MS)) {\n const unstarted = allowed.slice(index);\n const cancelled = await cancelUnstartedRecipients(\n context.env,\n admission.operationId,\n unstarted,\n sendDeadline.remainingMs(),\n );\n for (const recipient of unstarted) {\n deliveries.push({\n recipient,\n ok: false,\n state: cancelled ? 'cancelled' : 'outcome_unknown',\n error: cancelled\n ? {\n code: 'UPSTREAM_ERROR',\n message: 'email batch deadline elapsed before provider submission',\n }\n : { code: 'OUTCOME_UNKNOWN', message: 'could not cancel unstarted email attempt' },\n });\n }\n break;\n }\n try {\n await startEmailAttempt(\n context.env,\n admission.operationId,\n [r],\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n } catch {\n const cancelled = await cancelUnstartedRecipients(\n context.env,\n admission.operationId,\n [r],\n sendDeadline.remainingMs(),\n );\n deliveries.push({\n recipient: r,\n ok: false,\n state: cancelled ? 'cancelled' : 'outcome_unknown',\n error: cancelled\n ? {\n code: 'UPSTREAM_ERROR',\n message: 'email attempt did not start; reservation cancelled',\n }\n : { code: 'OUTCOME_UNKNOWN', message: 'could not confirm email attempt status' },\n });\n continue;\n }\n try {\n // EmailMessage accepts string | ReadableStream \u2014 wrap our buffered\n // bytes as a single-chunk stream. We can't reuse one stream across\n // recipients because streams are one-shot, so build per send.\n const msg = new EmailMessage(from, r, bytesToStream(raw));\n // Some CF builds don't return the messageId; we surface \"\" rather\n // than crash and let the framework decide whether to fall back.\n const result = await sendDeadline.run(\n () => sendBinding.send(msg),\n EMAIL_SEND_FINALIZATION_MARGIN_MS,\n );\n const providerReference = typeof result?.messageId === 'string' ? result.messageId : '';\n try {\n await finishEmailAttempt(\n context.env,\n admission.operationId,\n [r],\n 'provider_accepted',\n { providerReference },\n sendDeadline.remainingMs(),\n );\n } catch {\n deliveries.push({\n recipient: r,\n ok: false,\n state: 'outcome_unknown',\n error: {\n code: 'OUTCOME_UNKNOWN',\n message: 'provider accepted email but outcome could not be recorded',\n },\n });\n continue;\n }\n deliveries.push({\n recipient: r,\n ok: true,\n state: 'provider_accepted',\n messageId: providerReference,\n });\n } catch {\n try {\n await finishEmailAttempt(\n context.env,\n admission.operationId,\n [r],\n 'outcome_unknown',\n { errorCode: 'OUTCOME_UNKNOWN' },\n sendDeadline.remainingMs(),\n );\n } catch {\n /* persisted attempt_started remains unresolved */\n }\n deliveries.push({\n recipient: r,\n ok: false,\n state: 'outcome_unknown',\n error: {\n code: 'OUTCOME_UNKNOWN',\n message: 'provider outcome unknown; inspect email logs before retrying',\n },\n });\n }\n }\n\n // Record the per-recipient outcome.\n logSend(projectId, requestId, deliveries);\n\n // Return each outcome; an unknown provider result must be inspected before retry.\n const anyFailed = deliveries.some((d) => !d.ok);\n if (anyFailed) {\n return context.json({ ok: false, operationId: admission.operationId, deliveries }, 200);\n }\n return context.json({\n ok: true,\n operationId: admission.operationId,\n ids: deliveries.map((d) => ({\n recipient: d.recipient,\n messageId: (d as { messageId: string }).messageId,\n state: 'provider_accepted',\n })),\n });\n});\n\n// -----------------------------------------------------------------------------\n// Custom sender domains.\n// -----------------------------------------------------------------------------\n\n/**\n * The Email Sending REST `send_raw` result. snake_case \u2014 the REST schema\n * names the id `message_id`, unlike the `send_email` binding's camelCase\n * `messageId`. Cloudflare returns every recipient in\n * exactly one required list: `delivered` and `queued` are accepted;\n * `permanent_bounces` and `suppressed_recipients` are permanent failures.\n */\nexport interface SendRawResult {\n delivered?: unknown;\n message_id?: unknown;\n permanent_bounces?: unknown;\n queued?: unknown;\n suppressed_recipients?: unknown;\n}\n\nexport interface ParsedSendRawResult {\n delivered: ReadonlySet<string>;\n messageId: string;\n permanentBounces: ReadonlySet<string>;\n queued: ReadonlySet<string>;\n suppressedRecipients: ReadonlySet<string>;\n}\n\nexport type SendRawRecipientOutcome =\n | 'provider_accepted'\n | 'permanent_bounce'\n | 'suppressed'\n | 'outcome_unknown';\n\ntype SendRawHttpResponse = { ok: true; data: unknown } | { ok: false; status: number };\n\nconst MAX_SEND_RAW_RESPONSE_BYTES = 64 * 1024;\n\n/** Submit once and read the provider response within one absolute deadline. */\nexport async function requestSendRaw(\n input: {\n accountId: string;\n bearer: string;\n from: string;\n recipients: Array<string>;\n mimeMessage: string;\n },\n deadlineMs = EMAIL_PROVIDER_DEADLINE_MS,\n): Promise<SendRawHttpResponse> {\n const controller = new AbortController();\n const deadline = Date.now() + Math.min(EMAIL_PROVIDER_DEADLINE_MS, deadlineMs);\n const requestBody = JSON.stringify({\n from: input.from,\n recipients: input.recipients,\n mime_message: input.mimeMessage,\n });\n const beforeDeadline = async <T>(run: () => Promise<T>): Promise<T> => {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n controller.abort();\n throw new Error('email sending request timed out');\n }\n const promise = run();\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('email sending request timed out'));\n }, remaining);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n };\n const response = await beforeDeadline(() =>\n fetch(\n `https://api.cloudflare.com/client/v4/accounts/${input.accountId}/email/sending/send_raw`,\n {\n method: 'POST',\n headers: {\n authorization: `Bearer ${input.bearer}`,\n 'content-type': 'application/json',\n },\n body: requestBody,\n signal: controller.signal,\n },\n ),\n );\n if (!response.ok) {\n void response.body?.cancel().catch(() => {});\n return { ok: false, status: response.status };\n }\n const declared = response.headers.get('content-length');\n if (\n declared !== null &&\n (!/^\\d+$/.test(declared) || Number(declared) > MAX_SEND_RAW_RESPONSE_BYTES)\n ) {\n void response.body?.cancel().catch(() => {});\n throw new Error('email sending API response too large');\n }\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('email sending API response unreadable');\n }\n const bytes = new Uint8Array(MAX_SEND_RAW_RESPONSE_BYTES);\n let size = 0;\n try {\n for (;;) {\n const chunk = await beforeDeadline(() => reader.read());\n if (chunk.done) {\n break;\n }\n if (size + chunk.value.byteLength > bytes.byteLength) {\n throw new Error('email sending API response too large');\n }\n bytes.set(chunk.value, size);\n size += chunk.value.byteLength;\n }\n if (declared !== null && size !== Number(declared)) {\n throw new Error('email sending API response length mismatch');\n }\n return {\n ok: true,\n data: JSON.parse(\n new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(bytes.subarray(0, size)),\n ) as unknown,\n };\n } finally {\n void reader.cancel().catch(() => {});\n try {\n reader.releaseLock();\n } catch {\n // A timed-out read may still be settling after cancellation.\n }\n }\n}\n\n/** Read one required send_raw address list without discarding schema violations. */\nfunction readSendRawAddressList(value: unknown): Set<string> | null {\n if (!Array.isArray(value)) {\n return null;\n }\n const out = new Set<string>();\n for (const entry of value) {\n if (typeof entry !== 'string') {\n return null;\n }\n out.add(entry.toLowerCase());\n }\n return out;\n}\n\n/**\n * Parse the documented send_raw result shape. Every recipient is classified by\n * exactly one of four required lists; accepting a partial response would turn\n * missing provider evidence into a false success.\n */\nexport function parseSendRawResult(value: unknown): ParsedSendRawResult | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n const result = value as SendRawResult;\n const delivered = readSendRawAddressList(result.delivered);\n const permanentBounces = readSendRawAddressList(result.permanent_bounces);\n const queued = readSendRawAddressList(result.queued);\n const suppressedRecipients = readSendRawAddressList(result.suppressed_recipients);\n if (\n !delivered ||\n !permanentBounces ||\n !queued ||\n !suppressedRecipients ||\n typeof result.message_id !== 'string' ||\n result.message_id === ''\n ) {\n return null;\n }\n return {\n delivered,\n messageId: result.message_id,\n permanentBounces,\n queued,\n suppressedRecipients,\n };\n}\n\n/** Require exactly one provider classification for the requested recipient. */\nexport function classifySendRawRecipient(\n result: ParsedSendRawResult,\n recipient: string,\n): SendRawRecipientOutcome {\n const target = recipient.toLowerCase();\n const classifications = [\n result.delivered.has(target),\n result.queued.has(target),\n result.permanentBounces.has(target),\n result.suppressedRecipients.has(target),\n ];\n if (classifications.filter(Boolean).length !== 1) {\n return 'outcome_unknown';\n }\n if (classifications[0] || classifications[1]) {\n return 'provider_accepted';\n }\n return classifications[2] ? 'permanent_bounce' : 'suppressed';\n}\n\n/** Send through the customer's Cloudflare account after project-bound admission. */\nasync function sendViaCustomDomain(\n context: Context<ProxyEnv>,\n projectId: string,\n from: string,\n fromDomain: string,\n senderDomain: string,\n recipients: Array<string>,\n raw: Uint8Array,\n requestId: string,\n operationKey: string,\n sendDeadline: EmailProviderDeadline,\n): Promise<Response> {\n // The envelope is forwarded verbatim to the customer's account, so the\n // printable-ASCII guard runs here for the same reason as on the shared\n // path (case folding must not change the bytes downstream sees).\n if (!/^[\\x21-\\x7e]+$/.test(from)) {\n return context.json(\n {\n ok: false,\n error: { code: 'INVALID_FROM', message: 'from address must be printable ASCII' },\n },\n 403,\n );\n }\n const fromLower = from.toLowerCase();\n\n // The MIME From address must match the envelope sender before admission.\n const mimeFrom = readMimeFromAddrSpec(raw);\n if (!mimeFrom.ok || mimeFrom.addrSpec.toLowerCase() !== fromLower) {\n const detail = mimeFrom.ok\n ? 'the From header address does not match the envelope sender'\n : MIME_FROM_REFUSALS[mimeFrom.reason];\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `mime From must be the envelope sender ${from}: ${detail}`,\n },\n },\n 403,\n );\n }\n\n // send_raw carries the MIME as a JSON string. Decode FATALLY: the\n // framework's builder emits 7-bit-clean MIME, and a body that is not\n // valid UTF-8 would be silently altered by a lenient decode \u2014 refuse it\n // instead. Local validation runs before admission.\n let mimeMessage: string;\n try {\n mimeMessage = new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(raw);\n } catch {\n return context.json(\n { ok: false, error: { code: 'MIME_ERROR', message: 'mime must be valid UTF-8' } },\n 400,\n );\n }\n\n let admission;\n try {\n admission = await admitEmail(\n context.env,\n {\n projectId,\n kind: 'direct',\n key: operationKey,\n digest: await emailPayloadDigest('direct', from, recipients, raw),\n from,\n recipients,\n transport: 'send_raw',\n },\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n } catch (error) {\n const conflict = error instanceof Error && error.message === 'IDEMPOTENCY_CONFLICT';\n return context.json(\n {\n ok: false,\n error: {\n code: conflict ? 'IDEMPOTENCY_CONFLICT' : 'UPSTREAM_ERROR',\n message: conflict\n ? 'idempotency key has different content'\n : 'email admission unavailable',\n },\n },\n conflict ? 409 : 503,\n );\n }\n const deliveries: Array<RecipientResult> = admission.recipients\n .filter((r) => r.state !== 'reserved')\n .map((r) => ({\n recipient: r.recipient,\n ok: r.state === 'provider_accepted',\n state: r.state,\n messageId: r.providerReference ?? undefined,\n error:\n r.state === 'provider_accepted'\n ? undefined\n : {\n code:\n r.errorCode ??\n (r.state === 'outcome_unknown' || r.state === 'attempt_started'\n ? 'OUTCOME_UNKNOWN'\n : r.state === 'cancelled'\n ? 'UPSTREAM_ERROR'\n : 'UNVERIFIED_DESTINATION'),\n message:\n r.state === 'outcome_unknown' || r.state === 'attempt_started'\n ? 'provider outcome unknown; inspect email logs before retrying'\n : r.state === 'cancelled'\n ? 'email attempt was cancelled before provider submission'\n : 'recipient was not admitted',\n },\n }));\n if (admission.replay) {\n for (const row of admission.recipients.filter((r) => r.state === 'reserved')) {\n deliveries.push({\n recipient: row.recipient,\n ok: false,\n state: 'reserved',\n error: {\n code: 'OUTCOME_UNKNOWN',\n message: 'email action remains reserved; inspect email logs before retrying',\n },\n });\n }\n return emailActionResponse(context, admission.operationId, deliveries);\n }\n recipients = admission.recipients.filter((r) => r.state === 'reserved').map((r) => r.recipient);\n if (recipients.length === 0) {\n return emailActionResponse(context, admission.operationId, deliveries);\n }\n // A duplicate must return its durable outcome even if the credential was\n // subsequently revoked. Fresh attempts lease only after admission, then\n // cancel reservations if there can be no provider submission.\n const lease = await leaseEmailDomainCredential(\n context.env,\n fromDomain,\n projectId,\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n if (!lease) {\n await finishEmailAttempt(\n context.env,\n admission.operationId,\n recipients,\n 'cancelled',\n {},\n sendDeadline.remainingMs(),\n ).catch(() => {});\n return context.json(\n {\n ok: false,\n operationId: admission.operationId,\n error: { code: 'UPSTREAM_ERROR', message: 'could not lease the domain credential' },\n },\n 502,\n );\n }\n if (admission.accountId !== lease.accountId) {\n await finishEmailAttempt(\n context.env,\n admission.operationId,\n recipients,\n 'cancelled',\n {},\n sendDeadline.remainingMs(),\n ).catch(() => {});\n return context.json(\n {\n ok: false,\n operationId: admission.operationId,\n error: { code: 'UPSTREAM_ERROR', message: 'email domain changed during admission' },\n },\n 503,\n );\n }\n try {\n await startEmailAttempt(\n context.env,\n admission.operationId,\n recipients,\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n } catch {\n const cancelled = await cancelUnstartedRecipients(\n context.env,\n admission.operationId,\n recipients,\n sendDeadline.remainingMs(),\n );\n for (const recipient of recipients) {\n deliveries.push({\n recipient,\n ok: false,\n state: cancelled ? 'cancelled' : 'outcome_unknown',\n error: cancelled\n ? {\n code: 'UPSTREAM_ERROR',\n message: 'email attempt did not start; reservation cancelled',\n }\n : { code: 'OUTCOME_UNKNOWN', message: 'could not confirm email attempt status' },\n });\n }\n return emailActionResponse(context, admission.operationId, deliveries);\n }\n\n // One REST call carries every recipient \u2014 unlike the platform binding's\n // one EmailMessage per recipient. The response's message id is shared by\n // the whole list.\n let failure: { code: string; message: string } | null = null;\n let failureState: 'failed' | 'outcome_unknown' = 'failed';\n let sendRawResult: ParsedSendRawResult | null = null;\n let providerResponse: SendRawHttpResponse | null = null;\n try {\n providerResponse = await requestSendRaw(\n {\n accountId: lease.accountId,\n bearer: leaseBearer(lease),\n from,\n recipients,\n mimeMessage,\n },\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n } catch {\n failure = { code: 'UPSTREAM_ERROR', message: 'email sending request failed' };\n failureState = 'outcome_unknown';\n }\n if (providerResponse) {\n if (!providerResponse.ok) {\n // A fresh credential is leased for every attempt. Provider error\n // bodies are not echoed or logged.\n failure = {\n code: providerResponse.status === 429 ? 'QUOTA_EXCEEDED' : 'UPSTREAM_ERROR',\n message: `email sending API returned ${providerResponse.status}`,\n };\n failureState =\n providerResponse.status >= 500 || providerResponse.status === 408\n ? 'outcome_unknown'\n : 'failed';\n } else {\n const data = providerResponse.data;\n const success =\n typeof data === 'object' && data !== null\n ? (data as { success?: unknown }).success\n : undefined;\n if (success === false) {\n failure = { code: 'UPSTREAM_ERROR', message: 'email sending API refused the message' };\n } else if (success !== true) {\n failure = { code: 'OUTCOME_UNKNOWN', message: 'email sending API response invalid' };\n failureState = 'outcome_unknown';\n } else {\n sendRawResult = parseSendRawResult((data as { result?: unknown }).result);\n if (!sendRawResult) {\n failure = { code: 'OUTCOME_UNKNOWN', message: 'email sending API response invalid' };\n failureState = 'outcome_unknown';\n }\n }\n }\n }\n\n for (const r of recipients) {\n if (failure) {\n deliveries.push({ recipient: r, ok: false, state: failureState, error: failure });\n continue;\n }\n const outcome = classifySendRawRecipient(sendRawResult!, r);\n if (outcome === 'permanent_bounce') {\n deliveries.push({\n recipient: r,\n ok: false,\n state: 'failed',\n error: {\n code: 'UNVERIFIED_DESTINATION',\n message: `recipient '${r}' permanently bounced`,\n },\n });\n } else if (outcome === 'suppressed') {\n deliveries.push({\n recipient: r,\n ok: false,\n state: 'failed',\n error: {\n code: 'UNVERIFIED_DESTINATION',\n message: `recipient '${r}' is on the suppression list`,\n },\n });\n } else if (outcome === 'outcome_unknown') {\n deliveries.push({\n recipient: r,\n ok: false,\n state: 'outcome_unknown',\n error: {\n code: 'OUTCOME_UNKNOWN',\n message: 'email sending API did not classify the recipient',\n },\n });\n } else {\n deliveries.push({\n recipient: r,\n ok: true,\n state: 'provider_accepted',\n messageId: sendRawResult!.messageId,\n });\n }\n }\n\n for (const delivery of deliveries.filter((d) =>\n admission.recipients.some((r) => r.recipient === d.recipient && r.state === 'reserved'),\n )) {\n try {\n await finishEmailAttempt(\n context.env,\n admission.operationId,\n [delivery.recipient],\n delivery.ok\n ? 'provider_accepted'\n : delivery.state === 'outcome_unknown'\n ? 'outcome_unknown'\n : 'failed',\n {\n providerReference: delivery.messageId,\n errorCode: delivery.ok\n ? undefined\n : delivery.state === 'outcome_unknown'\n ? 'OUTCOME_UNKNOWN'\n : (failure?.code ?? delivery.error?.code),\n },\n sendDeadline.remainingMs(),\n );\n delivery.state = delivery.ok\n ? 'provider_accepted'\n : delivery.state === 'outcome_unknown'\n ? 'outcome_unknown'\n : 'failed';\n if (delivery.state === 'outcome_unknown' && !delivery.ok) {\n delivery.error = {\n code: 'OUTCOME_UNKNOWN',\n message: 'provider outcome unknown; inspect email logs before retrying',\n };\n }\n } catch {\n delivery.ok = false;\n delivery.state = 'outcome_unknown';\n delivery.error = {\n code: 'OUTCOME_UNKNOWN',\n message: 'provider outcome could not be recorded',\n };\n }\n }\n logSend(projectId, requestId, deliveries);\n\n // Same mid-batch contract as the shared path: any per-recipient failure\n // (bounce, suppression, or a whole-call failure) answers ok:false with\n // the complete per-recipient evidence needed for a safe retry decision.\n if (deliveries.some((d) => !d.ok)) {\n return context.json({ ok: false, operationId: admission.operationId, deliveries }, 200);\n }\n return context.json({\n ok: true,\n operationId: admission.operationId,\n ids: deliveries.map((d) => ({\n recipient: d.recipient,\n messageId: (d as { messageId: string }).messageId,\n state: 'provider_accepted' as const,\n })),\n });\n}\n\n// -----------------------------------------------------------------------------\n// Inbound delivery log \u2014 kept here because it's invoked from email-router.ts\n// inside the same worker (bypasses HTTP/auth).\n// -----------------------------------------------------------------------------\n\n/**\n * Inbound delivery log. Inlined here rather than via service binding because\n * the email-router lives in this same worker; routing through env.API would\n * 404 (and earlier did so silently).\n */\nexport async function recordInboundDelivery(\n projectId: string,\n info: { from: string; to: string; byteSize: number; status: string },\n): Promise<void> {\n console.log(\n `[email-recv] ${projectId} ${sanitizeForLog(info.from, 320)} -> ${sanitizeForLog(info.to, 320)} ${info.status} (${info.byteSize}B) @${Date.now()}`,\n );\n}\n\n// -----------------------------------------------------------------------------\n// Helpers\n// -----------------------------------------------------------------------------\n\ninterface RecipientResult {\n recipient: string;\n ok: boolean;\n state?: string;\n messageId?: string;\n error?: { code: string; message: string };\n}\n\n/**\n * A failed start response is ambiguous: its transaction may or may not have\n * committed. Cancellation is the safe discriminator because the API accepts\n * it only from `reserved`; a committed `attempt_started` transition conflicts.\n */\nasync function cancelUnstartedRecipients(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n operationId: string,\n recipients: Array<string>,\n deadlineMs?: number,\n): Promise<boolean> {\n try {\n const result = await finishEmailAttempt(\n env,\n operationId,\n recipients,\n 'cancelled',\n {},\n deadlineMs,\n );\n return recipients.every((recipient) =>\n result.recipients.some((row) => row.recipient === recipient && row.state === 'cancelled'),\n );\n } catch {\n return false;\n }\n}\n\nfunction emailActionResponse(\n context: Context<ProxyEnv>,\n operationId: string,\n deliveries: Array<RecipientResult>,\n) {\n if (deliveries.length === 0) {\n return context.json(\n {\n ok: false,\n operationId,\n error: { code: 'OUTCOME_UNKNOWN', message: 'email action remains reserved' },\n },\n 200,\n );\n }\n if (deliveries.some((d) => !d.ok)) {\n return context.json({ ok: false, operationId, deliveries }, 200);\n }\n return context.json(\n {\n ok: true,\n operationId,\n ids: deliveries.map((d) => ({\n recipient: d.recipient,\n messageId: d.messageId ?? '',\n state: d.state,\n })),\n },\n 200,\n );\n}\n\nfunction logSend(projectId: string, requestId: string, deliveries: Array<RecipientResult>): void {\n for (const d of deliveries) {\n const status = d.ok ? 'sent' : (d.error?.code ?? 'unknown_error');\n const id = d.messageId ?? '';\n console.log(\n `[email-log] ${projectId} ${requestId} ${sanitizeForLog(d.recipient, 320)} ${status} ${id} @${Date.now()}`,\n );\n }\n}\n\nfunction base64Decode(b64: string): Uint8Array {\n // workerd `atob` is fast for body-sized payloads; fall back to manual\n // decode only when needed.\n const binary = atob(b64);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n out[i] = binary.charCodeAt(i);\n }\n return out;\n}\n\nexport { app as email };\n", "import type { Env } from './types.ts';\n\nexport type ActionRecipient = {\n recipient: string;\n state:\n | 'rejected'\n | 'reserved'\n | 'attempt_started'\n | 'provider_accepted'\n | 'failed'\n | 'outcome_unknown'\n | 'cancelled';\n errorCode: string | null;\n providerReference: string | null;\n};\nexport type Admission = {\n operationId: string;\n replay: boolean;\n recipients: Array<ActionRecipient>;\n accountId?: string;\n};\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst EMAIL_DEFAULT_DEADLINE_MS = 5_000;\nconst EMAIL_ACTION_DEADLINE_MS = 15_000;\nconst EMAIL_ADMISSION_DEADLINE_MS = 15_000;\nconst MAX_ADMISSION_RESPONSE_BYTES = 65_536;\n\nasync function sign(data: string, secret: string): Promise<string> {\n if (!secret) {\n throw new Error('Email signing key is not configured');\n }\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const bytes = new Uint8Array(await crypto.subtle.sign('HMAC', key, encoder.encode(data)));\n return btoa(String.fromCharCode(...bytes))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\nasync function call<T>(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n path: string,\n body: unknown,\n deadlineMs = EMAIL_DEFAULT_DEADLINE_MS,\n): Promise<T> {\n const controller = new AbortController();\n const deadline = Date.now() + deadlineMs;\n const beforeDeadline = async <U>(run: () => Promise<U>): Promise<U> => {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n controller.abort();\n throw new Error('EMAIL_ADMISSION_TIMEOUT');\n }\n const promise = run();\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('EMAIL_ADMISSION_TIMEOUT'));\n }, remaining);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n };\n const raw = JSON.stringify(body);\n const proof = await sign(raw, env.EMAIL_SIGNING_SECRET);\n const response = await beforeDeadline(() =>\n env.API.fetch(`https://api/internal/email/actions${path}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': proof,\n },\n body: raw,\n signal: controller.signal,\n }),\n );\n if (!response.ok) {\n void response.body?.cancel().catch(() => {});\n if (response.status === 409) {\n throw new Error('IDEMPOTENCY_CONFLICT');\n }\n throw new Error(`EMAIL_ADMISSION_${response.status}`);\n }\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('EMAIL_ADMISSION_EMPTY_RESPONSE');\n }\n const bytes = new Uint8Array(MAX_ADMISSION_RESPONSE_BYTES);\n let size = 0;\n try {\n for (;;) {\n const chunk = await beforeDeadline(() => reader.read());\n if (chunk.done) {\n break;\n }\n if (size + chunk.value.byteLength > bytes.length) {\n throw new Error('EMAIL_ADMISSION_RESPONSE_TOO_LARGE');\n }\n bytes.set(chunk.value, size);\n size += chunk.value.byteLength;\n }\n return JSON.parse(decoder.decode(bytes.subarray(0, size))) as T;\n } finally {\n void reader.cancel().catch(() => {});\n try {\n reader.releaseLock();\n } catch {\n // A timed-out read may still be settling after cancellation.\n }\n }\n}\n\nexport type RelayedReceiptIdentity = {\n receiptId: string;\n projectId: string;\n payloadDigest: string;\n route?: ReceiptRouteFence;\n};\n\nexport type ReceiptRouteFence = {\n routeId: string;\n routeGeneration: number;\n connectionId: string;\n addressing: 'shared' | 'custom';\n domain: string;\n projectSlug: string;\n};\n\nexport function claimRelayedReceipt(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n identity: RelayedReceiptIdentity,\n): Promise<{ state: 'claimed' | 'in_progress' | 'completed'; reject?: boolean }> {\n return call(env, '/receipts/claim', identity);\n}\n\nexport function completeRelayedReceipt(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n identity: RelayedReceiptIdentity,\n reject: boolean,\n): Promise<{ ok: true }> {\n return call(env, '/receipts/complete', {\n receiptId: identity.receiptId,\n projectId: identity.projectId,\n payloadDigest: identity.payloadDigest,\n reject,\n });\n}\n\n/** Only generated, transport-irrelevant MIME fields are normalized. Body text stays byte-sensitive. */\nexport function canonicalizeVoidMime(raw: Uint8Array): Uint8Array {\n if (findCrlfCrlf(raw) === -1) {\n return raw;\n }\n const boundaries = new Map<string, string>();\n const output: Array<Uint8Array> = [];\n let outputBytes = 0;\n let copyStart = 0;\n let changed = false;\n let inHeaders = true;\n let topHeaders = true;\n\n const append = (bytes: Uint8Array): void => {\n if (bytes.byteLength === 0) {\n return;\n }\n output.push(bytes);\n outputBytes += bytes.byteLength;\n };\n const replace = (start: number, end: number, replacement: Uint8Array): void => {\n append(raw.subarray(copyStart, start));\n append(replacement);\n copyStart = end;\n changed = true;\n };\n\n let lineStart = 0;\n while (lineStart < raw.byteLength) {\n const lineEnd = findCrlf(raw, lineStart);\n const nextLine = lineEnd === raw.byteLength ? raw.byteLength : lineEnd + 2;\n if (inHeaders) {\n if (lineEnd === lineStart) {\n inHeaders = false;\n topHeaders = false;\n } else if (\n topHeaders &&\n (asciiPrefixEquals(raw, lineStart, lineEnd, 'Date: ') ||\n asciiPrefixEquals(raw, lineStart, lineEnd, 'Message-ID: '))\n ) {\n // Remove the generated field and its CRLF. The next header (or the\n // terminating empty line) remains byte-for-byte unchanged.\n replace(lineStart, nextLine, new Uint8Array());\n } else if (isMultipartContentType(raw, lineStart, lineEnd)) {\n const line = decoder.decode(raw.subarray(lineStart, lineEnd));\n const normalized = line.replace(\n /boundary=\"(=_void_(?:mixed|alternative|related)_[A-Za-z0-9_-]+)\"/g,\n (_, token: string) => {\n let marker = boundaries.get(token);\n if (!marker) {\n marker = `<void-boundary-${boundaries.size}>`;\n boundaries.set(token, marker);\n }\n return `boundary=\"${marker}\"`;\n },\n );\n if (normalized !== line) {\n replace(lineStart, lineEnd, encoder.encode(normalized));\n }\n }\n } else if (raw[lineStart] === 45 && raw[lineStart + 1] === 45) {\n const tokenStart = lineStart + 2;\n const token = isBoundaryToken(raw, tokenStart, lineEnd)\n ? decoder.decode(raw.subarray(tokenStart, lineEnd))\n : undefined;\n const openingMarker = token === undefined ? undefined : boundaries.get(token);\n if (openingMarker !== undefined) {\n replace(lineStart, lineEnd, encoder.encode(`--${openingMarker}`));\n inHeaders = true;\n } else if (\n lineEnd - tokenStart >= 2 &&\n raw[lineEnd - 2] === 45 &&\n raw[lineEnd - 1] === 45 &&\n isBoundaryToken(raw, tokenStart, lineEnd - 2)\n ) {\n const closingToken = decoder.decode(raw.subarray(tokenStart, lineEnd - 2));\n const closingMarker = boundaries.get(closingToken);\n if (closingMarker !== undefined) {\n replace(lineStart, lineEnd, encoder.encode(`--${closingMarker}--`));\n }\n }\n }\n lineStart = nextLine;\n }\n\n if (!changed) {\n return raw;\n }\n append(raw.subarray(copyStart));\n const normalized = new Uint8Array(outputBytes);\n let offset = 0;\n for (const chunk of output) {\n normalized.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return normalized;\n}\n\nfunction findCrlfCrlf(raw: Uint8Array): number {\n for (let i = 0; i + 3 < raw.byteLength; i++) {\n if (raw[i] === 13 && raw[i + 1] === 10 && raw[i + 2] === 13 && raw[i + 3] === 10) {\n return i;\n }\n }\n return -1;\n}\n\nfunction findCrlf(raw: Uint8Array, start: number): number {\n let cursor = start;\n while (cursor < raw.byteLength) {\n const cr = raw.indexOf(13, cursor);\n if (cr === -1) {\n return raw.byteLength;\n }\n if (raw[cr + 1] === 10) {\n return cr;\n }\n cursor = cr + 1;\n }\n return raw.byteLength;\n}\n\nfunction asciiPrefixEquals(raw: Uint8Array, start: number, end: number, expected: string): boolean {\n if (end - start < expected.length) {\n return false;\n }\n for (let i = 0; i < expected.length; i++) {\n const actual = raw[start + i];\n const wanted = expected.charCodeAt(i);\n if ((actual >= 65 && actual <= 90 ? actual + 32 : actual) !== (wanted | 32)) {\n return false;\n }\n }\n return true;\n}\n\nfunction isMultipartContentType(raw: Uint8Array, start: number, end: number): boolean {\n const field = 'Content-Type:';\n if (!asciiPrefixEquals(raw, start, end, field)) {\n return false;\n }\n let cursor = start + field.length;\n while (\n cursor < end &&\n (raw[cursor] === 32 || raw[cursor] === 9 || raw[cursor] === 11 || raw[cursor] === 12)\n ) {\n cursor++;\n }\n return asciiPrefixEquals(raw, cursor, end, 'multipart/');\n}\n\nfunction isBoundaryToken(raw: Uint8Array, start: number, end: number): boolean {\n if (end <= start) {\n return false;\n }\n for (let i = start; i < end; i++) {\n const byte = raw[i];\n if (\n !(\n (byte >= 65 && byte <= 90) ||\n (byte >= 97 && byte <= 122) ||\n (byte >= 48 && byte <= 57) ||\n byte === 95 ||\n byte === 45 ||\n byte === 61\n )\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport async function emailPayloadDigest(\n kind: string,\n from: string,\n recipients: Array<string>,\n raw: Uint8Array,\n): Promise<string> {\n const canonical = canonicalizeVoidMime(raw);\n const prefix = encoder.encode(\n JSON.stringify({\n kind,\n from: from.toLowerCase(),\n recipients: [...new Set(recipients.map((r) => r.toLowerCase()))].sort(),\n }),\n );\n const input = new Uint8Array(prefix.length + 1 + canonical.length);\n input.set(prefix);\n input[prefix.length] = 0;\n input.set(canonical, prefix.length + 1);\n return [...new Uint8Array(await crypto.subtle.digest('SHA-256', input))]\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nexport function admitEmail(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n body: {\n projectId: string;\n kind: 'direct' | 'forward' | 'reply';\n key: string;\n digest: string;\n from: string;\n recipients: Array<string>;\n transport: 'binding' | 'send_raw' | 'native_forward' | 'native_reply';\n receiptId?: string;\n },\n deadlineMs = EMAIL_ADMISSION_DEADLINE_MS,\n): Promise<Admission> {\n return call(env, '/admit', body, Math.min(deadlineMs, EMAIL_ADMISSION_DEADLINE_MS));\n}\n\nexport function startEmailAttempt(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n operationId: string,\n recipients: Array<string>,\n deadlineMs = EMAIL_ACTION_DEADLINE_MS,\n): Promise<{ recipients: Array<ActionRecipient> }> {\n return call(\n env,\n `/${encodeURIComponent(operationId)}/start`,\n { recipients },\n Math.min(deadlineMs, EMAIL_ACTION_DEADLINE_MS),\n );\n}\n\nexport function finishEmailAttempt(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n operationId: string,\n recipients: Array<string>,\n state: 'provider_accepted' | 'failed' | 'outcome_unknown' | 'cancelled',\n details: { providerReference?: string; errorCode?: string } = {},\n deadlineMs = EMAIL_ACTION_DEADLINE_MS,\n): Promise<{ recipients: Array<ActionRecipient> }> {\n return call(\n env,\n `/${encodeURIComponent(operationId)}/finish`,\n { recipients, state, ...details },\n Math.min(deadlineMs, EMAIL_ACTION_DEADLINE_MS),\n );\n}\n\nexport function recordEmailReceipt(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n receiptId: string,\n projectId: string,\n status: string,\n route?: ReceiptRouteFence,\n): Promise<{ ok: true }> {\n return call(env, '/receipts', { receiptId, projectId, status, ...(route ? { route } : {}) });\n}\n", "/** Lease a customer API token from the platform for a custom-domain send. */\n\nimport type { Env } from './types.ts';\n\nexport type EmailDomainLease = { kind: 'api_token'; token: string; accountId: string };\n\nconst LEASE_DEADLINE_MS = 5_000;\nconst MAX_LEASE_RESPONSE_BYTES = 4 * 1024;\n\n/** The bearer value for the send_raw Authorization header. */\nexport function leaseBearer(lease: EmailDomainLease): string {\n return lease.token;\n}\n\n/**\n * Lease a send credential for a registered domain from the api. Returns\n * null on any failure; the caller maps that to a retryable upstream error.\n */\nexport async function leaseEmailDomainCredential(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n domain: string,\n projectId: string,\n deadlineMs = LEASE_DEADLINE_MS,\n): Promise<EmailDomainLease | null> {\n if (!env.EMAIL_SIGNING_SECRET) {\n return null;\n }\n const controller = new AbortController();\n const deadline = Date.now() + Math.min(deadlineMs, LEASE_DEADLINE_MS);\n const beforeDeadline = async <T>(run: () => Promise<T>): Promise<T> => {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n controller.abort();\n throw new Error('email credential lease timed out');\n }\n const promise = run();\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('email credential lease timed out'));\n }, remaining);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n };\n\n let res: Response;\n try {\n const token = await hmacSign(\n `email-lease-v1\\n${projectId}\\n${domain.toLowerCase()}`,\n env.EMAIL_SIGNING_SECRET,\n );\n res = await beforeDeadline(() =>\n env.API.fetch('https://api/internal/email/domain-credential', {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({ domain, projectId }),\n signal: controller.signal,\n }),\n );\n } catch {\n return null;\n }\n if (!res.ok) {\n void res.body?.cancel().catch(() => {});\n return null;\n }\n const declared = res.headers.get('content-length');\n if (\n declared !== null &&\n (!/^\\d+$/.test(declared) || Number(declared) > MAX_LEASE_RESPONSE_BYTES)\n ) {\n void res.body?.cancel().catch(() => {});\n return null;\n }\n const reader = res.body?.getReader();\n if (!reader) {\n return null;\n }\n const bytes = new Uint8Array(MAX_LEASE_RESPONSE_BYTES);\n let size = 0;\n try {\n for (;;) {\n const chunk = await beforeDeadline(() => reader.read());\n if (chunk.done) {\n break;\n }\n if (size + chunk.value.byteLength > bytes.byteLength) {\n throw new Error('email credential lease response too large');\n }\n bytes.set(chunk.value, size);\n size += chunk.value.byteLength;\n }\n if (declared !== null && size !== Number(declared)) {\n return null;\n }\n const data: unknown = JSON.parse(\n new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(bytes.subarray(0, size)),\n );\n return parseLease(data);\n } catch {\n return null;\n } finally {\n void reader.cancel().catch(() => {});\n try {\n reader.releaseLock();\n } catch {\n // A timed-out read may still be settling after cancellation.\n }\n }\n}\n\nfunction parseLease(data: unknown): EmailDomainLease | null {\n if (typeof data !== 'object' || data === null) {\n return null;\n }\n const kind = (data as { kind?: unknown }).kind;\n const accountId = (data as { accountId?: unknown }).accountId;\n if (typeof accountId !== 'string' || !/^[a-zA-Z0-9_-]{1,128}$/.test(accountId)) {\n return null;\n }\n if (kind === 'api_token') {\n const token = (data as { token?: unknown }).token;\n return typeof token === 'string' && token.length > 0 ? { kind, token, accountId } : null;\n }\n return null;\n}\n\n// --- HMAC signing (mirrors resolve.ts) ---\n\nconst encoder = new TextEncoder();\nlet cachedSignKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getSignKey(secret: string): Promise<CryptoKey> {\n if (cachedSignKey && cachedKeySecret === secret) {\n return cachedSignKey;\n }\n cachedSignKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n cachedKeySecret = secret;\n return cachedSignKey;\n}\n\nasync function hmacSign(data: string, secret: string): Promise<string> {\n const key = await getSignKey(secret);\n const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(data));\n const binary = String.fromCharCode(...new Uint8Array(sig));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n", "export const EMAIL_PROVIDER_DEADLINE_MS = 30_000;\nexport const EMAIL_PROVIDER_BATCH_DEADLINE_MS = 60_000;\n\nexport class EmailProviderTimeoutError extends Error {\n constructor() {\n super('email provider outcome unknown after timeout');\n this.name = 'EmailProviderTimeoutError';\n }\n}\n\n/** One absolute batch budget, with a shorter ceiling for each provider submission. */\nexport function createEmailProviderDeadline(totalMs = EMAIL_PROVIDER_BATCH_DEADLINE_MS) {\n const deadline = Date.now() + totalMs;\n return {\n remainingMs(reserveMs = 0): number {\n return Math.max(0, deadline - Date.now() - reserveMs);\n },\n expired(reserveMs = 0): boolean {\n return Date.now() >= deadline - reserveMs;\n },\n async run<T>(submit: () => Promise<T>, reserveMs = 0): Promise<T> {\n const remaining = Math.min(EMAIL_PROVIDER_DEADLINE_MS, deadline - Date.now() - reserveMs);\n if (remaining <= 0) {\n throw new EmailProviderTimeoutError();\n }\n const work = submit();\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n work,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new EmailProviderTimeoutError()), remaining);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n },\n };\n}\n\nexport type EmailProviderDeadline = ReturnType<typeof createEmailProviderDeadline>;\n", "/** Revalidate every delivered chunk; idle streams also close when their session is revoked. */\nexport function guardHumanStream(\n source: ReadableStream<Uint8Array>,\n validate: () => Promise<boolean>,\n signal?: AbortSignal,\n): ReadableStream<Uint8Array> {\n const reader = source.getReader();\n let closed = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let controller: ReadableStreamDefaultController<Uint8Array>;\n const cleanup = () => {\n closed = true;\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n signal?.removeEventListener('abort', abort);\n };\n const stop = () => {\n if (closed) {\n return;\n }\n cleanup();\n controller.error(new Error('Authentication expired or was revoked. Sign in again.'));\n void reader.cancel().catch(() => {});\n };\n const abort = () => stop();\n const check = async () => {\n if (closed) {\n return false;\n }\n try {\n if (await validate()) {\n return !closed;\n }\n } catch {\n /* Failed authority reads must close the stream. */\n }\n stop();\n return false;\n };\n const schedule = () => {\n timer = setTimeout(async () => {\n if (await check()) {\n schedule();\n }\n }, 15_000);\n };\n return new ReadableStream<Uint8Array>(\n {\n start(target) {\n controller = target;\n signal?.addEventListener('abort', abort, { once: true });\n if (signal?.aborted) {\n stop();\n } else {\n schedule();\n }\n },\n async pull(target) {\n try {\n const chunk = await reader.read();\n if (closed) {\n return;\n }\n if (chunk.done) {\n cleanup();\n target.close();\n } else if (await check()) {\n target.enqueue(chunk.value);\n }\n } catch (error) {\n if (!closed) {\n cleanup();\n target.error(error);\n void reader.cancel().catch(() => {});\n }\n }\n },\n async cancel(reason) {\n cleanup();\n await reader.cancel(reason);\n },\n },\n { highWaterMark: 0 },\n );\n}\n", "import { Hono } from 'hono';\nimport { asString, isQueryValue } from './body.ts';\nimport { dispatchToWorker } from './dispatch.ts';\nimport { resolveResource } from './resolve.ts';\nimport type { ProxyEnv } from './types.ts';\n\nconst CF_API = 'https://api.cloudflare.com/client/v4';\n\nconst kv = new Hono<ProxyEnv>();\n\nkv.post('/get', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/get', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/values/${encodeURIComponent(key)}`,\n { headers: { Authorization: `Bearer ${context.env.CF_API_TOKEN}` } },\n );\n\n if (cfRes.status === 404) {\n return context.json(null);\n }\n\n if (!cfRes.ok) {\n return context.json({ error: 'KV get failed', status: cfRes.status }, 502);\n }\n\n const type = asString(body.type) ?? 'text';\n if (type === 'json') {\n return context.json(await cfRes.json());\n }\n if (type === 'arrayBuffer') {\n return new Response(await cfRes.arrayBuffer(), {\n headers: { 'content-type': 'application/octet-stream' },\n });\n }\n if (type === 'stream') {\n return new Response(cfRes.body, {\n headers: { 'content-type': 'application/octet-stream' },\n });\n }\n // Default: text\n return context.json(await cfRes.text());\n});\n\nkv.post('/put', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/put', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const params = new URLSearchParams();\n if (isQueryValue(body.expiration)) {\n params.set('expiration', String(body.expiration));\n }\n if (isQueryValue(body.expiration_ttl)) {\n params.set('expiration_ttl', String(body.expiration_ttl));\n }\n const queryString = params.toString() ? `?${params.toString()}` : '';\n\n let value: string | ArrayBuffer;\n let contentType = 'text/plain';\n if (body.base64 === true && typeof body.value === 'string') {\n // Decode base64-encoded binary data from the client\n const binary = atob(body.value);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n value = bytes.buffer;\n contentType = 'application/octet-stream';\n } else {\n value = typeof body.value === 'string' ? body.value : JSON.stringify(body.value);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/values/${encodeURIComponent(key)}${queryString}`,\n {\n method: 'PUT',\n headers: {\n Authorization: `Bearer ${context.env.CF_API_TOKEN}`,\n 'Content-Type': contentType,\n },\n body: value,\n },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'KV put failed', status: cfRes.status }, 502);\n }\n\n return context.json({ success: true });\n});\n\nkv.post('/delete', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/delete', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/values/${encodeURIComponent(key)}`,\n {\n method: 'DELETE',\n headers: { Authorization: `Bearer ${context.env.CF_API_TOKEN}` },\n },\n );\n\n // 404 is fine \u2014 delete is idempotent\n if (!cfRes.ok && cfRes.status !== 404) {\n return context.json({ error: 'KV delete failed', status: cfRes.status }, 502);\n }\n\n return context.json({ success: true });\n});\n\nkv.post('/list', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding) {\n return context.json({ error: 'binding required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/list', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const params = new URLSearchParams();\n const prefix = asString(body.prefix);\n if (prefix) {\n params.set('prefix', prefix);\n }\n if (isQueryValue(body.limit)) {\n params.set('limit', String(body.limit));\n }\n const cursor = asString(body.cursor);\n if (cursor) {\n params.set('cursor', cursor);\n }\n const queryString = params.toString() ? `?${params.toString()}` : '';\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/keys${queryString}`,\n { headers: { Authorization: `Bearer ${context.env.CF_API_TOKEN}` } },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'KV list failed', status: cfRes.status }, 502);\n }\n\n const data = (await cfRes.json()) as {\n result?: ReadonlyArray<{ name: string }>;\n result_info?: { cursor?: string };\n };\n return context.json({\n keys: data.result ?? [],\n list_complete: !data.result_info?.cursor,\n cursor: data.result_info?.cursor ?? null,\n });\n});\n\nexport { kv };\n", "// Keep these wire values aligned with @void/platform. This private runtime is\n// bundled into that package, but must not import the package being built.\nexport const PLATFORM_DISABLED_KEY = '__void/platform/disabled/v1';\nexport const PLATFORM_DISABLED_VALUE = 'disabled';\n", "import { Hono } from 'hono';\nimport { asString, isQueryValue } from './body.ts';\nimport { dispatchToWorker } from './dispatch.ts';\nimport { resolveResource } from './resolve.ts';\nimport type { ProxyEnv } from './types.ts';\n\nconst CF_API = 'https://api.cloudflare.com/client/v4';\n\nconst r2 = new Hono<ProxyEnv>();\n\nfunction cfHeaders(token: string) {\n return { Authorization: `Bearer ${token}` };\n}\n\nr2.post('/get', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/get', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n { headers: cfHeaders(context.env.CF_API_TOKEN) },\n );\n\n if (cfRes.status === 404) {\n return context.json(null);\n }\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 get failed', status: cfRes.status }, 502);\n }\n\n // Stream the object body back, preserve metadata in headers\n const headers = new Headers();\n headers.set('content-type', cfRes.headers.get('content-type') ?? 'application/octet-stream');\n if (cfRes.headers.has('content-length')) {\n headers.set('content-length', cfRes.headers.get('content-length')!);\n }\n if (cfRes.headers.has('etag')) {\n headers.set('etag', cfRes.headers.get('etag')!);\n }\n if (cfRes.headers.has('last-modified')) {\n headers.set('last-modified', cfRes.headers.get('last-modified')!);\n }\n\n return new Response(cfRes.body, { headers });\n});\n\nr2.on('POST', ['/put', '/put-conditional'], async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n const base64 = asString(body.base64);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const conditional = body.onlyIf !== undefined || context.req.path.endsWith('/put-conditional');\n const dispatchRes = await dispatchToWorker(\n context.env,\n projectId,\n conditional ? '/r2/put-conditional' : '/r2/put',\n body,\n );\n if (dispatchRes) {\n return dispatchRes;\n }\n\n if (conditional) {\n return context.json(\n {\n error:\n 'R2 conditional writes require an active deployment with the current Void remote-binding handler. Update your Void platform and redeploy the project.',\n },\n 501,\n );\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n // Decode base64 value from JSON body, or use text value\n const data = base64\n ? Uint8Array.from(atob(base64), (ch) => ch.charCodeAt(0))\n : new TextEncoder().encode((body.value as string) ?? '');\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n {\n method: 'PUT',\n headers: {\n ...cfHeaders(context.env.CF_API_TOKEN),\n 'Content-Type': asString(body.contentType) ?? 'application/octet-stream',\n },\n body: data,\n },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 put failed', status: cfRes.status }, 502);\n }\n\n return context.json({ success: true });\n});\n\nr2.post('/delete', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding) {\n return context.json({ error: 'binding required' }, 400);\n }\n\n const keys =\n Array.isArray(body.keys) && body.keys.every((key): key is string => typeof key === 'string')\n ? body.keys\n : typeof body.key === 'string'\n ? [body.key]\n : [];\n\n if (keys.length === 0) {\n return context.json({ error: 'key or keys required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/delete', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n for (const key of keys) {\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n {\n method: 'DELETE',\n headers: cfHeaders(context.env.CF_API_TOKEN),\n },\n );\n if (!cfRes.ok && cfRes.status !== 404) {\n return context.json({ error: 'R2 delete failed', status: cfRes.status }, 502);\n }\n }\n\n return context.json({ success: true });\n});\n\nr2.post('/list', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding) {\n return context.json({ error: 'binding required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/list', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const params = new URLSearchParams();\n const prefix = asString(body.prefix);\n if (prefix) {\n params.set('prefix', prefix);\n }\n if (isQueryValue(body.limit)) {\n params.set('per_page', String(body.limit));\n }\n const cursor = asString(body.cursor);\n if (cursor) {\n params.set('cursor', cursor);\n }\n const delimiter = asString(body.delimiter);\n if (delimiter) {\n params.set('delimiter', delimiter);\n }\n const queryString = params.toString() ? `?${params.toString()}` : '';\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects${queryString}`,\n { headers: cfHeaders(context.env.CF_API_TOKEN) },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 list failed', status: cfRes.status }, 502);\n }\n\n const data = (await cfRes.json()) as {\n result?: ReadonlyArray<{ key: string; size: number; last_modified?: string }>;\n result_info?: { cursor?: string };\n };\n\n return context.json({\n objects: (data.result ?? []).map((object) => ({\n key: object.key,\n size: object.size,\n lastModified: object.last_modified ?? '',\n })),\n truncated: !!data.result_info?.cursor,\n cursor: data.result_info?.cursor ?? null,\n });\n});\n\nr2.post('/head', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/head', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n {\n method: 'HEAD',\n headers: cfHeaders(context.env.CF_API_TOKEN),\n },\n );\n\n if (cfRes.status === 404) {\n return context.json(null);\n }\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 head failed', status: cfRes.status }, 502);\n }\n\n return context.json({\n key,\n size: parseInt(cfRes.headers.get('content-length') ?? '0'),\n etag: cfRes.headers.get('etag') ?? '',\n lastModified: cfRes.headers.get('last-modified') ?? '',\n contentType: cfRes.headers.get('content-type') ?? 'application/octet-stream',\n });\n});\n\nexport { r2 };\n", "import { Hono } from 'hono';\nimport type { ProxyEnv } from './types.ts';\n\nconst app = new Hono<ProxyEnv>();\n\n/**\n * Forward revalidation requests to the API via service binding.\n *\n * The auth middleware has already verified the HMAC token and set projectId.\n * We forward the token so the API can verify it independently.\n */\napp.post('/', async (context) => {\n const projectId = context.get('projectId');\n const body = context.get('body');\n\n const response = await context.env.API.fetch(`https://api/internal/revalidate/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': body.aiToken as string,\n },\n body: JSON.stringify({\n paths: body.paths,\n all: body.all,\n }),\n });\n\n return new Response(response.body, {\n status: response.status,\n headers: response.headers,\n });\n});\n\nexport { app as revalidate };\n", "import { verifyEmailReceipt } from '@void/platform/email-protocol';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { ai } from './ai.ts';\nimport { asString, isProxyBody } from './body.ts';\nimport { proxyCapabilityEnabled } from './capabilities.ts';\nimport { d1 } from './d1.ts';\nimport { readEmailRequestJson } from './email-request-body.ts';\nimport { email } from './email.ts';\nimport { guardHumanStream } from './human-stream.ts';\nimport { kv } from './kv.ts';\nimport { PLATFORM_DISABLED_KEY, PLATFORM_DISABLED_VALUE } from './platform-lifecycle.ts';\nimport { r2 } from './r2.ts';\nimport { verifyPrerenderAuthority, verifyProjectDeployAccess } from './resolve.ts';\nimport { revalidate } from './revalidate.ts';\nimport type { Env, JwtPayload, ProxyBody, ProxyEnv } from './types.ts';\n\nconst app = new Hono<ProxyEnv>();\n\napp.use('/*', async (context, next) => {\n const healthProbeToken = context.env.PLATFORM_HEALTH_PROBE_TOKEN;\n const installerProbe =\n healthProbeToken !== undefined &&\n healthProbeToken !== '' &&\n context.req.path === '/health' &&\n context.req.header('X-Void-Platform-Probe') === healthProbeToken;\n if (\n !installerProbe &&\n (context.env.PLATFORM_TRAFFIC_STATE === 'staging' ||\n context.env.PLATFORM_TRAFFIC_STATE === 'sandbox-drain' ||\n (context.env.PLATFORM_INSTALLATION_ID &&\n (await context.env.ROUTING.get(PLATFORM_DISABLED_KEY)) === PLATFORM_DISABLED_VALUE))\n ) {\n return context.json({ error: 'Platform disabled' }, 503);\n }\n await next();\n});\n\n// CORS\napp.use(\n '/*',\n cors({\n origin: '*',\n allowMethods: ['POST', 'OPTIONS'],\n allowHeaders: ['content-type', 'authorization'],\n }),\n);\n\n// Health check\napp.get('/health', (context) =>\n context.json({\n ok: true,\n bindings: {\n ai: !!context.env.AI,\n kv: !!context.env.ROUTING,\n jwt: !!context.env.JWT_SECRET,\n api: !!context.env.API,\n sendEmail: !!context.env.SEND_EMAIL,\n emailDomain: !!context.env.EMAIL_SENDER_DOMAIN,\n },\n }),\n);\n\n// Reject non-POST for all other routes\napp.all('/*', async (context, next) => {\n if (context.req.method !== 'POST') {\n return context.json({ error: 'method not allowed' }, 405);\n }\n await next();\n});\n\nasync function hmacSign(data: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n 'raw',\n new TextEncoder().encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const bytes = new Uint8Array(\n await crypto.subtle.sign('HMAC', key, new TextEncoder().encode(data)),\n );\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary).replaceAll('+', '-').replaceAll('/', '_').replaceAll('=', '');\n}\n\n// The tenant calls this over its internal service binding. EMAIL_SIGNING_SECRET never\n// enters the tenant, so a project token cannot mint a gateway receipt.\napp.post('/email/verify-receipt', async (context) => {\n let body: unknown;\n try {\n body = await readEmailRequestJson(context.req.raw);\n } catch {\n return context.json({ valid: false }, 400);\n }\n if (!body || typeof body !== 'object') {\n return context.json({ valid: false }, 400);\n }\n const input = body as Record<string, unknown>;\n if (\n typeof input.projectId !== 'string' ||\n input.projectId.length > 128 ||\n typeof input.deploymentId !== 'string' ||\n input.deploymentId.length > 128 ||\n typeof input.recipient !== 'string' ||\n input.recipient.length > 320 ||\n typeof input.receipt !== 'string' ||\n input.receipt.length > 1536\n ) {\n return context.json({ valid: false }, 400);\n }\n const projectToken = await hmacSign(input.projectId, context.env.JWT_SECRET);\n if (context.req.header('x-void-internal') !== projectToken) {\n return context.json({ valid: false }, 403);\n }\n if (!context.env.EMAIL_SIGNING_SECRET) {\n return context.json({ valid: false }, 503);\n }\n const claims = await verifyEmailReceipt(input.receipt, context.env.EMAIL_SIGNING_SECRET, {\n projectId: input.projectId,\n deploymentId: input.deploymentId,\n recipient: input.recipient,\n });\n return context.json({ valid: claims !== null, receiptId: claims?.receiptId });\n});\n\n// The former relay endpoint is gone. Reject it before the generic JSON auth\n// middleware so an untrusted MIME stream is never parsed or buffered here.\napp.post('/email/relay', (context) => context.json({ error: 'not found' }, 404));\n\n// Auth middleware \u2014 parses body, authenticates, sets projectId\napp.post('/*', async (context, next) => {\n const path = new URL(context.req.url).pathname;\n\n let body: ProxyBody;\n try {\n // Five MiB of MIME expands to about seven MiB of base64, plus JSON metadata.\n const json =\n path === '/email' || path.startsWith('/email/')\n ? await readEmailRequestJson(context.req.raw, 8 * 1024 * 1024)\n : await context.req.json<unknown>();\n if (!isProxyBody(json)) {\n return context.json({ error: 'invalid JSON body' }, 400);\n }\n body = json;\n } catch {\n return context.json({ error: 'invalid JSON body' }, 400);\n }\n context.set('body', body);\n\n let revalidateHuman: (() => Promise<boolean>) | undefined;\n const authHeader = context.req.header('authorization');\n if (authHeader?.startsWith('Bearer ')) {\n // HTTPS path (local dev) \u2014 validate JWT\n const token = authHeader.slice(7);\n const payload = await verifyJwt(token, context.env.JWT_SECRET);\n if (!payload) {\n return context.json({ error: 'invalid or expired token' }, 401);\n }\n const projectId = asString(body.projectId);\n if (!projectId) {\n return context.json({ error: 'projectId required' }, 400);\n }\n if (payload.aud === 'prerender') {\n // Prerender credentials are short-lived and already pinned to one\n // project by the API that minted them. Never turn one into a general\n // owner token by accepting a caller-selected projectId.\n if (!payload.project || payload.project !== projectId) {\n return context.json({ error: 'forbidden' }, 403);\n }\n const active = await verifyPrerenderAuthority(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n payload.sub,\n {\n ...(payload.build ? { buildId: payload.build } : {}),\n ...(payload.credential ? { credentialId: payload.credential } : {}),\n },\n );\n if (!active) {\n return context.json(\n {\n error: payload.credential\n ? 'prerender token credential is no longer active'\n : payload.build\n ? 'prerender token build is no longer active'\n : 'prerender token authority is no longer active',\n },\n 403,\n );\n }\n } else {\n // Full API tokens retain the local-development ownership lookup.\n const checkOwner = () =>\n verifyProjectDeployAccess(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n payload.sub,\n token,\n context.req.header('Cf-Access-Jwt-Assertion'),\n new URL(context.req.url).origin,\n );\n revalidateHuman = async () => payload.exp > Date.now() / 1000 && (await checkOwner());\n if (!(await revalidateHuman())) {\n return context.json({ error: 'forbidden' }, 403);\n }\n }\n context.set('projectId', projectId);\n } else {\n // Service binding path (production) \u2014 verify HMAC-signed project token\n const projectId = asString(body.projectId);\n const aiToken = asString(body.aiToken);\n if (!projectId || !aiToken) {\n return context.json({ error: 'projectId and aiToken required' }, 400);\n }\n if (!(await verifyHmac(projectId, aiToken, context.env.JWT_SECRET))) {\n return context.json({ error: 'invalid project token' }, 403);\n }\n context.set('projectId', projectId);\n }\n\n await next();\n if (\n revalidateHuman &&\n context.res.body &&\n (context.res.headers.get('content-type')?.includes('text/event-stream') ||\n path.startsWith('/ai/') ||\n path === '/r2/get')\n ) {\n context.res = new Response(\n guardHumanStream(context.res.body, revalidateHuman, context.req.raw.signal),\n context.res,\n );\n }\n});\n\n// AI usage limit check \u2014 only applies to AI routes\napp.post('/ai/*', async (context, next) => {\n if (await context.env.ROUTING.get(`ai-block:${context.get('projectId')}`, { cacheTtl: 60 })) {\n return context.json({ error: 'AI usage limit exceeded' }, 429);\n }\n await next();\n});\n\n// Managed Sandbox is unavailable; retain its authenticated error response.\napp.post('/sandbox/*', (context) =>\n context.json(\n {\n error: 'platform capability unavailable',\n capability: 'sandbox',\n message: 'This Void platform does not enable sandbox.',\n },\n 501,\n ),\n);\n\n// Same gate for the email group. A deployed worker on a platform without\n// the email module still holds `__VOID_PROXY` and a valid project token, so\n// an explicit-`from` `sendEmail()` reaches `/email/send` and would otherwise\n// answer with the sender-domain / send-binding configuration failures \u2014 or\n// send, if the operator left the bindings in place.\napp.post('/email/*', async (context, next) => {\n if (!proxyCapabilityEnabled(context.env.PLATFORM_CAPABILITIES, 'email')) {\n return context.json(\n {\n error: 'platform capability unavailable',\n capability: 'email',\n message: 'This Void platform does not enable email.',\n },\n 501,\n );\n }\n await next();\n});\n\n// Route groups\napp.route('/ai', ai);\napp.route('/d1', d1);\napp.route('/kv', kv);\napp.route('/r2', r2);\napp.route('/revalidate', revalidate);\napp.route('/email', email);\n\nexport default { fetch: app.fetch };\n\n// --- HMAC verification ---\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nlet cachedVerifyKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getVerifyKey(secret: string): Promise<CryptoKey> {\n if (cachedVerifyKey && cachedKeySecret === secret) {\n return cachedVerifyKey;\n }\n cachedVerifyKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify'],\n );\n cachedKeySecret = secret;\n return cachedVerifyKey;\n}\n\nasync function verifyHmac(data: string, signature: string, secret: string): Promise<boolean> {\n try {\n const key = await getVerifyKey(secret);\n const sigBytes = base64urlDecode(signature);\n return crypto.subtle.verify('HMAC', key, sigBytes.buffer as ArrayBuffer, encoder.encode(data));\n } catch {\n return false;\n }\n}\n\n// --- JWT verification ---\n\nfunction base64urlDecode(str: string): Uint8Array {\n const padded = str.replace(/-/g, '+').replace(/_/g, '/');\n const binary = atob(padded);\n return Uint8Array.from(binary, (context) => context.charCodeAt(0));\n}\n\nasync function verifyJwt(token: string, secret: string): Promise<JwtPayload | null> {\n const parts = token.split('.');\n if (parts.length !== 3) {\n return null;\n }\n\n const [header, body, signature] = parts;\n\n try {\n const key = await getVerifyKey(secret);\n const sigBytes = base64urlDecode(signature);\n const valid = await crypto.subtle.verify(\n 'HMAC',\n key,\n sigBytes.buffer as ArrayBuffer,\n encoder.encode(`${header}.${body}`),\n );\n if (!valid) {\n return null;\n }\n\n const payload = JSON.parse(decoder.decode(base64urlDecode(body))) as JwtPayload;\n\n const now = Math.floor(Date.now() / 1000);\n if (payload.exp <= now) {\n return null;\n }\n\n if (payload.aud !== 'api' && payload.aud !== 'prerender') {\n return null;\n }\n\n return payload;\n } catch {\n return null;\n }\n}\n"],
6
+ "mappings": "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",
7
+ "names": ["PerformanceMark", "match", "decoder", "raw", "app", "Node", "_Node", "Node", "Hono", "Hono", "encoder", "hmacSign", "encoder", "cachedSignKey", "cachedKeySecret", "getSignKey", "Hono", "decoder", "encoder", "decoder", "beforeDeadline", "raw", "raw", "decoder", "normalized", "encoder", "beforeDeadline", "hmacSign", "encoder", "cachedSignKey", "cachedKeySecret", "getSignKey", "Hono", "raw", "beforeDeadline", "CF_API", "Hono", "CF_API", "Hono", "app", "Hono", "app", "Hono", "hmacSign", "encoder", "decoder", "cachedKeySecret"]
8
8
  }