@dee-wan/cache 1.0.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +208 -3
- package/dist/chunk-A4WV6RY4.js +311 -0
- package/dist/chunk-A4WV6RY4.js.map +1 -0
- package/dist/chunk-AENVFT2S.js +6 -0
- package/dist/chunk-AENVFT2S.js.map +1 -0
- package/dist/chunk-E6OZZ5UX.js +133 -0
- package/dist/chunk-E6OZZ5UX.js.map +1 -0
- package/dist/chunk-JPK2AF7X.js +18 -0
- package/dist/chunk-JPK2AF7X.js.map +1 -0
- package/dist/chunk-LAXBP5DQ.js +330 -0
- package/dist/chunk-LAXBP5DQ.js.map +1 -0
- package/dist/chunk-LHOK33GI.js +12 -0
- package/dist/chunk-LHOK33GI.js.map +1 -0
- package/dist/chunk-M4UOCIDQ.js +557 -0
- package/dist/chunk-M4UOCIDQ.js.map +1 -0
- package/dist/chunk-NFBMWKY5.js +54 -0
- package/dist/chunk-NFBMWKY5.js.map +1 -0
- package/dist/chunk-O3KHMFHX.js +425 -0
- package/dist/chunk-O3KHMFHX.js.map +1 -0
- package/dist/chunk-WJNCFFF3.js +637 -0
- package/dist/chunk-WJNCFFF3.js.map +1 -0
- package/dist/chunk-WKZ7TKGM.js +82 -0
- package/dist/chunk-WKZ7TKGM.js.map +1 -0
- package/dist/chunk-ZBYAKDNZ.js +45 -0
- package/dist/chunk-ZBYAKDNZ.js.map +1 -0
- package/dist/chunk-ZCMZJKGN.js +78 -0
- package/dist/chunk-ZCMZJKGN.js.map +1 -0
- package/dist/client.d.ts +63 -0
- package/dist/client.js +260 -0
- package/dist/client.js.map +1 -0
- package/dist/cloudflare/index.d.ts +15 -2
- package/dist/cloudflare/index.js +413 -45
- package/dist/cloudflare/index.js.map +1 -1
- package/dist/d1/config.d.ts +41 -0
- package/dist/d1/config.js +102 -0
- package/dist/d1/config.js.map +1 -0
- package/dist/d1/index.d.ts +80 -0
- package/dist/d1/index.js +218 -0
- package/dist/d1/index.js.map +1 -0
- package/dist/d1/response-lease.d.ts +9 -0
- package/dist/d1/response-lease.js +44 -0
- package/dist/d1/response-lease.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -616
- package/dist/index.js.map +1 -1
- package/dist/profile--LBtbQI_.d.ts +30 -0
- package/dist/response-lease-DeeM-ofO.d.ts +19 -0
- package/dist/response-lease.d.ts +7 -0
- package/dist/response-lease.js +14 -0
- package/dist/response-lease.js.map +1 -0
- package/dist/response-warmup-BWQvnT1G.d.ts +38 -0
- package/dist/scoped-read.d.ts +12 -0
- package/dist/scoped-read.js +30 -0
- package/dist/scoped-read.js.map +1 -0
- package/dist/{types-DwtU0KpX.d.ts → types-CtErcz2a.d.ts} +25 -1
- package/docs/cache-contract.md +49 -1
- package/package.json +31 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cloudflare/coordinator-core.ts","../../src/cloudflare/coordinator.ts","../../src/cloudflare/retry.ts","../../src/cloudflare/store-options.ts","../../src/cloudflare/store.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type {\n BeginWriteRequest,\n EndWriteRequest,\n ReadRequest,\n ReadResponse,\n ReleaseRequest,\n WriteRequest,\n WriteResult,\n} from \"../core/types\";\n\nimport { GLOBAL_FENCE } from \"../core/fences\";\nimport {\n MAX_COORDINATOR_GENERATION_LENGTH,\n MAX_LEASE_MS,\n MAX_LOCK_MS,\n MAX_TTL_MS,\n MAX_VALUE_BYTES,\n} from \"../core/limits\";\n\nexport type SqlValue = ArrayBuffer | null | number | string;\n\nexport type Row = Record<string, SqlValue>;\n\nexport interface SqlLike {\n exec(query: string, ...bindings: SqlValue[]): { toArray(): Row[] };\n}\n\nexport type Transact = <T>(run: () => T) => T;\n\nexport interface CoordinatorLimits {\n maxStoredBytes?: number;\n}\n\nexport { MAX_LEASE_MS, MAX_LOCK_MS, MAX_TTL_MS };\nexport const FENCE_RETENTION_MS = 2 * MAX_LOCK_MS;\nexport const SWEEP_LIMIT = 50;\nexport const FENCE_COLLECT_LIMIT = 100;\nexport const PURGE_LIMIT = 500;\nexport const EVICTION_BATCH = 50;\nexport const MAX_EVICTION_ROUNDS = 20;\nexport const MAX_STORED_BYTES = 1024 * 1024 * 1024;\nexport const MAX_KEY_LENGTH = 1024;\nexport const MAX_TOKEN_LENGTH = 128;\nexport const MAX_FENCE_LENGTH = 512;\nexport const MAX_FENCES_PER_REQUEST = 5000;\n\nconst MAX_BOUND_PARAMETERS = 90;\n\nexport const MIGRATIONS: readonly string[] = [\n `\nCREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value INTEGER NOT NULL);\nINSERT OR IGNORE INTO meta (key, value) VALUES ('sequence', 0);\nCREATE TABLE IF NOT EXISTS fences (fence TEXT PRIMARY KEY, epoch INTEGER NOT NULL, updated_at INTEGER NOT NULL);\nCREATE INDEX IF NOT EXISTS fences_by_updated ON fences (updated_at);\nCREATE TABLE IF NOT EXISTS leases (token TEXT NOT NULL, fence TEXT NOT NULL, expires_at INTEGER NOT NULL, PRIMARY KEY (token, fence));\nCREATE INDEX IF NOT EXISTS leases_by_fence ON leases (fence, expires_at);\nCREATE INDEX IF NOT EXISTS leases_by_expiry ON leases (expires_at);\nCREATE TABLE IF NOT EXISTS locks (key TEXT PRIMARY KEY, token TEXT NOT NULL, expires_at INTEGER NOT NULL);\nCREATE INDEX IF NOT EXISTS locks_by_expiry ON locks (expires_at);\nCREATE TABLE IF NOT EXISTS entries (key TEXT PRIMARY KEY, value TEXT NOT NULL, snapshot TEXT NOT NULL, soft_expires_at INTEGER NOT NULL, expires_at INTEGER NOT NULL);\nCREATE INDEX IF NOT EXISTS entries_by_expiry ON entries (expires_at);\nCREATE TABLE IF NOT EXISTS entry_fences (fence TEXT NOT NULL, key TEXT NOT NULL, PRIMARY KEY (fence, key));\nCREATE INDEX IF NOT EXISTS entry_fences_by_key ON entry_fences (key);\n`,\n `\nCREATE TABLE IF NOT EXISTS generation (id INTEGER PRIMARY KEY CHECK (id = 1), value TEXT NOT NULL);\n`,\n `\nALTER TABLE locks ADD COLUMN seq INTEGER NOT NULL DEFAULT 0;\nALTER TABLE locks ADD COLUMN kind TEXT NOT NULL DEFAULT 'fill';\nALTER TABLE locks ADD COLUMN acquired_at INTEGER NOT NULL DEFAULT 0;\nALTER TABLE entries ADD COLUMN size INTEGER NOT NULL DEFAULT 0;\nINSERT OR IGNORE INTO meta (key, value) VALUES ('gc_watermark', 0);\nINSERT OR IGNORE INTO meta (key, value) VALUES ('entry_bytes', 0);\nCREATE TABLE IF NOT EXISTS gc_cursor (id INTEGER PRIMARY KEY CHECK (id = 1), updated_at INTEGER NOT NULL, fence TEXT NOT NULL);\nINSERT OR IGNORE INTO gc_cursor (id, updated_at, fence) VALUES (1, -1, '');\nCREATE INDEX IF NOT EXISTS fences_by_updated_fence ON fences (updated_at, fence);\n`,\n];\n\nfunction chunks<T>(items: T[]): T[][] {\n const out: T[][] = [];\n for (let i = 0; i < items.length; i += MAX_BOUND_PARAMETERS) out.push(items.slice(i, i + MAX_BOUND_PARAMETERS));\n return out;\n}\n\nconst placeholders = (count: number): string => Array.from({ length: count }, () => \"?\").join(\",\");\n\nconst clamp = (value: number, max: number): number => Math.min(Math.max(Math.trunc(value), 1), max);\n\nfunction assertRequest(condition: boolean, message: string): asserts condition {\n if (!condition) throw new TypeError(`cache coordinator: ${message}`);\n}\n\nconst isKey = (value: unknown): value is string => typeof value === \"string\" && value.length > 0 && value.length <= MAX_KEY_LENGTH;\n\nconst isFenceList = (value: unknown): value is string[] =>\n Array.isArray(value) &&\n value.length <= MAX_FENCES_PER_REQUEST &&\n value.every((fence) => typeof fence === \"string\" && fence.length > 0 && fence.length <= MAX_FENCE_LENGTH);\n\nconst isSnapshot = (value: unknown): value is Record<string, number> =>\n !!value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.keys(value).length <= MAX_FENCES_PER_REQUEST &&\n Object.values(value).every((epoch) => Number.isSafeInteger(epoch));\n\nconst isGeneration = (value: unknown): value is string | undefined =>\n value === undefined ||\n (typeof value === \"string\" && value.length > 0 && value.length <= MAX_COORDINATOR_GENERATION_LENGTH);\n\nconst isToken = (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0 && value.length <= MAX_TOKEN_LENGTH;\n\nconst isDuration = (value: unknown): value is number => typeof value === \"number\" && Number.isFinite(value) && value > 0;\n\nconst byteLength = (text: string): number => new TextEncoder().encode(text).byteLength;\n\nfunction parseSnapshot(text: string): Record<string, number> | null {\n try {\n const parsed: unknown = JSON.parse(text);\n return isSnapshot(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nexport function migrate(sql: SqlLike, transact: Transact): void {\n transact(() => {\n sql.exec(\"CREATE TABLE IF NOT EXISTS schema_version (id INTEGER PRIMARY KEY CHECK (id = 1), version INTEGER NOT NULL)\");\n const current = Number(sql.exec(\"SELECT version FROM schema_version WHERE id = 1\").toArray()[0]?.version ?? 0);\n if (current > MIGRATIONS.length) {\n throw new Error(`cache coordinator: storage schema ${current} is newer than this code (${MIGRATIONS.length})`);\n }\n if (current === MIGRATIONS.length) return;\n MIGRATIONS.slice(current).forEach((migration) => sql.exec(migration));\n sql.exec(\"INSERT OR REPLACE INTO schema_version (id, version) VALUES (1, ?)\", MIGRATIONS.length);\n });\n}\n\nexport function createCoordinatorCore(sql: SqlLike, newToken: () => string, transact: Transact, limits: CoordinatorLimits = {}) {\n const maxStoredBytes = limits.maxStoredBytes ?? MAX_STORED_BYTES;\n const rows = (query: string, ...bindings: SqlValue[]): Row[] => sql.exec(query, ...bindings).toArray();\n\n const metaValue = (key: string): number => Number(rows(\"SELECT value FROM meta WHERE key = ?\", key)[0]?.value ?? 0);\n\n function epochs(fences: string[]): Record<string, number> {\n const out: Record<string, number> = Object.fromEntries(fences.map((fence) => [fence, 0]));\n for (const chunk of chunks([...new Set(fences)])) {\n for (const row of rows(`SELECT fence, epoch FROM fences WHERE fence IN (${placeholders(chunk.length)})`, ...chunk)) {\n out[String(row.fence)] = Number(row.epoch);\n }\n }\n return out;\n }\n\n const matches = (snapshot: Record<string, number>, current: Record<string, number>): boolean => {\n const fences = Object.keys(snapshot);\n return fences.length > 0 && fences.every((fence) => current[fence] === snapshot[fence]);\n };\n\n const pending = (fences: string[], now: number): boolean =>\n chunks([...new Set(fences)]).some(\n (chunk) => rows(`SELECT 1 FROM leases WHERE expires_at > ? AND fence IN (${placeholders(chunk.length)}) LIMIT 1`, now, ...chunk).length > 0,\n );\n\n function writeLock(key: string, lockMs: number, now: number, kind: \"fill\" | \"refresh\"): string {\n const token = newToken();\n sql.exec(\n \"INSERT OR REPLACE INTO locks (key, token, expires_at, seq, kind, acquired_at) VALUES (?, ?, ?, ?, ?, ?)\",\n key,\n token,\n now + clamp(lockMs, MAX_LOCK_MS),\n metaValue(\"sequence\"),\n kind,\n now,\n );\n return token;\n }\n\n function deleteEntries(keys: string[]): void {\n for (const chunk of chunks(keys)) {\n const bytes = Number(rows(`SELECT COALESCE(SUM(size), 0) AS bytes FROM entries WHERE key IN (${placeholders(chunk.length)})`, ...chunk)[0]?.bytes ?? 0);\n sql.exec(`DELETE FROM entry_fences WHERE key IN (${placeholders(chunk.length)})`, ...chunk);\n sql.exec(`DELETE FROM entries WHERE key IN (${placeholders(chunk.length)})`, ...chunk);\n if (bytes > 0) sql.exec(\"UPDATE meta SET value = MAX(0, value - ?) WHERE key = 'entry_bytes'\", bytes);\n }\n }\n\n function makeRoom(size: number): boolean {\n for (let round = 0; round < MAX_EVICTION_ROUNDS; round++) {\n const overflow = metaValue(\"entry_bytes\") + size - maxStoredBytes;\n if (overflow <= 0) return true;\n const candidates = rows(\"SELECT key, size FROM entries ORDER BY expires_at LIMIT ?\", EVICTION_BATCH);\n if (candidates.length === 0) break;\n let freed = 0;\n const victims = candidates.filter((row) => {\n if (freed >= overflow) return false;\n freed += Number(row.size);\n return true;\n });\n deleteEntries(victims.map((row) => String(row.key)));\n }\n return metaValue(\"entry_bytes\") + size <= maxStoredBytes;\n }\n\n function bump(fences: string[], now: number): void {\n for (const fence of new Set(fences)) {\n const next = Number(rows(\"UPDATE meta SET value = value + 1 WHERE key = 'sequence' RETURNING value\")[0]?.value);\n sql.exec(\n \"INSERT INTO fences (fence, epoch, updated_at) VALUES (?, ?, ?) ON CONFLICT (fence) DO UPDATE SET epoch = excluded.epoch, updated_at = excluded.updated_at\",\n fence,\n next,\n now,\n );\n }\n }\n\n function purge(fences: string[]): void {\n let budget = PURGE_LIMIT;\n for (const chunk of chunks([...new Set(fences)])) {\n if (budget <= 0) return;\n const keys = rows(\n `SELECT DISTINCT key FROM entry_fences WHERE fence IN (${placeholders(chunk.length)}) LIMIT ?`,\n ...chunk,\n budget,\n );\n deleteEntries(keys.map((row) => String(row.key)));\n budget -= keys.length;\n }\n }\n\n function collectFences(now: number): void {\n const cursor = rows(\"SELECT updated_at, fence FROM gc_cursor WHERE id = 1\")[0];\n const after = Number(cursor?.updated_at ?? -1);\n const afterFence = String(cursor?.fence ?? \"\");\n const batch = rows(\n `SELECT fence, updated_at, epoch,\n EXISTS (SELECT 1 FROM entry_fences WHERE entry_fences.fence = fences.fence) AS in_entries,\n EXISTS (SELECT 1 FROM leases WHERE leases.fence = fences.fence) AS in_leases\n FROM fences\n WHERE (updated_at, fence) > (?, ?) AND updated_at <= ? AND fence >= ? AND fence < ?\n ORDER BY updated_at, fence LIMIT ?`,\n after,\n afterFence,\n now - FENCE_RETENTION_MS,\n \"e:\",\n \"e;\",\n FENCE_COLLECT_LIMIT,\n );\n const deletable = batch.filter((row) => Number(row.in_entries) === 0 && Number(row.in_leases) === 0);\n for (const chunk of chunks(deletable.map((row) => String(row.fence)))) {\n sql.exec(`DELETE FROM fences WHERE fence IN (${placeholders(chunk.length)})`, ...chunk);\n }\n const highestDeletedEpoch = Math.max(0, ...deletable.map((row) => Number(row.epoch)));\n if (highestDeletedEpoch > 0) {\n sql.exec(\"UPDATE meta SET value = MAX(value, ?) WHERE key = 'gc_watermark'\", highestDeletedEpoch);\n }\n const last = batch[batch.length - 1];\n const [nextAt, nextFence] = batch.length < FENCE_COLLECT_LIMIT || !last ? [-1, \"\"] : [Number(last.updated_at), String(last.fence)];\n if (nextAt !== after || nextFence !== afterFence) {\n sql.exec(\"UPDATE gc_cursor SET updated_at = ?, fence = ? WHERE id = 1\", nextAt, nextFence);\n }\n }\n\n function sweep(now: number): void {\n const expired = rows(\"SELECT key FROM entries WHERE expires_at <= ? LIMIT ?\", now, SWEEP_LIMIT);\n deleteEntries(expired.map((row) => String(row.key)));\n sql.exec(\"DELETE FROM leases WHERE rowid IN (SELECT rowid FROM leases WHERE expires_at <= ? LIMIT ?)\", now, SWEEP_LIMIT);\n sql.exec(\"DELETE FROM locks WHERE rowid IN (SELECT rowid FROM locks WHERE expires_at <= ? LIMIT ?)\", now, SWEEP_LIMIT);\n collectFences(now);\n }\n\n function observeGeneration(generation: string | undefined, now: number): void {\n if (generation === undefined) return;\n const current = rows(\"SELECT value FROM generation WHERE id = 1\")[0]?.value;\n if (current === generation) return;\n bump([GLOBAL_FENCE], now);\n sql.exec(\"INSERT OR REPLACE INTO generation (id, value) VALUES (1, ?)\", generation);\n }\n\n function snapshotValid(snapshot: Record<string, number> | null): snapshot is Record<string, number> {\n return snapshot !== null && matches(snapshot, epochs(Object.keys(snapshot)));\n }\n\n return {\n beginWrite(request: BeginWriteRequest, now: number): void {\n assertRequest(\n isFenceList(request.fences) && isDuration(request.leaseMs) && isGeneration(request.generation) && isToken(request.token),\n \"invalid beginWrite request\",\n );\n transact(() => {\n observeGeneration(request.generation, now);\n bump(request.fences, now);\n const expiresAt = now + clamp(request.leaseMs, MAX_LEASE_MS);\n for (const fence of new Set(request.fences)) {\n sql.exec(\"INSERT OR REPLACE INTO leases (token, fence, expires_at) VALUES (?, ?, ?)\", request.token, fence, expiresAt);\n }\n });\n },\n\n endWrite(request: EndWriteRequest, now: number): void {\n assertRequest(isFenceList(request.fences) && isToken(request.token), \"invalid endWrite request\");\n transact(() => {\n bump(request.fences, now);\n sql.exec(\"DELETE FROM leases WHERE token = ?\", request.token);\n purge(request.fences);\n sweep(now);\n });\n },\n\n invalidate(fences: string[], now: number): void {\n assertRequest(isFenceList(fences), \"invalid invalidate request\");\n transact(() => {\n bump(fences, now);\n purge(fences);\n sweep(now);\n });\n },\n\n read(request: ReadRequest, now: number): ReadResponse {\n assertRequest(\n isKey(request.key) && isFenceList(request.fences) && isDuration(request.lockMs) && isGeneration(request.generation),\n \"invalid read request\",\n );\n return transact((): ReadResponse => {\n observeGeneration(request.generation, now);\n const entry = rows(\"SELECT value, snapshot, soft_expires_at, expires_at FROM entries WHERE key = ?\", request.key)[0];\n const lock = rows(\"SELECT expires_at, kind, acquired_at FROM locks WHERE key = ?\", request.key)[0];\n const lockLive = lock !== undefined && Number(lock.expires_at) > now;\n if (entry && Number(entry.expires_at) > now) {\n const snapshot = parseSnapshot(String(entry.snapshot));\n const current = epochs([...request.fences, ...Object.keys(snapshot ?? {})]);\n if (snapshot && matches(snapshot, current)) {\n const refreshable =\n request.refresh === true && now >= Number(entry.soft_expires_at) && !lockLive && !pending(request.fences, now);\n return {\n epochs: Object.fromEntries(request.fences.map((fence) => [fence, current[fence] ?? 0])),\n kind: \"hit\",\n refreshToken: refreshable ? writeLock(request.key, request.lockMs, now, \"refresh\") : null,\n value: String(entry.value),\n };\n }\n }\n if (entry) deleteEntries([request.key]);\n const isPending = pending(request.fences, now);\n const heldByFill = lockLive && lock.kind !== \"refresh\";\n const lockToken = isPending || heldByFill ? null : writeLock(request.key, request.lockMs, now, \"fill\");\n return {\n epochs: epochs(request.fences),\n kind: \"miss\",\n lockHeldForMs: heldByFill ? Math.max(0, now - Number(lock.acquired_at)) : null,\n lockToken,\n pending: isPending,\n };\n });\n },\n\n release(request: ReleaseRequest): void {\n assertRequest(isKey(request.key) && isToken(request.lockToken), \"invalid release request\");\n transact(() => sql.exec(\"DELETE FROM locks WHERE key = ? AND token = ?\", request.key, request.lockToken));\n },\n\n write(request: WriteRequest, now: number): WriteResult {\n assertRequest(\n typeof request.key === \"string\" &&\n typeof request.lockToken === \"string\" &&\n typeof request.value === \"string\" &&\n isSnapshot(request.snapshot) &&\n isDuration(request.ttlMs) &&\n isDuration(request.softTtlMs),\n \"invalid write request\",\n );\n return transact((): WriteResult => {\n const lock = rows(\"SELECT token, expires_at, seq FROM locks WHERE key = ?\", request.key)[0];\n if (!lock || lock.token !== request.lockToken || Number(lock.expires_at) <= now) return { ok: false, reason: \"lock\" };\n sql.exec(\"DELETE FROM locks WHERE key = ?\", request.key);\n const snapshotText = JSON.stringify(request.snapshot);\n const size = byteLength(request.value) + snapshotText.length + request.key.length;\n const oversize = !isKey(request.key) || request.ttlMs > MAX_TTL_MS || byteLength(request.value) > MAX_VALUE_BYTES;\n if (oversize) return { ok: false, reason: \"invalid\" };\n const capturedMissing = Object.values(request.snapshot).some((epoch) => epoch === 0);\n if (capturedMissing && Number(lock.seq) < metaValue(\"gc_watermark\")) return { ok: false, reason: \"fence\" };\n if (!snapshotValid(request.snapshot)) return { ok: false, reason: \"fence\" };\n deleteEntries([request.key]);\n if (!makeRoom(size)) return { ok: false, reason: \"full\" };\n sql.exec(\n \"INSERT INTO entries (key, value, snapshot, soft_expires_at, expires_at, size) VALUES (?, ?, ?, ?, ?, ?)\",\n request.key,\n request.value,\n snapshotText,\n now + Math.min(request.softTtlMs, request.ttlMs),\n now + request.ttlMs,\n size,\n );\n sql.exec(\"UPDATE meta SET value = value + ? WHERE key = 'entry_bytes'\", size);\n for (const fence of Object.keys(request.snapshot)) {\n sql.exec(\"INSERT INTO entry_fences (fence, key) VALUES (?, ?)\", fence, request.key);\n }\n sweep(now);\n return { ok: true };\n });\n },\n };\n}\n\nexport type CoordinatorCore = ReturnType<typeof createCoordinatorCore>;\n","import { DurableObject } from \"cloudflare:workers\";\n\nimport type {\n BeginWriteRequest,\n EndWriteRequest,\n ReadRequest,\n ReadResponse,\n ReleaseRequest,\n WriteRequest,\n WriteResult,\n} from \"../core/types\";\n\nimport { type CoordinatorCore, createCoordinatorCore, migrate, type Transact } from \"./coordinator-core\";\n\nexport class CacheCoordinator<Env = unknown> extends DurableObject<Env> {\n private readonly core: CoordinatorCore;\n\n constructor(ctx: DurableObjectState, env: Env) {\n super(ctx, env);\n const transact: Transact = (run) => ctx.storage.transactionSync(run);\n migrate(ctx.storage.sql, transact);\n this.core = createCoordinatorCore(ctx.storage.sql, () => crypto.randomUUID(), transact);\n }\n\n read(request: ReadRequest): ReadResponse {\n return this.core.read(request, Date.now());\n }\n\n write(request: WriteRequest): WriteResult {\n return this.core.write(request, Date.now());\n }\n\n release(request: ReleaseRequest): void {\n this.core.release(request);\n }\n\n beginWrite(request: BeginWriteRequest): void {\n this.core.beginWrite(request, Date.now());\n }\n\n endWrite(request: EndWriteRequest): void {\n this.core.endWrite(request, Date.now());\n }\n\n invalidate(fences: string[]): void {\n this.core.invalidate(fences, Date.now());\n }\n}\n","const BASE_BACKOFF_MS = 50;\n\nexport const isRetryable = (error: unknown): boolean =>\n !!error && typeof error === \"object\" && Reflect.get(error, \"retryable\") === true && Reflect.get(error, \"overloaded\") !== true;\n\nexport async function retryTransient<T>(call: () => Promise<T>, attempts: number, sleep: (ms: number) => Promise<void>): Promise<T> {\n for (let attempt = 0; ; attempt++) {\n try {\n return await call();\n } catch (error) {\n if (attempt + 1 >= attempts || !isRetryable(error)) throw error;\n await sleep(BASE_BACKOFF_MS * Math.random() * 2 ** attempt);\n }\n }\n}\n","export const WRITE_PATH_ATTEMPTS = 3;\nexport const MAX_COORDINATOR_NAME_LENGTH = 256;\n\nexport const LOCATION_HINTS = [\"wnam\", \"enam\", \"sam\", \"weur\", \"eeur\", \"apac\", \"oc\", \"afr\", \"me\"] as const;\n\nexport type CoordinatorLocationHint = (typeof LOCATION_HINTS)[number];\n\nexport interface DurableObjectStoreOptions {\n attempts?: number;\n locationHint?: CoordinatorLocationHint;\n name: string;\n sleep?: (ms: number) => Promise<void>;\n}\n\nexport interface ResolvedStoreOptions {\n attempts: number;\n locationHint?: CoordinatorLocationHint;\n name: string;\n sleep: (ms: number) => Promise<void>;\n}\n\nconst isLocationHint = (value: unknown): value is CoordinatorLocationHint =>\n LOCATION_HINTS.some((hint) => hint === value);\n\nexport function resolveStoreOptions(options: DurableObjectStoreOptions): ResolvedStoreOptions {\n const { attempts = WRITE_PATH_ATTEMPTS, locationHint, name } = options;\n const problems = [\n !(typeof name === \"string\" && name.length > 0 && name.length <= MAX_COORDINATOR_NAME_LENGTH) &&\n `name must be 1..${MAX_COORDINATOR_NAME_LENGTH} characters and identify one D1 database`,\n !(Number.isInteger(attempts) && attempts >= 1 && attempts <= 10) && \"attempts must be an integer in 1..10\",\n locationHint !== undefined && !isLocationHint(locationHint) && `locationHint must be one of ${LOCATION_HINTS.join(\", \")}`,\n ].filter((problem): problem is string => typeof problem === \"string\");\n if (problems.length > 0) throw new TypeError(`cache store: ${problems.join(\"; \")}`);\n return {\n attempts,\n name,\n sleep: options.sleep ?? ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms))),\n ...(locationHint ? { locationHint } : {}),\n };\n}\n","import type { CacheStore } from \"../core/types\";\nimport type { CacheCoordinator } from \"./coordinator\";\n\nimport { retryTransient } from \"./retry\";\nimport { type DurableObjectStoreOptions, resolveStoreOptions } from \"./store-options\";\n\nexport function createDurableObjectStore<Env>(\n namespace: DurableObjectNamespace<CacheCoordinator<Env>>,\n options: DurableObjectStoreOptions,\n): CacheStore {\n const { attempts, locationHint, name, sleep } = resolveStoreOptions(options);\n const stub = () => namespace.get(namespace.idFromName(name), locationHint ? { locationHint } : undefined);\n const withRetry = <T>(call: (coordinator: ReturnType<typeof stub>) => Promise<T>): Promise<T> =>\n retryTransient(() => call(stub()), attempts, sleep);\n\n return {\n beginWrite: (request) => withRetry(async (coordinator) => void (await coordinator.beginWrite(request))),\n endWrite: (request) => withRetry(async (coordinator) => void (await coordinator.endWrite(request))),\n invalidate: (fences) => withRetry(async (coordinator) => void (await coordinator.invalidate(fences))),\n read: async (request) => stub().read(request),\n release: async (request) => void (await stub().release(request)),\n write: async (request) => stub().write(request),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cloudflare/coordinator-core.ts","../../src/cloudflare/coordinator.ts","../../src/cloudflare/regional-store.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type {\n BeginWriteRequest,\n InspectFencesRequest,\n InspectFencesResponse,\n EndWriteRequest,\n ReadRequest,\n ReadResponse,\n ReleaseRequest,\n WriteRequest,\n WriteResult,\n} from \"../core/types\";\n\nimport { GLOBAL_FENCE } from \"../core/fences\";\nimport {\n MAX_COORDINATOR_GENERATION_LENGTH,\n MAX_LEASE_MS,\n MAX_LOCK_MS,\n MAX_TTL_MS,\n MAX_VALUE_BYTES,\n} from \"../core/limits\";\n\nexport type SqlValue = ArrayBuffer | null | number | string;\n\nexport type Row = Record<string, SqlValue>;\n\nexport interface SqlLike {\n exec(query: string, ...bindings: SqlValue[]): { toArray(): Row[] };\n}\n\nexport type Transact = <T>(run: () => T) => T;\n\nexport interface CoordinatorLimits {\n maxStoredBytes?: number;\n}\n\nexport { MAX_LEASE_MS, MAX_LOCK_MS, MAX_TTL_MS };\nexport const FENCE_RETENTION_MS = 2 * MAX_LOCK_MS;\nexport const SWEEP_LIMIT = 50;\nexport const FENCE_COLLECT_LIMIT = 100;\nexport const PURGE_LIMIT = 500;\nexport const EVICTION_BATCH = 50;\nexport const MAX_EVICTION_ROUNDS = 20;\nexport const MAX_STORED_BYTES = 1024 * 1024 * 1024;\nexport const MAX_KEY_LENGTH = 1024;\nexport const MAX_TOKEN_LENGTH = 128;\nexport const MAX_FENCE_LENGTH = 512;\nexport const MAX_FENCES_PER_REQUEST = 5000;\n\nconst MAX_BOUND_PARAMETERS = 90;\n\nexport const MIGRATIONS: readonly string[] = [\n `\nCREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value INTEGER NOT NULL);\nINSERT OR IGNORE INTO meta (key, value) VALUES ('sequence', 0);\nCREATE TABLE IF NOT EXISTS fences (fence TEXT PRIMARY KEY, epoch INTEGER NOT NULL, updated_at INTEGER NOT NULL);\nCREATE INDEX IF NOT EXISTS fences_by_updated ON fences (updated_at);\nCREATE TABLE IF NOT EXISTS leases (token TEXT NOT NULL, fence TEXT NOT NULL, expires_at INTEGER NOT NULL, PRIMARY KEY (token, fence));\nCREATE INDEX IF NOT EXISTS leases_by_fence ON leases (fence, expires_at);\nCREATE INDEX IF NOT EXISTS leases_by_expiry ON leases (expires_at);\nCREATE TABLE IF NOT EXISTS locks (key TEXT PRIMARY KEY, token TEXT NOT NULL, expires_at INTEGER NOT NULL);\nCREATE INDEX IF NOT EXISTS locks_by_expiry ON locks (expires_at);\nCREATE TABLE IF NOT EXISTS entries (key TEXT PRIMARY KEY, value TEXT NOT NULL, snapshot TEXT NOT NULL, soft_expires_at INTEGER NOT NULL, expires_at INTEGER NOT NULL);\nCREATE INDEX IF NOT EXISTS entries_by_expiry ON entries (expires_at);\nCREATE TABLE IF NOT EXISTS entry_fences (fence TEXT NOT NULL, key TEXT NOT NULL, PRIMARY KEY (fence, key));\nCREATE INDEX IF NOT EXISTS entry_fences_by_key ON entry_fences (key);\n`,\n `\nCREATE TABLE IF NOT EXISTS generation (id INTEGER PRIMARY KEY CHECK (id = 1), value TEXT NOT NULL);\n`,\n `\nALTER TABLE locks ADD COLUMN seq INTEGER NOT NULL DEFAULT 0;\nALTER TABLE locks ADD COLUMN kind TEXT NOT NULL DEFAULT 'fill';\nALTER TABLE locks ADD COLUMN acquired_at INTEGER NOT NULL DEFAULT 0;\nALTER TABLE entries ADD COLUMN size INTEGER NOT NULL DEFAULT 0;\nINSERT OR IGNORE INTO meta (key, value) VALUES ('gc_watermark', 0);\nINSERT OR IGNORE INTO meta (key, value) VALUES ('entry_bytes', 0);\nCREATE TABLE IF NOT EXISTS gc_cursor (id INTEGER PRIMARY KEY CHECK (id = 1), updated_at INTEGER NOT NULL, fence TEXT NOT NULL);\nINSERT OR IGNORE INTO gc_cursor (id, updated_at, fence) VALUES (1, -1, '');\nCREATE INDEX IF NOT EXISTS fences_by_updated_fence ON fences (updated_at, fence);\n`,\n];\n\nfunction chunks<T>(items: T[]): T[][] {\n const out: T[][] = [];\n for (let i = 0; i < items.length; i += MAX_BOUND_PARAMETERS) out.push(items.slice(i, i + MAX_BOUND_PARAMETERS));\n return out;\n}\n\nconst placeholders = (count: number): string => Array.from({ length: count }, () => \"?\").join(\",\");\n\nconst clamp = (value: number, max: number): number => Math.min(Math.max(Math.trunc(value), 1), max);\n\nfunction assertRequest(condition: boolean, message: string): asserts condition {\n if (!condition) throw new TypeError(`cache coordinator: ${message}`);\n}\n\nconst isKey = (value: unknown): value is string => typeof value === \"string\" && value.length > 0 && value.length <= MAX_KEY_LENGTH;\n\nconst isFenceList = (value: unknown): value is string[] =>\n Array.isArray(value) &&\n value.length <= MAX_FENCES_PER_REQUEST &&\n value.every((fence) => typeof fence === \"string\" && fence.length > 0 && fence.length <= MAX_FENCE_LENGTH);\n\nconst isSnapshot = (value: unknown): value is Record<string, number> =>\n !!value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.keys(value).length <= MAX_FENCES_PER_REQUEST &&\n Object.values(value).every((epoch) => Number.isSafeInteger(epoch));\n\nconst isGeneration = (value: unknown): value is string | undefined =>\n value === undefined ||\n (typeof value === \"string\" && value.length > 0 && value.length <= MAX_COORDINATOR_GENERATION_LENGTH);\n\nconst isToken = (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0 && value.length <= MAX_TOKEN_LENGTH;\n\nconst isDuration = (value: unknown): value is number => typeof value === \"number\" && Number.isFinite(value) && value > 0;\n\nconst byteLength = (text: string): number => new TextEncoder().encode(text).byteLength;\n\nfunction parseSnapshot(text: string): Record<string, number> | null {\n try {\n const parsed: unknown = JSON.parse(text);\n return isSnapshot(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nexport function migrate(sql: SqlLike, transact: Transact): void {\n transact(() => {\n sql.exec(\"CREATE TABLE IF NOT EXISTS schema_version (id INTEGER PRIMARY KEY CHECK (id = 1), version INTEGER NOT NULL)\");\n const current = Number(sql.exec(\"SELECT version FROM schema_version WHERE id = 1\").toArray()[0]?.version ?? 0);\n if (current > MIGRATIONS.length) {\n throw new Error(`cache coordinator: storage schema ${current} is newer than this code (${MIGRATIONS.length})`);\n }\n if (current === MIGRATIONS.length) return;\n MIGRATIONS.slice(current).forEach((migration) => sql.exec(migration));\n sql.exec(\"INSERT OR REPLACE INTO schema_version (id, version) VALUES (1, ?)\", MIGRATIONS.length);\n });\n}\n\nexport function createCoordinatorCore(sql: SqlLike, newToken: () => string, transact: Transact, limits: CoordinatorLimits = {}) {\n const maxStoredBytes = limits.maxStoredBytes ?? MAX_STORED_BYTES;\n const rows = (query: string, ...bindings: SqlValue[]): Row[] => sql.exec(query, ...bindings).toArray();\n\n const metaValue = (key: string): number => Number(rows(\"SELECT value FROM meta WHERE key = ?\", key)[0]?.value ?? 0);\n\n function epochs(fences: string[]): Record<string, number> {\n const out: Record<string, number> = Object.fromEntries(fences.map((fence) => [fence, 0]));\n for (const chunk of chunks([...new Set(fences)])) {\n for (const row of rows(`SELECT fence, epoch FROM fences WHERE fence IN (${placeholders(chunk.length)})`, ...chunk)) {\n out[String(row.fence)] = Number(row.epoch);\n }\n }\n return out;\n }\n\n const matches = (snapshot: Record<string, number>, current: Record<string, number>): boolean => {\n const fences = Object.keys(snapshot);\n return fences.length > 0 && fences.every((fence) => current[fence] === snapshot[fence]);\n };\n\n const pending = (fences: string[], now: number): boolean =>\n chunks([...new Set(fences)]).some(\n (chunk) => rows(`SELECT 1 FROM leases WHERE expires_at > ? AND fence IN (${placeholders(chunk.length)}) LIMIT 1`, now, ...chunk).length > 0,\n );\n\n function writeLock(key: string, lockMs: number, now: number, kind: \"fill\" | \"refresh\"): string {\n const token = newToken();\n sql.exec(\n \"INSERT OR REPLACE INTO locks (key, token, expires_at, seq, kind, acquired_at) VALUES (?, ?, ?, ?, ?, ?)\",\n key,\n token,\n now + clamp(lockMs, MAX_LOCK_MS),\n metaValue(\"sequence\"),\n kind,\n now,\n );\n return token;\n }\n\n function deleteEntries(keys: string[]): void {\n for (const chunk of chunks(keys)) {\n const bytes = Number(rows(`SELECT COALESCE(SUM(size), 0) AS bytes FROM entries WHERE key IN (${placeholders(chunk.length)})`, ...chunk)[0]?.bytes ?? 0);\n sql.exec(`DELETE FROM entry_fences WHERE key IN (${placeholders(chunk.length)})`, ...chunk);\n sql.exec(`DELETE FROM entries WHERE key IN (${placeholders(chunk.length)})`, ...chunk);\n if (bytes > 0) sql.exec(\"UPDATE meta SET value = MAX(0, value - ?) WHERE key = 'entry_bytes'\", bytes);\n }\n }\n\n function makeRoom(size: number): boolean {\n for (let round = 0; round < MAX_EVICTION_ROUNDS; round++) {\n const overflow = metaValue(\"entry_bytes\") + size - maxStoredBytes;\n if (overflow <= 0) return true;\n const candidates = rows(\"SELECT key, size FROM entries ORDER BY expires_at LIMIT ?\", EVICTION_BATCH);\n if (candidates.length === 0) break;\n let freed = 0;\n const victims = candidates.filter((row) => {\n if (freed >= overflow) return false;\n freed += Number(row.size);\n return true;\n });\n deleteEntries(victims.map((row) => String(row.key)));\n }\n return metaValue(\"entry_bytes\") + size <= maxStoredBytes;\n }\n\n function bump(fences: string[], now: number): void {\n for (const fence of new Set(fences)) {\n const next = Number(rows(\"UPDATE meta SET value = value + 1 WHERE key = 'sequence' RETURNING value\")[0]?.value);\n sql.exec(\n \"INSERT INTO fences (fence, epoch, updated_at) VALUES (?, ?, ?) ON CONFLICT (fence) DO UPDATE SET epoch = excluded.epoch, updated_at = excluded.updated_at\",\n fence,\n next,\n now,\n );\n }\n }\n\n function purge(fences: string[]): void {\n let budget = PURGE_LIMIT;\n for (const chunk of chunks([...new Set(fences)])) {\n if (budget <= 0) return;\n const keys = rows(\n `SELECT DISTINCT key FROM entry_fences WHERE fence IN (${placeholders(chunk.length)}) LIMIT ?`,\n ...chunk,\n budget,\n );\n deleteEntries(keys.map((row) => String(row.key)));\n budget -= keys.length;\n }\n }\n\n function collectFences(now: number): void {\n const cursor = rows(\"SELECT updated_at, fence FROM gc_cursor WHERE id = 1\")[0];\n const after = Number(cursor?.updated_at ?? -1);\n const afterFence = String(cursor?.fence ?? \"\");\n const batch = rows(\n `SELECT fence, updated_at, epoch,\n EXISTS (SELECT 1 FROM entry_fences WHERE entry_fences.fence = fences.fence) AS in_entries,\n EXISTS (SELECT 1 FROM leases WHERE leases.fence = fences.fence) AS in_leases\n FROM fences\n WHERE (updated_at, fence) > (?, ?) AND updated_at <= ? AND fence >= ? AND fence < ?\n ORDER BY updated_at, fence LIMIT ?`,\n after,\n afterFence,\n now - FENCE_RETENTION_MS,\n \"e:\",\n \"e;\",\n FENCE_COLLECT_LIMIT,\n );\n const deletable = batch.filter((row) => Number(row.in_entries) === 0 && Number(row.in_leases) === 0);\n for (const chunk of chunks(deletable.map((row) => String(row.fence)))) {\n sql.exec(`DELETE FROM fences WHERE fence IN (${placeholders(chunk.length)})`, ...chunk);\n }\n const highestDeletedEpoch = Math.max(0, ...deletable.map((row) => Number(row.epoch)));\n if (highestDeletedEpoch > 0) {\n sql.exec(\"UPDATE meta SET value = MAX(value, ?) WHERE key = 'gc_watermark'\", highestDeletedEpoch);\n }\n const last = batch[batch.length - 1];\n const [nextAt, nextFence] = batch.length < FENCE_COLLECT_LIMIT || !last ? [-1, \"\"] : [Number(last.updated_at), String(last.fence)];\n if (nextAt !== after || nextFence !== afterFence) {\n sql.exec(\"UPDATE gc_cursor SET updated_at = ?, fence = ? WHERE id = 1\", nextAt, nextFence);\n }\n }\n\n function sweep(now: number): void {\n const expired = rows(\"SELECT key FROM entries WHERE expires_at <= ? LIMIT ?\", now, SWEEP_LIMIT);\n deleteEntries(expired.map((row) => String(row.key)));\n sql.exec(\"DELETE FROM leases WHERE rowid IN (SELECT rowid FROM leases WHERE expires_at <= ? LIMIT ?)\", now, SWEEP_LIMIT);\n sql.exec(\"DELETE FROM locks WHERE rowid IN (SELECT rowid FROM locks WHERE expires_at <= ? LIMIT ?)\", now, SWEEP_LIMIT);\n collectFences(now);\n }\n\n function observeGeneration(generation: string | undefined, now: number): void {\n if (generation === undefined) return;\n const current = rows(\"SELECT value FROM generation WHERE id = 1\")[0]?.value;\n if (current === generation) return;\n bump([GLOBAL_FENCE], now);\n sql.exec(\"INSERT OR REPLACE INTO generation (id, value) VALUES (1, ?)\", generation);\n }\n\n function snapshotValid(snapshot: Record<string, number> | null): snapshot is Record<string, number> {\n return snapshot !== null && matches(snapshot, epochs(Object.keys(snapshot)));\n }\n\n return {\n inspectFences(request: InspectFencesRequest, now: number): InspectFencesResponse {\n assertRequest(isFenceList(request.fences) && isGeneration(request.generation), 'invalid inspectFences request');\n return transact(() => {\n observeGeneration(request.generation, now);\n return { epochs: epochs(request.fences), pending: pending(request.fences, now) };\n });\n },\n beginWrite(request: BeginWriteRequest, now: number): void {\n assertRequest(\n isFenceList(request.fences) && isDuration(request.leaseMs) && isGeneration(request.generation) && isToken(request.token),\n \"invalid beginWrite request\",\n );\n transact(() => {\n observeGeneration(request.generation, now);\n bump(request.fences, now);\n const expiresAt = now + clamp(request.leaseMs, MAX_LEASE_MS);\n for (const fence of new Set(request.fences)) {\n sql.exec(\"INSERT OR REPLACE INTO leases (token, fence, expires_at) VALUES (?, ?, ?)\", request.token, fence, expiresAt);\n }\n });\n },\n\n endWrite(request: EndWriteRequest, now: number): void {\n assertRequest(isFenceList(request.fences) && isToken(request.token), \"invalid endWrite request\");\n transact(() => {\n bump(request.fences, now);\n sql.exec(\"DELETE FROM leases WHERE token = ?\", request.token);\n purge(request.fences);\n sweep(now);\n });\n },\n\n invalidate(fences: string[], now: number): void {\n assertRequest(isFenceList(fences), \"invalid invalidate request\");\n transact(() => {\n bump(fences, now);\n purge(fences);\n sweep(now);\n });\n },\n\n read(request: ReadRequest, now: number): ReadResponse {\n assertRequest(\n isKey(request.key) && isFenceList(request.fences) && isDuration(request.lockMs) && isGeneration(request.generation),\n \"invalid read request\",\n );\n return transact((): ReadResponse => {\n observeGeneration(request.generation, now);\n const entry = rows(\"SELECT value, snapshot, soft_expires_at, expires_at FROM entries WHERE key = ?\", request.key)[0];\n const lock = rows(\"SELECT expires_at, kind, acquired_at FROM locks WHERE key = ?\", request.key)[0];\n const lockLive = lock !== undefined && Number(lock.expires_at) > now;\n if (entry && Number(entry.expires_at) > now) {\n const snapshot = parseSnapshot(String(entry.snapshot));\n const current = epochs([...request.fences, ...Object.keys(snapshot ?? {})]);\n if (snapshot && matches(snapshot, current)) {\n const refreshable =\n request.refresh === true && now >= Number(entry.soft_expires_at) && !lockLive && !pending(request.fences, now);\n return {\n epochs: Object.fromEntries(request.fences.map((fence) => [fence, current[fence] ?? 0])),\n freshUntil: Math.min(Number(entry.soft_expires_at), Number(entry.expires_at)),\n kind: \"hit\",\n refreshToken: refreshable ? writeLock(request.key, request.lockMs, now, \"refresh\") : null,\n value: String(entry.value),\n };\n }\n }\n if (entry) deleteEntries([request.key]);\n const isPending = pending(request.fences, now);\n const heldByFill = lockLive && lock.kind !== \"refresh\";\n const lockToken = isPending || heldByFill ? null : writeLock(request.key, request.lockMs, now, \"fill\");\n return {\n epochs: epochs(request.fences),\n kind: \"miss\",\n lockHeldForMs: heldByFill ? Math.max(0, now - Number(lock.acquired_at)) : null,\n lockToken,\n pending: isPending,\n };\n });\n },\n\n release(request: ReleaseRequest): void {\n assertRequest(isKey(request.key) && isToken(request.lockToken), \"invalid release request\");\n transact(() => sql.exec(\"DELETE FROM locks WHERE key = ? AND token = ?\", request.key, request.lockToken));\n },\n\n write(request: WriteRequest, now: number): WriteResult {\n assertRequest(\n typeof request.key === \"string\" &&\n typeof request.lockToken === \"string\" &&\n typeof request.value === \"string\" &&\n isSnapshot(request.snapshot) &&\n isDuration(request.ttlMs) &&\n isDuration(request.softTtlMs),\n \"invalid write request\",\n );\n return transact((): WriteResult => {\n const lock = rows(\"SELECT token, expires_at, seq FROM locks WHERE key = ?\", request.key)[0];\n if (!lock || lock.token !== request.lockToken || Number(lock.expires_at) <= now) return { ok: false, reason: \"lock\" };\n sql.exec(\"DELETE FROM locks WHERE key = ?\", request.key);\n const snapshotText = JSON.stringify(request.snapshot);\n const size = byteLength(request.value) + snapshotText.length + request.key.length;\n const oversize = !isKey(request.key) || request.ttlMs > MAX_TTL_MS || byteLength(request.value) > MAX_VALUE_BYTES;\n if (oversize) return { ok: false, reason: \"invalid\" };\n const capturedMissing = Object.values(request.snapshot).some((epoch) => epoch === 0);\n if (capturedMissing && Number(lock.seq) < metaValue(\"gc_watermark\")) return { ok: false, reason: \"fence\" };\n if (!snapshotValid(request.snapshot)) return { ok: false, reason: \"fence\" };\n deleteEntries([request.key]);\n if (!makeRoom(size)) return { ok: false, reason: \"full\" };\n sql.exec(\n \"INSERT INTO entries (key, value, snapshot, soft_expires_at, expires_at, size) VALUES (?, ?, ?, ?, ?, ?)\",\n request.key,\n request.value,\n snapshotText,\n now + Math.min(request.softTtlMs, request.ttlMs),\n now + request.ttlMs,\n size,\n );\n sql.exec(\"UPDATE meta SET value = value + ? WHERE key = 'entry_bytes'\", size);\n for (const fence of Object.keys(request.snapshot)) {\n sql.exec(\"INSERT INTO entry_fences (fence, key) VALUES (?, ?)\", fence, request.key);\n }\n sweep(now);\n return { ok: true };\n });\n },\n };\n}\n\nexport type CoordinatorCore = ReturnType<typeof createCoordinatorCore>;\n","import { DurableObject } from \"cloudflare:workers\";\n\nimport type {\n BeginWriteRequest,\n EndWriteRequest,\n InspectFencesRequest,\n InspectFencesResponse,\n ReadRequest,\n ReadResponse,\n ReleaseRequest,\n WriteRequest,\n WriteResult,\n} from \"../core/types\";\n\nimport { type CoordinatorCore, createCoordinatorCore, migrate, type Transact } from \"./coordinator-core\";\n\nexport class CacheCoordinator<Env = unknown> extends DurableObject<Env> {\n private readonly core: CoordinatorCore;\n\n constructor(ctx: DurableObjectState, env: Env) {\n super(ctx, env);\n const transact: Transact = (run) => ctx.storage.transactionSync(run);\n migrate(ctx.storage.sql, transact);\n this.core = createCoordinatorCore(ctx.storage.sql, () => crypto.randomUUID(), transact);\n }\n\n inspectFences(request: InspectFencesRequest): InspectFencesResponse {\n return this.core.inspectFences(request, Date.now());\n }\n\n read(request: ReadRequest): ReadResponse {\n return this.core.read(request, Date.now());\n }\n\n write(request: WriteRequest): WriteResult {\n return this.core.write(request, Date.now());\n }\n\n release(request: ReleaseRequest): void {\n this.core.release(request);\n }\n\n beginWrite(request: BeginWriteRequest): void {\n this.core.beginWrite(request, Date.now());\n }\n\n endWrite(request: EndWriteRequest): void {\n this.core.endWrite(request, Date.now());\n }\n\n invalidate(fences: string[]): void {\n this.core.invalidate(fences, Date.now());\n }\n}\n","import { createRegionalCache } from \"../d1/regional\";\nimport { withinCoordinatorDeadline } from \"../d1/deadline\";\nimport { boundedD1Store } from \"../d1/bounded-store\";\nimport type {\n CacheStore,\n EndWriteRequest,\n ReadRequest,\n ReadResponse,\n} from \"../core/types\";\nimport { GLOBAL_FENCE } from \"../core/fences\";\n\nexport interface RegionalStoreOptions {\n namespace: string;\n generation: string;\n ttlMs: number;\n enabled?: boolean;\n cache?: () => Pick<Cache, \"match\" | \"put\">;\n now?: () => number;\n waitUntil?: (promise: Promise<unknown>) => void;\n}\n\ntype Fill = {\n key: string;\n generation: string;\n fences: string[];\n epochs: Record<string, number>;\n revision: number;\n started: number;\n expires: number;\n};\ntype TokenQueue = { tail: Promise<void>; count: number };\ntype State = {\n revision: number;\n floor: number;\n pending: Set<string>;\n tokenQueues: Map<string, TokenQueue>;\n invalidations: number;\n unsafe: boolean;\n unsafeVersion: number;\n overflow: boolean;\n failedEnds: Map<string, EndWriteRequest>;\n repairing: boolean;\n nextRepairAt: number;\n fills: Map<string, Fill>;\n refreshes: Set<string>;\n};\nconst states = new Map<string, State>();\nconst MAX_NAMESPACES = 4096;\nconst MAX_FILLS = 1024;\nconst MAX_REFRESHES = 1024;\nconst MAX_FAILED_ENDS = 1024;\nconst MAX_TOKEN_QUEUES = 1024;\nconst MAX_TOKEN_OPERATIONS = 1024;\nconst REPAIR_BATCH = 4;\nconst REPAIR_BACKOFF_MS = 1000;\nconst fencesFor = (fences: readonly string[]) => [...new Set(fences)].sort();\n\nfunction stateFor(identity: string): State | undefined {\n const existing = states.get(identity);\n if (existing) return existing;\n if (states.size >= MAX_NAMESPACES) return undefined;\n const state: State = {\n revision: 0,\n floor: -1,\n pending: new Set(),\n tokenQueues: new Map(),\n invalidations: 0,\n unsafe: false,\n unsafeVersion: 0,\n overflow: false,\n failedEnds: new Map(),\n repairing: false,\n nextRepairAt: 0,\n fills: new Map(),\n refreshes: new Set(),\n };\n states.set(identity, state);\n return state;\n}\n\nexport function createRegionalStore(\n store: CacheStore,\n options: RegionalStoreOptions,\n): CacheStore {\n const { namespace, generation, ttlMs } = options;\n if (\n !namespace ||\n !generation ||\n namespace.length > 8192 ||\n generation.length > 8192 ||\n !Number.isFinite(ttlMs) ||\n ttlMs <= 0 ||\n ttlMs > 5000 ||\n new TextEncoder().encode(JSON.stringify([namespace, generation]))\n .byteLength > 16_384\n )\n return store;\n const state = stateFor(namespace);\n if (!state) return store;\n const now = options.now ?? Date.now;\n const regional = createRegionalCache(5000, undefined, {\n cache: options.cache,\n now,\n });\n const renewalStore = boundedD1Store(store);\n const inspectFences = store.inspectFences?.bind(store);\n const enabled = options.enabled !== false;\n const blocked = () =>\n state.unsafe ||\n state.overflow ||\n state.invalidations > 0 ||\n state.pending.size > 0 ||\n state.tokenQueues.size > 0;\n const markUnsafe = () => {\n state.unsafe = true;\n state.unsafeVersion++;\n };\n const deferRepair = () => {\n const at = now();\n if (!Number.isSafeInteger(at)) {\n markUnsafe();\n state.nextRepairAt = Infinity;\n return;\n }\n state.nextRepairAt = Math.max(state.nextRepairAt, at + REPAIR_BACKOFF_MS);\n };\n const bump = () => {\n state.revision++;\n const at = now();\n if (!Number.isSafeInteger(at)) markUnsafe();\n else state.floor = Math.max(state.floor, at);\n };\n const serializeToken = <T>(\n token: string,\n action: () => Promise<T>,\n ): Promise<T> => {\n let queue = state.tokenQueues.get(token);\n if (\n (!queue && state.tokenQueues.size >= MAX_TOKEN_QUEUES) ||\n (queue && queue.count >= MAX_TOKEN_OPERATIONS)\n ) {\n state.overflow = true;\n bump();\n return Promise.reject(\n new Error(\"Regional write queue capacity exceeded\"),\n );\n }\n if (!queue) {\n queue = { tail: Promise.resolve(), count: 0 };\n state.tokenQueues.set(token, queue);\n }\n const current = queue;\n current.count++;\n const result = current.tail.then(action).finally(() => {\n current.count--;\n if (current.count === 0 && state.tokenQueues.get(token) === current)\n state.tokenQueues.delete(token);\n });\n current.tail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n const keyFor = (key: string, fences: readonly string[]) =>\n regional.regionalKey(ttlMs, [\n \"cache-store-v2\",\n namespace,\n generation,\n key,\n fencesFor(fences),\n ]);\n const clean = () => {\n for (const [token, fill] of state.fills)\n if (fill.expires <= now()) state.fills.delete(token);\n };\n const sameFences = (left: readonly string[], right: readonly string[]) =>\n left.length === right.length &&\n left.every((value, i) => value === right[i]);\n const remember = (\n token: string | null,\n request: ReadRequest,\n epochs: Record<string, number>,\n revision: number,\n started: number,\n ) => {\n if (\n !enabled ||\n !token ||\n request.generation !== generation ||\n !Number.isFinite(request.lockMs) ||\n request.lockMs <= 0 ||\n !sameFences(fencesFor(request.fences), fencesFor(Object.keys(epochs))) ||\n Object.values(epochs).some(\n (epoch) => !Number.isSafeInteger(epoch) || epoch < 0,\n ) ||\n blocked() ||\n revision !== state.revision\n )\n return;\n clean();\n if (state.fills.size >= MAX_FILLS && !state.fills.has(token)) return;\n state.fills.set(token, {\n key: request.key,\n generation,\n fences: fencesFor(request.fences),\n epochs: Object.fromEntries(Object.entries(epochs)),\n revision,\n started,\n expires: now() + request.lockMs,\n });\n };\n const payload = (\n value: unknown,\n ): {\n value: string;\n epochs: Record<string, number>;\n sourceStarted: number;\n } | null => {\n if (\n !value ||\n typeof value !== \"object\" ||\n !(\"value\" in value) ||\n typeof value.value !== \"string\" ||\n !(\"sourceStarted\" in value) ||\n typeof value.sourceStarted !== \"number\" ||\n !Number.isSafeInteger(value.sourceStarted) ||\n value.sourceStarted < 0 ||\n value.sourceStarted > now() ||\n !(\"epochs\" in value) ||\n !value.epochs ||\n typeof value.epochs !== \"object\" ||\n Array.isArray(value.epochs)\n )\n return null;\n const epochs: Record<string, number> = {};\n for (const [name, epoch] of Object.entries(value.epochs)) {\n if (\n !Number.isSafeInteger(epoch) ||\n typeof epoch !== \"number\" ||\n epoch < 0\n )\n return null;\n Object.defineProperty(epochs, name, {\n value: epoch,\n enumerable: true,\n configurable: true,\n });\n }\n return { value: value.value, epochs, sourceStarted: value.sourceStarted };\n };\n const promote = async (\n revision: number,\n key: string,\n fences: readonly string[],\n started: number,\n lifetime: number,\n value: { value: string; epochs: Record<string, number> },\n ) => {\n if (\n !enabled ||\n blocked() ||\n revision !== state.revision ||\n started <= state.floor ||\n lifetime <= 0\n )\n return;\n const regionalKey = await keyFor(key, fences);\n if (blocked() || revision !== state.revision || started <= state.floor)\n return;\n await regional.regionalWrite(\n regionalKey,\n Math.min(ttlMs, lifetime),\n started,\n { ...value, sourceStarted: started },\n );\n };\n const refreshAhead = (\n regionalKey: string,\n request: ReadRequest,\n revision: number,\n ) => {\n if (\n !options.waitUntil ||\n blocked() ||\n revision !== state.revision ||\n state.refreshes.has(regionalKey) ||\n state.refreshes.size >= MAX_REFRESHES\n )\n return;\n const copy = { ...request, fences: [...request.fences], refresh: false };\n state.refreshes.add(regionalKey);\n let cancelled = false;\n const task = Promise.resolve()\n .then(async () => {\n if (cancelled || blocked() || revision !== state.revision) return;\n const started = now();\n const result = await renewalStore.read(copy);\n const token =\n result.kind === \"miss\" ? result.lockToken : result.refreshToken;\n if (token) {\n try {\n await renewalStore.release({ key: copy.key, lockToken: token });\n } catch {\n /* The coordinator lock expires. */\n }\n return;\n }\n if (\n result.kind !== \"hit\" ||\n typeof result.freshUntil !== \"number\" ||\n !Number.isSafeInteger(result.freshUntil) ||\n result.freshUntil <= started ||\n !sameFences(\n fencesFor(copy.fences),\n fencesFor(Object.keys(result.epochs)),\n ) ||\n Object.values(result.epochs).some(\n (epoch) => !Number.isSafeInteger(epoch) || epoch < 0,\n )\n )\n return;\n await promote(\n revision,\n copy.key,\n copy.fences,\n started,\n result.freshUntil - started,\n { value: result.value, epochs: result.epochs },\n );\n })\n .catch(() => undefined)\n .finally(() => {\n state.refreshes.delete(regionalKey);\n });\n try {\n options.waitUntil(task);\n } catch {\n cancelled = true;\n }\n };\n const repair = () => {\n if (\n !options.waitUntil ||\n state.repairing ||\n now() < state.nextRepairAt ||\n (!state.unsafe && state.failedEnds.size === 0)\n )\n return;\n state.repairing = true;\n const failed = [...state.failedEnds.entries()]\n .filter(([token]) => !state.tokenQueues.has(token))\n .slice(0, REPAIR_BATCH);\n const unsafeVersion = state.unsafe ? state.unsafeVersion : null;\n let cancelled = false;\n const task = Promise.resolve()\n .then(async () => {\n if (cancelled) return;\n let failedAttempt = false;\n for (const [token, request] of failed) {\n if (state.failedEnds.get(token) !== request) continue;\n try {\n if (state.tokenQueues.has(token)) continue;\n await withinCoordinatorDeadline(\n serializeToken(token, async () => {\n if (state.failedEnds.get(token) !== request) return;\n await store.endWrite({\n token: request.token,\n fences: [...request.fences],\n });\n if (state.failedEnds.get(token) === request) {\n state.failedEnds.delete(token);\n state.pending.delete(token);\n bump();\n }\n }),\n );\n } catch {\n failedAttempt = true;\n if (state.failedEnds.get(token) === request) {\n state.failedEnds.delete(token);\n state.failedEnds.set(token, request);\n }\n }\n }\n if (unsafeVersion !== null) {\n try {\n await withinCoordinatorDeadline(store.invalidate([GLOBAL_FENCE]));\n if (state.unsafeVersion === unsafeVersion) {\n state.unsafe = false;\n bump();\n }\n } catch {\n failedAttempt = true;\n }\n }\n if (failedAttempt) deferRepair();\n })\n .catch(() => {\n deferRepair();\n })\n .finally(() => {\n state.repairing = false;\n });\n try {\n options.waitUntil(task);\n } catch {\n cancelled = true;\n deferRepair();\n }\n };\n return {\n ...(inspectFences ? { inspectFences } : {}),\n beginWrite(request) {\n const attempted = { ...request, fences: [...request.fences] };\n if (state.failedEnds.has(attempted.token)) state.overflow = true;\n return serializeToken(attempted.token, async () => {\n const existed = state.pending.has(attempted.token);\n if (state.failedEnds.has(attempted.token)) state.overflow = true;\n state.pending.add(attempted.token);\n bump();\n try {\n await store.beginWrite(attempted);\n } catch (error) {\n if (!existed) state.pending.delete(attempted.token);\n bump();\n throw error;\n }\n });\n },\n endWrite(request) {\n const attempted = { token: request.token, fences: [...request.fences] };\n return serializeToken(attempted.token, async () => {\n const priorFailure = state.failedEnds.get(attempted.token);\n state.pending.add(attempted.token);\n state.invalidations++;\n bump();\n try {\n await store.endWrite({\n token: attempted.token,\n fences: [...attempted.fences],\n });\n if (\n state.failedEnds.get(attempted.token) === priorFailure &&\n (!priorFailure ||\n sameFences(\n fencesFor(priorFailure.fences),\n fencesFor(attempted.fences),\n ))\n ) {\n state.failedEnds.delete(attempted.token);\n state.pending.delete(attempted.token);\n }\n } catch (error) {\n const previous = state.failedEnds.get(attempted.token);\n if (\n previous &&\n !sameFences(fencesFor(previous.fences), fencesFor(attempted.fences))\n )\n state.overflow = true;\n else if (previous || state.failedEnds.size < MAX_FAILED_ENDS)\n state.failedEnds.set(attempted.token, attempted);\n else state.overflow = true;\n deferRepair();\n throw error;\n } finally {\n state.invalidations--;\n bump();\n }\n });\n },\n async invalidate(fences) {\n state.invalidations++;\n bump();\n try {\n await store.invalidate(fences);\n } catch (error) {\n markUnsafe();\n deferRepair();\n throw error;\n } finally {\n state.invalidations--;\n bump();\n }\n },\n async read(request): Promise<ReadResponse> {\n if (blocked()) repair();\n const started = now();\n const revision = state.revision;\n if (enabled && request.generation === generation && !blocked()) {\n const key = await keyFor(request.key, request.fences);\n const hit = await regional.regionalRead(key, ttlMs);\n const cached = hit && payload(hit.value);\n if (\n hit &&\n cached &&\n revision === state.revision &&\n !blocked() &&\n cached.sourceStarted > state.floor &&\n hit.expires > now() &&\n hit.expires > cached.sourceStarted &&\n hit.expires <= cached.sourceStarted + ttlMs &&\n sameFences(\n fencesFor(request.fences),\n fencesFor(Object.keys(cached.epochs)),\n )\n ) {\n if (key && hit.expires - now() <= ttlMs / 2)\n refreshAhead(key, request, revision);\n return {\n kind: \"hit\",\n value: cached.value,\n epochs: cached.epochs,\n refreshToken: null,\n freshUntil: hit.expires,\n };\n }\n }\n const result = await store.read(request);\n if (result.kind === \"miss\")\n remember(\n result.pending ? null : result.lockToken,\n request,\n result.epochs,\n revision,\n started,\n );\n else {\n remember(\n result.refreshToken,\n request,\n result.epochs,\n revision,\n started,\n );\n if (\n request.generation === generation &&\n result.refreshToken === null &&\n typeof result.freshUntil === \"number\" &&\n Number.isSafeInteger(result.freshUntil) &&\n result.freshUntil > started &&\n sameFences(\n fencesFor(request.fences),\n fencesFor(Object.keys(result.epochs)),\n )\n ) {\n await promote(\n revision,\n request.key,\n request.fences,\n started,\n result.freshUntil - started,\n { value: result.value, epochs: result.epochs },\n );\n }\n }\n return result;\n },\n async release(request) {\n state.fills.delete(request.lockToken);\n await store.release(request);\n },\n async write(request) {\n const started = now();\n clean();\n const fill = state.fills.get(request.lockToken);\n state.fills.delete(request.lockToken);\n const result = await store.write(request);\n if (\n result.ok &&\n fill &&\n fill.key === request.key &&\n fill.generation === generation &&\n fill.expires > started &&\n Object.keys(request.snapshot).length > 0 &&\n Object.entries(request.snapshot).every(\n ([fence, epoch]) =>\n Object.hasOwn(fill.epochs, fence) && fill.epochs[fence] === epoch,\n )\n ) {\n await promote(\n fill.revision,\n request.key,\n fill.fences,\n Math.min(started, fill.started),\n Math.min(ttlMs, request.ttlMs, request.softTtlMs),\n { value: request.value, epochs: fill.epochs },\n );\n }\n return result;\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { D as D1CacheProfile } from '../profile--LBtbQI_.js';
|
|
2
|
+
|
|
3
|
+
interface D1WorkerConfig {
|
|
4
|
+
name?: string;
|
|
5
|
+
main?: string;
|
|
6
|
+
vars?: Record<string, unknown>;
|
|
7
|
+
d1_databases?: Array<{
|
|
8
|
+
binding: string;
|
|
9
|
+
database_id: string;
|
|
10
|
+
}>;
|
|
11
|
+
durable_objects?: {
|
|
12
|
+
bindings: Array<{
|
|
13
|
+
name: string;
|
|
14
|
+
class_name: string;
|
|
15
|
+
script_name?: string;
|
|
16
|
+
environment?: string;
|
|
17
|
+
}>;
|
|
18
|
+
};
|
|
19
|
+
migrations?: Array<{
|
|
20
|
+
tag: string;
|
|
21
|
+
new_sqlite_classes?: string[];
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
declare function d1CacheProblem(config: D1WorkerConfig, profile: D1CacheProfile, coordinatorScript?: string): string | null;
|
|
25
|
+
declare function d1CachePairProblem(admin: D1WorkerConfig, writer: D1WorkerConfig, profile: D1CacheProfile, writerEntry: string): string | null;
|
|
26
|
+
declare function refreshD1CacheDatabaseIds(config: D1WorkerConfig, profile: D1CacheProfile): void;
|
|
27
|
+
type D1ConfigEdit = {
|
|
28
|
+
path: string[];
|
|
29
|
+
value: unknown;
|
|
30
|
+
};
|
|
31
|
+
type D1WriterEdits = {
|
|
32
|
+
ok: true;
|
|
33
|
+
edits: D1ConfigEdit[];
|
|
34
|
+
} | {
|
|
35
|
+
ok: false;
|
|
36
|
+
problem: string;
|
|
37
|
+
};
|
|
38
|
+
declare function d1WriterCacheEdits(admin: D1WorkerConfig, writer: D1WorkerConfig, profile: D1CacheProfile, writerEntry: string): D1WriterEdits;
|
|
39
|
+
declare function applyD1ConfigEdits(config: D1WorkerConfig, edits: readonly D1ConfigEdit[]): void;
|
|
40
|
+
|
|
41
|
+
export { type D1ConfigEdit, type D1WorkerConfig, type D1WriterEdits, applyD1ConfigEdits, d1CachePairProblem, d1CacheProblem, d1WriterCacheEdits, refreshD1CacheDatabaseIds };
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { isD1BindingName } from '../chunk-AENVFT2S.js';
|
|
2
|
+
|
|
3
|
+
// src/d1/config.ts
|
|
4
|
+
var idPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
5
|
+
var hints = /* @__PURE__ */ new Set(["wnam", "enam", "sam", "weur", "eeur", "apac", "oc", "afr", "me"]);
|
|
6
|
+
var bindingsOf = (config, profile) => (config.d1_databases ?? []).filter(({ binding }) => isD1BindingName(binding, profile));
|
|
7
|
+
function d1CacheProblem(config, profile, coordinatorScript) {
|
|
8
|
+
const lease = profile.readResponseLease;
|
|
9
|
+
const maxSeconds = lease?.maxSeconds ?? 5;
|
|
10
|
+
const refreshAhead = lease?.refreshAheadSeconds ?? 0;
|
|
11
|
+
if (lease && (!Number.isInteger(maxSeconds) || maxSeconds < 1 || maxSeconds > 300 || !Number.isInteger(refreshAhead) || refreshAhead < 0 || refreshAhead > maxSeconds)) return "Invalid response lease duration or refresh-ahead window.";
|
|
12
|
+
const vars = config.vars ?? {};
|
|
13
|
+
const field = (name) => vars[`${profile.envPrefix}_${name}`];
|
|
14
|
+
const enabled = field("ENABLED");
|
|
15
|
+
if (enabled === void 0 || enabled === "false") return null;
|
|
16
|
+
if (enabled !== "true") return `${profile.envPrefix}_ENABLED must be true or false.`;
|
|
17
|
+
const reads = field("READS_ENABLED");
|
|
18
|
+
if (reads !== void 0 && reads !== "true" && reads !== "false") return `${profile.envPrefix}_READS_ENABLED must be true or false.`;
|
|
19
|
+
const bindings = bindingsOf(config, profile);
|
|
20
|
+
if (profile.bindingNames.some((name) => !bindings.some(({ binding }) => binding === name)) || bindings.some(({ database_id }) => !idPattern.test(database_id))) return "Cache requires physical D1 UUIDs for every configured binding.";
|
|
21
|
+
let map;
|
|
22
|
+
try {
|
|
23
|
+
const raw = field("DATABASE_IDS");
|
|
24
|
+
if (typeof raw !== "string") throw new Error();
|
|
25
|
+
map = JSON.parse(raw);
|
|
26
|
+
} catch {
|
|
27
|
+
return `${profile.envPrefix}_DATABASE_IDS must contain the current D1 binding map.`;
|
|
28
|
+
}
|
|
29
|
+
const expected = Object.fromEntries(bindings.map(({ binding, database_id }) => [binding, database_id]));
|
|
30
|
+
if (!map || typeof map !== "object" || Array.isArray(map) || Object.keys(map).length !== bindings.length || Object.entries(expected).some(([key, value]) => Reflect.get(map, key) !== value)) return `${profile.envPrefix}_DATABASE_IDS differs from d1_databases; run setup or update the map.`;
|
|
31
|
+
const generation = field("GENERATION");
|
|
32
|
+
if (typeof generation !== "string" || !generation.trim() || generation.length > 256) return "Cache requires a generation of at most 256 characters.";
|
|
33
|
+
const location = field("LOCATION_HINT");
|
|
34
|
+
if (location !== void 0 && (typeof location !== "string" || !hints.has(location))) return "Invalid cache location hint.";
|
|
35
|
+
const coordinators = config.durable_objects?.bindings?.filter(({ name }) => name === `${profile.envPrefix}_COORDINATOR`) ?? [];
|
|
36
|
+
const coordinator = coordinators[0];
|
|
37
|
+
if (coordinators.length !== 1 || !coordinator || coordinator.environment !== void 0 || coordinator.class_name !== profile.coordinatorClass || (coordinatorScript ? coordinator.script_name !== coordinatorScript : coordinator.script_name !== void 0)) return "Cache coordinator binding is missing or points to the wrong Worker.";
|
|
38
|
+
if (!coordinatorScript && !config.migrations?.some(({ new_sqlite_classes }) => new_sqlite_classes?.includes(profile.coordinatorClass))) return "Cache requires a SQLite Durable Object migration.";
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
function d1CachePairProblem(admin, writer, profile, writerEntry) {
|
|
42
|
+
const field = (config, name) => config.vars?.[`${profile.envPrefix}_${name}`];
|
|
43
|
+
const a = field(admin, "ENABLED") === "true";
|
|
44
|
+
const b = field(writer, "ENABLED") === "true";
|
|
45
|
+
if (a !== b) return "Admin and writer must enable or disable the cache together.";
|
|
46
|
+
if (!a) return null;
|
|
47
|
+
const problem = d1CacheProblem(admin, profile) ?? d1CacheProblem(writer, profile, admin.name);
|
|
48
|
+
if (problem) return problem;
|
|
49
|
+
if (field(admin, "GENERATION") !== field(writer, "GENERATION") || (field(admin, "LOCATION_HINT") ?? "weur") !== (field(writer, "LOCATION_HINT") ?? "weur")) return "Admin and writer must share cache generation and location hint.";
|
|
50
|
+
const adminIds = Object.fromEntries(bindingsOf(admin, profile).map(({ binding, database_id }) => [binding, database_id]));
|
|
51
|
+
if (bindingsOf(writer, profile).some(({ binding, database_id }) => adminIds[binding] !== database_id)) return "Admin and writer D1 identities differ.";
|
|
52
|
+
if (writer.main !== writerEntry) return "Writer must use the cache-aware Worker entry.";
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
function refreshD1CacheDatabaseIds(config, profile) {
|
|
56
|
+
if (config.vars?.[`${profile.envPrefix}_ENABLED`] !== "true") return;
|
|
57
|
+
config.vars[`${profile.envPrefix}_DATABASE_IDS`] = JSON.stringify(Object.fromEntries(bindingsOf(config, profile).map(({ binding, database_id }) => [binding, database_id])));
|
|
58
|
+
}
|
|
59
|
+
function d1WriterCacheEdits(admin, writer, profile, writerEntry) {
|
|
60
|
+
const prefix = profile.envPrefix;
|
|
61
|
+
const enabled = admin.vars?.[`${prefix}_ENABLED`] === "true";
|
|
62
|
+
if (!enabled && writer.vars?.[`${prefix}_ENABLED`] !== "true") return { ok: true, edits: [] };
|
|
63
|
+
const adminIds = new Map(bindingsOf(admin, profile).map(({ binding, database_id }) => [binding, database_id]));
|
|
64
|
+
const databases = bindingsOf(writer, profile);
|
|
65
|
+
if (profile.bindingNames.some((name) => !databases.some(({ binding }) => binding === name)) || databases.some(({ binding, database_id }) => adminIds.get(binding) !== database_id)) return { ok: false, problem: "Writer D1 bindings differ from admin." };
|
|
66
|
+
if (enabled && (!admin.name || !admin.vars?.[`${prefix}_GENERATION`])) return { ok: false, problem: "Admin cache requires a Worker name and generation." };
|
|
67
|
+
const bindings = writer.durable_objects?.bindings ?? [];
|
|
68
|
+
const coordinators = bindings.filter(({ name }) => name === `${prefix}_COORDINATOR`);
|
|
69
|
+
const coordinator = coordinators[0];
|
|
70
|
+
if (coordinators.length > 1 || coordinator && (coordinator.environment !== void 0 || coordinator.class_name !== profile.coordinatorClass || coordinator.script_name !== admin.name)) return { ok: false, problem: "Writer cache coordinator conflicts with the admin Worker." };
|
|
71
|
+
const edits = [{ path: ["main"], value: writerEntry }, { path: ["vars", `${prefix}_ENABLED`], value: enabled ? "true" : "false" }];
|
|
72
|
+
if (enabled) {
|
|
73
|
+
edits.push({ path: ["vars", `${prefix}_GENERATION`], value: admin.vars?.[`${prefix}_GENERATION`] });
|
|
74
|
+
edits.push({ path: ["vars", `${prefix}_READS_ENABLED`], value: admin.vars?.[`${prefix}_READS_ENABLED`] });
|
|
75
|
+
edits.push({ path: ["vars", `${prefix}_DATABASE_IDS`], value: JSON.stringify(Object.fromEntries(databases.map(({ binding, database_id }) => [binding, database_id]))) });
|
|
76
|
+
edits.push({ path: ["vars", `${prefix}_LOCATION_HINT`], value: admin.vars?.[`${prefix}_LOCATION_HINT`] });
|
|
77
|
+
if (!coordinator) edits.push({ path: ["durable_objects", "bindings"], value: [...bindings, { name: `${prefix}_COORDINATOR`, class_name: profile.coordinatorClass, script_name: admin.name }] });
|
|
78
|
+
}
|
|
79
|
+
return { ok: true, edits };
|
|
80
|
+
}
|
|
81
|
+
function applyD1ConfigEdits(config, edits) {
|
|
82
|
+
for (const { path, value } of edits) {
|
|
83
|
+
let node = config;
|
|
84
|
+
for (const key of path.slice(0, -1)) {
|
|
85
|
+
let child = Reflect.get(node, key);
|
|
86
|
+
if (!child || typeof child !== "object") {
|
|
87
|
+
child = {};
|
|
88
|
+
Reflect.set(node, key, child);
|
|
89
|
+
}
|
|
90
|
+
if (typeof child !== "object" || child === null) throw new Error("Invalid configuration path");
|
|
91
|
+
node = child;
|
|
92
|
+
}
|
|
93
|
+
const last = path.at(-1);
|
|
94
|
+
if (!last) throw new Error("Invalid configuration path");
|
|
95
|
+
if (value === void 0) Reflect.deleteProperty(node, last);
|
|
96
|
+
else Reflect.set(node, last, value);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export { applyD1ConfigEdits, d1CachePairProblem, d1CacheProblem, d1WriterCacheEdits, refreshD1CacheDatabaseIds };
|
|
101
|
+
//# sourceMappingURL=config.js.map
|
|
102
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/d1/config.ts"],"names":[],"mappings":";;;AAUA,IAAM,SAAA,GAAY,iEAAA;AAClB,IAAM,KAAA,mBAAQ,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,IAAI,CAAC,CAAA;AACxF,IAAM,aAAa,CAAC,MAAA,EAAwB,OAAA,KAAA,CAA6B,MAAA,CAAO,gBAAgB,EAAC,EAAG,MAAA,CAAO,CAAC,EAAE,OAAA,EAAQ,KAAM,eAAA,CAAgB,OAAA,EAAS,OAAO,CAAC,CAAA;AAEtJ,SAAS,cAAA,CAAe,MAAA,EAAwB,OAAA,EAAyB,iBAAA,EAA2C;AACzH,EAAA,MAAM,QAAQ,OAAA,CAAQ,iBAAA;AACtB,EAAA,MAAM,UAAA,GAAa,OAAO,UAAA,IAAc,CAAA;AACxC,EAAA,MAAM,YAAA,GAAe,OAAO,mBAAA,IAAuB,CAAA;AACnD,EAAA,IAAI,UAAU,CAAC,MAAA,CAAO,UAAU,UAAU,CAAA,IAAK,aAAa,CAAA,IAAK,UAAA,GAAa,OAAO,CAAC,MAAA,CAAO,UAAU,YAAY,CAAA,IAAK,eAAe,CAAA,IAAK,YAAA,GAAe,aAAa,OAAO,0DAAA;AAC/K,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,IAAQ,EAAC;AAC7B,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAiB,IAAA,CAAK,GAAG,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AACnE,EAAA,MAAM,OAAA,GAAU,MAAM,SAAS,CAAA;AAC/B,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,OAAA,EAAS,OAAO,IAAA;AACzD,EAAA,IAAI,OAAA,KAAY,MAAA,EAAQ,OAAO,CAAA,EAAG,QAAQ,SAAS,CAAA,+BAAA,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,MAAM,eAAe,CAAA;AACnC,EAAA,IAAI,KAAA,KAAU,UAAa,KAAA,KAAU,MAAA,IAAU,UAAU,OAAA,EAAS,OAAO,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,qCAAA,CAAA;AAC7F,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAA,EAAQ,OAAO,CAAA;AAC3C,EAAA,IAAI,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,CAAC,IAAA,KAAS,CAAC,QAAA,CAAS,IAAA,CAAK,CAAC,EAAE,OAAA,EAAQ,KAAM,OAAA,KAAY,IAAI,CAAC,CAAA,IAAK,QAAA,CAAS,IAAA,CAAK,CAAC,EAAE,WAAA,EAAY,KAAM,CAAC,SAAA,CAAU,IAAA,CAAK,WAAW,CAAC,CAAA,EAAG,OAAO,gEAAA;AACvK,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AAAE,IAAA,MAAM,GAAA,GAAM,MAAM,cAAc,CAAA;AAAG,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,MAAM,IAAI,KAAA,EAAM;AAAG,IAAA,GAAA,GAAM,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EAAG,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,CAAA,EAAG,QAAQ,SAAS,CAAA,sDAAA,CAAA;AAAA,EAA0D;AAC/M,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,CAAY,QAAA,CAAS,IAAI,CAAC,EAAE,OAAA,EAAS,WAAA,EAAY,KAAM,CAAC,OAAA,EAAS,WAAW,CAAC,CAAC,CAAA;AACtG,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,MAAM,OAAA,CAAQ,GAAG,CAAA,IAAK,MAAA,CAAO,KAAK,GAAG,CAAA,CAAE,MAAA,KAAW,QAAA,CAAS,UAAU,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,KAAK,CAAC,CAAC,GAAA,EAAK,KAAK,MAAM,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,GAAG,MAAM,KAAK,CAAA,EAAG,OAAO,CAAA,EAAG,QAAQ,SAAS,CAAA,qEAAA,CAAA;AACzN,EAAA,MAAM,UAAA,GAAa,MAAM,YAAY,CAAA;AACrC,EAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,CAAC,UAAA,CAAW,MAAK,IAAK,UAAA,CAAW,MAAA,GAAS,GAAA,EAAK,OAAO,wDAAA;AAC5F,EAAA,MAAM,QAAA,GAAW,MAAM,eAAe,CAAA;AACtC,EAAA,IAAI,QAAA,KAAa,MAAA,KAAc,OAAO,QAAA,KAAa,QAAA,IAAY,CAAC,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,CAAA,EAAI,OAAO,8BAAA;AAC7F,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,eAAA,EAAiB,QAAA,EAAU,OAAO,CAAC,EAAE,IAAA,EAAK,KAAM,SAAS,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,YAAA,CAAc,KAAK,EAAC;AAC7H,EAAA,MAAM,WAAA,GAAc,aAAa,CAAC,CAAA;AAClC,EAAA,IAAI,aAAa,MAAA,KAAW,CAAA,IAAK,CAAC,WAAA,IAAe,WAAA,CAAY,gBAAgB,MAAA,IAAa,WAAA,CAAY,eAAe,OAAA,CAAQ,gBAAA,KAAqB,oBAAoB,WAAA,CAAY,WAAA,KAAgB,oBAAoB,WAAA,CAAY,WAAA,KAAgB,SAAY,OAAO,qEAAA;AACrQ,EAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,MAAA,CAAO,UAAA,EAAY,KAAK,CAAC,EAAE,kBAAA,EAAmB,KAAM,oBAAoB,QAAA,CAAS,OAAA,CAAQ,gBAAgB,CAAC,GAAG,OAAO,mDAAA;AAC/I,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,kBAAA,CAAmB,KAAA,EAAuB,MAAA,EAAwB,OAAA,EAAyB,WAAA,EAAoC;AAC7I,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,EAAwB,IAAA,KAAiB,MAAA,CAAO,IAAA,GAAO,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AACpG,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,SAAS,CAAA,KAAM,MAAA;AACtC,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,SAAS,CAAA,KAAM,MAAA;AACvC,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,6DAAA;AACpB,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,MAAM,OAAA,GAAU,eAAe,KAAA,EAAO,OAAO,KAAK,cAAA,CAAe,MAAA,EAAQ,OAAA,EAAS,KAAA,CAAM,IAAI,CAAA;AAC5F,EAAA,IAAI,SAAS,OAAO,OAAA;AACpB,EAAA,IAAI,MAAM,KAAA,EAAO,YAAY,MAAM,KAAA,CAAM,MAAA,EAAQ,YAAY,CAAA,IAAA,CAAM,KAAA,CAAM,KAAA,EAAO,eAAe,KAAK,MAAA,OAAa,KAAA,CAAM,QAAQ,eAAe,CAAA,IAAK,SAAS,OAAO,iEAAA;AACnK,EAAA,MAAM,WAAW,MAAA,CAAO,WAAA,CAAY,UAAA,CAAW,KAAA,EAAO,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,EAAE,SAAS,WAAA,EAAY,KAAM,CAAC,OAAA,EAAS,WAAW,CAAC,CAAC,CAAA;AACxH,EAAA,IAAI,UAAA,CAAW,MAAA,EAAQ,OAAO,CAAA,CAAE,KAAK,CAAC,EAAE,OAAA,EAAS,WAAA,OAAkB,QAAA,CAAS,OAAO,CAAA,KAAM,WAAW,GAAG,OAAO,wCAAA;AAC9G,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,WAAA,EAAa,OAAO,+CAAA;AACxC,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,yBAAA,CAA0B,QAAwB,OAAA,EAA+B;AAC/F,EAAA,IAAI,OAAO,IAAA,GAAO,CAAA,EAAG,QAAQ,SAAS,CAAA,QAAA,CAAU,MAAM,MAAA,EAAQ;AAC9D,EAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,aAAA,CAAe,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,WAAA,CAAY,UAAA,CAAW,MAAA,EAAQ,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,EAAE,OAAA,EAAS,WAAA,EAAY,KAAM,CAAC,OAAA,EAAS,WAAW,CAAC,CAAC,CAAC,CAAA;AAC7K;AAKO,SAAS,kBAAA,CAAmB,KAAA,EAAuB,MAAA,EAAwB,OAAA,EAAyB,WAAA,EAAoC;AAC7I,EAAA,MAAM,SAAS,OAAA,CAAQ,SAAA;AACvB,EAAA,MAAM,UAAU,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,MAAM,UAAU,CAAA,KAAM,MAAA;AACtD,EAAA,IAAI,CAAC,OAAA,IAAW,MAAA,CAAO,IAAA,GAAO,GAAG,MAAM,CAAA,QAAA,CAAU,CAAA,KAAM,MAAA,SAAe,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,EAAC,EAAE;AAC5F,EAAA,MAAM,WAAW,IAAI,GAAA,CAAI,UAAA,CAAW,KAAA,EAAO,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,EAAE,SAAS,WAAA,EAAY,KAAM,CAAC,OAAA,EAAS,WAAW,CAAC,CAAC,CAAA;AAC7G,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,MAAA,EAAQ,OAAO,CAAA;AAC5C,EAAA,IAAI,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,CAAC,SAAS,CAAC,SAAA,CAAU,IAAA,CAAK,CAAC,EAAE,OAAA,EAAQ,KAAM,OAAA,KAAY,IAAI,CAAC,CAAA,IAAK,SAAA,CAAU,IAAA,CAAK,CAAC,EAAE,OAAA,EAAS,WAAA,EAAY,KAAM,SAAS,GAAA,CAAI,OAAO,CAAA,KAAM,WAAW,GAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,SAAS,uCAAA,EAAwC;AACzP,EAAA,IAAI,YAAY,CAAC,KAAA,CAAM,IAAA,IAAQ,CAAC,MAAM,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,WAAA,CAAa,IAAI,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,SAAS,oDAAA,EAAqD;AACzJ,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,eAAA,EAAiB,QAAA,IAAY,EAAC;AACtD,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,MAAA,CAAO,CAAC,EAAE,MAAK,KAAM,IAAA,KAAS,CAAA,EAAG,MAAM,CAAA,YAAA,CAAc,CAAA;AACnF,EAAA,MAAM,WAAA,GAAc,aAAa,CAAC,CAAA;AAClC,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,IAAM,WAAA,KAAgB,YAAY,WAAA,KAAgB,MAAA,IAAa,YAAY,UAAA,KAAe,OAAA,CAAQ,oBAAoB,WAAA,CAAY,WAAA,KAAgB,MAAM,IAAA,CAAA,EAAQ,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,SAAS,2DAAA,EAA4D;AACnR,EAAA,MAAM,KAAA,GAAwB,CAAC,EAAE,IAAA,EAAM,CAAC,MAAM,CAAA,EAAG,KAAA,EAAO,WAAA,EAAY,EAAG,EAAE,MAAM,CAAC,MAAA,EAAQ,GAAG,MAAM,CAAA,QAAA,CAAU,GAAG,KAAA,EAAO,OAAA,GAAU,MAAA,GAAS,OAAA,EAAS,CAAA;AACjJ,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,CAAC,MAAA,EAAQ,GAAG,MAAM,CAAA,WAAA,CAAa,CAAA,EAAG,KAAA,EAAO,MAAM,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,WAAA,CAAa,GAAG,CAAA;AAClG,IAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,CAAC,MAAA,EAAQ,GAAG,MAAM,CAAA,cAAA,CAAgB,CAAA,EAAG,KAAA,EAAO,MAAM,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,cAAA,CAAgB,GAAG,CAAA;AACxG,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAC,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,aAAA,CAAe,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,WAAA,CAAY,SAAA,CAAU,GAAA,CAAI,CAAC,EAAE,OAAA,EAAS,WAAA,EAAY,KAAM,CAAC,OAAA,EAAS,WAAW,CAAC,CAAC,CAAC,CAAA,EAAG,CAAA;AACvK,IAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,CAAC,MAAA,EAAQ,GAAG,MAAM,CAAA,cAAA,CAAgB,CAAA,EAAG,KAAA,EAAO,MAAM,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,cAAA,CAAgB,GAAG,CAAA;AACxG,IAAA,IAAI,CAAC,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAC,iBAAA,EAAmB,UAAU,CAAA,EAAG,KAAA,EAAO,CAAC,GAAG,QAAA,EAAU,EAAE,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,YAAA,CAAA,EAAgB,UAAA,EAAY,OAAA,CAAQ,gBAAA,EAAkB,WAAA,EAAa,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG,CAAA;AAAA,EAChM;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAM;AAC3B;AAEO,SAAS,kBAAA,CAAmB,QAAwB,KAAA,EAAsC;AAC/F,EAAA,KAAA,MAAW,EAAE,IAAA,EAAM,KAAA,EAAM,IAAK,KAAA,EAAO;AACnC,IAAA,IAAI,IAAA,GAAe,MAAA;AACnB,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG;AACnC,MAAA,IAAI,KAAA,GAAiB,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AAC1C,MAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AAAE,QAAA,KAAA,GAAQ,EAAC;AAAG,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,GAAA,EAAK,KAAK,CAAA;AAAA,MAAG;AACtF,MAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,MAAM,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAC7F,MAAA,IAAA,GAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,EAAE,CAAA;AACvB,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,4BAA4B,CAAA;AACvD,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,cAAA,CAAe,MAAM,IAAI,CAAA;AAAA,SAAQ,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AAAA,EACjG;AACF","file":"config.js","sourcesContent":["import { isD1BindingName, type D1CacheProfile } from './profile';\n\nexport interface D1WorkerConfig {\n name?: string;\n main?: string;\n vars?: Record<string, unknown>;\n d1_databases?: Array<{ binding: string; database_id: string }>;\n durable_objects?: { bindings: Array<{ name: string; class_name: string; script_name?: string; environment?: string }> };\n migrations?: Array<{ tag: string; new_sqlite_classes?: string[] }>;\n}\nconst idPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst hints = new Set(['wnam', 'enam', 'sam', 'weur', 'eeur', 'apac', 'oc', 'afr', 'me']);\nconst bindingsOf = (config: D1WorkerConfig, profile: D1CacheProfile) => (config.d1_databases ?? []).filter(({ binding }) => isD1BindingName(binding, profile));\n\nexport function d1CacheProblem(config: D1WorkerConfig, profile: D1CacheProfile, coordinatorScript?: string): string | null {\n const lease = profile.readResponseLease;\n const maxSeconds = lease?.maxSeconds ?? 5;\n const refreshAhead = lease?.refreshAheadSeconds ?? 0;\n if (lease && (!Number.isInteger(maxSeconds) || maxSeconds < 1 || maxSeconds > 300 || !Number.isInteger(refreshAhead) || refreshAhead < 0 || refreshAhead > maxSeconds)) return 'Invalid response lease duration or refresh-ahead window.';\n const vars = config.vars ?? {};\n const field = (name: string) => vars[`${profile.envPrefix}_${name}`];\n const enabled = field('ENABLED');\n if (enabled === undefined || enabled === 'false') return null;\n if (enabled !== 'true') return `${profile.envPrefix}_ENABLED must be true or false.`;\n const reads = field('READS_ENABLED');\n if (reads !== undefined && reads !== 'true' && reads !== 'false') return `${profile.envPrefix}_READS_ENABLED must be true or false.`;\n const bindings = bindingsOf(config, profile);\n if (profile.bindingNames.some((name) => !bindings.some(({ binding }) => binding === name)) || bindings.some(({ database_id }) => !idPattern.test(database_id))) return 'Cache requires physical D1 UUIDs for every configured binding.';\n let map: unknown;\n try { const raw = field('DATABASE_IDS'); if (typeof raw !== 'string') throw new Error(); map = JSON.parse(raw); } catch { return `${profile.envPrefix}_DATABASE_IDS must contain the current D1 binding map.`; }\n const expected = Object.fromEntries(bindings.map(({ binding, database_id }) => [binding, database_id]));\n if (!map || typeof map !== 'object' || Array.isArray(map) || Object.keys(map).length !== bindings.length || Object.entries(expected).some(([key, value]) => Reflect.get(map, key) !== value)) return `${profile.envPrefix}_DATABASE_IDS differs from d1_databases; run setup or update the map.`;\n const generation = field('GENERATION');\n if (typeof generation !== 'string' || !generation.trim() || generation.length > 256) return 'Cache requires a generation of at most 256 characters.';\n const location = field('LOCATION_HINT');\n if (location !== undefined && (typeof location !== 'string' || !hints.has(location))) return 'Invalid cache location hint.';\n const coordinators = config.durable_objects?.bindings?.filter(({ name }) => name === `${profile.envPrefix}_COORDINATOR`) ?? [];\n const coordinator = coordinators[0];\n if (coordinators.length !== 1 || !coordinator || coordinator.environment !== undefined || coordinator.class_name !== profile.coordinatorClass || (coordinatorScript ? coordinator.script_name !== coordinatorScript : coordinator.script_name !== undefined)) return 'Cache coordinator binding is missing or points to the wrong Worker.';\n if (!coordinatorScript && !config.migrations?.some(({ new_sqlite_classes }) => new_sqlite_classes?.includes(profile.coordinatorClass))) return 'Cache requires a SQLite Durable Object migration.';\n return null;\n}\n\nexport function d1CachePairProblem(admin: D1WorkerConfig, writer: D1WorkerConfig, profile: D1CacheProfile, writerEntry: string): string | null {\n const field = (config: D1WorkerConfig, name: string) => config.vars?.[`${profile.envPrefix}_${name}`];\n const a = field(admin, 'ENABLED') === 'true';\n const b = field(writer, 'ENABLED') === 'true';\n if (a !== b) return 'Admin and writer must enable or disable the cache together.';\n if (!a) return null;\n const problem = d1CacheProblem(admin, profile) ?? d1CacheProblem(writer, profile, admin.name);\n if (problem) return problem;\n if (field(admin, 'GENERATION') !== field(writer, 'GENERATION') || (field(admin, 'LOCATION_HINT') ?? 'weur') !== (field(writer, 'LOCATION_HINT') ?? 'weur')) return 'Admin and writer must share cache generation and location hint.';\n const adminIds = Object.fromEntries(bindingsOf(admin, profile).map(({ binding, database_id }) => [binding, database_id]));\n if (bindingsOf(writer, profile).some(({ binding, database_id }) => adminIds[binding] !== database_id)) return 'Admin and writer D1 identities differ.';\n if (writer.main !== writerEntry) return 'Writer must use the cache-aware Worker entry.';\n return null;\n}\n\nexport function refreshD1CacheDatabaseIds(config: D1WorkerConfig, profile: D1CacheProfile): void {\n if (config.vars?.[`${profile.envPrefix}_ENABLED`] !== 'true') return;\n config.vars[`${profile.envPrefix}_DATABASE_IDS`] = JSON.stringify(Object.fromEntries(bindingsOf(config, profile).map(({ binding, database_id }) => [binding, database_id])));\n}\n\nexport type D1ConfigEdit = { path: string[]; value: unknown };\nexport type D1WriterEdits = { ok: true; edits: D1ConfigEdit[] } | { ok: false; problem: string };\n\nexport function d1WriterCacheEdits(admin: D1WorkerConfig, writer: D1WorkerConfig, profile: D1CacheProfile, writerEntry: string): D1WriterEdits {\n const prefix = profile.envPrefix;\n const enabled = admin.vars?.[`${prefix}_ENABLED`] === 'true';\n if (!enabled && writer.vars?.[`${prefix}_ENABLED`] !== 'true') return { ok: true, edits: [] };\n const adminIds = new Map(bindingsOf(admin, profile).map(({ binding, database_id }) => [binding, database_id]));\n const databases = bindingsOf(writer, profile);\n if (profile.bindingNames.some((name) => !databases.some(({ binding }) => binding === name)) || databases.some(({ binding, database_id }) => adminIds.get(binding) !== database_id)) return { ok: false, problem: 'Writer D1 bindings differ from admin.' };\n if (enabled && (!admin.name || !admin.vars?.[`${prefix}_GENERATION`])) return { ok: false, problem: 'Admin cache requires a Worker name and generation.' };\n const bindings = writer.durable_objects?.bindings ?? [];\n const coordinators = bindings.filter(({ name }) => name === `${prefix}_COORDINATOR`);\n const coordinator = coordinators[0];\n if (coordinators.length > 1 || (coordinator && (coordinator.environment !== undefined || coordinator.class_name !== profile.coordinatorClass || coordinator.script_name !== admin.name))) return { ok: false, problem: 'Writer cache coordinator conflicts with the admin Worker.' };\n const edits: D1ConfigEdit[] = [{ path: ['main'], value: writerEntry }, { path: ['vars', `${prefix}_ENABLED`], value: enabled ? 'true' : 'false' }];\n if (enabled) {\n edits.push({ path: ['vars', `${prefix}_GENERATION`], value: admin.vars?.[`${prefix}_GENERATION`] });\n edits.push({ path: ['vars', `${prefix}_READS_ENABLED`], value: admin.vars?.[`${prefix}_READS_ENABLED`] });\n edits.push({ path: ['vars', `${prefix}_DATABASE_IDS`], value: JSON.stringify(Object.fromEntries(databases.map(({ binding, database_id }) => [binding, database_id]))) });\n edits.push({ path: ['vars', `${prefix}_LOCATION_HINT`], value: admin.vars?.[`${prefix}_LOCATION_HINT`] });\n if (!coordinator) edits.push({ path: ['durable_objects', 'bindings'], value: [...bindings, { name: `${prefix}_COORDINATOR`, class_name: profile.coordinatorClass, script_name: admin.name }] });\n }\n return { ok: true, edits };\n}\n\nexport function applyD1ConfigEdits(config: D1WorkerConfig, edits: readonly D1ConfigEdit[]): void {\n for (const { path, value } of edits) {\n let node: object = config;\n for (const key of path.slice(0, -1)) {\n let child: unknown = Reflect.get(node, key);\n if (!child || typeof child !== 'object') { child = {}; Reflect.set(node, key, child); }\n if (typeof child !== 'object' || child === null) throw new Error('Invalid configuration path');\n node = child;\n }\n const last = path.at(-1);\n if (!last) throw new Error('Invalid configuration path');\n if (value === undefined) Reflect.deleteProperty(node, last); else Reflect.set(node, last, value);\n }\n}\n"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { C as CacheStore, G as GeneratedCacheConfig, D as DecimalConstructor, e as CacheSessionHooks } from '../types-CtErcz2a.js';
|
|
2
|
+
import { a as D1WritePolicy, D as D1CacheProfile } from '../profile--LBtbQI_.js';
|
|
3
|
+
export { i as isD1BindingName } from '../profile--LBtbQI_.js';
|
|
4
|
+
import { D1Database as D1Database$1 } from '@cloudflare/workers-types';
|
|
5
|
+
import { createCacheExtension } from '../index.js';
|
|
6
|
+
|
|
7
|
+
declare function fenceD1Writes(db: D1Database$1, options: {
|
|
8
|
+
store: CacheStore;
|
|
9
|
+
generation: string;
|
|
10
|
+
policy: D1WritePolicy;
|
|
11
|
+
}): D1Database$1;
|
|
12
|
+
|
|
13
|
+
declare function createD1CacheRuntime(database: D1Database, options: {
|
|
14
|
+
store: CacheStore;
|
|
15
|
+
databaseId: string;
|
|
16
|
+
generation: string;
|
|
17
|
+
readsEnabled?: boolean;
|
|
18
|
+
profile: D1CacheProfile;
|
|
19
|
+
coordinatorIdentity?: object;
|
|
20
|
+
coordinatorName?: string;
|
|
21
|
+
regionalIdentity?: string;
|
|
22
|
+
}): D1Database;
|
|
23
|
+
declare function cacheD1Env<T extends object>(env: T, profile: D1CacheProfile): T;
|
|
24
|
+
declare function wrapD1Handler<Event, Env extends object, Context, Result>(handler: (event: Event, env: Env, context: Context) => Result, profile: D1CacheProfile): (event: Event, env: Env, context: Context) => Result;
|
|
25
|
+
interface D1PrismaCacheOptions {
|
|
26
|
+
scope: unknown;
|
|
27
|
+
dependencies?: readonly D1Database[];
|
|
28
|
+
keyArgs?: (args: unknown) => unknown;
|
|
29
|
+
regionalTtlMs?: number;
|
|
30
|
+
regionalModels?: readonly string[];
|
|
31
|
+
}
|
|
32
|
+
declare function d1PrismaCacheExtension(database: object, config: GeneratedCacheConfig, optionsOrDecimal?: D1PrismaCacheOptions | DecimalConstructor, decimalArg?: DecimalConstructor): ReturnType<typeof createCacheExtension> | undefined;
|
|
33
|
+
declare function withD1PrismaCache<Client extends object>(client: Client, database: object, config: GeneratedCacheConfig, optionsOrDecimal?: D1PrismaCacheOptions | DecimalConstructor, decimalArg?: DecimalConstructor): Client;
|
|
34
|
+
|
|
35
|
+
interface D1ReadOptions<T> {
|
|
36
|
+
key: unknown;
|
|
37
|
+
scope: unknown;
|
|
38
|
+
dependencies?: readonly D1Database$1[];
|
|
39
|
+
ttlMs?: number;
|
|
40
|
+
regionalTtlMs?: number;
|
|
41
|
+
cacheable?: (value: T) => boolean;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
declare function sameD1CacheDatabase(left: object, right: object): boolean;
|
|
45
|
+
declare function d1CacheEpoch(database: object): Promise<string | null>;
|
|
46
|
+
declare function cacheD1Read<T>(database: D1Database$1, options: D1ReadOptions<T>, load: () => Promise<T>): Promise<T>;
|
|
47
|
+
|
|
48
|
+
interface D1JsonReadOptions extends Omit<D1ReadOptions<never>, 'cacheable' | 'regionalTtlMs'> {
|
|
49
|
+
request: Request;
|
|
50
|
+
buffered?: true;
|
|
51
|
+
}
|
|
52
|
+
declare function cacheD1JsonRead(database: D1Database$1, options: D1JsonReadOptions, load: () => Promise<Response>): Promise<Response>;
|
|
53
|
+
|
|
54
|
+
interface RegionalResponseOptions {
|
|
55
|
+
namespace: string;
|
|
56
|
+
ttlMs: number;
|
|
57
|
+
waitUntil?: (promise: Promise<void>) => void;
|
|
58
|
+
}
|
|
59
|
+
declare function cacheRegionalResponse(request: Request, options: RegionalResponseOptions, load: () => Promise<Response>): Promise<Response>;
|
|
60
|
+
|
|
61
|
+
type FreshnessPolicy = Pick<NonNullable<D1CacheProfile['readResponseLease']>, 'freshnessCookie' | 'freshnessHeader' | 'ignoreRequestCacheControl'>;
|
|
62
|
+
declare function regionalD1MetadataTtl(request: Request, policy: FreshnessPolicy): 0 | 5000;
|
|
63
|
+
|
|
64
|
+
interface D1ReadSessionOptions extends Pick<D1CacheProfile, 'bindingNames' | 'bindingPrefixes'> {
|
|
65
|
+
databaseIdsEnv: string;
|
|
66
|
+
primaryBindings?: readonly string[];
|
|
67
|
+
freshnessHeader?: string;
|
|
68
|
+
ignoreRequestCacheControl?: boolean;
|
|
69
|
+
}
|
|
70
|
+
declare function runPrimaryD1SessionSource<T>(operation: () => Promise<T>): Promise<T>;
|
|
71
|
+
declare function runD1PrismaScope<T>(operation: () => Promise<T>): Promise<T>;
|
|
72
|
+
declare function runD1SessionOperation<T>(database: object, operation: () => Promise<T>): Promise<T>;
|
|
73
|
+
declare function prismaD1SessionDatabase(database: D1Database$1): D1Database$1;
|
|
74
|
+
declare function runIsolatedD1Session<T>(request: Request, operation: () => Promise<T>): Promise<T>;
|
|
75
|
+
declare function d1SessionWarmupRequest(request: Request, response: Response): Request;
|
|
76
|
+
declare function d1SessionCacheHooks(database: object): CacheSessionHooks;
|
|
77
|
+
declare function sessionD1Env<Env extends object>(env: Env, options: D1ReadSessionOptions): Env;
|
|
78
|
+
declare function wrapD1ReadSessionHandler<Env extends object, Context>(handler: (request: Request, env: Env, context: Context) => Promise<Response>, options: D1ReadSessionOptions): (request: Request, env: Env, context: Context) => Promise<Response>;
|
|
79
|
+
|
|
80
|
+
export { D1CacheProfile, type D1JsonReadOptions, type D1PrismaCacheOptions, type D1ReadOptions, type D1ReadSessionOptions, D1WritePolicy, type RegionalResponseOptions, cacheD1Env, cacheD1JsonRead, cacheD1Read, cacheRegionalResponse, createD1CacheRuntime, d1CacheEpoch, d1PrismaCacheExtension, d1SessionCacheHooks, d1SessionWarmupRequest, fenceD1Writes, prismaD1SessionDatabase, regionalD1MetadataTtl, runD1PrismaScope, runD1SessionOperation, runIsolatedD1Session, runPrimaryD1SessionSource, sameD1CacheDatabase, sessionD1Env, withD1PrismaCache, wrapD1Handler, wrapD1ReadSessionHandler };
|