@dee-wan/cache 1.1.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -1
- package/dist/chunk-2V6MG4YX.js +652 -0
- package/dist/chunk-2V6MG4YX.js.map +1 -0
- package/dist/{chunk-MOJBHU3S.js → chunk-6VWIKYUQ.js} +72 -173
- package/dist/chunk-6VWIKYUQ.js.map +1 -0
- package/dist/{chunk-HGAUU4EU.js → chunk-7OWX6SH5.js} +52 -15
- package/dist/chunk-7OWX6SH5.js.map +1 -0
- package/dist/{chunk-A4WV6RY4.js → chunk-GGSQ6C6X.js} +8 -3
- package/dist/chunk-GGSQ6C6X.js.map +1 -0
- package/dist/{chunk-ZREX7LLC.js → chunk-M4UOCIDQ.js} +18 -6
- package/dist/chunk-M4UOCIDQ.js.map +1 -0
- package/dist/chunk-NFBMWKY5.js +54 -0
- package/dist/chunk-NFBMWKY5.js.map +1 -0
- package/dist/{chunk-OOPPXK7Q.js → chunk-WKZ7TKGM.js} +3 -54
- package/dist/chunk-WKZ7TKGM.js.map +1 -0
- package/dist/chunk-ZBYAKDNZ.js +45 -0
- package/dist/chunk-ZBYAKDNZ.js.map +1 -0
- package/dist/client.d.ts +14 -1
- package/dist/client.js +37 -1
- package/dist/client.js.map +1 -1
- package/dist/cloudflare/index.d.ts +1 -1
- package/dist/cloudflare/index.js +4 -4
- package/dist/d1/index.d.ts +18 -2
- package/dist/d1/index.js +33 -11
- package/dist/d1/index.js.map +1 -1
- package/dist/d1/response-lease.js +11 -9
- package/dist/d1/response-lease.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/response-lease.js +8 -3
- package/dist/{types-D-Gd11to.d.ts → types-CtErcz2a.d.ts} +13 -1
- package/docs/cache-contract.md +2 -0
- package/package.json +1 -1
- package/dist/chunk-A4WV6RY4.js.map +0 -1
- package/dist/chunk-D2EESWMC.js +0 -19
- package/dist/chunk-D2EESWMC.js.map +0 -1
- package/dist/chunk-HGAUU4EU.js.map +0 -1
- package/dist/chunk-MOJBHU3S.js.map +0 -1
- package/dist/chunk-OOPPXK7Q.js.map +0 -1
- package/dist/chunk-ZREX7LLC.js.map +0 -1
package/dist/d1/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/d1/json-read.ts","../../src/d1/regional-response.ts"],"names":["identity","requestIdentity","response"],"mappings":"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","file":"index.js","sourcesContent":["import type { D1Database } from '@cloudflare/workers-types';\nimport { cacheD1Read, type D1ReadOptions } from './read';\n\nconst MAX_BODY_BYTES = 1_000_000;\nconst sensitiveHeaders = new Set(['authorization', 'cookie', 'proxy-authorization', 'x-api-key', 'x-site-token', 'x-capability', 'x-capability-token']);\nconst ephemeralHeaders = new Set(['cf-ray', 'x-request-id', 'traceparent', 'tracestate', 'cf-connecting-ip', 'x-forwarded-for']);\nconst hopHeaders = new Set(['connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailer', 'transfer-encoding', 'upgrade']);\n\nexport interface D1JsonReadOptions extends Omit<D1ReadOptions<never>, 'cacheable' | 'regionalTtlMs'> {\n request: Request;\n buffered?: true;\n}\n\nexport interface JsonResponseEntry {\n status: number;\n statusText: string;\n headers: [string, string][];\n body: string;\n}\n\nfunction requestIdentity(request: Request): unknown | null {\n if (request.method !== 'GET') return null;\n for (const name of ['range', 'if-match', 'if-none-match', 'if-modified-since', 'if-unmodified-since', 'if-range', 'x-capability', 'x-capability-token', 'x-site-token', 'x-api-key', 'authorization']) if (request.headers.has(name)) return null;\n const url = new URL(request.url);\n if (/(?:^|\\/)(?:capability|capabilities)(?:\\/|$)/i.test(url.pathname)) return null;\n for (const name of url.searchParams.keys()) if (/^(?:preview|token|capability|capability_token)$/i.test(name)) return null;\n const headers = [...request.headers.entries()].filter(([name]) => !sensitiveHeaders.has(name.toLowerCase()) && !ephemeralHeaders.has(name.toLowerCase())).sort(([a], [b]) => a.localeCompare(b));\n return { url: url.toString(), headers };\n}\n\nexport async function responseEntry(response: Response): Promise<JsonResponseEntry | null> {\n if (response.status !== 200 || response.headers.has('set-cookie') || response.headers.has('content-disposition') || response.headers.has('transfer-encoding') || response.headers.has('content-encoding')) return null;\n if (!/^application\\/(?:[a-z0-9.+-]*\\+)?json(?:\\s*;|$)/i.test(response.headers.get('content-type') ?? '')) return null;\n const vary = response.headers.get('vary');\n if (vary && vary.split(',').some((name) => name.trim() === '*' || (sensitiveHeaders.has(name.trim().toLowerCase()) || ephemeralHeaders.has(name.trim().toLowerCase())))) return null;\n const length = response.headers.get('content-length');\n if (length !== null && (!/^(?:0|[1-9]\\d*)$/.test(length) || !Number.isSafeInteger(Number(length)) || Number(length) > MAX_BODY_BYTES)) return null;\n const reader = response.clone().body?.getReader();\n if (!reader) return null;\n const chunks: Uint8Array[] = [];\n let size = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const timeout = new Promise<never>((_, reject) => { timer = setTimeout(() => reject(new Error('buffered body timeout')), 1000); });\n for (;;) {\n const next = await Promise.race([reader.read(), timeout]);\n if (next.done) break;\n size += next.value.byteLength;\n if (size > MAX_BODY_BYTES) return null;\n chunks.push(next.value);\n }\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n void reader.cancel().catch(() => undefined);\n }\n if (length !== null && size !== Number(length)) return null;\n const joined = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) { joined.set(chunk, offset); offset += chunk.byteLength; }\n const body = new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(joined);\n try { JSON.parse(body); } catch { return null; }\n const headers: [string, string][] = [...response.headers.entries()].filter(([name]) => !hopHeaders.has(name.toLowerCase()));\n return { status: response.status, statusText: response.statusText, headers, body };\n}\n\nexport async function cacheD1JsonRead(database: D1Database, options: D1JsonReadOptions, load: () => Promise<Response>): Promise<Response> {\n if (options.buffered !== true) return load();\n let identity: unknown | null;\n try { identity = requestIdentity(options.request); } catch { return load(); }\n if (identity === null) return load();\n let original: Response | undefined;\n const entry = await cacheD1Read<JsonResponseEntry | null>(database, {\n key: ['json-response-v1', options.key, identity],\n scope: options.scope,\n ...(options.dependencies ? { dependencies: options.dependencies } : {}),\n ...(options.ttlMs !== undefined ? { ttlMs: options.ttlMs } : {}),\n cacheable: (value) => value !== null,\n }, async () => {\n original = await load();\n try { return await responseEntry(original); } catch { return null; }\n });\n if (original) return original;\n if (!entry || entry.status !== 200 || typeof entry.statusText !== 'string' || typeof entry.body !== 'string' || !Array.isArray(entry.headers) || !entry.headers.every((header) => Array.isArray(header) && header.length === 2 && typeof header[0] === 'string' && typeof header[1] === 'string' && !hopHeaders.has(header[0].toLowerCase()) && header[0].toLowerCase() !== 'set-cookie' && header[0].toLowerCase() !== 'content-disposition')) return load();\n try {\n JSON.parse(entry.body);\n const headers = new Headers(entry.headers);\n if (headers.has('content-encoding') || !/^application\\/(?:[a-z0-9.+-]*\\+)?json(?:\\s*;|$)/i.test(headers.get('content-type') ?? '')) return load();\n const vary = headers.get('vary');\n if (vary && vary.split(',').some((name) => name.trim() === '*' || sensitiveHeaders.has(name.trim().toLowerCase()) || ephemeralHeaders.has(name.trim().toLowerCase()))) return load();\n return new Response(entry.body, { status: entry.status, statusText: entry.statusText, headers });\n } catch { return load(); }\n}\n","import { responseEntry, type JsonResponseEntry } from './json-read';\nimport { regionalKey, regionalRead, regionalWrite } from './regional';\n\nexport interface RegionalResponseOptions {\n namespace: string;\n ttlMs: number;\n waitUntil?: (promise: Promise<void>) => void;\n}\n\nconst sensitive = /^(?:cookie|authorization|proxy-authorization|(?:x-)?api-key|(?:x-)?site-token|(?:x-)?site-key|(?:x-)?capability(?:-token)?|x-preview|preview)$/i;\nconst ephemeral = /^(?:cf-ray|x-request-id|traceparent|tracestate|cf-connecting-ip|x-forwarded-for)$/i;\nconst hop = /^(?:connection|keep-alive|proxy-authenticate|proxy-authorization|te|trailer|transfer-encoding|upgrade)$/i;\nconst conditional = /^(?:range|if-match|if-none-match|if-modified-since|if-unmodified-since|if-range)$/i;\n\nfunction identity(request: Request): unknown | null {\n if (request.method !== 'GET') return null;\n const url = new URL(request.url);\n if (/(?:^|\\/)(?:capability|capabilities)(?:\\/|$)/i.test(url.pathname)) return null;\n if ([...url.searchParams.keys()].some((name) => /^(?:preview|token|capability|capability_token)$/i.test(name))) return null;\n if ((request.headers.get('cache-control') ?? '').split(',').some((part) => /^\\s*(?:no-cache|no-store)(?:\\s*=|\\s*$)/i.test(part))) return null;\n const headers: [string, string][] = [];\n for (const [name, value] of request.headers) {\n if (sensitive.test(name) || conditional.test(name) || /(?:^|[-_])(?:capability|preview)(?:[-_]|$)/i.test(name)) return null;\n if (!ephemeral.test(name)) headers.push([name, value]);\n }\n headers.sort(([a], [b]) => a.localeCompare(b));\n return [url.toString(), headers];\n}\n\nfunction eligible(headers: Headers): boolean {\n const control = headers.get('cache-control') ?? '';\n const directives = control.split(',').map((part) => part.trim());\n if (!directives.some((part) => /^public$/i.test(part)) || directives.some((part) => /^(?:private|no-store|no-cache)(?:\\s*=|$)/i.test(part))) return false;\n if (!directives.some((part) => /^s-maxage\\s*=\\s*\"?[1-9]\\d*\"?$/i.test(part))) return false;\n for (const [name] of headers) if (hop.test(name)) return false;\n const vary = headers.get('vary');\n return !vary || vary.split(',').every((part) => {\n const name = part.trim();\n return !!name && name !== '*' && !sensitive.test(name) && !ephemeral.test(name) && !conditional.test(name) && !hop.test(name) && !/(?:^|[-_])(?:capability|preview)(?:[-_]|$)/i.test(name);\n });\n}\n\nfunction reconstruct(value: unknown): Response | null {\n if (!value || typeof value !== 'object') return null;\n const entry = value as Partial<JsonResponseEntry>;\n if (entry.status !== 200 || typeof entry.statusText !== 'string' || typeof entry.body !== 'string' || !Array.isArray(entry.headers) || !entry.headers.every((header) => Array.isArray(header) && header.length === 2 && typeof header[0] === 'string' && typeof header[1] === 'string')) return null;\n try {\n if (new TextEncoder().encode(entry.body).byteLength > 1_000_000) return null;\n JSON.parse(entry.body);\n const headers = new Headers(entry.headers);\n const length = headers.get('content-length');\n if (length !== null && (!/^(?:0|[1-9]\\d*)$/.test(length) || Number(length) !== new TextEncoder().encode(entry.body).byteLength)) return null;\n if (!eligible(headers) || headers.has('set-cookie') || headers.has('content-disposition') || headers.has('content-encoding') || !/^application\\/(?:[a-z0-9.+-]*\\+)?json(?:\\s*;|$)/i.test(headers.get('content-type') ?? '')) return null;\n headers.set('cache-control', 'public, max-age=0, must-revalidate');\n return new Response(entry.body, { status:200, statusText:entry.statusText, headers });\n } catch { return null; }\n}\n\nexport async function cacheRegionalResponse(request: Request, options: RegionalResponseOptions, load: () => Promise<Response>): Promise<Response> {\n let requestIdentity: unknown | null;\n try { requestIdentity = identity(request); } catch { return load(); }\n if (requestIdentity === null || typeof options.namespace !== 'string' || !options.namespace.trim()) return load();\n const key = await regionalKey(options.ttlMs, ['http-response', options.namespace, options.ttlMs, requestIdentity]);\n if (!key) return load();\n const cached = await regionalRead(key, options.ttlMs);\n if (cached) {\n const response = reconstruct(cached.value);\n if (response) return response;\n }\n const started = Date.now();\n const response = await load();\n if (!eligible(response.headers)) return response;\n let entry: JsonResponseEntry | null;\n try { entry = await responseEntry(response); } catch { return response; }\n if (!entry) return response;\n const output = reconstruct(entry);\n if (!output) return response;\n const sharedAge = (response.headers.get('cache-control') ?? '').split(',').map((part) => /^\\s*s-maxage\\s*=\\s*\"?([1-9]\\d*)\"?\\s*$/i.exec(part)).filter((match): match is RegExpExecArray => match !== null).map((match) => Number(match[1]));\n const fill = regionalWrite(key, Math.min(options.ttlMs, ...sharedAge.map((age) => age * 1000)), started, entry);\n if (options.waitUntil) {\n try { options.waitUntil(fill); } catch { await fill; }\n } else await fill;\n return output;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/d1/json-read.ts","../../src/d1/regional-response.ts"],"names":["identity","requestIdentity","response"],"mappings":";;;;;;;;;;;;;;;AAGA,IAAM,cAAA,GAAiB,GAAA;AACvB,IAAM,gBAAA,mBAAmB,IAAI,GAAA,CAAI,CAAC,eAAA,EAAiB,QAAA,EAAU,qBAAA,EAAuB,WAAA,EAAa,cAAA,EAAgB,cAAA,EAAgB,oBAAoB,CAAC,CAAA;AACtJ,IAAM,gBAAA,mBAAmB,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,gBAAgB,aAAA,EAAe,YAAA,EAAc,kBAAA,EAAoB,iBAAiB,CAAC,CAAA;AAC/H,IAAM,UAAA,mBAAa,IAAI,GAAA,CAAI,CAAC,YAAA,EAAc,YAAA,EAAc,oBAAA,EAAsB,qBAAA,EAAuB,IAAA,EAAM,SAAA,EAAW,mBAAA,EAAqB,SAAS,CAAC,CAAA;AAcrJ,SAAS,gBAAgB,OAAA,EAAkC;AACzD,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,KAAA,EAAO,OAAO,IAAA;AACrC,EAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,OAAA,EAAS,UAAA,EAAY,iBAAiB,mBAAA,EAAqB,qBAAA,EAAuB,YAAY,cAAA,EAAgB,oBAAA,EAAsB,gBAAgB,WAAA,EAAa,eAAe,GAAG,IAAI,OAAA,CAAQ,QAAQ,GAAA,CAAI,IAAI,GAAG,OAAO,IAAA;AAC7O,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,EAAA,IAAI,8CAAA,CAA+C,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAG,OAAO,IAAA;AAC9E,EAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,YAAA,CAAa,IAAA,EAAK,MAAO,kDAAA,CAAmD,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AACtH,EAAA,MAAM,UAAU,CAAC,GAAG,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,IAAI,CAAA,KAAM,CAAC,gBAAA,CAAiB,GAAA,CAAI,KAAK,WAAA,EAAa,CAAA,IAAK,CAAC,iBAAiB,GAAA,CAAI,IAAA,CAAK,aAAa,CAAC,EAAE,IAAA,CAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAC/L,EAAA,OAAO,EAAE,GAAA,EAAK,GAAA,CAAI,QAAA,IAAY,OAAA,EAAQ;AACxC;AAEA,eAAsB,cAAc,QAAA,EAAuD;AACzF,EAAA,IAAI,QAAA,CAAS,WAAW,GAAA,IAAO,QAAA,CAAS,QAAQ,GAAA,CAAI,YAAY,CAAA,IAAK,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA,IAAK,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA,IAAK,SAAS,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,EAAG,OAAO,IAAA;AAClN,EAAA,IAAI,CAAC,kDAAA,CAAmD,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAI,cAAc,CAAA,IAAK,EAAE,CAAA,EAAG,OAAO,IAAA;AACjH,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AACxC,EAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAK,KAAM,GAAA,KAAQ,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAa,CAAA,IAAK,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAa,CAAA,CAAE,GAAG,OAAO,IAAA;AAChL,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AACpD,EAAA,IAAI,WAAW,IAAA,KAAS,CAAC,mBAAmB,IAAA,CAAK,MAAM,KAAK,CAAC,MAAA,CAAO,aAAA,CAAc,MAAA,CAAO,MAAM,CAAC,CAAA,IAAK,OAAO,MAAM,CAAA,GAAI,iBAAiB,OAAO,IAAA;AAC9I,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,EAAM,CAAE,MAAM,SAAA,EAAU;AAChD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AAAE,MAAA,KAAA,GAAQ,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,MAAM,uBAAuB,CAAC,GAAG,GAAI,CAAA;AAAA,IAAG,CAAC,CAAA;AACjI,IAAA,WAAS;AACP,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,CAAO,IAAA,EAAK,EAAG,OAAO,CAAC,CAAA;AACxD,MAAA,IAAI,KAAK,IAAA,EAAM;AACf,MAAA,IAAA,IAAQ,KAAK,KAAA,CAAM,UAAA;AACnB,MAAA,IAAI,IAAA,GAAO,gBAAgB,OAAO,IAAA;AAClC,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,SAAE;AACA,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAC3C,IAAA,KAAK,MAAA,CAAO,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,EAC5C;AACA,EAAA,IAAI,WAAW,IAAA,IAAQ,IAAA,KAAS,MAAA,CAAO,MAAM,GAAG,OAAO,IAAA;AACvD,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAAE,IAAA,MAAA,CAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AAAG,IAAA,MAAA,IAAU,KAAA,CAAM,UAAA;AAAA,EAAY;AACrF,EAAA,MAAM,IAAA,GAAO,IAAI,WAAA,CAAY,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA;AACtF,EAAA,IAAI;AAAE,IAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EAAG,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,IAAA;AAAA,EAAM;AAC/C,EAAA,MAAM,UAA8B,CAAC,GAAG,SAAS,OAAA,CAAQ,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,IAAI,MAAM,CAAC,UAAA,CAAW,IAAI,IAAA,CAAK,WAAA,EAAa,CAAC,CAAA;AAC1H,EAAA,OAAO,EAAE,QAAQ,QAAA,CAAS,MAAA,EAAQ,YAAY,QAAA,CAAS,UAAA,EAAY,SAAS,IAAA,EAAK;AACnF;AAEA,eAAsB,eAAA,CAAgB,QAAA,EAAsB,OAAA,EAA4B,IAAA,EAAkD;AACxI,EAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,IAAA,EAAM,OAAO,IAAA,EAAK;AAC3C,EAAA,IAAIA,SAAAA;AACJ,EAAA,IAAI;AAAE,IAAAA,SAAAA,GAAW,eAAA,CAAgB,OAAA,CAAQ,OAAO,CAAA;AAAA,EAAG,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,IAAA,EAAK;AAAA,EAAG;AAC5E,EAAA,IAAIA,SAAAA,KAAa,IAAA,EAAM,OAAO,IAAA,EAAK;AACnC,EAAA,IAAI,QAAA;AACJ,EAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,CAAsC,QAAA,EAAU;AAAA,IAClE,GAAA,EAAK,CAAC,kBAAA,EAAoB,OAAA,CAAQ,KAAKA,SAAQ,CAAA;AAAA,IAC/C,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,GAAI,QAAQ,YAAA,GAAe,EAAE,cAAc,OAAA,CAAQ,YAAA,KAAiB,EAAC;AAAA,IACrE,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI,EAAC;AAAA,IAC9D,SAAA,EAAW,CAAC,KAAA,KAAU,KAAA,KAAU;AAAA,KAC/B,YAAY;AACb,IAAA,QAAA,GAAW,MAAM,IAAA,EAAK;AACtB,IAAA,IAAI;AAAE,MAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,IAAA;AAAA,IAAM;AAAA,EACrE,CAAC,CAAA;AACD,EAAA,IAAI,UAAU,OAAO,QAAA;AACrB,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,GAAA,IAAO,OAAO,KAAA,CAAM,UAAA,KAAe,QAAA,IAAY,OAAO,KAAA,CAAM,IAAA,KAAS,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,IAAK,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,CAAC,MAAA,KAAW,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,IAAK,OAAO,MAAA,KAAW,CAAA,IAAK,OAAO,MAAA,CAAO,CAAC,CAAA,KAAM,QAAA,IAAY,OAAO,MAAA,CAAO,CAAC,CAAA,KAAM,QAAA,IAAY,CAAC,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,OAAkB,YAAA,IAAgB,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,KAAM,qBAAqB,CAAA,SAAU,IAAA,EAAK;AAC5b,EAAA,IAAI;AACF,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AACrB,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AACzC,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,IAAK,CAAC,kDAAA,CAAmD,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAE,CAAA,SAAU,IAAA,EAAK;AAChJ,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAC/B,IAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAK,KAAM,GAAA,IAAO,iBAAiB,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAa,CAAA,IAAK,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAa,CAAC,CAAA,SAAU,IAAA,EAAK;AACnL,IAAA,OAAO,IAAI,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,UAAA,EAAY,KAAA,CAAM,UAAA,EAAY,OAAA,EAAS,CAAA;AAAA,EACjG,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,IAAA,EAAK;AAAA,EAAG;AAC3B;;;AChFA,IAAM,SAAA,GAAY,iJAAA;AAClB,IAAM,SAAA,GAAY,oFAAA;AAClB,IAAM,GAAA,GAAM,0GAAA;AACZ,IAAM,WAAA,GAAc,oFAAA;AAEpB,SAAS,SAAS,OAAA,EAAkC;AAClD,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,KAAA,EAAO,OAAO,IAAA;AACrC,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,EAAA,IAAI,8CAAA,CAA+C,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAG,OAAO,IAAA;AAC9E,EAAA,IAAI,CAAC,GAAG,GAAA,CAAI,YAAA,CAAa,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,SAAS,kDAAA,CAAmD,IAAA,CAAK,IAAI,CAAC,GAAG,OAAO,IAAA;AACvH,EAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA,IAAK,IAAI,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS,yCAAA,CAA0C,KAAK,IAAI,CAAC,GAAG,OAAO,IAAA;AACzI,EAAA,MAAM,UAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,QAAQ,OAAA,EAAS;AAC3C,IAAA,IAAI,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,IAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,IAAK,6CAAA,CAA8C,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AACvH,IAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,IAAK,KAAK,WAAA,EAAY,KAAM,kBAAA,CAAmB,WAAA,IAAe,OAAA,CAAQ,IAAA,CAAK,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,EAClH;AACA,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAC7C,EAAA,OAAO,CAAC,GAAA,CAAI,QAAA,EAAS,EAAG,OAAO,CAAA;AACjC;AAEA,SAAS,SAAS,OAAA,EAA2B;AAC3C,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA,IAAK,EAAA;AAChD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA;AAC/D,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,CAAC,IAAA,KAAS,WAAA,CAAY,KAAK,IAAI,CAAC,KAAK,UAAA,CAAW,IAAA,CAAK,CAAC,IAAA,KAAS,2CAAA,CAA4C,KAAK,IAAI,CAAC,GAAG,OAAO,KAAA;AACpJ,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,CAAC,IAAA,KAAS,iCAAiC,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG,OAAO,KAAA;AACpF,EAAA,KAAA,MAAW,CAAC,IAAI,CAAA,IAAK,OAAA,MAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,KAAA;AACzD,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAC/B,EAAA,OAAO,CAAC,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,IAAA,KAAS;AAC9C,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,IAAA,OAAO,CAAC,CAAC,IAAA,IAAQ,IAAA,KAAS,GAAA,IAAO,CAAC,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,IAAK,CAAC,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,IAAK,CAAC,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,IAAK,CAAC,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,CAAC,6CAAA,CAA8C,IAAA,CAAK,IAAI,CAAA;AAAA,EAC3L,CAAC,CAAA;AACH;AAEA,SAAS,YAAY,KAAA,EAAiC;AACpD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,IAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,KAAA;AACd,EAAA,IAAI,MAAM,MAAA,KAAW,GAAA,IAAO,OAAO,KAAA,CAAM,UAAA,KAAe,YAAY,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,OAAO,CAAA,IAAK,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,CAAC,WAAW,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,IAAK,MAAA,CAAO,WAAW,CAAA,IAAK,OAAO,OAAO,CAAC,CAAA,KAAM,YAAY,OAAO,MAAA,CAAO,CAAC,CAAA,KAAM,QAAQ,GAAG,OAAO,IAAA;AAChS,EAAA,IAAI;AACF,IAAA,IAAI,IAAI,aAAY,CAAE,MAAA,CAAO,MAAM,IAAI,CAAA,CAAE,UAAA,GAAa,GAAA,EAAW,OAAO,IAAA;AACxE,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AACrB,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AACzC,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAC3C,IAAA,IAAI,WAAW,IAAA,KAAS,CAAC,mBAAmB,IAAA,CAAK,MAAM,KAAK,MAAA,CAAO,MAAM,CAAA,KAAM,IAAI,aAAY,CAAE,MAAA,CAAO,MAAM,IAAI,CAAA,CAAE,aAAa,OAAO,IAAA;AACxI,IAAA,IAAI,CAAC,QAAA,CAAS,OAAO,CAAA,IAAK,OAAA,CAAQ,IAAI,YAAY,CAAA,IAAK,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA,IAAK,QAAQ,GAAA,CAAI,kBAAkB,CAAA,IAAK,CAAC,kDAAA,CAAmD,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAE,CAAA,EAAG,OAAO,IAAA;AACpO,IAAA,OAAA,CAAQ,GAAA,CAAI,iBAAiB,oCAAoC,CAAA;AACjE,IAAA,OAAO,IAAI,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,EAAE,MAAA,EAAO,GAAA,EAAK,UAAA,EAAW,KAAA,CAAM,UAAA,EAAY,OAAA,EAAS,CAAA;AAAA,EACtF,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,IAAA;AAAA,EAAM;AACzB;AAEA,eAAsB,qBAAA,CAAsB,OAAA,EAAkB,OAAA,EAAkC,IAAA,EAAkD;AAChJ,EAAA,IAAIC,gBAAAA;AACJ,EAAA,IAAI;AAAE,IAAAA,gBAAAA,GAAkB,SAAS,OAAO,CAAA;AAAA,EAAG,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,IAAA,EAAK;AAAA,EAAG;AACpE,EAAA,IAAIA,gBAAAA,KAAoB,IAAA,IAAQ,OAAO,OAAA,CAAQ,SAAA,KAAc,QAAA,IAAY,CAAC,OAAA,CAAQ,SAAA,CAAU,IAAA,EAAK,EAAG,OAAO,IAAA,EAAK;AAChH,EAAA,MAAM,QAAQ,sBAAA,EAAuB;AACrC,EAAA,MAAM,GAAA,GAAM,MAAM,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAC,eAAA,EAAiB,KAAA,GAAQ,YAAA,GAAe,MAAM,OAAA,CAAQ,SAAA,EAAW,OAAA,CAAQ,KAAA,EAAOA,gBAAe,CAAC,CAAA;AAC9I,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,IAAA,EAAK;AACtB,EAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,GAAA,EAAK,QAAQ,KAAK,CAAA;AACpD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAMC,SAAAA,GAAW,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA;AACzC,IAAA,IAAIA,SAAAA,EAAU;AACZ,MAAA,IAAI,CAAC,OAAO,OAAOA,SAAAA;AACnB,MAAA,MAAM,GAAA,GAAMA,SAAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA;AACnD,MAAA,MAAM,MAAA,GAAS,kBAAkB,GAAG,CAAA;AACpC,MAAA,IAAI,OAAO,MAAA,IAAU,MAAA,CAAO,QAAQ,KAAK,CAAA,CAAE,MAAM,CAAC,CAAC,IAAI,QAAQ,CAAA,KAAM,OAAO,EAAE,CAAA,IAAK,OAAO,EAAE,CAAA,IAAK,QAAQ,CAAA,EAAG;AAC1G,QAAA,yBAAA,CAA0B,MAAM,CAAA;AAChC,QAAA,OAAOA,SAAAA;AAAA,MACT;AACA,MAAA,KAAKA,UAAS,IAAA,EAAM,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IACpD;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,EAAA,MAAM,UAAU,MAAM,oBAAA,CAAqB,MAAM,yBAAA,CAA0B,IAAI,CAAC,CAAA;AAChF,EAAA,IAAI,WAAW,OAAA,CAAQ,KAAA;AACvB,EAAA,MAAM,SAAA,GAAY,0BAAA,CAA2B,QAAA,CAAS,OAAA,EAAS,QAAQ,SAAS,CAAA;AAChF,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,qBAAqB,SAAS,CAAA;AAC9C,IAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,kBAAA,EAAoB,OAAO,CAAA;AACpD,IAAA,eAAA,CAAgB,OAAO,CAAA;AACvB,IAAA,QAAA,GAAW,IAAI,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM,EAAE,MAAA,EAAO,QAAA,CAAS,MAAA,EAAQ,UAAA,EAAW,QAAA,CAAS,UAAA,EAAY,OAAA,EAAS,CAAA;AAAA,EAC5G;AACA,EAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,OAAO,GAAG,OAAO,QAAA;AACxC,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AAAE,IAAA,KAAA,GAAQ,MAAM,cAAc,QAAQ,CAAA;AAAA,EAAG,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,QAAA;AAAA,EAAU;AACxE,EAAA,IAAI,CAAC,OAAO,OAAO,QAAA;AACnB,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,IAAI,CAAC,QAAQ,OAAO,QAAA;AACpB,EAAA,MAAM,SAAA,GAAA,CAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA,IAAK,EAAA,EAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,SAAS,wCAAA,CAAyC,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,KAAA,KAAoC,UAAU,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,KAAU,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AACzO,EAAA,MAAM,OAAO,aAAA,CAAc,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,QAAQ,KAAA,EAAO,GAAG,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,GAAM,GAAI,CAAC,CAAA,EAAG,SAAS,KAAK,CAAA;AAC9G,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,IAAI;AAAE,MAAA,OAAA,CAAQ,UAAU,IAAI,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAE,MAAA,MAAM,IAAA;AAAA,IAAM;AAAA,EACvD,OAAO,MAAM,IAAA;AACb,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["import type { D1Database } from '@cloudflare/workers-types';\nimport { cacheD1Read, type D1ReadOptions } from './read';\n\nconst MAX_BODY_BYTES = 1_000_000;\nconst sensitiveHeaders = new Set(['authorization', 'cookie', 'proxy-authorization', 'x-api-key', 'x-site-token', 'x-capability', 'x-capability-token']);\nconst ephemeralHeaders = new Set(['cf-ray', 'x-request-id', 'traceparent', 'tracestate', 'cf-connecting-ip', 'x-forwarded-for']);\nconst hopHeaders = new Set(['connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailer', 'transfer-encoding', 'upgrade']);\n\nexport interface D1JsonReadOptions extends Omit<D1ReadOptions<never>, 'cacheable' | 'regionalTtlMs'> {\n request: Request;\n buffered?: true;\n}\n\nexport interface JsonResponseEntry {\n status: number;\n statusText: string;\n headers: [string, string][];\n body: string;\n}\n\nfunction requestIdentity(request: Request): unknown | null {\n if (request.method !== 'GET') return null;\n for (const name of ['range', 'if-match', 'if-none-match', 'if-modified-since', 'if-unmodified-since', 'if-range', 'x-capability', 'x-capability-token', 'x-site-token', 'x-api-key', 'authorization']) if (request.headers.has(name)) return null;\n const url = new URL(request.url);\n if (/(?:^|\\/)(?:capability|capabilities)(?:\\/|$)/i.test(url.pathname)) return null;\n for (const name of url.searchParams.keys()) if (/^(?:preview|token|capability|capability_token)$/i.test(name)) return null;\n const headers = [...request.headers.entries()].filter(([name]) => !sensitiveHeaders.has(name.toLowerCase()) && !ephemeralHeaders.has(name.toLowerCase())).sort(([a], [b]) => a.localeCompare(b));\n return { url: url.toString(), headers };\n}\n\nexport async function responseEntry(response: Response): Promise<JsonResponseEntry | null> {\n if (response.status !== 200 || response.headers.has('set-cookie') || response.headers.has('content-disposition') || response.headers.has('transfer-encoding') || response.headers.has('content-encoding')) return null;\n if (!/^application\\/(?:[a-z0-9.+-]*\\+)?json(?:\\s*;|$)/i.test(response.headers.get('content-type') ?? '')) return null;\n const vary = response.headers.get('vary');\n if (vary && vary.split(',').some((name) => name.trim() === '*' || (sensitiveHeaders.has(name.trim().toLowerCase()) || ephemeralHeaders.has(name.trim().toLowerCase())))) return null;\n const length = response.headers.get('content-length');\n if (length !== null && (!/^(?:0|[1-9]\\d*)$/.test(length) || !Number.isSafeInteger(Number(length)) || Number(length) > MAX_BODY_BYTES)) return null;\n const reader = response.clone().body?.getReader();\n if (!reader) return null;\n const chunks: Uint8Array[] = [];\n let size = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const timeout = new Promise<never>((_, reject) => { timer = setTimeout(() => reject(new Error('buffered body timeout')), 1000); });\n for (;;) {\n const next = await Promise.race([reader.read(), timeout]);\n if (next.done) break;\n size += next.value.byteLength;\n if (size > MAX_BODY_BYTES) return null;\n chunks.push(next.value);\n }\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n void reader.cancel().catch(() => undefined);\n }\n if (length !== null && size !== Number(length)) return null;\n const joined = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) { joined.set(chunk, offset); offset += chunk.byteLength; }\n const body = new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(joined);\n try { JSON.parse(body); } catch { return null; }\n const headers: [string, string][] = [...response.headers.entries()].filter(([name]) => !hopHeaders.has(name.toLowerCase()));\n return { status: response.status, statusText: response.statusText, headers, body };\n}\n\nexport async function cacheD1JsonRead(database: D1Database, options: D1JsonReadOptions, load: () => Promise<Response>): Promise<Response> {\n if (options.buffered !== true) return load();\n let identity: unknown | null;\n try { identity = requestIdentity(options.request); } catch { return load(); }\n if (identity === null) return load();\n let original: Response | undefined;\n const entry = await cacheD1Read<JsonResponseEntry | null>(database, {\n key: ['json-response-v1', options.key, identity],\n scope: options.scope,\n ...(options.dependencies ? { dependencies: options.dependencies } : {}),\n ...(options.ttlMs !== undefined ? { ttlMs: options.ttlMs } : {}),\n cacheable: (value) => value !== null,\n }, async () => {\n original = await load();\n try { return await responseEntry(original); } catch { return null; }\n });\n if (original) return original;\n if (!entry || entry.status !== 200 || typeof entry.statusText !== 'string' || typeof entry.body !== 'string' || !Array.isArray(entry.headers) || !entry.headers.every((header) => Array.isArray(header) && header.length === 2 && typeof header[0] === 'string' && typeof header[1] === 'string' && !hopHeaders.has(header[0].toLowerCase()) && header[0].toLowerCase() !== 'set-cookie' && header[0].toLowerCase() !== 'content-disposition')) return load();\n try {\n JSON.parse(entry.body);\n const headers = new Headers(entry.headers);\n if (headers.has('content-encoding') || !/^application\\/(?:[a-z0-9.+-]*\\+)?json(?:\\s*;|$)/i.test(headers.get('content-type') ?? '')) return load();\n const vary = headers.get('vary');\n if (vary && vary.split(',').some((name) => name.trim() === '*' || sensitiveHeaders.has(name.trim().toLowerCase()) || ephemeralHeaders.has(name.trim().toLowerCase()))) return load();\n return new Response(entry.body, { status: entry.status, statusText: entry.statusText, headers });\n } catch { return load(); }\n}\n","import { responseEntry, type JsonResponseEntry } from './json-read';\nimport { regionalKey, regionalRead, regionalWrite } from './regional';\nimport { D1_BOOKMARK_HEADER, decodeD1Bookmarks, serializeD1Bookmarks } from './bookmarks';\nimport { d1SessionBookmarkFloor, trackD1SessionSource, responseD1SessionBookmarks, advanceD1SessionBookmarks, varyD1Bookmarks, runPrimaryD1SessionSource } from './session';\n\nexport interface RegionalResponseOptions {\n namespace: string;\n ttlMs: number;\n waitUntil?: (promise: Promise<void>) => void;\n}\n\nconst sensitive = /^(?:cookie|authorization|proxy-authorization|(?:x-)?api-key|(?:x-)?site-token|(?:x-)?site-key|(?:x-)?capability(?:-token)?|x-preview|preview)$/i;\nconst ephemeral = /^(?:cf-ray|x-request-id|traceparent|tracestate|cf-connecting-ip|x-forwarded-for)$/i;\nconst hop = /^(?:connection|keep-alive|proxy-authenticate|proxy-authorization|te|trailer|transfer-encoding|upgrade)$/i;\nconst conditional = /^(?:range|if-match|if-none-match|if-modified-since|if-unmodified-since|if-range)$/i;\n\nfunction identity(request: Request): unknown | null {\n if (request.method !== 'GET') return null;\n const url = new URL(request.url);\n if (/(?:^|\\/)(?:capability|capabilities)(?:\\/|$)/i.test(url.pathname)) return null;\n if ([...url.searchParams.keys()].some((name) => /^(?:preview|token|capability|capability_token)$/i.test(name))) return null;\n if ((request.headers.get('cache-control') ?? '').split(',').some((part) => /^\\s*(?:no-cache|no-store)(?:\\s*=|\\s*$)/i.test(part))) return null;\n const headers: [string, string][] = [];\n for (const [name, value] of request.headers) {\n if (sensitive.test(name) || conditional.test(name) || /(?:^|[-_])(?:capability|preview)(?:[-_]|$)/i.test(name)) return null;\n if (!ephemeral.test(name) && name.toLowerCase() !== D1_BOOKMARK_HEADER.toLowerCase()) headers.push([name, value]);\n }\n headers.sort(([a], [b]) => a.localeCompare(b));\n return [url.toString(), headers];\n}\n\nfunction eligible(headers: Headers): boolean {\n const control = headers.get('cache-control') ?? '';\n const directives = control.split(',').map((part) => part.trim());\n if (!directives.some((part) => /^public$/i.test(part)) || directives.some((part) => /^(?:private|no-store|no-cache)(?:\\s*=|$)/i.test(part))) return false;\n if (!directives.some((part) => /^s-maxage\\s*=\\s*\"?[1-9]\\d*\"?$/i.test(part))) return false;\n for (const [name] of headers) if (hop.test(name)) return false;\n const vary = headers.get('vary');\n return !vary || vary.split(',').every((part) => {\n const name = part.trim();\n return !!name && name !== '*' && !sensitive.test(name) && !ephemeral.test(name) && !conditional.test(name) && !hop.test(name) && !/(?:^|[-_])(?:capability|preview)(?:[-_]|$)/i.test(name);\n });\n}\n\nfunction reconstruct(value: unknown): Response | null {\n if (!value || typeof value !== 'object') return null;\n const entry = value as Partial<JsonResponseEntry>;\n if (entry.status !== 200 || typeof entry.statusText !== 'string' || typeof entry.body !== 'string' || !Array.isArray(entry.headers) || !entry.headers.every((header) => Array.isArray(header) && header.length === 2 && typeof header[0] === 'string' && typeof header[1] === 'string')) return null;\n try {\n if (new TextEncoder().encode(entry.body).byteLength > 1_000_000) return null;\n JSON.parse(entry.body);\n const headers = new Headers(entry.headers);\n const length = headers.get('content-length');\n if (length !== null && (!/^(?:0|[1-9]\\d*)$/.test(length) || Number(length) !== new TextEncoder().encode(entry.body).byteLength)) return null;\n if (!eligible(headers) || headers.has('set-cookie') || headers.has('content-disposition') || headers.has('content-encoding') || !/^application\\/(?:[a-z0-9.+-]*\\+)?json(?:\\s*;|$)/i.test(headers.get('content-type') ?? '')) return null;\n headers.set('cache-control', 'public, max-age=0, must-revalidate');\n return new Response(entry.body, { status:200, statusText:entry.statusText, headers });\n } catch { return null; }\n}\n\nexport async function cacheRegionalResponse(request: Request, options: RegionalResponseOptions, load: () => Promise<Response>): Promise<Response> {\n let requestIdentity: unknown | null;\n try { requestIdentity = identity(request); } catch { return load(); }\n if (requestIdentity === null || typeof options.namespace !== 'string' || !options.namespace.trim()) return load();\n const floor = d1SessionBookmarkFloor();\n const key = await regionalKey(options.ttlMs, ['http-response', floor ? 'session-v1' : null, options.namespace, options.ttlMs, requestIdentity]);\n if (!key) return load();\n const cached = await regionalRead(key, options.ttlMs);\n if (cached) {\n const response = reconstruct(cached.value);\n if (response) {\n if (!floor) return response;\n const raw = response.headers.get(D1_BOOKMARK_HEADER);\n const source = decodeD1Bookmarks(raw);\n if (raw && source && Object.entries(floor).every(([id, bookmark]) => source[id] && source[id] >= bookmark)) {\n advanceD1SessionBookmarks(source);\n return response;\n }\n void response.body?.cancel().catch(() => undefined);\n }\n }\n const started = Date.now();\n const tracked = await trackD1SessionSource(() => runPrimaryD1SessionSource(load));\n let response = tracked.value;\n const bookmarks = responseD1SessionBookmarks(response.headers, tracked.bookmarks);\n if (bookmarks) {\n const headers = new Headers(response.headers);\n const encoded = serializeD1Bookmarks(bookmarks);\n if (encoded) headers.set(D1_BOOKMARK_HEADER, encoded);\n varyD1Bookmarks(headers);\n response = new Response(response.body, { status:response.status, statusText:response.statusText, headers });\n }\n if (!eligible(response.headers)) return response;\n let entry: JsonResponseEntry | null;\n try { entry = await responseEntry(response); } catch { return response; }\n if (!entry) return response;\n const output = reconstruct(entry);\n if (!output) return response;\n const sharedAge = (response.headers.get('cache-control') ?? '').split(',').map((part) => /^\\s*s-maxage\\s*=\\s*\"?([1-9]\\d*)\"?\\s*$/i.exec(part)).filter((match): match is RegExpExecArray => match !== null).map((match) => Number(match[1]));\n const fill = regionalWrite(key, Math.min(options.ttlMs, ...sharedAge.map((age) => age * 1000)), started, entry);\n if (options.waitUntil) {\n try { options.waitUntil(fill); } catch { await fill; }\n } else await fill;\n return output;\n}\n"]}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
import { d1CacheRuntime } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
4
|
-
|
|
5
|
-
import { isD1BindingName } from '../chunk-AENVFT2S.js';
|
|
6
|
-
import { createReadResponseLease } from '../chunk-HGAUU4EU.js';
|
|
7
|
-
export { forwardReadLease as forwardD1ReadLease, limitReadResponseLeaseUntil as limitD1ReadLeaseUntil, wrapReadResponseLeaseOrigin as wrapD1ReadLeaseOrigin } from '../chunk-HGAUU4EU.js';
|
|
1
|
+
import { d1CacheRuntime } from '../chunk-6VWIKYUQ.js';
|
|
2
|
+
import '../chunk-NFBMWKY5.js';
|
|
3
|
+
import { createReadResponseLease } from '../chunk-7OWX6SH5.js';
|
|
4
|
+
export { forwardReadLease as forwardD1ReadLease, limitReadResponseLeaseUntil as limitD1ReadLeaseUntil, wrapReadResponseLeaseOrigin as wrapD1ReadLeaseOrigin } from '../chunk-7OWX6SH5.js';
|
|
8
5
|
import '../chunk-JPK2AF7X.js';
|
|
9
|
-
import '../chunk-
|
|
10
|
-
import '../chunk-
|
|
6
|
+
import '../chunk-GGSQ6C6X.js';
|
|
7
|
+
import '../chunk-2V6MG4YX.js';
|
|
11
8
|
import '../chunk-LHOK33GI.js';
|
|
9
|
+
import '../chunk-M4UOCIDQ.js';
|
|
10
|
+
import '../chunk-ZBYAKDNZ.js';
|
|
11
|
+
import '../chunk-WKZ7TKGM.js';
|
|
12
12
|
import '../chunk-E6OZZ5UX.js';
|
|
13
|
+
import '../chunk-OQRNVGQE.js';
|
|
13
14
|
import '../chunk-ZCMZJKGN.js';
|
|
15
|
+
import { isD1BindingName } from '../chunk-AENVFT2S.js';
|
|
14
16
|
|
|
15
17
|
// src/d1/read-response-lease.ts
|
|
16
18
|
function wrapD1ReadResponseLease(handler, profile, options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/d1/read-response-lease.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/d1/read-response-lease.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAMO,SAAS,uBAAA,CAAqD,OAAA,EAA8E,OAAA,EAAyB,OAAA,EAAuH;AACjS,EAAA,OAAO,uBAAA,CAAwB,OAAA,EAAS,CAAC,GAAA,KAAQ;AAC/C,IAAA,MAAM,SAAS,OAAA,CAAQ,iBAAA;AACvB,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,MAAM,aAAsB,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,oBAAA,CAAsB,CAAA;AACvF,IAAA,MAAM,OAAA,GAAU,OAAO,UAAA,KAAe,QAAA,IAAY,sBAAA,CAAuB,KAAK,UAAU,CAAA,GAAI,MAAA,CAAO,UAAU,CAAA,GAAI,CAAA;AACjH,IAAA,MAAM,OAAA,GAAmB,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,OAAO,aAAa,CAAA;AAC9D,IAAA,MAAM,QAAA,GAAoB,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,OAAO,eAAe,CAAA;AACjE,IAAA,MAAM,UAAU,QAAA,IAAY,OAAO,aAAa,QAAA,GAAW,cAAA,CAAe,QAAQ,CAAA,GAAI,MAAA;AACtF,IAAA,IAAI,CAAC,eAAA,CAAgB,MAAA,CAAO,iBAAiB,OAAO,CAAA,IAAK,OAAO,OAAA,KAAY,QAAA,IAAY,CAAC,OAAA,CAAQ,IAAA,MAAU,CAAC,OAAA,EAAS,gBAAgB,CAAC,OAAA,CAAQ,kBAAkB,OAAO,IAAA;AACvK,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAA,GAAS,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAO,OAAA,CAAQ,MAAA,EAAO,GAAI,MAAA,EAAQ,OAAA,EAAS,UAAU,MAAM;AACzG,MAAA,MAAM,aAAwB,EAAC;AAC/B,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC/C,QAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,EAAM,OAAO,CAAA,EAAG;AACrC,QAAA,MAAM,aAAa,KAAA,IAAS,OAAO,UAAU,QAAA,GAAW,cAAA,CAAe,KAAK,CAAA,GAAI,MAAA;AAChF,QAAA,IAAI,CAAC,UAAA,EAAY,YAAA,IAAgB,CAAC,UAAA,CAAW,kBAAkB,OAAO,IAAA;AACtE,QAAA,UAAA,CAAW,IAAA,CAAK,CAAC,IAAA,EAAM,UAAA,CAAW,UAAA,EAAY,UAAA,CAAW,UAAA,EAAY,UAAA,CAAW,eAAA,EAAiB,UAAA,CAAW,gBAAgB,CAAC,CAAA;AAAA,MAC/H;AACA,MAAA,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,CAAE,aAAA,CAAc,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAC5D,MAAA,OAAO,CAAC,sBAAA,EAAwB,OAAA,EAAS,OAAA,EAAS,UAAU,CAAA;AAAA,IAC9D,CAAA,EAAE;AAAA,EACJ,CAAC,CAAA;AACH","file":"response-lease.js","sourcesContent":["import { d1CacheRuntime } from './env';\nimport { isD1BindingName, type D1CacheProfile } from './profile';\nimport { createReadResponseLease, type ReadResponseWarmupOptions } from '../response-lease';\n\nexport { limitReadResponseLeaseUntil as limitD1ReadLeaseUntil, wrapReadResponseLeaseOrigin as wrapD1ReadLeaseOrigin, forwardReadLease as forwardD1ReadLease } from '../response-lease';\n\nexport function wrapD1ReadResponseLease<Env extends object, Context>(handler: (request: Request, env: Env, context: Context) => Promise<Response>, profile: D1CacheProfile, options?: { warmup?: ReadResponseWarmupOptions }): (request: Request, env: Env, context: Context) => Promise<Response> {\n return createReadResponseLease(handler, (env) => {\n const config = profile.readResponseLease;\n if (!config) return null;\n const rawSeconds: unknown = Reflect.get(env, `${profile.envPrefix}_READ_ACCESS_SECONDS`);\n const seconds = typeof rawSeconds === 'string' && /^(?:0|[1-9]\\d{0,2})$/.test(rawSeconds) ? Number(rawSeconds) : 0;\n const release: unknown = Reflect.get(env, config.deploymentEnv);\n const database: unknown = Reflect.get(env, config.databaseBinding);\n const runtime = database && typeof database === 'object' ? d1CacheRuntime(database) : undefined;\n if (!isD1BindingName(config.databaseBinding, profile) || typeof release !== 'string' || !release.trim() || !runtime?.readsEnabled || !runtime.regionalIdentity) return null;\n return { config: options?.warmup ? { ...config, warmup:options.warmup } : config, seconds, identity: () => {\n const identities: unknown[] = [];\n for (const [name, value] of Object.entries(env)) {\n if (!isD1BindingName(name, profile)) continue;\n const dependency = value && typeof value === 'object' ? d1CacheRuntime(value) : undefined;\n if (!dependency?.readsEnabled || !dependency.regionalIdentity) return null;\n identities.push([name, dependency.databaseId, dependency.generation, dependency.coordinatorName, dependency.regionalIdentity]);\n }\n identities.sort((a, b) => String(a).localeCompare(String(b)));\n return ['d1-response-lease-v2', profile, release, identities];\n } };\n });\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
1
|
+
import { f as CacheExtensionOptions, g as InvalidationTarget } from './types-CtErcz2a.js';
|
|
2
|
+
export { h as CacheShape, C as CacheStore, i as CacheTestHooks, D as DecimalConstructor, G as GeneratedCacheConfig, I as InspectFencesRequest, a as InspectFencesResponse, j as RelationInfo } from './types-CtErcz2a.js';
|
|
3
3
|
|
|
4
4
|
declare class CacheUnavailableError extends Error {
|
|
5
5
|
constructor(cause: unknown);
|
package/dist/index.js
CHANGED
package/dist/response-lease.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
export { forwardReadLease, limitReadResponseLeaseUntil, wrapReadResponseLease, wrapReadResponseLeaseOrigin } from './chunk-
|
|
1
|
+
export { forwardReadLease, limitReadResponseLeaseUntil, wrapReadResponseLease, wrapReadResponseLeaseOrigin } from './chunk-7OWX6SH5.js';
|
|
2
2
|
export { matchesPath as matchesReadResponsePath } from './chunk-JPK2AF7X.js';
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
3
|
+
import './chunk-GGSQ6C6X.js';
|
|
4
|
+
import './chunk-2V6MG4YX.js';
|
|
5
5
|
import './chunk-LHOK33GI.js';
|
|
6
|
+
import './chunk-M4UOCIDQ.js';
|
|
7
|
+
import './chunk-ZBYAKDNZ.js';
|
|
8
|
+
import './chunk-WKZ7TKGM.js';
|
|
6
9
|
import './chunk-E6OZZ5UX.js';
|
|
10
|
+
import './chunk-OQRNVGQE.js';
|
|
7
11
|
import './chunk-ZCMZJKGN.js';
|
|
12
|
+
import './chunk-AENVFT2S.js';
|
|
8
13
|
//# sourceMappingURL=response-lease.js.map
|
|
9
14
|
//# sourceMappingURL=response-lease.js.map
|
|
@@ -95,6 +95,17 @@ interface CacheTestHooks {
|
|
|
95
95
|
interface DecimalConstructor {
|
|
96
96
|
new (value: string): unknown;
|
|
97
97
|
}
|
|
98
|
+
interface CacheSessionHooks {
|
|
99
|
+
key(): unknown;
|
|
100
|
+
read(value: unknown): {
|
|
101
|
+
value: unknown;
|
|
102
|
+
} | null;
|
|
103
|
+
fill(load: () => Promise<unknown>): Promise<{
|
|
104
|
+
value: unknown;
|
|
105
|
+
cached: unknown;
|
|
106
|
+
}>;
|
|
107
|
+
background?(operation: () => Promise<void>): Promise<void>;
|
|
108
|
+
}
|
|
98
109
|
interface CacheExtensionOptions {
|
|
99
110
|
config: GeneratedCacheConfig;
|
|
100
111
|
decimal?: DecimalConstructor;
|
|
@@ -109,6 +120,7 @@ interface CacheExtensionOptions {
|
|
|
109
120
|
maxValueBytes?: number;
|
|
110
121
|
onError?: (error: unknown, context: string) => void;
|
|
111
122
|
scope?: string;
|
|
123
|
+
sessionCache?: CacheSessionHooks;
|
|
112
124
|
shape?: {
|
|
113
125
|
byModel?: Record<string, CacheShape>;
|
|
114
126
|
default?: CacheShape;
|
|
@@ -129,4 +141,4 @@ type InvalidationTarget = {
|
|
|
129
141
|
models: string[];
|
|
130
142
|
};
|
|
131
143
|
|
|
132
|
-
export type { BeginWriteRequest as B, CacheStore as C, DecimalConstructor as D, EndWriteRequest as E, GeneratedCacheConfig as G, InspectFencesRequest as I, ReadRequest as R, WriteRequest as W, InspectFencesResponse as a, ReadResponse as b, WriteResult as c, ReleaseRequest as d,
|
|
144
|
+
export type { BeginWriteRequest as B, CacheStore as C, DecimalConstructor as D, EndWriteRequest as E, GeneratedCacheConfig as G, InspectFencesRequest as I, ReadRequest as R, WriteRequest as W, InspectFencesResponse as a, ReadResponse as b, WriteResult as c, ReleaseRequest as d, CacheSessionHooks as e, CacheExtensionOptions as f, InvalidationTarget as g, CacheShape as h, CacheTestHooks as i, RelationInfo as j };
|
package/docs/cache-contract.md
CHANGED
|
@@ -45,6 +45,8 @@ request flow. Fail to the database, never to stale cache.
|
|
|
45
45
|
Capacity overflow or reuse of a failed write token keeps the isolate disabled.
|
|
46
46
|
- Generated warmup: authorized generated GETs only; same credentials; bounded seeds and recent exact
|
|
47
47
|
query URLs. Max 24 targets, concurrency 2, deadline 10 s, cooldown 30 s. No recursive warm waves.
|
|
48
|
+
- Host `waitUntil` retains started source cleanup after wave abort or deadline. Release Prisma
|
|
49
|
+
admission before source lifetime ends. Canceled waves cannot promote stale results.
|
|
48
50
|
- No cold-read, write or auth latency guarantee. Sub-200 ms is a measured warm-read acceptance target.
|
|
49
51
|
|
|
50
52
|
## Fences
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/response-warmup.ts"],"names":["job","index","response"],"mappings":"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","file":"chunk-A4WV6RY4.js","sourcesContent":["import { createRegionalCache } from './d1/regional';\n\nexport type ReadResponseWarmupTarget = string | { url: string; scope: string | null };\n\nexport interface ReadResponseWarmupContext { scope: string | null; popularScopes: readonly string[] }\n\nexport interface ReadResponseWarmupOptions {\n scopeHeader: string;\n seeds: readonly ReadResponseWarmupTarget[];\n catalogScope?: 'credential';\n discoveryPriority?: 'next';\n discoverScopeFrom?: string;\n isCurrent?: () => boolean;\n discover?: (url: URL, body: unknown, context: ReadResponseWarmupContext) => { scope?: string; targets: readonly ReadResponseWarmupTarget[] };\n portable?: (url: URL) => boolean;\n maxTargets?: number;\n maxEntries?: number;\n concurrency?: number;\n cooldownMs?: number;\n maxMilliseconds?: number;\n catalogTtlMs?: number;\n}\n\ntype Entry = { url: string; count: number; time: number; scope?: string | null };\ntype WarmJob = { url: string; scope: string | null; override: boolean; priority: number };\nconst catalog = createRegionalCache(86_400_000, 128_000);\nconst validScope = (value: string | null | undefined): value is string => !!value && value.length <= 256 && ![...value].some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127);\n\nexport function createResponseWarmup<Env, Context>(run: (request: Request, env: Env, context: Context) => Promise<Response>, canRun: () => boolean = () => true) {\n let generation = 0;\n const internal = new WeakMap<Request, { generation: number; isCurrent?: () => boolean }>();\n const active = new Map<string, { until: number }>();\n const verified = new WeakSet<Request>();\n let running = 0, waiting = 0;\n const currentValue = (check?: () => boolean) => { try { return check === undefined || check() === true; } catch { return false; } };\n const acquire = async (limit: number, current: number, end: number, check?: () => boolean): Promise<(() => void) | null> => {\n if (waiting >= 256) return null;\n waiting++;\n try {\n while (current === generation && currentValue(check) && Date.now() < end) {\n if (running < limit && canRun()) { running++; return () => { running--; }; }\n await new Promise<void>((resolve) => setTimeout(resolve, Math.min(25, Math.max(0, end - Date.now()))));\n }\n return null;\n } finally { waiting--; }\n };\n const invalidate = () => { generation++; active.clear(); };\n const allowed = (request: Request) => {\n const meta = internal.get(request);\n return !meta || (meta.generation === generation && currentValue(meta.isCurrent) && !request.signal.aborted);\n };\n const isInternal = (request: Request) => internal.has(request);\n const verify = (request: Request) => { if (allowed(request)) verified.add(request); };\n async function start(options: ReadResponseWarmupOptions | undefined, request: Request, response: Response, identity: unknown[], group: string, eligible: (url: URL) => boolean, env: Env, context: Context, freshnessHeader?: string, credentialGroup?: string) {\n try {\n if (!options || isInternal(request)) return;\n const { scopeHeader, seeds, discover, portable, discoverScopeFrom, isCurrent, catalogScope, discoveryPriority } = options;\n if (isCurrent !== undefined && typeof isCurrent !== 'function') return;\n if (!currentValue(isCurrent)) return;\n const maxTargets = options.maxTargets ?? 48, maxEntries = options.maxEntries ?? 32, concurrency = options.concurrency ?? 4;\n const cooldown = options.cooldownMs ?? 30_000, duration = options.maxMilliseconds ?? 25_000, ttl = options.catalogTtlMs ?? 86_400_000;\n if (typeof scopeHeader !== 'string' || !/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(scopeHeader) || !Array.isArray(seeds) || seeds.length > 256 || !seeds.every((v) => typeof v === 'string' || (!!v && typeof v === 'object' && typeof v.url === 'string' && (v.scope === null || validScope(v.scope)))) || (catalogScope !== undefined && catalogScope !== 'credential') || (discoveryPriority !== undefined && discoveryPriority !== 'next') || (catalogScope === 'credential' && !credentialGroup) || (discoverScopeFrom !== undefined && (typeof discoverScopeFrom !== 'string' || typeof discover !== 'function')) || (discover !== undefined && typeof discover !== 'function') || (portable !== undefined && typeof portable !== 'function') || ![maxTargets, maxEntries, concurrency, cooldown, duration, ttl].every(Number.isSafeInteger) || maxTargets < 1 || maxTargets > 256 || maxEntries < 1 || maxEntries > 128 || concurrency < 1 || concurrency > 16 || cooldown < 0 || cooldown > 86_400_000 || duration < 1 || duration > 30_000 || ttl < 1 || ttl > 86_400_000) return;\n const current = generation, end = Date.now() + duration;\n const stillCurrent = () => current === generation && currentValue(isCurrent);\n const prior = active.get(group);\n const cooling = prior !== undefined && prior.until > Date.now();\n const marker = { until: end + cooldown };\n if (!cooling) active.set(group, marker);\n if (active.size > 1024) for (const [key, value] of active) { if (value.until <= Date.now()) active.delete(key); }\n if (active.size > 1024) active.delete(active.keys().next().value ?? '');\n const base = new URL(request.url);\n let scope = request.headers.get(scopeHeader);\n if (!validScope(scope)) scope = null;\n const rootScope = scope;\n const jobKey = (url: string, value: string | null) => JSON.stringify([url, value]);\n const queue: WarmJob[] = [], seen = new Set<string>([jobKey(base.href, scope)]);\n let abandoned = false;\n let completedBootstrap: string | undefined;\n const urlFor = (target: string): URL | null => {\n try {\n const url = new URL(target, base);\n if (url.origin !== base.origin || url.username || url.password || url.hash || url.href.length > 2048 || !eligible(url)) return null;\n return url;\n } catch { return null; }\n };\n const bootstrap = discoverScopeFrom === undefined ? null : urlFor(discoverScopeFrom);\n if (discoverScopeFrom !== undefined && (!bootstrap || !seeds.some((seed) => typeof seed === 'string' && urlFor(seed)?.href === bootstrap.href))) return;\n const enqueue = (target: ReadResponseWarmupTarget, priority = 2) => {\n if (typeof target !== 'string' && (!target || typeof target !== 'object' || typeof target.url !== 'string' || !(target.scope === null || validScope(target.scope)))) return;\n const explicit = typeof target !== 'string';\n const url = urlFor(explicit ? target.url : target);\n const targetScope = explicit ? target.scope : scope;\n const key = url && jobKey(url.href, targetScope);\n if (!url || !key || key === completedBootstrap) return;\n if (seen.has(key)) {\n const existing = queue.findIndex((job) => job.url === url.href && job.scope === targetScope);\n const queued = existing >= 0 ? queue[existing] : undefined;\n if (queued && queued.priority > priority) {\n queue.splice(existing, 1); queued.priority = priority;\n const index = queue.findIndex((item) => item.priority > priority);\n if (index === -1) queue.push(queued); else queue.splice(index, 0, queued);\n }\n return;\n }\n if (seen.size > maxTargets && priority < 2) {\n let index = queue.length - 1;\n while (index >= 0 && queue[index]?.priority !== 2) index--;\n if (index >= 0) { const removed = queue.splice(index, 1)[0]; if (removed) seen.delete(jobKey(removed.url, removed.scope)); }\n }\n if (seen.size > maxTargets) return;\n seen.add(key);\n const job = { url:url.href, scope:targetScope, override:explicit || (!request.headers.has(scopeHeader) && targetScope !== null), priority };\n const index = queue.findIndex((item) => item.priority > priority);\n if (index === -1) queue.push(job); else queue.splice(index, 0, job);\n };\n const keyFor = async (value: string | null) => catalog.regionalKey(ttl, catalogScope === 'credential' ? ['response-warmup-credential-v1', identity, credentialGroup] : ['response-warmup-v1', identity, value]);\n let loadedScope: string | null | undefined;\n const popularScopes: string[] = [];\n const load = async () => {\n if (catalogScope !== 'credential' && !scope) return;\n const lookup = catalogScope === 'credential' ? null : scope;\n if (loadedScope === lookup) return;\n loadedScope = lookup;\n const key = await keyFor(lookup);\n const result = await catalog.regionalRead(key, ttl);\n if (!Array.isArray(result?.value)) return;\n for (const entry of result.value) {\n if (!entry || typeof entry !== 'object' || typeof entry.url !== 'string' || typeof entry.time !== 'number' || Date.now() - entry.time >= ttl) continue;\n if (catalogScope === 'credential') {\n if (entry.scope === null || validScope(entry.scope)) {\n if (validScope(entry.scope) && !popularScopes.includes(entry.scope) && urlFor(entry.url)) popularScopes.push(entry.scope);\n enqueue({ url:entry.url, scope:entry.scope }, 0);\n }\n } else enqueue(entry.url, 0);\n }\n };\n const record = async (url: URL) => {\n const effectiveScope = rootScope ?? scope;\n if ((catalogScope !== 'credential' && !effectiveScope) || !portable?.(url)) return;\n const key = await keyFor(effectiveScope), result = await catalog.regionalRead(key, ttl);\n const entries: Entry[] = Array.isArray(result?.value) ? result.value.filter((v): v is Entry => !!v && typeof v.url === 'string' && typeof v.count === 'number' && Number.isFinite(v.count) && typeof v.time === 'number' && Date.now() - v.time < ttl && !!urlFor(v.url) && (catalogScope !== 'credential' || v.scope === null || validScope(v.scope))).slice(0, maxEntries) : [];\n const existing = entries.find((item) => item.url === url.href && (catalogScope !== 'credential' || item.scope === effectiveScope));\n if (existing) { existing.count = Math.min(existing.count + 1, 1_000_000); existing.time = Date.now(); }\n else entries.push({ url:url.href, count:1, time:Date.now(), ...(catalogScope === 'credential' ? { scope:effectiveScope } : {}) });\n if (catalogScope === 'credential') {\n const totals = new Map<string | null, number>();\n for (const item of entries) totals.set(item.scope ?? null, (totals.get(item.scope ?? null) ?? 0) + item.count);\n entries.sort((a, b) => (totals.get(b.scope ?? null) ?? 0) - (totals.get(a.scope ?? null) ?? 0) || b.count - a.count || b.time - a.time);\n } else entries.sort((a, b) => b.count - a.count || b.time - a.time);\n if (stillCurrent()) await catalog.regionalWrite(key, ttl, Date.now(), entries.slice(0, maxEntries));\n };\n const inspect = async (url: URL, value: Response, deferred?: ReadResponseWarmupTarget[], preload = false) => {\n let body: unknown;\n try {\n if (!discover) return;\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n body = await Promise.race([value.json(), new Promise<never>((_, reject) => { timer = setTimeout(() => reject(Error('warmup deadline')), Math.max(0, end - Date.now())); })]);\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n if (Date.now() >= end || !stillCurrent()) return;\n } catch { return; }\n finally { void value.body?.cancel().catch(() => undefined); }\n if (preload) await load();\n if (!discover || Date.now() >= end || !stillCurrent()) return;\n let found: { scope?: string; targets: readonly ReadResponseWarmupTarget[] };\n try { found = discover(url, body, { scope:rootScope ?? scope, popularScopes:[...popularScopes] }); }\n catch { return; }\n if (!found || !Array.isArray(found.targets)) return;\n if (!request.headers.has(scopeHeader) && !scope && validScope(found.scope)) {\n scope = found.scope;\n if (bootstrap?.href === url.href) completedBootstrap = jobKey(url.href, scope);\n if (!deferred) await load();\n }\n for (const target of found.targets.slice(0, maxTargets)) {\n if (typeof target !== 'string' && (!target || typeof target !== 'object' || typeof target.url !== 'string' || !(target.scope === null || validScope(target.scope)))) continue;\n if (deferred) deferred.push(target);\n else enqueue(target, discoveryPriority === 'next' ? 1 : 2);\n }\n };\n const runOne = async (target: WarmJob) => {\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n if (!stillCurrent() || Date.now() >= end) { abandoned = true; return; }\n let release: (() => void) | null = null;\n while (stillCurrent() && Date.now() < end) {\n release = await acquire(concurrency, current, end, isCurrent);\n if (!release) { abandoned = true; return; }\n if (canRun()) break;\n release(); release = null;\n }\n if (!release) { abandoned = true; return; }\n if (!stillCurrent() || Date.now() >= end) { abandoned = true; release(); return; }\n const releaseSlot = release;\n let controller: AbortController | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let started = false;\n try {\n const headers = new Headers(request.headers);\n for (const name of ['cache-control', 'pragma', 'range', 'if-match', 'if-unmodified-since', 'if-range', 'if-none-match', 'if-modified-since']) headers.delete(name);\n if (freshnessHeader) headers.delete(freshnessHeader);\n if (target.override) { if (target.scope === null) headers.delete(scopeHeader); else headers.set(scopeHeader, target.scope); }\n controller = new AbortController();\n const abort = controller;\n const watch = () => {\n if (!stillCurrent() || Date.now() >= end) { abort.abort(); return; }\n timer = setTimeout(watch, Math.min(25, Math.max(0, end - Date.now())));\n };\n timer = setTimeout(watch, Math.min(25, Math.max(0, end - Date.now())));\n const warm = new Request(target.url, { method:'GET', headers, redirect:'manual', signal:abort.signal });\n internal.set(warm, { generation:current, isCurrent });\n const task = Promise.resolve().then(() => run(warm, env, context));\n started = true;\n void task.then((response) => { if (abort.signal.aborted) void response.body?.cancel().catch(() => undefined); releaseSlot(); }, () => { releaseSlot(); });\n const result = await Promise.race([task, new Promise<never>((_, reject) => abort.signal.addEventListener('abort', () => reject(Error('warmup deadline')), { once:true }))]);\n if (verified.has(warm) && result.status === 200 && stillCurrent() && Date.now() < end) await inspect(new URL(target.url), result);\n void result.body?.cancel().catch(() => undefined);\n } catch { /* Background warming is best effort. */ }\n finally {\n if (controller?.signal.aborted) abandoned = true;\n if (timer !== undefined) clearTimeout(timer);\n if (!started) releaseSlot();\n }\n };\n try {\n if (cooling) { void response.body?.cancel().catch(() => undefined); await record(base); return; }\n const unscopedSeeds = () => {\n for (const seed of seeds) if (typeof seed !== 'string' && seed.scope === null) enqueue(seed, -1);\n };\n if (!bootstrap || scope) unscopedSeeds();\n const discovered: ReadResponseWarmupTarget[] = [];\n await inspect(base, response, discovered, catalogScope === 'credential' && !bootstrap);\n if (bootstrap && !scope) {\n enqueue(bootstrap.href);\n const index = queue.findIndex((job) => job.url === bootstrap.href && job.scope === scope);\n const job = index === -1 ? undefined : queue.splice(index, 1)[0];\n if (job && stillCurrent() && Date.now() < end) await runOne(job);\n if (!scope || !stillCurrent() || Date.now() >= end) return;\n }\n unscopedSeeds();\n await load();\n if (discoveryPriority === 'next') for (const target of discovered) enqueue(target, 1);\n for (const seed of seeds) if (typeof seed === 'string' || seed.scope !== null) enqueue(seed);\n if (discoveryPriority !== 'next') for (const target of discovered) enqueue(target);\n await record(base);\n const worker = async () => {\n while (queue.length && stillCurrent() && Date.now() < end) {\n const target = queue.shift(); if (!target) return;\n await runOne(target);\n }\n };\n await Promise.all(Array.from({ length:concurrency }, worker));\n } catch { /* Background warming is best effort. */ }\n finally {\n if (!cooling && (abandoned || queue.length > 0) && active.get(group) === marker) active.delete(group);\n }\n } finally { void response.body?.cancel().catch(() => undefined); }\n }\n return { start, invalidate, allowed, isInternal, verify, snapshot:() => generation, current:(value: number) => value === generation };\n}\n"]}
|
package/dist/chunk-D2EESWMC.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
// src/d1/request-freshness.ts
|
|
2
|
-
var validFreshnessHeader = (name) => /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(name);
|
|
3
|
-
var hasFreshnessCookie = (request, name) => (request.headers.get("cookie") ?? "").split(";").some((part) => part.split("=", 1)[0]?.trim() === name);
|
|
4
|
-
var hasFreshnessGeneration = (request, name) => {
|
|
5
|
-
const matches = (request.headers.get("cookie") ?? "").split(";").map((part) => part.trim()).filter((part) => part.split("=", 1)[0]?.trim() === name);
|
|
6
|
-
const value = matches[0]?.slice(matches[0].indexOf("=") + 1).trim() ?? "";
|
|
7
|
-
return matches.length === 1 && /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);
|
|
8
|
-
};
|
|
9
|
-
var hasCacheBypass = (request) => (request.headers.get("cache-control") ?? "").split(",").some((part) => /^\s*(?:no-cache|no-store)(?:\s*=|\s*$)/i.test(part));
|
|
10
|
-
function regionalD1MetadataTtl(request, policy) {
|
|
11
|
-
if (request.method !== "GET" || hasFreshnessCookie(request, policy.freshnessCookie)) return 0;
|
|
12
|
-
if (policy.freshnessHeader !== void 0 && (!validFreshnessHeader(policy.freshnessHeader) || request.headers.has(policy.freshnessHeader))) return 0;
|
|
13
|
-
if (!policy.ignoreRequestCacheControl && hasCacheBypass(request)) return 0;
|
|
14
|
-
return 5e3;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export { hasCacheBypass, hasFreshnessCookie, hasFreshnessGeneration, regionalD1MetadataTtl, validFreshnessHeader };
|
|
18
|
-
//# sourceMappingURL=chunk-D2EESWMC.js.map
|
|
19
|
-
//# sourceMappingURL=chunk-D2EESWMC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/d1/request-freshness.ts"],"names":[],"mappings":";AAGO,IAAM,oBAAA,GAAuB,CAAC,IAAA,KAA0B,+BAAA,CAAgC,KAAK,IAAI;AACjG,IAAM,kBAAA,GAAqB,CAAC,OAAA,EAAkB,IAAA,KAAA,CAA2B,OAAA,CAAQ,QAAQ,GAAA,CAAI,QAAQ,CAAA,IAAK,EAAA,EAAI,KAAA,CAAM,GAAG,EAAE,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK,KAAM,IAAI;AAC9K,IAAM,sBAAA,GAAyB,CAAC,OAAA,EAAkB,IAAA,KAA0B;AACjF,EAAA,MAAM,OAAA,GAAA,CAAW,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,IAAK,EAAA,EAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,OAAW,IAAI,CAAA;AACnJ,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,MAAM,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,CAAA,CAAE,MAAK,IAAK,EAAA;AACvE,EAAA,OAAO,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,wEAAA,CAAyE,KAAK,KAAK,CAAA;AACpH;AACO,IAAM,iBAAiB,CAAC,OAAA,KAAA,CAA+B,QAAQ,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA,IAAK,EAAA,EAAI,KAAA,CAAM,GAAG,EAAE,IAAA,CAAK,CAAC,SAAS,yCAAA,CAA0C,IAAA,CAAK,IAAI,CAAC;AAEjL,SAAS,qBAAA,CAAsB,SAAkB,MAAA,EAAmC;AACzF,EAAA,IAAI,OAAA,CAAQ,WAAW,KAAA,IAAS,kBAAA,CAAmB,SAAS,MAAA,CAAO,eAAe,GAAG,OAAO,CAAA;AAC5F,EAAA,IAAI,MAAA,CAAO,eAAA,KAAoB,MAAA,KAAc,CAAC,qBAAqB,MAAA,CAAO,eAAe,CAAA,IAAK,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,eAAe,IAAI,OAAO,CAAA;AACnJ,EAAA,IAAI,CAAC,MAAA,CAAO,yBAAA,IAA6B,cAAA,CAAe,OAAO,GAAG,OAAO,CAAA;AACzE,EAAA,OAAO,GAAA;AACT","file":"chunk-D2EESWMC.js","sourcesContent":["import type { D1CacheProfile } from './profile';\n\ntype FreshnessPolicy = Pick<NonNullable<D1CacheProfile['readResponseLease']>, 'freshnessCookie' | 'freshnessHeader' | 'ignoreRequestCacheControl'>;\nexport const validFreshnessHeader = (name: string): boolean => /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(name);\nexport const hasFreshnessCookie = (request: Request, name: string): boolean => (request.headers.get('cookie') ?? '').split(';').some((part) => part.split('=', 1)[0]?.trim() === name);\nexport const hasFreshnessGeneration = (request: Request, name: string): boolean => {\n const matches = (request.headers.get('cookie') ?? '').split(';').map((part) => part.trim()).filter((part) => part.split('=', 1)[0]?.trim() === name);\n const value = matches[0]?.slice(matches[0].indexOf('=') + 1).trim() ?? '';\n return matches.length === 1 && /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n};\nexport const hasCacheBypass = (request: Request): boolean => (request.headers.get('cache-control') ?? '').split(',').some((part) => /^\\s*(?:no-cache|no-store)(?:\\s*=|\\s*$)/i.test(part));\n\nexport function regionalD1MetadataTtl(request: Request, policy: FreshnessPolicy): 0 | 5000 {\n if (request.method !== 'GET' || hasFreshnessCookie(request, policy.freshnessCookie)) return 0;\n if (policy.freshnessHeader !== undefined && (!validFreshnessHeader(policy.freshnessHeader) || request.headers.has(policy.freshnessHeader))) return 0;\n if (!policy.ignoreRequestCacheControl && hasCacheBypass(request)) return 0;\n return 5000;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/response-lease.ts"],"names":["response","lease","source"],"mappings":"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","file":"chunk-HGAUU4EU.js","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { createResponseWarmup, type ReadResponseWarmupOptions } from './response-warmup';\nexport type { ReadResponseWarmupOptions, ReadResponseWarmupTarget, ReadResponseWarmupContext } from './response-warmup';\nimport { registerRegionalDeadlineReporter } from './d1/regional-deadline';\nimport type { D1CacheProfile } from './d1/profile';\nimport { MAX_RESPONSE_LEASE_BYTES, responseLeaseKey } from './d1/regional';\nimport { isMutation, matchesPath, needsFreshness } from './d1/read-freshness-policy';\nimport { hasCacheBypass, hasFreshnessCookie, hasFreshnessGeneration, validFreshnessHeader } from './d1/request-freshness';\n\ninterface LeaseScope { deadline?: number; dataDeadline?: number }\nconst scope = new AsyncLocalStorage<LeaseScope>();\nexport function limitReadResponseDataUntil(deadline: number): void { const current = scope.getStore(); if (current) current.dataDeadline = Math.min(current.dataDeadline ?? Infinity, deadline); }\nregisterRegionalDeadlineReporter(limitReadResponseDataUntil);\n\nexport function limitReadResponseLeaseUntil(deadline: number | undefined): void {\n const current = scope.getStore();\n if (!current) return;\n if (deadline === undefined || !Number.isFinite(deadline)) { current.deadline = 0; return; }\n current.deadline = Math.min(current.deadline ?? Infinity, deadline);\n}\n\nconst noCache = (request: Request): Request => {\n const headers = new Headers(request.headers);\n headers.set('cache-control', 'no-cache');\n return new Request(request, { headers });\n};\nconst bypass = (request: Request, ignoreCacheControl: boolean): boolean => request.body !== null || ['range','if-match','if-unmodified-since','if-range'].some((name) => request.headers.has(name)) || (!ignoreCacheControl && hasCacheBypass(request));\n\nfunction entityTags(value: string): string[] | null {\n const tags: string[] = [];\n let index = 0;\n const whitespace = () => { while (value[index] === ' ' || value[index] === '\\t') index++; };\n whitespace();\n while (index < value.length) {\n if (value.slice(index, index + 2) === 'W/') index += 2;\n if (value[index++] !== '\"') return null;\n const start = index;\n while (index < value.length && value[index] !== '\"') {\n const code = value.charCodeAt(index++);\n if (code < 33 || code === 127 || code > 255) return null;\n }\n if (value[index] !== '\"') return null;\n tags.push(value.slice(start, index++));\n whitespace();\n if (index === value.length) break;\n if (value[index++] !== ',') return null;\n whitespace();\n if (index === value.length) return null;\n }\n return tags.length ? tags : null;\n}\n\nfunction httpDate(value: string | null): number {\n if (!value || !/^(?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), \\d{2} (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \\d{4} \\d{2}:\\d{2}:\\d{2} GMT|(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), \\d{2}-(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\\d{2} \\d{2}:\\d{2}:\\d{2} GMT|(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [ \\d]\\d \\d{2}:\\d{2}:\\d{2} \\d{4})$/.test(value)) return NaN;\n const time = Date.parse(value.endsWith(' GMT') ? value : `${value} GMT`);\n if (!Number.isFinite(time)) return NaN;\n const date = new Date(time);\n const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const day = days[date.getUTCDay()];\n const month = months[date.getUTCMonth()];\n const number = String(date.getUTCDate()).padStart(2, '0');\n const clock = date.toUTCString().slice(17, 25);\n const rfc850 = `${day}, ${number}-${month}-${String(date.getUTCFullYear() % 100).padStart(2, '0')} ${clock} GMT`;\n const asctime = `${day?.slice(0, 3)} ${month} ${String(date.getUTCDate()).padStart(2, ' ')} ${clock} ${date.getUTCFullYear()}`;\n return value === date.toUTCString() || value === rfc850 || value === asctime ? time : NaN;\n}\n\nfunction conditionalHit(request: Request, response: Response): Response {\n const condition = request.headers.get('if-none-match');\n let matches = false;\n if (condition !== null) {\n if (condition.trim() === '*') matches = true;\n else {\n const requested = entityTags(condition);\n const current = entityTags(response.headers.get('etag') ?? '');\n matches = !!requested && !!current && current.length === 1 && requested.includes(current[0] ?? '');\n }\n } else {\n const modified = httpDate(response.headers.get('last-modified'));\n const since = httpDate(request.headers.get('if-modified-since'));\n matches = Number.isFinite(modified) && Number.isFinite(since) && modified <= since;\n }\n if (!matches) return response;\n const headers = new Headers(response.headers);\n headers.delete('content-length');\n void response.body?.cancel().catch(() => undefined);\n return new Response(null, { status:304, headers });\n}\n\nfunction selectedCookies(header: string | null, names: readonly string[]): string | null {\n const selected = (header ?? '').split(';').map((part) => part.trimStart()).filter((part) => {\n const separator = part.indexOf('=');\n return separator > 0 && names.includes(part.slice(0, separator).trim());\n });\n return selected.length ? selected.join(';') : null;\n}\n\nfunction withoutCookie(header: string | null, name: string): string | null {\n if (!header) return null;\n const value = header.split(';').filter((part) => {\n const separator = part.indexOf('=');\n return separator < 0 || part.slice(0, separator).trim() !== name;\n }).join(';').trim();\n return value || null;\n}\n\nconst metadataHeader = 'x-dee-wan-lease-meta';\n\nasync function readLease(key: string, ttl: number, permittedVary: Set<string>): Promise<{ response: Response; expires: number } | null> {\n let cached: Response | undefined;\n let transferred = false;\n try {\n cached = await caches.default.match(key);\n if (!cached || cached.status !== 200 || !eligibleHeaders(cached.headers, permittedVary)) return null;\n const metadata = cached.headers.get(metadataHeader);\n if (!metadata) return null;\n const parsed: unknown = JSON.parse(metadata);\n if (!Array.isArray(parsed) || parsed.length !== 3) return null;\n const [started, expires, control] = parsed;\n const now = Date.now();\n if (!Number.isSafeInteger(started) || !Number.isSafeInteger(expires) || started > now || expires <= now || expires > started + ttl || (control !== null && typeof control !== 'string')) return null;\n const headers = new Headers(cached.headers);\n headers.delete(metadataHeader);\n if (control === null) headers.delete('cache-control');\n else headers.set('cache-control', control);\n const response = new Response(cached.body, { status:cached.status, statusText:cached.statusText, headers });\n transferred = true;\n return { response, expires };\n } catch { return null; }\n finally { if (cached && !transferred) void cached.body?.cancel().catch(() => undefined); }\n}\n\nfunction eligibleHeaders(headers: Headers, permittedVary: Set<string>): boolean {\n if (headers.has('set-cookie') || headers.has('content-encoding') || headers.has('content-disposition') || !/^application\\/(?:[a-z0-9.+-]*\\+)?json(?:\\s*;|$)/i.test(headers.get('content-type') ?? '')) return false;\n const vary = headers.get('vary');\n return !vary || vary.split(',').every((name) => permittedVary.has(name.trim().toLowerCase()));\n}\n\nasync function responseEntry(response: Response, permittedVary: Set<string>): Promise<Uint8Array | null> {\n if (response.status !== 200 || response.headers.has(metadataHeader) || !eligibleHeaders(response.headers, permittedVary)) return null;\n const reader = response.clone().body?.getReader();\n if (!reader) return null;\n const chunks: Uint8Array[] = [];\n let size = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const timeout = new Promise<never>((_, reject) => { timer = setTimeout(() => reject(Error('body timeout')), 5000); });\n for (;;) {\n const part = await Promise.race([reader.read(), timeout]);\n if (part.done) break;\n size += part.value.byteLength;\n if (size > MAX_RESPONSE_LEASE_BYTES) return null;\n chunks.push(part.value);\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) { bytes.set(chunk, offset); offset += chunk.byteLength; }\n const body = new TextDecoder('utf-8', { fatal:true, ignoreBOM:false }).decode(bytes);\n JSON.parse(body);\n const length = response.headers.get('content-length');\n if (length !== null && (!/^(?:0|[1-9]\\d*)$/.test(length) || Number(length) !== size)) return null;\n return bytes;\n } catch { return null; }\n finally { if (timer !== undefined) clearTimeout(timer); void reader.cancel().catch(() => undefined); }\n}\n\nexport type ReadResponseLeasePolicy = Omit<NonNullable<D1CacheProfile['readResponseLease']>, 'databaseBinding' | 'deploymentEnv'>;\nexport interface ReadResponseLeaseOptions extends ReadResponseLeasePolicy {\n namespace: string;\n deployment: string;\n database: string;\n seconds: number;\n warmup?: ReadResponseWarmupOptions;\n}\ntype LeaseConfig = (NonNullable<D1CacheProfile['readResponseLease']> | ReadResponseLeaseOptions) & { warmup?: ReadResponseWarmupOptions };\ninterface ResolvedLease { config: LeaseConfig; seconds: number; identity: () => unknown[] | null }\nexport function createReadResponseLease<Env, Context>(handler: (request: Request, env: Env, context: Context) => Promise<Response>, resolve: (env: Env) => ResolvedLease | null): (request: Request, env: Env, context: Context) => Promise<Response> {\n const pending = new Map<string, { valid: boolean; task: Promise<void> }>();\n let foreground = 0;\n const warming = createResponseWarmup<Env, Context>((request, env, context) => wrapped(request, env, context), () => foreground === 0);\n const wrapped = async (request: Request, env: Env, context: Context): Promise<Response> => {\n const requestStarted = Date.now();\n const requestGeneration = warming.snapshot();\n const serve = async (input: Request): Promise<Response> => {\n if (input.method !== 'GET' || warming.isInternal(request)) return handler(input, env, context);\n foreground++;\n try { return await handler(input, env, context); }\n finally { foreground--; }\n };\n const resolved = resolve(env);\n if (!resolved) return serve(request);\n const { config, seconds } = resolved;\n const maxSeconds = config.maxSeconds ?? 5;\n const refreshAhead = config.refreshAheadSeconds ?? 0;\n if (!Number.isInteger(refreshAhead) || refreshAhead < 0 || refreshAhead > maxSeconds || !Number.isInteger(maxSeconds) || maxSeconds < 1 || maxSeconds > 300 || !Number.isInteger(seconds) || seconds <= 0 || seconds > maxSeconds || !/^[A-Za-z0-9_-]+$/.test(config.freshnessCookie)) return serve(request);\n if (config.cookieNames !== undefined && (!Array.isArray(config.cookieNames) || config.cookieNames.length === 0 || !config.cookieNames.every((name) => typeof name === 'string' && /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(name)) || new Set(config.cookieNames).size !== config.cookieNames.length || !config.credentialHeaders.some((name) => name.toLowerCase() === 'cookie') || (config.freshnessCookieMode === 'generation' && !config.cookieNames.includes(config.freshnessCookie)))) return serve(request);\n const generationMode = config.freshnessCookieMode === 'generation' && config.credentialHeaders.some((name) => name.toLowerCase() === 'cookie');\n if (isMutation(request.method)) {\n const response = await handler(request, env, context);\n if (response.status < 200 || response.status >= 300 || !needsFreshness(request.method, new URL(request.url).pathname, config.freshnessCookieExcludedPaths)) return response;\n warming.invalidate();\n const headers = new Headers(response.headers);\n headers.append('set-cookie', `${config.freshnessCookie}=${generationMode ? crypto.randomUUID() : '1'}; Max-Age=${maxSeconds}; Path=/; HttpOnly; SameSite=Lax${new URL(request.url).protocol === 'https:' ? '; Secure' : ''}`);\n return new Response(response.body, { status:response.status, statusText:response.statusText, headers });\n }\n if (request.method !== 'GET') return serve(request);\n if (hasFreshnessCookie(request, config.freshnessCookie) && (!generationMode || !hasFreshnessGeneration(request, config.freshnessCookie))) return serve(noCache(request));\n if (config.freshnessHeader !== undefined && !validFreshnessHeader(config.freshnessHeader)) return serve(noCache(request));\n const forceSource = config.freshnessHeader !== undefined && request.headers.has(config.freshnessHeader);\n const url = new URL(request.url);\n const headerValue = (name: string): string | null => name.toLowerCase() === 'cookie' && config.cookieNames !== undefined ? selectedCookies(request.headers.get('cookie'), config.cookieNames) : request.headers.get(name);\n const hasCredential = (name: string): boolean => {\n const value = headerValue(name);\n if (name.toLowerCase() !== 'cookie' || config.cookieNames === undefined) return !!value?.trim();\n return (value ?? '').split(';').some((pair) => { const separator = pair.indexOf('='); return separator > 0 && pair.slice(0, separator).trim() !== config.freshnessCookie && !!pair.slice(separator + 1).trim(); });\n };\n if (bypass(request, config.ignoreRequestCacheControl === true) || !matchesPath(url.pathname, config.paths) || config.bypassQueryParams?.some((name) => url.searchParams.has(name)) || !config.credentialHeaders.some(hasCredential)) return serve(forceSource ? noCache(request) : request);\n const identity = resolved.identity();\n if (!identity) return serve(noCache(request));\n const names = [...new Set([...config.credentialHeaders, ...config.varyHeaders].map((name) => name.toLowerCase()))].sort();\n const permittedVary = new Set(names);\n const ttl = seconds * 1000;\n const key = await responseLeaseKey(ttl, [identity[0], request.method, request.url, ...identity.slice(1), names.map((name) => [name, headerValue(name)])]);\n if (!key) return serve(noCache(request));\n const cached = forceSource ? null : await readLease(key, ttl, permittedVary);\n const warmOptions = config.warmup;\n const warmGroup = warmOptions && typeof warmOptions.scopeHeader === 'string' && /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(warmOptions.scopeHeader) && config.varyHeaders.some((name) => name.toLowerCase() === warmOptions.scopeHeader.toLowerCase()) ? await responseLeaseKey(ttl, ['response-warmup-group', identity, names.map((name) => [name, headerValue(name)]), request.headers.get(warmOptions.scopeHeader)]) : null;\n const credentialGroup = warmOptions?.catalogScope === 'credential' && warmGroup && !config.credentialHeaders.some((name) => name.toLowerCase() === warmOptions.scopeHeader.toLowerCase()) ? await responseLeaseKey(ttl, ['response-warmup-credential-group', identity, names.filter((name) => name !== warmOptions.scopeHeader.toLowerCase()).map((name) => [name, name === 'cookie' ? withoutCookie(headerValue(name), config.freshnessCookie) : headerValue(name)])]) : null;\n const eligible = (target: URL) => matchesPath(target.pathname, config.paths) && !config.bypassQueryParams?.some((name) => target.searchParams.has(name));\n const scheduleWarm = (response: Response) => {\n let transferred = false;\n try {\n if (!warmOptions || !warmGroup || warming.isInternal(request) || !warming.current(requestGeneration)) return;\n const wait: unknown = context && typeof context === 'object' ? Reflect.get(context, 'waitUntil') : undefined;\n if (typeof wait !== 'function') return;\n const task = warming.start(warmOptions, request, response, identity, warmGroup, eligible, env, context, config.freshnessHeader, credentialGroup ?? undefined);\n transferred = true;\n Reflect.apply(wait, context, [task]);\n } catch { /* Warming is optional. */ }\n finally { if (!transferred) void response.body?.cancel().catch(() => undefined); }\n };\n const fillResponse = async (response: Response, lease: LeaseScope, started: number, allowed: () => boolean, beforePut?: Promise<void>) => {\n if (lease.deadline === undefined || !Number.isFinite(lease.deadline)) return;\n let warmResponse: Response | undefined;\n if (warmOptions && warmGroup && !warming.isInternal(request) && typeof waitUntil === 'function') {\n try { warmResponse = response.clone(); } catch { /* Warming is optional. */ }\n }\n const expires = Math.floor(Math.min(started + ttl, lease.deadline, lease.dataDeadline ?? Infinity));\n try {\n const entry = await responseEntry(response, permittedVary);\n if (entry && beforePut) await beforePut;\n if (entry && Number.isSafeInteger(expires) && expires > Date.now() && allowed() && warming.current(requestGeneration) && warming.allowed(request)) {\n warming.verify(request);\n if (warmResponse) { const owned = warmResponse; warmResponse = undefined; scheduleWarm(owned); }\n const headers = new Headers(response.headers);\n headers.set(metadataHeader, JSON.stringify([Math.floor(started), expires, headers.get('cache-control')]));\n headers.set('cache-control', 'public, max-age=300');\n await caches.default.put(key, new Response(entry, { status:response.status, statusText:response.statusText, headers }));\n }\n } catch { /* Cache filling must not affect the source response. */ }\n finally { if (warmResponse) void warmResponse.body?.cancel().catch(() => undefined); }\n };\n const waitUntil: unknown = context && typeof context === 'object' ? Reflect.get(context, 'waitUntil') : undefined;\n if (cached) {\n warming.verify(request);\n if (warmOptions && warmGroup && !warming.isInternal(request) && typeof waitUntil === 'function') {\n try { scheduleWarm(cached.response.clone()); } catch { /* Warming is optional. */ }\n }\n if (refreshAhead > 0 && refreshAhead <= seconds && cached.expires - Date.now() <= refreshAhead * 1000 && typeof waitUntil === 'function' && !pending.has(key)) {\n const refresh = { valid:true, task:Promise.resolve() };\n let accepted = false;\n refresh.task = Promise.resolve().then(async () => {\n if (!accepted) return;\n const started = Date.now();\n const headers = new Headers(request.headers);\n for (const name of ['range', 'if-match', 'if-unmodified-since', 'if-range', 'if-none-match', 'if-modified-since']) headers.delete(name);\n headers.set('cache-control', 'no-cache');\n if (config.freshnessHeader !== undefined) headers.set(config.freshnessHeader, '1');\n const source = new Request(request.url, { method:'GET', headers, signal:new AbortController().signal });\n const lease: LeaseScope = {};\n try {\n const response = await scope.run(lease, () => handler(source, env, context));\n try { await fillResponse(response, lease, started, () => refresh.valid); }\n finally { void response.body?.cancel().catch(() => undefined); }\n } catch { /* Refresh failures leave the old lease untouched. */ }\n }).finally(() => { if (pending.get(key) === refresh) pending.delete(key); });\n pending.set(key, refresh);\n try { Reflect.apply(waitUntil, context, [refresh.task]); accepted = true; } catch { pending.delete(key); }\n }\n return conditionalHit(request, cached.response);\n }\n const priorRefresh = pending.get(key);\n if (priorRefresh) priorRefresh.valid = false;\n const lease: LeaseScope = {};\n const source = noCache(request);\n if (config.freshnessHeader !== undefined) source.headers.set(config.freshnessHeader, '1');\n const response = await scope.run(lease, () => serve(source));\n const fill = fillResponse(response, lease, requestStarted, () => true, priorRefresh?.task);\n try {\n if (!warming.isInternal(request) && typeof waitUntil === 'function') { Reflect.apply(waitUntil, context, [fill]); return response; }\n } catch { /* Await the fill if the request context is unavailable. */ }\n await fill;\n return response;\n };\n return wrapped;\n}\n\nexport function wrapReadResponseLease<Env, Context>(handler: (request: Request, env: Env, context: Context) => Promise<Response>, options: ReadResponseLeaseOptions): (request: Request, env: Env, context: Context) => Promise<Response> {\n return createReadResponseLease(handler, () => {\n if (![options.namespace, options.deployment, options.database].every((value) => typeof value === 'string' && value.trim().length > 0)) return null;\n const identity = { ...options };\n delete identity.warmup;\n return { config: options, seconds: options.seconds, identity: () => ['response-lease-v1', identity] };\n });\n}\n\nconst proofHeader = 'x-dee-wan-read-lease-deadline';\n\nfunction withoutProof(request: Request): Request {\n if (!request.headers.has(proofHeader)) return request;\n const headers = new Headers(request.headers);\n headers.delete(proofHeader);\n return new Request(request, { headers });\n}\n\nfunction responseWithProof(response: Response, deadline?: number): Response {\n if (!response.headers.has(proofHeader) && deadline === undefined) return response;\n const headers = new Headers(response.headers);\n headers.delete(proofHeader);\n if (deadline !== undefined) headers.set(proofHeader, String(Math.floor(deadline)));\n return new Response(response.body, { status:response.status, statusText:response.statusText, headers, ...(response.webSocket ? { webSocket:response.webSocket } : {}) });\n}\n\nexport function wrapReadResponseLeaseOrigin<Env, Context>(handler: (request: Request, env: Env, context: Context) => Promise<Response>): (request: Request, env: Env, context: Context) => Promise<Response> {\n return async (request, env, context) => {\n const lease: LeaseScope = {};\n const response = await scope.run(lease, () => handler(withoutProof(request), env, context));\n const deadline = lease.deadline;\n const type = response.headers.get('content-type') ?? '';\n if (request.method !== 'GET' || response.status !== 200 || response.headers.has('set-cookie') || !/^application\\/(?:[a-z0-9.+-]*\\+)?json(?:\\s*;|$)/i.test(type) || deadline === undefined || !Number.isFinite(deadline) || deadline <= Date.now()) return responseWithProof(response);\n return responseWithProof(response, Math.min(deadline, lease.dataDeadline ?? Infinity));\n };\n}\n\nexport async function forwardReadLease(request: Request, service: { fetch(request: Request): Promise<Response> }): Promise<Response> {\n let forwarded = withoutProof(request);\n if (request.method === 'GET') {\n const headers = new Headers(forwarded.headers);\n headers.set('accept-encoding', 'identity');\n forwarded = new Request(forwarded, { headers });\n }\n const response = await service.fetch(forwarded);\n const raw = response.headers.get(proofHeader);\n if (raw && /^\\d+$/.test(raw)) {\n const deadline = Number(raw);\n if (Number.isSafeInteger(deadline) && deadline > Date.now()) limitReadResponseLeaseUntil(deadline);\n }\n return responseWithProof(response);\n}\n"]}
|