@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.
Files changed (40) hide show
  1. package/README.md +31 -1
  2. package/dist/chunk-2V6MG4YX.js +652 -0
  3. package/dist/chunk-2V6MG4YX.js.map +1 -0
  4. package/dist/{chunk-MOJBHU3S.js → chunk-6VWIKYUQ.js} +72 -173
  5. package/dist/chunk-6VWIKYUQ.js.map +1 -0
  6. package/dist/{chunk-HGAUU4EU.js → chunk-7OWX6SH5.js} +52 -15
  7. package/dist/chunk-7OWX6SH5.js.map +1 -0
  8. package/dist/{chunk-A4WV6RY4.js → chunk-GGSQ6C6X.js} +8 -3
  9. package/dist/chunk-GGSQ6C6X.js.map +1 -0
  10. package/dist/{chunk-ZREX7LLC.js → chunk-M4UOCIDQ.js} +18 -6
  11. package/dist/chunk-M4UOCIDQ.js.map +1 -0
  12. package/dist/chunk-NFBMWKY5.js +54 -0
  13. package/dist/chunk-NFBMWKY5.js.map +1 -0
  14. package/dist/{chunk-OOPPXK7Q.js → chunk-WKZ7TKGM.js} +3 -54
  15. package/dist/chunk-WKZ7TKGM.js.map +1 -0
  16. package/dist/chunk-ZBYAKDNZ.js +45 -0
  17. package/dist/chunk-ZBYAKDNZ.js.map +1 -0
  18. package/dist/client.d.ts +14 -1
  19. package/dist/client.js +37 -1
  20. package/dist/client.js.map +1 -1
  21. package/dist/cloudflare/index.d.ts +1 -1
  22. package/dist/cloudflare/index.js +4 -4
  23. package/dist/d1/index.d.ts +18 -2
  24. package/dist/d1/index.js +33 -11
  25. package/dist/d1/index.js.map +1 -1
  26. package/dist/d1/response-lease.js +11 -9
  27. package/dist/d1/response-lease.js.map +1 -1
  28. package/dist/index.d.ts +2 -2
  29. package/dist/index.js +1 -1
  30. package/dist/response-lease.js +8 -3
  31. package/dist/{types-D-Gd11to.d.ts → types-CtErcz2a.d.ts} +13 -1
  32. package/docs/cache-contract.md +2 -0
  33. package/package.json +1 -1
  34. package/dist/chunk-A4WV6RY4.js.map +0 -1
  35. package/dist/chunk-D2EESWMC.js +0 -19
  36. package/dist/chunk-D2EESWMC.js.map +0 -1
  37. package/dist/chunk-HGAUU4EU.js.map +0 -1
  38. package/dist/chunk-MOJBHU3S.js.map +0 -1
  39. package/dist/chunk-OOPPXK7Q.js.map +0 -1
  40. package/dist/chunk-ZREX7LLC.js.map +0 -1
@@ -1,7 +1,8 @@
1
1
  import { isMutation, needsFreshness, matchesPath } from './chunk-JPK2AF7X.js';
2
- import { createResponseWarmup } from './chunk-A4WV6RY4.js';
3
- import { hasFreshnessCookie, hasFreshnessGeneration, validFreshnessHeader, hasCacheBypass } from './chunk-D2EESWMC.js';
2
+ import { createResponseWarmup } from './chunk-GGSQ6C6X.js';
3
+ import { runIsolatedD1Session, hasFreshnessCookie, hasFreshnessGeneration, validFreshnessHeader, d1SessionBookmarkFloor, advanceD1SessionBookmarks, trackD1SessionSource, runPrimaryD1SessionSource, responseD1SessionBookmarks, varyD1Bookmarks, hasCacheBypass } from './chunk-2V6MG4YX.js';
4
4
  import { registerRegionalDeadlineReporter } from './chunk-LHOK33GI.js';
5
+ import { D1_BOOKMARK_HEADER, decodeD1Bookmarks, serializeD1Bookmarks } from './chunk-ZBYAKDNZ.js';
5
6
  import { responseLeaseKey, MAX_RESPONSE_LEASE_BYTES } from './chunk-E6OZZ5UX.js';
6
7
  import { AsyncLocalStorage } from 'node:async_hooks';
7
8
 
