@tanstack/db-sqlite-persistence-core 0.4.7 → 0.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +32 -3
  2. package/dist/cjs/broadcast-coordinator.cjs +282 -43
  3. package/dist/cjs/broadcast-coordinator.cjs.map +1 -1
  4. package/dist/cjs/broadcast-coordinator.d.cts +25 -8
  5. package/dist/cjs/committed-tx-anchor.cjs +9 -0
  6. package/dist/cjs/committed-tx-anchor.cjs.map +1 -0
  7. package/dist/cjs/committed-tx-anchor.d.cts +1 -0
  8. package/dist/cjs/index.cjs +4 -0
  9. package/dist/cjs/index.cjs.map +1 -1
  10. package/dist/cjs/persisted.cjs +1599 -313
  11. package/dist/cjs/persisted.cjs.map +1 -1
  12. package/dist/cjs/persisted.d.cts +106 -13
  13. package/dist/cjs/remote-subset-wire.cjs +11 -0
  14. package/dist/cjs/remote-subset-wire.cjs.map +1 -1
  15. package/dist/cjs/remote-subset-wire.d.cts +1 -0
  16. package/dist/cjs/sqlite-core-adapter.cjs +705 -64
  17. package/dist/cjs/sqlite-core-adapter.cjs.map +1 -1
  18. package/dist/cjs/sqlite-core-adapter.d.cts +53 -10
  19. package/dist/esm/broadcast-coordinator.d.ts +25 -8
  20. package/dist/esm/broadcast-coordinator.js +283 -44
  21. package/dist/esm/broadcast-coordinator.js.map +1 -1
  22. package/dist/esm/committed-tx-anchor.d.ts +1 -0
  23. package/dist/esm/committed-tx-anchor.js +9 -0
  24. package/dist/esm/committed-tx-anchor.js.map +1 -0
  25. package/dist/esm/index.js +6 -2
  26. package/dist/esm/persisted.d.ts +106 -13
  27. package/dist/esm/persisted.js +1601 -315
  28. package/dist/esm/persisted.js.map +1 -1
  29. package/dist/esm/remote-subset-wire.d.ts +1 -0
  30. package/dist/esm/remote-subset-wire.js +11 -0
  31. package/dist/esm/remote-subset-wire.js.map +1 -1
  32. package/dist/esm/sqlite-core-adapter.d.ts +53 -10
  33. package/dist/esm/sqlite-core-adapter.js +708 -67
  34. package/dist/esm/sqlite-core-adapter.js.map +1 -1
  35. package/package.json +2 -2
  36. package/src/broadcast-coordinator.ts +415 -62
  37. package/src/committed-tx-anchor.ts +13 -0
  38. package/src/persisted.ts +2283 -370
  39. package/src/remote-subset-wire.ts +12 -0
  40. package/src/sqlite-core-adapter.ts +891 -68
