@tanstack/db-sqlite-persistence-core 0.2.19 → 0.2.21
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 +31 -34
- package/dist/cjs/persisted.cjs.map +1 -1
- package/dist/esm/persisted.js +31 -34
- package/dist/esm/persisted.js.map +1 -1
- package/package.json +2 -2
- package/src/persisted.ts +48 -36
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persisted.cjs","sources":["../../src/persisted.ts"],"sourcesContent":["import {\n SyncTransactionAbortedError,\n compileSingleRowExpression,\n safeRandomUUID,\n toBooleanPredicate,\n withCollectionConfigFactory,\n} from '@tanstack/db'\nimport {\n InvalidPersistedCollectionConfigError,\n InvalidPersistedCollectionCoordinatorError,\n InvalidPersistedStorageKeyEncodingError,\n InvalidPersistedStorageKeyError,\n InvalidPersistenceAdapterError,\n InvalidSyncConfigError,\n} from './errors'\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\nimport type {\n ChangeMessageOrDeleteKeyMessage,\n Collection,\n CollectionConfig,\n CollectionIndexMetadata,\n DeleteMutationFnParams,\n InsertMutationFnParams,\n LoadSubsetOptions,\n PendingMutation,\n SyncAppliedReceipt,\n SyncConfig,\n SyncConfigRes,\n SyncMetadataApi,\n UpdateMutationFnParams,\n UtilsRecord,\n} from '@tanstack/db'\n\nexport type PersistedMutationEnvelope =\n | {\n mutationId: string\n type: `insert`\n key: string | number\n value: Record<string, unknown>\n }\n | {\n mutationId: string\n type: `update`\n key: string | number\n value: Record<string, unknown>\n }\n | {\n mutationId: string\n type: `delete`\n key: string | number\n value: Record<string, unknown>\n }\n\nexport type ProtocolEnvelope<TPayload> = {\n v: 1\n dbName: string\n collectionId: string\n senderId: string\n ts: number\n payload: TPayload\n}\n\nexport type LeaderHeartbeat = {\n type: `leader:heartbeat`\n term: number\n leaderId: string\n latestSeq: number\n latestRowVersion: number\n}\n\nexport type TxCommitted = {\n type: `tx:committed`\n term: number\n seq: number\n txId: string\n latestRowVersion: number\n} & (\n | {\n requiresFullReload: true\n }\n | {\n requiresFullReload: false\n changedRows: Array<{\n key: string | number\n value: Record<string, unknown>\n }>\n deletedKeys: Array<string | number>\n rowMetadataMutations?: Array<\n PersistedRowMetadataMutation<string | number>\n >\n collectionMetadataMutations?: Array<PersistedCollectionMetadataMutation>\n }\n)\n\nexport type EnsureRemoteSubsetRequest = {\n type: `rpc:ensureRemoteSubset:req`\n rpcId: string\n options: LoadSubsetOptions\n}\n\nexport type EnsureRemoteSubsetResponse =\n | {\n type: `rpc:ensureRemoteSubset:res`\n rpcId: string\n ok: true\n }\n | {\n type: `rpc:ensureRemoteSubset:res`\n rpcId: string\n ok: false\n error: string\n }\n\nexport type ApplyLocalMutationsRequest = {\n type: `rpc:applyLocalMutations:req`\n rpcId: string\n envelopeId: string\n mutations: Array<PersistedMutationEnvelope>\n}\n\nexport type ApplyLocalMutationsResponse =\n | {\n type: `rpc:applyLocalMutations:res`\n rpcId: string\n ok: true\n term: number\n seq: number\n latestRowVersion: number\n acceptedMutationIds: Array<string>\n }\n | {\n type: `rpc:applyLocalMutations:res`\n rpcId: string\n ok: false\n code: `NOT_LEADER` | `VALIDATION_ERROR` | `CONFLICT` | `TIMEOUT`\n error: string\n }\n\nexport type PullSinceRequest = {\n type: `rpc:pullSince:req`\n rpcId: string\n fromRowVersion: number\n}\n\nexport type PullSinceResponse =\n | {\n type: `rpc:pullSince:res`\n rpcId: string\n ok: true\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n requiresFullReload: true\n }\n | {\n type: `rpc:pullSince:res`\n rpcId: string\n ok: true\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n requiresFullReload: false\n changedKeys: Array<string | number>\n deletedKeys: Array<string | number>\n deltas?: Array<\n ReplayableTxDelta<Record<string, unknown>, string | number>\n >\n }\n | {\n type: `rpc:pullSince:res`\n rpcId: string\n ok: false\n error: string\n }\n\nexport type CollectionReset = {\n type: `collection:reset`\n schemaVersion: number\n resetEpoch: number\n}\n\nexport interface PersistedIndexSpec {\n readonly expressionSql: ReadonlyArray<string>\n readonly whereSql?: string\n readonly metadata?: Readonly<Record<string, unknown>>\n}\n\nexport type PersistedRowMetadataMutation<\n TKey extends string | number = string | number,\n> = { type: `set`; key: TKey; value: unknown } | { type: `delete`; key: TKey }\n\nexport type PersistedCollectionMetadataMutation =\n | { type: `set`; key: string; value: unknown }\n | { type: `delete`; key: string }\n\nexport type ReplayableTxDelta<\n T extends Record<string, unknown> = Record<string, unknown>,\n TKey extends string | number = string | number,\n> = {\n txId: string\n latestRowVersion: number\n changedRows: Array<{ key: TKey; value: T }>\n deletedKeys: Array<TKey>\n rowMetadataMutations: Array<PersistedRowMetadataMutation<TKey>>\n collectionMetadataMutations: Array<PersistedCollectionMetadataMutation>\n}\n\nexport type PersistedScannedRow<\n T extends object = Record<string, unknown>,\n TKey extends string | number = string | number,\n> = {\n key: TKey\n value: T\n metadata?: unknown\n}\n\nexport type PersistedRowScanOptions = {\n metadataOnly?: boolean\n}\n\nexport type PersistedTx<\n T extends object = Record<string, unknown>,\n TKey extends string | number = string | number,\n> = {\n txId: string\n term: number\n seq: number\n rowVersion: number\n truncate?: boolean\n mutations: Array<\n | {\n type: `insert`\n key: TKey\n value: T\n metadata?: unknown\n metadataChanged?: boolean\n }\n | {\n type: `update`\n key: TKey\n value: T\n metadata?: unknown\n metadataChanged?: boolean\n }\n | { type: `delete`; key: TKey; value: T }\n >\n rowMetadataMutations?: Array<PersistedRowMetadataMutation<TKey>>\n collectionMetadataMutations?: Array<PersistedCollectionMetadataMutation>\n}\n\nexport interface PersistenceAdapter {\n loadSubset: (\n collectionId: string,\n options: LoadSubsetOptions,\n ctx?: { requiredIndexSignatures?: ReadonlyArray<string> },\n ) => Promise<\n Array<{\n key: string | number\n value: Record<string, unknown>\n metadata?: unknown\n }>\n >\n applyCommittedTx: (collectionId: string, tx: PersistedTx) => Promise<void>\n loadCollectionMetadata?: (\n collectionId: string,\n ) => Promise<Array<{ key: string; value: unknown }>>\n scanRows?: (\n collectionId: string,\n options?: PersistedRowScanOptions,\n ) => Promise<Array<PersistedScannedRow>>\n ensureIndex: (\n collectionId: string,\n signature: string,\n spec: PersistedIndexSpec,\n ) => Promise<void>\n markIndexRemoved?: (collectionId: string, signature: string) => Promise<void>\n getStreamPosition?: (collectionId: string) => Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }>\n}\n\nexport interface SQLiteDriver {\n exec: (sql: string) => Promise<void>\n query: <T>(\n sql: string,\n params?: ReadonlyArray<unknown>,\n ) => Promise<ReadonlyArray<T>>\n run: (sql: string, params?: ReadonlyArray<unknown>) => Promise<void>\n transaction: <T>(\n fn: (transactionDriver: SQLiteDriver) => Promise<T>,\n ) => Promise<T>\n transactionWithDriver?: <T>(\n fn: (transactionDriver: SQLiteDriver) => Promise<T>,\n ) => Promise<T>\n}\n\nexport interface PersistedCollectionCoordinator {\n getNodeId: () => string\n subscribe: (\n collectionId: string,\n onMessage: (message: ProtocolEnvelope<unknown>) => void,\n ) => () => void\n publish: (collectionId: string, message: ProtocolEnvelope<unknown>) => void\n isLeader: (collectionId: string) => boolean\n ensureLeadership: (collectionId: string) => Promise<void>\n requestEnsureRemoteSubset?: (\n collectionId: string,\n options: LoadSubsetOptions,\n ) => Promise<void>\n requestEnsurePersistedIndex: (\n collectionId: string,\n signature: string,\n spec: PersistedIndexSpec,\n ) => Promise<void>\n requestApplyLocalMutations?: (\n collectionId: string,\n mutations: Array<PersistedMutationEnvelope>,\n ) => Promise<ApplyLocalMutationsResponse>\n pullSince?: (\n collectionId: string,\n fromRowVersion: number,\n ) => Promise<PullSinceResponse>\n}\n\nexport interface PersistedCollectionPersistence {\n adapter: PersistenceAdapter\n coordinator?: PersistedCollectionCoordinator\n resolvePersistenceForCollection?: (options: {\n collectionId: string\n mode: PersistedCollectionMode\n schemaVersion?: number\n }) => PersistedCollectionPersistence\n resolvePersistenceForMode?: (\n mode: PersistedCollectionMode,\n ) => PersistedCollectionPersistence\n}\n\ntype PersistedResolvedPersistence = PersistedCollectionPersistence & {\n coordinator: PersistedCollectionCoordinator\n}\n\nexport type PersistedCollectionLeadershipState = {\n nodeId: string\n isLeader: boolean\n}\n\nexport interface PersistedCollectionUtils extends UtilsRecord {\n acceptMutations: (transaction: {\n mutations: Array<PendingMutation<Record<string, unknown>>>\n }) => Promise<void> | void\n getLeadershipState?: () => PersistedCollectionLeadershipState\n forceReloadSubset?: (options: LoadSubsetOptions) => Promise<void> | void\n}\n\nexport type PersistedSyncWrappedOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n> = CollectionConfig<T, TKey, TSchema, TUtils> & {\n sync: SyncConfig<T, TKey>\n persistence: PersistedCollectionPersistence\n schemaVersion?: number\n}\n\nexport type PersistedLocalOnlyOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n> = Omit<CollectionConfig<T, TKey, TSchema, TUtils>, `sync`> & {\n persistence: PersistedCollectionPersistence\n schemaVersion?: number\n}\n\ntype PersistedSyncOptionsResult<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TUtils extends UtilsRecord,\n> = CollectionConfig<T, TKey, TSchema, TUtils> & {\n persistence: PersistedResolvedPersistence\n}\n\ntype PersistedLocalOnlyOptionsResult<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TUtils extends UtilsRecord,\n> = CollectionConfig<T, TKey, TSchema, TUtils & PersistedCollectionUtils> & {\n id: string\n persistence: PersistedResolvedPersistence\n utils: TUtils & PersistedCollectionUtils\n}\n\nconst REQUIRED_COORDINATOR_METHODS: ReadonlyArray<\n keyof Pick<\n PersistedCollectionCoordinator,\n | `getNodeId`\n | `subscribe`\n | `publish`\n | `isLeader`\n | `ensureLeadership`\n | `requestEnsurePersistedIndex`\n >\n> = [\n `getNodeId`,\n `subscribe`,\n `publish`,\n `isLeader`,\n `ensureLeadership`,\n `requestEnsurePersistedIndex`,\n]\n\nconst REQUIRED_ADAPTER_METHODS: ReadonlyArray<\n keyof Pick<\n PersistenceAdapter,\n `loadSubset` | `applyCommittedTx` | `ensureIndex`\n >\n> = [`loadSubset`, `applyCommittedTx`, `ensureIndex`]\n\nconst TARGETED_INVALIDATION_KEY_LIMIT = 128\nconst DEFAULT_DB_NAME = `tanstack-db`\nconst REMOTE_ENSURE_RETRY_DELAY_MS = 50\n\ntype SyncControlFns<T extends object, TKey extends string | number> = {\n begin: ((options?: { immediate?: boolean }) => void) | null\n write:\n | ((\n message:\n | { type: `insert`; value: T; metadata?: Record<string, unknown> }\n | { type: `update`; value: T; metadata?: Record<string, unknown> }\n | { type: `delete`; key: TKey },\n ) => void)\n | null\n commit: ((signal?: AbortSignal) => SyncAppliedReceipt) | null\n truncate: (() => void) | null\n metadata: SyncMetadataApi<TKey> | null\n}\n\n/**\n * Phase-0 coordinator implementation for single-process runtimes.\n * It satisfies the coordinator contract without cross-process transport.\n */\nexport class SingleProcessCoordinator implements PersistedCollectionCoordinator {\n private readonly nodeId: string\n\n constructor(nodeId: string = safeRandomUUID()) {\n this.nodeId = nodeId\n }\n\n public getNodeId(): string {\n return this.nodeId\n }\n\n public subscribe(): () => void {\n return () => {}\n }\n\n public publish(): void {}\n\n public isLeader(): boolean {\n return true\n }\n\n public async ensureLeadership(): Promise<void> {}\n\n public async requestEnsureRemoteSubset(): Promise<void> {}\n\n public async requestEnsurePersistedIndex(): Promise<void> {}\n\n public pullSince(): Promise<PullSinceResponse> {\n return Promise.resolve({\n type: `rpc:pullSince:res`,\n rpcId: safeRandomUUID(),\n ok: true,\n latestTerm: 1,\n latestSeq: 0,\n latestRowVersion: 0,\n requiresFullReload: false,\n changedKeys: [],\n deletedKeys: [],\n deltas: [],\n })\n }\n}\n\nexport function validatePersistedCollectionCoordinator(\n coordinator: PersistedCollectionCoordinator,\n): void {\n for (const method of REQUIRED_COORDINATOR_METHODS) {\n if (typeof coordinator[method] !== `function`) {\n throw new InvalidPersistedCollectionCoordinatorError(method)\n }\n }\n}\n\nfunction validatePersistenceAdapter(adapter: PersistenceAdapter): void {\n for (const method of REQUIRED_ADAPTER_METHODS) {\n if (typeof adapter[method] !== `function`) {\n throw new InvalidPersistenceAdapterError(method)\n }\n }\n}\n\nfunction resolvePersistence(\n persistence: PersistedCollectionPersistence,\n): PersistedResolvedPersistence {\n validatePersistenceAdapter(persistence.adapter)\n\n const coordinator = persistence.coordinator ?? new SingleProcessCoordinator()\n validatePersistedCollectionCoordinator(coordinator)\n\n return {\n ...persistence,\n coordinator,\n }\n}\n\nfunction resolvePersistenceForMode(\n persistence: PersistedCollectionPersistence,\n mode: PersistedCollectionMode,\n): PersistedResolvedPersistence {\n const modeSpecificPersistence = persistence.resolvePersistenceForMode?.(mode)\n return resolvePersistence(modeSpecificPersistence ?? persistence)\n}\n\nfunction resolvePersistenceForCollection(\n persistence: PersistedCollectionPersistence,\n options: {\n collectionId: string\n mode: PersistedCollectionMode\n schemaVersion?: number\n },\n): PersistedResolvedPersistence {\n const collectionSpecificPersistence =\n persistence.resolvePersistenceForCollection?.(options)\n if (collectionSpecificPersistence) {\n return resolvePersistence(collectionSpecificPersistence)\n }\n\n return resolvePersistenceForMode(persistence, options.mode)\n}\n\nfunction hasOwnSyncKey(options: object): options is { sync: unknown } {\n return Object.prototype.hasOwnProperty.call(options, `sync`)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === `object` && value !== null\n}\n\nfunction isValidSyncConfig(value: unknown): value is SyncConfig<object> {\n if (!isRecord(value)) {\n return false\n }\n\n return typeof value.sync === `function`\n}\n\nexport type PersistedCollectionMode = `sync-present` | `sync-absent`\ntype PersistedMode = PersistedCollectionMode\n\ntype NormalizedSyncOperation<T extends object, TKey extends string | number> =\n | {\n type: `update`\n key: TKey\n value: T\n metadata?: Record<string, unknown>\n }\n | {\n type: `delete`\n key: TKey\n value: T\n }\n\ntype BufferedSyncTransaction<T extends object, TKey extends string | number> = {\n operations: Array<NormalizedSyncOperation<T, TKey>>\n rowMetadataWrites: Map<\n TKey,\n { type: `set`; value: unknown } | { type: `delete` }\n >\n collectionMetadataWrites: Map<\n string,\n { type: `set`; value: unknown } | { type: `delete` }\n >\n truncate: boolean\n internal: boolean\n signal?: AbortSignal\n resolveApplied?: () => void\n rejectApplied?: (error: unknown) => void\n}\n\ntype OpenSyncTransaction<\n T extends object,\n TKey extends string | number,\n> = BufferedSyncTransaction<T, TKey> & {\n queuedBecauseHydrating: boolean\n}\n\ntype SyncWriteNormalization<T extends object, TKey extends string | number> = {\n forwardMessage:\n | {\n type: `update`\n value: T\n metadata?: Record<string, unknown>\n }\n | {\n type: `delete`\n key: TKey\n }\n operation: NormalizedSyncOperation<T, TKey>\n}\n\nclass ApplyMutex {\n private queue: Promise<void> = Promise.resolve()\n\n async run<T>(task: () => Promise<T>): Promise<T> {\n const taskPromise = this.queue.then(() => task())\n this.queue = taskPromise.then(\n () => undefined,\n () => undefined,\n )\n return taskPromise\n }\n}\n\nfunction toStableSerializable(value: unknown): unknown {\n if (value == null) {\n return value\n }\n\n switch (typeof value) {\n case `string`:\n case `number`:\n case `boolean`:\n return value\n case `bigint`:\n return value.toString()\n case `function`:\n case `symbol`:\n case `undefined`:\n return undefined\n }\n\n if (value instanceof Date) {\n return value.toISOString()\n }\n\n if (Array.isArray(value)) {\n return value\n .map((entry) => toStableSerializable(entry))\n .filter((entry) => entry !== undefined)\n }\n\n if (value instanceof Set) {\n return Array.from(value)\n .map((entry) => toStableSerializable(entry))\n .filter((entry) => entry !== undefined)\n .sort((left, right) => {\n const leftSerialized = JSON.stringify(left)\n const rightSerialized = JSON.stringify(right)\n return leftSerialized < rightSerialized\n ? -1\n : leftSerialized > rightSerialized\n ? 1\n : 0\n })\n }\n\n if (value instanceof Map) {\n return Array.from(value.entries())\n .map(([key, mapValue]) => ({\n key: toStableSerializable(key),\n value: toStableSerializable(mapValue),\n }))\n .filter((entry) => entry.key !== undefined && entry.value !== undefined)\n .sort((left, right) => {\n const leftSerialized = JSON.stringify(left.key)\n const rightSerialized = JSON.stringify(right.key)\n return leftSerialized < rightSerialized\n ? -1\n : leftSerialized > rightSerialized\n ? 1\n : 0\n })\n }\n\n const record = value as Record<string, unknown>\n const orderedKeys = Object.keys(record).sort((left, right) =>\n left < right ? -1 : left > right ? 1 : 0,\n )\n const serializableRecord: Record<string, unknown> = {}\n for (const key of orderedKeys) {\n const serializableValue = toStableSerializable(record[key])\n if (serializableValue !== undefined) {\n serializableRecord[key] = serializableValue\n }\n }\n return serializableRecord\n}\n\nfunction stableSerialize(value: unknown): string {\n return JSON.stringify(toStableSerializable(value) ?? null)\n}\n\nfunction normalizeSubsetOptionsForKey(\n options: LoadSubsetOptions,\n): Record<string, unknown> {\n return {\n where: toStableSerializable(options.where),\n orderBy: toStableSerializable(options.orderBy),\n limit: options.limit,\n cursor: toStableSerializable(options.cursor),\n offset: options.offset,\n }\n}\n\nfunction normalizeSyncFnResult(result: void | (() => void) | SyncConfigRes) {\n if (typeof result === `function`) {\n return { cleanup: result } satisfies SyncConfigRes\n }\n\n if (result === undefined) {\n return {} satisfies SyncConfigRes\n }\n\n return result\n}\n\nfunction isTxCommittedPayload(payload: unknown): payload is TxCommitted {\n if (!isRecord(payload) || payload.type !== `tx:committed`) {\n return false\n }\n\n if (\n typeof payload.term !== `number` ||\n typeof payload.seq !== `number` ||\n typeof payload.txId !== `string` ||\n typeof payload.latestRowVersion !== `number` ||\n typeof payload.requiresFullReload !== `boolean`\n ) {\n return false\n }\n\n if (payload.requiresFullReload) {\n return true\n }\n\n return (\n Array.isArray(payload.changedRows) &&\n Array.isArray(payload.deletedKeys) &&\n (payload.rowMetadataMutations === undefined ||\n Array.isArray(payload.rowMetadataMutations)) &&\n (payload.collectionMetadataMutations === undefined ||\n Array.isArray(payload.collectionMetadataMutations))\n )\n}\n\nfunction isCollectionResetPayload(\n payload: unknown,\n): payload is CollectionReset {\n return (\n isRecord(payload) &&\n payload.type === `collection:reset` &&\n typeof payload.schemaVersion === `number` &&\n typeof payload.resetEpoch === `number`\n )\n}\n\nfunction toPersistedMutationEnvelope(\n mutation: PendingMutation<Record<string, unknown>>,\n): PersistedMutationEnvelope {\n const key = mutation.key as string | number\n const value =\n mutation.type === `delete`\n ? (mutation.original as Record<string, unknown>)\n : mutation.modified\n\n return {\n mutationId: mutation.mutationId,\n type: mutation.type,\n key,\n value,\n }\n}\n\nclass PersistedCollectionRuntime<\n T extends object,\n TKey extends string | number,\n> {\n private readonly applyMutex = new ApplyMutex()\n private readonly activeSubsets = new Map<string, LoadSubsetOptions>()\n private readonly pendingRemoteSubsetEnsures = new Map<\n string,\n LoadSubsetOptions\n >()\n private readonly queuedHydrationTransactions: Array<\n BufferedSyncTransaction<T, TKey>\n > = []\n private readonly queuedTxCommitted: Array<TxCommitted> = []\n private readonly subscriptionIds = new WeakMap<object, string>()\n\n private collection: Collection<T, TKey, PersistedCollectionUtils> | null =\n null\n private syncControls: SyncControlFns<T, TKey> = {\n begin: null,\n write: null,\n commit: null,\n truncate: null,\n metadata: null,\n }\n private started = false\n private startupMetadataPromise: Promise<void> | null = null\n private startPromise: Promise<void> | null = null\n private internalApplyDepth = 0\n private appliedReceiptSequence = 0\n private readonly pendingAppliedReceipts = new Map<number, Promise<void>>()\n private isHydrating = false\n private coordinatorUnsubscribe: (() => void) | null = null\n private indexAddedUnsubscribe: (() => void) | null = null\n private indexRemovedUnsubscribe: (() => void) | null = null\n private remoteEnsureRetryTimer: ReturnType<typeof setTimeout> | null = null\n private nextSubscriptionId = 0\n\n private latestTerm = 0\n private latestSeq = 0\n private latestRowVersion = 0\n private localTerm = 1\n private localSeq = 0\n private localRowVersion = 0\n\n constructor(\n private readonly mode: PersistedMode,\n private readonly collectionId: string,\n private readonly persistence: PersistedResolvedPersistence,\n private readonly syncMode: `eager` | `on-demand`,\n private readonly dbName: string,\n ) {}\n\n setSyncControls(syncControls: SyncControlFns<T, TKey>): void {\n const commit = syncControls.commit\n this.syncControls = {\n ...syncControls,\n commit: commit\n ? (signal) => this.trackAppliedReceipt(commit(signal))\n : null,\n }\n }\n\n private trackAppliedReceipt(receipt: SyncAppliedReceipt): SyncAppliedReceipt {\n const sequence = ++this.appliedReceiptSequence\n if (receipt === true) {\n return true\n }\n this.pendingAppliedReceipts.set(sequence, receipt)\n const removeReceipt = () => this.pendingAppliedReceipts.delete(sequence)\n void receipt.then(removeReceipt, removeReceipt)\n return receipt\n }\n\n private async waitForAppliedReceiptsAfter(cursor: number): Promise<void> {\n await Promise.all(\n Array.from(this.pendingAppliedReceipts, ([sequence, receipt]) =>\n sequence > cursor ? receipt : undefined,\n ),\n )\n }\n\n clearSyncControls(): void {\n this.syncControls = {\n begin: null,\n write: null,\n commit: null,\n truncate: null,\n metadata: null,\n }\n }\n\n isHydratingNow(): boolean {\n return this.isHydrating\n }\n\n isApplyingInternally(): boolean {\n return this.internalApplyDepth > 0\n }\n\n setCollection(\n collection: Collection<T, TKey, PersistedCollectionUtils>,\n ): void {\n if (this.collection === collection) {\n return\n }\n\n this.collection = collection\n this.attachCoordinatorSubscription()\n }\n\n getLeadershipState(): PersistedCollectionLeadershipState {\n return {\n nodeId: this.persistence.coordinator.getNodeId(),\n isLeader: this.persistence.coordinator.isLeader(this.collectionId),\n }\n }\n\n async ensureStarted(): Promise<void> {\n if (this.startPromise) {\n return this.startPromise\n }\n\n this.startPromise = this.startInternal()\n return this.startPromise\n }\n\n async ensureStartupMetadataLoaded(): Promise<void> {\n if (this.startupMetadataPromise) {\n return this.startupMetadataPromise\n }\n\n this.startupMetadataPromise = this.loadStartupMetadataInternal()\n return this.startupMetadataPromise\n }\n\n private async startInternal(): Promise<void> {\n if (this.started) {\n return\n }\n\n this.started = true\n\n await this.ensureStartupMetadataLoaded()\n\n const indexBootstrapSnapshot = this.collection?.getIndexMetadata() ?? []\n this.attachIndexLifecycleListeners()\n await this.bootstrapPersistedIndexes(indexBootstrapSnapshot)\n\n if (this.syncMode !== `on-demand`) {\n this.activeSubsets.set(this.getSubsetKey({}), {})\n const appliedCursor = this.appliedReceiptSequence\n await this.applyMutex.run(() =>\n this.hydrateSubsetUnsafe({}, { requestRemoteEnsure: false }),\n )\n await this.waitForAppliedReceiptsAfter(appliedCursor)\n }\n }\n\n private async loadStartupMetadataInternal(): Promise<void> {\n // Restore stream position from the database so that new mutations\n // don't collide with previously applied transactions.\n if (this.persistence.adapter.getStreamPosition) {\n const position = await this.persistence.adapter.getStreamPosition(\n this.collectionId,\n )\n this.observeStreamPosition(\n position.latestTerm,\n position.latestSeq,\n position.latestRowVersion,\n )\n }\n\n await this.loadCollectionMetadataIntoCollection()\n }\n\n private async loadCollectionMetadataIntoCollection(): Promise<void> {\n const collectionMetadata = await this.loadCollectionMetadataSnapshot()\n this.replaceCollectionMetadataSnapshot(collectionMetadata)\n }\n\n private async loadCollectionMetadataSnapshot(): Promise<\n Array<{ key: string; value: unknown }>\n > {\n if (!this.persistence.adapter.loadCollectionMetadata) {\n return []\n }\n\n return this.persistence.adapter.loadCollectionMetadata(this.collectionId)\n }\n\n private replaceCollectionMetadataSnapshot(\n collectionMetadata: Array<{ key: string; value: unknown }>,\n ): void {\n if (\n !this.syncControls.begin ||\n !this.syncControls.commit ||\n !this.syncControls.metadata\n ) {\n return\n }\n\n const nextMetadata = new Map(\n collectionMetadata.map(({ key, value }) => [key, value]),\n )\n const currentKeys = this.syncControls.metadata.collection\n .list()\n .map(({ key }) => key)\n\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n currentKeys.forEach((key) => {\n if (!nextMetadata.has(key)) {\n this.syncControls.metadata?.collection.delete(key)\n }\n })\n\n nextMetadata.forEach((value, key) => {\n this.syncControls.metadata?.collection.set(key, value)\n })\n\n this.syncControls.commit?.()\n })\n }\n\n async loadSubset(\n options: LoadSubsetOptions,\n upstreamLoadSubset?: (options: LoadSubsetOptions) => true | Promise<void>,\n ): Promise<void> {\n this.activeSubsets.set(this.getSubsetKey(options), options)\n\n const appliedCursor = this.appliedReceiptSequence\n await this.applyMutex.run(() =>\n this.hydrateSubsetUnsafe(options, {\n requestRemoteEnsure: this.mode === `sync-present`,\n }),\n )\n await this.waitForAppliedReceiptsAfter(appliedCursor)\n\n if (upstreamLoadSubset) {\n try {\n const maybePromise = upstreamLoadSubset(options)\n if (maybePromise instanceof Promise) {\n await maybePromise.catch((error) => {\n console.warn(\n `Failed to load remote subset in persisted wrapper:`,\n error,\n )\n this.queueRemoteSubsetEnsure(options)\n })\n }\n } catch (error) {\n console.warn(`Failed to trigger remote subset load:`, error)\n this.queueRemoteSubsetEnsure(options)\n }\n }\n }\n\n unloadSubset(\n options: LoadSubsetOptions,\n upstreamUnloadSubset?: (options: LoadSubsetOptions) => void,\n ): void {\n this.activeSubsets.delete(this.getSubsetKey(options))\n upstreamUnloadSubset?.(options)\n }\n\n async forceReloadSubset(options: LoadSubsetOptions): Promise<void> {\n this.activeSubsets.set(this.getSubsetKey(options), options)\n await this.applyMutex.run(() =>\n this.hydrateSubsetUnsafe(options, { requestRemoteEnsure: false }),\n )\n }\n\n queueHydrationBufferedTransaction(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): void {\n this.queuedHydrationTransactions.push(transaction)\n }\n\n async persistAndBroadcastExternalSyncTransaction(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): Promise<void> {\n await this.applyMutex.run(() =>\n this.persistAndBroadcastExternalSyncTransactionUnsafe(transaction),\n )\n }\n\n normalizeSyncWriteMessage(\n message: ChangeMessageOrDeleteKeyMessage<T, TKey>,\n ): SyncWriteNormalization<T, TKey> {\n if (!this.collection) {\n throw new InvalidPersistedCollectionConfigError(\n `collection must be attached before sync writes are processed`,\n )\n }\n\n if (`key` in message) {\n const key = message.key\n const previousValue = this.collection.get(key) ?? ({} as T)\n\n return {\n forwardMessage: {\n type: `delete`,\n key,\n },\n operation: {\n type: `delete`,\n key,\n value: previousValue,\n },\n }\n }\n\n // Handle delete messages that include the full value instead of just a key\n // (e.g. from queryCollectionOptions which sends { type: 'delete', value: oldItem })\n if (message.type === `delete`) {\n const key = this.collection.getKeyFromItem(message.value)\n const previousValue = this.collection.get(key) ?? message.value\n\n return {\n forwardMessage: {\n type: `delete`,\n key,\n },\n operation: {\n type: `delete`,\n key,\n value: previousValue,\n },\n }\n }\n\n const key = this.collection.getKeyFromItem(message.value)\n return {\n forwardMessage: {\n type: `update`,\n value: message.value,\n metadata: message.metadata,\n },\n operation: {\n type: `update`,\n key,\n value: message.value,\n metadata: message.metadata,\n },\n }\n }\n\n async persistAndConfirmCollectionMutations(\n mutations: Array<PendingMutation<T>>,\n ): Promise<void> {\n if (mutations.length === 0) {\n return\n }\n\n await this.applyMutex.run(async () => {\n const acceptedMutationIds =\n await this.persistCollectionMutationsUnsafe(mutations)\n const acceptedMutationIdSet = new Set(acceptedMutationIds)\n const acceptedMutations = mutations.filter((mutation) =>\n acceptedMutationIdSet.has(mutation.mutationId),\n )\n\n if (acceptedMutations.length !== mutations.length) {\n throw new Error(\n `persistence coordinator accepted ${acceptedMutations.length} of ${mutations.length} mutations; partial acceptance is not supported`,\n )\n }\n\n this.confirmMutationsSyncUnsafe(acceptedMutations)\n })\n }\n\n async acceptTransactionMutations(transaction: {\n mutations: Array<PendingMutation<Record<string, unknown>>>\n }): Promise<void> {\n const collectionMutations = this.filterMutationsForCollection(\n transaction.mutations,\n )\n\n if (collectionMutations.length === 0) {\n return\n }\n\n await this.persistAndConfirmCollectionMutations(collectionMutations)\n }\n\n cleanup(): void {\n this.coordinatorUnsubscribe?.()\n this.coordinatorUnsubscribe = null\n\n this.indexAddedUnsubscribe?.()\n this.indexAddedUnsubscribe = null\n\n this.indexRemovedUnsubscribe?.()\n this.indexRemovedUnsubscribe = null\n\n if (this.remoteEnsureRetryTimer !== null) {\n clearTimeout(this.remoteEnsureRetryTimer)\n this.remoteEnsureRetryTimer = null\n }\n\n this.pendingRemoteSubsetEnsures.clear()\n this.activeSubsets.clear()\n for (const transaction of this.queuedHydrationTransactions) {\n transaction.rejectApplied?.(new SyncTransactionAbortedError())\n }\n this.queuedHydrationTransactions.length = 0\n this.queuedTxCommitted.length = 0\n this.clearSyncControls()\n }\n\n private withInternalApply<TResult>(task: () => TResult): TResult {\n this.internalApplyDepth++\n try {\n return task()\n } finally {\n this.internalApplyDepth--\n }\n }\n\n private getRequiredIndexSignatures(): ReadonlyArray<string> {\n if (!this.collection) {\n return []\n }\n\n return this.collection\n .getIndexMetadata()\n .map((metadata) => metadata.signature)\n }\n\n private loadSubsetRowsUnsafe(\n options: LoadSubsetOptions,\n ): Promise<Array<{ key: TKey; value: T; metadata?: unknown }>> {\n return this.persistence.adapter.loadSubset(this.collectionId, options, {\n requiredIndexSignatures: this.getRequiredIndexSignatures(),\n }) as Promise<Array<{ key: TKey; value: T; metadata?: unknown }>>\n }\n\n private async scanPersistedRowsUnsafe(\n options?: PersistedRowScanOptions,\n ): Promise<Array<PersistedScannedRow<T, TKey>>> {\n if (!this.persistence.adapter.scanRows) {\n return []\n }\n\n return this.persistence.adapter.scanRows(\n this.collectionId,\n options,\n ) as Promise<Array<PersistedScannedRow<T, TKey>>>\n }\n\n async scanPersistedRows(\n options?: PersistedRowScanOptions,\n ): Promise<Array<PersistedScannedRow<T, TKey>>> {\n return this.applyMutex.run(() => this.scanPersistedRowsUnsafe(options))\n }\n\n private async hydrateSubsetUnsafe(\n options: LoadSubsetOptions,\n config: {\n requestRemoteEnsure: boolean\n },\n ): Promise<void> {\n this.isHydrating = true\n try {\n const rows = await this.loadSubsetRowsUnsafe(options)\n\n this.applyRowsToCollection(rows)\n } finally {\n this.isHydrating = false\n }\n\n await this.flushQueuedHydrationTransactionsUnsafe()\n await this.flushQueuedTxCommittedUnsafe()\n\n if (config.requestRemoteEnsure) {\n this.queueRemoteSubsetEnsure(options)\n }\n }\n\n private applyRowsToCollection(\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n ): void {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit\n ) {\n return\n }\n\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n for (const row of rows) {\n if (this.collection?._hasHydratedKey(row.key)) {\n continue\n }\n this.syncControls.write?.({\n type: `update`,\n value: row.value,\n metadata: row.metadata as Record<string, unknown> | undefined,\n })\n }\n\n this.syncControls.commit?.()\n })\n }\n\n private replaceCollectionSnapshot(\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n collectionMetadata: Array<{ key: string; value: unknown }>,\n ): void {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit ||\n !this.syncControls.metadata\n ) {\n return\n }\n\n const nextMetadata = new Map(\n collectionMetadata.map(({ key, value }) => [key, value]),\n )\n const currentKeys = this.syncControls.metadata.collection\n .list()\n .map(({ key }) => key)\n\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n this.syncControls.truncate?.()\n\n for (const row of rows) {\n this.syncControls.write?.({\n type: `update`,\n value: row.value,\n metadata: row.metadata as Record<string, unknown> | undefined,\n })\n }\n\n currentKeys.forEach((key) => {\n if (!nextMetadata.has(key)) {\n this.syncControls.metadata?.collection.delete(key)\n }\n })\n\n nextMetadata.forEach((value, key) => {\n this.syncControls.metadata?.collection.set(key, value)\n })\n\n this.syncControls.commit?.()\n })\n }\n\n private async flushQueuedHydrationTransactionsUnsafe(): Promise<void> {\n while (this.queuedHydrationTransactions.length > 0) {\n const transaction = this.queuedHydrationTransactions.shift()\n if (!transaction) {\n continue\n }\n try {\n await this.applyBufferedSyncTransactionUnsafe(transaction)\n } catch (error) {\n transaction.rejectApplied?.(error)\n for (const abandoned of this.queuedHydrationTransactions) {\n abandoned.rejectApplied?.(error)\n }\n this.queuedHydrationTransactions.length = 0\n throw error\n }\n }\n }\n\n private async applyBufferedSyncTransactionUnsafe(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): Promise<void> {\n if (transaction.signal?.aborted) {\n transaction.rejectApplied?.(new SyncTransactionAbortedError())\n return\n }\n\n const { begin, write, commit, truncate, metadata } = this.syncControls\n if (!begin || !write || !commit) {\n transaction.rejectApplied?.(new SyncTransactionAbortedError())\n return\n }\n\n const applyToCollection = (): SyncAppliedReceipt => {\n begin()\n\n if (transaction.truncate) {\n truncate?.()\n }\n\n for (const operation of transaction.operations) {\n if (operation.type === `delete`) {\n write({\n type: `delete`,\n key: operation.key,\n })\n } else {\n write({\n type: `update`,\n value: operation.value,\n metadata: operation.metadata,\n })\n }\n }\n\n for (const [key, metadataWrite] of transaction.rowMetadataWrites) {\n if (metadataWrite.type === `delete`) {\n metadata?.row.delete(key)\n } else {\n metadata?.row.set(key, metadataWrite.value)\n }\n }\n\n for (const [key, metadataWrite] of transaction.collectionMetadataWrites) {\n if (metadataWrite.type === `delete`) {\n metadata?.collection.delete(key)\n } else {\n metadata?.collection.set(key, metadataWrite.value)\n }\n }\n\n return commit(transaction.signal)\n }\n\n try {\n const applied = transaction.internal\n ? this.withInternalApply(applyToCollection)\n : applyToCollection()\n if (applied !== true) {\n await applied\n }\n\n if (!transaction.internal) {\n await this.persistAndBroadcastExternalSyncTransactionUnsafe(transaction)\n }\n transaction.resolveApplied?.()\n } catch (error) {\n transaction.rejectApplied?.(error)\n throw error\n }\n }\n\n private async persistAndBroadcastExternalSyncTransactionUnsafe(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): Promise<void> {\n if (transaction.internal) {\n return\n }\n\n const streamPosition = this.nextLocalStreamPosition()\n\n if (\n !transaction.truncate &&\n transaction.operations.length === 0 &&\n transaction.rowMetadataWrites.size === 0 &&\n transaction.collectionMetadataWrites.size === 0\n ) {\n this.publishTxCommittedEvent(\n this.createTxCommittedPayload({\n term: streamPosition.term,\n seq: streamPosition.seq,\n txId: safeRandomUUID(),\n latestRowVersion: streamPosition.rowVersion,\n changedRows: [],\n deletedKeys: [],\n requiresFullReload: true,\n }),\n )\n return\n }\n\n const tx = this.createPersistedTxFromOperations(transaction, streamPosition)\n\n await this.persistence.adapter.applyCommittedTx(this.collectionId, tx)\n this.publishTxCommittedEvent(\n this.createTxCommittedPayload({\n term: tx.term,\n seq: tx.seq,\n txId: tx.txId,\n latestRowVersion: tx.rowVersion,\n requiresFullReload: transaction.truncate,\n changedRows: transaction.operations\n .filter((operation) => operation.type === `update`)\n .map((operation) => ({\n key: operation.key,\n value: operation.value as Record<string, unknown>,\n })),\n deletedKeys: transaction.operations\n .filter((operation) => operation.type === `delete`)\n .map((operation) => operation.key),\n rowMetadataMutations: tx.rowMetadataMutations,\n collectionMetadataMutations: tx.collectionMetadataMutations,\n }),\n )\n }\n\n private createPersistedTxFromOperations(\n transaction: BufferedSyncTransaction<T, TKey>,\n streamPosition: { term: number; seq: number; rowVersion: number },\n ): PersistedTx {\n return {\n txId: safeRandomUUID(),\n term: streamPosition.term,\n seq: streamPosition.seq,\n rowVersion: streamPosition.rowVersion,\n truncate: transaction.truncate,\n mutations: transaction.operations.map((operation) =>\n operation.type === `update`\n ? {\n type: `update` as const,\n key: operation.key,\n value: operation.value as Record<string, unknown>,\n }\n : {\n type: `delete` as const,\n key: operation.key,\n value: operation.value as Record<string, unknown>,\n },\n ),\n rowMetadataMutations: Array.from(\n transaction.rowMetadataWrites.entries(),\n ).map(([key, metadataWrite]) =>\n metadataWrite.type === `delete`\n ? { type: `delete` as const, key: key }\n : {\n type: `set` as const,\n key: key,\n value: metadataWrite.value,\n },\n ),\n collectionMetadataMutations: Array.from(\n transaction.collectionMetadataWrites.entries(),\n ).map(([key, metadataWrite]) =>\n metadataWrite.type === `delete`\n ? { type: `delete`, key }\n : { type: `set`, key, value: metadataWrite.value },\n ),\n }\n }\n\n private createPersistedTxFromMutations(\n mutations: Array<PendingMutation<T>>,\n streamPosition: { term: number; seq: number; rowVersion: number },\n ): PersistedTx {\n return {\n txId: safeRandomUUID(),\n term: streamPosition.term,\n seq: streamPosition.seq,\n rowVersion: streamPosition.rowVersion,\n mutations: mutations.map((mutation) => {\n if (mutation.type === `delete`) {\n return {\n type: `delete` as const,\n key: mutation.key as string | number,\n value: mutation.original as Record<string, unknown>,\n }\n }\n\n if (mutation.type === `insert`) {\n return {\n type: `insert` as const,\n key: mutation.key as string | number,\n value: mutation.modified as Record<string, unknown>,\n }\n }\n\n return {\n type: `update` as const,\n key: mutation.key as string | number,\n value: mutation.modified as Record<string, unknown>,\n }\n }),\n }\n }\n\n private confirmMutationsSyncUnsafe(\n mutations: Array<PendingMutation<T>>,\n ): void {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit\n ) {\n return\n }\n\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n for (const mutation of mutations) {\n if (mutation.type === `delete`) {\n this.syncControls.write?.({\n type: `delete`,\n key: mutation.key as TKey,\n })\n } else {\n this.syncControls.write?.({\n type: `update`,\n value: mutation.modified,\n })\n }\n }\n\n this.syncControls.commit?.()\n })\n }\n\n private filterMutationsForCollection(\n mutations: Array<PendingMutation<Record<string, unknown>>>,\n ): Array<PendingMutation<T>> {\n const collection = this.collection\n return mutations.filter((mutation) => {\n if (collection) {\n return mutation.collection === collection\n }\n return mutation.collection.id === this.collectionId\n }) as Array<PendingMutation<T>>\n }\n\n private async persistCollectionMutationsUnsafe(\n mutations: Array<PendingMutation<T>>,\n ): Promise<Array<string>> {\n // When a coordinator with requestApplyLocalMutations is available, always\n // route through it — even on the leader tab. This ensures the coordinator's\n // seq/rowVersion counters stay in sync with actual writes. Without this,\n // the leader's direct-path writes would increment the runtime's localSeq\n // but leave the coordinator's state.latestSeq stale, causing seq collisions\n // when follower RPCs later arrive.\n if (this.persistence.coordinator.requestApplyLocalMutations) {\n const envelopeMutations = mutations.map((mutation) =>\n toPersistedMutationEnvelope(\n mutation as unknown as PendingMutation<Record<string, unknown>>,\n ),\n )\n\n const response =\n await this.persistence.coordinator.requestApplyLocalMutations(\n this.collectionId,\n envelopeMutations,\n )\n\n if (!response.ok) {\n throw new Error(\n `failed to apply local mutations through coordinator: ${response.error}`,\n )\n }\n\n this.observeStreamPosition(\n response.term,\n response.seq,\n response.latestRowVersion,\n )\n\n const uniqueAcceptedMutationIds = Array.from(\n new Set(response.acceptedMutationIds),\n )\n const submittedMutationIds = new Set(\n mutations.map((mutation) => mutation.mutationId),\n )\n const hasUnknownAcceptedMutationId = uniqueAcceptedMutationIds.some(\n (mutationId) => !submittedMutationIds.has(mutationId),\n )\n\n if (hasUnknownAcceptedMutationId) {\n throw new Error(\n `persistence coordinator returned unknown mutation ids in applyLocalMutations response`,\n )\n }\n\n return uniqueAcceptedMutationIds\n }\n\n // Fallback: no coordinator with requestApplyLocalMutations (e.g.\n // SingleProcessCoordinator). Apply directly and broadcast.\n const streamPosition = this.nextLocalStreamPosition()\n const tx = this.createPersistedTxFromMutations(mutations, streamPosition)\n await this.persistence.adapter.applyCommittedTx(this.collectionId, tx)\n\n this.publishTxCommittedEvent(\n this.createTxCommittedPayload({\n term: tx.term,\n seq: tx.seq,\n txId: tx.txId,\n latestRowVersion: tx.rowVersion,\n changedRows: mutations\n .filter((mutation) => mutation.type !== `delete`)\n .map((mutation) => ({\n key: mutation.key as string | number,\n value: mutation.modified as Record<string, unknown>,\n })),\n deletedKeys: mutations\n .filter((mutation) => mutation.type === `delete`)\n .map((mutation) => mutation.key as string | number),\n rowMetadataMutations: tx.rowMetadataMutations,\n collectionMetadataMutations: tx.collectionMetadataMutations,\n }),\n )\n\n return mutations.map((mutation) => mutation.mutationId)\n }\n\n private createTxCommittedPayload(args: {\n term: number\n seq: number\n txId: string\n latestRowVersion: number\n changedRows: Array<{ key: string | number; value: Record<string, unknown> }>\n deletedKeys: Array<string | number>\n rowMetadataMutations?: Array<PersistedRowMetadataMutation>\n collectionMetadataMutations?: Array<PersistedCollectionMetadataMutation>\n hasMetadataChanges?: boolean\n requiresFullReload?: boolean\n }): TxCommitted {\n const rowMetadataMutations = args.rowMetadataMutations ?? []\n const collectionMetadataMutations = args.collectionMetadataMutations ?? []\n const requiresFullReload =\n args.requiresFullReload === true ||\n args.changedRows.length +\n args.deletedKeys.length +\n rowMetadataMutations.length +\n collectionMetadataMutations.length >\n TARGETED_INVALIDATION_KEY_LIMIT\n\n if (requiresFullReload) {\n return {\n type: `tx:committed`,\n term: args.term,\n seq: args.seq,\n txId: args.txId,\n latestRowVersion: args.latestRowVersion,\n requiresFullReload: true,\n }\n }\n\n return {\n type: `tx:committed`,\n term: args.term,\n seq: args.seq,\n txId: args.txId,\n latestRowVersion: args.latestRowVersion,\n requiresFullReload: false,\n changedRows: args.changedRows,\n deletedKeys: args.deletedKeys,\n rowMetadataMutations,\n collectionMetadataMutations,\n }\n }\n\n private publishTxCommittedEvent(txCommitted: TxCommitted): void {\n this.observeStreamPosition(\n txCommitted.term,\n txCommitted.seq,\n txCommitted.latestRowVersion,\n )\n\n const envelope: ProtocolEnvelope<TxCommitted> = {\n v: 1,\n dbName: this.dbName,\n collectionId: this.collectionId,\n senderId: this.persistence.coordinator.getNodeId(),\n ts: Date.now(),\n payload: txCommitted,\n }\n this.persistence.coordinator.publish(this.collectionId, envelope)\n }\n\n private observeStreamPosition(\n term: number,\n seq: number,\n rowVersion: number,\n ): void {\n if (\n term > this.latestTerm ||\n (term === this.latestTerm && seq > this.latestSeq)\n ) {\n this.latestTerm = term\n this.latestSeq = seq\n }\n if (rowVersion > this.latestRowVersion) {\n this.latestRowVersion = rowVersion\n }\n\n if (term > this.localTerm) {\n this.localTerm = term\n this.localSeq = seq\n } else if (term === this.localTerm && seq > this.localSeq) {\n this.localSeq = seq\n }\n if (rowVersion > this.localRowVersion) {\n this.localRowVersion = rowVersion\n }\n }\n\n private nextLocalStreamPosition(): {\n term: number\n seq: number\n rowVersion: number\n } {\n this.localTerm = Math.max(this.localTerm, this.latestTerm || 1)\n this.localSeq = Math.max(this.localSeq, this.latestSeq) + 1\n this.localRowVersion =\n Math.max(this.localRowVersion, this.latestRowVersion) + 1\n\n return {\n term: this.localTerm,\n seq: this.localSeq,\n rowVersion: this.localRowVersion,\n }\n }\n\n private getSubsetKey(options: LoadSubsetOptions): string {\n const subscription = options.subscription as object | undefined\n if (subscription && typeof subscription === `object`) {\n const existingId = this.subscriptionIds.get(subscription)\n if (existingId) {\n return existingId\n }\n\n this.nextSubscriptionId++\n const id = `sub:${this.nextSubscriptionId}`\n this.subscriptionIds.set(subscription, id)\n return id\n }\n\n return `opts:${stableSerialize(normalizeSubsetOptionsForKey(options))}`\n }\n\n private queueRemoteSubsetEnsure(options: LoadSubsetOptions): void {\n if (\n this.mode !== `sync-present` ||\n !this.persistence.coordinator.requestEnsureRemoteSubset\n ) {\n return\n }\n\n this.pendingRemoteSubsetEnsures.set(this.getSubsetKey(options), options)\n void this.flushPendingRemoteSubsetEnsures()\n }\n\n private scheduleRemoteEnsureRetry(): void {\n if (\n this.mode !== `sync-present` ||\n !this.persistence.coordinator.requestEnsureRemoteSubset\n ) {\n return\n }\n\n if (\n this.pendingRemoteSubsetEnsures.size === 0 ||\n this.remoteEnsureRetryTimer !== null\n ) {\n return\n }\n\n this.remoteEnsureRetryTimer = setTimeout(() => {\n this.remoteEnsureRetryTimer = null\n void this.flushPendingRemoteSubsetEnsures()\n }, REMOTE_ENSURE_RETRY_DELAY_MS)\n }\n\n private async flushPendingRemoteSubsetEnsures(): Promise<void> {\n if (\n this.mode !== `sync-present` ||\n !this.persistence.coordinator.requestEnsureRemoteSubset\n ) {\n return\n }\n\n if (this.remoteEnsureRetryTimer !== null) {\n clearTimeout(this.remoteEnsureRetryTimer)\n this.remoteEnsureRetryTimer = null\n }\n\n for (const [subsetKey, options] of this.pendingRemoteSubsetEnsures) {\n try {\n await this.persistence.coordinator.requestEnsureRemoteSubset(\n this.collectionId,\n options,\n )\n this.pendingRemoteSubsetEnsures.delete(subsetKey)\n } catch (error) {\n console.warn(`Failed to ensure remote subset:`, error)\n }\n }\n\n this.scheduleRemoteEnsureRetry()\n }\n\n private attachCoordinatorSubscription(): void {\n if (this.coordinatorUnsubscribe) {\n return\n }\n\n this.coordinatorUnsubscribe = this.persistence.coordinator.subscribe(\n this.collectionId,\n (message) => {\n this.onCoordinatorMessage(message)\n },\n )\n }\n\n private onCoordinatorMessage(message: ProtocolEnvelope<unknown>): void {\n if (message.collectionId !== this.collectionId) {\n return\n }\n\n const { payload } = message\n const isSelf = message.senderId === this.persistence.coordinator.getNodeId()\n\n // Allow tx:committed from self — the coordinator produces these on behalf\n // of both local and remote mutations. The seq dedup in\n // processCommittedTxUnsafe prevents double-processing of our own writes.\n if (isTxCommittedPayload(payload)) {\n if (this.isHydrating) {\n this.queuedTxCommitted.push(payload)\n return\n }\n\n void this.applyMutex\n .run(() => this.processCommittedTxUnsafe(payload))\n .catch((error) => {\n console.warn(`Failed to process tx:committed message:`, error)\n })\n return\n }\n\n // Skip remaining message types from self (e.g. heartbeats, resets)\n if (isSelf) {\n return\n }\n\n if (isCollectionResetPayload(payload)) {\n void this.applyMutex\n .run(() => this.truncateAndReloadUnsafe())\n .catch((error) => {\n console.warn(`Failed to process collection reset message:`, error)\n })\n }\n }\n\n private async flushQueuedTxCommittedUnsafe(): Promise<void> {\n while (this.queuedTxCommitted.length > 0) {\n const queued = this.queuedTxCommitted.shift()\n if (!queued) {\n continue\n }\n await this.processCommittedTxUnsafe(queued)\n }\n }\n\n private async processCommittedTxUnsafe(\n txCommitted: TxCommitted,\n ): Promise<void> {\n if (txCommitted.term < this.latestTerm) {\n return\n }\n\n if (\n txCommitted.term === this.latestTerm &&\n txCommitted.seq <= this.latestSeq\n ) {\n return\n }\n\n const hasGapInCurrentTerm =\n txCommitted.term === this.latestTerm &&\n txCommitted.seq > this.latestSeq + 1\n const hasGapAcrossTerms =\n txCommitted.term > this.latestTerm && txCommitted.seq > 1\n const hasGap = hasGapInCurrentTerm || hasGapAcrossTerms\n\n if (hasGap) {\n await this.recoverFromSeqGapUnsafe()\n if (\n txCommitted.term < this.latestTerm ||\n (txCommitted.term === this.latestTerm &&\n txCommitted.seq <= this.latestSeq)\n ) {\n return\n }\n }\n\n this.observeStreamPosition(\n txCommitted.term,\n txCommitted.seq,\n txCommitted.latestRowVersion,\n )\n\n await this.invalidateFromCommittedTxUnsafe(txCommitted)\n }\n\n private async recoverFromSeqGapUnsafe(): Promise<void> {\n if (this.persistence.coordinator.pullSince && this.latestRowVersion >= 0) {\n try {\n const pullResponse = await this.persistence.coordinator.pullSince(\n this.collectionId,\n this.latestRowVersion,\n )\n\n if (pullResponse.ok) {\n this.observeStreamPosition(\n pullResponse.latestTerm,\n pullResponse.latestSeq,\n pullResponse.latestRowVersion,\n )\n if (pullResponse.requiresFullReload || !pullResponse.deltas) {\n await this.reloadActiveSubsetsUnsafe()\n return\n }\n\n for (const delta of pullResponse.deltas) {\n await this.invalidateFromCommittedTxUnsafe({\n type: `tx:committed`,\n term: pullResponse.latestTerm,\n seq: pullResponse.latestSeq,\n txId: delta.txId,\n latestRowVersion: delta.latestRowVersion,\n requiresFullReload: false,\n changedRows: delta.changedRows,\n deletedKeys: delta.deletedKeys,\n rowMetadataMutations: delta.rowMetadataMutations,\n collectionMetadataMutations: delta.collectionMetadataMutations,\n })\n }\n return\n }\n } catch (error) {\n console.warn(`Failed pullSince recovery attempt:`, error)\n }\n }\n\n await this.truncateAndReloadUnsafe()\n\n if (this.mode === `sync-present`) {\n for (const options of this.activeSubsets.values()) {\n this.queueRemoteSubsetEnsure(options)\n }\n }\n }\n\n private async truncateAndReloadUnsafe(): Promise<void> {\n if (this.syncControls.begin && this.syncControls.commit) {\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n this.syncControls.truncate?.()\n this.syncControls.commit?.()\n })\n }\n\n await this.reloadActiveSubsetsUnsafe()\n }\n\n private async invalidateFromCommittedTxUnsafe(\n txCommitted: TxCommitted,\n ): Promise<void> {\n if (txCommitted.requiresFullReload) {\n await this.reloadActiveSubsetsUnsafe()\n return\n }\n\n const changedKeyCount =\n txCommitted.changedRows.length + txCommitted.deletedKeys.length\n if (changedKeyCount > TARGETED_INVALIDATION_KEY_LIMIT) {\n await this.reloadActiveSubsetsUnsafe()\n return\n }\n\n const hasPaginatedSubset = Array.from(this.activeSubsets.values()).some(\n (opt) => opt.limit != null || opt.offset != null || opt.cursor != null,\n )\n\n if (!hasPaginatedSubset || changedKeyCount === 0) {\n await this.applyTargetedInvalidationUnsafe(txCommitted)\n return\n }\n\n // Has paginated subsets — fall back to full reload.\n // Targeted invalidation for paginated subsets is deferred to a future iteration.\n await this.reloadActiveSubsetsUnsafe()\n }\n\n private async applyTargetedInvalidationUnsafe(\n txCommitted: TxCommitted & { requiresFullReload: false },\n ): Promise<void> {\n const subsetEvaluators = Array.from(this.activeSubsets.values()).map(\n (opt) => (opt.where ? compileSingleRowExpression(opt.where) : null),\n )\n\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n for (const {\n key: changedKey,\n value: newValue,\n } of txCommitted.changedRows) {\n const matchesAnySubset = subsetEvaluators.some((evaluator) => {\n if (!evaluator) return true\n return toBooleanPredicate(evaluator(newValue) as boolean | null)\n })\n\n if (matchesAnySubset) {\n this.syncControls.write?.({ type: `update`, value: newValue as T })\n } else if (this.collection?.get(changedKey as TKey) !== undefined) {\n this.syncControls.write?.({ type: `delete`, key: changedKey as TKey })\n }\n }\n\n for (const deletedKey of txCommitted.deletedKeys) {\n this.syncControls.write?.({ type: `delete`, key: deletedKey as TKey })\n }\n\n txCommitted.rowMetadataMutations?.forEach((mutation) => {\n if (mutation.type === `delete`) {\n this.syncControls.metadata?.row.delete(mutation.key as TKey)\n } else {\n this.syncControls.metadata?.row.set(\n mutation.key as TKey,\n mutation.value,\n )\n }\n })\n\n txCommitted.collectionMetadataMutations?.forEach((mutation) => {\n if (mutation.type === `delete`) {\n this.syncControls.metadata?.collection.delete(mutation.key)\n } else {\n this.syncControls.metadata?.collection.set(\n mutation.key,\n mutation.value,\n )\n }\n })\n\n this.syncControls.commit?.()\n })\n }\n\n private async reloadActiveSubsetsUnsafe(): Promise<void> {\n const activeSubsetOptions =\n this.activeSubsets.size > 0\n ? Array.from(this.activeSubsets.values())\n : [{}]\n\n this.isHydrating = true\n try {\n const mergedRows = new Map<TKey, { value: T; metadata?: unknown }>()\n const collectionMetadata = await this.loadCollectionMetadataSnapshot()\n for (const options of activeSubsetOptions) {\n const subsetRows = await this.loadSubsetRowsUnsafe(options)\n for (const row of subsetRows) {\n mergedRows.set(row.key, {\n value: row.value,\n metadata: row.metadata,\n })\n }\n }\n\n this.replaceCollectionSnapshot(\n Array.from(mergedRows.entries()).map(([key, row]) => ({\n key,\n value: row.value,\n metadata: row.metadata,\n })),\n collectionMetadata,\n )\n } finally {\n this.isHydrating = false\n }\n\n await this.flushQueuedHydrationTransactionsUnsafe()\n await this.flushQueuedTxCommittedUnsafe()\n }\n\n private attachIndexLifecycleListeners(): void {\n if (\n !this.collection ||\n this.indexAddedUnsubscribe ||\n this.indexRemovedUnsubscribe\n ) {\n return\n }\n\n this.indexAddedUnsubscribe = this.collection.on(`index:added`, (event) => {\n void this.ensurePersistedIndex(event.index)\n })\n this.indexRemovedUnsubscribe = this.collection.on(\n `index:removed`,\n (event) => {\n void this.markIndexRemoved(event.index)\n },\n )\n }\n\n private async bootstrapPersistedIndexes(\n indexMetadataSnapshot?: Array<CollectionIndexMetadata>,\n ): Promise<void> {\n const collection = this.collection\n if (!collection && !indexMetadataSnapshot) {\n return\n }\n\n const indexMetadata =\n indexMetadataSnapshot ?? collection?.getIndexMetadata() ?? []\n for (const metadata of indexMetadata) {\n await this.ensurePersistedIndex(metadata)\n }\n }\n\n private buildPersistedIndexSpec(\n index: CollectionIndexMetadata,\n ): PersistedIndexSpec {\n return {\n expressionSql: [stableSerialize(index.expression)],\n metadata: {\n name: index.name ?? null,\n resolver: toStableSerializable(index.resolver),\n options: toStableSerializable(index.options),\n },\n }\n }\n\n private async ensurePersistedIndex(\n indexMetadata: CollectionIndexMetadata,\n ): Promise<void> {\n const spec = this.buildPersistedIndexSpec(indexMetadata)\n\n try {\n await this.persistence.adapter.ensureIndex(\n this.collectionId,\n indexMetadata.signature,\n spec,\n )\n } catch (error) {\n console.warn(`Failed to ensure persisted index in adapter:`, error)\n }\n\n try {\n await this.persistence.coordinator.requestEnsurePersistedIndex(\n this.collectionId,\n indexMetadata.signature,\n spec,\n )\n } catch (error) {\n console.warn(\n `Failed to ensure persisted index through coordinator:`,\n error,\n )\n }\n }\n\n private async markIndexRemoved(\n indexMetadata: CollectionIndexMetadata,\n ): Promise<void> {\n if (!this.persistence.adapter.markIndexRemoved) {\n return\n }\n\n try {\n await this.persistence.adapter.markIndexRemoved(\n this.collectionId,\n indexMetadata.signature,\n )\n } catch (error) {\n console.warn(`Failed to mark persisted index removed:`, error)\n }\n }\n}\n\nfunction createWrappedSyncConfig<\n T extends object,\n TKey extends string | number,\n>(\n sourceSyncConfig: SyncConfig<T, TKey>,\n runtime: PersistedCollectionRuntime<T, TKey>,\n): SyncConfig<T, TKey> {\n return {\n ...sourceSyncConfig,\n sync: (params) => {\n const transactionStack: Array<OpenSyncTransaction<T, TKey>> = []\n const getOpenTransaction = () =>\n transactionStack[transactionStack.length - 1]\n let fullStartPromise: Promise<void> | null = null\n const cancelledLoadKeys = new Set<string>()\n const loadSubscriptionIds = new WeakMap<object, string>()\n let nextLoadSubscriptionId = 0\n const getLoadKey = (options: LoadSubsetOptions) => {\n const subscription = options.subscription as object | undefined\n if (subscription && typeof subscription === `object`) {\n const existingId = loadSubscriptionIds.get(subscription)\n if (existingId) {\n return `sub:${existingId}`\n }\n nextLoadSubscriptionId++\n const nextId = String(nextLoadSubscriptionId)\n loadSubscriptionIds.set(subscription, nextId)\n return `sub:${nextId}`\n }\n\n return `opts:${stableSerialize(normalizeSubsetOptionsForKey(options))}`\n }\n runtime.setSyncControls({\n begin: params.begin,\n write: params.write as SyncControlFns<T, TKey>[`write`],\n commit: params.commit,\n truncate: params.truncate,\n metadata: params.metadata ?? null,\n })\n runtime.setCollection(\n params.collection as Collection<T, TKey, PersistedCollectionUtils>,\n )\n\n const wrappedParams = {\n ...params,\n markReady: () => {\n void (fullStartPromise ?? runtime.ensureStarted())\n .then(() => {\n params.markReady()\n })\n .catch((error) => {\n console.warn(\n `Failed persisted sync startup before markReady:`,\n error,\n )\n params.markReady()\n })\n },\n begin: (options?: { immediate?: boolean }) => {\n const transaction: OpenSyncTransaction<T, TKey> = {\n operations: [],\n rowMetadataWrites: new Map(),\n collectionMetadataWrites: new Map(),\n truncate: false,\n internal: runtime.isApplyingInternally(),\n queuedBecauseHydrating:\n !runtime.isApplyingInternally() && runtime.isHydratingNow(),\n }\n transactionStack.push(transaction)\n\n if (!transaction.queuedBecauseHydrating) {\n params.begin(options)\n }\n },\n write: (message: ChangeMessageOrDeleteKeyMessage<T, TKey>) => {\n const normalization = runtime.normalizeSyncWriteMessage(message)\n const openTransaction = getOpenTransaction()\n\n if (!openTransaction) {\n params.write(normalization.forwardMessage)\n return\n }\n\n openTransaction.operations.push(normalization.operation)\n if (normalization.operation.type === `delete`) {\n openTransaction.rowMetadataWrites.set(normalization.operation.key, {\n type: `delete`,\n })\n } else if (\n message.type === `insert` &&\n normalization.operation.metadata === undefined\n ) {\n // Reset stale metadata for a fresh insert, but don't clobber an\n // explicit metadata write already queued for this key in the same\n // transaction (e.g. query reconcile stamps owners, then inserts).\n if (\n !openTransaction.rowMetadataWrites.has(\n normalization.operation.key,\n )\n ) {\n openTransaction.rowMetadataWrites.set(\n normalization.operation.key,\n {\n type: `delete`,\n },\n )\n }\n } else if (normalization.operation.metadata !== undefined) {\n openTransaction.rowMetadataWrites.set(normalization.operation.key, {\n type: `set`,\n value: normalization.operation.metadata,\n })\n }\n if (!openTransaction.queuedBecauseHydrating) {\n params.write(normalization.forwardMessage)\n }\n },\n metadata: params.metadata\n ? {\n row: {\n get: (key: TKey) => {\n const openTransaction = getOpenTransaction()\n const pendingWrite =\n openTransaction?.rowMetadataWrites.get(key)\n if (pendingWrite) {\n return pendingWrite.type === `delete`\n ? undefined\n : pendingWrite.value\n }\n if (openTransaction?.truncate) {\n return undefined\n }\n return params.metadata!.row.get(key)\n },\n scanPersisted: (options?: PersistedRowScanOptions) =>\n runtime.scanPersistedRows(options),\n set: (key: TKey, value: unknown) => {\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.row.set must be called within an open sync transaction`,\n )\n }\n openTransaction.rowMetadataWrites.set(key, {\n type: `set`,\n value,\n })\n if (!openTransaction.queuedBecauseHydrating) {\n params.metadata!.row.set(key, value)\n }\n },\n delete: (key: TKey) => {\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.row.delete must be called within an open sync transaction`,\n )\n }\n openTransaction.rowMetadataWrites.set(key, {\n type: `delete`,\n })\n if (!openTransaction.queuedBecauseHydrating) {\n params.metadata!.row.delete(key)\n }\n },\n },\n collection: {\n get: (key: string) => {\n const openTransaction = getOpenTransaction()\n const pendingWrite =\n openTransaction?.collectionMetadataWrites.get(key)\n if (pendingWrite) {\n return pendingWrite.type === `delete`\n ? undefined\n : pendingWrite.value\n }\n return params.metadata!.collection.get(key)\n },\n set: (key: string, value: unknown) => {\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.collection.set must be called within an open sync transaction`,\n )\n }\n openTransaction.collectionMetadataWrites.set(key, {\n type: `set`,\n value,\n })\n if (!openTransaction.queuedBecauseHydrating) {\n params.metadata!.collection.set(key, value)\n }\n },\n delete: (key: string) => {\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.collection.delete must be called within an open sync transaction`,\n )\n }\n openTransaction.collectionMetadataWrites.set(key, {\n type: `delete`,\n })\n if (!openTransaction.queuedBecauseHydrating) {\n params.metadata!.collection.delete(key)\n }\n },\n list: (prefix?: string) => {\n const merged = new Map(\n params\n .metadata!.collection.list()\n .map(({ key, value }) => [key, value]),\n )\n const openTransaction = getOpenTransaction()\n if (openTransaction) {\n for (const [\n key,\n metadataWrite,\n ] of openTransaction.collectionMetadataWrites) {\n if (metadataWrite.type === `delete`) {\n merged.delete(key)\n } else {\n merged.set(key, metadataWrite.value)\n }\n }\n }\n\n return Array.from(merged.entries())\n .filter(([key]) => (prefix ? key.startsWith(prefix) : true))\n .map(([key, value]) => ({\n key,\n value,\n }))\n },\n },\n }\n : undefined,\n truncate: () => {\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n params.truncate()\n return\n }\n\n openTransaction.operations = []\n openTransaction.rowMetadataWrites.clear()\n // Intentionally preserve collectionMetadataWrites across truncate.\n // Callers (for example electric resume/reset handling) may stage\n // collection-scoped metadata before truncating row data, and those\n // writes must commit atomically with the truncate transaction.\n openTransaction.truncate = true\n if (!openTransaction.queuedBecauseHydrating) {\n params.truncate()\n }\n },\n commit: (signal?: AbortSignal) => {\n const openTransaction = transactionStack.pop()\n if (!openTransaction) {\n return params.commit(signal)\n }\n\n if (openTransaction.queuedBecauseHydrating) {\n if (signal?.aborted) {\n const aborted = Promise.reject(new SyncTransactionAbortedError())\n void aborted.catch(() => undefined)\n return aborted\n }\n let resolveApplied!: () => void\n let rejectApplied!: (error: unknown) => void\n const applied = new Promise<void>((resolve, reject) => {\n resolveApplied = resolve\n rejectApplied = reject\n })\n void applied.catch(() => undefined)\n runtime.queueHydrationBufferedTransaction({\n operations: openTransaction.operations,\n rowMetadataWrites: openTransaction.rowMetadataWrites,\n collectionMetadataWrites:\n openTransaction.collectionMetadataWrites,\n truncate: openTransaction.truncate,\n internal: openTransaction.internal,\n signal,\n resolveApplied,\n rejectApplied,\n })\n return applied\n }\n\n const applied = params.commit(signal)\n if (!openTransaction.internal) {\n const persistAfterApplication = async () => {\n if (applied !== true) await applied\n await runtime.persistAndBroadcastExternalSyncTransaction({\n operations: openTransaction.operations,\n rowMetadataWrites: openTransaction.rowMetadataWrites,\n collectionMetadataWrites:\n openTransaction.collectionMetadataWrites,\n truncate: openTransaction.truncate,\n internal: false,\n })\n }\n const persisted = persistAfterApplication()\n void persisted.catch(() => undefined)\n return persisted\n }\n return applied\n },\n }\n\n let sourceResult: SyncConfigRes = {}\n const startupState = { cleanedUp: false }\n fullStartPromise = runtime.ensureStarted()\n const sourceResultPromise = (async () => {\n await runtime.ensureStartupMetadataLoaded()\n\n if (startupState.cleanedUp) {\n return sourceResult\n }\n\n sourceResult = normalizeSyncFnResult(\n sourceSyncConfig.sync(wrappedParams),\n )\n return sourceResult\n })()\n\n return {\n cleanup: () => {\n startupState.cleanedUp = true\n sourceResult.cleanup?.()\n runtime.cleanup()\n runtime.clearSyncControls()\n },\n loadSubset: async (options: LoadSubsetOptions) => {\n const loadKey = getLoadKey(options)\n cancelledLoadKeys.delete(loadKey)\n await fullStartPromise\n const resolvedSourceResult = await sourceResultPromise\n if (startupState.cleanedUp || cancelledLoadKeys.has(loadKey)) {\n return\n }\n await runtime.loadSubset(options, resolvedSourceResult.loadSubset)\n },\n unloadSubset: (options: LoadSubsetOptions) => {\n cancelledLoadKeys.add(getLoadKey(options))\n runtime.unloadSubset(options, sourceResult.unloadSubset)\n },\n }\n },\n }\n}\n\nfunction createLoopbackSyncConfig<\n T extends object,\n TKey extends string | number,\n>(runtime: PersistedCollectionRuntime<T, TKey>): SyncConfig<T, TKey> {\n return {\n sync: (params) => {\n runtime.setSyncControls({\n begin: params.begin,\n write: params.write as SyncControlFns<T, TKey>[`write`],\n commit: params.commit,\n truncate: params.truncate,\n metadata: params.metadata ?? null,\n })\n runtime.setCollection(\n params.collection as Collection<T, TKey, PersistedCollectionUtils>,\n )\n\n void runtime\n .ensureStarted()\n .then(() => {\n params.markReady()\n })\n .catch((error) => {\n console.warn(`Failed persisted loopback startup:`, error)\n params.markReady()\n })\n\n return {\n cleanup: () => {\n runtime.cleanup()\n runtime.clearSyncControls()\n },\n loadSubset: (options: LoadSubsetOptions) => runtime.loadSubset(options),\n unloadSubset: (options: LoadSubsetOptions) =>\n runtime.unloadSubset(options),\n }\n },\n getSyncMetadata: () => ({\n source: `persisted-phase-2-loopback`,\n }),\n }\n}\n\nexport function persistedCollectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: PersistedSyncWrappedOptions<T, TKey, TSchema, TUtils>,\n): PersistedSyncOptionsResult<T, TKey, TSchema, TUtils>\n\nexport function persistedCollectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: PersistedLocalOnlyOptions<T, TKey, TSchema, TUtils>,\n): PersistedLocalOnlyOptionsResult<T, TKey, TSchema, TUtils>\n\nexport function persistedCollectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options:\n | PersistedSyncWrappedOptions<T, TKey, TSchema, TUtils>\n | PersistedLocalOnlyOptions<T, TKey, TSchema, TUtils>,\n):\n | PersistedSyncOptionsResult<T, TKey, TSchema, TUtils>\n | PersistedLocalOnlyOptionsResult<T, TKey, TSchema, TUtils> {\n if (!isRecord(options.persistence)) {\n throw new InvalidPersistedCollectionConfigError(\n `persistedCollectionOptions requires a persistence adapter`,\n )\n }\n\n if (hasOwnSyncKey(options)) {\n if (!isValidSyncConfig(options.sync)) {\n throw new InvalidSyncConfigError(\n `when the \"sync\" key is present it must provide a callable sync function`,\n )\n }\n\n const { schemaVersion, ...syncOptions } = options\n const collectionId =\n syncOptions.id ?? `persisted-collection:${safeRandomUUID()}`\n const persistence = resolvePersistenceForCollection(\n syncOptions.persistence,\n {\n collectionId,\n mode: `sync-present`,\n schemaVersion,\n },\n )\n\n const runtime = new PersistedCollectionRuntime<T, TKey>(\n `sync-present`,\n collectionId,\n persistence,\n syncOptions.syncMode ?? `eager`,\n collectionId,\n )\n\n const result = {\n ...syncOptions,\n id: collectionId,\n sync: createWrappedSyncConfig<T, TKey>(syncOptions.sync, runtime),\n persistence,\n }\n\n return withCollectionConfigFactory(\n result,\n () =>\n persistedCollectionOptions({\n ...options,\n id: collectionId,\n }) as typeof result,\n )\n }\n\n const { schemaVersion, ...localOnlyOptions } = options\n const collectionId =\n localOnlyOptions.id ?? `persisted-collection:${safeRandomUUID()}`\n const persistence = resolvePersistenceForCollection(\n localOnlyOptions.persistence,\n {\n collectionId,\n mode: `sync-absent`,\n schemaVersion,\n },\n )\n const runtime = new PersistedCollectionRuntime<T, TKey>(\n `sync-absent`,\n collectionId,\n persistence,\n localOnlyOptions.syncMode ?? `eager`,\n localOnlyOptions.id ?? DEFAULT_DB_NAME,\n )\n\n const wrappedOnInsert = async (\n params: InsertMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const handlerResult = localOnlyOptions.onInsert\n ? await localOnlyOptions.onInsert(\n params as unknown as InsertMutationFnParams<T, TKey, TUtils>,\n )\n : undefined\n\n await runtime.persistAndConfirmCollectionMutations(\n params.transaction.mutations as Array<PendingMutation<T>>,\n )\n\n return handlerResult ?? {}\n }\n\n const wrappedOnUpdate = async (\n params: UpdateMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const handlerResult = localOnlyOptions.onUpdate\n ? await localOnlyOptions.onUpdate(\n params as unknown as UpdateMutationFnParams<T, TKey, TUtils>,\n )\n : undefined\n\n await runtime.persistAndConfirmCollectionMutations(\n params.transaction.mutations as Array<PendingMutation<T>>,\n )\n\n return handlerResult ?? {}\n }\n\n const wrappedOnDelete = async (\n params: DeleteMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const handlerResult = localOnlyOptions.onDelete\n ? await localOnlyOptions.onDelete(\n params as unknown as DeleteMutationFnParams<T, TKey, TUtils>,\n )\n : undefined\n\n await runtime.persistAndConfirmCollectionMutations(\n params.transaction.mutations as Array<PendingMutation<T>>,\n )\n\n return handlerResult ?? {}\n }\n\n const acceptMutations = async (transaction: {\n mutations: Array<PendingMutation<Record<string, unknown>>>\n }) => {\n await runtime.acceptTransactionMutations(transaction)\n }\n\n const persistedUtils: PersistedCollectionUtils = {\n acceptMutations,\n getLeadershipState: () => runtime.getLeadershipState(),\n forceReloadSubset: (subsetOptions: LoadSubsetOptions) =>\n runtime.forceReloadSubset(subsetOptions),\n }\n\n const mergedUtils = {\n ...(localOnlyOptions.utils ?? ({} as TUtils)),\n ...persistedUtils,\n }\n\n const result = {\n ...localOnlyOptions,\n id: collectionId,\n persistence,\n sync: createLoopbackSyncConfig(runtime),\n onInsert: wrappedOnInsert,\n onUpdate: wrappedOnUpdate,\n onDelete: wrappedOnDelete,\n utils: mergedUtils,\n startSync: true,\n gcTime: localOnlyOptions.gcTime ?? 0,\n }\n\n return withCollectionConfigFactory(\n result,\n () =>\n persistedCollectionOptions({\n ...options,\n id: collectionId,\n }) as typeof result,\n )\n}\n\nexport function encodePersistedStorageKey(key: string | number): string {\n if (typeof key === `number`) {\n if (!Number.isFinite(key)) {\n throw new InvalidPersistedStorageKeyError(key)\n }\n\n if (Object.is(key, -0)) {\n return `n:-0`\n }\n\n return `n:${key}`\n }\n\n return `s:${key}`\n}\n\nexport function decodePersistedStorageKey(encoded: string): string | number {\n if (encoded === `n:-0`) {\n return -0\n }\n\n if (encoded.startsWith(`n:`)) {\n return Number(encoded.slice(2))\n }\n\n if (encoded.startsWith(`s:`)) {\n return encoded.slice(2)\n }\n\n throw new InvalidPersistedStorageKeyEncodingError(encoded)\n}\n\nconst PERSISTED_TABLE_NAME_ALPHABET = `abcdefghijklmnopqrstuvwxyz234567`\n\nfunction hashCollectionId(collectionId: string): number {\n let hash = 0x811c9dc5\n\n for (let index = 0; index < collectionId.length; index++) {\n hash ^= collectionId.charCodeAt(index)\n hash = Math.imul(hash, 0x01000193)\n }\n\n return hash >>> 0\n}\n\nfunction toBase32(input: number): string {\n if (input === 0) {\n return PERSISTED_TABLE_NAME_ALPHABET.charAt(0)\n }\n\n let value = input >>> 0\n let output = ``\n\n while (value > 0) {\n output = `${PERSISTED_TABLE_NAME_ALPHABET.charAt(value % 32)}${output}`\n value = Math.floor(value / 32)\n }\n\n return output\n}\n\nexport function createPersistedTableName(\n collectionId: string,\n prefix: `c` | `t` = `c`,\n): string {\n if (!collectionId) {\n throw new InvalidPersistedCollectionConfigError(\n `collectionId is required to derive a persisted table name`,\n )\n }\n\n const hashPart = toBase32(hashCollectionId(collectionId))\n const lengthPart = collectionId.length.toString(36)\n\n return `${prefix}_${hashPart}_${lengthPart}`\n}\n"],"names":["safeRandomUUID","InvalidPersistedCollectionCoordinatorError","InvalidPersistenceAdapterError","InvalidPersistedCollectionConfigError","key","SyncTransactionAbortedError","compileSingleRowExpression","toBooleanPredicate","applied","InvalidSyncConfigError","schemaVersion","collectionId","persistence","runtime","result","withCollectionConfigFactory","InvalidPersistedStorageKeyError","InvalidPersistedStorageKeyEncodingError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"persisted.cjs","sources":["../../src/persisted.ts"],"sourcesContent":["import {\n SyncTransactionAbortedError,\n compileSingleRowExpression,\n safeRandomUUID,\n toBooleanPredicate,\n withCollectionConfigFactory,\n} from '@tanstack/db'\nimport {\n InvalidPersistedCollectionConfigError,\n InvalidPersistedCollectionCoordinatorError,\n InvalidPersistedStorageKeyEncodingError,\n InvalidPersistedStorageKeyError,\n InvalidPersistenceAdapterError,\n InvalidSyncConfigError,\n} from './errors'\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\nimport type {\n ChangeMessageOrDeleteKeyMessage,\n Collection,\n CollectionConfig,\n CollectionIndexMetadata,\n DeleteMutationFnParams,\n InsertMutationFnParams,\n LoadSubsetFn,\n LoadSubsetOptions,\n PendingMutation,\n SyncAppliedReceipt,\n SyncConfig,\n SyncConfigRes,\n SyncMetadataApi,\n UpdateMutationFnParams,\n UtilsRecord,\n} from '@tanstack/db'\n\nexport type PersistedMutationEnvelope =\n | {\n mutationId: string\n type: `insert`\n key: string | number\n value: Record<string, unknown>\n }\n | {\n mutationId: string\n type: `update`\n key: string | number\n value: Record<string, unknown>\n }\n | {\n mutationId: string\n type: `delete`\n key: string | number\n value: Record<string, unknown>\n }\n\nexport type ProtocolEnvelope<TPayload> = {\n v: 1\n dbName: string\n collectionId: string\n senderId: string\n ts: number\n payload: TPayload\n}\n\nexport type LeaderHeartbeat = {\n type: `leader:heartbeat`\n term: number\n leaderId: string\n latestSeq: number\n latestRowVersion: number\n}\n\nexport type TxCommitted = {\n type: `tx:committed`\n term: number\n seq: number\n txId: string\n latestRowVersion: number\n} & (\n | {\n requiresFullReload: true\n }\n | {\n requiresFullReload: false\n changedRows: Array<{\n key: string | number\n value: Record<string, unknown>\n }>\n deletedKeys: Array<string | number>\n rowMetadataMutations?: Array<\n PersistedRowMetadataMutation<string | number>\n >\n collectionMetadataMutations?: Array<PersistedCollectionMetadataMutation>\n }\n)\n\nexport type EnsureRemoteSubsetRequest = {\n type: `rpc:ensureRemoteSubset:req`\n rpcId: string\n options: LoadSubsetOptions\n}\n\nexport type EnsureRemoteSubsetResponse =\n | {\n type: `rpc:ensureRemoteSubset:res`\n rpcId: string\n ok: true\n }\n | {\n type: `rpc:ensureRemoteSubset:res`\n rpcId: string\n ok: false\n error: string\n }\n\nexport type ApplyLocalMutationsRequest = {\n type: `rpc:applyLocalMutations:req`\n rpcId: string\n envelopeId: string\n mutations: Array<PersistedMutationEnvelope>\n}\n\nexport type ApplyLocalMutationsResponse =\n | {\n type: `rpc:applyLocalMutations:res`\n rpcId: string\n ok: true\n term: number\n seq: number\n latestRowVersion: number\n acceptedMutationIds: Array<string>\n }\n | {\n type: `rpc:applyLocalMutations:res`\n rpcId: string\n ok: false\n code: `NOT_LEADER` | `VALIDATION_ERROR` | `CONFLICT` | `TIMEOUT`\n error: string\n }\n\nexport type PullSinceRequest = {\n type: `rpc:pullSince:req`\n rpcId: string\n fromRowVersion: number\n}\n\nexport type PullSinceResponse =\n | {\n type: `rpc:pullSince:res`\n rpcId: string\n ok: true\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n requiresFullReload: true\n }\n | {\n type: `rpc:pullSince:res`\n rpcId: string\n ok: true\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n requiresFullReload: false\n changedKeys: Array<string | number>\n deletedKeys: Array<string | number>\n deltas?: Array<\n ReplayableTxDelta<Record<string, unknown>, string | number>\n >\n }\n | {\n type: `rpc:pullSince:res`\n rpcId: string\n ok: false\n error: string\n }\n\nexport type CollectionReset = {\n type: `collection:reset`\n schemaVersion: number\n resetEpoch: number\n}\n\nexport interface PersistedIndexSpec {\n readonly expressionSql: ReadonlyArray<string>\n readonly whereSql?: string\n readonly metadata?: Readonly<Record<string, unknown>>\n}\n\nexport type PersistedRowMetadataMutation<\n TKey extends string | number = string | number,\n> = { type: `set`; key: TKey; value: unknown } | { type: `delete`; key: TKey }\n\nexport type PersistedCollectionMetadataMutation =\n | { type: `set`; key: string; value: unknown }\n | { type: `delete`; key: string }\n\nexport type ReplayableTxDelta<\n T extends Record<string, unknown> = Record<string, unknown>,\n TKey extends string | number = string | number,\n> = {\n txId: string\n latestRowVersion: number\n changedRows: Array<{ key: TKey; value: T }>\n deletedKeys: Array<TKey>\n rowMetadataMutations: Array<PersistedRowMetadataMutation<TKey>>\n collectionMetadataMutations: Array<PersistedCollectionMetadataMutation>\n}\n\nexport type PersistedScannedRow<\n T extends object = Record<string, unknown>,\n TKey extends string | number = string | number,\n> = {\n key: TKey\n value: T\n metadata?: unknown\n}\n\nexport type PersistedRowScanOptions = {\n metadataOnly?: boolean\n}\n\nexport type PersistedTx<\n T extends object = Record<string, unknown>,\n TKey extends string | number = string | number,\n> = {\n txId: string\n term: number\n seq: number\n rowVersion: number\n truncate?: boolean\n mutations: Array<\n | {\n type: `insert`\n key: TKey\n value: T\n metadata?: unknown\n metadataChanged?: boolean\n }\n | {\n type: `update`\n key: TKey\n value: T\n metadata?: unknown\n metadataChanged?: boolean\n }\n | { type: `delete`; key: TKey; value: T }\n >\n rowMetadataMutations?: Array<PersistedRowMetadataMutation<TKey>>\n collectionMetadataMutations?: Array<PersistedCollectionMetadataMutation>\n}\n\nexport interface PersistenceAdapter {\n loadSubset: (\n collectionId: string,\n options: LoadSubsetOptions,\n ctx?: { requiredIndexSignatures?: ReadonlyArray<string> },\n ) => Promise<\n Array<{\n key: string | number\n value: Record<string, unknown>\n metadata?: unknown\n }>\n >\n applyCommittedTx: (collectionId: string, tx: PersistedTx) => Promise<void>\n loadCollectionMetadata?: (\n collectionId: string,\n ) => Promise<Array<{ key: string; value: unknown }>>\n scanRows?: (\n collectionId: string,\n options?: PersistedRowScanOptions,\n ) => Promise<Array<PersistedScannedRow>>\n ensureIndex: (\n collectionId: string,\n signature: string,\n spec: PersistedIndexSpec,\n ) => Promise<void>\n markIndexRemoved?: (collectionId: string, signature: string) => Promise<void>\n getStreamPosition?: (collectionId: string) => Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }>\n}\n\nexport interface SQLiteDriver {\n exec: (sql: string) => Promise<void>\n query: <T>(\n sql: string,\n params?: ReadonlyArray<unknown>,\n ) => Promise<ReadonlyArray<T>>\n run: (sql: string, params?: ReadonlyArray<unknown>) => Promise<void>\n transaction: <T>(\n fn: (transactionDriver: SQLiteDriver) => Promise<T>,\n ) => Promise<T>\n transactionWithDriver?: <T>(\n fn: (transactionDriver: SQLiteDriver) => Promise<T>,\n ) => Promise<T>\n}\n\nexport interface PersistedCollectionCoordinator {\n getNodeId: () => string\n subscribe: (\n collectionId: string,\n onMessage: (message: ProtocolEnvelope<unknown>) => void,\n ) => () => void\n publish: (collectionId: string, message: ProtocolEnvelope<unknown>) => void\n isLeader: (collectionId: string) => boolean\n ensureLeadership: (collectionId: string) => Promise<void>\n requestEnsureRemoteSubset?: (\n collectionId: string,\n options: LoadSubsetOptions,\n ) => Promise<void>\n requestEnsurePersistedIndex: (\n collectionId: string,\n signature: string,\n spec: PersistedIndexSpec,\n ) => Promise<void>\n requestApplyLocalMutations?: (\n collectionId: string,\n mutations: Array<PersistedMutationEnvelope>,\n ) => Promise<ApplyLocalMutationsResponse>\n pullSince?: (\n collectionId: string,\n fromRowVersion: number,\n ) => Promise<PullSinceResponse>\n}\n\nexport interface PersistedCollectionPersistence {\n adapter: PersistenceAdapter\n coordinator?: PersistedCollectionCoordinator\n resolvePersistenceForCollection?: (options: {\n collectionId: string\n mode: PersistedCollectionMode\n schemaVersion?: number\n }) => PersistedCollectionPersistence\n resolvePersistenceForMode?: (\n mode: PersistedCollectionMode,\n ) => PersistedCollectionPersistence\n}\n\ntype PersistedResolvedPersistence = PersistedCollectionPersistence & {\n coordinator: PersistedCollectionCoordinator\n}\n\nexport type PersistedCollectionLeadershipState = {\n nodeId: string\n isLeader: boolean\n}\n\nexport interface PersistedCollectionUtils extends UtilsRecord {\n acceptMutations: (transaction: {\n mutations: Array<PendingMutation<Record<string, unknown>>>\n }) => Promise<void> | void\n getLeadershipState?: () => PersistedCollectionLeadershipState\n forceReloadSubset?: (options: LoadSubsetOptions) => Promise<void> | void\n}\n\nexport type PersistedSyncWrappedOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n> = CollectionConfig<T, TKey, TSchema, TUtils> & {\n sync: SyncConfig<T, TKey>\n persistence: PersistedCollectionPersistence\n schemaVersion?: number\n}\n\nexport type PersistedLocalOnlyOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n> = Omit<CollectionConfig<T, TKey, TSchema, TUtils>, `sync`> & {\n persistence: PersistedCollectionPersistence\n schemaVersion?: number\n}\n\ntype PersistedSyncOptionsResult<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TUtils extends UtilsRecord,\n> = CollectionConfig<T, TKey, TSchema, TUtils> & {\n persistence: PersistedResolvedPersistence\n}\n\ntype PersistedLocalOnlyOptionsResult<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TUtils extends UtilsRecord,\n> = CollectionConfig<T, TKey, TSchema, TUtils & PersistedCollectionUtils> & {\n id: string\n persistence: PersistedResolvedPersistence\n utils: TUtils & PersistedCollectionUtils\n}\n\nconst REQUIRED_COORDINATOR_METHODS: ReadonlyArray<\n keyof Pick<\n PersistedCollectionCoordinator,\n | `getNodeId`\n | `subscribe`\n | `publish`\n | `isLeader`\n | `ensureLeadership`\n | `requestEnsurePersistedIndex`\n >\n> = [\n `getNodeId`,\n `subscribe`,\n `publish`,\n `isLeader`,\n `ensureLeadership`,\n `requestEnsurePersistedIndex`,\n]\n\nconst REQUIRED_ADAPTER_METHODS: ReadonlyArray<\n keyof Pick<\n PersistenceAdapter,\n `loadSubset` | `applyCommittedTx` | `ensureIndex`\n >\n> = [`loadSubset`, `applyCommittedTx`, `ensureIndex`]\n\nconst TARGETED_INVALIDATION_KEY_LIMIT = 128\nconst DEFAULT_DB_NAME = `tanstack-db`\nconst REMOTE_ENSURE_RETRY_DELAY_MS = 50\n\ntype SyncControlFns<T extends object, TKey extends string | number> = {\n begin: ((options?: { immediate?: boolean }) => void) | null\n write:\n | ((\n message:\n | { type: `insert`; value: T; metadata?: Record<string, unknown> }\n | { type: `update`; value: T; metadata?: Record<string, unknown> }\n | { type: `delete`; key: TKey },\n ) => void)\n | null\n commit: ((signal?: AbortSignal) => SyncAppliedReceipt) | null\n truncate: (() => void) | null\n metadata: SyncMetadataApi<TKey> | null\n}\n\n/**\n * Phase-0 coordinator implementation for single-process runtimes.\n * It satisfies the coordinator contract without cross-process transport.\n */\nexport class SingleProcessCoordinator implements PersistedCollectionCoordinator {\n private readonly nodeId: string\n\n constructor(nodeId: string = safeRandomUUID()) {\n this.nodeId = nodeId\n }\n\n public getNodeId(): string {\n return this.nodeId\n }\n\n public subscribe(): () => void {\n return () => {}\n }\n\n public publish(): void {}\n\n public isLeader(): boolean {\n return true\n }\n\n public async ensureLeadership(): Promise<void> {}\n\n public async requestEnsureRemoteSubset(): Promise<void> {}\n\n public async requestEnsurePersistedIndex(): Promise<void> {}\n\n public pullSince(): Promise<PullSinceResponse> {\n return Promise.resolve({\n type: `rpc:pullSince:res`,\n rpcId: safeRandomUUID(),\n ok: true,\n latestTerm: 1,\n latestSeq: 0,\n latestRowVersion: 0,\n requiresFullReload: false,\n changedKeys: [],\n deletedKeys: [],\n deltas: [],\n })\n }\n}\n\nexport function validatePersistedCollectionCoordinator(\n coordinator: PersistedCollectionCoordinator,\n): void {\n for (const method of REQUIRED_COORDINATOR_METHODS) {\n if (typeof coordinator[method] !== `function`) {\n throw new InvalidPersistedCollectionCoordinatorError(method)\n }\n }\n}\n\nfunction validatePersistenceAdapter(adapter: PersistenceAdapter): void {\n for (const method of REQUIRED_ADAPTER_METHODS) {\n if (typeof adapter[method] !== `function`) {\n throw new InvalidPersistenceAdapterError(method)\n }\n }\n}\n\nfunction resolvePersistence(\n persistence: PersistedCollectionPersistence,\n): PersistedResolvedPersistence {\n validatePersistenceAdapter(persistence.adapter)\n\n const coordinator = persistence.coordinator ?? new SingleProcessCoordinator()\n validatePersistedCollectionCoordinator(coordinator)\n\n return {\n ...persistence,\n coordinator,\n }\n}\n\nfunction resolvePersistenceForMode(\n persistence: PersistedCollectionPersistence,\n mode: PersistedCollectionMode,\n): PersistedResolvedPersistence {\n const modeSpecificPersistence = persistence.resolvePersistenceForMode?.(mode)\n return resolvePersistence(modeSpecificPersistence ?? persistence)\n}\n\nfunction resolvePersistenceForCollection(\n persistence: PersistedCollectionPersistence,\n options: {\n collectionId: string\n mode: PersistedCollectionMode\n schemaVersion?: number\n },\n): PersistedResolvedPersistence {\n const collectionSpecificPersistence =\n persistence.resolvePersistenceForCollection?.(options)\n if (collectionSpecificPersistence) {\n return resolvePersistence(collectionSpecificPersistence)\n }\n\n return resolvePersistenceForMode(persistence, options.mode)\n}\n\nfunction hasOwnSyncKey(options: object): options is { sync: unknown } {\n return Object.prototype.hasOwnProperty.call(options, `sync`)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === `object` && value !== null\n}\n\nfunction isValidSyncConfig(value: unknown): value is SyncConfig<object> {\n if (!isRecord(value)) {\n return false\n }\n\n return typeof value.sync === `function`\n}\n\nexport type PersistedCollectionMode = `sync-present` | `sync-absent`\ntype PersistedMode = PersistedCollectionMode\n\ntype NormalizedSyncOperation<T extends object, TKey extends string | number> =\n | {\n type: `update`\n key: TKey\n value: T\n metadata?: Record<string, unknown>\n }\n | {\n type: `delete`\n key: TKey\n value: T\n }\n\ntype BufferedSyncTransaction<T extends object, TKey extends string | number> = {\n operations: Array<NormalizedSyncOperation<T, TKey>>\n rowMetadataWrites: Map<\n TKey,\n { type: `set`; value: unknown } | { type: `delete` }\n >\n collectionMetadataWrites: Map<\n string,\n { type: `set`; value: unknown } | { type: `delete` }\n >\n truncate: boolean\n internal: boolean\n signal?: AbortSignal\n resolveApplied?: () => void\n rejectApplied?: (error: unknown) => void\n}\n\ntype OpenSyncTransaction<\n T extends object,\n TKey extends string | number,\n> = BufferedSyncTransaction<T, TKey> & {\n queuedBecauseHydrating: boolean\n}\n\ntype SyncWriteNormalization<T extends object, TKey extends string | number> = {\n forwardMessage:\n | {\n type: `update`\n value: T\n metadata?: Record<string, unknown>\n }\n | {\n type: `delete`\n key: TKey\n }\n operation: NormalizedSyncOperation<T, TKey>\n}\n\nclass ApplyMutex {\n private queue: Promise<void> = Promise.resolve()\n\n async run<T>(task: () => Promise<T>): Promise<T> {\n const taskPromise = this.queue.then(() => task())\n this.queue = taskPromise.then(\n () => undefined,\n () => undefined,\n )\n return taskPromise\n }\n}\n\nfunction toStableSerializable(value: unknown): unknown {\n if (value == null) {\n return value\n }\n\n switch (typeof value) {\n case `string`:\n case `number`:\n case `boolean`:\n return value\n case `bigint`:\n return value.toString()\n case `function`:\n case `symbol`:\n case `undefined`:\n return undefined\n }\n\n if (value instanceof Date) {\n return value.toISOString()\n }\n\n if (Array.isArray(value)) {\n return value\n .map((entry) => toStableSerializable(entry))\n .filter((entry) => entry !== undefined)\n }\n\n if (value instanceof Set) {\n return Array.from(value)\n .map((entry) => toStableSerializable(entry))\n .filter((entry) => entry !== undefined)\n .sort((left, right) => {\n const leftSerialized = JSON.stringify(left)\n const rightSerialized = JSON.stringify(right)\n return leftSerialized < rightSerialized\n ? -1\n : leftSerialized > rightSerialized\n ? 1\n : 0\n })\n }\n\n if (value instanceof Map) {\n return Array.from(value.entries())\n .map(([key, mapValue]) => ({\n key: toStableSerializable(key),\n value: toStableSerializable(mapValue),\n }))\n .filter((entry) => entry.key !== undefined && entry.value !== undefined)\n .sort((left, right) => {\n const leftSerialized = JSON.stringify(left.key)\n const rightSerialized = JSON.stringify(right.key)\n return leftSerialized < rightSerialized\n ? -1\n : leftSerialized > rightSerialized\n ? 1\n : 0\n })\n }\n\n const record = value as Record<string, unknown>\n const orderedKeys = Object.keys(record).sort((left, right) =>\n left < right ? -1 : left > right ? 1 : 0,\n )\n const serializableRecord: Record<string, unknown> = {}\n for (const key of orderedKeys) {\n const serializableValue = toStableSerializable(record[key])\n if (serializableValue !== undefined) {\n serializableRecord[key] = serializableValue\n }\n }\n return serializableRecord\n}\n\nfunction stableSerialize(value: unknown): string {\n return JSON.stringify(toStableSerializable(value) ?? null)\n}\n\nfunction normalizeSubsetOptionsForKey(\n options: LoadSubsetOptions,\n): Record<string, unknown> {\n return {\n where: toStableSerializable(options.where),\n orderBy: toStableSerializable(options.orderBy),\n limit: options.limit,\n cursor: toStableSerializable(options.cursor),\n offset: options.offset,\n }\n}\n\nfunction normalizeSyncFnResult(result: void | (() => void) | SyncConfigRes) {\n if (typeof result === `function`) {\n return { cleanup: result } satisfies SyncConfigRes\n }\n\n if (result === undefined) {\n return {} satisfies SyncConfigRes\n }\n\n return result\n}\n\nfunction isTxCommittedPayload(payload: unknown): payload is TxCommitted {\n if (!isRecord(payload) || payload.type !== `tx:committed`) {\n return false\n }\n\n if (\n typeof payload.term !== `number` ||\n typeof payload.seq !== `number` ||\n typeof payload.txId !== `string` ||\n typeof payload.latestRowVersion !== `number` ||\n typeof payload.requiresFullReload !== `boolean`\n ) {\n return false\n }\n\n if (payload.requiresFullReload) {\n return true\n }\n\n return (\n Array.isArray(payload.changedRows) &&\n Array.isArray(payload.deletedKeys) &&\n (payload.rowMetadataMutations === undefined ||\n Array.isArray(payload.rowMetadataMutations)) &&\n (payload.collectionMetadataMutations === undefined ||\n Array.isArray(payload.collectionMetadataMutations))\n )\n}\n\nfunction isCollectionResetPayload(\n payload: unknown,\n): payload is CollectionReset {\n return (\n isRecord(payload) &&\n payload.type === `collection:reset` &&\n typeof payload.schemaVersion === `number` &&\n typeof payload.resetEpoch === `number`\n )\n}\n\nfunction toPersistedMutationEnvelope(\n mutation: PendingMutation<Record<string, unknown>>,\n): PersistedMutationEnvelope {\n const key = mutation.key as string | number\n const value =\n mutation.type === `delete`\n ? (mutation.original as Record<string, unknown>)\n : mutation.modified\n\n return {\n mutationId: mutation.mutationId,\n type: mutation.type,\n key,\n value,\n }\n}\n\nclass PersistedCollectionRuntime<\n T extends object,\n TKey extends string | number,\n> {\n private readonly applyMutex = new ApplyMutex()\n private readonly activeSubsets = new Map<string, LoadSubsetOptions>()\n private readonly pendingRemoteSubsetEnsures = new Map<\n string,\n LoadSubsetOptions\n >()\n private readonly queuedHydrationTransactions: Array<\n BufferedSyncTransaction<T, TKey>\n > = []\n private readonly queuedTxCommitted: Array<TxCommitted> = []\n private readonly subscriptionIds = new WeakMap<object, string>()\n\n private collection: Collection<T, TKey, PersistedCollectionUtils> | null =\n null\n private syncControls: SyncControlFns<T, TKey> = {\n begin: null,\n write: null,\n commit: null,\n truncate: null,\n metadata: null,\n }\n private started = false\n private startupMetadataPromise: Promise<void> | null = null\n private startPromise: Promise<void> | null = null\n private internalApplyDepth = 0\n private appliedReceiptSequence = 0\n private readonly pendingAppliedReceipts = new Map<number, Promise<void>>()\n private isHydrating = false\n private coordinatorUnsubscribe: (() => void) | null = null\n private indexAddedUnsubscribe: (() => void) | null = null\n private indexRemovedUnsubscribe: (() => void) | null = null\n private remoteEnsureRetryTimer: ReturnType<typeof setTimeout> | null = null\n private nextSubscriptionId = 0\n\n private latestTerm = 0\n private latestSeq = 0\n private latestRowVersion = 0\n private localTerm = 1\n private localSeq = 0\n private localRowVersion = 0\n\n constructor(\n private readonly mode: PersistedMode,\n private readonly collectionId: string,\n private readonly persistence: PersistedResolvedPersistence,\n private readonly syncMode: `eager` | `on-demand`,\n private readonly dbName: string,\n ) {}\n\n setSyncControls(syncControls: SyncControlFns<T, TKey>): void {\n const commit = syncControls.commit\n this.syncControls = {\n ...syncControls,\n commit: commit\n ? (signal) => this.trackAppliedReceipt(commit(signal))\n : null,\n }\n }\n\n private trackAppliedReceipt(receipt: SyncAppliedReceipt): SyncAppliedReceipt {\n const sequence = ++this.appliedReceiptSequence\n if (receipt === true) {\n return true\n }\n this.pendingAppliedReceipts.set(sequence, receipt)\n const removeReceipt = () => this.pendingAppliedReceipts.delete(sequence)\n void receipt.then(removeReceipt, removeReceipt)\n return receipt\n }\n\n private async waitForAppliedReceiptsAfter(cursor: number): Promise<void> {\n await Promise.all(\n Array.from(this.pendingAppliedReceipts, ([sequence, receipt]) =>\n sequence > cursor ? receipt : undefined,\n ),\n )\n }\n\n clearSyncControls(): void {\n this.syncControls = {\n begin: null,\n write: null,\n commit: null,\n truncate: null,\n metadata: null,\n }\n }\n\n isHydratingNow(): boolean {\n return this.isHydrating\n }\n\n isApplyingInternally(): boolean {\n return this.internalApplyDepth > 0\n }\n\n setCollection(\n collection: Collection<T, TKey, PersistedCollectionUtils>,\n ): void {\n if (this.collection === collection) {\n return\n }\n\n this.collection = collection\n this.attachCoordinatorSubscription()\n }\n\n getLeadershipState(): PersistedCollectionLeadershipState {\n return {\n nodeId: this.persistence.coordinator.getNodeId(),\n isLeader: this.persistence.coordinator.isLeader(this.collectionId),\n }\n }\n\n async ensureStarted(): Promise<void> {\n if (this.startPromise) {\n return this.startPromise\n }\n\n this.startPromise = this.startInternal()\n return this.startPromise\n }\n\n async ensureStartupMetadataLoaded(): Promise<void> {\n if (this.startupMetadataPromise) {\n return this.startupMetadataPromise\n }\n\n this.startupMetadataPromise = this.loadStartupMetadataInternal()\n return this.startupMetadataPromise\n }\n\n private async startInternal(): Promise<void> {\n if (this.started) {\n return\n }\n\n this.started = true\n\n await this.ensureStartupMetadataLoaded()\n\n const indexBootstrapSnapshot = this.collection?.getIndexMetadata() ?? []\n this.attachIndexLifecycleListeners()\n await this.bootstrapPersistedIndexes(indexBootstrapSnapshot)\n\n if (this.syncMode !== `on-demand`) {\n this.activeSubsets.set(this.getSubsetKey({}), {})\n const appliedCursor = this.appliedReceiptSequence\n await this.applyMutex.run(() =>\n this.hydrateSubsetUnsafe({}, { requestRemoteEnsure: false }),\n )\n await this.waitForAppliedReceiptsAfter(appliedCursor)\n }\n }\n\n private async loadStartupMetadataInternal(): Promise<void> {\n // Restore stream position from the database so that new mutations\n // don't collide with previously applied transactions.\n if (this.persistence.adapter.getStreamPosition) {\n const position = await this.persistence.adapter.getStreamPosition(\n this.collectionId,\n )\n this.observeStreamPosition(\n position.latestTerm,\n position.latestSeq,\n position.latestRowVersion,\n )\n }\n\n await this.loadCollectionMetadataIntoCollection()\n }\n\n private async loadCollectionMetadataIntoCollection(): Promise<void> {\n const collectionMetadata = await this.loadCollectionMetadataSnapshot()\n this.replaceCollectionMetadataSnapshot(collectionMetadata)\n }\n\n private async loadCollectionMetadataSnapshot(): Promise<\n Array<{ key: string; value: unknown }>\n > {\n if (!this.persistence.adapter.loadCollectionMetadata) {\n return []\n }\n\n return this.persistence.adapter.loadCollectionMetadata(this.collectionId)\n }\n\n private replaceCollectionMetadataSnapshot(\n collectionMetadata: Array<{ key: string; value: unknown }>,\n ): void {\n if (\n !this.syncControls.begin ||\n !this.syncControls.commit ||\n !this.syncControls.metadata\n ) {\n return\n }\n\n const nextMetadata = new Map(\n collectionMetadata.map(({ key, value }) => [key, value]),\n )\n const currentKeys = this.syncControls.metadata.collection\n .list()\n .map(({ key }) => key)\n\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n currentKeys.forEach((key) => {\n if (!nextMetadata.has(key)) {\n this.syncControls.metadata?.collection.delete(key)\n }\n })\n\n nextMetadata.forEach((value, key) => {\n this.syncControls.metadata?.collection.set(key, value)\n })\n\n this.syncControls.commit?.()\n })\n }\n\n async loadSubset(\n options: LoadSubsetOptions,\n upstreamLoadSubset?: LoadSubsetFn,\n ): Promise<void> {\n this.activeSubsets.set(this.getSubsetKey(options), options)\n\n const appliedCursor = this.appliedReceiptSequence\n await this.applyMutex.run(() =>\n this.hydrateSubsetUnsafe(options, {\n requestRemoteEnsure: this.mode === `sync-present`,\n }),\n )\n await this.waitForAppliedReceiptsAfter(appliedCursor)\n\n if (upstreamLoadSubset) {\n try {\n await upstreamLoadSubset(options)\n } catch (error) {\n if (\n options.signal?.aborted ||\n (typeof error === `object` &&\n error !== null &&\n `name` in error &&\n error.name === `AbortError`)\n ) {\n this.pendingRemoteSubsetEnsures.delete(this.getSubsetKey(options))\n throw error\n }\n console.warn(`Failed to trigger remote subset load:`, error)\n this.queueRemoteSubsetEnsure(options)\n }\n }\n }\n\n unloadSubset(\n options: LoadSubsetOptions,\n upstreamUnloadSubset?: (options: LoadSubsetOptions) => void,\n ): void {\n this.activeSubsets.delete(this.getSubsetKey(options))\n this.pendingRemoteSubsetEnsures.delete(this.getSubsetKey(options))\n upstreamUnloadSubset?.(options)\n }\n\n async forceReloadSubset(options: LoadSubsetOptions): Promise<void> {\n this.activeSubsets.set(this.getSubsetKey(options), options)\n await this.applyMutex.run(() =>\n this.hydrateSubsetUnsafe(options, { requestRemoteEnsure: false }),\n )\n }\n\n queueHydrationBufferedTransaction(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): void {\n this.queuedHydrationTransactions.push(transaction)\n }\n\n async persistAndBroadcastExternalSyncTransaction(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): Promise<void> {\n await this.applyMutex.run(() =>\n this.persistAndBroadcastExternalSyncTransactionUnsafe(transaction),\n )\n }\n\n normalizeSyncWriteMessage(\n message: ChangeMessageOrDeleteKeyMessage<T, TKey>,\n ): SyncWriteNormalization<T, TKey> {\n if (!this.collection) {\n throw new InvalidPersistedCollectionConfigError(\n `collection must be attached before sync writes are processed`,\n )\n }\n\n if (`key` in message) {\n const key = message.key\n const previousValue = this.collection.get(key) ?? ({} as T)\n\n return {\n forwardMessage: {\n type: `delete`,\n key,\n },\n operation: {\n type: `delete`,\n key,\n value: previousValue,\n },\n }\n }\n\n // Handle delete messages that include the full value instead of just a key\n // (e.g. from queryCollectionOptions which sends { type: 'delete', value: oldItem })\n if (message.type === `delete`) {\n const key = this.collection.getKeyFromItem(message.value)\n const previousValue = this.collection.get(key) ?? message.value\n\n return {\n forwardMessage: {\n type: `delete`,\n key,\n },\n operation: {\n type: `delete`,\n key,\n value: previousValue,\n },\n }\n }\n\n const key = this.collection.getKeyFromItem(message.value)\n return {\n forwardMessage: {\n type: `update`,\n value: message.value,\n metadata: message.metadata,\n },\n operation: {\n type: `update`,\n key,\n value: message.value,\n metadata: message.metadata,\n },\n }\n }\n\n async persistAndConfirmCollectionMutations(\n mutations: Array<PendingMutation<T>>,\n ): Promise<void> {\n if (mutations.length === 0) {\n return\n }\n\n await this.applyMutex.run(async () => {\n const acceptedMutationIds =\n await this.persistCollectionMutationsUnsafe(mutations)\n const acceptedMutationIdSet = new Set(acceptedMutationIds)\n const acceptedMutations = mutations.filter((mutation) =>\n acceptedMutationIdSet.has(mutation.mutationId),\n )\n\n if (acceptedMutations.length !== mutations.length) {\n throw new Error(\n `persistence coordinator accepted ${acceptedMutations.length} of ${mutations.length} mutations; partial acceptance is not supported`,\n )\n }\n\n this.confirmMutationsSyncUnsafe(acceptedMutations)\n })\n }\n\n async acceptTransactionMutations(transaction: {\n mutations: Array<PendingMutation<Record<string, unknown>>>\n }): Promise<void> {\n const collectionMutations = this.filterMutationsForCollection(\n transaction.mutations,\n )\n\n if (collectionMutations.length === 0) {\n return\n }\n\n await this.persistAndConfirmCollectionMutations(collectionMutations)\n }\n\n cleanup(): void {\n this.coordinatorUnsubscribe?.()\n this.coordinatorUnsubscribe = null\n\n this.indexAddedUnsubscribe?.()\n this.indexAddedUnsubscribe = null\n\n this.indexRemovedUnsubscribe?.()\n this.indexRemovedUnsubscribe = null\n\n if (this.remoteEnsureRetryTimer !== null) {\n clearTimeout(this.remoteEnsureRetryTimer)\n this.remoteEnsureRetryTimer = null\n }\n\n this.pendingRemoteSubsetEnsures.clear()\n this.activeSubsets.clear()\n for (const transaction of this.queuedHydrationTransactions) {\n transaction.rejectApplied?.(new SyncTransactionAbortedError())\n }\n this.queuedHydrationTransactions.length = 0\n this.queuedTxCommitted.length = 0\n this.clearSyncControls()\n }\n\n private withInternalApply<TResult>(task: () => TResult): TResult {\n this.internalApplyDepth++\n try {\n return task()\n } finally {\n this.internalApplyDepth--\n }\n }\n\n private getRequiredIndexSignatures(): ReadonlyArray<string> {\n if (!this.collection) {\n return []\n }\n\n return this.collection\n .getIndexMetadata()\n .map((metadata) => metadata.signature)\n }\n\n private loadSubsetRowsUnsafe(\n options: LoadSubsetOptions,\n ): Promise<Array<{ key: TKey; value: T; metadata?: unknown }>> {\n return this.persistence.adapter.loadSubset(this.collectionId, options, {\n requiredIndexSignatures: this.getRequiredIndexSignatures(),\n }) as Promise<Array<{ key: TKey; value: T; metadata?: unknown }>>\n }\n\n private async scanPersistedRowsUnsafe(\n options?: PersistedRowScanOptions,\n ): Promise<Array<PersistedScannedRow<T, TKey>>> {\n if (!this.persistence.adapter.scanRows) {\n return []\n }\n\n return this.persistence.adapter.scanRows(\n this.collectionId,\n options,\n ) as Promise<Array<PersistedScannedRow<T, TKey>>>\n }\n\n async scanPersistedRows(\n options?: PersistedRowScanOptions,\n ): Promise<Array<PersistedScannedRow<T, TKey>>> {\n return this.applyMutex.run(() => this.scanPersistedRowsUnsafe(options))\n }\n\n private async hydrateSubsetUnsafe(\n options: LoadSubsetOptions,\n config: {\n requestRemoteEnsure: boolean\n },\n ): Promise<void> {\n this.isHydrating = true\n try {\n const rows = await this.loadSubsetRowsUnsafe(options)\n\n this.applyRowsToCollection(rows)\n } finally {\n this.isHydrating = false\n }\n\n await this.flushQueuedHydrationTransactionsUnsafe()\n await this.flushQueuedTxCommittedUnsafe()\n\n if (config.requestRemoteEnsure) {\n this.queueRemoteSubsetEnsure(options)\n }\n }\n\n private applyRowsToCollection(\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n ): void {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit\n ) {\n return\n }\n\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n for (const row of rows) {\n if (this.collection?._hasHydratedKey(row.key)) {\n continue\n }\n this.syncControls.write?.({\n type: `update`,\n value: row.value,\n metadata: row.metadata as Record<string, unknown> | undefined,\n })\n }\n\n this.syncControls.commit?.()\n })\n }\n\n private replaceCollectionSnapshot(\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n collectionMetadata: Array<{ key: string; value: unknown }>,\n ): void {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit ||\n !this.syncControls.metadata\n ) {\n return\n }\n\n const nextMetadata = new Map(\n collectionMetadata.map(({ key, value }) => [key, value]),\n )\n const currentKeys = this.syncControls.metadata.collection\n .list()\n .map(({ key }) => key)\n\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n this.syncControls.truncate?.()\n\n for (const row of rows) {\n this.syncControls.write?.({\n type: `update`,\n value: row.value,\n metadata: row.metadata as Record<string, unknown> | undefined,\n })\n }\n\n currentKeys.forEach((key) => {\n if (!nextMetadata.has(key)) {\n this.syncControls.metadata?.collection.delete(key)\n }\n })\n\n nextMetadata.forEach((value, key) => {\n this.syncControls.metadata?.collection.set(key, value)\n })\n\n this.syncControls.commit?.()\n })\n }\n\n private async flushQueuedHydrationTransactionsUnsafe(): Promise<void> {\n while (this.queuedHydrationTransactions.length > 0) {\n const transaction = this.queuedHydrationTransactions.shift()\n if (!transaction) {\n continue\n }\n try {\n await this.applyBufferedSyncTransactionUnsafe(transaction)\n } catch (error) {\n transaction.rejectApplied?.(error)\n for (const abandoned of this.queuedHydrationTransactions) {\n abandoned.rejectApplied?.(error)\n }\n this.queuedHydrationTransactions.length = 0\n throw error\n }\n }\n }\n\n private async applyBufferedSyncTransactionUnsafe(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): Promise<void> {\n if (transaction.signal?.aborted) {\n transaction.rejectApplied?.(new SyncTransactionAbortedError())\n return\n }\n\n const { begin, write, commit, truncate, metadata } = this.syncControls\n if (!begin || !write || !commit) {\n transaction.rejectApplied?.(new SyncTransactionAbortedError())\n return\n }\n\n const applyToCollection = (): SyncAppliedReceipt => {\n begin()\n\n if (transaction.truncate) {\n truncate?.()\n }\n\n for (const operation of transaction.operations) {\n if (operation.type === `delete`) {\n write({\n type: `delete`,\n key: operation.key,\n })\n } else {\n write({\n type: `update`,\n value: operation.value,\n metadata: operation.metadata,\n })\n }\n }\n\n for (const [key, metadataWrite] of transaction.rowMetadataWrites) {\n if (metadataWrite.type === `delete`) {\n metadata?.row.delete(key)\n } else {\n metadata?.row.set(key, metadataWrite.value)\n }\n }\n\n for (const [key, metadataWrite] of transaction.collectionMetadataWrites) {\n if (metadataWrite.type === `delete`) {\n metadata?.collection.delete(key)\n } else {\n metadata?.collection.set(key, metadataWrite.value)\n }\n }\n\n return commit(transaction.signal)\n }\n\n try {\n const applied = transaction.internal\n ? this.withInternalApply(applyToCollection)\n : applyToCollection()\n if (applied !== true) {\n await applied\n }\n\n if (!transaction.internal) {\n await this.persistAndBroadcastExternalSyncTransactionUnsafe(transaction)\n }\n transaction.resolveApplied?.()\n } catch (error) {\n transaction.rejectApplied?.(error)\n throw error\n }\n }\n\n private async persistAndBroadcastExternalSyncTransactionUnsafe(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): Promise<void> {\n if (transaction.internal) {\n return\n }\n\n const streamPosition = this.nextLocalStreamPosition()\n\n if (\n !transaction.truncate &&\n transaction.operations.length === 0 &&\n transaction.rowMetadataWrites.size === 0 &&\n transaction.collectionMetadataWrites.size === 0\n ) {\n this.publishTxCommittedEvent(\n this.createTxCommittedPayload({\n term: streamPosition.term,\n seq: streamPosition.seq,\n txId: safeRandomUUID(),\n latestRowVersion: streamPosition.rowVersion,\n changedRows: [],\n deletedKeys: [],\n requiresFullReload: true,\n }),\n )\n return\n }\n\n const tx = this.createPersistedTxFromOperations(transaction, streamPosition)\n\n await this.persistence.adapter.applyCommittedTx(this.collectionId, tx)\n this.publishTxCommittedEvent(\n this.createTxCommittedPayload({\n term: tx.term,\n seq: tx.seq,\n txId: tx.txId,\n latestRowVersion: tx.rowVersion,\n requiresFullReload: transaction.truncate,\n changedRows: transaction.operations\n .filter((operation) => operation.type === `update`)\n .map((operation) => ({\n key: operation.key,\n value: operation.value as Record<string, unknown>,\n })),\n deletedKeys: transaction.operations\n .filter((operation) => operation.type === `delete`)\n .map((operation) => operation.key),\n rowMetadataMutations: tx.rowMetadataMutations,\n collectionMetadataMutations: tx.collectionMetadataMutations,\n }),\n )\n }\n\n private createPersistedTxFromOperations(\n transaction: BufferedSyncTransaction<T, TKey>,\n streamPosition: { term: number; seq: number; rowVersion: number },\n ): PersistedTx {\n return {\n txId: safeRandomUUID(),\n term: streamPosition.term,\n seq: streamPosition.seq,\n rowVersion: streamPosition.rowVersion,\n truncate: transaction.truncate,\n mutations: transaction.operations.map((operation) =>\n operation.type === `update`\n ? {\n type: `update` as const,\n key: operation.key,\n value: operation.value as Record<string, unknown>,\n }\n : {\n type: `delete` as const,\n key: operation.key,\n value: operation.value as Record<string, unknown>,\n },\n ),\n rowMetadataMutations: Array.from(\n transaction.rowMetadataWrites.entries(),\n ).map(([key, metadataWrite]) =>\n metadataWrite.type === `delete`\n ? { type: `delete` as const, key: key }\n : {\n type: `set` as const,\n key: key,\n value: metadataWrite.value,\n },\n ),\n collectionMetadataMutations: Array.from(\n transaction.collectionMetadataWrites.entries(),\n ).map(([key, metadataWrite]) =>\n metadataWrite.type === `delete`\n ? { type: `delete`, key }\n : { type: `set`, key, value: metadataWrite.value },\n ),\n }\n }\n\n private createPersistedTxFromMutations(\n mutations: Array<PendingMutation<T>>,\n streamPosition: { term: number; seq: number; rowVersion: number },\n ): PersistedTx {\n return {\n txId: safeRandomUUID(),\n term: streamPosition.term,\n seq: streamPosition.seq,\n rowVersion: streamPosition.rowVersion,\n mutations: mutations.map((mutation) => {\n if (mutation.type === `delete`) {\n return {\n type: `delete` as const,\n key: mutation.key as string | number,\n value: mutation.original as Record<string, unknown>,\n }\n }\n\n if (mutation.type === `insert`) {\n return {\n type: `insert` as const,\n key: mutation.key as string | number,\n value: mutation.modified as Record<string, unknown>,\n }\n }\n\n return {\n type: `update` as const,\n key: mutation.key as string | number,\n value: mutation.modified as Record<string, unknown>,\n }\n }),\n }\n }\n\n private confirmMutationsSyncUnsafe(\n mutations: Array<PendingMutation<T>>,\n ): void {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit\n ) {\n return\n }\n\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n for (const mutation of mutations) {\n if (mutation.type === `delete`) {\n this.syncControls.write?.({\n type: `delete`,\n key: mutation.key as TKey,\n })\n } else {\n this.syncControls.write?.({\n type: `update`,\n value: mutation.modified,\n })\n }\n }\n\n this.syncControls.commit?.()\n })\n }\n\n private filterMutationsForCollection(\n mutations: Array<PendingMutation<Record<string, unknown>>>,\n ): Array<PendingMutation<T>> {\n const collection = this.collection\n return mutations.filter((mutation) => {\n if (collection) {\n return mutation.collection === collection\n }\n return mutation.collection.id === this.collectionId\n }) as Array<PendingMutation<T>>\n }\n\n private async persistCollectionMutationsUnsafe(\n mutations: Array<PendingMutation<T>>,\n ): Promise<Array<string>> {\n // When a coordinator with requestApplyLocalMutations is available, always\n // route through it — even on the leader tab. This ensures the coordinator's\n // seq/rowVersion counters stay in sync with actual writes. Without this,\n // the leader's direct-path writes would increment the runtime's localSeq\n // but leave the coordinator's state.latestSeq stale, causing seq collisions\n // when follower RPCs later arrive.\n if (this.persistence.coordinator.requestApplyLocalMutations) {\n const envelopeMutations = mutations.map((mutation) =>\n toPersistedMutationEnvelope(\n mutation as unknown as PendingMutation<Record<string, unknown>>,\n ),\n )\n\n const response =\n await this.persistence.coordinator.requestApplyLocalMutations(\n this.collectionId,\n envelopeMutations,\n )\n\n if (!response.ok) {\n throw new Error(\n `failed to apply local mutations through coordinator: ${response.error}`,\n )\n }\n\n this.observeStreamPosition(\n response.term,\n response.seq,\n response.latestRowVersion,\n )\n\n const uniqueAcceptedMutationIds = Array.from(\n new Set(response.acceptedMutationIds),\n )\n const submittedMutationIds = new Set(\n mutations.map((mutation) => mutation.mutationId),\n )\n const hasUnknownAcceptedMutationId = uniqueAcceptedMutationIds.some(\n (mutationId) => !submittedMutationIds.has(mutationId),\n )\n\n if (hasUnknownAcceptedMutationId) {\n throw new Error(\n `persistence coordinator returned unknown mutation ids in applyLocalMutations response`,\n )\n }\n\n return uniqueAcceptedMutationIds\n }\n\n // Fallback: no coordinator with requestApplyLocalMutations (e.g.\n // SingleProcessCoordinator). Apply directly and broadcast.\n const streamPosition = this.nextLocalStreamPosition()\n const tx = this.createPersistedTxFromMutations(mutations, streamPosition)\n await this.persistence.adapter.applyCommittedTx(this.collectionId, tx)\n\n this.publishTxCommittedEvent(\n this.createTxCommittedPayload({\n term: tx.term,\n seq: tx.seq,\n txId: tx.txId,\n latestRowVersion: tx.rowVersion,\n changedRows: mutations\n .filter((mutation) => mutation.type !== `delete`)\n .map((mutation) => ({\n key: mutation.key as string | number,\n value: mutation.modified as Record<string, unknown>,\n })),\n deletedKeys: mutations\n .filter((mutation) => mutation.type === `delete`)\n .map((mutation) => mutation.key as string | number),\n rowMetadataMutations: tx.rowMetadataMutations,\n collectionMetadataMutations: tx.collectionMetadataMutations,\n }),\n )\n\n return mutations.map((mutation) => mutation.mutationId)\n }\n\n private createTxCommittedPayload(args: {\n term: number\n seq: number\n txId: string\n latestRowVersion: number\n changedRows: Array<{ key: string | number; value: Record<string, unknown> }>\n deletedKeys: Array<string | number>\n rowMetadataMutations?: Array<PersistedRowMetadataMutation>\n collectionMetadataMutations?: Array<PersistedCollectionMetadataMutation>\n hasMetadataChanges?: boolean\n requiresFullReload?: boolean\n }): TxCommitted {\n const rowMetadataMutations = args.rowMetadataMutations ?? []\n const collectionMetadataMutations = args.collectionMetadataMutations ?? []\n const requiresFullReload =\n args.requiresFullReload === true ||\n args.changedRows.length +\n args.deletedKeys.length +\n rowMetadataMutations.length +\n collectionMetadataMutations.length >\n TARGETED_INVALIDATION_KEY_LIMIT\n\n if (requiresFullReload) {\n return {\n type: `tx:committed`,\n term: args.term,\n seq: args.seq,\n txId: args.txId,\n latestRowVersion: args.latestRowVersion,\n requiresFullReload: true,\n }\n }\n\n return {\n type: `tx:committed`,\n term: args.term,\n seq: args.seq,\n txId: args.txId,\n latestRowVersion: args.latestRowVersion,\n requiresFullReload: false,\n changedRows: args.changedRows,\n deletedKeys: args.deletedKeys,\n rowMetadataMutations,\n collectionMetadataMutations,\n }\n }\n\n private publishTxCommittedEvent(txCommitted: TxCommitted): void {\n this.observeStreamPosition(\n txCommitted.term,\n txCommitted.seq,\n txCommitted.latestRowVersion,\n )\n\n const envelope: ProtocolEnvelope<TxCommitted> = {\n v: 1,\n dbName: this.dbName,\n collectionId: this.collectionId,\n senderId: this.persistence.coordinator.getNodeId(),\n ts: Date.now(),\n payload: txCommitted,\n }\n this.persistence.coordinator.publish(this.collectionId, envelope)\n }\n\n private observeStreamPosition(\n term: number,\n seq: number,\n rowVersion: number,\n ): void {\n if (\n term > this.latestTerm ||\n (term === this.latestTerm && seq > this.latestSeq)\n ) {\n this.latestTerm = term\n this.latestSeq = seq\n }\n if (rowVersion > this.latestRowVersion) {\n this.latestRowVersion = rowVersion\n }\n\n if (term > this.localTerm) {\n this.localTerm = term\n this.localSeq = seq\n } else if (term === this.localTerm && seq > this.localSeq) {\n this.localSeq = seq\n }\n if (rowVersion > this.localRowVersion) {\n this.localRowVersion = rowVersion\n }\n }\n\n private nextLocalStreamPosition(): {\n term: number\n seq: number\n rowVersion: number\n } {\n this.localTerm = Math.max(this.localTerm, this.latestTerm || 1)\n this.localSeq = Math.max(this.localSeq, this.latestSeq) + 1\n this.localRowVersion =\n Math.max(this.localRowVersion, this.latestRowVersion) + 1\n\n return {\n term: this.localTerm,\n seq: this.localSeq,\n rowVersion: this.localRowVersion,\n }\n }\n\n private getSubsetKey(options: LoadSubsetOptions): string {\n const subscription = options.subscription as object | undefined\n if (subscription && typeof subscription === `object`) {\n const existingId = this.subscriptionIds.get(subscription)\n if (existingId) {\n return existingId\n }\n\n this.nextSubscriptionId++\n const id = `sub:${this.nextSubscriptionId}`\n this.subscriptionIds.set(subscription, id)\n return id\n }\n\n return `opts:${stableSerialize(normalizeSubsetOptionsForKey(options))}`\n }\n\n private queueRemoteSubsetEnsure(options: LoadSubsetOptions): void {\n if (\n this.mode !== `sync-present` ||\n !this.persistence.coordinator.requestEnsureRemoteSubset ||\n this.activeSubsets.get(this.getSubsetKey(options)) !== options\n ) {\n return\n }\n\n this.pendingRemoteSubsetEnsures.set(this.getSubsetKey(options), options)\n void this.flushPendingRemoteSubsetEnsures()\n }\n\n private scheduleRemoteEnsureRetry(): void {\n if (\n this.mode !== `sync-present` ||\n !this.persistence.coordinator.requestEnsureRemoteSubset\n ) {\n return\n }\n\n if (\n this.pendingRemoteSubsetEnsures.size === 0 ||\n this.remoteEnsureRetryTimer !== null\n ) {\n return\n }\n\n this.remoteEnsureRetryTimer = setTimeout(() => {\n this.remoteEnsureRetryTimer = null\n void this.flushPendingRemoteSubsetEnsures()\n }, REMOTE_ENSURE_RETRY_DELAY_MS)\n }\n\n private async flushPendingRemoteSubsetEnsures(): Promise<void> {\n if (\n this.mode !== `sync-present` ||\n !this.persistence.coordinator.requestEnsureRemoteSubset\n ) {\n return\n }\n\n if (this.remoteEnsureRetryTimer !== null) {\n clearTimeout(this.remoteEnsureRetryTimer)\n this.remoteEnsureRetryTimer = null\n }\n\n for (const [subsetKey, options] of this.pendingRemoteSubsetEnsures) {\n try {\n await this.persistence.coordinator.requestEnsureRemoteSubset(\n this.collectionId,\n options,\n )\n this.pendingRemoteSubsetEnsures.delete(subsetKey)\n } catch (error) {\n console.warn(`Failed to ensure remote subset:`, error)\n }\n }\n\n this.scheduleRemoteEnsureRetry()\n }\n\n private attachCoordinatorSubscription(): void {\n if (this.coordinatorUnsubscribe) {\n return\n }\n\n this.coordinatorUnsubscribe = this.persistence.coordinator.subscribe(\n this.collectionId,\n (message) => {\n this.onCoordinatorMessage(message)\n },\n )\n }\n\n private onCoordinatorMessage(message: ProtocolEnvelope<unknown>): void {\n if (message.collectionId !== this.collectionId) {\n return\n }\n\n const { payload } = message\n const isSelf = message.senderId === this.persistence.coordinator.getNodeId()\n\n // Allow tx:committed from self — the coordinator produces these on behalf\n // of both local and remote mutations. The seq dedup in\n // processCommittedTxUnsafe prevents double-processing of our own writes.\n if (isTxCommittedPayload(payload)) {\n if (this.isHydrating) {\n this.queuedTxCommitted.push(payload)\n return\n }\n\n void this.applyMutex\n .run(() => this.processCommittedTxUnsafe(payload))\n .catch((error) => {\n console.warn(`Failed to process tx:committed message:`, error)\n })\n return\n }\n\n // Skip remaining message types from self (e.g. heartbeats, resets)\n if (isSelf) {\n return\n }\n\n if (isCollectionResetPayload(payload)) {\n void this.applyMutex\n .run(() => this.truncateAndReloadUnsafe())\n .catch((error) => {\n console.warn(`Failed to process collection reset message:`, error)\n })\n }\n }\n\n private async flushQueuedTxCommittedUnsafe(): Promise<void> {\n while (this.queuedTxCommitted.length > 0) {\n const queued = this.queuedTxCommitted.shift()\n if (!queued) {\n continue\n }\n await this.processCommittedTxUnsafe(queued)\n }\n }\n\n private async processCommittedTxUnsafe(\n txCommitted: TxCommitted,\n ): Promise<void> {\n if (txCommitted.term < this.latestTerm) {\n return\n }\n\n if (\n txCommitted.term === this.latestTerm &&\n txCommitted.seq <= this.latestSeq\n ) {\n return\n }\n\n const hasGapInCurrentTerm =\n txCommitted.term === this.latestTerm &&\n txCommitted.seq > this.latestSeq + 1\n const hasGapAcrossTerms =\n txCommitted.term > this.latestTerm && txCommitted.seq > 1\n const hasGap = hasGapInCurrentTerm || hasGapAcrossTerms\n\n if (hasGap) {\n await this.recoverFromSeqGapUnsafe()\n if (\n txCommitted.term < this.latestTerm ||\n (txCommitted.term === this.latestTerm &&\n txCommitted.seq <= this.latestSeq)\n ) {\n return\n }\n }\n\n this.observeStreamPosition(\n txCommitted.term,\n txCommitted.seq,\n txCommitted.latestRowVersion,\n )\n\n await this.invalidateFromCommittedTxUnsafe(txCommitted)\n }\n\n private async recoverFromSeqGapUnsafe(): Promise<void> {\n if (this.persistence.coordinator.pullSince && this.latestRowVersion >= 0) {\n try {\n const pullResponse = await this.persistence.coordinator.pullSince(\n this.collectionId,\n this.latestRowVersion,\n )\n\n if (pullResponse.ok) {\n this.observeStreamPosition(\n pullResponse.latestTerm,\n pullResponse.latestSeq,\n pullResponse.latestRowVersion,\n )\n if (pullResponse.requiresFullReload || !pullResponse.deltas) {\n await this.reloadActiveSubsetsUnsafe()\n return\n }\n\n for (const delta of pullResponse.deltas) {\n await this.invalidateFromCommittedTxUnsafe({\n type: `tx:committed`,\n term: pullResponse.latestTerm,\n seq: pullResponse.latestSeq,\n txId: delta.txId,\n latestRowVersion: delta.latestRowVersion,\n requiresFullReload: false,\n changedRows: delta.changedRows,\n deletedKeys: delta.deletedKeys,\n rowMetadataMutations: delta.rowMetadataMutations,\n collectionMetadataMutations: delta.collectionMetadataMutations,\n })\n }\n return\n }\n } catch (error) {\n console.warn(`Failed pullSince recovery attempt:`, error)\n }\n }\n\n await this.truncateAndReloadUnsafe()\n\n if (this.mode === `sync-present`) {\n for (const options of this.activeSubsets.values()) {\n this.queueRemoteSubsetEnsure(options)\n }\n }\n }\n\n private async truncateAndReloadUnsafe(): Promise<void> {\n if (this.syncControls.begin && this.syncControls.commit) {\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n this.syncControls.truncate?.()\n this.syncControls.commit?.()\n })\n }\n\n await this.reloadActiveSubsetsUnsafe()\n }\n\n private async invalidateFromCommittedTxUnsafe(\n txCommitted: TxCommitted,\n ): Promise<void> {\n if (txCommitted.requiresFullReload) {\n await this.reloadActiveSubsetsUnsafe()\n return\n }\n\n const changedKeyCount =\n txCommitted.changedRows.length + txCommitted.deletedKeys.length\n if (changedKeyCount > TARGETED_INVALIDATION_KEY_LIMIT) {\n await this.reloadActiveSubsetsUnsafe()\n return\n }\n\n const hasPaginatedSubset = Array.from(this.activeSubsets.values()).some(\n (opt) => opt.limit != null || opt.offset != null || opt.cursor != null,\n )\n\n if (!hasPaginatedSubset || changedKeyCount === 0) {\n await this.applyTargetedInvalidationUnsafe(txCommitted)\n return\n }\n\n // Has paginated subsets — fall back to full reload.\n // Targeted invalidation for paginated subsets is deferred to a future iteration.\n await this.reloadActiveSubsetsUnsafe()\n }\n\n private async applyTargetedInvalidationUnsafe(\n txCommitted: TxCommitted & { requiresFullReload: false },\n ): Promise<void> {\n const subsetEvaluators = Array.from(this.activeSubsets.values()).map(\n (opt) => (opt.where ? compileSingleRowExpression(opt.where) : null),\n )\n\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n for (const {\n key: changedKey,\n value: newValue,\n } of txCommitted.changedRows) {\n const matchesAnySubset = subsetEvaluators.some((evaluator) => {\n if (!evaluator) return true\n return toBooleanPredicate(evaluator(newValue) as boolean | null)\n })\n\n if (matchesAnySubset) {\n this.syncControls.write?.({ type: `update`, value: newValue as T })\n } else if (this.collection?.get(changedKey as TKey) !== undefined) {\n this.syncControls.write?.({ type: `delete`, key: changedKey as TKey })\n }\n }\n\n for (const deletedKey of txCommitted.deletedKeys) {\n this.syncControls.write?.({ type: `delete`, key: deletedKey as TKey })\n }\n\n txCommitted.rowMetadataMutations?.forEach((mutation) => {\n if (mutation.type === `delete`) {\n this.syncControls.metadata?.row.delete(mutation.key as TKey)\n } else {\n this.syncControls.metadata?.row.set(\n mutation.key as TKey,\n mutation.value,\n )\n }\n })\n\n txCommitted.collectionMetadataMutations?.forEach((mutation) => {\n if (mutation.type === `delete`) {\n this.syncControls.metadata?.collection.delete(mutation.key)\n } else {\n this.syncControls.metadata?.collection.set(\n mutation.key,\n mutation.value,\n )\n }\n })\n\n this.syncControls.commit?.()\n })\n }\n\n private async reloadActiveSubsetsUnsafe(): Promise<void> {\n const activeSubsetOptions =\n this.activeSubsets.size > 0\n ? Array.from(this.activeSubsets.values())\n : [{}]\n\n this.isHydrating = true\n try {\n const mergedRows = new Map<TKey, { value: T; metadata?: unknown }>()\n const collectionMetadata = await this.loadCollectionMetadataSnapshot()\n for (const options of activeSubsetOptions) {\n const subsetRows = await this.loadSubsetRowsUnsafe(options)\n for (const row of subsetRows) {\n mergedRows.set(row.key, {\n value: row.value,\n metadata: row.metadata,\n })\n }\n }\n\n this.replaceCollectionSnapshot(\n Array.from(mergedRows.entries()).map(([key, row]) => ({\n key,\n value: row.value,\n metadata: row.metadata,\n })),\n collectionMetadata,\n )\n } finally {\n this.isHydrating = false\n }\n\n await this.flushQueuedHydrationTransactionsUnsafe()\n await this.flushQueuedTxCommittedUnsafe()\n }\n\n private attachIndexLifecycleListeners(): void {\n if (\n !this.collection ||\n this.indexAddedUnsubscribe ||\n this.indexRemovedUnsubscribe\n ) {\n return\n }\n\n this.indexAddedUnsubscribe = this.collection.on(`index:added`, (event) => {\n void this.ensurePersistedIndex(event.index)\n })\n this.indexRemovedUnsubscribe = this.collection.on(\n `index:removed`,\n (event) => {\n void this.markIndexRemoved(event.index)\n },\n )\n }\n\n private async bootstrapPersistedIndexes(\n indexMetadataSnapshot?: Array<CollectionIndexMetadata>,\n ): Promise<void> {\n const collection = this.collection\n if (!collection && !indexMetadataSnapshot) {\n return\n }\n\n const indexMetadata =\n indexMetadataSnapshot ?? collection?.getIndexMetadata() ?? []\n for (const metadata of indexMetadata) {\n await this.ensurePersistedIndex(metadata)\n }\n }\n\n private buildPersistedIndexSpec(\n index: CollectionIndexMetadata,\n ): PersistedIndexSpec {\n return {\n expressionSql: [stableSerialize(index.expression)],\n metadata: {\n name: index.name ?? null,\n resolver: toStableSerializable(index.resolver),\n options: toStableSerializable(index.options),\n },\n }\n }\n\n private async ensurePersistedIndex(\n indexMetadata: CollectionIndexMetadata,\n ): Promise<void> {\n const spec = this.buildPersistedIndexSpec(indexMetadata)\n\n try {\n await this.persistence.adapter.ensureIndex(\n this.collectionId,\n indexMetadata.signature,\n spec,\n )\n } catch (error) {\n console.warn(`Failed to ensure persisted index in adapter:`, error)\n }\n\n try {\n await this.persistence.coordinator.requestEnsurePersistedIndex(\n this.collectionId,\n indexMetadata.signature,\n spec,\n )\n } catch (error) {\n console.warn(\n `Failed to ensure persisted index through coordinator:`,\n error,\n )\n }\n }\n\n private async markIndexRemoved(\n indexMetadata: CollectionIndexMetadata,\n ): Promise<void> {\n if (!this.persistence.adapter.markIndexRemoved) {\n return\n }\n\n try {\n await this.persistence.adapter.markIndexRemoved(\n this.collectionId,\n indexMetadata.signature,\n )\n } catch (error) {\n console.warn(`Failed to mark persisted index removed:`, error)\n }\n }\n}\n\nfunction createWrappedSyncConfig<\n T extends object,\n TKey extends string | number,\n>(\n sourceSyncConfig: SyncConfig<T, TKey>,\n runtime: PersistedCollectionRuntime<T, TKey>,\n): SyncConfig<T, TKey> {\n return {\n ...sourceSyncConfig,\n sync: (params) => {\n const transactionStack: Array<OpenSyncTransaction<T, TKey>> = []\n const getOpenTransaction = () =>\n transactionStack[transactionStack.length - 1]\n let fullStartPromise: Promise<void> | null = null\n const acquisitions = new Map<LoadSubsetOptions, { forwarded: boolean }>()\n runtime.setSyncControls({\n begin: params.begin,\n write: params.write as SyncControlFns<T, TKey>[`write`],\n commit: params.commit,\n truncate: params.truncate,\n metadata: params.metadata ?? null,\n })\n runtime.setCollection(\n params.collection as Collection<T, TKey, PersistedCollectionUtils>,\n )\n\n const wrappedParams = {\n ...params,\n markReady: () => {\n void (fullStartPromise ?? runtime.ensureStarted())\n .then(() => {\n params.markReady()\n })\n .catch((error) => {\n console.warn(\n `Failed persisted sync startup before markReady:`,\n error,\n )\n params.markReady()\n })\n },\n begin: (options?: { immediate?: boolean }) => {\n const transaction: OpenSyncTransaction<T, TKey> = {\n operations: [],\n rowMetadataWrites: new Map(),\n collectionMetadataWrites: new Map(),\n truncate: false,\n internal: runtime.isApplyingInternally(),\n queuedBecauseHydrating:\n !runtime.isApplyingInternally() && runtime.isHydratingNow(),\n }\n transactionStack.push(transaction)\n\n if (!transaction.queuedBecauseHydrating) {\n params.begin(options)\n }\n },\n write: (message: ChangeMessageOrDeleteKeyMessage<T, TKey>) => {\n const normalization = runtime.normalizeSyncWriteMessage(message)\n const openTransaction = getOpenTransaction()\n\n if (!openTransaction) {\n params.write(normalization.forwardMessage)\n return\n }\n\n openTransaction.operations.push(normalization.operation)\n if (normalization.operation.type === `delete`) {\n openTransaction.rowMetadataWrites.set(normalization.operation.key, {\n type: `delete`,\n })\n } else if (\n message.type === `insert` &&\n normalization.operation.metadata === undefined\n ) {\n // Reset stale metadata for a fresh insert, but don't clobber an\n // explicit metadata write already queued for this key in the same\n // transaction (e.g. query reconcile stamps owners, then inserts).\n if (\n !openTransaction.rowMetadataWrites.has(\n normalization.operation.key,\n )\n ) {\n openTransaction.rowMetadataWrites.set(\n normalization.operation.key,\n {\n type: `delete`,\n },\n )\n }\n } else if (normalization.operation.metadata !== undefined) {\n openTransaction.rowMetadataWrites.set(normalization.operation.key, {\n type: `set`,\n value: normalization.operation.metadata,\n })\n }\n if (!openTransaction.queuedBecauseHydrating) {\n params.write(normalization.forwardMessage)\n }\n },\n metadata: params.metadata\n ? {\n row: {\n get: (key: TKey) => {\n const openTransaction = getOpenTransaction()\n const pendingWrite =\n openTransaction?.rowMetadataWrites.get(key)\n if (pendingWrite) {\n return pendingWrite.type === `delete`\n ? undefined\n : pendingWrite.value\n }\n if (openTransaction?.truncate) {\n return undefined\n }\n return params.metadata!.row.get(key)\n },\n scanPersisted: (options?: PersistedRowScanOptions) =>\n runtime.scanPersistedRows(options),\n set: (key: TKey, value: unknown) => {\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.row.set must be called within an open sync transaction`,\n )\n }\n openTransaction.rowMetadataWrites.set(key, {\n type: `set`,\n value,\n })\n if (!openTransaction.queuedBecauseHydrating) {\n params.metadata!.row.set(key, value)\n }\n },\n delete: (key: TKey) => {\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.row.delete must be called within an open sync transaction`,\n )\n }\n openTransaction.rowMetadataWrites.set(key, {\n type: `delete`,\n })\n if (!openTransaction.queuedBecauseHydrating) {\n params.metadata!.row.delete(key)\n }\n },\n },\n collection: {\n get: (key: string) => {\n const openTransaction = getOpenTransaction()\n const pendingWrite =\n openTransaction?.collectionMetadataWrites.get(key)\n if (pendingWrite) {\n return pendingWrite.type === `delete`\n ? undefined\n : pendingWrite.value\n }\n return params.metadata!.collection.get(key)\n },\n set: (key: string, value: unknown) => {\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.collection.set must be called within an open sync transaction`,\n )\n }\n openTransaction.collectionMetadataWrites.set(key, {\n type: `set`,\n value,\n })\n if (!openTransaction.queuedBecauseHydrating) {\n params.metadata!.collection.set(key, value)\n }\n },\n delete: (key: string) => {\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.collection.delete must be called within an open sync transaction`,\n )\n }\n openTransaction.collectionMetadataWrites.set(key, {\n type: `delete`,\n })\n if (!openTransaction.queuedBecauseHydrating) {\n params.metadata!.collection.delete(key)\n }\n },\n list: (prefix?: string) => {\n const merged = new Map(\n params\n .metadata!.collection.list()\n .map(({ key, value }) => [key, value]),\n )\n const openTransaction = getOpenTransaction()\n if (openTransaction) {\n for (const [\n key,\n metadataWrite,\n ] of openTransaction.collectionMetadataWrites) {\n if (metadataWrite.type === `delete`) {\n merged.delete(key)\n } else {\n merged.set(key, metadataWrite.value)\n }\n }\n }\n\n return Array.from(merged.entries())\n .filter(([key]) => (prefix ? key.startsWith(prefix) : true))\n .map(([key, value]) => ({\n key,\n value,\n }))\n },\n },\n }\n : undefined,\n truncate: () => {\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n params.truncate()\n return\n }\n\n openTransaction.operations = []\n openTransaction.rowMetadataWrites.clear()\n // Intentionally preserve collectionMetadataWrites across truncate.\n // Callers (for example electric resume/reset handling) may stage\n // collection-scoped metadata before truncating row data, and those\n // writes must commit atomically with the truncate transaction.\n openTransaction.truncate = true\n if (!openTransaction.queuedBecauseHydrating) {\n params.truncate()\n }\n },\n commit: (signal?: AbortSignal) => {\n const openTransaction = transactionStack.pop()\n if (!openTransaction) {\n return params.commit(signal)\n }\n\n if (openTransaction.queuedBecauseHydrating) {\n if (signal?.aborted) {\n const aborted = Promise.reject(new SyncTransactionAbortedError())\n void aborted.catch(() => undefined)\n return aborted\n }\n let resolveApplied!: () => void\n let rejectApplied!: (error: unknown) => void\n const applied = new Promise<void>((resolve, reject) => {\n resolveApplied = resolve\n rejectApplied = reject\n })\n void applied.catch(() => undefined)\n runtime.queueHydrationBufferedTransaction({\n operations: openTransaction.operations,\n rowMetadataWrites: openTransaction.rowMetadataWrites,\n collectionMetadataWrites:\n openTransaction.collectionMetadataWrites,\n truncate: openTransaction.truncate,\n internal: openTransaction.internal,\n signal,\n resolveApplied,\n rejectApplied,\n })\n return applied\n }\n\n const applied = params.commit(signal)\n if (!openTransaction.internal) {\n const persistAfterApplication = async () => {\n if (applied !== true) await applied\n await runtime.persistAndBroadcastExternalSyncTransaction({\n operations: openTransaction.operations,\n rowMetadataWrites: openTransaction.rowMetadataWrites,\n collectionMetadataWrites:\n openTransaction.collectionMetadataWrites,\n truncate: openTransaction.truncate,\n internal: false,\n })\n }\n const persisted = persistAfterApplication()\n void persisted.catch(() => undefined)\n return persisted\n }\n return applied\n },\n }\n\n let sourceResult: SyncConfigRes = {}\n const startupState = { cleanedUp: false }\n fullStartPromise = runtime.ensureStarted()\n const sourceResultPromise = (async () => {\n await runtime.ensureStartupMetadataLoaded()\n\n if (startupState.cleanedUp) {\n return sourceResult\n }\n\n sourceResult = normalizeSyncFnResult(\n sourceSyncConfig.sync(wrappedParams),\n )\n return sourceResult\n })()\n\n return {\n cleanup: () => {\n startupState.cleanedUp = true\n acquisitions.clear()\n sourceResult.cleanup?.()\n runtime.cleanup()\n runtime.clearSyncControls()\n },\n loadSubset: async (options: LoadSubsetOptions) => {\n const acquisition = { forwarded: false }\n acquisitions.set(options, acquisition)\n await fullStartPromise\n const resolvedSourceResult = await sourceResultPromise\n if (\n startupState.cleanedUp ||\n acquisitions.get(options) !== acquisition\n ) {\n return\n }\n return runtime.loadSubset(options, (loadOptions) => {\n // Hydration is another async boundary. A release before this\n // point owns no upstream lease and must not start one later.\n if (\n startupState.cleanedUp ||\n acquisitions.get(options) !== acquisition\n ) {\n return true\n }\n if (!resolvedSourceResult.loadSubset) return true\n acquisition.forwarded = true\n try {\n return resolvedSourceResult.loadSubset(loadOptions)\n } catch (error) {\n acquisition.forwarded = false\n throw error\n }\n })\n },\n unloadSubset: (options: LoadSubsetOptions) => {\n const acquisition = acquisitions.get(options)\n acquisitions.delete(options)\n runtime.unloadSubset(\n options,\n acquisition?.forwarded ? sourceResult.unloadSubset : undefined,\n )\n },\n }\n },\n }\n}\n\nfunction createLoopbackSyncConfig<\n T extends object,\n TKey extends string | number,\n>(runtime: PersistedCollectionRuntime<T, TKey>): SyncConfig<T, TKey> {\n return {\n sync: (params) => {\n runtime.setSyncControls({\n begin: params.begin,\n write: params.write as SyncControlFns<T, TKey>[`write`],\n commit: params.commit,\n truncate: params.truncate,\n metadata: params.metadata ?? null,\n })\n runtime.setCollection(\n params.collection as Collection<T, TKey, PersistedCollectionUtils>,\n )\n\n void runtime\n .ensureStarted()\n .then(() => {\n params.markReady()\n })\n .catch((error) => {\n console.warn(`Failed persisted loopback startup:`, error)\n params.markReady()\n })\n\n return {\n cleanup: () => {\n runtime.cleanup()\n runtime.clearSyncControls()\n },\n loadSubset: (options: LoadSubsetOptions) => runtime.loadSubset(options),\n unloadSubset: (options: LoadSubsetOptions) =>\n runtime.unloadSubset(options),\n }\n },\n getSyncMetadata: () => ({\n source: `persisted-phase-2-loopback`,\n }),\n }\n}\n\nexport function persistedCollectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: PersistedSyncWrappedOptions<T, TKey, TSchema, TUtils>,\n): PersistedSyncOptionsResult<T, TKey, TSchema, TUtils>\n\nexport function persistedCollectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: PersistedLocalOnlyOptions<T, TKey, TSchema, TUtils>,\n): PersistedLocalOnlyOptionsResult<T, TKey, TSchema, TUtils>\n\nexport function persistedCollectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options:\n | PersistedSyncWrappedOptions<T, TKey, TSchema, TUtils>\n | PersistedLocalOnlyOptions<T, TKey, TSchema, TUtils>,\n):\n | PersistedSyncOptionsResult<T, TKey, TSchema, TUtils>\n | PersistedLocalOnlyOptionsResult<T, TKey, TSchema, TUtils> {\n if (!isRecord(options.persistence)) {\n throw new InvalidPersistedCollectionConfigError(\n `persistedCollectionOptions requires a persistence adapter`,\n )\n }\n\n if (hasOwnSyncKey(options)) {\n if (!isValidSyncConfig(options.sync)) {\n throw new InvalidSyncConfigError(\n `when the \"sync\" key is present it must provide a callable sync function`,\n )\n }\n\n const { schemaVersion, ...syncOptions } = options\n const collectionId =\n syncOptions.id ?? `persisted-collection:${safeRandomUUID()}`\n const persistence = resolvePersistenceForCollection(\n syncOptions.persistence,\n {\n collectionId,\n mode: `sync-present`,\n schemaVersion,\n },\n )\n\n const runtime = new PersistedCollectionRuntime<T, TKey>(\n `sync-present`,\n collectionId,\n persistence,\n syncOptions.syncMode ?? `eager`,\n collectionId,\n )\n\n const result = {\n ...syncOptions,\n id: collectionId,\n sync: createWrappedSyncConfig<T, TKey>(syncOptions.sync, runtime),\n persistence,\n }\n\n return withCollectionConfigFactory(\n result,\n () =>\n persistedCollectionOptions({\n ...options,\n id: collectionId,\n }) as typeof result,\n )\n }\n\n const { schemaVersion, ...localOnlyOptions } = options\n const collectionId =\n localOnlyOptions.id ?? `persisted-collection:${safeRandomUUID()}`\n const persistence = resolvePersistenceForCollection(\n localOnlyOptions.persistence,\n {\n collectionId,\n mode: `sync-absent`,\n schemaVersion,\n },\n )\n const runtime = new PersistedCollectionRuntime<T, TKey>(\n `sync-absent`,\n collectionId,\n persistence,\n localOnlyOptions.syncMode ?? `eager`,\n localOnlyOptions.id ?? DEFAULT_DB_NAME,\n )\n\n const wrappedOnInsert = async (\n params: InsertMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const handlerResult = localOnlyOptions.onInsert\n ? await localOnlyOptions.onInsert(\n params as unknown as InsertMutationFnParams<T, TKey, TUtils>,\n )\n : undefined\n\n await runtime.persistAndConfirmCollectionMutations(\n params.transaction.mutations as Array<PendingMutation<T>>,\n )\n\n return handlerResult ?? {}\n }\n\n const wrappedOnUpdate = async (\n params: UpdateMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const handlerResult = localOnlyOptions.onUpdate\n ? await localOnlyOptions.onUpdate(\n params as unknown as UpdateMutationFnParams<T, TKey, TUtils>,\n )\n : undefined\n\n await runtime.persistAndConfirmCollectionMutations(\n params.transaction.mutations as Array<PendingMutation<T>>,\n )\n\n return handlerResult ?? {}\n }\n\n const wrappedOnDelete = async (\n params: DeleteMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const handlerResult = localOnlyOptions.onDelete\n ? await localOnlyOptions.onDelete(\n params as unknown as DeleteMutationFnParams<T, TKey, TUtils>,\n )\n : undefined\n\n await runtime.persistAndConfirmCollectionMutations(\n params.transaction.mutations as Array<PendingMutation<T>>,\n )\n\n return handlerResult ?? {}\n }\n\n const acceptMutations = async (transaction: {\n mutations: Array<PendingMutation<Record<string, unknown>>>\n }) => {\n await runtime.acceptTransactionMutations(transaction)\n }\n\n const persistedUtils: PersistedCollectionUtils = {\n acceptMutations,\n getLeadershipState: () => runtime.getLeadershipState(),\n forceReloadSubset: (subsetOptions: LoadSubsetOptions) =>\n runtime.forceReloadSubset(subsetOptions),\n }\n\n const mergedUtils = {\n ...(localOnlyOptions.utils ?? ({} as TUtils)),\n ...persistedUtils,\n }\n\n const result = {\n ...localOnlyOptions,\n id: collectionId,\n persistence,\n sync: createLoopbackSyncConfig(runtime),\n onInsert: wrappedOnInsert,\n onUpdate: wrappedOnUpdate,\n onDelete: wrappedOnDelete,\n utils: mergedUtils,\n startSync: true,\n gcTime: localOnlyOptions.gcTime ?? 0,\n }\n\n return withCollectionConfigFactory(\n result,\n () =>\n persistedCollectionOptions({\n ...options,\n id: collectionId,\n }) as typeof result,\n )\n}\n\nexport function encodePersistedStorageKey(key: string | number): string {\n if (typeof key === `number`) {\n if (!Number.isFinite(key)) {\n throw new InvalidPersistedStorageKeyError(key)\n }\n\n if (Object.is(key, -0)) {\n return `n:-0`\n }\n\n return `n:${key}`\n }\n\n return `s:${key}`\n}\n\nexport function decodePersistedStorageKey(encoded: string): string | number {\n if (encoded === `n:-0`) {\n return -0\n }\n\n if (encoded.startsWith(`n:`)) {\n return Number(encoded.slice(2))\n }\n\n if (encoded.startsWith(`s:`)) {\n return encoded.slice(2)\n }\n\n throw new InvalidPersistedStorageKeyEncodingError(encoded)\n}\n\nconst PERSISTED_TABLE_NAME_ALPHABET = `abcdefghijklmnopqrstuvwxyz234567`\n\nfunction hashCollectionId(collectionId: string): number {\n let hash = 0x811c9dc5\n\n for (let index = 0; index < collectionId.length; index++) {\n hash ^= collectionId.charCodeAt(index)\n hash = Math.imul(hash, 0x01000193)\n }\n\n return hash >>> 0\n}\n\nfunction toBase32(input: number): string {\n if (input === 0) {\n return PERSISTED_TABLE_NAME_ALPHABET.charAt(0)\n }\n\n let value = input >>> 0\n let output = ``\n\n while (value > 0) {\n output = `${PERSISTED_TABLE_NAME_ALPHABET.charAt(value % 32)}${output}`\n value = Math.floor(value / 32)\n }\n\n return output\n}\n\nexport function createPersistedTableName(\n collectionId: string,\n prefix: `c` | `t` = `c`,\n): string {\n if (!collectionId) {\n throw new InvalidPersistedCollectionConfigError(\n `collectionId is required to derive a persisted table name`,\n )\n }\n\n const hashPart = toBase32(hashCollectionId(collectionId))\n const lengthPart = collectionId.length.toString(36)\n\n return `${prefix}_${hashPart}_${lengthPart}`\n}\n"],"names":["safeRandomUUID","InvalidPersistedCollectionCoordinatorError","InvalidPersistenceAdapterError","InvalidPersistedCollectionConfigError","key","SyncTransactionAbortedError","compileSingleRowExpression","toBooleanPredicate","applied","InvalidSyncConfigError","schemaVersion","collectionId","persistence","runtime","result","withCollectionConfigFactory","InvalidPersistedStorageKeyError","InvalidPersistedStorageKeyEncodingError"],"mappings":"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"}
|