@tanstack/db-sqlite-persistence-core 0.4.7 → 0.4.9
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 +32 -3
- package/dist/cjs/broadcast-coordinator.cjs +282 -43
- package/dist/cjs/broadcast-coordinator.cjs.map +1 -1
- package/dist/cjs/broadcast-coordinator.d.cts +25 -8
- package/dist/cjs/committed-tx-anchor.cjs +9 -0
- package/dist/cjs/committed-tx-anchor.cjs.map +1 -0
- package/dist/cjs/committed-tx-anchor.d.cts +1 -0
- package/dist/cjs/index.cjs +4 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/persisted.cjs +1599 -313
- package/dist/cjs/persisted.cjs.map +1 -1
- package/dist/cjs/persisted.d.cts +106 -13
- package/dist/cjs/remote-subset-wire.cjs +11 -0
- package/dist/cjs/remote-subset-wire.cjs.map +1 -1
- package/dist/cjs/remote-subset-wire.d.cts +1 -0
- package/dist/cjs/sqlite-core-adapter.cjs +705 -64
- package/dist/cjs/sqlite-core-adapter.cjs.map +1 -1
- package/dist/cjs/sqlite-core-adapter.d.cts +53 -10
- package/dist/esm/broadcast-coordinator.d.ts +25 -8
- package/dist/esm/broadcast-coordinator.js +283 -44
- package/dist/esm/broadcast-coordinator.js.map +1 -1
- package/dist/esm/committed-tx-anchor.d.ts +1 -0
- package/dist/esm/committed-tx-anchor.js +9 -0
- package/dist/esm/committed-tx-anchor.js.map +1 -0
- package/dist/esm/index.js +6 -2
- package/dist/esm/persisted.d.ts +106 -13
- package/dist/esm/persisted.js +1601 -315
- package/dist/esm/persisted.js.map +1 -1
- package/dist/esm/remote-subset-wire.d.ts +1 -0
- package/dist/esm/remote-subset-wire.js +11 -0
- package/dist/esm/remote-subset-wire.js.map +1 -1
- package/dist/esm/sqlite-core-adapter.d.ts +53 -10
- package/dist/esm/sqlite-core-adapter.js +708 -67
- package/dist/esm/sqlite-core-adapter.js.map +1 -1
- package/package.json +2 -2
- package/src/broadcast-coordinator.ts +415 -62
- package/src/committed-tx-anchor.ts +13 -0
- package/src/persisted.ts +2283 -370
- package/src/remote-subset-wire.ts +12 -0
- package/src/sqlite-core-adapter.ts +891 -68
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-core-adapter.cjs","sources":["../../src/sqlite-core-adapter.ts"],"sourcesContent":["import {\n IR,\n compareTemporalValues,\n compileSingleRowExpression,\n toBooleanPredicate,\n} from '@tanstack/db'\nimport {\n InvalidPersistedCollectionConfigError,\n InvalidPersistedStorageKeyEncodingError,\n} from './errors'\nimport {\n SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY,\n createPersistedTableName,\n decodePersistedStorageKey,\n encodePersistedStorageKey,\n} from './persisted'\nimport {\n PERSISTED_TYPE_TAG,\n PERSISTED_VALUE_TAG,\n assertSQLiteBigIntInRange,\n reviveSQLiteTemporal,\n serializeSQLiteBigInt,\n serializeSQLiteTemporal,\n sqliteTemporalIdentity,\n sqliteTemporalKind,\n} from './sqlite-value'\nimport type { LoadSubsetOptions } from '@tanstack/db'\nimport type {\n HydrationPersistenceAdapter,\n PersistedIndexSpec,\n PersistedKeySetEvidence,\n PersistedRowScanOptions,\n PersistedScannedRow,\n PersistedTx,\n PersistenceAdapter,\n ReplayableTxDelta,\n SQLiteDriver,\n} from './persisted'\n\ntype SqliteSupportedValue = null | number | string\n\n// The default stays below SQLite's older 999-variable limit. Drivers with a\n// lower binding cap use smaller chunks; each replacement row binds four values.\nconst REPLACEMENT_BATCH_SIZE = 125\n\ntype CollectionTableMapping = {\n tableName: string\n tombstoneTableName: string\n}\n\ntype CompiledSqlFragment = {\n supported: boolean\n sql: string\n params: Array<SqliteSupportedValue>\n identitySql?: string\n valueKind?: CompiledValueKind\n}\n\ntype SqlExpressionCompilationContext = `predicate` | `index-expression`\n\ntype StoredSqliteRow = {\n key: string\n value: string\n metadata: string | null\n row_version: number\n}\n\ntype SQLiteCoreAdapterSchemaMismatchPolicy =\n `sync-present-reset` | `sync-absent-error` | `reset`\n\nexport type SQLiteCoreAdapterOptions = {\n driver: SQLiteDriver\n schemaVersion?: number\n schemaMismatchPolicy?: SQLiteCoreAdapterSchemaMismatchPolicy\n appliedTxPruneMaxRows?: number\n appliedTxPruneMaxAgeSeconds?: number\n pullSinceReloadThreshold?: number\n}\n\nexport type SQLitePullSinceResult<TKey extends string | number> =\n | {\n latestRowVersion: number\n requiresFullReload: true\n }\n | {\n latestRowVersion: number\n requiresFullReload: false\n changedKeys: Array<TKey>\n deletedKeys: Array<TKey>\n deltas: Array<ReplayableTxDelta<Record<string, unknown>, TKey>>\n }\n\ntype ScheduledOperationKind = `regular` | `hydrate`\n\ntype ScheduledOperation<T> = {\n kind: ScheduledOperationKind\n task: () => Promise<T>\n resolve: (value: T) => void\n reject: (error: unknown) => void\n}\n\nclass SharedPersistenceScheduler {\n private readonly regularQueue: Array<ScheduledOperation<unknown>> = []\n private readonly hydrateQueue: Array<ScheduledOperation<unknown>> = []\n private running = false\n private lastCompletedKind: ScheduledOperationKind | undefined\n\n runRegular<T>(task: () => Promise<T>): Promise<T> {\n return this.enqueue(`regular`, task)\n }\n\n runHydrate<T>(task: () => Promise<T>): Promise<T> {\n return this.enqueue(`hydrate`, task)\n }\n\n adoptRunningHydrate(completion: Promise<unknown>): void {\n if (this.running) return\n this.running = true\n const finish = () => {\n this.lastCompletedKind = `hydrate`\n this.running = false\n this.drain()\n }\n void completion.then(finish, finish)\n }\n\n private enqueue<T>(\n kind: ScheduledOperationKind,\n task: () => Promise<T>,\n ): Promise<T> {\n const result = new Promise<T>((resolve, reject) => {\n const operation: ScheduledOperation<T> = {\n kind,\n task,\n resolve,\n reject,\n }\n const queue = kind === `hydrate` ? this.hydrateQueue : this.regularQueue\n queue.push(operation as ScheduledOperation<unknown>)\n })\n this.drain()\n return result\n }\n\n private drain(): void {\n if (this.running) return\n\n const operation = this.takeNext()\n if (!operation) return\n\n this.running = true\n void this.execute(operation)\n }\n\n private async execute(operation: ScheduledOperation<unknown>): Promise<void> {\n try {\n operation.resolve(await operation.task())\n } catch (error) {\n operation.reject(error)\n } finally {\n this.lastCompletedKind = operation.kind\n this.running = false\n this.drain()\n }\n }\n\n private takeNext(): ScheduledOperation<unknown> | undefined {\n // Hydrates get priority after the currently running non-preemptible unit.\n // While both lanes remain queued, alternate one regular operation after\n // each hydrate (K=1), preserving FIFO order within each lane.\n if (this.hydrateQueue.length > 0) {\n if (\n this.regularQueue.length > 0 &&\n this.lastCompletedKind === `hydrate`\n ) {\n return this.regularQueue.shift()\n }\n return this.hydrateQueue.shift()\n }\n return this.regularQueue.shift()\n }\n}\n\nconst sharedPersistenceSchedulers = new WeakMap<\n object,\n SharedPersistenceScheduler\n>()\nconst observedDriverSchedulingKeys = new WeakMap<object, object>()\n\nfunction getSharedPersistenceScheduler(\n key: object,\n): SharedPersistenceScheduler {\n let scheduler = sharedPersistenceSchedulers.get(key)\n if (!scheduler) {\n scheduler = new SharedPersistenceScheduler()\n sharedPersistenceSchedulers.set(key, scheduler)\n }\n return scheduler\n}\n\nfunction getSharedLogicalSchedulingKey(value: unknown): object | undefined {\n if ((typeof value !== `object` && typeof value !== `function`) || !value) {\n return undefined\n }\n const key = (\n value as {\n [SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY]?: unknown\n }\n )[SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY]\n return key !== null && (typeof key === `object` || typeof key === `function`)\n ? key\n : undefined\n}\n\nfunction observeSharedLogicalSchedulingSupport(\n driver: SQLiteDriver,\n onSupport: (key: object) => void,\n): SQLiteDriver {\n let observationPending = true\n const observe = <T>(promise: Promise<T>): Promise<T> => {\n if (!observationPending) return promise\n observationPending = false\n const key = getSharedLogicalSchedulingKey(promise)\n if (key) onSupport(key)\n return promise\n }\n\n return {\n maxBoundParameters: driver.maxBoundParameters,\n exec: (sql) => observe(driver.exec(sql)),\n query: <T>(sql: string, params: ReadonlyArray<unknown> = []) =>\n observe(driver.query<T>(sql, params)),\n run: (sql, params = []) => observe(driver.run(sql, params)),\n transaction: <T>(fn: (transactionDriver: SQLiteDriver) => Promise<T>) =>\n observe(driver.transaction(fn)),\n transactionWithDriver: <T>(\n fn: (transactionDriver: SQLiteDriver) => Promise<T>,\n ) =>\n observe(\n driver.transactionWithDriver\n ? driver.transactionWithDriver(fn)\n : driver.transaction(fn),\n ),\n }\n}\n\nconst DEFAULT_SCHEMA_VERSION = 1\nconst DEFAULT_PULL_SINCE_RELOAD_THRESHOLD = 128\n\n/**\n * Default cap on retained `applied_tx` rows per collection. The log is a\n * replayable cache, so a bounded row count keeps SQLite files from growing\n * without limit. Pass `appliedTxPruneMaxRows: 0` to disable the row cap.\n */\nexport const DEFAULT_APPLIED_TX_PRUNE_MAX_ROWS = 1_000\n\n/**\n * Default age backstop for retained `applied_tx` rows, in seconds (24h). Rows\n * older than this are pruned on the next write. Pass\n * `appliedTxPruneMaxAgeSeconds: 0` to disable the age backstop.\n */\nexport const DEFAULT_APPLIED_TX_PRUNE_MAX_AGE_SECONDS = 24 * 60 * 60\n\nconst SAFE_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/\nconst FORBIDDEN_SQL_FRAGMENT_PATTERN = /(;|--|\\/\\*)/\ntype CompiledValueKind = `unknown` | `bigint` | `date` | `datetime`\ntype PersistedTaggedValueType =\n | `bigint`\n | `date`\n | `nan`\n | `infinity`\n | `-infinity`\n | `string`\n | `Temporal.Instant`\n | `Temporal.PlainDate`\ntype PersistedTaggedValue = {\n [PERSISTED_TYPE_TAG]: PersistedTaggedValueType\n [PERSISTED_VALUE_TAG]: string\n}\n\nconst persistedTaggedValueTypes = new Set<PersistedTaggedValueType>([\n `bigint`,\n `date`,\n `nan`,\n `infinity`,\n `-infinity`,\n `string`,\n `Temporal.Instant`,\n `Temporal.PlainDate`,\n])\n\nconst orderByObjectIds = new WeakMap<object, number>()\nlet nextOrderByObjectId = 1\n\nfunction isDuplicateColumnAddError(\n error: unknown,\n columnName: string,\n): boolean {\n if (typeof error !== `string` && !(error instanceof Error)) {\n return false\n }\n\n const normalizedMessage = (\n typeof error === `string` ? error : error.message\n ).toLowerCase()\n return (\n normalizedMessage.includes(columnName.toLowerCase()) &&\n (normalizedMessage.includes(`duplicate column name`) ||\n normalizedMessage.includes(`already exists`))\n )\n}\n\nfunction quoteIdentifier(identifier: string): string {\n if (!SAFE_IDENTIFIER_PATTERN.test(identifier)) {\n throw new InvalidPersistedCollectionConfigError(\n `Invalid SQLite identifier \"${identifier}\"`,\n )\n }\n return `\"${identifier}\"`\n}\n\nfunction isPersistedTaggedValue(value: unknown): value is PersistedTaggedValue {\n if (typeof value !== `object` || value === null) {\n return false\n }\n\n const taggedValue = value as {\n [PERSISTED_TYPE_TAG]?: unknown\n [PERSISTED_VALUE_TAG]?: unknown\n }\n if (\n typeof taggedValue[PERSISTED_TYPE_TAG] !== `string` ||\n typeof taggedValue[PERSISTED_VALUE_TAG] !== `string`\n ) {\n return false\n }\n\n return persistedTaggedValueTypes.has(\n taggedValue[PERSISTED_TYPE_TAG] as PersistedTaggedValueType,\n )\n}\n\nfunction encodePersistedJsonValue(value: unknown): unknown {\n if (value === undefined || value === null) {\n return value\n }\n\n if (typeof value === `bigint`) {\n return serializeSQLiteBigInt(value) satisfies PersistedTaggedValue\n }\n\n const temporal = serializeSQLiteTemporal(value)\n if (temporal) return temporal\n\n if (value instanceof Date) {\n return {\n [PERSISTED_TYPE_TAG]: `date`,\n [PERSISTED_VALUE_TAG]: value.toISOString(),\n } satisfies PersistedTaggedValue\n }\n\n if (typeof value === `number`) {\n if (Number.isNaN(value)) {\n return {\n [PERSISTED_TYPE_TAG]: `nan`,\n [PERSISTED_VALUE_TAG]: `NaN`,\n } satisfies PersistedTaggedValue\n }\n if (value === Number.POSITIVE_INFINITY) {\n return {\n [PERSISTED_TYPE_TAG]: `infinity`,\n [PERSISTED_VALUE_TAG]: `Infinity`,\n } satisfies PersistedTaggedValue\n }\n if (value === Number.NEGATIVE_INFINITY) {\n return {\n [PERSISTED_TYPE_TAG]: `-infinity`,\n [PERSISTED_VALUE_TAG]: `-Infinity`,\n } satisfies PersistedTaggedValue\n }\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => encodePersistedJsonValue(entry))\n }\n\n if (typeof value === `object`) {\n const encodedRecord: Record<string, unknown> = {}\n const recordValue = value as Record<string, unknown>\n for (const [key, entryValue] of Object.entries(recordValue)) {\n const encodedValue = encodePersistedJsonValue(entryValue)\n if (encodedValue !== undefined) {\n encodedRecord[key] = encodedValue\n }\n }\n // Escape the marker field itself, leaving ordinary nested JSON paths intact.\n if (typeof recordValue[PERSISTED_TYPE_TAG] === `string`) {\n encodedRecord[PERSISTED_TYPE_TAG] = {\n [PERSISTED_TYPE_TAG]: `string`,\n [PERSISTED_VALUE_TAG]: recordValue[PERSISTED_TYPE_TAG],\n }\n }\n return encodedRecord\n }\n\n return value\n}\n\nfunction decodePersistedJsonValue(value: unknown): unknown {\n if (value === undefined || value === null) {\n return value\n }\n\n if (isPersistedTaggedValue(value)) {\n switch (value[PERSISTED_TYPE_TAG]) {\n case `string`:\n return value[PERSISTED_VALUE_TAG]\n case `Temporal.Instant`:\n case `Temporal.PlainDate`:\n return reviveSQLiteTemporal(\n value[PERSISTED_TYPE_TAG],\n value[PERSISTED_VALUE_TAG],\n )\n case `bigint`:\n return BigInt(value[PERSISTED_VALUE_TAG])\n case `date`: {\n const parsedDate = new Date(value[PERSISTED_VALUE_TAG])\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate\n }\n case `nan`:\n return Number.NaN\n case `infinity`:\n return Number.POSITIVE_INFINITY\n case `-infinity`:\n return Number.NEGATIVE_INFINITY\n default:\n return value\n }\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => decodePersistedJsonValue(entry))\n }\n\n if (typeof value === `object`) {\n const decodedRecord: Record<string, unknown> = {}\n const recordValue = value as Record<string, unknown>\n for (const [key, entryValue] of Object.entries(recordValue)) {\n decodedRecord[key] = decodePersistedJsonValue(entryValue)\n }\n return decodedRecord\n }\n\n return value\n}\n\nfunction serializePersistedRowValue(value: unknown): string {\n return JSON.stringify(encodePersistedJsonValue(value))\n}\n\nfunction deserializePersistedRowValue<T>(value: string): T {\n const parsedJson = JSON.parse(value) as unknown\n return decodePersistedJsonValue(parsedJson) as T\n}\n\nfunction toSqliteParameterValue(value: unknown): SqliteSupportedValue {\n if (value == null) {\n return null\n }\n\n if (typeof value === `number`) {\n if (!Number.isFinite(value)) {\n return null\n }\n return value\n }\n\n if (typeof value === `bigint`) {\n assertSQLiteBigIntInRange(value)\n return value.toString()\n }\n\n if (typeof value === `boolean`) {\n return value ? 1 : 0\n }\n\n if (typeof value === `string`) {\n return value\n }\n\n if (value instanceof Date) {\n return value.toISOString()\n }\n\n const temporal = serializeSQLiteTemporal(value)\n return temporal?.order ?? serializePersistedRowValue(value)\n}\n\nfunction toSqliteLiteral(value: SqliteSupportedValue): string {\n if (value === null) {\n return `NULL`\n }\n\n if (typeof value === `number`) {\n return Number.isFinite(value) ? String(value) : `NULL`\n }\n\n if (value.includes(`\\u0000`)) {\n // JSON escapes NUL before SQL parsing and matches stored-string extraction.\n return `json_extract(${toSqliteLiteral(JSON.stringify(value))}, '$')`\n }\n return `'${value.replace(/'/g, `''`)}'`\n}\n\nfunction toSqliteExpressionLiteral(value: unknown): string {\n if (typeof value === `bigint`) {\n return assertSQLiteBigIntInRange(value).toString()\n }\n return toSqliteLiteral(toSqliteParameterValue(value))\n}\n\ntype CompiledRowExpressionEvaluator = (row: Record<string, unknown>) => unknown\n\nfunction compileRowExpressionEvaluator(\n expression: IR.BasicExpression,\n): CompiledRowExpressionEvaluator {\n let baseEvaluator: ReturnType<typeof compileSingleRowExpression>\n try {\n baseEvaluator = compileSingleRowExpression(expression)\n } catch (error) {\n throw new InvalidPersistedCollectionConfigError(\n `Unsupported expression for SQLite adapter fallback evaluator: ${(error as Error).message}`,\n )\n }\n return baseEvaluator\n}\n\nfunction getOrderByObjectId(value: object): number {\n const existing = orderByObjectIds.get(value)\n if (existing !== undefined) {\n return existing\n }\n\n const nextId = nextOrderByObjectId\n nextOrderByObjectId++\n orderByObjectIds.set(value, nextId)\n return nextId\n}\n\nfunction compareOrderByValues(\n left: unknown,\n right: unknown,\n compareOptions: IR.OrderByClause[`compareOptions`],\n): number {\n if (left == null && right == null) {\n return 0\n }\n if (left == null) {\n return compareOptions.nulls === `first` ? -1 : 1\n }\n if (right == null) {\n return compareOptions.nulls === `first` ? 1 : -1\n }\n\n if (typeof left === `string` && typeof right === `string`) {\n if (compareOptions.stringSort === `custom`) {\n return compareOptions.compare(left, right)\n }\n if (compareOptions.stringSort === `locale`) {\n return left.localeCompare(\n right,\n compareOptions.locale,\n compareOptions.localeOptions,\n )\n }\n if (left < right) {\n return -1\n }\n if (left > right) {\n return 1\n }\n return 0\n }\n\n if (Array.isArray(left) && Array.isArray(right)) {\n const maxIndex = Math.min(left.length, right.length)\n for (let index = 0; index < maxIndex; index++) {\n const comparison = compareOrderByValues(\n left[index],\n right[index],\n compareOptions,\n )\n if (comparison !== 0) {\n return comparison\n }\n }\n return left.length - right.length\n }\n\n if (left instanceof Date && right instanceof Date) {\n return left.getTime() - right.getTime()\n }\n\n if (sqliteTemporalKind(left) && sqliteTemporalKind(right)) {\n return compareTemporalValues(left, right)\n }\n\n const leftIsObject = typeof left === `object`\n const rightIsObject = typeof right === `object`\n if (leftIsObject || rightIsObject) {\n if (leftIsObject && rightIsObject) {\n return getOrderByObjectId(left) - getOrderByObjectId(right)\n }\n return leftIsObject ? 1 : -1\n }\n\n if (left < right) {\n return -1\n }\n if (left > right) {\n return 1\n }\n return 0\n}\n\nfunction createJsonPath(path: Array<string>): string | null {\n if (path.length === 0) {\n return null\n }\n\n let jsonPath = `$`\n for (const segment of path) {\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(segment)) {\n jsonPath = `${jsonPath}.${segment}`\n continue\n }\n\n if (/^[0-9]+$/.test(segment)) {\n jsonPath = `${jsonPath}[${segment}]`\n continue\n }\n\n return null\n }\n\n return jsonPath\n}\n\nconst MAX_INDEXED_NUMERIC_PATH_SEGMENTS = 3\n\nfunction hasDeepNumericPath(expression: IR.BasicExpression): boolean {\n if (expression.type === `ref`) {\n return (\n IR.getPropRefPropertyPath(expression).filter((segment) =>\n /^[0-9]+$/.test(String(segment)),\n ).length > MAX_INDEXED_NUMERIC_PATH_SEGMENTS\n )\n }\n return expression.type === `func` && expression.args.some(hasDeepNumericPath)\n}\n\nfunction createJsonPathVariants(path: Array<string>): Array<string> | null {\n const canonical = createJsonPath(path)\n if (!canonical) return null\n\n let paths = [`$`]\n for (const segment of path) {\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(segment)) {\n paths = paths.map((prefix) => `${prefix}.${segment}`)\n } else if (/^[0-9]+$/.test(segment)) {\n if (paths.length >= 2 ** MAX_INDEXED_NUMERIC_PATH_SEGMENTS)\n return [canonical]\n paths = paths.flatMap((prefix) => [\n `${prefix}[${segment}]`,\n `${prefix}.\"${segment}\"`,\n ])\n }\n }\n return paths\n}\n\nfunction getLiteralValueKind(value: unknown): CompiledValueKind {\n if (typeof value === `bigint`) {\n return `bigint`\n }\n if (value instanceof Date) {\n return `datetime`\n }\n return `unknown`\n}\n\nfunction getCompiledValueKind(\n fragment: CompiledSqlFragment,\n): CompiledValueKind {\n return fragment.valueKind ?? `unknown`\n}\n\nfunction resolveComparisonValueKind(\n leftExpression: IR.BasicExpression,\n rightExpression: IR.BasicExpression,\n leftCompiled: CompiledSqlFragment,\n rightCompiled: CompiledSqlFragment,\n): CompiledValueKind {\n const leftKind = getCompiledValueKind(leftCompiled)\n const rightKind = getCompiledValueKind(rightCompiled)\n\n const hasBigIntLiteral =\n (leftExpression.type === `val` &&\n typeof leftExpression.value === `bigint`) ||\n (rightExpression.type === `val` &&\n typeof rightExpression.value === `bigint`)\n if (hasBigIntLiteral || leftKind === `bigint` || rightKind === `bigint`) {\n return `bigint`\n }\n\n const hasDateLiteral =\n (leftExpression.type === `val` && leftExpression.value instanceof Date) ||\n (rightExpression.type === `val` && rightExpression.value instanceof Date)\n if (hasDateLiteral || leftKind === `datetime` || rightKind === `datetime`) {\n return `datetime`\n }\n\n if (leftKind === `date` || rightKind === `date`) {\n return `date`\n }\n\n return `unknown`\n}\n\nfunction compileComparisonSql(\n operator: `=` | `>` | `>=` | `<` | `<=`,\n leftExpression: IR.BasicExpression,\n rightExpression: IR.BasicExpression,\n leftSql: string,\n rightSql: string,\n valueKind: CompiledValueKind,\n leftKind: CompiledValueKind,\n rightKind: CompiledValueKind,\n): string {\n const compileOperand = (\n expression: IR.BasicExpression,\n sql: string,\n otherKind: CompiledValueKind,\n ): string => {\n if (expression.type !== `val`) return sql\n if (valueKind === `date` && otherKind === `date`) return `date(${sql})`\n if (valueKind === `datetime` && otherKind === `datetime`) {\n return `datetime(${sql})`\n }\n return sql\n }\n\n return `(${compileOperand(leftExpression, leftSql, rightKind)} ${operator} ${compileOperand(rightExpression, rightSql, leftKind)})`\n}\n\nfunction compileRefExpressionSql(jsonPath: string): CompiledSqlFragment {\n const typePath = `${jsonPath}.${PERSISTED_TYPE_TAG}`\n const taggedValuePath = `${jsonPath}.${PERSISTED_VALUE_TAG}`\n // createJsonPath has already validated every segment. Keep these paths as\n // canonical SQL literals so runtime refs match persisted expression indexes.\n const typePathSql = toSqliteLiteral(typePath)\n const taggedValuePathSql = toSqliteLiteral(taggedValuePath)\n const jsonPathSql = toSqliteLiteral(jsonPath)\n\n const typeSql = `json_extract(value, ${typePathSql})`\n const orderPathSql = toSqliteLiteral(`${jsonPath}.order`)\n const sql = `(CASE ${typeSql}\n WHEN 'bigint' THEN CAST(json_extract(value, ${taggedValuePathSql}) AS NUMERIC)\n WHEN 'date' THEN json_extract(value, ${taggedValuePathSql})\n WHEN 'string' THEN json_extract(value, ${taggedValuePathSql})\n WHEN 'Temporal.Instant' THEN json_extract(value, ${orderPathSql})\n WHEN 'Temporal.PlainDate' THEN json_extract(value, ${orderPathSql})\n WHEN 'nan' THEN NULL\n WHEN 'infinity' THEN NULL\n WHEN '-infinity' THEN NULL\n ELSE json_extract(value, ${jsonPathSql})\n END)`\n return {\n supported: true,\n sql,\n identitySql: `(CASE WHEN ${typeSql} IN ('Temporal.Instant', 'Temporal.PlainDate') THEN ${typeSql} || ':' || json_extract(value, ${taggedValuePathSql}) ELSE ${sql} END)`,\n params: [],\n valueKind: `unknown`,\n }\n}\n\nfunction sanitizeExpressionSqlFragment(fragment: string): string {\n if (\n fragment.trim().length === 0 ||\n FORBIDDEN_SQL_FRAGMENT_PATTERN.test(fragment)\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `Invalid persisted index SQL fragment: \"${fragment}\"`,\n )\n }\n\n return fragment\n}\n\ntype InMemoryRow<\n TKey extends string | number = string | number,\n T extends object = Record<string, unknown>,\n> = {\n key: TKey\n value: T\n metadata?: unknown\n rowVersion: number\n}\n\nfunction decodeStoredSqliteRows<\n TKey extends string | number = string | number,\n T extends object = Record<string, unknown>,\n>(storedRows: ReadonlyArray<StoredSqliteRow>): Array<InMemoryRow<TKey, T>> {\n return storedRows.map((row) => {\n const key = decodePersistedStorageKey(row.key) as TKey\n const value = deserializePersistedRowValue<T>(row.value)\n return {\n key,\n value,\n metadata:\n row.metadata != null\n ? deserializePersistedRowValue(row.metadata)\n : undefined,\n rowVersion: row.row_version,\n }\n })\n}\n\nfunction stableStringify(value: unknown): string {\n return serializePersistedRowValue(value)\n}\n\n/** Balance disjunctions so a large membership index stays below SQL depth limits. */\nfunction joinSqlDisjunction(parts: ReadonlyArray<string>): string {\n if (parts.length === 1) return parts[0]!\n const middle = Math.floor(parts.length / 2)\n return `(${joinSqlDisjunction(parts.slice(0, middle))} OR ${joinSqlDisjunction(parts.slice(middle))})`\n}\n\nfunction argumentCompilationContext(\n parentName: string,\n argumentIndex: number,\n argument: IR.BasicExpression,\n parentContext: SqlExpressionCompilationContext,\n): SqlExpressionCompilationContext {\n if (parentContext === `index-expression`) return `index-expression`\n\n switch (parentName) {\n case `and`:\n case `or`:\n case `not`:\n return `predicate`\n case `eq`:\n case `gt`:\n case `gte`:\n case `lt`:\n case `lte`:\n case `like`:\n case `ilike`:\n if (argument.type !== `val`) return `index-expression`\n return typeof argument.value === `bigint`\n ? `index-expression`\n : `predicate`\n case `in`:\n return argumentIndex === 0 ? `index-expression` : `predicate`\n case `isNull`:\n case `isUndefined`:\n return `index-expression`\n default:\n return `index-expression`\n }\n}\n\nfunction hasUnpairedSurrogate(value: string): boolean {\n // With /u, paired surrogates form one code point; lone surrogates still match.\n return /[\\uD800-\\uDFFF]/u.test(value)\n}\n\nfunction isSafeEqualityLiteral(value: unknown): boolean {\n return (\n typeof value === `string` ||\n typeof value === `boolean` ||\n typeof value === `bigint` ||\n sqliteTemporalKind(value) !== undefined\n )\n}\n\nfunction isSafeCoalesceOperand(\n expression: IR.BasicExpression | undefined,\n): boolean {\n return (\n expression?.type === `func` &&\n expression.name === `coalesce` &&\n expression.args.length === 2 &&\n expression.args[0]?.type === `ref` &&\n expression.args[1]?.type === `val` &&\n isSafeEqualityLiteral(expression.args[1].value) &&\n !(\n typeof expression.args[1].value === `string` &&\n hasUnpairedSurrogate(expression.args[1].value)\n )\n )\n}\n\nfunction compileSqlExpression(\n expression: IR.BasicExpression,\n context: SqlExpressionCompilationContext = `predicate`,\n): CompiledSqlFragment {\n if (expression.type === `val`) {\n if (\n context === `predicate` &&\n typeof expression.value === `string` &&\n hasUnpairedSurrogate(expression.value)\n ) {\n // JSON extraction changes lone surrogates in stored strings. Apply the\n // same extraction to the binding so an indexed equality keeps its row.\n return {\n supported: true,\n sql: `json_extract(?, '$')`,\n params: [JSON.stringify(expression.value)],\n }\n }\n const temporal = serializeSQLiteTemporal(expression.value)\n const value = temporal?.order ?? toSqliteParameterValue(expression.value)\n return {\n identitySql: temporal\n ? toSqliteLiteral(sqliteTemporalIdentity(temporal))\n : undefined,\n supported: true,\n sql:\n context === `index-expression`\n ? toSqliteExpressionLiteral(\n typeof expression.value === `bigint` ? expression.value : value,\n )\n : `?`,\n params: context === `predicate` ? [value] : [],\n valueKind: getLiteralValueKind(expression.value),\n }\n }\n\n if (expression.type === `ref`) {\n const jsonPaths = createJsonPathVariants(\n IR.getPropRefPropertyPath(expression).map(String),\n )\n if (!jsonPaths) {\n return {\n supported: false,\n sql: ``,\n params: [],\n }\n }\n\n if (jsonPaths.length === 1) return compileRefExpressionSql(jsonPaths[0]!)\n const variants = jsonPaths.map(compileRefExpressionSql)\n return {\n supported: true,\n identitySql: `COALESCE(${variants.map((variant) => variant.identitySql).join(`, `)})`,\n sql: `COALESCE(${variants.map((variant) => variant.sql).join(`, `)})`,\n params: [],\n valueKind: `unknown`,\n }\n }\n\n // IN owns its list encoding; compiling that list as a scalar discards work.\n const args =\n expression.name === `in` ? expression.args.slice(0, 1) : expression.args\n const compiledArgs = args.map((arg, index) =>\n compileSqlExpression(\n arg,\n argumentCompilationContext(expression.name, index, arg, context),\n ),\n )\n if (compiledArgs.some((arg) => !arg.supported)) {\n return {\n supported: false,\n sql: ``,\n params: [],\n }\n }\n\n const params = compiledArgs.flatMap((arg) => arg.params)\n const argSql = compiledArgs.map((arg) => arg.sql)\n\n switch (expression.name) {\n case `eq`:\n case `gt`:\n case `gte`:\n case `lt`:\n case `lte`: {\n if (\n expression.args.length !== 2 ||\n !argSql[0] ||\n !argSql[1] ||\n !compiledArgs[0] ||\n !compiledArgs[1]\n ) {\n return { supported: false, sql: ``, params: [] }\n }\n\n const valueKind = resolveComparisonValueKind(\n expression.args[0]!,\n expression.args[1]!,\n compiledArgs[0],\n compiledArgs[1],\n )\n const operatorByName: Record<\n `eq` | `gt` | `gte` | `lt` | `lte`,\n `=` | `>` | `>=` | `<` | `<=`\n > = {\n eq: `=`,\n gt: `>`,\n gte: `>=`,\n lt: `<`,\n lte: `<=`,\n }\n\n const comparison = compileComparisonSql(\n operatorByName[expression.name],\n expression.args[0]!,\n expression.args[1]!,\n argSql[0],\n argSql[1],\n valueKind,\n getCompiledValueKind(compiledArgs[0]),\n getCompiledValueKind(compiledArgs[1]),\n )\n // Native order ties need canonical identity, including in persisted\n // expressions. Ordinary string predicates keep one binding; residual\n // filtering removes native order-key collisions from their candidate set.\n const needsIdentity =\n expression.name === `eq` &&\n expression.args.every(\n (arg) =>\n arg.type !== `val` ||\n sqliteTemporalKind(arg.value) ||\n (context === `index-expression` && typeof arg.value === `string`),\n )\n return {\n supported: true,\n sql: needsIdentity\n ? `(${comparison} AND (${compiledArgs[0].identitySql ?? argSql[0]} = ${compiledArgs[1].identitySql ?? argSql[1]}))`\n : comparison,\n params,\n }\n }\n case `and`:\n case `or`: {\n if (argSql.length === 0) {\n return {\n supported: true,\n sql: expression.name === `and` ? `(1 = 1)` : `(0 = 1)`,\n params: [],\n }\n }\n return {\n supported: true,\n sql: argSql\n .map((sql) => `(${sql})`)\n .join(expression.name === `and` ? ` AND ` : ` OR `),\n params,\n }\n }\n case `not`: {\n if (argSql.length !== 1) {\n return { supported: false, sql: ``, params: [] }\n }\n return {\n supported: true,\n sql: `(NOT (${argSql[0]}))`,\n params,\n }\n }\n case `in`: {\n if (expression.args.length !== 2 || expression.args[1]?.type !== `val`) {\n return { supported: false, sql: ``, params: [] }\n }\n\n const listValue = expression.args[1].value\n if (!Array.isArray(listValue)) {\n return { supported: false, sql: ``, params: [] }\n }\n\n if (listValue.length === 0) {\n return { supported: true, sql: `(0 = 1)`, params: [] }\n }\n\n const leftSql = argSql[0]\n const leftParams = compiledArgs[0]?.params ?? []\n if (!leftSql) {\n return { supported: false, sql: ``, params: [] }\n }\n\n // Order and identity are two projections of one validated native encoding.\n const values = listValue.map((value) => {\n const temporal = serializeSQLiteTemporal(value)\n return {\n value:\n typeof value === `bigint`\n ? assertSQLiteBigIntInRange(value)\n : (temporal?.order ?? toSqliteParameterValue(value)),\n identity: temporal ? sqliteTemporalIdentity(temporal) : undefined,\n }\n })\n let identity = ``\n if (\n listValue.some(\n (value) =>\n sqliteTemporalKind(value) ||\n (context === `index-expression` && typeof value === `string`),\n )\n ) {\n const leftIdentity = compiledArgs[0]?.identitySql ?? leftSql\n // Index expressions cannot contain subqueries. Both forms preserve\n // correlated membership and SQL's three-valued Boolean semantics.\n identity =\n context === `index-expression`\n ? ` AND (${joinSqlDisjunction(values.map(({ value, identity: nativeIdentity }) => `(${leftSql} = ${toSqliteExpressionLiteral(value)} AND ${leftIdentity} = ${toSqliteExpressionLiteral(nativeIdentity ?? value)})`))})`\n : ` AND ((${leftSql}, ${leftIdentity}) IN (VALUES ${[...new Set(values.map(({ value, identity: nativeIdentity }) => `(${toSqliteExpressionLiteral(value)}, ${toSqliteExpressionLiteral(nativeIdentity ?? value)})`))].join(`, `)}))`\n }\n if (context === `index-expression`) {\n return {\n supported: true,\n sql: `(${leftSql} IN (${values\n .map(({ value }) => toSqliteExpressionLiteral(value))\n .join(`, `)})${identity})`,\n params: leftParams,\n }\n }\n\n const jsonList = `[${values\n .map(({ value }) =>\n typeof value === `bigint`\n ? assertSQLiteBigIntInRange(value).toString()\n : JSON.stringify(value),\n )\n .join(`,`)}]`\n return {\n supported: true,\n sql: `(${leftSql} IN (SELECT value FROM json_each(?))${identity})`,\n params: [...leftParams, jsonList],\n }\n }\n case `like`:\n return {\n supported: true,\n sql: `(${argSql[0]} LIKE ${argSql[1]})`,\n params,\n }\n case `ilike`:\n return {\n supported: true,\n sql: `(LOWER(${argSql[0]}) LIKE LOWER(${argSql[1]}))`,\n params,\n }\n case `isNull`:\n case `isUndefined`:\n return { supported: true, sql: `(${argSql[0]} IS NULL)`, params }\n case `upper`:\n return { supported: true, sql: `UPPER(${argSql[0]})`, params }\n case `lower`:\n return { supported: true, sql: `LOWER(${argSql[0]})`, params }\n case `length`:\n return { supported: true, sql: `LENGTH(${argSql[0]})`, params }\n case `concat`:\n return { supported: true, sql: `(${argSql.join(` || `)})`, params }\n case `coalesce`:\n return {\n supported: true,\n sql: `COALESCE(${argSql.join(`, `)})`,\n identitySql: `COALESCE(${compiledArgs.map((arg) => arg.identitySql ?? arg.sql).join(`, `)})`,\n params,\n }\n case `add`:\n return { supported: true, sql: `(${argSql[0]} + ${argSql[1]})`, params }\n case `subtract`:\n return { supported: true, sql: `(${argSql[0]} - ${argSql[1]})`, params }\n case `multiply`:\n return { supported: true, sql: `(${argSql[0]} * ${argSql[1]})`, params }\n case `divide`:\n return { supported: true, sql: `(${argSql[0]} / ${argSql[1]})`, params }\n case `date`:\n return {\n supported: true,\n sql: `date(${argSql[0]})`,\n params,\n valueKind: `date`,\n }\n case `datetime`:\n return {\n supported: true,\n sql: `datetime(${argSql[0]})`,\n params,\n valueKind: `datetime`,\n }\n case `strftime`:\n return {\n supported: true,\n sql: `strftime(${argSql.join(`, `)})`,\n params,\n }\n default:\n return {\n supported: false,\n sql: ``,\n params: [],\n }\n }\n}\n\n/** A raw ref/native-literal leaf has exact native truth before prefilter broadening. */\nfunction nativeComparisonRef(\n expression: IR.BasicExpression,\n): IR.PropRef | undefined {\n if (expression.type !== `func` || expression.args.length !== 2)\n return undefined\n const [left, right] = expression.args\n if (expression.name === `in`) {\n return left?.type === `ref` &&\n right?.type === `val` &&\n Array.isArray(right.value) &&\n right.value.length > 0 &&\n right.value.every((value) => sqliteTemporalKind(value))\n ? left\n : undefined\n }\n if (![`eq`, `gt`, `gte`, `lt`, `lte`].includes(expression.name))\n return undefined\n if (\n left?.type === `ref` &&\n right?.type === `val` &&\n sqliteTemporalKind(right.value)\n )\n return left\n if (\n right?.type === `ref` &&\n left?.type === `val` &&\n sqliteTemporalKind(left.value)\n )\n return right\n return undefined\n}\n\nfunction compileNativeRefGuard(ref: IR.PropRef): string {\n const paths = createJsonPathVariants(\n IR.getPropRefPropertyPath(ref).map(String),\n )!\n const kinds = paths.map(\n (path) =>\n `json_extract(value, ${toSqliteLiteral(`${path}.${PERSISTED_TYPE_TAG}`)})`,\n )\n const kind = kinds.length === 1 ? kinds[0] : `COALESCE(${kinds.join(`, `)})`\n return `${kind} IN ('Temporal.Instant', 'Temporal.PlainDate')`\n}\n\nfunction compileSafeSqlPrefilter(\n expression: IR.BasicExpression,\n compiled?: CompiledSqlFragment,\n): CompiledSqlFragment | undefined {\n // Every public match must pass this SQL candidate before JavaScript applies\n // the authoritative row predicate. Extra candidates are allowed.\n const direct = () => {\n const candidate = compiled ?? compileSqlExpression(expression)\n return candidate.supported ? candidate : undefined\n }\n if (expression.type === `val`) {\n return typeof expression.value === `boolean` || expression.value == null\n ? direct()\n : undefined\n }\n if (expression.type === `ref`) return undefined\n\n if (expression.name === `and` || expression.name === `or`) {\n if (expression.args.length === 0) return direct()\n const candidates = expression.args.map((argument) =>\n compileSafeSqlPrefilter(argument),\n )\n if (expression.name === `or` && candidates.some((candidate) => !candidate))\n return undefined\n const selected = candidates.filter(\n (candidate): candidate is CompiledSqlFragment => candidate !== undefined,\n )\n if (selected.length === 0) return undefined\n return {\n supported: true,\n sql: selected\n .map(({ sql }) => `(${sql})`)\n .join(expression.name === `and` ? ` AND ` : ` OR `),\n params: selected.flatMap(({ params }) => params),\n }\n }\n\n // More than three digit segments need too many alternative JSON paths.\n // Keep their prefilter unbounded rather than exclude an object-key match.\n if (hasDeepNumericPath(expression)) return undefined\n compiled ??= compileSqlExpression(expression)\n if (!compiled.supported) return undefined\n const [left, right] = expression.args\n if (\n expression.name === `not` &&\n expression.args.length === 1 &&\n left &&\n nativeComparisonRef(left)\n ) {\n // Negate the original leaf, never a broadened prefilter. Nonfinite stored\n // scalars project to NULL; retaining them also retains valid NOT matches.\n return { ...compiled, sql: `COALESCE(${compiled.sql}, 1)` }\n }\n if (expression.args.length === 2) {\n const nativeRef = nativeComparisonRef(expression)\n if (nativeRef) {\n if (expression.name === `eq` || expression.name === `in`) return compiled\n // NaN orders above native values in the core evaluator. NULL candidates\n // also preserve that law with either operand direction.\n const fieldSql = compileSqlExpression(nativeRef, `index-expression`).sql\n return { ...compiled, sql: `(${compiled.sql} OR ${fieldSql} IS NULL)` }\n }\n if (\n expression.name === `eq` &&\n left?.type === `ref` &&\n right?.type === `ref`\n ) {\n // Ref/ref scalar coercions are not generally SQL-exact. Restrict only\n // native pairs; leave every other pair to the authoritative evaluator.\n return {\n ...compiled,\n sql: `(CASE WHEN ${compileNativeRefGuard(left)} AND ${compileNativeRefGuard(right)} THEN ${compiled.sql} ELSE 1 END)`,\n }\n }\n if (\n [`gt`, `gte`, `lt`, `lte`].includes(expression.name) &&\n (left?.type === `ref` || right?.type === `ref`)\n ) {\n const field =\n left?.type === `ref` ? left : right?.type === `ref` ? right : undefined\n const literal = field === left ? right : left\n if (\n field &&\n literal?.type === `val` &&\n ((typeof literal.value === `number` &&\n Number.isSafeInteger(literal.value)) ||\n typeof literal.value === `bigint`)\n ) {\n const fieldSql = compileSqlExpression(field, `index-expression`).sql\n const literalSql = compileSqlExpression(\n literal,\n typeof literal.value === `bigint` ? `index-expression` : `predicate`,\n )\n const greaterSide =\n (field === left && [`gt`, `gte`].includes(expression.name)) ||\n (field === right && [`lt`, `lte`].includes(expression.name))\n const unsafeBigInt =\n typeof literal.value === `bigint` &&\n !Number.isSafeInteger(Number(literal.value))\n const roundedNumberCandidates = unsafeBigInt\n ? literal.value > 0n\n ? ` OR ${fieldSql} >= ${Number.MAX_SAFE_INTEGER}`\n : ` OR ${fieldSql} <= -${Number.MAX_SAFE_INTEGER}`\n : ``\n return {\n supported: true,\n sql: greaterSide\n ? `(${fieldSql} >= ${literalSql.sql} OR ${fieldSql} IS NULL${roundedNumberCandidates})`\n : `(${fieldSql} <= ${literalSql.sql} OR ${fieldSql} IS NULL OR ${fieldSql} >= ''${roundedNumberCandidates})`,\n params: literalSql.params,\n }\n }\n }\n if (expression.name === `eq`) {\n if (\n ((left?.type === `ref` || isSafeCoalesceOperand(left)) &&\n right?.type === `val` &&\n isSafeEqualityLiteral(right.value)) ||\n ((right?.type === `ref` || isSafeCoalesceOperand(right)) &&\n left?.type === `val` &&\n isSafeEqualityLiteral(left.value))\n ) {\n return compiled\n }\n const lower =\n left?.type === `func` && left.name === `lower`\n ? left\n : right?.type === `func` && right.name === `lower`\n ? right\n : undefined\n const literal = lower === left ? right : left\n if (\n lower?.args.length === 1 &&\n lower.args[0]?.type === `ref` &&\n literal?.type === `val` &&\n typeof literal.value === `string` &&\n [...literal.value].every((char) => char.charCodeAt(0) <= 0x7f) &&\n !literal.value.includes(`\\u0000`)\n ) {\n const lowerSql = compileSqlExpression(lower, `index-expression`).sql\n return {\n supported: true,\n sql: `(${compiled.sql} OR (${lowerSql} >= ? AND ${lowerSql} GLOB '*[^ -~]*'))`,\n params: [...compiled.params, literal.value],\n }\n }\n }\n }\n if (\n expression.name === `in` &&\n expression.args.length === 2 &&\n right?.type === `val` &&\n Array.isArray(right.value)\n ) {\n if (right.value.length === 0) return compiled\n if (left?.type === `ref`) {\n if (right.value.every((value) => typeof value === `bigint`))\n return compiled\n if (right.value.every((value) => typeof value === `string`)) {\n // Both sides pass through SQLite's JSON decoder; one binding keeps\n // large string scopes within the host parameter limit, even in OR.\n return {\n supported: true,\n sql: `(${compileSqlExpression(left, `index-expression`).sql} IN (SELECT value FROM json_each(?)))`,\n params: [JSON.stringify(right.value)],\n }\n }\n }\n }\n if (\n expression.name === `like` &&\n expression.args.length === 2 &&\n left?.type === `ref` &&\n right?.type === `val` &&\n typeof right.value === `string` &&\n /^[\\x20-\\x7e]*%$/.test(right.value) &&\n !right.value.slice(0, -1).includes(`%`) &&\n !right.value.includes(`_`)\n ) {\n return compiled\n }\n return undefined\n}\n\nfunction compileOrderByClauses(\n orderBy: IR.OrderBy | undefined,\n): CompiledSqlFragment {\n if (!orderBy || orderBy.length === 0) {\n return {\n supported: true,\n sql: ``,\n params: [],\n }\n }\n\n const parts: Array<string> = []\n const params: Array<SqliteSupportedValue> = []\n\n for (const clause of orderBy) {\n const compiledExpression = compileSqlExpression(\n clause.expression,\n `index-expression`,\n )\n if (!compiledExpression.supported) {\n return {\n supported: false,\n sql: ``,\n params: [],\n }\n }\n\n params.push(...compiledExpression.params)\n\n const direction =\n clause.compareOptions.direction === `desc` ? `DESC` : `ASC`\n const nulls =\n clause.compareOptions.nulls === `first` ? `NULLS FIRST` : `NULLS LAST`\n parts.push(`${compiledExpression.sql} ${direction} ${nulls}`)\n }\n\n return {\n supported: true,\n sql: parts.join(`, `),\n params,\n }\n}\n\nfunction isExpressionLikeShape(value: unknown): value is IR.BasicExpression {\n if (typeof value !== `object` || value === null) {\n return false\n }\n\n const candidate = value as {\n type?: unknown\n value?: unknown\n path?: unknown\n name?: unknown\n args?: unknown\n sourceAlias?: unknown\n }\n\n if (candidate.type === `val`) {\n return Object.prototype.hasOwnProperty.call(candidate, `value`)\n }\n\n if (candidate.type === `ref`) {\n return (\n Array.isArray(candidate.path) &&\n (candidate.sourceAlias === undefined ||\n (typeof candidate.sourceAlias === `string` &&\n candidate.path[0] === candidate.sourceAlias))\n )\n }\n\n if (candidate.type === `func`) {\n if (typeof candidate.name !== `string` || !Array.isArray(candidate.args)) {\n return false\n }\n return candidate.args.every((arg) => isExpressionLikeShape(arg))\n }\n\n return false\n}\n\nfunction normalizeIndexSqlFragment(fragment: string): string {\n const trimmed = fragment.trim()\n if (trimmed.length === 0) {\n throw new InvalidPersistedCollectionConfigError(\n `Index SQL fragment cannot be empty`,\n )\n }\n\n let parsedJson: unknown\n let hasParsedJson = false\n try {\n parsedJson = JSON.parse(trimmed) as unknown\n hasParsedJson = true\n } catch {\n // Non-JSON strings are treated as raw SQL fragments below.\n }\n\n const decodedJson = hasParsedJson\n ? decodePersistedJsonValue(parsedJson)\n : undefined\n if (hasParsedJson && isExpressionLikeShape(decodedJson)) {\n const compiled = compileSqlExpression(decodedJson, `index-expression`)\n if (!compiled.supported) {\n throw new InvalidPersistedCollectionConfigError(\n `Persisted index expression is not supported by the SQLite compiler`,\n )\n }\n if (compiled.params.length !== 0) {\n throw new InvalidPersistedCollectionConfigError(\n `Persisted index expression cannot contain bound parameters`,\n )\n }\n return compiled.sql\n }\n\n return sanitizeExpressionSqlFragment(fragment)\n}\n\nfunction mergeObjectRows<T extends object>(existing: unknown, incoming: T): T {\n if (typeof existing === `object` && existing !== null) {\n return Object.assign({}, existing as Record<string, unknown>, incoming) as T\n }\n return incoming\n}\n\nfunction* batches<T>(\n changes: ReadonlyArray<T>,\n maxSize: number,\n): Generator<Array<T>> {\n for (let offset = 0; offset < changes.length; offset += maxSize) {\n yield changes.slice(offset, offset + maxSize)\n }\n}\n\nfunction lastMetadataByKey<\n T extends { type: `set` | `delete`; value?: unknown },\n>(\n changes: ReadonlyArray<T>,\n keyOf: (change: T) => string,\n undefinedSetIsNull = false,\n): Array<T> {\n const latest = new Map<string, T>()\n for (const change of changes) {\n const key = keyOf(change)\n const previous = latest.get(key)\n if (\n previous?.type === `set` &&\n (previous.value !== undefined || !undefinedSetIsNull) &&\n (serializePersistedRowValue(previous.value) as string | undefined) ===\n undefined\n ) {\n throw new TypeError(`Metadata value cannot be bound to SQLite`)\n }\n latest.set(key, change)\n }\n return [...latest.values()]\n}\n\nfunction buildIndexName(collectionId: string, signature: string): string {\n const sanitizedSignature = signature\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, `_`)\n .replace(/^_+|_+$/g, ``)\n .slice(0, 24)\n const hashSource = `${collectionId}:${signature}`\n const hashedPart = createPersistedTableName(hashSource, `c`)\n const suffix = sanitizedSignature.length > 0 ? sanitizedSignature : `sig`\n return `idx_${hashedPart}_${suffix}`\n}\n\nexport class SQLiteCorePersistenceAdapter implements PersistenceAdapter {\n private readonly driver: SQLiteDriver\n private readonly schedulingIdentitySource: SQLiteDriver\n private scheduler: SharedPersistenceScheduler | undefined\n private activeUnscheduledHydration: Promise<unknown> | undefined\n private readonly hydrationAdapter: HydrationPersistenceAdapter\n private readonly schemaVersion: number\n private readonly schemaMismatchPolicy: SQLiteCoreAdapterSchemaMismatchPolicy\n private readonly appliedTxPruneMaxRows: number | undefined\n private readonly appliedTxPruneMaxAgeSeconds: number | undefined\n private readonly pullSinceReloadThreshold: number\n private readonly replacementBatchSize: number\n\n private initialized = false\n private readonly collectionTableCache = new Map<\n string,\n CollectionTableMapping\n >()\n private readonly collectionTableLoads = new Map<\n string,\n Promise<CollectionTableMapping>\n >()\n\n constructor(options: SQLiteCoreAdapterOptions) {\n const maxBoundParameters = options.driver.maxBoundParameters\n if (\n maxBoundParameters !== undefined &&\n (!Number.isInteger(maxBoundParameters) || maxBoundParameters < 4)\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `SQLite driver maxBoundParameters must be an integer of at least 4`,\n )\n }\n this.replacementBatchSize =\n maxBoundParameters === undefined\n ? REPLACEMENT_BATCH_SIZE\n : Math.min(REPLACEMENT_BATCH_SIZE, Math.floor(maxBoundParameters / 4))\n\n const schemaVersion = options.schemaVersion ?? DEFAULT_SCHEMA_VERSION\n if (!Number.isInteger(schemaVersion) || schemaVersion < 0) {\n throw new InvalidPersistedCollectionConfigError(\n `SQLite adapter schemaVersion must be a non-negative integer`,\n )\n }\n\n if (\n options.appliedTxPruneMaxRows !== undefined &&\n (!Number.isInteger(options.appliedTxPruneMaxRows) ||\n options.appliedTxPruneMaxRows < 0)\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `SQLite adapter appliedTxPruneMaxRows must be a non-negative integer when provided`,\n )\n }\n\n if (\n options.appliedTxPruneMaxAgeSeconds !== undefined &&\n (!Number.isInteger(options.appliedTxPruneMaxAgeSeconds) ||\n options.appliedTxPruneMaxAgeSeconds < 0)\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `SQLite adapter appliedTxPruneMaxAgeSeconds must be a non-negative integer when provided`,\n )\n }\n\n const pullSinceReloadThreshold =\n options.pullSinceReloadThreshold ?? DEFAULT_PULL_SINCE_RELOAD_THRESHOLD\n if (\n !Number.isInteger(pullSinceReloadThreshold) ||\n pullSinceReloadThreshold < 0\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `SQLite adapter pullSinceReloadThreshold must be a non-negative integer`,\n )\n }\n\n this.schedulingIdentitySource = options.driver\n const schedulingKey =\n getSharedLogicalSchedulingKey(options.driver) ??\n observedDriverSchedulingKeys.get(options.driver)\n this.scheduler = schedulingKey\n ? getSharedPersistenceScheduler(schedulingKey)\n : undefined\n this.driver = schedulingKey\n ? options.driver\n : observeSharedLogicalSchedulingSupport(options.driver, (key) => {\n observedDriverSchedulingKeys.set(options.driver, key)\n const scheduler = getSharedPersistenceScheduler(key)\n this.scheduler ??= scheduler\n if (this.activeUnscheduledHydration) {\n scheduler.adoptRunningHydrate(this.activeUnscheduledHydration)\n }\n })\n this.schemaVersion = schemaVersion\n this.schemaMismatchPolicy =\n options.schemaMismatchPolicy ?? `sync-present-reset`\n this.appliedTxPruneMaxRows = options.appliedTxPruneMaxRows\n this.appliedTxPruneMaxAgeSeconds = options.appliedTxPruneMaxAgeSeconds\n this.pullSinceReloadThreshold = pullSinceReloadThreshold\n this.hydrationAdapter = {\n loadSubset: (collectionId, loadOptions, context) =>\n this.loadSubsetUnscheduled(collectionId, loadOptions, context),\n loadResumeSnapshot: (collectionId, context) =>\n this.loadResumeSnapshotUnscheduled(collectionId, context),\n applyCommittedTx: (collectionId, tx) =>\n this.applyCommittedTxUnscheduled(collectionId, tx),\n loadCollectionMetadata: (collectionId) =>\n this.loadCollectionMetadataUnscheduled(collectionId),\n scanRows: (collectionId, scanOptions) =>\n this.scanRowsUnscheduled(collectionId, scanOptions),\n ensureIndex: (collectionId, signature, spec) =>\n this.ensureIndexUnscheduled(collectionId, signature, spec),\n markIndexRemoved: (collectionId, signature) =>\n this.markIndexRemovedUnscheduled(collectionId, signature),\n getStreamPosition: (collectionId) =>\n this.getStreamPositionUnscheduled(collectionId),\n pullSince: (collectionId, fromRowVersion) =>\n this.pullSinceUnscheduled(collectionId, fromRowVersion),\n runInHydrationScope: async (task) => task(this.hydrationAdapter),\n }\n }\n\n runInHydrationScope<T>(\n task: (adapter: HydrationPersistenceAdapter) => Promise<T>,\n ): Promise<T> {\n const scheduler = this.resolveScheduler()\n if (scheduler) {\n return scheduler.runHydrate(() => task(this.hydrationAdapter))\n }\n\n const hydration = Promise.resolve().then(() => task(this.hydrationAdapter))\n this.activeUnscheduledHydration = hydration\n const clear = () => {\n if (this.activeUnscheduledHydration === hydration) {\n this.activeUnscheduledHydration = undefined\n }\n }\n void hydration.then(clear, clear)\n return hydration\n }\n\n runInRegularScope<T>(\n task: (adapter: HydrationPersistenceAdapter) => Promise<T>,\n ): Promise<T> {\n return this.runRegular(() => task(this.hydrationAdapter))\n }\n\n isHydrationScopeScheduled(): boolean {\n return this.resolveScheduler() !== undefined\n }\n\n private runRegular<T>(task: () => Promise<T>): Promise<T> {\n const scheduler = this.resolveScheduler()\n return scheduler ? scheduler.runRegular(task) : task()\n }\n\n private resolveScheduler(): SharedPersistenceScheduler | undefined {\n if (this.scheduler) return this.scheduler\n const key = observedDriverSchedulingKeys.get(this.schedulingIdentitySource)\n if (key) {\n this.scheduler = getSharedPersistenceScheduler(key)\n }\n return this.scheduler\n }\n\n private runInTransaction<TResult>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TResult>,\n ): Promise<TResult> {\n if (typeof this.driver.transactionWithDriver === `function`) {\n return this.driver.transactionWithDriver(fn)\n }\n\n return this.driver.transaction(fn)\n }\n\n private async assertCurrentSchemaVersion(\n collectionId: string,\n driver: SQLiteDriver,\n operation: string,\n ): Promise<void> {\n const schemaRows = await driver.query<{ schema_version: number }>(\n `SELECT schema_version\n FROM collection_registry\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n )\n const persistedSchemaVersion = schemaRows[0]?.schema_version\n if (persistedSchemaVersion !== this.schemaVersion) {\n throw new InvalidPersistedCollectionConfigError(\n `Schema version mismatch for collection \"${collectionId}\": ` +\n `found ${persistedSchemaVersion ?? `missing`}, expected ${this.schemaVersion}. ` +\n `Refusing to ${operation} through a stale cached adapter.`,\n )\n }\n }\n\n loadSubset(\n collectionId: string,\n options: LoadSubsetOptions,\n ctx?: { requiredIndexSignatures?: ReadonlyArray<string> },\n ): Promise<\n Array<{\n key: string | number\n value: Record<string, unknown>\n metadata?: unknown\n }>\n > {\n return this.runRegular(() =>\n this.loadSubsetUnscheduled(collectionId, options, ctx),\n )\n }\n\n private async loadSubsetUnscheduled(\n collectionId: string,\n options: LoadSubsetOptions,\n ctx?: { requiredIndexSignatures?: ReadonlyArray<string> },\n ): Promise<\n Array<{\n key: string | number\n value: Record<string, unknown>\n metadata?: unknown\n }>\n > {\n const tableMapping = await this.ensureCollectionReady(collectionId)\n return this.runInTransaction(async (transactionDriver) => {\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `load persisted rows`,\n )\n await this.touchRequiredIndexes(\n collectionId,\n ctx?.requiredIndexSignatures,\n transactionDriver,\n )\n\n if (options.cursor) {\n const whereCurrentOptions: LoadSubsetOptions = {\n where: options.where\n ? new IR.Func(`and`, [options.where, options.cursor.whereCurrent])\n : options.cursor.whereCurrent,\n orderBy: options.orderBy,\n }\n const whereFromOptions: LoadSubsetOptions = {\n where: options.where\n ? new IR.Func(`and`, [options.where, options.cursor.whereFrom])\n : options.cursor.whereFrom,\n orderBy: options.orderBy,\n limit: options.limit,\n }\n\n const [whereCurrentRows, whereFromRows] = await Promise.all([\n this.loadSubsetInternal(\n tableMapping,\n whereCurrentOptions,\n transactionDriver,\n ),\n this.loadSubsetInternal(\n tableMapping,\n whereFromOptions,\n transactionDriver,\n ),\n ])\n\n const mergedRows = new Map<\n string,\n InMemoryRow<string | number, Record<string, unknown>>\n >()\n for (const row of [...whereCurrentRows, ...whereFromRows]) {\n mergedRows.set(encodePersistedStorageKey(row.key), row)\n }\n\n const orderedRows = this.applyInMemoryOrderBy(\n Array.from(mergedRows.values()),\n options.orderBy,\n )\n\n return orderedRows.map((row) => ({\n key: row.key,\n value: row.value,\n metadata: row.metadata,\n }))\n }\n\n const rows = await this.loadSubsetInternal(\n tableMapping,\n options,\n transactionDriver,\n )\n return rows.map((row) => ({\n key: row.key,\n value: row.value,\n metadata: row.metadata,\n }))\n })\n }\n\n loadResumeSnapshot(\n collectionId: string,\n ctx?: {\n requiredIndexSignatures?: ReadonlyArray<string>\n includeRows?: boolean\n },\n ) {\n return this.runRegular(() =>\n this.loadResumeSnapshotUnscheduled(collectionId, ctx),\n )\n }\n\n private async loadResumeSnapshotUnscheduled(\n collectionId: string,\n ctx?: {\n requiredIndexSignatures?: ReadonlyArray<string>\n includeRows?: boolean\n },\n ): Promise<{\n rows: Array<{\n key: string | number\n value: Record<string, unknown>\n metadata?: unknown\n }>\n keySet: PersistedKeySetEvidence\n collectionMetadata: Array<{ key: string; value: unknown }>\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n }> {\n const tableMapping = await this.ensureCollectionReady(collectionId)\n const includeRows = ctx?.includeRows !== false\n\n return this.runInTransaction(async (transactionDriver) => {\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `load a resume snapshot`,\n )\n if (includeRows) {\n await this.touchRequiredIndexes(\n collectionId,\n ctx?.requiredIndexSignatures,\n transactionDriver,\n )\n }\n\n const rows = includeRows\n ? await this.loadSubsetInternal(tableMapping, {}, transactionDriver)\n : []\n const { latestRowVersion, keySet } = await this.readKeySetEvidence(\n collectionId,\n transactionDriver,\n )\n const collectionMetadataRows = await transactionDriver.query<{\n key: string\n value: string\n }>(\n `SELECT key, value\n FROM collection_metadata\n WHERE collection_id = ?`,\n [collectionId],\n )\n const { latestTerm, latestSeq } = await this.readStreamPosition(\n collectionId,\n transactionDriver,\n )\n const resetRows = await transactionDriver.query<{ reset_epoch: number }>(\n `SELECT reset_epoch\n FROM collection_reset_epoch\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n )\n\n return {\n rows: rows.map((row) => ({\n key: row.key,\n value: row.value,\n metadata: row.metadata,\n })),\n keySet,\n collectionMetadata: collectionMetadataRows.map((row) => ({\n key: row.key,\n value: deserializePersistedRowValue(row.value),\n })),\n latestTerm,\n latestSeq,\n latestRowVersion,\n resetEpoch: resetRows[0]?.reset_epoch ?? 0,\n }\n })\n }\n\n applyCommittedTx(collectionId: string, tx: PersistedTx): Promise<void> {\n return this.runRegular(() =>\n this.applyCommittedTxUnscheduled(collectionId, tx),\n )\n }\n\n private async applyCommittedTxUnscheduled(\n collectionId: string,\n tx: PersistedTx,\n ): Promise<void> {\n const tableMapping = await this.ensureCollectionReady(collectionId)\n const collectionTableSql = quoteIdentifier(tableMapping.tableName)\n const tombstoneTableSql = quoteIdentifier(tableMapping.tombstoneTableName)\n\n await this.runInTransaction(async (transactionDriver) => {\n const versionRows = await transactionDriver.query<{\n latest_row_version: number\n key_set_evidence_available: number\n schema_version: number\n already_applied: number\n }>(\n `SELECT\n latest_row_version,\n key_set_evidence_available,\n (\n SELECT schema_version\n FROM collection_registry\n WHERE collection_id = ?\n LIMIT 1\n ) AS schema_version,\n EXISTS (\n SELECT 1\n FROM applied_tx\n WHERE collection_id = ? AND term = ? AND seq = ?\n ) AS already_applied\n FROM collection_version\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId, collectionId, tx.term, tx.seq, collectionId],\n )\n const version = versionRows[0]\n\n if (!version) {\n throw new InvalidPersistedCollectionConfigError(\n `Missing persisted version state for collection \"${collectionId}\"`,\n )\n }\n if (version.schema_version !== this.schemaVersion) {\n throw new InvalidPersistedCollectionConfigError(\n `Schema version mismatch for collection \"${collectionId}\": ` +\n `found ${version.schema_version}, expected ${this.schemaVersion}. ` +\n `Refusing to apply a committed transaction through a stale cached adapter.`,\n )\n }\n\n if (version.already_applied === 1) {\n return\n }\n\n const currentRowVersion = version.latest_row_version\n const nextRowVersion = Math.max(currentRowVersion + 1, tx.rowVersion)\n const replacesPersistedBaseline = tx.truncate === true\n const tracksPersistedKeySet =\n version.key_set_evidence_available === 1 || replacesPersistedBaseline\n const replayDelta: ReplayableTxDelta | null = replacesPersistedBaseline\n ? null\n : {\n txId: tx.txId,\n latestRowVersion: nextRowVersion,\n changedRows: tx.mutations\n .filter((mutation) => mutation.type !== `delete`)\n .map((mutation) => ({\n key: mutation.key,\n value: mutation.value,\n })),\n deletedKeys: tx.mutations\n .filter((mutation) => mutation.type === `delete`)\n .map((mutation) => mutation.key),\n rowMetadataMutations: tx.rowMetadataMutations ?? [],\n collectionMetadataMutations: tx.collectionMetadataMutations ?? [],\n }\n\n if (replacesPersistedBaseline) {\n await transactionDriver.run(\n `DELETE FROM collection_expected_keys\n WHERE collection_id = ?`,\n [collectionId],\n )\n await transactionDriver.run(`DELETE FROM ${collectionTableSql}`)\n await transactionDriver.run(`DELETE FROM ${tombstoneTableSql}`)\n }\n\n const rowMutations = new Map<string, PersistedTx[`mutations`][number]>()\n for (const mutation of tx.mutations) {\n const key = encodePersistedStorageKey(mutation.key)\n const previous = rowMutations.get(key)\n if (!previous) {\n rowMutations.set(key, mutation)\n continue\n }\n\n // A superseded action still had to serialize successfully.\n serializePersistedRowValue(previous.value)\n if (\n previous.type !== `delete` &&\n previous.metadataChanged === true &&\n previous.metadata !== undefined\n ) {\n serializePersistedRowValue(previous.metadata)\n }\n if (mutation.type === `delete`) {\n rowMutations.set(key, mutation)\n continue\n }\n const value =\n mutation.type === `insert` || previous.type === `delete`\n ? mutation.value\n : mergeObjectRows(previous.value, mutation.value)\n const metadataChanged =\n mutation.metadataChanged === true ||\n previous.type === `delete` ||\n previous.metadataChanged === true\n const metadata =\n mutation.metadataChanged === true\n ? mutation.metadata\n : previous.type === `delete`\n ? undefined\n : previous.metadata\n const next = { key: mutation.key, value, metadataChanged, metadata }\n rowMutations.set(\n key,\n mutation.type === `insert` || previous.type !== `update`\n ? { type: `insert`, ...next }\n : { type: `update`, ...next },\n )\n }\n\n for (const batch of batches(\n [...rowMutations.values()],\n this.replacementBatchSize,\n )) {\n const writes = batch.filter((mutation) => mutation.type !== `delete`)\n const deletes = batch.filter((mutation) => mutation.type === `delete`)\n const readKeys = writes\n .filter(\n (mutation) =>\n mutation.type === `update` || mutation.metadataChanged !== true,\n )\n .map((mutation) => encodePersistedStorageKey(mutation.key))\n const existingRows =\n readKeys.length > 0\n ? await transactionDriver.query<{\n key: string\n value: string\n metadata: string | null\n }>(\n `SELECT key, value, metadata\n FROM ${collectionTableSql}\n WHERE key IN (${readKeys.map(() => `?`).join(`, `)})`,\n readKeys,\n )\n : []\n const existing = new Map(existingRows.map((row) => [row.key, row]))\n const writeKeys = writes.map((mutation) =>\n encodePersistedStorageKey(mutation.key),\n )\n const deleteKeys = deletes.map((mutation) =>\n encodePersistedStorageKey(mutation.key),\n )\n\n if (tracksPersistedKeySet && writeKeys.length > 0) {\n await transactionDriver.run(\n `INSERT INTO collection_expected_keys (collection_id, key)\n VALUES ${writeKeys.map(() => `(?, ?)`).join(`, `)}\n ON CONFLICT(collection_id, key) DO NOTHING`,\n writeKeys.flatMap((key) => [collectionId, key]),\n )\n }\n if (tracksPersistedKeySet && deleteKeys.length > 0) {\n await transactionDriver.run(\n `DELETE FROM collection_expected_keys\n WHERE collection_id = ? AND key IN (${deleteKeys.map(() => `?`).join(`, `)})`,\n [collectionId, ...deleteKeys],\n )\n }\n if (deleteKeys.length > 0) {\n await transactionDriver.run(\n `DELETE FROM ${collectionTableSql}\n WHERE key IN (${deleteKeys.map(() => `?`).join(`, `)})`,\n deleteKeys,\n )\n }\n if (writeKeys.length > 0) {\n await transactionDriver.run(\n `INSERT INTO ${collectionTableSql} (key, value, metadata, row_version)\n VALUES ${writeKeys.map(() => `(?, ?, ?, ?)`).join(`, `)}\n ON CONFLICT(key) DO UPDATE SET\n value = excluded.value,\n metadata = excluded.metadata,\n row_version = excluded.row_version`,\n writes.flatMap((mutation, index) => {\n const previous = existing.get(writeKeys[index]!)\n const previousValue = previous?.value\n ? deserializePersistedRowValue(previous.value)\n : undefined\n const previousMetadata =\n previous?.metadata != null\n ? deserializePersistedRowValue(previous.metadata)\n : undefined\n const value =\n mutation.type === `update`\n ? mergeObjectRows(previousValue, mutation.value)\n : mutation.value\n const metadata =\n mutation.metadataChanged === true\n ? mutation.metadata\n : previousMetadata\n return [\n writeKeys[index]!,\n serializePersistedRowValue(value),\n metadata === undefined\n ? null\n : serializePersistedRowValue(metadata),\n nextRowVersion,\n ]\n }),\n )\n await transactionDriver.run(\n `DELETE FROM ${tombstoneTableSql}\n WHERE key IN (${writeKeys.map(() => `?`).join(`, `)})`,\n writeKeys,\n )\n }\n if (deletes.length > 0) {\n await transactionDriver.run(\n `INSERT INTO ${tombstoneTableSql} (key, value, row_version, deleted_at)\n VALUES ${deleteKeys.map(() => `(?, ?, ?, ?)`).join(`, `)}\n ON CONFLICT(key) DO UPDATE SET\n value = excluded.value,\n row_version = excluded.row_version,\n deleted_at = excluded.deleted_at`,\n deletes.flatMap((mutation, index) => [\n deleteKeys[index]!,\n serializePersistedRowValue(mutation.value),\n nextRowVersion,\n new Date().toISOString(),\n ]),\n )\n }\n }\n\n for (const batch of batches(\n lastMetadataByKey(\n tx.rowMetadataMutations ?? [],\n (mutation) => encodePersistedStorageKey(mutation.key),\n true,\n ),\n this.replacementBatchSize,\n )) {\n const keys = batch.map((mutation) =>\n encodePersistedStorageKey(mutation.key),\n )\n await transactionDriver.run(\n `UPDATE ${collectionTableSql}\n SET metadata = CASE key ${keys.map(() => `WHEN ? THEN ?`).join(` `)} END\n WHERE key IN (${keys.map(() => `?`).join(`, `)})`,\n [\n ...batch.flatMap((mutation, index) => [\n keys[index]!,\n mutation.type === `delete` || mutation.value === undefined\n ? null\n : serializePersistedRowValue(mutation.value),\n ]),\n ...keys,\n ],\n )\n }\n\n for (const batch of batches(\n lastMetadataByKey(\n tx.collectionMetadataMutations ?? [],\n (mutation) => mutation.key,\n ),\n this.replacementBatchSize,\n )) {\n const deletes = batch.filter((mutation) => mutation.type === `delete`)\n const sets = batch.filter((mutation) => mutation.type === `set`)\n if (deletes.length > 0) {\n await transactionDriver.run(\n `DELETE FROM collection_metadata\n WHERE collection_id = ? AND key IN (${deletes.map(() => `?`).join(`, `)})`,\n [collectionId, ...deletes.map((mutation) => mutation.key)],\n )\n }\n if (sets.length > 0) {\n await transactionDriver.run(\n `INSERT INTO collection_metadata (collection_id, key, value, updated_at)\n VALUES ${sets.map(() => `(?, ?, ?, CAST(strftime('%s', 'now') AS INTEGER))`).join(`, `)}\n ON CONFLICT(collection_id, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at`,\n sets.flatMap((mutation) => [\n collectionId,\n mutation.key,\n serializePersistedRowValue(mutation.value),\n ]),\n )\n }\n }\n\n await transactionDriver.run(\n `UPDATE collection_version\n SET latest_row_version = ?,\n key_set_evidence_available = CASE\n WHEN ? = 1 THEN 1\n ELSE key_set_evidence_available\n END,\n key_set_evidence_incompatible = CASE\n WHEN ? = 1 THEN 0\n ELSE key_set_evidence_incompatible\n END\n WHERE collection_id = ?`,\n [\n nextRowVersion,\n replacesPersistedBaseline ? 1 : 0,\n replacesPersistedBaseline ? 1 : 0,\n collectionId,\n ],\n )\n\n await transactionDriver.run(\n `INSERT INTO leader_term (collection_id, latest_term)\n VALUES (?, ?)\n ON CONFLICT(collection_id) DO UPDATE SET\n latest_term = CASE\n WHEN leader_term.latest_term > excluded.latest_term\n THEN leader_term.latest_term\n ELSE excluded.latest_term\n END`,\n [collectionId, tx.term],\n )\n\n await transactionDriver.run(\n `INSERT INTO applied_tx (\n collection_id,\n term,\n seq,\n tx_id,\n row_version,\n replay_json,\n replay_requires_full_reload,\n applied_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, CAST(strftime('%s', 'now') AS INTEGER))`,\n [\n collectionId,\n tx.term,\n tx.seq,\n tx.txId,\n nextRowVersion,\n replayDelta ? stableStringify(replayDelta) : null,\n replacesPersistedBaseline ? 1 : 0,\n ],\n )\n\n await this.pruneAppliedTxRows(collectionId, transactionDriver)\n })\n }\n\n loadCollectionMetadata(\n collectionId: string,\n ): Promise<Array<{ key: string; value: unknown }>> {\n return this.runRegular(() =>\n this.loadCollectionMetadataUnscheduled(collectionId),\n )\n }\n\n private async loadCollectionMetadataUnscheduled(\n collectionId: string,\n ): Promise<Array<{ key: string; value: unknown }>> {\n await this.ensureCollectionReady(collectionId)\n return this.runInTransaction(async (transactionDriver) => {\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `load collection metadata`,\n )\n const rows = await transactionDriver.query<{\n key: string\n value: string\n }>(\n `SELECT key, value\n FROM collection_metadata\n WHERE collection_id = ?`,\n [collectionId],\n )\n\n return rows.map((row) => ({\n key: row.key,\n value: deserializePersistedRowValue(row.value),\n }))\n })\n }\n\n scanRows(\n collectionId: string,\n options?: PersistedRowScanOptions,\n ): Promise<Array<PersistedScannedRow>> {\n return this.runRegular(() =>\n this.scanRowsUnscheduled(collectionId, options),\n )\n }\n\n private async scanRowsUnscheduled(\n collectionId: string,\n options?: PersistedRowScanOptions,\n ): Promise<Array<PersistedScannedRow>> {\n const tableMapping = await this.ensureCollectionReady(collectionId)\n const collectionTableSql = quoteIdentifier(tableMapping.tableName)\n return this.runInTransaction(async (transactionDriver) => {\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `scan persisted rows`,\n )\n const storedRows = await transactionDriver.query<StoredSqliteRow>(\n options?.metadataOnly\n ? `SELECT key, value, metadata, row_version\n FROM ${collectionTableSql}\n WHERE metadata IS NOT NULL`\n : `SELECT key, value, metadata, row_version\n FROM ${collectionTableSql}`,\n )\n\n return decodeStoredSqliteRows(storedRows).map((row) => ({\n key: row.key,\n value: row.value,\n metadata: row.metadata,\n }))\n })\n }\n\n ensureIndex(\n collectionId: string,\n signature: string,\n spec: PersistedIndexSpec,\n ): Promise<void> {\n return this.runRegular(() =>\n this.ensureIndexUnscheduled(collectionId, signature, spec),\n )\n }\n\n private async ensureIndexUnscheduled(\n collectionId: string,\n signature: string,\n spec: PersistedIndexSpec,\n ): Promise<void> {\n const tableMapping = await this.ensureCollectionReady(collectionId)\n const collectionTableSql = quoteIdentifier(tableMapping.tableName)\n const indexName = buildIndexName(collectionId, signature)\n const indexNameSql = quoteIdentifier(indexName)\n const normalizedExpressionSql = spec.expressionSql.map((fragment) =>\n normalizeIndexSqlFragment(fragment),\n )\n const expressionSql = normalizedExpressionSql.join(`, `)\n const persistedExpressionSql = JSON.stringify(normalizedExpressionSql)\n const whereSql = spec.whereSql\n ? normalizeIndexSqlFragment(spec.whereSql)\n : undefined\n const persistedWhereSql = whereSql ?? null\n\n await this.runInTransaction(async (transactionDriver) => {\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `create a persisted index`,\n )\n\n const existingRows = await transactionDriver.query<{\n index_name: string\n expression_sql: string\n where_sql: string | null\n }>(\n `SELECT index_name, expression_sql, where_sql\n FROM persisted_index_registry\n WHERE collection_id = ? AND signature = ?\n LIMIT 1`,\n [collectionId, signature],\n )\n const existing = existingRows[0]\n if (\n existing &&\n (existing.index_name !== indexName ||\n existing.expression_sql !== persistedExpressionSql ||\n existing.where_sql !== persistedWhereSql)\n ) {\n // A compiler upgrade can change normalized SQL without changing the\n // logical index signature. Rebuild only that stale physical index so\n // the registry and SQLite planner describe the same expression.\n await transactionDriver.exec(\n `DROP INDEX IF EXISTS ${quoteIdentifier(existing.index_name)}`,\n )\n }\n await transactionDriver.run(\n `INSERT INTO persisted_index_registry (\n collection_id,\n signature,\n index_name,\n expression_sql,\n where_sql,\n removed,\n created_at,\n updated_at,\n last_used_at\n )\n VALUES (?, ?, ?, ?, ?, 0,\n CAST(strftime('%s', 'now') AS INTEGER),\n CAST(strftime('%s', 'now') AS INTEGER),\n CAST(strftime('%s', 'now') AS INTEGER))\n ON CONFLICT(collection_id, signature) DO UPDATE SET\n index_name = excluded.index_name,\n expression_sql = excluded.expression_sql,\n where_sql = excluded.where_sql,\n removed = 0,\n updated_at = CAST(strftime('%s', 'now') AS INTEGER),\n last_used_at = CAST(strftime('%s', 'now') AS INTEGER)`,\n [\n collectionId,\n signature,\n indexName,\n persistedExpressionSql,\n persistedWhereSql,\n ],\n )\n\n const createIndexSql = whereSql\n ? `CREATE INDEX IF NOT EXISTS ${indexNameSql}\n ON ${collectionTableSql} (${expressionSql})\n WHERE ${whereSql}`\n : `CREATE INDEX IF NOT EXISTS ${indexNameSql}\n ON ${collectionTableSql} (${expressionSql})`\n await transactionDriver.exec(createIndexSql)\n })\n }\n\n markIndexRemoved(collectionId: string, signature: string): Promise<void> {\n return this.runRegular(() =>\n this.markIndexRemovedUnscheduled(collectionId, signature),\n )\n }\n\n private async markIndexRemovedUnscheduled(\n collectionId: string,\n signature: string,\n ): Promise<void> {\n await this.ensureCollectionReady(collectionId)\n await this.runInTransaction(async (transactionDriver) => {\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `remove a persisted index`,\n )\n const rows = await transactionDriver.query<{ index_name: string }>(\n `SELECT index_name\n FROM persisted_index_registry\n WHERE collection_id = ? AND signature = ?\n LIMIT 1`,\n [collectionId, signature],\n )\n const indexName = rows[0]?.index_name\n\n await transactionDriver.run(\n `UPDATE persisted_index_registry\n SET removed = 1,\n updated_at = CAST(strftime('%s', 'now') AS INTEGER),\n last_used_at = CAST(strftime('%s', 'now') AS INTEGER)\n WHERE collection_id = ? AND signature = ?`,\n [collectionId, signature],\n )\n\n if (indexName) {\n await transactionDriver.exec(\n `DROP INDEX IF EXISTS ${quoteIdentifier(indexName)}`,\n )\n }\n })\n }\n\n getStreamPosition(collectionId: string): Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }> {\n // Election must not queue behind a hydrate awaiting its first writer route.\n // The stream-position snapshot still uses the driver's transaction admission.\n return this.getStreamPositionUnscheduled(collectionId)\n }\n\n private async getStreamPositionUnscheduled(collectionId: string): Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }> {\n await this.ensureCollectionReady(collectionId)\n return this.runInTransaction(async (transactionDriver) => {\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `read the stream position`,\n )\n const [position, latestRowVersion] = await Promise.all([\n this.readStreamPosition(collectionId, transactionDriver),\n this.readLatestRowVersion(collectionId, transactionDriver),\n ])\n\n return {\n ...position,\n latestRowVersion,\n }\n })\n }\n\n private async readLatestRowVersion(\n collectionId: string,\n driver: SQLiteDriver,\n ): Promise<number> {\n const versionRows = await driver.query<{ latest_row_version: number }>(\n `SELECT latest_row_version\n FROM collection_version\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n )\n return versionRows[0]?.latest_row_version ?? 0\n }\n\n private async readStreamPosition(\n collectionId: string,\n driver: SQLiteDriver,\n ): Promise<{ latestTerm: number; latestSeq: number }> {\n const [termRows, seqRows] = await Promise.all([\n driver.query<{ latest_term: number }>(\n `SELECT latest_term\n FROM leader_term\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n ),\n driver.query<{ max_seq: number }>(\n `SELECT MAX(seq) AS max_seq\n FROM applied_tx\n WHERE collection_id = ? AND term = (\n SELECT latest_term FROM leader_term WHERE collection_id = ? LIMIT 1\n )`,\n [collectionId, collectionId],\n ),\n ])\n\n return {\n latestTerm: termRows[0]?.latest_term ?? 0,\n latestSeq: seqRows[0]?.max_seq ?? 0,\n }\n }\n\n private async readKeySetEvidence(\n collectionId: string,\n driver: SQLiteDriver,\n ): Promise<{\n latestRowVersion: number\n keySet: PersistedKeySetEvidence\n }> {\n const versionRows = await driver.query<{\n latest_row_version: number\n key_set_evidence_available: number\n key_set_incompatible: number\n }>(\n `SELECT\n latest_row_version,\n key_set_evidence_available,\n key_set_evidence_incompatible AS key_set_incompatible\n FROM collection_version\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n )\n const version = versionRows[0]\n\n return {\n latestRowVersion: version?.latest_row_version ?? 0,\n keySet: {\n status:\n version?.key_set_evidence_available !== 1\n ? `unknown`\n : version.key_set_incompatible === 1\n ? `incompatible`\n : `consistent`,\n },\n }\n }\n\n pullSince(\n collectionId: string,\n fromRowVersion: number,\n ): Promise<SQLitePullSinceResult<string | number>> {\n return this.runRegular(() =>\n this.pullSinceUnscheduled(collectionId, fromRowVersion),\n )\n }\n\n private async pullSinceUnscheduled(\n collectionId: string,\n fromRowVersion: number,\n ): Promise<SQLitePullSinceResult<string | number>> {\n const tableMapping = await this.ensureCollectionReady(collectionId)\n const collectionTableSql = quoteIdentifier(tableMapping.tableName)\n const tombstoneTableSql = quoteIdentifier(tableMapping.tombstoneTableName)\n\n return this.runInTransaction(async (transactionDriver) => {\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `read persisted transaction deltas`,\n )\n const [\n changedRows,\n deletedRows,\n latestVersionRows,\n replayRows,\n replayAvailabilityRows,\n ] = await Promise.all([\n transactionDriver.query<{ key: string }>(\n `SELECT key\n FROM ${collectionTableSql}\n WHERE row_version > ?`,\n [fromRowVersion],\n ),\n transactionDriver.query<{ key: string }>(\n `SELECT key\n FROM ${tombstoneTableSql}\n WHERE row_version > ?`,\n [fromRowVersion],\n ),\n transactionDriver.query<{ latest_row_version: number }>(\n `SELECT latest_row_version\n FROM collection_version\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n ),\n transactionDriver.query<{\n tx_id: string\n row_version: number\n replay_json: string | null\n replay_requires_full_reload: number\n }>(\n `SELECT tx_id, row_version, replay_json, replay_requires_full_reload\n FROM applied_tx\n WHERE collection_id = ? AND row_version > ?\n ORDER BY term ASC, seq ASC`,\n [collectionId, fromRowVersion],\n ),\n transactionDriver.query<{ min_row_version: number | null }>(\n `SELECT MIN(row_version) AS min_row_version\n FROM applied_tx\n WHERE collection_id = ?`,\n [collectionId],\n ),\n ])\n\n const latestRowVersion = latestVersionRows[0]?.latest_row_version ?? 0\n const replayFloor = replayAvailabilityRows[0]?.min_row_version\n if (\n latestRowVersion > fromRowVersion &&\n (replayFloor == null || replayFloor > fromRowVersion + 1)\n ) {\n return {\n latestRowVersion,\n requiresFullReload: true,\n }\n }\n\n const changedKeyCount = changedRows.length + deletedRows.length\n\n if (changedKeyCount > this.pullSinceReloadThreshold) {\n return {\n latestRowVersion,\n requiresFullReload: true,\n }\n }\n\n if (\n replayRows.some(\n (row) =>\n row.replay_requires_full_reload !== 0 || row.replay_json == null,\n )\n ) {\n return {\n latestRowVersion,\n requiresFullReload: true,\n }\n }\n\n const decodeKey = (encodedKey: string): string | number => {\n try {\n return decodePersistedStorageKey(encodedKey)\n } catch (error) {\n throw new InvalidPersistedStorageKeyEncodingError(\n `${encodedKey}: ${(error as Error).message}`,\n )\n }\n }\n\n const deltas = replayRows.map((row) => {\n const parsed = deserializePersistedRowValue<ReplayableTxDelta | null>(\n row.replay_json ?? `null`,\n )\n if (!parsed) {\n throw new InvalidPersistedCollectionConfigError(\n `missing replay payload for applied_tx row`,\n )\n }\n return parsed\n })\n\n const replayChangeCount = deltas.reduce(\n (count, delta) =>\n count +\n delta.changedRows.length +\n delta.deletedKeys.length +\n delta.rowMetadataMutations.length +\n delta.collectionMetadataMutations.length,\n 0,\n )\n\n if (replayChangeCount > this.pullSinceReloadThreshold) {\n return {\n latestRowVersion,\n requiresFullReload: true,\n }\n }\n\n return {\n latestRowVersion,\n requiresFullReload: false,\n changedKeys: changedRows.map((row) => decodeKey(row.key)),\n deletedKeys: deletedRows.map((row) => decodeKey(row.key)),\n deltas,\n }\n })\n }\n\n private async loadSubsetInternal(\n tableMapping: CollectionTableMapping,\n options: LoadSubsetOptions,\n driver: SQLiteDriver = this.driver,\n ): Promise<Array<InMemoryRow<string | number, Record<string, unknown>>>> {\n const collectionTableSql = quoteIdentifier(tableMapping.tableName)\n // Compile even when SQL cannot safely prefilter: invalid bindings must\n // reject before the in-memory fallback reads rows.\n const whereCompiled = options.where\n ? compileSqlExpression(options.where)\n : { supported: false, sql: ``, params: [] as Array<SqliteSupportedValue> }\n const safePrefilter = options.where\n ? compileSafeSqlPrefilter(options.where, whereCompiled)\n : undefined\n const orderByCompiled = compileOrderByClauses(options.orderBy)\n\n const queryParams: Array<SqliteSupportedValue> = []\n let sql = `SELECT key, value, metadata, row_version FROM ${collectionTableSql}`\n\n if (safePrefilter) {\n sql = `${sql} WHERE ${safePrefilter.sql}`\n queryParams.push(...safePrefilter.params)\n }\n\n if (options.orderBy && orderByCompiled.supported) {\n sql = `${sql} ORDER BY ${orderByCompiled.sql}, key ASC`\n queryParams.push(...orderByCompiled.params)\n }\n\n if (\n queryParams.length >\n (driver.maxBoundParameters ?? this.driver.maxBoundParameters ?? 999)\n ) {\n sql = `SELECT key, value, metadata, row_version FROM ${collectionTableSql}`\n queryParams.length = 0\n }\n\n const storedRows = await driver.query<StoredSqliteRow>(sql, queryParams)\n const parsedRows = decodeStoredSqliteRows(storedRows)\n\n const filteredRows = this.applyInMemoryWhere(parsedRows, options.where)\n const orderedRows = this.applyInMemoryOrderBy(filteredRows, options.orderBy)\n return this.applyInMemoryPagination(\n orderedRows,\n options.limit,\n options.offset,\n )\n }\n\n private applyInMemoryWhere(\n rows: Array<InMemoryRow<string | number, Record<string, unknown>>>,\n where: IR.BasicExpression<boolean> | undefined,\n ): Array<InMemoryRow<string | number, Record<string, unknown>>> {\n if (!where) {\n return rows\n }\n\n const evaluator = compileRowExpressionEvaluator(where)\n return rows.filter((row) =>\n toBooleanPredicate(evaluator(row.value) as boolean | null),\n )\n }\n\n private applyInMemoryOrderBy(\n rows: Array<InMemoryRow<string | number, Record<string, unknown>>>,\n orderBy: IR.OrderBy | undefined,\n ): Array<InMemoryRow<string | number, Record<string, unknown>>> {\n if (!orderBy || orderBy.length === 0) {\n return rows\n }\n\n const compiledClauses = orderBy.map((clause) => ({\n evaluator: compileRowExpressionEvaluator(clause.expression),\n compareOptions: clause.compareOptions,\n }))\n\n const ordered = [...rows]\n ordered.sort((left, right) => {\n for (const clause of compiledClauses) {\n const leftValue = clause.evaluator(left.value)\n const rightValue = clause.evaluator(right.value)\n\n const comparison = compareOrderByValues(\n leftValue,\n rightValue,\n clause.compareOptions,\n )\n\n if (comparison !== 0) {\n return clause.compareOptions.direction === `desc`\n ? comparison * -1\n : comparison\n }\n }\n\n const leftKey = encodePersistedStorageKey(left.key)\n const rightKey = encodePersistedStorageKey(right.key)\n if (leftKey < rightKey) {\n return -1\n }\n if (leftKey > rightKey) {\n return 1\n }\n return 0\n })\n\n return ordered\n }\n\n private applyInMemoryPagination(\n rows: Array<InMemoryRow<string | number, Record<string, unknown>>>,\n limit: number | undefined,\n offset: number | undefined,\n ): Array<InMemoryRow<string | number, Record<string, unknown>>> {\n const start = offset ?? 0\n if (limit === undefined) {\n return rows.slice(start)\n }\n return rows.slice(start, start + limit)\n }\n\n private async touchRequiredIndexes(\n collectionId: string,\n requiredIndexSignatures: ReadonlyArray<string> | undefined,\n driver: SQLiteDriver = this.driver,\n ): Promise<void> {\n if (!requiredIndexSignatures || requiredIndexSignatures.length === 0) {\n return\n }\n\n for (const signature of requiredIndexSignatures) {\n await driver.run(\n `UPDATE persisted_index_registry\n SET last_used_at = CAST(strftime('%s', 'now') AS INTEGER),\n updated_at = CAST(strftime('%s', 'now') AS INTEGER)\n WHERE collection_id = ? AND signature = ? AND removed = 0`,\n [collectionId, signature],\n )\n }\n }\n\n private async pruneAppliedTxRows(\n collectionId: string,\n driver: SQLiteDriver = this.driver,\n ): Promise<void> {\n if (\n this.appliedTxPruneMaxAgeSeconds !== undefined &&\n this.appliedTxPruneMaxAgeSeconds > 0\n ) {\n await driver.run(\n `DELETE FROM applied_tx\n WHERE collection_id = ?\n AND applied_at < (CAST(strftime('%s', 'now') AS INTEGER) - ?)`,\n [collectionId, this.appliedTxPruneMaxAgeSeconds],\n )\n }\n\n if (\n this.appliedTxPruneMaxRows === undefined ||\n this.appliedTxPruneMaxRows <= 0\n ) {\n return\n }\n\n const countRows = await driver.query<{ count: number }>(\n `SELECT COUNT(*) AS count\n FROM applied_tx\n WHERE collection_id = ?`,\n [collectionId],\n )\n const count = countRows[0]?.count ?? 0\n const excessRows = count - this.appliedTxPruneMaxRows\n if (excessRows <= 0) {\n return\n }\n\n await driver.run(\n `DELETE FROM applied_tx\n WHERE rowid IN (\n SELECT rowid\n FROM applied_tx\n WHERE collection_id = ?\n ORDER BY term ASC, seq ASC\n LIMIT ?\n )`,\n [collectionId, excessRows],\n )\n }\n\n private async ensureCollectionReady(\n collectionId: string,\n ): Promise<CollectionTableMapping> {\n await this.ensureInitialized()\n\n const cached = this.collectionTableCache.get(collectionId)\n if (cached) {\n return cached\n }\n\n const inFlight = this.collectionTableLoads.get(collectionId)\n if (inFlight) {\n return inFlight\n }\n\n const loadPromise = this.ensureCollectionReadyInternal(collectionId)\n this.collectionTableLoads.set(collectionId, loadPromise)\n\n try {\n return await loadPromise\n } finally {\n this.collectionTableLoads.delete(collectionId)\n }\n }\n\n private async loadCollectionRegistration(collectionId: string): Promise<\n | {\n table_name: string\n tombstone_table_name: string\n schema_version: number\n }\n | undefined\n > {\n const rows = await this.driver.query<{\n table_name: string\n tombstone_table_name: string\n schema_version: number\n }>(\n `SELECT table_name, tombstone_table_name, schema_version\n FROM collection_registry\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n )\n\n return rows[0]\n }\n\n private async ensureCollectionReadyInternal(\n collectionId: string,\n ): Promise<CollectionTableMapping> {\n let registration = await this.loadCollectionRegistration(collectionId)\n\n if (!registration) {\n const tableName = createPersistedTableName(collectionId, `c`)\n const tombstoneTableName = createPersistedTableName(collectionId, `t`)\n await this.driver.run(\n `INSERT INTO collection_registry (\n collection_id,\n table_name,\n tombstone_table_name,\n schema_version,\n updated_at\n )\n VALUES (?, ?, ?, ?, CAST(strftime('%s', 'now') AS INTEGER))\n ON CONFLICT DO NOTHING`,\n [collectionId, tableName, tombstoneTableName, this.schemaVersion],\n )\n\n registration = await this.loadCollectionRegistration(collectionId)\n if (!registration) {\n throw new InvalidPersistedCollectionConfigError(\n `Unable to register persistence tables for collection \"${collectionId}\"`,\n )\n }\n }\n\n const tableName = registration.table_name\n const tombstoneTableName = registration.tombstone_table_name\n if (registration.schema_version !== this.schemaVersion) {\n await this.handleSchemaMismatch(\n collectionId,\n registration.schema_version,\n this.schemaVersion,\n tableName,\n tombstoneTableName,\n )\n }\n\n const collectionTableSql = quoteIdentifier(tableName)\n const tombstoneTableSql = quoteIdentifier(tombstoneTableName)\n\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS ${collectionTableSql} (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n metadata TEXT,\n row_version INTEGER NOT NULL\n )`,\n )\n await this.driver.exec(\n `CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${tableName}_row_version_idx`)}\n ON ${collectionTableSql} (row_version)`,\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS ${tombstoneTableSql} (\n key TEXT PRIMARY KEY,\n value TEXT,\n row_version INTEGER NOT NULL,\n deleted_at TEXT NOT NULL\n )`,\n )\n await this.driver.exec(\n `CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${tombstoneTableName}_row_version_idx`)}\n ON ${tombstoneTableSql} (row_version)`,\n )\n await this.driver.run(\n `INSERT INTO collection_version (\n collection_id,\n latest_row_version,\n key_set_evidence_available,\n key_set_evidence_incompatible\n )\n VALUES (?, 0, 1, 0)\n ON CONFLICT(collection_id) DO NOTHING`,\n [collectionId],\n )\n await this.driver.run(\n `INSERT INTO collection_reset_epoch (collection_id, reset_epoch, updated_at)\n VALUES (?, 0, CAST(strftime('%s', 'now') AS INTEGER))\n ON CONFLICT(collection_id) DO NOTHING`,\n [collectionId],\n )\n await this.ensureCollectionKeyEvidenceTriggers(collectionId, tableName)\n const mapping = {\n tableName,\n tombstoneTableName,\n }\n this.collectionTableCache.set(collectionId, mapping)\n return mapping\n }\n\n private async ensureCollectionKeyEvidenceTriggers(\n collectionId: string,\n tableName: string,\n ): Promise<void> {\n const collectionTableSql = quoteIdentifier(tableName)\n const collectionIdLiteral = toSqliteLiteral(collectionId)\n const insertTriggerSql = quoteIdentifier(`${tableName}_key_evidence_insert`)\n const deleteTriggerSql = quoteIdentifier(`${tableName}_key_evidence_delete`)\n const updateTriggerSql = quoteIdentifier(`${tableName}_key_evidence_update`)\n\n await this.driver.exec(\n `CREATE TRIGGER IF NOT EXISTS ${insertTriggerSql}\n AFTER INSERT ON ${collectionTableSql}\n WHEN EXISTS (\n SELECT 1\n FROM collection_version\n WHERE collection_id = ${collectionIdLiteral}\n AND key_set_evidence_available = 1\n ) AND NOT EXISTS (\n SELECT 1\n FROM collection_expected_keys\n WHERE collection_id = ${collectionIdLiteral}\n AND key = NEW.key\n )\n BEGIN\n UPDATE collection_version\n SET key_set_evidence_incompatible = 1\n WHERE collection_id = ${collectionIdLiteral};\n END`,\n )\n await this.driver.exec(\n `CREATE TRIGGER IF NOT EXISTS ${deleteTriggerSql}\n AFTER DELETE ON ${collectionTableSql}\n WHEN EXISTS (\n SELECT 1\n FROM collection_version\n WHERE collection_id = ${collectionIdLiteral}\n AND key_set_evidence_available = 1\n ) AND EXISTS (\n SELECT 1\n FROM collection_expected_keys\n WHERE collection_id = ${collectionIdLiteral}\n AND key = OLD.key\n )\n BEGIN\n UPDATE collection_version\n SET key_set_evidence_incompatible = 1\n WHERE collection_id = ${collectionIdLiteral};\n END`,\n )\n await this.driver.exec(\n `CREATE TRIGGER IF NOT EXISTS ${updateTriggerSql}\n AFTER UPDATE OF key ON ${collectionTableSql}\n WHEN OLD.key <> NEW.key AND EXISTS (\n SELECT 1\n FROM collection_version\n WHERE collection_id = ${collectionIdLiteral}\n AND key_set_evidence_available = 1\n )\n BEGIN\n UPDATE collection_version\n SET key_set_evidence_incompatible = 1\n WHERE collection_id = ${collectionIdLiteral};\n END`,\n )\n }\n\n private async handleSchemaMismatch(\n collectionId: string,\n previousSchemaVersion: number,\n nextSchemaVersion: number,\n tableName: string,\n tombstoneTableName: string,\n ): Promise<void> {\n if (this.schemaMismatchPolicy === `sync-absent-error`) {\n throw new InvalidPersistedCollectionConfigError(\n `Schema version mismatch for collection \"${collectionId}\": found ${previousSchemaVersion}, expected ${nextSchemaVersion}. ` +\n `Set schemaMismatchPolicy to \"sync-present-reset\" or \"reset\" to allow automatic reset.`,\n )\n }\n\n const collectionTableSql = quoteIdentifier(tableName)\n const tombstoneTableSql = quoteIdentifier(tombstoneTableName)\n\n await this.runInTransaction(async (transactionDriver) => {\n const currentSchemaRows = await transactionDriver.query<{\n schema_version: number\n }>(\n `SELECT schema_version\n FROM collection_registry\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n )\n const currentSchemaVersion = currentSchemaRows[0]?.schema_version\n if (currentSchemaVersion === nextSchemaVersion) {\n return\n }\n if (currentSchemaVersion !== previousSchemaVersion) {\n throw new InvalidPersistedCollectionConfigError(\n `Schema version changed concurrently for collection \"${collectionId}\": ` +\n `found ${currentSchemaVersion ?? `no registry entry`} after observing ${previousSchemaVersion}; ` +\n `refusing to reset it to ${nextSchemaVersion}.`,\n )\n }\n\n const persistedIndexes = await transactionDriver.query<{\n index_name: string\n }>(\n `SELECT index_name\n FROM persisted_index_registry\n WHERE collection_id = ?`,\n [collectionId],\n )\n for (const row of persistedIndexes) {\n await transactionDriver.exec(\n `DROP INDEX IF EXISTS ${quoteIdentifier(row.index_name)}`,\n )\n }\n\n await transactionDriver.run(\n `DELETE FROM collection_expected_keys\n WHERE collection_id = ?`,\n [collectionId],\n )\n await transactionDriver.run(`DELETE FROM ${collectionTableSql}`)\n await transactionDriver.run(`DELETE FROM ${tombstoneTableSql}`)\n await transactionDriver.run(\n `DELETE FROM applied_tx\n WHERE collection_id = ?`,\n [collectionId],\n )\n await transactionDriver.run(\n `DELETE FROM persisted_index_registry\n WHERE collection_id = ?`,\n [collectionId],\n )\n await transactionDriver.run(\n `DELETE FROM collection_metadata\n WHERE collection_id = ?`,\n [collectionId],\n )\n await transactionDriver.run(\n `UPDATE collection_registry\n SET schema_version = ?,\n updated_at = CAST(strftime('%s', 'now') AS INTEGER)\n WHERE collection_id = ?`,\n [nextSchemaVersion, collectionId],\n )\n await transactionDriver.run(\n `INSERT INTO collection_version (\n collection_id,\n latest_row_version,\n key_set_evidence_available,\n key_set_evidence_incompatible\n )\n VALUES (?, 0, 1, 0)\n ON CONFLICT(collection_id) DO UPDATE SET\n latest_row_version = 0,\n key_set_evidence_available = 1,\n key_set_evidence_incompatible = 0`,\n [collectionId],\n )\n await transactionDriver.run(\n `INSERT INTO collection_reset_epoch (collection_id, reset_epoch, updated_at)\n VALUES (?, 1, CAST(strftime('%s', 'now') AS INTEGER))\n ON CONFLICT(collection_id) DO UPDATE SET\n reset_epoch = collection_reset_epoch.reset_epoch + 1,\n updated_at = CAST(strftime('%s', 'now') AS INTEGER)`,\n [collectionId],\n )\n })\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) {\n return\n }\n\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS collection_registry (\n collection_id TEXT PRIMARY KEY,\n table_name TEXT NOT NULL UNIQUE,\n tombstone_table_name TEXT NOT NULL UNIQUE,\n schema_version INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )`,\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS persisted_index_registry (\n collection_id TEXT NOT NULL,\n signature TEXT NOT NULL,\n index_name TEXT NOT NULL,\n expression_sql TEXT NOT NULL,\n where_sql TEXT,\n removed INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n last_used_at INTEGER NOT NULL,\n PRIMARY KEY (collection_id, signature)\n )`,\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS applied_tx (\n collection_id TEXT NOT NULL,\n term INTEGER NOT NULL,\n seq INTEGER NOT NULL,\n tx_id TEXT NOT NULL,\n row_version INTEGER NOT NULL,\n replay_json TEXT,\n replay_requires_full_reload INTEGER NOT NULL DEFAULT 0,\n applied_at INTEGER NOT NULL,\n PRIMARY KEY (collection_id, term, seq)\n )`,\n )\n try {\n await this.driver.exec(\n `ALTER TABLE applied_tx ADD COLUMN replay_json TEXT`,\n )\n } catch (error) {\n if (!isDuplicateColumnAddError(error, `replay_json`)) {\n throw error\n }\n }\n try {\n await this.driver.exec(\n `ALTER TABLE applied_tx ADD COLUMN replay_requires_full_reload INTEGER NOT NULL DEFAULT 0`,\n )\n } catch (error) {\n if (!isDuplicateColumnAddError(error, `replay_requires_full_reload`)) {\n throw error\n }\n }\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS collection_version (\n collection_id TEXT PRIMARY KEY,\n latest_row_version INTEGER NOT NULL,\n key_set_evidence_available INTEGER NOT NULL DEFAULT 0,\n key_set_evidence_incompatible INTEGER NOT NULL DEFAULT 0\n )`,\n )\n const collectionVersionColumns = await this.driver.query<{ name: string }>(\n `PRAGMA table_info(collection_version)`,\n )\n const keyEvidenceColumns = [\n `key_set_evidence_available`,\n `key_set_evidence_incompatible`,\n ] as const\n for (const columnName of keyEvidenceColumns) {\n if (collectionVersionColumns.some(({ name }) => name === columnName)) {\n continue\n }\n try {\n await this.driver.exec(\n `ALTER TABLE collection_version ADD COLUMN ${columnName} INTEGER NOT NULL DEFAULT 0`,\n )\n } catch (error) {\n if (!isDuplicateColumnAddError(error, columnName)) {\n throw error\n }\n }\n }\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS collection_expected_keys (\n collection_id TEXT NOT NULL,\n key TEXT NOT NULL,\n PRIMARY KEY (collection_id, key)\n )`,\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS collection_metadata (\n collection_id TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n updated_at INTEGER NOT NULL,\n PRIMARY KEY (collection_id, key)\n )`,\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS leader_term (\n collection_id TEXT PRIMARY KEY,\n latest_term INTEGER NOT NULL\n )`,\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS schema_version (\n scope TEXT PRIMARY KEY,\n version INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )`,\n )\n await this.driver.run(\n `INSERT INTO schema_version (scope, version, updated_at)\n VALUES ('global', ?, CAST(strftime('%s', 'now') AS INTEGER))\n ON CONFLICT(scope) DO UPDATE SET\n version = excluded.version,\n updated_at = excluded.updated_at`,\n [this.schemaVersion],\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS collection_reset_epoch (\n collection_id TEXT PRIMARY KEY,\n reset_epoch INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )`,\n )\n\n this.initialized = true\n }\n}\n\nexport function createSQLiteCorePersistenceAdapter(\n options: SQLiteCoreAdapterOptions,\n): PersistenceAdapter {\n return new SQLiteCorePersistenceAdapter(options)\n}\n"],"names":["SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY","InvalidPersistedCollectionConfigError","PERSISTED_TYPE_TAG","PERSISTED_VALUE_TAG","serializeSQLiteBigInt","serializeSQLiteTemporal","reviveSQLiteTemporal","assertSQLiteBigIntInRange","compileSingleRowExpression","sqliteTemporalKind","compareTemporalValues","IR","decodePersistedStorageKey","sqliteTemporalIdentity","createPersistedTableName","encodePersistedStorageKey","InvalidPersistedStorageKeyEncodingError","toBooleanPredicate","tableName","tombstoneTableName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sqlite-core-adapter.cjs","sources":["../../src/sqlite-core-adapter.ts"],"sourcesContent":["import {\n IR,\n compareTemporalValues,\n compileSingleRowExpression,\n safeRandomUUID,\n toBooleanPredicate,\n} from '@tanstack/db'\nimport {\n InvalidPersistedCollectionConfigError,\n InvalidPersistedStorageKeyEncodingError,\n} from './errors'\nimport { isValidCommittedTxAnchor } from './committed-tx-anchor'\nimport {\n SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY,\n createPersistedTableName,\n decodePersistedStorageKey,\n encodePersistedStorageKey,\n resolvePersistedStorageTarget,\n} from './persisted'\nimport {\n PERSISTED_TYPE_TAG,\n PERSISTED_VALUE_TAG,\n assertSQLiteBigIntInRange,\n reviveSQLiteTemporal,\n serializeSQLiteBigInt,\n serializeSQLiteTemporal,\n sqliteTemporalIdentity,\n sqliteTemporalKind,\n} from './sqlite-value'\nimport type { LoadSubsetOptions } from '@tanstack/db'\nimport type {\n CommittedTxAnchor,\n HydrationPersistenceAdapter,\n PersistedCacheGenerationClaim,\n PersistedIndexSpec,\n PersistedKeySetEvidence,\n PersistedRowScanOptions,\n PersistedScannedRow,\n PersistedStorageTarget,\n PersistedTx,\n PersistenceAdapter,\n ReconciledCommittedTx,\n ReplayableTxDelta,\n SQLiteDriver,\n} from './persisted'\n\ntype SqliteSupportedValue = null | number | string\n\n// The default stays below SQLite's older 999-variable limit. Drivers with a\n// lower binding cap use smaller chunks; each replacement row binds four values.\nconst REPLACEMENT_BATCH_SIZE = 125\n\ntype CollectionTableMapping = {\n tableName: string\n tombstoneTableName: string\n}\n\ntype CompiledSqlFragment = {\n supported: boolean\n sql: string\n params: Array<SqliteSupportedValue>\n identitySql?: string\n valueKind?: CompiledValueKind\n}\n\ntype SqlExpressionCompilationContext = `predicate` | `index-expression`\n\ntype StoredSqliteRow = {\n key: string\n value: string\n metadata: string | null\n row_version: number\n}\n\ntype SQLiteCoreAdapterSchemaMismatchPolicy =\n `sync-present-reset` | `sync-absent-error` | `reset`\n\nexport type SQLiteCoreAdapterOptions = {\n driver: SQLiteDriver\n schemaVersion?: number\n schemaMismatchPolicy?: SQLiteCoreAdapterSchemaMismatchPolicy\n appliedTxPruneMaxRows?: number\n appliedTxPruneMaxAgeSeconds?: number\n pullSinceReloadThreshold?: number\n /** Milliseconds without renewal before a sync run loses cache access. */\n cacheGenerationClaimTtlMs?: number\n /** Host clock, injectable for expiry histories. */\n now?: () => number\n}\n\nexport type SQLitePullSinceResult<TKey extends string | number> =\n | {\n latestRowVersion: number\n requiresFullReload: true\n }\n | {\n latestRowVersion: number\n requiresFullReload: false\n changedKeys: Array<TKey>\n deletedKeys: Array<TKey>\n deltas: Array<ReplayableTxDelta<Record<string, unknown>, TKey>>\n }\n\ntype ScheduledOperationKind = `regular` | `hydrate`\n\ntype ScheduledOperation<T> = {\n kind: ScheduledOperationKind\n task: () => Promise<T>\n resolve: (value: T) => void\n reject: (error: unknown) => void\n}\n\nclass SharedPersistenceScheduler {\n private readonly regularQueue: Array<ScheduledOperation<unknown>> = []\n private readonly hydrateQueue: Array<ScheduledOperation<unknown>> = []\n private running = false\n private lastCompletedKind: ScheduledOperationKind | undefined\n\n runRegular<T>(task: () => Promise<T>): Promise<T> {\n return this.enqueue(`regular`, task)\n }\n\n runHydrate<T>(task: () => Promise<T>): Promise<T> {\n return this.enqueue(`hydrate`, task)\n }\n\n adoptRunningHydrate(completion: Promise<unknown>): void {\n if (this.running) return\n this.running = true\n const finish = () => {\n this.lastCompletedKind = `hydrate`\n this.running = false\n this.drain()\n }\n void completion.then(finish, finish)\n }\n\n private enqueue<T>(\n kind: ScheduledOperationKind,\n task: () => Promise<T>,\n ): Promise<T> {\n const result = new Promise<T>((resolve, reject) => {\n const operation: ScheduledOperation<T> = {\n kind,\n task,\n resolve,\n reject,\n }\n const queue = kind === `hydrate` ? this.hydrateQueue : this.regularQueue\n queue.push(operation as ScheduledOperation<unknown>)\n })\n this.drain()\n return result\n }\n\n private drain(): void {\n if (this.running) return\n\n const operation = this.takeNext()\n if (!operation) return\n\n this.running = true\n void this.execute(operation)\n }\n\n private async execute(operation: ScheduledOperation<unknown>): Promise<void> {\n try {\n operation.resolve(await operation.task())\n } catch (error) {\n operation.reject(error)\n } finally {\n this.lastCompletedKind = operation.kind\n this.running = false\n this.drain()\n }\n }\n\n private takeNext(): ScheduledOperation<unknown> | undefined {\n // Hydrates get priority after the currently running non-preemptible unit.\n // While both lanes remain queued, alternate one regular operation after\n // each hydrate (K=1), preserving FIFO order within each lane.\n if (this.hydrateQueue.length > 0) {\n if (\n this.regularQueue.length > 0 &&\n this.lastCompletedKind === `hydrate`\n ) {\n return this.regularQueue.shift()\n }\n return this.hydrateQueue.shift()\n }\n return this.regularQueue.shift()\n }\n}\n\nconst sharedPersistenceSchedulers = new WeakMap<\n object,\n SharedPersistenceScheduler\n>()\nconst observedDriverSchedulingKeys = new WeakMap<object, object>()\n\nfunction getSharedPersistenceScheduler(\n key: object,\n): SharedPersistenceScheduler {\n let scheduler = sharedPersistenceSchedulers.get(key)\n if (!scheduler) {\n scheduler = new SharedPersistenceScheduler()\n sharedPersistenceSchedulers.set(key, scheduler)\n }\n return scheduler\n}\n\nfunction getSharedLogicalSchedulingKey(value: unknown): object | undefined {\n if ((typeof value !== `object` && typeof value !== `function`) || !value) {\n return undefined\n }\n const key = (\n value as {\n [SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY]?: unknown\n }\n )[SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY]\n return key !== null && (typeof key === `object` || typeof key === `function`)\n ? key\n : undefined\n}\n\nfunction observeSharedLogicalSchedulingSupport(\n driver: SQLiteDriver,\n onSupport: (key: object) => void,\n): SQLiteDriver {\n let observationPending = true\n const observe = <T>(promise: Promise<T>): Promise<T> => {\n if (!observationPending) return promise\n observationPending = false\n const key = getSharedLogicalSchedulingKey(promise)\n if (key) onSupport(key)\n return promise\n }\n\n return {\n maxBoundParameters: driver.maxBoundParameters,\n exec: (sql) => observe(driver.exec(sql)),\n query: <T>(sql: string, params: ReadonlyArray<unknown> = []) =>\n observe(driver.query<T>(sql, params)),\n run: (sql, params = []) => observe(driver.run(sql, params)),\n transaction: <T>(fn: (transactionDriver: SQLiteDriver) => Promise<T>) =>\n observe(driver.transaction(fn)),\n transactionWithDriver: <T>(\n fn: (transactionDriver: SQLiteDriver) => Promise<T>,\n ) =>\n observe(\n driver.transactionWithDriver\n ? driver.transactionWithDriver(fn)\n : driver.transaction(fn),\n ),\n }\n}\n\nconst DEFAULT_SCHEMA_VERSION = 1\nconst CACHE_GENERATION_ID_PREFIX = `tanstack-db-cache:`\nconst LEGACY_CACHE_GENERATION_ID_PREFIX = `\\u0000tanstack-db-cache:`\n\nfunction hasCacheGenerationIdPrefix(collectionId: string): boolean {\n return (\n collectionId.startsWith(CACHE_GENERATION_ID_PREFIX) ||\n collectionId.startsWith(LEGACY_CACHE_GENERATION_ID_PREFIX)\n )\n}\n\nexport const DEFAULT_CACHE_GENERATION_CLAIM_TTL_MS = 5 * 60_000\nconst DEFAULT_PULL_SINCE_RELOAD_THRESHOLD = 128\n\n/**\n * Default cap on retained `applied_tx` rows per collection. The log is a\n * replayable cache, so a bounded row count keeps SQLite files from growing\n * without limit. Pass `appliedTxPruneMaxRows: 0` to disable the row cap.\n */\nexport const DEFAULT_APPLIED_TX_PRUNE_MAX_ROWS = 1_000\n\n/**\n * Default age backstop for retained `applied_tx` rows, in seconds (24h). Rows\n * older than this are pruned on the next write. Pass\n * `appliedTxPruneMaxAgeSeconds: 0` to disable the age backstop.\n */\nexport const DEFAULT_APPLIED_TX_PRUNE_MAX_AGE_SECONDS = 24 * 60 * 60\n\nconst SAFE_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/\nconst FORBIDDEN_SQL_FRAGMENT_PATTERN = /(;|--|\\/\\*)/\ntype CompiledValueKind = `unknown` | `bigint` | `date` | `datetime`\ntype PersistedTaggedValueType =\n | `bigint`\n | `date`\n | `nan`\n | `infinity`\n | `-infinity`\n | `string`\n | `Temporal.Instant`\n | `Temporal.PlainDate`\ntype PersistedTaggedValue = {\n [PERSISTED_TYPE_TAG]: PersistedTaggedValueType\n [PERSISTED_VALUE_TAG]: string\n}\n\nconst persistedTaggedValueTypes = new Set<PersistedTaggedValueType>([\n `bigint`,\n `date`,\n `nan`,\n `infinity`,\n `-infinity`,\n `string`,\n `Temporal.Instant`,\n `Temporal.PlainDate`,\n])\n\nconst orderByObjectIds = new WeakMap<object, number>()\nlet nextOrderByObjectId = 1\n\nfunction isDuplicateColumnAddError(\n error: unknown,\n columnName: string,\n): boolean {\n if (typeof error !== `string` && !(error instanceof Error)) {\n return false\n }\n\n const normalizedMessage = (\n typeof error === `string` ? error : error.message\n ).toLowerCase()\n return (\n normalizedMessage.includes(columnName.toLowerCase()) &&\n (normalizedMessage.includes(`duplicate column name`) ||\n normalizedMessage.includes(`already exists`))\n )\n}\n\nfunction quoteIdentifier(identifier: string): string {\n if (!SAFE_IDENTIFIER_PATTERN.test(identifier)) {\n throw new InvalidPersistedCollectionConfigError(\n `Invalid SQLite identifier \"${identifier}\"`,\n )\n }\n return `\"${identifier}\"`\n}\n\nfunction isPersistedTaggedValue(value: unknown): value is PersistedTaggedValue {\n if (typeof value !== `object` || value === null) {\n return false\n }\n\n const taggedValue = value as {\n [PERSISTED_TYPE_TAG]?: unknown\n [PERSISTED_VALUE_TAG]?: unknown\n }\n if (\n typeof taggedValue[PERSISTED_TYPE_TAG] !== `string` ||\n typeof taggedValue[PERSISTED_VALUE_TAG] !== `string`\n ) {\n return false\n }\n\n return persistedTaggedValueTypes.has(\n taggedValue[PERSISTED_TYPE_TAG] as PersistedTaggedValueType,\n )\n}\n\nfunction encodePersistedJsonValue(value: unknown): unknown {\n if (value === undefined || value === null) {\n return value\n }\n\n if (typeof value === `bigint`) {\n return serializeSQLiteBigInt(value) satisfies PersistedTaggedValue\n }\n\n const temporal = serializeSQLiteTemporal(value)\n if (temporal) return temporal\n\n if (value instanceof Date) {\n return {\n [PERSISTED_TYPE_TAG]: `date`,\n [PERSISTED_VALUE_TAG]: value.toISOString(),\n } satisfies PersistedTaggedValue\n }\n\n if (typeof value === `number`) {\n if (Number.isNaN(value)) {\n return {\n [PERSISTED_TYPE_TAG]: `nan`,\n [PERSISTED_VALUE_TAG]: `NaN`,\n } satisfies PersistedTaggedValue\n }\n if (value === Number.POSITIVE_INFINITY) {\n return {\n [PERSISTED_TYPE_TAG]: `infinity`,\n [PERSISTED_VALUE_TAG]: `Infinity`,\n } satisfies PersistedTaggedValue\n }\n if (value === Number.NEGATIVE_INFINITY) {\n return {\n [PERSISTED_TYPE_TAG]: `-infinity`,\n [PERSISTED_VALUE_TAG]: `-Infinity`,\n } satisfies PersistedTaggedValue\n }\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => encodePersistedJsonValue(entry))\n }\n\n if (typeof value === `object`) {\n const encodedRecord: Record<string, unknown> = {}\n const recordValue = value as Record<string, unknown>\n for (const [key, entryValue] of Object.entries(recordValue)) {\n const encodedValue = encodePersistedJsonValue(entryValue)\n if (encodedValue !== undefined) {\n encodedRecord[key] = encodedValue\n }\n }\n // Escape the marker field itself, leaving ordinary nested JSON paths intact.\n if (typeof recordValue[PERSISTED_TYPE_TAG] === `string`) {\n encodedRecord[PERSISTED_TYPE_TAG] = {\n [PERSISTED_TYPE_TAG]: `string`,\n [PERSISTED_VALUE_TAG]: recordValue[PERSISTED_TYPE_TAG],\n }\n }\n return encodedRecord\n }\n\n return value\n}\n\nfunction decodePersistedJsonValue(value: unknown): unknown {\n if (value === undefined || value === null) {\n return value\n }\n\n if (isPersistedTaggedValue(value)) {\n switch (value[PERSISTED_TYPE_TAG]) {\n case `string`:\n return value[PERSISTED_VALUE_TAG]\n case `Temporal.Instant`:\n case `Temporal.PlainDate`:\n return reviveSQLiteTemporal(\n value[PERSISTED_TYPE_TAG],\n value[PERSISTED_VALUE_TAG],\n )\n case `bigint`:\n return BigInt(value[PERSISTED_VALUE_TAG])\n case `date`: {\n const parsedDate = new Date(value[PERSISTED_VALUE_TAG])\n return Number.isNaN(parsedDate.getTime()) ? null : parsedDate\n }\n case `nan`:\n return Number.NaN\n case `infinity`:\n return Number.POSITIVE_INFINITY\n case `-infinity`:\n return Number.NEGATIVE_INFINITY\n default:\n return value\n }\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => decodePersistedJsonValue(entry))\n }\n\n if (typeof value === `object`) {\n const decodedRecord: Record<string, unknown> = {}\n const recordValue = value as Record<string, unknown>\n for (const [key, entryValue] of Object.entries(recordValue)) {\n decodedRecord[key] = decodePersistedJsonValue(entryValue)\n }\n return decodedRecord\n }\n\n return value\n}\n\nfunction serializePersistedRowValue(value: unknown): string {\n return JSON.stringify(encodePersistedJsonValue(value))\n}\n\nfunction deserializePersistedRowValue<T>(value: string): T {\n const parsedJson = JSON.parse(value) as unknown\n return decodePersistedJsonValue(parsedJson) as T\n}\n\nfunction toSqliteParameterValue(value: unknown): SqliteSupportedValue {\n if (value == null) {\n return null\n }\n\n if (typeof value === `number`) {\n if (!Number.isFinite(value)) {\n return null\n }\n return value\n }\n\n if (typeof value === `bigint`) {\n assertSQLiteBigIntInRange(value)\n return value.toString()\n }\n\n if (typeof value === `boolean`) {\n return value ? 1 : 0\n }\n\n if (typeof value === `string`) {\n return value\n }\n\n if (value instanceof Date) {\n return value.toISOString()\n }\n\n const temporal = serializeSQLiteTemporal(value)\n return temporal?.order ?? serializePersistedRowValue(value)\n}\n\nfunction toSqliteLiteral(value: SqliteSupportedValue): string {\n if (value === null) {\n return `NULL`\n }\n\n if (typeof value === `number`) {\n return Number.isFinite(value) ? String(value) : `NULL`\n }\n\n if (value.includes(`\\u0000`)) {\n // JSON escapes NUL before SQL parsing and matches stored-string extraction.\n return `json_extract(${toSqliteLiteral(JSON.stringify(value))}, '$')`\n }\n return `'${value.replace(/'/g, `''`)}'`\n}\n\nfunction toSqliteExpressionLiteral(value: unknown): string {\n if (typeof value === `bigint`) {\n return assertSQLiteBigIntInRange(value).toString()\n }\n return toSqliteLiteral(toSqliteParameterValue(value))\n}\n\ntype CompiledRowExpressionEvaluator = (row: Record<string, unknown>) => unknown\n\nfunction compileRowExpressionEvaluator(\n expression: IR.BasicExpression,\n): CompiledRowExpressionEvaluator {\n let baseEvaluator: ReturnType<typeof compileSingleRowExpression>\n try {\n baseEvaluator = compileSingleRowExpression(expression)\n } catch (error) {\n throw new InvalidPersistedCollectionConfigError(\n `Unsupported expression for SQLite adapter fallback evaluator: ${(error as Error).message}`,\n )\n }\n return baseEvaluator\n}\n\nfunction getOrderByObjectId(value: object): number {\n const existing = orderByObjectIds.get(value)\n if (existing !== undefined) {\n return existing\n }\n\n const nextId = nextOrderByObjectId\n nextOrderByObjectId++\n orderByObjectIds.set(value, nextId)\n return nextId\n}\n\nfunction compareOrderByValues(\n left: unknown,\n right: unknown,\n compareOptions: IR.OrderByClause[`compareOptions`],\n): number {\n if (left == null && right == null) {\n return 0\n }\n if (left == null) {\n return compareOptions.nulls === `first` ? -1 : 1\n }\n if (right == null) {\n return compareOptions.nulls === `first` ? 1 : -1\n }\n\n if (typeof left === `string` && typeof right === `string`) {\n if (compareOptions.stringSort === `custom`) {\n return compareOptions.compare(left, right)\n }\n if (compareOptions.stringSort === `locale`) {\n return left.localeCompare(\n right,\n compareOptions.locale,\n compareOptions.localeOptions,\n )\n }\n if (left < right) {\n return -1\n }\n if (left > right) {\n return 1\n }\n return 0\n }\n\n if (Array.isArray(left) && Array.isArray(right)) {\n const maxIndex = Math.min(left.length, right.length)\n for (let index = 0; index < maxIndex; index++) {\n const comparison = compareOrderByValues(\n left[index],\n right[index],\n compareOptions,\n )\n if (comparison !== 0) {\n return comparison\n }\n }\n return left.length - right.length\n }\n\n if (left instanceof Date && right instanceof Date) {\n return left.getTime() - right.getTime()\n }\n\n if (sqliteTemporalKind(left) && sqliteTemporalKind(right)) {\n return compareTemporalValues(left, right)\n }\n\n const leftIsObject = typeof left === `object`\n const rightIsObject = typeof right === `object`\n if (leftIsObject || rightIsObject) {\n if (leftIsObject && rightIsObject) {\n return getOrderByObjectId(left) - getOrderByObjectId(right)\n }\n return leftIsObject ? 1 : -1\n }\n\n if (left < right) {\n return -1\n }\n if (left > right) {\n return 1\n }\n return 0\n}\n\nfunction createJsonPath(path: Array<string>): string | null {\n if (path.length === 0) {\n return null\n }\n\n let jsonPath = `$`\n for (const segment of path) {\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(segment)) {\n jsonPath = `${jsonPath}.${segment}`\n continue\n }\n\n if (/^[0-9]+$/.test(segment)) {\n jsonPath = `${jsonPath}[${segment}]`\n continue\n }\n\n return null\n }\n\n return jsonPath\n}\n\nconst MAX_INDEXED_NUMERIC_PATH_SEGMENTS = 3\n\nfunction hasDeepNumericPath(expression: IR.BasicExpression): boolean {\n if (expression.type === `ref`) {\n return (\n IR.getPropRefPropertyPath(expression).filter((segment) =>\n /^[0-9]+$/.test(String(segment)),\n ).length > MAX_INDEXED_NUMERIC_PATH_SEGMENTS\n )\n }\n return expression.type === `func` && expression.args.some(hasDeepNumericPath)\n}\n\nfunction createJsonPathVariants(path: Array<string>): Array<string> | null {\n const canonical = createJsonPath(path)\n if (!canonical) return null\n\n let paths = [`$`]\n for (const segment of path) {\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(segment)) {\n paths = paths.map((prefix) => `${prefix}.${segment}`)\n } else if (/^[0-9]+$/.test(segment)) {\n if (paths.length >= 2 ** MAX_INDEXED_NUMERIC_PATH_SEGMENTS)\n return [canonical]\n paths = paths.flatMap((prefix) => [\n `${prefix}[${segment}]`,\n `${prefix}.\"${segment}\"`,\n ])\n }\n }\n return paths\n}\n\nfunction getLiteralValueKind(value: unknown): CompiledValueKind {\n if (typeof value === `bigint`) {\n return `bigint`\n }\n if (value instanceof Date) {\n return `datetime`\n }\n return `unknown`\n}\n\nfunction getCompiledValueKind(\n fragment: CompiledSqlFragment,\n): CompiledValueKind {\n return fragment.valueKind ?? `unknown`\n}\n\nfunction resolveComparisonValueKind(\n leftExpression: IR.BasicExpression,\n rightExpression: IR.BasicExpression,\n leftCompiled: CompiledSqlFragment,\n rightCompiled: CompiledSqlFragment,\n): CompiledValueKind {\n const leftKind = getCompiledValueKind(leftCompiled)\n const rightKind = getCompiledValueKind(rightCompiled)\n\n const hasBigIntLiteral =\n (leftExpression.type === `val` &&\n typeof leftExpression.value === `bigint`) ||\n (rightExpression.type === `val` &&\n typeof rightExpression.value === `bigint`)\n if (hasBigIntLiteral || leftKind === `bigint` || rightKind === `bigint`) {\n return `bigint`\n }\n\n const hasDateLiteral =\n (leftExpression.type === `val` && leftExpression.value instanceof Date) ||\n (rightExpression.type === `val` && rightExpression.value instanceof Date)\n if (hasDateLiteral || leftKind === `datetime` || rightKind === `datetime`) {\n return `datetime`\n }\n\n if (leftKind === `date` || rightKind === `date`) {\n return `date`\n }\n\n return `unknown`\n}\n\nfunction compileComparisonSql(\n operator: `=` | `>` | `>=` | `<` | `<=`,\n leftExpression: IR.BasicExpression,\n rightExpression: IR.BasicExpression,\n leftSql: string,\n rightSql: string,\n valueKind: CompiledValueKind,\n leftKind: CompiledValueKind,\n rightKind: CompiledValueKind,\n): string {\n const compileOperand = (\n expression: IR.BasicExpression,\n sql: string,\n otherKind: CompiledValueKind,\n ): string => {\n if (expression.type !== `val`) return sql\n if (valueKind === `date` && otherKind === `date`) return `date(${sql})`\n if (valueKind === `datetime` && otherKind === `datetime`) {\n return `datetime(${sql})`\n }\n return sql\n }\n\n return `(${compileOperand(leftExpression, leftSql, rightKind)} ${operator} ${compileOperand(rightExpression, rightSql, leftKind)})`\n}\n\nfunction compileRefExpressionSql(jsonPath: string): CompiledSqlFragment {\n const typePath = `${jsonPath}.${PERSISTED_TYPE_TAG}`\n const taggedValuePath = `${jsonPath}.${PERSISTED_VALUE_TAG}`\n // createJsonPath has already validated every segment. Keep these paths as\n // canonical SQL literals so runtime refs match persisted expression indexes.\n const typePathSql = toSqliteLiteral(typePath)\n const taggedValuePathSql = toSqliteLiteral(taggedValuePath)\n const jsonPathSql = toSqliteLiteral(jsonPath)\n\n const typeSql = `json_extract(value, ${typePathSql})`\n const orderPathSql = toSqliteLiteral(`${jsonPath}.order`)\n const sql = `(CASE ${typeSql}\n WHEN 'bigint' THEN CAST(json_extract(value, ${taggedValuePathSql}) AS NUMERIC)\n WHEN 'date' THEN json_extract(value, ${taggedValuePathSql})\n WHEN 'string' THEN json_extract(value, ${taggedValuePathSql})\n WHEN 'Temporal.Instant' THEN json_extract(value, ${orderPathSql})\n WHEN 'Temporal.PlainDate' THEN json_extract(value, ${orderPathSql})\n WHEN 'nan' THEN NULL\n WHEN 'infinity' THEN NULL\n WHEN '-infinity' THEN NULL\n ELSE json_extract(value, ${jsonPathSql})\n END)`\n return {\n supported: true,\n sql,\n identitySql: `(CASE WHEN ${typeSql} IN ('Temporal.Instant', 'Temporal.PlainDate') THEN ${typeSql} || ':' || json_extract(value, ${taggedValuePathSql}) ELSE ${sql} END)`,\n params: [],\n valueKind: `unknown`,\n }\n}\n\nfunction sanitizeExpressionSqlFragment(fragment: string): string {\n if (\n fragment.trim().length === 0 ||\n FORBIDDEN_SQL_FRAGMENT_PATTERN.test(fragment)\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `Invalid persisted index SQL fragment: \"${fragment}\"`,\n )\n }\n\n return fragment\n}\n\ntype InMemoryRow<\n TKey extends string | number = string | number,\n T extends object = Record<string, unknown>,\n> = {\n key: TKey\n value: T\n metadata?: unknown\n rowVersion: number\n}\n\nfunction decodeStoredSqliteRows<\n TKey extends string | number = string | number,\n T extends object = Record<string, unknown>,\n>(storedRows: ReadonlyArray<StoredSqliteRow>): Array<InMemoryRow<TKey, T>> {\n return storedRows.map((row) => {\n const key = decodePersistedStorageKey(row.key) as TKey\n const value = deserializePersistedRowValue<T>(row.value)\n return {\n key,\n value,\n metadata:\n row.metadata != null\n ? deserializePersistedRowValue(row.metadata)\n : undefined,\n rowVersion: row.row_version,\n }\n })\n}\n\nfunction stableStringify(value: unknown): string {\n return serializePersistedRowValue(value)\n}\n\n/** Balance disjunctions so a large membership index stays below SQL depth limits. */\nfunction joinSqlDisjunction(parts: ReadonlyArray<string>): string {\n if (parts.length === 1) return parts[0]!\n const middle = Math.floor(parts.length / 2)\n return `(${joinSqlDisjunction(parts.slice(0, middle))} OR ${joinSqlDisjunction(parts.slice(middle))})`\n}\n\nfunction argumentCompilationContext(\n parentName: string,\n argumentIndex: number,\n argument: IR.BasicExpression,\n parentContext: SqlExpressionCompilationContext,\n): SqlExpressionCompilationContext {\n if (parentContext === `index-expression`) return `index-expression`\n\n switch (parentName) {\n case `and`:\n case `or`:\n case `not`:\n return `predicate`\n case `eq`:\n case `gt`:\n case `gte`:\n case `lt`:\n case `lte`:\n case `like`:\n case `ilike`:\n if (argument.type !== `val`) return `index-expression`\n return typeof argument.value === `bigint`\n ? `index-expression`\n : `predicate`\n case `in`:\n return argumentIndex === 0 ? `index-expression` : `predicate`\n case `isNull`:\n case `isUndefined`:\n return `index-expression`\n default:\n return `index-expression`\n }\n}\n\nfunction hasUnpairedSurrogate(value: string): boolean {\n // With /u, paired surrogates form one code point; lone surrogates still match.\n return /[\\uD800-\\uDFFF]/u.test(value)\n}\n\nfunction isSafeEqualityLiteral(value: unknown): boolean {\n return (\n typeof value === `string` ||\n typeof value === `boolean` ||\n typeof value === `bigint` ||\n sqliteTemporalKind(value) !== undefined\n )\n}\n\nfunction isSafeCoalesceOperand(\n expression: IR.BasicExpression | undefined,\n): boolean {\n return (\n expression?.type === `func` &&\n expression.name === `coalesce` &&\n expression.args.length === 2 &&\n expression.args[0]?.type === `ref` &&\n expression.args[1]?.type === `val` &&\n isSafeEqualityLiteral(expression.args[1].value) &&\n !(\n typeof expression.args[1].value === `string` &&\n hasUnpairedSurrogate(expression.args[1].value)\n )\n )\n}\n\nfunction compileSqlExpression(\n expression: IR.BasicExpression,\n context: SqlExpressionCompilationContext = `predicate`,\n): CompiledSqlFragment {\n if (expression.type === `val`) {\n if (\n context === `predicate` &&\n typeof expression.value === `string` &&\n hasUnpairedSurrogate(expression.value)\n ) {\n // JSON extraction changes lone surrogates in stored strings. Apply the\n // same extraction to the binding so an indexed equality keeps its row.\n return {\n supported: true,\n sql: `json_extract(?, '$')`,\n params: [JSON.stringify(expression.value)],\n }\n }\n const temporal = serializeSQLiteTemporal(expression.value)\n const value = temporal?.order ?? toSqliteParameterValue(expression.value)\n return {\n identitySql: temporal\n ? toSqliteLiteral(sqliteTemporalIdentity(temporal))\n : undefined,\n supported: true,\n sql:\n context === `index-expression`\n ? toSqliteExpressionLiteral(\n typeof expression.value === `bigint` ? expression.value : value,\n )\n : `?`,\n params: context === `predicate` ? [value] : [],\n valueKind: getLiteralValueKind(expression.value),\n }\n }\n\n if (expression.type === `ref`) {\n const jsonPaths = createJsonPathVariants(\n IR.getPropRefPropertyPath(expression).map(String),\n )\n if (!jsonPaths) {\n return {\n supported: false,\n sql: ``,\n params: [],\n }\n }\n\n if (jsonPaths.length === 1) return compileRefExpressionSql(jsonPaths[0]!)\n const variants = jsonPaths.map(compileRefExpressionSql)\n return {\n supported: true,\n identitySql: `COALESCE(${variants.map((variant) => variant.identitySql).join(`, `)})`,\n sql: `COALESCE(${variants.map((variant) => variant.sql).join(`, `)})`,\n params: [],\n valueKind: `unknown`,\n }\n }\n\n // IN owns its list encoding; compiling that list as a scalar discards work.\n const args =\n expression.name === `in` ? expression.args.slice(0, 1) : expression.args\n const compiledArgs = args.map((arg, index) =>\n compileSqlExpression(\n arg,\n argumentCompilationContext(expression.name, index, arg, context),\n ),\n )\n if (compiledArgs.some((arg) => !arg.supported)) {\n return {\n supported: false,\n sql: ``,\n params: [],\n }\n }\n\n const params = compiledArgs.flatMap((arg) => arg.params)\n const argSql = compiledArgs.map((arg) => arg.sql)\n\n switch (expression.name) {\n case `eq`:\n case `gt`:\n case `gte`:\n case `lt`:\n case `lte`: {\n if (\n expression.args.length !== 2 ||\n !argSql[0] ||\n !argSql[1] ||\n !compiledArgs[0] ||\n !compiledArgs[1]\n ) {\n return { supported: false, sql: ``, params: [] }\n }\n\n const valueKind = resolveComparisonValueKind(\n expression.args[0]!,\n expression.args[1]!,\n compiledArgs[0],\n compiledArgs[1],\n )\n const operatorByName: Record<\n `eq` | `gt` | `gte` | `lt` | `lte`,\n `=` | `>` | `>=` | `<` | `<=`\n > = {\n eq: `=`,\n gt: `>`,\n gte: `>=`,\n lt: `<`,\n lte: `<=`,\n }\n\n const comparison = compileComparisonSql(\n operatorByName[expression.name],\n expression.args[0]!,\n expression.args[1]!,\n argSql[0],\n argSql[1],\n valueKind,\n getCompiledValueKind(compiledArgs[0]),\n getCompiledValueKind(compiledArgs[1]),\n )\n // Native order ties need canonical identity, including in persisted\n // expressions. Ordinary string predicates keep one binding; residual\n // filtering removes native order-key collisions from their candidate set.\n const needsIdentity =\n expression.name === `eq` &&\n expression.args.every(\n (arg) =>\n arg.type !== `val` ||\n sqliteTemporalKind(arg.value) ||\n (context === `index-expression` && typeof arg.value === `string`),\n )\n return {\n supported: true,\n sql: needsIdentity\n ? `(${comparison} AND (${compiledArgs[0].identitySql ?? argSql[0]} = ${compiledArgs[1].identitySql ?? argSql[1]}))`\n : comparison,\n params,\n }\n }\n case `and`:\n case `or`: {\n if (argSql.length === 0) {\n return {\n supported: true,\n sql: expression.name === `and` ? `(1 = 1)` : `(0 = 1)`,\n params: [],\n }\n }\n return {\n supported: true,\n sql: argSql\n .map((sql) => `(${sql})`)\n .join(expression.name === `and` ? ` AND ` : ` OR `),\n params,\n }\n }\n case `not`: {\n if (argSql.length !== 1) {\n return { supported: false, sql: ``, params: [] }\n }\n return {\n supported: true,\n sql: `(NOT (${argSql[0]}))`,\n params,\n }\n }\n case `in`: {\n if (expression.args.length !== 2 || expression.args[1]?.type !== `val`) {\n return { supported: false, sql: ``, params: [] }\n }\n\n const listValue = expression.args[1].value\n if (!Array.isArray(listValue)) {\n return { supported: false, sql: ``, params: [] }\n }\n\n if (listValue.length === 0) {\n return { supported: true, sql: `(0 = 1)`, params: [] }\n }\n\n const leftSql = argSql[0]\n const leftParams = compiledArgs[0]?.params ?? []\n if (!leftSql) {\n return { supported: false, sql: ``, params: [] }\n }\n\n // Order and identity are two projections of one validated native encoding.\n const values = listValue.map((value) => {\n const temporal = serializeSQLiteTemporal(value)\n return {\n value:\n typeof value === `bigint`\n ? assertSQLiteBigIntInRange(value)\n : (temporal?.order ?? toSqliteParameterValue(value)),\n identity: temporal ? sqliteTemporalIdentity(temporal) : undefined,\n }\n })\n let identity = ``\n if (\n listValue.some(\n (value) =>\n sqliteTemporalKind(value) ||\n (context === `index-expression` && typeof value === `string`),\n )\n ) {\n const leftIdentity = compiledArgs[0]?.identitySql ?? leftSql\n // Index expressions cannot contain subqueries. Both forms preserve\n // correlated membership and SQL's three-valued Boolean semantics.\n identity =\n context === `index-expression`\n ? ` AND (${joinSqlDisjunction(values.map(({ value, identity: nativeIdentity }) => `(${leftSql} = ${toSqliteExpressionLiteral(value)} AND ${leftIdentity} = ${toSqliteExpressionLiteral(nativeIdentity ?? value)})`))})`\n : ` AND ((${leftSql}, ${leftIdentity}) IN (VALUES ${[...new Set(values.map(({ value, identity: nativeIdentity }) => `(${toSqliteExpressionLiteral(value)}, ${toSqliteExpressionLiteral(nativeIdentity ?? value)})`))].join(`, `)}))`\n }\n if (context === `index-expression`) {\n return {\n supported: true,\n sql: `(${leftSql} IN (${values\n .map(({ value }) => toSqliteExpressionLiteral(value))\n .join(`, `)})${identity})`,\n params: leftParams,\n }\n }\n\n const jsonList = `[${values\n .map(({ value }) =>\n typeof value === `bigint`\n ? assertSQLiteBigIntInRange(value).toString()\n : JSON.stringify(value),\n )\n .join(`,`)}]`\n return {\n supported: true,\n sql: `(${leftSql} IN (SELECT value FROM json_each(?))${identity})`,\n params: [...leftParams, jsonList],\n }\n }\n case `like`:\n return {\n supported: true,\n sql: `(${argSql[0]} LIKE ${argSql[1]})`,\n params,\n }\n case `ilike`:\n return {\n supported: true,\n sql: `(LOWER(${argSql[0]}) LIKE LOWER(${argSql[1]}))`,\n params,\n }\n case `isNull`:\n case `isUndefined`:\n return { supported: true, sql: `(${argSql[0]} IS NULL)`, params }\n case `upper`:\n return { supported: true, sql: `UPPER(${argSql[0]})`, params }\n case `lower`:\n return { supported: true, sql: `LOWER(${argSql[0]})`, params }\n case `length`:\n return { supported: true, sql: `LENGTH(${argSql[0]})`, params }\n case `concat`:\n return { supported: true, sql: `(${argSql.join(` || `)})`, params }\n case `coalesce`:\n return {\n supported: true,\n sql: `COALESCE(${argSql.join(`, `)})`,\n identitySql: `COALESCE(${compiledArgs.map((arg) => arg.identitySql ?? arg.sql).join(`, `)})`,\n params,\n }\n case `add`:\n return { supported: true, sql: `(${argSql[0]} + ${argSql[1]})`, params }\n case `subtract`:\n return { supported: true, sql: `(${argSql[0]} - ${argSql[1]})`, params }\n case `multiply`:\n return { supported: true, sql: `(${argSql[0]} * ${argSql[1]})`, params }\n case `divide`:\n return { supported: true, sql: `(${argSql[0]} / ${argSql[1]})`, params }\n case `date`:\n return {\n supported: true,\n sql: `date(${argSql[0]})`,\n params,\n valueKind: `date`,\n }\n case `datetime`:\n return {\n supported: true,\n sql: `datetime(${argSql[0]})`,\n params,\n valueKind: `datetime`,\n }\n case `strftime`:\n return {\n supported: true,\n sql: `strftime(${argSql.join(`, `)})`,\n params,\n }\n default:\n return {\n supported: false,\n sql: ``,\n params: [],\n }\n }\n}\n\n/** A raw ref/native-literal leaf has exact native truth before prefilter broadening. */\nfunction nativeComparisonRef(\n expression: IR.BasicExpression,\n): IR.PropRef | undefined {\n if (expression.type !== `func` || expression.args.length !== 2)\n return undefined\n const [left, right] = expression.args\n if (expression.name === `in`) {\n return left?.type === `ref` &&\n right?.type === `val` &&\n Array.isArray(right.value) &&\n right.value.length > 0 &&\n right.value.every((value) => sqliteTemporalKind(value))\n ? left\n : undefined\n }\n if (![`eq`, `gt`, `gte`, `lt`, `lte`].includes(expression.name))\n return undefined\n if (\n left?.type === `ref` &&\n right?.type === `val` &&\n sqliteTemporalKind(right.value)\n )\n return left\n if (\n right?.type === `ref` &&\n left?.type === `val` &&\n sqliteTemporalKind(left.value)\n )\n return right\n return undefined\n}\n\nfunction compileNativeRefGuard(ref: IR.PropRef): string {\n const paths = createJsonPathVariants(\n IR.getPropRefPropertyPath(ref).map(String),\n )!\n const kinds = paths.map(\n (path) =>\n `json_extract(value, ${toSqliteLiteral(`${path}.${PERSISTED_TYPE_TAG}`)})`,\n )\n const kind = kinds.length === 1 ? kinds[0] : `COALESCE(${kinds.join(`, `)})`\n return `${kind} IN ('Temporal.Instant', 'Temporal.PlainDate')`\n}\n\nfunction compileSafeSqlPrefilter(\n expression: IR.BasicExpression,\n compiled?: CompiledSqlFragment,\n): CompiledSqlFragment | undefined {\n // Every public match must pass this SQL candidate before JavaScript applies\n // the authoritative row predicate. Extra candidates are allowed.\n const direct = () => {\n const candidate = compiled ?? compileSqlExpression(expression)\n return candidate.supported ? candidate : undefined\n }\n if (expression.type === `val`) {\n return typeof expression.value === `boolean` || expression.value == null\n ? direct()\n : undefined\n }\n if (expression.type === `ref`) return undefined\n\n if (expression.name === `and` || expression.name === `or`) {\n if (expression.args.length === 0) return direct()\n const candidates = expression.args.map((argument) =>\n compileSafeSqlPrefilter(argument),\n )\n if (expression.name === `or` && candidates.some((candidate) => !candidate))\n return undefined\n const selected = candidates.filter(\n (candidate): candidate is CompiledSqlFragment => candidate !== undefined,\n )\n if (selected.length === 0) return undefined\n return {\n supported: true,\n sql: selected\n .map(({ sql }) => `(${sql})`)\n .join(expression.name === `and` ? ` AND ` : ` OR `),\n params: selected.flatMap(({ params }) => params),\n }\n }\n\n // More than three digit segments need too many alternative JSON paths.\n // Keep their prefilter unbounded rather than exclude an object-key match.\n if (hasDeepNumericPath(expression)) return undefined\n compiled ??= compileSqlExpression(expression)\n if (!compiled.supported) return undefined\n const [left, right] = expression.args\n if (\n expression.name === `not` &&\n expression.args.length === 1 &&\n left &&\n nativeComparisonRef(left)\n ) {\n // Negate the original leaf, never a broadened prefilter. Nonfinite stored\n // scalars project to NULL; retaining them also retains valid NOT matches.\n return { ...compiled, sql: `COALESCE(${compiled.sql}, 1)` }\n }\n if (expression.args.length === 2) {\n const nativeRef = nativeComparisonRef(expression)\n if (nativeRef) {\n if (expression.name === `eq` || expression.name === `in`) return compiled\n // NaN orders above native values in the core evaluator. NULL candidates\n // also preserve that law with either operand direction.\n const fieldSql = compileSqlExpression(nativeRef, `index-expression`).sql\n return { ...compiled, sql: `(${compiled.sql} OR ${fieldSql} IS NULL)` }\n }\n if (\n expression.name === `eq` &&\n left?.type === `ref` &&\n right?.type === `ref`\n ) {\n // Ref/ref scalar coercions are not generally SQL-exact. Restrict only\n // native pairs; leave every other pair to the authoritative evaluator.\n return {\n ...compiled,\n sql: `(CASE WHEN ${compileNativeRefGuard(left)} AND ${compileNativeRefGuard(right)} THEN ${compiled.sql} ELSE 1 END)`,\n }\n }\n if (\n [`gt`, `gte`, `lt`, `lte`].includes(expression.name) &&\n (left?.type === `ref` || right?.type === `ref`)\n ) {\n const field =\n left?.type === `ref` ? left : right?.type === `ref` ? right : undefined\n const literal = field === left ? right : left\n if (\n field &&\n literal?.type === `val` &&\n ((typeof literal.value === `number` &&\n Number.isSafeInteger(literal.value)) ||\n typeof literal.value === `bigint`)\n ) {\n const fieldSql = compileSqlExpression(field, `index-expression`).sql\n const literalSql = compileSqlExpression(\n literal,\n typeof literal.value === `bigint` ? `index-expression` : `predicate`,\n )\n const greaterSide =\n (field === left && [`gt`, `gte`].includes(expression.name)) ||\n (field === right && [`lt`, `lte`].includes(expression.name))\n const unsafeBigInt =\n typeof literal.value === `bigint` &&\n !Number.isSafeInteger(Number(literal.value))\n const roundedNumberCandidates = unsafeBigInt\n ? literal.value > 0n\n ? ` OR ${fieldSql} >= ${Number.MAX_SAFE_INTEGER}`\n : ` OR ${fieldSql} <= -${Number.MAX_SAFE_INTEGER}`\n : ``\n return {\n supported: true,\n sql: greaterSide\n ? `(${fieldSql} >= ${literalSql.sql} OR ${fieldSql} IS NULL${roundedNumberCandidates})`\n : `(${fieldSql} <= ${literalSql.sql} OR ${fieldSql} IS NULL OR ${fieldSql} >= ''${roundedNumberCandidates})`,\n params: literalSql.params,\n }\n }\n }\n if (expression.name === `eq`) {\n if (\n ((left?.type === `ref` || isSafeCoalesceOperand(left)) &&\n right?.type === `val` &&\n isSafeEqualityLiteral(right.value)) ||\n ((right?.type === `ref` || isSafeCoalesceOperand(right)) &&\n left?.type === `val` &&\n isSafeEqualityLiteral(left.value))\n ) {\n return compiled\n }\n const lower =\n left?.type === `func` && left.name === `lower`\n ? left\n : right?.type === `func` && right.name === `lower`\n ? right\n : undefined\n const literal = lower === left ? right : left\n if (\n lower?.args.length === 1 &&\n lower.args[0]?.type === `ref` &&\n literal?.type === `val` &&\n typeof literal.value === `string` &&\n [...literal.value].every((char) => char.charCodeAt(0) <= 0x7f) &&\n !literal.value.includes(`\\u0000`)\n ) {\n const lowerSql = compileSqlExpression(lower, `index-expression`).sql\n return {\n supported: true,\n sql: `(${compiled.sql} OR (${lowerSql} >= ? AND ${lowerSql} GLOB '*[^ -~]*'))`,\n params: [...compiled.params, literal.value],\n }\n }\n }\n }\n if (\n expression.name === `in` &&\n expression.args.length === 2 &&\n right?.type === `val` &&\n Array.isArray(right.value)\n ) {\n if (right.value.length === 0) return compiled\n if (left?.type === `ref`) {\n if (right.value.every((value) => typeof value === `bigint`))\n return compiled\n if (right.value.every((value) => typeof value === `string`)) {\n // Both sides pass through SQLite's JSON decoder; one binding keeps\n // large string scopes within the host parameter limit, even in OR.\n return {\n supported: true,\n sql: `(${compileSqlExpression(left, `index-expression`).sql} IN (SELECT value FROM json_each(?)))`,\n params: [JSON.stringify(right.value)],\n }\n }\n }\n }\n if (\n expression.name === `like` &&\n expression.args.length === 2 &&\n left?.type === `ref` &&\n right?.type === `val` &&\n typeof right.value === `string` &&\n /^[\\x20-\\x7e]*%$/.test(right.value) &&\n !right.value.slice(0, -1).includes(`%`) &&\n !right.value.includes(`_`)\n ) {\n return compiled\n }\n return undefined\n}\n\nfunction compileOrderByClauses(\n orderBy: IR.OrderBy | undefined,\n): CompiledSqlFragment {\n if (!orderBy || orderBy.length === 0) {\n return {\n supported: true,\n sql: ``,\n params: [],\n }\n }\n\n const parts: Array<string> = []\n const params: Array<SqliteSupportedValue> = []\n\n for (const clause of orderBy) {\n const compiledExpression = compileSqlExpression(\n clause.expression,\n `index-expression`,\n )\n if (!compiledExpression.supported) {\n return {\n supported: false,\n sql: ``,\n params: [],\n }\n }\n\n params.push(...compiledExpression.params)\n\n const direction =\n clause.compareOptions.direction === `desc` ? `DESC` : `ASC`\n const nulls =\n clause.compareOptions.nulls === `first` ? `NULLS FIRST` : `NULLS LAST`\n parts.push(`${compiledExpression.sql} ${direction} ${nulls}`)\n }\n\n return {\n supported: true,\n sql: parts.join(`, `),\n params,\n }\n}\n\nfunction isExpressionLikeShape(value: unknown): value is IR.BasicExpression {\n if (typeof value !== `object` || value === null) {\n return false\n }\n\n const candidate = value as {\n type?: unknown\n value?: unknown\n path?: unknown\n name?: unknown\n args?: unknown\n sourceAlias?: unknown\n }\n\n if (candidate.type === `val`) {\n return Object.prototype.hasOwnProperty.call(candidate, `value`)\n }\n\n if (candidate.type === `ref`) {\n return (\n Array.isArray(candidate.path) &&\n (candidate.sourceAlias === undefined ||\n (typeof candidate.sourceAlias === `string` &&\n candidate.path[0] === candidate.sourceAlias))\n )\n }\n\n if (candidate.type === `func`) {\n if (typeof candidate.name !== `string` || !Array.isArray(candidate.args)) {\n return false\n }\n return candidate.args.every((arg) => isExpressionLikeShape(arg))\n }\n\n return false\n}\n\nfunction normalizeIndexSqlFragment(fragment: string): string {\n const trimmed = fragment.trim()\n if (trimmed.length === 0) {\n throw new InvalidPersistedCollectionConfigError(\n `Index SQL fragment cannot be empty`,\n )\n }\n\n let parsedJson: unknown\n let hasParsedJson = false\n try {\n parsedJson = JSON.parse(trimmed) as unknown\n hasParsedJson = true\n } catch {\n // Non-JSON strings are treated as raw SQL fragments below.\n }\n\n const decodedJson = hasParsedJson\n ? decodePersistedJsonValue(parsedJson)\n : undefined\n if (hasParsedJson && isExpressionLikeShape(decodedJson)) {\n const compiled = compileSqlExpression(decodedJson, `index-expression`)\n if (!compiled.supported) {\n throw new InvalidPersistedCollectionConfigError(\n `Persisted index expression is not supported by the SQLite compiler`,\n )\n }\n if (compiled.params.length !== 0) {\n throw new InvalidPersistedCollectionConfigError(\n `Persisted index expression cannot contain bound parameters`,\n )\n }\n return compiled.sql\n }\n\n return sanitizeExpressionSqlFragment(fragment)\n}\n\nfunction mergeObjectRows<T extends object>(existing: unknown, incoming: T): T {\n if (typeof existing === `object` && existing !== null) {\n return Object.assign({}, existing as Record<string, unknown>, incoming) as T\n }\n return incoming\n}\n\nfunction* batches<T>(\n changes: ReadonlyArray<T>,\n maxSize: number,\n): Generator<Array<T>> {\n for (let offset = 0; offset < changes.length; offset += maxSize) {\n yield changes.slice(offset, offset + maxSize)\n }\n}\n\nfunction lastMetadataByKey<\n T extends { type: `set` | `delete`; value?: unknown },\n>(\n changes: ReadonlyArray<T>,\n keyOf: (change: T) => string,\n undefinedSetIsNull = false,\n): Array<T> {\n const latest = new Map<string, T>()\n for (const change of changes) {\n const key = keyOf(change)\n const previous = latest.get(key)\n if (\n previous?.type === `set` &&\n (previous.value !== undefined || !undefinedSetIsNull) &&\n (serializePersistedRowValue(previous.value) as string | undefined) ===\n undefined\n ) {\n throw new TypeError(`Metadata value cannot be bound to SQLite`)\n }\n latest.set(key, change)\n }\n return [...latest.values()]\n}\n\nfunction buildIndexName(collectionId: string, signature: string): string {\n const sanitizedSignature = signature\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, `_`)\n .replace(/^_+|_+$/g, ``)\n .slice(0, 24)\n const hashSource = `${collectionId}:${signature}`\n const hashedPart = createPersistedTableName(hashSource, `c`)\n const suffix = sanitizedSignature.length > 0 ? sanitizedSignature : `sig`\n return `idx_${hashedPart}_${suffix}`\n}\n\nexport class SQLiteCorePersistenceAdapter implements PersistenceAdapter {\n private readonly driver: SQLiteDriver\n private readonly schedulingIdentitySource: SQLiteDriver\n private scheduler: SharedPersistenceScheduler | undefined\n private activeUnscheduledHydration: Promise<unknown> | undefined\n private readonly hydrationAdapter: HydrationPersistenceAdapter\n private readonly schemaVersion: number\n private readonly schemaMismatchPolicy: SQLiteCoreAdapterSchemaMismatchPolicy\n private readonly appliedTxPruneMaxRows: number | undefined\n private readonly appliedTxPruneMaxAgeSeconds: number | undefined\n private readonly pullSinceReloadThreshold: number\n private readonly replacementBatchSize: number\n private readonly cacheGenerationClaimTtlMs: number\n private readonly now: () => number\n\n private initialized = false\n private readonly collectionTableCache = new Map<\n string,\n CollectionTableMapping\n >()\n private readonly collectionTableLoads = new Map<\n string,\n Promise<CollectionTableMapping>\n >()\n\n claimCacheGeneration(\n collectionId: string,\n ): Promise<PersistedCacheGenerationClaim> {\n return this.runRegular(async () => {\n await this.ensureInitialized()\n return this.driver.transaction(async (driver) => {\n const expiresAtMs = this.now() + this.cacheGenerationClaimTtlMs\n // The first generation must not reuse the legacy collection ID: an older\n // adapter can still write that ID without a claim after an upgrade.\n const initialPhysicalId = `${CACHE_GENERATION_ID_PREFIX}${safeRandomUUID()}`\n await driver.run(\n `INSERT INTO cache_generation (logical_id, generation, physical_id, retired)\n SELECT ?, 0, ?, 0\n WHERE NOT EXISTS (\n SELECT 1 FROM cache_generation WHERE logical_id = ?\n )`,\n [collectionId, initialPhysicalId, collectionId],\n )\n const head = await driver.query<{ physical_id: string }>(\n `SELECT physical_id FROM cache_generation\n WHERE logical_id = ? AND retired = 0`,\n [collectionId],\n )\n const storageCollectionId = head[0]?.physical_id\n if (!storageCollectionId) {\n throw new InvalidPersistedCollectionConfigError(\n `No active persisted cache generation for collection \"${collectionId}\"`,\n )\n }\n const claimId = safeRandomUUID()\n await driver.run(\n `INSERT INTO cache_generation_claim\n (claim_id, logical_id, physical_id, expires_at_ms)\n VALUES (?, ?, ?, ?)`,\n [claimId, collectionId, storageCollectionId, expiresAtMs],\n )\n await this.collectRetiredCacheGenerations(driver)\n return { storageCollectionId, claimId, expiresAtMs }\n })\n })\n }\n\n rotateCacheGeneration(\n collectionId: string,\n claimId: string,\n resetMetadata?: { key: string; value: unknown },\n expectedStorageCollectionId?: string,\n ): Promise<PersistedCacheGenerationClaim> {\n return this.runRegular(async () => {\n await this.ensureInitialized()\n return this.driver.transaction(async (driver) => {\n const now = this.now()\n const expiresAtMs = now + this.cacheGenerationClaimTtlMs\n const claimed = await driver.query<{\n physical_id: string\n expires_at_ms: number\n }>(\n `SELECT physical_id, expires_at_ms\n FROM cache_generation_claim\n WHERE claim_id = ? AND logical_id = ?`,\n [claimId, collectionId],\n )\n const claimedPhysicalId =\n claimed[0] && claimed[0].expires_at_ms > now\n ? claimed[0].physical_id\n : undefined\n if (\n claimedPhysicalId &&\n expectedStorageCollectionId &&\n claimedPhysicalId !== expectedStorageCollectionId\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `Persisted cache claim changed generations before recovery`,\n )\n }\n const head = await driver.query<{\n generation: number\n physical_id: string\n }>(\n `SELECT generation, physical_id FROM cache_generation\n WHERE logical_id = ? AND retired = 0`,\n [collectionId],\n )\n const active = head[0]\n if (!active) {\n throw new InvalidPersistedCollectionConfigError(\n `No active persisted cache generation for collection \"${collectionId}\"`,\n )\n }\n await driver.run(\n `INSERT INTO cache_generation_sequence (logical_id, next_generation)\n SELECT ?, COALESCE(MAX(generation), -1) + 1\n FROM cache_generation WHERE logical_id = ?\n ON CONFLICT(logical_id) DO NOTHING`,\n [collectionId, collectionId],\n )\n const nextRows = await driver.query<{ next_generation: number }>(\n `SELECT next_generation FROM cache_generation_sequence\n WHERE logical_id = ?`,\n [collectionId],\n )\n const nextGeneration = nextRows[0]!.next_generation\n await driver.run(\n `UPDATE cache_generation_sequence SET next_generation = ?\n WHERE logical_id = ?`,\n [nextGeneration + 1, collectionId],\n )\n // An expired claim no longer owns the head, even when it remembers\n // the current storage ID. Its recovery is private so another run's\n // valid current cache remains claimable.\n const ownedHead = claimedPhysicalId === active.physical_id\n const storageCollectionId = `${CACHE_GENERATION_ID_PREFIX}${safeRandomUUID()}`\n if (ownedHead) {\n await driver.run(\n `UPDATE cache_generation SET retired = 1\n WHERE logical_id = ? AND generation = ?`,\n [collectionId, active.generation],\n )\n }\n await driver.run(\n `INSERT INTO cache_generation (logical_id, generation, physical_id, retired)\n VALUES (?, ?, ?, ?)`,\n [\n collectionId,\n nextGeneration,\n storageCollectionId,\n ownedHead ? 0 : 1,\n ],\n )\n const nextClaimId = claimed[0] ? claimId : safeRandomUUID()\n if (claimed[0]) {\n await driver.run(\n `UPDATE cache_generation_claim\n SET physical_id = ?, expires_at_ms = ? WHERE claim_id = ?`,\n [storageCollectionId, expiresAtMs, claimId],\n )\n } else {\n await driver.run(\n `INSERT INTO cache_generation_claim\n (claim_id, logical_id, physical_id, expires_at_ms)\n VALUES (?, ?, ?, ?)`,\n [nextClaimId, collectionId, storageCollectionId, expiresAtMs],\n )\n }\n await driver.run(\n `INSERT INTO collection_version (\n collection_id, latest_row_version,\n key_set_evidence_available, key_set_evidence_incompatible\n ) VALUES (?, 0, 1, 1)`,\n [storageCollectionId],\n )\n if (resetMetadata) {\n await driver.run(\n `INSERT INTO collection_metadata (collection_id, key, value, updated_at)\n VALUES (?, ?, ?, CAST(strftime('%s', 'now') AS INTEGER))`,\n [\n storageCollectionId,\n resetMetadata.key,\n serializePersistedRowValue(resetMetadata.value),\n ],\n )\n }\n await this.collectRetiredCacheGenerations(driver)\n return { storageCollectionId, claimId: nextClaimId, expiresAtMs }\n })\n })\n }\n\n releaseCacheGenerationClaim(claimId: string): Promise<void> {\n return this.runRegular(async () => {\n await this.ensureInitialized()\n await this.runInTransaction(async (driver) => {\n await driver.run(\n `DELETE FROM cache_generation_claim WHERE claim_id = ?`,\n [claimId],\n )\n await this.collectRetiredCacheGenerations(driver)\n })\n })\n }\n\n renewCacheGenerationClaim(\n storageCollectionId: string,\n claimId: string,\n ): Promise<number | undefined> {\n return this.runRegular(() =>\n this.renewCacheGenerationClaimUnscheduled(storageCollectionId, claimId),\n )\n }\n\n private async renewCacheGenerationClaimUnscheduled(\n storageCollectionId: string,\n claimId: string,\n ): Promise<number | undefined> {\n await this.ensureInitialized()\n return this.runInTransaction(async (driver) => {\n const now = this.now()\n const rows = await driver.query<{ claim_id: string }>(\n `SELECT claim_id FROM cache_generation_claim\n WHERE claim_id = ? AND physical_id = ? AND expires_at_ms > ?`,\n [claimId, storageCollectionId, now],\n )\n if (!rows[0]) {\n await this.collectRetiredCacheGenerations(driver)\n return undefined\n }\n const expiresAtMs = now + this.cacheGenerationClaimTtlMs\n await driver.run(\n `UPDATE cache_generation_claim SET expires_at_ms = ?\n WHERE claim_id = ?`,\n [expiresAtMs, claimId],\n )\n return expiresAtMs\n })\n }\n\n private async collectRetiredCacheGenerations(\n driver: SQLiteDriver,\n ): Promise<void> {\n await driver.run(\n `DELETE FROM cache_generation_claim WHERE expires_at_ms <= ?`,\n [this.now()],\n )\n const retired = await driver.query<{\n physical_id: string\n table_name: string | null\n tombstone_table_name: string | null\n }>(\n `SELECT generation.physical_id, registry.table_name,\n registry.tombstone_table_name\n FROM cache_generation AS generation\n LEFT JOIN collection_registry AS registry\n ON registry.collection_id = generation.physical_id\n WHERE generation.retired = 1\n AND NOT EXISTS (\n SELECT 1 FROM cache_generation_claim AS claim\n WHERE claim.physical_id = generation.physical_id\n )`,\n )\n for (const generation of retired) {\n if (generation.table_name) {\n await driver.exec(\n `DROP TABLE IF EXISTS ${quoteIdentifier(generation.table_name)}`,\n )\n }\n if (generation.tombstone_table_name) {\n await driver.exec(\n `DROP TABLE IF EXISTS ${quoteIdentifier(generation.tombstone_table_name)}`,\n )\n }\n for (const table of [\n `applied_tx`,\n `collection_expected_keys`,\n `collection_metadata`,\n `persisted_index_registry`,\n `leader_term`,\n ]) {\n await driver.run(`DELETE FROM ${table} WHERE collection_id = ?`, [\n generation.physical_id,\n ])\n }\n await driver.run(\n `DELETE FROM collection_version WHERE collection_id = ?`,\n [generation.physical_id],\n )\n await driver.run(\n `DELETE FROM collection_reset_epoch WHERE collection_id = ?`,\n [generation.physical_id],\n )\n await driver.run(\n `DELETE FROM collection_registry WHERE collection_id = ?`,\n [generation.physical_id],\n )\n await driver.run(`DELETE FROM cache_generation WHERE physical_id = ?`, [\n generation.physical_id,\n ])\n this.collectionTableCache.delete(generation.physical_id)\n }\n }\n\n getCacheGenerationNow(): number {\n return this.now()\n }\n\n constructor(options: SQLiteCoreAdapterOptions) {\n const maxBoundParameters = options.driver.maxBoundParameters\n if (\n maxBoundParameters !== undefined &&\n (!Number.isInteger(maxBoundParameters) || maxBoundParameters < 4)\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `SQLite driver maxBoundParameters must be an integer of at least 4`,\n )\n }\n this.replacementBatchSize =\n maxBoundParameters === undefined\n ? REPLACEMENT_BATCH_SIZE\n : Math.min(REPLACEMENT_BATCH_SIZE, Math.floor(maxBoundParameters / 4))\n\n this.cacheGenerationClaimTtlMs =\n options.cacheGenerationClaimTtlMs ?? DEFAULT_CACHE_GENERATION_CLAIM_TTL_MS\n if (\n !Number.isSafeInteger(this.cacheGenerationClaimTtlMs) ||\n this.cacheGenerationClaimTtlMs <= 0\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `SQLite adapter cacheGenerationClaimTtlMs must be a positive safe integer`,\n )\n }\n this.now = options.now ?? Date.now\n\n const schemaVersion = options.schemaVersion ?? DEFAULT_SCHEMA_VERSION\n if (!Number.isInteger(schemaVersion) || schemaVersion < 0) {\n throw new InvalidPersistedCollectionConfigError(\n `SQLite adapter schemaVersion must be a non-negative integer`,\n )\n }\n\n if (\n options.appliedTxPruneMaxRows !== undefined &&\n (!Number.isInteger(options.appliedTxPruneMaxRows) ||\n options.appliedTxPruneMaxRows < 0)\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `SQLite adapter appliedTxPruneMaxRows must be a non-negative integer when provided`,\n )\n }\n\n if (\n options.appliedTxPruneMaxAgeSeconds !== undefined &&\n (!Number.isInteger(options.appliedTxPruneMaxAgeSeconds) ||\n options.appliedTxPruneMaxAgeSeconds < 0)\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `SQLite adapter appliedTxPruneMaxAgeSeconds must be a non-negative integer when provided`,\n )\n }\n\n const pullSinceReloadThreshold =\n options.pullSinceReloadThreshold ?? DEFAULT_PULL_SINCE_RELOAD_THRESHOLD\n if (\n !Number.isInteger(pullSinceReloadThreshold) ||\n pullSinceReloadThreshold < 0\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `SQLite adapter pullSinceReloadThreshold must be a non-negative integer`,\n )\n }\n\n this.schedulingIdentitySource = options.driver\n const schedulingKey =\n getSharedLogicalSchedulingKey(options.driver) ??\n observedDriverSchedulingKeys.get(options.driver)\n this.scheduler = schedulingKey\n ? getSharedPersistenceScheduler(schedulingKey)\n : undefined\n this.driver = schedulingKey\n ? options.driver\n : observeSharedLogicalSchedulingSupport(options.driver, (key) => {\n observedDriverSchedulingKeys.set(options.driver, key)\n const scheduler = getSharedPersistenceScheduler(key)\n this.scheduler ??= scheduler\n if (this.activeUnscheduledHydration) {\n scheduler.adoptRunningHydrate(this.activeUnscheduledHydration)\n }\n })\n this.schemaVersion = schemaVersion\n this.schemaMismatchPolicy =\n options.schemaMismatchPolicy ?? `sync-present-reset`\n this.appliedTxPruneMaxRows = options.appliedTxPruneMaxRows\n this.appliedTxPruneMaxAgeSeconds = options.appliedTxPruneMaxAgeSeconds\n this.pullSinceReloadThreshold = pullSinceReloadThreshold\n this.hydrationAdapter = {\n loadSubset: (collectionId, loadOptions, context) =>\n this.loadSubsetUnscheduled(collectionId, loadOptions, context),\n loadResumeSnapshot: (collectionId, context) =>\n this.loadResumeSnapshotUnscheduled(collectionId, context),\n applyCommittedTx: (collectionId, tx) =>\n this.applyCommittedTxUnscheduled(collectionId, tx),\n renewCacheGenerationClaim: (storageCollectionId, claimId) =>\n this.renewCacheGenerationClaimUnscheduled(storageCollectionId, claimId),\n reconcileCommittedTx: (collectionId, tx, anchor) =>\n this.reconcileCommittedTxUnscheduled(collectionId, tx, anchor),\n loadCollectionMetadata: (collectionId, context) =>\n this.loadCollectionMetadataUnscheduled(collectionId, context),\n scanRows: (collectionId, scanOptions, context) =>\n this.scanRowsUnscheduled(collectionId, scanOptions, context),\n ensureIndex: (collectionId, signature, spec, ctx) =>\n this.ensureIndexUnscheduled(collectionId, signature, spec, ctx),\n markIndexRemoved: (collectionId, signature, ctx) =>\n this.markIndexRemovedUnscheduled(collectionId, signature, ctx),\n getStreamPosition: (collectionId, ctx) =>\n this.getStreamPositionUnscheduled(collectionId, ctx),\n pullSince: (collectionId, fromRowVersion, ctx) =>\n this.pullSinceUnscheduled(collectionId, fromRowVersion, ctx),\n runInHydrationScope: async (task) => task(this.hydrationAdapter),\n }\n }\n\n runInHydrationScope<T>(\n task: (adapter: HydrationPersistenceAdapter) => Promise<T>,\n ): Promise<T> {\n const scheduler = this.resolveScheduler()\n if (scheduler) {\n return scheduler.runHydrate(() => task(this.hydrationAdapter))\n }\n\n const hydration = Promise.resolve().then(() => task(this.hydrationAdapter))\n this.activeUnscheduledHydration = hydration\n const clear = () => {\n if (this.activeUnscheduledHydration === hydration) {\n this.activeUnscheduledHydration = undefined\n }\n }\n void hydration.then(clear, clear)\n return hydration\n }\n\n runInRegularScope<T>(\n task: (adapter: HydrationPersistenceAdapter) => Promise<T>,\n ): Promise<T> {\n return this.runRegular(() => task(this.hydrationAdapter))\n }\n\n isHydrationScopeScheduled(): boolean {\n return this.resolveScheduler() !== undefined\n }\n\n private runRegular<T>(task: () => Promise<T>): Promise<T> {\n const scheduler = this.resolveScheduler()\n return scheduler ? scheduler.runRegular(task) : task()\n }\n\n private resolveScheduler(): SharedPersistenceScheduler | undefined {\n if (this.scheduler) return this.scheduler\n const key = observedDriverSchedulingKeys.get(this.schedulingIdentitySource)\n if (key) {\n this.scheduler = getSharedPersistenceScheduler(key)\n }\n return this.scheduler\n }\n\n private runInTransaction<TResult>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TResult>,\n ): Promise<TResult> {\n if (typeof this.driver.transactionWithDriver === `function`) {\n return this.driver.transactionWithDriver(fn)\n }\n\n return this.driver.transaction(fn)\n }\n\n private async assertCurrentSchemaVersion(\n collectionId: string,\n driver: SQLiteDriver,\n operation: string,\n ): Promise<void> {\n const schemaRows = await driver.query<{ schema_version: number }>(\n `SELECT schema_version\n FROM collection_registry\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n )\n const persistedSchemaVersion = schemaRows[0]?.schema_version\n if (persistedSchemaVersion !== this.schemaVersion) {\n throw new InvalidPersistedCollectionConfigError(\n `Schema version mismatch for collection \"${collectionId}\": ` +\n `found ${persistedSchemaVersion ?? `missing`}, expected ${this.schemaVersion}. ` +\n `Refusing to ${operation} through a stale cached adapter.`,\n )\n }\n }\n\n private async assertCacheGenerationReadClaim(\n driver: SQLiteDriver,\n storageCollectionId: string,\n claimId?: string,\n ): Promise<void> {\n await this.ensureInitialized()\n if (!claimId) {\n if (!hasCacheGenerationIdPrefix(storageCollectionId)) return\n const generation = await driver.query<{ physical_id: string }>(\n `SELECT physical_id FROM cache_generation WHERE physical_id = ?`,\n [storageCollectionId],\n )\n if (generation[0]) {\n throw new InvalidPersistedCollectionConfigError(\n `Persisted cache claim is required for collection \"${storageCollectionId}\"`,\n )\n }\n return\n }\n const rows = await driver.query<{ claim_id: string }>(\n `SELECT claim.claim_id\n FROM cache_generation_claim AS claim\n JOIN cache_generation AS generation\n ON generation.physical_id = claim.physical_id\n WHERE claim.claim_id = ? AND claim.physical_id = ?\n AND claim.expires_at_ms > ?`,\n [claimId, storageCollectionId, this.now()],\n )\n if (!rows[0]) {\n throw new InvalidPersistedCollectionConfigError(\n `Persisted cache claim is no longer active for collection \"${storageCollectionId}\"`,\n )\n }\n }\n\n loadSubset(\n target: PersistedStorageTarget,\n options: LoadSubsetOptions,\n ctx?: {\n requiredIndexSignatures?: ReadonlyArray<string>\n cacheGenerationClaimId?: string\n },\n ): Promise<\n Array<{\n key: string | number\n value: Record<string, unknown>\n metadata?: unknown\n }>\n > {\n return this.runRegular(() =>\n this.loadSubsetUnscheduled(target, options, ctx),\n )\n }\n\n private async loadSubsetUnscheduled(\n target: PersistedStorageTarget,\n options: LoadSubsetOptions,\n ctx?: {\n requiredIndexSignatures?: ReadonlyArray<string>\n cacheGenerationClaimId?: string\n },\n ): Promise<\n Array<{\n key: string | number\n value: Record<string, unknown>\n metadata?: unknown\n }>\n > {\n const access = resolvePersistedStorageTarget(\n target,\n ctx?.cacheGenerationClaimId,\n )\n const collectionId = access.collectionId\n ctx = access.claimId\n ? { ...ctx, cacheGenerationClaimId: access.claimId }\n : ctx\n await this.assertCacheGenerationReadClaim(\n this.driver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n const tableMapping = await this.ensureCollectionReady(\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n return this.runInTransaction(async (transactionDriver) => {\n await this.assertCacheGenerationReadClaim(\n transactionDriver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `load persisted rows`,\n )\n await this.touchRequiredIndexes(\n collectionId,\n ctx?.requiredIndexSignatures,\n transactionDriver,\n )\n\n if (options.cursor) {\n const whereCurrentOptions: LoadSubsetOptions = {\n where: options.where\n ? new IR.Func(`and`, [options.where, options.cursor.whereCurrent])\n : options.cursor.whereCurrent,\n orderBy: options.orderBy,\n }\n const whereFromOptions: LoadSubsetOptions = {\n where: options.where\n ? new IR.Func(`and`, [options.where, options.cursor.whereFrom])\n : options.cursor.whereFrom,\n orderBy: options.orderBy,\n limit: options.limit,\n }\n\n const [whereCurrentRows, whereFromRows] = await Promise.all([\n this.loadSubsetInternal(\n tableMapping,\n whereCurrentOptions,\n transactionDriver,\n ),\n this.loadSubsetInternal(\n tableMapping,\n whereFromOptions,\n transactionDriver,\n ),\n ])\n\n const mergedRows = new Map<\n string,\n InMemoryRow<string | number, Record<string, unknown>>\n >()\n for (const row of [...whereCurrentRows, ...whereFromRows]) {\n mergedRows.set(encodePersistedStorageKey(row.key), row)\n }\n\n const orderedRows = this.applyInMemoryOrderBy(\n Array.from(mergedRows.values()),\n options.orderBy,\n )\n\n return orderedRows.map((row) => ({\n key: row.key,\n value: row.value,\n metadata: row.metadata,\n }))\n }\n\n const rows = await this.loadSubsetInternal(\n tableMapping,\n options,\n transactionDriver,\n )\n return rows.map((row) => ({\n key: row.key,\n value: row.value,\n metadata: row.metadata,\n }))\n })\n }\n\n loadResumeSnapshot(\n target: PersistedStorageTarget,\n ctx?: {\n requiredIndexSignatures?: ReadonlyArray<string>\n includeRows?: boolean\n cacheGenerationClaimId?: string\n },\n ) {\n return this.runRegular(() =>\n this.loadResumeSnapshotUnscheduled(target, ctx),\n )\n }\n\n private async loadResumeSnapshotUnscheduled(\n target: PersistedStorageTarget,\n ctx?: {\n requiredIndexSignatures?: ReadonlyArray<string>\n includeRows?: boolean\n cacheGenerationClaimId?: string\n },\n ): Promise<{\n rows: Array<{\n key: string | number\n value: Record<string, unknown>\n metadata?: unknown\n }>\n keySet: PersistedKeySetEvidence\n collectionMetadata: Array<{ key: string; value: unknown }>\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n }> {\n const access = resolvePersistedStorageTarget(\n target,\n ctx?.cacheGenerationClaimId,\n )\n const collectionId = access.collectionId\n ctx = access.claimId\n ? { ...ctx, cacheGenerationClaimId: access.claimId }\n : ctx\n await this.assertCacheGenerationReadClaim(\n this.driver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n const tableMapping = await this.ensureCollectionReady(\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n const includeRows = ctx?.includeRows !== false\n\n return this.runInTransaction(async (transactionDriver) => {\n await this.assertCacheGenerationReadClaim(\n transactionDriver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `load a resume snapshot`,\n )\n if (includeRows) {\n await this.touchRequiredIndexes(\n collectionId,\n ctx?.requiredIndexSignatures,\n transactionDriver,\n )\n }\n\n const rows = includeRows\n ? await this.loadSubsetInternal(tableMapping, {}, transactionDriver)\n : []\n const { latestRowVersion, keySet } = await this.readKeySetEvidence(\n collectionId,\n transactionDriver,\n )\n const collectionMetadataRows = await transactionDriver.query<{\n key: string\n value: string\n }>(\n `SELECT key, value\n FROM collection_metadata\n WHERE collection_id = ?`,\n [collectionId],\n )\n const { latestTerm, latestSeq } = await this.readStreamPosition(\n collectionId,\n transactionDriver,\n )\n const resetRows = await transactionDriver.query<{ reset_epoch: number }>(\n `SELECT reset_epoch\n FROM collection_reset_epoch\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n )\n\n return {\n rows: rows.map((row) => ({\n key: row.key,\n value: row.value,\n metadata: row.metadata,\n })),\n keySet,\n collectionMetadata: collectionMetadataRows.map((row) => ({\n key: row.key,\n value: deserializePersistedRowValue(row.value),\n })),\n latestTerm,\n latestSeq,\n latestRowVersion,\n resetEpoch: resetRows[0]?.reset_epoch ?? 0,\n }\n })\n }\n\n applyCommittedTx(\n target: PersistedStorageTarget,\n tx: PersistedTx,\n ): Promise<void> {\n return this.runRegular(() => this.applyCommittedTxUnscheduled(target, tx))\n }\n\n reconcileCommittedTx(\n target: PersistedStorageTarget,\n tx: PersistedTx,\n anchor: CommittedTxAnchor,\n ): Promise<ReconciledCommittedTx> {\n return this.runRegular(() =>\n this.reconcileCommittedTxUnscheduled(target, tx, anchor),\n )\n }\n\n private async applyCommittedTxUnscheduled(\n target: PersistedStorageTarget,\n tx: PersistedTx,\n ): Promise<void> {\n await this.applyCommittedTxInternal(target, tx)\n }\n\n private reconcileCommittedTxUnscheduled(\n target: PersistedStorageTarget,\n tx: PersistedTx,\n anchor: CommittedTxAnchor,\n ): Promise<ReconciledCommittedTx> {\n if (!isValidCommittedTxAnchor(anchor)) {\n throw new Error(\n `Cannot reconcile a committed transaction without a valid durable anchor`,\n )\n }\n return this.applyCommittedTxInternal(target, tx, anchor)\n }\n\n private async applyCommittedTxInternal(\n target: PersistedStorageTarget,\n tx: PersistedTx,\n anchor?: CommittedTxAnchor,\n ): Promise<ReconciledCommittedTx> {\n const access = resolvePersistedStorageTarget(\n target,\n tx.cacheGenerationClaimId,\n )\n const collectionId = access.collectionId\n tx = { ...tx, cacheGenerationClaimId: access.claimId }\n await this.assertCacheGenerationReadClaim(\n this.driver,\n collectionId,\n tx.cacheGenerationClaimId,\n )\n const tableMapping = await this.ensureCollectionReady(\n collectionId,\n tx.cacheGenerationClaimId,\n )\n const collectionTableSql = quoteIdentifier(tableMapping.tableName)\n const tombstoneTableSql = quoteIdentifier(tableMapping.tombstoneTableName)\n\n return this.runInTransaction(async (transactionDriver) => {\n await this.assertCacheGenerationReadClaim(\n transactionDriver,\n collectionId,\n tx.cacheGenerationClaimId,\n )\n const versionRows = await transactionDriver.query<{\n latest_row_version: number\n key_set_evidence_available: number\n schema_version: number\n already_applied: number\n reset_epoch: number | null\n }>(\n `SELECT\n latest_row_version,\n key_set_evidence_available,\n (SELECT reset_epoch FROM collection_reset_epoch\n WHERE collection_id = ? LIMIT 1) AS reset_epoch,\n (\n SELECT schema_version\n FROM collection_registry\n WHERE collection_id = ?\n LIMIT 1\n ) AS schema_version,\n EXISTS (\n SELECT 1\n FROM applied_tx\n WHERE collection_id = ? AND term = ? AND seq = ?\n ) AS already_applied\n FROM collection_version\n WHERE collection_id = ?\n LIMIT 1`,\n [\n collectionId,\n collectionId,\n collectionId,\n tx.term,\n tx.seq,\n collectionId,\n ],\n )\n const version = versionRows[0]\n\n if (!version) {\n throw new InvalidPersistedCollectionConfigError(\n `Missing persisted version state for collection \"${collectionId}\"`,\n )\n }\n if (version.schema_version !== this.schemaVersion) {\n throw new InvalidPersistedCollectionConfigError(\n `Schema version mismatch for collection \"${collectionId}\": ` +\n `found ${version.schema_version}, expected ${this.schemaVersion}. ` +\n `Refusing to apply a committed transaction through a stale cached adapter.`,\n )\n }\n\n if (anchor) {\n const sameResetEpoch = (version.reset_epoch ?? 0) === anchor.resetEpoch\n const matching = await transactionDriver.query<{\n term: number\n seq: number\n row_version: number\n }>(\n `SELECT term, seq, row_version FROM applied_tx\n WHERE collection_id = ? AND tx_id = ? LIMIT 2`,\n [collectionId, tx.txId],\n )\n if (matching.length > 1) return { kind: `unknown` }\n if (matching[0]) {\n if (\n matching[0].row_version <= anchor.latestRowVersion ||\n !sameResetEpoch\n ) {\n return { kind: `unknown` }\n }\n return {\n kind: `already-applied`,\n committed: {\n term: matching[0].term,\n seq: matching[0].seq,\n rowVersion: matching[0].row_version,\n },\n latestRowVersion: version.latest_row_version,\n }\n }\n // A different durable write may have superseded this source row or\n // its opaque cursor. Absence alone cannot authorize late application.\n if (\n version.latest_row_version !== anchor.latestRowVersion ||\n !sameResetEpoch\n ) {\n return { kind: `unknown` }\n }\n }\n\n if (version.already_applied === 1) {\n return { kind: `unknown` }\n }\n\n const currentRowVersion = version.latest_row_version\n const nextRowVersion = Math.max(currentRowVersion + 1, tx.rowVersion)\n const replacesPersistedBaseline = tx.truncate === true\n const tracksPersistedKeySet =\n version.key_set_evidence_available === 1 || replacesPersistedBaseline\n const replayDelta: ReplayableTxDelta | null = replacesPersistedBaseline\n ? null\n : {\n txId: tx.txId,\n latestRowVersion: nextRowVersion,\n changedRows: tx.mutations\n .filter((mutation) => mutation.type !== `delete`)\n .map((mutation) => ({\n key: mutation.key,\n value: mutation.value,\n })),\n deletedKeys: tx.mutations\n .filter((mutation) => mutation.type === `delete`)\n .map((mutation) => mutation.key),\n rowMetadataMutations: tx.rowMetadataMutations ?? [],\n collectionMetadataMutations: tx.collectionMetadataMutations ?? [],\n }\n\n if (replacesPersistedBaseline) {\n await transactionDriver.run(\n `DELETE FROM collection_expected_keys\n WHERE collection_id = ?`,\n [collectionId],\n )\n await transactionDriver.run(`DELETE FROM ${collectionTableSql}`)\n await transactionDriver.run(`DELETE FROM ${tombstoneTableSql}`)\n }\n\n const rowMutations = new Map<string, PersistedTx[`mutations`][number]>()\n for (const mutation of tx.mutations) {\n const key = encodePersistedStorageKey(mutation.key)\n const previous = rowMutations.get(key)\n if (!previous) {\n rowMutations.set(key, mutation)\n continue\n }\n\n // A superseded action still had to serialize successfully.\n serializePersistedRowValue(previous.value)\n if (\n previous.type !== `delete` &&\n previous.metadataChanged === true &&\n previous.metadata !== undefined\n ) {\n serializePersistedRowValue(previous.metadata)\n }\n if (mutation.type === `delete`) {\n rowMutations.set(key, mutation)\n continue\n }\n const value =\n mutation.type === `insert` || previous.type === `delete`\n ? mutation.value\n : mergeObjectRows(previous.value, mutation.value)\n const metadataChanged =\n mutation.metadataChanged === true ||\n previous.type === `delete` ||\n previous.metadataChanged === true\n const metadata =\n mutation.metadataChanged === true\n ? mutation.metadata\n : previous.type === `delete`\n ? undefined\n : previous.metadata\n const next = { key: mutation.key, value, metadataChanged, metadata }\n rowMutations.set(\n key,\n mutation.type === `insert` || previous.type !== `update`\n ? { type: `insert`, ...next }\n : { type: `update`, ...next },\n )\n }\n\n for (const batch of batches(\n [...rowMutations.values()],\n this.replacementBatchSize,\n )) {\n const writes = batch.filter((mutation) => mutation.type !== `delete`)\n const deletes = batch.filter((mutation) => mutation.type === `delete`)\n const readKeys = writes\n .filter(\n (mutation) =>\n mutation.type === `update` || mutation.metadataChanged !== true,\n )\n .map((mutation) => encodePersistedStorageKey(mutation.key))\n const existingRows =\n readKeys.length > 0\n ? await transactionDriver.query<{\n key: string\n value: string\n metadata: string | null\n }>(\n `SELECT key, value, metadata\n FROM ${collectionTableSql}\n WHERE key IN (${readKeys.map(() => `?`).join(`, `)})`,\n readKeys,\n )\n : []\n const existing = new Map(existingRows.map((row) => [row.key, row]))\n const writeKeys = writes.map((mutation) =>\n encodePersistedStorageKey(mutation.key),\n )\n const deleteKeys = deletes.map((mutation) =>\n encodePersistedStorageKey(mutation.key),\n )\n\n if (tracksPersistedKeySet && writeKeys.length > 0) {\n await transactionDriver.run(\n `INSERT INTO collection_expected_keys (collection_id, key)\n VALUES ${writeKeys.map(() => `(?, ?)`).join(`, `)}\n ON CONFLICT(collection_id, key) DO NOTHING`,\n writeKeys.flatMap((key) => [collectionId, key]),\n )\n }\n if (tracksPersistedKeySet && deleteKeys.length > 0) {\n await transactionDriver.run(\n `DELETE FROM collection_expected_keys\n WHERE collection_id = ? AND key IN (${deleteKeys.map(() => `?`).join(`, `)})`,\n [collectionId, ...deleteKeys],\n )\n }\n if (deleteKeys.length > 0) {\n await transactionDriver.run(\n `DELETE FROM ${collectionTableSql}\n WHERE key IN (${deleteKeys.map(() => `?`).join(`, `)})`,\n deleteKeys,\n )\n }\n if (writeKeys.length > 0) {\n await transactionDriver.run(\n `INSERT INTO ${collectionTableSql} (key, value, metadata, row_version)\n VALUES ${writeKeys.map(() => `(?, ?, ?, ?)`).join(`, `)}\n ON CONFLICT(key) DO UPDATE SET\n value = excluded.value,\n metadata = excluded.metadata,\n row_version = excluded.row_version`,\n writes.flatMap((mutation, index) => {\n const previous = existing.get(writeKeys[index]!)\n const previousValue = previous?.value\n ? deserializePersistedRowValue(previous.value)\n : undefined\n const previousMetadata =\n previous?.metadata != null\n ? deserializePersistedRowValue(previous.metadata)\n : undefined\n const value =\n mutation.type === `update`\n ? mergeObjectRows(previousValue, mutation.value)\n : mutation.value\n const metadata =\n mutation.metadataChanged === true\n ? mutation.metadata\n : previousMetadata\n return [\n writeKeys[index]!,\n serializePersistedRowValue(value),\n metadata === undefined\n ? null\n : serializePersistedRowValue(metadata),\n nextRowVersion,\n ]\n }),\n )\n await transactionDriver.run(\n `DELETE FROM ${tombstoneTableSql}\n WHERE key IN (${writeKeys.map(() => `?`).join(`, `)})`,\n writeKeys,\n )\n }\n if (deletes.length > 0) {\n await transactionDriver.run(\n `INSERT INTO ${tombstoneTableSql} (key, value, row_version, deleted_at)\n VALUES ${deleteKeys.map(() => `(?, ?, ?, ?)`).join(`, `)}\n ON CONFLICT(key) DO UPDATE SET\n value = excluded.value,\n row_version = excluded.row_version,\n deleted_at = excluded.deleted_at`,\n deletes.flatMap((mutation, index) => [\n deleteKeys[index]!,\n serializePersistedRowValue(mutation.value),\n nextRowVersion,\n new Date().toISOString(),\n ]),\n )\n }\n }\n\n for (const batch of batches(\n lastMetadataByKey(\n tx.rowMetadataMutations ?? [],\n (mutation) => encodePersistedStorageKey(mutation.key),\n true,\n ),\n this.replacementBatchSize,\n )) {\n const keys = batch.map((mutation) =>\n encodePersistedStorageKey(mutation.key),\n )\n await transactionDriver.run(\n `UPDATE ${collectionTableSql}\n SET metadata = CASE key ${keys.map(() => `WHEN ? THEN ?`).join(` `)} END\n WHERE key IN (${keys.map(() => `?`).join(`, `)})`,\n [\n ...batch.flatMap((mutation, index) => [\n keys[index]!,\n mutation.type === `delete` || mutation.value === undefined\n ? null\n : serializePersistedRowValue(mutation.value),\n ]),\n ...keys,\n ],\n )\n }\n\n for (const batch of batches(\n lastMetadataByKey(\n tx.collectionMetadataMutations ?? [],\n (mutation) => mutation.key,\n ),\n this.replacementBatchSize,\n )) {\n const deletes = batch.filter((mutation) => mutation.type === `delete`)\n const sets = batch.filter((mutation) => mutation.type === `set`)\n if (deletes.length > 0) {\n await transactionDriver.run(\n `DELETE FROM collection_metadata\n WHERE collection_id = ? AND key IN (${deletes.map(() => `?`).join(`, `)})`,\n [collectionId, ...deletes.map((mutation) => mutation.key)],\n )\n }\n if (sets.length > 0) {\n await transactionDriver.run(\n `INSERT INTO collection_metadata (collection_id, key, value, updated_at)\n VALUES ${sets.map(() => `(?, ?, ?, CAST(strftime('%s', 'now') AS INTEGER))`).join(`, `)}\n ON CONFLICT(collection_id, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at`,\n sets.flatMap((mutation) => [\n collectionId,\n mutation.key,\n serializePersistedRowValue(mutation.value),\n ]),\n )\n }\n }\n\n await transactionDriver.run(\n `UPDATE collection_version\n SET latest_row_version = ?,\n key_set_evidence_available = CASE\n WHEN ? = 1 THEN 1\n ELSE key_set_evidence_available\n END,\n key_set_evidence_incompatible = CASE\n WHEN ? = 1 THEN 0\n ELSE key_set_evidence_incompatible\n END\n WHERE collection_id = ?`,\n [\n nextRowVersion,\n replacesPersistedBaseline ? 1 : 0,\n replacesPersistedBaseline ? 1 : 0,\n collectionId,\n ],\n )\n\n await transactionDriver.run(\n `INSERT INTO leader_term (collection_id, latest_term)\n VALUES (?, ?)\n ON CONFLICT(collection_id) DO UPDATE SET\n latest_term = CASE\n WHEN leader_term.latest_term > excluded.latest_term\n THEN leader_term.latest_term\n ELSE excluded.latest_term\n END`,\n [collectionId, tx.term],\n )\n\n await transactionDriver.run(\n `INSERT INTO applied_tx (\n collection_id,\n term,\n seq,\n tx_id,\n row_version,\n replay_json,\n replay_requires_full_reload,\n applied_at\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, CAST(strftime('%s', 'now') AS INTEGER))`,\n [\n collectionId,\n tx.term,\n tx.seq,\n tx.txId,\n nextRowVersion,\n replayDelta ? stableStringify(replayDelta) : null,\n replacesPersistedBaseline ? 1 : 0,\n ],\n )\n\n await this.pruneAppliedTxRows(collectionId, transactionDriver)\n return {\n kind: `applied-now`,\n committed: {\n term: tx.term,\n seq: tx.seq,\n rowVersion: nextRowVersion,\n },\n latestRowVersion: nextRowVersion,\n }\n })\n }\n\n loadCollectionMetadata(\n target: PersistedStorageTarget,\n ctx?: { cacheGenerationClaimId?: string },\n ): Promise<Array<{ key: string; value: unknown }>> {\n return this.runRegular(() =>\n this.loadCollectionMetadataUnscheduled(target, ctx),\n )\n }\n\n private async loadCollectionMetadataUnscheduled(\n target: PersistedStorageTarget,\n ctx?: { cacheGenerationClaimId?: string },\n ): Promise<Array<{ key: string; value: unknown }>> {\n const access = resolvePersistedStorageTarget(\n target,\n ctx?.cacheGenerationClaimId,\n )\n const collectionId = access.collectionId\n ctx = access.claimId\n ? { ...ctx, cacheGenerationClaimId: access.claimId }\n : ctx\n await this.assertCacheGenerationReadClaim(\n this.driver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n await this.ensureCollectionReady(collectionId, ctx?.cacheGenerationClaimId)\n return this.runInTransaction(async (transactionDriver) => {\n await this.assertCacheGenerationReadClaim(\n transactionDriver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `load collection metadata`,\n )\n const rows = await transactionDriver.query<{\n key: string\n value: string\n }>(\n `SELECT key, value\n FROM collection_metadata\n WHERE collection_id = ?`,\n [collectionId],\n )\n\n return rows.map((row) => ({\n key: row.key,\n value: deserializePersistedRowValue(row.value),\n }))\n })\n }\n\n scanRows(\n target: PersistedStorageTarget,\n options?: PersistedRowScanOptions,\n ctx?: { cacheGenerationClaimId?: string },\n ): Promise<Array<PersistedScannedRow>> {\n return this.runRegular(() => this.scanRowsUnscheduled(target, options, ctx))\n }\n\n private async scanRowsUnscheduled(\n target: PersistedStorageTarget,\n options?: PersistedRowScanOptions,\n ctx?: { cacheGenerationClaimId?: string },\n ): Promise<Array<PersistedScannedRow>> {\n const access = resolvePersistedStorageTarget(\n target,\n ctx?.cacheGenerationClaimId,\n )\n const collectionId = access.collectionId\n ctx = access.claimId\n ? { ...ctx, cacheGenerationClaimId: access.claimId }\n : ctx\n await this.assertCacheGenerationReadClaim(\n this.driver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n const tableMapping = await this.ensureCollectionReady(\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n const collectionTableSql = quoteIdentifier(tableMapping.tableName)\n return this.runInTransaction(async (transactionDriver) => {\n await this.assertCacheGenerationReadClaim(\n transactionDriver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `scan persisted rows`,\n )\n const storedRows = await transactionDriver.query<StoredSqliteRow>(\n options?.metadataOnly\n ? `SELECT key, value, metadata, row_version\n FROM ${collectionTableSql}\n WHERE metadata IS NOT NULL`\n : `SELECT key, value, metadata, row_version\n FROM ${collectionTableSql}`,\n )\n\n return decodeStoredSqliteRows(storedRows).map((row) => ({\n key: row.key,\n value: row.value,\n metadata: row.metadata,\n }))\n })\n }\n\n ensureIndex(\n target: PersistedStorageTarget,\n signature: string,\n spec: PersistedIndexSpec,\n ctx?: { cacheGenerationClaimId?: string },\n ): Promise<void> {\n return this.runRegular(() =>\n this.ensureIndexUnscheduled(target, signature, spec, ctx),\n )\n }\n\n private async ensureIndexUnscheduled(\n target: PersistedStorageTarget,\n signature: string,\n spec: PersistedIndexSpec,\n ctx?: { cacheGenerationClaimId?: string },\n ): Promise<void> {\n const access = resolvePersistedStorageTarget(\n target,\n ctx?.cacheGenerationClaimId,\n )\n const collectionId = access.collectionId\n ctx = access.claimId\n ? { ...ctx, cacheGenerationClaimId: access.claimId }\n : ctx\n await this.assertCacheGenerationReadClaim(\n this.driver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n const tableMapping = await this.ensureCollectionReady(\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n const collectionTableSql = quoteIdentifier(tableMapping.tableName)\n const indexName = buildIndexName(collectionId, signature)\n const indexNameSql = quoteIdentifier(indexName)\n const normalizedExpressionSql = spec.expressionSql.map((fragment) =>\n normalizeIndexSqlFragment(fragment),\n )\n const expressionSql = normalizedExpressionSql.join(`, `)\n const persistedExpressionSql = JSON.stringify(normalizedExpressionSql)\n const whereSql = spec.whereSql\n ? normalizeIndexSqlFragment(spec.whereSql)\n : undefined\n const persistedWhereSql = whereSql ?? null\n\n await this.runInTransaction(async (transactionDriver) => {\n await this.assertCacheGenerationReadClaim(\n transactionDriver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `create a persisted index`,\n )\n\n const existingRows = await transactionDriver.query<{\n index_name: string\n expression_sql: string\n where_sql: string | null\n }>(\n `SELECT index_name, expression_sql, where_sql\n FROM persisted_index_registry\n WHERE collection_id = ? AND signature = ?\n LIMIT 1`,\n [collectionId, signature],\n )\n const existing = existingRows[0]\n if (\n existing &&\n (existing.index_name !== indexName ||\n existing.expression_sql !== persistedExpressionSql ||\n existing.where_sql !== persistedWhereSql)\n ) {\n // A compiler upgrade can change normalized SQL without changing the\n // logical index signature. Rebuild only that stale physical index so\n // the registry and SQLite planner describe the same expression.\n await transactionDriver.exec(\n `DROP INDEX IF EXISTS ${quoteIdentifier(existing.index_name)}`,\n )\n }\n await transactionDriver.run(\n `INSERT INTO persisted_index_registry (\n collection_id,\n signature,\n index_name,\n expression_sql,\n where_sql,\n removed,\n created_at,\n updated_at,\n last_used_at\n )\n VALUES (?, ?, ?, ?, ?, 0,\n CAST(strftime('%s', 'now') AS INTEGER),\n CAST(strftime('%s', 'now') AS INTEGER),\n CAST(strftime('%s', 'now') AS INTEGER))\n ON CONFLICT(collection_id, signature) DO UPDATE SET\n index_name = excluded.index_name,\n expression_sql = excluded.expression_sql,\n where_sql = excluded.where_sql,\n removed = 0,\n updated_at = CAST(strftime('%s', 'now') AS INTEGER),\n last_used_at = CAST(strftime('%s', 'now') AS INTEGER)`,\n [\n collectionId,\n signature,\n indexName,\n persistedExpressionSql,\n persistedWhereSql,\n ],\n )\n\n const createIndexSql = whereSql\n ? `CREATE INDEX IF NOT EXISTS ${indexNameSql}\n ON ${collectionTableSql} (${expressionSql})\n WHERE ${whereSql}`\n : `CREATE INDEX IF NOT EXISTS ${indexNameSql}\n ON ${collectionTableSql} (${expressionSql})`\n await transactionDriver.exec(createIndexSql)\n })\n }\n\n markIndexRemoved(\n target: PersistedStorageTarget,\n signature: string,\n ctx?: { cacheGenerationClaimId?: string },\n ): Promise<void> {\n return this.runRegular(() =>\n this.markIndexRemovedUnscheduled(target, signature, ctx),\n )\n }\n\n private async markIndexRemovedUnscheduled(\n target: PersistedStorageTarget,\n signature: string,\n ctx?: { cacheGenerationClaimId?: string },\n ): Promise<void> {\n const access = resolvePersistedStorageTarget(\n target,\n ctx?.cacheGenerationClaimId,\n )\n const collectionId = access.collectionId\n ctx = access.claimId\n ? { ...ctx, cacheGenerationClaimId: access.claimId }\n : ctx\n await this.assertCacheGenerationReadClaim(\n this.driver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n await this.ensureCollectionReady(collectionId, ctx?.cacheGenerationClaimId)\n await this.runInTransaction(async (transactionDriver) => {\n await this.assertCacheGenerationReadClaim(\n transactionDriver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `remove a persisted index`,\n )\n const rows = await transactionDriver.query<{ index_name: string }>(\n `SELECT index_name\n FROM persisted_index_registry\n WHERE collection_id = ? AND signature = ?\n LIMIT 1`,\n [collectionId, signature],\n )\n const indexName = rows[0]?.index_name\n\n await transactionDriver.run(\n `UPDATE persisted_index_registry\n SET removed = 1,\n updated_at = CAST(strftime('%s', 'now') AS INTEGER),\n last_used_at = CAST(strftime('%s', 'now') AS INTEGER)\n WHERE collection_id = ? AND signature = ?`,\n [collectionId, signature],\n )\n\n if (indexName) {\n await transactionDriver.exec(\n `DROP INDEX IF EXISTS ${quoteIdentifier(indexName)}`,\n )\n }\n })\n }\n\n reserveLeadershipTerm(\n target: PersistedStorageTarget,\n observedTerm: number,\n ctx?: { cacheGenerationClaimId?: string },\n ): Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }> {\n // Election may run while hydration waits for its first writer route.\n return this.reserveLeadershipTermUnscheduled(target, observedTerm, ctx)\n }\n\n private async reserveLeadershipTermUnscheduled(\n target: PersistedStorageTarget,\n observedTerm: number,\n ctx?: { cacheGenerationClaimId?: string },\n ): Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }> {\n const access = resolvePersistedStorageTarget(\n target,\n ctx?.cacheGenerationClaimId,\n )\n const collectionId = access.collectionId\n ctx = access.claimId\n ? { ...ctx, cacheGenerationClaimId: access.claimId }\n : ctx\n await this.assertCacheGenerationReadClaim(\n this.driver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n await this.ensureCollectionReady(collectionId, ctx?.cacheGenerationClaimId)\n return this.runInTransaction(async (transactionDriver) => {\n await this.assertCacheGenerationReadClaim(\n transactionDriver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `reserve a leadership term`,\n )\n await transactionDriver.run(\n `INSERT INTO leader_term (collection_id, latest_term)\n VALUES (?, ? + 1)\n ON CONFLICT(collection_id) DO UPDATE SET\n latest_term = MAX(leader_term.latest_term, ?) + 1`,\n [collectionId, observedTerm, observedTerm],\n )\n const [position, latestRowVersion] = await Promise.all([\n this.readStreamPosition(collectionId, transactionDriver),\n this.readLatestRowVersion(collectionId, transactionDriver),\n ])\n return { ...position, latestRowVersion }\n })\n }\n\n getStreamPosition(\n target: PersistedStorageTarget,\n ctx?: { cacheGenerationClaimId?: string },\n ): Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }> {\n // Election must not queue behind a hydrate awaiting its first writer route.\n // The stream-position snapshot still uses the driver's transaction admission.\n return this.getStreamPositionUnscheduled(target, ctx)\n }\n\n private async getStreamPositionUnscheduled(\n target: PersistedStorageTarget,\n ctx?: { cacheGenerationClaimId?: string },\n ): Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }> {\n const access = resolvePersistedStorageTarget(\n target,\n ctx?.cacheGenerationClaimId,\n )\n const collectionId = access.collectionId\n ctx = access.claimId\n ? { ...ctx, cacheGenerationClaimId: access.claimId }\n : ctx\n await this.assertCacheGenerationReadClaim(\n this.driver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n await this.ensureCollectionReady(collectionId, ctx?.cacheGenerationClaimId)\n return this.runInTransaction(async (transactionDriver) => {\n await this.assertCacheGenerationReadClaim(\n transactionDriver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `read the stream position`,\n )\n const [position, latestRowVersion] = await Promise.all([\n this.readStreamPosition(collectionId, transactionDriver),\n this.readLatestRowVersion(collectionId, transactionDriver),\n ])\n\n return {\n ...position,\n latestRowVersion,\n }\n })\n }\n\n private async readLatestRowVersion(\n collectionId: string,\n driver: SQLiteDriver,\n ): Promise<number> {\n const versionRows = await driver.query<{ latest_row_version: number }>(\n `SELECT latest_row_version\n FROM collection_version\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n )\n return versionRows[0]?.latest_row_version ?? 0\n }\n\n private async readStreamPosition(\n collectionId: string,\n driver: SQLiteDriver,\n ): Promise<{ latestTerm: number; latestSeq: number }> {\n const [termRows, seqRows] = await Promise.all([\n driver.query<{ latest_term: number }>(\n `SELECT latest_term\n FROM leader_term\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n ),\n driver.query<{ max_seq: number }>(\n `SELECT MAX(seq) AS max_seq\n FROM applied_tx\n WHERE collection_id = ? AND term = (\n SELECT latest_term FROM leader_term WHERE collection_id = ? LIMIT 1\n )`,\n [collectionId, collectionId],\n ),\n ])\n\n return {\n latestTerm: termRows[0]?.latest_term ?? 0,\n latestSeq: seqRows[0]?.max_seq ?? 0,\n }\n }\n\n private async readKeySetEvidence(\n collectionId: string,\n driver: SQLiteDriver,\n ): Promise<{\n latestRowVersion: number\n keySet: PersistedKeySetEvidence\n }> {\n const versionRows = await driver.query<{\n latest_row_version: number\n key_set_evidence_available: number\n key_set_incompatible: number\n }>(\n `SELECT\n latest_row_version,\n key_set_evidence_available,\n key_set_evidence_incompatible AS key_set_incompatible\n FROM collection_version\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n )\n const version = versionRows[0]\n\n return {\n latestRowVersion: version?.latest_row_version ?? 0,\n keySet: {\n status:\n version?.key_set_evidence_available !== 1\n ? `unknown`\n : version.key_set_incompatible === 1\n ? `incompatible`\n : `consistent`,\n },\n }\n }\n\n pullSince(\n target: PersistedStorageTarget,\n fromRowVersion: number,\n ctx?: { cacheGenerationClaimId?: string },\n ): Promise<SQLitePullSinceResult<string | number>> {\n return this.runRegular(() =>\n this.pullSinceUnscheduled(target, fromRowVersion, ctx),\n )\n }\n\n private async pullSinceUnscheduled(\n target: PersistedStorageTarget,\n fromRowVersion: number,\n ctx?: { cacheGenerationClaimId?: string },\n ): Promise<SQLitePullSinceResult<string | number>> {\n const access = resolvePersistedStorageTarget(\n target,\n ctx?.cacheGenerationClaimId,\n )\n const collectionId = access.collectionId\n ctx = access.claimId\n ? { ...ctx, cacheGenerationClaimId: access.claimId }\n : ctx\n await this.assertCacheGenerationReadClaim(\n this.driver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n const tableMapping = await this.ensureCollectionReady(\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n const collectionTableSql = quoteIdentifier(tableMapping.tableName)\n const tombstoneTableSql = quoteIdentifier(tableMapping.tombstoneTableName)\n\n return this.runInTransaction(async (transactionDriver) => {\n await this.assertCacheGenerationReadClaim(\n transactionDriver,\n collectionId,\n ctx?.cacheGenerationClaimId,\n )\n await this.assertCurrentSchemaVersion(\n collectionId,\n transactionDriver,\n `read persisted transaction deltas`,\n )\n const [\n changedRows,\n deletedRows,\n latestVersionRows,\n replayRows,\n replayAvailabilityRows,\n ] = await Promise.all([\n transactionDriver.query<{ key: string }>(\n `SELECT key\n FROM ${collectionTableSql}\n WHERE row_version > ?`,\n [fromRowVersion],\n ),\n transactionDriver.query<{ key: string }>(\n `SELECT key\n FROM ${tombstoneTableSql}\n WHERE row_version > ?`,\n [fromRowVersion],\n ),\n transactionDriver.query<{ latest_row_version: number }>(\n `SELECT latest_row_version\n FROM collection_version\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n ),\n transactionDriver.query<{\n tx_id: string\n row_version: number\n replay_json: string | null\n replay_requires_full_reload: number\n }>(\n `SELECT tx_id, row_version, replay_json, replay_requires_full_reload\n FROM applied_tx\n WHERE collection_id = ? AND row_version > ?\n ORDER BY term ASC, seq ASC`,\n [collectionId, fromRowVersion],\n ),\n transactionDriver.query<{ min_row_version: number | null }>(\n `SELECT MIN(row_version) AS min_row_version\n FROM applied_tx\n WHERE collection_id = ?`,\n [collectionId],\n ),\n ])\n\n const latestRowVersion = latestVersionRows[0]?.latest_row_version ?? 0\n const replayFloor = replayAvailabilityRows[0]?.min_row_version\n if (\n latestRowVersion > fromRowVersion &&\n (replayFloor == null || replayFloor > fromRowVersion + 1)\n ) {\n return {\n latestRowVersion,\n requiresFullReload: true,\n }\n }\n\n const changedKeyCount = changedRows.length + deletedRows.length\n\n if (changedKeyCount > this.pullSinceReloadThreshold) {\n return {\n latestRowVersion,\n requiresFullReload: true,\n }\n }\n\n if (\n replayRows.some(\n (row) =>\n row.replay_requires_full_reload !== 0 || row.replay_json == null,\n )\n ) {\n return {\n latestRowVersion,\n requiresFullReload: true,\n }\n }\n\n const decodeKey = (encodedKey: string): string | number => {\n try {\n return decodePersistedStorageKey(encodedKey)\n } catch (error) {\n throw new InvalidPersistedStorageKeyEncodingError(\n `${encodedKey}: ${(error as Error).message}`,\n )\n }\n }\n\n const deltas = replayRows.map((row) => {\n const parsed = deserializePersistedRowValue<ReplayableTxDelta | null>(\n row.replay_json ?? `null`,\n )\n if (!parsed) {\n throw new InvalidPersistedCollectionConfigError(\n `missing replay payload for applied_tx row`,\n )\n }\n return parsed\n })\n\n const replayChangeCount = deltas.reduce(\n (count, delta) =>\n count +\n delta.changedRows.length +\n delta.deletedKeys.length +\n delta.rowMetadataMutations.length +\n delta.collectionMetadataMutations.length,\n 0,\n )\n\n if (replayChangeCount > this.pullSinceReloadThreshold) {\n return {\n latestRowVersion,\n requiresFullReload: true,\n }\n }\n\n return {\n latestRowVersion,\n requiresFullReload: false,\n changedKeys: changedRows.map((row) => decodeKey(row.key)),\n deletedKeys: deletedRows.map((row) => decodeKey(row.key)),\n deltas,\n }\n })\n }\n\n private async loadSubsetInternal(\n tableMapping: CollectionTableMapping,\n options: LoadSubsetOptions,\n driver: SQLiteDriver = this.driver,\n ): Promise<Array<InMemoryRow<string | number, Record<string, unknown>>>> {\n const collectionTableSql = quoteIdentifier(tableMapping.tableName)\n // Compile even when SQL cannot safely prefilter: invalid bindings must\n // reject before the in-memory fallback reads rows.\n const whereCompiled = options.where\n ? compileSqlExpression(options.where)\n : { supported: false, sql: ``, params: [] as Array<SqliteSupportedValue> }\n const safePrefilter = options.where\n ? compileSafeSqlPrefilter(options.where, whereCompiled)\n : undefined\n const orderByCompiled = compileOrderByClauses(options.orderBy)\n\n const queryParams: Array<SqliteSupportedValue> = []\n let sql = `SELECT key, value, metadata, row_version FROM ${collectionTableSql}`\n\n if (safePrefilter) {\n sql = `${sql} WHERE ${safePrefilter.sql}`\n queryParams.push(...safePrefilter.params)\n }\n\n if (options.orderBy && orderByCompiled.supported) {\n sql = `${sql} ORDER BY ${orderByCompiled.sql}, key ASC`\n queryParams.push(...orderByCompiled.params)\n }\n\n if (\n queryParams.length >\n (driver.maxBoundParameters ?? this.driver.maxBoundParameters ?? 999)\n ) {\n sql = `SELECT key, value, metadata, row_version FROM ${collectionTableSql}`\n queryParams.length = 0\n }\n\n const storedRows = await driver.query<StoredSqliteRow>(sql, queryParams)\n const parsedRows = decodeStoredSqliteRows(storedRows)\n\n const filteredRows = this.applyInMemoryWhere(parsedRows, options.where)\n const orderedRows = this.applyInMemoryOrderBy(filteredRows, options.orderBy)\n return this.applyInMemoryPagination(\n orderedRows,\n options.limit,\n options.offset,\n )\n }\n\n private applyInMemoryWhere(\n rows: Array<InMemoryRow<string | number, Record<string, unknown>>>,\n where: IR.BasicExpression<boolean> | undefined,\n ): Array<InMemoryRow<string | number, Record<string, unknown>>> {\n if (!where) {\n return rows\n }\n\n const evaluator = compileRowExpressionEvaluator(where)\n return rows.filter((row) =>\n toBooleanPredicate(evaluator(row.value) as boolean | null),\n )\n }\n\n private applyInMemoryOrderBy(\n rows: Array<InMemoryRow<string | number, Record<string, unknown>>>,\n orderBy: IR.OrderBy | undefined,\n ): Array<InMemoryRow<string | number, Record<string, unknown>>> {\n if (!orderBy || orderBy.length === 0) {\n return rows\n }\n\n const compiledClauses = orderBy.map((clause) => ({\n evaluator: compileRowExpressionEvaluator(clause.expression),\n compareOptions: clause.compareOptions,\n }))\n\n const ordered = [...rows]\n ordered.sort((left, right) => {\n for (const clause of compiledClauses) {\n const leftValue = clause.evaluator(left.value)\n const rightValue = clause.evaluator(right.value)\n\n const comparison = compareOrderByValues(\n leftValue,\n rightValue,\n clause.compareOptions,\n )\n\n if (comparison !== 0) {\n return clause.compareOptions.direction === `desc`\n ? comparison * -1\n : comparison\n }\n }\n\n const leftKey = encodePersistedStorageKey(left.key)\n const rightKey = encodePersistedStorageKey(right.key)\n if (leftKey < rightKey) {\n return -1\n }\n if (leftKey > rightKey) {\n return 1\n }\n return 0\n })\n\n return ordered\n }\n\n private applyInMemoryPagination(\n rows: Array<InMemoryRow<string | number, Record<string, unknown>>>,\n limit: number | undefined,\n offset: number | undefined,\n ): Array<InMemoryRow<string | number, Record<string, unknown>>> {\n const start = offset ?? 0\n if (limit === undefined) {\n return rows.slice(start)\n }\n return rows.slice(start, start + limit)\n }\n\n private async touchRequiredIndexes(\n collectionId: string,\n requiredIndexSignatures: ReadonlyArray<string> | undefined,\n driver: SQLiteDriver = this.driver,\n ): Promise<void> {\n if (!requiredIndexSignatures || requiredIndexSignatures.length === 0) {\n return\n }\n\n for (const signature of requiredIndexSignatures) {\n await driver.run(\n `UPDATE persisted_index_registry\n SET last_used_at = CAST(strftime('%s', 'now') AS INTEGER),\n updated_at = CAST(strftime('%s', 'now') AS INTEGER)\n WHERE collection_id = ? AND signature = ? AND removed = 0`,\n [collectionId, signature],\n )\n }\n }\n\n private async pruneAppliedTxRows(\n collectionId: string,\n driver: SQLiteDriver = this.driver,\n ): Promise<void> {\n if (\n this.appliedTxPruneMaxAgeSeconds !== undefined &&\n this.appliedTxPruneMaxAgeSeconds > 0\n ) {\n await driver.run(\n `DELETE FROM applied_tx\n WHERE collection_id = ?\n AND applied_at < (CAST(strftime('%s', 'now') AS INTEGER) - ?)`,\n [collectionId, this.appliedTxPruneMaxAgeSeconds],\n )\n }\n\n if (\n this.appliedTxPruneMaxRows === undefined ||\n this.appliedTxPruneMaxRows <= 0\n ) {\n return\n }\n\n const countRows = await driver.query<{ count: number }>(\n `SELECT COUNT(*) AS count\n FROM applied_tx\n WHERE collection_id = ?`,\n [collectionId],\n )\n const count = countRows[0]?.count ?? 0\n const excessRows = count - this.appliedTxPruneMaxRows\n if (excessRows <= 0) {\n return\n }\n\n await driver.run(\n `DELETE FROM applied_tx\n WHERE rowid IN (\n SELECT rowid\n FROM applied_tx\n WHERE collection_id = ?\n ORDER BY term ASC, seq ASC\n LIMIT ?\n )`,\n [collectionId, excessRows],\n )\n }\n\n private async ensureCollectionReady(\n collectionId: string,\n cacheGenerationClaimId?: string,\n ): Promise<CollectionTableMapping> {\n await this.ensureInitialized()\n\n const cached = this.collectionTableCache.get(collectionId)\n if (cached) {\n return cached\n }\n\n const inFlight = this.collectionTableLoads.get(collectionId)\n if (inFlight) {\n return inFlight\n }\n\n const loadPromise = this.ensureCollectionReadyInternal(\n collectionId,\n cacheGenerationClaimId,\n )\n this.collectionTableLoads.set(collectionId, loadPromise)\n\n try {\n return await loadPromise\n } finally {\n this.collectionTableLoads.delete(collectionId)\n }\n }\n\n private async loadCollectionRegistration(collectionId: string): Promise<\n | {\n table_name: string\n tombstone_table_name: string\n schema_version: number\n }\n | undefined\n > {\n const rows = await this.driver.query<{\n table_name: string\n tombstone_table_name: string\n schema_version: number\n }>(\n `SELECT table_name, tombstone_table_name, schema_version\n FROM collection_registry\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n )\n\n return rows[0]\n }\n\n private async ensureCollectionReadyInternal(\n collectionId: string,\n cacheGenerationClaimId?: string,\n ): Promise<CollectionTableMapping> {\n // Record whether registration began for a managed physical ID. Collection\n // may remove that catalog row while this operation waits on external DDL.\n const managedAtAdmission =\n cacheGenerationClaimId !== undefined ||\n (hasCacheGenerationIdPrefix(collectionId) &&\n (\n await this.driver.query<{ physical_id: string }>(\n `SELECT physical_id FROM cache_generation WHERE physical_id = ?`,\n [collectionId],\n )\n )[0] !== undefined)\n let registration = await this.loadCollectionRegistration(collectionId)\n\n if (!registration) {\n const tableName = createPersistedTableName(collectionId, `c`)\n const tombstoneTableName = createPersistedTableName(collectionId, `t`)\n await this.runInTransaction(async (transactionDriver) => {\n await this.assertCacheGenerationReadClaim(\n transactionDriver,\n collectionId,\n cacheGenerationClaimId,\n )\n await transactionDriver.run(\n `INSERT INTO collection_registry (\n collection_id,\n table_name,\n tombstone_table_name,\n schema_version,\n updated_at\n )\n VALUES (?, ?, ?, ?, CAST(strftime('%s', 'now') AS INTEGER))\n ON CONFLICT DO NOTHING`,\n [collectionId, tableName, tombstoneTableName, this.schemaVersion],\n )\n })\n\n registration = await this.loadCollectionRegistration(collectionId)\n if (!registration) {\n throw new InvalidPersistedCollectionConfigError(\n `Unable to register persistence tables for collection \"${collectionId}\"`,\n )\n }\n }\n\n const tableName = registration.table_name\n const tombstoneTableName = registration.tombstone_table_name\n if (registration.schema_version !== this.schemaVersion) {\n await this.handleSchemaMismatch(\n collectionId,\n registration.schema_version,\n this.schemaVersion,\n tableName,\n tombstoneTableName,\n cacheGenerationClaimId,\n )\n }\n\n const collectionTableSql = quoteIdentifier(tableName)\n const tombstoneTableSql = quoteIdentifier(tombstoneTableName)\n\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS ${collectionTableSql} (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n metadata TEXT,\n row_version INTEGER NOT NULL\n )`,\n )\n await this.driver.exec(\n `CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${tableName}_row_version_idx`)}\n ON ${collectionTableSql} (row_version)`,\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS ${tombstoneTableSql} (\n key TEXT PRIMARY KEY,\n value TEXT,\n row_version INTEGER NOT NULL,\n deleted_at TEXT NOT NULL\n )`,\n )\n await this.driver.exec(\n `CREATE INDEX IF NOT EXISTS ${quoteIdentifier(`${tombstoneTableName}_row_version_idx`)}\n ON ${tombstoneTableSql} (row_version)`,\n )\n await this.driver.run(\n `INSERT INTO collection_version (\n collection_id,\n latest_row_version,\n key_set_evidence_available,\n key_set_evidence_incompatible\n )\n VALUES (?, 0, 1, 0)\n ON CONFLICT(collection_id) DO NOTHING`,\n [collectionId],\n )\n await this.driver.run(\n `INSERT INTO collection_reset_epoch (collection_id, reset_epoch, updated_at)\n VALUES (?, 0, CAST(strftime('%s', 'now') AS INTEGER))\n ON CONFLICT(collection_id) DO NOTHING`,\n [collectionId],\n )\n await this.ensureCollectionKeyEvidenceTriggers(collectionId, tableName)\n if (managedAtAdmission) {\n // Registration is outside the read/write transaction. If collection\n // retired this generation while the DDL was in flight, remove any\n // empty table recreated after collection instead of caching it.\n const generation = await this.driver.query<{ physical_id: string }>(\n `SELECT physical_id FROM cache_generation WHERE physical_id = ?`,\n [collectionId],\n )\n if (!generation[0]) {\n await this.driver.exec(\n `DROP TABLE IF EXISTS ${quoteIdentifier(tableName)}`,\n )\n await this.driver.exec(\n `DROP TABLE IF EXISTS ${quoteIdentifier(tombstoneTableName)}`,\n )\n await this.driver.run(\n `DELETE FROM collection_registry WHERE collection_id = ?`,\n [collectionId],\n )\n await this.driver.run(\n `DELETE FROM collection_version WHERE collection_id = ?`,\n [collectionId],\n )\n await this.driver.run(\n `DELETE FROM collection_reset_epoch WHERE collection_id = ?`,\n [collectionId],\n )\n throw new InvalidPersistedCollectionConfigError(\n `Persisted cache generation was collected before registration finished`,\n )\n }\n }\n const mapping = {\n tableName,\n tombstoneTableName,\n }\n this.collectionTableCache.set(collectionId, mapping)\n return mapping\n }\n\n private async ensureCollectionKeyEvidenceTriggers(\n collectionId: string,\n tableName: string,\n ): Promise<void> {\n const collectionTableSql = quoteIdentifier(tableName)\n const collectionIdLiteral = toSqliteLiteral(collectionId)\n const insertTriggerSql = quoteIdentifier(`${tableName}_key_evidence_insert`)\n const deleteTriggerSql = quoteIdentifier(`${tableName}_key_evidence_delete`)\n const updateTriggerSql = quoteIdentifier(`${tableName}_key_evidence_update`)\n\n await this.driver.exec(\n `CREATE TRIGGER IF NOT EXISTS ${insertTriggerSql}\n AFTER INSERT ON ${collectionTableSql}\n WHEN EXISTS (\n SELECT 1\n FROM collection_version\n WHERE collection_id = ${collectionIdLiteral}\n AND key_set_evidence_available = 1\n ) AND NOT EXISTS (\n SELECT 1\n FROM collection_expected_keys\n WHERE collection_id = ${collectionIdLiteral}\n AND key = NEW.key\n )\n BEGIN\n UPDATE collection_version\n SET key_set_evidence_incompatible = 1\n WHERE collection_id = ${collectionIdLiteral};\n END`,\n )\n await this.driver.exec(\n `CREATE TRIGGER IF NOT EXISTS ${deleteTriggerSql}\n AFTER DELETE ON ${collectionTableSql}\n WHEN EXISTS (\n SELECT 1\n FROM collection_version\n WHERE collection_id = ${collectionIdLiteral}\n AND key_set_evidence_available = 1\n ) AND EXISTS (\n SELECT 1\n FROM collection_expected_keys\n WHERE collection_id = ${collectionIdLiteral}\n AND key = OLD.key\n )\n BEGIN\n UPDATE collection_version\n SET key_set_evidence_incompatible = 1\n WHERE collection_id = ${collectionIdLiteral};\n END`,\n )\n await this.driver.exec(\n `CREATE TRIGGER IF NOT EXISTS ${updateTriggerSql}\n AFTER UPDATE OF key ON ${collectionTableSql}\n WHEN OLD.key <> NEW.key AND EXISTS (\n SELECT 1\n FROM collection_version\n WHERE collection_id = ${collectionIdLiteral}\n AND key_set_evidence_available = 1\n )\n BEGIN\n UPDATE collection_version\n SET key_set_evidence_incompatible = 1\n WHERE collection_id = ${collectionIdLiteral};\n END`,\n )\n }\n\n private async handleSchemaMismatch(\n collectionId: string,\n previousSchemaVersion: number,\n nextSchemaVersion: number,\n tableName: string,\n tombstoneTableName: string,\n cacheGenerationClaimId?: string,\n ): Promise<void> {\n if (this.schemaMismatchPolicy === `sync-absent-error`) {\n throw new InvalidPersistedCollectionConfigError(\n `Schema version mismatch for collection \"${collectionId}\": found ${previousSchemaVersion}, expected ${nextSchemaVersion}. ` +\n `Set schemaMismatchPolicy to \"sync-present-reset\" or \"reset\" to allow automatic reset.`,\n )\n }\n\n const collectionTableSql = quoteIdentifier(tableName)\n const tombstoneTableSql = quoteIdentifier(tombstoneTableName)\n\n await this.runInTransaction(async (transactionDriver) => {\n await this.assertCacheGenerationReadClaim(\n transactionDriver,\n collectionId,\n cacheGenerationClaimId,\n )\n const currentSchemaRows = await transactionDriver.query<{\n schema_version: number\n }>(\n `SELECT schema_version\n FROM collection_registry\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n )\n const currentSchemaVersion = currentSchemaRows[0]?.schema_version\n if (currentSchemaVersion === nextSchemaVersion) {\n return\n }\n if (currentSchemaVersion !== previousSchemaVersion) {\n throw new InvalidPersistedCollectionConfigError(\n `Schema version changed concurrently for collection \"${collectionId}\": ` +\n `found ${currentSchemaVersion ?? `no registry entry`} after observing ${previousSchemaVersion}; ` +\n `refusing to reset it to ${nextSchemaVersion}.`,\n )\n }\n\n const persistedIndexes = await transactionDriver.query<{\n index_name: string\n }>(\n `SELECT index_name\n FROM persisted_index_registry\n WHERE collection_id = ?`,\n [collectionId],\n )\n for (const row of persistedIndexes) {\n await transactionDriver.exec(\n `DROP INDEX IF EXISTS ${quoteIdentifier(row.index_name)}`,\n )\n }\n\n await transactionDriver.run(\n `DELETE FROM collection_expected_keys\n WHERE collection_id = ?`,\n [collectionId],\n )\n await transactionDriver.run(`DELETE FROM ${collectionTableSql}`)\n await transactionDriver.run(`DELETE FROM ${tombstoneTableSql}`)\n await transactionDriver.run(\n `DELETE FROM applied_tx\n WHERE collection_id = ?`,\n [collectionId],\n )\n await transactionDriver.run(\n `DELETE FROM persisted_index_registry\n WHERE collection_id = ?`,\n [collectionId],\n )\n await transactionDriver.run(\n `DELETE FROM collection_metadata\n WHERE collection_id = ?`,\n [collectionId],\n )\n await transactionDriver.run(\n `UPDATE collection_registry\n SET schema_version = ?,\n updated_at = CAST(strftime('%s', 'now') AS INTEGER)\n WHERE collection_id = ?`,\n [nextSchemaVersion, collectionId],\n )\n await transactionDriver.run(\n `INSERT INTO collection_version (\n collection_id,\n latest_row_version,\n key_set_evidence_available,\n key_set_evidence_incompatible\n )\n VALUES (?, 0, 1, 0)\n ON CONFLICT(collection_id) DO UPDATE SET\n latest_row_version = 0,\n key_set_evidence_available = 1,\n key_set_evidence_incompatible = 0`,\n [collectionId],\n )\n await transactionDriver.run(\n `INSERT INTO collection_reset_epoch (collection_id, reset_epoch, updated_at)\n VALUES (?, 1, CAST(strftime('%s', 'now') AS INTEGER))\n ON CONFLICT(collection_id) DO UPDATE SET\n reset_epoch = collection_reset_epoch.reset_epoch + 1,\n updated_at = CAST(strftime('%s', 'now') AS INTEGER)`,\n [collectionId],\n )\n })\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) {\n return\n }\n\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS cache_generation (\n logical_id TEXT NOT NULL,\n generation INTEGER NOT NULL,\n physical_id TEXT NOT NULL UNIQUE,\n retired INTEGER NOT NULL DEFAULT 0,\n PRIMARY KEY (logical_id, generation)\n )`,\n )\n await this.driver.exec(\n `CREATE UNIQUE INDEX IF NOT EXISTS cache_generation_head\n ON cache_generation (logical_id) WHERE retired = 0`,\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS cache_generation_sequence (\n logical_id TEXT PRIMARY KEY,\n next_generation INTEGER NOT NULL\n )`,\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS cache_generation_claim (\n claim_id TEXT PRIMARY KEY,\n logical_id TEXT NOT NULL,\n physical_id TEXT NOT NULL,\n expires_at_ms INTEGER NOT NULL\n )`,\n )\n const claimColumns = await this.driver.query<{ name: string }>(\n `PRAGMA table_info(cache_generation_claim)`,\n )\n if (!claimColumns.some(({ name }) => name === `logical_id`)) {\n await this.driver.exec(\n `ALTER TABLE cache_generation_claim\n ADD COLUMN logical_id TEXT NOT NULL DEFAULT ''`,\n )\n }\n if (!claimColumns.some(({ name }) => name === `expires_at_ms`)) {\n await this.driver.exec(\n `ALTER TABLE cache_generation_claim\n ADD COLUMN expires_at_ms INTEGER NOT NULL DEFAULT 0`,\n )\n }\n\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS collection_registry (\n collection_id TEXT PRIMARY KEY,\n table_name TEXT NOT NULL UNIQUE,\n tombstone_table_name TEXT NOT NULL UNIQUE,\n schema_version INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )`,\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS persisted_index_registry (\n collection_id TEXT NOT NULL,\n signature TEXT NOT NULL,\n index_name TEXT NOT NULL,\n expression_sql TEXT NOT NULL,\n where_sql TEXT,\n removed INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n last_used_at INTEGER NOT NULL,\n PRIMARY KEY (collection_id, signature)\n )`,\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS applied_tx (\n collection_id TEXT NOT NULL,\n term INTEGER NOT NULL,\n seq INTEGER NOT NULL,\n tx_id TEXT NOT NULL,\n row_version INTEGER NOT NULL,\n replay_json TEXT,\n replay_requires_full_reload INTEGER NOT NULL DEFAULT 0,\n applied_at INTEGER NOT NULL,\n PRIMARY KEY (collection_id, term, seq)\n )`,\n )\n await this.driver.exec(\n `CREATE INDEX IF NOT EXISTS idx_applied_tx_collection_tx_id\n ON applied_tx (collection_id, tx_id)`,\n )\n try {\n await this.driver.exec(\n `ALTER TABLE applied_tx ADD COLUMN replay_json TEXT`,\n )\n } catch (error) {\n if (!isDuplicateColumnAddError(error, `replay_json`)) {\n throw error\n }\n }\n try {\n await this.driver.exec(\n `ALTER TABLE applied_tx ADD COLUMN replay_requires_full_reload INTEGER NOT NULL DEFAULT 0`,\n )\n } catch (error) {\n if (!isDuplicateColumnAddError(error, `replay_requires_full_reload`)) {\n throw error\n }\n }\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS collection_version (\n collection_id TEXT PRIMARY KEY,\n latest_row_version INTEGER NOT NULL,\n key_set_evidence_available INTEGER NOT NULL DEFAULT 0,\n key_set_evidence_incompatible INTEGER NOT NULL DEFAULT 0\n )`,\n )\n const collectionVersionColumns = await this.driver.query<{ name: string }>(\n `PRAGMA table_info(collection_version)`,\n )\n const keyEvidenceColumns = [\n `key_set_evidence_available`,\n `key_set_evidence_incompatible`,\n ] as const\n for (const columnName of keyEvidenceColumns) {\n if (collectionVersionColumns.some(({ name }) => name === columnName)) {\n continue\n }\n try {\n await this.driver.exec(\n `ALTER TABLE collection_version ADD COLUMN ${columnName} INTEGER NOT NULL DEFAULT 0`,\n )\n } catch (error) {\n if (!isDuplicateColumnAddError(error, columnName)) {\n throw error\n }\n }\n }\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS collection_expected_keys (\n collection_id TEXT NOT NULL,\n key TEXT NOT NULL,\n PRIMARY KEY (collection_id, key)\n )`,\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS collection_metadata (\n collection_id TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n updated_at INTEGER NOT NULL,\n PRIMARY KEY (collection_id, key)\n )`,\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS leader_term (\n collection_id TEXT PRIMARY KEY,\n latest_term INTEGER NOT NULL\n )`,\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS schema_version (\n scope TEXT PRIMARY KEY,\n version INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )`,\n )\n await this.driver.run(\n `INSERT INTO schema_version (scope, version, updated_at)\n VALUES ('global', ?, CAST(strftime('%s', 'now') AS INTEGER))\n ON CONFLICT(scope) DO UPDATE SET\n version = excluded.version,\n updated_at = excluded.updated_at`,\n [this.schemaVersion],\n )\n await this.driver.exec(\n `CREATE TABLE IF NOT EXISTS collection_reset_epoch (\n collection_id TEXT PRIMARY KEY,\n reset_epoch INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )`,\n )\n\n this.initialized = true\n }\n}\n\nexport function createSQLiteCorePersistenceAdapter(\n options: SQLiteCoreAdapterOptions,\n): PersistenceAdapter {\n return new SQLiteCorePersistenceAdapter(options)\n}\n"],"names":["SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY","InvalidPersistedCollectionConfigError","PERSISTED_TYPE_TAG","PERSISTED_VALUE_TAG","serializeSQLiteBigInt","serializeSQLiteTemporal","reviveSQLiteTemporal","assertSQLiteBigIntInRange","compileSingleRowExpression","sqliteTemporalKind","compareTemporalValues","IR","decodePersistedStorageKey","sqliteTemporalIdentity","createPersistedTableName","safeRandomUUID","resolvePersistedStorageTarget","encodePersistedStorageKey","isValidCommittedTxAnchor","InvalidPersistedStorageKeyEncodingError","toBooleanPredicate","tableName","tombstoneTableName"],"mappings":"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"}
|