@@ -1 +1 @@
1
- {"version":3,"file":"persisted.cjs","sources":["../../src/persisted.ts"],"sourcesContent":["import {\n NoPendingSyncTransactionCommitError,\n NoPendingSyncTransactionWriteError,\n PERSISTED_READINESS,\n SYNC_PERSISTENCE_PROTOCOL,\n SYNC_PERSISTENCE_VERSION,\n SyncTransactionAbortedError,\n compileSingleRowExpression,\n getLoadSubsetDemandKey,\n safeRandomUUID,\n toBooleanPredicate,\n whenSyncAccepted,\n withAcceptedReceipt,\n withCollectionConfigFactory,\n} from '@tanstack/db'\nimport {\n DuplicateRemoteSubsetOwnerError,\n InvalidPersistedCollectionConfigError,\n InvalidPersistedCollectionCoordinatorError,\n InvalidPersistedStorageKeyEncodingError,\n InvalidPersistedStorageKeyError,\n InvalidPersistenceAdapterError,\n InvalidSyncConfigError,\n PersistedCollectionDurabilityError,\n toPersistedCollectionDurabilityError,\n} from './errors'\nimport { serializeSQLiteBigInt, serializeSQLiteTemporal } from './sqlite-value'\nimport {\n toProcessLocalLoadSubsetOptions,\n toTransportedLoadSubsetOptions,\n validateRemoteSubsetOptions,\n} from './remote-subset-wire'\nimport {\n reportRemoteSubsetOwnerError,\n unloadRemoteSubsetOwner,\n} from './remote-subset-owner'\nimport type { TransportedLoadSubsetOptions } from './remote-subset-wire'\nimport type { RemoteSubsetOwner } from './remote-subset-owner'\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\nimport type {\n ChangeMessageOrDeleteKeyMessage,\n Collection,\n CollectionConfig,\n CollectionIndexMetadata,\n DeleteMutationFnParams,\n InferSchemaOutput,\n InsertMutationFnParams,\n LoadSubsetFn,\n LoadSubsetOptions,\n PendingMutation,\n PersistedReadinessSnapshot,\n PersistedReadinessSource,\n SyncAppliedReceipt,\n SyncConfig,\n SyncConfigRes,\n SyncMetadataApi,\n SyncPersistenceCapabilityV1,\n SyncPersistenceKeySetEvidence,\n SyncPersistenceScanOptions,\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 /** Persisted row metadata, not optimistic-transaction metadata. */\n metadata?: unknown\n /** Whether this envelope replaces or deletes the persisted row metadata. */\n metadataChanged?: boolean\n }\n | {\n mutationId: string\n type: `update`\n key: string | number\n value: Record<string, unknown>\n /** Persisted row metadata, not optimistic-transaction metadata. */\n metadata?: unknown\n /** Whether this envelope replaces or deletes the persisted row metadata. */\n metadataChanged?: boolean\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 acquisitionId: string\n options: TransportedLoadSubsetOptions\n}\n\nexport type EnsureRemoteSubsetResponse =\n | {\n type: `rpc:ensureRemoteSubset:res`\n rpcId: string\n ok: true\n leaderId: string\n }\n | {\n type: `rpc:ensureRemoteSubset:res`\n rpcId: string\n ok: false\n error: string\n retryable?: true\n }\n\nexport type ReleaseRemoteSubsetRequest = {\n type: `rpc:releaseRemoteSubset:req`\n rpcId: string\n acquisitionId: string\n}\n\nexport type ReleaseRemoteSubsetResponse =\n | {\n type: `rpc:releaseRemoteSubset:res`\n rpcId: string\n ok: true\n }\n | {\n type: `rpc:releaseRemoteSubset: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 | {\n type: `rpc:applyLocalMutations:res`\n rpcId: string\n ok: false\n code: `PERSISTENCE_ERROR`\n error: string\n sourceCode?: string | number\n path?: string | ReadonlyArray<string | number>\n }\n\nexport type ApplyCommittedTxRequest = {\n type: `rpc:applyCommittedTx:req`\n rpcId: string\n envelopeId: string\n tx: PersistedTx\n}\n\nexport type ApplyCommittedTxResponse =\n | {\n type: `rpc:applyCommittedTx:res`\n rpcId: string\n ok: true\n term: number\n seq: number\n latestRowVersion: number\n }\n | {\n type: `rpc:applyCommittedTx:res`\n rpcId: string\n ok: false\n code: `NOT_LEADER` | `CONFLICT` | `TIMEOUT`\n error: string\n }\n | {\n type: `rpc:applyCommittedTx:res`\n rpcId: string\n ok: false\n code: `PERSISTENCE_ERROR`\n error: string\n sourceCode?: string | number\n path?: string | ReadonlyArray<string | number>\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 } | { 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 = SyncPersistenceScanOptions\n\nexport type PersistedKeySetEvidence = SyncPersistenceKeySetEvidence\n\ntype PersistedResumeGeneration = {\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n}\n\nexport type PersistencePullSinceResult =\n | {\n latestRowVersion: number\n requiresFullReload: true\n }\n | {\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\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\n/**\n * Opaque identity shared by every adapter over the same physical SQLite driver.\n * The core adapter uses it to serialize non-preemptible logical operations\n * while alternating one regular operation between queued hydrations.\n *\n * Delegating drivers must forward this property before they are passed to a\n * SQLite persistence adapter. A driver may also brand each returned Promise\n * with the same key for late capability discovery, but a wrapper must return\n * that exact Promise: discovering the key after a call cannot retroactively\n * schedule the wrapper's first logical operation.\n */\nexport const SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY = Symbol.for(\n `tanstack-db.sqlite-driver-supports-shared-logical-scheduling`,\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 loadResumeSnapshot: (\n collectionId: string,\n ctx?: {\n requiredIndexSignatures?: ReadonlyArray<string>\n includeRows?: boolean\n },\n ) => Promise<{\n rows: Array<{\n key: string | number\n value: Record<string, unknown>\n metadata?: unknown\n }>\n keySet?: PersistedKeySetEvidence\n collectionMetadata: Array<{ key: string; value: unknown }>\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n }>\n 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 * Runs one complete logical hydrate as a non-preemptible scheduler unit.\n * The callback must use the supplied unscheduled adapter for all nested\n * persistence work and must not retain it after the callback settles.\n */\n runInHydrationScope?: <T>(\n task: (adapter: HydrationPersistenceAdapter) => Promise<T>,\n ) => Promise<T>\n /** Schedule one regular operation before it acquires external writer locks. */\n runInRegularScope?: <T>(\n task: (adapter: HydrationPersistenceAdapter) => Promise<T>,\n ) => Promise<T>\n /** Whether hydration scopes currently enter a shared driver scheduler. */\n isHydrationScopeScheduled?: () => boolean\n}\n\nexport type HydrationPersistenceAdapter = PersistenceAdapter & {\n pullSince?: (\n collectionId: string,\n fromRowVersion: number,\n ) => Promise<PersistencePullSinceResult>\n}\n\nexport type { RemoteSubsetOwner } from './remote-subset-owner'\n\ntype SingleProcessRemoteSubsetAcquisition = {\n owner: RemoteSubsetOwner\n options: TransportedLoadSubsetOptions\n load: Promise<void>\n}\n\nexport interface SQLiteDriver {\n readonly [SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY]?: object\n /** Host-specific limit on bound parameters in one query, when lower than SQLite's. */\n readonly maxBoundParameters?: number\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\n/**\n * Forwards a driver's shared logical scheduling identity to a transparent\n * delegating driver before the wrapper is used by a persistence adapter.\n */\nexport function forwardSQLiteDriverSharedLogicalScheduling<\n TDriver extends SQLiteDriver,\n>(source: SQLiteDriver, wrapper: TDriver): TDriver {\n const key = source[SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY]\n if (key) {\n Object.defineProperty(\n wrapper,\n SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY,\n { value: key },\n )\n }\n return wrapper\n}\n\nexport interface PersistedCollectionCoordinator {\n getNodeId: () => string\n setAdapterForCollection?: (\n collectionId: string,\n adapter: PersistenceAdapter,\n ) => void\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 requestReleaseRemoteSubset: (\n collectionId: string,\n options: LoadSubsetOptions,\n ) => Promise<void>\n registerRemoteSubsetOwner: (\n collectionId: string,\n owner: RemoteSubsetOwner,\n ) => () => void\n /**\n * Requests leader-side index creation. The scoped adapter is leader-local\n * and is never serialized to a follower. `localEnsureCompleted` lets the\n * built-in leader avoid repeating successful local work.\n */\n requestEnsurePersistedIndex: (\n collectionId: string,\n signature: string,\n spec: PersistedIndexSpec,\n scopedAdapter?: HydrationPersistenceAdapter,\n localEnsureCompleted?: boolean,\n ) => Promise<void>\n requestApplyLocalMutations?: (\n collectionId: string,\n mutations: Array<PersistedMutationEnvelope>,\n ) => Promise<ApplyLocalMutationsResponse>\n /**\n * Applies a committed transaction through the supplied adapter when present.\n * Wrappers must forward this leader-local loan: scheduling it again can wait\n * on the hydration that is awaiting this call. Never serialize or retain the\n * loan after the call; ordinary work uses the registered collection adapter.\n */\n requestApplyCommittedTx: (\n collectionId: string,\n tx: PersistedTx,\n scopedAdapter?: HydrationPersistenceAdapter,\n ) => Promise<ApplyCommittedTxResponse>\n /** The scoped adapter is leader-local and is never serialized to a follower. */\n pullSince?: (\n collectionId: string,\n fromRowVersion: number,\n scopedAdapter?: HydrationPersistenceAdapter,\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 /** Hydrate once without acquiring a new ongoing subset lease. */\n forceReloadSubset?: (options: LoadSubsetOptions) => Promise<void> | void\n}\n\nclass PersistedReadinessTracker implements PersistedReadinessSource {\n private snapshot: PersistedReadinessSnapshot = { status: `loading` }\n private networkDeadlineAt: number | undefined\n private readonly listeners = new Set<() => void>()\n\n constructor(readonly networkTimeoutMs: number) {}\n\n getSnapshot = (): PersistedReadinessSnapshot => this.snapshot\n\n getOrStartNetworkDeadline = (): number => {\n return (this.networkDeadlineAt ??= Date.now() + this.networkTimeoutMs)\n }\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n }\n\n set(snapshot: PersistedReadinessSnapshot): void {\n const deadlineRestarted =\n snapshot.status === `loading` && this.networkDeadlineAt !== undefined\n if (deadlineRestarted) {\n this.networkDeadlineAt = Date.now() + this.networkTimeoutMs\n }\n if (\n this.snapshot.status === snapshot.status &&\n this.snapshot.error === snapshot.error &&\n !deadlineRestarted\n ) {\n return\n }\n this.snapshot = snapshot\n for (const listener of this.listeners) listener()\n }\n}\n\nexport type PersistedInitialRenderOptions = {\n strategy: `network-first`\n /** Time to prefer network before restored rows may render; defaults to 3s. */\n networkTimeoutMs?: number\n}\n\nconst DEFAULT_NETWORK_TIMEOUT_MS = 3_000\nconst MAX_TIMER_TIMEOUT_MS = 2_147_483_647\n\nfunction getNetworkTimeoutMs(\n initialRender: PersistedInitialRenderOptions | undefined,\n): number | undefined {\n if (initialRender === undefined) return undefined\n const strategy = (initialRender as { strategy: unknown }).strategy\n if (strategy !== `network-first`) {\n throw new InvalidPersistedCollectionConfigError(\n `initialRender.strategy must be \"network-first\"`,\n )\n }\n const timeoutMs = initialRender.networkTimeoutMs ?? DEFAULT_NETWORK_TIMEOUT_MS\n if (\n !Number.isFinite(timeoutMs) ||\n timeoutMs < 0 ||\n timeoutMs > MAX_TIMER_TIMEOUT_MS\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `initialRender.networkTimeoutMs must be between 0 and ${MAX_TIMER_TIMEOUT_MS}`,\n )\n }\n return timeoutMs\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 /** Opt into network-first rendering with a persisted fallback. */\n initialRender?: PersistedInitialRenderOptions\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 /** Opt into network-first rendering with a persisted fallback. */\n initialRender?: PersistedInitialRenderOptions\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 | `requestEnsureRemoteSubset`\n | `requestReleaseRemoteSubset`\n | `registerRemoteSubsetOwner`\n | `requestEnsurePersistedIndex`\n | `requestApplyCommittedTx`\n >\n> = [\n `getNodeId`,\n `subscribe`,\n `publish`,\n `isLeader`,\n `ensureLeadership`,\n `requestEnsureRemoteSubset`,\n `requestReleaseRemoteSubset`,\n `registerRemoteSubsetOwner`,\n `requestEnsurePersistedIndex`,\n `requestApplyCommittedTx`,\n]\n\nconst REQUIRED_ADAPTER_METHODS: ReadonlyArray<\n keyof Pick<\n PersistenceAdapter,\n `loadSubset` | `loadResumeSnapshot` | `applyCommittedTx` | `ensureIndex`\n >\n> = [`loadSubset`, `loadResumeSnapshot`, `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: (() => 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 markError: ((error: unknown) => void) | 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 private readonly collectionAdapters = new Map<string, PersistenceAdapter>()\n private readonly remoteSubsetOwners = new Map<string, RemoteSubsetOwner>()\n private readonly remoteSubsetAcquisitions = new Map<\n string,\n Map<LoadSubsetOptions, SingleProcessRemoteSubsetAcquisition>\n >()\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(\n collectionId: string,\n options: LoadSubsetOptions,\n ): Promise<void> {\n const transported = toTransportedLoadSubsetOptions(options)\n const localOptions = toProcessLocalLoadSubsetOptions(options, transported)\n const owner = this.remoteSubsetOwners.get(collectionId)\n if (!owner) {\n throw new InvalidPersistedCollectionConfigError(\n `SingleProcessCoordinator has no remote subset owner configured for collection \"${collectionId}\"`,\n )\n }\n let acquisitions = this.remoteSubsetAcquisitions.get(collectionId)\n if (!acquisitions) {\n acquisitions = new Map()\n this.remoteSubsetAcquisitions.set(collectionId, acquisitions)\n }\n const existing = acquisitions.get(options)\n if (existing) {\n await existing.load\n return\n }\n\n let resolveLoad!: () => void\n let rejectLoad!: (error: unknown) => void\n const load = new Promise<void>((resolve, reject) => {\n resolveLoad = resolve\n rejectLoad = reject\n })\n acquisitions.set(options, { owner, options: localOptions, load })\n try {\n const ownerLoad = owner(localOptions)\n void Promise.resolve(ownerLoad).then(resolveLoad, (error) => {\n reportRemoteSubsetOwnerError(owner, error)\n rejectLoad(error)\n })\n } catch (error) {\n reportRemoteSubsetOwnerError(owner, error)\n rejectLoad(error)\n }\n await load\n }\n\n public async requestReleaseRemoteSubset(\n collectionId: string,\n options: LoadSubsetOptions,\n ): Promise<void> {\n const acquisitions = this.remoteSubsetAcquisitions.get(collectionId)\n const acquisition = acquisitions?.get(options)\n if (!acquisition) return\n acquisitions!.delete(options)\n if (acquisitions!.size === 0) {\n this.remoteSubsetAcquisitions.delete(collectionId)\n }\n try {\n await acquisition.load\n } catch {\n // Calling the owner transferred the lease even when its load rejected.\n }\n await unloadRemoteSubsetOwner(acquisition.owner, acquisition.options)\n }\n\n public registerRemoteSubsetOwner(\n collectionId: string,\n owner: RemoteSubsetOwner,\n ): () => void {\n if (this.remoteSubsetOwners.has(collectionId)) {\n throw new DuplicateRemoteSubsetOwnerError(collectionId)\n }\n this.remoteSubsetOwners.set(collectionId, owner)\n return () => {\n if (this.remoteSubsetOwners.get(collectionId) !== owner) return\n const acquisitions = this.remoteSubsetAcquisitions.get(collectionId)\n this.remoteSubsetAcquisitions.delete(collectionId)\n this.remoteSubsetOwners.delete(collectionId)\n for (const acquisition of acquisitions?.values() ?? []) {\n void (async () => {\n try {\n await acquisition.load\n } catch {\n // Calling the owner transferred the lease even when its load rejected.\n }\n await unloadRemoteSubsetOwner(owner, acquisition.options)\n })().catch(() => undefined)\n }\n }\n }\n\n public async requestEnsurePersistedIndex(): Promise<void> {}\n\n public setAdapterForCollection(\n collectionId: string,\n adapter: PersistenceAdapter,\n ): void {\n this.collectionAdapters.set(collectionId, adapter)\n }\n\n public async requestApplyCommittedTx(\n collectionId: string,\n tx: PersistedTx,\n scopedAdapter?: HydrationPersistenceAdapter,\n ): Promise<ApplyCommittedTxResponse> {\n const adapter = scopedAdapter ?? this.collectionAdapters.get(collectionId)\n if (!adapter) {\n throw new InvalidPersistedCollectionConfigError(\n `SingleProcessCoordinator has no persistence adapter configured for collection \"${collectionId}\"`,\n )\n }\n\n try {\n await adapter.applyCommittedTx(collectionId, tx)\n } catch (error) {\n throw toPersistedCollectionDurabilityError(collectionId, error)\n }\n return {\n type: `rpc:applyCommittedTx:res`,\n rpcId: safeRandomUUID(),\n ok: true,\n term: tx.term,\n seq: tx.seq,\n latestRowVersion: tx.rowVersion,\n }\n }\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 collectionId: string,\n): PersistedResolvedPersistence {\n validatePersistenceAdapter(persistence.adapter)\n\n const coordinator = persistence.coordinator ?? new SingleProcessCoordinator()\n if (coordinator instanceof SingleProcessCoordinator) {\n coordinator.setAdapterForCollection(collectionId, persistence.adapter)\n }\n validatePersistedCollectionCoordinator(coordinator)\n\n return {\n ...persistence,\n coordinator,\n }\n}\n\nfunction resolvePersistenceForMode(\n persistence: PersistedCollectionPersistence,\n mode: PersistedCollectionMode,\n collectionId: string,\n): PersistedResolvedPersistence {\n const modeSpecificPersistence = persistence.resolvePersistenceForMode?.(mode)\n return resolvePersistence(\n modeSpecificPersistence ?? persistence,\n collectionId,\n )\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(\n collectionSpecificPersistence,\n options.collectionId,\n )\n }\n\n return resolvePersistenceForMode(\n persistence,\n options.mode,\n options.collectionId,\n )\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 partialUpdateOperationIndexes: Set<number>\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 deferredHydrationMetadataDeleteKeys: Set<TKey>\n hydrationContext?: { suppliedRowKeys: Set<TKey> }\n hydrationSequence?: number\n truncate: boolean\n internal: boolean\n lifecycleGeneration: number\n expectedResumeGenerationOwner?: symbol\n signal?: AbortSignal\n prependHydrationRows: (\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n ) => void\n applyToCollection: () => SyncAppliedReceipt\n shouldFailStopOnAbort?: () => boolean\n resolveApplied?: () => void\n rejectApplied?: (error: unknown) => void\n}\n\ntype OpenSyncTransaction<T extends object, TKey extends string | number> = Omit<\n BufferedSyncTransaction<T, TKey>,\n `applyToCollection` | `prependHydrationRows` | `shouldFailStopOnAbort`\n> & {\n signal?: AbortSignal\n applicationReceipt?: SyncAppliedReceipt\n operationKeys: Set<TKey>\n queuedBecauseHydrating: boolean\n // Set by `reserveCommitTurn`: subset hydration waits for this commit.\n reservesCommitTurn?: boolean\n hasDependentSuccessor: boolean\n publicationAdmissionWaiters?: Set<{\n resolve: () => void\n reject: (error: unknown) => void\n }>\n terminalFailure?: { error: unknown }\n}\n\ntype SyncWriteNormalization<T extends object, TKey extends string | number> = {\n operation: NormalizedSyncOperation<T, TKey>\n}\n\nclass ApplyMutex {\n private queue: Promise<void> = Promise.resolve()\n private pending = 0\n\n reserve(): {\n run: <T>(task: () => Promise<T> | T) => Promise<T>\n } {\n const runImmediately = this.pending === 0\n const predecessor = this.queue\n this.pending++\n\n let releaseReservation!: () => void\n const reservation = new Promise<void>((resolve) => {\n releaseReservation = resolve\n })\n this.queue = runImmediately\n ? reservation\n : predecessor.then(() => reservation)\n\n let used = false\n return {\n run: <T>(task: () => Promise<T> | T): Promise<T> => {\n if (used) {\n return Promise.reject(\n new Error(`an apply-mutex reservation can only run once`),\n )\n }\n used = true\n\n let taskPromise: Promise<T>\n if (runImmediately) {\n try {\n taskPromise = Promise.resolve(task())\n } catch (error) {\n taskPromise = Promise.reject(error)\n }\n } else {\n taskPromise = predecessor.then(() => task())\n }\n const markComplete = () => {\n this.pending--\n releaseReservation()\n }\n void taskPromise.then(markComplete, markComplete)\n return taskPromise\n },\n }\n }\n\n run<T>(task: () => Promise<T> | T): Promise<T> {\n return this.reserve().run(task)\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 serializeSQLiteBigInt(value)\n case `function`:\n case `symbol`:\n case `undefined`:\n return undefined\n }\n\n const temporal = serializeSQLiteTemporal(value)\n if (temporal) return temporal\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 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 // PendingMutation.metadata belongs to the optimistic transaction and is\n // consumed by mutation handlers. It must not overwrite persisted row metadata.\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 activeHydrationContext: { suppliedRowKeys: Set<TKey> } | undefined\n private hydrationSequence = 0\n // An unscheduled startup read may finish after a coordinator reset publishes.\n private resetSequence = 0\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<{\n txCommitted: TxCommitted\n lifecycleGeneration: number\n }> = []\n private readonly requestIds = new WeakMap<LoadSubsetOptions, string>()\n private readonly hydratedDemands = new Set<string | undefined>()\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 markError: null,\n }\n private startupMetadataPromise: Promise<void> | null = null\n private startPromise: Promise<void> | null = null\n private hasAttemptedStartup = false\n private resumeBaselinePromise: Promise<void> | null = null\n private resumeCertificationPromise: Promise<void> | null = null\n private persistedKeySetEvidence: PersistedKeySetEvidence | undefined\n private persistedResumeGeneration: PersistedResumeGeneration | undefined\n private resumeGenerationOwner = Symbol(`persisted resume generation owner`)\n private lifecycleGeneration = 0\n private internalApplyDepth = 0\n private appliedReceiptSequence = 0\n private syncErrorReported = false\n private reportedSyncError: unknown\n private readonly pendingAppliedReceipts = new Map<number, Promise<void>>()\n private hydratingGeneration: number | null = null\n private terminalFailure:\n { lifecycleGeneration: number; error: unknown } | undefined\n private coordinatorUnsubscribe: (() => void) | null = null\n private remoteSubsetOwnerUnsubscribe: (() => 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 nextRequestId = 0\n private startupSettled = false\n private sourceTruncateGeneration = 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 private readonly persistedReadiness?: PersistedReadinessTracker,\n ) {}\n\n setSyncControls(syncControls: SyncControlFns<T, TKey>): void {\n this.advanceLifecycle()\n this.syncErrorReported = false\n this.reportedSyncError = undefined\n\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 reportSyncError(error: unknown): unknown {\n const markError = this.syncControls.markError\n if (this.syncErrorReported) return this.reportedSyncError\n if (!markError) return error\n\n this.syncErrorReported = true\n this.reportedSyncError = error\n try {\n markError(error)\n } catch {\n // Reporting must not replace the original asynchronous failure.\n }\n return error\n }\n\n registerRemoteSubsetOwner(owner: RemoteSubsetOwner): void {\n this.remoteSubsetOwnerUnsubscribe?.()\n this.remoteSubsetOwnerUnsubscribe =\n this.persistence.coordinator.registerRemoteSubsetOwner(\n this.collectionId,\n owner,\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 // Startup waits for acceptance: a local mutation's handler can wait for\n // startup, and the rows publish when that mutation settles. Readiness waits\n // for them in core. A subset load waits for visibility.\n private async waitForAppliedReceiptsAfter(\n cursor: number,\n until: `accepted` | `visible` = `visible`,\n ): Promise<void> {\n await Promise.all(\n Array.from(this.pendingAppliedReceipts, ([sequence, receipt]) =>\n sequence <= cursor\n ? undefined\n : until === `accepted`\n ? whenSyncAccepted(receipt)\n : receipt,\n ),\n )\n }\n\n private clearSyncControls(): void {\n this.syncControls = {\n begin: null,\n write: null,\n commit: null,\n truncate: null,\n metadata: null,\n markError: null,\n }\n }\n\n isHydratingNow(): boolean {\n return this.hydratingGeneration === this.lifecycleGeneration\n }\n\n getActiveHydrationContext(): { suppliedRowKeys: Set<TKey> } | undefined {\n return this.activeHydrationContext\n }\n\n getHydrationSequence(): number {\n return this.hydrationSequence\n }\n\n getCurrentTerminalFailure(): { error: unknown } | undefined {\n const failure = this.terminalFailure\n return failure?.lifecycleGeneration === this.lifecycleGeneration\n ? failure\n : undefined\n }\n\n getLifecycleGeneration(): number {\n return this.lifecycleGeneration\n }\n\n private throwIfLifecycleReplaced(lifecycleGeneration: number): void {\n if (lifecycleGeneration !== this.lifecycleGeneration) {\n throw new SyncTransactionAbortedError()\n }\n }\n\n private throwIfTerminal(): void {\n const failure = this.getCurrentTerminalFailure()\n if (failure) throw failure.error\n }\n\n private markTerminalFailure(\n error: unknown,\n lifecycleGeneration = this.lifecycleGeneration,\n ): unknown {\n if (lifecycleGeneration !== this.lifecycleGeneration) {\n return error\n }\n\n const existing = this.getCurrentTerminalFailure()\n if (existing) {\n return existing.error\n }\n\n this.terminalFailure = { lifecycleGeneration, error }\n this.persistedReadiness?.set({ status: `error`, error })\n this.pendingRemoteSubsetEnsures.clear()\n this.queuedTxCommitted.length = 0\n if (this.remoteEnsureRetryTimer !== null) {\n clearTimeout(this.remoteEnsureRetryTimer)\n this.remoteEnsureRetryTimer = null\n }\n this.rejectQueuedHydrationTransactions(error)\n this.reportSyncError(error)\n return error\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 private runInHydrationScope<TResult>(\n task: (adapter: HydrationPersistenceAdapter) => Promise<TResult>,\n adapter: HydrationPersistenceAdapter = this.persistence.adapter,\n ): Promise<TResult> {\n if (adapter.runInHydrationScope) {\n return adapter.runInHydrationScope(task)\n }\n return Promise.resolve().then(() => task(adapter))\n }\n\n async ensureStarted(): Promise<void> {\n this.throwIfTerminal()\n if (this.startPromise) {\n return this.startPromise\n }\n\n const lifecycleGeneration = this.lifecycleGeneration\n const isRestart = this.hasAttemptedStartup\n this.hasAttemptedStartup = true\n let resolveStartupMetadata!: () => void\n let rejectStartupMetadata!: (error: unknown) => void\n this.startupMetadataPromise = new Promise<void>((resolve, reject) => {\n resolveStartupMetadata = resolve\n rejectStartupMetadata = reject\n })\n void this.startupMetadataPromise.catch(() => undefined)\n\n this.startPromise = (async () => {\n const loadStartupMetadata = async (\n adapter: HydrationPersistenceAdapter,\n ) => {\n if (lifecycleGeneration !== this.lifecycleGeneration) {\n resolveStartupMetadata()\n return false\n }\n\n try {\n await this.loadStartupMetadataInternal(lifecycleGeneration, adapter)\n return lifecycleGeneration === this.lifecycleGeneration\n } catch (error) {\n rejectStartupMetadata(error)\n throw error\n }\n }\n\n let startup:\n | {\n appliedCursor: number | undefined\n indexBootstrapSnapshot: Array<CollectionIndexMetadata>\n completedLocalIndexSignatures: Set<string>\n }\n | undefined\n const scheduleStartupAsOneHydrate =\n this.persistence.adapter.runInHydrationScope !== undefined &&\n (!isRestart ||\n (this.persistence.adapter.isHydrationScopeScheduled?.() ?? true))\n if (scheduleStartupAsOneHydrate) {\n startup = await this.applyMutex.run(async () => {\n const result = await this.runInHydrationScope(async (adapter) => {\n if (!(await loadStartupMetadata(adapter))) return undefined\n return this.startInternal(\n lifecycleGeneration,\n adapter,\n resolveStartupMetadata,\n )\n })\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n return result\n })\n } else {\n // Preserve the existing unscheduled-adapter lifecycle contract: a\n // replacement upstream may start while stale hydration is settling.\n if (await loadStartupMetadata(this.persistence.adapter)) {\n if (this.persistence.adapter.isHydrationScopeScheduled?.()) {\n startup = await this.applyMutex.run(async () => {\n const result = await this.runInHydrationScope((adapter) =>\n this.startInternal(\n lifecycleGeneration,\n adapter,\n resolveStartupMetadata,\n ),\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n return result\n })\n } else {\n startup = await this.startInternal(\n lifecycleGeneration,\n this.persistence.adapter,\n resolveStartupMetadata,\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n }\n }\n }\n if (\n startup !== undefined &&\n lifecycleGeneration === this.lifecycleGeneration\n ) {\n await this.requestCoordinatorPersistedIndexes(\n startup.indexBootstrapSnapshot,\n startup.completedLocalIndexSignatures,\n )\n if (\n startup.appliedCursor !== undefined &&\n lifecycleGeneration === this.lifecycleGeneration\n ) {\n await this.waitForAppliedReceiptsAfter(\n startup.appliedCursor,\n `accepted`,\n )\n }\n }\n if (lifecycleGeneration === this.lifecycleGeneration) {\n this.startupSettled = true\n this.persistedReadiness?.set({ status: `ready` })\n }\n resolveStartupMetadata()\n })().catch((error) => {\n rejectStartupMetadata(error)\n throw this.markTerminalFailure(error, lifecycleGeneration)\n })\n void this.startPromise.catch(() => undefined)\n return this.startPromise\n }\n\n ensureResumeBaselineHydrated(): Promise<void> {\n this.throwIfTerminal()\n if (this.resumeBaselinePromise) {\n return this.resumeBaselinePromise\n }\n\n const lifecycleGeneration = this.lifecycleGeneration\n this.resumeBaselinePromise = (async () => {\n await this.ensureStarted()\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n if (this.syncMode !== `on-demand`) return\n\n const appliedCursor = await this.applyMutex.run(async () => {\n const result = await this.runInHydrationScope((adapter) =>\n this.hydrateBaseline(lifecycleGeneration, adapter),\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n return result\n })\n if (\n appliedCursor !== undefined &&\n lifecycleGeneration === this.lifecycleGeneration\n ) {\n await this.waitForAppliedReceiptsAfter(appliedCursor, `accepted`)\n }\n })().catch((error) => {\n throw this.markTerminalFailure(error, lifecycleGeneration)\n })\n return this.resumeBaselinePromise\n }\n\n ensureResumeBaselineCertified(): Promise<void> {\n if (this.resumeCertificationPromise) {\n return this.resumeCertificationPromise\n }\n\n const lifecycleGeneration = this.lifecycleGeneration\n this.resumeCertificationPromise = (async () => {\n await this.ensureStarted()\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n\n const snapshot = await this.persistence.adapter.loadResumeSnapshot(\n this.collectionId,\n {\n requiredIndexSignatures: this.getRequiredIndexSignatures(),\n includeRows: false,\n },\n )\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n this.bindResumeSnapshotEvidence(snapshot)\n })()\n return this.resumeCertificationPromise\n }\n\n getKeySetEvidence(): PersistedKeySetEvidence | undefined {\n return this.persistedKeySetEvidence\n }\n\n getResumeGenerationOwner(): symbol {\n return this.resumeGenerationOwner\n }\n\n private async hydrateBaseline(\n lifecycleGeneration: number,\n adapter: HydrationPersistenceAdapter,\n ): Promise<number | undefined> {\n if (lifecycleGeneration !== this.lifecycleGeneration) return undefined\n\n // The baseline shares the unconstrained demand key. Its lease is never\n // released, and every reload rereads it, so that coverage stays valid.\n const baseline = {}\n this.activeSubsets.set(this.getSubsetKey(baseline), baseline)\n const appliedCursor = this.appliedReceiptSequence\n await this.hydrateSubsetUnsafe(\n baseline,\n {\n lifecycleGeneration,\n bindKeySetEvidence: true,\n },\n adapter,\n )\n return lifecycleGeneration === this.lifecycleGeneration\n ? appliedCursor\n : undefined\n }\n\n async ensureStartupMetadataLoaded(): Promise<void> {\n this.throwIfTerminal()\n if (this.startupMetadataPromise) {\n return this.startupMetadataPromise\n }\n\n void this.ensureStarted()\n return this.startupMetadataPromise!\n }\n\n private async startInternal(\n lifecycleGeneration: number,\n adapter: HydrationPersistenceAdapter,\n onStartupMetadataLoaded: () => void,\n ): Promise<\n | {\n appliedCursor: number | undefined\n indexBootstrapSnapshot: Array<CollectionIndexMetadata>\n completedLocalIndexSignatures: Set<string>\n }\n | undefined\n > {\n if (lifecycleGeneration !== this.lifecycleGeneration) return undefined\n\n const indexBootstrapSnapshot = this.collection?.getIndexMetadata() ?? []\n this.attachIndexLifecycleListeners()\n const completedLocalIndexSignatures = await this.bootstrapPersistedIndexes(\n indexBootstrapSnapshot,\n adapter,\n )\n if (lifecycleGeneration !== this.lifecycleGeneration) return undefined\n\n // Let the source run only once the startup hydrate is about to begin.\n // Its first transaction must bind to that hydrate's sequence, not the\n // sequence before index bootstrap yielded.\n onStartupMetadataLoaded()\n const appliedCursor =\n this.syncMode !== `on-demand`\n ? await this.hydrateBaseline(lifecycleGeneration, adapter)\n : undefined\n return lifecycleGeneration === this.lifecycleGeneration\n ? {\n appliedCursor,\n indexBootstrapSnapshot,\n completedLocalIndexSignatures,\n }\n : undefined\n }\n\n private async loadStartupMetadataInternal(\n lifecycleGeneration: number,\n adapter: HydrationPersistenceAdapter,\n ): Promise<void> {\n const snapshot = await adapter.loadResumeSnapshot(this.collectionId, {\n includeRows: false,\n })\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n this.persistedResumeGeneration = this.getResumeSnapshotGeneration(snapshot)\n this.persistedKeySetEvidence = snapshot.keySet\n this.observeStreamPosition(\n snapshot.latestTerm,\n snapshot.latestSeq,\n snapshot.latestRowVersion,\n )\n const applied = this.replaceCollectionMetadataSnapshot(\n snapshot.collectionMetadata,\n )\n await whenSyncAccepted(applied)\n }\n\n private async loadCollectionMetadataSnapshot(\n adapter: HydrationPersistenceAdapter,\n ): Promise<Array<{ key: string; value: unknown }>> {\n if (!adapter.loadCollectionMetadata) {\n return []\n }\n\n return adapter.loadCollectionMetadata(this.collectionId)\n }\n\n private replaceCollectionMetadataSnapshot(\n collectionMetadata: Array<{ key: string; value: unknown }>,\n ): SyncAppliedReceipt {\n if (\n !this.syncControls.begin ||\n !this.syncControls.commit ||\n !this.syncControls.metadata\n ) {\n return true\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 return this.withInternalApply(() => {\n this.syncControls.begin?.()\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 return this.syncControls.commit?.() ?? true\n })\n }\n\n async loadSubset(\n options: LoadSubsetOptions,\n upstreamLoadSubset?: LoadSubsetFn,\n ): Promise<void> {\n this.throwIfTerminal()\n const lifecycleGeneration = this.lifecycleGeneration\n const subsetKey = this.getSubsetKey(options)\n const truncateGeneration = this.sourceTruncateGeneration\n const routeRemoteDemandDuringHydration =\n this.canRouteRemoteDemandThroughCoordinator()\n // Wire admission failures are permanent input errors, not transport retries.\n if (routeRemoteDemandDuringHydration) validateRemoteSubsetOptions(options)\n this.activeSubsets.set(subsetKey, options)\n const appliedCursor = this.appliedReceiptSequence\n try {\n await this.applyMutex.run(async () => {\n try {\n await this.runInHydrationScope((adapter) =>\n this.hydrateSubsetUnsafe(\n options,\n {\n lifecycleGeneration,\n requestLocalLoadFailure: true,\n rejectBufferedReplayFailure: true,\n },\n adapter,\n ),\n )\n } finally {\n if (\n lifecycleGeneration === this.lifecycleGeneration &&\n !this.getCurrentTerminalFailure()\n ) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n }\n })\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n await this.waitForAppliedReceiptsAfter(appliedCursor)\n // Leadership can change while hydration waits. Validate newly remote\n // demand inside the admission cleanup boundary, before retry can own it.\n if (\n !routeRemoteDemandDuringHydration &&\n this.canRouteRemoteDemandThroughCoordinator()\n ) {\n validateRemoteSubsetOptions(options)\n }\n } catch (error) {\n if (this.activeSubsets.get(subsetKey) === options) {\n this.activeSubsets.delete(subsetKey)\n }\n throw error\n }\n\n if (\n options.signal?.aborted ||\n this.activeSubsets.get(this.getSubsetKey(options)) !== options\n ) {\n return\n }\n\n if (this.canRouteRemoteDemandThroughCoordinator()) {\n try {\n await this.persistence.coordinator.requestEnsureRemoteSubset(\n this.collectionId,\n options,\n )\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 this.queueRemoteSubsetEnsure(options)\n throw error\n }\n return\n }\n\n if (\n truncateGeneration === this.sourceTruncateGeneration &&\n this.activeSubsets.get(subsetKey) === options\n ) {\n this.hydratedDemands.add(getLoadSubsetDemandKey(options))\n }\n\n if (upstreamLoadSubset) {\n try {\n await upstreamLoadSubset(options)\n } catch (error) {\n this.noteUpstreamLoadFailure(options, error)\n throw error\n }\n }\n }\n\n loadHydratedSubset(\n options: LoadSubsetOptions,\n upstreamLoadSubset?: LoadSubsetFn,\n ): true | Promise<void> | undefined {\n const failure = this.getCurrentTerminalFailure()\n if (failure) return Promise.reject(failure.error)\n if (\n !this.startupSettled ||\n this.isHydratingNow() ||\n this.canRouteRemoteDemandThroughCoordinator() ||\n options.refetch === true ||\n !this.hydratedDemands.has(getLoadSubsetDemandKey(options))\n ) {\n return\n }\n\n this.activeSubsets.set(this.getSubsetKey(options), options)\n let result: true | Promise<void>\n try {\n result = upstreamLoadSubset?.(options) ?? true\n } catch (error) {\n this.noteUpstreamLoadFailure(options, error)\n return Promise.reject(error)\n }\n if (result === true) {\n return true\n }\n\n return result.then(\n () => {\n this.queueRemoteSubsetEnsure(options)\n },\n (error: unknown) => {\n this.noteUpstreamLoadFailure(options, error)\n throw error\n },\n )\n }\n\n private noteUpstreamLoadFailure(\n options: LoadSubsetOptions,\n error: unknown,\n ): void {\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 return\n }\n console.warn(`Failed to trigger remote subset load:`, error)\n this.queueRemoteSubsetEnsure(options)\n }\n\n noteSourceTruncate(): void {\n this.sourceTruncateGeneration++\n this.hydratedDemands.clear()\n }\n\n unloadSubset(\n options: LoadSubsetOptions,\n upstreamUnloadSubset?: (options: LoadSubsetOptions) => void,\n ): void {\n const subsetKey = this.getSubsetKey(options)\n this.activeSubsets.delete(subsetKey)\n this.pendingRemoteSubsetEnsures.delete(subsetKey)\n const demandKey = getLoadSubsetDemandKey(options)\n const stillActive = Array.from(this.activeSubsets.values()).some(\n (active) => getLoadSubsetDemandKey(active) === demandKey,\n )\n if (!stillActive) this.hydratedDemands.delete(demandKey)\n if (this.mode === `sync-present`) {\n void this.persistence.coordinator\n .requestReleaseRemoteSubset(this.collectionId, options)\n .catch((error) => {\n this.reportSyncError(error)\n })\n }\n if (upstreamUnloadSubset) {\n try {\n const result = (\n upstreamUnloadSubset as unknown as (\n options: LoadSubsetOptions,\n ) => unknown\n )(options)\n void Promise.resolve(result).catch((error) => {\n this.reportSyncError(error)\n })\n } catch (error) {\n this.reportSyncError(error)\n }\n }\n }\n\n async forceReloadSubset(options: LoadSubsetOptions): Promise<void> {\n this.throwIfTerminal()\n const lifecycleGeneration = this.lifecycleGeneration\n // A one-shot refresh does not acquire an enduring subscription lease.\n await this.applyMutex.run(async () => {\n await this.runInHydrationScope((adapter) =>\n this.hydrateSubsetUnsafe(\n options,\n {\n lifecycleGeneration,\n rejectBufferedReplayFailure: true,\n },\n adapter,\n ),\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n })\n }\n\n queueHydrationBufferedTransaction(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): void {\n const failure = this.getCurrentTerminalFailure()\n if (failure) {\n transaction.rejectApplied?.(failure.error)\n return\n }\n this.queuedHydrationTransactions.push(transaction)\n }\n\n applyHydrationBufferedTransaction(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): Promise<void> {\n const failure = this.getCurrentTerminalFailure()\n if (failure) return Promise.reject(failure.error)\n return this.applyMutex.run(async () => {\n await this.applyBufferedSyncTransactionUnsafe(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 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 operation: {\n type: `delete`,\n key,\n value: previousValue,\n },\n }\n }\n\n const key = this.collection.getKeyFromItem(message.value)\n return {\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 lifecycleGeneration = this.lifecycleGeneration,\n ): Promise<void> {\n this.throwIfTerminal()\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n if (mutations.length === 0) {\n return\n }\n\n try {\n await this.applyMutex.run(async () => {\n // Startup metadata establishes the durable term/sequence boundary. A\n // mutation admitted before it resolves must wait rather than allocate a\n // default position that can collide with an already-applied transaction.\n await this.ensureStartupMetadataLoaded()\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n const acceptedMutationIds = await this.persistCollectionMutationsUnsafe(\n mutations,\n lifecycleGeneration,\n )\n this.throwIfLifecycleReplaced(lifecycleGeneration)\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 try {\n await this.confirmMutationsSyncUnsafe(acceptedMutations)\n } catch (error) {\n throw this.markTerminalFailure(error, lifecycleGeneration)\n }\n })\n } catch (error) {\n if (error instanceof PersistedCollectionDurabilityError) {\n throw this.markTerminalFailure(error, lifecycleGeneration)\n }\n throw error\n }\n }\n\n async acceptTransactionMutations(transaction: {\n mutations: Array<PendingMutation<Record<string, unknown>>>\n }): Promise<void> {\n this.throwIfTerminal()\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(): Promise<void> {\n this.advanceLifecycle()\n const remoteReleases: Array<Promise<void>> = []\n const failures: Array<unknown> = []\n const attempt = (callback: () => void): void => {\n try {\n callback()\n } catch (error) {\n failures.push(error)\n }\n }\n\n if (this.mode === `sync-present`) {\n for (const options of this.activeSubsets.values()) {\n attempt(() => {\n remoteReleases.push(\n this.persistence.coordinator\n .requestReleaseRemoteSubset(this.collectionId, options)\n .catch((error) => {\n this.reportSyncError(error)\n }),\n )\n })\n }\n }\n\n attempt(() => this.coordinatorUnsubscribe?.())\n this.coordinatorUnsubscribe = null\n\n attempt(() => this.remoteSubsetOwnerUnsubscribe?.())\n this.remoteSubsetOwnerUnsubscribe = null\n\n attempt(() => this.indexAddedUnsubscribe?.())\n this.indexAddedUnsubscribe = null\n\n attempt(() => 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 this.hydratedDemands.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 this.collection = null\n return Promise.all(remoteReleases).then(() => {\n if (failures.length === 1) throw failures[0]\n if (failures.length > 1) {\n throw new AggregateError(failures, `Persistence cleanup failed`, {\n cause: failures[0],\n })\n }\n })\n }\n\n private advanceLifecycle(): void {\n this.lifecycleGeneration++\n this.persistedReadiness?.set({ status: `loading` })\n this.startupSettled = false\n this.hydratedDemands.clear()\n this.startupMetadataPromise = null\n this.startPromise = null\n this.resumeBaselinePromise = null\n this.terminalFailure = undefined\n this.resumeCertificationPromise = null\n this.persistedKeySetEvidence = undefined\n this.persistedResumeGeneration = undefined\n this.resumeGenerationOwner = Symbol(`persisted resume generation owner`)\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 adapter: HydrationPersistenceAdapter,\n ): Promise<Array<{ key: TKey; value: T; metadata?: unknown }>> {\n return 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 this.throwIfTerminal()\n return this.applyMutex.run(() => this.scanPersistedRowsUnsafe(options))\n }\n\n private async hydrateSubsetUnsafe(\n options: LoadSubsetOptions,\n config: {\n lifecycleGeneration: number\n bindKeySetEvidence?: boolean\n requestLocalLoadFailure?: boolean\n rejectBufferedReplayFailure?: boolean\n },\n adapter: HydrationPersistenceAdapter,\n ): Promise<void> {\n let rowsLoaded = false\n let replayFailure: { reason: unknown } | undefined\n const resetSequence = this.resetSequence\n this.hydrationSequence++\n const hydrationContext = { suppliedRowKeys: new Set<TKey>() }\n this.activeHydrationContext = hydrationContext\n try {\n this.throwIfTerminal()\n this.hydratingGeneration = config.lifecycleGeneration\n try {\n let rows: Array<{ key: TKey; value: T; metadata?: unknown }>\n if (config.bindKeySetEvidence) {\n const snapshot = await adapter.loadResumeSnapshot(this.collectionId, {\n requiredIndexSignatures: this.getRequiredIndexSignatures(),\n includeRows: true,\n })\n rows = snapshot.rows as Array<{\n key: TKey\n value: T\n metadata?: unknown\n }>\n if (config.lifecycleGeneration !== this.lifecycleGeneration) return\n if (resetSequence !== this.resetSequence) return\n this.bindResumeSnapshotEvidence(snapshot)\n } else {\n rows = await this.loadSubsetRowsUnsafe(options, adapter)\n }\n rowsLoaded = true\n if (config.lifecycleGeneration !== this.lifecycleGeneration) return\n if (resetSequence !== this.resetSequence) return\n\n if (\n !config.bindKeySetEvidence ||\n this.persistedKeySetEvidence?.status !== `incompatible`\n ) {\n for (const row of rows) {\n hydrationContext.suppliedRowKeys.add(row.key)\n }\n const applied = this.applyRowsToCollection(rows)\n await whenSyncAccepted(applied)\n }\n } finally {\n if (\n this.activeHydrationContext === hydrationContext &&\n this.hydratingGeneration === config.lifecycleGeneration\n ) {\n this.hydratingGeneration = null\n }\n }\n\n if (config.lifecycleGeneration !== this.lifecycleGeneration) return\n replayFailure = await this.flushQueuedHydrationTransactionsUnsafe(adapter)\n if (config.lifecycleGeneration !== this.lifecycleGeneration) return\n } catch (error) {\n if (config.requestLocalLoadFailure && !rowsLoaded) {\n // Keep admitting source work to the hydration queue while recovery\n // reconstructs any persisted baseline required by partial updates.\n // The failed subset itself owns no rows, so recovery must evaluate\n // each queued transaction against the durable snapshot at its exact\n // FIFO cut instead of treating the snapshot as a successful load.\n this.hydratingGeneration = config.lifecycleGeneration\n try {\n await this.recoverBufferedTransactionsAfterLocalLoadFailureUnsafe(\n config.lifecycleGeneration,\n adapter,\n )\n } catch (baselineError) {\n const terminalError = this.markTerminalFailure(\n baselineError,\n config.lifecycleGeneration,\n )\n throw terminalError\n } finally {\n if (this.hydratingGeneration === config.lifecycleGeneration) {\n this.hydratingGeneration = null\n }\n }\n throw error\n }\n throw this.markTerminalFailure(error, config.lifecycleGeneration)\n } finally {\n if (this.activeHydrationContext === hydrationContext) {\n this.activeHydrationContext = undefined\n }\n }\n if (replayFailure && config.rejectBufferedReplayFailure) {\n throw replayFailure.reason\n }\n }\n\n private async recoverBufferedTransactionsAfterLocalLoadFailureUnsafe(\n lifecycleGeneration: number,\n adapter: HydrationPersistenceAdapter,\n ): Promise<void> {\n let snapshotRows:\n Map<TKey, { key: TKey; value: T; metadata?: unknown }> | undefined\n type RecoveryPresence = `present` | `absent` | `unknown`\n const recoveredPresence = new Map<TKey, RecoveryPresence>()\n let snapshotInvalidatedByTruncate = false\n\n while (this.queuedHydrationTransactions.length > 0) {\n const transaction = this.queuedHydrationTransactions.shift()\n if (!transaction) continue\n\n try {\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n const baselineRows = new Map<\n TKey,\n { key: TKey; value: T; metadata?: unknown }\n >()\n const transactionPresence = new Map<TKey, RecoveryPresence>()\n const transactionStartsWithTruncate = transaction.truncate\n const getPresence = (key: TKey): RecoveryPresence => {\n const known = transactionPresence.get(key)\n if (known !== undefined) return known\n if (transactionStartsWithTruncate) {\n transactionPresence.set(key, `absent`)\n return `absent`\n }\n const recovered = recoveredPresence.get(key)\n if (recovered !== undefined) {\n transactionPresence.set(key, recovered)\n return recovered\n }\n const present =\n this.collection?._hasHydratedKey(key) === true\n ? `present`\n : snapshotInvalidatedByTruncate\n ? `absent`\n : `unknown`\n transactionPresence.set(key, present)\n return present\n }\n\n if (!transaction.signal?.aborted) {\n for (const [index, operation] of transaction.operations.entries()) {\n const key = operation.key\n if (\n operation.type === `update` &&\n transaction.partialUpdateOperationIndexes.has(index) &&\n getPresence(key) === `unknown`\n ) {\n if (snapshotRows === undefined) {\n const snapshot = await adapter.loadResumeSnapshot(\n this.collectionId,\n {\n requiredIndexSignatures: this.getRequiredIndexSignatures(),\n includeRows: true,\n },\n )\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n if (transaction.signal?.aborted) break\n snapshotRows = new Map(\n (\n snapshot.rows as Array<{\n key: TKey\n value: T\n metadata?: unknown\n }>\n ).map((row) => [row.key, row]),\n )\n }\n const baseline = snapshotRows.get(key)\n if (baseline === undefined) {\n transactionPresence.set(key, `absent`)\n } else {\n baselineRows.set(key, baseline)\n transactionPresence.set(key, `present`)\n }\n }\n\n transactionPresence.set(\n key,\n operation.type === `delete` ? `absent` : `present`,\n )\n }\n\n if (baselineRows.size > 0) {\n // Fold the durable baseline into the dependent reservation. It\n // must never become a separately observable publication: the\n // partial source value and its unseen fields are one atomic row.\n if (!transaction.signal?.aborted) {\n transaction.prependHydrationRows([...baselineRows.values()])\n }\n }\n }\n\n const transactionOutcome =\n await this.applyBufferedSyncTransactionUnsafe(transaction, adapter)\n if (transactionOutcome.applied) {\n if (transaction.truncate) {\n snapshotInvalidatedByTruncate = true\n recoveredPresence.clear()\n }\n for (const operation of transaction.operations) {\n recoveredPresence.set(\n operation.key,\n operation.type === `delete` ? `absent` : `present`,\n )\n }\n }\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 rejectQueuedHydrationTransactions(error: unknown): void {\n for (const transaction of this.queuedHydrationTransactions) {\n transaction.rejectApplied?.(error)\n }\n this.queuedHydrationTransactions.length = 0\n }\n\n private applyRowsToCollection(\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n ): SyncAppliedReceipt {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit\n ) {\n return true\n }\n\n return this.withInternalApply(() => {\n this.syncControls.begin?.()\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 return this.syncControls.commit?.() ?? true\n })\n }\n\n private getResumeSnapshotGeneration(snapshot: {\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n }): PersistedResumeGeneration {\n return {\n latestTerm: snapshot.latestTerm,\n latestSeq: snapshot.latestSeq,\n latestRowVersion: snapshot.latestRowVersion,\n resetEpoch: snapshot.resetEpoch,\n }\n }\n\n private isExpectedResumeGeneration(\n generation: PersistedResumeGeneration,\n ): boolean {\n const expected = this.persistedResumeGeneration\n return (\n expected !== undefined &&\n expected.latestTerm === generation.latestTerm &&\n expected.latestSeq === generation.latestSeq &&\n expected.latestRowVersion === generation.latestRowVersion &&\n expected.resetEpoch === generation.resetEpoch\n )\n }\n\n private bindResumeSnapshotEvidence(snapshot: {\n keySet?: PersistedKeySetEvidence\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n }): void {\n const generation = this.getResumeSnapshotGeneration(snapshot)\n const previousEvidenceStatus = this.persistedKeySetEvidence?.status\n // An uncertified sync baseline never authorized a persisted resume cursor,\n // so a later atomic snapshot may replace its evidence while the source\n // performs the already-required fresh snapshot. Local-only collections\n // have no remote cursor to fence; a managed write may advance a still-\n // consistent SQLite baseline during startup. Incompatible evidence remains\n // fail-closed in both modes.\n const mayAcceptUnownedGeneration =\n (this.mode === `sync-present` &&\n previousEvidenceStatus !== `consistent` &&\n previousEvidenceStatus !== `incompatible`) ||\n (this.mode === `sync-absent` &&\n previousEvidenceStatus === `consistent` &&\n snapshot.keySet?.status === `consistent`)\n this.observeStreamPosition(\n snapshot.latestTerm,\n snapshot.latestSeq,\n snapshot.latestRowVersion,\n )\n this.persistedKeySetEvidence =\n this.isExpectedResumeGeneration(generation) || mayAcceptUnownedGeneration\n ? snapshot.keySet\n : { status: `incompatible` }\n }\n\n private replaceCollectionSnapshot(\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n collectionMetadata: Array<{ key: string; value: unknown }>,\n ): SyncAppliedReceipt {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit ||\n !this.syncControls.metadata\n ) {\n return true\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 return this.withInternalApply(() => {\n this.syncControls.begin?.()\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 return this.syncControls.commit?.() ?? true\n })\n }\n\n private async flushQueuedHydrationTransactionsUnsafe(\n adapter: HydrationPersistenceAdapter,\n ): Promise<{ reason: unknown } | undefined> {\n let operationFailure: { reason: unknown } | undefined\n while (this.queuedHydrationTransactions.length > 0) {\n const transaction = this.queuedHydrationTransactions.shift()\n if (!transaction) {\n continue\n }\n try {\n const outcome = await this.applyBufferedSyncTransactionUnsafe(\n transaction,\n adapter,\n )\n operationFailure ??= outcome.hydrationFailure\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 return operationFailure\n }\n\n private async applyBufferedSyncTransactionUnsafe(\n transaction: BufferedSyncTransaction<T, TKey>,\n scopedAdapter?: HydrationPersistenceAdapter,\n ): Promise<{\n applied: boolean\n hydrationFailure?: { reason: unknown }\n }> {\n this.throwIfTerminal()\n this.throwIfLifecycleReplaced(transaction.lifecycleGeneration)\n const abortedBeforeApplication = transaction.signal?.aborted === true\n let abortedDuringApplication = false\n let applicationReturned = false\n\n try {\n const applied = transaction.internal\n ? this.withInternalApply(transaction.applyToCollection)\n : transaction.applyToCollection()\n applicationReturned = true\n abortedDuringApplication = transaction.signal?.aborted === true\n // Inside the apply mutex, internal work waits only for acceptance: a\n // local mutation's handler may need this mutex, and the rows publish\n // when that mutation settles. A source transaction is stored once it is\n // visible, except one held by a persisting optimistic transaction,\n // which is stored now so a handler can await its acceptance.\n if (transaction.internal) await whenSyncAccepted(applied)\n else if (\n applied !== true &&\n !this.collection?._state.hasPersistingTransaction()\n )\n await applied\n this.throwIfLifecycleReplaced(transaction.lifecycleGeneration)\n\n if (!transaction.internal) {\n await this.persistAndBroadcastExternalSyncTransactionUnsafe(\n transaction,\n scopedAdapter,\n )\n }\n transaction.resolveApplied?.()\n return { applied: true }\n } catch (error) {\n if (!applicationReturned) {\n abortedDuringApplication = transaction.signal?.aborted === true\n }\n const aborted =\n transaction.signal?.aborted ||\n error instanceof SyncTransactionAbortedError\n const shouldFailStop =\n aborted && transaction.shouldFailStopOnAbort?.() === true\n const terminalError = this.classifyBufferedTransactionFailure(\n transaction,\n error,\n )\n transaction.rejectApplied?.(terminalError)\n if (aborted && !shouldFailStop && transaction.rejectApplied) {\n return {\n applied: false,\n hydrationFailure:\n !abortedBeforeApplication && abortedDuringApplication\n ? { reason: terminalError }\n : undefined,\n }\n }\n throw terminalError\n }\n }\n\n private classifyBufferedTransactionFailure(\n transaction: BufferedSyncTransaction<T, TKey>,\n error: unknown,\n ): unknown {\n if (error instanceof PersistedCollectionDurabilityError) {\n return this.markTerminalFailure(error, transaction.lifecycleGeneration)\n }\n const aborted =\n transaction.signal?.aborted ||\n error instanceof SyncTransactionAbortedError\n if (aborted && transaction.shouldFailStopOnAbort?.() !== true) {\n return error\n }\n return this.markTerminalFailure(error, transaction.lifecycleGeneration)\n }\n\n private async persistAndBroadcastExternalSyncTransactionUnsafe(\n transaction: BufferedSyncTransaction<T, TKey>,\n scopedAdapter?: HydrationPersistenceAdapter,\n ): Promise<void> {\n if (transaction.internal) {\n return\n }\n\n this.throwIfLifecycleReplaced(transaction.lifecycleGeneration)\n if (\n !transaction.truncate &&\n transaction.operations.length === 0 &&\n transaction.rowMetadataWrites.size === 0 &&\n transaction.collectionMetadataWrites.size === 0\n ) {\n return\n }\n\n const streamPosition = this.nextLocalStreamPosition()\n const tx = this.createPersistedTxFromOperations(transaction, streamPosition)\n const response = await this.persistence.coordinator.requestApplyCommittedTx(\n this.collectionId,\n tx,\n // A hydration-scoped adapter is already inside the shared scheduler.\n // Ordinary source commits pass no scoped adapter so the coordinator\n // enters that scheduler before taking the database-wide writer lock.\n scopedAdapter,\n )\n if (!response.ok) {\n if (response.code === `PERSISTENCE_ERROR`) {\n const error = new PersistedCollectionDurabilityError(\n `Failed to durably persist collection \"${this.collectionId}\": ${response.error}`,\n {\n cause: response,\n code: response.sourceCode ?? response.code,\n path: response.path,\n },\n )\n throw error\n }\n throw new Error(\n `failed to apply external sync transaction through coordinator: ${response.error}`,\n )\n }\n if (transaction.lifecycleGeneration !== this.lifecycleGeneration) return\n this.observeStreamPosition(\n response.term,\n response.seq,\n response.latestRowVersion,\n )\n if (\n transaction.expectedResumeGenerationOwner ===\n this.resumeGenerationOwner &&\n this.persistedResumeGeneration !== undefined\n ) {\n this.persistedResumeGeneration = {\n ...this.persistedResumeGeneration,\n latestTerm: response.term,\n latestSeq: response.seq,\n latestRowVersion: response.latestRowVersion,\n }\n }\n }\n\n private async applyCommittedTx(\n tx: PersistedTx,\n lifecycleGeneration: number,\n ): Promise<void> {\n this.throwIfTerminal()\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n try {\n await this.persistence.adapter.applyCommittedTx(this.collectionId, tx)\n } catch (error) {\n throw this.markTerminalFailure(\n toPersistedCollectionDurabilityError(this.collectionId, error),\n lifecycleGeneration,\n )\n }\n this.throwIfLifecycleReplaced(lifecycleGeneration)\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 async confirmMutationsSyncUnsafe(\n mutations: Array<PendingMutation<T>>,\n ): Promise<void> {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit\n ) {\n return\n }\n\n const applied = this.withInternalApply(() => {\n this.syncControls.begin?.()\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 return this.syncControls.commit?.() ?? true\n })\n\n // The mutation handler awaits this confirmation, so wait only for\n // acceptance: the rows become visible when the mutation settles.\n const accepted = whenSyncAccepted(applied)\n if (accepted !== true) await accepted\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 lifecycleGeneration: number,\n ): Promise<Array<string>> {\n this.throwIfLifecycleReplaced(lifecycleGeneration)\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 this.throwIfLifecycleReplaced(lifecycleGeneration)\n\n if (!response.ok) {\n if (response.code === `PERSISTENCE_ERROR`) {\n const error = new PersistedCollectionDurabilityError(\n `Failed to durably persist collection \"${this.collectionId}\": ${response.error}`,\n {\n cause: response,\n code: response.sourceCode ?? response.code,\n path: response.path,\n },\n )\n throw error\n }\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.applyCommittedTx(tx, lifecycleGeneration)\n\n this.throwIfLifecycleReplaced(lifecycleGeneration)\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 // A subscription can own several independent acquisitions, including\n // identical requests. Only releasing this options object ends its lease.\n let id = this.requestIds.get(options)\n if (id === undefined) {\n id = `request:${++this.nextRequestId}`\n this.requestIds.set(options, id)\n }\n return id\n }\n\n private canRouteRemoteDemandThroughCoordinator(): boolean {\n if (\n this.getCurrentTerminalFailure() ||\n this.mode !== `sync-present` ||\n this.persistence.coordinator instanceof SingleProcessCoordinator\n ) {\n return false\n }\n\n // A follower routes demand to the elected owner even when its own source\n // cannot own acquisitions. Only an elected node needs a local owner.\n return (\n !this.persistence.coordinator.isLeader(this.collectionId) ||\n this.remoteSubsetOwnerUnsubscribe !== null\n )\n }\n\n private queueRemoteSubsetEnsure(options: LoadSubsetOptions): void {\n if (\n options.signal?.aborted ||\n !this.canRouteRemoteDemandThroughCoordinator() ||\n this.activeSubsets.get(this.getSubsetKey(options)) !== options\n ) {\n return\n }\n\n const subsetKey = this.getSubsetKey(options)\n if (this.activeSubsets.get(subsetKey) !== options) return\n\n // A previously local acquisition can become remote after an ownership\n // change. Recovery must reject permanent wire errors before retry owns it.\n validateRemoteSubsetOptions(options)\n this.pendingRemoteSubsetEnsures.set(subsetKey, options)\n void this.flushPendingRemoteSubsetEnsures()\n }\n\n private scheduleRemoteEnsureRetry(): void {\n if (\n this.getCurrentTerminalFailure() ||\n this.mode !== `sync-present` ||\n this.persistence.coordinator instanceof SingleProcessCoordinator\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.getCurrentTerminalFailure() ||\n this.mode !== `sync-present` ||\n this.persistence.coordinator instanceof SingleProcessCoordinator\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 if (\n options.signal?.aborted ||\n this.activeSubsets.get(subsetKey) !== options\n ) {\n this.pendingRemoteSubsetEnsures.delete(subsetKey)\n continue\n }\n try {\n await this.persistence.coordinator.requestEnsureRemoteSubset(\n this.collectionId,\n options,\n )\n this.pendingRemoteSubsetEnsures.delete(subsetKey)\n } catch (error) {\n if (\n options.signal?.aborted ||\n this.activeSubsets.get(subsetKey) !== options\n ) {\n this.pendingRemoteSubsetEnsures.delete(subsetKey)\n } else {\n console.warn(`Failed to ensure remote subset:`, error)\n }\n }\n }\n\n this.scheduleRemoteEnsureRetry()\n }\n\n private attachCoordinatorSubscription(): void {\n if (this.coordinatorUnsubscribe) {\n return\n }\n\n this.persistence.coordinator.setAdapterForCollection?.(\n this.collectionId,\n this.persistence.adapter,\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 if (this.getCurrentTerminalFailure()) {\n return\n }\n\n const { payload } = message\n const lifecycleGeneration = this.lifecycleGeneration\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.isHydratingNow()) {\n this.queuedTxCommitted.push({\n txCommitted: payload,\n lifecycleGeneration,\n })\n return\n }\n\n void this.applyMutex\n .run(() => this.processCommittedTxUnsafe(payload, lifecycleGeneration))\n .catch((error) => {\n this.markTerminalFailure(error, lifecycleGeneration)\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(async () => {\n await this.runInHydrationScope((adapter) =>\n this.truncateAndReloadUnsafe(adapter, lifecycleGeneration),\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n })\n .catch((error) => {\n this.markTerminalFailure(error, lifecycleGeneration)\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(\n queued.txCommitted,\n queued.lifecycleGeneration,\n )\n }\n }\n\n private async processCommittedTxUnsafe(\n txCommitted: TxCommitted,\n lifecycleGeneration = this.lifecycleGeneration,\n ): Promise<void> {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\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(lifecycleGeneration)\n if (lifecycleGeneration !== this.lifecycleGeneration) return\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(\n txCommitted,\n this.persistence.adapter,\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n }\n\n private async recoverFromSeqGapUnsafe(\n lifecycleGeneration: number,\n ): Promise<void> {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n if (this.persistence.coordinator.pullSince && this.latestRowVersion >= 0) {\n let pullResponse: PullSinceResponse | undefined\n try {\n pullResponse = await this.persistence.coordinator.pullSince(\n this.collectionId,\n this.latestRowVersion,\n )\n } catch (error) {\n console.warn(`Failed pullSince recovery attempt:`, error)\n }\n\n if (pullResponse) {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n\n if (pullResponse.ok) {\n this.observeStreamPosition(\n pullResponse.latestTerm,\n pullResponse.latestSeq,\n pullResponse.latestRowVersion,\n )\n if (pullResponse.requiresFullReload) {\n await this.runInHydrationScope((adapter) =>\n this.reloadActiveSubsetsUnsafe(adapter),\n )\n return\n }\n const deltas = pullResponse.deltas\n if (!deltas) {\n await this.runInHydrationScope((adapter) =>\n this.reloadActiveSubsetsUnsafe(adapter),\n )\n return\n }\n\n await this.runInHydrationScope(async (adapter) => {\n for (const delta of deltas) {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n await this.invalidateFromCommittedTxUnsafe(\n {\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:\n delta.collectionMetadataMutations,\n },\n adapter,\n )\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n }\n })\n return\n }\n }\n }\n\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n await this.runInHydrationScope((adapter) =>\n this.truncateAndReloadUnsafe(adapter, lifecycleGeneration),\n )\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(\n adapter: HydrationPersistenceAdapter,\n lifecycleGeneration = this.lifecycleGeneration,\n ): Promise<void> {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n // A subscriber may reacquire reentrantly from the truncate commit.\n this.hydratedDemands.clear()\n this.resetSequence++\n if (this.syncControls.begin && this.syncControls.commit) {\n const applied = this.withInternalApply(() => {\n this.syncControls.begin?.()\n this.syncControls.truncate?.()\n return this.syncControls.commit?.() ?? true\n })\n await whenSyncAccepted(applied)\n }\n\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n await this.reloadActiveSubsetsUnsafe(adapter)\n }\n\n private async invalidateFromCommittedTxUnsafe(\n txCommitted: TxCommitted,\n adapter: HydrationPersistenceAdapter,\n ): Promise<void> {\n const reloadActiveSubsets = () =>\n this.runInHydrationScope(\n (scopedAdapter) => this.reloadActiveSubsetsUnsafe(scopedAdapter),\n adapter,\n )\n\n if (txCommitted.requiresFullReload) {\n await reloadActiveSubsets()\n return\n }\n\n const changedKeyCount =\n txCommitted.changedRows.length + txCommitted.deletedKeys.length\n if (changedKeyCount > TARGETED_INVALIDATION_KEY_LIMIT) {\n await reloadActiveSubsets()\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 reloadActiveSubsets()\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 const applied = this.withInternalApply(() => {\n this.syncControls.begin?.()\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 return this.syncControls.commit?.() ?? true\n })\n await whenSyncAccepted(applied)\n }\n\n private async reloadActiveSubsetsUnsafe(\n adapter: HydrationPersistenceAdapter,\n ): Promise<void> {\n const lifecycleGeneration = this.lifecycleGeneration\n const truncateGeneration = this.sourceTruncateGeneration\n const activeSubsetOptions =\n this.activeSubsets.size > 0\n ? Array.from(this.activeSubsets.values())\n : [{}]\n\n this.hydratedDemands.clear()\n this.hydrationSequence++\n const hydrationContext = { suppliedRowKeys: new Set<TKey>() }\n this.activeHydrationContext = hydrationContext\n this.hydratingGeneration = lifecycleGeneration\n try {\n const mergedRows = new Map<TKey, { value: T; metadata?: unknown }>()\n const collectionMetadata =\n await this.loadCollectionMetadataSnapshot(adapter)\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n for (const options of activeSubsetOptions) {\n const subsetRows = await this.loadSubsetRowsUnsafe(options, adapter)\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n for (const row of subsetRows) {\n mergedRows.set(row.key, {\n value: row.value,\n metadata: row.metadata,\n })\n }\n }\n\n for (const key of mergedRows.keys()) {\n hydrationContext.suppliedRowKeys.add(key)\n }\n\n const applied = 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 await whenSyncAccepted(applied)\n } finally {\n if (\n this.activeHydrationContext === hydrationContext &&\n this.hydratingGeneration === lifecycleGeneration\n ) {\n this.hydratingGeneration = null\n }\n if (this.activeHydrationContext === hydrationContext) {\n this.activeHydrationContext = undefined\n }\n }\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedHydrationTransactionsUnsafe(adapter)\n // Coordinator commits queued during this hydrate are processed outside\n // its scope. Leave the synchronous fast path closed until a later load\n // if any such commit still needs to be applied.\n if (\n truncateGeneration === this.sourceTruncateGeneration &&\n this.queuedTxCommitted.length === 0\n ) {\n for (const options of activeSubsetOptions) {\n if (this.activeSubsets.get(this.getSubsetKey(options)) === options) {\n this.hydratedDemands.add(getLoadSubsetDemandKey(options))\n }\n }\n }\n }\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 adapter: HydrationPersistenceAdapter = this.persistence.adapter,\n ): Promise<Set<string>> {\n const collection = this.collection\n if (!collection && !indexMetadataSnapshot) {\n return new Set()\n }\n\n const indexMetadata =\n indexMetadataSnapshot ?? collection?.getIndexMetadata() ?? []\n const completedLocalIndexSignatures = new Set<string>()\n for (const metadata of indexMetadata) {\n if (await this.ensureLocalPersistedIndex(metadata, adapter)) {\n completedLocalIndexSignatures.add(metadata.signature)\n }\n }\n return completedLocalIndexSignatures\n }\n\n private async requestCoordinatorPersistedIndexes(\n indexMetadata: Array<CollectionIndexMetadata>,\n completedLocalIndexSignatures: ReadonlySet<string>,\n ): Promise<void> {\n for (const metadata of indexMetadata) {\n await this.requestCoordinatorPersistedIndex(\n metadata,\n completedLocalIndexSignatures.has(metadata.signature),\n )\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 adapter: HydrationPersistenceAdapter = this.persistence.adapter,\n ): Promise<void> {\n const completedLocally = await this.ensureLocalPersistedIndex(\n indexMetadata,\n adapter,\n )\n await this.requestCoordinatorPersistedIndex(indexMetadata, completedLocally)\n }\n\n private async ensureLocalPersistedIndex(\n indexMetadata: CollectionIndexMetadata,\n adapter: HydrationPersistenceAdapter,\n ): Promise<boolean> {\n try {\n const spec = this.buildPersistedIndexSpec(indexMetadata)\n await adapter.ensureIndex(\n this.collectionId,\n indexMetadata.signature,\n spec,\n )\n return true\n } catch (error) {\n console.warn(`Failed to ensure persisted index in adapter:`, error)\n return false\n }\n }\n\n private async requestCoordinatorPersistedIndex(\n indexMetadata: CollectionIndexMetadata,\n completedLocally: boolean,\n ): Promise<void> {\n try {\n const spec = this.buildPersistedIndexSpec(indexMetadata)\n await this.persistence.coordinator.requestEnsurePersistedIndex(\n this.collectionId,\n indexMetadata.signature,\n spec,\n completedLocally ? this.persistence.adapter : undefined,\n completedLocally,\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 persistedReadiness?: PersistedReadinessTracker,\n): SyncConfig<T, TKey> {\n return {\n ...sourceSyncConfig,\n sync: (params) => {\n const transactionStack: Array<OpenSyncTransaction<T, TKey>> = []\n const pendingPublicationTransactions: Array<\n OpenSyncTransaction<T, TKey>\n > = []\n const getOpenTransaction = () =>\n transactionStack[transactionStack.length - 1]\n const settlePublicationAdmissionWaiters = (\n transaction: OpenSyncTransaction<T, TKey>,\n error?: unknown,\n ) => {\n const waiters = transaction.publicationAdmissionWaiters\n transaction.publicationAdmissionWaiters = undefined\n if (!waiters) return\n for (const waiter of waiters) {\n if (error === undefined) waiter.resolve()\n else waiter.reject(error)\n }\n }\n const bindToCurrentHydration = (\n transaction: OpenSyncTransaction<T, TKey>,\n ) => {\n if (transaction.internal || !runtime.isHydratingNow()) return\n const hydrationSequence = runtime.getHydrationSequence()\n if (\n transaction.hydrationSequence !== undefined &&\n transaction.hydrationSequence !== hydrationSequence\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `a persisted sync transaction cannot cross a hydration cycle`,\n )\n }\n transaction.queuedBecauseHydrating = true\n transaction.hydrationSequence = hydrationSequence\n transaction.hydrationContext = runtime.getActiveHydrationContext()\n }\n const assertHydrationSequenceCurrent = (\n transaction: OpenSyncTransaction<T, TKey>,\n ) => {\n if (\n transaction.hydrationSequence !== undefined &&\n transaction.hydrationSequence !== runtime.getHydrationSequence()\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `a persisted sync transaction cannot cross a hydration cycle`,\n )\n }\n }\n const markPendingMetadataDependency = (\n transaction: OpenSyncTransaction<T, TKey>,\n ) => {\n const openTransaction = getOpenTransaction()\n if (openTransaction && !openTransaction.internal) {\n transaction.hasDependentSuccessor = true\n }\n }\n const removePendingPublicationTransaction = (\n transaction: OpenSyncTransaction<T, TKey>,\n ) => {\n const index = pendingPublicationTransactions.indexOf(transaction)\n if (index !== -1) pendingPublicationTransactions.splice(index, 1)\n }\n const settlePendingTransaction = (\n transaction: OpenSyncTransaction<T, TKey>,\n ) => {\n removePendingPublicationTransaction(transaction)\n }\n // A source receipt is accepted once its rows are durable, and resolves\n // when core makes them visible.\n const visibleAfterDurable = (\n transaction: OpenSyncTransaction<T, TKey>,\n durable: Promise<void>,\n ): Promise<void> => {\n const visible = durable.then(async () => {\n const receipt = transaction.applicationReceipt\n if (receipt !== undefined && receipt !== true) await receipt\n })\n void visible.catch(() => undefined)\n return withAcceptedReceipt(visible, durable)\n }\n const settleRuntimeTransaction = (\n transaction: OpenSyncTransaction<T, TKey>,\n applied: Promise<void>,\n ) => {\n void applied.then(\n () => settlePendingTransaction(transaction),\n () => {\n settlePendingTransaction(transaction)\n },\n )\n }\n const getPendingRowMetadataWrite = (key: TKey) => {\n for (\n let index = pendingPublicationTransactions.length - 1;\n index >= 0;\n index--\n ) {\n const transaction = pendingPublicationTransactions[index]!\n const write = transaction.rowMetadataWrites.get(key)\n if (write) {\n markPendingMetadataDependency(transaction)\n return { found: true, write }\n }\n if (transaction.truncate) {\n markPendingMetadataDependency(transaction)\n return {\n found: true,\n write: { type: `delete` as const },\n }\n }\n }\n return { found: false as const }\n }\n const getPendingCollectionMetadataWrite = (key: string) => {\n for (\n let index = pendingPublicationTransactions.length - 1;\n index >= 0;\n index--\n ) {\n const transaction = pendingPublicationTransactions[index]!\n const write = transaction.collectionMetadataWrites.get(key)\n if (write) {\n markPendingMetadataDependency(transaction)\n return { found: true, write }\n }\n }\n return { found: false as const }\n }\n let fullStartPromise: Promise<void> | null = null\n let sourceResultPromise: Promise<SyncConfigRes> | null = null\n let resolveSourceResultAssigned!: () => void\n const sourceResultAssigned = new Promise<void>((resolve) => {\n resolveSourceResultAssigned = resolve\n })\n const startupState = { cleanedUp: false }\n const isCleanedUp = () => startupState.cleanedUp\n type SubsetAcquisition = {\n forwarded: boolean\n cancelAdmissionWait?: () => void\n }\n const acquisitions = new Map<LoadSubsetOptions, SubsetAcquisition>()\n const waitForPublicationAdmission = (\n transaction: OpenSyncTransaction<T, TKey>,\n options: LoadSubsetOptions,\n acquisition: SubsetAcquisition,\n ): Promise<void> => {\n if (options.signal?.aborted) {\n return Promise.reject(\n options.signal.reason ?? new SyncTransactionAbortedError(),\n )\n }\n return new Promise<void>((resolve, reject) => {\n const waiters =\n transaction.publicationAdmissionWaiters ??\n (transaction.publicationAdmissionWaiters = new Set())\n let settled = false\n const settle = (action: () => void) => {\n if (settled) return\n settled = true\n waiters.delete(waiter)\n options.signal?.removeEventListener(`abort`, abort)\n acquisition.cancelAdmissionWait = undefined\n action()\n }\n const waiter = {\n resolve: () => settle(resolve),\n reject: (error: unknown) => settle(() => reject(error)),\n }\n const abort = () =>\n waiter.reject(\n options.signal?.reason ?? new SyncTransactionAbortedError(),\n )\n waiters.add(waiter)\n options.signal?.addEventListener(`abort`, abort, { once: true })\n acquisition.cancelAdmissionWait = waiter.resolve\n })\n }\n const getTerminalFailure = () => runtime.getCurrentTerminalFailure()\n const reportUpstreamError = (error: unknown) => {\n if (persistedReadiness?.getSnapshot().status !== `loading`) {\n runtime.reportSyncError(error)\n return\n }\n // An early network error must not stop the live-query graph before\n // the persisted baseline has published its rows.\n void (fullStartPromise ?? runtime.ensureStarted()).then(\n () => {\n if (!isCleanedUp() && !getTerminalFailure()) {\n runtime.reportSyncError(error)\n }\n },\n () => undefined,\n )\n }\n const createHandledRejection = (error: unknown): Promise<never> => {\n const rejected = Promise.reject(error)\n void rejected.catch(() => undefined)\n return rejected\n }\n const applyTransactionToCollection = (\n transaction: OpenSyncTransaction<T, TKey>,\n signal?: AbortSignal,\n ): SyncAppliedReceipt => {\n if (transaction.applicationReceipt !== undefined) {\n return transaction.applicationReceipt\n }\n try {\n assertHydrationSequenceCurrent(transaction)\n for (const key of transaction.deferredHydrationMetadataDeleteKeys) {\n if (\n !transaction.hydrationContext?.suppliedRowKeys.has(key) &&\n !transaction.rowMetadataWrites.has(key)\n ) {\n transaction.rowMetadataWrites.set(key, { type: `delete` })\n }\n }\n transaction.deferredHydrationMetadataDeleteKeys.clear()\n\n params.begin()\n if (transaction.truncate) params.truncate()\n for (const operation of transaction.operations) {\n if (operation.type === `delete`) {\n params.write({ type: `delete`, key: operation.key })\n } else {\n params.write({\n type: `update`,\n value: operation.value,\n metadata: operation.metadata,\n })\n }\n }\n if (params.metadata) {\n for (const [key, write] of transaction.rowMetadataWrites) {\n if (write.type === `delete`) params.metadata.row.delete(key)\n else params.metadata.row.set(key, write.value)\n }\n for (const [key, write] of transaction.collectionMetadataWrites) {\n if (write.type === `delete`)\n params.metadata.collection.delete(key)\n else params.metadata.collection.set(key, write.value)\n }\n }\n\n const applied = params.commit(signal)\n transaction.applicationReceipt = applied\n // Core accepted the transaction, so it is no longer staged here;\n // the receipt resolves when it is visible.\n removePendingPublicationTransaction(transaction)\n if (applied !== true) void applied.catch(() => undefined)\n return applied\n } catch (error) {\n removePendingPublicationTransaction(transaction)\n throw error\n }\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 markError: params.markError,\n })\n runtime.setCollection(\n params.collection as Collection<T, TKey, PersistedCollectionUtils>,\n )\n\n const persistenceCapability: SyncPersistenceCapabilityV1<TKey> = {\n protocol: SYNC_PERSISTENCE_PROTOCOL,\n version: SYNC_PERSISTENCE_VERSION,\n reserveCommitTurn: () => {\n const openTransaction = getOpenTransaction()\n if (openTransaction && !openTransaction.internal)\n openTransaction.reservesCommitTurn = true\n },\n hydrateBaseline: async () => {\n if (startupState.cleanedUp) return\n try {\n await runtime.ensureResumeBaselineHydrated()\n } catch (error) {\n throw runtime.reportSyncError(error)\n }\n },\n scanPersistedRows: (options) =>\n startupState.cleanedUp\n ? Promise.resolve([])\n : runtime.scanPersistedRows(options),\n resumeSnapshot: {\n certify: async () => {\n if (startupState.cleanedUp) return\n try {\n await runtime.ensureResumeBaselineCertified()\n } catch (error) {\n throw runtime.reportSyncError(error)\n }\n },\n getKeySetEvidence: () =>\n startupState.cleanedUp ? undefined : runtime.getKeySetEvidence(),\n expectCurrentCommit: () => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `resumeSnapshot.expectCurrentCommit must be called within an open sync transaction`,\n )\n }\n openTransaction.expectedResumeGenerationOwner =\n runtime.getResumeGenerationOwner()\n },\n },\n }\n\n const wrappedParams = {\n ...params,\n markError: reportUpstreamError,\n markReady: () => {\n if (startupState.cleanedUp || getTerminalFailure()) return\n void (fullStartPromise ?? runtime.ensureStarted())\n .then(async () => {\n if (isCleanedUp() || getTerminalFailure()) return\n await sourceResultAssigned\n try {\n await sourceResultPromise\n } catch (error) {\n reportUpstreamError(error)\n return\n }\n if (isCleanedUp() || getTerminalFailure()) return\n params.markReady()\n })\n .catch(() => undefined)\n },\n begin: () => {\n if (startupState.cleanedUp) return undefined\n const terminalFailure = getTerminalFailure()\n const internal = runtime.isApplyingInternally()\n const transaction: OpenSyncTransaction<T, TKey> = {\n operations: [],\n partialUpdateOperationIndexes: new Set(),\n rowMetadataWrites: new Map(),\n collectionMetadataWrites: new Map(),\n deferredHydrationMetadataDeleteKeys: new Set(),\n truncate: false,\n internal,\n lifecycleGeneration: runtime.getLifecycleGeneration(),\n operationKeys: new Set(),\n hasDependentSuccessor: false,\n queuedBecauseHydrating:\n terminalFailure === undefined &&\n !internal &&\n runtime.isHydratingNow(),\n hydrationSequence:\n terminalFailure === undefined && !internal\n ? runtime.getHydrationSequence()\n : undefined,\n hydrationContext:\n terminalFailure === undefined &&\n !internal &&\n runtime.isHydratingNow()\n ? runtime.getActiveHydrationContext()\n : undefined,\n ...(terminalFailure === undefined ? {} : { terminalFailure }),\n }\n transactionStack.push(transaction)\n },\n write: (message: ChangeMessageOrDeleteKeyMessage<T, TKey>) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n const terminalFailure =\n openTransaction?.terminalFailure ?? getTerminalFailure()\n if (terminalFailure) {\n if (openTransaction)\n openTransaction.terminalFailure = terminalFailure\n return\n }\n if (!openTransaction) {\n throw new NoPendingSyncTransactionWriteError()\n }\n bindToCurrentHydration(openTransaction)\n const normalization = runtime.normalizeSyncWriteMessage(message)\n\n if (\n message.type === `update` &&\n sourceSyncConfig.rowUpdateMode !== `full`\n ) {\n if (!openTransaction.internal) {\n openTransaction.partialUpdateOperationIndexes.add(\n openTransaction.operations.length,\n )\n }\n for (const pending of pendingPublicationTransactions) {\n if (\n pending.truncate ||\n pending.operationKeys.has(normalization.operation.key)\n ) {\n markPendingMetadataDependency(pending)\n }\n }\n }\n\n openTransaction.operations.push(normalization.operation)\n openTransaction.operationKeys.add(normalization.operation.key)\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 (openTransaction.queuedBecauseHydrating) {\n openTransaction.deferredHydrationMetadataDeleteKeys.add(\n normalization.operation.key,\n )\n } else 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 },\n metadata: params.metadata\n ? {\n persistence: persistenceCapability,\n row: {\n get: (key: TKey) => {\n if (startupState.cleanedUp) return undefined\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 const pending = getPendingRowMetadataWrite(key)\n if (pending.found) {\n return pending.write.type === `delete`\n ? undefined\n : pending.write.value\n }\n return params.metadata!.row.get(key)\n },\n set: (key: TKey, value: unknown) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (openTransaction?.terminalFailure ?? getTerminalFailure())\n return\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 },\n delete: (key: TKey) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (openTransaction?.terminalFailure ?? getTerminalFailure())\n return\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 },\n },\n collection: {\n get: (key: string) => {\n if (startupState.cleanedUp) return undefined\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 const pending = getPendingCollectionMetadataWrite(key)\n if (pending.found) {\n return pending.write.type === `delete`\n ? undefined\n : pending.write.value\n }\n return params.metadata!.collection.get(key)\n },\n set: (key: string, value: unknown) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (openTransaction?.terminalFailure ?? getTerminalFailure())\n return\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 },\n delete: (key: string) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (openTransaction?.terminalFailure ?? getTerminalFailure())\n return\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 },\n list: (prefix?: string) => {\n if (startupState.cleanedUp) return []\n const merged = new Map(\n params\n .metadata!.collection.list()\n .map(({ key, value }) => [key, value]),\n )\n const pendingOwners = new Map<\n string,\n OpenSyncTransaction<T, TKey>\n >()\n for (const transaction of pendingPublicationTransactions) {\n for (const [\n key,\n metadataWrite,\n ] of transaction.collectionMetadataWrites) {\n if (!prefix || key.startsWith(prefix)) {\n pendingOwners.set(key, transaction)\n }\n if (metadataWrite.type === `delete`) {\n merged.delete(key)\n } else {\n merged.set(key, metadataWrite.value)\n }\n }\n }\n for (const owner of new Set(pendingOwners.values())) {\n markPendingMetadataDependency(owner)\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 if (startupState.cleanedUp) return\n runtime.noteSourceTruncate()\n const openTransaction = getOpenTransaction()\n if (openTransaction?.terminalFailure ?? getTerminalFailure()) return\n if (!openTransaction) {\n throw new NoPendingSyncTransactionWriteError()\n }\n\n openTransaction.operations = []\n openTransaction.operationKeys.clear()\n openTransaction.partialUpdateOperationIndexes.clear()\n openTransaction.rowMetadataWrites.clear()\n openTransaction.deferredHydrationMetadataDeleteKeys.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 },\n commit: (signal?: AbortSignal) => {\n if (startupState.cleanedUp) return true\n const openTransaction = transactionStack.pop()\n const terminalFailure =\n openTransaction?.terminalFailure ?? getTerminalFailure()\n if (terminalFailure) {\n if (openTransaction) {\n settlePendingTransaction(openTransaction)\n settlePublicationAdmissionWaiters(\n openTransaction,\n terminalFailure.error,\n )\n }\n return createHandledRejection(terminalFailure.error)\n }\n if (!openTransaction) {\n throw new NoPendingSyncTransactionCommitError()\n }\n\n if (openTransaction.internal) {\n return applyTransactionToCollection(openTransaction, signal)\n }\n\n if (signal?.aborted) {\n settlePendingTransaction(openTransaction)\n const error = new SyncTransactionAbortedError()\n settlePublicationAdmissionWaiters(openTransaction, error)\n return createHandledRejection(error)\n }\n try {\n bindToCurrentHydration(openTransaction)\n assertHydrationSequenceCurrent(openTransaction)\n } catch (error) {\n settlePublicationAdmissionWaiters(openTransaction, error)\n throw error\n }\n const transaction = {\n operations: openTransaction.operations,\n partialUpdateOperationIndexes:\n openTransaction.partialUpdateOperationIndexes,\n rowMetadataWrites: openTransaction.rowMetadataWrites,\n collectionMetadataWrites: openTransaction.collectionMetadataWrites,\n deferredHydrationMetadataDeleteKeys:\n openTransaction.deferredHydrationMetadataDeleteKeys,\n hydrationContext: openTransaction.hydrationContext,\n hydrationSequence: openTransaction.hydrationSequence,\n truncate: openTransaction.truncate,\n internal: false,\n lifecycleGeneration: openTransaction.lifecycleGeneration,\n expectedResumeGenerationOwner:\n openTransaction.expectedResumeGenerationOwner,\n signal,\n prependHydrationRows: (\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n ) => {\n const baselineOperations: Array<\n NormalizedSyncOperation<T, TKey>\n > = rows.map(({ key, value, metadata }) => ({\n type: `update`,\n key,\n value,\n metadata: metadata as Record<string, unknown> | undefined,\n }))\n openTransaction.operations = baselineOperations.concat(\n openTransaction.operations,\n )\n for (const { key, metadata } of rows) {\n if (\n metadata !== undefined &&\n !openTransaction.rowMetadataWrites.has(key)\n ) {\n openTransaction.rowMetadataWrites.set(key, {\n type: `set`,\n value: metadata,\n })\n }\n }\n },\n applyToCollection: () =>\n applyTransactionToCollection(openTransaction, signal),\n shouldFailStopOnAbort: () => openTransaction.hasDependentSuccessor,\n }\n openTransaction.signal = signal\n pendingPublicationTransactions.push(openTransaction)\n if (\n openTransaction.queuedBecauseHydrating &&\n runtime.isHydratingNow()\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 ...transaction,\n resolveApplied,\n rejectApplied,\n })\n settlePublicationAdmissionWaiters(openTransaction)\n settleRuntimeTransaction(openTransaction, applied)\n return visibleAfterDurable(openTransaction, applied)\n }\n\n // Admission is complete. Only queued hydration replay remains tied\n // to its sequence; retain hydrationContext for row metadata ownership.\n openTransaction.hydrationSequence = undefined\n let applied: Promise<void>\n try {\n applied = runtime.applyHydrationBufferedTransaction(transaction)\n } catch (error) {\n settlePublicationAdmissionWaiters(openTransaction, error)\n throw error\n }\n settlePublicationAdmissionWaiters(openTransaction)\n settleRuntimeTransaction(openTransaction, applied)\n return visibleAfterDurable(openTransaction, applied)\n },\n }\n\n let sourceResult: SyncConfigRes = {}\n let sourceResultSettled = false\n let activeSourceSyncEntry: Promise<void> | undefined\n fullStartPromise = runtime.ensureStarted()\n // Startup can fail before the source reaches markReady or loadSubset,\n // which are the two eventual consumers of this outer adopting promise.\n // The runtime-owned inner promise still installs and reports the exact\n // terminal failure; this observer only prevents the unused outer wrapper\n // from becoming an unhandled rejection on that fail-stop path.\n void fullStartPromise.catch(() => undefined)\n sourceResultPromise = (async () => {\n await runtime.ensureStartupMetadataLoaded()\n\n if (startupState.cleanedUp) {\n sourceResultSettled = true\n return sourceResult\n }\n\n let settleSourceSyncEntry!: () => void\n activeSourceSyncEntry = new Promise<void>((resolve) => {\n settleSourceSyncEntry = resolve\n })\n try {\n sourceResult = normalizeSyncFnResult(\n sourceSyncConfig.sync(wrappedParams),\n )\n } finally {\n activeSourceSyncEntry = undefined\n settleSourceSyncEntry()\n }\n // Cleanup can reenter while the source sync function is still active.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!startupState.cleanedUp && sourceResult.loadSubset) {\n const loadSubset = async (options: TransportedLoadSubsetOptions) => {\n if (startupState.cleanedUp) {\n throw new Error(`persisted sync source is no longer active`)\n }\n await sourceResult.loadSubset?.(\n options as unknown as LoadSubsetOptions,\n )\n }\n runtime.registerRemoteSubsetOwner(\n Object.assign(loadSubset, {\n unloadSubset: (options: TransportedLoadSubsetOptions) =>\n sourceResult.unloadSubset?.(\n options as unknown as LoadSubsetOptions,\n ),\n onError: reportUpstreamError,\n }),\n )\n }\n sourceResultSettled = true\n return sourceResult\n })()\n resolveSourceResultAssigned()\n void sourceResultPromise.catch((error) => {\n reportUpstreamError(error)\n })\n\n return {\n cleanup: async () => {\n startupState.cleanedUp = true\n // The optional source starts behind persistence metadata. If it\n // reenters cleanup before returning, wait for that exact synchronous\n // entry to publish its cleanup callback before sampling the result.\n const sourceSyncEntry = activeSourceSyncEntry\n const cleanupError = new SyncTransactionAbortedError()\n for (const acquisition of acquisitions.values()) {\n acquisition.cancelAdmissionWait?.()\n }\n acquisitions.clear()\n pendingPublicationTransactions.length = 0\n for (const transaction of transactionStack) {\n settlePublicationAdmissionWaiters(transaction, cleanupError)\n }\n transactionStack.length = 0\n let sourceCleanup: Promise<void>\n try {\n sourceCleanup = sourceSyncEntry\n ? sourceSyncEntry.then(() => sourceResult.cleanup?.())\n : Promise.resolve(sourceResult.cleanup?.())\n } catch (error) {\n sourceCleanup = Promise.reject(error)\n }\n let runtimeCleanup: Promise<void>\n try {\n runtimeCleanup = runtime.cleanup()\n } catch (error) {\n runtimeCleanup = Promise.reject(error)\n }\n const [sourceOutcome, runtimeOutcome] = await Promise.allSettled([\n sourceCleanup,\n runtimeCleanup,\n ])\n if (\n sourceOutcome.status === `rejected` &&\n runtimeOutcome.status === `rejected`\n ) {\n throw new AggregateError(\n [sourceOutcome.reason, runtimeOutcome.reason],\n `Source cleanup and persistence runtime teardown both failed`,\n { cause: sourceOutcome.reason },\n )\n }\n if (sourceOutcome.status === `rejected`) throw sourceOutcome.reason\n if (runtimeOutcome.status === `rejected`) throw runtimeOutcome.reason\n },\n loadSubset: (options: LoadSubsetOptions): true | Promise<void> => {\n const acquisition = { forwarded: false }\n acquisitions.set(options, acquisition)\n const forwardUpstream = (\n resolvedSourceResult: SyncConfigRes,\n loadOptions: LoadSubsetOptions,\n ): true | Promise<void> => {\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 // Returning a promise transfers its lease even if it rejects.\n // Only a synchronous throw leaves no upstream lease to release.\n return resolvedSourceResult.loadSubset(loadOptions)\n } catch (error) {\n acquisition.forwarded = false\n throw error\n }\n }\n\n const openTransaction = getOpenTransaction()\n const needsPublicationAdmission =\n openTransaction?.reservesCommitTurn === true\n const hydrated =\n sourceResultSettled && !needsPublicationAdmission\n ? runtime.loadHydratedSubset(options, (loadOptions) =>\n forwardUpstream(sourceResult, loadOptions),\n )\n : undefined\n if (hydrated !== undefined) {\n return hydrated\n }\n\n return (async () => {\n await fullStartPromise\n const resolvedSourceResult = await sourceResultPromise\n if (\n startupState.cleanedUp ||\n acquisitions.get(options) !== acquisition\n ) {\n return\n }\n const currentTransaction = getOpenTransaction()\n // A source transaction that reserved its FIFO turn commits before\n // subset hydration advances the generation it was built against.\n if (currentTransaction?.reservesCommitTurn) {\n await waitForPublicationAdmission(\n currentTransaction,\n options,\n acquisition,\n )\n }\n if (\n options.signal?.aborted ||\n acquisitions.get(options) !== acquisition\n ) {\n return\n }\n return runtime.loadSubset(options, (loadOptions) =>\n forwardUpstream(resolvedSourceResult, loadOptions),\n )\n })()\n },\n unloadSubset: (options: LoadSubsetOptions) => {\n const acquisition = acquisitions.get(options)\n acquisition?.cancelAdmissionWait?.()\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 markError: params.markError,\n })\n runtime.setCollection(\n params.collection as Collection<T, TKey, PersistedCollectionUtils>,\n )\n\n void runtime\n .ensureStarted()\n .then(() => {\n if (runtime.getCurrentTerminalFailure()) return\n params.markReady()\n })\n .catch(() => undefined)\n\n return {\n loadSubset: (options: LoadSubsetOptions): true | Promise<void> =>\n runtime.loadHydratedSubset(options) ?? runtime.loadSubset(options),\n cleanup: () => runtime.cleanup(),\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 TSchema extends StandardSchemaV1,\n TKey extends string | number,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: PersistedSyncWrappedOptions<\n InferSchemaOutput<TSchema>,\n TKey,\n TSchema,\n TUtils\n > & {\n schema: TSchema\n },\n): PersistedSyncOptionsResult<\n InferSchemaOutput<TSchema>,\n TKey,\n TSchema,\n TUtils\n> & {\n schema: TSchema\n}\n\nexport function persistedCollectionOptions<\n TSchema extends StandardSchemaV1,\n TKey extends string | number,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: PersistedLocalOnlyOptions<\n InferSchemaOutput<TSchema>,\n TKey,\n TSchema,\n TUtils\n > & {\n schema: TSchema\n },\n): PersistedLocalOnlyOptionsResult<\n InferSchemaOutput<TSchema>,\n TKey,\n TSchema,\n TUtils\n> & {\n schema: TSchema\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 schema?: never\n },\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 schema?: never\n },\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 const networkTimeoutMs = getNetworkTimeoutMs(options.initialRender)\n if (networkTimeoutMs !== undefined && options.syncMode === `on-demand`) {\n throw new InvalidPersistedCollectionConfigError(\n `network-first initial rendering requires eager persistence syncMode`,\n )\n }\n const persistedReadinessTracker =\n networkTimeoutMs !== undefined\n ? new PersistedReadinessTracker(networkTimeoutMs)\n : undefined\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 {\n schemaVersion,\n initialRender: _initialRender,\n ...syncOptions\n } = 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 persistedReadinessTracker,\n )\n\n const result = {\n ...syncOptions,\n id: collectionId,\n sync: createWrappedSyncConfig<T, TKey>(\n syncOptions.sync,\n runtime,\n persistedReadinessTracker,\n ),\n persistence,\n ...(persistedReadinessTracker\n ? { [PERSISTED_READINESS]: persistedReadinessTracker }\n : {}),\n }\n\n return withCollectionConfigFactory(\n result,\n () =>\n persistedCollectionOptions({\n ...options,\n id: collectionId,\n } as never) as typeof result,\n )\n }\n\n const {\n schemaVersion,\n initialRender: _initialRender,\n ...localOnlyOptions\n } = 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 persistedReadinessTracker,\n )\n\n const wrappedOnInsert = async (\n params: InsertMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const lifecycleGeneration = runtime.getLifecycleGeneration()\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 lifecycleGeneration,\n )\n\n return handlerResult ?? {}\n }\n\n const wrappedOnUpdate = async (\n params: UpdateMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const lifecycleGeneration = runtime.getLifecycleGeneration()\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 lifecycleGeneration,\n )\n\n return handlerResult ?? {}\n }\n\n const wrappedOnDelete = async (\n params: DeleteMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const lifecycleGeneration = runtime.getLifecycleGeneration()\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 lifecycleGeneration,\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 ...(persistedReadinessTracker\n ? { [PERSISTED_READINESS]: persistedReadinessTracker }\n : {}),\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 never) 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":["InvalidPersistedCollectionConfigError","safeRandomUUID","toTransportedLoadSubsetOptions","toProcessLocalLoadSubsetOptions","reportRemoteSubsetOwnerError","unloadRemoteSubsetOwner","DuplicateRemoteSubsetOwnerError","toPersistedCollectionDurabilityError","InvalidPersistedCollectionCoordinatorError","InvalidPersistenceAdapterError","serializeSQLiteBigInt","serializeSQLiteTemporal","whenSyncAccepted","SyncTransactionAbortedError","validateRemoteSubsetOptions","getLoadSubsetDemandKey","key","PersistedCollectionDurabilityError","compileSingleRowExpression","toBooleanPredicate","withAcceptedReceipt","SYNC_PERSISTENCE_PROTOCOL","SYNC_PERSISTENCE_VERSION","NoPendingSyncTransactionWriteError","NoPendingSyncTransactionCommitError","applied","InvalidSyncConfigError","schemaVersion","_initialRender","collectionId","persistence","runtime","result","PERSISTED_READINESS","withCollectionConfigFactory","InvalidPersistedStorageKeyError","InvalidPersistedStorageKeyEncodingError"],"mappings":"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"}
1
+ {"version":3,"file":"persisted.cjs","sources":["../../src/persisted.ts"],"sourcesContent":["import {\n NoPendingSyncTransactionCommitError,\n NoPendingSyncTransactionWriteError,\n PERSISTED_READINESS,\n SYNC_PERSISTENCE_PROTOCOL,\n SYNC_PERSISTENCE_VERSION,\n SyncTransactionAbortedError,\n collectionOptionsClaim,\n compileSingleRowExpression,\n equalPersistedSnapshotValues,\n getLoadSubsetDemandKey,\n safeRandomUUID,\n toBooleanPredicate,\n whenSyncAccepted,\n withAcceptedReceipt,\n withCollectionConfigFactory,\n} from '@tanstack/db'\nimport {\n DuplicateRemoteSubsetOwnerError,\n IndeterminateCommitError,\n InvalidPersistedCollectionConfigError,\n InvalidPersistedCollectionCoordinatorError,\n InvalidPersistedStorageKeyEncodingError,\n InvalidPersistedStorageKeyError,\n InvalidPersistenceAdapterError,\n InvalidSyncConfigError,\n PersistedCollectionDurabilityError,\n toPersistedCollectionDurabilityError,\n} from './errors'\nimport { serializeSQLiteBigInt, serializeSQLiteTemporal } from './sqlite-value'\nimport {\n toProcessLocalLoadSubsetOptions,\n toTransportedLoadSubsetOptions,\n validateRemoteSubsetOptions,\n} from './remote-subset-wire'\nimport {\n reportRemoteSubsetOwnerError,\n unloadRemoteSubsetOwner,\n} from './remote-subset-owner'\nimport type { TransportedLoadSubsetOptions } from './remote-subset-wire'\nimport type { RemoteSubsetOwner } from './remote-subset-owner'\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\nimport type {\n ChangeMessageOrDeleteKeyMessage,\n Collection,\n CollectionConfig,\n CollectionIndexMetadata,\n DeleteMutationFnParams,\n InferSchemaOutput,\n InsertMutationFnParams,\n LoadSubsetFn,\n LoadSubsetOptions,\n PendingMutation,\n PersistedReadinessSnapshot,\n PersistedReadinessSource,\n SyncAppliedReceipt,\n SyncConfig,\n SyncConfigRes,\n SyncMetadataApi,\n SyncPersistenceCapabilityV1,\n SyncPersistenceKeySetEvidence,\n SyncPersistenceScanOptions,\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 /** Persisted row metadata, not optimistic-transaction metadata. */\n metadata?: unknown\n /** Whether this envelope replaces or deletes the persisted row metadata. */\n metadataChanged?: boolean\n }\n | {\n mutationId: string\n type: `update`\n key: string | number\n value: Record<string, unknown>\n /** Persisted row metadata, not optimistic-transaction metadata. */\n metadata?: unknown\n /** Whether this envelope replaces or deletes the persisted row metadata. */\n metadataChanged?: boolean\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 reconciliationReload?: 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 acquisitionId: string\n options: TransportedLoadSubsetOptions\n}\n\nexport type EnsureRemoteSubsetResponse =\n | {\n type: `rpc:ensureRemoteSubset:res`\n rpcId: string\n ok: true\n leaderId: string\n }\n | {\n type: `rpc:ensureRemoteSubset:res`\n rpcId: string\n ok: false\n error: string\n retryable?: true\n }\n\nexport type ReleaseRemoteSubsetRequest = {\n type: `rpc:releaseRemoteSubset:req`\n rpcId: string\n acquisitionId: string\n}\n\nexport type ReleaseRemoteSubsetResponse =\n | {\n type: `rpc:releaseRemoteSubset:res`\n rpcId: string\n ok: true\n }\n | {\n type: `rpc:releaseRemoteSubset: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 | {\n type: `rpc:applyLocalMutations:res`\n rpcId: string\n ok: false\n code: `PERSISTENCE_ERROR`\n error: string\n sourceCode?: string | number\n path?: string | ReadonlyArray<string | number>\n }\n\nexport type ApplyCommittedTxRequest = {\n type: `rpc:applyCommittedTx:req`\n rpcId: string\n envelopeId: string\n tx: PersistedTx\n}\n\nexport type ApplyCommittedTxResponse =\n | {\n type: `rpc:applyCommittedTx:res`\n rpcId: string\n ok: true\n term: number\n seq: number\n latestRowVersion: number\n }\n | {\n type: `rpc:applyCommittedTx:res`\n rpcId: string\n ok: false\n code: `NOT_LEADER` | `CONFLICT` | `TIMEOUT`\n error: string\n }\n | {\n type: `rpc:applyCommittedTx:res`\n rpcId: string\n ok: false\n code: `PERSISTENCE_ERROR`\n error: string\n sourceCode?: string | number\n path?: string | ReadonlyArray<string | number>\n }\n\n/** The durable version read before a source transaction enters coordination. */\nexport type CommittedTxAnchor = {\n latestRowVersion: number\n resetEpoch: number\n}\n\nexport type ReconcileCommittedTxResponse =\n | {\n type: `rpc:reconcileCommittedTx:res`\n rpcId: string\n ok: true\n alreadyApplied: boolean\n committed: { term: number; seq: number; rowVersion: number }\n }\n | {\n type: `rpc:reconcileCommittedTx:res`\n rpcId: string\n ok: false\n code: `NOT_LEADER` | `UNDETERMINED` | `PERSISTENCE_ERROR`\n error: string\n sourceCode?: string | number\n path?: string | ReadonlyArray<string | number>\n }\n\nexport type ReconciledCommittedTx =\n | {\n kind: `already-applied` | `applied-now`\n committed: { term: number; seq: number; rowVersion: number }\n latestRowVersion: number\n }\n | { kind: `unknown` }\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 } | { 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 = SyncPersistenceScanOptions\n\nexport type PersistedKeySetEvidence = SyncPersistenceKeySetEvidence\n\nexport type PersistedCacheGenerationClaim = {\n storageCollectionId: string\n claimId: string\n /** Present when the adapter expires dormant claims. */\n expiresAtMs?: number\n}\n\n/** An eager Collection name or a claim-bound persisted cache generation. */\nexport type PersistedStorageTarget =\n | { kind: `eager`; collectionId: string }\n | {\n kind: `managed`\n storageCollectionId: string\n claimId: string\n }\n\nexport function eagerStorageTarget(\n collectionId: string,\n): PersistedStorageTarget {\n return { kind: `eager`, collectionId }\n}\n\nexport function managedStorageTarget(\n storageCollectionId: string,\n claimId: string,\n): PersistedStorageTarget {\n return { kind: `managed`, storageCollectionId, claimId }\n}\n\nexport function resolvePersistedStorageTarget(\n target: PersistedStorageTarget,\n legacyClaimId?: string,\n): { collectionId: string; claimId?: string } {\n const input: unknown = target\n if (typeof input !== `object` || input === null) {\n throw new InvalidPersistedCollectionConfigError(\n `SQLite persistence requires an explicit eager or managed storage target`,\n )\n }\n const fields = input as Record<string, unknown>\n if (fields.kind === `eager`) {\n if (\n typeof fields.collectionId !== `string` ||\n fields.collectionId.trim().length === 0\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `An eager storage target requires a nonempty collectionId`,\n )\n }\n if (\n legacyClaimId !== undefined ||\n `claimId` in fields ||\n `storageCollectionId` in fields\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `An eager storage target cannot carry a persisted cache claim`,\n )\n }\n return { collectionId: fields.collectionId }\n }\n if (fields.kind !== `managed`) {\n throw new InvalidPersistedCollectionConfigError(\n `Unknown SQLite persistence storage target kind`,\n )\n }\n if (\n typeof fields.storageCollectionId !== `string` ||\n fields.storageCollectionId.trim().length === 0 ||\n typeof fields.claimId !== `string` ||\n fields.claimId.trim().length === 0\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `A managed storage target requires a storageCollectionId and persisted cache claim`,\n )\n }\n if (`collectionId` in fields) {\n throw new InvalidPersistedCollectionConfigError(\n `A managed storage target cannot carry an eager collectionId`,\n )\n }\n if (legacyClaimId !== undefined && legacyClaimId !== fields.claimId) {\n throw new InvalidPersistedCollectionConfigError(\n `The persisted cache claim does not match its storage target`,\n )\n }\n return {\n collectionId: fields.storageCollectionId,\n claimId: fields.claimId,\n }\n}\n\ntype PersistedResumeGeneration = {\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n}\n\nexport type PersistencePullSinceResult =\n | {\n latestRowVersion: number\n requiresFullReload: true\n }\n | {\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\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 /** Claim authorizing this transaction's persisted cache generation. */\n cacheGenerationClaimId?: string\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\n/**\n * Opaque identity shared by every adapter over the same physical SQLite driver.\n * The core adapter uses it to serialize non-preemptible logical operations\n * while alternating one regular operation between queued hydrations.\n *\n * Delegating drivers must forward this property before they are passed to a\n * SQLite persistence adapter. A driver may also brand each returned Promise\n * with the same key for late capability discovery, but a wrapper must return\n * that exact Promise: discovering the key after a call cannot retroactively\n * schedule the wrapper's first logical operation.\n */\nexport const SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY = Symbol.for(\n `tanstack-db.sqlite-driver-supports-shared-logical-scheduling`,\n)\n\nexport interface PersistenceAdapter {\n loadSubset: (\n target: PersistedStorageTarget,\n options: LoadSubsetOptions,\n ctx?: {\n requiredIndexSignatures?: ReadonlyArray<string>\n cacheGenerationClaimId?: string\n },\n ) => Promise<\n Array<{\n key: string | number\n value: Record<string, unknown>\n metadata?: unknown\n }>\n >\n loadResumeSnapshot: (\n target: PersistedStorageTarget,\n ctx?: {\n requiredIndexSignatures?: ReadonlyArray<string>\n includeRows?: boolean\n cacheGenerationClaimId?: string\n },\n ) => Promise<{\n rows: Array<{\n key: string | number\n value: Record<string, unknown>\n metadata?: unknown\n }>\n keySet?: PersistedKeySetEvidence\n collectionMetadata: Array<{ key: string; value: unknown }>\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n }>\n applyCommittedTx: (\n target: PersistedStorageTarget,\n tx: PersistedTx,\n ) => Promise<void>\n claimCacheGeneration?: (\n collectionId: string,\n ) => Promise<PersistedCacheGenerationClaim>\n rotateCacheGeneration?: (\n collectionId: string,\n claimId: string,\n resetMetadata?: { key: string; value: unknown },\n expectedStorageCollectionId?: string,\n ) => Promise<PersistedCacheGenerationClaim>\n releaseCacheGenerationClaim?: (claimId: string) => Promise<void>\n renewCacheGenerationClaim?: (\n storageCollectionId: string,\n claimId: string,\n ) => Promise<number | undefined>\n getCacheGenerationNow?: () => number\n /** Atomically certify or apply one source transaction after a lost response. */\n reconcileCommittedTx?: (\n target: PersistedStorageTarget,\n tx: PersistedTx,\n anchor: CommittedTxAnchor,\n ) => Promise<ReconciledCommittedTx>\n loadCollectionMetadata?: (\n target: PersistedStorageTarget,\n ctx?: { cacheGenerationClaimId?: string },\n ) => Promise<Array<{ key: string; value: unknown }>>\n scanRows?: (\n target: PersistedStorageTarget,\n options?: PersistedRowScanOptions,\n ctx?: { cacheGenerationClaimId?: string },\n ) => Promise<Array<PersistedScannedRow>>\n ensureIndex: (\n target: PersistedStorageTarget,\n signature: string,\n spec: PersistedIndexSpec,\n ctx?: { cacheGenerationClaimId?: string },\n ) => Promise<void>\n markIndexRemoved?: (\n target: PersistedStorageTarget,\n signature: string,\n ctx?: { cacheGenerationClaimId?: string },\n ) => Promise<void>\n getStreamPosition?: (\n target: PersistedStorageTarget,\n ctx?: { cacheGenerationClaimId?: string },\n ) => Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }>\n /** Reserve a new durable election term before announcing Browser leadership. */\n reserveLeadershipTerm?: (\n target: PersistedStorageTarget,\n observedTerm: number,\n ctx?: { cacheGenerationClaimId?: string },\n ) => Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }>\n /**\n * Runs one complete logical hydrate as a non-preemptible scheduler unit.\n * The callback must use the supplied unscheduled adapter for all nested\n * persistence work and must not retain it after the callback settles.\n */\n runInHydrationScope?: <T>(\n task: (adapter: HydrationPersistenceAdapter) => Promise<T>,\n ) => Promise<T>\n /** Schedule one regular operation before it acquires external writer locks. */\n runInRegularScope?: <T>(\n task: (adapter: HydrationPersistenceAdapter) => Promise<T>,\n ) => Promise<T>\n /** Whether hydration scopes currently enter a shared driver scheduler. */\n isHydrationScopeScheduled?: () => boolean\n}\n\nexport type HydrationPersistenceAdapter = PersistenceAdapter & {\n pullSince?: (\n target: PersistedStorageTarget,\n fromRowVersion: number,\n ctx?: { cacheGenerationClaimId?: string },\n ) => Promise<PersistencePullSinceResult>\n}\n\nexport type { RemoteSubsetOwner } from './remote-subset-owner'\n\ntype SingleProcessRemoteSubsetAcquisition = {\n owner: RemoteSubsetOwner\n options: TransportedLoadSubsetOptions\n load: Promise<void>\n}\n\nexport interface SQLiteDriver {\n readonly [SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY]?: object\n /** Host-specific limit on bound parameters in one query, when lower than SQLite's. */\n readonly maxBoundParameters?: number\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\n/**\n * Forwards a driver's shared logical scheduling identity to a transparent\n * delegating driver before the wrapper is used by a persistence adapter.\n */\nexport function forwardSQLiteDriverSharedLogicalScheduling<\n TDriver extends SQLiteDriver,\n>(source: SQLiteDriver, wrapper: TDriver): TDriver {\n const key = source[SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY]\n if (key) {\n Object.defineProperty(\n wrapper,\n SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY,\n { value: key },\n )\n }\n return wrapper\n}\n\nexport interface PersistedCollectionCoordinator {\n getNodeId: () => string\n setAdapterForCollection?: (\n collectionId: string,\n adapter: PersistenceAdapter,\n cacheGenerationClaimId?: string,\n ) => void\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 requestReleaseRemoteSubset: (\n collectionId: string,\n options: LoadSubsetOptions,\n ) => Promise<void>\n registerRemoteSubsetOwner: (\n collectionId: string,\n owner: RemoteSubsetOwner,\n ) => () => void\n /**\n * Requests leader-side index creation. The scoped adapter is leader-local\n * and is never serialized to a follower. `localEnsureCompleted` lets the\n * built-in leader avoid repeating successful local work.\n */\n requestEnsurePersistedIndex: (\n collectionId: string,\n signature: string,\n spec: PersistedIndexSpec,\n scopedAdapter?: HydrationPersistenceAdapter,\n localEnsureCompleted?: boolean,\n cacheGenerationClaimId?: string,\n ) => Promise<void>\n requestApplyLocalMutations?: (\n collectionId: string,\n mutations: Array<PersistedMutationEnvelope>,\n cacheGenerationClaimId?: string,\n ) => Promise<ApplyLocalMutationsResponse>\n /**\n * Applies a committed transaction through the supplied adapter when present.\n * Wrappers must forward this leader-local loan: scheduling it again can wait\n * on the hydration that is awaiting this call. Never serialize or retain the\n * loan after the call; ordinary work uses the registered collection adapter.\n */\n requestApplyCommittedTx: (\n collectionId: string,\n tx: PersistedTx,\n scopedAdapter?: HydrationPersistenceAdapter,\n ) => Promise<ApplyCommittedTxResponse>\n /** Available only when the elected adapter can certify the durable outcome. */\n reconcileCommittedTx?: (\n collectionId: string,\n tx: PersistedTx,\n anchor: CommittedTxAnchor,\n scopedAdapter?: HydrationPersistenceAdapter,\n ) => Promise<ReconcileCommittedTxResponse>\n /** The scoped adapter is leader-local and is never serialized to a follower. */\n pullSince?: (\n collectionId: string,\n fromRowVersion: number,\n scopedAdapter?: HydrationPersistenceAdapter,\n cacheGenerationClaimId?: string,\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 /** Hydrate once without acquiring a new ongoing subset lease. */\n forceReloadSubset?: (options: LoadSubsetOptions) => Promise<void> | void\n}\n\nclass PersistedReadinessTracker implements PersistedReadinessSource {\n private snapshot: PersistedReadinessSnapshot = { status: `loading` }\n private networkDeadlineAt: number | undefined\n private readonly listeners = new Set<() => void>()\n\n constructor(readonly networkTimeoutMs: number) {}\n\n getSnapshot = (): PersistedReadinessSnapshot => this.snapshot\n\n getOrStartNetworkDeadline = (): number => {\n return (this.networkDeadlineAt ??= Date.now() + this.networkTimeoutMs)\n }\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n }\n\n set(snapshot: PersistedReadinessSnapshot): void {\n const deadlineRestarted =\n snapshot.status === `loading` && this.networkDeadlineAt !== undefined\n if (deadlineRestarted) {\n this.networkDeadlineAt = Date.now() + this.networkTimeoutMs\n }\n if (\n this.snapshot.status === snapshot.status &&\n this.snapshot.error === snapshot.error &&\n !deadlineRestarted\n ) {\n return\n }\n this.snapshot = snapshot\n for (const listener of this.listeners) listener()\n }\n}\n\nexport type PersistedInitialRenderOptions = {\n strategy: `network-first`\n /** Time to prefer network before restored rows may render; defaults to 3s. */\n networkTimeoutMs?: number\n}\n\nconst DEFAULT_NETWORK_TIMEOUT_MS = 3_000\nconst CACHE_CLAIM_RENEW_WINDOW_MS = 60_000\nconst MAX_TIMER_TIMEOUT_MS = 2_147_483_647\n\nfunction getNetworkTimeoutMs(\n initialRender: PersistedInitialRenderOptions | undefined,\n): number | undefined {\n if (initialRender === undefined) return undefined\n const strategy = (initialRender as { strategy: unknown }).strategy\n if (strategy !== `network-first`) {\n throw new InvalidPersistedCollectionConfigError(\n `initialRender.strategy must be \"network-first\"`,\n )\n }\n const timeoutMs = initialRender.networkTimeoutMs ?? DEFAULT_NETWORK_TIMEOUT_MS\n if (\n !Number.isFinite(timeoutMs) ||\n timeoutMs < 0 ||\n timeoutMs > MAX_TIMER_TIMEOUT_MS\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `initialRender.networkTimeoutMs must be between 0 and ${MAX_TIMER_TIMEOUT_MS}`,\n )\n }\n return timeoutMs\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 /** Opt into network-first rendering with a persisted fallback. */\n initialRender?: PersistedInitialRenderOptions\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 /** Opt into network-first rendering with a persisted fallback. */\n initialRender?: PersistedInitialRenderOptions\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 | `requestEnsureRemoteSubset`\n | `requestReleaseRemoteSubset`\n | `registerRemoteSubsetOwner`\n | `requestEnsurePersistedIndex`\n | `requestApplyCommittedTx`\n >\n> = [\n `getNodeId`,\n `subscribe`,\n `publish`,\n `isLeader`,\n `ensureLeadership`,\n `requestEnsureRemoteSubset`,\n `requestReleaseRemoteSubset`,\n `registerRemoteSubsetOwner`,\n `requestEnsurePersistedIndex`,\n `requestApplyCommittedTx`,\n]\n\nconst REQUIRED_ADAPTER_METHODS: ReadonlyArray<\n keyof Pick<\n PersistenceAdapter,\n `loadSubset` | `loadResumeSnapshot` | `applyCommittedTx` | `ensureIndex`\n >\n> = [`loadSubset`, `loadResumeSnapshot`, `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: (() => 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: ((options?: { markReady?: boolean }) => void) | null\n metadata: SyncMetadataApi<TKey> | null\n markError: ((error: unknown) => void) | 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 private readonly collectionAdapters = new Map<string, PersistenceAdapter>()\n private readonly remoteSubsetOwners = new Map<string, RemoteSubsetOwner>()\n private readonly remoteSubsetAcquisitions = new Map<\n string,\n Map<LoadSubsetOptions, SingleProcessRemoteSubsetAcquisition>\n >()\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(\n collectionId: string,\n options: LoadSubsetOptions,\n ): Promise<void> {\n const transported = toTransportedLoadSubsetOptions(options)\n const localOptions = toProcessLocalLoadSubsetOptions(options, transported)\n const owner = this.remoteSubsetOwners.get(collectionId)\n if (!owner) {\n throw new InvalidPersistedCollectionConfigError(\n `SingleProcessCoordinator has no remote subset owner configured for collection \"${collectionId}\"`,\n )\n }\n let acquisitions = this.remoteSubsetAcquisitions.get(collectionId)\n if (!acquisitions) {\n acquisitions = new Map()\n this.remoteSubsetAcquisitions.set(collectionId, acquisitions)\n }\n const existing = acquisitions.get(options)\n if (existing) {\n await existing.load\n return\n }\n\n let resolveLoad!: () => void\n let rejectLoad!: (error: unknown) => void\n const load = new Promise<void>((resolve, reject) => {\n resolveLoad = resolve\n rejectLoad = reject\n })\n acquisitions.set(options, { owner, options: localOptions, load })\n try {\n const ownerLoad = owner(localOptions)\n void Promise.resolve(ownerLoad).then(resolveLoad, (error) => {\n reportRemoteSubsetOwnerError(owner, error)\n rejectLoad(error)\n })\n } catch (error) {\n reportRemoteSubsetOwnerError(owner, error)\n rejectLoad(error)\n }\n await load\n }\n\n public async requestReleaseRemoteSubset(\n collectionId: string,\n options: LoadSubsetOptions,\n ): Promise<void> {\n const acquisitions = this.remoteSubsetAcquisitions.get(collectionId)\n const acquisition = acquisitions?.get(options)\n if (!acquisition) return\n acquisitions!.delete(options)\n if (acquisitions!.size === 0) {\n this.remoteSubsetAcquisitions.delete(collectionId)\n }\n // The owner may need unload to settle its load. The call itself already\n // transferred the lease, so waiting for load here can deadlock recovery.\n await unloadRemoteSubsetOwner(acquisition.owner, acquisition.options)\n }\n\n public registerRemoteSubsetOwner(\n collectionId: string,\n owner: RemoteSubsetOwner,\n ): () => void {\n if (this.remoteSubsetOwners.has(collectionId)) {\n throw new DuplicateRemoteSubsetOwnerError(collectionId)\n }\n this.remoteSubsetOwners.set(collectionId, owner)\n return () => {\n if (this.remoteSubsetOwners.get(collectionId) !== owner) return\n const acquisitions = this.remoteSubsetAcquisitions.get(collectionId)\n this.remoteSubsetAcquisitions.delete(collectionId)\n this.remoteSubsetOwners.delete(collectionId)\n for (const acquisition of acquisitions?.values() ?? []) {\n void unloadRemoteSubsetOwner(owner, acquisition.options).catch(\n () => undefined,\n )\n }\n }\n }\n\n public async requestEnsurePersistedIndex(): Promise<void> {}\n\n public setAdapterForCollection(\n collectionId: string,\n adapter: PersistenceAdapter,\n ): void {\n this.collectionAdapters.set(collectionId, adapter)\n }\n\n public async requestApplyCommittedTx(\n collectionId: string,\n tx: PersistedTx,\n scopedAdapter?: HydrationPersistenceAdapter,\n ): Promise<ApplyCommittedTxResponse> {\n const adapter = scopedAdapter ?? this.collectionAdapters.get(collectionId)\n if (!adapter) {\n throw new InvalidPersistedCollectionConfigError(\n `SingleProcessCoordinator has no persistence adapter configured for collection \"${collectionId}\"`,\n )\n }\n\n try {\n await adapter.applyCommittedTx(\n tx.cacheGenerationClaimId\n ? managedStorageTarget(collectionId, tx.cacheGenerationClaimId)\n : eagerStorageTarget(collectionId),\n tx,\n )\n } catch (error) {\n throw toPersistedCollectionDurabilityError(collectionId, error)\n }\n return {\n type: `rpc:applyCommittedTx:res`,\n rpcId: safeRandomUUID(),\n ok: true,\n term: tx.term,\n seq: tx.seq,\n latestRowVersion: tx.rowVersion,\n }\n }\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 collectionId: string,\n): PersistedResolvedPersistence {\n validatePersistenceAdapter(persistence.adapter)\n\n const coordinator = persistence.coordinator ?? new SingleProcessCoordinator()\n if (coordinator instanceof SingleProcessCoordinator) {\n coordinator.setAdapterForCollection(collectionId, persistence.adapter)\n }\n validatePersistedCollectionCoordinator(coordinator)\n\n return {\n ...persistence,\n coordinator,\n }\n}\n\nfunction resolvePersistenceForMode(\n persistence: PersistedCollectionPersistence,\n mode: PersistedCollectionMode,\n collectionId: string,\n): PersistedResolvedPersistence {\n const modeSpecificPersistence = persistence.resolvePersistenceForMode?.(mode)\n return resolvePersistence(\n modeSpecificPersistence ?? persistence,\n collectionId,\n )\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(\n collectionSpecificPersistence,\n options.collectionId,\n )\n }\n\n return resolvePersistenceForMode(\n persistence,\n options.mode,\n options.collectionId,\n )\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 partialUpdateOperationIndexes: Set<number>\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 deferredHydrationMetadataDeleteKeys: Set<TKey>\n hydrationContext?: { suppliedRowKeys: Set<TKey> }\n hydrationSequence?: number\n truncate: boolean\n internal: boolean\n lifecycleGeneration: number\n admittedStorageCollectionId?: string\n expectedResumeGenerationOwner?: symbol\n signal?: AbortSignal\n prependHydrationRows: (\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n ) => void\n applyToCollection: () => SyncAppliedReceipt\n shouldFailStopOnAbort?: () => boolean\n resolveApplied?: () => void\n rejectApplied?: (error: unknown) => void\n}\n\ntype OpenSyncTransaction<T extends object, TKey extends string | number> = Omit<\n BufferedSyncTransaction<T, TKey>,\n `applyToCollection` | `prependHydrationRows` | `shouldFailStopOnAbort`\n> & {\n signal?: AbortSignal\n applicationReceipt?: SyncAppliedReceipt\n operationKeys: Set<TKey>\n queuedBecauseHydrating: boolean\n // Set by `reserveCommitTurn`: subset hydration waits for this commit.\n reservesCommitTurn?: boolean\n hasDependentSuccessor: boolean\n publicationAdmissionWaiters?: Set<{\n resolve: () => void\n reject: (error: unknown) => void\n }>\n terminalFailure?: { error: unknown }\n}\n\ntype SyncWriteNormalization<T extends object, TKey extends string | number> = {\n operation: NormalizedSyncOperation<T, TKey>\n}\n\nclass ApplyMutex {\n private queue: Promise<void> = Promise.resolve()\n private pending = 0\n\n reserve(): {\n run: <T>(task: () => Promise<T> | T) => Promise<T>\n } {\n const runImmediately = this.pending === 0\n const predecessor = this.queue\n this.pending++\n\n let releaseReservation!: () => void\n const reservation = new Promise<void>((resolve) => {\n releaseReservation = resolve\n })\n this.queue = runImmediately\n ? reservation\n : predecessor.then(() => reservation)\n\n let used = false\n return {\n run: <T>(task: () => Promise<T> | T): Promise<T> => {\n if (used) {\n return Promise.reject(\n new Error(`an apply-mutex reservation can only run once`),\n )\n }\n used = true\n\n let taskPromise: Promise<T>\n if (runImmediately) {\n try {\n taskPromise = Promise.resolve(task())\n } catch (error) {\n taskPromise = Promise.reject(error)\n }\n } else {\n taskPromise = predecessor.then(() => task())\n }\n const markComplete = () => {\n this.pending--\n releaseReservation()\n }\n void taskPromise.then(markComplete, markComplete)\n return taskPromise\n },\n }\n }\n\n run<T>(task: () => Promise<T> | T): Promise<T> {\n return this.reserve().run(task)\n }\n}\n\nfunction matchesAnySubset(\n value: object,\n evaluators: ReadonlyArray<ReturnType<\n typeof compileSingleRowExpression\n > | null>,\n): boolean {\n return evaluators.some(\n (evaluator) =>\n !evaluator ||\n toBooleanPredicate(\n evaluator(value as Record<string, unknown>) as boolean | null,\n ),\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 serializeSQLiteBigInt(value)\n case `function`:\n case `symbol`:\n case `undefined`:\n return undefined\n }\n\n const temporal = serializeSQLiteTemporal(value)\n if (temporal) return temporal\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 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 (\n payload.reconciliationReload === undefined ||\n payload.reconciliationReload === true\n )\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 // PendingMutation.metadata belongs to the optimistic transaction and is\n // consumed by mutation handlers. It must not overwrite persisted row metadata.\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 activeHydrationContext: { suppliedRowKeys: Set<TKey> } | undefined\n private hydrationSequence = 0\n // An unscheduled startup read may finish after a coordinator reset publishes.\n private resetSequence = 0\n private readonly pendingRemoteSubsetEnsures = new Map<\n string,\n LoadSubsetOptions\n >()\n private readonly scopedRefreshes = new Map<LoadSubsetOptions, string>()\n /** A retained demand may use fresh physical request data after rotation. */\n private readonly rotatedAcquisitions = new Map<\n LoadSubsetOptions,\n LoadSubsetOptions\n >()\n /** An in-flight load waits for the recovery acquisition of its demand. */\n private readonly rotatedEnsures = new WeakMap<\n LoadSubsetOptions,\n Promise<void>\n >()\n private readonly queuedHydrationTransactions: Array<\n BufferedSyncTransaction<T, TKey>\n > = []\n private readonly queuedTxCommitted: Array<{\n txCommitted: TxCommitted\n lifecycleGeneration: number\n storageCollectionId: string\n }> = []\n private readonly requestIds = new WeakMap<LoadSubsetOptions, string>()\n private readonly hydratedDemands = new Set<string | undefined>()\n\n private collection: Collection<T, TKey, PersistedCollectionUtils> | null =\n null\n // Cleanup ends the active sync run, but cannot transfer this runtime's owner.\n private boundCollection: Collection<\n T,\n TKey,\n PersistedCollectionUtils\n > | null = null\n private syncControls: SyncControlFns<T, TKey> = {\n begin: null,\n write: null,\n commit: null,\n truncate: null,\n metadata: null,\n markError: null,\n }\n private startupMetadataPromise: Promise<void> | null = null\n private startPromise: Promise<void> | null = null\n private hasAttemptedStartup = false\n private resumeBaselinePromise: Promise<void> | null = null\n private resumeCertificationPromise: Promise<void> | null = null\n private persistedKeySetEvidence: PersistedKeySetEvidence | undefined\n private persistedResumeGeneration: PersistedResumeGeneration | undefined\n private resumeGenerationOwner = Symbol(`persisted resume generation owner`)\n private lifecycleGeneration = 0\n private internalApplyDepth = 0\n private appliedReceiptSequence = 0\n private syncErrorReported = false\n private reportedSyncError: unknown\n private readonly pendingAppliedReceipts = new Map<number, Promise<void>>()\n private hydratingGeneration: number | null = null\n private terminalFailure:\n { lifecycleGeneration: number; error: unknown } | undefined\n private coordinatorUnsubscribe: (() => void) | null = null\n private remoteSubsetOwnerUnsubscribe: (() => 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 cacheClaimRenewTimer: ReturnType<typeof setTimeout> | null = null\n private cacheClaimRecovery: Promise<void> | null = null\n private nextRequestId = 0\n private startupSettled = false\n private sourceTruncateGeneration = 0\n /** Durable rows cannot replace source rows during scoped recovery. */\n private scopedRecovery = false\n private scopedRecoveryPending = false\n private scopedRecoverySequence = 0\n private recoverQueuedAfterLocalLoadFailure = false\n private cacheGenerationClaim: PersistedCacheGenerationClaim | undefined\n private startupCacheGenerationRotated = false\n private remoteSubsetOwner: RemoteSubsetOwner | undefined\n // Undefined before source assignment; null means the source cannot restart.\n private restartSourceAfterScopedRecovery:\n ((cacheRotated: Promise<void>) => void | Promise<void>) | null | undefined\n\n private latestTerm = 0\n private latestSeq = 0\n private latestRowVersion = 0\n // A metadata-only resume snapshot can advance latestRowVersion without\n // publishing rows. Gap checks must use the last publicly applied version.\n private publicRowVersion = 0\n // A reset does not label later tx notifications with their reset epoch.\n // Old-term payloads must be checked against durable rows even after a new term.\n private resetTermFence: number | undefined\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 private readonly persistedReadiness?: PersistedReadinessTracker,\n private readonly optionsClaim?: () => void | (() => void),\n ) {}\n\n private get storageCollectionId(): string {\n return this.cacheGenerationClaim?.storageCollectionId ?? this.collectionId\n }\n\n private storageTargetFor(\n storageCollectionId: string = this.storageCollectionId,\n claimId: string | undefined = this.cacheGenerationClaim?.claimId,\n ): PersistedStorageTarget {\n if (\n this.mode === `sync-present` &&\n this.syncMode === `on-demand` &&\n this.persistence.adapter.claimCacheGeneration\n ) {\n if (!claimId) {\n throw new InvalidPersistedCollectionConfigError(\n `A managed on-demand cache operation requires a persisted cache claim`,\n )\n }\n return { kind: `managed`, storageCollectionId, claimId }\n }\n return { kind: `eager`, collectionId: storageCollectionId }\n }\n\n private cacheGenerationNow(): number {\n return this.persistence.adapter.getCacheGenerationNow?.() ?? Date.now()\n }\n\n private hasExpiredCacheClaim(): boolean {\n const expiresAtMs = this.cacheGenerationClaim?.expiresAtMs\n return expiresAtMs !== undefined && this.cacheGenerationNow() >= expiresAtMs\n }\n\n private async claimCacheGeneration(\n lifecycleGeneration: number,\n ): Promise<void> {\n if (this.mode !== `sync-present` || this.syncMode !== `on-demand`) return\n const adapter = this.persistence.adapter\n const capabilities = [\n adapter.claimCacheGeneration,\n adapter.rotateCacheGeneration,\n adapter.renewCacheGenerationClaim,\n adapter.releaseCacheGenerationClaim,\n ]\n if (capabilities.some(Boolean) && !capabilities.every(Boolean)) {\n throw new InvalidPersistedCollectionConfigError(\n `An on-demand managed cache generation adapter must implement claimCacheGeneration, rotateCacheGeneration, renewCacheGenerationClaim, and releaseCacheGenerationClaim together`,\n )\n }\n if (!adapter.claimCacheGeneration) return\n const claim = await adapter.claimCacheGeneration(this.collectionId)\n if (lifecycleGeneration !== this.lifecycleGeneration) {\n await adapter.releaseCacheGenerationClaim?.(claim.claimId)\n return\n }\n this.cacheGenerationClaim = claim\n this.scheduleCacheClaimRenewal(claim)\n this.attachCoordinatorSubscription()\n }\n\n private clearCacheClaimRenewal(): void {\n if (this.cacheClaimRenewTimer !== null) {\n clearTimeout(this.cacheClaimRenewTimer)\n this.cacheClaimRenewTimer = null\n }\n }\n\n private scheduleCacheClaimRenewal(\n claim: PersistedCacheGenerationClaim,\n ): void {\n this.clearCacheClaimRenewal()\n if (\n claim.expiresAtMs === undefined ||\n !this.persistence.adapter.renewCacheGenerationClaim\n ) {\n return\n }\n const remaining = claim.expiresAtMs - this.cacheGenerationNow()\n const delay =\n remaining <= 0\n ? 1_000\n : Math.max(\n 1,\n Math.min(CACHE_CLAIM_RENEW_WINDOW_MS, Math.floor(remaining / 2)),\n )\n const lifecycleGeneration = this.lifecycleGeneration\n this.cacheClaimRenewTimer = setTimeout(() => {\n this.cacheClaimRenewTimer = null\n void this.ensureCacheClaimActive().catch(() => {\n // A failed renewal does not establish claim loss. Adapter reads and\n // writes still check the claim; retry the background check without\n // turning one transient storage error into a permanent Collection\n // failure. An expired claim retries at a bounded pace.\n if (\n lifecycleGeneration === this.lifecycleGeneration &&\n this.cacheGenerationClaim === claim\n ) {\n this.scheduleCacheClaimRenewal(claim)\n }\n })\n }, delay)\n }\n\n private async ensureCacheClaimActive(): Promise<void> {\n if (this.cacheClaimRecovery) {\n await this.cacheClaimRecovery\n return\n }\n if (await this.renewCacheClaim(this.persistence.adapter)) return\n // Another caller may have started recovery while renewal was awaited.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!this.cacheClaimRecovery) {\n const recovery =\n this.restartSourceAfterScopedRecovery === undefined\n ? this.reclaimStartupCacheGeneration()\n : this.startScopedRecovery()\n this.cacheClaimRecovery = recovery\n void recovery\n .finally(() => {\n if (this.cacheClaimRecovery === recovery) {\n this.cacheClaimRecovery = null\n }\n })\n .catch(() => undefined)\n }\n await this.cacheClaimRecovery\n }\n\n private scheduleCacheClaimRecovery(lifecycleGeneration: number): void {\n // Recovery may need the apply mutex held by the caller. Let that caller\n // release its turn before checking the claim and rotating the cache.\n queueMicrotask(() => {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n void this.ensureCacheClaimActive()\n .then(() =>\n this.applyMutex.run(() => this.flushQueuedTxCommittedUnsafe()),\n )\n .catch((error) => {\n this.markTerminalFailure(error, lifecycleGeneration)\n })\n })\n }\n\n private async reclaimStartupCacheGeneration(): Promise<void> {\n const lifecycleGeneration = this.lifecycleGeneration\n const previous = this.cacheGenerationClaim\n if (!previous) return\n if (!this.persistence.adapter.rotateCacheGeneration) {\n throw new InvalidPersistedCollectionConfigError(\n `A managed on-demand cache adapter must rotate expired startup claims`,\n )\n }\n this.clearCacheClaimRenewal()\n this.coordinatorUnsubscribe?.()\n this.coordinatorUnsubscribe = null\n const rotated = await this.persistence.adapter.rotateCacheGeneration(\n this.collectionId,\n previous.claimId,\n undefined,\n previous.storageCollectionId,\n )\n if (lifecycleGeneration !== this.lifecycleGeneration) {\n await this.persistence.adapter.releaseCacheGenerationClaim?.(\n rotated.claimId,\n )\n return\n }\n this.cacheGenerationClaim = rotated\n this.startupCacheGenerationRotated = true\n this.resetSequence++\n this.latestTerm = 0\n this.latestSeq = 0\n this.latestRowVersion = 0\n this.localTerm = 1\n this.localSeq = 0\n this.localRowVersion = 0\n this.persistedResumeGeneration = undefined\n this.persistedKeySetEvidence = { status: `incompatible` }\n this.scheduleCacheClaimRenewal(rotated)\n this.attachCoordinatorSubscription()\n }\n\n private async renewCacheClaim(\n adapter: HydrationPersistenceAdapter,\n ): Promise<boolean> {\n const claim = this.cacheGenerationClaim\n if (\n !claim ||\n !adapter.renewCacheGenerationClaim ||\n this.scopedRecoveryPending\n )\n return true\n if (\n claim.expiresAtMs !== undefined &&\n claim.expiresAtMs - this.cacheGenerationNow() >\n CACHE_CLAIM_RENEW_WINDOW_MS\n ) {\n // Durable operations check their claim at the adapter boundary. Keep\n // the background timer armed without writing the same live claim for\n // every foreground operation.\n if (this.cacheClaimRenewTimer === null) {\n this.scheduleCacheClaimRenewal(claim)\n }\n return true\n }\n const lifecycleGeneration = this.lifecycleGeneration\n const expiresAtMs = await adapter.renewCacheGenerationClaim(\n claim.storageCollectionId,\n claim.claimId,\n )\n if (\n lifecycleGeneration !== this.lifecycleGeneration ||\n this.cacheGenerationClaim?.claimId !== claim.claimId ||\n this.cacheGenerationClaim.storageCollectionId !==\n claim.storageCollectionId\n ) {\n return true\n }\n if (expiresAtMs === undefined) {\n return false\n }\n this.cacheGenerationClaim = { ...claim, expiresAtMs }\n this.scheduleCacheClaimRenewal(this.cacheGenerationClaim)\n return true\n }\n\n setSyncControls(syncControls: SyncControlFns<T, TKey>): void {\n this.advanceLifecycle()\n this.syncErrorReported = false\n this.reportedSyncError = undefined\n\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 setSourceRestartAfterScopedRecovery(\n restart:\n ((cacheRotated: Promise<void>) => void | Promise<void>) | undefined,\n ): void {\n this.restartSourceAfterScopedRecovery = restart ?? null\n }\n\n clearSourceRestartAfterScopedRecovery(): void {\n this.restartSourceAfterScopedRecovery = undefined\n }\n\n reportSyncError(error: unknown): unknown {\n const markError = this.syncControls.markError\n if (this.syncErrorReported) return this.reportedSyncError\n if (!markError) return error\n\n this.syncErrorReported = true\n this.reportedSyncError = error\n try {\n markError(error)\n } catch {\n // Reporting must not replace the original asynchronous failure.\n }\n return error\n }\n\n registerRemoteSubsetOwner(owner: RemoteSubsetOwner): void {\n this.remoteSubsetOwnerUnsubscribe?.()\n this.remoteSubsetOwner = owner\n this.remoteSubsetOwnerUnsubscribe =\n this.persistence.coordinator.registerRemoteSubsetOwner(\n this.storageCollectionId,\n owner,\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 // Startup waits for acceptance: a local mutation's handler can wait for\n // startup, and the rows publish when that mutation settles. Readiness waits\n // for them in core. A subset load waits for visibility.\n private async waitForAppliedReceiptsAfter(\n cursor: number,\n until: `accepted` | `visible` = `visible`,\n ): Promise<void> {\n await Promise.all(\n Array.from(this.pendingAppliedReceipts, ([sequence, receipt]) =>\n sequence <= cursor\n ? undefined\n : until === `accepted`\n ? whenSyncAccepted(receipt)\n : receipt,\n ),\n )\n }\n\n // An ensure reply settles a follower's load (law 7). A source's loadSubset\n // must await every commit receipt that establishes its result, so the\n // leader broadcasts those commits before it replies on the same channel.\n // They are already queued on the apply mutex; settle after they show here.\n private async applyLeaderCommitsBeforeReply(\n options: LoadSubsetOptions,\n ): Promise<void> {\n try {\n // Commits kept while the claim was expired apply after it is active.\n if (this.hasExpiredCacheClaim() || this.cacheClaimRecovery) {\n await this.ensureCacheClaimActive()\n }\n await this.applyMutex.run(() => this.flushQueuedTxCommittedUnsafe())\n // A broadcast that failed to apply made the runtime terminal; its rows\n // are not visible, so the load must not settle successfully.\n this.throwIfTerminal()\n } catch (error) {\n // A terminal runtime releases the acquisition the owner granted the\n // load. Otherwise, as after a failed ensure, the demand retries.\n if (this.getCurrentTerminalFailure()) this.unloadSubset(options)\n else this.queueRemoteSubsetEnsure(options)\n throw error\n }\n }\n\n private clearSyncControls(): void {\n this.syncControls = {\n begin: null,\n write: null,\n commit: null,\n truncate: null,\n metadata: null,\n markError: null,\n }\n }\n\n isHydratingNow(): boolean {\n return this.hydratingGeneration === this.lifecycleGeneration\n }\n\n getActiveHydrationContext(): { suppliedRowKeys: Set<TKey> } | undefined {\n return this.activeHydrationContext\n }\n\n getHydrationSequence(): number {\n return this.hydrationSequence\n }\n\n getCurrentTerminalFailure(): { error: unknown } | undefined {\n const failure = this.terminalFailure\n return failure?.lifecycleGeneration === this.lifecycleGeneration\n ? failure\n : undefined\n }\n\n getLifecycleGeneration(): number {\n return this.lifecycleGeneration\n }\n\n private throwIfLifecycleReplaced(lifecycleGeneration: number): void {\n if (lifecycleGeneration !== this.lifecycleGeneration) {\n throw new SyncTransactionAbortedError()\n }\n }\n\n private throwIfTerminal(): void {\n const failure = this.getCurrentTerminalFailure()\n if (failure) throw failure.error\n }\n\n private markTerminalFailure(\n error: unknown,\n lifecycleGeneration = this.lifecycleGeneration,\n ): unknown {\n if (lifecycleGeneration !== this.lifecycleGeneration) {\n return error\n }\n\n const existing = this.getCurrentTerminalFailure()\n if (existing) {\n return existing.error\n }\n\n this.terminalFailure = { lifecycleGeneration, error }\n this.persistedReadiness?.set({ status: `error`, error })\n this.pendingRemoteSubsetEnsures.clear()\n this.queuedTxCommitted.length = 0\n if (this.remoteEnsureRetryTimer !== null) {\n clearTimeout(this.remoteEnsureRetryTimer)\n this.remoteEnsureRetryTimer = null\n }\n this.rejectQueuedHydrationTransactions(error)\n this.reportSyncError(error)\n return error\n }\n\n isApplyingInternally(): boolean {\n return this.internalApplyDepth > 0\n }\n\n isScopedRecoveryPending(): boolean {\n return this.scopedRecoveryPending\n }\n\n hasBoundCollection(): boolean {\n return this.boundCollection !== null\n }\n\n setCollection(\n collection: Collection<T, TKey, PersistedCollectionUtils>,\n syncControls: SyncControlFns<T, TKey>,\n ): void {\n if (\n (\n collection.config as typeof collection.config & {\n [collectionOptionsClaim]?: unknown\n }\n )[collectionOptionsClaim] !== this.optionsClaim\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `Persisted sync belongs to its options Collection`,\n )\n }\n if (this.boundCollection && this.boundCollection !== collection) {\n throw new InvalidPersistedCollectionConfigError(\n `Persisted options cannot own more than one Collection`,\n )\n }\n\n const previousCollection = this.collection\n const previousControls = this.syncControls\n this.setSyncControls(syncControls)\n if (this.collection === collection) {\n this.boundCollection ??= collection\n return\n }\n this.collection = collection\n try {\n if (\n !this.persistence.adapter.claimCacheGeneration ||\n this.mode !== `sync-present` ||\n this.syncMode !== `on-demand`\n ) {\n this.attachCoordinatorSubscription()\n }\n } catch (error) {\n this.collection = previousCollection\n this.syncControls = previousControls\n throw error\n }\n this.boundCollection ??= collection\n }\n\n getLeadershipState(): PersistedCollectionLeadershipState {\n return {\n nodeId: this.persistence.coordinator.getNodeId(),\n isLeader: this.persistence.coordinator.isLeader(this.storageCollectionId),\n }\n }\n\n private runInHydrationScope<TResult>(\n task: (adapter: HydrationPersistenceAdapter) => Promise<TResult>,\n adapter: HydrationPersistenceAdapter = this.persistence.adapter,\n ): Promise<TResult> {\n if (adapter.runInHydrationScope) {\n return adapter.runInHydrationScope(task)\n }\n return Promise.resolve().then(() => task(adapter))\n }\n\n async ensureStarted(): Promise<void> {\n this.throwIfTerminal()\n if (this.startPromise) {\n return this.startPromise\n }\n\n const lifecycleGeneration = this.lifecycleGeneration\n this.startupCacheGenerationRotated = false\n const isRestart = this.hasAttemptedStartup\n this.hasAttemptedStartup = true\n let resolveStartupMetadata!: () => void\n let rejectStartupMetadata!: (error: unknown) => void\n this.startupMetadataPromise = new Promise<void>((resolve, reject) => {\n resolveStartupMetadata = resolve\n rejectStartupMetadata = reject\n })\n void this.startupMetadataPromise.catch(() => undefined)\n\n this.startPromise = (async () => {\n await this.claimCacheGeneration(lifecycleGeneration)\n if (lifecycleGeneration !== this.lifecycleGeneration) {\n resolveStartupMetadata()\n return\n }\n let metadataExpired = false\n const loadStartupMetadata = async (\n adapter: HydrationPersistenceAdapter,\n ) => {\n if (lifecycleGeneration !== this.lifecycleGeneration) {\n resolveStartupMetadata()\n return false\n }\n\n try {\n if (\n !(await this.loadStartupMetadataInternal(\n lifecycleGeneration,\n adapter,\n ))\n ) {\n metadataExpired = true\n return false\n }\n return lifecycleGeneration === this.lifecycleGeneration\n } catch (error) {\n // SQLite can reject its second claim check after a startup read\n // entered with a live claim. That old cache cannot authorize source\n // entry; rotate it after the hydration scope releases its scheduler.\n if (this.cacheGenerationClaim && this.hasExpiredCacheClaim()) {\n metadataExpired = true\n return false\n }\n rejectStartupMetadata(error)\n throw error\n }\n }\n\n let startup:\n | {\n appliedCursor: number | undefined\n indexBootstrapSnapshot: Array<CollectionIndexMetadata>\n completedLocalIndexSignatures: Set<string>\n }\n | undefined\n const scheduleStartupAsOneHydrate =\n this.persistence.adapter.runInHydrationScope !== undefined &&\n (!isRestart ||\n (this.persistence.adapter.isHydrationScopeScheduled?.() ?? true))\n for (;;) {\n metadataExpired = false\n const storageAtAttempt = this.storageCollectionId\n if (scheduleStartupAsOneHydrate) {\n startup = await this.applyMutex.run(async () => {\n const result = await this.runInHydrationScope(async (adapter) => {\n if (!(await loadStartupMetadata(adapter))) return undefined\n return this.startInternal(\n lifecycleGeneration,\n adapter,\n resolveStartupMetadata,\n )\n })\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n return result\n })\n } else {\n // Preserve the existing unscheduled-adapter lifecycle contract: a\n // replacement upstream may start while stale hydration is settling.\n if (await loadStartupMetadata(this.persistence.adapter)) {\n if (this.persistence.adapter.isHydrationScopeScheduled?.()) {\n startup = await this.applyMutex.run(async () => {\n const result = await this.runInHydrationScope((adapter) =>\n this.startInternal(\n lifecycleGeneration,\n adapter,\n resolveStartupMetadata,\n ),\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n return result\n })\n } else {\n startup = await this.startInternal(\n lifecycleGeneration,\n this.persistence.adapter,\n resolveStartupMetadata,\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n }\n }\n }\n if (\n this.cacheGenerationClaim &&\n this.syncMode === `on-demand` &&\n // Hydration may have changed this through loadStartupMetadata().\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n !metadataExpired\n ) {\n // Source entry must wait until any private rotation started during\n // index bootstrap has settled. The source has no restart capability\n // until its sync callback returns.\n await this.ensureCacheClaimActive()\n metadataExpired = storageAtAttempt !== this.storageCollectionId\n }\n if (!metadataExpired) break\n // A startup read cannot reacquire the claim inside its hydration\n // scope: claim acquisition uses the regular scheduler lane.\n await this.ensureCacheClaimActive()\n if (lifecycleGeneration !== this.lifecycleGeneration) {\n resolveStartupMetadata()\n return\n }\n }\n if (\n this.cacheGenerationClaim &&\n this.syncMode === `on-demand` &&\n lifecycleGeneration === this.lifecycleGeneration\n ) {\n resolveStartupMetadata()\n }\n if (\n startup !== undefined &&\n lifecycleGeneration === this.lifecycleGeneration\n ) {\n await this.requestCoordinatorPersistedIndexes(\n startup.indexBootstrapSnapshot,\n startup.completedLocalIndexSignatures,\n )\n if (\n startup.appliedCursor !== undefined &&\n lifecycleGeneration === this.lifecycleGeneration\n ) {\n await this.waitForAppliedReceiptsAfter(\n startup.appliedCursor,\n `accepted`,\n )\n }\n }\n if (lifecycleGeneration === this.lifecycleGeneration) {\n this.startupSettled = true\n this.persistedReadiness?.set({ status: `ready` })\n }\n resolveStartupMetadata()\n })().catch((error) => {\n rejectStartupMetadata(error)\n throw this.markTerminalFailure(error, lifecycleGeneration)\n })\n void this.startPromise.catch(() => undefined)\n return this.startPromise\n }\n\n ensureResumeBaselineHydrated(): Promise<void> {\n this.throwIfTerminal()\n if (this.resumeBaselinePromise) {\n return this.resumeBaselinePromise\n }\n\n const lifecycleGeneration = this.lifecycleGeneration\n this.resumeBaselinePromise = (async () => {\n await this.ensureStarted()\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n if (this.syncMode !== `on-demand`) return\n if (this.scopedRecovery) return\n\n const appliedCursor = await this.applyMutex.run(async () => {\n const result = await this.runInHydrationScope((adapter) =>\n this.hydrateBaseline(lifecycleGeneration, adapter),\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n return result\n })\n if (appliedCursor === false) {\n // Rotation needs the apply mutex, so recover only after releasing it.\n await this.ensureCacheClaimActive()\n return\n }\n if (\n appliedCursor !== undefined &&\n lifecycleGeneration === this.lifecycleGeneration\n ) {\n await this.waitForAppliedReceiptsAfter(appliedCursor, `accepted`)\n }\n })().catch((error) => {\n throw this.markTerminalFailure(error, lifecycleGeneration)\n })\n return this.resumeBaselinePromise\n }\n\n ensureResumeBaselineCertified(): Promise<void> {\n if (this.resumeCertificationPromise) {\n return this.resumeCertificationPromise\n }\n\n const lifecycleGeneration = this.lifecycleGeneration\n this.resumeCertificationPromise = (async () => {\n await this.ensureStarted()\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n if (this.scopedRecovery) return\n\n const storageCollectionId = this.storageCollectionId\n const claimId = this.cacheGenerationClaim?.claimId\n const certificationIsCurrent = () =>\n lifecycleGeneration === this.lifecycleGeneration &&\n !this.scopedRecovery &&\n storageCollectionId === this.storageCollectionId &&\n claimId === this.cacheGenerationClaim?.claimId\n let snapshot: Awaited<\n ReturnType<PersistenceAdapter[`loadResumeSnapshot`]>\n >\n try {\n snapshot = await this.persistence.adapter.loadResumeSnapshot(\n this.storageTargetFor(storageCollectionId, claimId),\n {\n requiredIndexSignatures: this.getRequiredIndexSignatures(),\n includeRows: false,\n cacheGenerationClaimId: claimId,\n },\n )\n } catch (error) {\n if (!certificationIsCurrent()) return\n if (!claimId || !this.hasExpiredCacheClaim()) throw error\n await this.ensureCacheClaimActive()\n return\n }\n if (!certificationIsCurrent()) return\n if (claimId && !(await this.renewCacheClaim(this.persistence.adapter))) {\n await this.ensureCacheClaimActive()\n return\n }\n if (!certificationIsCurrent()) return\n this.bindResumeSnapshotEvidence(snapshot)\n })()\n return this.resumeCertificationPromise\n }\n\n getKeySetEvidence(): PersistedKeySetEvidence | undefined {\n return this.persistedKeySetEvidence\n }\n\n hasManagedCacheGeneration(): boolean {\n return this.cacheGenerationClaim !== undefined\n }\n\n hasRotatedStartupCacheGeneration(): boolean {\n return this.startupCacheGenerationRotated\n }\n\n async startScopedRecovery(resetMetadata?: {\n key: string\n value: unknown\n }): Promise<void> {\n this.throwIfTerminal()\n this.clearCacheClaimRenewal()\n const lifecycleGeneration = this.lifecycleGeneration\n const restartSource = this.restartSourceAfterScopedRecovery\n // Invalidate an in-flight old-cache read before yielding to the mutex.\n this.scopedRecovery = true\n this.scopedRecoveryPending = true\n const recoverySequence = ++this.scopedRecoverySequence\n this.hydratedDemands.clear()\n this.resetSequence++\n let resolveCacheRotated: (() => void) | undefined\n let rejectCacheRotated: ((error: unknown) => void) | undefined\n let sourceRestart: Promise<void> | undefined\n try {\n if (restartSource) {\n const cacheRotated = new Promise<void>((resolve, reject) => {\n resolveCacheRotated = resolve\n rejectCacheRotated = reject\n })\n void cacheRotated.catch(() => undefined)\n // The source must retire old callbacks before this call returns.\n sourceRestart = Promise.resolve(restartSource(cacheRotated))\n void sourceRestart.catch(() => undefined)\n }\n await this.applyMutex.run(async () => {\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n const claim = this.cacheGenerationClaim\n if (claim && this.persistence.adapter.rotateCacheGeneration) {\n const previousStorageId = claim.storageCollectionId\n const rotated = await this.persistence.adapter.rotateCacheGeneration(\n this.collectionId,\n claim.claimId,\n resetMetadata,\n previousStorageId,\n )\n if (lifecycleGeneration !== this.lifecycleGeneration) {\n // Cleanup released the old claim while rotation was in flight.\n // The returned claim belongs to this abandoned recovery too.\n await this.persistence.adapter.releaseCacheGenerationClaim?.(\n rotated.claimId,\n )\n throw new SyncTransactionAbortedError()\n }\n for (const options of this.activeSubsets.values()) {\n // The retired generation has a separate coordinator route. A\n // paused old leader cannot hold up the new cache's demands.\n void this.persistence.coordinator\n .requestReleaseRemoteSubset(\n previousStorageId,\n this.rotatedAcquisitions.get(options) ?? options,\n )\n .catch(() => undefined)\n if (options.signal?.aborted) {\n this.rotatedAcquisitions.delete(options)\n continue\n }\n this.rotatedAcquisitions.set(options, {\n ...options,\n refetch: true,\n })\n }\n this.remoteSubsetOwnerUnsubscribe?.()\n this.remoteSubsetOwnerUnsubscribe = null\n this.coordinatorUnsubscribe?.()\n this.coordinatorUnsubscribe = null\n this.cacheGenerationClaim = rotated\n this.latestTerm = 0\n this.latestSeq = 0\n this.latestRowVersion = 0\n this.publicRowVersion = 0\n this.resetTermFence = undefined\n this.localTerm = 1\n this.localSeq = 0\n this.localRowVersion = 0\n this.queuedTxCommitted.length = 0\n this.persistedResumeGeneration = undefined\n this.persistedKeySetEvidence = { status: `incompatible` }\n this.resumeCertificationPromise = null\n this.resumeGenerationOwner = Symbol(\n `persisted resume generation owner`,\n )\n this.attachCoordinatorSubscription()\n if (this.remoteSubsetOwner) {\n this.registerRemoteSubsetOwner(this.remoteSubsetOwner)\n }\n }\n if (this.syncControls.begin && this.syncControls.commit) {\n const applied = this.withInternalApply(() => {\n this.syncControls.begin?.()\n this.syncControls.truncate?.({ markReady: false })\n if (resetMetadata) {\n this.syncControls.metadata?.collection.set(\n resetMetadata.key,\n resetMetadata.value,\n )\n }\n return this.syncControls.commit?.() ?? true\n })\n await whenSyncAccepted(applied)\n if (\n !this.cacheGenerationClaim &&\n recoverySequence === this.scopedRecoverySequence\n ) {\n this.scopedRecoveryPending = false\n }\n await this.runInHydrationScope(async (adapter) => {\n if (this.recoverQueuedAfterLocalLoadFailure) {\n this.recoverQueuedAfterLocalLoadFailure = false\n await this.recoverBufferedTransactionsAfterLocalLoadFailureUnsafe(\n lifecycleGeneration,\n adapter,\n )\n } else {\n await this.flushQueuedHydrationTransactionsUnsafe(adapter)\n }\n })\n await this.flushQueuedTxCommittedUnsafe()\n }\n if (recoverySequence === this.scopedRecoverySequence) {\n // Older overlapping rotations leave quarantine in place. The final\n // rotation rebuilds the current index registry before releasing the\n // mutex; later index events can then target only its storage ID.\n this.scopedRecoveryPending = false\n if (this.cacheGenerationClaim) {\n const currentIndexes = this.collection?.getIndexMetadata() ?? []\n const completedIndexes = await this.bootstrapPersistedIndexes(\n currentIndexes,\n this.persistence.adapter,\n )\n await this.requestCoordinatorPersistedIndexes(\n currentIndexes,\n completedIndexes,\n )\n }\n }\n })\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n resolveCacheRotated?.()\n await sourceRestart\n if (\n recoverySequence === this.scopedRecoverySequence &&\n this.cacheGenerationClaim\n ) {\n this.scheduleCacheClaimRenewal(this.cacheGenerationClaim)\n }\n // A newer rotation owns reacquisition of the active demands. Dispatching\n // them from this older recovery would fetch against its pending cache.\n if (recoverySequence !== this.scopedRecoverySequence) return\n for (const options of this.activeSubsets.values()) {\n if (options.signal?.aborted) continue\n const rotatedOptions = this.rotatedAcquisitions.get(options)\n if (rotatedOptions) {\n const ensure = this.persistence.coordinator.requestEnsureRemoteSubset(\n this.storageCollectionId,\n rotatedOptions,\n )\n this.rotatedEnsures.set(options, ensure)\n void ensure.catch((error) => this.reportSyncError(error))\n } else {\n this.refreshScopedSubsets()\n break\n }\n }\n } catch (error) {\n rejectCacheRotated?.(error)\n throw this.markTerminalFailure(error, lifecycleGeneration)\n }\n }\n\n getResumeGenerationOwner(): symbol {\n return this.resumeGenerationOwner\n }\n\n private async hydrateBaseline(\n lifecycleGeneration: number,\n adapter: HydrationPersistenceAdapter,\n ): Promise<number | undefined | false> {\n if (lifecycleGeneration !== this.lifecycleGeneration) return undefined\n\n // The baseline shares the unconstrained demand key. Its lease is never\n // released, and every reload rereads it, so that coverage stays valid.\n const baseline = {}\n this.activeSubsets.set(this.getSubsetKey(baseline), baseline)\n const appliedCursor = this.appliedReceiptSequence\n const hydrated = await this.hydrateSubsetUnsafe(\n baseline,\n {\n lifecycleGeneration,\n bindKeySetEvidence: true,\n },\n adapter,\n )\n if (!hydrated) return false\n return lifecycleGeneration === this.lifecycleGeneration\n ? appliedCursor\n : undefined\n }\n\n async ensureStartupMetadataLoaded(): Promise<void> {\n this.throwIfTerminal()\n if (this.startupMetadataPromise) {\n return this.startupMetadataPromise\n }\n\n void this.ensureStarted()\n return this.startupMetadataPromise!\n }\n\n private async startInternal(\n lifecycleGeneration: number,\n adapter: HydrationPersistenceAdapter,\n onStartupMetadataLoaded: () => void,\n ): Promise<\n | {\n appliedCursor: number | undefined\n indexBootstrapSnapshot: Array<CollectionIndexMetadata>\n completedLocalIndexSignatures: Set<string>\n }\n | undefined\n > {\n if (lifecycleGeneration !== this.lifecycleGeneration) return undefined\n\n const indexBootstrapSnapshot = this.collection?.getIndexMetadata() ?? []\n this.attachIndexLifecycleListeners()\n const completedLocalIndexSignatures = await this.bootstrapPersistedIndexes(\n indexBootstrapSnapshot,\n adapter,\n )\n if (lifecycleGeneration !== this.lifecycleGeneration) return undefined\n\n // Eager and unmanaged sources start at the hydrate boundary so their first\n // transaction binds to its sequence. A managed on-demand source waits\n // until the scope exits and any concurrent private rotation settles.\n if (!this.cacheGenerationClaim || this.syncMode !== `on-demand`) {\n onStartupMetadataLoaded()\n }\n const appliedCursor =\n this.syncMode !== `on-demand`\n ? await this.hydrateBaseline(lifecycleGeneration, adapter)\n : undefined\n return lifecycleGeneration === this.lifecycleGeneration\n ? {\n appliedCursor: appliedCursor === false ? undefined : appliedCursor,\n indexBootstrapSnapshot,\n completedLocalIndexSignatures,\n }\n : undefined\n }\n\n private async loadStartupMetadataInternal(\n lifecycleGeneration: number,\n adapter: HydrationPersistenceAdapter,\n ): Promise<boolean> {\n const claimId = this.cacheGenerationClaim?.claimId\n const storageCollectionId = this.storageCollectionId\n const snapshot = await adapter.loadResumeSnapshot(\n this.storageTargetFor(storageCollectionId, claimId),\n {\n includeRows: false,\n cacheGenerationClaimId: claimId,\n },\n )\n if (lifecycleGeneration !== this.lifecycleGeneration) return false\n if (claimId !== this.cacheGenerationClaim?.claimId) return false\n if (storageCollectionId !== this.storageCollectionId) return false\n if (claimId && !(await this.renewCacheClaim(adapter))) return false\n if (lifecycleGeneration !== this.lifecycleGeneration) return false\n if (claimId !== this.cacheGenerationClaim?.claimId) return false\n if (storageCollectionId !== this.storageCollectionId) return false\n this.persistedResumeGeneration = this.getResumeSnapshotGeneration(snapshot)\n this.persistedKeySetEvidence = snapshot.keySet\n this.observeStreamPosition(\n snapshot.latestTerm,\n snapshot.latestSeq,\n snapshot.latestRowVersion,\n )\n const applied = this.replaceCollectionMetadataSnapshot(\n snapshot.collectionMetadata,\n )\n await whenSyncAccepted(applied)\n return true\n }\n\n private async loadCollectionMetadataSnapshot(\n adapter: HydrationPersistenceAdapter,\n ): Promise<Array<{ key: string; value: unknown }>> {\n if (!adapter.loadCollectionMetadata) {\n return []\n }\n\n return adapter.loadCollectionMetadata(this.storageTargetFor(), {\n cacheGenerationClaimId: this.cacheGenerationClaim?.claimId,\n })\n }\n\n private replaceCollectionMetadataSnapshot(\n collectionMetadata: Array<{ key: string; value: unknown }>,\n ): SyncAppliedReceipt {\n if (\n !this.syncControls.begin ||\n !this.syncControls.commit ||\n !this.syncControls.metadata\n ) {\n return true\n }\n\n return this.withInternalApply(() => {\n this.syncControls.begin?.()\n this.applyCollectionMetadataSnapshot(collectionMetadata)\n return this.syncControls.commit?.() ?? true\n })\n }\n\n private applyCollectionMetadataSnapshot(\n collectionMetadata: Array<{ key: string; value: unknown }>,\n ): void {\n const metadata = this.syncControls.metadata\n if (!metadata) return\n const next = new Map(\n collectionMetadata.map(({ key, value }) => [key, value]),\n )\n for (const { key } of metadata.collection.list()) {\n if (!next.has(key)) metadata.collection.delete(key)\n }\n for (const [key, value] of next) metadata.collection.set(key, value)\n }\n\n async loadSubset(\n options: LoadSubsetOptions,\n upstreamLoadSubset?: LoadSubsetFn,\n onHydrationStarted?: () => void,\n isDemandRetained?: () => boolean,\n ): Promise<void> {\n this.throwIfTerminal()\n await this.ensureCacheClaimActive()\n // The caller can retire demand while claim renewal or rotation is awaited.\n // No acquisition may start after that retirement.\n if (options.signal?.aborted || (isDemandRetained && !isDemandRetained()))\n return\n const lifecycleGeneration = this.lifecycleGeneration\n const subsetKey = this.getSubsetKey(options)\n const truncateGeneration = this.sourceTruncateGeneration\n const routeRemoteDemandDuringHydration =\n this.canRouteRemoteDemandThroughCoordinator()\n // Wire admission failures are permanent input errors, not transport retries.\n if (routeRemoteDemandDuringHydration) validateRemoteSubsetOptions(options)\n this.activeSubsets.set(subsetKey, options)\n const appliedCursor = this.appliedReceiptSequence\n try {\n const hydrated = await this.applyMutex.run(\n async (): Promise<boolean | `aborted`> => {\n if (options.signal?.aborted) return `aborted`\n try {\n return await this.runInHydrationScope<boolean | `aborted`>(\n (adapter) => {\n if (options.signal?.aborted) {\n return Promise.resolve(`aborted`)\n }\n onHydrationStarted?.()\n return this.hydrateSubsetUnsafe(\n options,\n {\n lifecycleGeneration,\n requestLocalLoadFailure: true,\n rejectBufferedReplayFailure: true,\n },\n adapter,\n )\n },\n )\n } finally {\n if (\n lifecycleGeneration === this.lifecycleGeneration &&\n !this.getCurrentTerminalFailure()\n ) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n }\n },\n )\n if (hydrated === `aborted`) {\n if (this.activeSubsets.get(subsetKey) === options) {\n this.activeSubsets.delete(subsetKey)\n }\n return\n }\n if (!hydrated) {\n // The old cache read is discarded. Recovery reacquires this retained\n // demand under the new storage ID, so await that acquisition rather\n // than starting another source request with old request data.\n await this.ensureCacheClaimActive()\n const rotatedOptions = this.rotatedAcquisitions.get(options)\n if (\n rotatedOptions &&\n this.activeSubsets.get(subsetKey) === options &&\n !options.signal?.aborted\n ) {\n await (this.rotatedEnsures.get(options) ??\n this.persistence.coordinator.requestEnsureRemoteSubset(\n this.storageCollectionId,\n rotatedOptions,\n ))\n await this.applyLeaderCommitsBeforeReply(options)\n }\n return\n }\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n await this.waitForAppliedReceiptsAfter(appliedCursor)\n // Leadership can change while hydration waits. Validate newly remote\n // demand inside the admission cleanup boundary, before retry can own it.\n if (\n !routeRemoteDemandDuringHydration &&\n this.canRouteRemoteDemandThroughCoordinator()\n ) {\n validateRemoteSubsetOptions(options)\n }\n } catch (error) {\n if (this.activeSubsets.get(subsetKey) === options) {\n this.activeSubsets.delete(subsetKey)\n }\n throw error\n }\n\n if (\n options.signal?.aborted ||\n this.activeSubsets.get(this.getSubsetKey(options)) !== options\n ) {\n if (\n options.signal?.aborted &&\n this.activeSubsets.get(subsetKey) === options\n ) {\n this.activeSubsets.delete(subsetKey)\n }\n return\n }\n\n if (this.canRouteRemoteDemandThroughCoordinator()) {\n try {\n await this.persistence.coordinator.requestEnsureRemoteSubset(\n this.storageCollectionId,\n this.rotatedAcquisitions.get(options) ?? options,\n )\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 this.queueRemoteSubsetEnsure(options)\n throw error\n }\n await this.applyLeaderCommitsBeforeReply(options)\n return\n }\n\n if (\n truncateGeneration === this.sourceTruncateGeneration &&\n this.activeSubsets.get(subsetKey) === options\n ) {\n this.hydratedDemands.add(getLoadSubsetDemandKey(options))\n }\n\n if (upstreamLoadSubset) {\n try {\n await upstreamLoadSubset(options)\n } catch (error) {\n this.noteUpstreamLoadFailure(options, error)\n throw error\n }\n }\n }\n\n loadHydratedSubset(\n options: LoadSubsetOptions,\n upstreamLoadSubset?: LoadSubsetFn,\n ): true | Promise<void> | undefined {\n const failure = this.getCurrentTerminalFailure()\n if (failure) return Promise.reject(failure.error)\n if (\n this.hasExpiredCacheClaim() ||\n !this.startupSettled ||\n this.isHydratingNow() ||\n this.canRouteRemoteDemandThroughCoordinator() ||\n options.refetch === true ||\n !this.hydratedDemands.has(getLoadSubsetDemandKey(options))\n ) {\n return\n }\n\n this.activeSubsets.set(this.getSubsetKey(options), options)\n let result: true | Promise<void>\n try {\n result = upstreamLoadSubset?.(options) ?? true\n } catch (error) {\n this.noteUpstreamLoadFailure(options, error)\n return Promise.reject(error)\n }\n if (result === true) {\n return true\n }\n\n return result.then(\n () => {\n this.queueRemoteSubsetEnsure(options)\n },\n (error: unknown) => {\n this.noteUpstreamLoadFailure(options, error)\n throw error\n },\n )\n }\n\n private noteUpstreamLoadFailure(\n options: LoadSubsetOptions,\n error: unknown,\n ): void {\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 return\n }\n console.warn(`Failed to trigger remote subset load:`, error)\n this.queueRemoteSubsetEnsure(options)\n }\n\n noteSourceTruncate(): void {\n this.sourceTruncateGeneration++\n this.hydratedDemands.clear()\n }\n\n unloadSubset(\n options: LoadSubsetOptions,\n upstreamUnloadSubset?: (options: LoadSubsetOptions) => void,\n ): void {\n const subsetKey = this.getSubsetKey(options)\n this.activeSubsets.delete(subsetKey)\n this.pendingRemoteSubsetEnsures.delete(subsetKey)\n const remoteOptions = this.rotatedAcquisitions.get(options) ?? options\n this.rotatedAcquisitions.delete(options)\n const demandKey = getLoadSubsetDemandKey(options)\n const stillActive = Array.from(this.activeSubsets.values()).some(\n (active) => getLoadSubsetDemandKey(active) === demandKey,\n )\n if (!stillActive) this.hydratedDemands.delete(demandKey)\n if (this.mode === `sync-present`) {\n void this.persistence.coordinator\n .requestReleaseRemoteSubset(this.storageCollectionId, remoteOptions)\n .catch((error) => {\n this.reportSyncError(error)\n })\n }\n if (upstreamUnloadSubset) {\n try {\n const result = (\n upstreamUnloadSubset as unknown as (\n options: LoadSubsetOptions,\n ) => unknown\n )(options)\n void Promise.resolve(result).catch((error) => {\n this.reportSyncError(error)\n })\n } catch (error) {\n this.reportSyncError(error)\n }\n }\n }\n\n async forceReloadSubset(options: LoadSubsetOptions): Promise<void> {\n this.throwIfTerminal()\n await this.ensureCacheClaimActive()\n const lifecycleGeneration = this.lifecycleGeneration\n // A one-shot refresh does not acquire an enduring subscription lease.\n const hydrated = await this.applyMutex.run(async () => {\n const result = await this.runInHydrationScope((adapter) =>\n this.hydrateSubsetUnsafe(\n options,\n {\n lifecycleGeneration,\n rejectBufferedReplayFailure: true,\n },\n adapter,\n ),\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n return result\n })\n if (!hydrated) await this.ensureCacheClaimActive()\n }\n\n queueHydrationBufferedTransaction(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): void {\n const failure = this.getCurrentTerminalFailure()\n if (failure) {\n transaction.rejectApplied?.(failure.error)\n return\n }\n transaction.admittedStorageCollectionId = this.storageCollectionId\n this.queuedHydrationTransactions.push(transaction)\n }\n\n applyHydrationBufferedTransaction(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): Promise<void> {\n const failure = this.getCurrentTerminalFailure()\n if (failure) return Promise.reject(failure.error)\n transaction.admittedStorageCollectionId = this.storageCollectionId\n return this.applyMutex.run(async () => {\n await this.applyBufferedSyncTransactionUnsafe(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 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 operation: {\n type: `delete`,\n key,\n value: previousValue,\n },\n }\n }\n\n const key = this.collection.getKeyFromItem(message.value)\n return {\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 lifecycleGeneration = this.lifecycleGeneration,\n ): Promise<void> {\n this.throwIfTerminal()\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n if (mutations.length === 0) {\n return\n }\n\n try {\n await this.applyMutex.run(async () => {\n // Startup metadata establishes the durable term/sequence boundary. A\n // mutation admitted before it resolves must wait rather than allocate a\n // default position that can collide with an already-applied transaction.\n await this.ensureStartupMetadataLoaded()\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n const acceptedMutationIds = await this.persistCollectionMutationsUnsafe(\n mutations,\n lifecycleGeneration,\n )\n this.throwIfLifecycleReplaced(lifecycleGeneration)\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 try {\n await this.confirmMutationsSyncUnsafe(acceptedMutations)\n } catch (error) {\n throw this.markTerminalFailure(error, lifecycleGeneration)\n }\n })\n } catch (error) {\n if (error instanceof PersistedCollectionDurabilityError) {\n throw this.markTerminalFailure(error, lifecycleGeneration)\n }\n throw error\n }\n }\n\n async acceptTransactionMutations(transaction: {\n mutations: Array<PendingMutation<Record<string, unknown>>>\n }): Promise<void> {\n this.throwIfTerminal()\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(): Promise<void> {\n this.advanceLifecycle()\n const remoteReleases: Array<Promise<void>> = []\n const failures: Array<unknown> = []\n const attempt = (callback: () => void): void => {\n try {\n callback()\n } catch (error) {\n failures.push(error)\n }\n }\n\n if (this.mode === `sync-present`) {\n for (const options of this.activeSubsets.values()) {\n attempt(() => {\n remoteReleases.push(\n this.persistence.coordinator\n .requestReleaseRemoteSubset(\n this.storageCollectionId,\n this.rotatedAcquisitions.get(options) ?? options,\n )\n .catch((error) => {\n this.reportSyncError(error)\n }),\n )\n })\n }\n }\n\n attempt(() => this.coordinatorUnsubscribe?.())\n this.coordinatorUnsubscribe = null\n\n attempt(() => this.remoteSubsetOwnerUnsubscribe?.())\n this.remoteSubsetOwnerUnsubscribe = null\n this.remoteSubsetOwner = undefined\n\n attempt(() => this.indexAddedUnsubscribe?.())\n this.indexAddedUnsubscribe = null\n\n attempt(() => 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.rotatedAcquisitions.clear()\n for (const [options, storageId] of this.scopedRefreshes) {\n remoteReleases.push(\n this.persistence.coordinator.requestReleaseRemoteSubset(\n storageId,\n options,\n ),\n )\n }\n this.scopedRefreshes.clear()\n this.activeSubsets.clear()\n this.hydratedDemands.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 this.collection = null\n const claim = this.cacheGenerationClaim\n this.cacheGenerationClaim = undefined\n this.clearCacheClaimRenewal()\n this.cacheClaimRecovery = null\n if (claim && this.persistence.adapter.releaseCacheGenerationClaim) {\n remoteReleases.push(\n this.persistence.adapter.releaseCacheGenerationClaim(claim.claimId),\n )\n }\n return Promise.all(remoteReleases).then(() => {\n if (failures.length === 1) throw failures[0]\n if (failures.length > 1) {\n throw new AggregateError(failures, `Persistence cleanup failed`, {\n cause: failures[0],\n })\n }\n })\n }\n\n private advanceLifecycle(): void {\n this.lifecycleGeneration++\n this.clearCacheClaimRenewal()\n this.cacheClaimRecovery = null\n this.scopedRecovery = false\n this.scopedRecoveryPending = false\n this.scopedRecoverySequence++\n this.recoverQueuedAfterLocalLoadFailure = false\n this.persistedReadiness?.set({ status: `loading` })\n this.startupSettled = false\n this.publicRowVersion = 0\n this.resetTermFence = undefined\n this.hydratedDemands.clear()\n this.startupMetadataPromise = null\n this.startPromise = null\n this.resumeBaselinePromise = null\n this.terminalFailure = undefined\n this.resumeCertificationPromise = null\n this.persistedKeySetEvidence = undefined\n this.persistedResumeGeneration = undefined\n this.resumeGenerationOwner = Symbol(`persisted resume generation owner`)\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 adapter: HydrationPersistenceAdapter,\n ): Promise<Array<{ key: TKey; value: T; metadata?: unknown }>> {\n if (this.scopedRecovery) return Promise.resolve([])\n return adapter.loadSubset(this.storageTargetFor(), options, {\n requiredIndexSignatures: this.getRequiredIndexSignatures(),\n cacheGenerationClaimId: this.cacheGenerationClaim?.claimId,\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(this.storageTargetFor(), options, {\n cacheGenerationClaimId: this.cacheGenerationClaim?.claimId,\n }) as Promise<Array<PersistedScannedRow<T, TKey>>>\n }\n\n async scanPersistedRows(\n options?: PersistedRowScanOptions,\n ): Promise<Array<PersistedScannedRow<T, TKey>>> {\n for (;;) {\n this.throwIfTerminal()\n await this.ensureCacheClaimActive()\n const claimId = this.cacheGenerationClaim?.claimId\n const storageCollectionId = this.storageCollectionId\n const rows = await this.applyMutex.run(() =>\n this.scanPersistedRowsUnsafe(options),\n )\n if (this.scopedRecoveryPending) {\n throw new SyncTransactionAbortedError()\n }\n if (\n claimId !== this.cacheGenerationClaim?.claimId ||\n storageCollectionId !== this.storageCollectionId\n ) {\n continue\n }\n if (claimId && !(await this.renewCacheClaim(this.persistence.adapter))) {\n continue\n }\n return rows\n }\n }\n\n private async hydrateSubsetUnsafe(\n options: LoadSubsetOptions,\n config: {\n lifecycleGeneration: number\n bindKeySetEvidence?: boolean\n requestLocalLoadFailure?: boolean\n rejectBufferedReplayFailure?: boolean\n },\n adapter: HydrationPersistenceAdapter,\n ): Promise<boolean> {\n let rowsLoaded = false\n let boundRowVersion: number | undefined\n let replayFailure: { reason: unknown } | undefined\n const resetSequence = this.resetSequence\n this.hydrationSequence++\n const hydrationContext = { suppliedRowKeys: new Set<TKey>() }\n this.activeHydrationContext = hydrationContext\n try {\n this.throwIfTerminal()\n this.hydratingGeneration = config.lifecycleGeneration\n try {\n let rows: Array<{ key: TKey; value: T; metadata?: unknown }>\n let bindResumeSnapshot: (() => void) | undefined\n if (config.bindKeySetEvidence && !this.scopedRecovery) {\n const snapshot = await adapter.loadResumeSnapshot(\n this.storageTargetFor(),\n {\n requiredIndexSignatures: this.getRequiredIndexSignatures(),\n includeRows: true,\n cacheGenerationClaimId: this.cacheGenerationClaim?.claimId,\n },\n )\n rows = snapshot.rows as Array<{\n key: TKey\n value: T\n metadata?: unknown\n }>\n if (config.lifecycleGeneration !== this.lifecycleGeneration)\n return true\n if (resetSequence !== this.resetSequence) return true\n bindResumeSnapshot = () => this.bindResumeSnapshotEvidence(snapshot)\n boundRowVersion = snapshot.latestRowVersion\n } else {\n rows = await this.loadSubsetRowsUnsafe(options, adapter)\n }\n const complete =\n this.syncMode === `on-demand` &&\n !this.scopedRecovery &&\n options.where === undefined &&\n options.limit === undefined &&\n options.offset === undefined &&\n options.cursor === undefined\n const validationRows = complete ? rows : undefined\n rowsLoaded = true\n if (config.lifecycleGeneration !== this.lifecycleGeneration) return true\n if (resetSequence !== this.resetSequence) return true\n\n // SQLite validated the claim at read admission. A paused sync run\n // can resume after expiry before its renewal timer runs, so cached\n // rows need fresh authority before they enter the public Collection.\n if (\n this.cacheGenerationClaim &&\n !(await this.renewCacheClaim(adapter))\n ) {\n return false\n }\n if (config.lifecycleGeneration !== this.lifecycleGeneration) return true\n if (resetSequence !== this.resetSequence) return true\n bindResumeSnapshot?.()\n\n if (\n !config.bindKeySetEvidence ||\n this.persistedKeySetEvidence?.status !== `incompatible`\n ) {\n for (const row of rows) {\n hydrationContext.suppliedRowKeys.add(row.key)\n }\n const applied = this.applyRowsToCollection(rows, validationRows)\n await whenSyncAccepted(applied)\n if (boundRowVersion !== undefined) {\n this.publicRowVersion = Math.max(\n this.publicRowVersion,\n boundRowVersion,\n )\n }\n }\n } finally {\n if (\n this.activeHydrationContext === hydrationContext &&\n this.hydratingGeneration === config.lifecycleGeneration\n ) {\n this.hydratingGeneration = null\n }\n }\n\n if (config.lifecycleGeneration !== this.lifecycleGeneration) return true\n if (!this.scopedRecoveryPending) {\n replayFailure =\n await this.flushQueuedHydrationTransactionsUnsafe(adapter)\n }\n if (config.lifecycleGeneration !== this.lifecycleGeneration) return true\n } catch (error) {\n // A read admitted under a live claim may fail at the adapter's later\n // claim check after this run wakes from expiry. Its old cache has no\n // authority; the retained demand must reacquire under a new generation.\n if (\n config.requestLocalLoadFailure &&\n !rowsLoaded &&\n this.cacheGenerationClaim &&\n this.hasExpiredCacheClaim()\n ) {\n return false\n }\n if (config.requestLocalLoadFailure && !rowsLoaded) {\n if (this.scopedRecoveryPending) {\n this.recoverQueuedAfterLocalLoadFailure = true\n throw error\n }\n // Keep admitting source work to the hydration queue while recovery\n // reconstructs any persisted baseline required by partial updates.\n // The failed subset itself owns no rows, so recovery must evaluate\n // each queued transaction against the durable snapshot at its exact\n // FIFO cut instead of treating the snapshot as a successful load.\n this.hydratingGeneration = config.lifecycleGeneration\n try {\n await this.recoverBufferedTransactionsAfterLocalLoadFailureUnsafe(\n config.lifecycleGeneration,\n adapter,\n )\n } catch (baselineError) {\n const terminalError = this.markTerminalFailure(\n baselineError,\n config.lifecycleGeneration,\n )\n throw terminalError\n } finally {\n if (this.hydratingGeneration === config.lifecycleGeneration) {\n this.hydratingGeneration = null\n }\n }\n throw error\n }\n throw this.markTerminalFailure(error, config.lifecycleGeneration)\n } finally {\n if (this.activeHydrationContext === hydrationContext) {\n this.activeHydrationContext = undefined\n }\n }\n if (replayFailure && config.rejectBufferedReplayFailure) {\n throw replayFailure.reason\n }\n return true\n }\n\n private async recoverBufferedTransactionsAfterLocalLoadFailureUnsafe(\n lifecycleGeneration: number,\n adapter: HydrationPersistenceAdapter,\n ): Promise<void> {\n let snapshotRows:\n Map<TKey, { key: TKey; value: T; metadata?: unknown }> | undefined\n type RecoveryPresence = `present` | `absent` | `unknown`\n const recoveredPresence = new Map<TKey, RecoveryPresence>()\n let snapshotInvalidatedByTruncate = false\n\n while (this.queuedHydrationTransactions.length > 0) {\n const transaction = this.queuedHydrationTransactions.shift()\n if (!transaction) continue\n\n try {\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n const baselineRows = new Map<\n TKey,\n { key: TKey; value: T; metadata?: unknown }\n >()\n const transactionPresence = new Map<TKey, RecoveryPresence>()\n const transactionStartsWithTruncate = transaction.truncate\n const getPresence = (key: TKey): RecoveryPresence => {\n const known = transactionPresence.get(key)\n if (known !== undefined) return known\n if (transactionStartsWithTruncate) {\n transactionPresence.set(key, `absent`)\n return `absent`\n }\n const recovered = recoveredPresence.get(key)\n if (recovered !== undefined) {\n transactionPresence.set(key, recovered)\n return recovered\n }\n const present =\n this.collection?._hasHydratedKey(key) === true\n ? `present`\n : snapshotInvalidatedByTruncate\n ? `absent`\n : `unknown`\n transactionPresence.set(key, present)\n return present\n }\n\n if (!transaction.signal?.aborted) {\n for (const [index, operation] of transaction.operations.entries()) {\n const key = operation.key\n if (\n operation.type === `update` &&\n transaction.partialUpdateOperationIndexes.has(index) &&\n getPresence(key) === `unknown`\n ) {\n if (snapshotRows === undefined) {\n const snapshot = this.scopedRecovery\n ? undefined\n : await adapter.loadResumeSnapshot(this.storageTargetFor(), {\n requiredIndexSignatures:\n this.getRequiredIndexSignatures(),\n includeRows: true,\n cacheGenerationClaimId:\n this.cacheGenerationClaim?.claimId,\n })\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n if (transaction.signal?.aborted) break\n const rows =\n snapshot && !this.scopedRecovery\n ? (snapshot.rows as Array<{\n key: TKey\n value: T\n metadata?: unknown\n }>)\n : []\n snapshotRows = new Map(rows.map((row) => [row.key, row]))\n }\n const baseline = snapshotRows.get(key)\n if (baseline === undefined) {\n transactionPresence.set(key, `absent`)\n } else {\n baselineRows.set(key, baseline)\n transactionPresence.set(key, `present`)\n }\n }\n\n transactionPresence.set(\n key,\n operation.type === `delete` ? `absent` : `present`,\n )\n }\n\n if (baselineRows.size > 0) {\n // Fold the durable baseline into the dependent reservation. It\n // must never become a separately observable publication: the\n // partial source value and its unseen fields are one atomic row.\n if (!transaction.signal?.aborted) {\n transaction.prependHydrationRows([...baselineRows.values()])\n }\n }\n }\n\n const transactionOutcome =\n await this.applyBufferedSyncTransactionUnsafe(transaction, adapter)\n if (transactionOutcome.applied) {\n if (transaction.truncate) {\n snapshotInvalidatedByTruncate = true\n recoveredPresence.clear()\n }\n for (const operation of transaction.operations) {\n recoveredPresence.set(\n operation.key,\n operation.type === `delete` ? `absent` : `present`,\n )\n }\n }\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 rejectQueuedHydrationTransactions(error: unknown): void {\n for (const transaction of this.queuedHydrationTransactions) {\n transaction.rejectApplied?.(error)\n }\n this.queuedHydrationTransactions.length = 0\n }\n\n private applyRowsToCollection(\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n validationRows?: Array<{ key: TKey; value: T; metadata?: unknown }>,\n collectionMetadata?: Array<{ key: string; value: unknown }>,\n ): SyncAppliedReceipt {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit\n ) {\n return true\n }\n\n return this.withInternalApply(() => {\n this.syncControls.begin?.()\n\n // A full durable snapshot validates already public keys. Only the\n // requested subset may add keys to the public Collection.\n if (validationRows) {\n const durableRows = new Map(validationRows.map((row) => [row.key, row]))\n for (const key of this.collection?.base.keys() ?? []) {\n if (this.collection?._hasHydratedKey(key)) continue\n const durable = durableRows.get(key)\n if (!durable) {\n this.syncControls.write?.({ type: `delete`, key })\n } else {\n const valueChanged = !equalPersistedSnapshotValues(\n this.collection?.base.get(key),\n durable.value,\n )\n const metadataChanged = !equalPersistedSnapshotValues(\n this.syncControls.metadata?.row.get(key),\n durable.metadata,\n )\n if (\n valueChanged ||\n (metadataChanged && durable.metadata !== undefined)\n ) {\n // A persisted read supplies a complete row. In partial-update\n // mode, deleting it within this sync transaction removes fields\n // that are absent from the durable value before replacement.\n if (valueChanged) {\n this.syncControls.write?.({ type: `delete`, key })\n }\n this.syncControls.write?.({\n type: `update`,\n value: durable.value,\n metadata: durable.metadata as\n Record<string, unknown> | undefined,\n })\n }\n if (metadataChanged && durable.metadata === undefined) {\n this.syncControls.metadata?.row.delete(key)\n }\n }\n }\n for (const key of this.collection?._syncedRowMetadataKeysOutsideBase() ??\n []) {\n this.syncControls.metadata?.row.delete(key)\n }\n }\n\n for (const row of rows) {\n if (\n (validationRows && this.collection?.base.has(row.key)) ||\n this.collection?._hasHydratedKey(row.key)\n ) {\n continue\n }\n if (\n this.collection?.base.has(row.key) &&\n !equalPersistedSnapshotValues(\n this.collection.base.get(row.key),\n row.value,\n )\n ) {\n this.syncControls.write?.({ type: `delete`, key: row.key })\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 if (collectionMetadata)\n this.applyCollectionMetadataSnapshot(collectionMetadata)\n\n return this.syncControls.commit?.() ?? true\n })\n }\n\n private getResumeSnapshotGeneration(snapshot: {\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n }): PersistedResumeGeneration {\n return {\n latestTerm: snapshot.latestTerm,\n latestSeq: snapshot.latestSeq,\n latestRowVersion: snapshot.latestRowVersion,\n resetEpoch: snapshot.resetEpoch,\n }\n }\n\n private isExpectedResumeGeneration(\n generation: PersistedResumeGeneration,\n ): boolean {\n const expected = this.persistedResumeGeneration\n return (\n expected !== undefined &&\n expected.latestRowVersion === generation.latestRowVersion &&\n expected.resetEpoch === generation.resetEpoch &&\n ((expected.latestTerm === generation.latestTerm &&\n expected.latestSeq === generation.latestSeq) ||\n // A no-write election reserves a new term at sequence zero. It does\n // not change the persisted rows or the source resume cursor.\n (generation.latestTerm > expected.latestTerm &&\n generation.latestSeq === 0))\n )\n }\n\n private bindResumeSnapshotEvidence(snapshot: {\n keySet?: PersistedKeySetEvidence\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n }): void {\n const generation = this.getResumeSnapshotGeneration(snapshot)\n const previousEvidenceStatus = this.persistedKeySetEvidence?.status\n // An uncertified sync baseline never authorized a persisted resume cursor,\n // so a later atomic snapshot may replace its evidence while the source\n // performs the already-required fresh snapshot. Local-only collections\n // have no remote cursor to fence; a managed write may advance a still-\n // consistent SQLite baseline during startup. Incompatible evidence remains\n // fail-closed in both modes.\n const mayAcceptUnownedGeneration =\n (this.mode === `sync-present` &&\n previousEvidenceStatus !== `consistent` &&\n previousEvidenceStatus !== `incompatible`) ||\n (this.mode === `sync-absent` &&\n previousEvidenceStatus === `consistent` &&\n snapshot.keySet?.status === `consistent`)\n this.observeStreamPosition(\n snapshot.latestTerm,\n snapshot.latestSeq,\n snapshot.latestRowVersion,\n )\n this.persistedKeySetEvidence =\n this.isExpectedResumeGeneration(generation) || mayAcceptUnownedGeneration\n ? snapshot.keySet\n : { status: `incompatible` }\n }\n\n private replaceCollectionSnapshot(\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n collectionMetadata: Array<{ key: string; value: unknown }>,\n replayDemand: boolean,\n ): SyncAppliedReceipt {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit ||\n !this.syncControls.metadata\n ) {\n return true\n }\n\n const base = this.collection?.base\n const hydratedKeys = new Set(\n Array.from(base?.keys() ?? []).filter(\n (key) => this.collection?._hasHydratedKey(key) === true,\n ),\n )\n const rowKeys = new Set(rows.map((row) => row.key))\n // A truncate replays the Collection's demand. A follower routes that\n // demand to its leader, whose source loads and commits again, so a\n // follower replaces its rows in place, except after a reset, which owes\n // the replay.\n const followsLeader =\n this.canRouteRemoteDemandThroughCoordinator() &&\n !this.persistence.coordinator.isLeader(this.storageCollectionId)\n const truncate = hydratedKeys.size === 0 && (replayDemand || !followsLeader)\n\n return this.withInternalApply(() => {\n this.syncControls.begin?.()\n if (truncate) {\n this.syncControls.truncate?.()\n } else {\n for (const key of base?.keys() ?? []) {\n if (!hydratedKeys.has(key) && !rowKeys.has(key)) {\n this.syncControls.write?.({ type: `delete`, key })\n }\n }\n for (const key of this.collection?._syncedRowMetadataKeysOutsideBase() ??\n []) {\n this.syncControls.metadata?.row.delete(key)\n }\n }\n\n for (const row of rows) {\n if (hydratedKeys.has(row.key)) continue\n if (!truncate && base?.has(row.key)) {\n // Remove stale fields before applying a complete persisted row in\n // the default partial-update mode, without truncating seed keys.\n this.syncControls.write?.({ type: `delete`, key: row.key })\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.applyCollectionMetadataSnapshot(collectionMetadata)\n return this.syncControls.commit?.() ?? true\n })\n }\n\n private matchesCollectionSnapshot(\n rows: Map<TKey, { value: T; metadata?: unknown }>,\n collectionMetadata: Array<{ key: string; value: unknown }>,\n ): boolean {\n if (!this.collection || !this.syncControls.metadata) return false\n const base = this.collection.base\n if (base.size !== rows.size) return false\n for (const [key, row] of rows) {\n if (\n !base.has(key) ||\n !equalPersistedSnapshotValues(base.get(key), row.value) ||\n !equalPersistedSnapshotValues(\n this.syncControls.metadata.row.get(key),\n row.metadata,\n )\n ) {\n return false\n }\n }\n const currentMetadata = this.syncControls.metadata.collection.list()\n if (currentMetadata.length !== collectionMetadata.length) return false\n const expectedMetadata = new Map(\n collectionMetadata.map(({ key, value }) => [key, value]),\n )\n return currentMetadata.every(\n ({ key, value }) =>\n expectedMetadata.has(key) &&\n equalPersistedSnapshotValues(expectedMetadata.get(key), value),\n )\n }\n\n private async flushQueuedHydrationTransactionsUnsafe(\n adapter: HydrationPersistenceAdapter,\n ): Promise<{ reason: unknown } | undefined> {\n let operationFailure: { reason: unknown } | undefined\n while (this.queuedHydrationTransactions.length > 0) {\n const transaction = this.queuedHydrationTransactions.shift()\n if (!transaction) {\n continue\n }\n try {\n const outcome = await this.applyBufferedSyncTransactionUnsafe(\n transaction,\n adapter,\n )\n operationFailure ??= outcome.hydrationFailure\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 return operationFailure\n }\n\n private async applyBufferedSyncTransactionUnsafe(\n transaction: BufferedSyncTransaction<T, TKey>,\n scopedAdapter?: HydrationPersistenceAdapter,\n ): Promise<{\n applied: boolean\n hydrationFailure?: { reason: unknown }\n }> {\n this.throwIfTerminal()\n this.throwIfLifecycleReplaced(transaction.lifecycleGeneration)\n if (\n transaction.admittedStorageCollectionId !== undefined &&\n transaction.admittedStorageCollectionId !== this.storageCollectionId\n ) {\n const error = new SyncTransactionAbortedError()\n if (!transaction.rejectApplied) throw error\n transaction.rejectApplied(error)\n return { applied: false }\n }\n if (!transaction.internal && this.scopedRecoveryPending) {\n const error = new SyncTransactionAbortedError()\n if (!transaction.rejectApplied) throw error\n transaction.rejectApplied(error)\n return { applied: false }\n }\n if (\n !transaction.internal &&\n this.cacheGenerationClaim &&\n (scopedAdapter ?? this.persistence.adapter).renewCacheGenerationClaim &&\n !(await this.renewCacheClaim(scopedAdapter ?? this.persistence.adapter))\n ) {\n const error = new SyncTransactionAbortedError()\n // Recovery needs this apply mutex, so start it after the rejected\n // transaction has released its turn. Its new source snapshots use a\n // fresh cache generation; this commit must never be replayed into it.\n queueMicrotask(() => {\n if (transaction.lifecycleGeneration !== this.lifecycleGeneration) return\n if (this.scopedRecoveryPending) return\n void this.startScopedRecovery().catch((failure) => {\n this.markTerminalFailure(failure, transaction.lifecycleGeneration)\n })\n })\n if (!transaction.rejectApplied) throw error\n transaction.rejectApplied(error)\n return { applied: false }\n }\n const abortedBeforeApplication = transaction.signal?.aborted === true\n let abortedDuringApplication = false\n let applicationReturned = false\n\n try {\n const applied = transaction.internal\n ? this.withInternalApply(transaction.applyToCollection)\n : transaction.applyToCollection()\n applicationReturned = true\n abortedDuringApplication = transaction.signal?.aborted === true\n // Inside the apply mutex, internal work waits only for acceptance: a\n // local mutation's handler may need this mutex, and the rows publish\n // when that mutation settles. A source transaction is stored once it is\n // visible, except one held by a persisting optimistic transaction,\n // which is stored now so a handler can await its acceptance.\n if (transaction.internal) await whenSyncAccepted(applied)\n else if (\n applied !== true &&\n !this.collection?._state.hasPersistingTransaction()\n )\n await applied\n this.throwIfLifecycleReplaced(transaction.lifecycleGeneration)\n\n if (!transaction.internal) {\n await this.persistAndBroadcastExternalSyncTransactionUnsafe(\n transaction,\n scopedAdapter,\n )\n }\n transaction.resolveApplied?.()\n return { applied: true }\n } catch (error) {\n if (!applicationReturned) {\n abortedDuringApplication = transaction.signal?.aborted === true\n }\n const aborted =\n transaction.signal?.aborted ||\n error instanceof SyncTransactionAbortedError\n const shouldFailStop =\n aborted && transaction.shouldFailStopOnAbort?.() === true\n const terminalError = this.classifyBufferedTransactionFailure(\n transaction,\n error,\n )\n transaction.rejectApplied?.(terminalError)\n if (aborted && !shouldFailStop && transaction.rejectApplied) {\n return {\n applied: false,\n hydrationFailure:\n !abortedBeforeApplication && abortedDuringApplication\n ? { reason: terminalError }\n : undefined,\n }\n }\n throw terminalError\n }\n }\n\n private classifyBufferedTransactionFailure(\n transaction: BufferedSyncTransaction<T, TKey>,\n error: unknown,\n ): unknown {\n if (error instanceof PersistedCollectionDurabilityError) {\n return this.markTerminalFailure(error, transaction.lifecycleGeneration)\n }\n const aborted =\n transaction.signal?.aborted ||\n error instanceof SyncTransactionAbortedError\n if (aborted && transaction.shouldFailStopOnAbort?.() !== true) {\n return error\n }\n return this.markTerminalFailure(error, transaction.lifecycleGeneration)\n }\n\n private async persistAndBroadcastExternalSyncTransactionUnsafe(\n transaction: BufferedSyncTransaction<T, TKey>,\n scopedAdapter?: HydrationPersistenceAdapter,\n ): Promise<void> {\n if (transaction.internal) {\n return\n }\n\n this.throwIfLifecycleReplaced(transaction.lifecycleGeneration)\n if (\n !transaction.truncate &&\n transaction.operations.length === 0 &&\n transaction.rowMetadataWrites.size === 0 &&\n transaction.collectionMetadataWrites.size === 0\n ) {\n return\n }\n\n const anchor = this.persistedResumeGeneration && {\n latestRowVersion: this.latestRowVersion,\n resetEpoch: this.persistedResumeGeneration.resetEpoch,\n }\n const streamPosition = this.nextLocalStreamPosition()\n const tx = this.createPersistedTxFromOperations(transaction, streamPosition)\n const storageCollectionId = this.storageCollectionId\n let response: ApplyCommittedTxResponse\n try {\n response = await this.persistence.coordinator.requestApplyCommittedTx(\n storageCollectionId,\n tx,\n // A hydration-scoped adapter is already inside the shared scheduler.\n // Ordinary source commits enter it before taking the writer lock.\n scopedAdapter,\n )\n } catch (error) {\n if (\n !(error instanceof IndeterminateCommitError) ||\n !anchor ||\n !this.persistence.coordinator.reconcileCommittedTx\n ) {\n throw error\n }\n let reconciled: ReconcileCommittedTxResponse\n try {\n reconciled = await this.persistence.coordinator.reconcileCommittedTx(\n storageCollectionId,\n tx,\n anchor,\n scopedAdapter,\n )\n } catch (reconcileError) {\n if (reconcileError instanceof PersistedCollectionDurabilityError) {\n throw reconcileError\n }\n throw error\n }\n if (!reconciled.ok) {\n if (reconciled.code === `PERSISTENCE_ERROR`) {\n throw new PersistedCollectionDurabilityError(\n `Failed to reconcile collection \"${this.collectionId}\": ${reconciled.error}`,\n {\n cause: reconciled,\n code: reconciled.sourceCode ?? reconciled.code,\n path: reconciled.path,\n },\n )\n }\n throw error\n }\n this.recordDurableSourceCommit(transaction, reconciled.committed)\n return\n }\n if (!response.ok) {\n if (response.code === `PERSISTENCE_ERROR`) {\n const error = new PersistedCollectionDurabilityError(\n `Failed to durably persist collection \"${this.collectionId}\": ${response.error}`,\n {\n cause: response,\n code: response.sourceCode ?? response.code,\n path: response.path,\n },\n )\n throw error\n }\n throw new Error(\n `failed to apply external sync transaction through coordinator: ${response.error}`,\n )\n }\n this.recordDurableSourceCommit(transaction, {\n term: response.term,\n seq: response.seq,\n rowVersion: response.latestRowVersion,\n })\n }\n\n private recordDurableSourceCommit(\n transaction: BufferedSyncTransaction<T, TKey>,\n position: { term: number; seq: number; rowVersion: number },\n ): void {\n if (transaction.lifecycleGeneration !== this.lifecycleGeneration) return\n this.observeStreamPosition(position.term, position.seq, position.rowVersion)\n if (position.rowVersion === this.publicRowVersion + 1) {\n this.publicRowVersion = position.rowVersion\n }\n if (\n transaction.expectedResumeGenerationOwner ===\n this.resumeGenerationOwner &&\n this.persistedResumeGeneration !== undefined\n ) {\n this.persistedResumeGeneration = {\n ...this.persistedResumeGeneration,\n latestTerm: position.term,\n latestSeq: position.seq,\n latestRowVersion: position.rowVersion,\n }\n }\n }\n\n private async applyCommittedTx(\n tx: PersistedTx,\n lifecycleGeneration: number,\n ): Promise<void> {\n this.throwIfTerminal()\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n try {\n await this.persistence.adapter.applyCommittedTx(\n this.storageTargetFor(),\n tx,\n )\n } catch (error) {\n throw this.markTerminalFailure(\n toPersistedCollectionDurabilityError(this.collectionId, error),\n lifecycleGeneration,\n )\n }\n this.throwIfLifecycleReplaced(lifecycleGeneration)\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 cacheGenerationClaimId: this.cacheGenerationClaim?.claimId,\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 cacheGenerationClaimId: this.cacheGenerationClaim?.claimId,\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 async confirmMutationsSyncUnsafe(\n mutations: Array<PendingMutation<T>>,\n ): Promise<void> {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit\n ) {\n return\n }\n\n const applied = this.withInternalApply(() => {\n this.syncControls.begin?.()\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 return this.syncControls.commit?.() ?? true\n })\n\n // The mutation handler awaits this confirmation, so wait only for\n // acceptance: the rows become visible when the mutation settles.\n const accepted = whenSyncAccepted(applied)\n if (accepted !== true) await accepted\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 lifecycleGeneration: number,\n ): Promise<Array<string>> {\n this.throwIfLifecycleReplaced(lifecycleGeneration)\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 target = this.storageTargetFor()\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.storageCollectionId,\n envelopeMutations,\n target.kind === `managed` ? target.claimId : undefined,\n )\n\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n\n if (!response.ok) {\n if (response.code === `PERSISTENCE_ERROR`) {\n const error = new PersistedCollectionDurabilityError(\n `Failed to durably persist collection \"${this.collectionId}\": ${response.error}`,\n {\n cause: response,\n code: response.sourceCode ?? response.code,\n path: response.path,\n },\n )\n throw error\n }\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.applyCommittedTx(tx, lifecycleGeneration)\n\n this.throwIfLifecycleReplaced(lifecycleGeneration)\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.storageCollectionId,\n senderId: this.persistence.coordinator.getNodeId(),\n ts: Date.now(),\n payload: txCommitted,\n }\n this.persistence.coordinator.publish(this.storageCollectionId, 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 // A subscription can own several independent acquisitions, including\n // identical requests. Only releasing this options object ends its lease.\n let id = this.requestIds.get(options)\n if (id === undefined) {\n id = `request:${++this.nextRequestId}`\n this.requestIds.set(options, id)\n }\n return id\n }\n\n private canRouteRemoteDemandThroughCoordinator(): boolean {\n if (\n this.getCurrentTerminalFailure() ||\n this.mode !== `sync-present` ||\n this.persistence.coordinator instanceof SingleProcessCoordinator\n ) {\n return false\n }\n\n // A follower routes demand to the elected owner even when its own source\n // cannot own acquisitions. Only an elected node needs a local owner.\n return (\n !this.persistence.coordinator.isLeader(this.storageCollectionId) ||\n this.remoteSubsetOwnerUnsubscribe !== null\n )\n }\n\n private queueRemoteSubsetEnsure(options: LoadSubsetOptions): void {\n if (\n options.signal?.aborted ||\n !this.canRouteRemoteDemandThroughCoordinator() ||\n this.activeSubsets.get(this.getSubsetKey(options)) !== options\n ) {\n return\n }\n\n const subsetKey = this.getSubsetKey(options)\n if (this.activeSubsets.get(subsetKey) !== options) return\n\n // A previously local acquisition can become remote after an ownership\n // change. Recovery must reject permanent wire errors before retry owns it.\n validateRemoteSubsetOptions(options)\n this.pendingRemoteSubsetEnsures.set(subsetKey, options)\n void this.flushPendingRemoteSubsetEnsures()\n }\n\n private scheduleRemoteEnsureRetry(): void {\n if (\n this.getCurrentTerminalFailure() ||\n this.mode !== `sync-present` ||\n this.persistence.coordinator instanceof SingleProcessCoordinator\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.getCurrentTerminalFailure() ||\n this.mode !== `sync-present` ||\n this.persistence.coordinator instanceof SingleProcessCoordinator\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 if (\n options.signal?.aborted ||\n this.activeSubsets.get(subsetKey) !== options\n ) {\n this.pendingRemoteSubsetEnsures.delete(subsetKey)\n continue\n }\n try {\n await this.persistence.coordinator.requestEnsureRemoteSubset(\n this.storageCollectionId,\n this.rotatedAcquisitions.get(options) ?? options,\n )\n this.pendingRemoteSubsetEnsures.delete(subsetKey)\n } catch (error) {\n if (\n options.signal?.aborted ||\n this.activeSubsets.get(subsetKey) !== options\n ) {\n this.pendingRemoteSubsetEnsures.delete(subsetKey)\n } else {\n console.warn(`Failed to ensure remote subset:`, error)\n }\n }\n }\n\n this.scheduleRemoteEnsureRetry()\n }\n\n private attachCoordinatorSubscription(): void {\n if (this.coordinatorUnsubscribe) {\n return\n }\n\n this.persistence.coordinator.setAdapterForCollection?.(\n this.storageCollectionId,\n this.persistence.adapter,\n this.cacheGenerationClaim?.claimId,\n )\n this.coordinatorUnsubscribe = this.persistence.coordinator.subscribe(\n this.storageCollectionId,\n (message) => {\n this.onCoordinatorMessage(message)\n },\n )\n }\n\n private onCoordinatorMessage(message: ProtocolEnvelope<unknown>): void {\n if (message.collectionId !== this.storageCollectionId) {\n return\n }\n if (this.getCurrentTerminalFailure()) {\n return\n }\n const { payload } = message\n const lifecycleGeneration = this.lifecycleGeneration\n const isSelf = message.senderId === this.persistence.coordinator.getNodeId()\n const claimExpired = this.hasExpiredCacheClaim()\n if (claimExpired && !isTxCommittedPayload(payload)) {\n this.scheduleCacheClaimRecovery(lifecycleGeneration)\n return\n }\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 // Commits apply in arrival order through the queue. While the claim is\n // expired, keep them until renewal or rotation decides this generation;\n // a renewed generation still owes its rows. A hydration flushes the\n // queue when it ends.\n this.queuedTxCommitted.push({\n txCommitted: payload,\n lifecycleGeneration,\n storageCollectionId: message.collectionId,\n })\n if (claimExpired) {\n this.scheduleCacheClaimRecovery(lifecycleGeneration)\n } else if (!this.isHydratingNow()) {\n void this.applyMutex\n .run(() => this.flushQueuedTxCommittedUnsafe())\n .catch((error) => {\n this.markTerminalFailure(error, lifecycleGeneration)\n })\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(async () => {\n if (message.collectionId !== this.storageCollectionId) return\n await this.runInHydrationScope(async (adapter) => {\n await this.truncateAndReloadUnsafe(adapter, lifecycleGeneration)\n await this.rebaseDurableStreamFromSnapshotUnsafe(\n adapter,\n lifecycleGeneration,\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n // Reloaded rows and the later position-only read are separate\n // cuts. Zero is the conservative public version in the new epoch.\n this.publicRowVersion = 0\n this.resetTermFence = this.latestTerm\n }\n })\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n })\n .catch((error) => {\n this.markTerminalFailure(error, lifecycleGeneration)\n })\n }\n }\n\n private async flushQueuedTxCommittedUnsafe(): Promise<void> {\n while (this.queuedTxCommitted.length > 0) {\n // Claim recovery flushes the queue once the generation is decided.\n if (this.hasExpiredCacheClaim()) {\n this.scheduleCacheClaimRecovery(this.lifecycleGeneration)\n return\n }\n const queued = this.queuedTxCommitted.shift()\n if (!queued) {\n continue\n }\n if (queued.storageCollectionId !== this.storageCollectionId) continue\n // A queued commit has left the queue, so a failure must be terminal,\n // as it is for a commit applied when it arrives.\n try {\n await this.processCommittedTxUnsafe(\n queued.txCommitted,\n queued.lifecycleGeneration,\n )\n } catch (error) {\n throw this.markTerminalFailure(error, queued.lifecycleGeneration)\n }\n }\n }\n\n private async processCommittedTxUnsafe(\n txCommitted: TxCommitted,\n lifecycleGeneration = this.lifecycleGeneration,\n ): Promise<void> {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n if (this.resetTermFence !== undefined) {\n if (txCommitted.term <= this.resetTermFence) {\n // This payload could have been committed before the schema reset.\n // The current durable snapshot is the only safe row authority.\n await this.runInHydrationScope((adapter) =>\n this.reloadActiveSubsetsUnsafe(adapter),\n )\n return\n }\n }\n // An exact-ID reconciliation can discover a commit whose original\n // notification was lost. A peer may already be at this stream position\n // without having loaded that commit's rows.\n if (txCommitted.requiresFullReload && txCommitted.reconciliationReload) {\n await this.invalidateFromCommittedTxUnsafe(\n txCommitted,\n this.persistence.adapter,\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n this.observeStreamPosition(\n txCommitted.term,\n txCommitted.seq,\n txCommitted.latestRowVersion,\n )\n this.publicRowVersion = Math.max(\n this.publicRowVersion,\n txCommitted.latestRowVersion,\n )\n await this.flushQueuedTxCommittedUnsafe()\n }\n return\n }\n if (txCommitted.latestRowVersion <= this.publicRowVersion) return\n const observedButUnpublished =\n txCommitted.term < this.latestTerm ||\n (txCommitted.term === this.latestTerm &&\n txCommitted.seq <= this.latestSeq)\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 =\n observedButUnpublished ||\n txCommitted.latestRowVersion > this.publicRowVersion + 1 ||\n hasGapInCurrentTerm ||\n hasGapAcrossTerms\n\n if (hasGap) {\n if (!(await this.recoverFromSeqGapUnsafe(lifecycleGeneration))) return\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n if (txCommitted.latestRowVersion <= this.publicRowVersion) return\n }\n\n this.observeStreamPosition(\n txCommitted.term,\n txCommitted.seq,\n txCommitted.latestRowVersion,\n )\n\n await this.invalidateFromCommittedTxUnsafe(\n txCommitted,\n this.persistence.adapter,\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n this.publicRowVersion = Math.max(\n this.publicRowVersion,\n txCommitted.latestRowVersion,\n )\n await this.flushQueuedTxCommittedUnsafe()\n }\n }\n\n private async rebaseDurableStreamFromSnapshotUnsafe(\n adapter: HydrationPersistenceAdapter,\n lifecycleGeneration: number,\n ): Promise<void> {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n const snapshot = await adapter.loadResumeSnapshot(this.storageTargetFor(), {\n includeRows: false,\n cacheGenerationClaimId: this.cacheGenerationClaim?.claimId,\n })\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n // The reset epoch can restart row versions at zero. Keep the term/seq\n // watermark to fence old notifications, but rebase version counters.\n this.latestRowVersion = snapshot.latestRowVersion\n this.localRowVersion = snapshot.latestRowVersion\n this.observeStreamPosition(\n snapshot.latestTerm,\n snapshot.latestSeq,\n snapshot.latestRowVersion,\n )\n }\n\n private async recoverFromSeqGapUnsafe(\n lifecycleGeneration: number,\n ): Promise<boolean> {\n if (lifecycleGeneration !== this.lifecycleGeneration) return false\n if (this.persistence.coordinator.pullSince && this.latestRowVersion >= 0) {\n let pullResponse: PullSinceResponse | undefined\n try {\n pullResponse = await this.persistence.coordinator.pullSince(\n this.storageCollectionId,\n this.publicRowVersion,\n undefined,\n this.cacheGenerationClaim?.claimId,\n )\n } catch (error) {\n console.warn(`Failed pullSince recovery attempt:`, error)\n }\n\n // The replay read may have started under a live claim and returned\n // after expiry. Recovery needs the apply mutex held by this callback,\n // so schedule it after discarding the old response.\n if (this.scopedRecoveryPending) return false\n if (\n this.cacheGenerationClaim &&\n !(await this.renewCacheClaim(this.persistence.adapter))\n ) {\n this.scheduleCacheClaimRecovery(lifecycleGeneration)\n return false\n }\n\n if (pullResponse) {\n if (lifecycleGeneration !== this.lifecycleGeneration) return false\n\n if (pullResponse.ok) {\n this.observeStreamPosition(\n pullResponse.latestTerm,\n pullResponse.latestSeq,\n pullResponse.latestRowVersion,\n )\n if (pullResponse.requiresFullReload) {\n await this.runInHydrationScope((adapter) =>\n this.reloadActiveSubsetsUnsafe(adapter),\n )\n this.publicRowVersion = Math.max(\n this.publicRowVersion,\n pullResponse.latestRowVersion,\n )\n return true\n }\n const deltas = pullResponse.deltas\n if (!deltas) {\n await this.runInHydrationScope((adapter) =>\n this.reloadActiveSubsetsUnsafe(adapter),\n )\n this.publicRowVersion = Math.max(\n this.publicRowVersion,\n pullResponse.latestRowVersion,\n )\n return true\n }\n\n await this.runInHydrationScope(async (adapter) => {\n for (const delta of deltas) {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n await this.invalidateFromCommittedTxUnsafe(\n {\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:\n delta.collectionMetadataMutations,\n },\n adapter,\n )\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n }\n })\n this.publicRowVersion = Math.max(\n this.publicRowVersion,\n pullResponse.latestRowVersion,\n )\n return true\n }\n }\n }\n\n if (lifecycleGeneration !== this.lifecycleGeneration) return false\n // A gap is not a schema reset. Replace the durable snapshot in one\n // publication so readers never see an empty intermediate Collection.\n await this.runInHydrationScope((adapter) =>\n this.reloadActiveSubsetsUnsafe(adapter),\n )\n this.publicRowVersion = Math.max(\n this.publicRowVersion,\n this.latestRowVersion,\n )\n\n if (this.mode === `sync-present`) {\n for (const options of this.activeSubsets.values()) {\n this.queueRemoteSubsetEnsure(options)\n }\n }\n return true\n }\n\n private refreshScopedSubsets(): void {\n if (!this.remoteSubsetOwner) return\n const lifecycleGeneration = this.lifecycleGeneration\n const storageId = this.storageCollectionId\n for (const [subsetKey, options] of this.activeSubsets) {\n if (options.signal?.aborted) continue\n this.hydratedDemands.delete(getLoadSubsetDemandKey(options))\n // A scoped cache cannot answer the invalidation. This one-shot\n // acquisition requests source evidence while the original demand keeps\n // its lease; releasing it after settlement preserves exact ownership.\n const refreshOptions: LoadSubsetOptions = { ...options, refetch: true }\n this.scopedRefreshes.set(refreshOptions, storageId)\n void Promise.resolve()\n .then(() => {\n if (\n lifecycleGeneration !== this.lifecycleGeneration ||\n this.activeSubsets.get(subsetKey) !== options\n ) {\n return\n }\n return this.persistence.coordinator.requestEnsureRemoteSubset(\n storageId,\n refreshOptions,\n )\n })\n .catch((error: unknown) => {\n if (\n lifecycleGeneration === this.lifecycleGeneration &&\n !options.signal?.aborted\n ) {\n this.reportSyncError(error)\n }\n })\n .finally(() => {\n if (!this.scopedRefreshes.delete(refreshOptions)) return\n void this.persistence.coordinator\n .requestReleaseRemoteSubset(storageId, refreshOptions)\n .catch((error: unknown) => {\n if (lifecycleGeneration === this.lifecycleGeneration) {\n this.reportSyncError(error)\n }\n })\n })\n }\n }\n\n private async truncateAndReloadUnsafe(\n adapter: HydrationPersistenceAdapter,\n lifecycleGeneration = this.lifecycleGeneration,\n ): Promise<void> {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n if (this.scopedRecovery) {\n this.refreshScopedSubsets()\n return\n }\n // A subscriber may reacquire reentrantly from the truncate commit.\n this.hydratedDemands.clear()\n this.resetSequence++\n // On-demand reset keeps previously public rows and hydration seeds until\n // the new durable snapshot can replace them in one publication. Active\n // demand may add rows; retired demand may only validate visible keys.\n if (\n this.syncMode === `eager` &&\n this.syncControls.begin &&\n this.syncControls.commit\n ) {\n const applied = this.withInternalApply(() => {\n this.syncControls.begin?.()\n this.syncControls.truncate?.()\n return this.syncControls.commit?.() ?? true\n })\n await whenSyncAccepted(applied)\n }\n\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n // A reset replays demand: the owner's reset rows return only when the\n // follower requests its demand again.\n await this.reloadActiveSubsetsUnsafe(\n adapter,\n false,\n this.syncMode === `eager`,\n true,\n )\n }\n\n private async invalidateFromCommittedTxUnsafe(\n txCommitted: TxCommitted,\n adapter: HydrationPersistenceAdapter,\n ): Promise<void> {\n if (this.scopedRecovery) {\n this.refreshScopedSubsets()\n return\n }\n const reloadActiveSubsets = (skipUnchangedReplace = false) =>\n this.runInHydrationScope(\n (scopedAdapter) =>\n this.reloadActiveSubsetsUnsafe(scopedAdapter, skipUnchangedReplace),\n adapter,\n )\n\n if (txCommitted.requiresFullReload) {\n await reloadActiveSubsets(txCommitted.reconciliationReload === true)\n return\n }\n\n const changedKeyCount =\n txCommitted.changedRows.length + txCommitted.deletedKeys.length\n if (changedKeyCount > TARGETED_INVALIDATION_KEY_LIMIT) {\n await reloadActiveSubsets()\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 // A targeted envelope separates changed rows from deleted keys and omits\n // insert/update identity. A same-key insert replaces the durable row,\n // while an update merges omitted fields. The public row cannot decide\n // which operation produced a changed value. A previously unseen key also\n // has no public baseline with which to complete a source patch. Read the\n // durable result whenever that ambiguity affects a public row or demand.\n const changedKeys = new Set(txCommitted.changedRows.map((row) => row.key))\n const hasRepeatedChange =\n changedKeys.size !== txCommitted.changedRows.length\n const hasChangedAndDeletedKey = txCommitted.deletedKeys.some((key) =>\n changedKeys.has(key),\n )\n const hasChangedPublicKey = txCommitted.changedRows.some((row) =>\n this.collection?.base.has(row.key as TKey),\n )\n const hasUnseenDemandedKey =\n this.activeSubsets.size > 0 &&\n txCommitted.changedRows.some(\n (row) =>\n !this.collection?.base.has(row.key as TKey) &&\n !this.collection?._hasHydratedKey(row.key as TKey),\n )\n if (\n hasRepeatedChange ||\n hasChangedAndDeletedKey ||\n hasChangedPublicKey ||\n (this.syncMode === `on-demand` && hasUnseenDemandedKey)\n ) {\n await reloadActiveSubsets()\n return\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 reloadActiveSubsets()\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 const applied = this.withInternalApply(() => {\n this.syncControls.begin?.()\n\n for (const {\n key: changedKey,\n value: newValue,\n } of txCommitted.changedRows) {\n const key = changedKey as TKey\n if (this.collection?._hasHydratedKey(key)) continue\n const previous = this.collection?.base.get(key)\n if (previous === undefined && this.activeSubsets.size === 0) continue\n const completeValue = {\n ...(previous as object | undefined),\n ...newValue,\n } as T\n const currentlyDemanded = matchesAnySubset(\n completeValue,\n subsetEvaluators,\n )\n const previouslyOutsideDemand =\n previous !== undefined &&\n !matchesAnySubset(previous, subsetEvaluators)\n\n if (currentlyDemanded || previouslyOutsideDemand) {\n this.syncControls.write?.({ type: `update`, value: completeValue })\n } else if (previous !== undefined) {\n this.syncControls.write?.({ type: `delete`, key })\n }\n }\n\n for (const deletedKey of txCommitted.deletedKeys) {\n const key = deletedKey as TKey\n if (!this.collection?._hasHydratedKey(key)) {\n this.syncControls.write?.({ type: `delete`, key })\n }\n }\n\n txCommitted.rowMetadataMutations?.forEach((mutation) => {\n // A DbClient hydration seed owns both its row and row metadata until\n // an accepted source transaction confirms the key.\n if (this.collection?._hasHydratedKey(mutation.key as TKey)) return\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 return this.syncControls.commit?.() ?? true\n })\n await whenSyncAccepted(applied)\n }\n\n private async reloadActiveSubsetsUnsafe(\n adapter: HydrationPersistenceAdapter,\n skipUnchangedReplace = false,\n restoreResetBaseline = false,\n replayDemand = false,\n ): Promise<void> {\n if (this.scopedRecovery) {\n this.refreshScopedSubsets()\n return\n }\n const lifecycleGeneration = this.lifecycleGeneration\n const truncateGeneration = this.sourceTruncateGeneration\n const activeSubsetOptions = Array.from(this.activeSubsets.values())\n if (restoreResetBaseline && activeSubsetOptions.length === 0) {\n activeSubsetOptions.push({})\n }\n const evaluators = activeSubsetOptions.map((options) =>\n options.where ? compileSingleRowExpression(options.where) : null,\n )\n // A filtered read has no authority over public rows that were already\n // outside every active predicate. Validate those keys against the complete\n // durable snapshot; only active demand may admit previously unseen keys.\n const outsideDemandKeys = activeSubsetOptions.some(\n (options) =>\n options.limit != null ||\n options.offset != null ||\n options.cursor != null,\n )\n ? []\n : Array.from(this.collection?.base ?? [])\n .filter(\n ([key, row]) =>\n !this.collection?._hasHydratedKey(key) &&\n !matchesAnySubset(row, evaluators),\n )\n .map(([key]) => key)\n\n this.hydratedDemands.clear()\n this.hydrationSequence++\n const hydrationContext = { suppliedRowKeys: new Set<TKey>() }\n this.activeHydrationContext = hydrationContext\n this.hydratingGeneration = lifecycleGeneration\n try {\n const mergedRows = new Map<TKey, { value: T; metadata?: unknown }>()\n let validationSnapshot:\n Awaited<ReturnType<typeof adapter.loadResumeSnapshot>> | undefined\n let collectionMetadata: Array<{ key: string; value: unknown }> = []\n try {\n validationSnapshot =\n (activeSubsetOptions.length === 0 || outsideDemandKeys.length > 0) &&\n this.collection?.base.size\n ? await adapter.loadResumeSnapshot(this.storageTargetFor(), {\n requiredIndexSignatures: this.getRequiredIndexSignatures(),\n includeRows: true,\n cacheGenerationClaimId: this.cacheGenerationClaim?.claimId,\n })\n : undefined\n collectionMetadata = validationSnapshot\n ? validationSnapshot.collectionMetadata\n : await this.loadCollectionMetadataSnapshot(adapter)\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n for (const options of activeSubsetOptions) {\n const subsetRows = await this.loadSubsetRowsUnsafe(options, adapter)\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n for (const row of subsetRows) {\n mergedRows.set(row.key, {\n value: row.value,\n metadata: row.metadata,\n })\n }\n }\n if (outsideDemandKeys.length > 0 && validationSnapshot) {\n const durableRows = new Map(\n validationSnapshot.rows.map((row) => [row.key, row]),\n )\n for (const key of outsideDemandKeys) {\n if (mergedRows.has(key)) continue\n const row = durableRows.get(key)\n if (row) {\n mergedRows.set(key, {\n value: row.value as T,\n metadata: row.metadata,\n })\n }\n }\n }\n } catch (error) {\n // Recovery may have started while the adapter read was awaited.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.scopedRecovery) return\n // SQLite may reject its second read-admission check after a claim\n // expires. A read from that cache has no authority to fail the\n // Collection; recovery will reload its active demands.\n if (!this.cacheGenerationClaim || !this.hasExpiredCacheClaim()) {\n throw error\n }\n this.scheduleCacheClaimRecovery(lifecycleGeneration)\n return\n }\n\n // A peer reload can hold its persisted read past claim expiry. Its\n // rows and metadata cannot publish under the old generation. Recovery\n // needs this apply mutex, so start it only after this callback returns.\n if (this.isScopedRecoveryPending()) return\n if (this.cacheGenerationClaim && !(await this.renewCacheClaim(adapter))) {\n this.scheduleCacheClaimRecovery(lifecycleGeneration)\n return\n }\n if (\n this.isScopedRecoveryPending() ||\n lifecycleGeneration !== this.lifecycleGeneration\n )\n return\n\n for (const key of mergedRows.keys()) {\n hydrationContext.suppliedRowKeys.add(key)\n }\n\n if (activeSubsetOptions.length === 0) {\n // Retired demand does not hide already public rows. Validate only\n // those keys; do not publish unrelated durable rows without demand.\n await whenSyncAccepted(\n this.applyRowsToCollection(\n [],\n (validationSnapshot?.rows ?? []) as Array<{\n key: TKey\n value: T\n metadata?: unknown\n }>,\n collectionMetadata,\n ),\n )\n } else if (\n skipUnchangedReplace &&\n this.matchesCollectionSnapshot(mergedRows, collectionMetadata)\n ) {\n // A full replacement would also clear metadata for missing rows.\n // Clear only those entries so equal public rows do not republish.\n const orphanKeys =\n this.collection?._syncedRowMetadataKeysOutsideBase() ?? []\n if (orphanKeys.length > 0) {\n const applied = this.withInternalApply(() => {\n this.syncControls.begin?.()\n for (const key of orphanKeys) {\n this.syncControls.metadata?.row.delete(key)\n }\n return this.syncControls.commit?.() ?? true\n })\n await whenSyncAccepted(applied)\n }\n } else {\n const applied = this.replaceCollectionSnapshot(\n Array.from(mergedRows.entries()).map(([key, row]) => ({\n key,\n value: row.value,\n metadata: row.metadata,\n })),\n collectionMetadata,\n replayDemand,\n )\n await whenSyncAccepted(applied)\n }\n } finally {\n if (\n this.activeHydrationContext === hydrationContext &&\n this.hydratingGeneration === lifecycleGeneration\n ) {\n this.hydratingGeneration = null\n }\n if (this.activeHydrationContext === hydrationContext) {\n this.activeHydrationContext = undefined\n }\n }\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedHydrationTransactionsUnsafe(adapter)\n // Coordinator commits queued during this hydrate are processed outside\n // its scope. Leave the synchronous fast path closed until a later load\n // if any such commit still needs to be applied.\n if (\n truncateGeneration === this.sourceTruncateGeneration &&\n this.queuedTxCommitted.length === 0\n ) {\n for (const options of activeSubsetOptions) {\n if (this.activeSubsets.get(this.getSubsetKey(options)) === options) {\n this.hydratedDemands.add(getLoadSubsetDemandKey(options))\n }\n }\n }\n }\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).catch((error) => {\n console.warn(\n `Failed to ensure persisted index after index:added:`,\n error,\n )\n })\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 adapter: HydrationPersistenceAdapter = this.persistence.adapter,\n ): Promise<Set<string>> {\n const collection = this.collection\n if (!collection && !indexMetadataSnapshot) {\n return new Set()\n }\n\n const indexMetadata =\n indexMetadataSnapshot ?? collection?.getIndexMetadata() ?? []\n const completedLocalIndexSignatures = new Set<string>()\n const lifecycleGeneration = this.lifecycleGeneration\n for (const metadata of indexMetadata) {\n const storageCollectionId = this.storageCollectionId\n const claimId = this.cacheGenerationClaim?.claimId\n const ensured = await this.ensureLocalPersistedIndex(metadata, adapter)\n if (\n ensured &&\n (await this.reconcilePersistedIndex(\n metadata,\n adapter,\n storageCollectionId,\n claimId,\n lifecycleGeneration,\n true,\n ))\n ) {\n completedLocalIndexSignatures.add(metadata.signature)\n }\n }\n return completedLocalIndexSignatures\n }\n\n private async requestCoordinatorPersistedIndexes(\n indexMetadata: Array<CollectionIndexMetadata>,\n completedLocalIndexSignatures: ReadonlySet<string>,\n ): Promise<void> {\n const lifecycleGeneration = this.lifecycleGeneration\n for (const metadata of indexMetadata) {\n if (!this.hasCurrentIndex(metadata)) continue\n const storageCollectionId = this.storageCollectionId\n const claimId = this.cacheGenerationClaim?.claimId\n await this.requestCoordinatorPersistedIndex(\n metadata,\n completedLocalIndexSignatures.has(metadata.signature),\n )\n await this.reconcilePersistedIndex(\n metadata,\n this.persistence.adapter,\n storageCollectionId,\n claimId,\n lifecycleGeneration,\n true,\n )\n }\n }\n\n /** Settle a late index operation against the Collection's current declaration. */\n private async reconcilePersistedIndex(\n indexMetadata: CollectionIndexMetadata,\n adapter: HydrationPersistenceAdapter,\n storageCollectionId: string,\n claimId: string | undefined,\n lifecycleGeneration: number,\n indexPresent: boolean,\n ): Promise<boolean> {\n while (\n lifecycleGeneration === this.lifecycleGeneration &&\n storageCollectionId === this.storageCollectionId\n ) {\n const declared = this.hasCurrentIndex(indexMetadata)\n if (declared === indexPresent) return declared\n if (declared) {\n if (!(await this.ensureLocalPersistedIndex(indexMetadata, adapter))) {\n return false\n }\n } else {\n if (!adapter.markIndexRemoved) return false\n try {\n await adapter.markIndexRemoved(\n this.storageTargetFor(storageCollectionId, claimId),\n indexMetadata.signature,\n { cacheGenerationClaimId: claimId },\n )\n } catch (error) {\n console.warn(`Failed to mark persisted index removed:`, error)\n return false\n }\n }\n indexPresent = declared\n }\n return false\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 adapter: HydrationPersistenceAdapter = this.persistence.adapter,\n ): Promise<void> {\n if (this.scopedRecoveryPending) return\n const lifecycleGeneration = this.lifecycleGeneration\n await this.ensureCacheClaimActive()\n if (\n lifecycleGeneration !== this.lifecycleGeneration ||\n !this.hasCurrentIndex(indexMetadata)\n )\n return\n const completedLocally = await this.ensureLocalPersistedIndex(\n indexMetadata,\n adapter,\n )\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n if (!this.hasCurrentIndex(indexMetadata)) {\n await this.markIndexRemoved(indexMetadata)\n return\n }\n await this.requestCoordinatorPersistedIndex(indexMetadata, completedLocally)\n if (\n lifecycleGeneration === this.lifecycleGeneration &&\n !this.hasCurrentIndex(indexMetadata)\n ) {\n await this.markIndexRemoved(indexMetadata)\n }\n }\n\n private hasCurrentIndex(indexMetadata: CollectionIndexMetadata): boolean {\n return (\n this.collection\n ?.getIndexMetadata()\n .some((current) => current.signature === indexMetadata.signature) ??\n false\n )\n }\n\n private async ensureLocalPersistedIndex(\n indexMetadata: CollectionIndexMetadata,\n adapter: HydrationPersistenceAdapter,\n ): Promise<boolean> {\n try {\n const spec = this.buildPersistedIndexSpec(indexMetadata)\n await adapter.ensureIndex(\n this.storageTargetFor(),\n indexMetadata.signature,\n spec,\n { cacheGenerationClaimId: this.cacheGenerationClaim?.claimId },\n )\n return true\n } catch (error) {\n console.warn(`Failed to ensure persisted index in adapter:`, error)\n return false\n }\n }\n\n private async requestCoordinatorPersistedIndex(\n indexMetadata: CollectionIndexMetadata,\n completedLocally: boolean,\n ): Promise<void> {\n try {\n const spec = this.buildPersistedIndexSpec(indexMetadata)\n await this.persistence.coordinator.requestEnsurePersistedIndex(\n this.storageCollectionId,\n indexMetadata.signature,\n spec,\n completedLocally ? this.persistence.adapter : undefined,\n completedLocally,\n this.cacheGenerationClaim?.claimId,\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 if (this.scopedRecoveryPending) return\n const lifecycleGeneration = this.lifecycleGeneration\n await this.ensureCacheClaimActive()\n if (\n lifecycleGeneration !== this.lifecycleGeneration ||\n this.hasCurrentIndex(indexMetadata)\n )\n return\n await this.persistence.adapter.markIndexRemoved(\n this.storageTargetFor(),\n indexMetadata.signature,\n { cacheGenerationClaimId: this.cacheGenerationClaim?.claimId },\n )\n if (\n lifecycleGeneration === this.lifecycleGeneration &&\n this.hasCurrentIndex(indexMetadata)\n ) {\n await this.ensurePersistedIndex(indexMetadata)\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 persistedReadiness?: PersistedReadinessTracker,\n): SyncConfig<T, TKey> {\n return {\n ...sourceSyncConfig,\n sync: (params) => {\n const transactionStack: Array<OpenSyncTransaction<T, TKey>> = []\n const pendingPublicationTransactions: Array<\n OpenSyncTransaction<T, TKey>\n > = []\n const getOpenTransaction = () =>\n transactionStack[transactionStack.length - 1]\n const settlePublicationAdmissionWaiters = (\n transaction: OpenSyncTransaction<T, TKey>,\n error?: unknown,\n ) => {\n const waiters = transaction.publicationAdmissionWaiters\n transaction.publicationAdmissionWaiters = undefined\n if (!waiters) return\n for (const waiter of waiters) {\n if (error === undefined) waiter.resolve()\n else waiter.reject(error)\n }\n }\n const bindToCurrentHydration = (\n transaction: OpenSyncTransaction<T, TKey>,\n ) => {\n if (transaction.internal || !runtime.isHydratingNow()) return\n const hydrationSequence = runtime.getHydrationSequence()\n if (\n transaction.hydrationSequence !== undefined &&\n transaction.hydrationSequence !== hydrationSequence\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `a persisted sync transaction cannot cross a hydration cycle`,\n )\n }\n transaction.queuedBecauseHydrating = true\n transaction.hydrationSequence = hydrationSequence\n transaction.hydrationContext = runtime.getActiveHydrationContext()\n }\n const assertHydrationSequenceCurrent = (\n transaction: OpenSyncTransaction<T, TKey>,\n ) => {\n if (\n transaction.hydrationSequence !== undefined &&\n transaction.hydrationSequence !== runtime.getHydrationSequence()\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `a persisted sync transaction cannot cross a hydration cycle`,\n )\n }\n }\n const markPendingMetadataDependency = (\n transaction: OpenSyncTransaction<T, TKey>,\n ) => {\n const openTransaction = getOpenTransaction()\n if (openTransaction && !openTransaction.internal) {\n transaction.hasDependentSuccessor = true\n }\n }\n const removePendingPublicationTransaction = (\n transaction: OpenSyncTransaction<T, TKey>,\n ) => {\n const index = pendingPublicationTransactions.indexOf(transaction)\n if (index !== -1) pendingPublicationTransactions.splice(index, 1)\n }\n const settlePendingTransaction = (\n transaction: OpenSyncTransaction<T, TKey>,\n ) => {\n removePendingPublicationTransaction(transaction)\n }\n // A source receipt is accepted once its rows are durable, and resolves\n // when core makes them visible.\n const visibleAfterDurable = (\n transaction: OpenSyncTransaction<T, TKey>,\n durable: Promise<void>,\n ): Promise<void> => {\n const visible = durable.then(async () => {\n const receipt = transaction.applicationReceipt\n if (receipt !== undefined && receipt !== true) await receipt\n })\n void visible.catch(() => undefined)\n return withAcceptedReceipt(visible, durable)\n }\n const settleRuntimeTransaction = (\n transaction: OpenSyncTransaction<T, TKey>,\n applied: Promise<void>,\n ) => {\n void applied.then(\n () => settlePendingTransaction(transaction),\n () => {\n settlePendingTransaction(transaction)\n },\n )\n }\n const getPendingRowMetadataWrite = (key: TKey) => {\n for (\n let index = pendingPublicationTransactions.length - 1;\n index >= 0;\n index--\n ) {\n const transaction = pendingPublicationTransactions[index]!\n const write = transaction.rowMetadataWrites.get(key)\n if (write) {\n markPendingMetadataDependency(transaction)\n return { found: true, write }\n }\n if (transaction.truncate) {\n markPendingMetadataDependency(transaction)\n return {\n found: true,\n write: { type: `delete` as const },\n }\n }\n }\n return { found: false as const }\n }\n const getPendingCollectionMetadataWrite = (key: string) => {\n for (\n let index = pendingPublicationTransactions.length - 1;\n index >= 0;\n index--\n ) {\n const transaction = pendingPublicationTransactions[index]!\n const write = transaction.collectionMetadataWrites.get(key)\n if (write) {\n markPendingMetadataDependency(transaction)\n return { found: true, write }\n }\n }\n return { found: false as const }\n }\n let fullStartPromise: Promise<void> | null = null\n let sourceResultPromise: Promise<SyncConfigRes> | null = null\n let resolveSourceResultAssigned!: () => void\n const sourceResultAssigned = new Promise<void>((resolve) => {\n resolveSourceResultAssigned = resolve\n })\n const startupState = { cleanedUp: false }\n const isCleanedUp = () => startupState.cleanedUp\n type SubsetAcquisition = {\n forwarded: boolean\n source?: SyncConfigRes\n cancelAdmissionWait?: () => void\n }\n const acquisitions = new Map<LoadSubsetOptions, SubsetAcquisition>()\n const waitForPublicationAdmission = (\n transaction: OpenSyncTransaction<T, TKey>,\n options: LoadSubsetOptions,\n acquisition: SubsetAcquisition,\n ): Promise<void> => {\n if (options.signal?.aborted) {\n return Promise.reject(\n options.signal.reason ?? new SyncTransactionAbortedError(),\n )\n }\n return new Promise<void>((resolve, reject) => {\n const waiters =\n transaction.publicationAdmissionWaiters ??\n (transaction.publicationAdmissionWaiters = new Set())\n let settled = false\n const settle = (action: () => void) => {\n if (settled) return\n settled = true\n waiters.delete(waiter)\n options.signal?.removeEventListener(`abort`, abort)\n acquisition.cancelAdmissionWait = undefined\n action()\n }\n const waiter = {\n resolve: () => settle(resolve),\n reject: (error: unknown) => settle(() => reject(error)),\n }\n const abort = () =>\n waiter.reject(\n options.signal?.reason ?? new SyncTransactionAbortedError(),\n )\n waiters.add(waiter)\n options.signal?.addEventListener(`abort`, abort, { once: true })\n acquisition.cancelAdmissionWait = waiter.resolve\n })\n }\n const getTerminalFailure = () => runtime.getCurrentTerminalFailure()\n const reportUpstreamError = (error: unknown) => {\n if (persistedReadiness?.getSnapshot().status !== `loading`) {\n runtime.reportSyncError(error)\n return\n }\n // An early network error must not stop the live-query graph before\n // the persisted baseline has published its rows.\n void (fullStartPromise ?? runtime.ensureStarted()).then(\n () => {\n if (!isCleanedUp() && !getTerminalFailure()) {\n runtime.reportSyncError(error)\n }\n },\n () => undefined,\n )\n }\n const createHandledRejection = (error: unknown): Promise<never> => {\n const rejected = Promise.reject(error)\n void rejected.catch(() => undefined)\n return rejected\n }\n const applyTransactionToCollection = (\n transaction: OpenSyncTransaction<T, TKey>,\n signal?: AbortSignal,\n ): SyncAppliedReceipt => {\n if (transaction.applicationReceipt !== undefined) {\n return transaction.applicationReceipt\n }\n try {\n assertHydrationSequenceCurrent(transaction)\n for (const key of transaction.deferredHydrationMetadataDeleteKeys) {\n if (\n !transaction.hydrationContext?.suppliedRowKeys.has(key) &&\n !transaction.rowMetadataWrites.has(key)\n ) {\n transaction.rowMetadataWrites.set(key, { type: `delete` })\n }\n }\n transaction.deferredHydrationMetadataDeleteKeys.clear()\n\n params.begin()\n if (transaction.truncate) params.truncate()\n for (const operation of transaction.operations) {\n if (operation.type === `delete`) {\n params.write({ type: `delete`, key: operation.key })\n } else {\n params.write({\n type: `update`,\n value: operation.value,\n metadata: operation.metadata,\n })\n }\n }\n if (params.metadata) {\n for (const [key, write] of transaction.rowMetadataWrites) {\n if (write.type === `delete`) params.metadata.row.delete(key)\n else params.metadata.row.set(key, write.value)\n }\n for (const [key, write] of transaction.collectionMetadataWrites) {\n if (write.type === `delete`)\n params.metadata.collection.delete(key)\n else params.metadata.collection.set(key, write.value)\n }\n }\n\n const applied = params.commit(signal)\n transaction.applicationReceipt = applied\n // Core accepted the transaction, so it is no longer staged here;\n // the receipt resolves when it is visible.\n removePendingPublicationTransaction(transaction)\n if (applied !== true) void applied.catch(() => undefined)\n return applied\n } catch (error) {\n removePendingPublicationTransaction(transaction)\n throw error\n }\n }\n runtime.setCollection(\n params.collection as Collection<T, TKey, PersistedCollectionUtils>,\n {\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 markError: params.markError,\n },\n )\n\n const persistenceCapability: SyncPersistenceCapabilityV1<TKey> = {\n protocol: SYNC_PERSISTENCE_PROTOCOL,\n version: SYNC_PERSISTENCE_VERSION,\n get managedCacheGeneration() {\n return runtime.hasManagedCacheGeneration()\n },\n get startupCacheGenerationRotated() {\n return runtime.hasRotatedStartupCacheGeneration()\n },\n reserveCommitTurn: () => {\n const openTransaction = getOpenTransaction()\n if (openTransaction && !openTransaction.internal)\n openTransaction.reservesCommitTurn = true\n },\n hydrateBaseline: async () => {\n if (startupState.cleanedUp) return\n try {\n await runtime.ensureResumeBaselineHydrated()\n } catch (error) {\n throw runtime.reportSyncError(error)\n }\n },\n startScopedRecovery: (resetMetadata) =>\n startupState.cleanedUp\n ? Promise.resolve()\n : runtime.startScopedRecovery(resetMetadata),\n scanPersistedRows: (options) =>\n startupState.cleanedUp\n ? Promise.resolve([])\n : runtime.scanPersistedRows(options),\n resumeSnapshot: {\n certify: async () => {\n if (startupState.cleanedUp) return\n try {\n await runtime.ensureResumeBaselineCertified()\n } catch (error) {\n throw runtime.reportSyncError(error)\n }\n },\n getKeySetEvidence: () =>\n startupState.cleanedUp ? undefined : runtime.getKeySetEvidence(),\n expectCurrentCommit: () => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `resumeSnapshot.expectCurrentCommit must be called within an open sync transaction`,\n )\n }\n openTransaction.expectedResumeGenerationOwner =\n runtime.getResumeGenerationOwner()\n },\n },\n }\n\n let sourceSession = 0\n const wrappedParams = {\n ...params,\n markError: reportUpstreamError,\n markReady: () => {\n if (startupState.cleanedUp || getTerminalFailure()) return\n void (fullStartPromise ?? runtime.ensureStarted())\n .then(async () => {\n if (isCleanedUp() || getTerminalFailure()) return\n await sourceResultAssigned\n try {\n await sourceResultPromise\n } catch (error) {\n reportUpstreamError(error)\n return\n }\n if (isCleanedUp() || getTerminalFailure()) return\n params.markReady()\n })\n .catch(() => undefined)\n },\n begin: () => {\n if (startupState.cleanedUp) return undefined\n const terminalFailure = getTerminalFailure()\n const internal = runtime.isApplyingInternally()\n const transaction: OpenSyncTransaction<T, TKey> = {\n operations: [],\n partialUpdateOperationIndexes: new Set(),\n rowMetadataWrites: new Map(),\n collectionMetadataWrites: new Map(),\n deferredHydrationMetadataDeleteKeys: new Set(),\n truncate: false,\n internal,\n lifecycleGeneration: runtime.getLifecycleGeneration(),\n operationKeys: new Set(),\n hasDependentSuccessor: false,\n queuedBecauseHydrating:\n terminalFailure === undefined &&\n !internal &&\n runtime.isHydratingNow(),\n hydrationSequence:\n terminalFailure === undefined && !internal\n ? runtime.getHydrationSequence()\n : undefined,\n hydrationContext:\n terminalFailure === undefined &&\n !internal &&\n runtime.isHydratingNow()\n ? runtime.getActiveHydrationContext()\n : undefined,\n ...(terminalFailure === undefined ? {} : { terminalFailure }),\n }\n transactionStack.push(transaction)\n },\n write: (message: ChangeMessageOrDeleteKeyMessage<T, TKey>) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n const terminalFailure =\n openTransaction?.terminalFailure ?? getTerminalFailure()\n if (terminalFailure) {\n if (openTransaction)\n openTransaction.terminalFailure = terminalFailure\n return\n }\n if (!openTransaction) {\n throw new NoPendingSyncTransactionWriteError()\n }\n bindToCurrentHydration(openTransaction)\n const normalization = runtime.normalizeSyncWriteMessage(message)\n\n if (\n message.type === `update` &&\n sourceSyncConfig.rowUpdateMode !== `full`\n ) {\n if (!openTransaction.internal) {\n openTransaction.partialUpdateOperationIndexes.add(\n openTransaction.operations.length,\n )\n }\n for (const pending of pendingPublicationTransactions) {\n if (\n pending.truncate ||\n pending.operationKeys.has(normalization.operation.key)\n ) {\n markPendingMetadataDependency(pending)\n }\n }\n }\n\n openTransaction.operations.push(normalization.operation)\n openTransaction.operationKeys.add(normalization.operation.key)\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 (openTransaction.queuedBecauseHydrating) {\n openTransaction.deferredHydrationMetadataDeleteKeys.add(\n normalization.operation.key,\n )\n } else 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 },\n metadata: params.metadata\n ? {\n persistence: persistenceCapability,\n row: {\n get: (key: TKey) => {\n if (startupState.cleanedUp) return undefined\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 const pending = getPendingRowMetadataWrite(key)\n if (pending.found) {\n return pending.write.type === `delete`\n ? undefined\n : pending.write.value\n }\n return params.metadata!.row.get(key)\n },\n set: (key: TKey, value: unknown) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (openTransaction?.terminalFailure ?? getTerminalFailure())\n return\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 },\n delete: (key: TKey) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (openTransaction?.terminalFailure ?? getTerminalFailure())\n return\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 },\n },\n collection: {\n get: (key: string) => {\n if (startupState.cleanedUp) return undefined\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 const pending = getPendingCollectionMetadataWrite(key)\n if (pending.found) {\n return pending.write.type === `delete`\n ? undefined\n : pending.write.value\n }\n return params.metadata!.collection.get(key)\n },\n set: (key: string, value: unknown) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (openTransaction?.terminalFailure ?? getTerminalFailure())\n return\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 },\n delete: (key: string) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (openTransaction?.terminalFailure ?? getTerminalFailure())\n return\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 },\n list: (prefix?: string) => {\n if (startupState.cleanedUp) return []\n const merged = new Map(\n params\n .metadata!.collection.list()\n .map(({ key, value }) => [key, value]),\n )\n const pendingOwners = new Map<\n string,\n OpenSyncTransaction<T, TKey>\n >()\n for (const transaction of pendingPublicationTransactions) {\n for (const [\n key,\n metadataWrite,\n ] of transaction.collectionMetadataWrites) {\n if (!prefix || key.startsWith(prefix)) {\n pendingOwners.set(key, transaction)\n }\n if (metadataWrite.type === `delete`) {\n merged.delete(key)\n } else {\n merged.set(key, metadataWrite.value)\n }\n }\n }\n for (const owner of new Set(pendingOwners.values())) {\n markPendingMetadataDependency(owner)\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 if (startupState.cleanedUp) return\n runtime.noteSourceTruncate()\n const openTransaction = getOpenTransaction()\n if (openTransaction?.terminalFailure ?? getTerminalFailure()) return\n if (!openTransaction) {\n throw new NoPendingSyncTransactionWriteError()\n }\n\n openTransaction.operations = []\n openTransaction.operationKeys.clear()\n openTransaction.partialUpdateOperationIndexes.clear()\n openTransaction.rowMetadataWrites.clear()\n openTransaction.deferredHydrationMetadataDeleteKeys.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 },\n commit: (signal?: AbortSignal) => {\n if (startupState.cleanedUp) return true\n const openTransaction = transactionStack.pop()\n const terminalFailure =\n openTransaction?.terminalFailure ?? getTerminalFailure()\n if (terminalFailure) {\n if (openTransaction) {\n settlePendingTransaction(openTransaction)\n settlePublicationAdmissionWaiters(\n openTransaction,\n terminalFailure.error,\n )\n }\n return createHandledRejection(terminalFailure.error)\n }\n if (!openTransaction) {\n throw new NoPendingSyncTransactionCommitError()\n }\n\n if (openTransaction.internal) {\n return applyTransactionToCollection(openTransaction, signal)\n }\n\n if (signal?.aborted) {\n settlePendingTransaction(openTransaction)\n const error = new SyncTransactionAbortedError()\n settlePublicationAdmissionWaiters(openTransaction, error)\n return createHandledRejection(error)\n }\n if (runtime.isScopedRecoveryPending()) {\n settlePendingTransaction(openTransaction)\n const error = new SyncTransactionAbortedError()\n settlePublicationAdmissionWaiters(openTransaction, error)\n return createHandledRejection(error)\n }\n try {\n bindToCurrentHydration(openTransaction)\n assertHydrationSequenceCurrent(openTransaction)\n } catch (error) {\n settlePublicationAdmissionWaiters(openTransaction, error)\n throw error\n }\n const transaction = {\n operations: openTransaction.operations,\n partialUpdateOperationIndexes:\n openTransaction.partialUpdateOperationIndexes,\n rowMetadataWrites: openTransaction.rowMetadataWrites,\n collectionMetadataWrites: openTransaction.collectionMetadataWrites,\n deferredHydrationMetadataDeleteKeys:\n openTransaction.deferredHydrationMetadataDeleteKeys,\n hydrationContext: openTransaction.hydrationContext,\n hydrationSequence: openTransaction.hydrationSequence,\n truncate: openTransaction.truncate,\n internal: false,\n lifecycleGeneration: openTransaction.lifecycleGeneration,\n expectedResumeGenerationOwner:\n openTransaction.expectedResumeGenerationOwner,\n signal,\n prependHydrationRows: (\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n ) => {\n const baselineOperations: Array<\n NormalizedSyncOperation<T, TKey>\n > = rows.map(({ key, value, metadata }) => ({\n type: `update`,\n key,\n value,\n metadata: metadata as Record<string, unknown> | undefined,\n }))\n openTransaction.operations = baselineOperations.concat(\n openTransaction.operations,\n )\n for (const { key, metadata } of rows) {\n if (\n metadata !== undefined &&\n !openTransaction.rowMetadataWrites.has(key)\n ) {\n openTransaction.rowMetadataWrites.set(key, {\n type: `set`,\n value: metadata,\n })\n }\n }\n },\n applyToCollection: () =>\n applyTransactionToCollection(openTransaction, signal),\n shouldFailStopOnAbort: () => openTransaction.hasDependentSuccessor,\n }\n openTransaction.signal = signal\n pendingPublicationTransactions.push(openTransaction)\n if (\n openTransaction.queuedBecauseHydrating &&\n runtime.isHydratingNow()\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 ...transaction,\n resolveApplied,\n rejectApplied,\n })\n settlePublicationAdmissionWaiters(openTransaction)\n settleRuntimeTransaction(openTransaction, applied)\n return visibleAfterDurable(openTransaction, applied)\n }\n\n // Admission is complete. Only queued hydration replay remains tied\n // to its sequence; retain hydrationContext for row metadata ownership.\n openTransaction.hydrationSequence = undefined\n let applied: Promise<void>\n try {\n applied = runtime.applyHydrationBufferedTransaction(transaction)\n } catch (error) {\n settlePublicationAdmissionWaiters(openTransaction, error)\n throw error\n }\n settlePublicationAdmissionWaiters(openTransaction)\n settleRuntimeTransaction(openTransaction, applied)\n return visibleAfterDurable(openTransaction, applied)\n },\n }\n\n // Each invocation of a custom source owns its callbacks. Retiring that\n // invocation before rotation makes late work harmless even when the\n // source does not provide its own restart hook.\n const sourceParamsFor = (session: number) => {\n const active = () =>\n !startupState.cleanedUp && session === sourceSession\n const metadata = wrappedParams.metadata\n return {\n ...wrappedParams,\n markReady: () => {\n if (active()) wrappedParams.markReady()\n },\n markError: (error?: unknown) => {\n if (active()) wrappedParams.markError(error)\n },\n begin: () => {\n if (active()) wrappedParams.begin()\n },\n write: (message: ChangeMessageOrDeleteKeyMessage<T, TKey>) => {\n if (active()) wrappedParams.write(message)\n },\n truncate: () => {\n if (active()) wrappedParams.truncate()\n },\n commit: (signal?: AbortSignal) =>\n active() ? wrappedParams.commit(signal) : true,\n metadata: metadata && {\n ...metadata,\n row: {\n get: (key: TKey) =>\n active() ? metadata.row.get(key) : undefined,\n set: (key: TKey, value: unknown) => {\n if (active()) metadata.row.set(key, value)\n },\n delete: (key: TKey) => {\n if (active()) metadata.row.delete(key)\n },\n },\n collection: {\n get: (key: string) =>\n active() ? metadata.collection.get(key) : undefined,\n set: (key: string, value: unknown) => {\n if (active()) metadata.collection.set(key, value)\n },\n delete: (key: string) => {\n if (active()) metadata.collection.delete(key)\n },\n list: (prefix?: string) =>\n active() ? metadata.collection.list(prefix) : [],\n },\n persistence: {\n ...metadata.persistence,\n reserveCommitTurn: () => {\n if (active()) metadata.persistence.reserveCommitTurn()\n },\n hydrateBaseline: () =>\n active()\n ? metadata.persistence.hydrateBaseline()\n : Promise.resolve(),\n startScopedRecovery: (resetMetadata?: {\n key: string\n value: unknown\n }) =>\n active()\n ? (metadata.persistence.startScopedRecovery?.(\n resetMetadata,\n ) ?? Promise.resolve())\n : Promise.resolve(),\n scanPersistedRows: (\n options?: Parameters<\n typeof metadata.persistence.scanPersistedRows\n >[0],\n ) =>\n active()\n ? metadata.persistence.scanPersistedRows(options)\n : Promise.resolve([]),\n resumeSnapshot: {\n certify: () =>\n active()\n ? metadata.persistence.resumeSnapshot.certify()\n : Promise.resolve(),\n getKeySetEvidence: () =>\n active()\n ? metadata.persistence.resumeSnapshot.getKeySetEvidence()\n : undefined,\n expectCurrentCommit: () => {\n if (active())\n metadata.persistence.resumeSnapshot.expectCurrentCommit()\n },\n },\n },\n },\n }\n }\n\n let sourceResult: SyncConfigRes = {}\n let sourceResultSettled = false\n let activeSourceSyncEntry: Promise<void> | undefined\n let sourceCleanupPromise: Promise<void> | undefined\n let customRestartSequence = 0\n const enterSourceSession = (): void => {\n const session = ++sourceSession\n let settleSourceSyncEntry!: () => void\n activeSourceSyncEntry = new Promise<void>((resolve) => {\n settleSourceSyncEntry = resolve\n })\n try {\n sourceResult = normalizeSyncFnResult(\n sourceSyncConfig.sync(\n runtime.hasManagedCacheGeneration()\n ? sourceParamsFor(session)\n : wrappedParams,\n ),\n )\n // A coordinator acquisition owns the source session that accepted\n // it. A late release must not unload the replacement session.\n if (!startupState.cleanedUp && sourceResult.loadSubset) {\n const ownerSource = sourceResult\n const loadSubset = async (\n options: TransportedLoadSubsetOptions,\n ) => {\n if (startupState.cleanedUp || session !== sourceSession) {\n throw new Error(`persisted sync source is no longer active`)\n }\n await ownerSource.loadSubset?.(\n options as unknown as LoadSubsetOptions,\n )\n }\n runtime.registerRemoteSubsetOwner(\n Object.assign(loadSubset, {\n unloadSubset: (options: TransportedLoadSubsetOptions) =>\n ownerSource.unloadSubset?.(\n options as unknown as LoadSubsetOptions,\n ),\n onError: (error: unknown) => {\n if (session === sourceSession) reportUpstreamError(error)\n },\n }),\n )\n }\n } finally {\n activeSourceSyncEntry = undefined\n settleSourceSyncEntry()\n }\n }\n const restartCustomSource = (cacheRotated: Promise<void>) => {\n const restartSequence = ++customRestartSequence\n // Synchronous retirement is required by the recovery boundary. Any\n // open old-source transaction is abandoned before the new cache binds.\n if (!sourceCleanupPromise) {\n sourceSession++\n const abortError = new SyncTransactionAbortedError()\n for (const transaction of transactionStack) {\n settlePublicationAdmissionWaiters(transaction, abortError)\n }\n transactionStack.length = 0\n const retiredResult = sourceResult\n sourceCleanupPromise = Promise.resolve().then(() =>\n retiredResult.cleanup?.(),\n )\n }\n return Promise.all([sourceCleanupPromise, cacheRotated]).then(() => {\n if (\n startupState.cleanedUp ||\n restartSequence !== customRestartSequence\n )\n return\n sourceCleanupPromise = undefined\n enterSourceSession()\n runtime.setSourceRestartAfterScopedRecovery(\n sourceResult.restartAfterScopedRecovery ??\n (runtime.hasManagedCacheGeneration()\n ? restartCustomSource\n : undefined),\n )\n })\n }\n fullStartPromise = runtime.ensureStarted()\n // Startup can fail before the source reaches markReady or loadSubset,\n // which are the two eventual consumers of this outer adopting promise.\n // The runtime-owned inner promise still installs and reports the exact\n // terminal failure; this observer only prevents the unused outer wrapper\n // from becoming an unhandled rejection on that fail-stop path.\n void fullStartPromise.catch(() => undefined)\n sourceResultPromise = (async () => {\n await runtime.ensureStartupMetadataLoaded()\n\n if (startupState.cleanedUp) {\n sourceResultSettled = true\n return sourceResult\n }\n\n enterSourceSession()\n sourceResultSettled = true\n runtime.setSourceRestartAfterScopedRecovery(\n sourceResult.restartAfterScopedRecovery ??\n (runtime.hasManagedCacheGeneration()\n ? restartCustomSource\n : undefined),\n )\n return sourceResult\n })()\n resolveSourceResultAssigned()\n void sourceResultPromise.catch((error) => {\n reportUpstreamError(error)\n })\n\n return {\n cleanup: async () => {\n startupState.cleanedUp = true\n runtime.clearSourceRestartAfterScopedRecovery()\n // The optional source starts behind persistence metadata. If it\n // reenters cleanup before returning, wait for that exact synchronous\n // entry to publish its cleanup callback before sampling the result.\n const sourceSyncEntry = activeSourceSyncEntry\n const cleanupError = new SyncTransactionAbortedError()\n for (const acquisition of acquisitions.values()) {\n acquisition.cancelAdmissionWait?.()\n }\n acquisitions.clear()\n pendingPublicationTransactions.length = 0\n for (const transaction of transactionStack) {\n settlePublicationAdmissionWaiters(transaction, cleanupError)\n }\n transactionStack.length = 0\n let sourceCleanup: Promise<void>\n try {\n sourceCleanup =\n sourceCleanupPromise ??\n (sourceSyncEntry\n ? sourceSyncEntry.then(() => sourceResult.cleanup?.())\n : Promise.resolve(sourceResult.cleanup?.()))\n } catch (error) {\n sourceCleanup = Promise.reject(error)\n }\n let runtimeCleanup: Promise<void>\n try {\n runtimeCleanup = runtime.cleanup()\n } catch (error) {\n runtimeCleanup = Promise.reject(error)\n }\n const [sourceOutcome, runtimeOutcome] = await Promise.allSettled([\n sourceCleanup,\n runtimeCleanup,\n ])\n if (\n sourceOutcome.status === `rejected` &&\n runtimeOutcome.status === `rejected`\n ) {\n throw new AggregateError(\n [sourceOutcome.reason, runtimeOutcome.reason],\n `Source cleanup and persistence runtime teardown both failed`,\n { cause: sourceOutcome.reason },\n )\n }\n if (sourceOutcome.status === `rejected`) throw sourceOutcome.reason\n if (runtimeOutcome.status === `rejected`) throw runtimeOutcome.reason\n },\n loadSubset: (options: LoadSubsetOptions): true | Promise<void> => {\n const acquisition: SubsetAcquisition = { forwarded: false }\n acquisitions.set(options, acquisition)\n const forwardUpstream = (\n loadOptions: LoadSubsetOptions,\n ): true | Promise<void> => {\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 const currentSource = sourceResult\n if (!currentSource.loadSubset) return true\n acquisition.forwarded = true\n acquisition.source = currentSource\n try {\n // Returning a promise transfers its lease even if it rejects.\n // Only a synchronous throw leaves no upstream lease to release.\n return currentSource.loadSubset(loadOptions)\n } catch (error) {\n acquisition.forwarded = false\n acquisition.source = undefined\n throw error\n }\n }\n\n const openTransaction = getOpenTransaction()\n const needsPublicationAdmission =\n openTransaction?.reservesCommitTurn === true\n let hydrationStarted = false\n const raceRetainedLoad = (\n work: Promise<void>,\n canAbortPromptly = () => true,\n ): Promise<void> => {\n const signal = options.signal\n const abortable = !signal\n ? work\n : new Promise<void>((resolve, reject) => {\n const abortError = () =>\n signal.reason ?? new SyncTransactionAbortedError()\n const onAbort = () => {\n // Once an uncancelable baseline read begins, its returned\n // load keeps core's overlapping replay private until the\n // resulting rows and receipts become visible.\n if (canAbortPromptly()) reject(abortError())\n }\n signal.addEventListener(`abort`, onAbort, { once: true })\n if (signal.aborted) onAbort()\n void work.then(\n () => {\n signal.removeEventListener(`abort`, onAbort)\n if (signal.aborted) reject(abortError())\n else resolve()\n },\n (error: unknown) => {\n signal.removeEventListener(`abort`, onAbort)\n reject(signal.aborted ? abortError() : error)\n },\n )\n })\n return abortable.catch((error: unknown) => {\n if (\n startupState.cleanedUp ||\n acquisitions.get(options) !== acquisition\n ) {\n return\n }\n throw error\n })\n }\n const hydrated =\n sourceResultSettled && !needsPublicationAdmission\n ? runtime.loadHydratedSubset(options, (loadOptions) =>\n forwardUpstream(loadOptions),\n )\n : undefined\n if (hydrated !== undefined) {\n return hydrated === true ? true : raceRetainedLoad(hydrated)\n }\n\n const work = (async () => {\n await fullStartPromise\n await sourceResultPromise\n if (\n startupState.cleanedUp ||\n acquisitions.get(options) !== acquisition\n ) {\n return\n }\n const currentTransaction = getOpenTransaction()\n // A source transaction that reserved its FIFO turn commits before\n // subset hydration advances the generation it was built against.\n if (currentTransaction?.reservesCommitTurn) {\n await waitForPublicationAdmission(\n currentTransaction,\n options,\n acquisition,\n )\n }\n if (\n options.signal?.aborted ||\n acquisitions.get(options) !== acquisition\n ) {\n return\n }\n return runtime.loadSubset(\n options,\n (loadOptions) => forwardUpstream(loadOptions),\n () => {\n hydrationStarted = true\n },\n () =>\n !startupState.cleanedUp &&\n acquisitions.get(options) === acquisition,\n )\n })()\n return raceRetainedLoad(work, () => !hydrationStarted)\n },\n unloadSubset: (options: LoadSubsetOptions) => {\n const acquisition = acquisitions.get(options)\n acquisition?.cancelAdmissionWait?.()\n acquisitions.delete(options)\n runtime.unloadSubset(\n options,\n acquisition?.forwarded\n ? acquisition.source?.unloadSubset\n : 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.setCollection(\n params.collection as Collection<T, TKey, PersistedCollectionUtils>,\n {\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 markError: params.markError,\n },\n )\n\n void runtime\n .ensureStarted()\n .then(() => {\n if (runtime.getCurrentTerminalFailure()) return\n params.markReady()\n })\n .catch(() => undefined)\n\n return {\n loadSubset: (options: LoadSubsetOptions): true | Promise<void> =>\n runtime.loadHydratedSubset(options) ?? runtime.loadSubset(options),\n cleanup: () => runtime.cleanup(),\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 TSchema extends StandardSchemaV1,\n TKey extends string | number,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: PersistedSyncWrappedOptions<\n InferSchemaOutput<TSchema>,\n TKey,\n TSchema,\n TUtils\n > & {\n schema: TSchema\n },\n): PersistedSyncOptionsResult<\n InferSchemaOutput<TSchema>,\n TKey,\n TSchema,\n TUtils\n> & {\n schema: TSchema\n}\n\nexport function persistedCollectionOptions<\n TSchema extends StandardSchemaV1,\n TKey extends string | number,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: PersistedLocalOnlyOptions<\n InferSchemaOutput<TSchema>,\n TKey,\n TSchema,\n TUtils\n > & {\n schema: TSchema\n },\n): PersistedLocalOnlyOptionsResult<\n InferSchemaOutput<TSchema>,\n TKey,\n TSchema,\n TUtils\n> & {\n schema: TSchema\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 schema?: never\n },\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 schema?: never\n },\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 const networkTimeoutMs = getNetworkTimeoutMs(options.initialRender)\n if (networkTimeoutMs !== undefined && options.syncMode === `on-demand`) {\n throw new InvalidPersistedCollectionConfigError(\n `network-first initial rendering requires eager persistence syncMode`,\n )\n }\n const persistedReadinessTracker =\n networkTimeoutMs !== undefined\n ? new PersistedReadinessTracker(networkTimeoutMs)\n : undefined\n\n let claimed = false\n let claimedRuntime: PersistedCollectionRuntime<T, TKey> | undefined\n const claimOptions = () => {\n if (claimed) {\n throw new InvalidPersistedCollectionConfigError(\n `Persisted options can create only one Collection. Create fresh options for each Collection.`,\n )\n }\n claimed = true\n return () => {\n if (!claimedRuntime?.hasBoundCollection()) claimed = false\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 {\n schemaVersion,\n initialRender: _initialRender,\n ...syncOptions\n } = 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 persistedReadinessTracker,\n claimOptions,\n )\n claimedRuntime = runtime\n\n const result = {\n ...syncOptions,\n id: collectionId,\n sync: createWrappedSyncConfig<T, TKey>(\n syncOptions.sync,\n runtime,\n persistedReadinessTracker,\n ),\n persistence,\n ...(persistedReadinessTracker\n ? { [PERSISTED_READINESS]: persistedReadinessTracker }\n : {}),\n }\n\n return withCollectionConfigFactory(\n result,\n () =>\n persistedCollectionOptions({\n ...options,\n id: collectionId,\n } as never) as typeof result,\n claimOptions,\n )\n }\n\n const {\n schemaVersion,\n initialRender: _initialRender,\n ...localOnlyOptions\n } = 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 persistedReadinessTracker,\n claimOptions,\n )\n claimedRuntime = runtime\n\n const wrappedOnInsert = async (\n params: InsertMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const lifecycleGeneration = runtime.getLifecycleGeneration()\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 lifecycleGeneration,\n )\n\n return handlerResult ?? {}\n }\n\n const wrappedOnUpdate = async (\n params: UpdateMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const lifecycleGeneration = runtime.getLifecycleGeneration()\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 lifecycleGeneration,\n )\n\n return handlerResult ?? {}\n }\n\n const wrappedOnDelete = async (\n params: DeleteMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const lifecycleGeneration = runtime.getLifecycleGeneration()\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 lifecycleGeneration,\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 ...(persistedReadinessTracker\n ? { [PERSISTED_READINESS]: persistedReadinessTracker }\n : {}),\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 never) as typeof result,\n claimOptions,\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":["InvalidPersistedCollectionConfigError","safeRandomUUID","toTransportedLoadSubsetOptions","toProcessLocalLoadSubsetOptions","reportRemoteSubsetOwnerError","unloadRemoteSubsetOwner","DuplicateRemoteSubsetOwnerError","toPersistedCollectionDurabilityError","InvalidPersistedCollectionCoordinatorError","InvalidPersistenceAdapterError","toBooleanPredicate","serializeSQLiteBigInt","serializeSQLiteTemporal","whenSyncAccepted","SyncTransactionAbortedError","collectionOptionsClaim","validateRemoteSubsetOptions","getLoadSubsetDemandKey","key","PersistedCollectionDurabilityError","equalPersistedSnapshotValues","IndeterminateCommitError","compileSingleRowExpression","withAcceptedReceipt","SYNC_PERSISTENCE_PROTOCOL","SYNC_PERSISTENCE_VERSION","NoPendingSyncTransactionWriteError","NoPendingSyncTransactionCommitError","applied","work","InvalidSyncConfigError","schemaVersion","_initialRender","collectionId","persistence","runtime","result","PERSISTED_READINESS","withCollectionConfigFactory","InvalidPersistedStorageKeyError","InvalidPersistedStorageKeyEncodingError"],"mappings":"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"}