@dee-wan/cache 1.0.1 → 1.1.0
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 +177 -2
- package/dist/chunk-A4WV6RY4.js +311 -0
- package/dist/chunk-A4WV6RY4.js.map +1 -0
- package/dist/chunk-AENVFT2S.js +6 -0
- package/dist/chunk-AENVFT2S.js.map +1 -0
- package/dist/chunk-D2EESWMC.js +19 -0
- package/dist/chunk-D2EESWMC.js.map +1 -0
- package/dist/chunk-E6OZZ5UX.js +133 -0
- package/dist/chunk-E6OZZ5UX.js.map +1 -0
- package/dist/chunk-HGAUU4EU.js +388 -0
- package/dist/chunk-HGAUU4EU.js.map +1 -0
- package/dist/chunk-JPK2AF7X.js +18 -0
- package/dist/chunk-JPK2AF7X.js.map +1 -0
- package/dist/chunk-LHOK33GI.js +12 -0
- package/dist/chunk-LHOK33GI.js.map +1 -0
- package/dist/chunk-MOJBHU3S.js +431 -0
- package/dist/chunk-MOJBHU3S.js.map +1 -0
- package/dist/chunk-OOPPXK7Q.js +133 -0
- package/dist/chunk-OOPPXK7Q.js.map +1 -0
- package/dist/chunk-ZCMZJKGN.js +78 -0
- package/dist/chunk-ZCMZJKGN.js.map +1 -0
- package/dist/chunk-ZREX7LLC.js +545 -0
- package/dist/chunk-ZREX7LLC.js.map +1 -0
- package/dist/client.d.ts +50 -0
- package/dist/client.js +224 -0
- package/dist/client.js.map +1 -0
- package/dist/cloudflare/index.d.ts +15 -2
- package/dist/cloudflare/index.js +413 -45
- package/dist/cloudflare/index.js.map +1 -1
- package/dist/d1/config.d.ts +41 -0
- package/dist/d1/config.js +102 -0
- package/dist/d1/config.js.map +1 -0
- package/dist/d1/index.d.ts +64 -0
- package/dist/d1/index.js +196 -0
- package/dist/d1/index.js.map +1 -0
- package/dist/d1/response-lease.d.ts +9 -0
- package/dist/d1/response-lease.js +42 -0
- package/dist/d1/response-lease.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -616
- package/dist/index.js.map +1 -1
- package/dist/profile--LBtbQI_.d.ts +30 -0
- package/dist/response-lease-DeeM-ofO.d.ts +19 -0
- package/dist/response-lease.d.ts +7 -0
- package/dist/response-lease.js +9 -0
- package/dist/response-lease.js.map +1 -0
- package/dist/response-warmup-BWQvnT1G.d.ts +38 -0
- package/dist/scoped-read.d.ts +12 -0
- package/dist/scoped-read.js +30 -0
- package/dist/scoped-read.js.map +1 -0
- package/dist/{types-DwtU0KpX.d.ts → types-D-Gd11to.d.ts} +13 -1
- package/docs/cache-contract.md +49 -1
- package/package.json +31 -2
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// src/d1/read-freshness-policy.ts
|
|
2
|
+
var isMutation = (method) => !["GET", "HEAD", "OPTIONS"].includes(method.toUpperCase());
|
|
3
|
+
function matchesPath(pathname, patterns) {
|
|
4
|
+
const actual = pathname.split("/");
|
|
5
|
+
return patterns.some((pattern) => {
|
|
6
|
+
const parts = pattern.split("/");
|
|
7
|
+
const recursive = parts.at(-1) === "**";
|
|
8
|
+
if (recursive) parts.pop();
|
|
9
|
+
return (recursive ? actual.length > parts.length : parts.length === actual.length) && parts.every((part, index) => part === "*" ? !!actual[index] : !part.includes("*") && part === actual[index]);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function needsFreshness(method, pathname, excludedPaths = []) {
|
|
13
|
+
return isMutation(method) && !matchesPath(pathname, excludedPaths);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { isMutation, matchesPath, needsFreshness };
|
|
17
|
+
//# sourceMappingURL=chunk-JPK2AF7X.js.map
|
|
18
|
+
//# sourceMappingURL=chunk-JPK2AF7X.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/d1/read-freshness-policy.ts"],"names":[],"mappings":";AAAO,IAAM,UAAA,GAAa,CAAC,MAAA,KAA4B,CAAC,CAAC,KAAA,EAAO,MAAA,EAAQ,SAAS,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,WAAA,EAAa;AAEzG,SAAS,WAAA,CAAY,UAAkB,QAAA,EAAsC;AAClF,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AACjC,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY;AAChC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA,KAAM,IAAA;AACnC,IAAA,IAAI,SAAA,QAAiB,GAAA,EAAI;AACzB,IAAA,OAAA,CAAQ,SAAA,GAAY,MAAA,CAAO,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA,KAAW,MAAA,CAAO,MAAA,KAAW,KAAA,CAAM,KAAA,CAAM,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,KAAS,GAAA,GAAM,CAAC,CAAC,MAAA,CAAO,KAAK,CAAA,GAAI,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,IAAA,KAAS,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACnM,CAAC,CAAA;AACH;AAEO,SAAS,cAAA,CAAe,MAAA,EAAgB,QAAA,EAAkB,aAAA,GAAmC,EAAC,EAAY;AAC/G,EAAA,OAAO,WAAW,MAAM,CAAA,IAAK,CAAC,WAAA,CAAY,UAAU,aAAa,CAAA;AACnE","file":"chunk-JPK2AF7X.js","sourcesContent":["export const isMutation = (method: string): boolean => !['GET', 'HEAD', 'OPTIONS'].includes(method.toUpperCase());\n\nexport function matchesPath(pathname: string, patterns: readonly string[]): boolean {\n const actual = pathname.split('/');\n return patterns.some((pattern) => {\n const parts = pattern.split('/');\n const recursive = parts.at(-1) === '**';\n if (recursive) parts.pop();\n return (recursive ? actual.length > parts.length : parts.length === actual.length) && parts.every((part, index) => part === '*' ? !!actual[index] : !part.includes('*') && part === actual[index]);\n });\n}\n\nexport function needsFreshness(method: string, pathname: string, excludedPaths: readonly string[] = []): boolean {\n return isMutation(method) && !matchesPath(pathname, excludedPaths);\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// src/d1/regional-deadline.ts
|
|
2
|
+
var reportDeadline;
|
|
3
|
+
function registerRegionalDeadlineReporter(report) {
|
|
4
|
+
reportDeadline = report;
|
|
5
|
+
}
|
|
6
|
+
function limitRegionalDataUntil(deadline) {
|
|
7
|
+
reportDeadline?.(deadline);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export { limitRegionalDataUntil, registerRegionalDeadlineReporter };
|
|
11
|
+
//# sourceMappingURL=chunk-LHOK33GI.js.map
|
|
12
|
+
//# sourceMappingURL=chunk-LHOK33GI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/d1/regional-deadline.ts"],"names":[],"mappings":";AAAA,IAAI,cAAA;AAEG,SAAS,iCAAiC,MAAA,EAA0C;AACzF,EAAA,cAAA,GAAiB,MAAA;AACnB;AAEO,SAAS,uBAAuB,QAAA,EAAwB;AAC7D,EAAA,cAAA,GAAiB,QAAQ,CAAA;AAC3B","file":"chunk-LHOK33GI.js","sourcesContent":["let reportDeadline: ((deadline: number) => void) | undefined;\n\nexport function registerRegionalDeadlineReporter(report: (deadline: number) => void): void {\n reportDeadline = report;\n}\n\nexport function limitRegionalDataUntil(deadline: number): void {\n reportDeadline?.(deadline);\n}\n"]}
|
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
import { createCacheExtension, readTargets, CacheUnavailableError } from './chunk-ZREX7LLC.js';
|
|
2
|
+
import { boundedD1Store, createDurableObjectStore } from './chunk-OOPPXK7Q.js';
|
|
3
|
+
import { MAX_VALUE_BYTES } from './chunk-OQRNVGQE.js';
|
|
4
|
+
import { isD1BindingName } from './chunk-AENVFT2S.js';
|
|
5
|
+
import { limitRegionalDataUntil } from './chunk-LHOK33GI.js';
|
|
6
|
+
import { boundedValue, regionalKey, regionalRead, regionalWrite } from './chunk-E6OZZ5UX.js';
|
|
7
|
+
import { sha256Hex, stableStringify, decode, encode } from './chunk-ZCMZJKGN.js';
|
|
8
|
+
|
|
9
|
+
// src/d1/adapter.ts
|
|
10
|
+
var fence = ["g"];
|
|
11
|
+
var lexemes = /\s+|--[^\n]*|\/\*[\s\S]*?(?:\*\/|$)|'(?:[^']|'')*'?|`(?:[^`]|``)*`?|"(?:[^"]|"")*"?|\[[^\]]*\]?|[A-Za-z_][A-Za-z0-9_$]*|[\s\S]/g;
|
|
12
|
+
var safePragmas = /* @__PURE__ */ new Set(["database_list", "table_list", "table_info", "table_xinfo", "index_list", "index_info", "index_xinfo", "foreign_key_list"]);
|
|
13
|
+
function operationOf(tokens, start = 0) {
|
|
14
|
+
const word = (index2) => tokens[index2]?.toLowerCase();
|
|
15
|
+
if (word(start) !== "with") return word(start);
|
|
16
|
+
let index = start + 1;
|
|
17
|
+
if (word(index) === "recursive") index++;
|
|
18
|
+
const group = () => {
|
|
19
|
+
if (tokens[index] !== "(") return false;
|
|
20
|
+
let depth = 0;
|
|
21
|
+
do {
|
|
22
|
+
if (tokens[index] === "(") depth++;
|
|
23
|
+
if (tokens[index] === ")") depth--;
|
|
24
|
+
index++;
|
|
25
|
+
} while (index < tokens.length && depth > 0);
|
|
26
|
+
return depth === 0;
|
|
27
|
+
};
|
|
28
|
+
while (index < tokens.length) {
|
|
29
|
+
if (!/^(?:[A-Za-z_][A-Za-z0-9_$]*|`[^`]+`|"[^"]+"|\[[^\]]+\])$/.test(tokens[index] ?? "")) return void 0;
|
|
30
|
+
index++;
|
|
31
|
+
if (tokens[index] === "(" && !group()) return void 0;
|
|
32
|
+
if (word(index++) !== "as") return void 0;
|
|
33
|
+
if (word(index) === "not") index++;
|
|
34
|
+
if (word(index) === "materialized") index++;
|
|
35
|
+
if (tokens[index] !== "(" || !["select", "with"].includes(word(index + 1) ?? "")) return void 0;
|
|
36
|
+
if (!group()) return void 0;
|
|
37
|
+
if (tokens[index] !== ",") return word(index);
|
|
38
|
+
index++;
|
|
39
|
+
}
|
|
40
|
+
return void 0;
|
|
41
|
+
}
|
|
42
|
+
function isReadonly(sql) {
|
|
43
|
+
const tokens = [...sql.matchAll(lexemes)].map(([token = ""]) => token).filter((token) => !/^(?:\s|--|\/\*)/.test(token));
|
|
44
|
+
if (tokens.at(-1) === ";") tokens.pop();
|
|
45
|
+
const first = tokens[0]?.toLowerCase();
|
|
46
|
+
const pragmaName = first === "pragma" ? (tokens[2] === "." ? tokens[3] : tokens[1])?.toLowerCase() : void 0;
|
|
47
|
+
const readonlyPragma = first === "pragma" && pragmaName !== void 0 && safePragmas.has(pragmaName) && !tokens.includes("=");
|
|
48
|
+
return !tokens.includes(";") && (operationOf(tokens) === "select" || readonlyPragma);
|
|
49
|
+
}
|
|
50
|
+
function needsWriteFence(sql, unrelatedWrites) {
|
|
51
|
+
const tokens = [...sql.matchAll(lexemes)].map(([token = ""]) => token).filter((token) => !/^(?:\s|--|\/\*)/.test(token));
|
|
52
|
+
if (tokens.at(-1) === ";") tokens.pop();
|
|
53
|
+
if (tokens.includes(";")) return true;
|
|
54
|
+
let index = 0;
|
|
55
|
+
const word = () => tokens[index]?.toLowerCase();
|
|
56
|
+
const operation = word();
|
|
57
|
+
if (operation !== "insert" && operation !== "update" && operation !== "delete") return true;
|
|
58
|
+
index++;
|
|
59
|
+
if ((operation === "insert" || operation === "update") && word() === "or") {
|
|
60
|
+
index++;
|
|
61
|
+
if (!["rollback", "abort", "replace", "fail", "ignore"].includes(word() ?? "")) return true;
|
|
62
|
+
index++;
|
|
63
|
+
}
|
|
64
|
+
if (operation === "insert") {
|
|
65
|
+
if (word() !== "into") return true;
|
|
66
|
+
index++;
|
|
67
|
+
}
|
|
68
|
+
if (operation === "delete") {
|
|
69
|
+
if (word() !== "from") return true;
|
|
70
|
+
index++;
|
|
71
|
+
}
|
|
72
|
+
const identifier = (token) => {
|
|
73
|
+
if (!token) return null;
|
|
74
|
+
if (/^[A-Za-z_][A-Za-z0-9_$]*$/.test(token)) return token.toLowerCase();
|
|
75
|
+
if (/^"[A-Za-z_][A-Za-z0-9_$]*"$/.test(token) || /^`[A-Za-z_][A-Za-z0-9_$]*`$/.test(token) || /^\[[A-Za-z_][A-Za-z0-9_$]*\]$/.test(token)) return token.slice(1, -1).toLowerCase();
|
|
76
|
+
return null;
|
|
77
|
+
};
|
|
78
|
+
let target = identifier(tokens[index++]);
|
|
79
|
+
if (tokens[index] === ".") {
|
|
80
|
+
if (target !== "main") return true;
|
|
81
|
+
index++;
|
|
82
|
+
target = identifier(tokens[index++]);
|
|
83
|
+
}
|
|
84
|
+
if (!target || !unrelatedWrites.has(target)) return true;
|
|
85
|
+
if (operation === "update" && word() !== "set") return true;
|
|
86
|
+
if (operation === "delete" && !["where", "returning"].includes(word() ?? "") && index !== tokens.length) return true;
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
function fenceD1Writes(db, options) {
|
|
90
|
+
const { generation, policy } = options;
|
|
91
|
+
const store = boundedD1Store(options.store);
|
|
92
|
+
const unrelatedWrites = new Set(policy.unfencedWriteTables.map((name) => name.toLowerCase()));
|
|
93
|
+
if (!generation) throw new TypeError("cache generation is required");
|
|
94
|
+
const statements = /* @__PURE__ */ new WeakMap();
|
|
95
|
+
const withWrite = async (operation) => {
|
|
96
|
+
const token = crypto.randomUUID();
|
|
97
|
+
try {
|
|
98
|
+
await store.beginWrite({ fences: fence, generation, leaseMs: 6e5, token });
|
|
99
|
+
} catch (error) {
|
|
100
|
+
await store.endWrite({ fences: fence, token }).catch(() => void 0);
|
|
101
|
+
throw new CacheUnavailableError(error);
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
return await operation();
|
|
105
|
+
} finally {
|
|
106
|
+
await store.endWrite({ fences: fence, token }).catch(() => void 0);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
const wrapStatement = (raw, sql) => {
|
|
110
|
+
const requiresFence = !isReadonly(sql) && needsWriteFence(sql, unrelatedWrites);
|
|
111
|
+
const execute = (operation) => requiresFence ? withWrite(operation) : operation();
|
|
112
|
+
function rawRows(rawOptions) {
|
|
113
|
+
return execute(() => rawOptions?.columnNames === true ? raw.raw({ columnNames: true }) : raw.raw(rawOptions?.columnNames === false ? { columnNames: false } : void 0));
|
|
114
|
+
}
|
|
115
|
+
const wrapped2 = {
|
|
116
|
+
bind: (...next) => wrapStatement(raw.bind(...next), sql),
|
|
117
|
+
first: (column) => execute(() => column === void 0 ? raw.first() : raw.first(column)),
|
|
118
|
+
all: () => execute(() => raw.all()),
|
|
119
|
+
run: () => execute(() => raw.run()),
|
|
120
|
+
raw: rawRows
|
|
121
|
+
};
|
|
122
|
+
statements.set(wrapped2, { raw, fence: requiresFence });
|
|
123
|
+
return wrapped2;
|
|
124
|
+
};
|
|
125
|
+
const batch = (target, items) => {
|
|
126
|
+
const resolved = items.map((item) => statements.get(item));
|
|
127
|
+
const raw = items.map((item, index) => resolved[index]?.raw ?? item);
|
|
128
|
+
const operation = () => target.batch(raw);
|
|
129
|
+
return resolved.every((item) => item !== void 0 && !item.fence) ? operation() : withWrite(operation);
|
|
130
|
+
};
|
|
131
|
+
return {
|
|
132
|
+
prepare: (sql) => wrapStatement(db.prepare(sql), sql),
|
|
133
|
+
batch: (items) => batch(db, items),
|
|
134
|
+
exec: (sql) => isReadonly(sql) || !needsWriteFence(sql, unrelatedWrites) ? db.exec(sql) : withWrite(() => db.exec(sql)),
|
|
135
|
+
dump: () => db.dump(),
|
|
136
|
+
withSession: (constraint) => {
|
|
137
|
+
const session = db.withSession(constraint);
|
|
138
|
+
return {
|
|
139
|
+
prepare: (sql) => wrapStatement(session.prepare(sql), sql),
|
|
140
|
+
batch: (items) => batch(session, items),
|
|
141
|
+
getBookmark: () => session.getBookmark()
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// src/d1/env.ts
|
|
148
|
+
var uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
149
|
+
var hints = /* @__PURE__ */ new Set(["wnam", "enam", "sam", "weur", "eeur", "apac", "oc", "afr", "me"]);
|
|
150
|
+
var wrapped = /* @__PURE__ */ new WeakMap();
|
|
151
|
+
var runtimes = /* @__PURE__ */ new WeakMap();
|
|
152
|
+
var d1CacheRuntime = (database) => runtimes.get(database);
|
|
153
|
+
function createD1CacheRuntime(database, options) {
|
|
154
|
+
const { generation, databaseId, profile, readsEnabled = true } = options;
|
|
155
|
+
const store = boundedD1Store(options.store);
|
|
156
|
+
const fenced = fenceD1Writes(database, { store, generation, policy: profile });
|
|
157
|
+
runtimes.set(fenced, { store, generation, databaseId, readsEnabled, readModels: profile.readModels, coordinatorIdentity: options.coordinatorIdentity ?? options.store, coordinatorName: options.coordinatorName ?? "", regionalIdentity: options.regionalIdentity });
|
|
158
|
+
return fenced;
|
|
159
|
+
}
|
|
160
|
+
function cacheD1Env(env, profile) {
|
|
161
|
+
const value = (suffix) => Reflect.get(env, `${profile.envPrefix}_${suffix}`);
|
|
162
|
+
const enabled = value("ENABLED");
|
|
163
|
+
if (enabled === void 0 || enabled === "false") return env;
|
|
164
|
+
if (enabled !== "true") throw new Error(`Invalid ${profile.envPrefix}_ENABLED`);
|
|
165
|
+
const reads = value("READS_ENABLED");
|
|
166
|
+
if (reads !== void 0 && reads !== "true" && reads !== "false") throw new Error(`Invalid ${profile.envPrefix}_READS_ENABLED`);
|
|
167
|
+
const readsEnabled = reads !== "false";
|
|
168
|
+
const namespace = value("COORDINATOR");
|
|
169
|
+
const rawIds = value("DATABASE_IDS");
|
|
170
|
+
const generation = value("GENERATION");
|
|
171
|
+
if (!namespace || typeof namespace !== "object" || typeof Reflect.get(namespace, "idFromName") !== "function" || typeof Reflect.get(namespace, "get") !== "function" || typeof rawIds !== "string" || typeof generation !== "string" || !generation.trim())
|
|
172
|
+
throw new Error(`${profile.envPrefix} requires coordinator, database identities and generation`);
|
|
173
|
+
if (generation.length > 256) throw new Error(`Invalid ${profile.envPrefix}_GENERATION`);
|
|
174
|
+
let ids;
|
|
175
|
+
try {
|
|
176
|
+
ids = JSON.parse(rawIds);
|
|
177
|
+
} catch {
|
|
178
|
+
throw new Error(`Invalid ${profile.envPrefix}_DATABASE_IDS`);
|
|
179
|
+
}
|
|
180
|
+
if (!ids || typeof ids !== "object" || Array.isArray(ids)) throw new Error(`Invalid ${profile.envPrefix}_DATABASE_IDS`);
|
|
181
|
+
const map = Object.entries(ids);
|
|
182
|
+
if (map.some(([key, id]) => !isD1BindingName(key, profile) || typeof id !== "string" || !uuid.test(id))) throw new Error("Invalid cache database identity");
|
|
183
|
+
const locationHint = value("LOCATION_HINT") ?? "weur";
|
|
184
|
+
if (typeof locationHint !== "string" || !hints.has(locationHint)) throw new Error(`Invalid ${profile.envPrefix}_LOCATION_HINT`);
|
|
185
|
+
const identities = new Map(map);
|
|
186
|
+
const scoped = { ...env };
|
|
187
|
+
for (const name of profile.bindingNames) if (!Reflect.has(env, name)) throw new Error(`Cache missing D1 binding: ${name}`);
|
|
188
|
+
for (const [key, database] of Object.entries(env)) {
|
|
189
|
+
if (profile.bindingPrefixes.some((prefix) => key.startsWith(prefix)) && !isD1BindingName(key, profile)) throw new Error(`Invalid cache binding: ${key}`);
|
|
190
|
+
if (!isD1BindingName(key, profile)) continue;
|
|
191
|
+
const id = identities.get(key);
|
|
192
|
+
if (typeof id !== "string" || !database || typeof database.prepare !== "function") throw new Error(`Cache missing D1 identity or binding: ${key}`);
|
|
193
|
+
const databaseId = id.toLowerCase();
|
|
194
|
+
const cacheKey = JSON.stringify([databaseId, generation, locationHint, readsEnabled, profile]);
|
|
195
|
+
let databases = wrapped.get(namespace);
|
|
196
|
+
if (!databases) {
|
|
197
|
+
databases = /* @__PURE__ */ new WeakMap();
|
|
198
|
+
wrapped.set(namespace, databases);
|
|
199
|
+
}
|
|
200
|
+
let versions = databases.get(database);
|
|
201
|
+
if (!versions) {
|
|
202
|
+
versions = /* @__PURE__ */ new Map();
|
|
203
|
+
databases.set(database, versions);
|
|
204
|
+
}
|
|
205
|
+
let cached = versions.get(cacheKey);
|
|
206
|
+
if (!cached) {
|
|
207
|
+
const coordinatorName = `${profile.coordinatorNamePrefix}${databaseId}`;
|
|
208
|
+
const store = createDurableObjectStore(namespace, { name: coordinatorName, locationHint });
|
|
209
|
+
cached = createD1CacheRuntime(database, { store, generation, databaseId, readsEnabled, profile, coordinatorIdentity: namespace, coordinatorName, regionalIdentity: namespace.idFromName(coordinatorName).toString() });
|
|
210
|
+
versions.set(cacheKey, cached);
|
|
211
|
+
}
|
|
212
|
+
Reflect.set(scoped, key, cached);
|
|
213
|
+
}
|
|
214
|
+
return scoped;
|
|
215
|
+
}
|
|
216
|
+
function wrapD1Handler(handler, profile) {
|
|
217
|
+
return (event, env, context) => handler(event, cacheD1Env(env, profile), context);
|
|
218
|
+
}
|
|
219
|
+
function d1PrismaCacheExtension(database, config, optionsOrDecimal, decimalArg) {
|
|
220
|
+
const runtime = runtimes.get(database);
|
|
221
|
+
if (!runtime || !runtime.readsEnabled) return void 0;
|
|
222
|
+
const options = typeof optionsOrDecimal === "function" ? void 0 : optionsOrDecimal;
|
|
223
|
+
const decimal = typeof optionsOrDecimal === "function" ? optionsOrDecimal : decimalArg;
|
|
224
|
+
const allowed = new Set(runtime.readModels);
|
|
225
|
+
const scopedConfig = { ...config, cacheableByModel: Object.fromEntries(Object.entries(config.cacheableByModel).map(([model, enabled]) => [model, enabled && allowed.has(model)])) };
|
|
226
|
+
const common = { config: scopedConfig, store: runtime.store, generation: runtime.generation, coordinationGeneration: runtime.generation, ...decimal ? { decimal } : {}, ...options?.keyArgs ? { keyArgs: options.keyArgs } : {} };
|
|
227
|
+
const base = createCacheExtension({ ...common, scope: runtime.databaseId });
|
|
228
|
+
if (!options) return base;
|
|
229
|
+
const operation = base.query.$allModels.$allOperations;
|
|
230
|
+
return {
|
|
231
|
+
...base,
|
|
232
|
+
query: { $allModels: { async $allOperations(params) {
|
|
233
|
+
if (!params.model || !allowed.has(params.model) || !["findUnique", "findUniqueOrThrow", "findFirst", "findFirstOrThrow", "findMany", "count", "aggregate", "groupBy"].includes(params.operation)) return operation(params);
|
|
234
|
+
if (options.scope === null || options.scope === void 0 || !boundedValue(options.scope, 32768, true) || (options.dependencies?.length ?? 0) > 32) return params.query(params.args);
|
|
235
|
+
const dependencies = dependencyRuntimes(database, options.dependencies ?? []);
|
|
236
|
+
if (!dependencies) return params.query(params.args);
|
|
237
|
+
const internal = params.__internalParams;
|
|
238
|
+
const dataPath = internal && typeof internal === "object" && Array.isArray(Reflect.get(internal, "dataPath")) ? Reflect.get(internal, "dataPath") : [];
|
|
239
|
+
const transaction = internal && typeof internal === "object" ? Reflect.get(internal, "transaction") : void 0;
|
|
240
|
+
const inBatch = !!transaction && typeof transaction === "object" && Reflect.get(transaction, "kind") === "batch";
|
|
241
|
+
let regional = null;
|
|
242
|
+
let normalizedArgs;
|
|
243
|
+
let normalized = false;
|
|
244
|
+
try {
|
|
245
|
+
const identities = [runtime, ...dependencies].map((item) => [item.databaseId, item.generation, item.coordinatorName, item.regionalIdentity]);
|
|
246
|
+
const targets = options.regionalModels ? readTargets(config.relationGraph, params.model, params.args) : void 0;
|
|
247
|
+
const allowedTargets = !options.regionalModels || !!targets && [...targets.models].every((model) => options.regionalModels?.includes(model));
|
|
248
|
+
if (options.regionalTtlMs && options.regionalTtlMs > 0 && options.regionalTtlMs <= 5e3 && !inBatch && allowedTargets && identities.every((item) => item[3])) {
|
|
249
|
+
normalizedArgs = options.keyArgs ? options.keyArgs(params.args) : params.args;
|
|
250
|
+
normalized = true;
|
|
251
|
+
const configDigest = await sha256Hex(stableStringify(config));
|
|
252
|
+
regional = await regionalKey(options.regionalTtlMs, ["prisma", options.regionalTtlMs, identities, configDigest, options.scope, params.model, params.operation, dataPath, normalizedArgs ?? null]);
|
|
253
|
+
}
|
|
254
|
+
} catch {
|
|
255
|
+
}
|
|
256
|
+
const hit = await regionalRead(regional, options.regionalTtlMs, decimal);
|
|
257
|
+
if (hit) {
|
|
258
|
+
limitRegionalDataUntil(hit.expires);
|
|
259
|
+
return hit.value;
|
|
260
|
+
}
|
|
261
|
+
let started = Date.now();
|
|
262
|
+
const snapshot = await inspect(dependencies);
|
|
263
|
+
if (!snapshot) return params.query(params.args);
|
|
264
|
+
let scope;
|
|
265
|
+
try {
|
|
266
|
+
scope = stableStringify([runtime.databaseId, runtime.generation, options.scope, snapshot.map(({ runtime: dependency, epoch }) => [dependency.databaseId, dependency.generation, epoch])]);
|
|
267
|
+
if (new TextEncoder().encode(scope).byteLength > 32768) return params.query(params.args);
|
|
268
|
+
} catch {
|
|
269
|
+
return params.query(params.args);
|
|
270
|
+
}
|
|
271
|
+
let verifiedHit = false;
|
|
272
|
+
let verifiedWrite = false;
|
|
273
|
+
let queried = false;
|
|
274
|
+
const store = {
|
|
275
|
+
...runtime.store,
|
|
276
|
+
async write(request) {
|
|
277
|
+
const result = await runtime.store.write(request);
|
|
278
|
+
verifiedWrite = result.ok;
|
|
279
|
+
return result;
|
|
280
|
+
},
|
|
281
|
+
async read(request) {
|
|
282
|
+
const result = await runtime.store.read(request);
|
|
283
|
+
if (result.kind === "hit" && !sameSnapshots(snapshot, await inspect(dependencies))) return { kind: "miss", epochs: result.epochs, lockHeldForMs: null, lockToken: null, pending: true };
|
|
284
|
+
if (result.kind === "hit") verifiedHit = true;
|
|
285
|
+
return result;
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
const scoped = createCacheExtension({ ...common, store, scope, ...normalized ? { keyArgs: () => normalizedArgs } : {} });
|
|
289
|
+
const value = await scoped.query.$allModels.$allOperations({ ...params, query: async (args) => {
|
|
290
|
+
queried = true;
|
|
291
|
+
started = Date.now();
|
|
292
|
+
return params.query(args);
|
|
293
|
+
} });
|
|
294
|
+
if (regional && (!queried && verifiedHit || verifiedWrite) && sameSnapshots(snapshot, await inspect(dependencies))) await regionalWrite(regional, options.regionalTtlMs, started, value);
|
|
295
|
+
return value;
|
|
296
|
+
} } }
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
function withD1PrismaCache(client, database, config, optionsOrDecimal, decimalArg) {
|
|
300
|
+
const extension = d1PrismaCacheExtension(database, config, optionsOrDecimal, decimalArg);
|
|
301
|
+
if (!extension) return client;
|
|
302
|
+
const extend = Reflect.get(client, "$extends", client);
|
|
303
|
+
if (typeof extend !== "function") throw new TypeError("Prisma client must support $extends");
|
|
304
|
+
const extended = Reflect.apply(extend, client, [extension]);
|
|
305
|
+
if (!extended || typeof extended !== "object") throw new TypeError("Prisma extension returned no client");
|
|
306
|
+
return new Proxy(client, {
|
|
307
|
+
get(target, property) {
|
|
308
|
+
const source = property === "$on" ? target : extended;
|
|
309
|
+
const member = Reflect.get(source, property, source);
|
|
310
|
+
return typeof member === "function" ? member.bind(source) : member;
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// src/d1/read.ts
|
|
316
|
+
var FENCES = ["g"];
|
|
317
|
+
var DEFAULT_TTL_MS = 3e4;
|
|
318
|
+
var MAX_TTL_MS = 3e5;
|
|
319
|
+
var MAX_IDENTITY_BYTES = 32768;
|
|
320
|
+
var MAX_VALUE_SIZE = Math.min(15e5, MAX_VALUE_BYTES);
|
|
321
|
+
function sameD1CacheDatabase(left, right) {
|
|
322
|
+
const a = d1CacheRuntime(left);
|
|
323
|
+
const b = d1CacheRuntime(right);
|
|
324
|
+
return !!a && !!b && a.databaseId === b.databaseId && a.generation === b.generation && a.coordinatorIdentity === b.coordinatorIdentity && a.coordinatorName === b.coordinatorName;
|
|
325
|
+
}
|
|
326
|
+
async function d1CacheEpoch(database) {
|
|
327
|
+
const runtime = d1CacheRuntime(database);
|
|
328
|
+
if (!runtime || !runtime.readsEnabled) return null;
|
|
329
|
+
const snapshot = await inspect([runtime]);
|
|
330
|
+
if (!snapshot?.[0]) return null;
|
|
331
|
+
return stableStringify([runtime.databaseId, runtime.generation, snapshot[0].epoch]);
|
|
332
|
+
}
|
|
333
|
+
async function inspect(runtimes2) {
|
|
334
|
+
if (runtimes2.length === 0) return [];
|
|
335
|
+
try {
|
|
336
|
+
const states = await Promise.all(runtimes2.map(async (runtime) => {
|
|
337
|
+
if (!runtime.store.inspectFences) return null;
|
|
338
|
+
const state = await runtime.store.inspectFences({ fences: FENCES, generation: runtime.generation });
|
|
339
|
+
const epoch = state.epochs.g;
|
|
340
|
+
if (state.pending !== false || typeof epoch !== "number" || !Number.isSafeInteger(epoch) || epoch < 0) return null;
|
|
341
|
+
return { runtime, epoch };
|
|
342
|
+
}));
|
|
343
|
+
return states.some((state) => state === null) ? null : states.filter((state) => state !== null);
|
|
344
|
+
} catch {
|
|
345
|
+
return null;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
var sameSnapshots = (a, b) => b !== null && a.length === b.length && a.every((item, index) => item.runtime.databaseId === b[index]?.runtime.databaseId && item.runtime.generation === b[index]?.runtime.generation && item.epoch === b[index]?.epoch);
|
|
349
|
+
function dependencyRuntimes(database, dependencies) {
|
|
350
|
+
if (dependencies.length > 32) return null;
|
|
351
|
+
const primary = d1CacheRuntime(database);
|
|
352
|
+
if (!primary || !primary.readsEnabled) return null;
|
|
353
|
+
const byId = /* @__PURE__ */ new Map();
|
|
354
|
+
for (const dependency of dependencies) {
|
|
355
|
+
const runtime = d1CacheRuntime(dependency);
|
|
356
|
+
if (!runtime || !runtime.readsEnabled) return null;
|
|
357
|
+
const prior = runtime.databaseId === primary.databaseId ? primary : byId.get(runtime.databaseId);
|
|
358
|
+
if (prior && (prior.generation !== runtime.generation || prior.coordinatorIdentity !== runtime.coordinatorIdentity || prior.coordinatorName !== runtime.coordinatorName)) return null;
|
|
359
|
+
if (runtime.databaseId === primary.databaseId) continue;
|
|
360
|
+
if (!runtime.store.inspectFences) return null;
|
|
361
|
+
byId.set(runtime.databaseId, prior ?? runtime);
|
|
362
|
+
}
|
|
363
|
+
return [...byId.values()].sort((a, b) => a.databaseId.localeCompare(b.databaseId));
|
|
364
|
+
}
|
|
365
|
+
async function cacheD1Read(database, options, load) {
|
|
366
|
+
const primary = d1CacheRuntime(database);
|
|
367
|
+
const ttl = options.ttlMs ?? DEFAULT_TTL_MS;
|
|
368
|
+
if (!primary || !primary.readsEnabled || !Number.isFinite(ttl) || ttl <= 0 || ttl > MAX_TTL_MS || options.scope === void 0 || options.scope === null || !boundedValue(options.scope, MAX_IDENTITY_BYTES, true) || !boundedValue(options.key, MAX_IDENTITY_BYTES, true)) return load();
|
|
369
|
+
const runtimes2 = dependencyRuntimes(database, options.dependencies ?? []);
|
|
370
|
+
if (!runtimes2) return load();
|
|
371
|
+
const regionalIdentities = [primary, ...runtimes2].map((runtime) => [runtime.databaseId, runtime.generation, runtime.coordinatorName, runtime.regionalIdentity]);
|
|
372
|
+
const regional = regionalIdentities.every((identity) => identity[3]) ? await regionalKey(options.regionalTtlMs, ["d1-read", options.regionalTtlMs, regionalIdentities, options.scope, options.key]) : null;
|
|
373
|
+
const hit = await regionalRead(regional, options.regionalTtlMs);
|
|
374
|
+
if (hit) {
|
|
375
|
+
limitRegionalDataUntil(hit.expires);
|
|
376
|
+
return hit.value;
|
|
377
|
+
}
|
|
378
|
+
const started = Date.now();
|
|
379
|
+
const snapshot = await inspect(runtimes2);
|
|
380
|
+
if (!snapshot) return load();
|
|
381
|
+
let key;
|
|
382
|
+
try {
|
|
383
|
+
const identity = stableStringify(["d1-read-v1", primary.databaseId, primary.generation, options.scope, options.key, snapshot.map(({ runtime, epoch }) => [runtime.databaseId, runtime.generation, epoch])]);
|
|
384
|
+
if (new TextEncoder().encode(identity).byteLength > MAX_IDENTITY_BYTES) return load();
|
|
385
|
+
key = `d1:${await sha256Hex(identity)}`;
|
|
386
|
+
} catch {
|
|
387
|
+
return load();
|
|
388
|
+
}
|
|
389
|
+
let result;
|
|
390
|
+
try {
|
|
391
|
+
result = await primary.store.read({ key, fences: FENCES, generation: primary.generation, lockMs: 3e4, refresh: false });
|
|
392
|
+
} catch {
|
|
393
|
+
return load();
|
|
394
|
+
}
|
|
395
|
+
if (result.kind === "hit") {
|
|
396
|
+
try {
|
|
397
|
+
const value = decode(JSON.parse(result.value));
|
|
398
|
+
if (boundedValue(value, MAX_VALUE_SIZE, false) && sameSnapshots(snapshot, await inspect(runtimes2))) {
|
|
399
|
+
await regionalWrite(regional, options.regionalTtlMs, started, value);
|
|
400
|
+
return value;
|
|
401
|
+
}
|
|
402
|
+
} catch {
|
|
403
|
+
}
|
|
404
|
+
return load();
|
|
405
|
+
}
|
|
406
|
+
if (!result.lockToken || result.pending) return load();
|
|
407
|
+
const lockToken = result.lockToken;
|
|
408
|
+
try {
|
|
409
|
+
const value = await load();
|
|
410
|
+
try {
|
|
411
|
+
if (value !== null && value !== void 0 && boundedValue(value, MAX_VALUE_SIZE, false) && (options.cacheable?.(value) ?? true)) {
|
|
412
|
+
const text = JSON.stringify(encode(value));
|
|
413
|
+
if (new TextEncoder().encode(text).byteLength <= MAX_VALUE_SIZE && sameSnapshots(snapshot, await inspect(runtimes2))) {
|
|
414
|
+
const written = await primary.store.write({ key, lockToken, snapshot: result.epochs, ttlMs: ttl, softTtlMs: ttl, value: text });
|
|
415
|
+
if (regional && written.ok && sameSnapshots(snapshot, await inspect(runtimes2))) await regionalWrite(regional, options.regionalTtlMs, started, value);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
} catch {
|
|
419
|
+
}
|
|
420
|
+
return value;
|
|
421
|
+
} finally {
|
|
422
|
+
try {
|
|
423
|
+
await primary.store.release({ key, lockToken });
|
|
424
|
+
} catch {
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
export { cacheD1Env, cacheD1Read, createD1CacheRuntime, d1CacheEpoch, d1CacheRuntime, d1PrismaCacheExtension, fenceD1Writes, sameD1CacheDatabase, withD1PrismaCache, wrapD1Handler };
|
|
430
|
+
//# sourceMappingURL=chunk-MOJBHU3S.js.map
|
|
431
|
+
//# sourceMappingURL=chunk-MOJBHU3S.js.map
|