@@ -173,7 +174,7 @@ async function responseEntry(response, permittedVary) {
173
174
  function createReadResponseLease(handler, resolve) {
174
175
  const pending = /* @__PURE__ */ new Map();
175
176
  let foreground = 0;
176
- const warming = createResponseWarmup((request, env, context) => wrapped(request, env, context), () => foreground === 0);
177
+ const warming = createResponseWarmup((request, env, context) => runIsolatedD1Session(request, () => wrapped(request, env, context)), () => foreground === 0);
177
178
  const wrapped = async (request, env, context) => {
178
179
  const requestStarted = Date.now();
179
180
  const requestGeneration = warming.snapshot();
@@ -220,11 +221,20 @@ function createReadResponseLease(handler, resolve) {
220
221
  const identity = resolved.identity();
221
222
  if (!identity) return serve(noCache(request));
222
223
  const names = [...new Set([...config.credentialHeaders, ...config.varyHeaders].map((name) => name.toLowerCase()))].sort();
223
- const permittedVary = new Set(names);
224
+ const permittedVary = /* @__PURE__ */ new Set([...names, D1_BOOKMARK_HEADER.toLowerCase()]);
224
225
  const ttl = seconds * 1e3;
225
226
  const key = await responseLeaseKey(ttl, [identity[0], request.method, request.url, ...identity.slice(1), names.map((name) => [name, headerValue(name)])]);
226
227
  if (!key) return serve(noCache(request));
227
- const cached = forceSource ? null : await readLease(key, ttl, permittedVary);
228
+ let cached = forceSource ? null : await readLease(key, ttl, permittedVary);
229
+ const bookmarkFloor = d1SessionBookmarkFloor();
230
+ if (cached && bookmarkFloor) {
231
+ const rawBookmarks = cached.response.headers.get(D1_BOOKMARK_HEADER);
232
+ const source2 = decodeD1Bookmarks(rawBookmarks);
233
+ if (!rawBookmarks || !source2 || Object.entries(bookmarkFloor).some(([id, floor]) => !source2[id] || source2[id] < floor)) {
234
+ void cached.response.body?.cancel().catch(() => void 0);
235
+ cached = null;
236
+ } else advanceD1SessionBookmarks(source2);
237
+ }
228
238
  const warmOptions = config.warmup;
229
239
  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;
230
240
  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;
@@ -235,7 +245,11 @@ function createReadResponseLease(handler, resolve) {
235
245
  if (!warmOptions || !warmGroup || warming.isInternal(request) || !warming.current(requestGeneration)) return;
236
246
  const wait = context && typeof context === "object" ? Reflect.get(context, "waitUntil") : void 0;
237
247
  if (typeof wait !== "function") return;
238
- const task = warming.start(warmOptions, request, response2, identity, warmGroup, eligible, env, context, config.freshnessHeader, credentialGroup ?? void 0);
248
+ const warmHeaders = new Headers(request.headers);
249
+ const sourceBookmarks2 = response2.headers.get(D1_BOOKMARK_HEADER);
250
+ if (sourceBookmarks2) warmHeaders.set(D1_BOOKMARK_HEADER, sourceBookmarks2);
251
+ const warmRequest = new Request(request, { headers: warmHeaders });
252
+ const task = warming.start(warmOptions, warmRequest, response2, identity, warmGroup, eligible, env, context, config.freshnessHeader, credentialGroup ?? void 0);
239
253
  transferred = true;
240
254
  Reflect.apply(wait, context, [task]);
241
255
  } catch {
@@ -275,6 +289,7 @@ function createReadResponseLease(handler, resolve) {
275
289
  };
276
290
  const waitUntil = context && typeof context === "object" ? Reflect.get(context, "waitUntil") : void 0;
277
291
  if (cached) {
292
+ const cachedResponse = cached.response;
278
293
  warming.verify(request);
279
294
  if (warmOptions && warmGroup && !warming.isInternal(request) && typeof waitUntil === "function") {
280
295
  try {
@@ -291,16 +306,29 @@ function createReadResponseLease(handler, resolve) {
291
306
  const headers = new Headers(request.headers);
292
307
  for (const name of ["range", "if-match", "if-unmodified-since", "if-range", "if-none-match", "if-modified-since"]) headers.delete(name);
293
308
  headers.set("cache-control", "no-cache");
309
+ const cachedBookmarks = cachedResponse.headers.get(D1_BOOKMARK_HEADER);
310
+ if (cachedBookmarks) headers.set(D1_BOOKMARK_HEADER, cachedBookmarks);
294
311
  if (config.freshnessHeader !== void 0) headers.set(config.freshnessHeader, "1");
295
312
  const source2 = new Request(request.url, { method: "GET", headers, signal: new AbortController().signal });
296
313
  const lease2 = {};
297
314
  try {
298
- const response2 = await scope.run(lease2, () => handler(source2, env, context));
299
- try {
300
- await fillResponse(response2, lease2, started, () => refresh.valid);
301
- } finally {
302
- void response2.body?.cancel().catch(() => void 0);
303
- }
315
+ await runIsolatedD1Session(source2, async () => {
316
+ const tracked = await trackD1SessionSource(() => runPrimaryD1SessionSource(() => scope.run(lease2, () => handler(source2, env, context))));
317
+ let response2 = tracked.value;
318
+ const bookmarks = responseD1SessionBookmarks(response2.headers, tracked.bookmarks);
319
+ if (bookmarks) {
320
+ const headers2 = new Headers(response2.headers);
321
+ const encoded = serializeD1Bookmarks(bookmarks);
322
+ if (encoded) headers2.set(D1_BOOKMARK_HEADER, encoded);
323
+ varyD1Bookmarks(headers2);
324
+ response2 = new Response(response2.body, { status: response2.status, statusText: response2.statusText, headers: headers2 });
325
+ }
326
+ try {
327
+ await fillResponse(response2, lease2, started, () => refresh.valid);
328
+ } finally {
329
+ void response2.body?.cancel().catch(() => void 0);
330
+ }
331
+ });
304
332
  } catch {
305
333
  }
306
334
  }).finally(() => {
@@ -321,7 +349,16 @@ function createReadResponseLease(handler, resolve) {
321
349
  const lease = {};
322
350
  const source = noCache(request);
323
351
  if (config.freshnessHeader !== void 0) source.headers.set(config.freshnessHeader, "1");
324
- const response = await scope.run(lease, () => serve(source));
352
+ const sourceResult = await trackD1SessionSource(() => runPrimaryD1SessionSource(() => scope.run(lease, () => serve(source))));
353
+ let response = sourceResult.value;
354
+ const sourceBookmarks = responseD1SessionBookmarks(response.headers, sourceResult.bookmarks);
355
+ if (sourceBookmarks) {
356
+ const headers = new Headers(response.headers);
357
+ varyD1Bookmarks(headers);
358
+ const encoded = serializeD1Bookmarks(sourceBookmarks);
359
+ if (encoded) headers.set(D1_BOOKMARK_HEADER, encoded);
360
+ response = new Response(response.body, { status: response.status, statusText: response.statusText, headers });
361
+ }
325
362
  const fill = fillResponse(response, lease, requestStarted, () => true, priorRefresh?.task);
326
363
  try {
327
364
  if (!warming.isInternal(request) && typeof waitUntil === "function") {
@@ -384,5 +421,5 @@ async function forwardReadLease(request, service) {
384
421
  }
385
422
 
386
423
  export { createReadResponseLease, forwardReadLease, limitReadResponseLeaseUntil, wrapReadResponseLease, wrapReadResponseLeaseOrigin };
387
- //# sourceMappingURL=chunk-HGAUU4EU.js.map
388
- //# sourceMappingURL=chunk-HGAUU4EU.js.map
424
+ //# sourceMappingURL=chunk-7OWX6SH5.js.map
425
+ //# sourceMappingURL=chunk-7OWX6SH5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/response-lease.ts"],"names":["response","source","sourceBookmarks","lease","headers"],"mappings":"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","file":"chunk-7OWX6SH5.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 { D1_BOOKMARK_HEADER, decodeD1Bookmarks, serializeD1Bookmarks } from './d1/bookmarks';\nimport { d1SessionBookmarkFloor, advanceD1SessionBookmarks, runIsolatedD1Session, trackD1SessionSource, responseD1SessionBookmarks, varyD1Bookmarks, runPrimaryD1SessionSource } from './d1/session';\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) => runIsolatedD1Session(request, () => 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, D1_BOOKMARK_HEADER.toLowerCase()]);\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 let cached = forceSource ? null : await readLease(key, ttl, permittedVary);\n const bookmarkFloor = d1SessionBookmarkFloor();\n if (cached && bookmarkFloor) {\n const rawBookmarks = cached.response.headers.get(D1_BOOKMARK_HEADER);\n const source = decodeD1Bookmarks(rawBookmarks);\n if (!rawBookmarks || !source || Object.entries(bookmarkFloor).some(([id, floor]) => !source[id] || source[id] < floor)) {\n void cached.response.body?.cancel().catch(() => undefined);\n cached = null;\n } else advanceD1SessionBookmarks(source);\n }\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 warmHeaders = new Headers(request.headers);\n const sourceBookmarks = response.headers.get(D1_BOOKMARK_HEADER);\n if (sourceBookmarks) warmHeaders.set(D1_BOOKMARK_HEADER, sourceBookmarks);\n const warmRequest = new Request(request, { headers:warmHeaders });\n const task = warming.start(warmOptions, warmRequest, 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 const cachedResponse = cached.response;\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 const cachedBookmarks = cachedResponse.headers.get(D1_BOOKMARK_HEADER);\n if (cachedBookmarks) headers.set(D1_BOOKMARK_HEADER, cachedBookmarks);\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 await runIsolatedD1Session(source, async () => {\n const tracked = await trackD1SessionSource(() => runPrimaryD1SessionSource(() => scope.run(lease, () => handler(source, env, context))));\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 try { await fillResponse(response, lease, started, () => refresh.valid); }\n finally { void response.body?.cancel().catch(() => undefined); }\n });\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 sourceResult = await trackD1SessionSource(() => runPrimaryD1SessionSource(() => scope.run(lease, () => serve(source))));\n let response = sourceResult.value;\n const sourceBookmarks = responseD1SessionBookmarks(response.headers, sourceResult.bookmarks);\n if (sourceBookmarks) {\n const headers = new Headers(response.headers);\n varyD1Bookmarks(headers);\n const encoded = serializeD1Bookmarks(sourceBookmarks);\n if (encoded) headers.set(D1_BOOKMARK_HEADER, encoded);\n response = new Response(response.body, { status:response.status, statusText:response.statusText, headers });\n }\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"]}
@@ -246,12 +246,17 @@ function createResponseWarmup(run, canRun = () => true) {
246
246
  internal.set(warm, { generation: current, isCurrent });
247
247
  const task = Promise.resolve().then(() => run(warm, env, context));
248
248
  started = true;
249
- void task.then((response2) => {
249
+ const completion = task.then((response2) => {
250
250
  if (abort.signal.aborted) void response2.body?.cancel().catch(() => void 0);
251
251
  releaseSlot();
252
252
  }, () => {
253
253
  releaseSlot();
254
254
  });
255
+ try {
256
+ const wait = context && typeof context === "object" ? Reflect.get(context, "waitUntil") : void 0;
257
+ if (typeof wait === "function") Reflect.apply(wait, context, [completion]);
258
+ } catch {
259
+ }
255
260
  const result = await Promise.race([task, new Promise((_, reject) => abort.signal.addEventListener("abort", () => reject(Error("warmup deadline")), { once: true }))]);
256
261
  if (verified.has(warm) && result.status === 200 && stillCurrent() && Date.now() < end) await inspect(new URL(target.url), result);
257
262
  void result.body?.cancel().catch(() => void 0);
@@ -307,5 +312,5 @@ function createResponseWarmup(run, canRun = () => true) {
307
312
  }
308
313
 
309
314
  export { createResponseWarmup };
310
- //# sourceMappingURL=chunk-A4WV6RY4.js.map
311
- //# sourceMappingURL=chunk-A4WV6RY4.js.map
315
+ //# sourceMappingURL=chunk-GGSQ6C6X.js.map
316
+ //# sourceMappingURL=chunk-GGSQ6C6X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/response-warmup.ts"],"names":["job","index","response"],"mappings":"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","file":"chunk-GGSQ6C6X.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 const completion = task.then((response) => { if (abort.signal.aborted) void response.body?.cancel().catch(() => undefined); releaseSlot(); }, () => { releaseSlot(); });\n try {\n const wait = context && typeof context === 'object' ? Reflect.get(context, 'waitUntil') : undefined;\n if (typeof wait === 'function') Reflect.apply(wait, context, [completion]);\n } catch { /* Source cleanup remains best effort when the host declines it. */ }\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"]}
@@ -409,14 +409,17 @@ function createCacheExtension(options) {
409
409
  }
410
410
  async function fill(ctx, lockToken, epochs) {
411
411
  let value;
412
+ let cached;
412
413
  try {
413
- value = await ctx.query(ctx.args);
414
+ const loaded = options.sessionCache ? await options.sessionCache.fill(() => ctx.query(ctx.args)) : { value: await ctx.query(ctx.args), cached: void 0 };
415
+ value = loaded.value;
416
+ cached = options.sessionCache ? loaded.cached : value;
414
417
  await hooks?.afterFillQuery?.();
415
418
  } catch (error) {
416
419
  await release(ctx.key, lockToken);
417
420
  throw error;
418
421
  }
419
- const serialized = serialize(value);
422
+ const serialized = serialize(cached);
420
423
  if (serialized === null) {
421
424
  await release(ctx.key, lockToken);
422
425
  return value;
@@ -446,7 +449,8 @@ function createCacheExtension(options) {
446
449
  if (!token) return;
447
450
  if (!options.waitUntil) return release(ctx.key, token);
448
451
  try {
449
- options.waitUntil(fill(ctx, token, response.epochs).catch((error) => report(error, "refresh")));
452
+ const refresh = () => fill(ctx, token, response.epochs).then(() => void 0);
453
+ options.waitUntil((options.sessionCache?.background ? options.sessionCache.background(refresh) : refresh()).catch((error) => report(error, "refresh")));
450
454
  } catch (error) {
451
455
  report(error, "waitUntil");
452
456
  await release(ctx.key, token);
@@ -455,7 +459,7 @@ function createCacheExtension(options) {
455
459
  async function handleRead(model, operation, args, query, dataPath) {
456
460
  let key;
457
461
  try {
458
- const identity = [PLANNER_VERSION, config.cacheVersion, scope, model, operation, dataPath, (options.keyArgs ? options.keyArgs(args) : args) ?? null];
462
+ const identity = [PLANNER_VERSION, config.cacheVersion, scope, ...options.sessionCache ? [options.sessionCache.key()] : [], model, operation, dataPath, (options.keyArgs ? options.keyArgs(args) : args) ?? null];
459
463
  key = `${model}:${await sha256Hex(stableStringify(identity))}`;
460
464
  } catch (error) {
461
465
  report(error, "key");
@@ -475,6 +479,14 @@ function createCacheExtension(options) {
475
479
  let value;
476
480
  try {
477
481
  value = decode(JSON.parse(response.value), options.decimal);
482
+ if (options.sessionCache) {
483
+ const cached = options.sessionCache.read(value);
484
+ if (!cached) {
485
+ if (response.refreshToken) await release(key, response.refreshToken);
486
+ return (await options.sessionCache.fill(() => query(args))).value;
487
+ }
488
+ value = cached.value;
489
+ }
478
490
  } catch (error) {
479
491
  report(error, "decode");
480
492
  if (response.refreshToken) await release(key, response.refreshToken);
@@ -541,5 +553,5 @@ function createCacheExtension(options) {
541
553
  }
542
554
 
543
555
  export { CacheUnavailableError, createCacheExtension, readTargets };
544
- //# sourceMappingURL=chunk-ZREX7LLC.js.map
545
- //# sourceMappingURL=chunk-ZREX7LLC.js.map
556
+ //# sourceMappingURL=chunk-M4UOCIDQ.js.map
557
+ //# sourceMappingURL=chunk-M4UOCIDQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/pk.ts","../src/core/plan.ts","../src/core/shape.ts","../src/core/targets.ts","../src/core/extension.ts"],"names":[],"mappings":";;;;AAEO,SAAS,cAAc,KAAA,EAAkD;AAC9E,EAAA,OAAO,CAAC,CAAC,KAAA,IAAS,OAAO,UAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACrE;AAEO,SAAS,SAAS,KAAA,EAAuC;AAC9D,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,kBAAA,CAAmB,MAAA,CAAO,IAAI,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACvE;AAEA,SAAS,aAAa,KAAA,EAAyB;AAC7C,EAAA,OAAO,cAAc,KAAK,CAAA,IAAK,QAAA,IAAY,KAAA,GAAQ,MAAM,MAAA,GAAS,KAAA;AACpE;AAEA,SAAS,WAAW,KAAA,EAAkC;AACpD,EAAA,OAAO,OAAO,UAAU,QAAA,IAAa,OAAO,UAAU,QAAA,IAAY,MAAA,CAAO,SAAS,KAAK,CAAA;AACzF;AAEO,SAAS,WAAA,CAAY,KAAA,EAAgB,QAAA,EAAoB,YAAA,EAAsC;AACpG,EAAA,IAAI,CAAC,aAAA,CAAc,KAAK,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,MAAM,WAAW,KAAA,CAAM,YAAA,IAAgB,QAAA,CAAS,IAAA,CAAK,GAAG,CAAC,CAAA;AACzD,EAAA,MAAM,SAAS,QAAA,CAAS,MAAA,GAAS,KAAK,aAAA,CAAc,QAAQ,IAAI,QAAA,GAAW,KAAA;AAC3E,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,KAAA,GAAQ,WAAW,KAAA,GAAQ,YAAA,CAAa,MAAM,KAAK,CAAC,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAC1E,IAAA,IAAI,CAAC,UAAA,CAAW,KAAK,CAAA,EAAG,OAAO,IAAA;AAC/B,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EAClB;AACA,EAAA,OAAO,SAAS,KAAK,CAAA;AACvB;AAEO,SAAS,SAAA,CAAU,KAAc,QAAA,EAAmC;AACzE,EAAA,IAAI,CAAC,aAAA,CAAc,GAAG,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAK,CAAA;AACvB,IAAA,IAAI,CAAC,UAAA,CAAW,KAAK,CAAA,EAAG,OAAO,IAAA;AAC/B,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EAClB;AACA,EAAA,OAAO,SAAS,KAAK,CAAA;AACvB;;;ACnCO,IAAM,sBAAA,GAAyB,CAAA;AAC/B,IAAM,2BAAA,GAA8B,GAAA;AAEpC,IAAM,eAAA,mBAAkB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,OAAA,EAAS,WAAA,EAAa,kBAAA,EAAoB,UAAA,EAAY,YAAA,EAAc,mBAAA,EAAqB,SAAS,CAAC,CAAA;AAEjJ,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EACtC,QAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAiBD,IAAM,UAAA,GAAa,CAAC,MAAA,EAA8B,KAAA,KAA4B,OAAO,uBAAA,CAAwB,KAAK,CAAA,IAAK,CAAC,IAAI,CAAA;AAE5H,SAAS,KAAA,CAAM,MAAiB,KAAA,EAA2B;AACzD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AACvC,EAAA,IAAI,UAAU,OAAO,QAAA;AACrB,EAAA,MAAM,UAAsB,EAAE,GAAA,sBAAS,GAAA,EAAI,EAAG,MAAM,KAAA,EAAM;AAC1D,EAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,OAAO,CAAA;AAC/B,EAAA,OAAO,OAAA;AACT;AAEA,IAAM,UAAA,GAAa,CAAC,GAAA,EAAkB,KAAA,KAAwB,KAAK,KAAA,CAAM,GAAA,CAAI,MAAM,KAAK,CAAA;AAExF,IAAM,SAAA,GAAY,CAAC,GAAA,EAAkB,KAAA,KAAwB,MAAM,MAAM,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA,CAAE,IAAA,GAAO,IAAA,CAAA;AAEjG,SAAS,WAAA,CAAY,GAAA,EAAkB,KAAA,EAAe,KAAA,EAAsB;AAC1E,EAAA,MAAM,EAAA,GAAK,WAAA,CAAY,KAAA,EAAO,UAAA,CAAW,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,qBAAA,CAAsB,KAAK,CAAC,CAAA;AACpG,EAAA,IAAI,EAAA,KAAO,IAAA,EAAM,SAAA,CAAU,GAAA,EAAK,KAAK,CAAA;AAAA,aAC1B,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA,CAAE,GAAA,CAAI,IAAI,EAAE,CAAA;AACxC;AAEA,SAAS,gBAAA,CAAiB,QAA8B,KAAA,EAA4B;AAClF,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,KAAA,MAAW,SAAA,IAAa,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,EAAG;AAC3D,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,IAAI,SAAS,WAAA,KAAgB,KAAA,IAAS,QAAA,CAAS,WAAA,CAAY,SAAS,CAAA,EAAG;AACrE,QAAA,KAAA,MAAW,KAAA,IAAS,QAAA,CAAS,aAAA,EAAe,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBAAiB,GAAA,EAAkB,KAAA,EAAe,IAAA,mBAAO,IAAI,KAAY,EAAS;AACzF,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACrB,EAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AACd,EAAA,KAAA,MAAW,CAAC,OAAO,SAAS,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,aAAa,CAAA,EAAG;AACzE,IAAA,MAAM,UAAA,GAAa,SAAA,CAAU,IAAA,CAAK,CAAC,QAAA,KAAa,QAAA,CAAS,WAAA,KAAgB,KAAA,IAAS,QAAA,CAAS,WAAA,CAAY,MAAA,GAAS,CAAC,CAAA;AACjH,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AACpB,IAAA,gBAAA,CAAiB,GAAA,EAAK,OAAO,IAAI,CAAA;AAAA,EACnC;AACF;AAEA,SAAS,4BAAA,CAA6B,GAAA,EAAkB,KAAA,EAAe,IAAA,EAAqB;AAC1F,EAAA,IAAI,CAAC,aAAA,CAAc,IAAI,CAAA,EAAG;AAC1B,EAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA;AACrD,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,KAAK,CAAC,KAAA,KAAU,UAAA,CAAW,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAC3F;AAEA,IAAM,OAAA,GAAU,CAAC,KAAA,KAA+B,KAAA,CAAM,QAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAErF,IAAM,0BAAA,uBAAiC,GAAA,CAAI,CAAC,WAAW,iBAAA,EAAmB,QAAA,EAAU,QAAQ,CAAC,CAAA;AAE7F,IAAM,wBAAA,mBAA2B,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,iBAAA,EAAmB,QAAA,EAAU,QAAA,EAAU,YAAA,EAAc,KAAA,EAAO,QAAQ,CAAC,CAAA;AAE1H,IAAM,QAAA,GAAW,CAAC,MAAA,EAAkB,UAAA,KAAqC,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAU,UAAA,CAAW,GAAA,CAAI,KAAK,CAAC,CAAA;AAErH,SAAS,2BAAA,CAA4B,GAAA,EAAkB,KAAA,EAAe,QAAA,EAA8B;AAClG,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,WAAA,EAAa,gBAAA,CAAiB,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAC,CAAA,EAAG,gBAAA,CAAiB,GAAA,EAAK,KAAK,CAAA;AACpG,EAAA,MAAM,QAAA,GAAA,CAAY,IAAI,MAAA,CAAO,aAAA,CAAc,SAAS,WAAW,CAAA,IAAK,EAAC,EAAG,IAAA;AAAA,IACtE,CAAC,cAAc,SAAA,KAAc,QAAA,IAAY,UAAU,YAAA,KAAiB,MAAA,IAAa,SAAA,CAAU,YAAA,KAAiB,QAAA,CAAS;AAAA,GACvH;AACA,EAAA,IAAI,QAAA,IAAY,QAAA,CAAS,QAAA,CAAS,WAAA,EAAa,gBAAA,CAAiB,IAAI,MAAA,EAAQ,QAAA,CAAS,WAAW,CAAC,CAAA,EAAG;AAClG,IAAA,gBAAA,CAAiB,GAAA,EAAK,SAAS,WAAW,CAAA;AAAA,EAC5C;AACF;AAEA,SAAS,YAAA,CAAa,GAAA,EAAkB,KAAA,EAAe,IAAA,EAAe,KAAA,EAAqB;AACzF,EAAA,IAAI,CAAC,aAAA,CAAc,IAAI,CAAA,EAAG;AAC1B,EAAA,KAAA,MAAW,YAAY,GAAA,CAAI,MAAA,CAAO,cAAc,KAAK,CAAA,IAAK,EAAC,EAAG;AAC5D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AACnC,IAAA,IAAI,CAAC,aAAA,CAAc,GAAG,CAAA,EAAG;AACzB,IAAA,MAAM,SAAS,QAAA,CAAS,WAAA;AACxB,IAAA,IAAI,SAAS,sBAAA,EAAwB;AACnC,MAAA,GAAA,CAAI,KAAK,GAAA,GAAM,IAAA;AACf,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,KAAK,MAAM,CAAA;AACtB,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAmB,YAAA,CAAa,KAAK,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAC,CAAA;AAC9E,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC7C,MAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,MAAA,IAAI,SAAS,QAAA,KAAa,IAAA,IAAQ,0BAAA,CAA2B,GAAA,CAAI,EAAE,CAAA,EAAG;AACpE,QAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AACrB,QAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,MACtB;AACA,MAAA,IAAI,yBAAyB,GAAA,CAAI,EAAE,GAAG,2BAAA,CAA4B,GAAA,EAAK,OAAO,QAAQ,CAAA;AACtF,MAAA,QAAQ,EAAA;AAAI,QACV,KAAK,QAAA;AACH,UAAA,KAAA,CAAM,QAAQ,OAAO,CAAA;AACrB,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,KAAA,CAAM,QAAQ,CAAC,IAAA,KAAS,YAAY,GAAA,EAAK,MAAA,EAAQ,IAAI,CAAC,CAAA;AACtD,UAAA;AAAA,QACF,KAAK,iBAAA;AACH,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,YAAA,WAAA,CAAY,KAAK,MAAA,EAAQ,aAAA,CAAc,IAAI,CAAA,GAAI,IAAA,CAAK,QAAQ,MAAS,CAAA;AACrE,YAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,UAC9C;AACA,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAU,aAAA,CAAc,IAAI,CAAA,GAAI,WAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,IAAI,CAAA,GAAI,SAAA,CAAU,GAAA,EAAK,MAAM,CAAE,CAAA;AACvG,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAU,aAAA,CAAc,IAAI,CAAA,GAAI,WAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,IAAI,CAAA,GAAI,SAAA,CAAU,GAAA,EAAK,MAAM,CAAE,CAAA;AACvG,UAAA,gBAAA,CAAiB,KAAK,MAAM,CAAA;AAC5B,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AACrB,UAAA,gBAAA,CAAiB,KAAK,MAAM,CAAA;AAC5B,UAAA;AAAA,QACF,KAAK,QAAA;AAAA,QACL,KAAK,QAAA;AACH,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,YAAA,MAAM,QAAA,GAAW,aAAA,CAAc,IAAI,CAAA,IAAK,OAAA,IAAW,IAAA;AACnD,YAAA,IAAI,QAAA,EAAU,WAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,KAAK,KAAK,CAAA;AAAA,iBAC5C,SAAA,CAAU,KAAK,MAAM,CAAA;AAC1B,YAAA,MAAM,QAAA,GAAW,aAAA,CAAc,IAAI,CAAA,GAAI,CAAC,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,KAAK,MAAA,EAAQ,QAAA,GAAW,MAAA,GAAY,IAAI,IAAI,EAAC;AAC7G,YAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,cAAA,4BAAA,CAA6B,GAAA,EAAK,QAAQ,OAAO,CAAA;AACjD,cAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,YACjB;AAAA,UACF;AACA,UAAA;AAAA,QACF;AACE,UAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AACrB,UAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,IAAI,aAAA,CAAc,IAAI,GAAG,4BAAA,CAA6B,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAAA;AAC1G,IACF;AAAA,EACF;AACF;AAEO,SAAS,SAAA,CAAU,MAAA,EAA8B,KAAA,EAAe,SAAA,EAAmB,IAAA,EAA0B;AAClH,EAAA,MAAM,GAAA,GAAmB,EAAE,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAA,EAAK,KAAA,EAAO,OAAA,kBAAS,IAAI,GAAA,EAAI,EAAE,EAAE;AAC5E,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,IAAI,CAAA,GAAI,OAAO,EAAC;AAC5C,EAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AACrB,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,QAAA;AACH,MAAA,YAAA,CAAa,GAAA,EAAK,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,CAAC,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,YAAA;AAAA,IACL,KAAK,qBAAA;AACH,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,WAAA,CAAY,GAAA,EAAK,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA;AACnC,MAAA,4BAAA,CAA6B,GAAA,EAAK,KAAA,EAAO,KAAA,CAAM,IAAI,CAAA;AACnD,MAAA,YAAA,CAAa,GAAA,EAAK,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,CAAC,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,WAAA,CAAY,GAAA,EAAK,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA;AACnC,MAAA,4BAAA,CAA6B,GAAA,EAAK,KAAA,EAAO,KAAA,CAAM,MAAM,CAAA;AACrD,MAAA,YAAA,CAAa,GAAA,EAAK,KAAA,EAAO,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AACxC,MAAA,YAAA,CAAa,GAAA,EAAK,KAAA,EAAO,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AACxC,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,WAAA,CAAY,GAAA,EAAK,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA;AACnC,MAAA,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAC3B,MAAA;AAAA,IACF,KAAK,YAAA;AACH,MAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AACpB,MAAA,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAC3B,MAAA;AAAA,IACF;AACE,MAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AACpB,MAAA,4BAAA,CAA6B,GAAA,EAAK,KAAA,EAAO,KAAA,CAAM,IAAI,CAAA;AAAA;AAEvD,EAAA,OAAO,GAAA,CAAI,IAAA;AACb;AAEO,SAAS,WAAW,IAAA,EAA2B;AACpD,EAAA,IAAI,IAAA,CAAK,GAAA,EAAK,OAAO,CAAC,YAAY,CAAA;AAClC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,CAAC,OAAO,EAAE,GAAA,EAAK,MAAM,CAAA,IAAK,KAAK,OAAA,EAAS;AACjD,IAAA,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAC7B,IAAA,IAAI,IAAA,IAAQ,IAAI,IAAA,GAAO,2BAAA,SAAoC,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,SAC5E,KAAA,MAAW,MAAM,GAAA,EAAK,MAAA,CAAO,KAAK,WAAA,CAAY,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,kBAAA,CAAmB,QAA8B,MAAA,EAAsC;AACrG,EAAA,IAAI,KAAA,IAAS,MAAA,EAAQ,OAAO,CAAC,YAAY,CAAA;AACzC,EAAA,MAAM,GAAA,GAAmB,EAAE,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAA,EAAK,KAAA,EAAO,OAAA,kBAAS,IAAI,GAAA,EAAI,EAAE,EAAE;AAC5E,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,MAAA,CAAO,UAAU,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,QAAA,IAAY,MAAA,GAAS,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAC,EAAE,KAAA,EAAM,KAAM,KAAK,CAAA;AAC5F,EAAA,MAAM,OAAA,GAAU,OAAO,MAAA,CAAO,CAAC,UAAU,CAAC,KAAA,CAAM,GAAA,CAAI,KAAK,CAAC,CAAA;AAC1D,EAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,MAAM,IAAI,SAAA,CAAU,CAAA,mCAAA,EAAsC,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACtG,EAAA,IAAI,QAAA,IAAY,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU,SAAA,CAAU,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,OACzE;AACH,IAAA,KAAA,MAAW,EAAE,KAAA,EAAO,EAAA,EAAG,IAAK,OAAO,QAAA,EAAU;AAC3C,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAA;AACvC,MAAA,MAAM,OAAA,GAAU,GAAG,MAAA,KAAW,MAAA,CAAO,SAAS,SAAA,CAAU,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,CAAA,KAAM,CAAC,OAAO,EAAA,CAAG,CAAC,CAAC,CAAC,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,IAAA;AAChI,MAAA,IAAI,OAAA,KAAY,IAAA,EAAM,SAAA,CAAU,GAAA,EAAK,KAAK,CAAA;AAAA,iBAC/B,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA,CAAE,GAAA,CAAI,IAAI,OAAO,CAAA;AAAA,IAC7C;AAAA,EACF;AACA,EAAA,MAAA,CAAO,QAAQ,CAAC,KAAA,KAAU,gBAAA,CAAiB,GAAA,EAAK,KAAK,CAAC,CAAA;AACtD,EAAA,OAAO,UAAA,CAAW,IAAI,IAAI,CAAA;AAC5B;;;ACxOO,IAAM,gBAA+B,EAAE,eAAA,EAAiB,MAAM,kBAAA,EAAoB,GAAA,EAAK,cAAc,GAAA,EAAI;AAEhH,SAAS,QAAA,CAAS,OAAe,KAAA,EAAqC;AACpE,EAAA,IAAI,CAAC,KAAA,EAAO;AACZ,EAAA,KAAA,MAAW,KAAA,IAAS,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,EAAY;AACtE,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAK,CAAA;AACzB,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,EAAE,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,GAAQ,CAAA,IAAK,KAAA,IAAS,qBAAA,CAAA,EAAwB;AACnG,MAAA,MAAM,IAAI,UAAU,CAAA,YAAA,EAAe,KAAK,KAAK,KAAK,CAAA,gBAAA,EAAmB,qBAAqB,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/F;AAAA,EACF;AACA,EAAA,MAAM,QAAQ,KAAA,CAAM,YAAA;AACpB,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,EAAE,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,GAAQ,CAAA,IAAK,KAAA,IAAS,CAAA,CAAA,EAAI;AAC/E,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,YAAA,EAAe,KAAK,CAAA,gCAAA,CAAkC,CAAA;AAAA,EAC5E;AACF;AAEO,SAAS,eAAe,KAAA,EAA6C;AAC1E,EAAA,QAAA,CAAS,SAAA,EAAW,OAAO,OAAO,CAAA;AAClC,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,EAAO,OAAA,IAAW,EAAE,CAAA,EAAG,QAAA,CAAS,CAAA,QAAA,EAAW,KAAK,IAAI,KAAK,CAAA;AACvG;AAEO,SAAS,YAAA,CAAa,OAAuC,KAAA,EAA8B;AAChG,EAAA,MAAM,IAAA,GAAO,CAAgC,KAAA,KAC3C,KAAA,EAAO,UAAU,KAAK,CAAA,GAAI,KAAK,CAAA,IAAK,KAAA,EAAO,OAAA,GAAU,KAAK,CAAA,IAAK,cAAc,KAAK,CAAA;AACpF,EAAA,OAAO,EAAE,eAAA,EAAiB,IAAA,CAAK,iBAAiB,CAAA,EAAG,kBAAA,EAAoB,IAAA,CAAK,oBAAoB,CAAA,EAAG,YAAA,EAAc,IAAA,CAAK,cAAc,CAAA,EAAE;AACxI;;;ACzBO,IAAM,kBAAA,GAAqB,EAAA;AAElC,IAAM,uBAAuB,CAAC,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,MAAM,OAAO,CAAA;AACpE,IAAM,+BAAe,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,IAAA,EAAM,KAAK,CAAC,CAAA;AAcjD,SAAS,WAAA,CAAY,OAAc,KAAA,EAA0C;AAC3E,EAAA,OAAO,IAAI,GAAA,CAAA,CAAK,KAAA,CAAM,KAAK,KAAK,EAAC,EAAG,GAAA,CAAI,CAAC,aAAa,CAAC,QAAA,CAAS,SAAA,EAAW,QAAQ,CAAC,CAAC,CAAA;AACvF;AAEA,SAAS,KAAA,CAAM,MAAY,QAAA,EAA8B;AACvD,EAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA;AACxC,EAAA,IAAA,CAAK,IAAI,UAAA,GAAa,IAAA;AACxB;AAEA,SAAS,UAAA,CAAW,IAAA,EAAY,KAAA,EAAe,KAAA,EAAgB,KAAA,EAAwB;AACrF,EAAA,IAAI,KAAA,GAAQ,oBAAoB,OAAO,KAAA;AACvC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,SAAU,KAAA,CAAM,KAAA,CAAM,CAAC,IAAA,KAAS,WAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AAC/F,EAAA,IAAI,CAAC,aAAA,CAAc,KAAK,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAC/C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACjD,IAAA,IAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,MAAA,IAAI,CAAC,WAAW,IAAA,EAAM,KAAA,EAAO,QAAQ,KAAA,GAAQ,CAAC,GAAG,OAAO,KAAA;AACxD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,KAAA,CAAM,MAAM,QAAQ,CAAA;AACpB,IAAA,IAAI,CAAC,aAAA,CAAc,MAAM,CAAA,EAAG;AAC5B,IAAA,MAAM,UAAU,oBAAA,CAAqB,MAAA,CAAO,CAAC,OAAA,KAAY,WAAW,MAAM,CAAA;AAC1E,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,OAAA,KAAY,MAAA,CAAO,OAAO,CAAC,CAAA,GAAI,CAAC,MAAM,CAAA;AACtF,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,CAAC,SAAS,UAAA,CAAW,IAAA,EAAM,QAAA,CAAS,WAAA,EAAa,IAAA,EAAM,KAAA,GAAQ,CAAC,CAAC,GAAG,OAAO,KAAA;AAAA,EAC9F;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,SAAA,CAAU,IAAA,EAAY,KAAA,EAAe,KAAA,EAAgB,KAAA,EAAwB;AACpF,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,IAAA;AAChC,EAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA,IAAK,cAAc,KAAA,CAAM,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,IAAA;AACpF,EAAA,KAAA,MAAW,YAAY,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,IAAK,EAAC,EAAG;AAC9C,IAAA,MAAM,QAAA,GAAW,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,GAAI,KAAA;AACvD,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,KAAA,CAAM,MAAM,QAAQ,CAAA;AACpB,IAAA,IAAI,aAAA,CAAc,QAAQ,CAAA,IAAK,CAAC,UAAA,CAAW,IAAA,EAAM,QAAA,CAAS,WAAA,EAAa,QAAA,CAAS,KAAA,EAAO,KAAA,GAAQ,CAAC,GAAG,OAAO,KAAA;AAAA,EAC5G;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,QAAA,CAAS,IAAA,EAAY,KAAA,EAAe,IAAA,EAAe,KAAA,EAAwB;AAClF,EAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AACzB,EAAA,IAAI,CAAC,aAAA,CAAc,IAAI,CAAA,EAAG,OAAO,IAAA;AACjC,EAAA,KAAA,MAAW,MAAA,IAAU,CAAC,IAAA,CAAK,KAAA,EAAO,KAAK,OAAA,EAAS,IAAA,CAAK,MAAM,CAAA,EAAG;AAC5D,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAM,OAAO,MAAA,EAAQ,KAAK,GAAG,OAAO,KAAA;AAAA,EACtD;AACA,EAAA,KAAA,MAAW,cAAc,CAAC,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,MAAM,CAAA,EAAG;AACpD,IAAA,IAAI,CAAC,aAAA,CAAc,UAAU,CAAA,EAAG;AAChC,IAAA,IAAI,CAAC,UAAU,IAAA,EAAM,KAAA,EAAO,WAAW,MAAA,EAAQ,KAAK,GAAG,OAAO,KAAA;AAC9D,IAAA,KAAA,MAAW,YAAY,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,IAAK,EAAC,EAAG;AAC9C,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA;AAC5C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,KAAA,CAAM,MAAM,QAAQ,CAAA;AACpB,MAAA,IAAI,CAAC,SAAS,IAAA,EAAM,QAAA,CAAS,aAAa,MAAA,EAAQ,KAAA,GAAQ,CAAC,CAAA,EAAG,OAAO,KAAA;AAAA,IACvE;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,WAAA,CAAY,KAAA,EAAc,KAAA,EAAe,IAAA,EAAmC;AAC1F,EAAA,MAAM,IAAA,GAAa,EAAE,KAAA,EAAO,GAAA,EAAK,EAAE,MAAA,kBAAQ,IAAI,GAAA,EAAI,EAAG,UAAA,EAAY,KAAA,EAAM,EAAE;AAC1E,EAAA,OAAO,SAAS,IAAA,EAAM,KAAA,EAAO,MAAM,CAAC,CAAA,GAAI,KAAK,GAAA,GAAM,IAAA;AACrD;;;ACnEO,IAAM,qBAAA,GAAN,cAAoC,KAAA,CAAM;AAAA,EAC/C,YAAY,KAAA,EAAgB;AAC1B,IAAA,KAAA,CAAM,2DAAA,EAA6D,EAAE,KAAA,EAAO,CAAA;AAC5E,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,EACd;AACF;AAEO,IAAM,8BAA8B,CAAC,EAAA,EAAI,IAAI,EAAA,EAAI,GAAA,EAAK,KAAK,GAAG,CAAA;AAC9D,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,uBAAA,GAA0B,IAAA;AAsBvC,IAAM,KAAA,GAAQ,CAAC,EAAA,KAA8B,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAE7F,IAAM,aAAa,CAAC,MAAA,EAAgC,MAAA,KAClD,MAAA,CAAO,YAAY,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,CAAC,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,IAAK,CAAC,CAAC,CAAC,CAAA;AAEvE,IAAM,UAAA,GAAa,CAAC,KAAA,KAA4B,KAAA,KAAU,IAAA,IAAS,MAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,MAAA,KAAW,CAAA;AAE5G,IAAM,GAAA,GAAM,CAAC,MAAA,KAA6B,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,EAAO,KAAA,KAAU,KAAA,GAAQ,KAAA,EAAO,CAAC,CAAA;AAE1F,SAAS,eAAe,MAAA,EAAoE;AAC1F,EAAA,MAAM,WAAW,aAAA,CAAc,MAAA,CAAO,gBAAgB,CAAA,GAAI,MAAA,CAAO,mBAAmB,EAAC;AACrF,EAAA,MAAM,cAAc,QAAA,CAAS,WAAA;AAC7B,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,MAAM,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,GAAI,QAAA,CAAS,WAAW,EAAC;AAAA,IAClE,OAAA,EAAS,aAAA,CAAc,WAAW,CAAA,IAAK,YAAY,IAAA,KAAS;AAAA,GAC9D;AACF;AAEA,SAAS,gBAAgB,OAAA,EAAsC;AAC7D,EAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,YAAA,KAAiB,aAAA,EAAe;AACjD,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,4CAA4C,MAAA,CAAO,OAAA,CAAQ,OAAO,YAAY,CAAC,mBAAmB,aAAa,CAAA,qBAAA;AAAA,KACjH;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,EAA2B,GAAA,KAAgB,KAAA,KAAU,MAAA,IAAc,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,GAAQ,CAAA,IAAK,KAAA,IAAS,GAAA;AACpI,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,CAAC,OAAA,CAAQ,OAAA,CAAQ,QAAQ,WAAW,CAAA,IAAK,yBAAyB,WAAW,CAAA,CAAA,CAAA;AAAA,IAC7E,CAAC,OAAA,CAAQ,OAAA,CAAQ,SAAS,YAAY,CAAA,IAAK,0BAA0B,YAAY,CAAA,CAAA,CAAA;AAAA,IACjF,CAAC,OAAA,CAAQ,OAAA,CAAQ,eAAe,eAAe,CAAA,IAAK,gCAAgC,eAAe,CAAA,CAAA,CAAA;AAAA,IACnG,OAAA,CAAQ,gBAAA,EAAkB,IAAA,CAAK,CAAC,KAAA,KAAU,EAAE,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,IAAS,CAAA,CAAE,CAAA,IAAK,uCAAA;AAAA,IACtF,OAAA,CAAQ,aAAA,EAAe,IAAA,CAAK,CAAC,KAAA,KAAU,CAAC,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,KAAK,CAAC,CAAA,IAAK,sCAAA;AAAA,IACtF,OAAA,CAAQ,MAAA,CAAO,gBAAA,IACb,CAAC,QAAQ,OAAA,IACT,iFAAA;AAAA,IACF,OAAA,CAAQ,UAAA,KAAe,MAAA,IACrB,EAAE,OAAA,CAAQ,UAAA,CAAW,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,MAAA,IAAU,qBAAA,CAAA,IAChE,yBAAyB,qBAAqB,CAAA,WAAA,CAAA;AAAA,IAChD,OAAA,CAAQ,sBAAA,KAA2B,MAAA,IACjC,EAAE,OAAA,CAAQ,sBAAA,CAAuB,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,sBAAA,CAAuB,MAAA,IAAU,qBAAA,CAAA,IACxF,qCAAqC,qBAAqB,CAAA,WAAA;AAAA,IAC5D,MAAA,CAAO,CAAC,OAAA,KAA+B,OAAO,YAAY,QAAQ,CAAA;AACpE,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,MAAM,IAAI,SAAA,CAAU,CAAA,iBAAA,EAAoB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACtF,EAAA,cAAA,CAAe,QAAQ,KAAK,CAAA;AAC9B;AAEO,SAAS,qBAAqB,OAAA,EAAgC;AACnE,EAAA,eAAA,CAAgB,OAAO,CAAA;AACvB,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,eAAA,EAAiB,OAAM,GAAI,OAAA;AAClD,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,IAAA;AACnC,EAAA,MAAM,WAAW,IAAI,GAAA,CAAI,OAAA,CAAQ,aAAA,IAAiB,EAAE,CAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAC/B,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,sBAAA,IAA0B,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,MAAA,CAAO,YAAY,CAAA,CAAA,EAAI,OAAA,CAAQ,UAAA,IAAc,EAAE,CAAA,CAAA;AAC1H,EAAA,MAAM,UAAA,GAAa,QAAQ,gBAAA,IAAoB,2BAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,eAAA;AACjC,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AACnC,EAAA,MAAM,aAAA,GAAgB,QAAQ,aAAA,IAAiB,uBAAA;AAC/C,EAAA,MAAM,SAAS,CAAC,KAAA,EAAgB,YAA0B,OAAA,CAAQ,OAAA,GAAU,OAAO,OAAO,CAAA;AAE1F,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KACnB,OAAA,IAAW,MAAA,CAAO,gBAAA,CAAiB,KAAK,CAAA,KAAM,IAAA,IAAQ,CAAC,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AAE3E,EAAA,SAAS,WAAA,CAAY,KAAA,EAAe,SAAA,EAAmB,IAAA,EAAe,OAAc,GAAA,EAAiC;AACnH,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,MAAA,CAAO,aAAA,EAAe,OAAO,IAAI,CAAA;AAC7D,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,GAAG,QAAQ,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,WAAW,CAAC,WAAA,CAAY,MAAM,CAAC,GAAG,OAAO,IAAA;AACnF,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,UAAA,CAAW,YAAY,CAAA,GAC5C,WAAA;AAAA,MACE,aAAA,CAAc,IAAI,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,MAAA;AAAA,MACnC,MAAA,CAAO,uBAAA,CAAwB,KAAK,CAAA,IAAK,CAAC,IAAI,CAAA;AAAA,MAC9C,MAAA,CAAO,sBAAsB,KAAK;AAAA,KACpC,GACA,IAAA;AACJ,IAAA,MAAM,IAAA,GAAO,CAAC,YAAA,EAAc,UAAA,CAAW,KAAK,CAAC,CAAA;AAC7C,IAAA,MAAM,SAAS,MAAA,KAAW,IAAA,GAAO,IAAA,GAAO,WAAA,CAAY,OAAO,MAAM,CAAA;AACjE,IAAA,MAAM,SAAS,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,OAAA,CAAQ,MAAM,EAAE,GAAA,CAAI,UAAU,GAAG,GAAI,MAAA,GAAS,CAAC,MAAM,CAAA,GAAI,EAAG,CAAA;AAC5F,IAAA,MAAM,YAAA,GAAe,UAAU,CAAC,OAAA,CAAQ,aAAa,CAAC,GAAG,IAAA,EAAM,MAAM,CAAA,GAAI,IAAA;AACzE,IAAA,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,QAAQ,GAAA,EAAK,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,EACpE;AAEA,EAAA,MAAM,UAAU,CAAC,GAAA,EAAa,SAAA,KAC5B,KAAA,CAAM,QAAQ,EAAE,GAAA,EAAK,SAAA,EAAW,EAAE,KAAA,CAAM,CAAC,UAAU,MAAA,CAAO,KAAA,EAAO,SAAS,CAAC,CAAA;AAE7E,EAAA,SAAS,UAAU,KAAA,EAA+B;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAC/C,MAAA,IAAI,IAAI,aAAY,CAAE,MAAA,CAAO,UAAU,CAAA,CAAE,UAAA,IAAc,eAAe,OAAO,UAAA;AAC7E,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,aAAa,CAAA,MAAA,CAAQ,GAAG,WAAW,CAAA;AAAA,IAC7E,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,OAAO,WAAW,CAAA;AAAA,IAC3B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,eAAe,IAAA,CAAK,GAAA,EAAkB,SAAA,EAAmB,MAAA,EAAkD;AACzG,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,QAAQ,YAAA,GAAe,MAAM,QAAQ,YAAA,CAAa,IAAA,CAAK,MAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,IAAI,CAAC,CAAA,GAAI,EAAE,KAAA,EAAM,MAAM,GAAA,CAAI,MAAM,GAAA,CAAI,IAAI,CAAA,EAAG,MAAA,EAAO,KAAA,CAAA,EAAU;AACvJ,MAAA,KAAA,GAAQ,MAAA,CAAO,KAAA;AACf,MAAA,MAAA,GAAS,OAAA,CAAQ,YAAA,GAAe,MAAA,CAAO,MAAA,GAAS,KAAA;AAChD,MAAA,MAAM,OAAO,cAAA,IAAiB;AAAA,IAChC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,SAAS,CAAA;AAChC,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,MAAM,UAAA,GAAa,UAAU,MAAM,CAAA;AACnC,IAAA,IAAI,eAAe,IAAA,EAAM;AACvB,MAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,SAAS,CAAA;AAChC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,IAAI,KAAK,CAAA;AACnD,IAAA,MAAM,OAAA,GAAU,IAAI,SAAA,KAAc,OAAA,IAAW,WAAW,KAAK,CAAA,GAAI,KAAA,CAAM,kBAAA,GAAqB,KAAA,CAAM,eAAA;AAClG,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,OAAA,GAAU,OAAQ,CAAA,GAAI,IAAA,CAAK,MAAA,EAAO,GAAI,gBAAA,CAAiB,CAAA;AAChF,IAAA,MAAM,cAAA,GAAiB,IAAI,YAAA,IAAgB,aAAA,CAAc,KAAK,CAAA,GAAI,GAAA,CAAI,eAAe,GAAA,CAAI,MAAA;AACzF,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,KAAA,CAAM;AAAA,QAC/B,KAAK,GAAA,CAAI,GAAA;AAAA,QACT,SAAA;AAAA,QACA,QAAA,EAAU,UAAA,CAAW,MAAA,EAAQ,cAAc,CAAA;AAAA,QAC3C,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,MAAM,YAAY,CAAA;AAAA,QAChD,KAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA,EAAG,OAAO,CAAA;AAAA,IACrF,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AACrB,MAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,SAAS,CAAA;AAAA,IAClC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,eAAe,eAAA,CAAgB,KAAkB,QAAA,EAAiE;AAChH,IAAA,MAAM,QAAQ,QAAA,CAAS,YAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,SAAkB,OAAA,CAAQ,GAAA,CAAI,KAAK,KAAK,CAAA;AACrD,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,SAAS,MAAM,CAAA,CAAE,IAAA,CAAK,MAAM,KAAA,CAAS,CAAA;AAC5E,MAAA,OAAA,CAAQ,WAAW,OAAA,CAAQ,YAAA,EAAc,aAAa,OAAA,CAAQ,YAAA,CAAa,WAAW,OAAO,CAAA,GAAI,OAAA,EAAQ,EAAG,MAAM,CAAC,KAAA,KAAU,OAAO,KAAA,EAAO,SAAS,CAAC,CAAC,CAAA;AAAA,IACxJ,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,OAAO,WAAW,CAAA;AACzB,MAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,eAAe,UAAA,CAAW,KAAA,EAAe,SAAA,EAAmB,IAAA,EAAe,OAAc,QAAA,EAAuC;AAC9H,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,CAAC,eAAA,EAAiB,MAAA,CAAO,YAAA,EAAc,KAAA,EAAO,GAAI,OAAA,CAAQ,YAAA,GAAe,CAAC,OAAA,CAAQ,YAAA,CAAa,GAAA,EAAK,CAAA,GAAI,EAAC,EAAI,KAAA,EAAO,SAAA,EAAW,QAAA,EAAA,CAAW,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,KAAS,IAAI,CAAA;AAClN,MAAA,GAAA,GAAM,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,MAAM,UAAU,eAAA,CAAgB,QAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,IAC9D,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AACnB,MAAA,OAAO,MAAM,IAAI,CAAA;AAAA,IACnB;AACA,IAAA,MAAM,MAAM,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,OAAO,GAAG,CAAA;AAC1D,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,KAAA,IAAS,OAAA,GAAU,KAAK,OAAA,EAAA,EAAW;AACjC,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,EAAE,QAAQ,GAAA,CAAI,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,QAAQ,OAAA,EAAS,CAAC,CAAC,OAAA,CAAQ,WAAW,CAAA;AAAA,MAC3G,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,OAAO,MAAM,CAAA;AACpB,QAAA,OAAO,MAAM,IAAI,CAAA;AAAA,MACnB;AACA,MAAA,IAAI,QAAA,CAAS,SAAS,KAAA,EAAO;AAC3B,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI;AACF,UAAA,KAAA,GAAQ,OAAO,IAAA,CAAK,KAAA,CAAM,SAAS,KAAK,CAAA,EAAG,QAAQ,OAAO,CAAA;AAC1D,UAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,YAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AAC9C,YAAA,IAAI,CAAC,MAAA,EAAQ;AACX,cAAA,IAAI,SAAS,YAAA,EAAc,MAAM,OAAA,CAAQ,GAAA,EAAK,SAAS,YAAY,CAAA;AACnE,cAAA,OAAA,CAAQ,MAAM,QAAQ,YAAA,CAAa,IAAA,CAAK,MAAM,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG,KAAA;AAAA,YAC9D;AACA,YAAA,KAAA,GAAQ,MAAA,CAAO,KAAA;AAAA,UACjB;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,OAAO,QAAQ,CAAA;AACtB,UAAA,IAAI,SAAS,YAAA,EAAc,MAAM,OAAA,CAAQ,GAAA,EAAK,SAAS,YAAY,CAAA;AACnE,UAAA,OAAO,MAAM,IAAI,CAAA;AAAA,QACnB;AACA,QAAA,MAAM,eAAA,CAAgB,KAAK,QAAQ,CAAA;AACnC,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAI,QAAA,CAAS,WAAW,OAAO,IAAA,CAAK,KAAK,QAAA,CAAS,SAAA,EAAW,SAAS,MAAM,CAAA;AAC5E,MAAA,MAAM,KAAA,GAAQ,WAAW,OAAO,CAAA;AAChC,MAAA,MAAM,gBAAgB,QAAA,CAAS,aAAA,KAAkB,QAAQ,QAAA,CAAS,aAAA,GAAgB,IAAI,UAAU,CAAA;AAChG,MAAA,IAAI,SAAS,OAAA,IAAW,KAAA,KAAU,UAAa,aAAA,EAAe,OAAO,MAAM,IAAI,CAAA;AAC/E,MAAA,MAAM,MAAM,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,eAAe,SAAA,CAAa,QAAkB,GAAA,EAAmC;AAC/E,IAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,EAAW;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,UAAA,CAAW,EAAE,QAAQ,UAAA,EAAY,OAAA,EAAS,OAAO,CAAA;AAAA,IAC/D,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,OAAO,YAAY,CAAA;AAC1B,MAAA,MAAM,QAAA,CAAS,OAAO,MAAM,CAAA;AAC5B,MAAA,MAAM,IAAI,sBAAsB,KAAK,CAAA;AAAA,IACvC;AACA,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,eAAA,IAAkB;AAC/B,MAAA,OAAO,MAAM,GAAA,EAAI;AAAA,IACnB,CAAA,SAAE;AACA,MAAA,IAAI,CAAC,KAAA,EAAO,YAAA,MAAkB,MAAM,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,eAAe,QAAA,CAAS,OAAe,MAAA,EAAiC;AACtE,IAAA,MAAM,KAAA,CAAM,QAAA,CAAS,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU,MAAA,CAAO,KAAA,EAAO,UAAU,CAAC,CAAA;AAAA,EACpF;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAAyC,kBAAA,CAAmB,QAAQ,MAAM,CAAA;AAEhG,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,MAAM,iBAAiB,MAAA,EAA2C;AAChE,QAAA,MAAM,KAAA,CAAM,UAAA,CAAW,YAAA,CAAa,MAAM,CAAC,CAAA;AAAA,MAC7C,CAAA;AAAA,MACA,MAAM,cAAA,CAAkB,MAAA,EAA4B,GAAA,EAAmC;AACrF,QAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,QAAA,OAAO,OAAA,GAAU,SAAA,CAAU,MAAA,EAAQ,GAAG,IAAI,GAAA,EAAI;AAAA,MAChD;AAAA,KACF;AAAA,IACA,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,UAAA,EAAY;AAAA,QACV,eAAe,MAAA,EAA2C;AACxD,UAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,OAAM,GAAI,MAAA;AAC1C,UAAA,IAAI,CAAC,KAAA,EAAO,OAAO,KAAA,CAAM,IAAI,CAAA;AAC7B,UAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAQ,GAAI,eAAe,MAAM,CAAA;AACnD,UAAA,IAAI,eAAA,CAAgB,IAAI,SAAS,CAAA,IAAK,YAAY,KAAK,CAAA,IAAK,CAAC,OAAA,EAAS;AACpE,YAAA,OAAO,UAAA,CAAW,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,OAAO,QAAQ,CAAA;AAAA,UAC3D;AACA,UAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA,IAAK,OAAA,EAAS;AAC9C,YAAA,OAAO,SAAA,CAAU,UAAA,CAAW,SAAA,CAAU,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,IAAI,CAAC,CAAA,EAAG,MAAM,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,UAC3F;AACA,UAAA,OAAO,MAAM,IAAI,CAAA;AAAA,QACnB;AAAA;AACF;AACF,GACF;AACF","file":"chunk-M4UOCIDQ.js","sourcesContent":["export type PkValue = number | string;\n\nexport function isPlainRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function encodePk(parts: ReadonlyArray<PkValue>): string {\n return parts.map((part) => encodeURIComponent(String(part))).join(\":\");\n}\n\nfunction unwrapEquals(value: unknown): unknown {\n return isPlainRecord(value) && \"equals\" in value ? value.equals : value;\n}\n\nfunction isScalarPk(value: unknown): value is PkValue {\n return typeof value === \"string\" || (typeof value === \"number\" && Number.isFinite(value));\n}\n\nexport function pkFromWhere(where: unknown, pkFields: string[], compoundName?: string): null | string {\n if (!isPlainRecord(where)) return null;\n const compound = where[compoundName ?? pkFields.join(\"_\")];\n const source = pkFields.length > 1 && isPlainRecord(compound) ? compound : where;\n const parts: PkValue[] = [];\n for (const field of pkFields) {\n const value = source === where ? unwrapEquals(where[field]) : source[field];\n if (!isScalarPk(value)) return null;\n parts.push(value);\n }\n return encodePk(parts);\n}\n\nexport function pkFromRow(row: unknown, pkFields: string[]): null | string {\n if (!isPlainRecord(row)) return null;\n const parts: PkValue[] = [];\n for (const field of pkFields) {\n const value = row[field];\n if (!isScalarPk(value)) return null;\n parts.push(value);\n }\n return encodePk(parts);\n}\n","import type { GeneratedCacheConfig, InvalidationTarget, RelationInfo } from \"./types\";\n\nimport { entityFence, GLOBAL_FENCE, modelFence, writeFence } from \"./fences\";\nimport { isPlainRecord, pkFromRow, pkFromWhere } from \"./pk\";\n\nexport const MAX_NESTED_WRITE_DEPTH = 5;\nexport const MAX_ENTITY_FENCES_PER_MODEL = 100;\n\nexport const READ_OPERATIONS = new Set([\"aggregate\", \"count\", \"findFirst\", \"findFirstOrThrow\", \"findMany\", \"findUnique\", \"findUniqueOrThrow\", \"groupBy\"]);\n\nexport const WRITE_OPERATIONS = new Set([\n \"create\",\n \"createMany\",\n \"createManyAndReturn\",\n \"delete\",\n \"deleteMany\",\n \"update\",\n \"updateMany\",\n \"updateManyAndReturn\",\n \"upsert\",\n]);\n\ninterface ModelTouch {\n pks: Set<string>;\n wide: boolean;\n}\n\nexport interface WritePlan {\n all: boolean;\n touched: Map<string, ModelTouch>;\n}\n\ninterface PlanContext {\n config: GeneratedCacheConfig;\n plan: WritePlan;\n}\n\nconst pkFieldsOf = (config: GeneratedCacheConfig, model: string): string[] => config.primaryKeyFieldsByModel[model] ?? [\"id\"];\n\nfunction touch(plan: WritePlan, model: string): ModelTouch {\n const existing = plan.touched.get(model);\n if (existing) return existing;\n const created: ModelTouch = { pks: new Set(), wide: false };\n plan.touched.set(model, created);\n return created;\n}\n\nconst touchWrite = (ctx: PlanContext, model: string): void => void touch(ctx.plan, model);\n\nconst touchWide = (ctx: PlanContext, model: string): void => void (touch(ctx.plan, model).wide = true);\n\nfunction touchEntity(ctx: PlanContext, model: string, where: unknown): void {\n const pk = pkFromWhere(where, pkFieldsOf(ctx.config, model), ctx.config.primaryKeyNameByModel[model]);\n if (pk === null) touchWide(ctx, model);\n else touch(ctx.plan, model).pks.add(pk);\n}\n\nfunction referencedFields(config: GeneratedCacheConfig, model: string): Set<string> {\n const fields = new Set<string>();\n for (const relations of Object.values(config.relationGraph)) {\n for (const relation of relations) {\n if (relation.targetModel === model && relation.localFields.length > 0) {\n for (const field of relation.foreignFields) fields.add(field);\n }\n }\n }\n return fields;\n}\n\nfunction touchReferencing(ctx: PlanContext, model: string, seen = new Set<string>()): void {\n if (seen.has(model)) return;\n seen.add(model);\n for (const [owner, relations] of Object.entries(ctx.config.relationGraph)) {\n const references = relations.some((relation) => relation.targetModel === model && relation.localFields.length > 0);\n if (!references) continue;\n touchWide(ctx, owner);\n touchReferencing(ctx, owner, seen);\n }\n}\n\nfunction touchReferencingIfKeyChanges(ctx: PlanContext, model: string, data: unknown): void {\n if (!isPlainRecord(data)) return;\n const referenced = referencedFields(ctx.config, model);\n if (Object.keys(data).some((field) => referenced.has(field))) touchReferencing(ctx, model);\n}\n\nconst asItems = (value: unknown): unknown[] => (Array.isArray(value) ? value : [value]);\n\nconst ONE_TO_ONE_REPARENTING_OPS = new Set([\"connect\", \"connectOrCreate\", \"create\", \"upsert\"]);\n\nconst FOREIGN_KEY_CHANGING_OPS = new Set([\"connect\", \"connectOrCreate\", \"create\", \"delete\", \"disconnect\", \"set\", \"upsert\"]);\n\nconst overlaps = (fields: string[], referenced: Set<string>): boolean => fields.some((field) => referenced.has(field));\n\nfunction widenIfForeignKeyReferenced(ctx: PlanContext, model: string, relation: RelationInfo): void {\n if (overlaps(relation.localFields, referencedFields(ctx.config, model))) touchReferencing(ctx, model);\n const opposite = (ctx.config.relationGraph[relation.targetModel] ?? []).find(\n (candidate) => candidate !== relation && candidate.relationName !== undefined && candidate.relationName === relation.relationName,\n );\n if (opposite && overlaps(opposite.localFields, referencedFields(ctx.config, relation.targetModel))) {\n touchReferencing(ctx, relation.targetModel);\n }\n}\n\nfunction nestedWrites(ctx: PlanContext, model: string, data: unknown, depth: number): void {\n if (!isPlainRecord(data)) return;\n for (const relation of ctx.config.relationGraph[model] ?? []) {\n const ops = data[relation.fieldName];\n if (!isPlainRecord(ops)) continue;\n const target = relation.targetModel;\n if (depth >= MAX_NESTED_WRITE_DEPTH) {\n ctx.plan.all = true;\n return;\n }\n touchWrite(ctx, target);\n const recurse = (value: unknown) => nestedWrites(ctx, target, value, depth + 1);\n for (const [op, value] of Object.entries(ops)) {\n const items = asItems(value);\n if (relation.oneToOne === true && ONE_TO_ONE_REPARENTING_OPS.has(op)) {\n touchWide(ctx, target);\n touchWide(ctx, model);\n }\n if (FOREIGN_KEY_CHANGING_OPS.has(op)) widenIfForeignKeyReferenced(ctx, model, relation);\n switch (op) {\n case \"create\":\n items.forEach(recurse);\n break;\n case \"createMany\":\n break;\n case \"connect\":\n items.forEach((item) => touchEntity(ctx, target, item));\n break;\n case \"connectOrCreate\":\n for (const item of items) {\n touchEntity(ctx, target, isPlainRecord(item) ? item.where : undefined);\n if (isPlainRecord(item)) recurse(item.create);\n }\n break;\n case \"disconnect\":\n items.forEach((item) => (isPlainRecord(item) ? touchEntity(ctx, target, item) : touchWide(ctx, target)));\n break;\n case \"delete\":\n items.forEach((item) => (isPlainRecord(item) ? touchEntity(ctx, target, item) : touchWide(ctx, target)));\n touchReferencing(ctx, target);\n break;\n case \"deleteMany\":\n touchWide(ctx, target);\n touchReferencing(ctx, target);\n break;\n case \"update\":\n case \"upsert\":\n for (const item of items) {\n const hasWhere = isPlainRecord(item) && \"where\" in item;\n if (hasWhere) touchEntity(ctx, target, item.where);\n else touchWide(ctx, target);\n const payloads = isPlainRecord(item) ? [item.data, item.create, item.update, hasWhere ? undefined : item] : [];\n for (const payload of payloads) {\n touchReferencingIfKeyChanges(ctx, target, payload);\n recurse(payload);\n }\n }\n break;\n default:\n touchWide(ctx, target);\n for (const item of items) if (isPlainRecord(item)) touchReferencingIfKeyChanges(ctx, target, item.data);\n }\n }\n }\n}\n\nexport function planWrite(config: GeneratedCacheConfig, model: string, operation: string, args: unknown): WritePlan {\n const ctx: PlanContext = { config, plan: { all: false, touched: new Map() } };\n const input = isPlainRecord(args) ? args : {};\n touchWrite(ctx, model);\n switch (operation) {\n case \"create\":\n nestedWrites(ctx, model, input.data, 0);\n break;\n case \"createMany\":\n case \"createManyAndReturn\":\n break;\n case \"update\":\n touchEntity(ctx, model, input.where);\n touchReferencingIfKeyChanges(ctx, model, input.data);\n nestedWrites(ctx, model, input.data, 0);\n break;\n case \"upsert\":\n touchEntity(ctx, model, input.where);\n touchReferencingIfKeyChanges(ctx, model, input.update);\n nestedWrites(ctx, model, input.create, 0);\n nestedWrites(ctx, model, input.update, 0);\n break;\n case \"delete\":\n touchEntity(ctx, model, input.where);\n touchReferencing(ctx, model);\n break;\n case \"deleteMany\":\n touchWide(ctx, model);\n touchReferencing(ctx, model);\n break;\n default:\n touchWide(ctx, model);\n touchReferencingIfKeyChanges(ctx, model, input.data);\n }\n return ctx.plan;\n}\n\nexport function planFences(plan: WritePlan): string[] {\n if (plan.all) return [GLOBAL_FENCE];\n const fences: string[] = [];\n for (const [model, { pks, wide }] of plan.touched) {\n fences.push(writeFence(model));\n if (wide || pks.size > MAX_ENTITY_FENCES_PER_MODEL) fences.push(modelFence(model));\n else for (const pk of pks) fences.push(entityFence(model, pk));\n }\n return fences;\n}\n\nexport function rawWritePlanFences(config: GeneratedCacheConfig, target: InvalidationTarget): string[] {\n if (\"all\" in target) return [GLOBAL_FENCE];\n const ctx: PlanContext = { config, plan: { all: false, touched: new Map() } };\n const known = new Set(config.modelNames);\n const models = \"models\" in target ? target.models : target.entities.map(({ model }) => model);\n const unknown = models.filter((model) => !known.has(model));\n if (unknown.length > 0) throw new TypeError(`cache invalidation: unknown models ${unknown.join(\", \")}`);\n if (\"models\" in target) target.models.forEach((model) => touchWide(ctx, model));\n else {\n for (const { model, pk } of target.entities) {\n const fields = pkFieldsOf(config, model);\n const encoded = pk.length === fields.length ? pkFromRow(Object.fromEntries(fields.map((field, i) => [field, pk[i]])), fields) : null;\n if (encoded === null) touchWide(ctx, model);\n else touch(ctx.plan, model).pks.add(encoded);\n }\n }\n models.forEach((model) => touchReferencing(ctx, model));\n return planFences(ctx.plan);\n}\n","import type { CacheExtensionOptions, CacheShape, ResolvedShape } from \"./types\";\n\nimport { MAX_SHAPE_TTL_SECONDS } from \"./limits\";\n\nexport const DEFAULT_SHAPE: ResolvedShape = { freshTtlSeconds: 3600, negativeTtlSeconds: 600, softTtlRatio: 0.8 };\n\nfunction validate(label: string, shape: CacheShape | undefined): void {\n if (!shape) return;\n for (const field of [\"freshTtlSeconds\", \"negativeTtlSeconds\"] as const) {\n const value = shape[field];\n if (value !== undefined && !(Number.isFinite(value) && value > 0 && value <= MAX_SHAPE_TTL_SECONDS)) {\n throw new TypeError(`cache shape ${label}: ${field} must be in (0, ${MAX_SHAPE_TTL_SECONDS}]`);\n }\n }\n const ratio = shape.softTtlRatio;\n if (ratio !== undefined && !(Number.isFinite(ratio) && ratio > 0 && ratio <= 1)) {\n throw new TypeError(`cache shape ${label}: softTtlRatio must be in (0, 1]`);\n }\n}\n\nexport function validateShapes(shape: CacheExtensionOptions[\"shape\"]): void {\n validate(\"default\", shape?.default);\n for (const [model, value] of Object.entries(shape?.byModel ?? {})) validate(`byModel.${model}`, value);\n}\n\nexport function resolveShape(shape: CacheExtensionOptions[\"shape\"], model: string): ResolvedShape {\n const pick = <K extends keyof ResolvedShape>(field: K): ResolvedShape[K] =>\n shape?.byModel?.[model]?.[field] ?? shape?.default?.[field] ?? DEFAULT_SHAPE[field];\n return { freshTtlSeconds: pick(\"freshTtlSeconds\"), negativeTtlSeconds: pick(\"negativeTtlSeconds\"), softTtlRatio: pick(\"softTtlRatio\") };\n}\n","import type { RelationInfo } from \"./types\";\n\nimport { isPlainRecord } from \"./pk\";\n\nexport const MAX_RELATION_DEPTH = 10;\n\nconst RELATION_FILTER_KEYS = [\"some\", \"every\", \"none\", \"is\", \"isNot\"];\nconst LOGICAL_KEYS = new Set([\"AND\", \"OR\", \"NOT\"]);\n\ntype Graph = Record<string, RelationInfo[]>;\n\nexport interface ReadTargets {\n models: Set<string>;\n relational: boolean;\n}\n\ninterface Walk {\n graph: Graph;\n out: ReadTargets;\n}\n\nfunction relationsOf(graph: Graph, model: string): Map<string, RelationInfo> {\n return new Map((graph[model] ?? []).map((relation) => [relation.fieldName, relation]));\n}\n\nfunction reach(walk: Walk, relation: RelationInfo): void {\n walk.out.models.add(relation.targetModel);\n walk.out.relational = true;\n}\n\nfunction walkFilter(walk: Walk, model: string, value: unknown, depth: number): boolean {\n if (depth > MAX_RELATION_DEPTH) return false;\n if (Array.isArray(value)) return value.every((item) => walkFilter(walk, model, item, depth + 1));\n if (!isPlainRecord(value)) return true;\n const relations = relationsOf(walk.graph, model);\n for (const [key, nested] of Object.entries(value)) {\n if (LOGICAL_KEYS.has(key)) {\n if (!walkFilter(walk, model, nested, depth + 1)) return false;\n continue;\n }\n const relation = relations.get(key);\n if (!relation) continue;\n reach(walk, relation);\n if (!isPlainRecord(nested)) continue;\n const wrapped = RELATION_FILTER_KEYS.filter((wrapper) => wrapper in nested);\n const inner = wrapped.length > 0 ? wrapped.map((wrapper) => nested[wrapper]) : [nested];\n if (!inner.every((item) => walkFilter(walk, relation.targetModel, item, depth + 1))) return false;\n }\n return true;\n}\n\nfunction walkCount(walk: Walk, model: string, count: unknown, depth: number): boolean {\n if (count === undefined) return true;\n const select = isPlainRecord(count) && isPlainRecord(count.select) ? count.select : null;\n for (const relation of walk.graph[model] ?? []) {\n const selected = select ? select[relation.fieldName] : count;\n if (!selected) continue;\n reach(walk, relation);\n if (isPlainRecord(selected) && !walkFilter(walk, relation.targetModel, selected.where, depth + 1)) return false;\n }\n return true;\n}\n\nfunction walkArgs(walk: Walk, model: string, args: unknown, depth: number): boolean {\n walk.out.models.add(model);\n if (!isPlainRecord(args)) return true;\n for (const filter of [args.where, args.orderBy, args.cursor]) {\n if (!walkFilter(walk, model, filter, depth)) return false;\n }\n for (const projection of [args.include, args.select]) {\n if (!isPlainRecord(projection)) continue;\n if (!walkCount(walk, model, projection._count, depth)) return false;\n for (const relation of walk.graph[model] ?? []) {\n const nested = projection[relation.fieldName];\n if (!nested) continue;\n reach(walk, relation);\n if (!walkArgs(walk, relation.targetModel, nested, depth + 1)) return false;\n }\n }\n return true;\n}\n\nexport function readTargets(graph: Graph, model: string, args: unknown): null | ReadTargets {\n const walk: Walk = { graph, out: { models: new Set(), relational: false } };\n return walkArgs(walk, model, args, 0) ? walk.out : null;\n}\n","import type { CacheExtensionOptions, InvalidationTarget, ReadResponse } from \"./types\";\n\nimport { decode, encode, sha256Hex, stableStringify } from \"./codec\";\nimport { entityFence, GLOBAL_FENCE, modelFence, writeFence } from \"./fences\";\nimport {\n CONFIG_FORMAT,\n MAX_GENERATION_LENGTH,\n MAX_LEASE_MS,\n MAX_LOCK_MS,\n MAX_VALUE_BYTES,\n PLANNER_VERSION,\n TTL_JITTER_RATIO,\n} from \"./limits\";\nimport { planFences, planWrite, rawWritePlanFences, READ_OPERATIONS, WRITE_OPERATIONS } from \"./plan\";\nimport { isPlainRecord, pkFromWhere } from \"./pk\";\nimport { resolveShape, validateShapes } from \"./shape\";\nimport { readTargets } from \"./targets\";\n\nexport class CacheUnavailableError extends Error {\n constructor(cause: unknown) {\n super(\"cache coordinator unavailable; the write was not executed\", { cause });\n this.name = \"CacheUnavailableError\";\n }\n}\n\nexport const DEFAULT_FILL_POLL_DELAYS_MS = [20, 40, 80, 160, 320, 640];\nexport const DEFAULT_LOCK_MS = 30_000;\nexport const DEFAULT_LEASE_MS = 60_000;\nexport const DEFAULT_MAX_VALUE_BYTES = 1_500_000;\n\ntype Query = (args: unknown) => Promise<unknown>;\n\ninterface OperationParams {\n __internalParams?: unknown;\n args: unknown;\n model?: string;\n operation: string;\n query: Query;\n}\n\ninterface ReadContext {\n args: unknown;\n entityFences: string[] | null;\n fences: string[];\n key: string;\n model: string;\n operation: string;\n query: Query;\n}\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst pickEpochs = (epochs: Record<string, number>, fences: string[]): Record<string, number> =>\n Object.fromEntries(fences.map((fence) => [fence, epochs[fence] ?? 0]));\n\nconst isNegative = (value: unknown): boolean => value === null || (Array.isArray(value) && value.length === 0);\n\nconst sum = (values: number[]): number => values.reduce((total, value) => total + value, 0);\n\nfunction internalParams(params: OperationParams): { dataPath: unknown[]; inBatch: boolean } {\n const internal = isPlainRecord(params.__internalParams) ? params.__internalParams : {};\n const transaction = internal.transaction;\n return {\n dataPath: Array.isArray(internal.dataPath) ? internal.dataPath : [],\n inBatch: isPlainRecord(transaction) && transaction.kind === \"batch\",\n };\n}\n\nfunction validateOptions(options: CacheExtensionOptions): void {\n if (options.config.configFormat !== CONFIG_FORMAT) {\n throw new TypeError(\n `cache extension: generated config format ${String(options.config.configFormat)} does not match ${CONFIG_FORMAT}; run prisma generate`,\n );\n }\n const inRange = (value: number | undefined, max: number) => value === undefined || (Number.isFinite(value) && value > 0 && value <= max);\n const problems = [\n !inRange(options.lockMs, MAX_LOCK_MS) && `lockMs must be in (0, ${MAX_LOCK_MS}]`,\n !inRange(options.leaseMs, MAX_LEASE_MS) && `leaseMs must be in (0, ${MAX_LEASE_MS}]`,\n !inRange(options.maxValueBytes, MAX_VALUE_BYTES) && `maxValueBytes must be in (0, ${MAX_VALUE_BYTES}]`,\n options.fillPollDelaysMs?.some((delay) => !(Number.isFinite(delay) && delay >= 0)) && \"fillPollDelaysMs must be non-negative\",\n options.excludeModels?.some((model) => !options.config.modelNames.includes(model)) && \"excludeModels names an unknown model\",\n options.config.hasDecimalFields &&\n !options.decimal &&\n \"decimal is required because the schema has Decimal fields (pass Prisma.Decimal)\",\n options.generation !== undefined &&\n !(options.generation.length > 0 && options.generation.length <= MAX_GENERATION_LENGTH) &&\n `generation must be 1..${MAX_GENERATION_LENGTH} characters`,\n options.coordinationGeneration !== undefined &&\n !(options.coordinationGeneration.length > 0 && options.coordinationGeneration.length <= MAX_GENERATION_LENGTH) &&\n `coordinationGeneration must be 1..${MAX_GENERATION_LENGTH} characters`,\n ].filter((problem): problem is string => typeof problem === \"string\");\n if (problems.length > 0) throw new TypeError(`cache extension: ${problems.join(\"; \")}`);\n validateShapes(options.shape);\n}\n\nexport function createCacheExtension(options: CacheExtensionOptions) {\n validateOptions(options);\n const { config, store, unsafeTestHooks: hooks } = options;\n const enabled = options.enabled ?? true;\n const excluded = new Set(options.excludeModels ?? []);\n const scope = options.scope ?? \"\";\n const generation = options.coordinationGeneration ?? `${PLANNER_VERSION}/${config.cacheVersion}/${options.generation ?? \"\"}`;\n const pollDelays = options.fillPollDelaysMs ?? DEFAULT_FILL_POLL_DELAYS_MS;\n const lockMs = options.lockMs ?? DEFAULT_LOCK_MS;\n const leaseMs = options.leaseMs ?? DEFAULT_LEASE_MS;\n const maxValueBytes = options.maxValueBytes ?? DEFAULT_MAX_VALUE_BYTES;\n const report = (error: unknown, context: string): void => options.onError?.(error, context);\n\n const isCacheable = (model: string): boolean =>\n enabled && config.cacheableByModel[model] === true && !excluded.has(model);\n\n function readContext(model: string, operation: string, args: unknown, query: Query, key: string): ReadContext | null {\n const targets = readTargets(config.relationGraph, model, args);\n if (!targets || [...targets.models].some((target) => !isCacheable(target))) return null;\n const rootPk = operation.startsWith(\"findUnique\")\n ? pkFromWhere(\n isPlainRecord(args) ? args.where : undefined,\n config.primaryKeyFieldsByModel[model] ?? [\"id\"],\n config.primaryKeyNameByModel[model],\n )\n : null;\n const base = [GLOBAL_FENCE, modelFence(model)];\n const entity = rootPk === null ? null : entityFence(model, rootPk);\n const fences = [...base, ...[...targets.models].map(writeFence), ...(entity ? [entity] : [])];\n const entityFences = entity && !targets.relational ? [...base, entity] : null;\n return { args, entityFences, fences, key, model, operation, query };\n }\n\n const release = (key: string, lockToken: string): Promise<void> =>\n store.release({ key, lockToken }).catch((error) => report(error, \"release\"));\n\n function serialize(value: unknown): null | string {\n try {\n const serialized = JSON.stringify(encode(value));\n if (new TextEncoder().encode(serialized).byteLength <= maxValueBytes) return serialized;\n report(new Error(`cache value exceeds ${maxValueBytes} bytes`), \"serialize\");\n } catch (error) {\n report(error, \"serialize\");\n }\n return null;\n }\n\n async function fill(ctx: ReadContext, lockToken: string, epochs: Record<string, number>): Promise<unknown> {\n let value: unknown;\n let cached: unknown;\n try {\n const loaded = options.sessionCache ? await options.sessionCache.fill(() => ctx.query(ctx.args)) : { value:await ctx.query(ctx.args), cached:undefined };\n value = loaded.value;\n cached = options.sessionCache ? loaded.cached : value;\n await hooks?.afterFillQuery?.();\n } catch (error) {\n await release(ctx.key, lockToken);\n throw error;\n }\n const serialized = serialize(cached);\n if (serialized === null) {\n await release(ctx.key, lockToken);\n return value;\n }\n const shape = resolveShape(options.shape, ctx.model);\n const baseTtl = ctx.operation !== \"count\" && isNegative(value) ? shape.negativeTtlSeconds : shape.freshTtlSeconds;\n const ttlMs = Math.round(baseTtl * 1000 * (1 + Math.random() * TTL_JITTER_RATIO));\n const snapshotFences = ctx.entityFences && isPlainRecord(value) ? ctx.entityFences : ctx.fences;\n try {\n const result = await store.write({\n key: ctx.key,\n lockToken,\n snapshot: pickEpochs(epochs, snapshotFences),\n softTtlMs: Math.round(ttlMs * shape.softTtlRatio),\n ttlMs,\n value: serialized,\n });\n if (!result.ok) report(new Error(`cache write rejected: ${result.reason}`), \"write\");\n } catch (error) {\n report(error, \"write\");\n await release(ctx.key, lockToken);\n }\n return value;\n }\n\n async function scheduleRefresh(ctx: ReadContext, response: Extract<ReadResponse, { kind: \"hit\" }>): Promise<void> {\n const token = response.refreshToken;\n if (!token) return;\n if (!options.waitUntil) return release(ctx.key, token);\n try {\n const refresh = () => fill(ctx, token, response.epochs).then(() => undefined);\n options.waitUntil((options.sessionCache?.background ? options.sessionCache.background(refresh) : refresh()).catch((error) => report(error, \"refresh\")));\n } catch (error) {\n report(error, \"waitUntil\");\n await release(ctx.key, token);\n }\n }\n\n async function handleRead(model: string, operation: string, args: unknown, query: Query, dataPath: unknown[]): Promise<unknown> {\n let key: string;\n try {\n const identity = [PLANNER_VERSION, config.cacheVersion, scope, ...(options.sessionCache ? [options.sessionCache.key()] : []), model, operation, dataPath, (options.keyArgs ? options.keyArgs(args) : args) ?? null];\n key = `${model}:${await sha256Hex(stableStringify(identity))}`;\n } catch (error) {\n report(error, \"key\");\n return query(args);\n }\n const ctx = readContext(model, operation, args, query, key);\n if (!ctx) return query(args);\n for (let attempt = 0; ; attempt++) {\n let response: ReadResponse;\n try {\n response = await store.read({ fences: ctx.fences, generation, key, lockMs, refresh: !!options.waitUntil });\n } catch (error) {\n report(error, \"read\");\n return query(args);\n }\n if (response.kind === \"hit\") {\n let value: unknown;\n try {\n value = decode(JSON.parse(response.value), options.decimal);\n if (options.sessionCache) {\n const cached = options.sessionCache.read(value);\n if (!cached) {\n if (response.refreshToken) await release(key, response.refreshToken);\n return (await options.sessionCache.fill(() => query(args))).value;\n }\n value = cached.value;\n }\n } catch (error) {\n report(error, \"decode\");\n if (response.refreshToken) await release(key, response.refreshToken);\n return query(args);\n }\n await scheduleRefresh(ctx, response);\n return value;\n }\n if (response.lockToken) return fill(ctx, response.lockToken, response.epochs);\n const delay = pollDelays[attempt];\n const holderTooSlow = response.lockHeldForMs !== null && response.lockHeldForMs > sum(pollDelays);\n if (response.pending || delay === undefined || holderTooSlow) return query(args);\n await sleep(delay);\n }\n }\n\n async function withLease<T>(fences: string[], run: () => Promise<T>): Promise<T> {\n const token = crypto.randomUUID();\n try {\n await store.beginWrite({ fences, generation, leaseMs, token });\n } catch (error) {\n report(error, \"beginWrite\");\n await endWrite(token, fences);\n throw new CacheUnavailableError(error);\n }\n try {\n await hooks?.afterBeginWrite?.();\n return await run();\n } finally {\n if (!hooks?.skipEndWrite?.()) await endWrite(token, fences);\n }\n }\n\n async function endWrite(token: string, fences: string[]): Promise<void> {\n await store.endWrite({ fences, token }).catch((error) => report(error, \"endWrite\"));\n }\n\n const targetFences = (target: InvalidationTarget): string[] => rawWritePlanFences(config, target);\n\n return {\n client: {\n async $cacheInvalidate(target: InvalidationTarget): Promise<void> {\n await store.invalidate(targetFences(target));\n },\n async $cacheRawWrite<T>(target: InvalidationTarget, run: () => Promise<T>): Promise<T> {\n const fences = targetFences(target);\n return enabled ? withLease(fences, run) : run();\n },\n },\n name: \"dee-wan-cache\",\n query: {\n $allModels: {\n $allOperations(params: OperationParams): Promise<unknown> {\n const { args, model, operation, query } = params;\n if (!model) return query(args);\n const { dataPath, inBatch } = internalParams(params);\n if (READ_OPERATIONS.has(operation) && isCacheable(model) && !inBatch) {\n return handleRead(model, operation, args, query, dataPath);\n }\n if (WRITE_OPERATIONS.has(operation) && enabled) {\n return withLease(planFences(planWrite(config, model, operation, args)), () => query(args));\n }\n return query(args);\n },\n },\n },\n };\n}\n"]}