@void/platform 0.21.1 → 0.21.3
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/dist/runtime/api/README.md +1 -1
- package/dist/runtime/api/assets/admin/client.js +4 -4
- package/dist/runtime/api/assets/admin/style.css +1 -1
- package/dist/runtime/api/index.js +890 -443
- package/dist/runtime/api/index.js.map +4 -4
- package/dist/runtime/dispatch/README.md +1 -1
- package/dist/runtime/drizzle/0051_icy_psylocke.sql +12 -0
- package/dist/runtime/drizzle/compatibility.json +4 -0
- package/dist/runtime/drizzle/meta/_journal.json +7 -0
- package/dist/runtime/emailGateway/README.md +1 -1
- package/dist/runtime/manifest.json +22 -12
- package/dist/runtime/proxy/README.md +1 -1
- package/dist/runtime/proxy/index.js +110 -71
- package/dist/runtime/proxy/index.js.map +4 -4
- package/dist/runtime/tail/README.md +1 -1
- package/package.json +1 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../../../node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/_internal/utils.mjs", "../../../../../node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/node/internal/perf_hooks/performance.mjs", "../../../../../node_modules/.pnpm/@cloudflare+unenv-preset@2.16.1_unenv@2.0.0-rc.24_workerd@1.20260910.1/node_modules/@cloudflare/unenv-preset/dist/runtime/polyfill/performance.mjs", "../../email-protocol.mjs", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/compose.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/request/constants.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/buffer.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/body.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/url.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/request.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/html.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/context.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/constants.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/hono-base.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/utils.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/matcher.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/node.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/trie.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/smart-router/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/trie-router/node.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/trie-router/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/hono.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/middleware/cors/index.js", "../../../../../platform/packages/proxy/src/body.ts", "../../../../../platform/packages/proxy/src/ai.ts", "../../../../../platform/packages/proxy/src/capabilities.ts", "../../../../../platform/packages/proxy/src/dispatch.ts", "../../../../../platform/packages/proxy/src/resolve.ts", "../../../../../platform/packages/proxy/src/d1.ts", "../../../../../platform/packages/proxy/src/email
|
|
3
|
+
"sources": ["../../../../../node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/_internal/utils.mjs", "../../../../../node_modules/.pnpm/unenv@2.0.0-rc.24/node_modules/unenv/dist/runtime/node/internal/perf_hooks/performance.mjs", "../../../../../node_modules/.pnpm/@cloudflare+unenv-preset@2.16.1_unenv@2.0.0-rc.24_workerd@1.20260910.1/node_modules/@cloudflare/unenv-preset/dist/runtime/polyfill/performance.mjs", "../../email-protocol.mjs", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/compose.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/request/constants.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/buffer.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/body.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/url.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/request.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/html.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/context.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/utils/constants.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/hono-base.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/utils.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/matcher.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/node.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/trie.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/reg-exp-router/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/smart-router/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/trie-router/node.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/router/trie-router/router.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/hono.js", "../../../../../node_modules/.pnpm/hono@4.13.7/node_modules/hono/dist/middleware/cors/index.js", "../../../../../platform/packages/proxy/src/body.ts", "../../../../../platform/packages/proxy/src/ai.ts", "../../../../../platform/packages/proxy/src/capabilities.ts", "../../../../../platform/packages/proxy/src/dispatch.ts", "../../../../../platform/packages/proxy/src/resolve.ts", "../../../../../platform/packages/proxy/src/d1.ts", "../../../../../platform/packages/proxy/src/email.ts", "../../../../../platform/packages/proxy/src/email-admission.ts", "../../../../../platform/packages/proxy/src/email-lease.ts", "../../../../../platform/packages/proxy/src/email-provider-deadline.ts", "../../../../../platform/packages/proxy/src/human-stream.ts", "../../../../../platform/packages/proxy/src/kv.ts", "../../../../../platform/packages/proxy/src/platform-lifecycle.ts", "../../../../../platform/packages/proxy/src/r2.ts", "../../../../../platform/packages/proxy/src/request-body.ts", "../../../../../platform/packages/proxy/src/revalidate.ts", "../../../../../platform/packages/proxy/src/index.ts"],
|
|
4
4
|
"sourceRoot": "/home/runner/work/void/void/packages/platform/dist/runtime/proxy",
|
|
5
|
-
"sourcesContent": ["/* @__NO_SIDE_EFFECTS__ */\nexport function rawHeaders(headers) {\n\tconst rawHeaders = [];\n\tfor (const key in headers) {\n\t\tif (Array.isArray(headers[key])) {\n\t\t\tfor (const h of headers[key]) {\n\t\t\t\trawHeaders.push(key, h);\n\t\t\t}\n\t\t} else {\n\t\t\trawHeaders.push(key, headers[key]);\n\t\t}\n\t}\n\treturn rawHeaders;\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function mergeFns(...functions) {\n\treturn function(...args) {\n\t\tfor (const fn of functions) {\n\t\t\tfn(...args);\n\t\t}\n\t};\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function createNotImplementedError(name) {\n\treturn new Error(`[unenv] ${name} is not implemented yet!`);\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function notImplemented(name) {\n\tconst fn = () => {\n\t\tthrow createNotImplementedError(name);\n\t};\n\treturn Object.assign(fn, { __unenv__: true });\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function notImplementedAsync(name) {\n\tconst fn = notImplemented(name);\n\tfn.__promisify__ = () => notImplemented(name + \".__promisify__\");\n\tfn.native = fn;\n\treturn fn;\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function notImplementedClass(name) {\n\treturn class {\n\t\t__unenv__ = true;\n\t\tconstructor() {\n\t\t\tthrow new Error(`[unenv] ${name} is not implemented yet!`);\n\t\t}\n\t};\n}\n", "import { createNotImplementedError } from \"../../../_internal/utils.mjs\";\nconst _timeOrigin = globalThis.performance?.timeOrigin ?? Date.now();\nconst _performanceNow = globalThis.performance?.now ? globalThis.performance.now.bind(globalThis.performance) : () => Date.now() - _timeOrigin;\nconst nodeTiming = {\n\tname: \"node\",\n\tentryType: \"node\",\n\tstartTime: 0,\n\tduration: 0,\n\tnodeStart: 0,\n\tv8Start: 0,\n\tbootstrapComplete: 0,\n\tenvironment: 0,\n\tloopStart: 0,\n\tloopExit: 0,\n\tidleTime: 0,\n\tuvMetricsInfo: {\n\t\tloopCount: 0,\n\t\tevents: 0,\n\t\teventsWaiting: 0\n\t},\n\tdetail: undefined,\n\ttoJSON() {\n\t\treturn this;\n\t}\n};\n// PerformanceEntry\nexport class PerformanceEntry {\n\t__unenv__ = true;\n\tdetail;\n\tentryType = \"event\";\n\tname;\n\tstartTime;\n\tconstructor(name, options) {\n\t\tthis.name = name;\n\t\tthis.startTime = options?.startTime || _performanceNow();\n\t\tthis.detail = options?.detail;\n\t}\n\tget duration() {\n\t\treturn _performanceNow() - this.startTime;\n\t}\n\ttoJSON() {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tentryType: this.entryType,\n\t\t\tstartTime: this.startTime,\n\t\t\tduration: this.duration,\n\t\t\tdetail: this.detail\n\t\t};\n\t}\n}\n// PerformanceMark\nexport const PerformanceMark = class PerformanceMark extends PerformanceEntry {\n\tentryType = \"mark\";\n\tconstructor() {\n\t\t// @ts-ignore\n\t\tsuper(...arguments);\n\t}\n\tget duration() {\n\t\treturn 0;\n\t}\n};\n// PerformanceMark\nexport class PerformanceMeasure extends PerformanceEntry {\n\tentryType = \"measure\";\n}\n// PerformanceResourceTiming\nexport class PerformanceResourceTiming extends PerformanceEntry {\n\tentryType = \"resource\";\n\tserverTiming = [];\n\tconnectEnd = 0;\n\tconnectStart = 0;\n\tdecodedBodySize = 0;\n\tdomainLookupEnd = 0;\n\tdomainLookupStart = 0;\n\tencodedBodySize = 0;\n\tfetchStart = 0;\n\tinitiatorType = \"\";\n\tname = \"\";\n\tnextHopProtocol = \"\";\n\tredirectEnd = 0;\n\tredirectStart = 0;\n\trequestStart = 0;\n\tresponseEnd = 0;\n\tresponseStart = 0;\n\tsecureConnectionStart = 0;\n\tstartTime = 0;\n\ttransferSize = 0;\n\tworkerStart = 0;\n\tresponseStatus = 0;\n}\n// PerformanceObserverEntryList\nexport class PerformanceObserverEntryList {\n\t__unenv__ = true;\n\tgetEntries() {\n\t\treturn [];\n\t}\n\tgetEntriesByName(_name, _type) {\n\t\treturn [];\n\t}\n\tgetEntriesByType(type) {\n\t\treturn [];\n\t}\n}\n// Performance\nexport class Performance {\n\t__unenv__ = true;\n\ttimeOrigin = _timeOrigin;\n\teventCounts = new Map();\n\t_entries = [];\n\t_resourceTimingBufferSize = 0;\n\tnavigation = undefined;\n\ttiming = undefined;\n\ttimerify(_fn, _options) {\n\t\tthrow createNotImplementedError(\"Performance.timerify\");\n\t}\n\tget nodeTiming() {\n\t\treturn nodeTiming;\n\t}\n\teventLoopUtilization() {\n\t\treturn {};\n\t}\n\tmarkResourceTiming() {\n\t\t// TODO: create a new PerformanceResourceTiming entry\n\t\t// so that performance.getEntries, getEntriesByName, and getEntriesByType return it\n\t\t// see: https://nodejs.org/api/perf_hooks.html#performancemarkresourcetimingtiminginfo-requestedurl-initiatortype-global-cachemode-bodyinfo-responsestatus-deliverytype\n\t\treturn new PerformanceResourceTiming(\"\");\n\t}\n\tonresourcetimingbufferfull = null;\n\tnow() {\n\t\t// https://developer.mozilla.org/en-US/docs/Web/API/Performance/now\n\t\tif (this.timeOrigin === _timeOrigin) {\n\t\t\treturn _performanceNow();\n\t\t}\n\t\treturn Date.now() - this.timeOrigin;\n\t}\n\tclearMarks(markName) {\n\t\tthis._entries = markName ? this._entries.filter((e) => e.name !== markName) : this._entries.filter((e) => e.entryType !== \"mark\");\n\t}\n\tclearMeasures(measureName) {\n\t\tthis._entries = measureName ? this._entries.filter((e) => e.name !== measureName) : this._entries.filter((e) => e.entryType !== \"measure\");\n\t}\n\tclearResourceTimings() {\n\t\tthis._entries = this._entries.filter((e) => e.entryType !== \"resource\" || e.entryType !== \"navigation\");\n\t}\n\tgetEntries() {\n\t\treturn this._entries;\n\t}\n\tgetEntriesByName(name, type) {\n\t\treturn this._entries.filter((e) => e.name === name && (!type || e.entryType === type));\n\t}\n\tgetEntriesByType(type) {\n\t\treturn this._entries.filter((e) => e.entryType === type);\n\t}\n\tmark(name, options) {\n\t\t// @ts-expect-error constructor is not protected\n\t\tconst entry = new PerformanceMark(name, options);\n\t\tthis._entries.push(entry);\n\t\treturn entry;\n\t}\n\tmeasure(measureName, startOrMeasureOptions, endMark) {\n\t\tlet start;\n\t\tlet end;\n\t\tif (typeof startOrMeasureOptions === \"string\") {\n\t\t\tstart = this.getEntriesByName(startOrMeasureOptions, \"mark\")[0]?.startTime;\n\t\t\tend = this.getEntriesByName(endMark, \"mark\")[0]?.startTime;\n\t\t} else {\n\t\t\tstart = Number.parseFloat(startOrMeasureOptions?.start) || this.now();\n\t\t\tend = Number.parseFloat(startOrMeasureOptions?.end) || this.now();\n\t\t}\n\t\tconst entry = new PerformanceMeasure(measureName, {\n\t\t\tstartTime: start,\n\t\t\tdetail: {\n\t\t\t\tstart,\n\t\t\t\tend\n\t\t\t}\n\t\t});\n\t\tthis._entries.push(entry);\n\t\treturn entry;\n\t}\n\tsetResourceTimingBufferSize(maxSize) {\n\t\tthis._resourceTimingBufferSize = maxSize;\n\t}\n\taddEventListener(type, listener, options) {\n\t\tthrow createNotImplementedError(\"Performance.addEventListener\");\n\t}\n\tremoveEventListener(type, listener, options) {\n\t\tthrow createNotImplementedError(\"Performance.removeEventListener\");\n\t}\n\tdispatchEvent(event) {\n\t\tthrow createNotImplementedError(\"Performance.dispatchEvent\");\n\t}\n\ttoJSON() {\n\t\treturn this;\n\t}\n}\n// PerformanceObserver\nexport class PerformanceObserver {\n\t__unenv__ = true;\n\tstatic supportedEntryTypes = [];\n\t_callback = null;\n\tconstructor(callback) {\n\t\tthis._callback = callback;\n\t}\n\ttakeRecords() {\n\t\treturn [];\n\t}\n\tdisconnect() {\n\t\tthrow createNotImplementedError(\"PerformanceObserver.disconnect\");\n\t}\n\tobserve(options) {\n\t\tthrow createNotImplementedError(\"PerformanceObserver.observe\");\n\t}\n\tbind(fn) {\n\t\treturn fn;\n\t}\n\trunInAsyncScope(fn, thisArg, ...args) {\n\t\treturn fn.call(thisArg, ...args);\n\t}\n\tasyncId() {\n\t\treturn 0;\n\t}\n\ttriggerAsyncId() {\n\t\treturn 0;\n\t}\n\temitDestroy() {\n\t\treturn this;\n\t}\n}\n// workerd implements a subset of globalThis.performance (as of last check, only timeOrigin set to 0 + now() implemented)\n// We already use performance.now() from globalThis.performance, if provided (see top of this file)\n// If we detect this condition, we can just use polyfill instead.\nexport const performance = globalThis.performance && \"addEventListener\" in globalThis.performance ? globalThis.performance : new Performance();\n", "import {\n performance,\n Performance,\n PerformanceEntry,\n PerformanceMark,\n PerformanceMeasure,\n PerformanceObserver,\n PerformanceObserverEntryList,\n PerformanceResourceTiming\n} from \"node:perf_hooks\";\nif (!(\"__unenv__\" in performance)) {\n const proto = Performance.prototype;\n for (const key of Object.getOwnPropertyNames(proto)) {\n if (key !== \"constructor\" && !(key in performance)) {\n const desc = Object.getOwnPropertyDescriptor(proto, key);\n if (desc) {\n Object.defineProperty(performance, key, desc);\n }\n }\n }\n}\nglobalThis.performance = performance;\nglobalThis.Performance = Performance;\nglobalThis.PerformanceEntry = PerformanceEntry;\nglobalThis.PerformanceMark = PerformanceMark;\nglobalThis.PerformanceMeasure = PerformanceMeasure;\nglobalThis.PerformanceObserver = PerformanceObserver;\nglobalThis.PerformanceObserverEntryList = PerformanceObserverEntryList;\nglobalThis.PerformanceResourceTiming = PerformanceResourceTiming;\n", "//#region src/email-protocol.ts\n/** Worker-safe wire contract shared by the platform gateway and tenant entry. */\nconst EMAIL_PROTOCOL_VERSION = 1;\nconst EMAIL_RECEIPT_PATH = \"/__void/email/receipt/v1\";\nconst EMAIL_MAX_ACTIONS = 100;\nconst EMAIL_MAX_METADATA_BYTES = 8192;\nconst EMAIL_MAX_RESPONSE_BYTES = 8388608;\nconst EMAIL_MAX_REPLY_BYTES = 5242880;\nconst EMAIL_MAX_INBOUND_BYTES = 10485760;\nconst EMAIL_MAX_INBOUND_HEADERS = 1024;\nconst EMAIL_MAX_INBOUND_HEADER_BYTES = 131072;\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder(\"utf-8\", { fatal: true });\nfunction assertFlatJson(bytes, maxDepth, maxFields) {\n\tlet depth = 0;\n\tlet fields = 0;\n\tlet quoted = false;\n\tlet escaped = false;\n\tfor (const byte of bytes) if (quoted) {\n\t\tif (escaped) escaped = false;\n\t\telse if (byte === 92) escaped = true;\n\t\telse if (byte === 34) quoted = false;\n\t} else if (byte === 34) quoted = true;\n\telse if (byte === 123 || byte === 91) {\n\t\tif (++depth > maxDepth) throw new Error(\"email metadata too deep\");\n\t} else if (byte === 125 || byte === 93) {\n\t\tif (--depth < 0) throw new Error(\"invalid email metadata\");\n\t} else if (byte === 58 && ++fields > maxFields) throw new Error(\"too many email metadata fields\");\n\tif (quoted || depth !== 0) throw new Error(\"invalid email metadata\");\n}\nfunction encodeEmailEnvelope(envelope) {\n\tconst metadata = encoder.encode(JSON.stringify({\n\t\tfrom: envelope.from,\n\t\tto: envelope.to,\n\t\theaders: envelope.headers,\n\t\trawSize: envelope.rawSize,\n\t\t...envelope.viaDomain ? { viaDomain: envelope.viaDomain } : {}\n\t}));\n\tif (metadata.byteLength > 131072 || envelope.raw.byteLength > 10485760) throw new Error(\"email envelope too large\");\n\tconst bytes = new Uint8Array(4 + metadata.byteLength + envelope.raw.byteLength);\n\tnew DataView(bytes.buffer).setUint32(0, metadata.byteLength);\n\tbytes.set(metadata, 4);\n\tbytes.set(envelope.raw, 4 + metadata.byteLength);\n\treturn bytes;\n}\nasync function readEmailEnvelope(stream, deadlineMs = 15e3) {\n\tif (!stream) throw new Error(\"missing email envelope\");\n\tconst reader = stream.getReader();\n\tconst limit = 10616836;\n\tlet bytes = /* @__PURE__ */ new Uint8Array(1024);\n\tlet total = 0;\n\tconst deadline = Date.now() + deadlineMs;\n\ttry {\n\t\tfor (;;) {\n\t\t\tconst remaining = deadline - Date.now();\n\t\t\tif (remaining <= 0) throw new Error(\"email envelope timeout\");\n\t\t\tlet timer;\n\t\t\tconst chunk = await Promise.race([reader.read(), new Promise((_, reject) => {\n\t\t\t\ttimer = setTimeout(() => reject(/* @__PURE__ */ new Error(\"email envelope timeout\")), remaining);\n\t\t\t})]).finally(() => {\n\t\t\t\tif (timer !== void 0) clearTimeout(timer);\n\t\t\t});\n\t\t\tif (chunk.done) break;\n\t\t\tconst nextTotal = total + chunk.value.byteLength;\n\t\t\tif (nextTotal > limit) throw new Error(\"email envelope too large\");\n\t\t\tif (nextTotal > bytes.byteLength) {\n\t\t\t\tlet capacity = bytes.byteLength;\n\t\t\t\twhile (capacity < nextTotal) capacity = Math.min(limit, capacity * 2);\n\t\t\t\tconst grown = new Uint8Array(capacity);\n\t\t\t\tgrown.set(bytes.subarray(0, total));\n\t\t\t\tbytes = grown;\n\t\t\t}\n\t\t\tbytes.set(chunk.value, total);\n\t\t\ttotal = nextTotal;\n\t\t}\n\t} catch (error) {\n\t\treader.cancel().catch(() => {});\n\t\tthrow error;\n\t} finally {\n\t\ttry {\n\t\t\treader.releaseLock();\n\t\t} catch {}\n\t}\n\tif (total < 4) throw new Error(\"truncated email envelope\");\n\tconst metadataLength = new DataView(bytes.buffer).getUint32(0);\n\tif (metadataLength > 131072 || total < 4 + metadataLength) throw new Error(\"invalid email envelope\");\n\tconst metadataBytes = bytes.subarray(4, 4 + metadataLength);\n\tassertFlatJson(metadataBytes, 2, 1032);\n\tconst metadata = JSON.parse(decoder.decode(metadataBytes));\n\tif (!metadata || typeof metadata !== \"object\" || Array.isArray(metadata)) throw new Error(\"invalid email envelope\");\n\tconst value = metadata;\n\tconst raw = bytes.subarray(4 + metadataLength, total);\n\tif (raw.byteLength > 10485760 || typeof value.from !== \"string\" || value.from.length > 320 || typeof value.to !== \"string\" || value.to.length > 320 || typeof value.rawSize !== \"number\" || value.rawSize !== raw.byteLength || !value.headers || typeof value.headers !== \"object\" || Array.isArray(value.headers) || Object.keys(value.headers).length > 1024 || Object.values(value.headers).some((header) => typeof header !== \"string\") || value.viaDomain !== void 0 && (typeof value.viaDomain !== \"string\" || value.viaDomain.length > 253)) throw new Error(\"invalid email envelope\");\n\treturn {\n\t\tfrom: value.from,\n\t\tto: value.to,\n\t\theaders: value.headers,\n\t\traw,\n\t\trawSize: raw.byteLength,\n\t\t...value.viaDomain ? { viaDomain: value.viaDomain } : {}\n\t};\n}\nfunction base64url(bytes) {\n\tlet binary = \"\";\n\tfor (const byte of bytes) binary += String.fromCharCode(byte);\n\treturn btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replaceAll(\"=\", \"\");\n}\nfunction unbase64url(value) {\n\tif (!/^[A-Za-z0-9_-]+$/.test(value) || value.length > 1024) throw new Error(\"invalid receipt\");\n\tconst binary = atob(value.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\") + \"=\".repeat((4 - value.length % 4) % 4));\n\treturn Uint8Array.from(binary, (char) => char.charCodeAt(0));\n}\nasync function receiptKey(secret, usage) {\n\tif (!secret) throw new Error(\"Email signing key is not configured\");\n\treturn crypto.subtle.importKey(\"raw\", encoder.encode(secret), {\n\t\tname: \"HMAC\",\n\t\thash: \"SHA-256\"\n\t}, false, [usage]);\n}\nasync function signEmailReceipt(claims, signingSecret) {\n\tconst payload = encoder.encode(JSON.stringify(claims));\n\tconst signature = new Uint8Array(await crypto.subtle.sign(\"HMAC\", await receiptKey(signingSecret, \"sign\"), payload));\n\treturn `${base64url(payload)}.${base64url(signature)}`;\n}\nasync function verifyEmailReceipt(token, signingSecret, expected, now = Date.now()) {\n\ttry {\n\t\tif (token.length > 1536) return null;\n\t\tconst parts = token.split(\".\");\n\t\tif (parts.length !== 2) return null;\n\t\tconst payload = unbase64url(parts[0]);\n\t\tconst signature = unbase64url(parts[1]);\n\t\tif (payload.byteLength > 768 || signature.byteLength !== 32) return null;\n\t\tif (!await crypto.subtle.verify(\"HMAC\", await receiptKey(signingSecret, \"verify\"), Uint8Array.from(signature), Uint8Array.from(payload))) return null;\n\t\tconst claims = JSON.parse(decoder.decode(payload));\n\t\tif (typeof claims !== \"object\" || claims === null) return null;\n\t\tconst value = claims;\n\t\tif (value.version !== 1 || typeof value.receiptId !== \"string\" || !/^[a-f0-9-]{16,64}$/.test(value.receiptId) || value.projectId !== expected.projectId || value.deploymentId !== expected.deploymentId || value.recipient !== expected.recipient || typeof value.expiresAt !== \"number\" || !Number.isSafeInteger(value.expiresAt) || value.expiresAt < now || value.expiresAt > now + 6e4) return null;\n\t\treturn value;\n\t} catch {\n\t\treturn null;\n\t}\n}\nfunction frame(kind, payload) {\n\tconst bytes = new Uint8Array(5 + payload.byteLength);\n\tnew DataView(bytes.buffer).setUint32(0, payload.byteLength);\n\tbytes[4] = kind;\n\tbytes.set(payload, 5);\n\treturn bytes;\n}\nfunction encodeEmailActionMetadata(action) {\n\treturn encoder.encode(JSON.stringify(action.type === \"reply\" ? {\n\t\ttype: action.type,\n\t\tfrom: action.from,\n\t\tto: action.to\n\t} : action));\n}\nfunction emailActionWireSizeFromMetadata(action, metadata) {\n\treturn 5 + metadata.byteLength + (action.type === \"reply\" ? 5 + action.raw.byteLength : 0);\n}\nfunction encodeEmailActions(actions) {\n\tif (actions.length > 100) throw new Error(\"too many email actions\");\n\tlet index = 0;\n\tlet pending = null;\n\tlet total = 0;\n\treturn new ReadableStream({ pull(controller) {\n\t\tif (pending) {\n\t\t\tcontroller.enqueue(pending);\n\t\t\tpending = null;\n\t\t\treturn;\n\t\t}\n\t\tif (index === actions.length) {\n\t\t\tcontroller.enqueue(frame(0, /* @__PURE__ */ new Uint8Array()));\n\t\t\tcontroller.close();\n\t\t\treturn;\n\t\t}\n\t\tconst action = actions[index++];\n\t\tconst metadata = encodeEmailActionMetadata(action);\n\t\tif (metadata.byteLength > 8192) throw new Error(\"email action metadata too large\");\n\t\tif (action.type === \"reply\") {\n\t\t\tif (action.raw.byteLength > 5242880) throw new Error(\"email reply too large\");\n\t\t\tpending = frame(2, action.raw);\n\t\t}\n\t\ttotal += emailActionWireSizeFromMetadata(action, metadata);\n\t\tif (total + 5 > 8388608) throw new Error(\"email actions too large\");\n\t\tcontroller.enqueue(frame(1, metadata));\n\t} });\n}\n/** Read each frame with fixed ceilings before parsing metadata or allocating a reply. */\nasync function readEmailActions(stream, deadlineMs = 15e3) {\n\tconst reader = stream.getReader();\n\tconst actions = [];\n\tlet stash = /* @__PURE__ */ new Uint8Array(0);\n\tlet total = 0;\n\tconst deadline = Date.now() + deadlineMs;\n\tasync function readChunk() {\n\t\tconst remaining = deadline - Date.now();\n\t\tif (remaining <= 0) throw new Error(\"email response timeout\");\n\t\tlet timer;\n\t\treturn Promise.race([reader.read(), new Promise((_, reject) => {\n\t\t\ttimer = setTimeout(() => reject(/* @__PURE__ */ new Error(\"email response timeout\")), remaining);\n\t\t})]).finally(() => {\n\t\t\tif (timer !== void 0) clearTimeout(timer);\n\t\t});\n\t}\n\tasync function exact(length) {\n\t\tconst result = new Uint8Array(length);\n\t\tlet offset = 0;\n\t\twhile (offset < length) {\n\t\t\tif (stash.byteLength === 0) {\n\t\t\t\tconst chunk = await readChunk();\n\t\t\t\tif (chunk.done) throw new Error(\"truncated email response\");\n\t\t\t\ttotal += chunk.value.byteLength;\n\t\t\t\tif (total > 8388608) throw new Error(\"email response too large\");\n\t\t\t\tstash = chunk.value;\n\t\t\t}\n\t\t\tconst used = Math.min(stash.byteLength, length - offset);\n\t\t\tresult.set(stash.subarray(0, used), offset);\n\t\t\tstash = stash.subarray(used);\n\t\t\toffset += used;\n\t\t}\n\t\treturn result;\n\t}\n\ttry {\n\t\tfor (;;) {\n\t\t\tconst head = await exact(5);\n\t\t\tconst length = new DataView(head.buffer).getUint32(0);\n\t\t\tconst kind = head[4];\n\t\t\tif (kind === 0) {\n\t\t\t\tif (length !== 0 || stash.byteLength !== 0) throw new Error(\"invalid email response tail\");\n\t\t\t\tif (!(await readChunk()).done) throw new Error(\"invalid email response tail\");\n\t\t\t\tif (actions.some((action) => action.type === \"reject\") && actions.length !== 1) throw new Error(\"email reject cannot accompany delivery actions\");\n\t\t\t\treturn actions;\n\t\t\t}\n\t\t\tif (kind !== 1 || length > 8192 || actions.length >= 100) throw new Error(\"invalid email action frame\");\n\t\t\tconst metadataBytes = await exact(length);\n\t\t\tassertFlatJson(metadataBytes, 2, 40);\n\t\t\tconst value = JSON.parse(decoder.decode(metadataBytes));\n\t\t\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"invalid email action\");\n\t\t\tconst action = value;\n\t\t\tif (action.type === \"reply\") {\n\t\t\t\tif (typeof action.from !== \"string\" || typeof action.to !== \"string\" || Object.keys(action).length !== 3) throw new Error(\"invalid email reply\");\n\t\t\t\tconst rawHead = await exact(5);\n\t\t\t\tconst rawLength = new DataView(rawHead.buffer).getUint32(0);\n\t\t\t\tif (rawHead[4] !== 2 || rawLength > 5242880) throw new Error(\"invalid email reply frame\");\n\t\t\t\tactions.push({\n\t\t\t\t\ttype: \"reply\",\n\t\t\t\t\tfrom: action.from,\n\t\t\t\t\tto: action.to,\n\t\t\t\t\traw: await exact(rawLength)\n\t\t\t\t});\n\t\t\t} else if (action.type === \"forward\") {\n\t\t\t\tif (typeof action.to !== \"string\" || Object.keys(action).length > 3 || action.headers !== void 0 && (typeof action.headers !== \"object\" || action.headers === null || Array.isArray(action.headers))) throw new Error(\"invalid email forward\");\n\t\t\t\tconst headers = action.headers;\n\t\t\t\tif (headers && (Object.keys(headers).length > 32 || Object.values(headers).some((v) => typeof v !== \"string\"))) throw new Error(\"invalid email headers\");\n\t\t\t\tactions.push({\n\t\t\t\t\ttype: \"forward\",\n\t\t\t\t\tto: action.to,\n\t\t\t\t\t...headers ? { headers } : {}\n\t\t\t\t});\n\t\t\t} else if (action.type === \"reject\") {\n\t\t\t\tif (typeof action.reason !== \"string\" || Object.keys(action).length !== 2) throw new Error(\"invalid email reject\");\n\t\t\t\tactions.push({\n\t\t\t\t\ttype: \"reject\",\n\t\t\t\t\treason: action.reason\n\t\t\t\t});\n\t\t\t} else throw new Error(\"unknown email action\");\n\t\t}\n\t} catch (error) {\n\t\treader.cancel().catch(() => {});\n\t\tthrow error;\n\t} finally {\n\t\ttry {\n\t\t\treader.releaseLock();\n\t\t} catch {}\n\t}\n}\n//#endregion\nexport { EMAIL_MAX_ACTIONS, EMAIL_MAX_INBOUND_BYTES, EMAIL_MAX_INBOUND_HEADERS, EMAIL_MAX_INBOUND_HEADER_BYTES, EMAIL_MAX_METADATA_BYTES, EMAIL_MAX_REPLY_BYTES, EMAIL_MAX_RESPONSE_BYTES, EMAIL_PROTOCOL_VERSION, EMAIL_RECEIPT_PATH, encodeEmailActions, encodeEmailEnvelope, readEmailActions, readEmailEnvelope, signEmailReceipt, verifyEmailReceipt };\n", "// src/compose.ts\nvar compose = (middleware, onError, onNotFound) => {\n return (context, next) => {\n let index = -1;\n return dispatch(0);\n async function dispatch(i) {\n if (i <= index) {\n throw new Error(\"next() called multiple times\");\n }\n index = i;\n let res;\n let isError = false;\n let handler;\n if (middleware[i]) {\n handler = middleware[i][0][0];\n context.req.routeIndex = i;\n } else {\n handler = i === middleware.length && next || void 0;\n }\n if (handler) {\n try {\n res = await handler(context, () => dispatch(i + 1));\n } catch (err) {\n if (err instanceof Error && onError) {\n context.error = err;\n res = await onError(err, context);\n isError = true;\n } else {\n throw err;\n }\n }\n } else {\n if (context.finalized === false && onNotFound) {\n res = await onNotFound(context);\n }\n }\n if (res && (context.finalized === false || isError)) {\n context.res = res;\n }\n return context;\n }\n };\n};\nexport {\n compose\n};\n", "// src/request/constants.ts\nvar GET_MATCH_RESULT = /* @__PURE__ */ Symbol();\nexport {\n GET_MATCH_RESULT\n};\n", "// src/utils/buffer.ts\nimport { sha256 } from \"./crypto.js\";\nvar equal = (a, b) => {\n if (a === b) {\n return true;\n }\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n const va = new DataView(a);\n const vb = new DataView(b);\n let i = va.byteLength;\n while (i--) {\n if (va.getUint8(i) !== vb.getUint8(i)) {\n return false;\n }\n }\n return true;\n};\nvar constantTimeEqualString = (a, b) => {\n const aLen = a.length;\n const bLen = b.length;\n const maxLen = Math.max(aLen, bLen);\n let out = aLen ^ bLen;\n for (let i = 0; i < maxLen; i++) {\n const aChar = i < aLen ? a.charCodeAt(i) : 0;\n const bChar = i < bLen ? b.charCodeAt(i) : 0;\n out |= aChar ^ bChar;\n }\n return out === 0;\n};\nvar timingSafeEqualString = async (a, b, hashFunction) => {\n if (!hashFunction) {\n hashFunction = sha256;\n }\n const [sa, sb] = await Promise.all([hashFunction(a), hashFunction(b)]);\n if (sa == null || sb == null || typeof sa !== \"string\" || typeof sb !== \"string\") {\n return false;\n }\n const hashEqual = constantTimeEqualString(sa, sb);\n const originalEqual = constantTimeEqualString(a, b);\n return hashEqual && originalEqual;\n};\nvar timingSafeEqual = async (a, b, hashFunction) => {\n if (typeof a === \"string\" && typeof b === \"string\") {\n return timingSafeEqualString(a, b, hashFunction);\n }\n if (!hashFunction) {\n hashFunction = sha256;\n }\n const [sa, sb] = await Promise.all([hashFunction(a), hashFunction(b)]);\n if (!sa || !sb || typeof sa !== \"string\" || typeof sb !== \"string\") {\n return false;\n }\n return timingSafeEqualString(sa, sb);\n};\nvar bufferToString = (buffer) => {\n if (buffer instanceof ArrayBuffer) {\n const enc = new TextDecoder(\"utf-8\");\n return enc.decode(buffer);\n }\n return buffer;\n};\nvar bufferToFormData = (arrayBuffer, contentType) => {\n const response = new Response(arrayBuffer, {\n headers: {\n // Normalize the media type (case-insensitive) while keeping parameters like the boundary\n \"Content-Type\": contentType.replace(/^[^;]+/, (mediaType) => mediaType.toLowerCase())\n }\n });\n return response.formData();\n};\nexport {\n bufferToFormData,\n bufferToString,\n equal,\n timingSafeEqual\n};\n", "// src/utils/body.ts\nimport { bufferToFormData } from \"./buffer.js\";\nvar MAX_NESTING_DEPTH = 32;\nvar MAX_NESTED_OBJECTS = 1e4;\nvar isRawRequest = (request) => \"headers\" in request;\nvar parseBody = async (request, options = /* @__PURE__ */ Object.create(null)) => {\n const { all = false, dot = false } = options;\n const headers = isRawRequest(request) ? request.headers : request.raw.headers;\n const contentType = headers.get(\"Content-Type\");\n const mediaType = contentType?.split(\";\")[0].trim().toLowerCase();\n if (mediaType === \"multipart/form-data\" || mediaType === \"application/x-www-form-urlencoded\") {\n return parseFormData(request, { all, dot });\n }\n return {};\n};\nasync function parseFormData(request, options) {\n if (!isRawRequest(request) && request.bodyCache.formData) {\n return convertFormDataToBodyData(\n await request.bodyCache.formData,\n options\n );\n }\n const headers = isRawRequest(request) ? request.headers : request.raw.headers;\n const arrayBuffer = await request.arrayBuffer();\n const formDataPromise = bufferToFormData(arrayBuffer, headers.get(\"Content-Type\") || \"\");\n if (!isRawRequest(request)) {\n request.bodyCache.formData = formDataPromise;\n }\n const formData = await formDataPromise;\n if (formData) {\n return convertFormDataToBodyData(formData, options);\n }\n return {};\n}\nfunction convertFormDataToBodyData(formData, options) {\n const form = /* @__PURE__ */ Object.create(null);\n const nestingState = { count: 0 };\n formData.forEach((value, key) => {\n const shouldParseAllValues = options.all || key.endsWith(\"[]\");\n if (!shouldParseAllValues) {\n form[key] = value;\n } else {\n handleParsingAllValues(form, key, value);\n }\n });\n if (options.dot) {\n Object.entries(form).forEach(([key, value]) => {\n const shouldParseDotValues = key.includes(\".\");\n if (shouldParseDotValues) {\n handleParsingNestedValues(form, key, value, nestingState);\n delete form[key];\n }\n });\n }\n return form;\n}\nvar handleParsingAllValues = (form, key, value) => {\n if (form[key] !== void 0) {\n if (Array.isArray(form[key])) {\n ;\n form[key].push(value);\n } else {\n form[key] = [form[key], value];\n }\n } else {\n if (!key.endsWith(\"[]\")) {\n form[key] = value;\n } else {\n form[key] = [value];\n }\n }\n};\nvar handleParsingNestedValues = (form, key, value, state) => {\n if (/(?:^|\\.)__proto__\\./.test(key)) {\n return;\n }\n let nestedForm = form;\n const keys = key.split(\".\", MAX_NESTING_DEPTH + 2);\n if (keys.length > MAX_NESTING_DEPTH + 1) {\n throwNestingLimitExceeded();\n }\n keys.forEach((key2, index) => {\n if (index === keys.length - 1) {\n nestedForm[key2] = value;\n } else {\n if (!nestedForm[key2] || typeof nestedForm[key2] !== \"object\" || Array.isArray(nestedForm[key2]) || nestedForm[key2] instanceof File) {\n if (state.count++ >= MAX_NESTED_OBJECTS) {\n throwNestingLimitExceeded();\n }\n nestedForm[key2] = /* @__PURE__ */ Object.create(null);\n }\n nestedForm = nestedForm[key2];\n }\n });\n};\nvar throwNestingLimitExceeded = () => {\n throw new Error(\"Nesting limit exceeded\");\n};\nexport {\n parseBody\n};\n", "// src/utils/url.ts\nvar splitPath = (path) => {\n const paths = path.split(\"/\");\n if (paths[0] === \"\") {\n paths.shift();\n }\n return paths;\n};\nvar splitRoutingPath = (routePath) => {\n const { groups, path } = extractGroupsFromPath(routePath);\n const paths = splitPath(path);\n return replaceGroupMarks(paths, groups);\n};\nvar extractGroupsFromPath = (path) => {\n const groups = [];\n path = path.replace(/\\{[^}]+\\}/g, (match, index) => {\n const mark = `@${index}`;\n groups.push([mark, match]);\n return mark;\n });\n return { groups, path };\n};\nvar replaceGroupMarks = (paths, groups) => {\n for (let i = groups.length - 1; i >= 0; i--) {\n const [mark] = groups[i];\n for (let j = paths.length - 1; j >= 0; j--) {\n if (paths[j].includes(mark)) {\n paths[j] = paths[j].replace(mark, groups[i][1]);\n break;\n }\n }\n }\n return paths;\n};\nvar patternCache = {};\nvar getPattern = (label, next) => {\n if (label === \"*\") {\n return \"*\";\n }\n const match = label.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n if (match) {\n const cacheKey = `${label}#${next}`;\n if (!patternCache[cacheKey]) {\n if (match[2]) {\n patternCache[cacheKey] = next && next[0] !== \":\" && next[0] !== \"*\" ? [cacheKey, match[1], new RegExp(`^${match[2]}(?=/${next})`)] : [label, match[1], new RegExp(`^${match[2]}$`)];\n } else {\n patternCache[cacheKey] = [label, match[1], true];\n }\n }\n return patternCache[cacheKey];\n }\n return null;\n};\nvar tryDecode = (str, decoder) => {\n try {\n return decoder(str);\n } catch {\n return str.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match) => {\n try {\n return decoder(match);\n } catch {\n return match;\n }\n });\n }\n};\nvar tryDecodeURI = (str) => tryDecode(str, decodeURI);\nvar getPath = (request) => {\n const url = request.url;\n const start = url.indexOf(\"/\", url.indexOf(\":\") + 4);\n let i = start;\n for (; i < url.length; i++) {\n const charCode = url.charCodeAt(i);\n if (charCode === 37) {\n const queryIndex = url.indexOf(\"?\", i);\n const hashIndex = url.indexOf(\"#\", i);\n const end = queryIndex === -1 ? hashIndex === -1 ? void 0 : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex);\n const path = url.slice(start, end);\n return tryDecodeURI(path.includes(\"%25\") ? path.replace(/%25/g, \"%2525\") : path);\n } else if (charCode === 63 || charCode === 35) {\n break;\n }\n }\n return url.slice(start, i);\n};\nvar getQueryStrings = (url) => {\n const queryIndex = url.indexOf(\"?\", 8);\n if (queryIndex === -1) {\n return \"\";\n }\n const hashIndex = url.indexOf(\"#\", 8);\n return hashIndex === -1 ? url.slice(queryIndex) : queryIndex < hashIndex ? url.slice(queryIndex, hashIndex) : \"\";\n};\nvar getPathNoStrict = (request) => {\n const result = getPath(request);\n return result.length > 1 && result.at(-1) === \"/\" ? result.slice(0, -1) : result;\n};\nvar mergePath = (base, sub, ...rest) => {\n if (rest.length) {\n sub = mergePath(sub, ...rest);\n }\n return `${base?.[0] === \"/\" ? \"\" : \"/\"}${base}${sub === \"/\" ? \"\" : `${base?.at(-1) === \"/\" ? \"\" : \"/\"}${sub?.[0] === \"/\" ? sub.slice(1) : sub}`}`;\n};\nvar checkOptionalParameter = (path) => {\n if (path.charCodeAt(path.length - 1) !== 63 || !path.includes(\":\")) {\n return null;\n }\n const segments = path.split(\"/\");\n const results = [];\n let basePath = \"\";\n segments.forEach((segment) => {\n if (segment !== \"\" && !/\\:/.test(segment)) {\n basePath += \"/\" + segment;\n } else if (/\\:/.test(segment)) {\n if (segment.charCodeAt(segment.length - 1) === 63) {\n if (results.length === 0 && basePath === \"\") {\n results.push(\"/\");\n } else {\n results.push(basePath);\n }\n const optionalSegment = segment.slice(0, -1);\n basePath += \"/\" + optionalSegment;\n results.push(basePath);\n } else {\n basePath += \"/\" + segment;\n }\n }\n });\n return results.filter((v, i, a) => a.indexOf(v) === i);\n};\nvar tryDecodeURIComponent = (str) => str.indexOf(\"%\") !== -1 ? tryDecode(str, decodeURIComponent_) : str;\nvar _decodeURI = (value) => {\n if (value.indexOf(\"+\") !== -1) {\n value = value.replace(/\\+/g, \" \");\n }\n return tryDecodeURIComponent(value);\n};\nvar _getQueryParam = (url, key, multiple) => {\n const hashIndex = url.indexOf(\"#\", 8);\n if (hashIndex !== -1) {\n url = url.slice(0, hashIndex);\n }\n let encoded;\n if (!multiple && key && key.indexOf(\"%\") === -1 && key.indexOf(\"+\") === -1) {\n let keyIndex2 = url.indexOf(\"?\", 8);\n if (keyIndex2 === -1) {\n return void 0;\n }\n if (!url.startsWith(key, keyIndex2 + 1)) {\n keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1);\n }\n while (keyIndex2 !== -1) {\n const trailingKeyCode = url.charCodeAt(keyIndex2 + key.length + 1);\n if (trailingKeyCode === 61) {\n const valueIndex = keyIndex2 + key.length + 2;\n const endIndex = url.indexOf(\"&\", valueIndex);\n return _decodeURI(url.slice(valueIndex, endIndex === -1 ? void 0 : endIndex));\n } else if (trailingKeyCode == 38 || isNaN(trailingKeyCode)) {\n return \"\";\n }\n keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1);\n }\n encoded = /[%+]/.test(url);\n if (!encoded) {\n return void 0;\n }\n }\n const results = /* @__PURE__ */ Object.create(null);\n encoded ??= /[%+]/.test(url);\n let keyIndex = url.indexOf(\"?\", 8);\n while (keyIndex !== -1) {\n const nextKeyIndex = url.indexOf(\"&\", keyIndex + 1);\n let valueIndex = url.indexOf(\"=\", keyIndex);\n if (valueIndex > nextKeyIndex && nextKeyIndex !== -1) {\n valueIndex = -1;\n }\n let name = url.slice(\n keyIndex + 1,\n valueIndex === -1 ? nextKeyIndex === -1 ? void 0 : nextKeyIndex : valueIndex\n );\n if (encoded) {\n name = _decodeURI(name);\n }\n keyIndex = nextKeyIndex;\n if (name === \"\") {\n continue;\n }\n let value;\n if (valueIndex === -1) {\n value = \"\";\n } else {\n value = url.slice(valueIndex + 1, nextKeyIndex === -1 ? void 0 : nextKeyIndex);\n if (encoded) {\n value = _decodeURI(value);\n }\n }\n if (multiple) {\n if (!(results[name] && Array.isArray(results[name]))) {\n results[name] = [];\n }\n ;\n results[name].push(value);\n } else {\n results[name] ??= value;\n }\n }\n return key ? results[key] : results;\n};\nvar getQueryParam = _getQueryParam;\nvar getQueryParams = (url, key) => {\n return _getQueryParam(url, key, true);\n};\nvar decodeURIComponent_ = decodeURIComponent;\nexport {\n checkOptionalParameter,\n decodeURIComponent_,\n getPath,\n getPathNoStrict,\n getPattern,\n getQueryParam,\n getQueryParams,\n getQueryStrings,\n mergePath,\n splitPath,\n splitRoutingPath,\n tryDecode,\n tryDecodeURI,\n tryDecodeURIComponent\n};\n", "// src/request.ts\nimport { HTTPException } from \"./http-exception.js\";\nimport { GET_MATCH_RESULT } from \"./request/constants.js\";\nimport { parseBody } from \"./utils/body.js\";\nimport { getQueryParam, getQueryParams, tryDecodeURIComponent } from \"./utils/url.js\";\nvar HonoRequest = class {\n /**\n * `.raw` can get the raw Request object.\n *\n * @see {@link https://hono.dev/docs/api/request#raw}\n *\n * @example\n * ```ts\n * // For Cloudflare Workers\n * app.post('/', async (c) => {\n * const metadata = c.req.raw.cf?.hostMetadata?\n * ...\n * })\n * ```\n */\n raw;\n #validatedData;\n // Short name of validatedData\n #matchResult;\n routeIndex = 0;\n /**\n * `.path` can get the pathname of the request.\n *\n * @see {@link https://hono.dev/docs/api/request#path}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const pathname = c.req.path // `/about/me`\n * })\n * ```\n */\n path;\n bodyCache = {};\n constructor(request, path = \"/\", matchResult = [[]]) {\n this.raw = request;\n this.path = path;\n this.#matchResult = matchResult;\n }\n param(key) {\n return key ? this.#getDecodedParam(key) : this.#getAllDecodedParams();\n }\n #getDecodedParam(key) {\n const paramKey = this.#matchResult[0][this.routeIndex]?.[1][key];\n const param = this.#getParamValue(paramKey);\n return param && tryDecodeURIComponent(param);\n }\n #getAllDecodedParams() {\n const decoded = {};\n const keys = Object.keys(this.#matchResult[0][this.routeIndex]?.[1] ?? {});\n for (const key of keys) {\n const value = this.#getParamValue(this.#matchResult[0][this.routeIndex][1][key]);\n if (value !== void 0) {\n decoded[key] = tryDecodeURIComponent(value);\n }\n }\n return decoded;\n }\n #getParamValue(paramKey) {\n return this.#matchResult[1] ? this.#matchResult[1][paramKey] : paramKey;\n }\n query(key) {\n return getQueryParam(this.url, key);\n }\n queries(key) {\n return getQueryParams(this.url, key);\n }\n header(name) {\n if (name) {\n return this.raw.headers.get(name) ?? void 0;\n }\n const headerData = /* @__PURE__ */ Object.create(null);\n this.raw.headers.forEach((value, key) => {\n headerData[key] = value;\n });\n return headerData;\n }\n async parseBody(options) {\n return parseBody(this, options);\n }\n #cachedBody = (key) => {\n const { bodyCache, raw } = this;\n const cachedBody = bodyCache[key];\n if (cachedBody) {\n return cachedBody;\n }\n for (const anyCachedKey in bodyCache) {\n return bodyCache[anyCachedKey].then((body) => {\n if (anyCachedKey === \"json\") {\n body = JSON.stringify(body);\n }\n return new Response(body)[key]();\n });\n }\n return bodyCache[key] = raw[key]();\n };\n /**\n * `.json()` can parse Request body of type `application/json`\n *\n * @see {@link https://hono.dev/docs/api/request#json}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.json()\n * })\n * ```\n */\n json() {\n return this.#cachedBody(\"text\").then((text) => JSON.parse(text));\n }\n /**\n * `.text()` can parse Request body of type `text/plain`\n *\n * @see {@link https://hono.dev/docs/api/request#text}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.text()\n * })\n * ```\n */\n text() {\n return this.#cachedBody(\"text\");\n }\n /**\n * `.arrayBuffer()` parse Request body as an `ArrayBuffer`\n *\n * @see {@link https://hono.dev/docs/api/request#arraybuffer}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.arrayBuffer()\n * })\n * ```\n */\n arrayBuffer() {\n return this.#cachedBody(\"arrayBuffer\");\n }\n /**\n * `.bytes()` parses the request body as a `Uint8Array`.\n *\n * @see {@link https://hono.dev/docs/api/request#bytes}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.bytes()\n * })\n * ```\n */\n bytes() {\n return this.#cachedBody(\"arrayBuffer\").then((buffer) => new Uint8Array(buffer));\n }\n /**\n * Parses the request body as a `Blob`.\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.blob();\n * });\n * ```\n * @see https://hono.dev/docs/api/request#blob\n */\n blob() {\n return this.#cachedBody(\"blob\");\n }\n /**\n * Parses the request body as `FormData`.\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.formData();\n * });\n * ```\n * @see https://hono.dev/docs/api/request#formdata\n */\n formData() {\n return this.#cachedBody(\"formData\");\n }\n /**\n * Adds validated data to the request.\n *\n * @param target - The target of the validation.\n * @param data - The validated data to add.\n */\n addValidatedData(target, data) {\n ;\n (this.#validatedData ??= {})[target] = data;\n }\n valid(target) {\n return this.#validatedData?.[target];\n }\n /**\n * `.url()` can get the request url strings.\n *\n * @see {@link https://hono.dev/docs/api/request#url}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const url = c.req.url // `http://localhost:8787/about/me`\n * ...\n * })\n * ```\n */\n get url() {\n return this.raw.url;\n }\n /**\n * `.method()` can get the method name of the request.\n *\n * @see {@link https://hono.dev/docs/api/request#method}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const method = c.req.method // `GET`\n * })\n * ```\n */\n get method() {\n return this.raw.method;\n }\n get [GET_MATCH_RESULT]() {\n return this.#matchResult;\n }\n /**\n * `.matchedRoutes()` can return a matched route in the handler\n *\n * @deprecated\n *\n * Use matchedRoutes helper defined in \"hono/route\" instead.\n *\n * @see {@link https://hono.dev/docs/api/request#matchedroutes}\n *\n * @example\n * ```ts\n * app.use('*', async function logger(c, next) {\n * await next()\n * c.req.matchedRoutes.forEach(({ handler, method, path }, i) => {\n * const name = handler.name || (handler.length < 2 ? '[handler]' : '[middleware]')\n * console.log(\n * method,\n * ' ',\n * path,\n * ' '.repeat(Math.max(10 - path.length, 0)),\n * name,\n * i === c.req.routeIndex ? '<- respond from here' : ''\n * )\n * })\n * })\n * ```\n */\n get matchedRoutes() {\n return this.#matchResult[0].map(([[, route]]) => route);\n }\n /**\n * `routePath()` can retrieve the path registered within the handler\n *\n * @deprecated\n *\n * Use routePath helper defined in \"hono/route\" instead.\n *\n * @see {@link https://hono.dev/docs/api/request#routepath}\n *\n * @example\n * ```ts\n * app.get('/posts/:id', (c) => {\n * return c.json({ path: c.req.routePath })\n * })\n * ```\n */\n get routePath() {\n return this.#matchResult[0].map(([[, route]]) => route)[this.routeIndex].path;\n }\n};\nvar cloneRawRequest = async (req) => {\n if (!req.raw.bodyUsed) {\n return req.raw.clone();\n }\n const cacheKey = Object.keys(req.bodyCache)[0];\n if (!cacheKey) {\n throw new HTTPException(500, {\n message: \"Cannot clone request: body was already consumed and not cached. Please use HonoRequest methods (e.g., req.json(), req.text()) instead of consuming req.raw directly.\"\n });\n }\n let body = await req[cacheKey]();\n const headers = req.header();\n if (cacheKey === \"json\") {\n body = JSON.stringify(body);\n delete headers[\"content-length\"];\n } else if (body instanceof FormData) {\n delete headers[\"content-type\"];\n delete headers[\"content-length\"];\n }\n const requestInit = {\n body,\n cache: req.raw.cache,\n credentials: req.raw.credentials,\n headers,\n integrity: req.raw.integrity,\n keepalive: req.raw.keepalive,\n method: req.method,\n mode: req.raw.mode,\n redirect: req.raw.redirect,\n referrer: req.raw.referrer,\n referrerPolicy: req.raw.referrerPolicy,\n signal: req.raw.signal\n };\n return new Request(req.url, requestInit);\n};\nexport {\n HonoRequest,\n cloneRawRequest\n};\n", "// src/utils/html.ts\nvar HtmlEscapedCallbackPhase = {\n Stringify: 1,\n BeforeStream: 2,\n Stream: 3\n};\nvar raw = (value, callbacks) => {\n const escapedString = new String(value);\n escapedString.isEscaped = true;\n escapedString.callbacks = callbacks;\n return escapedString;\n};\nvar escapeRe = /[&<>'\"]/;\nvar stringBufferToString = async (buffer, callbacks) => {\n let str = \"\";\n callbacks ||= [];\n const resolvedBuffer = await Promise.all(buffer);\n for (let i = resolvedBuffer.length - 1; ; i--) {\n str += resolvedBuffer[i];\n i--;\n if (i < 0) {\n break;\n }\n let r = resolvedBuffer[i];\n if (typeof r === \"object\") {\n callbacks.push(...r.callbacks || []);\n }\n const isEscaped = r.isEscaped;\n r = await (typeof r === \"object\" ? r.toString() : r);\n if (typeof r === \"object\") {\n callbacks.push(...r.callbacks || []);\n }\n if (r.isEscaped ?? isEscaped) {\n str += r;\n } else {\n const buf = [str];\n escapeToBuffer(r, buf);\n str = buf[0];\n }\n }\n return raw(str, callbacks);\n};\nvar escapeToBuffer = (str, buffer) => {\n const match = str.search(escapeRe);\n if (match === -1) {\n buffer[0] += str;\n return;\n }\n let escape;\n let index;\n let lastIndex = 0;\n for (index = match; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escape = \""\";\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/context.ts\nimport { HonoRequest } from \"./request.js\";\nimport { HtmlEscapedCallbackPhase, resolveCallback } from \"./utils/html.js\";\nvar TEXT_PLAIN = \"text/plain; charset=UTF-8\";\nvar setDefaultContentType = (contentType, headers) => {\n return {\n \"Content-Type\": contentType,\n ...headers\n };\n};\nvar createResponseInstance = (body, init) => new Response(body, init);\nvar Context = class {\n #rawRequest;\n #req;\n /**\n * `.env` can get bindings (environment variables, secrets, KV namespaces, D1 database, R2 bucket etc.) in Cloudflare Workers.\n *\n * @see {@link https://hono.dev/docs/api/context#env}\n *\n * @example\n * ```ts\n * // Environment object for Cloudflare Workers\n * app.get('*', async c => {\n * const counter = c.env.COUNTER\n * })\n * ```\n */\n env = {};\n #var;\n finalized = false;\n /**\n * `.error` can get the error object from the middleware if the Handler throws an error.\n *\n * @see {@link https://hono.dev/docs/api/context#error}\n *\n * @example\n * ```ts\n * app.use('*', async (c, next) => {\n * await next()\n * if (c.error) {\n * // do something...\n * }\n * })\n * ```\n */\n error;\n #status;\n #executionCtx;\n #res;\n #layout;\n #renderer;\n #notFoundHandler;\n #preparedHeaders;\n #matchResult;\n #path;\n /**\n * Creates an instance of the Context class.\n *\n * @param req - The Request object.\n * @param options - Optional configuration options for the context.\n */\n constructor(req, options) {\n this.#rawRequest = req;\n if (options) {\n this.#executionCtx = options.executionCtx;\n this.env = options.env;\n this.#notFoundHandler = options.notFoundHandler;\n this.#path = options.path;\n this.#matchResult = options.matchResult;\n }\n }\n /**\n * `.req` is the instance of {@link HonoRequest}.\n */\n get req() {\n this.#req ??= new HonoRequest(this.#rawRequest, this.#path, this.#matchResult);\n return this.#req;\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#event}\n * The FetchEvent associated with the current request.\n *\n * @throws Will throw an error if the context does not have a FetchEvent.\n */\n get event() {\n if (this.#executionCtx && \"respondWith\" in this.#executionCtx) {\n return this.#executionCtx;\n } else {\n throw Error(\"This context has no FetchEvent\");\n }\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#executionctx}\n * The ExecutionContext associated with the current request.\n *\n * @throws Will throw an error if the context does not have an ExecutionContext.\n */\n get executionCtx() {\n if (this.#executionCtx) {\n return this.#executionCtx;\n } else {\n throw Error(\"This context has no ExecutionContext\");\n }\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#res}\n * The Response object for the current request.\n */\n get res() {\n return this.#res ||= createResponseInstance(null, {\n headers: this.#preparedHeaders ??= new Headers()\n });\n }\n /**\n * Sets the Response object for the current request.\n *\n * @param _res - The Response object to set.\n */\n set res(_res) {\n if (this.#res && _res) {\n _res = createResponseInstance(_res.body, _res);\n for (const [k, v] of this.#res.headers.entries()) {\n if (k === \"content-type\") {\n continue;\n }\n if (k === \"set-cookie\") {\n const cookies = this.#res.headers.getSetCookie();\n _res.headers.delete(\"set-cookie\");\n for (const cookie of cookies) {\n _res.headers.append(\"set-cookie\", cookie);\n }\n } else {\n _res.headers.set(k, v);\n }\n }\n }\n this.#res = _res;\n this.finalized = true;\n }\n /**\n * `.render()` can create a response within a layout.\n *\n * @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n *\n * @example\n * ```ts\n * app.get('/', (c) => {\n * return c.render('Hello!')\n * })\n * ```\n */\n render = (...args) => {\n this.#renderer ??= (content) => this.html(content);\n return this.#renderer(...args);\n };\n /**\n * Sets the layout for the response.\n *\n * @param layout - The layout to set.\n * @returns The layout function.\n */\n setLayout = (layout) => this.#layout = layout;\n /**\n * Gets the current layout for the response.\n *\n * @returns The current layout function.\n */\n getLayout = () => this.#layout;\n /**\n * `.setRenderer()` can set the layout in the custom middleware.\n *\n * @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n *\n * @example\n * ```tsx\n * app.use('*', async (c, next) => {\n * c.setRenderer((content) => {\n * return c.html(\n * <html>\n * <body>\n * <p>{content}</p>\n * </body>\n * </html>\n * )\n * })\n * await next()\n * })\n * ```\n */\n setRenderer = (renderer) => {\n this.#renderer = renderer;\n };\n /**\n * `.header()` can set headers.\n *\n * @see {@link https://hono.dev/docs/api/context#header}\n *\n * @example\n * ```ts\n * app.get('/welcome', (c) => {\n * // Set headers\n * c.header('X-Message', 'Hello!')\n * c.header('Content-Type', 'text/plain')\n *\n * // Append multiple headers using the append option (e.g. Vary)\n * c.header('Vary', 'Accept-Encoding', { append: true })\n * c.header('Vary', 'User-Agent', { append: true })\n *\n * return c.body('Thank you for coming')\n * })\n * ```\n */\n header = (name, value, options) => {\n if (this.finalized) {\n this.#res = createResponseInstance(this.#res.body, this.#res);\n }\n const headers = this.#res ? this.#res.headers : this.#preparedHeaders ??= new Headers();\n if (value === void 0) {\n headers.delete(name);\n } else if (options?.append) {\n headers.append(name, value);\n } else {\n headers.set(name, value);\n }\n };\n status = (status) => {\n this.#status = status;\n };\n /**\n * `.set()` can set the value specified by the key.\n *\n * @see {@link https://hono.dev/docs/api/context#set-get}\n *\n * @example\n * ```ts\n * app.use('*', async (c, next) => {\n * c.set('message', 'Hono is hot!!')\n * await next()\n * })\n * ```\n */\n set = (key, value) => {\n this.#var ??= /* @__PURE__ */ new Map();\n this.#var.set(key, value);\n };\n /**\n * `.get()` can use the value specified by the key.\n *\n * @see {@link https://hono.dev/docs/api/context#set-get}\n *\n * @example\n * ```ts\n * app.get('/', (c) => {\n * const message = c.get('message')\n * return c.text(`The message is \"${message}\"`)\n * })\n * ```\n */\n get = (key) => {\n return this.#var ? this.#var.get(key) : void 0;\n };\n /**\n * `.var` can access the value of a variable.\n *\n * @see {@link https://hono.dev/docs/api/context#var}\n *\n * @example\n * ```ts\n * const result = c.var.client.oneMethod()\n * ```\n */\n // c.var.propName is a read-only\n get var() {\n if (!this.#var) {\n return {};\n }\n return Object.fromEntries(this.#var);\n }\n #newResponse(data, arg, headers) {\n let responseHeaders = this.#res ? new Headers(this.#res.headers) : this.#preparedHeaders;\n if (typeof arg === \"object\" && arg.headers) {\n responseHeaders ??= new Headers();\n for (const [key, value] of new Headers(arg.headers)) {\n if (key === \"set-cookie\") {\n responseHeaders.append(key, value);\n } else {\n responseHeaders.set(key, value);\n }\n }\n }\n if (headers) {\n if (!responseHeaders) {\n let count = 0;\n for (const k in headers) {\n if (++count > 1 || typeof headers[k] !== \"string\") {\n responseHeaders = new Headers();\n break;\n }\n }\n }\n if (responseHeaders) {\n for (const k in headers) {\n const v = headers[k];\n if (typeof v === \"string\") {\n responseHeaders.set(k, v);\n } else {\n responseHeaders.delete(k);\n for (const v2 of v) {\n responseHeaders.append(k, v2);\n }\n }\n }\n }\n }\n const status = typeof arg === \"number\" ? arg : arg?.status ?? this.#status;\n return createResponseInstance(data, {\n status,\n headers: responseHeaders ?? headers\n });\n }\n newResponse = (...args) => this.#newResponse(...args);\n /**\n * `.body()` can return the HTTP response.\n * You can set headers with `.header()` and set HTTP status code with `.status`.\n * This can also be set in `.text()`, `.json()` and so on.\n *\n * @see {@link https://hono.dev/docs/api/context#body}\n *\n * @example\n * ```ts\n * app.get('/welcome', (c) => {\n * // Set headers\n * c.header('X-Message', 'Hello!')\n * c.header('Content-Type', 'text/plain')\n * // Set HTTP status code\n * c.status(201)\n *\n * // Return the response body\n * return c.body('Thank you for coming')\n * })\n * ```\n */\n body = (data, arg, headers) => this.#newResponse(data, arg, headers);\n /**\n * `.text()` can render text as `Content-Type:text/plain`.\n *\n * @see {@link https://hono.dev/docs/api/context#text}\n *\n * @example\n * ```ts\n * app.get('/say', (c) => {\n * return c.text('Hello!')\n * })\n * ```\n */\n text = (text, arg, headers) => {\n return !this.#preparedHeaders && !this.#status && !arg && !headers && !this.finalized ? new Response(text) : this.#newResponse(\n text,\n arg,\n setDefaultContentType(TEXT_PLAIN, headers)\n );\n };\n /**\n * `.json()` can render JSON as `Content-Type:application/json`.\n *\n * @see {@link https://hono.dev/docs/api/context#json}\n *\n * @example\n * ```ts\n * app.get('/api', (c) => {\n * return c.json({ message: 'Hello!' })\n * })\n * ```\n */\n json = (object, arg, headers) => {\n return this.#newResponse(\n JSON.stringify(object),\n arg,\n setDefaultContentType(\"application/json\", headers)\n );\n };\n html = (html, arg, headers) => {\n const res = (html2) => this.#newResponse(html2, arg, setDefaultContentType(\"text/html; charset=UTF-8\", headers));\n return typeof html === \"object\" ? resolveCallback(html, HtmlEscapedCallbackPhase.Stringify, false, {}).then(res) : res(html);\n };\n /**\n * `.redirect()` can Redirect, default status code is 302.\n *\n * @see {@link https://hono.dev/docs/api/context#redirect}\n *\n * @example\n * ```ts\n * app.get('/redirect', (c) => {\n * return c.redirect('/')\n * })\n * app.get('/redirect-permanently', (c) => {\n * return c.redirect('/', 301)\n * })\n * ```\n */\n redirect = (location, status) => {\n const locationString = String(location);\n this.header(\n \"Location\",\n // Multibyes should be encoded\n // eslint-disable-next-line no-control-regex\n !/[^\\x00-\\xFF]/.test(locationString) ? locationString : encodeURI(locationString)\n );\n return this.newResponse(null, status ?? 302);\n };\n /**\n * `.notFound()` can return the Not Found Response.\n *\n * @see {@link https://hono.dev/docs/api/context#notfound}\n *\n * @example\n * ```ts\n * app.get('/notfound', (c) => {\n * return c.notFound()\n * })\n * ```\n */\n notFound = () => {\n this.#notFoundHandler ??= () => createResponseInstance();\n return this.#notFoundHandler(this);\n };\n};\nexport {\n Context,\n TEXT_PLAIN\n};\n", "// src/router.ts\nvar METHOD_NAME_ALL = \"ALL\";\nvar METHOD_NAME_ALL_LOWERCASE = \"all\";\nvar METHODS = [\"get\", \"post\", \"put\", \"delete\", \"options\", \"patch\", \"query\"];\nvar MESSAGE_MATCHER_IS_ALREADY_BUILT = \"Can not add a route since the matcher is already built.\";\nvar UnsupportedPathError = class extends Error {\n};\nexport {\n MESSAGE_MATCHER_IS_ALREADY_BUILT,\n METHODS,\n METHOD_NAME_ALL,\n METHOD_NAME_ALL_LOWERCASE,\n UnsupportedPathError\n};\n", "// src/utils/constants.ts\nvar COMPOSED_HANDLER = \"__COMPOSED_HANDLER\";\nexport {\n COMPOSED_HANDLER\n};\n", "// src/hono-base.ts\nimport { compose } from \"./compose.js\";\nimport { Context } from \"./context.js\";\nimport { METHODS, METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE } from \"./router.js\";\nimport { COMPOSED_HANDLER } from \"./utils/constants.js\";\nimport { getPath, getPathNoStrict, mergePath } from \"./utils/url.js\";\nvar notFoundHandler = (c) => {\n return c.text(\"404 Not Found\", 404);\n};\nvar errorHandler = (err, c) => {\n if (\"getResponse\" in err) {\n const res = err.getResponse();\n return c.newResponse(res.body, res);\n }\n console.error(err);\n return c.text(\"Internal Server Error\", 500);\n};\nvar Hono = class _Hono {\n get;\n post;\n put;\n delete;\n options;\n patch;\n query;\n all;\n on;\n use;\n /*\n This class is like an abstract class and does not have a router.\n To use it, inherit the class and implement router in the constructor.\n */\n router;\n getPath;\n // Cannot use `#` because it requires visibility at JavaScript runtime.\n _basePath = \"/\";\n #path = \"/\";\n routes = [];\n constructor(options = {}) {\n const allMethods = [...METHODS, METHOD_NAME_ALL_LOWERCASE];\n allMethods.forEach((method) => {\n this[method] = (args1, ...args) => {\n const methodName = method.toUpperCase();\n if (typeof args1 === \"string\") {\n this.#path = args1;\n } else {\n this.#addRoute(methodName, this.#path, args1);\n }\n args.forEach((handler) => {\n this.#addRoute(methodName, this.#path, handler);\n });\n return this;\n };\n });\n this.on = (method, path, ...handlers) => {\n for (const p of [path].flat()) {\n this.#path = p;\n for (const m of [method].flat()) {\n const methodName = m.toUpperCase();\n for (const handler of handlers) {\n this.#addRoute(methodName, this.#path, handler);\n }\n }\n }\n return this;\n };\n this.use = (arg1, ...handlers) => {\n if (typeof arg1 === \"string\") {\n this.#path = arg1;\n } else {\n this.#path = \"*\";\n handlers.unshift(arg1);\n }\n handlers.forEach((handler) => {\n this.#addRoute(METHOD_NAME_ALL, this.#path, handler);\n });\n return this;\n };\n const { strict, ...optionsWithoutStrict } = options;\n Object.assign(this, optionsWithoutStrict);\n this.getPath = strict ?? true ? options.getPath ?? getPath : getPathNoStrict;\n }\n #clone() {\n const clone = new _Hono({\n router: this.router,\n getPath: this.getPath\n });\n clone.errorHandler = this.errorHandler;\n clone.#notFoundHandler = this.#notFoundHandler;\n clone.routes = this.routes;\n return clone;\n }\n #notFoundHandler = notFoundHandler;\n // Cannot use `#` because it requires visibility at JavaScript runtime.\n errorHandler = errorHandler;\n /**\n * `.route()` allows grouping other Hono instance in routes.\n *\n * @see {@link https://hono.dev/docs/api/routing#grouping}\n *\n * @param {string} path - base Path\n * @param {Hono} app - other Hono instance\n * @returns {Hono} routed Hono instance\n *\n * @example\n * ```ts\n * const app = new Hono()\n * const app2 = new Hono()\n *\n * app2.get(\"/user\", (c) => c.text(\"user\"))\n * app.route(\"/api\", app2) // GET /api/user\n * ```\n */\n route(path, app) {\n const subApp = this.basePath(path);\n app.routes.map((r) => {\n let handler;\n if (app.errorHandler === errorHandler) {\n handler = r.handler;\n } else {\n handler = async (c, next) => (await compose([], app.errorHandler)(c, () => r.handler(c, next))).res;\n handler[COMPOSED_HANDLER] = r.handler;\n }\n subApp.#addRoute(r.method, r.path, handler, r.basePath);\n });\n return this;\n }\n /**\n * `.basePath()` allows base paths to be specified.\n *\n * @see {@link https://hono.dev/docs/api/routing#base-path}\n *\n * @param {string} path - base Path\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * const api = new Hono().basePath('/api')\n * ```\n */\n basePath(path) {\n const subApp = this.#clone();\n subApp._basePath = mergePath(this._basePath, path);\n return subApp;\n }\n /**\n * `.onError()` handles an error and returns a customized Response.\n *\n * @see {@link https://hono.dev/docs/api/hono#error-handling}\n *\n * @param {ErrorHandler} handler - request Handler for error\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * app.onError((err, c) => {\n * console.error(`${err}`)\n * return c.text('Custom Error Message', 500)\n * })\n * ```\n */\n onError = (handler) => {\n this.errorHandler = handler;\n return this;\n };\n /**\n * `.notFound()` allows you to customize a Not Found Response.\n *\n * @see {@link https://hono.dev/docs/api/hono#not-found}\n *\n * @param {NotFoundHandler} handler - request handler for not-found\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * app.notFound((c) => {\n * return c.text('Custom 404 Message', 404)\n * })\n * ```\n */\n notFound = (handler) => {\n this.#notFoundHandler = handler;\n return this;\n };\n /**\n * `.mount()` allows you to mount applications built with other frameworks into your Hono application.\n *\n * @see {@link https://hono.dev/docs/api/hono#mount}\n *\n * @param {string} path - base Path\n * @param {Function} applicationHandler - other Request Handler\n * @param {MountOptions} [options] - options of `.mount()`\n * @returns {Hono} mounted Hono instance\n *\n * @example\n * ```ts\n * import { Router as IttyRouter } from 'itty-router'\n * import { Hono } from 'hono'\n * // Create itty-router application\n * const ittyRouter = IttyRouter()\n * // GET /itty-router/hello\n * ittyRouter.get('/hello', () => new Response('Hello from itty-router'))\n *\n * const app = new Hono()\n * app.mount('/itty-router', ittyRouter.handle)\n * ```\n *\n * @example\n * ```ts\n * const app = new Hono()\n * // Send the request to another application without modification.\n * app.mount('/app', anotherApp, {\n * replaceRequest: (req) => req,\n * })\n * ```\n */\n mount(path, applicationHandler, options) {\n let replaceRequest;\n let optionHandler;\n if (options) {\n if (typeof options === \"function\") {\n optionHandler = options;\n } else {\n optionHandler = options.optionHandler;\n if (options.replaceRequest === false) {\n replaceRequest = (request) => request;\n } else {\n replaceRequest = options.replaceRequest;\n }\n }\n }\n const getOptions = optionHandler ? (c) => {\n const options2 = optionHandler(c);\n return Array.isArray(options2) ? options2 : [options2];\n } : (c) => {\n let executionContext = void 0;\n try {\n executionContext = c.executionCtx;\n } catch {\n }\n return [c.env, executionContext];\n };\n replaceRequest ||= (() => {\n const mergedPath = mergePath(this._basePath, path);\n const pathPrefixLength = mergedPath === \"/\" ? 0 : mergedPath.length;\n return (request) => {\n const url = new URL(request.url);\n url.pathname = this.getPath(request).slice(pathPrefixLength) || \"/\";\n return new Request(url, request);\n };\n })();\n const handler = async (c, next) => {\n const res = await applicationHandler(replaceRequest(c.req.raw), ...getOptions(c));\n if (res) {\n return res;\n }\n await next();\n };\n this.#addRoute(METHOD_NAME_ALL, mergePath(path, \"*\"), handler);\n return this;\n }\n #addRoute(method, path, handler, baseRoutePath) {\n path = mergePath(this._basePath, path);\n const r = {\n basePath: baseRoutePath !== void 0 ? mergePath(this._basePath, baseRoutePath) : this._basePath,\n path,\n method,\n handler\n };\n this.router.add(method, path, [handler, r]);\n this.routes.push(r);\n }\n #handleError(err, c) {\n if (err instanceof Error) {\n return this.errorHandler(err, c);\n }\n throw err;\n }\n #dispatch(request, executionCtx, env, method) {\n if (method === \"HEAD\") {\n return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, \"GET\")))();\n }\n const path = this.getPath(request, { env });\n const matchResult = this.router.match(method, path);\n const c = new Context(request, {\n path,\n matchResult,\n env,\n executionCtx,\n notFoundHandler: this.#notFoundHandler\n });\n if (matchResult[0].length === 1) {\n let res;\n try {\n res = matchResult[0][0][0][0](c, async () => {\n c.res = await this.#notFoundHandler(c);\n });\n } catch (err) {\n return this.#handleError(err, c);\n }\n return res instanceof Promise ? res.then(\n (resolved) => resolved || (c.finalized ? c.res : this.#notFoundHandler(c))\n ).catch((err) => this.#handleError(err, c)) : res ?? this.#notFoundHandler(c);\n }\n const composed = compose(matchResult[0], this.errorHandler, this.#notFoundHandler);\n return (async () => {\n try {\n const context = await composed(c);\n if (!context.finalized) {\n throw new Error(\n \"Context is not finalized. Did you forget to return a Response object or `await next()`?\"\n );\n }\n return context.res;\n } catch (err) {\n return this.#handleError(err, c);\n }\n })();\n }\n /**\n * `.fetch()` will be entry point of your app.\n *\n * @see {@link https://hono.dev/docs/api/hono#fetch}\n *\n * @param {Request} request - request Object of request\n * @param {Env} env - env Object\n * @param {ExecutionContext} executionCtx - context of execution\n * @returns {Response | Promise<Response>} response of request\n *\n */\n fetch = (request, ...rest) => {\n return this.#dispatch(request, rest[1], rest[0], request.method);\n };\n /**\n * `.request()` is a useful method for testing.\n * You can pass a URL or pathname to send a GET request.\n * app will return a Response object.\n * ```ts\n * test('GET /hello is ok', async () => {\n * const res = await app.request('/hello')\n * expect(res.status).toBe(200)\n * })\n * ```\n * @see https://hono.dev/docs/api/hono#request\n */\n request = (input, requestInit, Env, executionCtx) => {\n if (input instanceof Request) {\n return this.fetch(requestInit ? new Request(input, requestInit) : input, Env, executionCtx);\n }\n input = input.toString();\n return this.fetch(\n new Request(\n /^https?:\\/\\//.test(input) ? input : `http://localhost${mergePath(\"/\", input)}`,\n requestInit\n ),\n Env,\n executionCtx\n );\n };\n /**\n * `.fire()` automatically adds a global fetch event listener.\n * This can be useful for environments that adhere to the Service Worker API, such as non-ES module Cloudflare Workers.\n * @deprecated\n * Use `fire` from `hono/service-worker` instead.\n * ```ts\n * import { Hono } from 'hono'\n * import { fire } from 'hono/service-worker'\n *\n * const app = new Hono()\n * // ...\n * fire(app)\n * ```\n * @see https://hono.dev/docs/api/hono#fire\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API\n * @see https://developers.cloudflare.com/workers/reference/migrate-to-module-workers/\n */\n fire = () => {\n addEventListener(\"fetch\", (event) => {\n event.respondWith(this.#dispatch(event.request, event, void 0, event.request.method));\n });\n };\n};\nexport {\n Hono as HonoBase\n};\n", "// src/router/utils.ts\nvar createNullObject = () => /* @__PURE__ */ Object.create(null);\nexport {\n createNullObject\n};\n", "// src/router/reg-exp-router/matcher.ts\nimport { METHOD_NAME_ALL } from \"../../router.js\";\nvar emptyParam = [];\nfunction match(method, path) {\n const matchers = this.buildAllMatchers();\n const match2 = ((method2, path2) => {\n const matcher = matchers[method2] || matchers[METHOD_NAME_ALL];\n const staticMatch = matcher[2][path2];\n if (staticMatch) {\n return staticMatch;\n }\n const match3 = path2.match(matcher[0]);\n if (!match3) {\n return [[], emptyParam];\n }\n const index = match3.indexOf(\"\", 1);\n return [matcher[1][index], match3];\n });\n this.match = match2;\n return match2(method, path);\n}\nexport {\n emptyParam,\n match\n};\n", "// src/router/reg-exp-router/node.ts\nimport { createNullObject } from \"../utils.js\";\nvar LABEL_REG_EXP_STR = \"[^/]+\";\nvar ONLY_WILDCARD_REG_EXP_STR = \".*\";\nvar TAIL_WILDCARD_REG_EXP_STR = \"(?:|/.*)\";\nvar PATH_ERROR = /* @__PURE__ */ Symbol();\nvar regExpMetaChars = new Set(\".\\\\+*[^]$()\");\nfunction compareKey(a, b) {\n if (a.length === 1) {\n return b.length === 1 ? a < b ? -1 : 1 : -1;\n }\n if (b.length === 1) {\n return 1;\n }\n if (a === ONLY_WILDCARD_REG_EXP_STR || a === TAIL_WILDCARD_REG_EXP_STR) {\n return b === TAIL_WILDCARD_REG_EXP_STR ? -1 : 1;\n } else if (b === ONLY_WILDCARD_REG_EXP_STR || b === TAIL_WILDCARD_REG_EXP_STR) {\n return -1;\n }\n if (a === LABEL_REG_EXP_STR) {\n return 1;\n } else if (b === LABEL_REG_EXP_STR) {\n return -1;\n }\n return a.length === b.length ? a < b ? -1 : 1 : b.length - a.length;\n}\nvar Node = class _Node {\n // handler index of a dynamic path, or -1 for a static path terminal\n #index;\n #varIndex;\n #children = createNullObject();\n insert(tokens, index, paramMap, context, isStatic) {\n let node = this;\n for (let i = 0, len = tokens.length; i < len; i++) {\n const token = tokens[i];\n const pattern = token.length === 1 ? token === \"*\" ? i === len - 1 ? [\"\", \"\", ONLY_WILDCARD_REG_EXP_STR] : [\"\", \"\", LABEL_REG_EXP_STR] : null : token === \"/*\" ? [\"\", \"\", TAIL_WILDCARD_REG_EXP_STR] : token.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n let nextNode;\n if (pattern) {\n const name = pattern[1];\n let regexpStr = pattern[2] || LABEL_REG_EXP_STR;\n if (name && pattern[2]) {\n if (regexpStr === \".*\") {\n throw PATH_ERROR;\n }\n regexpStr = regexpStr.replace(/^\\((?!\\?:)(?=[^)]+\\)$)/, \"(?:\");\n if (/\\((?!\\?:)/.test(regexpStr)) {\n throw PATH_ERROR;\n }\n if (regexpStr.length === 1 && regExpMetaChars.has(regexpStr)) {\n throw PATH_ERROR;\n }\n }\n nextNode = node.#children[regexpStr];\n if (!nextNode) {\n if (regexpStr !== ONLY_WILDCARD_REG_EXP_STR && regexpStr !== TAIL_WILDCARD_REG_EXP_STR) {\n for (const k in node.#children) {\n if (\n // a single-char pattern coexists with single-char literals as a literal does\n (regexpStr.length > 1 || k.length > 1) && k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR\n ) {\n throw PATH_ERROR;\n }\n }\n }\n nextNode = node.#children[regexpStr] = new _Node();\n }\n if (name !== \"\") {\n nextNode.#varIndex ??= context.varIndex++;\n paramMap.push([name, nextNode.#varIndex]);\n }\n } else {\n nextNode = node.#children[token];\n if (!nextNode) {\n for (const k in node.#children) {\n if (k.length > 1 && k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR) {\n throw PATH_ERROR;\n }\n }\n nextNode = node.#children[token] = new _Node();\n }\n }\n node = nextNode;\n }\n if (node.#index !== void 0) {\n throw PATH_ERROR;\n }\n node.#index = isStatic ? -1 : index;\n }\n buildRegExpStr() {\n const childKeys = Object.keys(this.#children).sort(compareKey);\n const strList = childKeys.map((k) => {\n const c = this.#children[k];\n const childStr = c.buildRegExpStr();\n return childStr === \"\" ? \"\" : (typeof c.#varIndex === \"number\" ? `(${k})@${c.#varIndex}` : regExpMetaChars.has(k) ? `\\\\${k}` : k) + childStr;\n }).filter(Boolean);\n if (typeof this.#index === \"number\" && this.#index !== -1) {\n strList.unshift(`#${this.#index}`);\n }\n if (strList.length === 0) {\n return \"\";\n }\n if (strList.length === 1) {\n return strList[0];\n }\n return \"(?:\" + strList.join(\"|\") + \")\";\n }\n};\nexport {\n LABEL_REG_EXP_STR,\n Node,\n ONLY_WILDCARD_REG_EXP_STR,\n PATH_ERROR,\n TAIL_WILDCARD_REG_EXP_STR\n};\n", "// src/router/reg-exp-router/trie.ts\nimport { createNullObject } from \"../utils.js\";\nimport { Node } from \"./node.js\";\nvar Trie = class {\n #context = { varIndex: 0 };\n #root = new Node();\n #index = 0;\n // dynamic path -> [handler index, param assoc]; static paths are not registered\n paths = createNullObject();\n insert(path, isStatic) {\n if (isStatic) {\n this.#root.insert(path.split(\"\"), 0, [], this.#context, true);\n return;\n }\n const paramAssoc = [];\n const groups = [];\n let markedPath = path;\n for (let i = 0; ; ) {\n let replaced = false;\n markedPath = markedPath.replace(/\\{[^}]+\\}/g, (m) => {\n const mark = `@\\\\${i}`;\n groups[i] = [mark, m];\n i++;\n replaced = true;\n return mark;\n });\n if (!replaced) {\n break;\n }\n }\n const tokens = markedPath.match(/(?::[^\\/]+)|(?:\\/\\*$)|./g) || [];\n for (let i = groups.length - 1; i >= 0; i--) {\n const [mark] = groups[i];\n for (let j = tokens.length - 1; j >= 0; j--) {\n if (tokens[j].indexOf(mark) !== -1) {\n tokens[j] = tokens[j].replace(mark, groups[i][1]);\n break;\n }\n }\n }\n this.#root.insert(tokens, this.#index, paramAssoc, this.#context, false);\n this.paths[path] = [this.#index++, paramAssoc];\n }\n buildRegExp() {\n let regexp = this.#root.buildRegExpStr();\n if (regexp === \"\") {\n return [/^$/, [], []];\n }\n let captureIndex = 0;\n const indexReplacementMap = [];\n const paramReplacementMap = [];\n regexp = regexp.replace(/#(\\d+)|@(\\d+)|\\.\\*\\$/g, (_, handlerIndex, paramIndex) => {\n if (handlerIndex !== void 0) {\n indexReplacementMap[++captureIndex] = Number(handlerIndex);\n return \"$()\";\n }\n if (paramIndex !== void 0) {\n paramReplacementMap[Number(paramIndex)] = ++captureIndex;\n return \"\";\n }\n return \"\";\n });\n return [new RegExp(`^${regexp}`), indexReplacementMap, paramReplacementMap];\n }\n};\nexport {\n Trie\n};\n", "// src/router/reg-exp-router/router.ts\nimport {\n MESSAGE_MATCHER_IS_ALREADY_BUILT,\n METHOD_NAME_ALL,\n UnsupportedPathError\n} from \"../../router.js\";\nimport { checkOptionalParameter } from \"../../utils/url.js\";\nimport { createNullObject } from \"../utils.js\";\nimport { match, emptyParam } from \"./matcher.js\";\nimport {\n LABEL_REG_EXP_STR,\n ONLY_WILDCARD_REG_EXP_STR,\n PATH_ERROR,\n TAIL_WILDCARD_REG_EXP_STR\n} from \"./node.js\";\nimport { Trie } from \"./trie.js\";\nvar wildcardRegExpCache = createNullObject();\nfunction buildWildcardRegExp(path) {\n return wildcardRegExpCache[path] ??= new RegExp(\n `^${path.replace(\n /\\/:[^/{}]+(?:\\{\\[\\^\\/]\\+})?(?=[/{]|$)|\\/?\\*$|([.\\\\+*[^\\]$()?{}|])/g,\n (match2, metaChar) => metaChar ? `\\\\${metaChar}` : match2 === \"/*\" ? TAIL_WILDCARD_REG_EXP_STR : match2 === \"*\" ? ONLY_WILDCARD_REG_EXP_STR : `/:${LABEL_REG_EXP_STR}`\n )}$`\n );\n}\nfunction findMiddleware(middleware, path) {\n for (const k of Object.keys(middleware).sort((a, b) => b.length - a.length)) {\n if (buildWildcardRegExp(k).test(path)) {\n return [...middleware[k]];\n }\n }\n return void 0;\n}\nvar RegExpRouter = class {\n name = \"RegExpRouter\";\n #middleware;\n #routes;\n #tries;\n constructor() {\n this.#middleware = { [METHOD_NAME_ALL]: createNullObject() };\n this.#routes = { [METHOD_NAME_ALL]: createNullObject() };\n this.#tries = { [METHOD_NAME_ALL]: new Trie() };\n }\n #insertPath(method, path) {\n try {\n this.#tries[method].insert(path, !/\\*|\\/:/.test(path));\n } catch (e) {\n throw e === PATH_ERROR ? new UnsupportedPathError(path) : e;\n }\n }\n add(method, path, handler) {\n const middleware = this.#middleware;\n const routes = this.#routes;\n if (!middleware) {\n throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n }\n if (!middleware[method]) {\n this.#tries[method] = new Trie();\n for (const handlerMap of [middleware, routes]) {\n handlerMap[method] = createNullObject();\n for (const p in handlerMap[METHOD_NAME_ALL]) {\n handlerMap[method][p] = [...handlerMap[METHOD_NAME_ALL][p]];\n this.#insertPath(method, p);\n }\n }\n }\n if (path === \"/*\") {\n path = \"*\";\n }\n const methods = method === METHOD_NAME_ALL ? Object.keys(middleware) : [method];\n if (/\\*$/.test(path)) {\n const re = buildWildcardRegExp(path);\n for (const m of methods) {\n if (!middleware[m][path]) {\n this.#insertPath(m, path);\n middleware[m][path] = findMiddleware(middleware[m], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || [];\n }\n }\n for (const handlerMap of [middleware, routes]) {\n for (const m of methods) {\n for (const p in handlerMap[m]) {\n re.test(p) && handlerMap[m][p].push([handler, path]);\n }\n }\n }\n return;\n }\n const paths = checkOptionalParameter(path) || [path];\n for (const path2 of paths) {\n for (const m of methods) {\n if (!routes[m][path2]) {\n this.#insertPath(m, path2);\n routes[m][path2] = findMiddleware(middleware[m], path2) || findMiddleware(middleware[METHOD_NAME_ALL], path2) || [];\n }\n routes[m][path2].push([handler, path2]);\n }\n }\n }\n match = match;\n buildAllMatchers() {\n const matchers = createNullObject();\n for (const method of Object.keys(this.#routes)) {\n matchers[method] = this.#buildMatcher(method);\n }\n this.#middleware = this.#routes = this.#tries = void 0;\n wildcardRegExpCache = createNullObject();\n return matchers;\n }\n #buildMatcher(method) {\n const middleware = this.#middleware[method];\n const routes = this.#routes[method];\n const trie = this.#tries[method];\n const staticMap = createNullObject();\n const handlerData = [];\n const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp();\n for (const r of [middleware, routes]) {\n for (const path in r) {\n const handlers = r[path];\n const pathData = trie.paths[path];\n if (!pathData) {\n staticMap[path] = [handlers.map(([h]) => [h, createNullObject()]), emptyParam];\n continue;\n }\n handlerData[pathData[0]] = handlers.map(([h, handlerPath]) => [\n h,\n trie.paths[handlerPath][1].reduceRight((map, [key], i) => {\n map[key] = paramReplacementMap[pathData[1][i][1]];\n return map;\n }, createNullObject())\n ]);\n }\n }\n return [regexp, indexReplacementMap.map((i) => handlerData[i]), staticMap];\n }\n};\nexport {\n RegExpRouter\n};\n", "// src/router/smart-router/router.ts\nimport { MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError } from \"../../router.js\";\nvar SmartRouter = class {\n name = \"SmartRouter\";\n #routers = [];\n #routes = [];\n constructor(init) {\n this.#routers = init.routers;\n }\n add(method, path, handler) {\n if (!this.#routes) {\n throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n }\n this.#routes.push([method, path, handler]);\n }\n match(method, path) {\n if (!this.#routes) {\n throw new Error(\"Fatal error\");\n }\n const routers = this.#routers;\n const routes = this.#routes;\n const len = routers.length;\n let i = 0;\n let res;\n for (; i < len; i++) {\n const router = routers[i];\n try {\n for (let i2 = 0, len2 = routes.length; i2 < len2; i2++) {\n router.add(...routes[i2]);\n }\n res = router.match(method, path);\n } catch (e) {\n if (e instanceof UnsupportedPathError) {\n continue;\n }\n throw e;\n }\n this.match = router.match.bind(router);\n this.#routers = [router];\n this.#routes = void 0;\n break;\n }\n if (i === len) {\n throw new Error(\"Fatal error\");\n }\n this.name = `SmartRouter + ${this.activeRouter.name}`;\n return res;\n }\n get activeRouter() {\n if (this.#routes || this.#routers.length !== 1) {\n throw new Error(\"No active router has been determined yet.\");\n }\n return this.#routers[0];\n }\n};\nexport {\n SmartRouter\n};\n", "// src/router/trie-router/node.ts\nimport { METHOD_NAME_ALL } from \"../../router.js\";\nimport { getPattern, splitPath, splitRoutingPath } from \"../../utils/url.js\";\nimport { createNullObject } from \"../utils.js\";\nvar emptyParams = createNullObject();\nvar order = 0;\nvar Node = class _Node {\n #methods = [];\n #children = createNullObject();\n #patterns = [];\n #pattern;\n #params = emptyParams;\n insert(method, path, handler) {\n let curNode = this;\n const parts = splitRoutingPath(path);\n const possibleKeys = /* @__PURE__ */ new Set();\n let i = 0;\n for (const p of parts) {\n const nextP = parts[++i];\n const pattern = getPattern(p, nextP) || (nextP === void 0 && p && p.indexOf(\"*\") === p.length - 1 ? p : null);\n const isParam = Array.isArray(pattern);\n const key = isParam ? pattern[0] : pattern || p;\n const child = curNode.#children[key] ||= new _Node();\n if (pattern && !child.#pattern) {\n child.#pattern = pattern;\n curNode.#patterns.push(child);\n }\n curNode = child;\n if (isParam) {\n possibleKeys.add(pattern[1]);\n }\n }\n curNode.#methods.push({\n [method]: {\n handler,\n possibleKeys: [...possibleKeys],\n score: ++order\n }\n });\n }\n #pushHandlerSets(handlerSets, node, method, nodeParams, params) {\n for (let i = 0, len = node.#methods.length; i < len; i++) {\n const m = node.#methods[i];\n const handlerSet = m[method] || m[METHOD_NAME_ALL];\n if (handlerSet) {\n handlerSet.params = createNullObject();\n handlerSets.push(handlerSet);\n for (let i2 = 0, len2 = handlerSet.possibleKeys.length; i2 < len2; i2++) {\n const key = handlerSet.possibleKeys[i2];\n handlerSet.params[key] = params?.[key] && !i2 ? params[key] : nodeParams[key] ?? params?.[key];\n }\n }\n }\n }\n search(method, path) {\n const handlerSets = [];\n this.#params = emptyParams;\n const curNode = this;\n let curNodes = [curNode];\n const parts = splitPath(path);\n const curNodesQueue = [];\n const len = parts.length;\n let partOffsets = null;\n for (let i = 0; i < len; i++) {\n const part = parts[i];\n const isLast = i === len - 1;\n const tempNodes = [];\n for (let j = 0, len2 = curNodes.length; j < len2; j++) {\n const node = curNodes[j];\n const nextNode = node.#children[part];\n if (nextNode) {\n nextNode.#params = node.#params;\n if (isLast) {\n if (nextNode.#children[\"*\"]) {\n this.#pushHandlerSets(handlerSets, nextNode.#children[\"*\"], method, node.#params);\n }\n this.#pushHandlerSets(handlerSets, nextNode, method, node.#params);\n } else {\n tempNodes.push(nextNode);\n }\n }\n for (const child of node.#patterns) {\n const pattern = child.#pattern;\n const params = node.#params === emptyParams ? {} : { ...node.#params };\n if (typeof pattern === \"string\") {\n if (pattern === \"*\" || part.startsWith(pattern.slice(0, -1))) {\n this.#pushHandlerSets(handlerSets, child, method, node.#params);\n if (pattern === \"*\") {\n child.#params = params;\n tempNodes.push(child);\n }\n }\n continue;\n }\n const [, name, matcher] = pattern;\n if (!part && matcher === true) {\n continue;\n }\n if (matcher !== true) {\n if (!partOffsets) {\n partOffsets = [];\n let offset = path[0] === \"/\" ? 1 : 0;\n for (let p = 0; p < len; p++) {\n partOffsets[p] = offset;\n offset += parts[p].length + 1;\n }\n }\n const restPathString = path.slice(partOffsets[i]);\n const m = matcher.exec(restPathString);\n if (m) {\n params[name] = m[0];\n this.#pushHandlerSets(handlerSets, child, method, node.#params, params);\n if (m[0].length === restPathString.length && child.#children[\"*\"]) {\n this.#pushHandlerSets(\n handlerSets,\n child.#children[\"*\"],\n method,\n node.#params,\n params\n );\n }\n for (const _ in child.#children) {\n child.#params = params;\n const componentCount = m[0].match(/\\//g)?.length ?? 0;\n const targetCurNodes = curNodesQueue[componentCount] ||= [];\n targetCurNodes.push(child);\n break;\n }\n continue;\n }\n }\n if (matcher === true || matcher.test(part)) {\n params[name] = part;\n if (isLast) {\n this.#pushHandlerSets(handlerSets, child, method, params, node.#params);\n if (child.#children[\"*\"]) {\n this.#pushHandlerSets(\n handlerSets,\n child.#children[\"*\"],\n method,\n params,\n node.#params\n );\n }\n } else {\n child.#params = params;\n tempNodes.push(child);\n }\n }\n }\n }\n const shifted = curNodesQueue.shift();\n curNodes = shifted ? tempNodes.concat(shifted) : tempNodes;\n }\n if (handlerSets[1]) {\n handlerSets.sort((a, b) => {\n return a.score - b.score;\n });\n }\n return [handlerSets.map(({ handler, params }) => [handler, params])];\n }\n};\nexport {\n Node\n};\n", "// src/router/trie-router/router.ts\nimport { checkOptionalParameter } from \"../../utils/url.js\";\nimport { Node } from \"./node.js\";\nvar TrieRouter = class {\n name = \"TrieRouter\";\n #node = new Node();\n add(method, path, handler) {\n for (const result of checkOptionalParameter(path) || [path]) {\n this.#node.insert(method, result, handler);\n }\n }\n match(method, path) {\n return this.#node.search(method, path);\n }\n};\nexport {\n TrieRouter\n};\n", "// src/hono.ts\nimport { HonoBase } from \"./hono-base.js\";\nimport { RegExpRouter } from \"./router/reg-exp-router/index.js\";\nimport { SmartRouter } from \"./router/smart-router/index.js\";\nimport { TrieRouter } from \"./router/trie-router/index.js\";\nvar Hono = class extends HonoBase {\n /**\n * Creates an instance of the Hono class.\n *\n * @param options - Optional configuration options for the Hono instance.\n */\n constructor(options = {}) {\n super(options);\n this.router = options.router ?? new SmartRouter({\n routers: [new RegExpRouter(), new TrieRouter()]\n });\n }\n};\nexport {\n Hono\n};\n", "// src/middleware/cors/index.ts\nvar cors = (options) => {\n const opts = {\n origin: \"*\",\n allowMethods: [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\", \"QUERY\"],\n allowHeaders: [],\n exposeHeaders: [],\n ...options\n };\n const exposeHeadersStr = opts.exposeHeaders?.length ? opts.exposeHeaders.join(\",\") : void 0;\n const allowHeadersStr = opts.allowHeaders?.length ? opts.allowHeaders.join(\",\") : void 0;\n const findAllowOrigin = ((optsOrigin) => {\n if (typeof optsOrigin === \"string\") {\n if (optsOrigin === \"*\") {\n return () => optsOrigin;\n } else {\n return (origin) => optsOrigin === origin ? origin : null;\n }\n } else if (typeof optsOrigin === \"function\") {\n return optsOrigin;\n } else {\n return (origin) => optsOrigin.includes(origin) ? origin : null;\n }\n })(opts.origin);\n const findAllowMethods = ((optsAllowMethods) => {\n if (typeof optsAllowMethods === \"function\") {\n return async (origin, c) => (await optsAllowMethods(origin, c)).join(\",\");\n } else if (Array.isArray(optsAllowMethods)) {\n const methodsStr = optsAllowMethods.join(\",\");\n return () => methodsStr;\n } else {\n return () => \"\";\n }\n })(opts.allowMethods);\n return async function cors2(c, next) {\n function set(key, value) {\n c.res.headers.set(key, value);\n }\n const allowOrigin = await findAllowOrigin(c.req.header(\"origin\") || \"\", c);\n if (allowOrigin) {\n set(\"Access-Control-Allow-Origin\", allowOrigin);\n }\n if (opts.credentials) {\n set(\"Access-Control-Allow-Credentials\", \"true\");\n }\n if (exposeHeadersStr) {\n set(\"Access-Control-Expose-Headers\", exposeHeadersStr);\n }\n if (c.req.method === \"OPTIONS\") {\n if (opts.origin !== \"*\") {\n c.res.headers.append(\"Vary\", \"Origin\");\n }\n if (opts.maxAge != null) {\n set(\"Access-Control-Max-Age\", opts.maxAge.toString());\n }\n const allowMethods = await findAllowMethods(c.req.header(\"origin\") || \"\", c);\n if (allowMethods) {\n set(\"Access-Control-Allow-Methods\", allowMethods);\n }\n let headersStr = allowHeadersStr;\n if (!headersStr) {\n const requestHeaders = c.req.header(\"Access-Control-Request-Headers\");\n if (requestHeaders) {\n headersStr = requestHeaders.split(\",\").map((h) => h.trim()).join(\",\");\n }\n }\n if (headersStr) {\n set(\"Access-Control-Allow-Headers\", headersStr);\n c.res.headers.append(\"Vary\", \"Access-Control-Request-Headers\");\n }\n c.res.headers.delete(\"Content-Length\");\n c.res.headers.delete(\"Content-Type\");\n return new Response(null, {\n headers: c.res.headers,\n status: 204,\n statusText: \"No Content\"\n });\n }\n await next();\n if (opts.origin !== \"*\") {\n c.header(\"Vary\", \"Origin\", { append: true });\n }\n };\n};\nexport {\n cors\n};\n", "import type { ProxyBody } from './types.ts';\n\nexport function isProxyBody(value: unknown): value is ProxyBody {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n return isProxyBody(value) ? value : {};\n}\n\nexport function isQueryValue(value: unknown): value is string | number | boolean {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n}\n", "import { Hono } from 'hono';\nimport { asRecord, asString } from './body.ts';\nimport type { AiGateway, ProxyEnv } from './types.ts';\n\nconst DEFAULT_GATEWAY_ID = 'void';\nconst PROVIDER_AUTH_DEFAULTS: Record<string, { header: string; prefix: string }> = {\n 'google-ai-studio': { header: 'x-goog-api-key', prefix: '' },\n};\nconst VOID_FILE_MARKER = '__voidFile';\n\ntype SerializedFileInput = Readonly<{\n [VOID_FILE_MARKER]: true;\n data: string;\n name?: string;\n type?: string;\n}>;\n\ntype SerializedProviderBody = Readonly<\n | { type: 'none' }\n | { type: 'json'; value: unknown }\n | { type: 'text'; data: string; contentType?: string }\n | { type: 'base64'; data: string; contentType?: string }\n | { type: 'form'; entries: Array<{ name: string; value: string | SerializedFileInput }> }\n>;\n\nclass BadRequestError extends Error {}\n\nconst ai = new Hono<ProxyEnv>();\n\nfunction hasStreamFlag(value: unknown): value is { stream?: boolean } {\n return typeof value === 'object' && value !== null && 'stream' in value;\n}\n\nfunction isBinaryView(value: unknown): value is ArrayBufferView {\n return ArrayBuffer.isView(value);\n}\n\nfunction isSerializedFileInput(value: unknown): value is SerializedFileInput {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as Record<string, unknown>)[VOID_FILE_MARKER] === true &&\n typeof (value as Record<string, unknown>).data === 'string' &&\n ((value as Record<string, unknown>).name === undefined ||\n typeof (value as Record<string, unknown>).name === 'string') &&\n ((value as Record<string, unknown>).type === undefined ||\n typeof (value as Record<string, unknown>).type === 'string')\n );\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n let binary: string;\n try {\n binary = atob(base64);\n } catch {\n throw new BadRequestError('invalid file data');\n }\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction gatewayEndpointUrl(baseUrl: string, endpoint: string): string {\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint.slice(1) : endpoint;\n return `${normalizedBase}/${normalizedEndpoint}`;\n}\n\nfunction isUnsafeProviderPath(path: string): boolean {\n if (/^(?:[a-z][a-z0-9+.-]*:)?\\/\\//i.test(path) || path.includes('\\\\')) {\n return true;\n }\n\n const pathname = path.split(/[?#]/, 1)[0] ?? '';\n for (const segment of pathname.split('/')) {\n try {\n if (decodeURIComponent(segment) === '..') {\n return true;\n }\n } catch {\n return true;\n }\n }\n\n return false;\n}\n\nfunction providerBody(value: unknown): SerializedProviderBody {\n const record = asRecord(value);\n const type = asString(record.type);\n if (\n type === 'none' ||\n type === 'json' ||\n type === 'text' ||\n type === 'base64' ||\n type === 'form'\n ) {\n return record as SerializedProviderBody;\n }\n return { type: 'none' };\n}\n\nfunction appendSerializedFormValue(\n form: FormData,\n name: string,\n value: string | SerializedFileInput,\n): void {\n if (isSerializedFileInput(value)) {\n const blob = new Blob([base64ToBytes(value.data)], {\n type: value.type ?? 'application/octet-stream',\n });\n form.append(name, blob, value.name ?? name);\n return;\n }\n form.append(name, value);\n}\n\nfunction providerRequestBody(body: SerializedProviderBody): {\n body?: BodyInit;\n contentType?: string;\n} {\n if (body.type === 'none') {\n return {};\n }\n\n if (body.type === 'json') {\n return { body: JSON.stringify(body.value), contentType: 'application/json' };\n }\n\n if (body.type === 'text') {\n return { body: body.data, contentType: body.contentType };\n }\n\n if (body.type === 'base64') {\n return {\n body: base64ToBytes(body.data).buffer as ArrayBuffer,\n contentType: body.contentType,\n };\n }\n\n const form = new FormData();\n for (const entry of body.entries) {\n appendSerializedFormValue(form, entry.name, entry.value);\n }\n return { body: form };\n}\n\nfunction headersFromRecord(value: unknown): Headers {\n const headers = new Headers();\n for (const [key, headerValue] of Object.entries(asRecord(value))) {\n if (typeof headerValue === 'string') {\n headers.set(key, headerValue);\n }\n }\n return headers;\n}\n\nfunction providerAuthDefaults(provider: string): { header: string; prefix: string } {\n return PROVIDER_AUTH_DEFAULTS[provider] ?? { header: 'authorization', prefix: 'Bearer ' };\n}\n\nfunction gatewayOptions(\n value: unknown,\n projectId: string,\n gatewayId: string,\n): Record<string, unknown> {\n const options = asRecord(value);\n const gateway = asRecord(options.gateway);\n const metadata = asRecord(gateway.metadata);\n\n return {\n ...options,\n gateway: {\n ...gateway,\n id: gatewayId,\n metadata: {\n ...metadata,\n projectId,\n },\n },\n };\n}\n\nfunction applyProviderHeaders({\n headers,\n provider,\n providerKey,\n projectId,\n apiKeyHeader,\n apiKeyPrefix,\n contentType,\n}: {\n headers: Headers;\n provider: string;\n providerKey: string;\n projectId: string;\n apiKeyHeader?: string | null;\n apiKeyPrefix?: string | null;\n contentType?: string;\n}): Headers {\n const defaults = providerAuthDefaults(provider);\n const keyHeader = apiKeyHeader ?? defaults.header;\n const keyPrefix = apiKeyPrefix ?? defaults.prefix;\n\n headers.set(keyHeader, `${keyPrefix}${providerKey}`);\n headers.set('cf-aig-metadata-projectId', projectId);\n if (contentType && !headers.has('content-type')) {\n headers.set('content-type', contentType);\n }\n return headers;\n}\n\nfunction headersForContentType(contentType: string | null | undefined): HeadersInit | undefined {\n return contentType ? { 'content-type': contentType } : undefined;\n}\n\nfunction filteredResponseHeaders(response: Response): Headers {\n const headers = new Headers();\n const contentType = response.headers.get('content-type');\n const cacheControl = response.headers.get('cache-control');\n if (contentType) {\n headers.set('content-type', contentType);\n }\n if (cacheControl) {\n headers.set('cache-control', cacheControl);\n }\n return headers;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction responseFromThrown(value: unknown): Response | null {\n if (value instanceof Response) {\n return value;\n }\n\n if (!isRecord(value)) {\n return null;\n }\n\n if (value.response instanceof Response) {\n return value.response;\n }\n\n return responseFromThrown(value.cause);\n}\n\nfunction statusFromThrown(value: unknown): number | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const status = value.status ?? value.statusCode;\n if (typeof status === 'number' && Number.isInteger(status) && status >= 400 && status <= 599) {\n return status;\n }\n\n return statusFromThrown(value.cause);\n}\n\nfunction messageFromThrown(value: unknown): string {\n if (value instanceof Error) {\n return value.message;\n }\n\n return String(value);\n}\n\nfunction hasResponseMethod(value: unknown): value is { response(): Response | Promise<Response> } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'response' in value &&\n typeof (value as { response?: unknown }).response === 'function'\n );\n}\n\nasync function responseFromAiResult(result: unknown, streamAsSse: boolean): Promise<Response> {\n if (result instanceof Response) {\n return result;\n }\n\n if (hasResponseMethod(result)) {\n return result.response();\n }\n\n if (result instanceof ReadableStream) {\n return new Response(result, {\n headers: streamAsSse\n ? {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache',\n }\n : { 'content-type': 'application/octet-stream' },\n });\n }\n\n if (result instanceof Blob) {\n return new Response(result, { headers: headersForContentType(result.type) });\n }\n\n if (result instanceof ArrayBuffer || isBinaryView(result)) {\n return new Response(result, { headers: { 'content-type': 'application/octet-stream' } });\n }\n\n return Response.json(result);\n}\n\nasync function responseFromAiError(err: unknown): Promise<Response> {\n const response = responseFromThrown(err);\n if (response) {\n return responseFromGateway(response, false);\n }\n\n const status = statusFromThrown(err) ?? 502;\n return Response.json({ error: messageFromThrown(err) }, { status });\n}\n\nasync function responseFromGateway(response: Response, streamAsSse: boolean): Promise<Response> {\n if (streamAsSse && response.body) {\n return new Response(response.body, {\n headers: {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache',\n 'access-control-allow-origin': '*',\n },\n });\n }\n\n return new Response(response.body, {\n status: response.status,\n headers: filteredResponseHeaders(response),\n });\n}\n\nai.post('/run', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const model = asString(body.model);\n\n if (!model) {\n return context.json({ error: 'model required' }, 400);\n }\n\n const options = gatewayOptions(\n body.options,\n projectId,\n context.env.AI_GATEWAY_ID ?? DEFAULT_GATEWAY_ID,\n );\n\n try {\n const result = await context.env.AI.run(model, body.inputs, options);\n return responseFromAiResult(result, hasStreamFlag(body.inputs) && body.inputs.stream === true);\n } catch (err) {\n const message = messageFromThrown(err);\n console.error('AI inference error:', message);\n return responseFromAiError(err);\n }\n});\n\nai.post('/provider', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const provider = asString(body.provider);\n const path = asString(body.path);\n const method = asString(body.method) ?? 'POST';\n const providerKey = asString(body.providerKey);\n const apiKeyHeader = asString(body.apiKeyHeader);\n const apiKeyPrefix = asString(body.apiKeyPrefix);\n\n if (!provider) {\n return context.json({ error: 'provider required' }, 400);\n }\n if (!path) {\n return context.json({ error: 'path required' }, 400);\n }\n if (!providerKey) {\n return context.json({ error: 'providerKey required' }, 400);\n }\n if (isUnsafeProviderPath(path)) {\n return context.json({ error: 'path must be relative' }, 400);\n }\n\n try {\n const gateway = context.env.AI.gateway(context.env.AI_GATEWAY_ID ?? DEFAULT_GATEWAY_ID);\n const baseUrl = await gateway.getUrl(provider);\n const requestBody = providerRequestBody(providerBody(body.body));\n const headers = applyProviderHeaders({\n headers: headersFromRecord(body.headers),\n provider,\n providerKey,\n projectId,\n apiKeyHeader,\n apiKeyPrefix,\n contentType: requestBody.contentType,\n });\n const response = await fetch(gatewayEndpointUrl(baseUrl, path), {\n method,\n headers,\n body: requestBody.body,\n });\n\n if (!response.ok) {\n const text = await response.text();\n let error: string;\n try {\n const json = JSON.parse(text);\n error = json.error?.message ?? text;\n } catch {\n error = text;\n }\n return context.json({ error }, response.status as 400);\n }\n\n return responseFromGateway(response, false);\n } catch (err) {\n if (err instanceof BadRequestError) {\n return context.json({ error: err.message }, 400);\n }\n const message = err instanceof Error ? err.message : String(err);\n console.error('AI Gateway error:', message);\n return context.json({ error: 'gateway error' }, 502);\n }\n});\n\nai.post('/models', async (context) => {\n const body = context.get('body');\n try {\n const result = await context.env.AI.models(body.inputs);\n return context.json(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error('AI inference error:', message);\n return context.json({ error: 'inference error' }, 502);\n }\n});\n\nai.post('/toMarkdown', async (context) => {\n const body = context.get('body');\n try {\n const result = await context.env.AI.toMarkdown(body.inputs, body.options);\n return context.json(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error('AI inference error:', message);\n return context.json({ error: 'inference error' }, 502);\n }\n});\n\nexport { ai };\n", "export function proxyCapabilityEnabled(value: string | undefined, capability: string): boolean {\n // The current managed controller never uses the old tenant acquire/release\n // routes. Keep that unsafe protocol closed even when Sandbox is enabled.\n if (capability === 'sandbox') {\n return false;\n }\n if (!value) {\n return true;\n }\n try {\n const parsed = JSON.parse(value) as unknown;\n return (\n !!parsed &&\n typeof parsed === 'object' &&\n !Array.isArray(parsed) &&\n (parsed as Record<string, unknown>)[capability] === true\n );\n } catch {\n return false;\n }\n}\n", "import type { Env } from './types.ts';\n\ntype WorkerResolution = Readonly<{ workerName: string; deploymentId: string }>;\n\ntype DispatchOptions = Readonly<{\n /** Read-only operations may retry through their REST fallback after a transport failure. */\n fallbackOnDispatchError?: boolean;\n}>;\n\n/**\n * Resolve the active deployment's worker through the API service binding.\n *\n * This lookup intentionally runs for every operation. The project id is stable,\n * while rollback changes the active deployment and therefore the worker name.\n */\nasync function resolveWorker(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n): Promise<WorkerResolution | null> {\n const token = await hmacSign(projectId, jwtSecret);\n const res = await api.fetch(`https://api/internal/resolve-worker/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n });\n\n if (res.status === 404 || res.status === 409) {\n return null;\n }\n if (!res.ok) {\n throw new Error(`worker resolution failed with status ${res.status}`);\n }\n\n const data = await res.json<Partial<WorkerResolution>>();\n if (typeof data.workerName !== 'string' || typeof data.deploymentId !== 'string') {\n throw new Error('worker resolution returned an invalid response');\n }\n return { workerName: data.workerName, deploymentId: data.deploymentId };\n}\n\n/**\n * Dispatch a binding operation to the user's deployed worker via Workers for Platforms.\n * The user worker handles it via native D1/KV/R2 bindings at the `/__void/*` route.\n *\n * Returns the Response if successful, or null if the worker doesn't support /__void\n * (404 = old deploy without the handler \u2192 caller should fall back to REST API).\n */\nexport async function dispatchToWorker(\n env: Env,\n projectId: string,\n path: string,\n body: Record<string, unknown>,\n options: DispatchOptions = {},\n): Promise<Response | null> {\n let resolution: WorkerResolution | null;\n try {\n resolution = await resolveWorker(env.API, env.JWT_SECRET, projectId);\n } catch {\n return options.fallbackOnDispatchError\n ? null\n : Response.json({ error: 'active worker resolution failed' }, { status: 502 });\n }\n if (!resolution) {\n return null;\n }\n\n const proxyToken = await hmacSign(projectId, env.JWT_SECRET);\n let worker: Fetcher;\n try {\n worker = env.DISPATCH.get(resolution.workerName);\n } catch {\n return null;\n }\n\n try {\n const res = await worker.fetch(`https://worker/__void${path}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': proxyToken,\n },\n body: JSON.stringify(body),\n });\n\n // 404 means old deploy without /__void handler \u2192 fall back\n if (res.status === 404) {\n return null;\n }\n\n return res;\n } catch {\n // A write may already have committed before a response/transport failure.\n // Only explicitly read-only callers may replay through a REST fallback.\n return options.fallbackOnDispatchError\n ? null\n : Response.json(\n { error: 'worker dispatch failed; operation result is unknown' },\n { status: 502 },\n );\n }\n}\n\n// --- HMAC signing (mirrors resolve.ts) ---\n\nconst encoder = new TextEncoder();\nlet cachedSignKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getSignKey(secret: string): Promise<CryptoKey> {\n if (cachedSignKey && cachedKeySecret === secret) {\n return cachedSignKey;\n }\n cachedSignKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n cachedKeySecret = secret;\n return cachedSignKey;\n}\n\nasync function hmacSign(data: string, secret: string): Promise<string> {\n const key = await getSignKey(secret);\n const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(data));\n const binary = String.fromCharCode(...new Uint8Array(sig));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n", "// In-memory cache: resource mappings are stable (only change on deploy).\n// Persists across requests within the same CF worker isolate.\nconst cache = new Map<string, string>();\n\n/** @internal Exposed for testing only. */\nexport function clearResolveCache() {\n cache.clear();\n}\n\n/**\n * Resolves a project's binding to its Cloudflare resource ID via the API service binding.\n * Results are cached in-memory per isolate \u2014 the first call per binding hits the API,\n * subsequent calls return instantly.\n */\nexport async function resolveResource(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n type: 'd1' | 'kv' | 'r2',\n bindingName: string,\n): Promise<string> {\n const cacheKey = `${projectId}:${type}:${bindingName}`;\n const cached = cache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const token = await hmacSign(projectId, jwtSecret);\n const res = await api.fetch(`https://api/internal/resolve-resource/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({ type, binding: bindingName }),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => res.statusText);\n throw new Error(`Resource resolution failed (${res.status}): ${text}`);\n }\n\n const data = await res.json<{ cf_id: string }>();\n cache.set(cacheKey, data.cf_id);\n return data.cf_id;\n}\n\n/**\n * Verifies that an actor still has deploy-equivalent project access through\n * the API service binding. The endpoint keeps its legacy name during rollout.\n */\nexport async function verifyProjectDeployAccess(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n userId: string,\n jwt?: string,\n accessAssertion?: string,\n proxyOrigin?: string,\n): Promise<boolean> {\n try {\n if (!proxyOrigin || new URL(proxyOrigin).origin !== proxyOrigin) {\n return false;\n }\n const token = await hmacSign(ownerVerificationMessage(projectId, proxyOrigin), jwtSecret);\n const res = await api.fetch(`https://api/internal/verify-owner/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({\n userId,\n ...(jwt ? { jwt } : {}),\n ...(accessAssertion ? { accessAssertion } : {}),\n proxyOrigin,\n }),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport function ownerVerificationMessage(projectId: string, proxyOrigin: string): string {\n return `void-proxy-owner-v2\\n${projectId}\\n${proxyOrigin}`;\n}\n\n/** Revalidate the authority from which a scoped prerender credential was derived. */\nexport async function verifyPrerenderAuthority(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n userId: string,\n provenance: { buildId?: string; credentialId?: string },\n): Promise<boolean> {\n try {\n const token = await hmacSign(projectId, jwtSecret);\n const res = await api.fetch(`https://api/internal/verify-prerender-build/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({ userId, ...provenance }),\n });\n if (res.status === 400 && !provenance.buildId && !provenance.credentialId) {\n // The previous API revision required provenance here. Preserve manual\n // prerenders while the proxy and API revisions overlap during rollout.\n const body = await res.json<{ error?: unknown }>().catch(() => null);\n return body?.error === 'userId and credential provenance required';\n }\n return res.ok;\n } catch {\n // Project-data access fails closed if the revocation authority is\n // unavailable. A build can retry without widening its credential.\n return false;\n }\n}\n\n// --- HMAC signing (mirrors packages/api/src/auth/hmac.ts) ---\n\nconst encoder = new TextEncoder();\nlet cachedSignKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getSignKey(secret: string): Promise<CryptoKey> {\n if (cachedSignKey && cachedKeySecret === secret) {\n return cachedSignKey;\n }\n cachedSignKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n cachedKeySecret = secret;\n return cachedSignKey;\n}\n\nasync function hmacSign(data: string, secret: string): Promise<string> {\n const key = await getSignKey(secret);\n const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(data));\n const binary = String.fromCharCode(...new Uint8Array(sig));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n", "import { Hono } from 'hono';\nimport { asString } from './body.ts';\nimport { dispatchToWorker } from './dispatch.ts';\nimport { resolveResource } from './resolve.ts';\nimport type { ProxyEnv } from './types.ts';\n\nconst CF_API = 'https://api.cloudflare.com/client/v4';\n\nconst d1 = new Hono<ProxyEnv>();\n\nd1.post('/query', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const sql = asString(body.sql);\n\n if (!binding || !sql) {\n return context.json({ error: 'binding and sql required' }, 400);\n }\n\n // Try WfP dispatch first (native bindings, ~1-5ms)\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/d1/query', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API (for old deploys without /__void handler)\n let dbId: string;\n try {\n dbId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'd1', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/d1/database/${dbId}/query`,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${context.env.CF_API_TOKEN}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ sql, params: body.params ?? [] }),\n },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'D1 query failed', status: cfRes.status }, 502);\n }\n\n const cfData = (await cfRes.json()) as {\n result?: ReadonlyArray<{\n results?: ReadonlyArray<Record<string, unknown>>;\n meta?: Record<string, unknown>;\n }>;\n };\n const queryResult = cfData.result?.[0];\n\n if (!queryResult) {\n return context.json({ error: 'unexpected D1 response' }, 502);\n }\n\n switch (body.method) {\n case 'first':\n return context.json(queryResult.results?.[0] ?? null);\n case 'raw': {\n const columns = queryResult.results?.length ? Object.keys(queryResult.results[0]) : [];\n const values = (queryResult.results ?? []).map((row) => Object.values(row));\n return context.json({ columns, results: values, meta: queryResult.meta });\n }\n case 'run':\n return context.json({ success: true, meta: queryResult.meta });\n case 'all':\n default:\n return context.json({\n results: queryResult.results ?? [],\n success: true,\n meta: queryResult.meta,\n });\n }\n});\n\nd1.post('/batch', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding || !Array.isArray(body.statements)) {\n return context.json({ error: 'binding and statements required' }, 400);\n }\n\n // Try WfP dispatch first (native db.batch() with transactional guarantees)\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/d1/batch', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // There is no sequential fallback: D1Database.batch() promises one atomic\n // native batch. If the active worker cannot provide that capability, fail\n // before issuing any statement rather than partially applying the batch.\n return context.json({ error: 'atomic D1 batch unavailable for active deployment' }, 503);\n});\n\nexport { d1 };\n", "const EMAIL_REQUEST_DEADLINE_MS = 5_000;\nconst decoder = new TextDecoder('utf-8', { fatal: true, ignoreBOM: false });\n\nasync function beforeDeadline<T>(deadline: number, run: () => Promise<T>): Promise<T> {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new Error('email request timeout');\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n return Promise.race([\n run(),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error('email request timeout')), remaining);\n }),\n ]).finally(() => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n });\n}\n\n/** Bound public email request bodies before JSON parsing or authentication. */\nexport async function readEmailRequestJson(\n request: Request,\n maxBytes = 2 * 1024,\n): Promise<unknown> {\n const declaredLength = request.headers.get('content-length');\n if (\n request.headers.has('content-encoding') ||\n !request.body ||\n (declaredLength !== null &&\n (!/^\\d+$/.test(declaredLength) || Number(declaredLength) > maxBytes))\n ) {\n void request.body?.cancel().catch(() => {});\n throw new Error('invalid email request body');\n }\n const expectedLength = declaredLength === null ? null : Number(declaredLength);\n const reader = request.body.getReader();\n let bytes = new Uint8Array(Math.min(1024, maxBytes));\n const deadline = Date.now() + EMAIL_REQUEST_DEADLINE_MS;\n let size = 0;\n try {\n for (;;) {\n const chunk = await beforeDeadline(deadline, () => reader.read());\n if (chunk.done) {\n break;\n }\n const nextSize = size + chunk.value.byteLength;\n if (nextSize > maxBytes) {\n throw new Error('email request body too large');\n }\n if (nextSize > bytes.byteLength) {\n const grown = new Uint8Array(Math.min(maxBytes, Math.max(nextSize, bytes.byteLength * 2)));\n grown.set(bytes.subarray(0, size));\n bytes = grown;\n }\n bytes.set(chunk.value, size);\n size = nextSize;\n }\n } finally {\n // An uncooperative stream may never settle cancellation. Start cleanup,\n // but do not let it extend the hard request-body deadline.\n void reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n if (size === 0 || (expectedLength !== null && size !== expectedLength)) {\n throw new Error('invalid email request body length');\n }\n return JSON.parse(decoder.decode(bytes.subarray(0, size)));\n}\n", "import { isReservedEmailSlug } from '@voidcloud/api/reserved-slugs';\nimport { EmailMessage } from 'cloudflare:email';\nimport { Hono } from 'hono';\nimport type { Context } from 'hono';\nimport { asString } from './body.ts';\nimport {\n admitEmail,\n emailPayloadDigest,\n finishEmailAttempt,\n startEmailAttempt,\n} from './email-admission.ts';\nimport { leaseBearer, leaseEmailDomainCredential } from './email-lease.ts';\nimport {\n EMAIL_PROVIDER_DEADLINE_MS,\n EmailProviderTimeoutError,\n createEmailProviderDeadline,\n type EmailProviderDeadline,\n} from './email-provider-deadline.ts';\nimport type { Env, ProxyEnv } from './types.ts';\n\nconst app = new Hono<ProxyEnv>();\n// The SDK aborts at 60s. Body/auth can precede this handler, and final ledger\n// writes need time after provider work stops.\nconst EMAIL_SEND_DEADLINE_MS = 50_000;\nconst EMAIL_SEND_FINALIZATION_MARGIN_MS = 5_000;\n\n/**\n * Cap inbound MIME bytes well below CF's ~10 MB base64-inflated ceiling. The\n * framework enforces the same cap client-side; this is the proxy-side belt to\n * the framework's suspenders.\n */\nexport const MAX_MIME_BYTES = 5 * 1024 * 1024;\nconst MAX_CUSTOM_HEADER_BYTES = 16 * 1024;\nconst BUILTIN_MIME_HEADERS = new Set([\n 'from',\n 'to',\n 'cc',\n 'bcc',\n 'subject',\n 'reply-to',\n 'date',\n 'message-id',\n 'in-reply-to',\n 'references',\n 'mime-version',\n 'content-type',\n 'content-transfer-encoding',\n 'content-disposition',\n]);\n\n/** Bound only app-defined top-level fields, including folded continuation lines. */\nexport function customMimeHeaderBytesWithinLimit(raw: Uint8Array): boolean {\n let used = 0;\n let custom = false;\n for (let start = 0; start < raw.byteLength;) {\n let end = start;\n while (end < raw.byteLength && raw[end] !== 10) {\n end++;\n }\n const lineEnd = end > start && raw[end - 1] === 13 ? end - 1 : end;\n if (lineEnd === start) {\n return true;\n }\n if (raw[start] !== 32 && raw[start] !== 9) {\n let colon = start;\n while (colon < lineEnd && raw[colon] !== 58) {\n colon++;\n }\n const name = new TextDecoder().decode(raw.subarray(start, colon)).toLowerCase();\n custom = colon < lineEnd && !BUILTIN_MIME_HEADERS.has(name);\n }\n if (custom) {\n used += lineEnd - start + 2;\n if (used > MAX_CUSTOM_HEADER_BYTES) {\n return false;\n }\n }\n start = end + 1;\n }\n return true;\n}\n\n/** Bound the raw list before normalization allocates one copy and Set entry per recipient. */\nconst MAX_RECIPIENTS = 50;\n\n/**\n * Bound each address before normalization copies it. RFC 5321 caps a\n * forward-path at 256 octets, so 320 characters leaves room for validation.\n */\nconst MAX_RECIPIENT_LENGTH = 320;\n\n/**\n * Cap the envelope sender for the same reason. It is one string, so there\n * is no list amplifier, but `from.toLowerCase()` below copies it whole\n * (measured: V8 returns a fresh full-size string even when nothing\n * changed), and a sender the strict regex accepts \u2014 an unbounded `+tag`\n * is one \u2014 is then echoed verbatim into the MIME `From:` refusal and\n * serialized into the response. Check it before those copies. The limit\n * matches `MAX_RECIPIENT_LENGTH`.\n */\nconst MAX_SENDER_LENGTH = 320;\n\n/**\n * The platform mail domain for this environment. It is configured as the\n * `EMAIL_SENDER_DOMAIN` var and mirrored into deployed user workers as the\n * `__VOID_EMAIL_DOMAIN` plain-text binding so the framework builds its default\n * `from` against the same zone.\n *\n * There is deliberately NO baked-in default. A staging proxy that fell back\n * to `mail.void.cloud` would accept a `from` on the production zone, and the\n * production sender regex would reject every legitimate staging sender \u2014 the\n * exact reason the domain stopped being a constant. Missing configuration\n * fails the send CLOSED.\n */\nexport function readSenderDomain(env: Pick<Env, 'EMAIL_SENDER_DOMAIN'>): string | null {\n const raw = env.EMAIL_SENDER_DOMAIN;\n if (typeof raw !== 'string') {\n return null;\n }\n const domain = raw.trim().toLowerCase();\n return domain.length > 0 ? domain : null;\n}\n\n/** Regex metacharacters, escaped before a config value is interpolated. */\nconst RE_METACHARS_RE = /[.*+?^${}()|[\\]\\\\]/g;\n\nfunction escapeRegExp(value: string): string {\n return value.replace(RE_METACHARS_RE, '\\\\$&');\n}\n\n/**\n * Memoized per-domain sender regexes. Keyed by the configured\n * `EMAIL_SENDER_DOMAIN`, which is worker configuration and not user input,\n * so the map holds exactly one entry per isolate in practice.\n */\nconst strictFromCache = new Map<string, RegExp>();\n\n/**\n * Strict shape for the outbound `from` envelope address. The slug+domain\n * pinning logic below splits on `+` and the first `@`, but those splits do\n * NOT reject CR/LF, quotes, angle brackets, or display-name forms. Without\n * this regex, a `from` like `slug+x\\r\\nX-Header: y@<domain>` would pass slug\n * pinning and then reach `new EmailMessage(from, ...)`, opening an SMTP\n * header injection primitive against the shared sender. The regex pins the\n * entire string to: lowercase ASCII local-part, zero or more `+<safe-tag>`\n * segments (constrained to RFC-5321 dot-atom-text + `=` and `/`), then exactly\n * `@<EMAIL_SENDER_DOMAIN>`. Display names, encoded-words, and angle brackets\n * are intentionally not supported \u2014 the framework doesn't emit them for a\n * default `from`, and explicit user-supplied names are already disallowed by\n * the slug pin.\n *\n * The `+tag` class is a positive class rather than `[^@\\s]+` so even\n * non-printable ASCII (NUL, BEL, DEL, \u2026) can't ride into `EmailMessage`.\n *\n * The domain is escaped before interpolation so a misconfigured value can\n * never widen the pattern (an unescaped `.` would match any character).\n */\nexport function strictFromRe(domain: string): RegExp {\n const cached = strictFromCache.get(domain);\n if (cached) {\n return cached;\n }\n const re = new RegExp(`^[a-z0-9._-]+(?:\\\\+[a-z0-9._=/-]+)*@${escapeRegExp(domain)}$`);\n strictFromCache.set(domain, re);\n return re;\n}\n\n/**\n * Strip CR/LF/NUL/control chars before logging or surfacing to remote MTAs.\n *\n * Built via new RegExp so oxlint's no-control-regex rule (which fires\n * on even Unicode-escaped control refs in regex literals) does not\n * reject the pattern. Behavior is identical to a literal regex.\n *\n * Slice FIRST, then replace \u2014 the same order as `sanitize` in\n * `email-router.ts`, for the same reason: a global replace materializes one\n * part per match, so a control-heavy input costs far more than one copy\n * (measured: a 5 MB `\\na\\na\u2026` value is +170 MB of transient heap through the\n * old replace-then-slice order, past the 128 MB isolate ceiling; slice-first\n * is 0 ms). Most callers already pass bounded values; `requestId` at intake\n * and the inbound `Subject:` header did not. The result is at most `maxLen`\n * chars and may be shorter \u2014 a control run inside the window collapses to\n * one space and nothing is refilled from beyond it \u2014 which loses nothing on\n * a log line.\n */\n// oxlint-disable-next-line no-control-regex\nconst CONTROL_CHARS_RE = new RegExp('[\\\\u0000-\\\\u001f\\\\u007f]+', 'g');\nfunction sanitizeForLog(value: string, maxLen = 200): string {\n return value.slice(0, maxLen).replace(CONTROL_CHARS_RE, ' ');\n}\n\n/**\n * Cap the caller-supplied log correlation id. The framework sends 16 hex\n * chars (`newRequestId` in `void/email`), but a hand-built tenant worker can\n * send any string the request body carries, and the only consumer is the\n * `[email-log]` line \u2014 one per delivery, so up to `MAX_RECIPIENTS` copies of\n * it per request \u2014 in the shared proxy log stream. It is diagnostic, so it\n * is bounded and sanitized ONCE at intake rather than refused with a 400:\n * a missing or non-string id already logs as `unknown` instead of failing\n * the send, and a truncated id is no less useful to correlate on. The\n * control-char strip is what stops a `\\n` in the id from forging a second\n * `[email-log]` line under another project's id. 128 leaves room for a\n * UUID or a prefixed id without inviting anything longer.\n */\nconst MAX_REQUEST_ID_LENGTH = 128;\n\n/**\n * Wrap a Uint8Array as a single-chunk ReadableStream. CF's EmailMessage\n * constructor accepts `string | ReadableStream`; passing a Uint8Array\n * directly is a TS error. Streaming a single chunk avoids decoding to\n * UTF-8 (which would corrupt non-text MIME parts that happen to be\n * stored in their decoded form).\n */\nfunction bytesToStream(bytes: Uint8Array): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(bytes);\n controller.close();\n },\n });\n}\n\n/**\n * The addr-spec named by the message-level `From:` header, or why there is\n * no single one to name.\n *\n * `/send` pins the ENVELOPE sender (`from`) to the calling project's slug,\n * but the bytes a recipient's mail client shows as the sender are the MIME\n * `From:` header inside `mimeBase64`, and a tenant worker holding its own\n * project HMAC can post any bytes it likes there. Cloudflare's local\n * `send_email` simulator (miniflare `send_email.worker.ts`) throws\n * `From: header does not match mail from` for exactly this, and its author\n * says the messages mirror production \u2014 but nothing in the public docs\n * promises it, the same simulator takes the LAST of several `From:` headers\n * and the FIRST mailbox of a list, and the proxy is the platform's tenancy\n * boundary. So the proxy checks itself: exactly one `From:` header, holding\n * exactly one mailbox, whose addr-spec is the authorized envelope sender.\n *\n * Scope is deliberately narrow. The display name (a quoted-string or RFC\n * 2047 encoded-words before `<\u2026>`) is NOT inspected \u2014 closing display-name\n * spoofing would need a real RFC 5322 scanner tracking `buildMime` forever,\n * and stays handed back. The structural specials outside quotes\n * (`, ; : ( ) [ ] \\` and a bare `@` before `<`) are refused only because\n * each one would make \"which mailbox is this\" ambiguous \u2014 a list, a group,\n * a comment or a phrase that reads as an address \u2014 and `buildMime` never\n * emits any of them unquoted. `Sender:`, `Reply-To:` and `Resent-From:` are\n * not pinned: no client presents them as the author, and a reply sent to a\n * sibling project's inbound address is something anyone can do without the\n * proxy.\n *\n * Every line of the header block is visited so a `From:` cannot hide\n * behind an unrelated header, and continuation lines (leading WSP) are\n * unfolded onto the header they extend. The scan stops at the first empty\n * line \u2014 a `From:` inside a MIME part's own headers is that part's, not the\n * message's \u2014 or at the end of `raw`, which `MAX_MIME_BYTES` already\n * bounds. The work is one linear pass over bytes that are already in\n * memory; only the `From:` value is ever decoded to a string, and the\n * tokenizer below is a single pass with no backtracking, so a display\n * name of any length (which `buildMime` allows) costs what it weighs.\n *\n * \"What it weighs\" has to mean BYTES, not lines. The scan keeps nothing\n * per line \u2014 only the byte offsets of the one `From:` it found \u2014 because\n * `MAX_MIME_BYTES` bounds bytes and a folded header can hold one line per\n * three of them (` \\r\\n`): 3.5 million continuations fit in 10 MiB, and an\n * earlier shape that retained one `subarray` view per continuation held\n * ~125 bytes of heap each \u2014 437 MB, measured, in an isolate of 128 MB that\n * every tenant's AI/D1/KV/R2 traffic shares. The same message with no\n * `From:` cost 1 MB, so the amplifier was the `From:` itself. The value is\n * unfolded with ONE copy of the header's byte range, and no copy at all\n * when it did not fold.\n *\n * Header names are matched the way lenient parsers (postal-mime, which\n * miniflare uses) match them \u2014 bytes before the first `:` with trailing\n * WSP trimmed, case-insensitively \u2014 so `From :` counts as a second `From:`\n * rather than slipping past as an unknown header. A bare CR inside a line\n * fails the scan: `buildMime` rejects CR/LF in every value, and a parser\n * that splits on LF alone would read the bytes after it as part of the\n * same header.\n */\nexport type MimeFrom =\n | { ok: true; addrSpec: string }\n | { ok: false; reason: 'missing' | 'multiple' | 'malformed' };\n\nconst LF = 0x0a;\nconst CR = 0x0d;\nconst SP = 0x20;\nconst HTAB = 0x09;\nconst COLON = 0x3a;\nconst FROM_NAME = [0x66, 0x72, 0x6f, 0x6d]; // \"from\"\n\n/**\n * Where the value of the header line `raw[start, end)` begins if the line\n * is named `From` \u2014 the byte after its first `:` \u2014 or -1 if it is not.\n * The name is the bytes before that colon with trailing WSP trimmed,\n * compared case-insensitively; since it has to be exactly `from`, the\n * colon is looked for only across the WSP run that may follow those four\n * bytes, so the check reads at most the name and never searches the line.\n */\nfunction fromValueStart(raw: Uint8Array, start: number, end: number): number {\n if (end - start <= FROM_NAME.length) {\n return -1;\n }\n for (let i = 0; i < FROM_NAME.length; i++) {\n // ASCII case fold: `A`..`Z` \u2192 `a`..`z`. Non-letters fold to themselves.\n if ((raw[start + i] | 0x20) !== FROM_NAME[i]) {\n return -1;\n }\n }\n let colon = start + FROM_NAME.length;\n while (colon < end && (raw[colon] === SP || raw[colon] === HTAB)) {\n colon++;\n }\n return colon < end && raw[colon] === COLON ? colon + 1 : -1;\n}\n\n/** Operator-readable detail for each way the pin can fail to find a sender. */\nconst MIME_FROM_REFUSALS: Record<Extract<MimeFrom, { ok: false }>['reason'], string> = {\n missing: 'the message has no From header',\n multiple: 'the message has more than one From header',\n malformed: 'the From header must hold a single mailbox',\n};\n\nexport function readMimeFromAddrSpec(raw: Uint8Array): MimeFrom {\n const n = raw.byteLength;\n // The `From:` header as offsets into `raw`: its value starts after the\n // colon and ends where the content of its last line ends. `folded` says\n // whether a continuation line extended it, `inFrom` whether the line\n // being visited may.\n let fromCount = 0;\n let valueStart = -1;\n let valueEnd = -1;\n let folded = false;\n let inFrom = false;\n // The next CR at or after `lineStart`. Searched for lazily, each search\n // starting past the previous hit, so finding the bare CR that fails the\n // scan stays linear across a block of CR-less lines.\n let nextCr = raw.indexOf(CR);\n let lineStart = 0;\n while (lineStart < n) {\n const lf = raw.indexOf(LF, lineStart);\n const lineEnd = lf === -1 ? n : lf;\n let contentEnd = lineEnd;\n if (contentEnd > lineStart && raw[contentEnd - 1] === CR) {\n contentEnd--;\n }\n if (contentEnd === lineStart) {\n break; // empty line: end of the header block\n }\n if (nextCr !== -1 && nextCr < lineStart) {\n nextCr = raw.indexOf(CR, lineStart);\n }\n if (nextCr !== -1 && nextCr < contentEnd) {\n return { ok: false, reason: 'malformed' };\n }\n if (raw[lineStart] === SP || raw[lineStart] === HTAB) {\n if (inFrom) {\n valueEnd = contentEnd;\n folded = true;\n }\n } else {\n const start = fromValueStart(raw, lineStart, contentEnd);\n inFrom = start !== -1;\n if (inFrom) {\n fromCount++;\n valueStart = start;\n valueEnd = contentEnd;\n folded = false;\n }\n }\n lineStart = lf === -1 ? n : lf + 1;\n }\n if (fromCount === 0) {\n return { ok: false, reason: 'missing' };\n }\n if (fromCount > 1) {\n return { ok: false, reason: 'multiple' };\n }\n // Unfold (RFC 5322 \u00A72.2.3): the value is the header's byte range with\n // its line breaks removed, each continuation keeping its leading WSP.\n // Every CR still inside the range ends a line \u2014 the scan refused any\n // other \u2014 so dropping CR and LF is the whole job, done in place on one\n // copy of the range. A header that did not fold needs no copy.\n let value = raw.subarray(valueStart, valueEnd);\n if (folded) {\n value = raw.slice(valueStart, valueEnd);\n let kept = 0;\n for (let i = 0; i < value.length; i++) {\n const byte = value[i];\n if (byte !== CR && byte !== LF) {\n value[kept++] = byte;\n }\n }\n value = value.subarray(0, kept);\n }\n const addrSpec = singleMailboxAddrSpec(new TextDecoder().decode(value));\n return addrSpec === null ? { ok: false, reason: 'malformed' } : { ok: true, addrSpec };\n}\n\n/**\n * The addr-spec of a header value that holds exactly one mailbox \u2014 either a\n * bare `addr-spec` or `[phrase] <addr-spec>` \u2014 or `null` when the value is\n * anything else. One pass; quoted-strings (with `\\` escapes) are skipped\n * whole, and their contents are never interpreted.\n */\nfunction singleMailboxAddrSpec(value: string): string | null {\n let inQuotes = false;\n let escaped = false;\n let lt = -1;\n let gt = -1;\n let firstAt = -1;\n for (let i = 0; i < value.length; i++) {\n const ch = value[i];\n if (inQuotes) {\n if (escaped) {\n escaped = false;\n } else if (ch === '\\\\') {\n escaped = true;\n } else if (ch === '\"') {\n inQuotes = false;\n }\n continue;\n }\n switch (ch) {\n case '\"':\n // A quoted-string belongs to the phrase, which ends at `<`.\n if (lt !== -1) {\n return null;\n }\n inQuotes = true;\n break;\n case '<':\n if (lt !== -1) {\n return null;\n }\n lt = i;\n break;\n case '>':\n if (lt === -1 || gt !== -1) {\n return null;\n }\n gt = i;\n break;\n case '@':\n if (firstAt === -1) {\n firstAt = i;\n }\n break;\n case ',':\n case ';':\n case ':':\n case '(':\n case ')':\n case '[':\n case ']':\n case '\\\\':\n return null;\n default:\n break;\n }\n }\n if (inQuotes) {\n return null;\n }\n let addrSpec: string;\n if (lt === -1) {\n addrSpec = value.trim();\n } else {\n // `<` present: it needs its `>`, nothing but WSP may follow, and the\n // phrase before it must not read as an address of its own.\n if (gt === -1 || value.slice(gt + 1).trim().length !== 0) {\n return null;\n }\n if (firstAt !== -1 && firstAt < lt) {\n return null;\n }\n addrSpec = value.slice(lt + 1, gt);\n }\n // One printable-ASCII token. Rules out an empty `<>`, WSP inside the\n // brackets, and a code point that only LOOKS like the sender before the\n // caller lower-cases it for the compare.\n return /^[\\x21-\\x7e]+$/.test(addrSpec) ? addrSpec : null;\n}\n\n/**\n * Outbound email send. The framework runtime POSTs:\n *\n * {\n * projectId, aiToken, // auth (validated by middleware)\n * from, // envelope sender (must be on an Email-Routing-enabled zone)\n * recipients: string[], // unique normalized recipient addresses\n * mimeBase64, // raw MIME, base64-encoded\n * requestId // for logs and default operation identity\n * }\n *\n * The proxy validates and normalizes the request, routes custom senders to\n * `send_raw`, and otherwise asks the API to admit each recipient before using\n * the platform `send_email` binding.\n *\n * The user worker does not have a `send_email` binding.\n */\napp.post('/send', async (context) => {\n const sendDeadline = createEmailProviderDeadline(EMAIL_SEND_DEADLINE_MS);\n const projectId = context.get('projectId');\n const body = context.get('body');\n\n const from = asString(body.from);\n const mimeBase64 = asString(body.mimeBase64);\n // Bounded and sanitized here, once, so `logSend` never interpolates the\n // raw value; see `MAX_REQUEST_ID_LENGTH`.\n const requestIdRaw = asString(body.requestId);\n const requestId =\n requestIdRaw === null ? 'unknown' : sanitizeForLog(requestIdRaw, MAX_REQUEST_ID_LENGTH);\n const callerKey = asString(body.idempotencyKey);\n if (\n callerKey !== null &&\n (callerKey.length === 0 || callerKey.length > 128 || !/^[\\x20-\\x7e]+$/.test(callerKey))\n ) {\n return context.json(\n { ok: false, error: { code: 'INVALID_TO', message: 'invalid idempotency key' } },\n 400,\n );\n }\n const operationKey =\n callerKey ??\n (requestIdRaw && requestIdRaw.length <= 128 && /^[\\x20-\\x7e]+$/.test(requestIdRaw)\n ? requestIdRaw\n : crypto.randomUUID());\n const recipientsRaw = Array.isArray(body.recipients) ? body.recipients : null;\n\n if (!from || !mimeBase64 || !recipientsRaw) {\n return context.json(\n { ok: false, error: { code: 'UPSTREAM_ERROR', message: 'invalid body' } },\n 400,\n );\n }\n\n // Bound the list before the normalization loop below allocates per entry.\n // Answered with the same 413 the MIME size guard uses \u2014 the framework\n // dispatches on `error.code`, not the status, and INVALID_TO is already\n // its code for an unusable recipient set.\n if (recipientsRaw.length > MAX_RECIPIENTS) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_TO',\n message: `too many recipients (max ${MAX_RECIPIENTS}, got ${recipientsRaw.length})`,\n },\n },\n 413,\n );\n }\n\n // Bound the sender before anything copies it \u2014 the lowercase, the strict\n // regex and the refusal that echoes it all sit below. Same 413 as the\n // recipient bound; INVALID_FROM is the framework's code for an unusable\n // sender. The address is deliberately not echoed back.\n if (from.length > MAX_SENDER_LENGTH) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `sender exceeds ${MAX_SENDER_LENGTH} characters`,\n },\n },\n 413,\n );\n }\n\n // Fail closed on missing sender configuration before admission.\n const senderDomain = readSenderDomain(context.env);\n if (!senderDomain) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'UPSTREAM_ERROR',\n message: 'email sender domain is not configured',\n },\n },\n 502,\n );\n }\n\n // Recipients must be unique strings; the framework already dedups but we\n // re-validate so a buggy client cannot create duplicate attempts or logs.\n const recipients: Array<string> = [];\n const seen = new Set<string>();\n for (const r of recipientsRaw) {\n if (typeof r !== 'string') {\n continue;\n }\n // Before `.trim().toLowerCase()` \u2014 that call is the allocation.\n // The address is deliberately not echoed back.\n if (r.length > MAX_RECIPIENT_LENGTH) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_TO',\n message: `recipient exceeds ${MAX_RECIPIENT_LENGTH} characters`,\n },\n },\n 413,\n );\n }\n const lower = r.trim().toLowerCase();\n if (!lower || seen.has(lower)) {\n continue;\n }\n seen.add(lower);\n recipients.push(lower);\n }\n if (recipients.length === 0) {\n return context.json(\n { ok: false, error: { code: 'INVALID_TO', message: 'no recipients' } },\n 200,\n );\n }\n\n // Pre-decode size guard \u2014 base64 expands ~4/3, so a base64 string longer\n // than `MAX_MIME_BYTES * 4 / 3 + 4` (the +4 absorbs padding rounding)\n // can't possibly decode to anything within the limit. Reject before\n // allocating a 75 MB Uint8Array for what we'd reject anyway. Defends\n // against adversarial OOM via outsized payloads.\n if (mimeBase64.length > Math.ceil((MAX_MIME_BYTES * 4) / 3) + 4) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'MIME_ERROR',\n message: `mime exceeds ${MAX_MIME_BYTES} bytes (base64 length ${mimeBase64.length})`,\n },\n },\n 413,\n );\n }\n\n let raw: Uint8Array;\n try {\n raw = base64Decode(mimeBase64);\n } catch {\n return context.json(\n { ok: false, error: { code: 'MIME_ERROR', message: 'invalid base64 mime' } },\n 400,\n );\n }\n // Defense-in-depth: the pre-decode check is conservative (uses base64\n // length), so a small over-by-one slip past it would still trip here.\n if (raw.byteLength > MAX_MIME_BYTES) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'MIME_ERROR',\n message: `mime exceeds ${MAX_MIME_BYTES} bytes (got ${raw.byteLength})`,\n },\n },\n 413,\n );\n }\n if (!customMimeHeaderBytesWithinLimit(raw)) {\n return context.json(\n {\n ok: false,\n error: { code: 'MIME_ERROR', message: 'custom headers exceed the 16 KiB limit' },\n },\n 413,\n );\n }\n\n // A sender outside the shared platform domain uses the custom-domain path.\n const fromAt = from.indexOf('@');\n const fromDomain = fromAt === -1 ? '' : from.slice(fromAt + 1).toLowerCase();\n if (fromDomain !== '' && fromDomain !== senderDomain) {\n return sendViaCustomDomain(\n context,\n projectId,\n from,\n fromDomain,\n senderDomain,\n recipients,\n raw,\n requestId,\n operationKey,\n sendDeadline,\n );\n }\n\n // Custom-domain sends use send_raw and do not depend on this binding.\n // Check the platform binding before shared-domain admission starts.\n const sendBinding = context.env.SEND_EMAIL;\n if (typeof sendBinding?.send !== 'function') {\n return context.json(\n {\n ok: false,\n error: {\n code: 'UPSTREAM_ERROR',\n message: 'email sending is not configured',\n },\n },\n 502,\n );\n }\n\n // Sender ownership is checked against PostgreSQL by the admission service.\n const expectedSlug = from.split('@')[0]?.split('+')[0] ?? '';\n // Lowercase once for the strict regex + slug compare; the regex anchors\n // the whole string and intentionally rejects CR/LF, quotes, brackets,\n // and display-name forms before we touch EmailMessage.\n // The envelope is forwarded verbatim, so validation has to run on bytes that\n // cannot change under case folding. U+212A KELVIN SIGN lowercases to 'k' and\n // U+0130 to 'i', so a non-ASCII `from` can satisfy a lowercased regex and\n // still reach the shared envelope sender intact. Refuse it before that.\n if (!/^[\\x21-\\x7e]+$/.test(from)) {\n return context.json(\n {\n ok: false,\n error: { code: 'INVALID_FROM', message: 'from address must be printable ASCII' },\n },\n 403,\n );\n }\n const fromLower = from.toLowerCase();\n if (!strictFromRe(senderDomain).test(fromLower)) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `from address must be <${expectedSlug}>[+tag]@${senderDomain}`,\n },\n },\n 200,\n );\n }\n const fromLocal = fromLower.slice(0, fromLower.indexOf('@'));\n const localPrefix = fromLocal.split('+')[0] ?? '';\n if (localPrefix !== expectedSlug.toLowerCase()) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `from address must be <${expectedSlug}>[+tag]@${senderDomain}`,\n },\n },\n 200,\n );\n }\n\n // The envelope is pinned; now pin what the recipient will actually SEE.\n // A mismatch here is a request the framework never produces \u2014 `buildMime`\n // renders `From:` from the same `from.email` it posts as the envelope \u2014 so\n // it is refused outright rather than reported per recipient. Runs before\n // the admission call for the same reason as the slug pin. The refusal may\n // echo `from`: it is at most `MAX_SENDER_LENGTH` printable-ASCII bytes by\n // now.\n const mimeFrom = readMimeFromAddrSpec(raw);\n if (!mimeFrom.ok || mimeFrom.addrSpec.toLowerCase() !== fromLower) {\n const detail = mimeFrom.ok\n ? 'the From header address does not match the envelope sender'\n : MIME_FROM_REFUSALS[mimeFrom.reason];\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `mime From must be the envelope sender ${from}: ${detail}`,\n },\n },\n 403,\n );\n }\n\n // The API transaction is authoritative for project state, sender identity,\n // recipient consent, suspension, and attempt quotas.\n let admission;\n try {\n admission = await admitEmail(\n context.env,\n {\n projectId,\n kind: 'direct',\n key: operationKey,\n digest: await emailPayloadDigest('direct', from, recipients, raw),\n from,\n recipients,\n transport: 'binding',\n },\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n } catch (error) {\n const conflict = error instanceof Error && error.message === 'IDEMPOTENCY_CONFLICT';\n return context.json(\n {\n ok: false,\n error: {\n code: conflict ? 'IDEMPOTENCY_CONFLICT' : 'UPSTREAM_ERROR',\n message: conflict\n ? 'idempotency key has different content'\n : 'email admission unavailable',\n },\n },\n conflict ? 409 : 503,\n );\n }\n const deliveries: Array<RecipientResult> = admission.recipients\n .filter((r) => r.state !== 'reserved')\n .map((r) => ({\n recipient: r.recipient,\n ok: r.state === 'provider_accepted',\n state: r.state,\n messageId: r.providerReference ?? undefined,\n error:\n r.state === 'provider_accepted'\n ? undefined\n : {\n code:\n r.errorCode ??\n (r.state === 'outcome_unknown' || r.state === 'attempt_started'\n ? 'OUTCOME_UNKNOWN'\n : r.state === 'cancelled'\n ? 'UPSTREAM_ERROR'\n : 'UNVERIFIED_DESTINATION'),\n message:\n r.state === 'outcome_unknown' || r.state === 'attempt_started'\n ? 'provider outcome unknown; inspect email logs before retrying'\n : r.state === 'cancelled'\n ? 'email attempt was cancelled before provider submission'\n : 'recipient was not admitted',\n },\n }));\n if (admission.replay) {\n for (const row of admission.recipients.filter((r) => r.state === 'reserved')) {\n deliveries.push({\n recipient: row.recipient,\n ok: false,\n state: 'reserved',\n error: {\n code: 'OUTCOME_UNKNOWN',\n message: 'email action remains reserved; inspect email logs before retrying',\n },\n });\n }\n return emailActionResponse(context, admission.operationId, deliveries);\n }\n const allowed = admission.recipients\n .filter((r) => r.state === 'reserved')\n .map((r) => r.recipient);\n // Send fan-out. CF's `send_email` binding takes one recipient per\n // EmailMessage \u2014 we already split by recipient above.\n for (let index = 0; index < allowed.length; index++) {\n const r = allowed[index];\n if (sendDeadline.expired(EMAIL_SEND_FINALIZATION_MARGIN_MS)) {\n const unstarted = allowed.slice(index);\n const cancelled = await cancelUnstartedRecipients(\n context.env,\n admission.operationId,\n unstarted,\n sendDeadline.remainingMs(),\n );\n for (const recipient of unstarted) {\n deliveries.push({\n recipient,\n ok: false,\n state: cancelled ? 'cancelled' : 'outcome_unknown',\n error: cancelled\n ? {\n code: 'UPSTREAM_ERROR',\n message: 'email batch deadline elapsed before provider submission',\n }\n : { code: 'OUTCOME_UNKNOWN', message: 'could not cancel unstarted email attempt' },\n });\n }\n break;\n }\n try {\n await startEmailAttempt(\n context.env,\n admission.operationId,\n [r],\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n } catch {\n const cancelled = await cancelUnstartedRecipients(\n context.env,\n admission.operationId,\n [r],\n sendDeadline.remainingMs(),\n );\n deliveries.push({\n recipient: r,\n ok: false,\n state: cancelled ? 'cancelled' : 'outcome_unknown',\n error: cancelled\n ? {\n code: 'UPSTREAM_ERROR',\n message: 'email attempt did not start; reservation cancelled',\n }\n : { code: 'OUTCOME_UNKNOWN', message: 'could not confirm email attempt status' },\n });\n continue;\n }\n try {\n // EmailMessage accepts string | ReadableStream \u2014 wrap our buffered\n // bytes as a single-chunk stream. We can't reuse one stream across\n // recipients because streams are one-shot, so build per send.\n const msg = new EmailMessage(from, r, bytesToStream(raw));\n // Some CF builds don't return the messageId; we surface \"\" rather\n // than crash and let the framework decide whether to fall back.\n const result = await sendDeadline.run(\n () => sendBinding.send(msg),\n EMAIL_SEND_FINALIZATION_MARGIN_MS,\n );\n const providerReference = typeof result?.messageId === 'string' ? result.messageId : '';\n try {\n await finishEmailAttempt(\n context.env,\n admission.operationId,\n [r],\n 'provider_accepted',\n { providerReference },\n sendDeadline.remainingMs(),\n );\n } catch {\n deliveries.push({\n recipient: r,\n ok: false,\n state: 'outcome_unknown',\n error: {\n code: 'OUTCOME_UNKNOWN',\n message: 'provider accepted email but outcome could not be recorded',\n },\n });\n continue;\n }\n deliveries.push({\n recipient: r,\n ok: true,\n state: 'provider_accepted',\n messageId: providerReference,\n });\n } catch {\n try {\n await finishEmailAttempt(\n context.env,\n admission.operationId,\n [r],\n 'outcome_unknown',\n { errorCode: 'OUTCOME_UNKNOWN' },\n sendDeadline.remainingMs(),\n );\n } catch {\n /* persisted attempt_started remains unresolved */\n }\n deliveries.push({\n recipient: r,\n ok: false,\n state: 'outcome_unknown',\n error: {\n code: 'OUTCOME_UNKNOWN',\n message: 'provider outcome unknown; inspect email logs before retrying',\n },\n });\n }\n }\n\n // Record the per-recipient outcome.\n logSend(projectId, requestId, deliveries);\n\n // Return each outcome; an unknown provider result must be inspected before retry.\n const anyFailed = deliveries.some((d) => !d.ok);\n if (anyFailed) {\n return context.json({ ok: false, operationId: admission.operationId, deliveries }, 200);\n }\n return context.json({\n ok: true,\n operationId: admission.operationId,\n ids: deliveries.map((d) => ({\n recipient: d.recipient,\n messageId: (d as { messageId: string }).messageId,\n state: 'provider_accepted',\n })),\n });\n});\n\n// -----------------------------------------------------------------------------\n// Custom sender domains.\n// -----------------------------------------------------------------------------\n\n/**\n * The Email Sending REST `send_raw` result. snake_case \u2014 the REST schema\n * names the id `message_id`, unlike the `send_email` binding's camelCase\n * `messageId`. Cloudflare returns every recipient in\n * exactly one required list: `delivered` and `queued` are accepted;\n * `permanent_bounces` and `suppressed_recipients` are permanent failures.\n */\nexport interface SendRawResult {\n delivered?: unknown;\n message_id?: unknown;\n permanent_bounces?: unknown;\n queued?: unknown;\n suppressed_recipients?: unknown;\n}\n\nexport interface ParsedSendRawResult {\n delivered: ReadonlySet<string>;\n messageId: string;\n permanentBounces: ReadonlySet<string>;\n queued: ReadonlySet<string>;\n suppressedRecipients: ReadonlySet<string>;\n}\n\nexport type SendRawRecipientOutcome =\n | 'provider_accepted'\n | 'permanent_bounce'\n | 'suppressed'\n | 'outcome_unknown';\n\ntype SendRawHttpResponse = { ok: true; data: unknown } | { ok: false; status: number };\n\nconst MAX_SEND_RAW_RESPONSE_BYTES = 64 * 1024;\n\n/** Submit once and read the provider response within one absolute deadline. */\nexport async function requestSendRaw(\n input: {\n accountId: string;\n bearer: string;\n from: string;\n recipients: Array<string>;\n mimeMessage: string;\n },\n deadlineMs = EMAIL_PROVIDER_DEADLINE_MS,\n): Promise<SendRawHttpResponse> {\n const controller = new AbortController();\n const deadline = Date.now() + Math.min(EMAIL_PROVIDER_DEADLINE_MS, deadlineMs);\n const requestBody = JSON.stringify({\n from: input.from,\n recipients: input.recipients,\n mime_message: input.mimeMessage,\n });\n const beforeDeadline = async <T>(run: () => Promise<T>): Promise<T> => {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n controller.abort();\n throw new Error('email sending request timed out');\n }\n const promise = run();\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('email sending request timed out'));\n }, remaining);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n };\n const response = await beforeDeadline(() =>\n fetch(\n `https://api.cloudflare.com/client/v4/accounts/${input.accountId}/email/sending/send_raw`,\n {\n method: 'POST',\n headers: {\n authorization: `Bearer ${input.bearer}`,\n 'content-type': 'application/json',\n },\n body: requestBody,\n signal: controller.signal,\n },\n ),\n );\n if (!response.ok) {\n void response.body?.cancel().catch(() => {});\n return { ok: false, status: response.status };\n }\n const declared = response.headers.get('content-length');\n if (\n declared !== null &&\n (!/^\\d+$/.test(declared) || Number(declared) > MAX_SEND_RAW_RESPONSE_BYTES)\n ) {\n void response.body?.cancel().catch(() => {});\n throw new Error('email sending API response too large');\n }\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('email sending API response unreadable');\n }\n const bytes = new Uint8Array(MAX_SEND_RAW_RESPONSE_BYTES);\n let size = 0;\n try {\n for (;;) {\n const chunk = await beforeDeadline(() => reader.read());\n if (chunk.done) {\n break;\n }\n if (size + chunk.value.byteLength > bytes.byteLength) {\n throw new Error('email sending API response too large');\n }\n bytes.set(chunk.value, size);\n size += chunk.value.byteLength;\n }\n if (declared !== null && size !== Number(declared)) {\n throw new Error('email sending API response length mismatch');\n }\n return {\n ok: true,\n data: JSON.parse(\n new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(bytes.subarray(0, size)),\n ) as unknown,\n };\n } finally {\n void reader.cancel().catch(() => {});\n try {\n reader.releaseLock();\n } catch {\n // A timed-out read may still be settling after cancellation.\n }\n }\n}\n\n/** Read one required send_raw address list without discarding schema violations. */\nfunction readSendRawAddressList(value: unknown): Set<string> | null {\n if (!Array.isArray(value)) {\n return null;\n }\n const out = new Set<string>();\n for (const entry of value) {\n if (typeof entry !== 'string') {\n return null;\n }\n out.add(entry.toLowerCase());\n }\n return out;\n}\n\n/**\n * Parse the documented send_raw result shape. Every recipient is classified by\n * exactly one of four required lists; accepting a partial response would turn\n * missing provider evidence into a false success.\n */\nexport function parseSendRawResult(value: unknown): ParsedSendRawResult | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n const result = value as SendRawResult;\n const delivered = readSendRawAddressList(result.delivered);\n const permanentBounces = readSendRawAddressList(result.permanent_bounces);\n const queued = readSendRawAddressList(result.queued);\n const suppressedRecipients = readSendRawAddressList(result.suppressed_recipients);\n if (\n !delivered ||\n !permanentBounces ||\n !queued ||\n !suppressedRecipients ||\n typeof result.message_id !== 'string' ||\n result.message_id === ''\n ) {\n return null;\n }\n return {\n delivered,\n messageId: result.message_id,\n permanentBounces,\n queued,\n suppressedRecipients,\n };\n}\n\n/** Require exactly one provider classification for the requested recipient. */\nexport function classifySendRawRecipient(\n result: ParsedSendRawResult,\n recipient: string,\n): SendRawRecipientOutcome {\n const target = recipient.toLowerCase();\n const classifications = [\n result.delivered.has(target),\n result.queued.has(target),\n result.permanentBounces.has(target),\n result.suppressedRecipients.has(target),\n ];\n if (classifications.filter(Boolean).length !== 1) {\n return 'outcome_unknown';\n }\n if (classifications[0] || classifications[1]) {\n return 'provider_accepted';\n }\n return classifications[2] ? 'permanent_bounce' : 'suppressed';\n}\n\n/** Send through the customer's Cloudflare account after project-bound admission. */\nasync function sendViaCustomDomain(\n context: Context<ProxyEnv>,\n projectId: string,\n from: string,\n fromDomain: string,\n senderDomain: string,\n recipients: Array<string>,\n raw: Uint8Array,\n requestId: string,\n operationKey: string,\n sendDeadline: EmailProviderDeadline,\n): Promise<Response> {\n // The envelope is forwarded verbatim to the customer's account, so the\n // printable-ASCII guard runs here for the same reason as on the shared\n // path (case folding must not change the bytes downstream sees).\n if (!/^[\\x21-\\x7e]+$/.test(from)) {\n return context.json(\n {\n ok: false,\n error: { code: 'INVALID_FROM', message: 'from address must be printable ASCII' },\n },\n 403,\n );\n }\n const fromLower = from.toLowerCase();\n\n // The MIME From address must match the envelope sender before admission.\n const mimeFrom = readMimeFromAddrSpec(raw);\n if (!mimeFrom.ok || mimeFrom.addrSpec.toLowerCase() !== fromLower) {\n const detail = mimeFrom.ok\n ? 'the From header address does not match the envelope sender'\n : MIME_FROM_REFUSALS[mimeFrom.reason];\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `mime From must be the envelope sender ${from}: ${detail}`,\n },\n },\n 403,\n );\n }\n\n // send_raw carries the MIME as a JSON string. Decode FATALLY: the\n // framework's builder emits 7-bit-clean MIME, and a body that is not\n // valid UTF-8 would be silently altered by a lenient decode \u2014 refuse it\n // instead. Local validation runs before admission.\n let mimeMessage: string;\n try {\n mimeMessage = new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(raw);\n } catch {\n return context.json(\n { ok: false, error: { code: 'MIME_ERROR', message: 'mime must be valid UTF-8' } },\n 400,\n );\n }\n\n let admission;\n try {\n admission = await admitEmail(\n context.env,\n {\n projectId,\n kind: 'direct',\n key: operationKey,\n digest: await emailPayloadDigest('direct', from, recipients, raw),\n from,\n recipients,\n transport: 'send_raw',\n },\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n } catch (error) {\n const conflict = error instanceof Error && error.message === 'IDEMPOTENCY_CONFLICT';\n return context.json(\n {\n ok: false,\n error: {\n code: conflict ? 'IDEMPOTENCY_CONFLICT' : 'UPSTREAM_ERROR',\n message: conflict\n ? 'idempotency key has different content'\n : 'email admission unavailable',\n },\n },\n conflict ? 409 : 503,\n );\n }\n const deliveries: Array<RecipientResult> = admission.recipients\n .filter((r) => r.state !== 'reserved')\n .map((r) => ({\n recipient: r.recipient,\n ok: r.state === 'provider_accepted',\n state: r.state,\n messageId: r.providerReference ?? undefined,\n error:\n r.state === 'provider_accepted'\n ? undefined\n : {\n code:\n r.errorCode ??\n (r.state === 'outcome_unknown' || r.state === 'attempt_started'\n ? 'OUTCOME_UNKNOWN'\n : r.state === 'cancelled'\n ? 'UPSTREAM_ERROR'\n : 'UNVERIFIED_DESTINATION'),\n message:\n r.state === 'outcome_unknown' || r.state === 'attempt_started'\n ? 'provider outcome unknown; inspect email logs before retrying'\n : r.state === 'cancelled'\n ? 'email attempt was cancelled before provider submission'\n : 'recipient was not admitted',\n },\n }));\n if (admission.replay) {\n for (const row of admission.recipients.filter((r) => r.state === 'reserved')) {\n deliveries.push({\n recipient: row.recipient,\n ok: false,\n state: 'reserved',\n error: {\n code: 'OUTCOME_UNKNOWN',\n message: 'email action remains reserved; inspect email logs before retrying',\n },\n });\n }\n return emailActionResponse(context, admission.operationId, deliveries);\n }\n recipients = admission.recipients.filter((r) => r.state === 'reserved').map((r) => r.recipient);\n if (recipients.length === 0) {\n return emailActionResponse(context, admission.operationId, deliveries);\n }\n // A duplicate must return its durable outcome even if the credential was\n // subsequently revoked. Fresh attempts lease only after admission, then\n // cancel reservations if there can be no provider submission.\n const lease = await leaseEmailDomainCredential(\n context.env,\n fromDomain,\n projectId,\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n if (!lease) {\n await finishEmailAttempt(\n context.env,\n admission.operationId,\n recipients,\n 'cancelled',\n {},\n sendDeadline.remainingMs(),\n ).catch(() => {});\n return context.json(\n {\n ok: false,\n operationId: admission.operationId,\n error: { code: 'UPSTREAM_ERROR', message: 'could not lease the domain credential' },\n },\n 502,\n );\n }\n if (admission.accountId !== lease.accountId) {\n await finishEmailAttempt(\n context.env,\n admission.operationId,\n recipients,\n 'cancelled',\n {},\n sendDeadline.remainingMs(),\n ).catch(() => {});\n return context.json(\n {\n ok: false,\n operationId: admission.operationId,\n error: { code: 'UPSTREAM_ERROR', message: 'email domain changed during admission' },\n },\n 503,\n );\n }\n try {\n await startEmailAttempt(\n context.env,\n admission.operationId,\n recipients,\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n } catch {\n const cancelled = await cancelUnstartedRecipients(\n context.env,\n admission.operationId,\n recipients,\n sendDeadline.remainingMs(),\n );\n for (const recipient of recipients) {\n deliveries.push({\n recipient,\n ok: false,\n state: cancelled ? 'cancelled' : 'outcome_unknown',\n error: cancelled\n ? {\n code: 'UPSTREAM_ERROR',\n message: 'email attempt did not start; reservation cancelled',\n }\n : { code: 'OUTCOME_UNKNOWN', message: 'could not confirm email attempt status' },\n });\n }\n return emailActionResponse(context, admission.operationId, deliveries);\n }\n\n // One REST call carries every recipient \u2014 unlike the platform binding's\n // one EmailMessage per recipient. The response's message id is shared by\n // the whole list.\n let failure: { code: string; message: string } | null = null;\n let failureState: 'failed' | 'outcome_unknown' = 'failed';\n let sendRawResult: ParsedSendRawResult | null = null;\n let providerResponse: SendRawHttpResponse | null = null;\n try {\n providerResponse = await requestSendRaw(\n {\n accountId: lease.accountId,\n bearer: leaseBearer(lease),\n from,\n recipients,\n mimeMessage,\n },\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n } catch {\n failure = { code: 'UPSTREAM_ERROR', message: 'email sending request failed' };\n failureState = 'outcome_unknown';\n }\n if (providerResponse) {\n if (!providerResponse.ok) {\n // A fresh credential is leased for every attempt. Provider error\n // bodies are not echoed or logged.\n failure = {\n code: providerResponse.status === 429 ? 'QUOTA_EXCEEDED' : 'UPSTREAM_ERROR',\n message: `email sending API returned ${providerResponse.status}`,\n };\n failureState =\n providerResponse.status >= 500 || providerResponse.status === 408\n ? 'outcome_unknown'\n : 'failed';\n } else {\n const data = providerResponse.data;\n const success =\n typeof data === 'object' && data !== null\n ? (data as { success?: unknown }).success\n : undefined;\n if (success === false) {\n failure = { code: 'UPSTREAM_ERROR', message: 'email sending API refused the message' };\n } else if (success !== true) {\n failure = { code: 'OUTCOME_UNKNOWN', message: 'email sending API response invalid' };\n failureState = 'outcome_unknown';\n } else {\n sendRawResult = parseSendRawResult((data as { result?: unknown }).result);\n if (!sendRawResult) {\n failure = { code: 'OUTCOME_UNKNOWN', message: 'email sending API response invalid' };\n failureState = 'outcome_unknown';\n }\n }\n }\n }\n\n for (const r of recipients) {\n if (failure) {\n deliveries.push({ recipient: r, ok: false, state: failureState, error: failure });\n continue;\n }\n const outcome = classifySendRawRecipient(sendRawResult!, r);\n if (outcome === 'permanent_bounce') {\n deliveries.push({\n recipient: r,\n ok: false,\n state: 'failed',\n error: {\n code: 'UNVERIFIED_DESTINATION',\n message: `recipient '${r}' permanently bounced`,\n },\n });\n } else if (outcome === 'suppressed') {\n deliveries.push({\n recipient: r,\n ok: false,\n state: 'failed',\n error: {\n code: 'UNVERIFIED_DESTINATION',\n message: `recipient '${r}' is on the suppression list`,\n },\n });\n } else if (outcome === 'outcome_unknown') {\n deliveries.push({\n recipient: r,\n ok: false,\n state: 'outcome_unknown',\n error: {\n code: 'OUTCOME_UNKNOWN',\n message: 'email sending API did not classify the recipient',\n },\n });\n } else {\n deliveries.push({\n recipient: r,\n ok: true,\n state: 'provider_accepted',\n messageId: sendRawResult!.messageId,\n });\n }\n }\n\n for (const delivery of deliveries.filter((d) =>\n admission.recipients.some((r) => r.recipient === d.recipient && r.state === 'reserved'),\n )) {\n try {\n await finishEmailAttempt(\n context.env,\n admission.operationId,\n [delivery.recipient],\n delivery.ok\n ? 'provider_accepted'\n : delivery.state === 'outcome_unknown'\n ? 'outcome_unknown'\n : 'failed',\n {\n providerReference: delivery.messageId,\n errorCode: delivery.ok\n ? undefined\n : delivery.state === 'outcome_unknown'\n ? 'OUTCOME_UNKNOWN'\n : (failure?.code ?? delivery.error?.code),\n },\n sendDeadline.remainingMs(),\n );\n delivery.state = delivery.ok\n ? 'provider_accepted'\n : delivery.state === 'outcome_unknown'\n ? 'outcome_unknown'\n : 'failed';\n if (delivery.state === 'outcome_unknown' && !delivery.ok) {\n delivery.error = {\n code: 'OUTCOME_UNKNOWN',\n message: 'provider outcome unknown; inspect email logs before retrying',\n };\n }\n } catch {\n delivery.ok = false;\n delivery.state = 'outcome_unknown';\n delivery.error = {\n code: 'OUTCOME_UNKNOWN',\n message: 'provider outcome could not be recorded',\n };\n }\n }\n logSend(projectId, requestId, deliveries);\n\n // Same mid-batch contract as the shared path: any per-recipient failure\n // (bounce, suppression, or a whole-call failure) answers ok:false with\n // the complete per-recipient evidence needed for a safe retry decision.\n if (deliveries.some((d) => !d.ok)) {\n return context.json({ ok: false, operationId: admission.operationId, deliveries }, 200);\n }\n return context.json({\n ok: true,\n operationId: admission.operationId,\n ids: deliveries.map((d) => ({\n recipient: d.recipient,\n messageId: (d as { messageId: string }).messageId,\n state: 'provider_accepted' as const,\n })),\n });\n}\n\n// -----------------------------------------------------------------------------\n// Inbound delivery log \u2014 kept here because it's invoked from email-router.ts\n// inside the same worker (bypasses HTTP/auth).\n// -----------------------------------------------------------------------------\n\n/**\n * Inbound delivery log. Inlined here rather than via service binding because\n * the email-router lives in this same worker; routing through env.API would\n * 404 (and earlier did so silently).\n */\nexport async function recordInboundDelivery(\n projectId: string,\n info: { from: string; to: string; byteSize: number; status: string },\n): Promise<void> {\n console.log(\n `[email-recv] ${projectId} ${sanitizeForLog(info.from, 320)} -> ${sanitizeForLog(info.to, 320)} ${info.status} (${info.byteSize}B) @${Date.now()}`,\n );\n}\n\n// -----------------------------------------------------------------------------\n// Helpers\n// -----------------------------------------------------------------------------\n\ninterface RecipientResult {\n recipient: string;\n ok: boolean;\n state?: string;\n messageId?: string;\n error?: { code: string; message: string };\n}\n\n/**\n * A failed start response is ambiguous: its transaction may or may not have\n * committed. Cancellation is the safe discriminator because the API accepts\n * it only from `reserved`; a committed `attempt_started` transition conflicts.\n */\nasync function cancelUnstartedRecipients(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n operationId: string,\n recipients: Array<string>,\n deadlineMs?: number,\n): Promise<boolean> {\n try {\n const result = await finishEmailAttempt(\n env,\n operationId,\n recipients,\n 'cancelled',\n {},\n deadlineMs,\n );\n return recipients.every((recipient) =>\n result.recipients.some((row) => row.recipient === recipient && row.state === 'cancelled'),\n );\n } catch {\n return false;\n }\n}\n\nfunction emailActionResponse(\n context: Context<ProxyEnv>,\n operationId: string,\n deliveries: Array<RecipientResult>,\n) {\n if (deliveries.length === 0) {\n return context.json(\n {\n ok: false,\n operationId,\n error: { code: 'OUTCOME_UNKNOWN', message: 'email action remains reserved' },\n },\n 200,\n );\n }\n if (deliveries.some((d) => !d.ok)) {\n return context.json({ ok: false, operationId, deliveries }, 200);\n }\n return context.json(\n {\n ok: true,\n operationId,\n ids: deliveries.map((d) => ({\n recipient: d.recipient,\n messageId: d.messageId ?? '',\n state: d.state,\n })),\n },\n 200,\n );\n}\n\nfunction logSend(projectId: string, requestId: string, deliveries: Array<RecipientResult>): void {\n for (const d of deliveries) {\n const status = d.ok ? 'sent' : (d.error?.code ?? 'unknown_error');\n const id = d.messageId ?? '';\n console.log(\n `[email-log] ${projectId} ${requestId} ${sanitizeForLog(d.recipient, 320)} ${status} ${id} @${Date.now()}`,\n );\n }\n}\n\nfunction base64Decode(b64: string): Uint8Array {\n // workerd `atob` is fast for body-sized payloads; fall back to manual\n // decode only when needed.\n const binary = atob(b64);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n out[i] = binary.charCodeAt(i);\n }\n return out;\n}\n\nexport { app as email };\n", "import type { Env } from './types.ts';\n\nexport type ActionRecipient = {\n recipient: string;\n state:\n | 'rejected'\n | 'reserved'\n | 'attempt_started'\n | 'provider_accepted'\n | 'failed'\n | 'outcome_unknown'\n | 'cancelled';\n errorCode: string | null;\n providerReference: string | null;\n};\nexport type Admission = {\n operationId: string;\n replay: boolean;\n recipients: Array<ActionRecipient>;\n accountId?: string;\n};\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst EMAIL_DEFAULT_DEADLINE_MS = 5_000;\nconst EMAIL_ACTION_DEADLINE_MS = 15_000;\nconst EMAIL_ADMISSION_DEADLINE_MS = 15_000;\nconst MAX_ADMISSION_RESPONSE_BYTES = 65_536;\n\nasync function sign(data: string, secret: string): Promise<string> {\n if (!secret) {\n throw new Error('Email signing key is not configured');\n }\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const bytes = new Uint8Array(await crypto.subtle.sign('HMAC', key, encoder.encode(data)));\n return btoa(String.fromCharCode(...bytes))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\nasync function call<T>(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n path: string,\n body: unknown,\n deadlineMs = EMAIL_DEFAULT_DEADLINE_MS,\n): Promise<T> {\n const controller = new AbortController();\n const deadline = Date.now() + deadlineMs;\n const beforeDeadline = async <U>(run: () => Promise<U>): Promise<U> => {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n controller.abort();\n throw new Error('EMAIL_ADMISSION_TIMEOUT');\n }\n const promise = run();\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('EMAIL_ADMISSION_TIMEOUT'));\n }, remaining);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n };\n const raw = JSON.stringify(body);\n const proof = await sign(raw, env.EMAIL_SIGNING_SECRET);\n const response = await beforeDeadline(() =>\n env.API.fetch(`https://api/internal/email/actions${path}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': proof,\n },\n body: raw,\n signal: controller.signal,\n }),\n );\n if (!response.ok) {\n void response.body?.cancel().catch(() => {});\n if (response.status === 409) {\n throw new Error('IDEMPOTENCY_CONFLICT');\n }\n throw new Error(`EMAIL_ADMISSION_${response.status}`);\n }\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('EMAIL_ADMISSION_EMPTY_RESPONSE');\n }\n const bytes = new Uint8Array(MAX_ADMISSION_RESPONSE_BYTES);\n let size = 0;\n try {\n for (;;) {\n const chunk = await beforeDeadline(() => reader.read());\n if (chunk.done) {\n break;\n }\n if (size + chunk.value.byteLength > bytes.length) {\n throw new Error('EMAIL_ADMISSION_RESPONSE_TOO_LARGE');\n }\n bytes.set(chunk.value, size);\n size += chunk.value.byteLength;\n }\n return JSON.parse(decoder.decode(bytes.subarray(0, size))) as T;\n } finally {\n void reader.cancel().catch(() => {});\n try {\n reader.releaseLock();\n } catch {\n // A timed-out read may still be settling after cancellation.\n }\n }\n}\n\nexport type RelayedReceiptIdentity = {\n receiptId: string;\n projectId: string;\n payloadDigest: string;\n route?: ReceiptRouteFence;\n};\n\nexport type ReceiptRouteFence = {\n routeId: string;\n routeGeneration: number;\n connectionId: string;\n addressing: 'shared' | 'custom';\n domain: string;\n projectSlug: string;\n};\n\nexport function claimRelayedReceipt(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n identity: RelayedReceiptIdentity,\n): Promise<{ state: 'claimed' | 'in_progress' | 'completed'; reject?: boolean }> {\n return call(env, '/receipts/claim', identity);\n}\n\nexport function completeRelayedReceipt(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n identity: RelayedReceiptIdentity,\n reject: boolean,\n): Promise<{ ok: true }> {\n return call(env, '/receipts/complete', {\n receiptId: identity.receiptId,\n projectId: identity.projectId,\n payloadDigest: identity.payloadDigest,\n reject,\n });\n}\n\n/** Only generated, transport-irrelevant MIME fields are normalized. Body text stays byte-sensitive. */\nexport function canonicalizeVoidMime(raw: Uint8Array): Uint8Array {\n if (findCrlfCrlf(raw) === -1) {\n return raw;\n }\n const boundaries = new Map<string, string>();\n const output: Array<Uint8Array> = [];\n let outputBytes = 0;\n let copyStart = 0;\n let changed = false;\n let inHeaders = true;\n let topHeaders = true;\n\n const append = (bytes: Uint8Array): void => {\n if (bytes.byteLength === 0) {\n return;\n }\n output.push(bytes);\n outputBytes += bytes.byteLength;\n };\n const replace = (start: number, end: number, replacement: Uint8Array): void => {\n append(raw.subarray(copyStart, start));\n append(replacement);\n copyStart = end;\n changed = true;\n };\n\n let lineStart = 0;\n while (lineStart < raw.byteLength) {\n const lineEnd = findCrlf(raw, lineStart);\n const nextLine = lineEnd === raw.byteLength ? raw.byteLength : lineEnd + 2;\n if (inHeaders) {\n if (lineEnd === lineStart) {\n inHeaders = false;\n topHeaders = false;\n } else if (\n topHeaders &&\n (asciiPrefixEquals(raw, lineStart, lineEnd, 'Date: ') ||\n asciiPrefixEquals(raw, lineStart, lineEnd, 'Message-ID: '))\n ) {\n // Remove the generated field and its CRLF. The next header (or the\n // terminating empty line) remains byte-for-byte unchanged.\n replace(lineStart, nextLine, new Uint8Array());\n } else if (isMultipartContentType(raw, lineStart, lineEnd)) {\n const line = decoder.decode(raw.subarray(lineStart, lineEnd));\n const normalized = line.replace(\n /boundary=\"(=_void_(?:mixed|alternative|related)_[A-Za-z0-9_-]+)\"/g,\n (_, token: string) => {\n let marker = boundaries.get(token);\n if (!marker) {\n marker = `<void-boundary-${boundaries.size}>`;\n boundaries.set(token, marker);\n }\n return `boundary=\"${marker}\"`;\n },\n );\n if (normalized !== line) {\n replace(lineStart, lineEnd, encoder.encode(normalized));\n }\n }\n } else if (raw[lineStart] === 45 && raw[lineStart + 1] === 45) {\n const tokenStart = lineStart + 2;\n const token = isBoundaryToken(raw, tokenStart, lineEnd)\n ? decoder.decode(raw.subarray(tokenStart, lineEnd))\n : undefined;\n const openingMarker = token === undefined ? undefined : boundaries.get(token);\n if (openingMarker !== undefined) {\n replace(lineStart, lineEnd, encoder.encode(`--${openingMarker}`));\n inHeaders = true;\n } else if (\n lineEnd - tokenStart >= 2 &&\n raw[lineEnd - 2] === 45 &&\n raw[lineEnd - 1] === 45 &&\n isBoundaryToken(raw, tokenStart, lineEnd - 2)\n ) {\n const closingToken = decoder.decode(raw.subarray(tokenStart, lineEnd - 2));\n const closingMarker = boundaries.get(closingToken);\n if (closingMarker !== undefined) {\n replace(lineStart, lineEnd, encoder.encode(`--${closingMarker}--`));\n }\n }\n }\n lineStart = nextLine;\n }\n\n if (!changed) {\n return raw;\n }\n append(raw.subarray(copyStart));\n const normalized = new Uint8Array(outputBytes);\n let offset = 0;\n for (const chunk of output) {\n normalized.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return normalized;\n}\n\nfunction findCrlfCrlf(raw: Uint8Array): number {\n for (let i = 0; i + 3 < raw.byteLength; i++) {\n if (raw[i] === 13 && raw[i + 1] === 10 && raw[i + 2] === 13 && raw[i + 3] === 10) {\n return i;\n }\n }\n return -1;\n}\n\nfunction findCrlf(raw: Uint8Array, start: number): number {\n let cursor = start;\n while (cursor < raw.byteLength) {\n const cr = raw.indexOf(13, cursor);\n if (cr === -1) {\n return raw.byteLength;\n }\n if (raw[cr + 1] === 10) {\n return cr;\n }\n cursor = cr + 1;\n }\n return raw.byteLength;\n}\n\nfunction asciiPrefixEquals(raw: Uint8Array, start: number, end: number, expected: string): boolean {\n if (end - start < expected.length) {\n return false;\n }\n for (let i = 0; i < expected.length; i++) {\n const actual = raw[start + i];\n const wanted = expected.charCodeAt(i);\n if ((actual >= 65 && actual <= 90 ? actual + 32 : actual) !== (wanted | 32)) {\n return false;\n }\n }\n return true;\n}\n\nfunction isMultipartContentType(raw: Uint8Array, start: number, end: number): boolean {\n const field = 'Content-Type:';\n if (!asciiPrefixEquals(raw, start, end, field)) {\n return false;\n }\n let cursor = start + field.length;\n while (\n cursor < end &&\n (raw[cursor] === 32 || raw[cursor] === 9 || raw[cursor] === 11 || raw[cursor] === 12)\n ) {\n cursor++;\n }\n return asciiPrefixEquals(raw, cursor, end, 'multipart/');\n}\n\nfunction isBoundaryToken(raw: Uint8Array, start: number, end: number): boolean {\n if (end <= start) {\n return false;\n }\n for (let i = start; i < end; i++) {\n const byte = raw[i];\n if (\n !(\n (byte >= 65 && byte <= 90) ||\n (byte >= 97 && byte <= 122) ||\n (byte >= 48 && byte <= 57) ||\n byte === 95 ||\n byte === 45 ||\n byte === 61\n )\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport async function emailPayloadDigest(\n kind: string,\n from: string,\n recipients: Array<string>,\n raw: Uint8Array,\n): Promise<string> {\n const canonical = canonicalizeVoidMime(raw);\n const prefix = encoder.encode(\n JSON.stringify({\n kind,\n from: from.toLowerCase(),\n recipients: [...new Set(recipients.map((r) => r.toLowerCase()))].sort(),\n }),\n );\n const input = new Uint8Array(prefix.length + 1 + canonical.length);\n input.set(prefix);\n input[prefix.length] = 0;\n input.set(canonical, prefix.length + 1);\n return [...new Uint8Array(await crypto.subtle.digest('SHA-256', input))]\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nexport function admitEmail(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n body: {\n projectId: string;\n kind: 'direct' | 'forward' | 'reply';\n key: string;\n digest: string;\n from: string;\n recipients: Array<string>;\n transport: 'binding' | 'send_raw' | 'native_forward' | 'native_reply';\n receiptId?: string;\n },\n deadlineMs = EMAIL_ADMISSION_DEADLINE_MS,\n): Promise<Admission> {\n return call(env, '/admit', body, Math.min(deadlineMs, EMAIL_ADMISSION_DEADLINE_MS));\n}\n\nexport function startEmailAttempt(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n operationId: string,\n recipients: Array<string>,\n deadlineMs = EMAIL_ACTION_DEADLINE_MS,\n): Promise<{ recipients: Array<ActionRecipient> }> {\n return call(\n env,\n `/${encodeURIComponent(operationId)}/start`,\n { recipients },\n Math.min(deadlineMs, EMAIL_ACTION_DEADLINE_MS),\n );\n}\n\nexport function finishEmailAttempt(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n operationId: string,\n recipients: Array<string>,\n state: 'provider_accepted' | 'failed' | 'outcome_unknown' | 'cancelled',\n details: { providerReference?: string; errorCode?: string } = {},\n deadlineMs = EMAIL_ACTION_DEADLINE_MS,\n): Promise<{ recipients: Array<ActionRecipient> }> {\n return call(\n env,\n `/${encodeURIComponent(operationId)}/finish`,\n { recipients, state, ...details },\n Math.min(deadlineMs, EMAIL_ACTION_DEADLINE_MS),\n );\n}\n\nexport function recordEmailReceipt(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n receiptId: string,\n projectId: string,\n status: string,\n route?: ReceiptRouteFence,\n): Promise<{ ok: true }> {\n return call(env, '/receipts', { receiptId, projectId, status, ...(route ? { route } : {}) });\n}\n", "/** Lease a customer API token from the platform for a custom-domain send. */\n\nimport type { Env } from './types.ts';\n\nexport type EmailDomainLease = { kind: 'api_token'; token: string; accountId: string };\n\nconst LEASE_DEADLINE_MS = 5_000;\nconst MAX_LEASE_RESPONSE_BYTES = 4 * 1024;\n\n/** The bearer value for the send_raw Authorization header. */\nexport function leaseBearer(lease: EmailDomainLease): string {\n return lease.token;\n}\n\n/**\n * Lease a send credential for a registered domain from the api. Returns\n * null on any failure; the caller maps that to a retryable upstream error.\n */\nexport async function leaseEmailDomainCredential(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n domain: string,\n projectId: string,\n deadlineMs = LEASE_DEADLINE_MS,\n): Promise<EmailDomainLease | null> {\n if (!env.EMAIL_SIGNING_SECRET) {\n return null;\n }\n const controller = new AbortController();\n const deadline = Date.now() + Math.min(deadlineMs, LEASE_DEADLINE_MS);\n const beforeDeadline = async <T>(run: () => Promise<T>): Promise<T> => {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n controller.abort();\n throw new Error('email credential lease timed out');\n }\n const promise = run();\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('email credential lease timed out'));\n }, remaining);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n };\n\n let res: Response;\n try {\n const token = await hmacSign(\n `email-lease-v1\\n${projectId}\\n${domain.toLowerCase()}`,\n env.EMAIL_SIGNING_SECRET,\n );\n res = await beforeDeadline(() =>\n env.API.fetch('https://api/internal/email/domain-credential', {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({ domain, projectId }),\n signal: controller.signal,\n }),\n );\n } catch {\n return null;\n }\n if (!res.ok) {\n void res.body?.cancel().catch(() => {});\n return null;\n }\n const declared = res.headers.get('content-length');\n if (\n declared !== null &&\n (!/^\\d+$/.test(declared) || Number(declared) > MAX_LEASE_RESPONSE_BYTES)\n ) {\n void res.body?.cancel().catch(() => {});\n return null;\n }\n const reader = res.body?.getReader();\n if (!reader) {\n return null;\n }\n const bytes = new Uint8Array(MAX_LEASE_RESPONSE_BYTES);\n let size = 0;\n try {\n for (;;) {\n const chunk = await beforeDeadline(() => reader.read());\n if (chunk.done) {\n break;\n }\n if (size + chunk.value.byteLength > bytes.byteLength) {\n throw new Error('email credential lease response too large');\n }\n bytes.set(chunk.value, size);\n size += chunk.value.byteLength;\n }\n if (declared !== null && size !== Number(declared)) {\n return null;\n }\n const data: unknown = JSON.parse(\n new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(bytes.subarray(0, size)),\n );\n return parseLease(data);\n } catch {\n return null;\n } finally {\n void reader.cancel().catch(() => {});\n try {\n reader.releaseLock();\n } catch {\n // A timed-out read may still be settling after cancellation.\n }\n }\n}\n\nfunction parseLease(data: unknown): EmailDomainLease | null {\n if (typeof data !== 'object' || data === null) {\n return null;\n }\n const kind = (data as { kind?: unknown }).kind;\n const accountId = (data as { accountId?: unknown }).accountId;\n if (typeof accountId !== 'string' || !/^[a-zA-Z0-9_-]{1,128}$/.test(accountId)) {\n return null;\n }\n if (kind === 'api_token') {\n const token = (data as { token?: unknown }).token;\n return typeof token === 'string' && token.length > 0 ? { kind, token, accountId } : null;\n }\n return null;\n}\n\n// --- HMAC signing (mirrors resolve.ts) ---\n\nconst encoder = new TextEncoder();\nlet cachedSignKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getSignKey(secret: string): Promise<CryptoKey> {\n if (cachedSignKey && cachedKeySecret === secret) {\n return cachedSignKey;\n }\n cachedSignKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n cachedKeySecret = secret;\n return cachedSignKey;\n}\n\nasync function hmacSign(data: string, secret: string): Promise<string> {\n const key = await getSignKey(secret);\n const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(data));\n const binary = String.fromCharCode(...new Uint8Array(sig));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n", "export const EMAIL_PROVIDER_DEADLINE_MS = 30_000;\nexport const EMAIL_PROVIDER_BATCH_DEADLINE_MS = 60_000;\n\nexport class EmailProviderTimeoutError extends Error {\n constructor() {\n super('email provider outcome unknown after timeout');\n this.name = 'EmailProviderTimeoutError';\n }\n}\n\n/** One absolute batch budget, with a shorter ceiling for each provider submission. */\nexport function createEmailProviderDeadline(totalMs = EMAIL_PROVIDER_BATCH_DEADLINE_MS) {\n const deadline = Date.now() + totalMs;\n return {\n remainingMs(reserveMs = 0): number {\n return Math.max(0, deadline - Date.now() - reserveMs);\n },\n expired(reserveMs = 0): boolean {\n return Date.now() >= deadline - reserveMs;\n },\n async run<T>(submit: () => Promise<T>, reserveMs = 0): Promise<T> {\n const remaining = Math.min(EMAIL_PROVIDER_DEADLINE_MS, deadline - Date.now() - reserveMs);\n if (remaining <= 0) {\n throw new EmailProviderTimeoutError();\n }\n const work = submit();\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n work,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new EmailProviderTimeoutError()), remaining);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n },\n };\n}\n\nexport type EmailProviderDeadline = ReturnType<typeof createEmailProviderDeadline>;\n", "/** Revalidate every delivered chunk; idle streams also close when their session is revoked. */\nexport function guardHumanStream(\n source: ReadableStream<Uint8Array>,\n validate: () => Promise<boolean>,\n signal?: AbortSignal,\n): ReadableStream<Uint8Array> {\n const reader = source.getReader();\n let closed = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let controller: ReadableStreamDefaultController<Uint8Array>;\n const cleanup = () => {\n closed = true;\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n signal?.removeEventListener('abort', abort);\n };\n const stop = () => {\n if (closed) {\n return;\n }\n cleanup();\n controller.error(new Error('Authentication expired or was revoked. Sign in again.'));\n void reader.cancel().catch(() => {});\n };\n const abort = () => stop();\n const check = async () => {\n if (closed) {\n return false;\n }\n try {\n if (await validate()) {\n return !closed;\n }\n } catch {\n /* Failed authority reads must close the stream. */\n }\n stop();\n return false;\n };\n const schedule = () => {\n timer = setTimeout(async () => {\n if (await check()) {\n schedule();\n }\n }, 15_000);\n };\n return new ReadableStream<Uint8Array>(\n {\n start(target) {\n controller = target;\n signal?.addEventListener('abort', abort, { once: true });\n if (signal?.aborted) {\n stop();\n } else {\n schedule();\n }\n },\n async pull(target) {\n try {\n const chunk = await reader.read();\n if (closed) {\n return;\n }\n if (chunk.done) {\n cleanup();\n target.close();\n } else if (await check()) {\n target.enqueue(chunk.value);\n }\n } catch (error) {\n if (!closed) {\n cleanup();\n target.error(error);\n void reader.cancel().catch(() => {});\n }\n }\n },\n async cancel(reason) {\n cleanup();\n await reader.cancel(reason);\n },\n },\n { highWaterMark: 0 },\n );\n}\n", "import { Hono } from 'hono';\nimport { asString, isQueryValue } from './body.ts';\nimport { dispatchToWorker } from './dispatch.ts';\nimport { resolveResource } from './resolve.ts';\nimport type { ProxyEnv } from './types.ts';\n\nconst CF_API = 'https://api.cloudflare.com/client/v4';\n\nconst kv = new Hono<ProxyEnv>();\n\nkv.post('/get', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/get', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/values/${encodeURIComponent(key)}`,\n { headers: { Authorization: `Bearer ${context.env.CF_API_TOKEN}` } },\n );\n\n if (cfRes.status === 404) {\n return context.json(null);\n }\n\n if (!cfRes.ok) {\n return context.json({ error: 'KV get failed', status: cfRes.status }, 502);\n }\n\n const type = asString(body.type) ?? 'text';\n if (type === 'json') {\n return context.json(await cfRes.json());\n }\n if (type === 'arrayBuffer') {\n return new Response(await cfRes.arrayBuffer(), {\n headers: { 'content-type': 'application/octet-stream' },\n });\n }\n if (type === 'stream') {\n return new Response(cfRes.body, {\n headers: { 'content-type': 'application/octet-stream' },\n });\n }\n // Default: text\n return context.json(await cfRes.text());\n});\n\nkv.post('/put', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/put', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const params = new URLSearchParams();\n if (isQueryValue(body.expiration)) {\n params.set('expiration', String(body.expiration));\n }\n if (isQueryValue(body.expiration_ttl)) {\n params.set('expiration_ttl', String(body.expiration_ttl));\n }\n const queryString = params.toString() ? `?${params.toString()}` : '';\n\n let value: string | ArrayBuffer;\n let contentType = 'text/plain';\n if (body.base64 === true && typeof body.value === 'string') {\n // Decode base64-encoded binary data from the client\n const binary = atob(body.value);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n value = bytes.buffer;\n contentType = 'application/octet-stream';\n } else {\n value = typeof body.value === 'string' ? body.value : JSON.stringify(body.value);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/values/${encodeURIComponent(key)}${queryString}`,\n {\n method: 'PUT',\n headers: {\n Authorization: `Bearer ${context.env.CF_API_TOKEN}`,\n 'Content-Type': contentType,\n },\n body: value,\n },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'KV put failed', status: cfRes.status }, 502);\n }\n\n return context.json({ success: true });\n});\n\nkv.post('/delete', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/delete', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/values/${encodeURIComponent(key)}`,\n {\n method: 'DELETE',\n headers: { Authorization: `Bearer ${context.env.CF_API_TOKEN}` },\n },\n );\n\n // 404 is fine \u2014 delete is idempotent\n if (!cfRes.ok && cfRes.status !== 404) {\n return context.json({ error: 'KV delete failed', status: cfRes.status }, 502);\n }\n\n return context.json({ success: true });\n});\n\nkv.post('/list', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding) {\n return context.json({ error: 'binding required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/list', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const params = new URLSearchParams();\n const prefix = asString(body.prefix);\n if (prefix) {\n params.set('prefix', prefix);\n }\n if (isQueryValue(body.limit)) {\n params.set('limit', String(body.limit));\n }\n const cursor = asString(body.cursor);\n if (cursor) {\n params.set('cursor', cursor);\n }\n const queryString = params.toString() ? `?${params.toString()}` : '';\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/keys${queryString}`,\n { headers: { Authorization: `Bearer ${context.env.CF_API_TOKEN}` } },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'KV list failed', status: cfRes.status }, 502);\n }\n\n const data = (await cfRes.json()) as {\n result?: ReadonlyArray<{ name: string }>;\n result_info?: { cursor?: string };\n };\n return context.json({\n keys: data.result ?? [],\n list_complete: !data.result_info?.cursor,\n cursor: data.result_info?.cursor ?? null,\n });\n});\n\nexport { kv };\n", "// Keep these wire values aligned with @void/platform. This private runtime is\n// bundled into that package, but must not import the package being built.\nexport const PLATFORM_DISABLED_KEY = '__void/platform/disabled/v1';\nexport const PLATFORM_DISABLED_VALUE = 'disabled';\n", "import { Hono } from 'hono';\nimport { asString, isQueryValue } from './body.ts';\nimport { dispatchToWorker } from './dispatch.ts';\nimport { resolveResource } from './resolve.ts';\nimport type { ProxyEnv } from './types.ts';\n\nconst CF_API = 'https://api.cloudflare.com/client/v4';\n\nconst r2 = new Hono<ProxyEnv>();\n\nfunction cfHeaders(token: string) {\n return { Authorization: `Bearer ${token}` };\n}\n\nr2.post('/get', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/get', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n { headers: cfHeaders(context.env.CF_API_TOKEN) },\n );\n\n if (cfRes.status === 404) {\n return context.json(null);\n }\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 get failed', status: cfRes.status }, 502);\n }\n\n // Stream the object body back, preserve metadata in headers\n const headers = new Headers();\n headers.set('content-type', cfRes.headers.get('content-type') ?? 'application/octet-stream');\n if (cfRes.headers.has('content-length')) {\n headers.set('content-length', cfRes.headers.get('content-length')!);\n }\n if (cfRes.headers.has('etag')) {\n headers.set('etag', cfRes.headers.get('etag')!);\n }\n if (cfRes.headers.has('last-modified')) {\n headers.set('last-modified', cfRes.headers.get('last-modified')!);\n }\n\n return new Response(cfRes.body, { headers });\n});\n\nr2.on('POST', ['/put', '/put-conditional'], async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n const base64 = asString(body.base64);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const conditional = body.onlyIf !== undefined || context.req.path.endsWith('/put-conditional');\n const dispatchRes = await dispatchToWorker(\n context.env,\n projectId,\n conditional ? '/r2/put-conditional' : '/r2/put',\n body,\n );\n if (dispatchRes) {\n return dispatchRes;\n }\n\n if (conditional) {\n return context.json(\n {\n error:\n 'R2 conditional writes require an active deployment with the current Void remote-binding handler. Update your Void platform and redeploy the project.',\n },\n 501,\n );\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n // Decode base64 value from JSON body, or use text value\n const data = base64\n ? Uint8Array.from(atob(base64), (ch) => ch.charCodeAt(0))\n : new TextEncoder().encode((body.value as string) ?? '');\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n {\n method: 'PUT',\n headers: {\n ...cfHeaders(context.env.CF_API_TOKEN),\n 'Content-Type': asString(body.contentType) ?? 'application/octet-stream',\n },\n body: data,\n },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 put failed', status: cfRes.status }, 502);\n }\n\n return context.json({ success: true });\n});\n\nr2.post('/delete', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding) {\n return context.json({ error: 'binding required' }, 400);\n }\n\n const keys =\n Array.isArray(body.keys) && body.keys.every((key): key is string => typeof key === 'string')\n ? body.keys\n : typeof body.key === 'string'\n ? [body.key]\n : [];\n\n if (keys.length === 0) {\n return context.json({ error: 'key or keys required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/delete', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n for (const key of keys) {\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n {\n method: 'DELETE',\n headers: cfHeaders(context.env.CF_API_TOKEN),\n },\n );\n if (!cfRes.ok && cfRes.status !== 404) {\n return context.json({ error: 'R2 delete failed', status: cfRes.status }, 502);\n }\n }\n\n return context.json({ success: true });\n});\n\nr2.post('/list', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding) {\n return context.json({ error: 'binding required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/list', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const params = new URLSearchParams();\n const prefix = asString(body.prefix);\n if (prefix) {\n params.set('prefix', prefix);\n }\n if (isQueryValue(body.limit)) {\n params.set('per_page', String(body.limit));\n }\n const cursor = asString(body.cursor);\n if (cursor) {\n params.set('cursor', cursor);\n }\n const delimiter = asString(body.delimiter);\n if (delimiter) {\n params.set('delimiter', delimiter);\n }\n const queryString = params.toString() ? `?${params.toString()}` : '';\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects${queryString}`,\n { headers: cfHeaders(context.env.CF_API_TOKEN) },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 list failed', status: cfRes.status }, 502);\n }\n\n const data = (await cfRes.json()) as {\n result?: ReadonlyArray<{ key: string; size: number; last_modified?: string }>;\n result_info?: { cursor?: string };\n };\n\n return context.json({\n objects: (data.result ?? []).map((object) => ({\n key: object.key,\n size: object.size,\n lastModified: object.last_modified ?? '',\n })),\n truncated: !!data.result_info?.cursor,\n cursor: data.result_info?.cursor ?? null,\n });\n});\n\nr2.post('/head', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/head', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n {\n method: 'HEAD',\n headers: cfHeaders(context.env.CF_API_TOKEN),\n },\n );\n\n if (cfRes.status === 404) {\n return context.json(null);\n }\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 head failed', status: cfRes.status }, 502);\n }\n\n return context.json({\n key,\n size: parseInt(cfRes.headers.get('content-length') ?? '0'),\n etag: cfRes.headers.get('etag') ?? '',\n lastModified: cfRes.headers.get('last-modified') ?? '',\n contentType: cfRes.headers.get('content-type') ?? 'application/octet-stream',\n });\n});\n\nexport { r2 };\n", "import { Hono } from 'hono';\nimport type { ProxyEnv } from './types.ts';\n\nconst app = new Hono<ProxyEnv>();\n\n/**\n * Forward revalidation requests to the API via service binding.\n *\n * The auth middleware has already verified the HMAC token and set projectId.\n * We forward the token so the API can verify it independently.\n */\napp.post('/', async (context) => {\n const projectId = context.get('projectId');\n const body = context.get('body');\n\n const response = await context.env.API.fetch(`https://api/internal/revalidate/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': body.aiToken as string,\n },\n body: JSON.stringify({\n paths: body.paths,\n all: body.all,\n }),\n });\n\n return new Response(response.body, {\n status: response.status,\n headers: response.headers,\n });\n});\n\nexport { app as revalidate };\n", "import { verifyEmailReceipt } from '@void/platform/email-protocol';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { ai } from './ai.ts';\nimport { asString, isProxyBody } from './body.ts';\nimport { proxyCapabilityEnabled } from './capabilities.ts';\nimport { d1 } from './d1.ts';\nimport { readEmailRequestJson } from './email-request-body.ts';\nimport { email } from './email.ts';\nimport { guardHumanStream } from './human-stream.ts';\nimport { kv } from './kv.ts';\nimport { PLATFORM_DISABLED_KEY, PLATFORM_DISABLED_VALUE } from './platform-lifecycle.ts';\nimport { r2 } from './r2.ts';\nimport { verifyPrerenderAuthority, verifyProjectDeployAccess } from './resolve.ts';\nimport { revalidate } from './revalidate.ts';\nimport type { Env, JwtPayload, ProxyBody, ProxyEnv } from './types.ts';\n\nconst app = new Hono<ProxyEnv>();\n\napp.use('/*', async (context, next) => {\n const healthProbeToken = context.env.PLATFORM_HEALTH_PROBE_TOKEN;\n const installerProbe =\n healthProbeToken !== undefined &&\n healthProbeToken !== '' &&\n context.req.path === '/health' &&\n context.req.header('X-Void-Platform-Probe') === healthProbeToken;\n if (\n !installerProbe &&\n (context.env.PLATFORM_TRAFFIC_STATE === 'staging' ||\n context.env.PLATFORM_TRAFFIC_STATE === 'sandbox-drain' ||\n (context.env.PLATFORM_INSTALLATION_ID &&\n (await context.env.ROUTING.get(PLATFORM_DISABLED_KEY)) === PLATFORM_DISABLED_VALUE))\n ) {\n return context.json({ error: 'Platform disabled' }, 503);\n }\n await next();\n});\n\n// CORS\napp.use(\n '/*',\n cors({\n origin: '*',\n allowMethods: ['POST', 'OPTIONS'],\n allowHeaders: ['content-type', 'authorization'],\n }),\n);\n\n// Health check\napp.get('/health', (context) =>\n context.json({\n ok: true,\n bindings: {\n ai: !!context.env.AI,\n kv: !!context.env.ROUTING,\n jwt: !!context.env.JWT_SECRET,\n api: !!context.env.API,\n sendEmail: !!context.env.SEND_EMAIL,\n emailDomain: !!context.env.EMAIL_SENDER_DOMAIN,\n },\n }),\n);\n\n// Reject non-POST for all other routes\napp.all('/*', async (context, next) => {\n if (context.req.method !== 'POST') {\n return context.json({ error: 'method not allowed' }, 405);\n }\n await next();\n});\n\nasync function hmacSign(data: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n 'raw',\n new TextEncoder().encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const bytes = new Uint8Array(\n await crypto.subtle.sign('HMAC', key, new TextEncoder().encode(data)),\n );\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary).replaceAll('+', '-').replaceAll('/', '_').replaceAll('=', '');\n}\n\n// The tenant calls this over its internal service binding. EMAIL_SIGNING_SECRET never\n// enters the tenant, so a project token cannot mint a gateway receipt.\napp.post('/email/verify-receipt', async (context) => {\n let body: unknown;\n try {\n body = await readEmailRequestJson(context.req.raw);\n } catch {\n return context.json({ valid: false }, 400);\n }\n if (!body || typeof body !== 'object') {\n return context.json({ valid: false }, 400);\n }\n const input = body as Record<string, unknown>;\n if (\n typeof input.projectId !== 'string' ||\n input.projectId.length > 128 ||\n typeof input.deploymentId !== 'string' ||\n input.deploymentId.length > 128 ||\n typeof input.recipient !== 'string' ||\n input.recipient.length > 320 ||\n typeof input.receipt !== 'string' ||\n input.receipt.length > 1536\n ) {\n return context.json({ valid: false }, 400);\n }\n const projectToken = await hmacSign(input.projectId, context.env.JWT_SECRET);\n if (context.req.header('x-void-internal') !== projectToken) {\n return context.json({ valid: false }, 403);\n }\n if (!context.env.EMAIL_SIGNING_SECRET) {\n return context.json({ valid: false }, 503);\n }\n const claims = await verifyEmailReceipt(input.receipt, context.env.EMAIL_SIGNING_SECRET, {\n projectId: input.projectId,\n deploymentId: input.deploymentId,\n recipient: input.recipient,\n });\n return context.json({ valid: claims !== null, receiptId: claims?.receiptId });\n});\n\n// The former relay endpoint is gone. Reject it before the generic JSON auth\n// middleware so an untrusted MIME stream is never parsed or buffered here.\napp.post('/email/relay', (context) => context.json({ error: 'not found' }, 404));\n\n// Auth middleware \u2014 parses body, authenticates, sets projectId\napp.post('/*', async (context, next) => {\n const path = new URL(context.req.url).pathname;\n\n let body: ProxyBody;\n try {\n // Five MiB of MIME expands to about seven MiB of base64, plus JSON metadata.\n const json =\n path === '/email' || path.startsWith('/email/')\n ? await readEmailRequestJson(context.req.raw, 8 * 1024 * 1024)\n : await context.req.json<unknown>();\n if (!isProxyBody(json)) {\n return context.json({ error: 'invalid JSON body' }, 400);\n }\n body = json;\n } catch {\n return context.json({ error: 'invalid JSON body' }, 400);\n }\n context.set('body', body);\n\n let revalidateHuman: (() => Promise<boolean>) | undefined;\n const authHeader = context.req.header('authorization');\n if (authHeader?.startsWith('Bearer ')) {\n // HTTPS path (local dev) \u2014 validate JWT\n const token = authHeader.slice(7);\n const payload = await verifyJwt(token, context.env.JWT_SECRET);\n if (!payload) {\n return context.json(\n {\n error: 'invalid or expired token',\n message:\n 'This proxy credential is invalid or expired. Sign in to the connected platform again for remote development, or restart the build to obtain a fresh prerender token.',\n },\n 401,\n );\n }\n const projectId = asString(body.projectId);\n if (!projectId) {\n return context.json({ error: 'projectId required' }, 400);\n }\n if (payload.aud === 'prerender') {\n // Prerender credentials are short-lived and already pinned to one\n // project by the API that minted them. Never turn one into a general\n // owner token by accepting a caller-selected projectId.\n if (!payload.project || payload.project !== projectId) {\n return context.json(\n {\n error: 'forbidden',\n message:\n 'This prerender token does not match the requested project. Restart the build with a prerender token issued for the selected project.',\n },\n 403,\n );\n }\n const active = await verifyPrerenderAuthority(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n payload.sub,\n {\n ...(payload.build ? { buildId: payload.build } : {}),\n ...(payload.credential ? { credentialId: payload.credential } : {}),\n },\n );\n if (!active) {\n return context.json(\n {\n error: payload.credential\n ? 'prerender token credential is no longer active'\n : payload.build\n ? 'prerender token build is no longer active'\n : 'prerender token authority is no longer active',\n message: payload.credential\n ? 'The deploy credential used for prerendering is no longer authorized. Ask the project owner for an active deploy credential, then restart the build.'\n : payload.build\n ? 'This build is no longer authorized to prerender. Start a new build to obtain a fresh prerender token.'\n : 'This prerender token is no longer authorized. Confirm your project access with a project admin or owner, then restart the build to obtain a fresh token.',\n },\n 403,\n );\n }\n } else {\n // Full API tokens retain the local-development ownership lookup.\n const checkOwner = () =>\n verifyProjectDeployAccess(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n payload.sub,\n token,\n context.req.header('Cf-Access-Jwt-Assertion'),\n new URL(context.req.url).origin,\n );\n revalidateHuman = async () => payload.exp > Date.now() / 1000 && (await checkOwner());\n if (!(await revalidateHuman())) {\n return context.json(\n {\n error: 'forbidden',\n message:\n 'Remote access could not be authorized. Check the selected platform and project, then ask a project admin or owner to confirm your access. If your access is correct, retry shortly.',\n },\n 403,\n );\n }\n }\n context.set('projectId', projectId);\n } else {\n // Service binding path (production) \u2014 verify HMAC-signed project token\n const projectId = asString(body.projectId);\n const aiToken = asString(body.aiToken);\n if (!projectId || !aiToken) {\n return context.json({ error: 'projectId and aiToken required' }, 400);\n }\n if (!(await verifyHmac(projectId, aiToken, context.env.JWT_SECRET))) {\n return context.json({ error: 'invalid project token' }, 403);\n }\n context.set('projectId', projectId);\n }\n\n await next();\n if (\n revalidateHuman &&\n context.res.body &&\n (context.res.headers.get('content-type')?.includes('text/event-stream') ||\n path.startsWith('/ai/') ||\n path === '/r2/get')\n ) {\n context.res = new Response(\n guardHumanStream(context.res.body, revalidateHuman, context.req.raw.signal),\n context.res,\n );\n }\n});\n\n// AI usage limit check \u2014 only applies to AI routes\napp.post('/ai/*', async (context, next) => {\n if (await context.env.ROUTING.get(`ai-block:${context.get('projectId')}`, { cacheTtl: 60 })) {\n return context.json({ error: 'AI usage limit exceeded' }, 429);\n }\n await next();\n});\n\n// Managed Sandbox is unavailable; retain its authenticated error response.\napp.post('/sandbox/*', (context) =>\n context.json(\n {\n error: 'platform capability unavailable',\n capability: 'sandbox',\n message: 'This Void platform does not enable sandbox.',\n },\n 501,\n ),\n);\n\n// Same gate for the email group. A deployed worker on a platform without\n// the email module still holds `__VOID_PROXY` and a valid project token, so\n// an explicit-`from` `sendEmail()` reaches `/email/send` and would otherwise\n// answer with the sender-domain / send-binding configuration failures \u2014 or\n// send, if the operator left the bindings in place.\napp.post('/email/*', async (context, next) => {\n if (!proxyCapabilityEnabled(context.env.PLATFORM_CAPABILITIES, 'email')) {\n return context.json(\n {\n error: 'platform capability unavailable',\n capability: 'email',\n message: 'This Void platform does not enable email.',\n },\n 501,\n );\n }\n await next();\n});\n\n// Route groups\napp.route('/ai', ai);\napp.route('/d1', d1);\napp.route('/kv', kv);\napp.route('/r2', r2);\napp.route('/revalidate', revalidate);\napp.route('/email', email);\n\nexport default { fetch: app.fetch };\n\n// --- HMAC verification ---\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nlet cachedVerifyKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getVerifyKey(secret: string): Promise<CryptoKey> {\n if (cachedVerifyKey && cachedKeySecret === secret) {\n return cachedVerifyKey;\n }\n cachedVerifyKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify'],\n );\n cachedKeySecret = secret;\n return cachedVerifyKey;\n}\n\nasync function verifyHmac(data: string, signature: string, secret: string): Promise<boolean> {\n try {\n const key = await getVerifyKey(secret);\n const sigBytes = base64urlDecode(signature);\n return crypto.subtle.verify('HMAC', key, sigBytes.buffer as ArrayBuffer, encoder.encode(data));\n } catch {\n return false;\n }\n}\n\n// --- JWT verification ---\n\nfunction base64urlDecode(str: string): Uint8Array {\n const padded = str.replace(/-/g, '+').replace(/_/g, '/');\n const binary = atob(padded);\n return Uint8Array.from(binary, (context) => context.charCodeAt(0));\n}\n\nasync function verifyJwt(token: string, secret: string): Promise<JwtPayload | null> {\n const parts = token.split('.');\n if (parts.length !== 3) {\n return null;\n }\n\n const [header, body, signature] = parts;\n\n try {\n const key = await getVerifyKey(secret);\n const sigBytes = base64urlDecode(signature);\n const valid = await crypto.subtle.verify(\n 'HMAC',\n key,\n sigBytes.buffer as ArrayBuffer,\n encoder.encode(`${header}.${body}`),\n );\n if (!valid) {\n return null;\n }\n\n const payload = JSON.parse(decoder.decode(base64urlDecode(body))) as JwtPayload;\n\n const now = Math.floor(Date.now() / 1000);\n if (payload.exp <= now) {\n return null;\n }\n\n if (payload.aud !== 'api' && payload.aud !== 'prerender') {\n return null;\n }\n\n return payload;\n } catch {\n return null;\n }\n}\n"],
|
|
6
|
-
"mappings": "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",
|
|
7
|
-
"names": ["PerformanceMark", "match", "decoder", "raw", "app", "Node", "_Node", "Node", "Hono", "Hono", "encoder", "hmacSign", "encoder", "cachedSignKey", "cachedKeySecret", "getSignKey", "Hono", "
|
|
5
|
+
"sourcesContent": ["/* @__NO_SIDE_EFFECTS__ */\nexport function rawHeaders(headers) {\n\tconst rawHeaders = [];\n\tfor (const key in headers) {\n\t\tif (Array.isArray(headers[key])) {\n\t\t\tfor (const h of headers[key]) {\n\t\t\t\trawHeaders.push(key, h);\n\t\t\t}\n\t\t} else {\n\t\t\trawHeaders.push(key, headers[key]);\n\t\t}\n\t}\n\treturn rawHeaders;\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function mergeFns(...functions) {\n\treturn function(...args) {\n\t\tfor (const fn of functions) {\n\t\t\tfn(...args);\n\t\t}\n\t};\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function createNotImplementedError(name) {\n\treturn new Error(`[unenv] ${name} is not implemented yet!`);\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function notImplemented(name) {\n\tconst fn = () => {\n\t\tthrow createNotImplementedError(name);\n\t};\n\treturn Object.assign(fn, { __unenv__: true });\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function notImplementedAsync(name) {\n\tconst fn = notImplemented(name);\n\tfn.__promisify__ = () => notImplemented(name + \".__promisify__\");\n\tfn.native = fn;\n\treturn fn;\n}\n/* @__NO_SIDE_EFFECTS__ */\nexport function notImplementedClass(name) {\n\treturn class {\n\t\t__unenv__ = true;\n\t\tconstructor() {\n\t\t\tthrow new Error(`[unenv] ${name} is not implemented yet!`);\n\t\t}\n\t};\n}\n", "import { createNotImplementedError } from \"../../../_internal/utils.mjs\";\nconst _timeOrigin = globalThis.performance?.timeOrigin ?? Date.now();\nconst _performanceNow = globalThis.performance?.now ? globalThis.performance.now.bind(globalThis.performance) : () => Date.now() - _timeOrigin;\nconst nodeTiming = {\n\tname: \"node\",\n\tentryType: \"node\",\n\tstartTime: 0,\n\tduration: 0,\n\tnodeStart: 0,\n\tv8Start: 0,\n\tbootstrapComplete: 0,\n\tenvironment: 0,\n\tloopStart: 0,\n\tloopExit: 0,\n\tidleTime: 0,\n\tuvMetricsInfo: {\n\t\tloopCount: 0,\n\t\tevents: 0,\n\t\teventsWaiting: 0\n\t},\n\tdetail: undefined,\n\ttoJSON() {\n\t\treturn this;\n\t}\n};\n// PerformanceEntry\nexport class PerformanceEntry {\n\t__unenv__ = true;\n\tdetail;\n\tentryType = \"event\";\n\tname;\n\tstartTime;\n\tconstructor(name, options) {\n\t\tthis.name = name;\n\t\tthis.startTime = options?.startTime || _performanceNow();\n\t\tthis.detail = options?.detail;\n\t}\n\tget duration() {\n\t\treturn _performanceNow() - this.startTime;\n\t}\n\ttoJSON() {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tentryType: this.entryType,\n\t\t\tstartTime: this.startTime,\n\t\t\tduration: this.duration,\n\t\t\tdetail: this.detail\n\t\t};\n\t}\n}\n// PerformanceMark\nexport const PerformanceMark = class PerformanceMark extends PerformanceEntry {\n\tentryType = \"mark\";\n\tconstructor() {\n\t\t// @ts-ignore\n\t\tsuper(...arguments);\n\t}\n\tget duration() {\n\t\treturn 0;\n\t}\n};\n// PerformanceMark\nexport class PerformanceMeasure extends PerformanceEntry {\n\tentryType = \"measure\";\n}\n// PerformanceResourceTiming\nexport class PerformanceResourceTiming extends PerformanceEntry {\n\tentryType = \"resource\";\n\tserverTiming = [];\n\tconnectEnd = 0;\n\tconnectStart = 0;\n\tdecodedBodySize = 0;\n\tdomainLookupEnd = 0;\n\tdomainLookupStart = 0;\n\tencodedBodySize = 0;\n\tfetchStart = 0;\n\tinitiatorType = \"\";\n\tname = \"\";\n\tnextHopProtocol = \"\";\n\tredirectEnd = 0;\n\tredirectStart = 0;\n\trequestStart = 0;\n\tresponseEnd = 0;\n\tresponseStart = 0;\n\tsecureConnectionStart = 0;\n\tstartTime = 0;\n\ttransferSize = 0;\n\tworkerStart = 0;\n\tresponseStatus = 0;\n}\n// PerformanceObserverEntryList\nexport class PerformanceObserverEntryList {\n\t__unenv__ = true;\n\tgetEntries() {\n\t\treturn [];\n\t}\n\tgetEntriesByName(_name, _type) {\n\t\treturn [];\n\t}\n\tgetEntriesByType(type) {\n\t\treturn [];\n\t}\n}\n// Performance\nexport class Performance {\n\t__unenv__ = true;\n\ttimeOrigin = _timeOrigin;\n\teventCounts = new Map();\n\t_entries = [];\n\t_resourceTimingBufferSize = 0;\n\tnavigation = undefined;\n\ttiming = undefined;\n\ttimerify(_fn, _options) {\n\t\tthrow createNotImplementedError(\"Performance.timerify\");\n\t}\n\tget nodeTiming() {\n\t\treturn nodeTiming;\n\t}\n\teventLoopUtilization() {\n\t\treturn {};\n\t}\n\tmarkResourceTiming() {\n\t\t// TODO: create a new PerformanceResourceTiming entry\n\t\t// so that performance.getEntries, getEntriesByName, and getEntriesByType return it\n\t\t// see: https://nodejs.org/api/perf_hooks.html#performancemarkresourcetimingtiminginfo-requestedurl-initiatortype-global-cachemode-bodyinfo-responsestatus-deliverytype\n\t\treturn new PerformanceResourceTiming(\"\");\n\t}\n\tonresourcetimingbufferfull = null;\n\tnow() {\n\t\t// https://developer.mozilla.org/en-US/docs/Web/API/Performance/now\n\t\tif (this.timeOrigin === _timeOrigin) {\n\t\t\treturn _performanceNow();\n\t\t}\n\t\treturn Date.now() - this.timeOrigin;\n\t}\n\tclearMarks(markName) {\n\t\tthis._entries = markName ? this._entries.filter((e) => e.name !== markName) : this._entries.filter((e) => e.entryType !== \"mark\");\n\t}\n\tclearMeasures(measureName) {\n\t\tthis._entries = measureName ? this._entries.filter((e) => e.name !== measureName) : this._entries.filter((e) => e.entryType !== \"measure\");\n\t}\n\tclearResourceTimings() {\n\t\tthis._entries = this._entries.filter((e) => e.entryType !== \"resource\" || e.entryType !== \"navigation\");\n\t}\n\tgetEntries() {\n\t\treturn this._entries;\n\t}\n\tgetEntriesByName(name, type) {\n\t\treturn this._entries.filter((e) => e.name === name && (!type || e.entryType === type));\n\t}\n\tgetEntriesByType(type) {\n\t\treturn this._entries.filter((e) => e.entryType === type);\n\t}\n\tmark(name, options) {\n\t\t// @ts-expect-error constructor is not protected\n\t\tconst entry = new PerformanceMark(name, options);\n\t\tthis._entries.push(entry);\n\t\treturn entry;\n\t}\n\tmeasure(measureName, startOrMeasureOptions, endMark) {\n\t\tlet start;\n\t\tlet end;\n\t\tif (typeof startOrMeasureOptions === \"string\") {\n\t\t\tstart = this.getEntriesByName(startOrMeasureOptions, \"mark\")[0]?.startTime;\n\t\t\tend = this.getEntriesByName(endMark, \"mark\")[0]?.startTime;\n\t\t} else {\n\t\t\tstart = Number.parseFloat(startOrMeasureOptions?.start) || this.now();\n\t\t\tend = Number.parseFloat(startOrMeasureOptions?.end) || this.now();\n\t\t}\n\t\tconst entry = new PerformanceMeasure(measureName, {\n\t\t\tstartTime: start,\n\t\t\tdetail: {\n\t\t\t\tstart,\n\t\t\t\tend\n\t\t\t}\n\t\t});\n\t\tthis._entries.push(entry);\n\t\treturn entry;\n\t}\n\tsetResourceTimingBufferSize(maxSize) {\n\t\tthis._resourceTimingBufferSize = maxSize;\n\t}\n\taddEventListener(type, listener, options) {\n\t\tthrow createNotImplementedError(\"Performance.addEventListener\");\n\t}\n\tremoveEventListener(type, listener, options) {\n\t\tthrow createNotImplementedError(\"Performance.removeEventListener\");\n\t}\n\tdispatchEvent(event) {\n\t\tthrow createNotImplementedError(\"Performance.dispatchEvent\");\n\t}\n\ttoJSON() {\n\t\treturn this;\n\t}\n}\n// PerformanceObserver\nexport class PerformanceObserver {\n\t__unenv__ = true;\n\tstatic supportedEntryTypes = [];\n\t_callback = null;\n\tconstructor(callback) {\n\t\tthis._callback = callback;\n\t}\n\ttakeRecords() {\n\t\treturn [];\n\t}\n\tdisconnect() {\n\t\tthrow createNotImplementedError(\"PerformanceObserver.disconnect\");\n\t}\n\tobserve(options) {\n\t\tthrow createNotImplementedError(\"PerformanceObserver.observe\");\n\t}\n\tbind(fn) {\n\t\treturn fn;\n\t}\n\trunInAsyncScope(fn, thisArg, ...args) {\n\t\treturn fn.call(thisArg, ...args);\n\t}\n\tasyncId() {\n\t\treturn 0;\n\t}\n\ttriggerAsyncId() {\n\t\treturn 0;\n\t}\n\temitDestroy() {\n\t\treturn this;\n\t}\n}\n// workerd implements a subset of globalThis.performance (as of last check, only timeOrigin set to 0 + now() implemented)\n// We already use performance.now() from globalThis.performance, if provided (see top of this file)\n// If we detect this condition, we can just use polyfill instead.\nexport const performance = globalThis.performance && \"addEventListener\" in globalThis.performance ? globalThis.performance : new Performance();\n", "import {\n performance,\n Performance,\n PerformanceEntry,\n PerformanceMark,\n PerformanceMeasure,\n PerformanceObserver,\n PerformanceObserverEntryList,\n PerformanceResourceTiming\n} from \"node:perf_hooks\";\nif (!(\"__unenv__\" in performance)) {\n const proto = Performance.prototype;\n for (const key of Object.getOwnPropertyNames(proto)) {\n if (key !== \"constructor\" && !(key in performance)) {\n const desc = Object.getOwnPropertyDescriptor(proto, key);\n if (desc) {\n Object.defineProperty(performance, key, desc);\n }\n }\n }\n}\nglobalThis.performance = performance;\nglobalThis.Performance = Performance;\nglobalThis.PerformanceEntry = PerformanceEntry;\nglobalThis.PerformanceMark = PerformanceMark;\nglobalThis.PerformanceMeasure = PerformanceMeasure;\nglobalThis.PerformanceObserver = PerformanceObserver;\nglobalThis.PerformanceObserverEntryList = PerformanceObserverEntryList;\nglobalThis.PerformanceResourceTiming = PerformanceResourceTiming;\n", "//#region src/email-protocol.ts\n/** Worker-safe wire contract shared by the platform gateway and tenant entry. */\nconst EMAIL_PROTOCOL_VERSION = 1;\nconst EMAIL_RECEIPT_PATH = \"/__void/email/receipt/v1\";\nconst EMAIL_MAX_ACTIONS = 100;\nconst EMAIL_MAX_METADATA_BYTES = 8192;\nconst EMAIL_MAX_RESPONSE_BYTES = 8388608;\nconst EMAIL_MAX_REPLY_BYTES = 5242880;\nconst EMAIL_MAX_INBOUND_BYTES = 10485760;\nconst EMAIL_MAX_INBOUND_HEADERS = 1024;\nconst EMAIL_MAX_INBOUND_HEADER_BYTES = 131072;\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder(\"utf-8\", { fatal: true });\nfunction assertFlatJson(bytes, maxDepth, maxFields) {\n\tlet depth = 0;\n\tlet fields = 0;\n\tlet quoted = false;\n\tlet escaped = false;\n\tfor (const byte of bytes) if (quoted) {\n\t\tif (escaped) escaped = false;\n\t\telse if (byte === 92) escaped = true;\n\t\telse if (byte === 34) quoted = false;\n\t} else if (byte === 34) quoted = true;\n\telse if (byte === 123 || byte === 91) {\n\t\tif (++depth > maxDepth) throw new Error(\"email metadata too deep\");\n\t} else if (byte === 125 || byte === 93) {\n\t\tif (--depth < 0) throw new Error(\"invalid email metadata\");\n\t} else if (byte === 58 && ++fields > maxFields) throw new Error(\"too many email metadata fields\");\n\tif (quoted || depth !== 0) throw new Error(\"invalid email metadata\");\n}\nfunction encodeEmailEnvelope(envelope) {\n\tconst metadata = encoder.encode(JSON.stringify({\n\t\tfrom: envelope.from,\n\t\tto: envelope.to,\n\t\theaders: envelope.headers,\n\t\trawSize: envelope.rawSize,\n\t\t...envelope.viaDomain ? { viaDomain: envelope.viaDomain } : {}\n\t}));\n\tif (metadata.byteLength > 131072 || envelope.raw.byteLength > 10485760) throw new Error(\"email envelope too large\");\n\tconst bytes = new Uint8Array(4 + metadata.byteLength + envelope.raw.byteLength);\n\tnew DataView(bytes.buffer).setUint32(0, metadata.byteLength);\n\tbytes.set(metadata, 4);\n\tbytes.set(envelope.raw, 4 + metadata.byteLength);\n\treturn bytes;\n}\nasync function readEmailEnvelope(stream, deadlineMs = 15e3) {\n\tif (!stream) throw new Error(\"missing email envelope\");\n\tconst reader = stream.getReader();\n\tconst limit = 10616836;\n\tlet bytes = /* @__PURE__ */ new Uint8Array(1024);\n\tlet total = 0;\n\tconst deadline = Date.now() + deadlineMs;\n\ttry {\n\t\tfor (;;) {\n\t\t\tconst remaining = deadline - Date.now();\n\t\t\tif (remaining <= 0) throw new Error(\"email envelope timeout\");\n\t\t\tlet timer;\n\t\t\tconst chunk = await Promise.race([reader.read(), new Promise((_, reject) => {\n\t\t\t\ttimer = setTimeout(() => reject(/* @__PURE__ */ new Error(\"email envelope timeout\")), remaining);\n\t\t\t})]).finally(() => {\n\t\t\t\tif (timer !== void 0) clearTimeout(timer);\n\t\t\t});\n\t\t\tif (chunk.done) break;\n\t\t\tconst nextTotal = total + chunk.value.byteLength;\n\t\t\tif (nextTotal > limit) throw new Error(\"email envelope too large\");\n\t\t\tif (nextTotal > bytes.byteLength) {\n\t\t\t\tlet capacity = bytes.byteLength;\n\t\t\t\twhile (capacity < nextTotal) capacity = Math.min(limit, capacity * 2);\n\t\t\t\tconst grown = new Uint8Array(capacity);\n\t\t\t\tgrown.set(bytes.subarray(0, total));\n\t\t\t\tbytes = grown;\n\t\t\t}\n\t\t\tbytes.set(chunk.value, total);\n\t\t\ttotal = nextTotal;\n\t\t}\n\t} catch (error) {\n\t\treader.cancel().catch(() => {});\n\t\tthrow error;\n\t} finally {\n\t\ttry {\n\t\t\treader.releaseLock();\n\t\t} catch {}\n\t}\n\tif (total < 4) throw new Error(\"truncated email envelope\");\n\tconst metadataLength = new DataView(bytes.buffer).getUint32(0);\n\tif (metadataLength > 131072 || total < 4 + metadataLength) throw new Error(\"invalid email envelope\");\n\tconst metadataBytes = bytes.subarray(4, 4 + metadataLength);\n\tassertFlatJson(metadataBytes, 2, 1032);\n\tconst metadata = JSON.parse(decoder.decode(metadataBytes));\n\tif (!metadata || typeof metadata !== \"object\" || Array.isArray(metadata)) throw new Error(\"invalid email envelope\");\n\tconst value = metadata;\n\tconst raw = bytes.subarray(4 + metadataLength, total);\n\tif (raw.byteLength > 10485760 || typeof value.from !== \"string\" || value.from.length > 320 || typeof value.to !== \"string\" || value.to.length > 320 || typeof value.rawSize !== \"number\" || value.rawSize !== raw.byteLength || !value.headers || typeof value.headers !== \"object\" || Array.isArray(value.headers) || Object.keys(value.headers).length > 1024 || Object.values(value.headers).some((header) => typeof header !== \"string\") || value.viaDomain !== void 0 && (typeof value.viaDomain !== \"string\" || value.viaDomain.length > 253)) throw new Error(\"invalid email envelope\");\n\treturn {\n\t\tfrom: value.from,\n\t\tto: value.to,\n\t\theaders: value.headers,\n\t\traw,\n\t\trawSize: raw.byteLength,\n\t\t...value.viaDomain ? { viaDomain: value.viaDomain } : {}\n\t};\n}\nfunction base64url(bytes) {\n\tlet binary = \"\";\n\tfor (const byte of bytes) binary += String.fromCharCode(byte);\n\treturn btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replaceAll(\"=\", \"\");\n}\nfunction unbase64url(value) {\n\tif (!/^[A-Za-z0-9_-]+$/.test(value) || value.length > 1024) throw new Error(\"invalid receipt\");\n\tconst binary = atob(value.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\") + \"=\".repeat((4 - value.length % 4) % 4));\n\treturn Uint8Array.from(binary, (char) => char.charCodeAt(0));\n}\nasync function receiptKey(secret, usage) {\n\tif (!secret) throw new Error(\"Email signing key is not configured\");\n\treturn crypto.subtle.importKey(\"raw\", encoder.encode(secret), {\n\t\tname: \"HMAC\",\n\t\thash: \"SHA-256\"\n\t}, false, [usage]);\n}\nasync function signEmailReceipt(claims, signingSecret) {\n\tconst payload = encoder.encode(JSON.stringify(claims));\n\tconst signature = new Uint8Array(await crypto.subtle.sign(\"HMAC\", await receiptKey(signingSecret, \"sign\"), payload));\n\treturn `${base64url(payload)}.${base64url(signature)}`;\n}\nasync function verifyEmailReceipt(token, signingSecret, expected, now = Date.now()) {\n\ttry {\n\t\tif (token.length > 1536) return null;\n\t\tconst parts = token.split(\".\");\n\t\tif (parts.length !== 2) return null;\n\t\tconst payload = unbase64url(parts[0]);\n\t\tconst signature = unbase64url(parts[1]);\n\t\tif (payload.byteLength > 768 || signature.byteLength !== 32) return null;\n\t\tif (!await crypto.subtle.verify(\"HMAC\", await receiptKey(signingSecret, \"verify\"), Uint8Array.from(signature), Uint8Array.from(payload))) return null;\n\t\tconst claims = JSON.parse(decoder.decode(payload));\n\t\tif (typeof claims !== \"object\" || claims === null) return null;\n\t\tconst value = claims;\n\t\tif (value.version !== 1 || typeof value.receiptId !== \"string\" || !/^[a-f0-9-]{16,64}$/.test(value.receiptId) || value.projectId !== expected.projectId || value.deploymentId !== expected.deploymentId || value.recipient !== expected.recipient || typeof value.expiresAt !== \"number\" || !Number.isSafeInteger(value.expiresAt) || value.expiresAt < now || value.expiresAt > now + 6e4) return null;\n\t\treturn value;\n\t} catch {\n\t\treturn null;\n\t}\n}\nfunction frame(kind, payload) {\n\tconst bytes = new Uint8Array(5 + payload.byteLength);\n\tnew DataView(bytes.buffer).setUint32(0, payload.byteLength);\n\tbytes[4] = kind;\n\tbytes.set(payload, 5);\n\treturn bytes;\n}\nfunction encodeEmailActionMetadata(action) {\n\treturn encoder.encode(JSON.stringify(action.type === \"reply\" ? {\n\t\ttype: action.type,\n\t\tfrom: action.from,\n\t\tto: action.to\n\t} : action));\n}\nfunction emailActionWireSizeFromMetadata(action, metadata) {\n\treturn 5 + metadata.byteLength + (action.type === \"reply\" ? 5 + action.raw.byteLength : 0);\n}\nfunction encodeEmailActions(actions) {\n\tif (actions.length > 100) throw new Error(\"too many email actions\");\n\tlet index = 0;\n\tlet pending = null;\n\tlet total = 0;\n\treturn new ReadableStream({ pull(controller) {\n\t\tif (pending) {\n\t\t\tcontroller.enqueue(pending);\n\t\t\tpending = null;\n\t\t\treturn;\n\t\t}\n\t\tif (index === actions.length) {\n\t\t\tcontroller.enqueue(frame(0, /* @__PURE__ */ new Uint8Array()));\n\t\t\tcontroller.close();\n\t\t\treturn;\n\t\t}\n\t\tconst action = actions[index++];\n\t\tconst metadata = encodeEmailActionMetadata(action);\n\t\tif (metadata.byteLength > 8192) throw new Error(\"email action metadata too large\");\n\t\tif (action.type === \"reply\") {\n\t\t\tif (action.raw.byteLength > 5242880) throw new Error(\"email reply too large\");\n\t\t\tpending = frame(2, action.raw);\n\t\t}\n\t\ttotal += emailActionWireSizeFromMetadata(action, metadata);\n\t\tif (total + 5 > 8388608) throw new Error(\"email actions too large\");\n\t\tcontroller.enqueue(frame(1, metadata));\n\t} });\n}\n/** Read each frame with fixed ceilings before parsing metadata or allocating a reply. */\nasync function readEmailActions(stream, deadlineMs = 15e3) {\n\tconst reader = stream.getReader();\n\tconst actions = [];\n\tlet stash = /* @__PURE__ */ new Uint8Array(0);\n\tlet total = 0;\n\tconst deadline = Date.now() + deadlineMs;\n\tasync function readChunk() {\n\t\tconst remaining = deadline - Date.now();\n\t\tif (remaining <= 0) throw new Error(\"email response timeout\");\n\t\tlet timer;\n\t\treturn Promise.race([reader.read(), new Promise((_, reject) => {\n\t\t\ttimer = setTimeout(() => reject(/* @__PURE__ */ new Error(\"email response timeout\")), remaining);\n\t\t})]).finally(() => {\n\t\t\tif (timer !== void 0) clearTimeout(timer);\n\t\t});\n\t}\n\tasync function exact(length) {\n\t\tconst result = new Uint8Array(length);\n\t\tlet offset = 0;\n\t\twhile (offset < length) {\n\t\t\tif (stash.byteLength === 0) {\n\t\t\t\tconst chunk = await readChunk();\n\t\t\t\tif (chunk.done) throw new Error(\"truncated email response\");\n\t\t\t\ttotal += chunk.value.byteLength;\n\t\t\t\tif (total > 8388608) throw new Error(\"email response too large\");\n\t\t\t\tstash = chunk.value;\n\t\t\t}\n\t\t\tconst used = Math.min(stash.byteLength, length - offset);\n\t\t\tresult.set(stash.subarray(0, used), offset);\n\t\t\tstash = stash.subarray(used);\n\t\t\toffset += used;\n\t\t}\n\t\treturn result;\n\t}\n\ttry {\n\t\tfor (;;) {\n\t\t\tconst head = await exact(5);\n\t\t\tconst length = new DataView(head.buffer).getUint32(0);\n\t\t\tconst kind = head[4];\n\t\t\tif (kind === 0) {\n\t\t\t\tif (length !== 0 || stash.byteLength !== 0) throw new Error(\"invalid email response tail\");\n\t\t\t\tif (!(await readChunk()).done) throw new Error(\"invalid email response tail\");\n\t\t\t\tif (actions.some((action) => action.type === \"reject\") && actions.length !== 1) throw new Error(\"email reject cannot accompany delivery actions\");\n\t\t\t\treturn actions;\n\t\t\t}\n\t\t\tif (kind !== 1 || length > 8192 || actions.length >= 100) throw new Error(\"invalid email action frame\");\n\t\t\tconst metadataBytes = await exact(length);\n\t\t\tassertFlatJson(metadataBytes, 2, 40);\n\t\t\tconst value = JSON.parse(decoder.decode(metadataBytes));\n\t\t\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"invalid email action\");\n\t\t\tconst action = value;\n\t\t\tif (action.type === \"reply\") {\n\t\t\t\tif (typeof action.from !== \"string\" || typeof action.to !== \"string\" || Object.keys(action).length !== 3) throw new Error(\"invalid email reply\");\n\t\t\t\tconst rawHead = await exact(5);\n\t\t\t\tconst rawLength = new DataView(rawHead.buffer).getUint32(0);\n\t\t\t\tif (rawHead[4] !== 2 || rawLength > 5242880) throw new Error(\"invalid email reply frame\");\n\t\t\t\tactions.push({\n\t\t\t\t\ttype: \"reply\",\n\t\t\t\t\tfrom: action.from,\n\t\t\t\t\tto: action.to,\n\t\t\t\t\traw: await exact(rawLength)\n\t\t\t\t});\n\t\t\t} else if (action.type === \"forward\") {\n\t\t\t\tif (typeof action.to !== \"string\" || Object.keys(action).length > 3 || action.headers !== void 0 && (typeof action.headers !== \"object\" || action.headers === null || Array.isArray(action.headers))) throw new Error(\"invalid email forward\");\n\t\t\t\tconst headers = action.headers;\n\t\t\t\tif (headers && (Object.keys(headers).length > 32 || Object.values(headers).some((v) => typeof v !== \"string\"))) throw new Error(\"invalid email headers\");\n\t\t\t\tactions.push({\n\t\t\t\t\ttype: \"forward\",\n\t\t\t\t\tto: action.to,\n\t\t\t\t\t...headers ? { headers } : {}\n\t\t\t\t});\n\t\t\t} else if (action.type === \"reject\") {\n\t\t\t\tif (typeof action.reason !== \"string\" || Object.keys(action).length !== 2) throw new Error(\"invalid email reject\");\n\t\t\t\tactions.push({\n\t\t\t\t\ttype: \"reject\",\n\t\t\t\t\treason: action.reason\n\t\t\t\t});\n\t\t\t} else throw new Error(\"unknown email action\");\n\t\t}\n\t} catch (error) {\n\t\treader.cancel().catch(() => {});\n\t\tthrow error;\n\t} finally {\n\t\ttry {\n\t\t\treader.releaseLock();\n\t\t} catch {}\n\t}\n}\n//#endregion\nexport { EMAIL_MAX_ACTIONS, EMAIL_MAX_INBOUND_BYTES, EMAIL_MAX_INBOUND_HEADERS, EMAIL_MAX_INBOUND_HEADER_BYTES, EMAIL_MAX_METADATA_BYTES, EMAIL_MAX_REPLY_BYTES, EMAIL_MAX_RESPONSE_BYTES, EMAIL_PROTOCOL_VERSION, EMAIL_RECEIPT_PATH, encodeEmailActions, encodeEmailEnvelope, readEmailActions, readEmailEnvelope, signEmailReceipt, verifyEmailReceipt };\n", "// src/compose.ts\nvar compose = (middleware, onError, onNotFound) => {\n return (context, next) => {\n let index = -1;\n return dispatch(0);\n async function dispatch(i) {\n if (i <= index) {\n throw new Error(\"next() called multiple times\");\n }\n index = i;\n let res;\n let isError = false;\n let handler;\n if (middleware[i]) {\n handler = middleware[i][0][0];\n context.req.routeIndex = i;\n } else {\n handler = i === middleware.length && next || void 0;\n }\n if (handler) {\n try {\n res = await handler(context, () => dispatch(i + 1));\n } catch (err) {\n if (err instanceof Error && onError) {\n context.error = err;\n res = await onError(err, context);\n isError = true;\n } else {\n throw err;\n }\n }\n } else {\n if (context.finalized === false && onNotFound) {\n res = await onNotFound(context);\n }\n }\n if (res && (context.finalized === false || isError)) {\n context.res = res;\n }\n return context;\n }\n };\n};\nexport {\n compose\n};\n", "// src/request/constants.ts\nvar GET_MATCH_RESULT = /* @__PURE__ */ Symbol();\nexport {\n GET_MATCH_RESULT\n};\n", "// src/utils/buffer.ts\nimport { sha256 } from \"./crypto.js\";\nvar equal = (a, b) => {\n if (a === b) {\n return true;\n }\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n const va = new DataView(a);\n const vb = new DataView(b);\n let i = va.byteLength;\n while (i--) {\n if (va.getUint8(i) !== vb.getUint8(i)) {\n return false;\n }\n }\n return true;\n};\nvar constantTimeEqualString = (a, b) => {\n const aLen = a.length;\n const bLen = b.length;\n const maxLen = Math.max(aLen, bLen);\n let out = aLen ^ bLen;\n for (let i = 0; i < maxLen; i++) {\n const aChar = i < aLen ? a.charCodeAt(i) : 0;\n const bChar = i < bLen ? b.charCodeAt(i) : 0;\n out |= aChar ^ bChar;\n }\n return out === 0;\n};\nvar timingSafeEqualString = async (a, b, hashFunction) => {\n if (!hashFunction) {\n hashFunction = sha256;\n }\n const [sa, sb] = await Promise.all([hashFunction(a), hashFunction(b)]);\n if (sa == null || sb == null || typeof sa !== \"string\" || typeof sb !== \"string\") {\n return false;\n }\n const hashEqual = constantTimeEqualString(sa, sb);\n const originalEqual = constantTimeEqualString(a, b);\n return hashEqual && originalEqual;\n};\nvar timingSafeEqual = async (a, b, hashFunction) => {\n if (typeof a === \"string\" && typeof b === \"string\") {\n return timingSafeEqualString(a, b, hashFunction);\n }\n if (!hashFunction) {\n hashFunction = sha256;\n }\n const [sa, sb] = await Promise.all([hashFunction(a), hashFunction(b)]);\n if (!sa || !sb || typeof sa !== \"string\" || typeof sb !== \"string\") {\n return false;\n }\n return timingSafeEqualString(sa, sb);\n};\nvar bufferToString = (buffer) => {\n if (buffer instanceof ArrayBuffer) {\n const enc = new TextDecoder(\"utf-8\");\n return enc.decode(buffer);\n }\n return buffer;\n};\nvar bufferToFormData = (arrayBuffer, contentType) => {\n const response = new Response(arrayBuffer, {\n headers: {\n // Normalize the media type (case-insensitive) while keeping parameters like the boundary\n \"Content-Type\": contentType.replace(/^[^;]+/, (mediaType) => mediaType.toLowerCase())\n }\n });\n return response.formData();\n};\nexport {\n bufferToFormData,\n bufferToString,\n equal,\n timingSafeEqual\n};\n", "// src/utils/body.ts\nimport { bufferToFormData } from \"./buffer.js\";\nvar MAX_NESTING_DEPTH = 32;\nvar MAX_NESTED_OBJECTS = 1e4;\nvar isRawRequest = (request) => \"headers\" in request;\nvar parseBody = async (request, options = /* @__PURE__ */ Object.create(null)) => {\n const { all = false, dot = false } = options;\n const headers = isRawRequest(request) ? request.headers : request.raw.headers;\n const contentType = headers.get(\"Content-Type\");\n const mediaType = contentType?.split(\";\")[0].trim().toLowerCase();\n if (mediaType === \"multipart/form-data\" || mediaType === \"application/x-www-form-urlencoded\") {\n return parseFormData(request, { all, dot });\n }\n return {};\n};\nasync function parseFormData(request, options) {\n if (!isRawRequest(request) && request.bodyCache.formData) {\n return convertFormDataToBodyData(\n await request.bodyCache.formData,\n options\n );\n }\n const headers = isRawRequest(request) ? request.headers : request.raw.headers;\n const arrayBuffer = await request.arrayBuffer();\n const formDataPromise = bufferToFormData(arrayBuffer, headers.get(\"Content-Type\") || \"\");\n if (!isRawRequest(request)) {\n request.bodyCache.formData = formDataPromise;\n }\n const formData = await formDataPromise;\n if (formData) {\n return convertFormDataToBodyData(formData, options);\n }\n return {};\n}\nfunction convertFormDataToBodyData(formData, options) {\n const form = /* @__PURE__ */ Object.create(null);\n const nestingState = { count: 0 };\n formData.forEach((value, key) => {\n const shouldParseAllValues = options.all || key.endsWith(\"[]\");\n if (!shouldParseAllValues) {\n form[key] = value;\n } else {\n handleParsingAllValues(form, key, value);\n }\n });\n if (options.dot) {\n Object.entries(form).forEach(([key, value]) => {\n const shouldParseDotValues = key.includes(\".\");\n if (shouldParseDotValues) {\n handleParsingNestedValues(form, key, value, nestingState);\n delete form[key];\n }\n });\n }\n return form;\n}\nvar handleParsingAllValues = (form, key, value) => {\n if (form[key] !== void 0) {\n if (Array.isArray(form[key])) {\n ;\n form[key].push(value);\n } else {\n form[key] = [form[key], value];\n }\n } else {\n if (!key.endsWith(\"[]\")) {\n form[key] = value;\n } else {\n form[key] = [value];\n }\n }\n};\nvar handleParsingNestedValues = (form, key, value, state) => {\n if (/(?:^|\\.)__proto__\\./.test(key)) {\n return;\n }\n let nestedForm = form;\n const keys = key.split(\".\", MAX_NESTING_DEPTH + 2);\n if (keys.length > MAX_NESTING_DEPTH + 1) {\n throwNestingLimitExceeded();\n }\n keys.forEach((key2, index) => {\n if (index === keys.length - 1) {\n nestedForm[key2] = value;\n } else {\n if (!nestedForm[key2] || typeof nestedForm[key2] !== \"object\" || Array.isArray(nestedForm[key2]) || nestedForm[key2] instanceof File) {\n if (state.count++ >= MAX_NESTED_OBJECTS) {\n throwNestingLimitExceeded();\n }\n nestedForm[key2] = /* @__PURE__ */ Object.create(null);\n }\n nestedForm = nestedForm[key2];\n }\n });\n};\nvar throwNestingLimitExceeded = () => {\n throw new Error(\"Nesting limit exceeded\");\n};\nexport {\n parseBody\n};\n", "// src/utils/url.ts\nvar splitPath = (path) => {\n const paths = path.split(\"/\");\n if (paths[0] === \"\") {\n paths.shift();\n }\n return paths;\n};\nvar splitRoutingPath = (routePath) => {\n const { groups, path } = extractGroupsFromPath(routePath);\n const paths = splitPath(path);\n return replaceGroupMarks(paths, groups);\n};\nvar extractGroupsFromPath = (path) => {\n const groups = [];\n path = path.replace(/\\{[^}]+\\}/g, (match, index) => {\n const mark = `@${index}`;\n groups.push([mark, match]);\n return mark;\n });\n return { groups, path };\n};\nvar replaceGroupMarks = (paths, groups) => {\n for (let i = groups.length - 1; i >= 0; i--) {\n const [mark] = groups[i];\n for (let j = paths.length - 1; j >= 0; j--) {\n if (paths[j].includes(mark)) {\n paths[j] = paths[j].replace(mark, groups[i][1]);\n break;\n }\n }\n }\n return paths;\n};\nvar patternCache = {};\nvar getPattern = (label, next) => {\n if (label === \"*\") {\n return \"*\";\n }\n const match = label.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n if (match) {\n const cacheKey = `${label}#${next}`;\n if (!patternCache[cacheKey]) {\n if (match[2]) {\n patternCache[cacheKey] = next && next[0] !== \":\" && next[0] !== \"*\" ? [cacheKey, match[1], new RegExp(`^${match[2]}(?=/${next})`)] : [label, match[1], new RegExp(`^${match[2]}$`)];\n } else {\n patternCache[cacheKey] = [label, match[1], true];\n }\n }\n return patternCache[cacheKey];\n }\n return null;\n};\nvar tryDecode = (str, decoder) => {\n try {\n return decoder(str);\n } catch {\n return str.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match) => {\n try {\n return decoder(match);\n } catch {\n return match;\n }\n });\n }\n};\nvar tryDecodeURI = (str) => tryDecode(str, decodeURI);\nvar getPath = (request) => {\n const url = request.url;\n const start = url.indexOf(\"/\", url.indexOf(\":\") + 4);\n let i = start;\n for (; i < url.length; i++) {\n const charCode = url.charCodeAt(i);\n if (charCode === 37) {\n const queryIndex = url.indexOf(\"?\", i);\n const hashIndex = url.indexOf(\"#\", i);\n const end = queryIndex === -1 ? hashIndex === -1 ? void 0 : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex);\n const path = url.slice(start, end);\n return tryDecodeURI(path.includes(\"%25\") ? path.replace(/%25/g, \"%2525\") : path);\n } else if (charCode === 63 || charCode === 35) {\n break;\n }\n }\n return url.slice(start, i);\n};\nvar getQueryStrings = (url) => {\n const queryIndex = url.indexOf(\"?\", 8);\n if (queryIndex === -1) {\n return \"\";\n }\n const hashIndex = url.indexOf(\"#\", 8);\n return hashIndex === -1 ? url.slice(queryIndex) : queryIndex < hashIndex ? url.slice(queryIndex, hashIndex) : \"\";\n};\nvar getPathNoStrict = (request) => {\n const result = getPath(request);\n return result.length > 1 && result.at(-1) === \"/\" ? result.slice(0, -1) : result;\n};\nvar mergePath = (base, sub, ...rest) => {\n if (rest.length) {\n sub = mergePath(sub, ...rest);\n }\n return `${base?.[0] === \"/\" ? \"\" : \"/\"}${base}${sub === \"/\" ? \"\" : `${base?.at(-1) === \"/\" ? \"\" : \"/\"}${sub?.[0] === \"/\" ? sub.slice(1) : sub}`}`;\n};\nvar checkOptionalParameter = (path) => {\n if (path.charCodeAt(path.length - 1) !== 63 || !path.includes(\":\")) {\n return null;\n }\n const segments = path.split(\"/\");\n const results = [];\n let basePath = \"\";\n segments.forEach((segment) => {\n if (segment !== \"\" && !/\\:/.test(segment)) {\n basePath += \"/\" + segment;\n } else if (/\\:/.test(segment)) {\n if (segment.charCodeAt(segment.length - 1) === 63) {\n if (results.length === 0 && basePath === \"\") {\n results.push(\"/\");\n } else {\n results.push(basePath);\n }\n const optionalSegment = segment.slice(0, -1);\n basePath += \"/\" + optionalSegment;\n results.push(basePath);\n } else {\n basePath += \"/\" + segment;\n }\n }\n });\n return results.filter((v, i, a) => a.indexOf(v) === i);\n};\nvar tryDecodeURIComponent = (str) => str.indexOf(\"%\") !== -1 ? tryDecode(str, decodeURIComponent_) : str;\nvar _decodeURI = (value) => {\n if (value.indexOf(\"+\") !== -1) {\n value = value.replace(/\\+/g, \" \");\n }\n return tryDecodeURIComponent(value);\n};\nvar _getQueryParam = (url, key, multiple) => {\n const hashIndex = url.indexOf(\"#\", 8);\n if (hashIndex !== -1) {\n url = url.slice(0, hashIndex);\n }\n let encoded;\n if (!multiple && key && key.indexOf(\"%\") === -1 && key.indexOf(\"+\") === -1) {\n let keyIndex2 = url.indexOf(\"?\", 8);\n if (keyIndex2 === -1) {\n return void 0;\n }\n if (!url.startsWith(key, keyIndex2 + 1)) {\n keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1);\n }\n while (keyIndex2 !== -1) {\n const trailingKeyCode = url.charCodeAt(keyIndex2 + key.length + 1);\n if (trailingKeyCode === 61) {\n const valueIndex = keyIndex2 + key.length + 2;\n const endIndex = url.indexOf(\"&\", valueIndex);\n return _decodeURI(url.slice(valueIndex, endIndex === -1 ? void 0 : endIndex));\n } else if (trailingKeyCode == 38 || isNaN(trailingKeyCode)) {\n return \"\";\n }\n keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1);\n }\n encoded = /[%+]/.test(url);\n if (!encoded) {\n return void 0;\n }\n }\n const results = /* @__PURE__ */ Object.create(null);\n encoded ??= /[%+]/.test(url);\n let keyIndex = url.indexOf(\"?\", 8);\n while (keyIndex !== -1) {\n const nextKeyIndex = url.indexOf(\"&\", keyIndex + 1);\n let valueIndex = url.indexOf(\"=\", keyIndex);\n if (valueIndex > nextKeyIndex && nextKeyIndex !== -1) {\n valueIndex = -1;\n }\n let name = url.slice(\n keyIndex + 1,\n valueIndex === -1 ? nextKeyIndex === -1 ? void 0 : nextKeyIndex : valueIndex\n );\n if (encoded) {\n name = _decodeURI(name);\n }\n keyIndex = nextKeyIndex;\n if (name === \"\") {\n continue;\n }\n let value;\n if (valueIndex === -1) {\n value = \"\";\n } else {\n value = url.slice(valueIndex + 1, nextKeyIndex === -1 ? void 0 : nextKeyIndex);\n if (encoded) {\n value = _decodeURI(value);\n }\n }\n if (multiple) {\n if (!(results[name] && Array.isArray(results[name]))) {\n results[name] = [];\n }\n ;\n results[name].push(value);\n } else {\n results[name] ??= value;\n }\n }\n return key ? results[key] : results;\n};\nvar getQueryParam = _getQueryParam;\nvar getQueryParams = (url, key) => {\n return _getQueryParam(url, key, true);\n};\nvar decodeURIComponent_ = decodeURIComponent;\nexport {\n checkOptionalParameter,\n decodeURIComponent_,\n getPath,\n getPathNoStrict,\n getPattern,\n getQueryParam,\n getQueryParams,\n getQueryStrings,\n mergePath,\n splitPath,\n splitRoutingPath,\n tryDecode,\n tryDecodeURI,\n tryDecodeURIComponent\n};\n", "// src/request.ts\nimport { HTTPException } from \"./http-exception.js\";\nimport { GET_MATCH_RESULT } from \"./request/constants.js\";\nimport { parseBody } from \"./utils/body.js\";\nimport { getQueryParam, getQueryParams, tryDecodeURIComponent } from \"./utils/url.js\";\nvar HonoRequest = class {\n /**\n * `.raw` can get the raw Request object.\n *\n * @see {@link https://hono.dev/docs/api/request#raw}\n *\n * @example\n * ```ts\n * // For Cloudflare Workers\n * app.post('/', async (c) => {\n * const metadata = c.req.raw.cf?.hostMetadata?\n * ...\n * })\n * ```\n */\n raw;\n #validatedData;\n // Short name of validatedData\n #matchResult;\n routeIndex = 0;\n /**\n * `.path` can get the pathname of the request.\n *\n * @see {@link https://hono.dev/docs/api/request#path}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const pathname = c.req.path // `/about/me`\n * })\n * ```\n */\n path;\n bodyCache = {};\n constructor(request, path = \"/\", matchResult = [[]]) {\n this.raw = request;\n this.path = path;\n this.#matchResult = matchResult;\n }\n param(key) {\n return key ? this.#getDecodedParam(key) : this.#getAllDecodedParams();\n }\n #getDecodedParam(key) {\n const paramKey = this.#matchResult[0][this.routeIndex]?.[1][key];\n const param = this.#getParamValue(paramKey);\n return param && tryDecodeURIComponent(param);\n }\n #getAllDecodedParams() {\n const decoded = {};\n const keys = Object.keys(this.#matchResult[0][this.routeIndex]?.[1] ?? {});\n for (const key of keys) {\n const value = this.#getParamValue(this.#matchResult[0][this.routeIndex][1][key]);\n if (value !== void 0) {\n decoded[key] = tryDecodeURIComponent(value);\n }\n }\n return decoded;\n }\n #getParamValue(paramKey) {\n return this.#matchResult[1] ? this.#matchResult[1][paramKey] : paramKey;\n }\n query(key) {\n return getQueryParam(this.url, key);\n }\n queries(key) {\n return getQueryParams(this.url, key);\n }\n header(name) {\n if (name) {\n return this.raw.headers.get(name) ?? void 0;\n }\n const headerData = /* @__PURE__ */ Object.create(null);\n this.raw.headers.forEach((value, key) => {\n headerData[key] = value;\n });\n return headerData;\n }\n async parseBody(options) {\n return parseBody(this, options);\n }\n #cachedBody = (key) => {\n const { bodyCache, raw } = this;\n const cachedBody = bodyCache[key];\n if (cachedBody) {\n return cachedBody;\n }\n for (const anyCachedKey in bodyCache) {\n return bodyCache[anyCachedKey].then((body) => {\n if (anyCachedKey === \"json\") {\n body = JSON.stringify(body);\n }\n return new Response(body)[key]();\n });\n }\n return bodyCache[key] = raw[key]();\n };\n /**\n * `.json()` can parse Request body of type `application/json`\n *\n * @see {@link https://hono.dev/docs/api/request#json}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.json()\n * })\n * ```\n */\n json() {\n return this.#cachedBody(\"text\").then((text) => JSON.parse(text));\n }\n /**\n * `.text()` can parse Request body of type `text/plain`\n *\n * @see {@link https://hono.dev/docs/api/request#text}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.text()\n * })\n * ```\n */\n text() {\n return this.#cachedBody(\"text\");\n }\n /**\n * `.arrayBuffer()` parse Request body as an `ArrayBuffer`\n *\n * @see {@link https://hono.dev/docs/api/request#arraybuffer}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.arrayBuffer()\n * })\n * ```\n */\n arrayBuffer() {\n return this.#cachedBody(\"arrayBuffer\");\n }\n /**\n * `.bytes()` parses the request body as a `Uint8Array`.\n *\n * @see {@link https://hono.dev/docs/api/request#bytes}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.bytes()\n * })\n * ```\n */\n bytes() {\n return this.#cachedBody(\"arrayBuffer\").then((buffer) => new Uint8Array(buffer));\n }\n /**\n * Parses the request body as a `Blob`.\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.blob();\n * });\n * ```\n * @see https://hono.dev/docs/api/request#blob\n */\n blob() {\n return this.#cachedBody(\"blob\");\n }\n /**\n * Parses the request body as `FormData`.\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.formData();\n * });\n * ```\n * @see https://hono.dev/docs/api/request#formdata\n */\n formData() {\n return this.#cachedBody(\"formData\");\n }\n /**\n * Adds validated data to the request.\n *\n * @param target - The target of the validation.\n * @param data - The validated data to add.\n */\n addValidatedData(target, data) {\n ;\n (this.#validatedData ??= {})[target] = data;\n }\n valid(target) {\n return this.#validatedData?.[target];\n }\n /**\n * `.url()` can get the request url strings.\n *\n * @see {@link https://hono.dev/docs/api/request#url}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const url = c.req.url // `http://localhost:8787/about/me`\n * ...\n * })\n * ```\n */\n get url() {\n return this.raw.url;\n }\n /**\n * `.method()` can get the method name of the request.\n *\n * @see {@link https://hono.dev/docs/api/request#method}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const method = c.req.method // `GET`\n * })\n * ```\n */\n get method() {\n return this.raw.method;\n }\n get [GET_MATCH_RESULT]() {\n return this.#matchResult;\n }\n /**\n * `.matchedRoutes()` can return a matched route in the handler\n *\n * @deprecated\n *\n * Use matchedRoutes helper defined in \"hono/route\" instead.\n *\n * @see {@link https://hono.dev/docs/api/request#matchedroutes}\n *\n * @example\n * ```ts\n * app.use('*', async function logger(c, next) {\n * await next()\n * c.req.matchedRoutes.forEach(({ handler, method, path }, i) => {\n * const name = handler.name || (handler.length < 2 ? '[handler]' : '[middleware]')\n * console.log(\n * method,\n * ' ',\n * path,\n * ' '.repeat(Math.max(10 - path.length, 0)),\n * name,\n * i === c.req.routeIndex ? '<- respond from here' : ''\n * )\n * })\n * })\n * ```\n */\n get matchedRoutes() {\n return this.#matchResult[0].map(([[, route]]) => route);\n }\n /**\n * `routePath()` can retrieve the path registered within the handler\n *\n * @deprecated\n *\n * Use routePath helper defined in \"hono/route\" instead.\n *\n * @see {@link https://hono.dev/docs/api/request#routepath}\n *\n * @example\n * ```ts\n * app.get('/posts/:id', (c) => {\n * return c.json({ path: c.req.routePath })\n * })\n * ```\n */\n get routePath() {\n return this.#matchResult[0].map(([[, route]]) => route)[this.routeIndex].path;\n }\n};\nvar cloneRawRequest = async (req) => {\n if (!req.raw.bodyUsed) {\n return req.raw.clone();\n }\n const cacheKey = Object.keys(req.bodyCache)[0];\n if (!cacheKey) {\n throw new HTTPException(500, {\n message: \"Cannot clone request: body was already consumed and not cached. Please use HonoRequest methods (e.g., req.json(), req.text()) instead of consuming req.raw directly.\"\n });\n }\n let body = await req[cacheKey]();\n const headers = req.header();\n if (cacheKey === \"json\") {\n body = JSON.stringify(body);\n delete headers[\"content-length\"];\n } else if (body instanceof FormData) {\n delete headers[\"content-type\"];\n delete headers[\"content-length\"];\n }\n const requestInit = {\n body,\n cache: req.raw.cache,\n credentials: req.raw.credentials,\n headers,\n integrity: req.raw.integrity,\n keepalive: req.raw.keepalive,\n method: req.method,\n mode: req.raw.mode,\n redirect: req.raw.redirect,\n referrer: req.raw.referrer,\n referrerPolicy: req.raw.referrerPolicy,\n signal: req.raw.signal\n };\n return new Request(req.url, requestInit);\n};\nexport {\n HonoRequest,\n cloneRawRequest\n};\n", "// src/utils/html.ts\nvar HtmlEscapedCallbackPhase = {\n Stringify: 1,\n BeforeStream: 2,\n Stream: 3\n};\nvar raw = (value, callbacks) => {\n const escapedString = new String(value);\n escapedString.isEscaped = true;\n escapedString.callbacks = callbacks;\n return escapedString;\n};\nvar escapeRe = /[&<>'\"]/;\nvar stringBufferToString = async (buffer, callbacks) => {\n let str = \"\";\n callbacks ||= [];\n const resolvedBuffer = await Promise.all(buffer);\n for (let i = resolvedBuffer.length - 1; ; i--) {\n str += resolvedBuffer[i];\n i--;\n if (i < 0) {\n break;\n }\n let r = resolvedBuffer[i];\n if (typeof r === \"object\") {\n callbacks.push(...r.callbacks || []);\n }\n const isEscaped = r.isEscaped;\n r = await (typeof r === \"object\" ? r.toString() : r);\n if (typeof r === \"object\") {\n callbacks.push(...r.callbacks || []);\n }\n if (r.isEscaped ?? isEscaped) {\n str += r;\n } else {\n const buf = [str];\n escapeToBuffer(r, buf);\n str = buf[0];\n }\n }\n return raw(str, callbacks);\n};\nvar escapeToBuffer = (str, buffer) => {\n const match = str.search(escapeRe);\n if (match === -1) {\n buffer[0] += str;\n return;\n }\n let escape;\n let index;\n let lastIndex = 0;\n for (index = match; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escape = \""\";\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/context.ts\nimport { HonoRequest } from \"./request.js\";\nimport { HtmlEscapedCallbackPhase, resolveCallback } from \"./utils/html.js\";\nvar TEXT_PLAIN = \"text/plain; charset=UTF-8\";\nvar setDefaultContentType = (contentType, headers) => {\n return {\n \"Content-Type\": contentType,\n ...headers\n };\n};\nvar createResponseInstance = (body, init) => new Response(body, init);\nvar Context = class {\n #rawRequest;\n #req;\n /**\n * `.env` can get bindings (environment variables, secrets, KV namespaces, D1 database, R2 bucket etc.) in Cloudflare Workers.\n *\n * @see {@link https://hono.dev/docs/api/context#env}\n *\n * @example\n * ```ts\n * // Environment object for Cloudflare Workers\n * app.get('*', async c => {\n * const counter = c.env.COUNTER\n * })\n * ```\n */\n env = {};\n #var;\n finalized = false;\n /**\n * `.error` can get the error object from the middleware if the Handler throws an error.\n *\n * @see {@link https://hono.dev/docs/api/context#error}\n *\n * @example\n * ```ts\n * app.use('*', async (c, next) => {\n * await next()\n * if (c.error) {\n * // do something...\n * }\n * })\n * ```\n */\n error;\n #status;\n #executionCtx;\n #res;\n #layout;\n #renderer;\n #notFoundHandler;\n #preparedHeaders;\n #matchResult;\n #path;\n /**\n * Creates an instance of the Context class.\n *\n * @param req - The Request object.\n * @param options - Optional configuration options for the context.\n */\n constructor(req, options) {\n this.#rawRequest = req;\n if (options) {\n this.#executionCtx = options.executionCtx;\n this.env = options.env;\n this.#notFoundHandler = options.notFoundHandler;\n this.#path = options.path;\n this.#matchResult = options.matchResult;\n }\n }\n /**\n * `.req` is the instance of {@link HonoRequest}.\n */\n get req() {\n this.#req ??= new HonoRequest(this.#rawRequest, this.#path, this.#matchResult);\n return this.#req;\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#event}\n * The FetchEvent associated with the current request.\n *\n * @throws Will throw an error if the context does not have a FetchEvent.\n */\n get event() {\n if (this.#executionCtx && \"respondWith\" in this.#executionCtx) {\n return this.#executionCtx;\n } else {\n throw Error(\"This context has no FetchEvent\");\n }\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#executionctx}\n * The ExecutionContext associated with the current request.\n *\n * @throws Will throw an error if the context does not have an ExecutionContext.\n */\n get executionCtx() {\n if (this.#executionCtx) {\n return this.#executionCtx;\n } else {\n throw Error(\"This context has no ExecutionContext\");\n }\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#res}\n * The Response object for the current request.\n */\n get res() {\n return this.#res ||= createResponseInstance(null, {\n headers: this.#preparedHeaders ??= new Headers()\n });\n }\n /**\n * Sets the Response object for the current request.\n *\n * @param _res - The Response object to set.\n */\n set res(_res) {\n if (this.#res && _res) {\n _res = createResponseInstance(_res.body, _res);\n for (const [k, v] of this.#res.headers.entries()) {\n if (k === \"content-type\") {\n continue;\n }\n if (k === \"set-cookie\") {\n const cookies = this.#res.headers.getSetCookie();\n _res.headers.delete(\"set-cookie\");\n for (const cookie of cookies) {\n _res.headers.append(\"set-cookie\", cookie);\n }\n } else {\n _res.headers.set(k, v);\n }\n }\n }\n this.#res = _res;\n this.finalized = true;\n }\n /**\n * `.render()` can create a response within a layout.\n *\n * @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n *\n * @example\n * ```ts\n * app.get('/', (c) => {\n * return c.render('Hello!')\n * })\n * ```\n */\n render = (...args) => {\n this.#renderer ??= (content) => this.html(content);\n return this.#renderer(...args);\n };\n /**\n * Sets the layout for the response.\n *\n * @param layout - The layout to set.\n * @returns The layout function.\n */\n setLayout = (layout) => this.#layout = layout;\n /**\n * Gets the current layout for the response.\n *\n * @returns The current layout function.\n */\n getLayout = () => this.#layout;\n /**\n * `.setRenderer()` can set the layout in the custom middleware.\n *\n * @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n *\n * @example\n * ```tsx\n * app.use('*', async (c, next) => {\n * c.setRenderer((content) => {\n * return c.html(\n * <html>\n * <body>\n * <p>{content}</p>\n * </body>\n * </html>\n * )\n * })\n * await next()\n * })\n * ```\n */\n setRenderer = (renderer) => {\n this.#renderer = renderer;\n };\n /**\n * `.header()` can set headers.\n *\n * @see {@link https://hono.dev/docs/api/context#header}\n *\n * @example\n * ```ts\n * app.get('/welcome', (c) => {\n * // Set headers\n * c.header('X-Message', 'Hello!')\n * c.header('Content-Type', 'text/plain')\n *\n * // Append multiple headers using the append option (e.g. Vary)\n * c.header('Vary', 'Accept-Encoding', { append: true })\n * c.header('Vary', 'User-Agent', { append: true })\n *\n * return c.body('Thank you for coming')\n * })\n * ```\n */\n header = (name, value, options) => {\n if (this.finalized) {\n this.#res = createResponseInstance(this.#res.body, this.#res);\n }\n const headers = this.#res ? this.#res.headers : this.#preparedHeaders ??= new Headers();\n if (value === void 0) {\n headers.delete(name);\n } else if (options?.append) {\n headers.append(name, value);\n } else {\n headers.set(name, value);\n }\n };\n status = (status) => {\n this.#status = status;\n };\n /**\n * `.set()` can set the value specified by the key.\n *\n * @see {@link https://hono.dev/docs/api/context#set-get}\n *\n * @example\n * ```ts\n * app.use('*', async (c, next) => {\n * c.set('message', 'Hono is hot!!')\n * await next()\n * })\n * ```\n */\n set = (key, value) => {\n this.#var ??= /* @__PURE__ */ new Map();\n this.#var.set(key, value);\n };\n /**\n * `.get()` can use the value specified by the key.\n *\n * @see {@link https://hono.dev/docs/api/context#set-get}\n *\n * @example\n * ```ts\n * app.get('/', (c) => {\n * const message = c.get('message')\n * return c.text(`The message is \"${message}\"`)\n * })\n * ```\n */\n get = (key) => {\n return this.#var ? this.#var.get(key) : void 0;\n };\n /**\n * `.var` can access the value of a variable.\n *\n * @see {@link https://hono.dev/docs/api/context#var}\n *\n * @example\n * ```ts\n * const result = c.var.client.oneMethod()\n * ```\n */\n // c.var.propName is a read-only\n get var() {\n if (!this.#var) {\n return {};\n }\n return Object.fromEntries(this.#var);\n }\n #newResponse(data, arg, headers) {\n let responseHeaders = this.#res ? new Headers(this.#res.headers) : this.#preparedHeaders;\n if (typeof arg === \"object\" && arg.headers) {\n responseHeaders ??= new Headers();\n for (const [key, value] of new Headers(arg.headers)) {\n if (key === \"set-cookie\") {\n responseHeaders.append(key, value);\n } else {\n responseHeaders.set(key, value);\n }\n }\n }\n if (headers) {\n if (!responseHeaders) {\n let count = 0;\n for (const k in headers) {\n if (++count > 1 || typeof headers[k] !== \"string\") {\n responseHeaders = new Headers();\n break;\n }\n }\n }\n if (responseHeaders) {\n for (const k in headers) {\n const v = headers[k];\n if (typeof v === \"string\") {\n responseHeaders.set(k, v);\n } else {\n responseHeaders.delete(k);\n for (const v2 of v) {\n responseHeaders.append(k, v2);\n }\n }\n }\n }\n }\n const status = typeof arg === \"number\" ? arg : arg?.status ?? this.#status;\n return createResponseInstance(data, {\n status,\n headers: responseHeaders ?? headers\n });\n }\n newResponse = (...args) => this.#newResponse(...args);\n /**\n * `.body()` can return the HTTP response.\n * You can set headers with `.header()` and set HTTP status code with `.status`.\n * This can also be set in `.text()`, `.json()` and so on.\n *\n * @see {@link https://hono.dev/docs/api/context#body}\n *\n * @example\n * ```ts\n * app.get('/welcome', (c) => {\n * // Set headers\n * c.header('X-Message', 'Hello!')\n * c.header('Content-Type', 'text/plain')\n * // Set HTTP status code\n * c.status(201)\n *\n * // Return the response body\n * return c.body('Thank you for coming')\n * })\n * ```\n */\n body = (data, arg, headers) => this.#newResponse(data, arg, headers);\n /**\n * `.text()` can render text as `Content-Type:text/plain`.\n *\n * @see {@link https://hono.dev/docs/api/context#text}\n *\n * @example\n * ```ts\n * app.get('/say', (c) => {\n * return c.text('Hello!')\n * })\n * ```\n */\n text = (text, arg, headers) => {\n return !this.#preparedHeaders && !this.#status && !arg && !headers && !this.finalized ? new Response(text) : this.#newResponse(\n text,\n arg,\n setDefaultContentType(TEXT_PLAIN, headers)\n );\n };\n /**\n * `.json()` can render JSON as `Content-Type:application/json`.\n *\n * @see {@link https://hono.dev/docs/api/context#json}\n *\n * @example\n * ```ts\n * app.get('/api', (c) => {\n * return c.json({ message: 'Hello!' })\n * })\n * ```\n */\n json = (object, arg, headers) => {\n return this.#newResponse(\n JSON.stringify(object),\n arg,\n setDefaultContentType(\"application/json\", headers)\n );\n };\n html = (html, arg, headers) => {\n const res = (html2) => this.#newResponse(html2, arg, setDefaultContentType(\"text/html; charset=UTF-8\", headers));\n return typeof html === \"object\" ? resolveCallback(html, HtmlEscapedCallbackPhase.Stringify, false, {}).then(res) : res(html);\n };\n /**\n * `.redirect()` can Redirect, default status code is 302.\n *\n * @see {@link https://hono.dev/docs/api/context#redirect}\n *\n * @example\n * ```ts\n * app.get('/redirect', (c) => {\n * return c.redirect('/')\n * })\n * app.get('/redirect-permanently', (c) => {\n * return c.redirect('/', 301)\n * })\n * ```\n */\n redirect = (location, status) => {\n const locationString = String(location);\n this.header(\n \"Location\",\n // Multibyes should be encoded\n // eslint-disable-next-line no-control-regex\n !/[^\\x00-\\xFF]/.test(locationString) ? locationString : encodeURI(locationString)\n );\n return this.newResponse(null, status ?? 302);\n };\n /**\n * `.notFound()` can return the Not Found Response.\n *\n * @see {@link https://hono.dev/docs/api/context#notfound}\n *\n * @example\n * ```ts\n * app.get('/notfound', (c) => {\n * return c.notFound()\n * })\n * ```\n */\n notFound = () => {\n this.#notFoundHandler ??= () => createResponseInstance();\n return this.#notFoundHandler(this);\n };\n};\nexport {\n Context,\n TEXT_PLAIN\n};\n", "// src/router.ts\nvar METHOD_NAME_ALL = \"ALL\";\nvar METHOD_NAME_ALL_LOWERCASE = \"all\";\nvar METHODS = [\"get\", \"post\", \"put\", \"delete\", \"options\", \"patch\", \"query\"];\nvar MESSAGE_MATCHER_IS_ALREADY_BUILT = \"Can not add a route since the matcher is already built.\";\nvar UnsupportedPathError = class extends Error {\n};\nexport {\n MESSAGE_MATCHER_IS_ALREADY_BUILT,\n METHODS,\n METHOD_NAME_ALL,\n METHOD_NAME_ALL_LOWERCASE,\n UnsupportedPathError\n};\n", "// src/utils/constants.ts\nvar COMPOSED_HANDLER = \"__COMPOSED_HANDLER\";\nexport {\n COMPOSED_HANDLER\n};\n", "// src/hono-base.ts\nimport { compose } from \"./compose.js\";\nimport { Context } from \"./context.js\";\nimport { METHODS, METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE } from \"./router.js\";\nimport { COMPOSED_HANDLER } from \"./utils/constants.js\";\nimport { getPath, getPathNoStrict, mergePath } from \"./utils/url.js\";\nvar notFoundHandler = (c) => {\n return c.text(\"404 Not Found\", 404);\n};\nvar errorHandler = (err, c) => {\n if (\"getResponse\" in err) {\n const res = err.getResponse();\n return c.newResponse(res.body, res);\n }\n console.error(err);\n return c.text(\"Internal Server Error\", 500);\n};\nvar Hono = class _Hono {\n get;\n post;\n put;\n delete;\n options;\n patch;\n query;\n all;\n on;\n use;\n /*\n This class is like an abstract class and does not have a router.\n To use it, inherit the class and implement router in the constructor.\n */\n router;\n getPath;\n // Cannot use `#` because it requires visibility at JavaScript runtime.\n _basePath = \"/\";\n #path = \"/\";\n routes = [];\n constructor(options = {}) {\n const allMethods = [...METHODS, METHOD_NAME_ALL_LOWERCASE];\n allMethods.forEach((method) => {\n this[method] = (args1, ...args) => {\n const methodName = method.toUpperCase();\n if (typeof args1 === \"string\") {\n this.#path = args1;\n } else {\n this.#addRoute(methodName, this.#path, args1);\n }\n args.forEach((handler) => {\n this.#addRoute(methodName, this.#path, handler);\n });\n return this;\n };\n });\n this.on = (method, path, ...handlers) => {\n for (const p of [path].flat()) {\n this.#path = p;\n for (const m of [method].flat()) {\n const methodName = m.toUpperCase();\n for (const handler of handlers) {\n this.#addRoute(methodName, this.#path, handler);\n }\n }\n }\n return this;\n };\n this.use = (arg1, ...handlers) => {\n if (typeof arg1 === \"string\") {\n this.#path = arg1;\n } else {\n this.#path = \"*\";\n handlers.unshift(arg1);\n }\n handlers.forEach((handler) => {\n this.#addRoute(METHOD_NAME_ALL, this.#path, handler);\n });\n return this;\n };\n const { strict, ...optionsWithoutStrict } = options;\n Object.assign(this, optionsWithoutStrict);\n this.getPath = strict ?? true ? options.getPath ?? getPath : getPathNoStrict;\n }\n #clone() {\n const clone = new _Hono({\n router: this.router,\n getPath: this.getPath\n });\n clone.errorHandler = this.errorHandler;\n clone.#notFoundHandler = this.#notFoundHandler;\n clone.routes = this.routes;\n return clone;\n }\n #notFoundHandler = notFoundHandler;\n // Cannot use `#` because it requires visibility at JavaScript runtime.\n errorHandler = errorHandler;\n /**\n * `.route()` allows grouping other Hono instance in routes.\n *\n * @see {@link https://hono.dev/docs/api/routing#grouping}\n *\n * @param {string} path - base Path\n * @param {Hono} app - other Hono instance\n * @returns {Hono} routed Hono instance\n *\n * @example\n * ```ts\n * const app = new Hono()\n * const app2 = new Hono()\n *\n * app2.get(\"/user\", (c) => c.text(\"user\"))\n * app.route(\"/api\", app2) // GET /api/user\n * ```\n */\n route(path, app) {\n const subApp = this.basePath(path);\n app.routes.map((r) => {\n let handler;\n if (app.errorHandler === errorHandler) {\n handler = r.handler;\n } else {\n handler = async (c, next) => (await compose([], app.errorHandler)(c, () => r.handler(c, next))).res;\n handler[COMPOSED_HANDLER] = r.handler;\n }\n subApp.#addRoute(r.method, r.path, handler, r.basePath);\n });\n return this;\n }\n /**\n * `.basePath()` allows base paths to be specified.\n *\n * @see {@link https://hono.dev/docs/api/routing#base-path}\n *\n * @param {string} path - base Path\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * const api = new Hono().basePath('/api')\n * ```\n */\n basePath(path) {\n const subApp = this.#clone();\n subApp._basePath = mergePath(this._basePath, path);\n return subApp;\n }\n /**\n * `.onError()` handles an error and returns a customized Response.\n *\n * @see {@link https://hono.dev/docs/api/hono#error-handling}\n *\n * @param {ErrorHandler} handler - request Handler for error\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * app.onError((err, c) => {\n * console.error(`${err}`)\n * return c.text('Custom Error Message', 500)\n * })\n * ```\n */\n onError = (handler) => {\n this.errorHandler = handler;\n return this;\n };\n /**\n * `.notFound()` allows you to customize a Not Found Response.\n *\n * @see {@link https://hono.dev/docs/api/hono#not-found}\n *\n * @param {NotFoundHandler} handler - request handler for not-found\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * app.notFound((c) => {\n * return c.text('Custom 404 Message', 404)\n * })\n * ```\n */\n notFound = (handler) => {\n this.#notFoundHandler = handler;\n return this;\n };\n /**\n * `.mount()` allows you to mount applications built with other frameworks into your Hono application.\n *\n * @see {@link https://hono.dev/docs/api/hono#mount}\n *\n * @param {string} path - base Path\n * @param {Function} applicationHandler - other Request Handler\n * @param {MountOptions} [options] - options of `.mount()`\n * @returns {Hono} mounted Hono instance\n *\n * @example\n * ```ts\n * import { Router as IttyRouter } from 'itty-router'\n * import { Hono } from 'hono'\n * // Create itty-router application\n * const ittyRouter = IttyRouter()\n * // GET /itty-router/hello\n * ittyRouter.get('/hello', () => new Response('Hello from itty-router'))\n *\n * const app = new Hono()\n * app.mount('/itty-router', ittyRouter.handle)\n * ```\n *\n * @example\n * ```ts\n * const app = new Hono()\n * // Send the request to another application without modification.\n * app.mount('/app', anotherApp, {\n * replaceRequest: (req) => req,\n * })\n * ```\n */\n mount(path, applicationHandler, options) {\n let replaceRequest;\n let optionHandler;\n if (options) {\n if (typeof options === \"function\") {\n optionHandler = options;\n } else {\n optionHandler = options.optionHandler;\n if (options.replaceRequest === false) {\n replaceRequest = (request) => request;\n } else {\n replaceRequest = options.replaceRequest;\n }\n }\n }\n const getOptions = optionHandler ? (c) => {\n const options2 = optionHandler(c);\n return Array.isArray(options2) ? options2 : [options2];\n } : (c) => {\n let executionContext = void 0;\n try {\n executionContext = c.executionCtx;\n } catch {\n }\n return [c.env, executionContext];\n };\n replaceRequest ||= (() => {\n const mergedPath = mergePath(this._basePath, path);\n const pathPrefixLength = mergedPath === \"/\" ? 0 : mergedPath.length;\n return (request) => {\n const url = new URL(request.url);\n url.pathname = this.getPath(request).slice(pathPrefixLength) || \"/\";\n return new Request(url, request);\n };\n })();\n const handler = async (c, next) => {\n const res = await applicationHandler(replaceRequest(c.req.raw), ...getOptions(c));\n if (res) {\n return res;\n }\n await next();\n };\n this.#addRoute(METHOD_NAME_ALL, mergePath(path, \"*\"), handler);\n return this;\n }\n #addRoute(method, path, handler, baseRoutePath) {\n path = mergePath(this._basePath, path);\n const r = {\n basePath: baseRoutePath !== void 0 ? mergePath(this._basePath, baseRoutePath) : this._basePath,\n path,\n method,\n handler\n };\n this.router.add(method, path, [handler, r]);\n this.routes.push(r);\n }\n #handleError(err, c) {\n if (err instanceof Error) {\n return this.errorHandler(err, c);\n }\n throw err;\n }\n #dispatch(request, executionCtx, env, method) {\n if (method === \"HEAD\") {\n return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, \"GET\")))();\n }\n const path = this.getPath(request, { env });\n const matchResult = this.router.match(method, path);\n const c = new Context(request, {\n path,\n matchResult,\n env,\n executionCtx,\n notFoundHandler: this.#notFoundHandler\n });\n if (matchResult[0].length === 1) {\n let res;\n try {\n res = matchResult[0][0][0][0](c, async () => {\n c.res = await this.#notFoundHandler(c);\n });\n } catch (err) {\n return this.#handleError(err, c);\n }\n return res instanceof Promise ? res.then(\n (resolved) => resolved || (c.finalized ? c.res : this.#notFoundHandler(c))\n ).catch((err) => this.#handleError(err, c)) : res ?? this.#notFoundHandler(c);\n }\n const composed = compose(matchResult[0], this.errorHandler, this.#notFoundHandler);\n return (async () => {\n try {\n const context = await composed(c);\n if (!context.finalized) {\n throw new Error(\n \"Context is not finalized. Did you forget to return a Response object or `await next()`?\"\n );\n }\n return context.res;\n } catch (err) {\n return this.#handleError(err, c);\n }\n })();\n }\n /**\n * `.fetch()` will be entry point of your app.\n *\n * @see {@link https://hono.dev/docs/api/hono#fetch}\n *\n * @param {Request} request - request Object of request\n * @param {Env} env - env Object\n * @param {ExecutionContext} executionCtx - context of execution\n * @returns {Response | Promise<Response>} response of request\n *\n */\n fetch = (request, ...rest) => {\n return this.#dispatch(request, rest[1], rest[0], request.method);\n };\n /**\n * `.request()` is a useful method for testing.\n * You can pass a URL or pathname to send a GET request.\n * app will return a Response object.\n * ```ts\n * test('GET /hello is ok', async () => {\n * const res = await app.request('/hello')\n * expect(res.status).toBe(200)\n * })\n * ```\n * @see https://hono.dev/docs/api/hono#request\n */\n request = (input, requestInit, Env, executionCtx) => {\n if (input instanceof Request) {\n return this.fetch(requestInit ? new Request(input, requestInit) : input, Env, executionCtx);\n }\n input = input.toString();\n return this.fetch(\n new Request(\n /^https?:\\/\\//.test(input) ? input : `http://localhost${mergePath(\"/\", input)}`,\n requestInit\n ),\n Env,\n executionCtx\n );\n };\n /**\n * `.fire()` automatically adds a global fetch event listener.\n * This can be useful for environments that adhere to the Service Worker API, such as non-ES module Cloudflare Workers.\n * @deprecated\n * Use `fire` from `hono/service-worker` instead.\n * ```ts\n * import { Hono } from 'hono'\n * import { fire } from 'hono/service-worker'\n *\n * const app = new Hono()\n * // ...\n * fire(app)\n * ```\n * @see https://hono.dev/docs/api/hono#fire\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API\n * @see https://developers.cloudflare.com/workers/reference/migrate-to-module-workers/\n */\n fire = () => {\n addEventListener(\"fetch\", (event) => {\n event.respondWith(this.#dispatch(event.request, event, void 0, event.request.method));\n });\n };\n};\nexport {\n Hono as HonoBase\n};\n", "// src/router/utils.ts\nvar createNullObject = () => /* @__PURE__ */ Object.create(null);\nexport {\n createNullObject\n};\n", "// src/router/reg-exp-router/matcher.ts\nimport { METHOD_NAME_ALL } from \"../../router.js\";\nvar emptyParam = [];\nfunction match(method, path) {\n const matchers = this.buildAllMatchers();\n const match2 = ((method2, path2) => {\n const matcher = matchers[method2] || matchers[METHOD_NAME_ALL];\n const staticMatch = matcher[2][path2];\n if (staticMatch) {\n return staticMatch;\n }\n const match3 = path2.match(matcher[0]);\n if (!match3) {\n return [[], emptyParam];\n }\n const index = match3.indexOf(\"\", 1);\n return [matcher[1][index], match3];\n });\n this.match = match2;\n return match2(method, path);\n}\nexport {\n emptyParam,\n match\n};\n", "// src/router/reg-exp-router/node.ts\nimport { createNullObject } from \"../utils.js\";\nvar LABEL_REG_EXP_STR = \"[^/]+\";\nvar ONLY_WILDCARD_REG_EXP_STR = \".*\";\nvar TAIL_WILDCARD_REG_EXP_STR = \"(?:|/.*)\";\nvar PATH_ERROR = /* @__PURE__ */ Symbol();\nvar regExpMetaChars = new Set(\".\\\\+*[^]$()\");\nfunction compareKey(a, b) {\n if (a.length === 1) {\n return b.length === 1 ? a < b ? -1 : 1 : -1;\n }\n if (b.length === 1) {\n return 1;\n }\n if (a === ONLY_WILDCARD_REG_EXP_STR || a === TAIL_WILDCARD_REG_EXP_STR) {\n return b === TAIL_WILDCARD_REG_EXP_STR ? -1 : 1;\n } else if (b === ONLY_WILDCARD_REG_EXP_STR || b === TAIL_WILDCARD_REG_EXP_STR) {\n return -1;\n }\n if (a === LABEL_REG_EXP_STR) {\n return 1;\n } else if (b === LABEL_REG_EXP_STR) {\n return -1;\n }\n return a.length === b.length ? a < b ? -1 : 1 : b.length - a.length;\n}\nvar Node = class _Node {\n // handler index of a dynamic path, or -1 for a static path terminal\n #index;\n #varIndex;\n #children = createNullObject();\n insert(tokens, index, paramMap, context, isStatic) {\n let node = this;\n for (let i = 0, len = tokens.length; i < len; i++) {\n const token = tokens[i];\n const pattern = token.length === 1 ? token === \"*\" ? i === len - 1 ? [\"\", \"\", ONLY_WILDCARD_REG_EXP_STR] : [\"\", \"\", LABEL_REG_EXP_STR] : null : token === \"/*\" ? [\"\", \"\", TAIL_WILDCARD_REG_EXP_STR] : token.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n let nextNode;\n if (pattern) {\n const name = pattern[1];\n let regexpStr = pattern[2] || LABEL_REG_EXP_STR;\n if (name && pattern[2]) {\n if (regexpStr === \".*\") {\n throw PATH_ERROR;\n }\n regexpStr = regexpStr.replace(/^\\((?!\\?:)(?=[^)]+\\)$)/, \"(?:\");\n if (/\\((?!\\?:)/.test(regexpStr)) {\n throw PATH_ERROR;\n }\n if (regexpStr.length === 1 && regExpMetaChars.has(regexpStr)) {\n throw PATH_ERROR;\n }\n }\n nextNode = node.#children[regexpStr];\n if (!nextNode) {\n if (regexpStr !== ONLY_WILDCARD_REG_EXP_STR && regexpStr !== TAIL_WILDCARD_REG_EXP_STR) {\n for (const k in node.#children) {\n if (\n // a single-char pattern coexists with single-char literals as a literal does\n (regexpStr.length > 1 || k.length > 1) && k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR\n ) {\n throw PATH_ERROR;\n }\n }\n }\n nextNode = node.#children[regexpStr] = new _Node();\n }\n if (name !== \"\") {\n nextNode.#varIndex ??= context.varIndex++;\n paramMap.push([name, nextNode.#varIndex]);\n }\n } else {\n nextNode = node.#children[token];\n if (!nextNode) {\n for (const k in node.#children) {\n if (k.length > 1 && k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR) {\n throw PATH_ERROR;\n }\n }\n nextNode = node.#children[token] = new _Node();\n }\n }\n node = nextNode;\n }\n if (node.#index !== void 0) {\n throw PATH_ERROR;\n }\n node.#index = isStatic ? -1 : index;\n }\n buildRegExpStr() {\n const childKeys = Object.keys(this.#children).sort(compareKey);\n const strList = childKeys.map((k) => {\n const c = this.#children[k];\n const childStr = c.buildRegExpStr();\n return childStr === \"\" ? \"\" : (typeof c.#varIndex === \"number\" ? `(${k})@${c.#varIndex}` : regExpMetaChars.has(k) ? `\\\\${k}` : k) + childStr;\n }).filter(Boolean);\n if (typeof this.#index === \"number\" && this.#index !== -1) {\n strList.unshift(`#${this.#index}`);\n }\n if (strList.length === 0) {\n return \"\";\n }\n if (strList.length === 1) {\n return strList[0];\n }\n return \"(?:\" + strList.join(\"|\") + \")\";\n }\n};\nexport {\n LABEL_REG_EXP_STR,\n Node,\n ONLY_WILDCARD_REG_EXP_STR,\n PATH_ERROR,\n TAIL_WILDCARD_REG_EXP_STR\n};\n", "// src/router/reg-exp-router/trie.ts\nimport { createNullObject } from \"../utils.js\";\nimport { Node } from \"./node.js\";\nvar Trie = class {\n #context = { varIndex: 0 };\n #root = new Node();\n #index = 0;\n // dynamic path -> [handler index, param assoc]; static paths are not registered\n paths = createNullObject();\n insert(path, isStatic) {\n if (isStatic) {\n this.#root.insert(path.split(\"\"), 0, [], this.#context, true);\n return;\n }\n const paramAssoc = [];\n const groups = [];\n let markedPath = path;\n for (let i = 0; ; ) {\n let replaced = false;\n markedPath = markedPath.replace(/\\{[^}]+\\}/g, (m) => {\n const mark = `@\\\\${i}`;\n groups[i] = [mark, m];\n i++;\n replaced = true;\n return mark;\n });\n if (!replaced) {\n break;\n }\n }\n const tokens = markedPath.match(/(?::[^\\/]+)|(?:\\/\\*$)|./g) || [];\n for (let i = groups.length - 1; i >= 0; i--) {\n const [mark] = groups[i];\n for (let j = tokens.length - 1; j >= 0; j--) {\n if (tokens[j].indexOf(mark) !== -1) {\n tokens[j] = tokens[j].replace(mark, groups[i][1]);\n break;\n }\n }\n }\n this.#root.insert(tokens, this.#index, paramAssoc, this.#context, false);\n this.paths[path] = [this.#index++, paramAssoc];\n }\n buildRegExp() {\n let regexp = this.#root.buildRegExpStr();\n if (regexp === \"\") {\n return [/^$/, [], []];\n }\n let captureIndex = 0;\n const indexReplacementMap = [];\n const paramReplacementMap = [];\n regexp = regexp.replace(/#(\\d+)|@(\\d+)|\\.\\*\\$/g, (_, handlerIndex, paramIndex) => {\n if (handlerIndex !== void 0) {\n indexReplacementMap[++captureIndex] = Number(handlerIndex);\n return \"$()\";\n }\n if (paramIndex !== void 0) {\n paramReplacementMap[Number(paramIndex)] = ++captureIndex;\n return \"\";\n }\n return \"\";\n });\n return [new RegExp(`^${regexp}`), indexReplacementMap, paramReplacementMap];\n }\n};\nexport {\n Trie\n};\n", "// src/router/reg-exp-router/router.ts\nimport {\n MESSAGE_MATCHER_IS_ALREADY_BUILT,\n METHOD_NAME_ALL,\n UnsupportedPathError\n} from \"../../router.js\";\nimport { checkOptionalParameter } from \"../../utils/url.js\";\nimport { createNullObject } from \"../utils.js\";\nimport { match, emptyParam } from \"./matcher.js\";\nimport {\n LABEL_REG_EXP_STR,\n ONLY_WILDCARD_REG_EXP_STR,\n PATH_ERROR,\n TAIL_WILDCARD_REG_EXP_STR\n} from \"./node.js\";\nimport { Trie } from \"./trie.js\";\nvar wildcardRegExpCache = createNullObject();\nfunction buildWildcardRegExp(path) {\n return wildcardRegExpCache[path] ??= new RegExp(\n `^${path.replace(\n /\\/:[^/{}]+(?:\\{\\[\\^\\/]\\+})?(?=[/{]|$)|\\/?\\*$|([.\\\\+*[^\\]$()?{}|])/g,\n (match2, metaChar) => metaChar ? `\\\\${metaChar}` : match2 === \"/*\" ? TAIL_WILDCARD_REG_EXP_STR : match2 === \"*\" ? ONLY_WILDCARD_REG_EXP_STR : `/:${LABEL_REG_EXP_STR}`\n )}$`\n );\n}\nfunction findMiddleware(middleware, path) {\n for (const k of Object.keys(middleware).sort((a, b) => b.length - a.length)) {\n if (buildWildcardRegExp(k).test(path)) {\n return [...middleware[k]];\n }\n }\n return void 0;\n}\nvar RegExpRouter = class {\n name = \"RegExpRouter\";\n #middleware;\n #routes;\n #tries;\n constructor() {\n this.#middleware = { [METHOD_NAME_ALL]: createNullObject() };\n this.#routes = { [METHOD_NAME_ALL]: createNullObject() };\n this.#tries = { [METHOD_NAME_ALL]: new Trie() };\n }\n #insertPath(method, path) {\n try {\n this.#tries[method].insert(path, !/\\*|\\/:/.test(path));\n } catch (e) {\n throw e === PATH_ERROR ? new UnsupportedPathError(path) : e;\n }\n }\n add(method, path, handler) {\n const middleware = this.#middleware;\n const routes = this.#routes;\n if (!middleware) {\n throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n }\n if (!middleware[method]) {\n this.#tries[method] = new Trie();\n for (const handlerMap of [middleware, routes]) {\n handlerMap[method] = createNullObject();\n for (const p in handlerMap[METHOD_NAME_ALL]) {\n handlerMap[method][p] = [...handlerMap[METHOD_NAME_ALL][p]];\n this.#insertPath(method, p);\n }\n }\n }\n if (path === \"/*\") {\n path = \"*\";\n }\n const methods = method === METHOD_NAME_ALL ? Object.keys(middleware) : [method];\n if (/\\*$/.test(path)) {\n const re = buildWildcardRegExp(path);\n for (const m of methods) {\n if (!middleware[m][path]) {\n this.#insertPath(m, path);\n middleware[m][path] = findMiddleware(middleware[m], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || [];\n }\n }\n for (const handlerMap of [middleware, routes]) {\n for (const m of methods) {\n for (const p in handlerMap[m]) {\n re.test(p) && handlerMap[m][p].push([handler, path]);\n }\n }\n }\n return;\n }\n const paths = checkOptionalParameter(path) || [path];\n for (const path2 of paths) {\n for (const m of methods) {\n if (!routes[m][path2]) {\n this.#insertPath(m, path2);\n routes[m][path2] = findMiddleware(middleware[m], path2) || findMiddleware(middleware[METHOD_NAME_ALL], path2) || [];\n }\n routes[m][path2].push([handler, path2]);\n }\n }\n }\n match = match;\n buildAllMatchers() {\n const matchers = createNullObject();\n for (const method of Object.keys(this.#routes)) {\n matchers[method] = this.#buildMatcher(method);\n }\n this.#middleware = this.#routes = this.#tries = void 0;\n wildcardRegExpCache = createNullObject();\n return matchers;\n }\n #buildMatcher(method) {\n const middleware = this.#middleware[method];\n const routes = this.#routes[method];\n const trie = this.#tries[method];\n const staticMap = createNullObject();\n const handlerData = [];\n const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp();\n for (const r of [middleware, routes]) {\n for (const path in r) {\n const handlers = r[path];\n const pathData = trie.paths[path];\n if (!pathData) {\n staticMap[path] = [handlers.map(([h]) => [h, createNullObject()]), emptyParam];\n continue;\n }\n handlerData[pathData[0]] = handlers.map(([h, handlerPath]) => [\n h,\n trie.paths[handlerPath][1].reduceRight((map, [key], i) => {\n map[key] = paramReplacementMap[pathData[1][i][1]];\n return map;\n }, createNullObject())\n ]);\n }\n }\n return [regexp, indexReplacementMap.map((i) => handlerData[i]), staticMap];\n }\n};\nexport {\n RegExpRouter\n};\n", "// src/router/smart-router/router.ts\nimport { MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError } from \"../../router.js\";\nvar SmartRouter = class {\n name = \"SmartRouter\";\n #routers = [];\n #routes = [];\n constructor(init) {\n this.#routers = init.routers;\n }\n add(method, path, handler) {\n if (!this.#routes) {\n throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n }\n this.#routes.push([method, path, handler]);\n }\n match(method, path) {\n if (!this.#routes) {\n throw new Error(\"Fatal error\");\n }\n const routers = this.#routers;\n const routes = this.#routes;\n const len = routers.length;\n let i = 0;\n let res;\n for (; i < len; i++) {\n const router = routers[i];\n try {\n for (let i2 = 0, len2 = routes.length; i2 < len2; i2++) {\n router.add(...routes[i2]);\n }\n res = router.match(method, path);\n } catch (e) {\n if (e instanceof UnsupportedPathError) {\n continue;\n }\n throw e;\n }\n this.match = router.match.bind(router);\n this.#routers = [router];\n this.#routes = void 0;\n break;\n }\n if (i === len) {\n throw new Error(\"Fatal error\");\n }\n this.name = `SmartRouter + ${this.activeRouter.name}`;\n return res;\n }\n get activeRouter() {\n if (this.#routes || this.#routers.length !== 1) {\n throw new Error(\"No active router has been determined yet.\");\n }\n return this.#routers[0];\n }\n};\nexport {\n SmartRouter\n};\n", "// src/router/trie-router/node.ts\nimport { METHOD_NAME_ALL } from \"../../router.js\";\nimport { getPattern, splitPath, splitRoutingPath } from \"../../utils/url.js\";\nimport { createNullObject } from \"../utils.js\";\nvar emptyParams = createNullObject();\nvar order = 0;\nvar Node = class _Node {\n #methods = [];\n #children = createNullObject();\n #patterns = [];\n #pattern;\n #params = emptyParams;\n insert(method, path, handler) {\n let curNode = this;\n const parts = splitRoutingPath(path);\n const possibleKeys = /* @__PURE__ */ new Set();\n let i = 0;\n for (const p of parts) {\n const nextP = parts[++i];\n const pattern = getPattern(p, nextP) || (nextP === void 0 && p && p.indexOf(\"*\") === p.length - 1 ? p : null);\n const isParam = Array.isArray(pattern);\n const key = isParam ? pattern[0] : pattern || p;\n const child = curNode.#children[key] ||= new _Node();\n if (pattern && !child.#pattern) {\n child.#pattern = pattern;\n curNode.#patterns.push(child);\n }\n curNode = child;\n if (isParam) {\n possibleKeys.add(pattern[1]);\n }\n }\n curNode.#methods.push({\n [method]: {\n handler,\n possibleKeys: [...possibleKeys],\n score: ++order\n }\n });\n }\n #pushHandlerSets(handlerSets, node, method, nodeParams, params) {\n for (let i = 0, len = node.#methods.length; i < len; i++) {\n const m = node.#methods[i];\n const handlerSet = m[method] || m[METHOD_NAME_ALL];\n if (handlerSet) {\n handlerSet.params = createNullObject();\n handlerSets.push(handlerSet);\n for (let i2 = 0, len2 = handlerSet.possibleKeys.length; i2 < len2; i2++) {\n const key = handlerSet.possibleKeys[i2];\n handlerSet.params[key] = params?.[key] && !i2 ? params[key] : nodeParams[key] ?? params?.[key];\n }\n }\n }\n }\n search(method, path) {\n const handlerSets = [];\n this.#params = emptyParams;\n const curNode = this;\n let curNodes = [curNode];\n const parts = splitPath(path);\n const curNodesQueue = [];\n const len = parts.length;\n let partOffsets = null;\n for (let i = 0; i < len; i++) {\n const part = parts[i];\n const isLast = i === len - 1;\n const tempNodes = [];\n for (let j = 0, len2 = curNodes.length; j < len2; j++) {\n const node = curNodes[j];\n const nextNode = node.#children[part];\n if (nextNode) {\n nextNode.#params = node.#params;\n if (isLast) {\n if (nextNode.#children[\"*\"]) {\n this.#pushHandlerSets(handlerSets, nextNode.#children[\"*\"], method, node.#params);\n }\n this.#pushHandlerSets(handlerSets, nextNode, method, node.#params);\n } else {\n tempNodes.push(nextNode);\n }\n }\n for (const child of node.#patterns) {\n const pattern = child.#pattern;\n const params = node.#params === emptyParams ? {} : { ...node.#params };\n if (typeof pattern === \"string\") {\n if (pattern === \"*\" || part.startsWith(pattern.slice(0, -1))) {\n this.#pushHandlerSets(handlerSets, child, method, node.#params);\n if (pattern === \"*\") {\n child.#params = params;\n tempNodes.push(child);\n }\n }\n continue;\n }\n const [, name, matcher] = pattern;\n if (!part && matcher === true) {\n continue;\n }\n if (matcher !== true) {\n if (!partOffsets) {\n partOffsets = [];\n let offset = path[0] === \"/\" ? 1 : 0;\n for (let p = 0; p < len; p++) {\n partOffsets[p] = offset;\n offset += parts[p].length + 1;\n }\n }\n const restPathString = path.slice(partOffsets[i]);\n const m = matcher.exec(restPathString);\n if (m) {\n params[name] = m[0];\n this.#pushHandlerSets(handlerSets, child, method, node.#params, params);\n if (m[0].length === restPathString.length && child.#children[\"*\"]) {\n this.#pushHandlerSets(\n handlerSets,\n child.#children[\"*\"],\n method,\n node.#params,\n params\n );\n }\n for (const _ in child.#children) {\n child.#params = params;\n const componentCount = m[0].match(/\\//g)?.length ?? 0;\n const targetCurNodes = curNodesQueue[componentCount] ||= [];\n targetCurNodes.push(child);\n break;\n }\n continue;\n }\n }\n if (matcher === true || matcher.test(part)) {\n params[name] = part;\n if (isLast) {\n this.#pushHandlerSets(handlerSets, child, method, params, node.#params);\n if (child.#children[\"*\"]) {\n this.#pushHandlerSets(\n handlerSets,\n child.#children[\"*\"],\n method,\n params,\n node.#params\n );\n }\n } else {\n child.#params = params;\n tempNodes.push(child);\n }\n }\n }\n }\n const shifted = curNodesQueue.shift();\n curNodes = shifted ? tempNodes.concat(shifted) : tempNodes;\n }\n if (handlerSets[1]) {\n handlerSets.sort((a, b) => {\n return a.score - b.score;\n });\n }\n return [handlerSets.map(({ handler, params }) => [handler, params])];\n }\n};\nexport {\n Node\n};\n", "// src/router/trie-router/router.ts\nimport { checkOptionalParameter } from \"../../utils/url.js\";\nimport { Node } from \"./node.js\";\nvar TrieRouter = class {\n name = \"TrieRouter\";\n #node = new Node();\n add(method, path, handler) {\n for (const result of checkOptionalParameter(path) || [path]) {\n this.#node.insert(method, result, handler);\n }\n }\n match(method, path) {\n return this.#node.search(method, path);\n }\n};\nexport {\n TrieRouter\n};\n", "// src/hono.ts\nimport { HonoBase } from \"./hono-base.js\";\nimport { RegExpRouter } from \"./router/reg-exp-router/index.js\";\nimport { SmartRouter } from \"./router/smart-router/index.js\";\nimport { TrieRouter } from \"./router/trie-router/index.js\";\nvar Hono = class extends HonoBase {\n /**\n * Creates an instance of the Hono class.\n *\n * @param options - Optional configuration options for the Hono instance.\n */\n constructor(options = {}) {\n super(options);\n this.router = options.router ?? new SmartRouter({\n routers: [new RegExpRouter(), new TrieRouter()]\n });\n }\n};\nexport {\n Hono\n};\n", "// src/middleware/cors/index.ts\nvar cors = (options) => {\n const opts = {\n origin: \"*\",\n allowMethods: [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\", \"QUERY\"],\n allowHeaders: [],\n exposeHeaders: [],\n ...options\n };\n const exposeHeadersStr = opts.exposeHeaders?.length ? opts.exposeHeaders.join(\",\") : void 0;\n const allowHeadersStr = opts.allowHeaders?.length ? opts.allowHeaders.join(\",\") : void 0;\n const findAllowOrigin = ((optsOrigin) => {\n if (typeof optsOrigin === \"string\") {\n if (optsOrigin === \"*\") {\n return () => optsOrigin;\n } else {\n return (origin) => optsOrigin === origin ? origin : null;\n }\n } else if (typeof optsOrigin === \"function\") {\n return optsOrigin;\n } else {\n return (origin) => optsOrigin.includes(origin) ? origin : null;\n }\n })(opts.origin);\n const findAllowMethods = ((optsAllowMethods) => {\n if (typeof optsAllowMethods === \"function\") {\n return async (origin, c) => (await optsAllowMethods(origin, c)).join(\",\");\n } else if (Array.isArray(optsAllowMethods)) {\n const methodsStr = optsAllowMethods.join(\",\");\n return () => methodsStr;\n } else {\n return () => \"\";\n }\n })(opts.allowMethods);\n return async function cors2(c, next) {\n function set(key, value) {\n c.res.headers.set(key, value);\n }\n const allowOrigin = await findAllowOrigin(c.req.header(\"origin\") || \"\", c);\n if (allowOrigin) {\n set(\"Access-Control-Allow-Origin\", allowOrigin);\n }\n if (opts.credentials) {\n set(\"Access-Control-Allow-Credentials\", \"true\");\n }\n if (exposeHeadersStr) {\n set(\"Access-Control-Expose-Headers\", exposeHeadersStr);\n }\n if (c.req.method === \"OPTIONS\") {\n if (opts.origin !== \"*\") {\n c.res.headers.append(\"Vary\", \"Origin\");\n }\n if (opts.maxAge != null) {\n set(\"Access-Control-Max-Age\", opts.maxAge.toString());\n }\n const allowMethods = await findAllowMethods(c.req.header(\"origin\") || \"\", c);\n if (allowMethods) {\n set(\"Access-Control-Allow-Methods\", allowMethods);\n }\n let headersStr = allowHeadersStr;\n if (!headersStr) {\n const requestHeaders = c.req.header(\"Access-Control-Request-Headers\");\n if (requestHeaders) {\n headersStr = requestHeaders.split(\",\").map((h) => h.trim()).join(\",\");\n }\n }\n if (headersStr) {\n set(\"Access-Control-Allow-Headers\", headersStr);\n c.res.headers.append(\"Vary\", \"Access-Control-Request-Headers\");\n }\n c.res.headers.delete(\"Content-Length\");\n c.res.headers.delete(\"Content-Type\");\n return new Response(null, {\n headers: c.res.headers,\n status: 204,\n statusText: \"No Content\"\n });\n }\n await next();\n if (opts.origin !== \"*\") {\n c.header(\"Vary\", \"Origin\", { append: true });\n }\n };\n};\nexport {\n cors\n};\n", "import type { ProxyBody } from './types.ts';\n\nexport function isProxyBody(value: unknown): value is ProxyBody {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n return isProxyBody(value) ? value : {};\n}\n\nexport function isQueryValue(value: unknown): value is string | number | boolean {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n}\n", "import { Hono } from 'hono';\nimport { asRecord, asString } from './body.ts';\nimport type { AiGateway, ProxyEnv } from './types.ts';\n\nconst DEFAULT_GATEWAY_ID = 'void';\nconst PROVIDER_AUTH_DEFAULTS: Record<string, { header: string; prefix: string }> = {\n 'google-ai-studio': { header: 'x-goog-api-key', prefix: '' },\n};\nconst VOID_FILE_MARKER = '__voidFile';\n\ntype SerializedFileInput = Readonly<{\n [VOID_FILE_MARKER]: true;\n data: string;\n name?: string;\n type?: string;\n}>;\n\ntype SerializedProviderBody = Readonly<\n | { type: 'none' }\n | { type: 'json'; value: unknown }\n | { type: 'text'; data: string; contentType?: string }\n | { type: 'base64'; data: string; contentType?: string }\n | { type: 'form'; entries: Array<{ name: string; value: string | SerializedFileInput }> }\n>;\n\nclass BadRequestError extends Error {}\n\nconst ai = new Hono<ProxyEnv>();\n\nfunction hasStreamFlag(value: unknown): value is { stream?: boolean } {\n return typeof value === 'object' && value !== null && 'stream' in value;\n}\n\nfunction isBinaryView(value: unknown): value is ArrayBufferView {\n return ArrayBuffer.isView(value);\n}\n\nfunction isSerializedFileInput(value: unknown): value is SerializedFileInput {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as Record<string, unknown>)[VOID_FILE_MARKER] === true &&\n typeof (value as Record<string, unknown>).data === 'string' &&\n ((value as Record<string, unknown>).name === undefined ||\n typeof (value as Record<string, unknown>).name === 'string') &&\n ((value as Record<string, unknown>).type === undefined ||\n typeof (value as Record<string, unknown>).type === 'string')\n );\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n let binary: string;\n try {\n binary = atob(base64);\n } catch {\n throw new BadRequestError('invalid file data');\n }\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction gatewayEndpointUrl(baseUrl: string, endpoint: string): string {\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint.slice(1) : endpoint;\n return `${normalizedBase}/${normalizedEndpoint}`;\n}\n\nfunction isUnsafeProviderPath(path: string): boolean {\n if (/^(?:[a-z][a-z0-9+.-]*:)?\\/\\//i.test(path) || path.includes('\\\\')) {\n return true;\n }\n\n const pathname = path.split(/[?#]/, 1)[0] ?? '';\n for (const segment of pathname.split('/')) {\n try {\n if (decodeURIComponent(segment) === '..') {\n return true;\n }\n } catch {\n return true;\n }\n }\n\n return false;\n}\n\nfunction providerBody(value: unknown): SerializedProviderBody {\n const record = asRecord(value);\n const type = asString(record.type);\n if (\n type === 'none' ||\n type === 'json' ||\n type === 'text' ||\n type === 'base64' ||\n type === 'form'\n ) {\n return record as SerializedProviderBody;\n }\n return { type: 'none' };\n}\n\nfunction appendSerializedFormValue(\n form: FormData,\n name: string,\n value: string | SerializedFileInput,\n): void {\n if (isSerializedFileInput(value)) {\n const blob = new Blob([base64ToBytes(value.data)], {\n type: value.type ?? 'application/octet-stream',\n });\n form.append(name, blob, value.name ?? name);\n return;\n }\n form.append(name, value);\n}\n\nfunction providerRequestBody(body: SerializedProviderBody): {\n body?: BodyInit;\n contentType?: string;\n} {\n if (body.type === 'none') {\n return {};\n }\n\n if (body.type === 'json') {\n return { body: JSON.stringify(body.value), contentType: 'application/json' };\n }\n\n if (body.type === 'text') {\n return { body: body.data, contentType: body.contentType };\n }\n\n if (body.type === 'base64') {\n return {\n body: base64ToBytes(body.data).buffer as ArrayBuffer,\n contentType: body.contentType,\n };\n }\n\n const form = new FormData();\n for (const entry of body.entries) {\n appendSerializedFormValue(form, entry.name, entry.value);\n }\n return { body: form };\n}\n\nfunction headersFromRecord(value: unknown): Headers {\n const headers = new Headers();\n for (const [key, headerValue] of Object.entries(asRecord(value))) {\n if (typeof headerValue === 'string') {\n headers.set(key, headerValue);\n }\n }\n return headers;\n}\n\nfunction providerAuthDefaults(provider: string): { header: string; prefix: string } {\n return PROVIDER_AUTH_DEFAULTS[provider] ?? { header: 'authorization', prefix: 'Bearer ' };\n}\n\nfunction gatewayOptions(\n value: unknown,\n projectId: string,\n gatewayId: string,\n): Record<string, unknown> {\n const options = asRecord(value);\n const gateway = asRecord(options.gateway);\n const metadata = asRecord(gateway.metadata);\n\n return {\n ...options,\n gateway: {\n ...gateway,\n id: gatewayId,\n metadata: {\n ...metadata,\n projectId,\n },\n },\n };\n}\n\nfunction applyProviderHeaders({\n headers,\n provider,\n providerKey,\n projectId,\n apiKeyHeader,\n apiKeyPrefix,\n contentType,\n}: {\n headers: Headers;\n provider: string;\n providerKey: string;\n projectId: string;\n apiKeyHeader?: string | null;\n apiKeyPrefix?: string | null;\n contentType?: string;\n}): Headers {\n const defaults = providerAuthDefaults(provider);\n const keyHeader = apiKeyHeader ?? defaults.header;\n const keyPrefix = apiKeyPrefix ?? defaults.prefix;\n\n headers.set(keyHeader, `${keyPrefix}${providerKey}`);\n headers.set('cf-aig-metadata-projectId', projectId);\n if (contentType && !headers.has('content-type')) {\n headers.set('content-type', contentType);\n }\n return headers;\n}\n\nfunction headersForContentType(contentType: string | null | undefined): HeadersInit | undefined {\n return contentType ? { 'content-type': contentType } : undefined;\n}\n\nfunction filteredResponseHeaders(response: Response): Headers {\n const headers = new Headers();\n const contentType = response.headers.get('content-type');\n const cacheControl = response.headers.get('cache-control');\n if (contentType) {\n headers.set('content-type', contentType);\n }\n if (cacheControl) {\n headers.set('cache-control', cacheControl);\n }\n return headers;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction responseFromThrown(value: unknown): Response | null {\n if (value instanceof Response) {\n return value;\n }\n\n if (!isRecord(value)) {\n return null;\n }\n\n if (value.response instanceof Response) {\n return value.response;\n }\n\n return responseFromThrown(value.cause);\n}\n\nfunction statusFromThrown(value: unknown): number | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const status = value.status ?? value.statusCode;\n if (typeof status === 'number' && Number.isInteger(status) && status >= 400 && status <= 599) {\n return status;\n }\n\n return statusFromThrown(value.cause);\n}\n\nfunction messageFromThrown(value: unknown): string {\n if (value instanceof Error) {\n return value.message;\n }\n\n return String(value);\n}\n\nfunction hasResponseMethod(value: unknown): value is { response(): Response | Promise<Response> } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'response' in value &&\n typeof (value as { response?: unknown }).response === 'function'\n );\n}\n\nasync function responseFromAiResult(result: unknown, streamAsSse: boolean): Promise<Response> {\n if (result instanceof Response) {\n return result;\n }\n\n if (hasResponseMethod(result)) {\n return result.response();\n }\n\n if (result instanceof ReadableStream) {\n return new Response(result, {\n headers: streamAsSse\n ? {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache',\n }\n : { 'content-type': 'application/octet-stream' },\n });\n }\n\n if (result instanceof Blob) {\n return new Response(result, { headers: headersForContentType(result.type) });\n }\n\n if (result instanceof ArrayBuffer || isBinaryView(result)) {\n return new Response(result, { headers: { 'content-type': 'application/octet-stream' } });\n }\n\n return Response.json(result);\n}\n\nasync function responseFromAiError(err: unknown): Promise<Response> {\n const response = responseFromThrown(err);\n if (response) {\n return responseFromGateway(response, false);\n }\n\n const status = statusFromThrown(err) ?? 502;\n return Response.json({ error: messageFromThrown(err) }, { status });\n}\n\nasync function responseFromGateway(response: Response, streamAsSse: boolean): Promise<Response> {\n if (streamAsSse && response.body) {\n return new Response(response.body, {\n headers: {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache',\n 'access-control-allow-origin': '*',\n },\n });\n }\n\n return new Response(response.body, {\n status: response.status,\n headers: filteredResponseHeaders(response),\n });\n}\n\nai.post('/run', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const model = asString(body.model);\n\n if (!model) {\n return context.json({ error: 'model required' }, 400);\n }\n\n const options = gatewayOptions(\n body.options,\n projectId,\n context.env.AI_GATEWAY_ID ?? DEFAULT_GATEWAY_ID,\n );\n\n try {\n const result = await context.env.AI.run(model, body.inputs, options);\n return responseFromAiResult(result, hasStreamFlag(body.inputs) && body.inputs.stream === true);\n } catch (err) {\n const message = messageFromThrown(err);\n console.error('AI inference error:', message);\n return responseFromAiError(err);\n }\n});\n\nai.post('/provider', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const provider = asString(body.provider);\n const path = asString(body.path);\n const method = asString(body.method) ?? 'POST';\n const providerKey = asString(body.providerKey);\n const apiKeyHeader = asString(body.apiKeyHeader);\n const apiKeyPrefix = asString(body.apiKeyPrefix);\n\n if (!provider) {\n return context.json({ error: 'provider required' }, 400);\n }\n if (!path) {\n return context.json({ error: 'path required' }, 400);\n }\n if (!providerKey) {\n return context.json({ error: 'providerKey required' }, 400);\n }\n if (isUnsafeProviderPath(path)) {\n return context.json({ error: 'path must be relative' }, 400);\n }\n\n try {\n const gateway = context.env.AI.gateway(context.env.AI_GATEWAY_ID ?? DEFAULT_GATEWAY_ID);\n const baseUrl = await gateway.getUrl(provider);\n const requestBody = providerRequestBody(providerBody(body.body));\n const headers = applyProviderHeaders({\n headers: headersFromRecord(body.headers),\n provider,\n providerKey,\n projectId,\n apiKeyHeader,\n apiKeyPrefix,\n contentType: requestBody.contentType,\n });\n const response = await fetch(gatewayEndpointUrl(baseUrl, path), {\n method,\n headers,\n body: requestBody.body,\n });\n\n if (!response.ok) {\n const text = await response.text();\n let error: string;\n try {\n const json = JSON.parse(text);\n error = json.error?.message ?? text;\n } catch {\n error = text;\n }\n return context.json({ error }, response.status as 400);\n }\n\n return responseFromGateway(response, false);\n } catch (err) {\n if (err instanceof BadRequestError) {\n return context.json({ error: err.message }, 400);\n }\n const message = err instanceof Error ? err.message : String(err);\n console.error('AI Gateway error:', message);\n return context.json({ error: 'gateway error' }, 502);\n }\n});\n\nai.post('/models', async (context) => {\n const body = context.get('body');\n try {\n const result = await context.env.AI.models(body.inputs);\n return context.json(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error('AI inference error:', message);\n return context.json({ error: 'inference error' }, 502);\n }\n});\n\nai.post('/toMarkdown', async (context) => {\n const body = context.get('body');\n try {\n const result = await context.env.AI.toMarkdown(body.inputs, body.options);\n return context.json(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error('AI inference error:', message);\n return context.json({ error: 'inference error' }, 502);\n }\n});\n\nexport { ai };\n", "export function proxyCapabilityEnabled(value: string | undefined, capability: string): boolean {\n // The current managed controller never uses the old tenant acquire/release\n // routes. Keep that unsafe protocol closed even when Sandbox is enabled.\n if (capability === 'sandbox') {\n return false;\n }\n if (!value) {\n return true;\n }\n try {\n const parsed = JSON.parse(value) as unknown;\n return (\n !!parsed &&\n typeof parsed === 'object' &&\n !Array.isArray(parsed) &&\n (parsed as Record<string, unknown>)[capability] === true\n );\n } catch {\n return false;\n }\n}\n", "import type { Env } from './types.ts';\n\ntype WorkerResolution = Readonly<{ workerName: string; deploymentId: string }>;\n\ntype DispatchOptions = Readonly<{\n /** Read-only operations may retry through their REST fallback after a transport failure. */\n fallbackOnDispatchError?: boolean;\n}>;\n\n/**\n * Resolve the active deployment's worker through the API service binding.\n *\n * This lookup intentionally runs for every operation. The project id is stable,\n * while rollback changes the active deployment and therefore the worker name.\n */\nasync function resolveWorker(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n): Promise<WorkerResolution | null> {\n const token = await hmacSign(projectId, jwtSecret);\n const res = await api.fetch(`https://api/internal/resolve-worker/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n });\n\n if (res.status === 404 || res.status === 409) {\n return null;\n }\n if (!res.ok) {\n throw new Error(`worker resolution failed with status ${res.status}`);\n }\n\n const data = await res.json<Partial<WorkerResolution>>();\n if (typeof data.workerName !== 'string' || typeof data.deploymentId !== 'string') {\n throw new Error('worker resolution returned an invalid response');\n }\n return { workerName: data.workerName, deploymentId: data.deploymentId };\n}\n\n/**\n * Dispatch a binding operation to the user's deployed worker via Workers for Platforms.\n * The user worker handles it via native D1/KV/R2 bindings at the `/__void/*` route.\n *\n * Returns the Response if successful, or null if the worker doesn't support /__void\n * (404 = old deploy without the handler \u2192 caller should fall back to REST API).\n */\nexport async function dispatchToWorker(\n env: Env,\n projectId: string,\n path: string,\n body: Record<string, unknown>,\n options: DispatchOptions = {},\n): Promise<Response | null> {\n let resolution: WorkerResolution | null;\n try {\n resolution = await resolveWorker(env.API, env.JWT_SECRET, projectId);\n } catch {\n return options.fallbackOnDispatchError\n ? null\n : Response.json({ error: 'active worker resolution failed' }, { status: 502 });\n }\n if (!resolution) {\n return null;\n }\n\n const proxyToken = await hmacSign(projectId, env.JWT_SECRET);\n let worker: Fetcher;\n try {\n worker = env.DISPATCH.get(resolution.workerName);\n } catch {\n return null;\n }\n\n try {\n const res = await worker.fetch(`https://worker/__void${path}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': proxyToken,\n },\n body: JSON.stringify(body),\n });\n\n // 404 means old deploy without /__void handler \u2192 fall back\n if (res.status === 404) {\n return null;\n }\n\n return res;\n } catch {\n // A write may already have committed before a response/transport failure.\n // Only explicitly read-only callers may replay through a REST fallback.\n return options.fallbackOnDispatchError\n ? null\n : Response.json(\n { error: 'worker dispatch failed; operation result is unknown' },\n { status: 502 },\n );\n }\n}\n\n// --- HMAC signing (mirrors resolve.ts) ---\n\nconst encoder = new TextEncoder();\nlet cachedSignKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getSignKey(secret: string): Promise<CryptoKey> {\n if (cachedSignKey && cachedKeySecret === secret) {\n return cachedSignKey;\n }\n cachedSignKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n cachedKeySecret = secret;\n return cachedSignKey;\n}\n\nasync function hmacSign(data: string, secret: string): Promise<string> {\n const key = await getSignKey(secret);\n const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(data));\n const binary = String.fromCharCode(...new Uint8Array(sig));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n", "// In-memory cache: resource mappings are stable (only change on deploy).\n// Persists across requests within the same CF worker isolate.\nconst cache = new Map<string, string>();\n\n/** @internal Exposed for testing only. */\nexport function clearResolveCache() {\n cache.clear();\n}\n\n/**\n * Resolves a project's binding to its Cloudflare resource ID via the API service binding.\n * Results are cached in-memory per isolate \u2014 the first call per binding hits the API,\n * subsequent calls return instantly.\n */\nexport async function resolveResource(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n type: 'd1' | 'kv' | 'r2',\n bindingName: string,\n): Promise<string> {\n const cacheKey = `${projectId}:${type}:${bindingName}`;\n const cached = cache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const token = await hmacSign(projectId, jwtSecret);\n const res = await api.fetch(`https://api/internal/resolve-resource/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({ type, binding: bindingName }),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => res.statusText);\n throw new Error(`Resource resolution failed (${res.status}): ${text}`);\n }\n\n const data = await res.json<{ cf_id: string }>();\n cache.set(cacheKey, data.cf_id);\n return data.cf_id;\n}\n\n/**\n * Verifies that an actor still has deploy-equivalent project access through\n * the API service binding. The endpoint keeps its legacy name during rollout.\n */\nexport async function verifyProjectDeployAccess(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n userId: string,\n jwt?: string,\n accessAssertion?: string,\n proxyOrigin?: string,\n): Promise<boolean> {\n try {\n if (!proxyOrigin || new URL(proxyOrigin).origin !== proxyOrigin) {\n return false;\n }\n const token = await hmacSign(ownerVerificationMessage(projectId, proxyOrigin), jwtSecret);\n const res = await api.fetch(`https://api/internal/verify-owner/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({\n userId,\n ...(jwt ? { jwt } : {}),\n ...(accessAssertion ? { accessAssertion } : {}),\n proxyOrigin,\n }),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport function ownerVerificationMessage(projectId: string, proxyOrigin: string): string {\n return `void-proxy-owner-v2\\n${projectId}\\n${proxyOrigin}`;\n}\n\n/** Revalidate the authority from which a scoped prerender credential was derived. */\nexport async function verifyPrerenderAuthority(\n api: Fetcher,\n jwtSecret: string,\n projectId: string,\n userId: string,\n provenance: { buildId?: string; credentialId?: string },\n): Promise<boolean> {\n try {\n const token = await hmacSign(projectId, jwtSecret);\n const res = await api.fetch(`https://api/internal/verify-prerender-build/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({ userId, ...provenance }),\n });\n if (res.status === 400 && !provenance.buildId && !provenance.credentialId) {\n // The previous API revision required provenance here. Preserve manual\n // prerenders while the proxy and API revisions overlap during rollout.\n const body = await res.json<{ error?: unknown }>().catch(() => null);\n return body?.error === 'userId and credential provenance required';\n }\n return res.ok;\n } catch {\n // Project-data access fails closed if the revocation authority is\n // unavailable. A build can retry without widening its credential.\n return false;\n }\n}\n\n// --- HMAC signing (mirrors packages/api/src/auth/hmac.ts) ---\n\nconst encoder = new TextEncoder();\nlet cachedSignKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getSignKey(secret: string): Promise<CryptoKey> {\n if (cachedSignKey && cachedKeySecret === secret) {\n return cachedSignKey;\n }\n cachedSignKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n cachedKeySecret = secret;\n return cachedSignKey;\n}\n\nasync function hmacSign(data: string, secret: string): Promise<string> {\n const key = await getSignKey(secret);\n const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(data));\n const binary = String.fromCharCode(...new Uint8Array(sig));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n", "import { Hono } from 'hono';\nimport { asString } from './body.ts';\nimport { dispatchToWorker } from './dispatch.ts';\nimport { resolveResource } from './resolve.ts';\nimport type { ProxyEnv } from './types.ts';\n\nconst CF_API = 'https://api.cloudflare.com/client/v4';\n\nconst d1 = new Hono<ProxyEnv>();\n\nd1.post('/query', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const sql = asString(body.sql);\n\n if (!binding || !sql) {\n return context.json({ error: 'binding and sql required' }, 400);\n }\n\n // Try WfP dispatch first (native bindings, ~1-5ms)\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/d1/query', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API (for old deploys without /__void handler)\n let dbId: string;\n try {\n dbId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'd1', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/d1/database/${dbId}/query`,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${context.env.CF_API_TOKEN}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ sql, params: body.params ?? [] }),\n },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'D1 query failed', status: cfRes.status }, 502);\n }\n\n const cfData = (await cfRes.json()) as {\n result?: ReadonlyArray<{\n results?: ReadonlyArray<Record<string, unknown>>;\n meta?: Record<string, unknown>;\n }>;\n };\n const queryResult = cfData.result?.[0];\n\n if (!queryResult) {\n return context.json({ error: 'unexpected D1 response' }, 502);\n }\n\n switch (body.method) {\n case 'first':\n return context.json(queryResult.results?.[0] ?? null);\n case 'raw': {\n const columns = queryResult.results?.length ? Object.keys(queryResult.results[0]) : [];\n const values = (queryResult.results ?? []).map((row) => Object.values(row));\n return context.json({ columns, results: values, meta: queryResult.meta });\n }\n case 'run':\n return context.json({ success: true, meta: queryResult.meta });\n case 'all':\n default:\n return context.json({\n results: queryResult.results ?? [],\n success: true,\n meta: queryResult.meta,\n });\n }\n});\n\nd1.post('/batch', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding || !Array.isArray(body.statements)) {\n return context.json({ error: 'binding and statements required' }, 400);\n }\n\n // Try WfP dispatch first (native db.batch() with transactional guarantees)\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/d1/batch', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // There is no sequential fallback: D1Database.batch() promises one atomic\n // native batch. If the active worker cannot provide that capability, fail\n // before issuing any statement rather than partially applying the batch.\n return context.json({ error: 'atomic D1 batch unavailable for active deployment' }, 503);\n});\n\nexport { d1 };\n", "import { isReservedEmailSlug } from '@voidcloud/api/reserved-slugs';\nimport { EmailMessage } from 'cloudflare:email';\nimport { Hono } from 'hono';\nimport type { Context } from 'hono';\nimport { asString } from './body.ts';\nimport {\n admitEmail,\n emailPayloadDigest,\n finishEmailAttempt,\n startEmailAttempt,\n} from './email-admission.ts';\nimport { leaseBearer, leaseEmailDomainCredential } from './email-lease.ts';\nimport {\n EMAIL_PROVIDER_DEADLINE_MS,\n EmailProviderTimeoutError,\n createEmailProviderDeadline,\n type EmailProviderDeadline,\n} from './email-provider-deadline.ts';\nimport type { Env, ProxyEnv } from './types.ts';\n\nconst app = new Hono<ProxyEnv>();\n// The SDK aborts at 60s. Body/auth can precede this handler, and final ledger\n// writes need time after provider work stops.\nconst EMAIL_SEND_DEADLINE_MS = 50_000;\nconst EMAIL_SEND_FINALIZATION_MARGIN_MS = 5_000;\n\n/**\n * Cap inbound MIME bytes well below CF's ~10 MB base64-inflated ceiling. The\n * framework enforces the same cap client-side; this is the proxy-side belt to\n * the framework's suspenders.\n */\nexport const MAX_MIME_BYTES = 5 * 1024 * 1024;\nconst MAX_CUSTOM_HEADER_BYTES = 16 * 1024;\nconst BUILTIN_MIME_HEADERS = new Set([\n 'from',\n 'to',\n 'cc',\n 'bcc',\n 'subject',\n 'reply-to',\n 'date',\n 'message-id',\n 'in-reply-to',\n 'references',\n 'mime-version',\n 'content-type',\n 'content-transfer-encoding',\n 'content-disposition',\n]);\n\n/** Bound only app-defined top-level fields, including folded continuation lines. */\nexport function customMimeHeaderBytesWithinLimit(raw: Uint8Array): boolean {\n let used = 0;\n let custom = false;\n for (let start = 0; start < raw.byteLength;) {\n let end = start;\n while (end < raw.byteLength && raw[end] !== 10) {\n end++;\n }\n const lineEnd = end > start && raw[end - 1] === 13 ? end - 1 : end;\n if (lineEnd === start) {\n return true;\n }\n if (raw[start] !== 32 && raw[start] !== 9) {\n let colon = start;\n while (colon < lineEnd && raw[colon] !== 58) {\n colon++;\n }\n const name = new TextDecoder().decode(raw.subarray(start, colon)).toLowerCase();\n custom = colon < lineEnd && !BUILTIN_MIME_HEADERS.has(name);\n }\n if (custom) {\n used += lineEnd - start + 2;\n if (used > MAX_CUSTOM_HEADER_BYTES) {\n return false;\n }\n }\n start = end + 1;\n }\n return true;\n}\n\n/** Bound the raw list before normalization allocates one copy and Set entry per recipient. */\nconst MAX_RECIPIENTS = 50;\n\n/**\n * Bound each address before normalization copies it. RFC 5321 caps a\n * forward-path at 256 octets, so 320 characters leaves room for validation.\n */\nconst MAX_RECIPIENT_LENGTH = 320;\n\n/**\n * Cap the envelope sender for the same reason. It is one string, so there\n * is no list amplifier, but `from.toLowerCase()` below copies it whole\n * (measured: V8 returns a fresh full-size string even when nothing\n * changed), and a sender the strict regex accepts \u2014 an unbounded `+tag`\n * is one \u2014 is then echoed verbatim into the MIME `From:` refusal and\n * serialized into the response. Check it before those copies. The limit\n * matches `MAX_RECIPIENT_LENGTH`.\n */\nconst MAX_SENDER_LENGTH = 320;\n\n/**\n * The platform mail domain for this environment. It is configured as the\n * `EMAIL_SENDER_DOMAIN` var and mirrored into deployed user workers as the\n * `__VOID_EMAIL_DOMAIN` plain-text binding so the framework builds its default\n * `from` against the same zone.\n *\n * There is deliberately NO baked-in default. A staging proxy that fell back\n * to `mail.void.cloud` would accept a `from` on the production zone, and the\n * production sender regex would reject every legitimate staging sender \u2014 the\n * exact reason the domain stopped being a constant. Missing configuration\n * fails the send CLOSED.\n */\nexport function readSenderDomain(env: Pick<Env, 'EMAIL_SENDER_DOMAIN'>): string | null {\n const raw = env.EMAIL_SENDER_DOMAIN;\n if (typeof raw !== 'string') {\n return null;\n }\n const domain = raw.trim().toLowerCase();\n return domain.length > 0 ? domain : null;\n}\n\n/** Regex metacharacters, escaped before a config value is interpolated. */\nconst RE_METACHARS_RE = /[.*+?^${}()|[\\]\\\\]/g;\n\nfunction escapeRegExp(value: string): string {\n return value.replace(RE_METACHARS_RE, '\\\\$&');\n}\n\n/**\n * Memoized per-domain sender regexes. Keyed by the configured\n * `EMAIL_SENDER_DOMAIN`, which is worker configuration and not user input,\n * so the map holds exactly one entry per isolate in practice.\n */\nconst strictFromCache = new Map<string, RegExp>();\n\n/**\n * Strict shape for the outbound `from` envelope address. The slug+domain\n * pinning logic below splits on `+` and the first `@`, but those splits do\n * NOT reject CR/LF, quotes, angle brackets, or display-name forms. Without\n * this regex, a `from` like `slug+x\\r\\nX-Header: y@<domain>` would pass slug\n * pinning and then reach `new EmailMessage(from, ...)`, opening an SMTP\n * header injection primitive against the shared sender. The regex pins the\n * entire string to: lowercase ASCII local-part, zero or more `+<safe-tag>`\n * segments (constrained to RFC-5321 dot-atom-text + `=` and `/`), then exactly\n * `@<EMAIL_SENDER_DOMAIN>`. Display names, encoded-words, and angle brackets\n * are intentionally not supported \u2014 the framework doesn't emit them for a\n * default `from`, and explicit user-supplied names are already disallowed by\n * the slug pin.\n *\n * The `+tag` class is a positive class rather than `[^@\\s]+` so even\n * non-printable ASCII (NUL, BEL, DEL, \u2026) can't ride into `EmailMessage`.\n *\n * The domain is escaped before interpolation so a misconfigured value can\n * never widen the pattern (an unescaped `.` would match any character).\n */\nexport function strictFromRe(domain: string): RegExp {\n const cached = strictFromCache.get(domain);\n if (cached) {\n return cached;\n }\n const re = new RegExp(`^[a-z0-9._-]+(?:\\\\+[a-z0-9._=/-]+)*@${escapeRegExp(domain)}$`);\n strictFromCache.set(domain, re);\n return re;\n}\n\n/**\n * Strip CR/LF/NUL/control chars before logging or surfacing to remote MTAs.\n *\n * Built via new RegExp so oxlint's no-control-regex rule (which fires\n * on even Unicode-escaped control refs in regex literals) does not\n * reject the pattern. Behavior is identical to a literal regex.\n *\n * Slice FIRST, then replace \u2014 the same order as `sanitize` in\n * `email-router.ts`, for the same reason: a global replace materializes one\n * part per match, so a control-heavy input costs far more than one copy\n * (measured: a 5 MB `\\na\\na\u2026` value is +170 MB of transient heap through the\n * old replace-then-slice order, past the 128 MB isolate ceiling; slice-first\n * is 0 ms). Most callers already pass bounded values; `requestId` at intake\n * and the inbound `Subject:` header did not. The result is at most `maxLen`\n * chars and may be shorter \u2014 a control run inside the window collapses to\n * one space and nothing is refilled from beyond it \u2014 which loses nothing on\n * a log line.\n */\n// oxlint-disable-next-line no-control-regex\nconst CONTROL_CHARS_RE = new RegExp('[\\\\u0000-\\\\u001f\\\\u007f]+', 'g');\nfunction sanitizeForLog(value: string, maxLen = 200): string {\n return value.slice(0, maxLen).replace(CONTROL_CHARS_RE, ' ');\n}\n\n/**\n * Cap the caller-supplied log correlation id. The framework sends 16 hex\n * chars (`newRequestId` in `void/email`), but a hand-built tenant worker can\n * send any string the request body carries, and the only consumer is the\n * `[email-log]` line \u2014 one per delivery, so up to `MAX_RECIPIENTS` copies of\n * it per request \u2014 in the shared proxy log stream. It is diagnostic, so it\n * is bounded and sanitized ONCE at intake rather than refused with a 400:\n * a missing or non-string id already logs as `unknown` instead of failing\n * the send, and a truncated id is no less useful to correlate on. The\n * control-char strip is what stops a `\\n` in the id from forging a second\n * `[email-log]` line under another project's id. 128 leaves room for a\n * UUID or a prefixed id without inviting anything longer.\n */\nconst MAX_REQUEST_ID_LENGTH = 128;\n\n/**\n * Wrap a Uint8Array as a single-chunk ReadableStream. CF's EmailMessage\n * constructor accepts `string | ReadableStream`; passing a Uint8Array\n * directly is a TS error. Streaming a single chunk avoids decoding to\n * UTF-8 (which would corrupt non-text MIME parts that happen to be\n * stored in their decoded form).\n */\nfunction bytesToStream(bytes: Uint8Array): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(bytes);\n controller.close();\n },\n });\n}\n\n/**\n * The addr-spec named by the message-level `From:` header, or why there is\n * no single one to name.\n *\n * `/send` pins the ENVELOPE sender (`from`) to the calling project's slug,\n * but the bytes a recipient's mail client shows as the sender are the MIME\n * `From:` header inside `mimeBase64`, and a tenant worker holding its own\n * project HMAC can post any bytes it likes there. Cloudflare's local\n * `send_email` simulator (miniflare `send_email.worker.ts`) throws\n * `From: header does not match mail from` for exactly this, and its author\n * says the messages mirror production \u2014 but nothing in the public docs\n * promises it, the same simulator takes the LAST of several `From:` headers\n * and the FIRST mailbox of a list, and the proxy is the platform's tenancy\n * boundary. So the proxy checks itself: exactly one `From:` header, holding\n * exactly one mailbox, whose addr-spec is the authorized envelope sender.\n *\n * Scope is deliberately narrow. The display name (a quoted-string or RFC\n * 2047 encoded-words before `<\u2026>`) is NOT inspected \u2014 closing display-name\n * spoofing would need a real RFC 5322 scanner tracking `buildMime` forever,\n * and stays handed back. The structural specials outside quotes\n * (`, ; : ( ) [ ] \\` and a bare `@` before `<`) are refused only because\n * each one would make \"which mailbox is this\" ambiguous \u2014 a list, a group,\n * a comment or a phrase that reads as an address \u2014 and `buildMime` never\n * emits any of them unquoted. `Sender:`, `Reply-To:` and `Resent-From:` are\n * not pinned: no client presents them as the author, and a reply sent to a\n * sibling project's inbound address is something anyone can do without the\n * proxy.\n *\n * Every line of the header block is visited so a `From:` cannot hide\n * behind an unrelated header, and continuation lines (leading WSP) are\n * unfolded onto the header they extend. The scan stops at the first empty\n * line \u2014 a `From:` inside a MIME part's own headers is that part's, not the\n * message's \u2014 or at the end of `raw`, which `MAX_MIME_BYTES` already\n * bounds. The work is one linear pass over bytes that are already in\n * memory; only the `From:` value is ever decoded to a string, and the\n * tokenizer below is a single pass with no backtracking, so a display\n * name of any length (which `buildMime` allows) costs what it weighs.\n *\n * \"What it weighs\" has to mean BYTES, not lines. The scan keeps nothing\n * per line \u2014 only the byte offsets of the one `From:` it found \u2014 because\n * `MAX_MIME_BYTES` bounds bytes and a folded header can hold one line per\n * three of them (` \\r\\n`): 3.5 million continuations fit in 10 MiB, and an\n * earlier shape that retained one `subarray` view per continuation held\n * ~125 bytes of heap each \u2014 437 MB, measured, in an isolate of 128 MB that\n * every tenant's AI/D1/KV/R2 traffic shares. The same message with no\n * `From:` cost 1 MB, so the amplifier was the `From:` itself. The value is\n * unfolded with ONE copy of the header's byte range, and no copy at all\n * when it did not fold.\n *\n * Header names are matched the way lenient parsers (postal-mime, which\n * miniflare uses) match them \u2014 bytes before the first `:` with trailing\n * WSP trimmed, case-insensitively \u2014 so `From :` counts as a second `From:`\n * rather than slipping past as an unknown header. A bare CR inside a line\n * fails the scan: `buildMime` rejects CR/LF in every value, and a parser\n * that splits on LF alone would read the bytes after it as part of the\n * same header.\n */\nexport type MimeFrom =\n | { ok: true; addrSpec: string }\n | { ok: false; reason: 'missing' | 'multiple' | 'malformed' };\n\nconst LF = 0x0a;\nconst CR = 0x0d;\nconst SP = 0x20;\nconst HTAB = 0x09;\nconst COLON = 0x3a;\nconst FROM_NAME = [0x66, 0x72, 0x6f, 0x6d]; // \"from\"\n\n/**\n * Where the value of the header line `raw[start, end)` begins if the line\n * is named `From` \u2014 the byte after its first `:` \u2014 or -1 if it is not.\n * The name is the bytes before that colon with trailing WSP trimmed,\n * compared case-insensitively; since it has to be exactly `from`, the\n * colon is looked for only across the WSP run that may follow those four\n * bytes, so the check reads at most the name and never searches the line.\n */\nfunction fromValueStart(raw: Uint8Array, start: number, end: number): number {\n if (end - start <= FROM_NAME.length) {\n return -1;\n }\n for (let i = 0; i < FROM_NAME.length; i++) {\n // ASCII case fold: `A`..`Z` \u2192 `a`..`z`. Non-letters fold to themselves.\n if ((raw[start + i] | 0x20) !== FROM_NAME[i]) {\n return -1;\n }\n }\n let colon = start + FROM_NAME.length;\n while (colon < end && (raw[colon] === SP || raw[colon] === HTAB)) {\n colon++;\n }\n return colon < end && raw[colon] === COLON ? colon + 1 : -1;\n}\n\n/** Operator-readable detail for each way the pin can fail to find a sender. */\nconst MIME_FROM_REFUSALS: Record<Extract<MimeFrom, { ok: false }>['reason'], string> = {\n missing: 'the message has no From header',\n multiple: 'the message has more than one From header',\n malformed: 'the From header must hold a single mailbox',\n};\n\nexport function readMimeFromAddrSpec(raw: Uint8Array): MimeFrom {\n const n = raw.byteLength;\n // The `From:` header as offsets into `raw`: its value starts after the\n // colon and ends where the content of its last line ends. `folded` says\n // whether a continuation line extended it, `inFrom` whether the line\n // being visited may.\n let fromCount = 0;\n let valueStart = -1;\n let valueEnd = -1;\n let folded = false;\n let inFrom = false;\n // The next CR at or after `lineStart`. Searched for lazily, each search\n // starting past the previous hit, so finding the bare CR that fails the\n // scan stays linear across a block of CR-less lines.\n let nextCr = raw.indexOf(CR);\n let lineStart = 0;\n while (lineStart < n) {\n const lf = raw.indexOf(LF, lineStart);\n const lineEnd = lf === -1 ? n : lf;\n let contentEnd = lineEnd;\n if (contentEnd > lineStart && raw[contentEnd - 1] === CR) {\n contentEnd--;\n }\n if (contentEnd === lineStart) {\n break; // empty line: end of the header block\n }\n if (nextCr !== -1 && nextCr < lineStart) {\n nextCr = raw.indexOf(CR, lineStart);\n }\n if (nextCr !== -1 && nextCr < contentEnd) {\n return { ok: false, reason: 'malformed' };\n }\n if (raw[lineStart] === SP || raw[lineStart] === HTAB) {\n if (inFrom) {\n valueEnd = contentEnd;\n folded = true;\n }\n } else {\n const start = fromValueStart(raw, lineStart, contentEnd);\n inFrom = start !== -1;\n if (inFrom) {\n fromCount++;\n valueStart = start;\n valueEnd = contentEnd;\n folded = false;\n }\n }\n lineStart = lf === -1 ? n : lf + 1;\n }\n if (fromCount === 0) {\n return { ok: false, reason: 'missing' };\n }\n if (fromCount > 1) {\n return { ok: false, reason: 'multiple' };\n }\n // Unfold (RFC 5322 \u00A72.2.3): the value is the header's byte range with\n // its line breaks removed, each continuation keeping its leading WSP.\n // Every CR still inside the range ends a line \u2014 the scan refused any\n // other \u2014 so dropping CR and LF is the whole job, done in place on one\n // copy of the range. A header that did not fold needs no copy.\n let value = raw.subarray(valueStart, valueEnd);\n if (folded) {\n value = raw.slice(valueStart, valueEnd);\n let kept = 0;\n for (let i = 0; i < value.length; i++) {\n const byte = value[i];\n if (byte !== CR && byte !== LF) {\n value[kept++] = byte;\n }\n }\n value = value.subarray(0, kept);\n }\n const addrSpec = singleMailboxAddrSpec(new TextDecoder().decode(value));\n return addrSpec === null ? { ok: false, reason: 'malformed' } : { ok: true, addrSpec };\n}\n\n/**\n * The addr-spec of a header value that holds exactly one mailbox \u2014 either a\n * bare `addr-spec` or `[phrase] <addr-spec>` \u2014 or `null` when the value is\n * anything else. One pass; quoted-strings (with `\\` escapes) are skipped\n * whole, and their contents are never interpreted.\n */\nfunction singleMailboxAddrSpec(value: string): string | null {\n let inQuotes = false;\n let escaped = false;\n let lt = -1;\n let gt = -1;\n let firstAt = -1;\n for (let i = 0; i < value.length; i++) {\n const ch = value[i];\n if (inQuotes) {\n if (escaped) {\n escaped = false;\n } else if (ch === '\\\\') {\n escaped = true;\n } else if (ch === '\"') {\n inQuotes = false;\n }\n continue;\n }\n switch (ch) {\n case '\"':\n // A quoted-string belongs to the phrase, which ends at `<`.\n if (lt !== -1) {\n return null;\n }\n inQuotes = true;\n break;\n case '<':\n if (lt !== -1) {\n return null;\n }\n lt = i;\n break;\n case '>':\n if (lt === -1 || gt !== -1) {\n return null;\n }\n gt = i;\n break;\n case '@':\n if (firstAt === -1) {\n firstAt = i;\n }\n break;\n case ',':\n case ';':\n case ':':\n case '(':\n case ')':\n case '[':\n case ']':\n case '\\\\':\n return null;\n default:\n break;\n }\n }\n if (inQuotes) {\n return null;\n }\n let addrSpec: string;\n if (lt === -1) {\n addrSpec = value.trim();\n } else {\n // `<` present: it needs its `>`, nothing but WSP may follow, and the\n // phrase before it must not read as an address of its own.\n if (gt === -1 || value.slice(gt + 1).trim().length !== 0) {\n return null;\n }\n if (firstAt !== -1 && firstAt < lt) {\n return null;\n }\n addrSpec = value.slice(lt + 1, gt);\n }\n // One printable-ASCII token. Rules out an empty `<>`, WSP inside the\n // brackets, and a code point that only LOOKS like the sender before the\n // caller lower-cases it for the compare.\n return /^[\\x21-\\x7e]+$/.test(addrSpec) ? addrSpec : null;\n}\n\n/**\n * Outbound email send. The framework runtime POSTs:\n *\n * {\n * projectId, aiToken, // auth (validated by middleware)\n * from, // envelope sender (must be on an Email-Routing-enabled zone)\n * recipients: string[], // unique normalized recipient addresses\n * mimeBase64, // raw MIME, base64-encoded\n * requestId // for logs and default operation identity\n * }\n *\n * The proxy validates and normalizes the request, routes custom senders to\n * `send_raw`, and otherwise asks the API to admit each recipient before using\n * the platform `send_email` binding.\n *\n * The user worker does not have a `send_email` binding.\n */\napp.post('/send', async (context) => {\n const sendDeadline = createEmailProviderDeadline(EMAIL_SEND_DEADLINE_MS);\n const projectId = context.get('projectId');\n const body = context.get('body');\n\n const from = asString(body.from);\n const mimeBase64 = asString(body.mimeBase64);\n // Bounded and sanitized here, once, so `logSend` never interpolates the\n // raw value; see `MAX_REQUEST_ID_LENGTH`.\n const requestIdRaw = asString(body.requestId);\n const requestId =\n requestIdRaw === null ? 'unknown' : sanitizeForLog(requestIdRaw, MAX_REQUEST_ID_LENGTH);\n const callerKey = asString(body.idempotencyKey);\n if (\n callerKey !== null &&\n (callerKey.length === 0 || callerKey.length > 128 || !/^[\\x20-\\x7e]+$/.test(callerKey))\n ) {\n return context.json(\n { ok: false, error: { code: 'INVALID_TO', message: 'invalid idempotency key' } },\n 400,\n );\n }\n const operationKey =\n callerKey ??\n (requestIdRaw && requestIdRaw.length <= 128 && /^[\\x20-\\x7e]+$/.test(requestIdRaw)\n ? requestIdRaw\n : crypto.randomUUID());\n const recipientsRaw = Array.isArray(body.recipients) ? body.recipients : null;\n\n if (!from || !mimeBase64 || !recipientsRaw) {\n return context.json(\n { ok: false, error: { code: 'UPSTREAM_ERROR', message: 'invalid body' } },\n 400,\n );\n }\n\n // Bound the list before the normalization loop below allocates per entry.\n // Answered with the same 413 the MIME size guard uses \u2014 the framework\n // dispatches on `error.code`, not the status, and INVALID_TO is already\n // its code for an unusable recipient set.\n if (recipientsRaw.length > MAX_RECIPIENTS) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_TO',\n message: `too many recipients (max ${MAX_RECIPIENTS}, got ${recipientsRaw.length})`,\n },\n },\n 413,\n );\n }\n\n // Bound the sender before anything copies it \u2014 the lowercase, the strict\n // regex and the refusal that echoes it all sit below. Same 413 as the\n // recipient bound; INVALID_FROM is the framework's code for an unusable\n // sender. The address is deliberately not echoed back.\n if (from.length > MAX_SENDER_LENGTH) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `sender exceeds ${MAX_SENDER_LENGTH} characters`,\n },\n },\n 413,\n );\n }\n\n // Fail closed on missing sender configuration before admission.\n const senderDomain = readSenderDomain(context.env);\n if (!senderDomain) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'UPSTREAM_ERROR',\n message: 'email sender domain is not configured',\n },\n },\n 502,\n );\n }\n\n // Recipients must be unique strings; the framework already dedups but we\n // re-validate so a buggy client cannot create duplicate attempts or logs.\n const recipients: Array<string> = [];\n const seen = new Set<string>();\n for (const r of recipientsRaw) {\n if (typeof r !== 'string') {\n continue;\n }\n // Before `.trim().toLowerCase()` \u2014 that call is the allocation.\n // The address is deliberately not echoed back.\n if (r.length > MAX_RECIPIENT_LENGTH) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_TO',\n message: `recipient exceeds ${MAX_RECIPIENT_LENGTH} characters`,\n },\n },\n 413,\n );\n }\n const lower = r.trim().toLowerCase();\n if (!lower || seen.has(lower)) {\n continue;\n }\n seen.add(lower);\n recipients.push(lower);\n }\n if (recipients.length === 0) {\n return context.json(\n { ok: false, error: { code: 'INVALID_TO', message: 'no recipients' } },\n 200,\n );\n }\n\n // Pre-decode size guard \u2014 base64 expands ~4/3, so a base64 string longer\n // than `MAX_MIME_BYTES * 4 / 3 + 4` (the +4 absorbs padding rounding)\n // can't possibly decode to anything within the limit. Reject before\n // allocating a 75 MB Uint8Array for what we'd reject anyway. Defends\n // against adversarial OOM via outsized payloads.\n if (mimeBase64.length > Math.ceil((MAX_MIME_BYTES * 4) / 3) + 4) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'MIME_ERROR',\n message: `mime exceeds ${MAX_MIME_BYTES} bytes (base64 length ${mimeBase64.length})`,\n },\n },\n 413,\n );\n }\n\n let raw: Uint8Array;\n try {\n raw = base64Decode(mimeBase64);\n } catch {\n return context.json(\n { ok: false, error: { code: 'MIME_ERROR', message: 'invalid base64 mime' } },\n 400,\n );\n }\n // Defense-in-depth: the pre-decode check is conservative (uses base64\n // length), so a small over-by-one slip past it would still trip here.\n if (raw.byteLength > MAX_MIME_BYTES) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'MIME_ERROR',\n message: `mime exceeds ${MAX_MIME_BYTES} bytes (got ${raw.byteLength})`,\n },\n },\n 413,\n );\n }\n if (!customMimeHeaderBytesWithinLimit(raw)) {\n return context.json(\n {\n ok: false,\n error: { code: 'MIME_ERROR', message: 'custom headers exceed the 16 KiB limit' },\n },\n 413,\n );\n }\n\n // A sender outside the shared platform domain uses the custom-domain path.\n const fromAt = from.indexOf('@');\n const fromDomain = fromAt === -1 ? '' : from.slice(fromAt + 1).toLowerCase();\n if (fromDomain !== '' && fromDomain !== senderDomain) {\n return sendViaCustomDomain(\n context,\n projectId,\n from,\n fromDomain,\n senderDomain,\n recipients,\n raw,\n requestId,\n operationKey,\n sendDeadline,\n );\n }\n\n // Custom-domain sends use send_raw and do not depend on this binding.\n // Check the platform binding before shared-domain admission starts.\n const sendBinding = context.env.SEND_EMAIL;\n if (typeof sendBinding?.send !== 'function') {\n return context.json(\n {\n ok: false,\n error: {\n code: 'UPSTREAM_ERROR',\n message: 'email sending is not configured',\n },\n },\n 502,\n );\n }\n\n // Sender ownership is checked against PostgreSQL by the admission service.\n const expectedSlug = from.split('@')[0]?.split('+')[0] ?? '';\n // Lowercase once for the strict regex + slug compare; the regex anchors\n // the whole string and intentionally rejects CR/LF, quotes, brackets,\n // and display-name forms before we touch EmailMessage.\n // The envelope is forwarded verbatim, so validation has to run on bytes that\n // cannot change under case folding. U+212A KELVIN SIGN lowercases to 'k' and\n // U+0130 to 'i', so a non-ASCII `from` can satisfy a lowercased regex and\n // still reach the shared envelope sender intact. Refuse it before that.\n if (!/^[\\x21-\\x7e]+$/.test(from)) {\n return context.json(\n {\n ok: false,\n error: { code: 'INVALID_FROM', message: 'from address must be printable ASCII' },\n },\n 403,\n );\n }\n const fromLower = from.toLowerCase();\n if (!strictFromRe(senderDomain).test(fromLower)) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `from address must be <${expectedSlug}>[+tag]@${senderDomain}`,\n },\n },\n 200,\n );\n }\n const fromLocal = fromLower.slice(0, fromLower.indexOf('@'));\n const localPrefix = fromLocal.split('+')[0] ?? '';\n if (localPrefix !== expectedSlug.toLowerCase()) {\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `from address must be <${expectedSlug}>[+tag]@${senderDomain}`,\n },\n },\n 200,\n );\n }\n\n // The envelope is pinned; now pin what the recipient will actually SEE.\n // A mismatch here is a request the framework never produces \u2014 `buildMime`\n // renders `From:` from the same `from.email` it posts as the envelope \u2014 so\n // it is refused outright rather than reported per recipient. Runs before\n // the admission call for the same reason as the slug pin. The refusal may\n // echo `from`: it is at most `MAX_SENDER_LENGTH` printable-ASCII bytes by\n // now.\n const mimeFrom = readMimeFromAddrSpec(raw);\n if (!mimeFrom.ok || mimeFrom.addrSpec.toLowerCase() !== fromLower) {\n const detail = mimeFrom.ok\n ? 'the From header address does not match the envelope sender'\n : MIME_FROM_REFUSALS[mimeFrom.reason];\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `mime From must be the envelope sender ${from}: ${detail}`,\n },\n },\n 403,\n );\n }\n\n // The API transaction is authoritative for project state, sender identity,\n // recipient consent, suspension, and attempt quotas.\n let admission;\n try {\n admission = await admitEmail(\n context.env,\n {\n projectId,\n kind: 'direct',\n key: operationKey,\n digest: await emailPayloadDigest('direct', from, recipients, raw),\n from,\n recipients,\n transport: 'binding',\n },\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n } catch (error) {\n const conflict = error instanceof Error && error.message === 'IDEMPOTENCY_CONFLICT';\n return context.json(\n {\n ok: false,\n error: {\n code: conflict ? 'IDEMPOTENCY_CONFLICT' : 'UPSTREAM_ERROR',\n message: conflict\n ? 'idempotency key has different content'\n : 'email admission unavailable',\n },\n },\n conflict ? 409 : 503,\n );\n }\n const deliveries: Array<RecipientResult> = admission.recipients\n .filter((r) => r.state !== 'reserved')\n .map((r) => ({\n recipient: r.recipient,\n ok: r.state === 'provider_accepted',\n state: r.state,\n messageId: r.providerReference ?? undefined,\n error:\n r.state === 'provider_accepted'\n ? undefined\n : {\n code:\n r.errorCode ??\n (r.state === 'outcome_unknown' || r.state === 'attempt_started'\n ? 'OUTCOME_UNKNOWN'\n : r.state === 'cancelled'\n ? 'UPSTREAM_ERROR'\n : 'UNVERIFIED_DESTINATION'),\n message:\n r.state === 'outcome_unknown' || r.state === 'attempt_started'\n ? 'provider outcome unknown; inspect email logs before retrying'\n : r.state === 'cancelled'\n ? 'email attempt was cancelled before provider submission'\n : 'recipient was not admitted',\n },\n }));\n if (admission.replay) {\n for (const row of admission.recipients.filter((r) => r.state === 'reserved')) {\n deliveries.push({\n recipient: row.recipient,\n ok: false,\n state: 'reserved',\n error: {\n code: 'OUTCOME_UNKNOWN',\n message: 'email action remains reserved; inspect email logs before retrying',\n },\n });\n }\n return emailActionResponse(context, admission.operationId, deliveries);\n }\n const allowed = admission.recipients\n .filter((r) => r.state === 'reserved')\n .map((r) => r.recipient);\n // Send fan-out. CF's `send_email` binding takes one recipient per\n // EmailMessage \u2014 we already split by recipient above.\n for (let index = 0; index < allowed.length; index++) {\n const r = allowed[index];\n if (sendDeadline.expired(EMAIL_SEND_FINALIZATION_MARGIN_MS)) {\n const unstarted = allowed.slice(index);\n const cancelled = await cancelUnstartedRecipients(\n context.env,\n admission.operationId,\n unstarted,\n sendDeadline.remainingMs(),\n );\n for (const recipient of unstarted) {\n deliveries.push({\n recipient,\n ok: false,\n state: cancelled ? 'cancelled' : 'outcome_unknown',\n error: cancelled\n ? {\n code: 'UPSTREAM_ERROR',\n message: 'email batch deadline elapsed before provider submission',\n }\n : { code: 'OUTCOME_UNKNOWN', message: 'could not cancel unstarted email attempt' },\n });\n }\n break;\n }\n try {\n await startEmailAttempt(\n context.env,\n admission.operationId,\n [r],\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n } catch {\n const cancelled = await cancelUnstartedRecipients(\n context.env,\n admission.operationId,\n [r],\n sendDeadline.remainingMs(),\n );\n deliveries.push({\n recipient: r,\n ok: false,\n state: cancelled ? 'cancelled' : 'outcome_unknown',\n error: cancelled\n ? {\n code: 'UPSTREAM_ERROR',\n message: 'email attempt did not start; reservation cancelled',\n }\n : { code: 'OUTCOME_UNKNOWN', message: 'could not confirm email attempt status' },\n });\n continue;\n }\n try {\n // EmailMessage accepts string | ReadableStream \u2014 wrap our buffered\n // bytes as a single-chunk stream. We can't reuse one stream across\n // recipients because streams are one-shot, so build per send.\n const msg = new EmailMessage(from, r, bytesToStream(raw));\n // Some CF builds don't return the messageId; we surface \"\" rather\n // than crash and let the framework decide whether to fall back.\n const result = await sendDeadline.run(\n () => sendBinding.send(msg),\n EMAIL_SEND_FINALIZATION_MARGIN_MS,\n );\n const providerReference = typeof result?.messageId === 'string' ? result.messageId : '';\n try {\n await finishEmailAttempt(\n context.env,\n admission.operationId,\n [r],\n 'provider_accepted',\n { providerReference },\n sendDeadline.remainingMs(),\n );\n } catch {\n deliveries.push({\n recipient: r,\n ok: false,\n state: 'outcome_unknown',\n error: {\n code: 'OUTCOME_UNKNOWN',\n message: 'provider accepted email but outcome could not be recorded',\n },\n });\n continue;\n }\n deliveries.push({\n recipient: r,\n ok: true,\n state: 'provider_accepted',\n messageId: providerReference,\n });\n } catch {\n try {\n await finishEmailAttempt(\n context.env,\n admission.operationId,\n [r],\n 'outcome_unknown',\n { errorCode: 'OUTCOME_UNKNOWN' },\n sendDeadline.remainingMs(),\n );\n } catch {\n /* persisted attempt_started remains unresolved */\n }\n deliveries.push({\n recipient: r,\n ok: false,\n state: 'outcome_unknown',\n error: {\n code: 'OUTCOME_UNKNOWN',\n message: 'provider outcome unknown; inspect email logs before retrying',\n },\n });\n }\n }\n\n // Record the per-recipient outcome.\n logSend(projectId, requestId, deliveries);\n\n // Return each outcome; an unknown provider result must be inspected before retry.\n const anyFailed = deliveries.some((d) => !d.ok);\n if (anyFailed) {\n return context.json({ ok: false, operationId: admission.operationId, deliveries }, 200);\n }\n return context.json({\n ok: true,\n operationId: admission.operationId,\n ids: deliveries.map((d) => ({\n recipient: d.recipient,\n messageId: (d as { messageId: string }).messageId,\n state: 'provider_accepted',\n })),\n });\n});\n\n// -----------------------------------------------------------------------------\n// Custom sender domains.\n// -----------------------------------------------------------------------------\n\n/**\n * The Email Sending REST `send_raw` result. snake_case \u2014 the REST schema\n * names the id `message_id`, unlike the `send_email` binding's camelCase\n * `messageId`. Cloudflare returns every recipient in\n * exactly one required list: `delivered` and `queued` are accepted;\n * `permanent_bounces` and `suppressed_recipients` are permanent failures.\n */\nexport interface SendRawResult {\n delivered?: unknown;\n message_id?: unknown;\n permanent_bounces?: unknown;\n queued?: unknown;\n suppressed_recipients?: unknown;\n}\n\nexport interface ParsedSendRawResult {\n delivered: ReadonlySet<string>;\n messageId: string;\n permanentBounces: ReadonlySet<string>;\n queued: ReadonlySet<string>;\n suppressedRecipients: ReadonlySet<string>;\n}\n\nexport type SendRawRecipientOutcome =\n | 'provider_accepted'\n | 'permanent_bounce'\n | 'suppressed'\n | 'outcome_unknown';\n\ntype SendRawHttpResponse = { ok: true; data: unknown } | { ok: false; status: number };\n\nconst MAX_SEND_RAW_RESPONSE_BYTES = 64 * 1024;\n\n/** Submit once and read the provider response within one absolute deadline. */\nexport async function requestSendRaw(\n input: {\n accountId: string;\n bearer: string;\n from: string;\n recipients: Array<string>;\n mimeMessage: string;\n },\n deadlineMs = EMAIL_PROVIDER_DEADLINE_MS,\n): Promise<SendRawHttpResponse> {\n const controller = new AbortController();\n const deadline = Date.now() + Math.min(EMAIL_PROVIDER_DEADLINE_MS, deadlineMs);\n const requestBody = JSON.stringify({\n from: input.from,\n recipients: input.recipients,\n mime_message: input.mimeMessage,\n });\n const beforeDeadline = async <T>(run: () => Promise<T>): Promise<T> => {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n controller.abort();\n throw new Error('email sending request timed out');\n }\n const promise = run();\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('email sending request timed out'));\n }, remaining);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n };\n const response = await beforeDeadline(() =>\n fetch(\n `https://api.cloudflare.com/client/v4/accounts/${input.accountId}/email/sending/send_raw`,\n {\n method: 'POST',\n headers: {\n authorization: `Bearer ${input.bearer}`,\n 'content-type': 'application/json',\n },\n body: requestBody,\n signal: controller.signal,\n },\n ),\n );\n if (!response.ok) {\n void response.body?.cancel().catch(() => {});\n return { ok: false, status: response.status };\n }\n const declared = response.headers.get('content-length');\n if (\n declared !== null &&\n (!/^\\d+$/.test(declared) || Number(declared) > MAX_SEND_RAW_RESPONSE_BYTES)\n ) {\n void response.body?.cancel().catch(() => {});\n throw new Error('email sending API response too large');\n }\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('email sending API response unreadable');\n }\n const bytes = new Uint8Array(MAX_SEND_RAW_RESPONSE_BYTES);\n let size = 0;\n try {\n for (;;) {\n const chunk = await beforeDeadline(() => reader.read());\n if (chunk.done) {\n break;\n }\n if (size + chunk.value.byteLength > bytes.byteLength) {\n throw new Error('email sending API response too large');\n }\n bytes.set(chunk.value, size);\n size += chunk.value.byteLength;\n }\n if (declared !== null && size !== Number(declared)) {\n throw new Error('email sending API response length mismatch');\n }\n return {\n ok: true,\n data: JSON.parse(\n new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(bytes.subarray(0, size)),\n ) as unknown,\n };\n } finally {\n void reader.cancel().catch(() => {});\n try {\n reader.releaseLock();\n } catch {\n // A timed-out read may still be settling after cancellation.\n }\n }\n}\n\n/** Read one required send_raw address list without discarding schema violations. */\nfunction readSendRawAddressList(value: unknown): Set<string> | null {\n if (!Array.isArray(value)) {\n return null;\n }\n const out = new Set<string>();\n for (const entry of value) {\n if (typeof entry !== 'string') {\n return null;\n }\n out.add(entry.toLowerCase());\n }\n return out;\n}\n\n/**\n * Parse the documented send_raw result shape. Every recipient is classified by\n * exactly one of four required lists; accepting a partial response would turn\n * missing provider evidence into a false success.\n */\nexport function parseSendRawResult(value: unknown): ParsedSendRawResult | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n const result = value as SendRawResult;\n const delivered = readSendRawAddressList(result.delivered);\n const permanentBounces = readSendRawAddressList(result.permanent_bounces);\n const queued = readSendRawAddressList(result.queued);\n const suppressedRecipients = readSendRawAddressList(result.suppressed_recipients);\n if (\n !delivered ||\n !permanentBounces ||\n !queued ||\n !suppressedRecipients ||\n typeof result.message_id !== 'string' ||\n result.message_id === ''\n ) {\n return null;\n }\n return {\n delivered,\n messageId: result.message_id,\n permanentBounces,\n queued,\n suppressedRecipients,\n };\n}\n\n/** Require exactly one provider classification for the requested recipient. */\nexport function classifySendRawRecipient(\n result: ParsedSendRawResult,\n recipient: string,\n): SendRawRecipientOutcome {\n const target = recipient.toLowerCase();\n const classifications = [\n result.delivered.has(target),\n result.queued.has(target),\n result.permanentBounces.has(target),\n result.suppressedRecipients.has(target),\n ];\n if (classifications.filter(Boolean).length !== 1) {\n return 'outcome_unknown';\n }\n if (classifications[0] || classifications[1]) {\n return 'provider_accepted';\n }\n return classifications[2] ? 'permanent_bounce' : 'suppressed';\n}\n\n/** Send through the customer's Cloudflare account after project-bound admission. */\nasync function sendViaCustomDomain(\n context: Context<ProxyEnv>,\n projectId: string,\n from: string,\n fromDomain: string,\n senderDomain: string,\n recipients: Array<string>,\n raw: Uint8Array,\n requestId: string,\n operationKey: string,\n sendDeadline: EmailProviderDeadline,\n): Promise<Response> {\n // The envelope is forwarded verbatim to the customer's account, so the\n // printable-ASCII guard runs here for the same reason as on the shared\n // path (case folding must not change the bytes downstream sees).\n if (!/^[\\x21-\\x7e]+$/.test(from)) {\n return context.json(\n {\n ok: false,\n error: { code: 'INVALID_FROM', message: 'from address must be printable ASCII' },\n },\n 403,\n );\n }\n const fromLower = from.toLowerCase();\n\n // The MIME From address must match the envelope sender before admission.\n const mimeFrom = readMimeFromAddrSpec(raw);\n if (!mimeFrom.ok || mimeFrom.addrSpec.toLowerCase() !== fromLower) {\n const detail = mimeFrom.ok\n ? 'the From header address does not match the envelope sender'\n : MIME_FROM_REFUSALS[mimeFrom.reason];\n return context.json(\n {\n ok: false,\n error: {\n code: 'INVALID_FROM',\n message: `mime From must be the envelope sender ${from}: ${detail}`,\n },\n },\n 403,\n );\n }\n\n // send_raw carries the MIME as a JSON string. Decode FATALLY: the\n // framework's builder emits 7-bit-clean MIME, and a body that is not\n // valid UTF-8 would be silently altered by a lenient decode \u2014 refuse it\n // instead. Local validation runs before admission.\n let mimeMessage: string;\n try {\n mimeMessage = new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(raw);\n } catch {\n return context.json(\n { ok: false, error: { code: 'MIME_ERROR', message: 'mime must be valid UTF-8' } },\n 400,\n );\n }\n\n let admission;\n try {\n admission = await admitEmail(\n context.env,\n {\n projectId,\n kind: 'direct',\n key: operationKey,\n digest: await emailPayloadDigest('direct', from, recipients, raw),\n from,\n recipients,\n transport: 'send_raw',\n },\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n } catch (error) {\n const conflict = error instanceof Error && error.message === 'IDEMPOTENCY_CONFLICT';\n return context.json(\n {\n ok: false,\n error: {\n code: conflict ? 'IDEMPOTENCY_CONFLICT' : 'UPSTREAM_ERROR',\n message: conflict\n ? 'idempotency key has different content'\n : 'email admission unavailable',\n },\n },\n conflict ? 409 : 503,\n );\n }\n const deliveries: Array<RecipientResult> = admission.recipients\n .filter((r) => r.state !== 'reserved')\n .map((r) => ({\n recipient: r.recipient,\n ok: r.state === 'provider_accepted',\n state: r.state,\n messageId: r.providerReference ?? undefined,\n error:\n r.state === 'provider_accepted'\n ? undefined\n : {\n code:\n r.errorCode ??\n (r.state === 'outcome_unknown' || r.state === 'attempt_started'\n ? 'OUTCOME_UNKNOWN'\n : r.state === 'cancelled'\n ? 'UPSTREAM_ERROR'\n : 'UNVERIFIED_DESTINATION'),\n message:\n r.state === 'outcome_unknown' || r.state === 'attempt_started'\n ? 'provider outcome unknown; inspect email logs before retrying'\n : r.state === 'cancelled'\n ? 'email attempt was cancelled before provider submission'\n : 'recipient was not admitted',\n },\n }));\n if (admission.replay) {\n for (const row of admission.recipients.filter((r) => r.state === 'reserved')) {\n deliveries.push({\n recipient: row.recipient,\n ok: false,\n state: 'reserved',\n error: {\n code: 'OUTCOME_UNKNOWN',\n message: 'email action remains reserved; inspect email logs before retrying',\n },\n });\n }\n return emailActionResponse(context, admission.operationId, deliveries);\n }\n recipients = admission.recipients.filter((r) => r.state === 'reserved').map((r) => r.recipient);\n if (recipients.length === 0) {\n return emailActionResponse(context, admission.operationId, deliveries);\n }\n // A duplicate must return its durable outcome even if the credential was\n // subsequently revoked. Fresh attempts lease only after admission, then\n // cancel reservations if there can be no provider submission.\n const lease = await leaseEmailDomainCredential(\n context.env,\n fromDomain,\n projectId,\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n if (!lease) {\n await finishEmailAttempt(\n context.env,\n admission.operationId,\n recipients,\n 'cancelled',\n {},\n sendDeadline.remainingMs(),\n ).catch(() => {});\n return context.json(\n {\n ok: false,\n operationId: admission.operationId,\n error: { code: 'UPSTREAM_ERROR', message: 'could not lease the domain credential' },\n },\n 502,\n );\n }\n if (admission.accountId !== lease.accountId) {\n await finishEmailAttempt(\n context.env,\n admission.operationId,\n recipients,\n 'cancelled',\n {},\n sendDeadline.remainingMs(),\n ).catch(() => {});\n return context.json(\n {\n ok: false,\n operationId: admission.operationId,\n error: { code: 'UPSTREAM_ERROR', message: 'email domain changed during admission' },\n },\n 503,\n );\n }\n try {\n await startEmailAttempt(\n context.env,\n admission.operationId,\n recipients,\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n } catch {\n const cancelled = await cancelUnstartedRecipients(\n context.env,\n admission.operationId,\n recipients,\n sendDeadline.remainingMs(),\n );\n for (const recipient of recipients) {\n deliveries.push({\n recipient,\n ok: false,\n state: cancelled ? 'cancelled' : 'outcome_unknown',\n error: cancelled\n ? {\n code: 'UPSTREAM_ERROR',\n message: 'email attempt did not start; reservation cancelled',\n }\n : { code: 'OUTCOME_UNKNOWN', message: 'could not confirm email attempt status' },\n });\n }\n return emailActionResponse(context, admission.operationId, deliveries);\n }\n\n // One REST call carries every recipient \u2014 unlike the platform binding's\n // one EmailMessage per recipient. The response's message id is shared by\n // the whole list.\n let failure: { code: string; message: string } | null = null;\n let failureState: 'failed' | 'outcome_unknown' = 'failed';\n let sendRawResult: ParsedSendRawResult | null = null;\n let providerResponse: SendRawHttpResponse | null = null;\n try {\n providerResponse = await requestSendRaw(\n {\n accountId: lease.accountId,\n bearer: leaseBearer(lease),\n from,\n recipients,\n mimeMessage,\n },\n sendDeadline.remainingMs(EMAIL_SEND_FINALIZATION_MARGIN_MS),\n );\n } catch {\n failure = { code: 'UPSTREAM_ERROR', message: 'email sending request failed' };\n failureState = 'outcome_unknown';\n }\n if (providerResponse) {\n if (!providerResponse.ok) {\n // A fresh credential is leased for every attempt. Provider error\n // bodies are not echoed or logged.\n failure = {\n code: providerResponse.status === 429 ? 'QUOTA_EXCEEDED' : 'UPSTREAM_ERROR',\n message: `email sending API returned ${providerResponse.status}`,\n };\n failureState =\n providerResponse.status >= 500 || providerResponse.status === 408\n ? 'outcome_unknown'\n : 'failed';\n } else {\n const data = providerResponse.data;\n const success =\n typeof data === 'object' && data !== null\n ? (data as { success?: unknown }).success\n : undefined;\n if (success === false) {\n failure = { code: 'UPSTREAM_ERROR', message: 'email sending API refused the message' };\n } else if (success !== true) {\n failure = { code: 'OUTCOME_UNKNOWN', message: 'email sending API response invalid' };\n failureState = 'outcome_unknown';\n } else {\n sendRawResult = parseSendRawResult((data as { result?: unknown }).result);\n if (!sendRawResult) {\n failure = { code: 'OUTCOME_UNKNOWN', message: 'email sending API response invalid' };\n failureState = 'outcome_unknown';\n }\n }\n }\n }\n\n for (const r of recipients) {\n if (failure) {\n deliveries.push({ recipient: r, ok: false, state: failureState, error: failure });\n continue;\n }\n const outcome = classifySendRawRecipient(sendRawResult!, r);\n if (outcome === 'permanent_bounce') {\n deliveries.push({\n recipient: r,\n ok: false,\n state: 'failed',\n error: {\n code: 'UNVERIFIED_DESTINATION',\n message: `recipient '${r}' permanently bounced`,\n },\n });\n } else if (outcome === 'suppressed') {\n deliveries.push({\n recipient: r,\n ok: false,\n state: 'failed',\n error: {\n code: 'UNVERIFIED_DESTINATION',\n message: `recipient '${r}' is on the suppression list`,\n },\n });\n } else if (outcome === 'outcome_unknown') {\n deliveries.push({\n recipient: r,\n ok: false,\n state: 'outcome_unknown',\n error: {\n code: 'OUTCOME_UNKNOWN',\n message: 'email sending API did not classify the recipient',\n },\n });\n } else {\n deliveries.push({\n recipient: r,\n ok: true,\n state: 'provider_accepted',\n messageId: sendRawResult!.messageId,\n });\n }\n }\n\n for (const delivery of deliveries.filter((d) =>\n admission.recipients.some((r) => r.recipient === d.recipient && r.state === 'reserved'),\n )) {\n try {\n await finishEmailAttempt(\n context.env,\n admission.operationId,\n [delivery.recipient],\n delivery.ok\n ? 'provider_accepted'\n : delivery.state === 'outcome_unknown'\n ? 'outcome_unknown'\n : 'failed',\n {\n providerReference: delivery.messageId,\n errorCode: delivery.ok\n ? undefined\n : delivery.state === 'outcome_unknown'\n ? 'OUTCOME_UNKNOWN'\n : (failure?.code ?? delivery.error?.code),\n },\n sendDeadline.remainingMs(),\n );\n delivery.state = delivery.ok\n ? 'provider_accepted'\n : delivery.state === 'outcome_unknown'\n ? 'outcome_unknown'\n : 'failed';\n if (delivery.state === 'outcome_unknown' && !delivery.ok) {\n delivery.error = {\n code: 'OUTCOME_UNKNOWN',\n message: 'provider outcome unknown; inspect email logs before retrying',\n };\n }\n } catch {\n delivery.ok = false;\n delivery.state = 'outcome_unknown';\n delivery.error = {\n code: 'OUTCOME_UNKNOWN',\n message: 'provider outcome could not be recorded',\n };\n }\n }\n logSend(projectId, requestId, deliveries);\n\n // Same mid-batch contract as the shared path: any per-recipient failure\n // (bounce, suppression, or a whole-call failure) answers ok:false with\n // the complete per-recipient evidence needed for a safe retry decision.\n if (deliveries.some((d) => !d.ok)) {\n return context.json({ ok: false, operationId: admission.operationId, deliveries }, 200);\n }\n return context.json({\n ok: true,\n operationId: admission.operationId,\n ids: deliveries.map((d) => ({\n recipient: d.recipient,\n messageId: (d as { messageId: string }).messageId,\n state: 'provider_accepted' as const,\n })),\n });\n}\n\n// -----------------------------------------------------------------------------\n// Inbound delivery log \u2014 kept here because it's invoked from email-router.ts\n// inside the same worker (bypasses HTTP/auth).\n// -----------------------------------------------------------------------------\n\n/**\n * Inbound delivery log. Inlined here rather than via service binding because\n * the email-router lives in this same worker; routing through env.API would\n * 404 (and earlier did so silently).\n */\nexport async function recordInboundDelivery(\n projectId: string,\n info: { from: string; to: string; byteSize: number; status: string },\n): Promise<void> {\n console.log(\n `[email-recv] ${projectId} ${sanitizeForLog(info.from, 320)} -> ${sanitizeForLog(info.to, 320)} ${info.status} (${info.byteSize}B) @${Date.now()}`,\n );\n}\n\n// -----------------------------------------------------------------------------\n// Helpers\n// -----------------------------------------------------------------------------\n\ninterface RecipientResult {\n recipient: string;\n ok: boolean;\n state?: string;\n messageId?: string;\n error?: { code: string; message: string };\n}\n\n/**\n * A failed start response is ambiguous: its transaction may or may not have\n * committed. Cancellation is the safe discriminator because the API accepts\n * it only from `reserved`; a committed `attempt_started` transition conflicts.\n */\nasync function cancelUnstartedRecipients(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n operationId: string,\n recipients: Array<string>,\n deadlineMs?: number,\n): Promise<boolean> {\n try {\n const result = await finishEmailAttempt(\n env,\n operationId,\n recipients,\n 'cancelled',\n {},\n deadlineMs,\n );\n return recipients.every((recipient) =>\n result.recipients.some((row) => row.recipient === recipient && row.state === 'cancelled'),\n );\n } catch {\n return false;\n }\n}\n\nfunction emailActionResponse(\n context: Context<ProxyEnv>,\n operationId: string,\n deliveries: Array<RecipientResult>,\n) {\n if (deliveries.length === 0) {\n return context.json(\n {\n ok: false,\n operationId,\n error: { code: 'OUTCOME_UNKNOWN', message: 'email action remains reserved' },\n },\n 200,\n );\n }\n if (deliveries.some((d) => !d.ok)) {\n return context.json({ ok: false, operationId, deliveries }, 200);\n }\n return context.json(\n {\n ok: true,\n operationId,\n ids: deliveries.map((d) => ({\n recipient: d.recipient,\n messageId: d.messageId ?? '',\n state: d.state,\n })),\n },\n 200,\n );\n}\n\nfunction logSend(projectId: string, requestId: string, deliveries: Array<RecipientResult>): void {\n for (const d of deliveries) {\n const status = d.ok ? 'sent' : (d.error?.code ?? 'unknown_error');\n const id = d.messageId ?? '';\n console.log(\n `[email-log] ${projectId} ${requestId} ${sanitizeForLog(d.recipient, 320)} ${status} ${id} @${Date.now()}`,\n );\n }\n}\n\nfunction base64Decode(b64: string): Uint8Array {\n // workerd `atob` is fast for body-sized payloads; fall back to manual\n // decode only when needed.\n const binary = atob(b64);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n out[i] = binary.charCodeAt(i);\n }\n return out;\n}\n\nexport { app as email };\n", "import type { Env } from './types.ts';\n\nexport type ActionRecipient = {\n recipient: string;\n state:\n | 'rejected'\n | 'reserved'\n | 'attempt_started'\n | 'provider_accepted'\n | 'failed'\n | 'outcome_unknown'\n | 'cancelled';\n errorCode: string | null;\n providerReference: string | null;\n};\nexport type Admission = {\n operationId: string;\n replay: boolean;\n recipients: Array<ActionRecipient>;\n accountId?: string;\n};\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst EMAIL_DEFAULT_DEADLINE_MS = 5_000;\nconst EMAIL_ACTION_DEADLINE_MS = 15_000;\nconst EMAIL_ADMISSION_DEADLINE_MS = 15_000;\nconst MAX_ADMISSION_RESPONSE_BYTES = 65_536;\n\nasync function sign(data: string, secret: string): Promise<string> {\n if (!secret) {\n throw new Error('Email signing key is not configured');\n }\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const bytes = new Uint8Array(await crypto.subtle.sign('HMAC', key, encoder.encode(data)));\n return btoa(String.fromCharCode(...bytes))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\nasync function call<T>(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n path: string,\n body: unknown,\n deadlineMs = EMAIL_DEFAULT_DEADLINE_MS,\n): Promise<T> {\n const controller = new AbortController();\n const deadline = Date.now() + deadlineMs;\n const beforeDeadline = async <U>(run: () => Promise<U>): Promise<U> => {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n controller.abort();\n throw new Error('EMAIL_ADMISSION_TIMEOUT');\n }\n const promise = run();\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('EMAIL_ADMISSION_TIMEOUT'));\n }, remaining);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n };\n const raw = JSON.stringify(body);\n const proof = await sign(raw, env.EMAIL_SIGNING_SECRET);\n const response = await beforeDeadline(() =>\n env.API.fetch(`https://api/internal/email/actions${path}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': proof,\n },\n body: raw,\n signal: controller.signal,\n }),\n );\n if (!response.ok) {\n void response.body?.cancel().catch(() => {});\n if (response.status === 409) {\n throw new Error('IDEMPOTENCY_CONFLICT');\n }\n throw new Error(`EMAIL_ADMISSION_${response.status}`);\n }\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('EMAIL_ADMISSION_EMPTY_RESPONSE');\n }\n const bytes = new Uint8Array(MAX_ADMISSION_RESPONSE_BYTES);\n let size = 0;\n try {\n for (;;) {\n const chunk = await beforeDeadline(() => reader.read());\n if (chunk.done) {\n break;\n }\n if (size + chunk.value.byteLength > bytes.length) {\n throw new Error('EMAIL_ADMISSION_RESPONSE_TOO_LARGE');\n }\n bytes.set(chunk.value, size);\n size += chunk.value.byteLength;\n }\n return JSON.parse(decoder.decode(bytes.subarray(0, size))) as T;\n } finally {\n void reader.cancel().catch(() => {});\n try {\n reader.releaseLock();\n } catch {\n // A timed-out read may still be settling after cancellation.\n }\n }\n}\n\nexport type RelayedReceiptIdentity = {\n receiptId: string;\n projectId: string;\n payloadDigest: string;\n route?: ReceiptRouteFence;\n};\n\nexport type ReceiptRouteFence = {\n routeId: string;\n routeGeneration: number;\n connectionId: string;\n addressing: 'shared' | 'custom';\n domain: string;\n projectSlug: string;\n};\n\nexport function claimRelayedReceipt(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n identity: RelayedReceiptIdentity,\n): Promise<{ state: 'claimed' | 'in_progress' | 'completed'; reject?: boolean }> {\n return call(env, '/receipts/claim', identity);\n}\n\nexport function completeRelayedReceipt(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n identity: RelayedReceiptIdentity,\n reject: boolean,\n): Promise<{ ok: true }> {\n return call(env, '/receipts/complete', {\n receiptId: identity.receiptId,\n projectId: identity.projectId,\n payloadDigest: identity.payloadDigest,\n reject,\n });\n}\n\n/** Only generated, transport-irrelevant MIME fields are normalized. Body text stays byte-sensitive. */\nexport function canonicalizeVoidMime(raw: Uint8Array): Uint8Array {\n if (findCrlfCrlf(raw) === -1) {\n return raw;\n }\n const boundaries = new Map<string, string>();\n const output: Array<Uint8Array> = [];\n let outputBytes = 0;\n let copyStart = 0;\n let changed = false;\n let inHeaders = true;\n let topHeaders = true;\n\n const append = (bytes: Uint8Array): void => {\n if (bytes.byteLength === 0) {\n return;\n }\n output.push(bytes);\n outputBytes += bytes.byteLength;\n };\n const replace = (start: number, end: number, replacement: Uint8Array): void => {\n append(raw.subarray(copyStart, start));\n append(replacement);\n copyStart = end;\n changed = true;\n };\n\n let lineStart = 0;\n while (lineStart < raw.byteLength) {\n const lineEnd = findCrlf(raw, lineStart);\n const nextLine = lineEnd === raw.byteLength ? raw.byteLength : lineEnd + 2;\n if (inHeaders) {\n if (lineEnd === lineStart) {\n inHeaders = false;\n topHeaders = false;\n } else if (\n topHeaders &&\n (asciiPrefixEquals(raw, lineStart, lineEnd, 'Date: ') ||\n asciiPrefixEquals(raw, lineStart, lineEnd, 'Message-ID: '))\n ) {\n // Remove the generated field and its CRLF. The next header (or the\n // terminating empty line) remains byte-for-byte unchanged.\n replace(lineStart, nextLine, new Uint8Array());\n } else if (isMultipartContentType(raw, lineStart, lineEnd)) {\n const line = decoder.decode(raw.subarray(lineStart, lineEnd));\n const normalized = line.replace(\n /boundary=\"(=_void_(?:mixed|alternative|related)_[A-Za-z0-9_-]+)\"/g,\n (_, token: string) => {\n let marker = boundaries.get(token);\n if (!marker) {\n marker = `<void-boundary-${boundaries.size}>`;\n boundaries.set(token, marker);\n }\n return `boundary=\"${marker}\"`;\n },\n );\n if (normalized !== line) {\n replace(lineStart, lineEnd, encoder.encode(normalized));\n }\n }\n } else if (raw[lineStart] === 45 && raw[lineStart + 1] === 45) {\n const tokenStart = lineStart + 2;\n const token = isBoundaryToken(raw, tokenStart, lineEnd)\n ? decoder.decode(raw.subarray(tokenStart, lineEnd))\n : undefined;\n const openingMarker = token === undefined ? undefined : boundaries.get(token);\n if (openingMarker !== undefined) {\n replace(lineStart, lineEnd, encoder.encode(`--${openingMarker}`));\n inHeaders = true;\n } else if (\n lineEnd - tokenStart >= 2 &&\n raw[lineEnd - 2] === 45 &&\n raw[lineEnd - 1] === 45 &&\n isBoundaryToken(raw, tokenStart, lineEnd - 2)\n ) {\n const closingToken = decoder.decode(raw.subarray(tokenStart, lineEnd - 2));\n const closingMarker = boundaries.get(closingToken);\n if (closingMarker !== undefined) {\n replace(lineStart, lineEnd, encoder.encode(`--${closingMarker}--`));\n }\n }\n }\n lineStart = nextLine;\n }\n\n if (!changed) {\n return raw;\n }\n append(raw.subarray(copyStart));\n const normalized = new Uint8Array(outputBytes);\n let offset = 0;\n for (const chunk of output) {\n normalized.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return normalized;\n}\n\nfunction findCrlfCrlf(raw: Uint8Array): number {\n for (let i = 0; i + 3 < raw.byteLength; i++) {\n if (raw[i] === 13 && raw[i + 1] === 10 && raw[i + 2] === 13 && raw[i + 3] === 10) {\n return i;\n }\n }\n return -1;\n}\n\nfunction findCrlf(raw: Uint8Array, start: number): number {\n let cursor = start;\n while (cursor < raw.byteLength) {\n const cr = raw.indexOf(13, cursor);\n if (cr === -1) {\n return raw.byteLength;\n }\n if (raw[cr + 1] === 10) {\n return cr;\n }\n cursor = cr + 1;\n }\n return raw.byteLength;\n}\n\nfunction asciiPrefixEquals(raw: Uint8Array, start: number, end: number, expected: string): boolean {\n if (end - start < expected.length) {\n return false;\n }\n for (let i = 0; i < expected.length; i++) {\n const actual = raw[start + i];\n const wanted = expected.charCodeAt(i);\n if ((actual >= 65 && actual <= 90 ? actual + 32 : actual) !== (wanted | 32)) {\n return false;\n }\n }\n return true;\n}\n\nfunction isMultipartContentType(raw: Uint8Array, start: number, end: number): boolean {\n const field = 'Content-Type:';\n if (!asciiPrefixEquals(raw, start, end, field)) {\n return false;\n }\n let cursor = start + field.length;\n while (\n cursor < end &&\n (raw[cursor] === 32 || raw[cursor] === 9 || raw[cursor] === 11 || raw[cursor] === 12)\n ) {\n cursor++;\n }\n return asciiPrefixEquals(raw, cursor, end, 'multipart/');\n}\n\nfunction isBoundaryToken(raw: Uint8Array, start: number, end: number): boolean {\n if (end <= start) {\n return false;\n }\n for (let i = start; i < end; i++) {\n const byte = raw[i];\n if (\n !(\n (byte >= 65 && byte <= 90) ||\n (byte >= 97 && byte <= 122) ||\n (byte >= 48 && byte <= 57) ||\n byte === 95 ||\n byte === 45 ||\n byte === 61\n )\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport async function emailPayloadDigest(\n kind: string,\n from: string,\n recipients: Array<string>,\n raw: Uint8Array,\n): Promise<string> {\n const canonical = canonicalizeVoidMime(raw);\n const prefix = encoder.encode(\n JSON.stringify({\n kind,\n from: from.toLowerCase(),\n recipients: [...new Set(recipients.map((r) => r.toLowerCase()))].sort(),\n }),\n );\n const input = new Uint8Array(prefix.length + 1 + canonical.length);\n input.set(prefix);\n input[prefix.length] = 0;\n input.set(canonical, prefix.length + 1);\n return [...new Uint8Array(await crypto.subtle.digest('SHA-256', input))]\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nexport function admitEmail(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n body: {\n projectId: string;\n kind: 'direct' | 'forward' | 'reply';\n key: string;\n digest: string;\n from: string;\n recipients: Array<string>;\n transport: 'binding' | 'send_raw' | 'native_forward' | 'native_reply';\n receiptId?: string;\n },\n deadlineMs = EMAIL_ADMISSION_DEADLINE_MS,\n): Promise<Admission> {\n return call(env, '/admit', body, Math.min(deadlineMs, EMAIL_ADMISSION_DEADLINE_MS));\n}\n\nexport function startEmailAttempt(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n operationId: string,\n recipients: Array<string>,\n deadlineMs = EMAIL_ACTION_DEADLINE_MS,\n): Promise<{ recipients: Array<ActionRecipient> }> {\n return call(\n env,\n `/${encodeURIComponent(operationId)}/start`,\n { recipients },\n Math.min(deadlineMs, EMAIL_ACTION_DEADLINE_MS),\n );\n}\n\nexport function finishEmailAttempt(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n operationId: string,\n recipients: Array<string>,\n state: 'provider_accepted' | 'failed' | 'outcome_unknown' | 'cancelled',\n details: { providerReference?: string; errorCode?: string } = {},\n deadlineMs = EMAIL_ACTION_DEADLINE_MS,\n): Promise<{ recipients: Array<ActionRecipient> }> {\n return call(\n env,\n `/${encodeURIComponent(operationId)}/finish`,\n { recipients, state, ...details },\n Math.min(deadlineMs, EMAIL_ACTION_DEADLINE_MS),\n );\n}\n\nexport function recordEmailReceipt(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n receiptId: string,\n projectId: string,\n status: string,\n route?: ReceiptRouteFence,\n): Promise<{ ok: true }> {\n return call(env, '/receipts', { receiptId, projectId, status, ...(route ? { route } : {}) });\n}\n", "/** Lease a customer API token from the platform for a custom-domain send. */\n\nimport type { Env } from './types.ts';\n\nexport type EmailDomainLease = { kind: 'api_token'; token: string; accountId: string };\n\nconst LEASE_DEADLINE_MS = 5_000;\nconst MAX_LEASE_RESPONSE_BYTES = 4 * 1024;\n\n/** The bearer value for the send_raw Authorization header. */\nexport function leaseBearer(lease: EmailDomainLease): string {\n return lease.token;\n}\n\n/**\n * Lease a send credential for a registered domain from the api. Returns\n * null on any failure; the caller maps that to a retryable upstream error.\n */\nexport async function leaseEmailDomainCredential(\n env: Pick<Env, 'API' | 'EMAIL_SIGNING_SECRET'>,\n domain: string,\n projectId: string,\n deadlineMs = LEASE_DEADLINE_MS,\n): Promise<EmailDomainLease | null> {\n if (!env.EMAIL_SIGNING_SECRET) {\n return null;\n }\n const controller = new AbortController();\n const deadline = Date.now() + Math.min(deadlineMs, LEASE_DEADLINE_MS);\n const beforeDeadline = async <T>(run: () => Promise<T>): Promise<T> => {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n controller.abort();\n throw new Error('email credential lease timed out');\n }\n const promise = run();\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n controller.abort();\n reject(new Error('email credential lease timed out'));\n }, remaining);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n };\n\n let res: Response;\n try {\n const token = await hmacSign(\n `email-lease-v1\\n${projectId}\\n${domain.toLowerCase()}`,\n env.EMAIL_SIGNING_SECRET,\n );\n res = await beforeDeadline(() =>\n env.API.fetch('https://api/internal/email/domain-credential', {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': token,\n },\n body: JSON.stringify({ domain, projectId }),\n signal: controller.signal,\n }),\n );\n } catch {\n return null;\n }\n if (!res.ok) {\n void res.body?.cancel().catch(() => {});\n return null;\n }\n const declared = res.headers.get('content-length');\n if (\n declared !== null &&\n (!/^\\d+$/.test(declared) || Number(declared) > MAX_LEASE_RESPONSE_BYTES)\n ) {\n void res.body?.cancel().catch(() => {});\n return null;\n }\n const reader = res.body?.getReader();\n if (!reader) {\n return null;\n }\n const bytes = new Uint8Array(MAX_LEASE_RESPONSE_BYTES);\n let size = 0;\n try {\n for (;;) {\n const chunk = await beforeDeadline(() => reader.read());\n if (chunk.done) {\n break;\n }\n if (size + chunk.value.byteLength > bytes.byteLength) {\n throw new Error('email credential lease response too large');\n }\n bytes.set(chunk.value, size);\n size += chunk.value.byteLength;\n }\n if (declared !== null && size !== Number(declared)) {\n return null;\n }\n const data: unknown = JSON.parse(\n new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(bytes.subarray(0, size)),\n );\n return parseLease(data);\n } catch {\n return null;\n } finally {\n void reader.cancel().catch(() => {});\n try {\n reader.releaseLock();\n } catch {\n // A timed-out read may still be settling after cancellation.\n }\n }\n}\n\nfunction parseLease(data: unknown): EmailDomainLease | null {\n if (typeof data !== 'object' || data === null) {\n return null;\n }\n const kind = (data as { kind?: unknown }).kind;\n const accountId = (data as { accountId?: unknown }).accountId;\n if (typeof accountId !== 'string' || !/^[a-zA-Z0-9_-]{1,128}$/.test(accountId)) {\n return null;\n }\n if (kind === 'api_token') {\n const token = (data as { token?: unknown }).token;\n return typeof token === 'string' && token.length > 0 ? { kind, token, accountId } : null;\n }\n return null;\n}\n\n// --- HMAC signing (mirrors resolve.ts) ---\n\nconst encoder = new TextEncoder();\nlet cachedSignKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getSignKey(secret: string): Promise<CryptoKey> {\n if (cachedSignKey && cachedKeySecret === secret) {\n return cachedSignKey;\n }\n cachedSignKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n cachedKeySecret = secret;\n return cachedSignKey;\n}\n\nasync function hmacSign(data: string, secret: string): Promise<string> {\n const key = await getSignKey(secret);\n const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(data));\n const binary = String.fromCharCode(...new Uint8Array(sig));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n", "export const EMAIL_PROVIDER_DEADLINE_MS = 30_000;\nexport const EMAIL_PROVIDER_BATCH_DEADLINE_MS = 60_000;\n\nexport class EmailProviderTimeoutError extends Error {\n constructor() {\n super('email provider outcome unknown after timeout');\n this.name = 'EmailProviderTimeoutError';\n }\n}\n\n/** One absolute batch budget, with a shorter ceiling for each provider submission. */\nexport function createEmailProviderDeadline(totalMs = EMAIL_PROVIDER_BATCH_DEADLINE_MS) {\n const deadline = Date.now() + totalMs;\n return {\n remainingMs(reserveMs = 0): number {\n return Math.max(0, deadline - Date.now() - reserveMs);\n },\n expired(reserveMs = 0): boolean {\n return Date.now() >= deadline - reserveMs;\n },\n async run<T>(submit: () => Promise<T>, reserveMs = 0): Promise<T> {\n const remaining = Math.min(EMAIL_PROVIDER_DEADLINE_MS, deadline - Date.now() - reserveMs);\n if (remaining <= 0) {\n throw new EmailProviderTimeoutError();\n }\n const work = submit();\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n work,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new EmailProviderTimeoutError()), remaining);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n },\n };\n}\n\nexport type EmailProviderDeadline = ReturnType<typeof createEmailProviderDeadline>;\n", "/** Revalidate every delivered chunk; idle streams also close when their session is revoked. */\nexport function guardHumanStream(\n source: ReadableStream<Uint8Array>,\n validate: () => Promise<boolean>,\n signal?: AbortSignal,\n): ReadableStream<Uint8Array> {\n const reader = source.getReader();\n let closed = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let controller: ReadableStreamDefaultController<Uint8Array>;\n const cleanup = () => {\n closed = true;\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n signal?.removeEventListener('abort', abort);\n };\n const stop = () => {\n if (closed) {\n return;\n }\n cleanup();\n controller.error(new Error('Authentication expired or was revoked. Sign in again.'));\n void reader.cancel().catch(() => {});\n };\n const abort = () => stop();\n const check = async () => {\n if (closed) {\n return false;\n }\n try {\n if (await validate()) {\n return !closed;\n }\n } catch {\n /* Failed authority reads must close the stream. */\n }\n stop();\n return false;\n };\n const schedule = () => {\n timer = setTimeout(async () => {\n if (await check()) {\n schedule();\n }\n }, 15_000);\n };\n return new ReadableStream<Uint8Array>(\n {\n start(target) {\n controller = target;\n signal?.addEventListener('abort', abort, { once: true });\n if (signal?.aborted) {\n stop();\n } else {\n schedule();\n }\n },\n async pull(target) {\n try {\n const chunk = await reader.read();\n if (closed) {\n return;\n }\n if (chunk.done) {\n cleanup();\n target.close();\n } else if (await check()) {\n target.enqueue(chunk.value);\n }\n } catch (error) {\n if (!closed) {\n cleanup();\n target.error(error);\n void reader.cancel().catch(() => {});\n }\n }\n },\n async cancel(reason) {\n cleanup();\n await reader.cancel(reason);\n },\n },\n { highWaterMark: 0 },\n );\n}\n", "import { Hono } from 'hono';\nimport { asString, isQueryValue } from './body.ts';\nimport { dispatchToWorker } from './dispatch.ts';\nimport { resolveResource } from './resolve.ts';\nimport type { ProxyEnv } from './types.ts';\n\nconst CF_API = 'https://api.cloudflare.com/client/v4';\n\nconst kv = new Hono<ProxyEnv>();\n\nkv.post('/get', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/get', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/values/${encodeURIComponent(key)}`,\n { headers: { Authorization: `Bearer ${context.env.CF_API_TOKEN}` } },\n );\n\n if (cfRes.status === 404) {\n return context.json(null);\n }\n\n if (!cfRes.ok) {\n return context.json({ error: 'KV get failed', status: cfRes.status }, 502);\n }\n\n const type = asString(body.type) ?? 'text';\n if (type === 'json') {\n return context.json(await cfRes.json());\n }\n if (type === 'arrayBuffer') {\n return new Response(await cfRes.arrayBuffer(), {\n headers: { 'content-type': 'application/octet-stream' },\n });\n }\n if (type === 'stream') {\n return new Response(cfRes.body, {\n headers: { 'content-type': 'application/octet-stream' },\n });\n }\n // Default: text\n return context.json(await cfRes.text());\n});\n\nkv.post('/put', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/put', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const params = new URLSearchParams();\n if (isQueryValue(body.expiration)) {\n params.set('expiration', String(body.expiration));\n }\n if (isQueryValue(body.expiration_ttl)) {\n params.set('expiration_ttl', String(body.expiration_ttl));\n }\n const queryString = params.toString() ? `?${params.toString()}` : '';\n\n let value: string | ArrayBuffer;\n let contentType = 'text/plain';\n if (body.base64 === true && typeof body.value === 'string') {\n // Decode base64-encoded binary data from the client\n const binary = atob(body.value);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n value = bytes.buffer;\n contentType = 'application/octet-stream';\n } else {\n value = typeof body.value === 'string' ? body.value : JSON.stringify(body.value);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/values/${encodeURIComponent(key)}${queryString}`,\n {\n method: 'PUT',\n headers: {\n Authorization: `Bearer ${context.env.CF_API_TOKEN}`,\n 'Content-Type': contentType,\n },\n body: value,\n },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'KV put failed', status: cfRes.status }, 502);\n }\n\n return context.json({ success: true });\n});\n\nkv.post('/delete', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/delete', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/values/${encodeURIComponent(key)}`,\n {\n method: 'DELETE',\n headers: { Authorization: `Bearer ${context.env.CF_API_TOKEN}` },\n },\n );\n\n // 404 is fine \u2014 delete is idempotent\n if (!cfRes.ok && cfRes.status !== 404) {\n return context.json({ error: 'KV delete failed', status: cfRes.status }, 502);\n }\n\n return context.json({ success: true });\n});\n\nkv.post('/list', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding) {\n return context.json({ error: 'binding required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/kv/list', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let nsId: string;\n try {\n nsId = await resolveResource(context.env.API, context.env.JWT_SECRET, projectId, 'kv', binding);\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const params = new URLSearchParams();\n const prefix = asString(body.prefix);\n if (prefix) {\n params.set('prefix', prefix);\n }\n if (isQueryValue(body.limit)) {\n params.set('limit', String(body.limit));\n }\n const cursor = asString(body.cursor);\n if (cursor) {\n params.set('cursor', cursor);\n }\n const queryString = params.toString() ? `?${params.toString()}` : '';\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/storage/kv/namespaces/${nsId}/keys${queryString}`,\n { headers: { Authorization: `Bearer ${context.env.CF_API_TOKEN}` } },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'KV list failed', status: cfRes.status }, 502);\n }\n\n const data = (await cfRes.json()) as {\n result?: ReadonlyArray<{ name: string }>;\n result_info?: { cursor?: string };\n };\n return context.json({\n keys: data.result ?? [],\n list_complete: !data.result_info?.cursor,\n cursor: data.result_info?.cursor ?? null,\n });\n});\n\nexport { kv };\n", "// Keep these wire values aligned with @void/platform. This private runtime is\n// bundled into that package, but must not import the package being built.\nexport const PLATFORM_DISABLED_KEY = '__void/platform/disabled/v1';\nexport const PLATFORM_DISABLED_VALUE = 'disabled';\n", "import { Hono } from 'hono';\nimport { asString, isQueryValue } from './body.ts';\nimport { dispatchToWorker } from './dispatch.ts';\nimport { resolveResource } from './resolve.ts';\nimport type { ProxyEnv } from './types.ts';\n\nconst CF_API = 'https://api.cloudflare.com/client/v4';\n\nconst r2 = new Hono<ProxyEnv>();\n\nfunction cfHeaders(token: string) {\n return { Authorization: `Bearer ${token}` };\n}\n\nr2.post('/get', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/get', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n { headers: cfHeaders(context.env.CF_API_TOKEN) },\n );\n\n if (cfRes.status === 404) {\n return context.json(null);\n }\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 get failed', status: cfRes.status }, 502);\n }\n\n // Stream the object body back, preserve metadata in headers\n const headers = new Headers();\n headers.set('content-type', cfRes.headers.get('content-type') ?? 'application/octet-stream');\n if (cfRes.headers.has('content-length')) {\n headers.set('content-length', cfRes.headers.get('content-length')!);\n }\n if (cfRes.headers.has('etag')) {\n headers.set('etag', cfRes.headers.get('etag')!);\n }\n if (cfRes.headers.has('last-modified')) {\n headers.set('last-modified', cfRes.headers.get('last-modified')!);\n }\n\n return new Response(cfRes.body, { headers });\n});\n\nr2.on('POST', ['/put', '/put-conditional'], async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n const base64 = asString(body.base64);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const conditional = body.onlyIf !== undefined || context.req.path.endsWith('/put-conditional');\n const dispatchRes = await dispatchToWorker(\n context.env,\n projectId,\n conditional ? '/r2/put-conditional' : '/r2/put',\n body,\n );\n if (dispatchRes) {\n return dispatchRes;\n }\n\n if (conditional) {\n return context.json(\n {\n error:\n 'R2 conditional writes require an active deployment with the current Void remote-binding handler. Update your Void platform and redeploy the project.',\n },\n 501,\n );\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n // Decode base64 value from JSON body, or use text value\n const data = base64\n ? Uint8Array.from(atob(base64), (ch) => ch.charCodeAt(0))\n : new TextEncoder().encode((body.value as string) ?? '');\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n {\n method: 'PUT',\n headers: {\n ...cfHeaders(context.env.CF_API_TOKEN),\n 'Content-Type': asString(body.contentType) ?? 'application/octet-stream',\n },\n body: data,\n },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 put failed', status: cfRes.status }, 502);\n }\n\n return context.json({ success: true });\n});\n\nr2.post('/delete', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding) {\n return context.json({ error: 'binding required' }, 400);\n }\n\n const keys =\n Array.isArray(body.keys) && body.keys.every((key): key is string => typeof key === 'string')\n ? body.keys\n : typeof body.key === 'string'\n ? [body.key]\n : [];\n\n if (keys.length === 0) {\n return context.json({ error: 'key or keys required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/delete', body);\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n for (const key of keys) {\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n {\n method: 'DELETE',\n headers: cfHeaders(context.env.CF_API_TOKEN),\n },\n );\n if (!cfRes.ok && cfRes.status !== 404) {\n return context.json({ error: 'R2 delete failed', status: cfRes.status }, 502);\n }\n }\n\n return context.json({ success: true });\n});\n\nr2.post('/list', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n\n if (!binding) {\n return context.json({ error: 'binding required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/list', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const params = new URLSearchParams();\n const prefix = asString(body.prefix);\n if (prefix) {\n params.set('prefix', prefix);\n }\n if (isQueryValue(body.limit)) {\n params.set('per_page', String(body.limit));\n }\n const cursor = asString(body.cursor);\n if (cursor) {\n params.set('cursor', cursor);\n }\n const delimiter = asString(body.delimiter);\n if (delimiter) {\n params.set('delimiter', delimiter);\n }\n const queryString = params.toString() ? `?${params.toString()}` : '';\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects${queryString}`,\n { headers: cfHeaders(context.env.CF_API_TOKEN) },\n );\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 list failed', status: cfRes.status }, 502);\n }\n\n const data = (await cfRes.json()) as {\n result?: ReadonlyArray<{ key: string; size: number; last_modified?: string }>;\n result_info?: { cursor?: string };\n };\n\n return context.json({\n objects: (data.result ?? []).map((object) => ({\n key: object.key,\n size: object.size,\n lastModified: object.last_modified ?? '',\n })),\n truncated: !!data.result_info?.cursor,\n cursor: data.result_info?.cursor ?? null,\n });\n});\n\nr2.post('/head', async (context) => {\n const body = context.get('body');\n const projectId = context.get('projectId');\n const binding = asString(body.binding);\n const key = asString(body.key);\n\n if (!binding || !key) {\n return context.json({ error: 'binding and key required' }, 400);\n }\n\n // Try WfP dispatch first\n const dispatchRes = await dispatchToWorker(context.env, projectId, '/r2/head', body, {\n fallbackOnDispatchError: true,\n });\n if (dispatchRes) {\n return dispatchRes;\n }\n\n // Fallback: CF REST API\n let bucket: string;\n try {\n bucket = await resolveResource(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n 'r2',\n binding,\n );\n } catch {\n return context.json({ error: `unknown binding \"${binding}\"` }, 404);\n }\n\n const cfRes = await fetch(\n `${CF_API}/accounts/${context.env.CF_ACCOUNT_ID}/r2/buckets/${bucket}/objects/${encodeURIComponent(key)}`,\n {\n method: 'HEAD',\n headers: cfHeaders(context.env.CF_API_TOKEN),\n },\n );\n\n if (cfRes.status === 404) {\n return context.json(null);\n }\n\n if (!cfRes.ok) {\n return context.json({ error: 'R2 head failed', status: cfRes.status }, 502);\n }\n\n return context.json({\n key,\n size: parseInt(cfRes.headers.get('content-length') ?? '0'),\n etag: cfRes.headers.get('etag') ?? '',\n lastModified: cfRes.headers.get('last-modified') ?? '',\n contentType: cfRes.headers.get('content-type') ?? 'application/octet-stream',\n });\n});\n\nexport { r2 };\n", "const REQUEST_BODY_DEADLINE_MS = 5_000;\nconst decoder = new TextDecoder('utf-8', { fatal: true, ignoreBOM: false });\n\nexport const DEFAULT_JSON_BODY_MAX_BYTES = 1024 * 1024;\nexport const LARGE_JSON_BODY_MAX_BYTES = 8 * 1024 * 1024;\n\nexport class RequestBodyError extends Error {\n constructor(\n message: string,\n readonly status: 400 | 408 | 413,\n ) {\n super(message);\n this.name = 'RequestBodyError';\n }\n}\n\n/** File and binary payload routes need more room than control operations. */\nexport function requestBodyMaxBytes(path: string): number {\n switch (path) {\n case '/ai/run':\n case '/ai/provider':\n case '/ai/toMarkdown':\n case '/kv/put':\n case '/r2/put':\n case '/r2/put-conditional':\n return LARGE_JSON_BODY_MAX_BYTES;\n default:\n return DEFAULT_JSON_BODY_MAX_BYTES;\n }\n}\n\nasync function beforeDeadline<T>(deadline: number, run: () => Promise<T>): Promise<T> {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new RequestBodyError('request body timeout', 408);\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n return Promise.race([\n run(),\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new RequestBodyError('request body timeout', 408)),\n remaining,\n );\n }),\n ]).finally(() => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n });\n}\n\n/** Bound public request bodies before JSON parsing or authentication. */\nexport async function readRequestJson(request: Request, maxBytes: number): Promise<unknown> {\n const declaredLength = request.headers.get('content-length');\n if (\n declaredLength !== null &&\n /^\\d+$/.test(declaredLength) &&\n Number(declaredLength) > maxBytes\n ) {\n void request.body?.cancel().catch(() => {});\n throw new RequestBodyError('request body too large', 413);\n }\n if (\n request.headers.has('content-encoding') ||\n !request.body ||\n (declaredLength !== null && !/^\\d+$/.test(declaredLength))\n ) {\n void request.body?.cancel().catch(() => {});\n throw new RequestBodyError('invalid request body', 400);\n }\n const expectedLength = declaredLength === null ? null : Number(declaredLength);\n const reader = request.body.getReader();\n let bytes = new Uint8Array(Math.min(1024, maxBytes));\n const deadline = Date.now() + REQUEST_BODY_DEADLINE_MS;\n let size = 0;\n try {\n for (;;) {\n const chunk = await beforeDeadline(deadline, () => reader.read());\n if (chunk.done) {\n break;\n }\n const nextSize = size + chunk.value.byteLength;\n if (nextSize > maxBytes) {\n throw new RequestBodyError('request body too large', 413);\n }\n if (nextSize > bytes.byteLength) {\n const grown = new Uint8Array(Math.min(maxBytes, Math.max(nextSize, bytes.byteLength * 2)));\n grown.set(bytes.subarray(0, size));\n bytes = grown;\n }\n bytes.set(chunk.value, size);\n size = nextSize;\n }\n } finally {\n // An uncooperative stream may never settle cancellation. Start cleanup,\n // but do not let it extend the hard request-body deadline.\n void reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n if (size === 0 || (expectedLength !== null && size !== expectedLength)) {\n throw new RequestBodyError('invalid request body length', 400);\n }\n return JSON.parse(decoder.decode(bytes.subarray(0, size)));\n}\n", "import { Hono } from 'hono';\nimport type { ProxyEnv } from './types.ts';\n\nconst app = new Hono<ProxyEnv>();\n\n/**\n * Forward revalidation requests to the API via service binding.\n *\n * The auth middleware has already verified the HMAC token and set projectId.\n * We forward the token so the API can verify it independently.\n */\napp.post('/', async (context) => {\n const projectId = context.get('projectId');\n const body = context.get('body');\n\n const response = await context.env.API.fetch(`https://api/internal/revalidate/${projectId}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-void-internal': body.aiToken as string,\n },\n body: JSON.stringify({\n paths: body.paths,\n all: body.all,\n }),\n });\n\n return new Response(response.body, {\n status: response.status,\n headers: response.headers,\n });\n});\n\nexport { app as revalidate };\n", "import { verifyEmailReceipt } from '@void/platform/email-protocol';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { ai } from './ai.ts';\nimport { asString, isProxyBody } from './body.ts';\nimport { proxyCapabilityEnabled } from './capabilities.ts';\nimport { d1 } from './d1.ts';\nimport { email } from './email.ts';\nimport { guardHumanStream } from './human-stream.ts';\nimport { kv } from './kv.ts';\nimport { PLATFORM_DISABLED_KEY, PLATFORM_DISABLED_VALUE } from './platform-lifecycle.ts';\nimport { r2 } from './r2.ts';\nimport { readRequestJson, requestBodyMaxBytes, RequestBodyError } from './request-body.ts';\nimport { verifyPrerenderAuthority, verifyProjectDeployAccess } from './resolve.ts';\nimport { revalidate } from './revalidate.ts';\nimport type { Env, JwtPayload, ProxyBody, ProxyEnv } from './types.ts';\n\nconst app = new Hono<ProxyEnv>();\n\napp.use('/*', async (context, next) => {\n const healthProbeToken = context.env.PLATFORM_HEALTH_PROBE_TOKEN;\n const installerProbe =\n healthProbeToken !== undefined &&\n healthProbeToken !== '' &&\n context.req.path === '/health' &&\n context.req.header('X-Void-Platform-Probe') === healthProbeToken;\n if (\n !installerProbe &&\n (context.env.PLATFORM_TRAFFIC_STATE === 'staging' ||\n context.env.PLATFORM_TRAFFIC_STATE === 'sandbox-drain' ||\n (context.env.PLATFORM_INSTALLATION_ID &&\n (await context.env.ROUTING.get(PLATFORM_DISABLED_KEY)) === PLATFORM_DISABLED_VALUE))\n ) {\n return context.json({ error: 'Platform disabled' }, 503);\n }\n await next();\n});\n\n// CORS\napp.use(\n '/*',\n cors({\n origin: '*',\n allowMethods: ['POST', 'OPTIONS'],\n allowHeaders: ['content-type', 'authorization'],\n }),\n);\n\n// Health check\napp.get('/health', (context) =>\n context.json({\n ok: true,\n bindings: {\n ai: !!context.env.AI,\n kv: !!context.env.ROUTING,\n jwt: !!context.env.JWT_SECRET,\n api: !!context.env.API,\n sendEmail: !!context.env.SEND_EMAIL,\n emailDomain: !!context.env.EMAIL_SENDER_DOMAIN,\n },\n }),\n);\n\n// Reject non-POST for all other routes\napp.all('/*', async (context, next) => {\n if (context.req.method !== 'POST') {\n return context.json({ error: 'method not allowed' }, 405);\n }\n await next();\n});\n\nasync function hmacSign(data: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n 'raw',\n new TextEncoder().encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const bytes = new Uint8Array(\n await crypto.subtle.sign('HMAC', key, new TextEncoder().encode(data)),\n );\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary).replaceAll('+', '-').replaceAll('/', '_').replaceAll('=', '');\n}\n\n// The tenant calls this over its internal service binding. EMAIL_SIGNING_SECRET never\n// enters the tenant, so a project token cannot mint a gateway receipt.\napp.post('/email/verify-receipt', async (context) => {\n let body: unknown;\n try {\n body = await readRequestJson(context.req.raw, 2 * 1024);\n } catch {\n return context.json({ valid: false }, 400);\n }\n if (!body || typeof body !== 'object') {\n return context.json({ valid: false }, 400);\n }\n const input = body as Record<string, unknown>;\n if (\n typeof input.projectId !== 'string' ||\n input.projectId.length > 128 ||\n typeof input.deploymentId !== 'string' ||\n input.deploymentId.length > 128 ||\n typeof input.recipient !== 'string' ||\n input.recipient.length > 320 ||\n typeof input.receipt !== 'string' ||\n input.receipt.length > 1536\n ) {\n return context.json({ valid: false }, 400);\n }\n const projectToken = await hmacSign(input.projectId, context.env.JWT_SECRET);\n if (context.req.header('x-void-internal') !== projectToken) {\n return context.json({ valid: false }, 403);\n }\n if (!context.env.EMAIL_SIGNING_SECRET) {\n return context.json({ valid: false }, 503);\n }\n const claims = await verifyEmailReceipt(input.receipt, context.env.EMAIL_SIGNING_SECRET, {\n projectId: input.projectId,\n deploymentId: input.deploymentId,\n recipient: input.recipient,\n });\n return context.json({ valid: claims !== null, receiptId: claims?.receiptId });\n});\n\n// The former relay endpoint is gone. Reject it before the generic JSON auth\n// middleware so an untrusted MIME stream is never parsed or buffered here.\napp.post('/email/relay', (context) => context.json({ error: 'not found' }, 404));\n\n// Auth middleware \u2014 parses body, authenticates, sets projectId\napp.post('/*', async (context, next) => {\n const path = new URL(context.req.url).pathname;\n\n let body: ProxyBody;\n try {\n // Five MiB of MIME expands to about seven MiB of base64, plus JSON metadata.\n const maxBytes =\n path === '/email' || path.startsWith('/email/') ? 8 * 1024 * 1024 : requestBodyMaxBytes(path);\n const json = await readRequestJson(context.req.raw, maxBytes);\n if (!isProxyBody(json)) {\n return context.json({ error: 'invalid JSON body' }, 400);\n }\n body = json;\n } catch (error) {\n if (path !== '/email' && !path.startsWith('/email/') && error instanceof RequestBodyError) {\n return context.json({ error: error.message }, error.status);\n }\n return context.json({ error: 'invalid JSON body' }, 400);\n }\n context.set('body', body);\n\n let revalidateHuman: (() => Promise<boolean>) | undefined;\n const authHeader = context.req.header('authorization');\n if (authHeader?.startsWith('Bearer ')) {\n // HTTPS path (local dev) \u2014 validate JWT\n const token = authHeader.slice(7);\n const payload = await verifyJwt(token, context.env.JWT_SECRET);\n if (!payload) {\n return context.json(\n {\n error: 'invalid or expired token',\n message:\n 'This proxy credential is invalid or expired. Sign in to the connected platform again for remote development, or restart the build to obtain a fresh prerender token.',\n },\n 401,\n );\n }\n const projectId = asString(body.projectId);\n if (!projectId) {\n return context.json({ error: 'projectId required' }, 400);\n }\n if (payload.aud === 'prerender') {\n // Prerender credentials are short-lived and already pinned to one\n // project by the API that minted them. Never turn one into a general\n // owner token by accepting a caller-selected projectId.\n if (!payload.project || payload.project !== projectId) {\n return context.json(\n {\n error: 'forbidden',\n message:\n 'This prerender token does not match the requested project. Restart the build with a prerender token issued for the selected project.',\n },\n 403,\n );\n }\n const active = await verifyPrerenderAuthority(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n payload.sub,\n {\n ...(payload.build ? { buildId: payload.build } : {}),\n ...(payload.credential ? { credentialId: payload.credential } : {}),\n },\n );\n if (!active) {\n return context.json(\n {\n error: payload.credential\n ? 'prerender token credential is no longer active'\n : payload.build\n ? 'prerender token build is no longer active'\n : 'prerender token authority is no longer active',\n message: payload.credential\n ? 'The deploy credential used for prerendering is no longer authorized. Ask the project owner for an active deploy credential, then restart the build.'\n : payload.build\n ? 'This build is no longer authorized to prerender. Start a new build to obtain a fresh prerender token.'\n : 'This prerender token is no longer authorized. Confirm your project access with a project admin or owner, then restart the build to obtain a fresh token.',\n },\n 403,\n );\n }\n } else {\n // Full API tokens retain the local-development ownership lookup.\n const checkOwner = () =>\n verifyProjectDeployAccess(\n context.env.API,\n context.env.JWT_SECRET,\n projectId,\n payload.sub,\n token,\n context.req.header('Cf-Access-Jwt-Assertion'),\n new URL(context.req.url).origin,\n );\n revalidateHuman = async () => payload.exp > Date.now() / 1000 && (await checkOwner());\n if (!(await revalidateHuman())) {\n return context.json(\n {\n error: 'forbidden',\n message:\n 'Remote access could not be authorized. Check the selected platform and project, then ask a project admin or owner to confirm your access. If your access is correct, retry shortly.',\n },\n 403,\n );\n }\n }\n context.set('projectId', projectId);\n } else {\n // Service binding path (production) \u2014 verify HMAC-signed project token\n const projectId = asString(body.projectId);\n const aiToken = asString(body.aiToken);\n if (!projectId || !aiToken) {\n return context.json({ error: 'projectId and aiToken required' }, 400);\n }\n if (!(await verifyHmac(projectId, aiToken, context.env.JWT_SECRET))) {\n return context.json({ error: 'invalid project token' }, 403);\n }\n context.set('projectId', projectId);\n }\n\n await next();\n if (\n revalidateHuman &&\n context.res.body &&\n (context.res.headers.get('content-type')?.includes('text/event-stream') ||\n path.startsWith('/ai/') ||\n path === '/r2/get')\n ) {\n context.res = new Response(\n guardHumanStream(context.res.body, revalidateHuman, context.req.raw.signal),\n context.res,\n );\n }\n});\n\n// AI usage limit check \u2014 only applies to AI routes\napp.post('/ai/*', async (context, next) => {\n if (await context.env.ROUTING.get(`ai-block:${context.get('projectId')}`, { cacheTtl: 60 })) {\n return context.json({ error: 'AI usage limit exceeded' }, 429);\n }\n await next();\n});\n\n// Managed Sandbox is unavailable; retain its authenticated error response.\napp.post('/sandbox/*', (context) =>\n context.json(\n {\n error: 'platform capability unavailable',\n capability: 'sandbox',\n message: 'This Void platform does not enable sandbox.',\n },\n 501,\n ),\n);\n\n// Same gate for the email group. A deployed worker on a platform without\n// the email module still holds `__VOID_PROXY` and a valid project token, so\n// an explicit-`from` `sendEmail()` reaches `/email/send` and would otherwise\n// answer with the sender-domain / send-binding configuration failures \u2014 or\n// send, if the operator left the bindings in place.\napp.post('/email/*', async (context, next) => {\n if (!proxyCapabilityEnabled(context.env.PLATFORM_CAPABILITIES, 'email')) {\n return context.json(\n {\n error: 'platform capability unavailable',\n capability: 'email',\n message: 'This Void platform does not enable email.',\n },\n 501,\n );\n }\n await next();\n});\n\n// Route groups\napp.route('/ai', ai);\napp.route('/d1', d1);\napp.route('/kv', kv);\napp.route('/r2', r2);\napp.route('/revalidate', revalidate);\napp.route('/email', email);\n\nexport default { fetch: app.fetch };\n\n// --- HMAC verification ---\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nlet cachedVerifyKey: CryptoKey | undefined;\nlet cachedKeySecret: string | undefined;\n\nasync function getVerifyKey(secret: string): Promise<CryptoKey> {\n if (cachedVerifyKey && cachedKeySecret === secret) {\n return cachedVerifyKey;\n }\n cachedVerifyKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify'],\n );\n cachedKeySecret = secret;\n return cachedVerifyKey;\n}\n\nasync function verifyHmac(data: string, signature: string, secret: string): Promise<boolean> {\n try {\n const key = await getVerifyKey(secret);\n const sigBytes = base64urlDecode(signature);\n return crypto.subtle.verify('HMAC', key, sigBytes.buffer as ArrayBuffer, encoder.encode(data));\n } catch {\n return false;\n }\n}\n\n// --- JWT verification ---\n\nfunction base64urlDecode(str: string): Uint8Array {\n const padded = str.replace(/-/g, '+').replace(/_/g, '/');\n const binary = atob(padded);\n return Uint8Array.from(binary, (context) => context.charCodeAt(0));\n}\n\nasync function verifyJwt(token: string, secret: string): Promise<JwtPayload | null> {\n const parts = token.split('.');\n if (parts.length !== 3) {\n return null;\n }\n\n const [header, body, signature] = parts;\n\n try {\n const key = await getVerifyKey(secret);\n const sigBytes = base64urlDecode(signature);\n const valid = await crypto.subtle.verify(\n 'HMAC',\n key,\n sigBytes.buffer as ArrayBuffer,\n encoder.encode(`${header}.${body}`),\n );\n if (!valid) {\n return null;\n }\n\n const payload = JSON.parse(decoder.decode(base64urlDecode(body))) as JwtPayload;\n\n const now = Math.floor(Date.now() / 1000);\n if (payload.exp <= now) {\n return null;\n }\n\n if (payload.aud !== 'api' && payload.aud !== 'prerender') {\n return null;\n }\n\n return payload;\n } catch {\n return null;\n }\n}\n"],
|
|
6
|
+
"mappings": "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",
|
|
7
|
+
"names": ["PerformanceMark", "match", "decoder", "raw", "app", "Node", "_Node", "Node", "Hono", "Hono", "encoder", "hmacSign", "encoder", "cachedSignKey", "cachedKeySecret", "getSignKey", "Hono", "encoder", "decoder", "beforeDeadline", "raw", "raw", "decoder", "normalized", "encoder", "beforeDeadline", "hmacSign", "encoder", "cachedSignKey", "cachedKeySecret", "getSignKey", "Hono", "raw", "beforeDeadline", "CF_API", "Hono", "CF_API", "Hono", "decoder", "app", "Hono", "app", "Hono", "hmacSign", "encoder", "decoder", "cachedKeySecret"]
|
|
8
8
|
}
|