@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.
- package/README.md +10 -1
- package/dist/email-protocol.d.mts +48 -0
- package/dist/email-protocol.mjs +278 -0
- package/dist/index.d.mts +152 -13
- package/dist/index.mjs +346 -20
- package/dist/installer.d.mts +4 -2
- package/dist/installer.mjs +13 -4
- package/dist/runtime/api/README.md +1 -1
- package/dist/runtime/api/index.js +67382 -54178
- package/dist/runtime/api/index.js.map +4 -4
- package/dist/runtime/dispatch/README.md +1 -1
- package/dist/runtime/dispatch/index.js +26 -8
- package/dist/runtime/dispatch/index.js.map +2 -2
- package/dist/runtime/drizzle/0041_military_beyonder.sql +119 -0
- package/dist/runtime/drizzle/0042_dark_the_anarchist.sql +1 -0
- package/dist/runtime/drizzle/0043_nostalgic_meggan.sql +21 -0
- package/dist/runtime/drizzle/0044_smart_mentor.sql +15 -0
- package/dist/runtime/drizzle/0045_platform_settings.sql +5 -0
- package/dist/runtime/drizzle/0046_email_domains_platform_credential.sql +8 -0
- package/dist/runtime/drizzle/0047_email_gateway.sql +226 -0
- package/dist/runtime/drizzle/0048_project_teams.sql +133 -0
- package/dist/runtime/drizzle/compatibility.json +4 -0
- package/dist/runtime/drizzle/meta/_journal.json +56 -0
- package/dist/runtime/emailGateway/README.md +1 -0
- package/dist/runtime/emailGateway/index.js +5893 -0
- package/dist/runtime/emailGateway/index.js.map +8 -0
- package/dist/runtime/manifest.json +70 -11
- package/dist/runtime/proxy/README.md +1 -1
- package/dist/runtime/proxy/index.js +1629 -2242
- package/dist/runtime/proxy/index.js.map +4 -4
- package/dist/runtime/tail/README.md +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
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/email-gateway/src/index.ts", "../../../../../platform/packages/proxy/src/email-admission.ts", "../../../../../platform/packages/proxy/src/email-router.ts", "../../../../../platform/packages/api/src/reserved-slugs.ts", "../../../../../platform/packages/email-gateway/src/tenant-dispatch.ts", "../../email-protocol.mjs", "../../../../../platform/packages/proxy/src/email-lease.ts", "../../../../../platform/packages/proxy/src/email-provider-deadline.ts", "../../../../../platform/packages/proxy/src/email.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", "../../../../../platform/packages/proxy/src/body.ts"],
|
|
4
|
+
"sourceRoot": "/home/runner/work/void/void/packages/platform/dist/runtime/emailGateway",
|
|
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 { claimRelayedReceipt, completeRelayedReceipt } from '../../proxy/src/email-admission.ts';\nimport {\n routeInbound,\n routeRelayed,\n MAX_INBOUND_BYTES,\n MAX_INBOUND_HEADERS,\n} from '../../proxy/src/email-router.ts';\nimport type { EmailEnvelope } from '../../proxy/src/email-router.ts';\nimport type { Env as ProxyEnv } from '../../proxy/src/types.ts';\n\ntype Env = Omit<ProxyEnv, 'JWT_SECRET'> & {\n PLATFORM_INSTALLATION_ID?: string;\n PLATFORM_VERSION?: string;\n PLATFORM_TRAFFIC_STATE?: string;\n EMAIL_SHARED_ACCOUNT_ID?: string;\n EMAIL_SHARED_ZONE_ID?: string;\n EMAIL_SHARED_INGRESS_NAME?: string;\n};\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst MAX_HEADER_BYTES = 128 * 1024;\nconst MAX_ENVELOPE_HEADER = 320;\nconst MAX_CONCURRENT_DELIVERIES = 2;\nconst CONFIRMATION_PATH = '/email/destinations/confirm';\nconst MAX_CONFIRMATION_TOKEN_LENGTH = 4 * 1024;\nconst MAX_CONFIRMATION_RESPONSE_BYTES = 32 * 1024;\nconst CONFIRMATION_DEADLINE_MS = 5_000;\nlet activeDeliveries = 0;\n\nclass MimeHeaderError extends Error {\n constructor(\n message: string,\n readonly status: 400 | 413,\n ) {\n super(message);\n this.name = 'MimeHeaderError';\n }\n}\n\nasync function withDeliverySlot<T>(run: () => Promise<T>): Promise<T> {\n if (activeDeliveries >= MAX_CONCURRENT_DELIVERIES) {\n throw new Error('email gateway busy');\n }\n activeDeliveries++;\n try {\n return await run();\n } finally {\n activeDeliveries--;\n }\n}\n\nasync function sign(value: 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 signature = new Uint8Array(await crypto.subtle.sign('HMAC', key, encoder.encode(value)));\n let binary = '';\n for (const byte of signature) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary).replaceAll('+', '-').replaceAll('/', '_').replaceAll('=', '');\n}\n\ntype Route = {\n routeId: string;\n routeGeneration: number;\n connectionId: string;\n projectId: string;\n workerName: string;\n deploymentId: string;\n slug: string;\n domain: string;\n addressing: 'shared' | 'custom';\n limits?: Record<string, number>;\n};\n\nasync function resolveIngress(\n env: Env,\n input: {\n accountId: string;\n zoneId: string;\n ingressName: string;\n from: string;\n to: string;\n secret?: string;\n native?: true;\n },\n): Promise<Route | null> {\n const deadline = Date.now() + 5_000;\n const controller = new AbortController();\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('ingress resolution timeout');\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n run(),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('ingress resolution timeout'));\n }, remaining);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n };\n const proof = await sign(\n `email-ingress-v1\\n${input.accountId}\\n${input.zoneId}\\n${input.ingressName}\\n${input.to.toLowerCase()}`,\n env.EMAIL_SIGNING_SECRET,\n );\n const response = await beforeDeadline(() =>\n env.API.fetch('https://api/internal/email/resolve-ingress', {\n method: 'POST',\n headers: { 'content-type': 'application/json', 'x-void-internal': proof },\n body: JSON.stringify(input),\n signal: controller.signal,\n }),\n );\n if (!response.ok) {\n void response.body?.cancel().catch(() => {});\n if (response.status >= 500 || response.status === 429) {\n throw new Error('email routing unavailable');\n }\n return null;\n }\n const contentLength = Number(response.headers.get('content-length'));\n if (Number.isFinite(contentLength) && contentLength > 4096) {\n void response.body?.cancel().catch(() => {});\n throw new Error('invalid email routing response');\n }\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('invalid email routing response');\n }\n const chunks: Array<Uint8Array> = [];\n let total = 0;\n try {\n while (true) {\n const chunk = await beforeDeadline(() => reader.read());\n if (chunk.done) {\n break;\n }\n total += chunk.value.byteLength;\n if (total > 4096) {\n throw new Error('invalid email routing response');\n }\n chunks.push(chunk.value);\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 const bytes = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n const text = decoder.decode(bytes);\n let route: unknown;\n try {\n route = JSON.parse(text);\n } catch {\n throw new Error('invalid email routing response');\n }\n if (!route || typeof route !== 'object') {\n throw new Error('invalid email routing response');\n }\n const value = route as Partial<Route>;\n if (\n typeof value.routeId !== 'string' ||\n !Number.isSafeInteger(value.routeGeneration) ||\n value.routeGeneration! < 1 ||\n typeof value.projectId !== 'string' ||\n typeof value.connectionId !== 'string' ||\n typeof value.workerName !== 'string' ||\n typeof value.deploymentId !== 'string' ||\n typeof value.slug !== 'string' ||\n typeof value.domain !== 'string' ||\n (value.addressing !== 'shared' && value.addressing !== 'custom')\n ) {\n throw new Error('invalid email routing response');\n }\n return value as Route;\n}\n\nasync function readMime(\n stream: ReadableStream<Uint8Array> | null,\n declared: number,\n): Promise<Uint8Array> {\n if (!stream || !Number.isSafeInteger(declared) || declared < 0 || declared > MAX_INBOUND_BYTES) {\n throw new Error('invalid MIME length');\n }\n const reader = stream.getReader();\n const result = new Uint8Array(declared);\n let size = 0;\n const deadline = Date.now() + 15_000;\n try {\n while (true) {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new Error('MIME timeout');\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n const chunk = await Promise.race([\n reader.read(),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error('MIME timeout')), remaining);\n }),\n ]).finally(() => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n });\n if (chunk.done) {\n break;\n }\n size += chunk.value.byteLength;\n if (size > declared || size > MAX_INBOUND_BYTES) {\n throw new Error('MIME too large');\n }\n result.set(chunk.value, size - chunk.value.byteLength);\n }\n if (size !== declared) {\n throw new Error('truncated MIME');\n }\n return result;\n } catch (error) {\n void reader.cancel().catch(() => {});\n throw error;\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // A timed-out read may still be settling after cancellation.\n }\n }\n}\n\nfunction parseHeaders(raw: Uint8Array): Record<string, string> {\n let end = -1;\n for (let i = 0; i < raw.length - 3 && i < MAX_HEADER_BYTES + 4; i++) {\n if (raw[i] === 13 && raw[i + 1] === 10 && raw[i + 2] === 13 && raw[i + 3] === 10) {\n end = i;\n break;\n }\n }\n if (end < 0) {\n throw new MimeHeaderError(\n 'invalid MIME headers',\n raw.byteLength > MAX_HEADER_BYTES ? 413 : 400,\n );\n }\n if (end > MAX_HEADER_BYTES) {\n throw new MimeHeaderError('MIME headers too large', 413);\n }\n const lines = decoder.decode(raw.subarray(0, end)).split('\\r\\n');\n const headers: Record<string, string> = Object.create(null);\n let current = '';\n let physicalLines = 0;\n for (const line of lines) {\n if (++physicalLines > MAX_INBOUND_HEADERS) {\n throw new MimeHeaderError('too many MIME headers', 413);\n }\n if (/^[ \\t]/.test(line)) {\n if (!current) {\n throw new MimeHeaderError('invalid MIME header fold', 400);\n }\n headers[current] += ` ${line.trim()}`;\n continue;\n }\n const colon = line.indexOf(':');\n if (colon <= 0) {\n throw new MimeHeaderError('invalid MIME header', 400);\n }\n const name = line.slice(0, colon).toLowerCase();\n if (!/^[!#$%&'*+.^_`|~0-9a-z-]+$/.test(name)) {\n throw new MimeHeaderError('invalid MIME header name', 400);\n }\n headers[name] = headers[name]\n ? `${headers[name]}, ${line.slice(colon + 1).trim()}`\n : line.slice(colon + 1).trim();\n current = name;\n }\n return headers;\n}\n\nasync function ingress(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {\n if (env.PLATFORM_TRAFFIC_STATE === 'staging' || env.PLATFORM_TRAFFIC_STATE === 'sandbox-drain') {\n return new Response(null, { status: 503 });\n }\n if (request.headers.get('content-encoding')) {\n return new Response(null, { status: 415 });\n }\n const accountId = request.headers.get('x-void-email-account') ?? '';\n const zoneId = request.headers.get('x-void-email-zone') ?? '';\n const ingressName = request.headers.get('x-void-email-ingress') ?? '';\n const requestId = request.headers.get('x-void-email-request-id') ?? '';\n const from = request.headers.get('x-void-email-from') ?? '';\n const to = request.headers.get('x-void-email-to') ?? '';\n const authorization = request.headers.get('authorization') ?? '';\n if (\n [accountId, zoneId, ingressName, from, to, authorization].some(\n (value) => !value || value.length > MAX_ENVELOPE_HEADER,\n ) ||\n !authorization.startsWith('Bearer ') ||\n !/^[a-f0-9-]{36}$/.test(requestId)\n ) {\n return new Response(null, { status: 400 });\n }\n const declaredHeader = request.headers.get('content-length');\n if (declaredHeader === null || !/^\\d+$/.test(declaredHeader)) {\n return new Response(null, { status: 411 });\n }\n const declared = Number(declaredHeader);\n if (!Number.isSafeInteger(declared) || declared < 0) {\n return new Response(null, { status: 411 });\n }\n if (declared > MAX_INBOUND_BYTES) {\n return new Response(null, { status: 413 });\n }\n let route: Route | null;\n try {\n route = await resolveIngress(env, {\n accountId,\n zoneId,\n ingressName,\n from,\n to,\n secret: authorization.slice(7),\n });\n } catch {\n return new Response(null, { status: 503 });\n }\n if (!route) {\n return new Response(null, { status: 403 });\n }\n let raw: Uint8Array;\n try {\n raw = await readMime(request.body, declared);\n } catch (error) {\n console.error(\n '[email-gateway] ingress failed:',\n error instanceof Error ? error.message.slice(0, 200) : 'unknown',\n );\n return new Response(null, { status: 502 });\n }\n let headers: Record<string, string>;\n try {\n headers = parseHeaders(raw);\n } catch (error) {\n if (error instanceof MimeHeaderError) {\n return new Response(null, { status: error.status });\n }\n throw error;\n }\n try {\n const domain = to.slice(to.lastIndexOf('@') + 1).toLowerCase();\n if (domain !== route.domain) {\n return new Response(null, { status: 403 });\n }\n const envelope: EmailEnvelope = {\n from,\n to,\n raw,\n rawSize: raw.byteLength,\n headers,\n ...(route.addressing === 'custom' ? { viaDomain: domain } : {}),\n };\n let stub: Fetcher;\n try {\n stub = (\n route.limits\n ? env.DISPATCH.get(route.workerName, {}, { limits: route.limits })\n : env.DISPATCH.get(route.workerName)\n ) as Fetcher;\n } catch (error) {\n console.error('[email-gateway] tenant dispatch stub unavailable:', error);\n return new Response(null, { status: 503 });\n }\n const receiptId = await sha256(encoder.encode(JSON.stringify([route.connectionId, requestId])));\n const payloadDigest = await sha256(\n encoder.encode(JSON.stringify([from, to, await sha256(raw)])),\n );\n const identity = {\n receiptId,\n projectId: route.projectId,\n payloadDigest,\n route: {\n routeId: route.routeId,\n routeGeneration: route.routeGeneration,\n connectionId: route.connectionId,\n addressing: route.addressing,\n domain: route.domain,\n projectSlug: route.slug,\n },\n };\n let claim;\n try {\n claim = await claimRelayedReceipt(env, identity);\n } catch (error) {\n if (error instanceof Error && error.message === 'IDEMPOTENCY_CONFLICT') {\n return new Response(null, { status: 409 });\n }\n throw error;\n }\n if (claim.state === 'completed' && typeof claim.reject === 'boolean') {\n return new Response(null, {\n status: claim.reject ? 403 : 204,\n headers: { 'x-void-email-receipt': receiptId },\n });\n }\n if (claim.state !== 'claimed') {\n return new Response(null, { status: 503, headers: { 'x-void-email-receipt': receiptId } });\n }\n const result = await routeRelayed(env, ctx, {\n stub,\n projectId: route.projectId,\n domain,\n envelope,\n authoritative: route,\n receiptId,\n });\n if (result.temporary) {\n return new Response(null, { status: 503 });\n }\n try {\n await completeRelayedReceipt(env, identity, result.reject);\n } catch {\n // The receipt remains unresolved. Never rerun completed tenant work or\n // already-submitted actions just because its final checkpoint was lost.\n console.error('[email-gateway] receipt completion remains unresolved', receiptId);\n }\n return new Response(null, {\n status: result.reject ? 403 : 204,\n headers: { 'x-void-email-receipt': receiptId },\n });\n } catch (error) {\n console.error(\n '[email-gateway] ingress failed:',\n error instanceof Error ? error.message.slice(0, 200) : 'unknown',\n );\n return new Response(null, { status: 502 });\n }\n}\n\nasync function sha256(bytes: Uint8Array): Promise<string> {\n return Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256', bytes)), (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n}\n\nasync function probe(request: Request, env: Env): Promise<Response> {\n if (request.headers.get('content-encoding')) {\n void request.body?.cancel().catch(() => {});\n return new Response(null, { status: 400 });\n }\n const declared = request.headers.get('content-length');\n if (declared && (!/^\\d+$/.test(declared) || Number(declared) > 1024)) {\n void request.body?.cancel().catch(() => {});\n return new Response(null, { status: 400 });\n }\n const authorization = request.headers.get('authorization') ?? '';\n if (!authorization.startsWith('Bearer ') || authorization.length > MAX_ENVELOPE_HEADER) {\n return new Response(null, { status: 403 });\n }\n const reader = request.body?.getReader();\n if (!reader) {\n return new Response(null, { status: 400 });\n }\n const bytes = new Uint8Array(1024);\n let size = 0;\n const deadline = Date.now() + 5_000;\n try {\n while (true) {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n return new Response(null, { status: 400 });\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n const chunk = await Promise.race([\n reader.read(),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error('probe timeout')), remaining);\n }),\n ]).finally(() => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n });\n if (chunk.done) {\n break;\n }\n size += chunk.value.byteLength;\n if (size > bytes.byteLength) {\n return new Response(null, { status: 400 });\n }\n bytes.set(chunk.value, size - chunk.value.byteLength);\n }\n } catch {\n return new Response(null, { status: 400 });\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 if (size === 0 || (declared && size !== Number(declared))) {\n return new Response(null, { status: 400 });\n }\n let input: unknown;\n try {\n input = JSON.parse(decoder.decode(bytes.subarray(0, size)));\n } catch {\n return new Response(null, { status: 400 });\n }\n if (!input || typeof input !== 'object') {\n return new Response(null, { status: 400 });\n }\n const { accountId, zoneId, ingressName } = input as Record<string, unknown>;\n if (\n [accountId, zoneId, ingressName].some(\n (value) => typeof value !== 'string' || !value || value.length > MAX_ENVELOPE_HEADER,\n )\n ) {\n return new Response(null, { status: 400 });\n }\n const proof = await sign(\n `email-probe-v1\\n${accountId}\\n${zoneId}\\n${ingressName}`,\n env.EMAIL_SIGNING_SECRET,\n );\n const controller = new AbortController();\n const apiDeadline = Date.now() + 5_000;\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const response = await Promise.race([\n env.API.fetch('https://api/internal/email/probe-ingress', {\n method: 'POST',\n headers: { 'content-type': 'application/json', 'x-void-internal': proof },\n body: JSON.stringify({ accountId, zoneId, ingressName, secret: authorization.slice(7) }),\n signal: controller.signal,\n }),\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => {\n controller.abort();\n reject(new Error('email probe timeout'));\n },\n Math.max(0, apiDeadline - Date.now()),\n );\n }),\n ]);\n void response.body?.cancel().catch(() => {});\n return new Response(null, { status: response.status === 204 ? 204 : 403 });\n } catch {\n return new Response(null, { status: 503 });\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n}\n\nfunction confirmationResponse(\n body: BodyInit | null,\n status: number,\n contentType?: string | null,\n): Response {\n const headers = new Headers({\n 'cache-control': 'no-store',\n 'referrer-policy': 'no-referrer',\n 'x-content-type-options': 'nosniff',\n });\n if (contentType) {\n headers.set('content-type', contentType);\n }\n return new Response(body, { status, headers });\n}\n\nasync function readConfirmationResponse(\n response: Response,\n deadline: number,\n controller: AbortController,\n): Promise<Uint8Array | null> {\n const declared = Number(response.headers.get('content-length'));\n if (Number.isFinite(declared) && declared > MAX_CONFIRMATION_RESPONSE_BYTES) {\n throw new Error('confirmation response too large');\n }\n const reader = response.body?.getReader();\n if (!reader) {\n return null;\n }\n const result = new Uint8Array(MAX_CONFIRMATION_RESPONSE_BYTES);\n let size = 0;\n try {\n while (true) {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new Error('confirmation response timeout');\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n const chunk = await Promise.race([\n reader.read(),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('confirmation response timeout'));\n }, remaining);\n }),\n ]).finally(() => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n });\n if (chunk.done) {\n return result.slice(0, size);\n }\n size += chunk.value.byteLength;\n if (size > result.byteLength) {\n throw new Error('confirmation response too large');\n }\n result.set(chunk.value, size - chunk.value.byteLength);\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\nasync function confirmDestination(request: Request, env: Env): Promise<Response> {\n const url = new URL(request.url);\n const entries = [...url.searchParams.entries()];\n if (\n entries.length !== 1 ||\n entries[0]![0] !== 'token' ||\n !entries[0]![1] ||\n entries[0]![1].length > MAX_CONFIRMATION_TOKEN_LENGTH ||\n !/^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/.test(entries[0]![1])\n ) {\n return confirmationResponse(null, 400);\n }\n if (env.PLATFORM_TRAFFIC_STATE === 'staging' || env.PLATFORM_TRAFFIC_STATE === 'sandbox-drain') {\n return confirmationResponse(null, 503);\n }\n\n const deadline = Date.now() + CONFIRMATION_DEADLINE_MS;\n const controller = new AbortController();\n let response: Response | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const target = new URL(`https://api${CONFIRMATION_PATH}`);\n target.searchParams.set('token', entries[0]![1]);\n const serviceRequest = env.API.fetch(target.toString(), {\n method: 'GET',\n redirect: 'manual',\n signal: controller.signal,\n });\n void serviceRequest.then(\n (lateResponse) => {\n if (controller.signal.aborted && lateResponse !== response) {\n void lateResponse.body?.cancel().catch(() => {});\n }\n },\n () => {},\n );\n response = await Promise.race([\n serviceRequest,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('confirmation request timeout'));\n }, CONFIRMATION_DEADLINE_MS);\n }),\n ]);\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n const body = await readConfirmationResponse(response, deadline, controller);\n return confirmationResponse(body, response.status, response.headers.get('content-type'));\n } catch {\n return confirmationResponse(null, 503);\n } finally {\n controller.abort();\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n void response?.body?.cancel().catch(() => {});\n }\n}\n\nexport default {\n async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {\n const url = new URL(request.url);\n if (request.method === 'GET' && url.pathname === '/health') {\n return Response.json({\n ok: true,\n installationId: env.PLATFORM_INSTALLATION_ID,\n platformVersion: env.PLATFORM_VERSION,\n emailProtocolVersion: 1,\n });\n }\n if (request.method === 'GET' && url.pathname === CONFIRMATION_PATH) {\n return confirmDestination(request, env);\n }\n if (request.method !== 'POST') {\n return new Response(null, { status: 404 });\n }\n if (url.pathname === '/email/probe') {\n return probe(request, env);\n }\n if (url.pathname === '/email/ingress') {\n try {\n return await withDeliverySlot(() => ingress(request, env, ctx));\n } catch {\n return new Response(null, { status: 503 });\n }\n }\n return new Response(null, { status: 404 });\n },\n async email(message: ForwardableEmailMessage, env: Env, ctx: ExecutionContext): Promise<void> {\n if (\n env.PLATFORM_TRAFFIC_STATE === 'staging' ||\n env.PLATFORM_TRAFFIC_STATE === 'sandbox-drain'\n ) {\n throw new Error('Email gateway temporarily unavailable');\n }\n const accountId = env.EMAIL_SHARED_ACCOUNT_ID;\n const zoneId = env.EMAIL_SHARED_ZONE_ID;\n const ingressName = env.EMAIL_SHARED_INGRESS_NAME;\n if (!accountId || !zoneId || !ingressName) {\n message.setReject('Email routing is not configured');\n return;\n }\n let route: Route | null;\n try {\n route = await resolveIngress(env, {\n accountId,\n zoneId,\n ingressName,\n from: message.from,\n to: message.to,\n native: true,\n });\n } catch {\n throw new Error('Email route temporarily unavailable');\n }\n if (!route) {\n message.setReject('Email route unavailable');\n return;\n }\n await withDeliverySlot(() => routeInbound(message, env, ctx, route));\n },\n};\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", "/** Inbound email actions after the gateway resolves an authoritative route. */\n\nimport { isReservedEmailSlug } from '@voidcloud/api/reserved-slugs';\nimport { EmailMessage } from 'cloudflare:email';\nimport { validate as isValidEmailSyntax } from 'email-validator';\nimport { dispatchBoundedEmailToTenant } from '../../email-gateway/src/tenant-dispatch.ts';\nimport {\n admitEmail,\n emailPayloadDigest,\n finishEmailAttempt,\n recordEmailReceipt,\n startEmailAttempt,\n} from './email-admission.ts';\nimport type { ReceiptRouteFence } from './email-admission.ts';\nimport { leaseBearer, leaseEmailDomainCredential } from './email-lease.ts';\nimport {\n EMAIL_PROVIDER_DEADLINE_MS,\n createEmailProviderDeadline,\n} from './email-provider-deadline.ts';\nimport {\n MAX_MIME_BYTES,\n classifySendRawRecipient,\n parseSendRawResult,\n readMimeFromAddrSpec,\n readSenderDomain,\n recordInboundDelivery,\n requestSendRaw,\n} from './email.ts';\nimport type { Env as ProxyEnv } from './types.ts';\ntype Env = Omit<ProxyEnv, 'JWT_SECRET'>;\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/** Bound log and rejection text before stripping control characters. */\nfunction sanitize(value: string, maxLen: number): string {\n return value.slice(0, maxLen).replace(CONTROL_CHARS_RE, ' ');\n}\n\n/** Render unknown tenant values by kind without coercing large arrays or objects. */\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\nexport interface AuthoritativeEmailRoute {\n routeId: string;\n routeGeneration: number;\n connectionId: string;\n projectId: string;\n workerName: string;\n deploymentId: string;\n slug: string;\n addressing: 'shared' | 'custom';\n domain: string;\n limits?: Record<string, number>;\n}\n\nfunction receiptRouteFence(route: AuthoritativeEmailRoute): ReceiptRouteFence {\n return {\n routeId: route.routeId,\n routeGeneration: route.routeGeneration,\n connectionId: route.connectionId,\n addressing: route.addressing,\n domain: route.domain,\n projectSlug: route.slug,\n };\n}\n\n/** Bounded envelope passed through the gateway's tenant dispatch protocol. */\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. Its recipient\n * carries no shared-domain project prefix to strip.\n */\n viaDomain?: string;\n}\n\n/** Shared with the dedicated gateway. */\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\n/** Keep buffered messages within the shared proxy isolate budget. */\nexport const MAX_INBOUND_BYTES = 10 * 1024 * 1024;\n\n/** Bound distinct header names before building the envelope object. */\nexport const MAX_INBOUND_HEADERS = 1024;\nexport const MAX_INBOUND_HEADER_BYTES = 128 * 1024;\n\n/** Limit handler rejection text exposed to remote MTAs and logs. */\nexport const MAX_REJECT_REASON_LENGTH = 1000;\n\n/** Bound tenant action validation work per inbound delivery. */\nconst MAX_ACTIONS = 100;\n\n/** Maximum action address length before syntax validation. */\nconst MAX_ACTION_ADDRESS_LENGTH = 320;\n\n/** Bound forward header construction. */\nexport const MAX_FORWARD_HEADERS = 32;\nexport const MAX_FORWARD_HEADER_LENGTH = 1024;\n\n/** Limit one reply MIME payload. */\nconst MAX_REPLY_BYTES = 5 * 1024 * 1024;\n\n/** Limit total reply MIME bytes in one delivery. */\nconst MAX_REPLY_BYTES_TOTAL = 8 * 1024 * 1024;\nconst INBOUND_STREAM_DEADLINE_MS = 15_000;\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\nclass InboundHeadersTooLargeError extends Error {\n constructor() {\n super(`inbound headers exceed ${MAX_INBOUND_HEADER_BYTES} bytes`);\n this.name = 'InboundHeadersTooLargeError';\n }\n}\n\n/** Use the same address validator as the framework after a length guard. */\nexport function isValidEmailAddress(s: unknown): s is string {\n return typeof s === 'string' && s.length <= MAX_ACTION_ADDRESS_LENGTH && isValidEmailSyntax(s);\n}\n\n/** Render invalid addresses without coercing untrusted objects. */\nfunction logAddress(value: unknown): string {\n return describeUntrusted(value, MAX_ACTION_ADDRESS_LENGTH);\n}\n\n/** Reject oversized or malformed header bags before constructing Headers. */\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 // Check the count before reading values or constructing Headers.\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 // Headers accepts long names, so cap them explicitly.\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 // Reject values that Headers would coerce to strings.\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/** Pin shared-domain reply senders to the receiving project; admission checks ownership. */\ninterface ReplySenderPin {\n slug: string;\n domain: string;\n customDomain: boolean;\n}\n\n/** Check the envelope shape before authoritative admission checks sender ownership. */\nfunction isPermittedReplySender(from: string, pin: ReplySenderPin): boolean {\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 return true;\n }\n if (pin.customDomain) {\n return true;\n }\n return lower.slice(0, at).split('+')[0] === pin.slug;\n}\n\ninterface OutboundGate {\n projectId: string;\n receiptId: string;\n transport: 'native' | 'relay';\n}\n\nexport async function routeInbound(\n message: ForwardableEmailMessage,\n env: Env,\n ctx: ExecutionContext,\n authoritative: AuthoritativeEmailRoute,\n): Promise<void> {\n // The sender domain labels bounces, but is not needed to route inbound mail.\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 // Shared platform addresses remain reserved even when a route exists.\n if (authoritative.addressing !== 'custom' && isReservedEmailSlug(slug)) {\n message.setReject(`${label}: \"${sanitize(slug, 64)}\" is a reserved platform address`);\n return;\n }\n\n if (\n !authoritative.projectId ||\n !authoritative.workerName ||\n !authoritative.deploymentId ||\n authoritative.domain?.toLowerCase() !== receivedDomain ||\n (authoritative.addressing === 'shared' && authoritative.slug.toLowerCase() !== slug)\n ) {\n message.setReject(`${label}: authoritative route mismatch`);\n return;\n }\n const workerName = authoritative.workerName;\n const projectId = authoritative.projectId;\n\n let stub: Fetcher;\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 = (\n authoritative.limits\n ? env.DISPATCH.get(workerName, {}, { limits: authoritative.limits })\n : env.DISPATCH.get(workerName)\n ) as Fetcher;\n } catch (e) {\n console.error(`[email-router] DISPATCH.get(${sanitize(workerName, 320)}) failed:`, e);\n throw new Error('email worker temporarily unavailable');\n }\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 // Buffer the body and headers into the bounded tenant envelope.\n let envelope: EmailEnvelope;\n try {\n envelope = await buildEnvelope(message);\n if (authoritative.addressing === 'custom') {\n envelope.viaDomain = receivedDomain;\n }\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 if (e instanceof InboundHeadersTooLargeError) {\n message.setReject(`${label}: headers too large (max ${MAX_INBOUND_HEADER_BYTES} bytes)`);\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 const receiptId = crypto.randomUUID();\n const gate: OutboundGate = { projectId, receiptId, transport: 'native' };\n\n let actions: Array<EmailAction>;\n try {\n await recordEmailReceipt(\n env,\n receiptId,\n projectId,\n 'received',\n receiptRouteFence(authoritative),\n );\n } catch {\n throw new Error('email admission temporarily unavailable');\n }\n try {\n const result = await dispatchBoundedEmailToTenant(stub, env, {\n projectId,\n deploymentId: authoritative.deploymentId,\n envelope,\n receiptId,\n });\n actions = result.actions;\n } catch (e) {\n await recordEmailReceipt(env, receiptId, projectId, 'handler_failed').catch(() => {});\n const msg = e instanceof Error ? e.message.slice(0, 320) : describeUntrusted(e, 320);\n console.error(`[email-router] dispatch to ${sanitize(workerName, 320)} failed:`, msg);\n throw new Error('email handler execution unresolved');\n }\n\n try {\n await recordEmailReceipt(env, receiptId, projectId, 'handler_completed');\n } catch {\n console.error('[email-router] handler completed but receipt status could not be saved');\n return;\n }\n\n try {\n await enactActions(env, message, actions, gate, {\n customDomain: authoritative.addressing === 'custom',\n slug: authoritative.slug.toLowerCase(),\n domain: receivedDomain,\n });\n } catch {\n console.error('[email-router] action execution unresolved', receiptId);\n return;\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, projectId, message, actions));\n}\n\n/** The gateway response to a relayed inbound message. */\nexport interface RelayRouteOutcome {\n reject: boolean;\n temporary?: boolean;\n}\n\n/** Dispatch a relayed message using the route resolved by the gateway. */\nexport async function routeRelayed(\n env: Env,\n ctx: ExecutionContext,\n input: {\n stub: Fetcher;\n projectId: string;\n domain: string;\n envelope: EmailEnvelope;\n authoritative: AuthoritativeEmailRoute;\n receiptId: string;\n },\n): Promise<RelayRouteOutcome> {\n const { stub, projectId, domain, envelope, authoritative, receiptId } = input;\n\n if (\n authoritative.projectId !== projectId ||\n !authoritative.workerName ||\n !authoritative.slug ||\n authoritative.domain?.toLowerCase() !== domain\n ) {\n return { reject: true };\n }\n const slug = authoritative.slug;\n const workerName = authoritative.workerName;\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(envelope);\n\n const gate: OutboundGate = {\n projectId,\n receiptId,\n transport: 'relay',\n };\n\n let actions: Array<EmailAction>;\n try {\n const result = await dispatchBoundedEmailToTenant(stub, env, {\n projectId,\n deploymentId: authoritative.deploymentId,\n envelope,\n receiptId,\n });\n actions = result.actions;\n } catch (e) {\n await recordEmailReceipt(env, receiptId, projectId, 'handler_failed').catch(() => {});\n const msg = e instanceof Error ? e.message.slice(0, 320) : describeUntrusted(e, 320);\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, temporary: true };\n }\n\n try {\n await recordEmailReceipt(env, receiptId, projectId, 'handler_completed');\n } catch {\n console.error('[email-relay] handler completed but receipt status could not be saved');\n return { reject: false };\n }\n\n try {\n await enactActions(env, relayed.message, actions, gate, {\n customDomain: authoritative.addressing === 'custom',\n slug: slug.toLowerCase(),\n domain,\n });\n } catch {\n console.error('[email-relay] action execution unresolved', receiptId);\n return { reject: false };\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/** A message stand-in for relayed delivery; forwarding requires a native event. */\nfunction createRelayedMessage(envelope: EmailEnvelope): {\n message: ForwardableEmailMessage;\n rejectedReason: () => string | null;\n} {\n let reason: string | null = null;\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 throw new DefinitiveEmailActionError('relayed forward requires a native email event');\n },\n };\n return {\n message: message as unknown as ForwardableEmailMessage,\n rejectedReason: () => reason,\n };\n}\n\n// Finish all local work before attempt_started: a missing lease or invalid\n// MIME means no provider submission occurred and the reservation can be cancelled.\nasync function prepareRelayedReply(\n env: Env,\n projectId: string,\n from: string,\n raw: Uint8Array,\n expectedAccountId?: string,\n): Promise<(to: string, deadlineMs?: number) => Promise<string | undefined>> {\n const senderDomain = from.slice(from.indexOf('@') + 1).toLowerCase();\n if (senderDomain === readSenderDomain(env)) {\n const binding = env.SEND_EMAIL;\n if (!binding || typeof binding.send !== 'function') {\n throw new Error('shared email binding is unavailable');\n }\n return async (to) => {\n const result = await binding.send(new EmailMessage(from, to, envelopeRawStream(raw)));\n return result?.messageId;\n };\n }\n const lease = await leaseEmailDomainCredential(env, senderDomain, projectId);\n if (!lease || (expectedAccountId && lease.accountId !== expectedAccountId)) {\n throw new Error('could not lease the domain credential');\n }\n const mimeMessage = new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(raw);\n return async (to, deadlineMs = EMAIL_PROVIDER_DEADLINE_MS) => {\n let response;\n try {\n response = await requestSendRaw(\n {\n accountId: lease.accountId,\n bearer: leaseBearer(lease),\n from,\n recipients: [to],\n mimeMessage,\n },\n deadlineMs,\n );\n } catch {\n throw new Error('email sending request failed');\n }\n if (!response.ok) {\n if (response.status >= 500 || response.status === 408) {\n throw new Error('email sending API outcome unknown');\n }\n throw new DefinitiveEmailActionError(`email sending API returned ${response.status}`);\n }\n const data = response.data;\n if (typeof data !== 'object' || data === null || !('success' in data)) {\n throw new Error('email sending API response invalid');\n }\n if (data.success === false) {\n throw new DefinitiveEmailActionError('email sending API refused the message');\n }\n if (data.success !== true) {\n throw new Error('email sending API response invalid');\n }\n const result = parseSendRawResult((data as { result?: unknown }).result);\n if (!result) {\n throw new Error('email sending API response invalid');\n }\n const outcome = classifySendRawRecipient(result, to);\n if (outcome === 'permanent_bounce') {\n throw new DefinitiveEmailActionError('recipient permanently bounced');\n }\n if (outcome === 'suppressed') {\n throw new DefinitiveEmailActionError('recipient is on the suppression list');\n }\n if (outcome === 'outcome_unknown') {\n throw new Error('email sending API did not classify the recipient');\n }\n return result.messageId;\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\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 because a tenant\n // response can contain arbitrary values.\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(projectId, {\n from: String(message.from ?? ''),\n to: String(message.to ?? ''),\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 let headerBytes = 0;\n const encoder = new TextEncoder();\n for (const entry of message.headers) {\n if (entries.length >= MAX_INBOUND_HEADERS) {\n throw new InboundTooManyHeadersError();\n }\n headerBytes += encoder.encode(entry[0]).byteLength + encoder.encode(entry[1]).byteLength;\n if (headerBytes > MAX_INBOUND_HEADER_BYTES) {\n throw new InboundHeadersTooLargeError();\n }\n entries.push(entry);\n }\n const raw = await readStreamToBytes(message.raw);\n // Plain objects serialize through tenant dispatch; fromEntries also keeps\n // a `__proto__` header as an own data property.\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 const deadline = Date.now() + INBOUND_STREAM_DEADLINE_MS;\n try {\n for (;;) {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new Error('inbound message stream timed out');\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n const { value, done } = await Promise.race([\n reader.read(),\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error('inbound message stream timed out')),\n remaining,\n );\n }),\n ]).finally(() => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n });\n if (done) {\n break;\n }\n total += value.byteLength;\n if (total > MAX_INBOUND_BYTES) {\n throw new InboundTooLargeError(total);\n }\n chunks.push(value);\n }\n } catch (error) {\n // Do not let an uncooperative source extend the read deadline while its\n // cancellation algorithm runs.\n void reader.cancel().catch(() => {});\n throw error;\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // A timed-out read may still be settling after cancellation.\n }\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\nclass DefinitiveEmailActionError extends Error {}\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. Any invalid action drops the entire list before\n * side effects fire. The message remains accepted by Cloudflare, while the\n * receipt records that its actions were rejected.\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 // Bound validation work before walking tenant actions.\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 return null;\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 return null;\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 // Reject the list before any action can have side effects.\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 return null;\n }\n // Check who the reply claims to be before asking the API to admit it.\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 return null;\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 return null;\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. An overrun rejects the entire action batch.\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 return null;\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 return null;\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 return null;\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 return null;\n }\n }\n return out;\n}\n\n/** Validate actions, then ask the API to admit each outbound attempt. */\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 // The handler ran, but none of its invalid actions was enacted.\n await recordEmailReceipt(env, gate.receiptId, gate.projectId, 'actions_rejected').catch(() => {\n console.error('[email-router] could not record rejected actions');\n });\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 if (!gate.projectId || !gate.receiptId) {\n console.error(\n '[email-router] action admission unavailable: missing project or receipt identity',\n );\n return;\n }\n const providerDeadline = createEmailProviderDeadline();\n for (const [index, action] of actions.entries()) {\n if (action.type === 'reject') {\n message.setReject(action.reason);\n return;\n }\n if (providerDeadline.expired()) {\n console.error('[email-router] action batch deadline elapsed before admission');\n break;\n }\n const to = action.to.toLowerCase();\n const from = action.type === 'reply' ? action.from : message.to;\n const digest = await emailPayloadDigest(\n action.type,\n from,\n [to],\n action.type === 'reply'\n ? action.raw\n : new TextEncoder().encode(JSON.stringify([...(action.headers?.entries() ?? [])].sort())),\n );\n let admission;\n try {\n admission = await admitEmail(env, {\n projectId: gate.projectId,\n kind: action.type,\n key: `${gate.receiptId}:${index}:${digest.slice(0, 16)}`,\n digest,\n from,\n recipients: [to],\n transport:\n gate.transport === 'relay'\n ? action.type === 'reply' &&\n action.from.slice(action.from.indexOf('@') + 1).toLowerCase() ===\n readSenderDomain(env)\n ? 'binding'\n : 'send_raw'\n : action.type === 'forward'\n ? 'native_forward'\n : 'native_reply',\n receiptId: gate.receiptId,\n });\n } catch (error) {\n console.error(\n '[email-router] action admission unavailable:',\n error instanceof Error ? error.message : 'unknown',\n );\n continue;\n }\n const admitted = admission.recipients.find((r) => r.recipient === to);\n if (admission.replay || admitted?.state !== 'reserved') {\n continue;\n }\n let relayedReply:\n | ((to: string, deadlineMs?: number) => Promise<string | undefined>)\n | undefined;\n if (gate.transport === 'relay' && action.type === 'reply') {\n try {\n relayedReply = await prepareRelayedReply(\n env,\n gate.projectId,\n action.from,\n action.raw,\n admission.accountId,\n );\n } catch {\n await finishEmailAttempt(env, admission.operationId, [to], 'cancelled').catch(() => {\n console.error('[email-router] could not cancel unsubmitted relayed reply');\n });\n console.error('[email-router] relayed reply could not be prepared');\n continue;\n }\n }\n if (providerDeadline.expired()) {\n const cancelled = await cancelUnstartedAction(env, admission.operationId, to);\n console.error(\n cancelled\n ? '[email-router] action batch deadline elapsed; reservation cancelled'\n : '[email-router] action batch deadline elapsed; cancellation unresolved',\n );\n break;\n }\n try {\n await startEmailAttempt(env, admission.operationId, [to]);\n } catch {\n const cancelled = await cancelUnstartedAction(env, admission.operationId, to);\n console.error(\n cancelled\n ? '[email-router] attempt did not start; reservation cancelled'\n : '[email-router] could not confirm attempt status',\n );\n continue;\n }\n try {\n let providerReference: string | undefined;\n if (action.type === 'forward') {\n await providerDeadline.run(() => message.forward(to, action.headers));\n } else {\n if (relayedReply) {\n providerReference = await providerDeadline.run(() =>\n relayedReply!(to, providerDeadline.remainingMs()),\n );\n } else {\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(action.raw);\n controller.close();\n },\n });\n await providerDeadline.run(() =>\n message.reply(new EmailMessage(action.from, to, stream) as never),\n );\n }\n }\n try {\n await finishEmailAttempt(env, admission.operationId, [to], 'provider_accepted', {\n providerReference,\n });\n } catch {\n console.error('[email-router] provider accepted action but outcome ledger write failed');\n }\n } catch (error) {\n const definitive = error instanceof DefinitiveEmailActionError;\n try {\n await finishEmailAttempt(\n env,\n admission.operationId,\n [to],\n definitive ? 'failed' : 'outcome_unknown',\n {\n errorCode: definitive ? 'UPSTREAM_ERROR' : 'OUTCOME_UNKNOWN',\n },\n );\n } catch {\n /* attempt_started remains visible for operator reconciliation */\n }\n console.error(\n definitive\n ? '[email-router] action provider refused'\n : '[email-router] action provider outcome unknown',\n );\n }\n }\n}\n\n/** Cancel only when the API still proves that no provider attempt started. */\nasync function cancelUnstartedAction(\n env: Env,\n operationId: string,\n recipient: string,\n): Promise<boolean> {\n try {\n const result = await finishEmailAttempt(env, operationId, [recipient], 'cancelled');\n return result.recipients.some(\n (row) => row.recipient === recipient && row.state === 'cancelled',\n );\n } catch {\n return false;\n }\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, 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 proxy refuses `/email/send` for it, and the inbound router\n * 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, and the inbound router lowercases the recipient\n * before splitting it.\n */\nexport function isReservedEmailSlug(slug: string): boolean {\n return EMAIL_RESERVED_SLUGS.has(slug);\n}\n", "import {\n EMAIL_PROTOCOL_VERSION,\n EMAIL_RECEIPT_PATH,\n encodeEmailEnvelope,\n readEmailActions,\n signEmailReceipt,\n type EmailWireAction,\n type EmailWireEnvelope,\n} from '@void/platform/email-protocol';\n\nconst MAX_CONCURRENT_PER_PROJECT = 8;\nconst TENANT_DISPATCH_DEADLINE_MS = 20_000;\nconst TENANT_RESPONSE_DEADLINE_MS = 15_000;\nconst active = new Map<string, number>();\n\nexport async function dispatchBoundedEmailToTenant(\n stub: Pick<Fetcher, 'fetch'>,\n env: { EMAIL_SIGNING_SECRET: string },\n input: {\n projectId: string;\n deploymentId: string;\n envelope: EmailWireEnvelope;\n receiptId: string;\n },\n): Promise<{ actions: Array<EmailWireAction>; receiptId: string }> {\n if (!input.deploymentId || !input.projectId) {\n throw new Error('email deployment identity missing');\n }\n const receiptId = input.receiptId;\n if (!/^[a-f0-9-]{16,64}$/.test(receiptId)) {\n throw new Error('invalid email receipt ID');\n }\n const count = active.get(input.projectId) ?? 0;\n if (count >= MAX_CONCURRENT_PER_PROJECT) {\n throw new Error('email project concurrency exceeded');\n }\n active.set(input.projectId, count + 1);\n const deadline = Date.now() + TENANT_DISPATCH_DEADLINE_MS;\n const controller = new AbortController();\n let response: Response | undefined;\n try {\n const receipt = await signEmailReceipt(\n {\n version: EMAIL_PROTOCOL_VERSION,\n receiptId,\n projectId: input.projectId,\n deploymentId: input.deploymentId,\n recipient: input.envelope.to,\n expiresAt: Date.now() + 30_000,\n },\n env.EMAIL_SIGNING_SECRET,\n );\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new Error('email tenant request timeout');\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n response = await Promise.race([\n stub.fetch(`https://worker${EMAIL_RECEIPT_PATH}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/vnd.void.email-envelope; version=1',\n 'x-void-email-receipt': receipt,\n 'x-void-email-recipient': input.envelope.to,\n },\n body: encodeEmailEnvelope(input.envelope),\n signal: controller.signal,\n }),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('email tenant request timeout'));\n }, remaining);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n if (\n !response.ok ||\n response.headers.get('content-encoding') ||\n response.headers.get('content-type') !==\n `application/vnd.void.email-actions; version=${EMAIL_PROTOCOL_VERSION}` ||\n !response.body\n ) {\n throw new Error(`invalid email tenant response (${response.status})`);\n }\n const responseDeadline = Math.min(TENANT_RESPONSE_DEADLINE_MS, deadline - Date.now());\n if (responseDeadline <= 0) {\n throw new Error('email tenant request timeout');\n }\n const actions = await readEmailActions(response.body, responseDeadline);\n return { actions, receiptId };\n } finally {\n controller.abort();\n void response?.body?.cancel().catch(() => {});\n const remaining = (active.get(input.projectId) ?? 1) - 1;\n if (remaining === 0) {\n active.delete(input.projectId);\n } else {\n active.set(input.projectId, remaining);\n }\n }\n}\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", "/** 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", "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", "// 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 = \""\";\n break;\n case 39:\n escape = \"'\";\n break;\n case 38:\n escape = \"&\";\n break;\n case 60:\n escape = \"<\";\n break;\n case 62:\n escape = \">\";\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", "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"],
|
|
6
|
+
"mappings": "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",
|
|
7
|
+
"names": ["init_performance", "init_performance", "PerformanceMark", "init_performance", "init_performance", "init_performance", "init_performance", "init_performance", "raw", "normalized", "init_performance", "init_performance", "EmailMessage", "init_performance", "init_performance", "encoder", "decoder", "encoder", "action", "decoder", "init_performance", "encoder", "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", "Hono", "raw", "CONTROL_CHARS_RE", "isValidEmailSyntax", "raw", "EmailMessage", "encoder", "encoder", "decoder", "sign", "raw", "sha256", "timer"]
|
|
8
|
+
}
|