@tanstack/db-sqlite-persistence-core 0.1.5 → 0.1.7
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/dist/cjs/persisted.cjs +13 -3
- package/dist/cjs/persisted.cjs.map +1 -1
- package/dist/cjs/persisted.d.cts +16 -16
- package/dist/cjs/sqlite-core-adapter.cjs +6 -10
- package/dist/cjs/sqlite-core-adapter.cjs.map +1 -1
- package/dist/cjs/sqlite-core-adapter.d.cts +7 -7
- package/dist/esm/persisted.d.ts +16 -16
- package/dist/esm/persisted.js +14 -4
- package/dist/esm/persisted.js.map +1 -1
- package/dist/esm/sqlite-core-adapter.d.ts +7 -7
- package/dist/esm/sqlite-core-adapter.js +6 -10
- package/dist/esm/sqlite-core-adapter.js.map +1 -1
- package/package.json +2 -2
- package/src/persisted.ts +71 -81
- package/src/sqlite-core-adapter.ts +46 -50
package/dist/cjs/persisted.d.cts
CHANGED
|
@@ -152,7 +152,7 @@ export type ReplayableTxDelta<T extends Record<string, unknown> = Record<string,
|
|
|
152
152
|
rowMetadataMutations: Array<PersistedRowMetadataMutation<TKey>>;
|
|
153
153
|
collectionMetadataMutations: Array<PersistedCollectionMetadataMutation>;
|
|
154
154
|
};
|
|
155
|
-
export type PersistedScannedRow<T extends object, TKey extends string | number = string | number> = {
|
|
155
|
+
export type PersistedScannedRow<T extends object = Record<string, unknown>, TKey extends string | number = string | number> = {
|
|
156
156
|
key: TKey;
|
|
157
157
|
value: T;
|
|
158
158
|
metadata?: unknown;
|
|
@@ -160,7 +160,7 @@ export type PersistedScannedRow<T extends object, TKey extends string | number =
|
|
|
160
160
|
export type PersistedRowScanOptions = {
|
|
161
161
|
metadataOnly?: boolean;
|
|
162
162
|
};
|
|
163
|
-
export type PersistedTx<T extends object, TKey extends string | number = string | number> = {
|
|
163
|
+
export type PersistedTx<T extends object = Record<string, unknown>, TKey extends string | number = string | number> = {
|
|
164
164
|
txId: string;
|
|
165
165
|
term: number;
|
|
166
166
|
seq: number;
|
|
@@ -186,20 +186,20 @@ export type PersistedTx<T extends object, TKey extends string | number = string
|
|
|
186
186
|
rowMetadataMutations?: Array<PersistedRowMetadataMutation<TKey>>;
|
|
187
187
|
collectionMetadataMutations?: Array<PersistedCollectionMetadataMutation>;
|
|
188
188
|
};
|
|
189
|
-
export interface PersistenceAdapter
|
|
189
|
+
export interface PersistenceAdapter {
|
|
190
190
|
loadSubset: (collectionId: string, options: LoadSubsetOptions, ctx?: {
|
|
191
191
|
requiredIndexSignatures?: ReadonlyArray<string>;
|
|
192
192
|
}) => Promise<Array<{
|
|
193
|
-
key:
|
|
194
|
-
value:
|
|
193
|
+
key: string | number;
|
|
194
|
+
value: Record<string, unknown>;
|
|
195
195
|
metadata?: unknown;
|
|
196
196
|
}>>;
|
|
197
|
-
applyCommittedTx: (collectionId: string, tx: PersistedTx
|
|
197
|
+
applyCommittedTx: (collectionId: string, tx: PersistedTx) => Promise<void>;
|
|
198
198
|
loadCollectionMetadata?: (collectionId: string) => Promise<Array<{
|
|
199
199
|
key: string;
|
|
200
200
|
value: unknown;
|
|
201
201
|
}>>;
|
|
202
|
-
scanRows?: (collectionId: string, options?: PersistedRowScanOptions) => Promise<Array<PersistedScannedRow
|
|
202
|
+
scanRows?: (collectionId: string, options?: PersistedRowScanOptions) => Promise<Array<PersistedScannedRow>>;
|
|
203
203
|
ensureIndex: (collectionId: string, signature: string, spec: PersistedIndexSpec) => Promise<void>;
|
|
204
204
|
markIndexRemoved?: (collectionId: string, signature: string) => Promise<void>;
|
|
205
205
|
getStreamPosition?: (collectionId: string) => Promise<{
|
|
@@ -226,17 +226,17 @@ export interface PersistedCollectionCoordinator {
|
|
|
226
226
|
requestApplyLocalMutations?: (collectionId: string, mutations: Array<PersistedMutationEnvelope>) => Promise<ApplyLocalMutationsResponse>;
|
|
227
227
|
pullSince?: (collectionId: string, fromRowVersion: number) => Promise<PullSinceResponse>;
|
|
228
228
|
}
|
|
229
|
-
export interface PersistedCollectionPersistence
|
|
230
|
-
adapter: PersistenceAdapter
|
|
229
|
+
export interface PersistedCollectionPersistence {
|
|
230
|
+
adapter: PersistenceAdapter;
|
|
231
231
|
coordinator?: PersistedCollectionCoordinator;
|
|
232
232
|
resolvePersistenceForCollection?: (options: {
|
|
233
233
|
collectionId: string;
|
|
234
234
|
mode: PersistedCollectionMode;
|
|
235
235
|
schemaVersion?: number;
|
|
236
|
-
}) => PersistedCollectionPersistence
|
|
237
|
-
resolvePersistenceForMode?: (mode: PersistedCollectionMode) => PersistedCollectionPersistence
|
|
236
|
+
}) => PersistedCollectionPersistence;
|
|
237
|
+
resolvePersistenceForMode?: (mode: PersistedCollectionMode) => PersistedCollectionPersistence;
|
|
238
238
|
}
|
|
239
|
-
type PersistedResolvedPersistence
|
|
239
|
+
type PersistedResolvedPersistence = PersistedCollectionPersistence & {
|
|
240
240
|
coordinator: PersistedCollectionCoordinator;
|
|
241
241
|
};
|
|
242
242
|
export type PersistedCollectionLeadershipState = {
|
|
@@ -252,19 +252,19 @@ export interface PersistedCollectionUtils extends UtilsRecord {
|
|
|
252
252
|
}
|
|
253
253
|
export type PersistedSyncWrappedOptions<T extends object, TKey extends string | number, TSchema extends StandardSchemaV1 = never, TUtils extends UtilsRecord = UtilsRecord> = CollectionConfig<T, TKey, TSchema, TUtils> & {
|
|
254
254
|
sync: SyncConfig<T, TKey>;
|
|
255
|
-
persistence: PersistedCollectionPersistence
|
|
255
|
+
persistence: PersistedCollectionPersistence;
|
|
256
256
|
schemaVersion?: number;
|
|
257
257
|
};
|
|
258
258
|
export type PersistedLocalOnlyOptions<T extends object, TKey extends string | number, TSchema extends StandardSchemaV1 = never, TUtils extends UtilsRecord = UtilsRecord> = Omit<CollectionConfig<T, TKey, TSchema, TUtils>, `sync`> & {
|
|
259
|
-
persistence: PersistedCollectionPersistence
|
|
259
|
+
persistence: PersistedCollectionPersistence;
|
|
260
260
|
schemaVersion?: number;
|
|
261
261
|
};
|
|
262
262
|
type PersistedSyncOptionsResult<T extends object, TKey extends string | number, TSchema extends StandardSchemaV1, TUtils extends UtilsRecord> = CollectionConfig<T, TKey, TSchema, TUtils> & {
|
|
263
|
-
persistence: PersistedResolvedPersistence
|
|
263
|
+
persistence: PersistedResolvedPersistence;
|
|
264
264
|
};
|
|
265
265
|
type PersistedLocalOnlyOptionsResult<T extends object, TKey extends string | number, TSchema extends StandardSchemaV1, TUtils extends UtilsRecord> = CollectionConfig<T, TKey, TSchema, TUtils & PersistedCollectionUtils> & {
|
|
266
266
|
id: string;
|
|
267
|
-
persistence: PersistedResolvedPersistence
|
|
267
|
+
persistence: PersistedResolvedPersistence;
|
|
268
268
|
utils: TUtils & PersistedCollectionUtils;
|
|
269
269
|
};
|
|
270
270
|
/**
|
|
@@ -1162,7 +1162,9 @@ class SQLiteCorePersistenceAdapter {
|
|
|
1162
1162
|
}
|
|
1163
1163
|
};
|
|
1164
1164
|
const deltas = replayRows.map((row) => {
|
|
1165
|
-
const parsed = deserializePersistedRowValue(
|
|
1165
|
+
const parsed = deserializePersistedRowValue(
|
|
1166
|
+
row.replay_json ?? `null`
|
|
1167
|
+
);
|
|
1166
1168
|
if (!parsed) {
|
|
1167
1169
|
throw new errors.InvalidPersistedCollectionConfigError(
|
|
1168
1170
|
`missing replay payload for applied_tx row`
|
|
@@ -1221,9 +1223,7 @@ class SQLiteCorePersistenceAdapter {
|
|
|
1221
1223
|
}
|
|
1222
1224
|
const evaluator = compileRowExpressionEvaluator(where);
|
|
1223
1225
|
return rows.filter(
|
|
1224
|
-
(row) => db.toBooleanPredicate(
|
|
1225
|
-
evaluator(row.value)
|
|
1226
|
-
)
|
|
1226
|
+
(row) => db.toBooleanPredicate(evaluator(row.value))
|
|
1227
1227
|
);
|
|
1228
1228
|
}
|
|
1229
1229
|
applyInMemoryOrderBy(rows, orderBy) {
|
|
@@ -1237,12 +1237,8 @@ class SQLiteCorePersistenceAdapter {
|
|
|
1237
1237
|
const ordered = [...rows];
|
|
1238
1238
|
ordered.sort((left, right) => {
|
|
1239
1239
|
for (const clause of compiledClauses) {
|
|
1240
|
-
const leftValue = clause.evaluator(
|
|
1241
|
-
|
|
1242
|
-
);
|
|
1243
|
-
const rightValue = clause.evaluator(
|
|
1244
|
-
right.value
|
|
1245
|
-
);
|
|
1240
|
+
const leftValue = clause.evaluator(left.value);
|
|
1241
|
+
const rightValue = clause.evaluator(right.value);
|
|
1246
1242
|
const comparison = compareOrderByValues(
|
|
1247
1243
|
leftValue,
|
|
1248
1244
|
rightValue,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-core-adapter.cjs","sources":["../../src/sqlite-core-adapter.ts"],"sourcesContent":["import {\n IR,\n compileSingleRowExpression,\n toBooleanPredicate,\n} from '@tanstack/db'\nimport {\n InvalidPersistedCollectionConfigError,\n InvalidPersistedStorageKeyEncodingError,\n} from './errors'\nimport {\n createPersistedTableName,\n decodePersistedStorageKey,\n encodePersistedStorageKey,\n} from './persisted'\nimport type { LoadSubsetOptions } from '@tanstack/db'\nimport type {\n PersistedIndexSpec,\n PersistedRowScanOptions,\n PersistedScannedRow,\n PersistedTx,\n PersistenceAdapter,\n ReplayableTxDelta,\n SQLiteDriver,\n} from './persisted'\n\ntype SqliteSupportedValue = null | number | string\n\ntype CollectionTableMapping = {\n tableName: string\n tombstoneTableName: string\n}\n\ntype CompiledSqlFragment = {\n supported: boolean\n sql: string\n params: Array<SqliteSupportedValue>\n valueKind?: CompiledValueKind\n}\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`\n | `sync-absent-error`\n | `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\nconst DEFAULT_SCHEMA_VERSION = 1\nconst DEFAULT_PULL_SINCE_RELOAD_THRESHOLD = 128\nconst SQLITE_MAX_IN_BATCH_SIZE = 900\nconst SAFE_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/\nconst FORBIDDEN_SQL_FRAGMENT_PATTERN = /(;|--|\\/\\*)/\nconst PERSISTED_TYPE_TAG = `__tanstack_db_persisted_type__`\nconst PERSISTED_VALUE_TAG = `value`\n\ntype CompiledValueKind = `unknown` | `bigint` | `date` | `datetime`\ntype PersistedTaggedValueType =\n | `bigint`\n | `date`\n | `nan`\n | `infinity`\n | `-infinity`\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])\n\nconst orderByObjectIds = new WeakMap<object, number>()\nlet nextOrderByObjectId = 1\n\nfunction isDuplicateColumnAddError(\n error: unknown,\n columnName: string,\n): boolean {\n if (!(error instanceof Error)) {\n return false\n }\n\n const message = error.message.toLowerCase()\n const normalizedColumnName = columnName.toLowerCase()\n return (\n (message.includes(`duplicate column name`) &&\n message.includes(normalizedColumnName)) ||\n (message.includes(`already exists`) &&\n message.includes(normalizedColumnName))\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 {\n [PERSISTED_TYPE_TAG]: `bigint`,\n [PERSISTED_VALUE_TAG]: value.toString(),\n } satisfies PersistedTaggedValue\n }\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 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 `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 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 return 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 return `'${value.replace(/'/g, `''`)}'`\n}\n\nfunction inlineSqlParams(\n sql: string,\n params: ReadonlyArray<SqliteSupportedValue>,\n): string {\n let index = 0\n const inlinedSql = sql.replace(/\\?/g, () => {\n const paramValue = params[index]\n index++\n return toSqliteLiteral(paramValue ?? null)\n })\n\n if (index !== params.length) {\n throw new InvalidPersistedCollectionConfigError(\n `Unable to inline SQL params; placeholder count did not match provided params`,\n )\n }\n\n return inlinedSql\n}\n\ntype CompiledRowExpressionEvaluator = (row: Record<string, unknown>) => unknown\n\nfunction collectAliasQualifiedRefSegments(\n expression: IR.BasicExpression,\n segments: Set<string> = new Set<string>(),\n): Set<string> {\n if (expression.type === `ref`) {\n if (expression.path.length > 1) {\n const rootSegment = String(expression.path[0])\n if (rootSegment.length > 0) {\n segments.add(rootSegment)\n }\n }\n return segments\n }\n\n if (expression.type === `func`) {\n for (const arg of expression.args) {\n collectAliasQualifiedRefSegments(arg, segments)\n }\n }\n\n return segments\n}\n\nfunction createAliasAwareRowProxy(\n row: Record<string, unknown>,\n aliasSegments: ReadonlySet<string>,\n): Record<string, unknown> {\n return new Proxy(row, {\n get(target, prop, receiver) {\n if (typeof prop !== `string`) {\n return Reflect.get(target, prop, receiver)\n }\n\n if (Object.prototype.hasOwnProperty.call(target, prop)) {\n const value = Reflect.get(target, prop, receiver)\n if (value !== undefined || !aliasSegments.has(prop)) {\n return value\n }\n\n return target\n }\n\n if (aliasSegments.has(prop)) {\n return target\n }\n\n return undefined\n },\n })\n}\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\n const aliasSegments = collectAliasQualifiedRefSegments(expression)\n if (aliasSegments.size === 0) {\n return (row) => baseEvaluator(row)\n }\n\n const proxyCache = new WeakMap<\n Record<string, unknown>,\n Record<string, unknown>\n >()\n return (row) => {\n let proxy = proxyCache.get(row)\n if (!proxy) {\n proxy = createAliasAwareRowProxy(row, aliasSegments)\n proxyCache.set(row, proxy)\n }\n return baseEvaluator(proxy)\n }\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 === `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 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\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 leftSql: string,\n rightSql: string,\n valueKind: CompiledValueKind,\n): string {\n if (valueKind === `bigint`) {\n return `(CAST(${leftSql} AS NUMERIC) ${operator} CAST(${rightSql} AS NUMERIC))`\n }\n if (valueKind === `date`) {\n return `(date(${leftSql}) ${operator} date(${rightSql}))`\n }\n if (valueKind === `datetime`) {\n return `(datetime(${leftSql}) ${operator} datetime(${rightSql}))`\n }\n return `(${leftSql} ${operator} ${rightSql})`\n}\n\nfunction compileRefExpressionSql(jsonPath: string): CompiledSqlFragment {\n const typePath = `${jsonPath}.${PERSISTED_TYPE_TAG}`\n const taggedValuePath = `${jsonPath}.${PERSISTED_VALUE_TAG}`\n\n return {\n supported: true,\n sql: `(CASE json_extract(value, ?)\n WHEN 'bigint' THEN CAST(json_extract(value, ?) AS NUMERIC)\n WHEN 'date' THEN json_extract(value, ?)\n WHEN 'nan' THEN NULL\n WHEN 'infinity' THEN NULL\n WHEN '-infinity' THEN NULL\n ELSE json_extract(value, ?)\n END)`,\n params: [typePath, taggedValuePath, taggedValuePath, jsonPath],\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<TKey extends string | number, T extends object> = {\n key: TKey\n value: T\n metadata?: unknown\n rowVersion: number\n}\n\nfunction decodeStoredSqliteRows<TKey extends string | number, T extends object>(\n storedRows: ReadonlyArray<StoredSqliteRow>,\n): 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\nfunction compileSqlExpression(\n expression: IR.BasicExpression,\n): CompiledSqlFragment {\n if (expression.type === `val`) {\n const valueKind = getLiteralValueKind(expression.value)\n return {\n supported: true,\n sql: `?`,\n params: [toSqliteParameterValue(expression.value)],\n valueKind,\n }\n }\n\n if (expression.type === `ref`) {\n const jsonPath = createJsonPath(expression.path.map(String))\n if (!jsonPath) {\n return {\n supported: false,\n sql: ``,\n params: [],\n }\n }\n\n return compileRefExpressionSql(jsonPath)\n }\n\n const compiledArgs = expression.args.map((arg) => compileSqlExpression(arg))\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 return {\n supported: true,\n sql: compileComparisonSql(\n operatorByName[expression.name],\n argSql[0],\n argSql[1],\n valueKind,\n ),\n params,\n }\n }\n case `and`: {\n if (argSql.length < 2) {\n return { supported: false, sql: ``, params: [] }\n }\n return {\n supported: true,\n sql: argSql.map((sql) => `(${sql})`).join(` AND `),\n params,\n }\n }\n case `or`: {\n if (argSql.length < 2) {\n return { supported: false, sql: ``, params: [] }\n }\n return {\n supported: true,\n sql: argSql.map((sql) => `(${sql})`).join(` 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 if (listValue.length > SQLITE_MAX_IN_BATCH_SIZE) {\n const hasBigIntValues = listValue.some(\n (value) => typeof value === `bigint`,\n )\n const inLeftSql = hasBigIntValues\n ? `CAST(${leftSql} AS NUMERIC)`\n : leftSql\n const chunkClauses: Array<string> = []\n const batchedParams: Array<SqliteSupportedValue> = []\n\n for (\n let startIndex = 0;\n startIndex < listValue.length;\n startIndex += SQLITE_MAX_IN_BATCH_SIZE\n ) {\n const chunkValues = listValue.slice(\n startIndex,\n startIndex + SQLITE_MAX_IN_BATCH_SIZE,\n )\n chunkClauses.push(\n `(${inLeftSql} IN (${chunkValues.map(() => `?`).join(`, `)}))`,\n )\n batchedParams.push(...leftParams)\n batchedParams.push(\n ...chunkValues.map((value) => toSqliteParameterValue(value)),\n )\n }\n\n return {\n supported: true,\n sql: `(${chunkClauses.join(` OR `)})`,\n params: batchedParams,\n }\n }\n\n const hasBigIntValues = listValue.some(\n (value) => typeof value === `bigint`,\n )\n const inLeftSql = hasBigIntValues\n ? `CAST(${leftSql} AS NUMERIC)`\n : leftSql\n const listPlaceholders = listValue.map(() => `?`).join(`, `)\n return {\n supported: true,\n sql: `(${inLeftSql} IN (${listPlaceholders}))`,\n params: [\n ...leftParams,\n ...listValue.map((value) => toSqliteParameterValue(value)),\n ],\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 { supported: true, sql: `COALESCE(${argSql.join(`, `)})`, params }\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\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(clause.expression)\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 }\n\n if (candidate.type === `val`) {\n return Object.prototype.hasOwnProperty.call(candidate, `value`)\n }\n\n if (candidate.type === `ref`) {\n return Array.isArray(candidate.path)\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 if (hasParsedJson && isExpressionLikeShape(parsedJson)) {\n const compiled = compileSqlExpression(parsedJson)\n if (!compiled.supported) {\n throw new InvalidPersistedCollectionConfigError(\n `Persisted index expression is not supported by the SQLite compiler`,\n )\n }\n return inlineSqlParams(compiled.sql, compiled.params)\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 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<\n T extends object,\n TKey extends string | number = string | number,\n> implements PersistenceAdapter<T, TKey> {\n private readonly driver: SQLiteDriver\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\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 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.driver = options.driver\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 }\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 async loadSubset(\n collectionId: string,\n options: LoadSubsetOptions,\n ctx?: { requiredIndexSignatures?: ReadonlyArray<string> },\n ): Promise<Array<{ key: TKey; value: T; metadata?: unknown }>> {\n const tableMapping = await this.ensureCollectionReady(collectionId)\n await this.touchRequiredIndexes(collectionId, ctx?.requiredIndexSignatures)\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(tableMapping, whereCurrentOptions),\n this.loadSubsetInternal(tableMapping, whereFromOptions),\n ])\n\n const mergedRows = new Map<string, InMemoryRow<TKey, T>>()\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(tableMapping, options)\n return rows.map((row) => ({\n key: row.key,\n value: row.value,\n metadata: row.metadata,\n }))\n }\n\n async applyCommittedTx(\n collectionId: string,\n tx: PersistedTx<T, TKey>,\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 alreadyApplied = await transactionDriver.query<{ applied: number }>(\n `SELECT 1 AS applied\n FROM applied_tx\n WHERE collection_id = ? AND term = ? AND seq = ?\n LIMIT 1`,\n [collectionId, tx.term, tx.seq],\n )\n\n if (alreadyApplied.length > 0) {\n return\n }\n\n const versionRows = await transactionDriver.query<{\n latest_row_version: number\n }>(\n `SELECT latest_row_version\n FROM collection_version\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n )\n const currentRowVersion = versionRows[0]?.latest_row_version ?? 0\n const nextRowVersion = Math.max(currentRowVersion + 1, tx.rowVersion)\n const replayDelta: ReplayableTxDelta<\n Record<string, unknown>,\n TKey\n > | null = tx.truncate\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 as Record<string, unknown>,\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 (tx.truncate) {\n await transactionDriver.run(`DELETE FROM ${collectionTableSql}`)\n await transactionDriver.run(`DELETE FROM ${tombstoneTableSql}`)\n }\n\n for (const mutation of tx.mutations) {\n const encodedKey = encodePersistedStorageKey(mutation.key)\n if (mutation.type === `delete`) {\n await transactionDriver.run(\n `DELETE FROM ${collectionTableSql}\n WHERE key = ?`,\n [encodedKey],\n )\n await transactionDriver.run(\n `INSERT INTO ${tombstoneTableSql} (key, value, row_version, deleted_at)\n VALUES (?, ?, ?, ?)\n ON CONFLICT(key) DO UPDATE SET\n value = excluded.value,\n row_version = excluded.row_version,\n deleted_at = excluded.deleted_at`,\n [\n encodedKey,\n serializePersistedRowValue(mutation.value),\n nextRowVersion,\n new Date().toISOString(),\n ],\n )\n continue\n }\n\n const existingRows = await transactionDriver.query<{\n value: string\n metadata: string | null\n }>(\n `SELECT value, metadata\n FROM ${collectionTableSql}\n WHERE key = ?\n LIMIT 1`,\n [encodedKey],\n )\n const existingValue = existingRows[0]?.value\n ? deserializePersistedRowValue(existingRows[0].value)\n : undefined\n const existingMetadata =\n existingRows[0]?.metadata != null\n ? deserializePersistedRowValue(existingRows[0].metadata)\n : undefined\n const mergedValue =\n mutation.type === `update`\n ? mergeObjectRows(existingValue, mutation.value)\n : mutation.value\n const nextMetadata =\n mutation.metadataChanged === true\n ? mutation.metadata\n : existingMetadata\n\n await transactionDriver.run(\n `INSERT INTO ${collectionTableSql} (key, value, metadata, row_version)\n VALUES (?, ?, ?, ?)\n ON CONFLICT(key) DO UPDATE SET\n value = excluded.value,\n metadata = excluded.metadata,\n row_version = excluded.row_version`,\n [\n encodedKey,\n serializePersistedRowValue(mergedValue),\n nextMetadata === undefined\n ? null\n : serializePersistedRowValue(nextMetadata),\n nextRowVersion,\n ],\n )\n await transactionDriver.run(\n `DELETE FROM ${tombstoneTableSql}\n WHERE key = ?`,\n [encodedKey],\n )\n }\n\n for (const rowMetadataMutation of tx.rowMetadataMutations ?? []) {\n const encodedKey = encodePersistedStorageKey(rowMetadataMutation.key)\n if (rowMetadataMutation.type === `delete`) {\n await transactionDriver.run(\n `UPDATE ${collectionTableSql}\n SET metadata = NULL\n WHERE key = ?`,\n [encodedKey],\n )\n } else {\n await transactionDriver.run(\n `UPDATE ${collectionTableSql}\n SET metadata = ?\n WHERE key = ?`,\n [\n rowMetadataMutation.value === undefined\n ? null\n : serializePersistedRowValue(rowMetadataMutation.value),\n encodedKey,\n ],\n )\n }\n }\n\n for (const metadataMutation of tx.collectionMetadataMutations ?? []) {\n if (metadataMutation.type === `delete`) {\n await transactionDriver.run(\n `DELETE FROM collection_metadata\n WHERE collection_id = ? AND key = ?`,\n [collectionId, metadataMutation.key],\n )\n } else {\n await transactionDriver.run(\n `INSERT INTO collection_metadata (collection_id, key, value, updated_at)\n VALUES (?, ?, ?, CAST(strftime('%s', 'now') AS INTEGER))\n ON CONFLICT(collection_id, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at`,\n [\n collectionId,\n metadataMutation.key,\n serializePersistedRowValue(metadataMutation.value),\n ],\n )\n }\n }\n\n await transactionDriver.run(\n `INSERT INTO collection_version (collection_id, latest_row_version)\n VALUES (?, ?)\n ON CONFLICT(collection_id) DO UPDATE SET\n latest_row_version = excluded.latest_row_version`,\n [collectionId, nextRowVersion],\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 tx.truncate ? 1 : 0,\n ],\n )\n\n await this.pruneAppliedTxRows(collectionId, transactionDriver)\n })\n }\n\n async loadCollectionMetadata(\n collectionId: string,\n ): Promise<Array<{ key: string; value: unknown }>> {\n const rows = await this.driver.query<{ key: string; value: string }>(\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 async scanRows(\n collectionId: string,\n options?: PersistedRowScanOptions,\n ): Promise<Array<PersistedScannedRow<T, TKey>>> {\n const tableMapping = await this.ensureCollectionReady(collectionId)\n const collectionTableSql = quoteIdentifier(tableMapping.tableName)\n\n const storedRows = await this.driver.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<TKey, T>(storedRows).map((row) => ({\n key: row.key,\n value: row.value,\n metadata: row.metadata,\n }))\n }\n\n async ensureIndex(\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 whereSql = spec.whereSql\n ? normalizeIndexSqlFragment(spec.whereSql)\n : undefined\n\n await this.runInTransaction(async (transactionDriver) => {\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 JSON.stringify(normalizedExpressionSql),\n whereSql ?? null,\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 async markIndexRemoved(\n collectionId: string,\n signature: string,\n ): Promise<void> {\n await this.ensureCollectionReady(collectionId)\n const rows = await this.driver.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 this.driver.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 this.driver.exec(\n `DROP INDEX IF EXISTS ${quoteIdentifier(indexName)}`,\n )\n }\n }\n\n async getStreamPosition(collectionId: string): Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }> {\n await this.ensureCollectionReady(collectionId)\n\n const [termRows, versionRows, seqRows] = await Promise.all([\n this.driver.query<{ latest_term: number }>(\n `SELECT latest_term\n FROM leader_term\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n ),\n this.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 this.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 latestRowVersion: versionRows[0]?.latest_row_version ?? 0,\n }\n }\n\n async pullSince(\n collectionId: string,\n fromRowVersion: number,\n ): Promise<SQLitePullSinceResult<TKey>> {\n const tableMapping = await this.ensureCollectionReady(collectionId)\n const collectionTableSql = quoteIdentifier(tableMapping.tableName)\n const tombstoneTableSql = quoteIdentifier(tableMapping.tombstoneTableName)\n\n const [changedRows, deletedRows, latestVersionRows, replayRows] =\n await Promise.all([\n this.driver.query<{ key: string }>(\n `SELECT key\n FROM ${collectionTableSql}\n WHERE row_version > ?`,\n [fromRowVersion],\n ),\n this.driver.query<{ key: string }>(\n `SELECT key\n FROM ${tombstoneTableSql}\n WHERE row_version > ?`,\n [fromRowVersion],\n ),\n this.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 this.driver.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 ])\n\n const latestRowVersion = latestVersionRows[0]?.latest_row_version ?? 0\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): TKey => {\n try {\n return decodePersistedStorageKey(encodedKey) as TKey\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<\n Record<string, unknown>,\n TKey\n > | null>(row.replay_json ?? `null`)\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 private async loadSubsetInternal(\n tableMapping: CollectionTableMapping,\n options: LoadSubsetOptions,\n ): Promise<Array<InMemoryRow<TKey, T>>> {\n const collectionTableSql = quoteIdentifier(tableMapping.tableName)\n const whereCompiled = options.where\n ? compileSqlExpression(options.where)\n : { supported: true, sql: ``, params: [] as Array<SqliteSupportedValue> }\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 (options.where && whereCompiled.supported) {\n sql = `${sql} WHERE ${whereCompiled.sql}`\n queryParams.push(...whereCompiled.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 const storedRows = await this.driver.query<StoredSqliteRow>(\n sql,\n queryParams,\n )\n const parsedRows = decodeStoredSqliteRows<TKey, T>(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<TKey, T>>,\n where: IR.BasicExpression<boolean> | undefined,\n ): Array<InMemoryRow<TKey, T>> {\n if (!where) {\n return rows\n }\n\n const evaluator = compileRowExpressionEvaluator(where)\n return rows.filter((row) =>\n toBooleanPredicate(\n evaluator(row.value as Record<string, unknown>) as boolean | null,\n ),\n )\n }\n\n private applyInMemoryOrderBy(\n rows: Array<InMemoryRow<TKey, T>>,\n orderBy: IR.OrderBy | undefined,\n ): Array<InMemoryRow<TKey, T>> {\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(\n left.value as Record<string, unknown>,\n )\n const rightValue = clause.evaluator(\n right.value as Record<string, unknown>,\n )\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<TKey, T>>,\n limit: number | undefined,\n offset: number | undefined,\n ): Array<InMemoryRow<TKey, T>> {\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 ): Promise<void> {\n if (!requiredIndexSignatures || requiredIndexSignatures.length === 0) {\n return\n }\n\n for (const signature of requiredIndexSignatures) {\n await this.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 ensureCollectionReadyInternal(\n collectionId: string,\n ): Promise<CollectionTableMapping> {\n const existingRows = 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 let tableName: string\n let tombstoneTableName: string\n\n if (existingRows.length > 0) {\n tableName = existingRows[0]!.table_name\n tombstoneTableName = existingRows[0]!.tombstone_table_name\n\n if (existingRows[0]!.schema_version !== this.schemaVersion) {\n await this.handleSchemaMismatch(\n collectionId,\n existingRows[0]!.schema_version,\n this.schemaVersion,\n tableName,\n tombstoneTableName,\n )\n }\n } else {\n tableName = createPersistedTableName(collectionId, `c`)\n 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 [collectionId, tableName, tombstoneTableName, this.schemaVersion],\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 (collection_id, latest_row_version)\n VALUES (?, 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\n const mapping = {\n tableName,\n tombstoneTableName,\n }\n this.collectionTableCache.set(collectionId, mapping)\n return mapping\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 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(`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 `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 (collection_id, latest_row_version)\n VALUES (?, 0)\n ON CONFLICT(collection_id) DO UPDATE SET\n latest_row_version = 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 )`,\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 T extends object,\n TKey extends string | number = string | number,\n>(options: SQLiteCoreAdapterOptions): PersistenceAdapter<T, TKey> {\n return new SQLiteCorePersistenceAdapter<T, TKey>(options)\n}\n"],"names":["InvalidPersistedCollectionConfigError","compileSingleRowExpression","decodePersistedStorageKey","hasBigIntValues","inLeftSql","createPersistedTableName","IR","encodePersistedStorageKey","InvalidPersistedStorageKeyEncodingError","toBooleanPredicate"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sqlite-core-adapter.cjs","sources":["../../src/sqlite-core-adapter.ts"],"sourcesContent":["import {\n IR,\n compileSingleRowExpression,\n toBooleanPredicate,\n} from '@tanstack/db'\nimport {\n InvalidPersistedCollectionConfigError,\n InvalidPersistedStorageKeyEncodingError,\n} from './errors'\nimport {\n createPersistedTableName,\n decodePersistedStorageKey,\n encodePersistedStorageKey,\n} from './persisted'\nimport type { LoadSubsetOptions } from '@tanstack/db'\nimport type {\n PersistedIndexSpec,\n PersistedRowScanOptions,\n PersistedScannedRow,\n PersistedTx,\n PersistenceAdapter,\n ReplayableTxDelta,\n SQLiteDriver,\n} from './persisted'\n\ntype SqliteSupportedValue = null | number | string\n\ntype CollectionTableMapping = {\n tableName: string\n tombstoneTableName: string\n}\n\ntype CompiledSqlFragment = {\n supported: boolean\n sql: string\n params: Array<SqliteSupportedValue>\n valueKind?: CompiledValueKind\n}\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`\n | `sync-absent-error`\n | `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\nconst DEFAULT_SCHEMA_VERSION = 1\nconst DEFAULT_PULL_SINCE_RELOAD_THRESHOLD = 128\nconst SQLITE_MAX_IN_BATCH_SIZE = 900\nconst SAFE_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/\nconst FORBIDDEN_SQL_FRAGMENT_PATTERN = /(;|--|\\/\\*)/\nconst PERSISTED_TYPE_TAG = `__tanstack_db_persisted_type__`\nconst PERSISTED_VALUE_TAG = `value`\n\ntype CompiledValueKind = `unknown` | `bigint` | `date` | `datetime`\ntype PersistedTaggedValueType =\n | `bigint`\n | `date`\n | `nan`\n | `infinity`\n | `-infinity`\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])\n\nconst orderByObjectIds = new WeakMap<object, number>()\nlet nextOrderByObjectId = 1\n\nfunction isDuplicateColumnAddError(\n error: unknown,\n columnName: string,\n): boolean {\n if (!(error instanceof Error)) {\n return false\n }\n\n const message = error.message.toLowerCase()\n const normalizedColumnName = columnName.toLowerCase()\n return (\n (message.includes(`duplicate column name`) &&\n message.includes(normalizedColumnName)) ||\n (message.includes(`already exists`) &&\n message.includes(normalizedColumnName))\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 {\n [PERSISTED_TYPE_TAG]: `bigint`,\n [PERSISTED_VALUE_TAG]: value.toString(),\n } satisfies PersistedTaggedValue\n }\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 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 `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 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 return 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 return `'${value.replace(/'/g, `''`)}'`\n}\n\nfunction inlineSqlParams(\n sql: string,\n params: ReadonlyArray<SqliteSupportedValue>,\n): string {\n let index = 0\n const inlinedSql = sql.replace(/\\?/g, () => {\n const paramValue = params[index]\n index++\n return toSqliteLiteral(paramValue ?? null)\n })\n\n if (index !== params.length) {\n throw new InvalidPersistedCollectionConfigError(\n `Unable to inline SQL params; placeholder count did not match provided params`,\n )\n }\n\n return inlinedSql\n}\n\ntype CompiledRowExpressionEvaluator = (row: Record<string, unknown>) => unknown\n\nfunction collectAliasQualifiedRefSegments(\n expression: IR.BasicExpression,\n segments: Set<string> = new Set<string>(),\n): Set<string> {\n if (expression.type === `ref`) {\n if (expression.path.length > 1) {\n const rootSegment = String(expression.path[0])\n if (rootSegment.length > 0) {\n segments.add(rootSegment)\n }\n }\n return segments\n }\n\n if (expression.type === `func`) {\n for (const arg of expression.args) {\n collectAliasQualifiedRefSegments(arg, segments)\n }\n }\n\n return segments\n}\n\nfunction createAliasAwareRowProxy(\n row: Record<string, unknown>,\n aliasSegments: ReadonlySet<string>,\n): Record<string, unknown> {\n return new Proxy(row, {\n get(target, prop, receiver) {\n if (typeof prop !== `string`) {\n return Reflect.get(target, prop, receiver)\n }\n\n if (Object.prototype.hasOwnProperty.call(target, prop)) {\n const value = Reflect.get(target, prop, receiver)\n if (value !== undefined || !aliasSegments.has(prop)) {\n return value\n }\n\n return target\n }\n\n if (aliasSegments.has(prop)) {\n return target\n }\n\n return undefined\n },\n })\n}\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\n const aliasSegments = collectAliasQualifiedRefSegments(expression)\n if (aliasSegments.size === 0) {\n return (row) => baseEvaluator(row)\n }\n\n const proxyCache = new WeakMap<\n Record<string, unknown>,\n Record<string, unknown>\n >()\n return (row) => {\n let proxy = proxyCache.get(row)\n if (!proxy) {\n proxy = createAliasAwareRowProxy(row, aliasSegments)\n proxyCache.set(row, proxy)\n }\n return baseEvaluator(proxy)\n }\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 === `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 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\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 leftSql: string,\n rightSql: string,\n valueKind: CompiledValueKind,\n): string {\n if (valueKind === `bigint`) {\n return `(CAST(${leftSql} AS NUMERIC) ${operator} CAST(${rightSql} AS NUMERIC))`\n }\n if (valueKind === `date`) {\n return `(date(${leftSql}) ${operator} date(${rightSql}))`\n }\n if (valueKind === `datetime`) {\n return `(datetime(${leftSql}) ${operator} datetime(${rightSql}))`\n }\n return `(${leftSql} ${operator} ${rightSql})`\n}\n\nfunction compileRefExpressionSql(jsonPath: string): CompiledSqlFragment {\n const typePath = `${jsonPath}.${PERSISTED_TYPE_TAG}`\n const taggedValuePath = `${jsonPath}.${PERSISTED_VALUE_TAG}`\n\n return {\n supported: true,\n sql: `(CASE json_extract(value, ?)\n WHEN 'bigint' THEN CAST(json_extract(value, ?) AS NUMERIC)\n WHEN 'date' THEN json_extract(value, ?)\n WHEN 'nan' THEN NULL\n WHEN 'infinity' THEN NULL\n WHEN '-infinity' THEN NULL\n ELSE json_extract(value, ?)\n END)`,\n params: [typePath, taggedValuePath, taggedValuePath, jsonPath],\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\nfunction compileSqlExpression(\n expression: IR.BasicExpression,\n): CompiledSqlFragment {\n if (expression.type === `val`) {\n const valueKind = getLiteralValueKind(expression.value)\n return {\n supported: true,\n sql: `?`,\n params: [toSqliteParameterValue(expression.value)],\n valueKind,\n }\n }\n\n if (expression.type === `ref`) {\n const jsonPath = createJsonPath(expression.path.map(String))\n if (!jsonPath) {\n return {\n supported: false,\n sql: ``,\n params: [],\n }\n }\n\n return compileRefExpressionSql(jsonPath)\n }\n\n const compiledArgs = expression.args.map((arg) => compileSqlExpression(arg))\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 return {\n supported: true,\n sql: compileComparisonSql(\n operatorByName[expression.name],\n argSql[0],\n argSql[1],\n valueKind,\n ),\n params,\n }\n }\n case `and`: {\n if (argSql.length < 2) {\n return { supported: false, sql: ``, params: [] }\n }\n return {\n supported: true,\n sql: argSql.map((sql) => `(${sql})`).join(` AND `),\n params,\n }\n }\n case `or`: {\n if (argSql.length < 2) {\n return { supported: false, sql: ``, params: [] }\n }\n return {\n supported: true,\n sql: argSql.map((sql) => `(${sql})`).join(` 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 if (listValue.length > SQLITE_MAX_IN_BATCH_SIZE) {\n const hasBigIntValues = listValue.some(\n (value) => typeof value === `bigint`,\n )\n const inLeftSql = hasBigIntValues\n ? `CAST(${leftSql} AS NUMERIC)`\n : leftSql\n const chunkClauses: Array<string> = []\n const batchedParams: Array<SqliteSupportedValue> = []\n\n for (\n let startIndex = 0;\n startIndex < listValue.length;\n startIndex += SQLITE_MAX_IN_BATCH_SIZE\n ) {\n const chunkValues = listValue.slice(\n startIndex,\n startIndex + SQLITE_MAX_IN_BATCH_SIZE,\n )\n chunkClauses.push(\n `(${inLeftSql} IN (${chunkValues.map(() => `?`).join(`, `)}))`,\n )\n batchedParams.push(...leftParams)\n batchedParams.push(\n ...chunkValues.map((value) => toSqliteParameterValue(value)),\n )\n }\n\n return {\n supported: true,\n sql: `(${chunkClauses.join(` OR `)})`,\n params: batchedParams,\n }\n }\n\n const hasBigIntValues = listValue.some(\n (value) => typeof value === `bigint`,\n )\n const inLeftSql = hasBigIntValues\n ? `CAST(${leftSql} AS NUMERIC)`\n : leftSql\n const listPlaceholders = listValue.map(() => `?`).join(`, `)\n return {\n supported: true,\n sql: `(${inLeftSql} IN (${listPlaceholders}))`,\n params: [\n ...leftParams,\n ...listValue.map((value) => toSqliteParameterValue(value)),\n ],\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 { supported: true, sql: `COALESCE(${argSql.join(`, `)})`, params }\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\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(clause.expression)\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 }\n\n if (candidate.type === `val`) {\n return Object.prototype.hasOwnProperty.call(candidate, `value`)\n }\n\n if (candidate.type === `ref`) {\n return Array.isArray(candidate.path)\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 if (hasParsedJson && isExpressionLikeShape(parsedJson)) {\n const compiled = compileSqlExpression(parsedJson)\n if (!compiled.supported) {\n throw new InvalidPersistedCollectionConfigError(\n `Persisted index expression is not supported by the SQLite compiler`,\n )\n }\n return inlineSqlParams(compiled.sql, compiled.params)\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 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 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\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 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.driver = options.driver\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 }\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 async 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 const tableMapping = await this.ensureCollectionReady(collectionId)\n await this.touchRequiredIndexes(collectionId, ctx?.requiredIndexSignatures)\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(tableMapping, whereCurrentOptions),\n this.loadSubsetInternal(tableMapping, whereFromOptions),\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(tableMapping, options)\n return rows.map((row) => ({\n key: row.key,\n value: row.value,\n metadata: row.metadata,\n }))\n }\n\n async applyCommittedTx(collectionId: string, tx: PersistedTx): 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 alreadyApplied = await transactionDriver.query<{ applied: number }>(\n `SELECT 1 AS applied\n FROM applied_tx\n WHERE collection_id = ? AND term = ? AND seq = ?\n LIMIT 1`,\n [collectionId, tx.term, tx.seq],\n )\n\n if (alreadyApplied.length > 0) {\n return\n }\n\n const versionRows = await transactionDriver.query<{\n latest_row_version: number\n }>(\n `SELECT latest_row_version\n FROM collection_version\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n )\n const currentRowVersion = versionRows[0]?.latest_row_version ?? 0\n const nextRowVersion = Math.max(currentRowVersion + 1, tx.rowVersion)\n const replayDelta: ReplayableTxDelta | null = tx.truncate\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 (tx.truncate) {\n await transactionDriver.run(`DELETE FROM ${collectionTableSql}`)\n await transactionDriver.run(`DELETE FROM ${tombstoneTableSql}`)\n }\n\n for (const mutation of tx.mutations) {\n const encodedKey = encodePersistedStorageKey(mutation.key)\n if (mutation.type === `delete`) {\n await transactionDriver.run(\n `DELETE FROM ${collectionTableSql}\n WHERE key = ?`,\n [encodedKey],\n )\n await transactionDriver.run(\n `INSERT INTO ${tombstoneTableSql} (key, value, row_version, deleted_at)\n VALUES (?, ?, ?, ?)\n ON CONFLICT(key) DO UPDATE SET\n value = excluded.value,\n row_version = excluded.row_version,\n deleted_at = excluded.deleted_at`,\n [\n encodedKey,\n serializePersistedRowValue(mutation.value),\n nextRowVersion,\n new Date().toISOString(),\n ],\n )\n continue\n }\n\n const existingRows = await transactionDriver.query<{\n value: string\n metadata: string | null\n }>(\n `SELECT value, metadata\n FROM ${collectionTableSql}\n WHERE key = ?\n LIMIT 1`,\n [encodedKey],\n )\n const existingValue = existingRows[0]?.value\n ? deserializePersistedRowValue(existingRows[0].value)\n : undefined\n const existingMetadata =\n existingRows[0]?.metadata != null\n ? deserializePersistedRowValue(existingRows[0].metadata)\n : undefined\n const mergedValue =\n mutation.type === `update`\n ? mergeObjectRows(existingValue, mutation.value)\n : mutation.value\n const nextMetadata =\n mutation.metadataChanged === true\n ? mutation.metadata\n : existingMetadata\n\n await transactionDriver.run(\n `INSERT INTO ${collectionTableSql} (key, value, metadata, row_version)\n VALUES (?, ?, ?, ?)\n ON CONFLICT(key) DO UPDATE SET\n value = excluded.value,\n metadata = excluded.metadata,\n row_version = excluded.row_version`,\n [\n encodedKey,\n serializePersistedRowValue(mergedValue),\n nextMetadata === undefined\n ? null\n : serializePersistedRowValue(nextMetadata),\n nextRowVersion,\n ],\n )\n await transactionDriver.run(\n `DELETE FROM ${tombstoneTableSql}\n WHERE key = ?`,\n [encodedKey],\n )\n }\n\n for (const rowMetadataMutation of tx.rowMetadataMutations ?? []) {\n const encodedKey = encodePersistedStorageKey(rowMetadataMutation.key)\n if (rowMetadataMutation.type === `delete`) {\n await transactionDriver.run(\n `UPDATE ${collectionTableSql}\n SET metadata = NULL\n WHERE key = ?`,\n [encodedKey],\n )\n } else {\n await transactionDriver.run(\n `UPDATE ${collectionTableSql}\n SET metadata = ?\n WHERE key = ?`,\n [\n rowMetadataMutation.value === undefined\n ? null\n : serializePersistedRowValue(rowMetadataMutation.value),\n encodedKey,\n ],\n )\n }\n }\n\n for (const metadataMutation of tx.collectionMetadataMutations ?? []) {\n if (metadataMutation.type === `delete`) {\n await transactionDriver.run(\n `DELETE FROM collection_metadata\n WHERE collection_id = ? AND key = ?`,\n [collectionId, metadataMutation.key],\n )\n } else {\n await transactionDriver.run(\n `INSERT INTO collection_metadata (collection_id, key, value, updated_at)\n VALUES (?, ?, ?, CAST(strftime('%s', 'now') AS INTEGER))\n ON CONFLICT(collection_id, key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at`,\n [\n collectionId,\n metadataMutation.key,\n serializePersistedRowValue(metadataMutation.value),\n ],\n )\n }\n }\n\n await transactionDriver.run(\n `INSERT INTO collection_version (collection_id, latest_row_version)\n VALUES (?, ?)\n ON CONFLICT(collection_id) DO UPDATE SET\n latest_row_version = excluded.latest_row_version`,\n [collectionId, nextRowVersion],\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 tx.truncate ? 1 : 0,\n ],\n )\n\n await this.pruneAppliedTxRows(collectionId, transactionDriver)\n })\n }\n\n async loadCollectionMetadata(\n collectionId: string,\n ): Promise<Array<{ key: string; value: unknown }>> {\n const rows = await this.driver.query<{ key: string; value: string }>(\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 async scanRows(\n collectionId: string,\n options?: PersistedRowScanOptions,\n ): Promise<Array<PersistedScannedRow>> {\n const tableMapping = await this.ensureCollectionReady(collectionId)\n const collectionTableSql = quoteIdentifier(tableMapping.tableName)\n\n const storedRows = await this.driver.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 async ensureIndex(\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 whereSql = spec.whereSql\n ? normalizeIndexSqlFragment(spec.whereSql)\n : undefined\n\n await this.runInTransaction(async (transactionDriver) => {\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 JSON.stringify(normalizedExpressionSql),\n whereSql ?? null,\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 async markIndexRemoved(\n collectionId: string,\n signature: string,\n ): Promise<void> {\n await this.ensureCollectionReady(collectionId)\n const rows = await this.driver.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 this.driver.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 this.driver.exec(\n `DROP INDEX IF EXISTS ${quoteIdentifier(indexName)}`,\n )\n }\n }\n\n async getStreamPosition(collectionId: string): Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }> {\n await this.ensureCollectionReady(collectionId)\n\n const [termRows, versionRows, seqRows] = await Promise.all([\n this.driver.query<{ latest_term: number }>(\n `SELECT latest_term\n FROM leader_term\n WHERE collection_id = ?\n LIMIT 1`,\n [collectionId],\n ),\n this.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 this.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 latestRowVersion: versionRows[0]?.latest_row_version ?? 0,\n }\n }\n\n async pullSince(\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 const [changedRows, deletedRows, latestVersionRows, replayRows] =\n await Promise.all([\n this.driver.query<{ key: string }>(\n `SELECT key\n FROM ${collectionTableSql}\n WHERE row_version > ?`,\n [fromRowVersion],\n ),\n this.driver.query<{ key: string }>(\n `SELECT key\n FROM ${tombstoneTableSql}\n WHERE row_version > ?`,\n [fromRowVersion],\n ),\n this.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 this.driver.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 ])\n\n const latestRowVersion = latestVersionRows[0]?.latest_row_version ?? 0\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 private async loadSubsetInternal(\n tableMapping: CollectionTableMapping,\n options: LoadSubsetOptions,\n ): Promise<Array<InMemoryRow<string | number, Record<string, unknown>>>> {\n const collectionTableSql = quoteIdentifier(tableMapping.tableName)\n const whereCompiled = options.where\n ? compileSqlExpression(options.where)\n : { supported: true, sql: ``, params: [] as Array<SqliteSupportedValue> }\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 (options.where && whereCompiled.supported) {\n sql = `${sql} WHERE ${whereCompiled.sql}`\n queryParams.push(...whereCompiled.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 const storedRows = await this.driver.query<StoredSqliteRow>(\n sql,\n queryParams,\n )\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 ): Promise<void> {\n if (!requiredIndexSignatures || requiredIndexSignatures.length === 0) {\n return\n }\n\n for (const signature of requiredIndexSignatures) {\n await this.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 ensureCollectionReadyInternal(\n collectionId: string,\n ): Promise<CollectionTableMapping> {\n const existingRows = 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 let tableName: string\n let tombstoneTableName: string\n\n if (existingRows.length > 0) {\n tableName = existingRows[0]!.table_name\n tombstoneTableName = existingRows[0]!.tombstone_table_name\n\n if (existingRows[0]!.schema_version !== this.schemaVersion) {\n await this.handleSchemaMismatch(\n collectionId,\n existingRows[0]!.schema_version,\n this.schemaVersion,\n tableName,\n tombstoneTableName,\n )\n }\n } else {\n tableName = createPersistedTableName(collectionId, `c`)\n 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 [collectionId, tableName, tombstoneTableName, this.schemaVersion],\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 (collection_id, latest_row_version)\n VALUES (?, 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\n const mapping = {\n tableName,\n tombstoneTableName,\n }\n this.collectionTableCache.set(collectionId, mapping)\n return mapping\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 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(`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 `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 (collection_id, latest_row_version)\n VALUES (?, 0)\n ON CONFLICT(collection_id) DO UPDATE SET\n latest_row_version = 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 )`,\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":["InvalidPersistedCollectionConfigError","compileSingleRowExpression","decodePersistedStorageKey","hasBigIntValues","inLeftSql","createPersistedTableName","IR","encodePersistedStorageKey","InvalidPersistedStorageKeyEncodingError","toBooleanPredicate"],"mappings":"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"}
|