@firtoz/collection-sync 4.0.0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -0
- package/dist/cache-manager.d.ts +52 -0
- package/dist/cache-manager.js +5 -0
- package/dist/cache-manager.js.map +1 -0
- package/dist/chunk-3EHHMLSV.js +57 -0
- package/dist/chunk-3EHHMLSV.js.map +1 -0
- package/dist/chunk-43KYAIKY.js +46 -0
- package/dist/chunk-43KYAIKY.js.map +1 -0
- package/dist/chunk-4BEXLBCH.js +64 -0
- package/dist/chunk-4BEXLBCH.js.map +1 -0
- package/dist/chunk-5V6BSQAB.js +148 -0
- package/dist/chunk-5V6BSQAB.js.map +1 -0
- package/dist/chunk-5VMFQT5Z.js +112 -0
- package/dist/chunk-5VMFQT5Z.js.map +1 -0
- package/dist/chunk-6EHROJFY.js +111 -0
- package/dist/chunk-6EHROJFY.js.map +1 -0
- package/dist/chunk-6X3434GJ.js +21 -0
- package/dist/chunk-6X3434GJ.js.map +1 -0
- package/dist/chunk-BGJH6PH2.js +175 -0
- package/dist/chunk-BGJH6PH2.js.map +1 -0
- package/dist/chunk-BJJEAKXL.js +252 -0
- package/dist/chunk-BJJEAKXL.js.map +1 -0
- package/dist/chunk-GWIOC5CP.js +51 -0
- package/dist/chunk-GWIOC5CP.js.map +1 -0
- package/dist/chunk-HMLY7DHA.js +12 -0
- package/dist/chunk-HMLY7DHA.js.map +1 -0
- package/dist/chunk-I6RJWBGF.js +112 -0
- package/dist/chunk-I6RJWBGF.js.map +1 -0
- package/dist/chunk-M5MJHS6A.js +10 -0
- package/dist/chunk-M5MJHS6A.js.map +1 -0
- package/dist/chunk-O3KBDCEI.js +615 -0
- package/dist/chunk-O3KBDCEI.js.map +1 -0
- package/dist/chunk-OP53UBPN.js +19 -0
- package/dist/chunk-OP53UBPN.js.map +1 -0
- package/dist/chunk-P3JOTUAB.js +802 -0
- package/dist/chunk-P3JOTUAB.js.map +1 -0
- package/dist/chunk-QJP4GSJH.js +373 -0
- package/dist/chunk-QJP4GSJH.js.map +1 -0
- package/dist/chunk-RDDS7JQW.js +623 -0
- package/dist/chunk-RDDS7JQW.js.map +1 -0
- package/dist/chunk-TEH7V76G.js +209 -0
- package/dist/chunk-TEH7V76G.js.map +1 -0
- package/dist/chunk-UJ24XW52.js +20 -0
- package/dist/chunk-UJ24XW52.js.map +1 -0
- package/dist/chunk-UVZJL6QV.js +18 -0
- package/dist/chunk-UVZJL6QV.js.map +1 -0
- package/dist/chunk-XC4QNFSQ.js +238 -0
- package/dist/chunk-XC4QNFSQ.js.map +1 -0
- package/dist/chunk-YD5LVGWX.js +125 -0
- package/dist/chunk-YD5LVGWX.js.map +1 -0
- package/dist/chunk-YYGPIHHJ.js +166 -0
- package/dist/chunk-YYGPIHHJ.js.map +1 -0
- package/dist/connect-partial-sync.d.ts +41 -0
- package/dist/connect-partial-sync.js +6 -0
- package/dist/connect-partial-sync.js.map +1 -0
- package/dist/connect-sync.d.ts +26 -0
- package/dist/connect-sync.js +5 -0
- package/dist/connect-sync.js.map +1 -0
- package/dist/create-partial-synced-collection.d.ts +24 -0
- package/dist/create-partial-synced-collection.js +8 -0
- package/dist/create-partial-synced-collection.js.map +1 -0
- package/dist/create-synced-collection.d.ts +26 -0
- package/dist/create-synced-collection.js +8 -0
- package/dist/create-synced-collection.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/partial-sync-client-bridge.d.ts +157 -0
- package/dist/partial-sync-client-bridge.js +6 -0
- package/dist/partial-sync-client-bridge.js.map +1 -0
- package/dist/partial-sync-interest.d.ts +48 -0
- package/dist/partial-sync-interest.js +6 -0
- package/dist/partial-sync-interest.js.map +1 -0
- package/dist/partial-sync-mutation-handler.d.ts +31 -0
- package/dist/partial-sync-mutation-handler.js +6 -0
- package/dist/partial-sync-mutation-handler.js.map +1 -0
- package/dist/partial-sync-predicate-match.d.ts +8 -0
- package/dist/partial-sync-predicate-match.js +4 -0
- package/dist/partial-sync-predicate-match.js.map +1 -0
- package/dist/partial-sync-row-key.d.ts +41 -0
- package/dist/partial-sync-row-key.js +4 -0
- package/dist/partial-sync-row-key.js.map +1 -0
- package/dist/partial-sync-server-bridge.d.ts +102 -0
- package/dist/partial-sync-server-bridge.js +8 -0
- package/dist/partial-sync-server-bridge.js.map +1 -0
- package/dist/react/constants.d.ts +12 -0
- package/dist/react/constants.js +4 -0
- package/dist/react/constants.js.map +1 -0
- package/dist/react/index.d.ts +19 -0
- package/dist/react/index.js +17 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/partial-sync-adapter.d.ts +40 -0
- package/dist/react/partial-sync-adapter.js +4 -0
- package/dist/react/partial-sync-adapter.js.map +1 -0
- package/dist/react/partial-sync-utils.d.ts +42 -0
- package/dist/react/partial-sync-utils.js +5 -0
- package/dist/react/partial-sync-utils.js.map +1 -0
- package/dist/react/range-conditions-expression.d.ts +49 -0
- package/dist/react/range-conditions-expression.js +4 -0
- package/dist/react/range-conditions-expression.js.map +1 -0
- package/dist/react/types.d.ts +196 -0
- package/dist/react/types.js +3 -0
- package/dist/react/types.js.map +1 -0
- package/dist/react/usePartialSyncCollection.d.ts +20 -0
- package/dist/react/usePartialSyncCollection.js +10 -0
- package/dist/react/usePartialSyncCollection.js.map +1 -0
- package/dist/react/usePartialSyncViewport.d.ts +20 -0
- package/dist/react/usePartialSyncViewport.js +7 -0
- package/dist/react/usePartialSyncViewport.js.map +1 -0
- package/dist/react/usePartialSyncWindow.d.ts +17 -0
- package/dist/react/usePartialSyncWindow.js +12 -0
- package/dist/react/usePartialSyncWindow.js.map +1 -0
- package/dist/react/usePredicateFilteredRows.d.ts +20 -0
- package/dist/react/usePredicateFilteredRows.js +6 -0
- package/dist/react/usePredicateFilteredRows.js.map +1 -0
- package/dist/sync-client-bridge.d.ts +48 -0
- package/dist/sync-client-bridge.js +6 -0
- package/dist/sync-client-bridge.js.map +1 -0
- package/dist/sync-protocol.d.ts +378 -0
- package/dist/sync-protocol.js +4 -0
- package/dist/sync-protocol.js.map +1 -0
- package/dist/sync-server-bridge.d.ts +35 -0
- package/dist/sync-server-bridge.js +6 -0
- package/dist/sync-server-bridge.js.map +1 -0
- package/dist/with-sync.d.ts +107 -0
- package/dist/with-sync.js +7 -0
- package/dist/with-sync.js.map +1 -0
- package/package.json +27 -21
- package/src/connect-partial-sync.ts +16 -12
- package/src/connect-sync.ts +12 -10
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/partial-sync-client-bridge.ts"],"names":[],"mappings":"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","file":"chunk-P3JOTUAB.js","sourcesContent":["import type { SyncMessage } from \"@firtoz/db-helpers\";\nimport { exhaustiveGuard } from \"@firtoz/maybe-error\";\nimport type {\n\tRangeFingerprint,\n\tSyncClientMessage,\n\tSyncClientMessageBody,\n\tSyncRange,\n\tSyncRangeSort,\n\tSyncServerMessage,\n} from \"./sync-protocol\";\nimport { DEFAULT_SYNC_COLLECTION_ID } from \"./sync-protocol\";\nimport { createClientMutationId } from \"./sync-protocol\";\nimport {\n\tpartialSyncRowKey,\n\tpartialSyncRowVersionWatermarkMs,\n\ttype PartialSyncRowShape,\n} from \"./partial-sync-row-key\";\nimport type { PartialSyncViewTransition } from \"./partial-sync-interest\";\n\nexport type PartialSyncViewTransitionEvent<TItem extends PartialSyncRowShape> =\n\t{\n\t\ttype: PartialSyncViewTransition;\n\t\tchange: SyncMessage<TItem>;\n\t};\n\nexport type PartialSyncRangePatchAppliedEvent<\n\tTItem extends PartialSyncRowShape,\n> = {\n\tchange: SyncMessage<TItem>;\n\tviewTransition?: PartialSyncViewTransition;\n};\n\ntype CollectionWithReceiveSync<TItem> = {\n\tutils: {\n\t\treceiveSync: (messages: SyncMessage<TItem>[]) => Promise<void>;\n\t};\n\t/**\n\t * When set, server `queryRangeChunk` rows can become `update` messages when the collection\n\t * already holds that id — including durable hydration (IndexedDB / SQLite reload) where rows\n\t * exist before {@link PartialSyncClientBridge.seedHydratedLocalRows} runs or if it is skipped.\n\t * Without this, the bridge may emit `insert` and hit duplicate-key errors from `receiveSync`.\n\t */\n\tget?: (key: string | number) => TItem | undefined;\n};\n\nfunction serverRowSupersedesLocal<TItem extends PartialSyncRowShape>(\n\tlocal: TItem,\n\tserver: TItem,\n): boolean {\n\tconst lm = partialSyncRowVersionWatermarkMs(local);\n\tconst sm = partialSyncRowVersionWatermarkMs(server);\n\tif (sm > lm) return true;\n\tif (sm < lm) return false;\n\ttry {\n\t\treturn JSON.stringify(local) !== JSON.stringify(server);\n\t} catch {\n\t\treturn true;\n\t}\n}\n\ntype SendFn = (msg: SyncClientMessage) => void;\n\nexport type PartialSyncState =\n\t| { status: \"offline\" }\n\t| { status: \"connecting\" }\n\t| { status: \"connected\" }\n\t| { status: \"fetching\"; requestId: string; chunksReceived: number }\n\t| {\n\t\t\tstatus: \"partial\";\n\t\t\tcachedCount: number;\n\t\t\ttotalCount: number;\n\t\t\tcacheUtilization: number;\n\t }\n\t| {\n\t\t\tstatus: \"realtime\";\n\t\t\tcachedCount: number;\n\t\t\ttotalCount: number;\n\t\t\tcacheUtilization: number;\n\t }\n\t| { status: \"evicting\"; cachedCount: number; evictingCount: number }\n\t| { status: \"disconnected\"; cachedCount: number }\n\t| { status: \"error\"; message: string };\n\nexport type PartialSyncRangeResult<TItem> = {\n\trows: TItem[];\n\ttotalCount: number;\n\tlastCursor: unknown | null;\n\thasMore: boolean;\n\t/** Server applied a small delta; caller may need to refetch the window without fingerprint. */\n\tinvalidateWindow?: boolean;\n\t/** Server confirmed fingerprint; no new rows on the wire. */\n\tupToDate?: boolean;\n};\n\nexport type PartialSyncReconcileResult<TItem extends PartialSyncRowShape> = {\n\tadded: TItem[];\n\tupdated: TItem[];\n\tstaleIds: Array<string | number>;\n\tmovedHints: Array<{ id: string | number; hint: Record<string, unknown> }>;\n\ttotalCount: number;\n};\n\nexport interface PartialSyncClientBridgeOptions<\n\tTItem extends PartialSyncRowShape,\n> {\n\t/** Defaults to a random UUID when omitted (must match {@link SyncClientBridge} when using mutations). */\n\tclientId?: string;\n\t/** Must match the server's partial-sync {@link PartialSyncServerBridgeOptions.collectionId}. */\n\tcollectionId?: string;\n\tcollection: CollectionWithReceiveSync<TItem>;\n\tsend: SendFn;\n\tonStateChange?: (state: PartialSyncState) => void;\n\tbeforeApplyRows?: (rows: TItem[]) => Promise<void>;\n\t/** Fired when a `rangePatch` carries `viewTransition` (row crossed client interest). */\n\tonViewTransition?: (event: PartialSyncViewTransitionEvent<TItem>) => void;\n\t/** Fired after any `rangePatch` is applied (including view transitions). */\n\tonRangePatchApplied?: (\n\t\tevent: PartialSyncRangePatchAppliedEvent<TItem>,\n\t) => void;\n}\n\ntype InFlightRequest<TItem> = {\n\trequestId: string;\n\trows: TItem[];\n\ttotalCount: number;\n\tlastCursor: unknown | null;\n\thasMore: boolean;\n\tchunksReceived: number;\n\tresolve: (result: PartialSyncRangeResult<TItem>) => void;\n\treject: (error: unknown) => void;\n};\n\ntype InFlightReconcileRequest<TItem extends PartialSyncRowShape> = {\n\trequestId: string;\n\tresolve: (result: PartialSyncReconcileResult<TItem>) => void;\n\treject: (error: unknown) => void;\n};\n\nexport class PartialSyncClientBridge<TItem extends PartialSyncRowShape> {\n\treadonly clientId: string;\n\treadonly collectionId: string;\n\t#connected = false;\n\t#state: PartialSyncState = { status: \"offline\" };\n\t#inFlightRequests = new Map<string, InFlightRequest<TItem>>();\n\t#inFlightReconcileRequests = new Map<\n\t\tstring,\n\t\tInFlightReconcileRequest<TItem>\n\t>();\n\t#cachedIds = new Set<string | number>();\n\t#cacheUtilization = 0;\n\t#totalCount = 0;\n\t#sendFn: SendFn;\n\t/** Row keys last delivered by a completed server range response (see viewport `cacheDisplayMode`). */\n\t#serverConfirmedKeys = new Set<string | number>();\n\t#serverConfirmedKeysRevision = 0;\n\t#confirmedRevisionListeners = new Set<() => void>();\n\t/**\n\t * Ensures `queryRangeChunk` / `rangeDelta` handlers never overlap: concurrent\n\t * {@link handleServerMessage} calls must not run `receiveSync` in parallel for range fetches.\n\t */\n\t#rangeFetchApplySerial: Promise<void> = Promise.resolve();\n\t/**\n\t * Plain `rangePatch` updates: merge by row key. `connectPartialSync` calls\n\t * `flushPendingCoalescedInboundUpdates` after each inbound pump pass; call it yourself if you use\n\t * the bridge without that helper.\n\t */\n\t#pendingCoalescedUpdatesByKey = new Map<\n\t\tstring | number,\n\t\tExtract<SyncMessage<TItem>, { type: \"update\" }>\n\t>();\n\n\tconstructor(private readonly options: PartialSyncClientBridgeOptions<TItem>) {\n\t\tthis.clientId = options.clientId ?? crypto.randomUUID();\n\t\tthis.collectionId = options.collectionId ?? DEFAULT_SYNC_COLLECTION_ID;\n\t\tthis.#sendFn = options.send;\n\t}\n\n\t#out(msg: SyncClientMessageBody): void {\n\t\tthis.#sendFn({\n\t\t\t...msg,\n\t\t\tcollectionId: this.collectionId,\n\t\t} as SyncClientMessage);\n\t}\n\n\t#scheduleRangeFetchApply(fn: () => Promise<void>): Promise<void> {\n\t\tconst next = this.#rangeFetchApplySerial.catch(() => {}).then(fn);\n\t\tthis.#rangeFetchApplySerial = next;\n\t\treturn next;\n\t}\n\n\tget state(): PartialSyncState {\n\t\treturn this.#state;\n\t}\n\n\tget cachedCount(): number {\n\t\treturn this.#cachedIds.size;\n\t}\n\n\tsetConnecting(): void {\n\t\tthis.#pendingCoalescedUpdatesByKey.clear();\n\t\tthis.#setState({ status: \"connecting\" });\n\t}\n\n\tsetConnected(connected: boolean): void {\n\t\tthis.#connected = connected;\n\t\tif (!connected) {\n\t\t\tthis.#pendingCoalescedUpdatesByKey.clear();\n\t\t\tthis.#setState({ status: \"disconnected\", cachedCount: this.cachedCount });\n\t\t\treturn;\n\t\t}\n\t\tif (this.cachedCount > 0) {\n\t\t\tthis.#setState({\n\t\t\t\tstatus: \"realtime\",\n\t\t\t\tcachedCount: this.cachedCount,\n\t\t\t\ttotalCount: this.#totalCount,\n\t\t\t\tcacheUtilization: this.#cacheUtilization,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis.#setState({ status: \"connected\" });\n\t}\n\n\tsetOffline(): void {\n\t\tthis.#connected = false;\n\t\tthis.#pendingCoalescedUpdatesByKey.clear();\n\t\tthis.#setState({ status: \"offline\" });\n\t}\n\n\tsetSend(send: SendFn): void {\n\t\tthis.#sendFn = send;\n\t}\n\n\tsetError(message: string): void {\n\t\tthis.#setState({ status: \"error\", message });\n\t}\n\n\tsetCacheUtilization(utilization: number): void {\n\t\tthis.#cacheUtilization = Math.max(0, utilization);\n\t\tif (this.#state.status === \"partial\" || this.#state.status === \"realtime\") {\n\t\t\tthis.#setState({\n\t\t\t\t...this.#state,\n\t\t\t\tcacheUtilization: this.#cacheUtilization,\n\t\t\t});\n\t\t}\n\t}\n\n\tsetEvicting(evictingCount: number): void {\n\t\tthis.#setState({\n\t\t\tstatus: \"evicting\",\n\t\t\tcachedCount: this.cachedCount,\n\t\t\tevictingCount,\n\t\t});\n\t}\n\n\tclearEvictingState(): void {\n\t\tthis.#setState({\n\t\t\tstatus: this.#connected ? \"realtime\" : \"partial\",\n\t\t\tcachedCount: this.cachedCount,\n\t\t\ttotalCount: this.#totalCount,\n\t\t\tcacheUtilization: this.#cacheUtilization,\n\t\t});\n\t}\n\n\t#exitFetchingAfterApplyFailure(): void {\n\t\tif (this.#connected) {\n\t\t\tthis.#setState({\n\t\t\t\tstatus: \"realtime\",\n\t\t\t\tcachedCount: this.cachedCount,\n\t\t\t\ttotalCount: this.#totalCount,\n\t\t\t\tcacheUtilization: this.#cacheUtilization,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#setState({\n\t\t\t\tstatus: \"partial\",\n\t\t\t\tcachedCount: this.cachedCount,\n\t\t\t\ttotalCount: this.#totalCount,\n\t\t\t\tcacheUtilization: this.#cacheUtilization,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Drop in-flight `queryRange` / `queryByOffset` / `rangeQuery` requests (e.g. user seek / sort reset).\n\t * {@link requestRange}, {@link requestByOffset}, and {@link requestRangeQuery} call this first so\n\t * overlapping viewport debounces cannot double-apply the same rows.\n\t */\n\tabortRangeRequests(): void {\n\t\tfor (const inflight of this.#inFlightRequests.values()) {\n\t\t\tinflight.reject(\n\t\t\t\tObject.assign(new Error(\"Range request aborted\"), {\n\t\t\t\t\tname: \"AbortError\",\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tthis.#inFlightRequests.clear();\n\t\tfor (const inflight of this.#inFlightReconcileRequests.values()) {\n\t\t\tinflight.reject(\n\t\t\t\tObject.assign(new Error(\"Range request aborted\"), {\n\t\t\t\t\tname: \"AbortError\",\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tthis.#inFlightReconcileRequests.clear();\n\t}\n\n\t/**\n\t * Clear tracked row ids (e.g. after a local `truncate()` on the collection). Local truncate\n\t * does not flow through `receiveSync`, so the bridge must be reset to match.\n\t */\n\tclearServerConfirmedKeys(): void {\n\t\tthis.#serverConfirmedKeys.clear();\n\t\tthis.#serverConfirmedKeysRevision += 1;\n\t\tthis.#notifyConfirmedKeysRevision();\n\t}\n\n\t/** Keys from the latest completed `rangeQuery` / chunk response. */\n\tget serverConfirmedKeys(): ReadonlySet<string | number> {\n\t\treturn this.#serverConfirmedKeys;\n\t}\n\n\t/** Bumps when {@link serverConfirmedKeys} changes; pass into predicate hooks as a dependency. */\n\tget serverConfirmedKeysRevision(): number {\n\t\treturn this.#serverConfirmedKeysRevision;\n\t}\n\n\t/** Subscribe to {@link serverConfirmedKeysRevision} changes (for `useSyncExternalStore`). */\n\tsubscribeConfirmedKeysRevision(listener: () => void): () => void {\n\t\tthis.#confirmedRevisionListeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.#confirmedRevisionListeners.delete(listener);\n\t\t};\n\t}\n\n\t#notifyConfirmedKeysRevision(): void {\n\t\tfor (const listener of this.#confirmedRevisionListeners) {\n\t\t\tlistener();\n\t\t}\n\t}\n\n\tclearTrackedRowIds(): void {\n\t\tthis.#cachedIds.clear();\n\t\tthis.#serverConfirmedKeys.clear();\n\t\tthis.#serverConfirmedKeysRevision += 1;\n\t\tthis.#notifyConfirmedKeysRevision();\n\t\tconst s = this.#state;\n\t\tif (s.status === \"partial\" || s.status === \"realtime\") {\n\t\t\tthis.#setState({ ...s, cachedCount: 0 });\n\t\t} else if (s.status === \"disconnected\") {\n\t\t\tthis.#setState({ status: \"disconnected\", cachedCount: 0 });\n\t\t} else if (s.status === \"evicting\") {\n\t\t\tthis.#setState({ ...s, cachedCount: 0 });\n\t\t}\n\t}\n\n\trequestRange(\n\t\tsort: SyncRangeSort,\n\t\tlimit: number,\n\t\tafterCursor: unknown | null,\n\t): Promise<PartialSyncRangeResult<TItem>> {\n\t\tthis.abortRangeRequests();\n\t\tconst requestId = createClientMutationId(\"qr\");\n\t\tthis.#setState({\n\t\t\tstatus: \"fetching\",\n\t\t\trequestId,\n\t\t\tchunksReceived: 0,\n\t\t});\n\n\t\treturn new Promise<PartialSyncRangeResult<TItem>>((resolve, reject) => {\n\t\t\tthis.#inFlightRequests.set(requestId, {\n\t\t\t\trequestId,\n\t\t\t\trows: [],\n\t\t\t\ttotalCount: 0,\n\t\t\t\tlastCursor: afterCursor,\n\t\t\t\thasMore: false,\n\t\t\t\tchunksReceived: 0,\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t});\n\t\t\tthis.#out({\n\t\t\t\ttype: \"queryRange\",\n\t\t\t\tclientId: this.clientId,\n\t\t\t\trequestId,\n\t\t\t\tsort,\n\t\t\t\tlimit,\n\t\t\t\tafterCursor,\n\t\t\t});\n\t\t});\n\t}\n\n\trequestByOffset(\n\t\tsort: SyncRangeSort,\n\t\tlimit: number,\n\t\toffset: number,\n\t): Promise<PartialSyncRangeResult<TItem>> {\n\t\tthis.abortRangeRequests();\n\t\tconst requestId = createClientMutationId(\"qo\");\n\t\tthis.#setState({\n\t\t\tstatus: \"fetching\",\n\t\t\trequestId,\n\t\t\tchunksReceived: 0,\n\t\t});\n\n\t\treturn new Promise<PartialSyncRangeResult<TItem>>((resolve, reject) => {\n\t\t\tthis.#inFlightRequests.set(requestId, {\n\t\t\t\trequestId,\n\t\t\t\trows: [],\n\t\t\t\ttotalCount: 0,\n\t\t\t\tlastCursor: null,\n\t\t\t\thasMore: false,\n\t\t\t\tchunksReceived: 0,\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t});\n\t\t\tthis.#out({\n\t\t\t\ttype: \"queryByOffset\",\n\t\t\t\tclientId: this.clientId,\n\t\t\t\trequestId,\n\t\t\t\tsort,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t});\n\t\t});\n\t}\n\n\trequestRangeQuery(\n\t\trange: SyncRange,\n\t\tfingerprint?: RangeFingerprint,\n\t): Promise<PartialSyncRangeResult<TItem>> {\n\t\tthis.abortRangeRequests();\n\t\tconst requestId = createClientMutationId(\"rq\");\n\t\tthis.#setState({\n\t\t\tstatus: \"fetching\",\n\t\t\trequestId,\n\t\t\tchunksReceived: 0,\n\t\t});\n\n\t\treturn new Promise<PartialSyncRangeResult<TItem>>((resolve, reject) => {\n\t\t\tthis.#inFlightRequests.set(requestId, {\n\t\t\t\trequestId,\n\t\t\t\trows: [],\n\t\t\t\ttotalCount: 0,\n\t\t\t\tlastCursor: null,\n\t\t\t\thasMore: false,\n\t\t\t\tchunksReceived: 0,\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t});\n\t\t\tthis.#out({\n\t\t\t\ttype: \"rangeQuery\",\n\t\t\t\tclientId: this.clientId,\n\t\t\t\trequestId,\n\t\t\t\trange,\n\t\t\t\t...(fingerprint !== undefined ? { fingerprint } : {}),\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Reconcile the client's cached window against the server using a row manifest (id + version ms).\n\t * Pass `manifest` to override rows; otherwise uses {@link PartialSyncClientBridge.serverConfirmedKeys} and {@link PartialSyncClientBridgeOptions.collection} `get`.\n\t */\n\trequestRangeReconcile(\n\t\trange: SyncRange,\n\t\tmanifest?: Array<{ id: string | number; version: number }>,\n\t): Promise<PartialSyncReconcileResult<TItem>> {\n\t\tthis.abortRangeRequests();\n\t\tconst requestId = createClientMutationId(\"rc\");\n\t\tconst resolvedManifest = manifest ?? this.#buildReconcileManifest();\n\t\tthis.#setState({\n\t\t\tstatus: \"fetching\",\n\t\t\trequestId,\n\t\t\tchunksReceived: 0,\n\t\t});\n\n\t\treturn new Promise<PartialSyncReconcileResult<TItem>>((resolve, reject) => {\n\t\t\tthis.#inFlightReconcileRequests.set(requestId, {\n\t\t\t\trequestId,\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t});\n\t\t\tthis.#out({\n\t\t\t\ttype: \"rangeReconcile\",\n\t\t\t\tclientId: this.clientId,\n\t\t\t\trequestId,\n\t\t\t\trange,\n\t\t\t\tmanifest: resolvedManifest,\n\t\t\t});\n\t\t});\n\t}\n\n\t#buildReconcileManifest(): Array<{ id: string | number; version: number }> {\n\t\tconst get = this.options.collection.get;\n\t\tif (get === undefined) return [];\n\t\tconst out: Array<{ id: string | number; version: number }> = [];\n\t\tfor (const key of this.#serverConfirmedKeys) {\n\t\t\tlet local = get(key);\n\t\t\tif (local === undefined && typeof key === \"number\") {\n\t\t\t\tlocal = get(String(key));\n\t\t\t} else if (local === undefined && typeof key === \"string\") {\n\t\t\t\tconst asNum = Number(key);\n\t\t\t\tif (!Number.isNaN(asNum)) {\n\t\t\t\t\tlocal = get(asNum);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (local === undefined) continue;\n\t\t\tconst rowId = local.id;\n\t\t\tif (typeof rowId !== \"string\" && typeof rowId !== \"number\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tout.push({\n\t\t\t\tid: rowId,\n\t\t\t\tversion: partialSyncRowVersionWatermarkMs(local),\n\t\t\t});\n\t\t}\n\t\treturn out;\n\t}\n\n\tasync handleServerMessage(message: SyncServerMessage<TItem>): Promise<void> {\n\t\tconst mid = message.collectionId ?? DEFAULT_SYNC_COLLECTION_ID;\n\t\tif (mid !== this.collectionId) return;\n\t\tswitch (message.type) {\n\t\t\tcase \"queryRangeChunk\":\n\t\t\t\tawait this.#scheduleRangeFetchApply(() =>\n\t\t\t\t\tthis.#handleQueryRangeChunk(message),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\tcase \"rangeUpToDate\":\n\t\t\t\tthis.#handleRangeUpToDate(message);\n\t\t\t\treturn;\n\t\t\tcase \"rangeDelta\":\n\t\t\t\tawait this.#scheduleRangeFetchApply(() =>\n\t\t\t\t\tthis.#handleRangeDelta(message),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\tcase \"rangeReconcileResult\":\n\t\t\t\tawait this.#scheduleRangeFetchApply(() =>\n\t\t\t\t\tthis.#handleRangeReconcileResult(message),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\tcase \"rangePatch\":\n\t\t\t\tawait this.#handleRangePatch(message);\n\t\t\t\treturn;\n\t\t\tcase \"syncBatch\":\n\t\t\t\tawait this.#applyAndTrack(message.changes as SyncMessage<TItem>[]);\n\t\t\t\treturn;\n\t\t\tcase \"ack\":\n\t\t\t\tawait this.#applyAndTrack(message.changes as SyncMessage<TItem>[]);\n\t\t\t\treturn;\n\t\t\tcase \"syncBackfill\":\n\t\t\t\tawait this.#applyAndTrack(message.changes as SyncMessage<TItem>[]);\n\t\t\t\treturn;\n\t\t\tcase \"reject\":\n\t\t\t\tthis.setError(message.reason);\n\t\t\t\treturn;\n\t\t\tcase \"pong\":\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\texhaustiveGuard(message);\n\t\t}\n\t}\n\n\tasync #handleRangePatch(\n\t\tmessage: Extract<SyncServerMessage<TItem>, { type: \"rangePatch\" }>,\n\t): Promise<void> {\n\t\tconst { change, viewTransition } = message;\n\t\tif (viewTransition === \"exitView\") {\n\t\t\tif (change.type === \"update\") {\n\t\t\t\tthis.options.onViewTransition?.({ type: \"exitView\", change });\n\t\t\t}\n\t\t\tawait this.#applyAndTrack([change]);\n\t\t\tthis.#prunePartialInterestTrackingAfterExitView(change);\n\t\t\tthis.options.onRangePatchApplied?.({ change, viewTransition });\n\t\t\treturn;\n\t\t}\n\t\tif (viewTransition === \"enterView\") {\n\t\t\tif (change.type === \"update\") {\n\t\t\t\tthis.options.onViewTransition?.({ type: \"enterView\", change });\n\t\t\t\tconst key = partialSyncRowKey(change.value.id);\n\t\t\t\tconst getRow = this.options.collection.get;\n\t\t\t\tlet local = getRow !== undefined ? getRow(key) : undefined;\n\t\t\t\tif (local === undefined && getRow !== undefined) {\n\t\t\t\t\tif (typeof key === \"number\") {\n\t\t\t\t\t\tlocal = getRow(String(key));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst asNum = Number(key);\n\t\t\t\t\t\tif (!Number.isNaN(asNum)) {\n\t\t\t\t\t\t\tlocal = getRow(asNum);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst alreadyInCollection =\n\t\t\t\t\tthis.#cachedIds.has(key) || local !== undefined;\n\t\t\t\tconst toApply: SyncMessage<TItem>[] = alreadyInCollection\n\t\t\t\t\t? [change]\n\t\t\t\t\t: [{ type: \"insert\", value: change.value }];\n\t\t\t\tawait this.#applyAndTrack(toApply);\n\t\t\t\tthis.options.onRangePatchApplied?.({ change, viewTransition });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.#applyAndTrack([change]);\n\t\t\tthis.options.onRangePatchApplied?.({ change, viewTransition });\n\t\t\treturn;\n\t\t}\n\t\tawait this.#applyAndTrack([change], change.type === \"update\");\n\t\tthis.#mergeServerConfirmedKeysFromMessages([change]);\n\t\tthis.options.onRangePatchApplied?.({ change, viewTransition });\n\t}\n\n\t#replaceServerConfirmedKeysFromRows(rows: readonly TItem[]): void {\n\t\tthis.#serverConfirmedKeys.clear();\n\t\tfor (const row of rows) {\n\t\t\tthis.#serverConfirmedKeys.add(partialSyncRowKey(row.id));\n\t\t}\n\t\tthis.#serverConfirmedKeysRevision += 1;\n\t\tthis.#notifyConfirmedKeysRevision();\n\t}\n\n\t/** Row left the client's server-confirmed window; stop counting it as partial-sync cached. */\n\t#prunePartialInterestTrackingAfterExitView(change: SyncMessage<TItem>): void {\n\t\tswitch (change.type) {\n\t\t\tcase \"insert\":\n\t\t\tcase \"update\": {\n\t\t\t\tconst key = partialSyncRowKey(change.value.id);\n\t\t\t\tthis.#cachedIds.delete(key);\n\t\t\t\tthis.#serverConfirmedKeys.delete(key);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"delete\": {\n\t\t\t\tthis.#cachedIds.delete(change.key);\n\t\t\t\tthis.#serverConfirmedKeys.delete(change.key);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"truncate\":\n\t\t\t\tthis.#cachedIds.clear();\n\t\t\t\tthis.#serverConfirmedKeys.clear();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\texhaustiveGuard(change);\n\t\t}\n\t\tthis.#serverConfirmedKeysRevision += 1;\n\t\tthis.#notifyConfirmedKeysRevision();\n\t\tthis.#refreshCachedCountInState();\n\t}\n\n\t#mergeServerConfirmedKeysFromMessages(changes: SyncMessage<TItem>[]): void {\n\t\tif (changes.length === 0) return;\n\t\tfor (const change of changes) {\n\t\t\tswitch (change.type) {\n\t\t\t\tcase \"insert\":\n\t\t\t\tcase \"update\":\n\t\t\t\t\tthis.#serverConfirmedKeys.add(partialSyncRowKey(change.value.id));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tthis.#serverConfirmedKeys.delete(change.key);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"truncate\":\n\t\t\t\t\tthis.#serverConfirmedKeys.clear();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\texhaustiveGuard(change);\n\t\t\t}\n\t\t}\n\t\tthis.#serverConfirmedKeysRevision += 1;\n\t\tthis.#notifyConfirmedKeysRevision();\n\t}\n\n\t/** True only if this handler still owns the in-flight entry (not superseded by {@link abortRangeRequests}). */\n\t#isActiveRangeRequest(\n\t\trequestId: string,\n\t\tinFlight: InFlightRequest<TItem>,\n\t): boolean {\n\t\treturn this.#inFlightRequests.get(requestId) === inFlight;\n\t}\n\n\tasync #handleQueryRangeChunk(\n\t\tmessage: Extract<SyncServerMessage<TItem>, { type: \"queryRangeChunk\" }>,\n\t): Promise<void> {\n\t\tconst inFlight = this.#inFlightRequests.get(message.requestId);\n\t\tif (!inFlight) return;\n\t\tinFlight.chunksReceived += 1;\n\t\tinFlight.totalCount = message.totalCount;\n\t\tinFlight.lastCursor = message.lastCursor;\n\t\tinFlight.hasMore = message.hasMore;\n\t\tthis.#totalCount = message.totalCount;\n\t\tthis.#setState({\n\t\t\tstatus: \"fetching\",\n\t\t\trequestId: message.requestId,\n\t\t\tchunksReceived: inFlight.chunksReceived,\n\t\t});\n\n\t\tif (message.rows.length > 0) {\n\t\t\tawait this.options.beforeApplyRows?.(message.rows);\n\t\t\tif (!this.#isActiveRangeRequest(message.requestId, inFlight)) return;\n\t\t\tconst getRow = this.options.collection.get;\n\t\t\tconst changes: SyncMessage<TItem>[] = [];\n\t\t\tlet cacheTouched = false;\n\t\t\tfor (const row of message.rows) {\n\t\t\t\tconst pk = partialSyncRowKey(row.id);\n\t\t\t\tconst local = getRow !== undefined ? getRow(pk) : undefined;\n\n\t\t\t\tif (local !== undefined) {\n\t\t\t\t\tif (!this.#cachedIds.has(pk)) {\n\t\t\t\t\t\tthis.#cachedIds.add(pk);\n\t\t\t\t\t\tcacheTouched = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (serverRowSupersedesLocal(local, row)) {\n\t\t\t\t\t\tchanges.push({\n\t\t\t\t\t\t\ttype: \"update\",\n\t\t\t\t\t\t\tvalue: row,\n\t\t\t\t\t\t\tpreviousValue: local,\n\t\t\t\t\t\t} as SyncMessage<TItem>);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!this.#cachedIds.has(pk)) {\n\t\t\t\t\tchanges.push({ type: \"insert\", value: row } as SyncMessage<TItem>);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (changes.length > 0) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#applyAndTrack(changes);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (!this.#isActiveRangeRequest(message.requestId, inFlight)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.#inFlightRequests.delete(message.requestId);\n\t\t\t\t\tinFlight.reject(err as Error);\n\t\t\t\t\tthis.#exitFetchingAfterApplyFailure();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!this.#isActiveRangeRequest(message.requestId, inFlight)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else if (cacheTouched) {\n\t\t\t\tthis.#refreshCachedCountInState();\n\t\t\t}\n\t\t\tinFlight.rows.push(...message.rows);\n\t\t}\n\n\t\tif (!message.done) return;\n\t\tif (!this.#isActiveRangeRequest(message.requestId, inFlight)) return;\n\t\tthis.#replaceServerConfirmedKeysFromRows(inFlight.rows);\n\t\tthis.#inFlightRequests.delete(message.requestId);\n\t\tconst result: PartialSyncRangeResult<TItem> = {\n\t\t\trows: inFlight.rows,\n\t\t\ttotalCount: inFlight.totalCount,\n\t\t\tlastCursor: inFlight.lastCursor,\n\t\t\thasMore: inFlight.hasMore,\n\t\t};\n\t\tinFlight.resolve(result);\n\t\tthis.#setState({\n\t\t\tstatus: this.#connected ? \"realtime\" : \"partial\",\n\t\t\tcachedCount: this.cachedCount,\n\t\t\ttotalCount: this.#totalCount,\n\t\t\tcacheUtilization: this.#cacheUtilization,\n\t\t});\n\t}\n\n\t#handleRangeUpToDate(\n\t\tmessage: Extract<SyncServerMessage<TItem>, { type: \"rangeUpToDate\" }>,\n\t): void {\n\t\tconst inFlight = this.#inFlightRequests.get(message.requestId);\n\t\tif (!inFlight) return;\n\t\tthis.#inFlightRequests.delete(message.requestId);\n\t\tthis.#totalCount = message.totalCount;\n\t\tinFlight.resolve({\n\t\t\trows: [],\n\t\t\ttotalCount: message.totalCount,\n\t\t\tlastCursor: null,\n\t\t\thasMore: false,\n\t\t\tupToDate: true,\n\t\t});\n\t\tthis.#setState({\n\t\t\tstatus: this.#connected ? \"realtime\" : \"partial\",\n\t\t\tcachedCount: this.cachedCount,\n\t\t\ttotalCount: this.#totalCount,\n\t\t\tcacheUtilization: this.#cacheUtilization,\n\t\t});\n\t}\n\n\tasync #handleRangeDelta(\n\t\tmessage: Extract<SyncServerMessage<TItem>, { type: \"rangeDelta\" }>,\n\t): Promise<void> {\n\t\tconst inFlight = this.#inFlightRequests.get(message.requestId);\n\t\tif (!inFlight) return;\n\t\tconst delta = message.changes as SyncMessage<TItem>[];\n\t\tawait this.#applyAndTrack(delta);\n\t\tif (!this.#isActiveRangeRequest(message.requestId, inFlight)) return;\n\t\tthis.#mergeServerConfirmedKeysFromMessages(delta);\n\t\tthis.#inFlightRequests.delete(message.requestId);\n\t\tthis.#totalCount = message.totalCount;\n\t\tinFlight.resolve({\n\t\t\trows: [],\n\t\t\ttotalCount: message.totalCount,\n\t\t\tlastCursor: message.lastCursor ?? null,\n\t\t\thasMore: false,\n\t\t\tinvalidateWindow: true,\n\t\t});\n\t\tthis.#setState({\n\t\t\tstatus: this.#connected ? \"realtime\" : \"partial\",\n\t\t\tcachedCount: this.cachedCount,\n\t\t\ttotalCount: this.#totalCount,\n\t\t\tcacheUtilization: this.#cacheUtilization,\n\t\t});\n\t}\n\n\tasync #handleRangeReconcileResult(\n\t\tmessage: Extract<\n\t\t\tSyncServerMessage<TItem>,\n\t\t\t{ type: \"rangeReconcileResult\" }\n\t\t>,\n\t): Promise<void> {\n\t\tconst inFlight = this.#inFlightReconcileRequests.get(message.requestId);\n\t\tif (!inFlight) return;\n\n\t\tconst get = this.options.collection.get;\n\t\tconst toApply: SyncMessage<TItem>[] = [\n\t\t\t...(message.added as SyncMessage<TItem>[]),\n\t\t\t...(message.updated as SyncMessage<TItem>[]),\n\t\t];\n\n\t\tfor (const staleKey of message.stale) {\n\t\t\tlet local: TItem | undefined;\n\t\t\tif (get !== undefined) {\n\t\t\t\tlocal = get(staleKey);\n\t\t\t\tif (local === undefined && typeof staleKey === \"number\") {\n\t\t\t\t\tlocal = get(String(staleKey));\n\t\t\t\t} else if (local === undefined && typeof staleKey === \"string\") {\n\t\t\t\t\tconst asNum = Number(staleKey);\n\t\t\t\t\tif (!Number.isNaN(asNum)) {\n\t\t\t\t\t\tlocal = get(asNum);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (local !== undefined) {\n\t\t\t\tconst syn: SyncMessage<TItem> = {\n\t\t\t\t\ttype: \"update\",\n\t\t\t\t\tvalue: local,\n\t\t\t\t\tpreviousValue: local,\n\t\t\t\t} as SyncMessage<TItem>;\n\t\t\t\tthis.options.onViewTransition?.({ type: \"exitView\", change: syn });\n\t\t\t}\n\t\t\ttoApply.push({ type: \"delete\", key: staleKey } as SyncMessage<TItem>);\n\t\t}\n\n\t\tif (toApply.length > 0) {\n\t\t\tawait this.#applyAndTrack(toApply);\n\t\t\tif (this.#inFlightReconcileRequests.get(message.requestId) !== inFlight) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#mergeServerConfirmedKeysFromMessages(toApply);\n\t\t}\n\n\t\tthis.#inFlightReconcileRequests.delete(message.requestId);\n\t\tthis.#totalCount = message.totalCount;\n\n\t\tconst addedRows: TItem[] = [];\n\t\tfor (const ch of message.added) {\n\t\t\tif (ch.type === \"insert\") {\n\t\t\t\taddedRows.push(ch.value);\n\t\t\t}\n\t\t}\n\t\tconst updatedRows: TItem[] = [];\n\t\tfor (const ch of message.updated) {\n\t\t\tif (ch.type === \"update\") {\n\t\t\t\tupdatedRows.push(ch.value);\n\t\t\t}\n\t\t}\n\n\t\tinFlight.resolve({\n\t\t\tadded: addedRows,\n\t\t\tupdated: updatedRows,\n\t\t\tstaleIds: [...message.stale],\n\t\t\tmovedHints: [...message.movedHints],\n\t\t\ttotalCount: message.totalCount,\n\t\t});\n\n\t\tthis.#refreshCachedCountInState();\n\t\tthis.#setState({\n\t\t\tstatus: this.#connected ? \"realtime\" : \"partial\",\n\t\t\tcachedCount: this.cachedCount,\n\t\t\ttotalCount: this.#totalCount,\n\t\t\tcacheUtilization: this.#cacheUtilization,\n\t\t});\n\t}\n\n\t/**\n\t * Merge rows already present in the local collection (e.g. IndexedDB eager `initialLoad`) into\n\t * `#cachedIds` so {@link cachedCount} and React-driven `bridgeState` match durable storage after reload.\n\t * Safe to call multiple times; ids are a set. Does not call `receiveSync`.\n\t */\n\tseedHydratedLocalRows(rows: readonly TItem[]): void {\n\t\tif (rows.length === 0) return;\n\t\tfor (const row of rows) {\n\t\t\tthis.#cachedIds.add(partialSyncRowKey(row.id));\n\t\t}\n\t\tthis.#refreshCachedCountInState();\n\t}\n\n\t#refreshCachedCountInState(): void {\n\t\tconst s = this.#state;\n\t\tswitch (s.status) {\n\t\t\tcase \"partial\":\n\t\t\tcase \"realtime\":\n\t\t\t\tthis.#setState({ ...s, cachedCount: this.cachedCount });\n\t\t\t\tbreak;\n\t\t\tcase \"disconnected\":\n\t\t\t\tthis.#setState({\n\t\t\t\t\tstatus: \"disconnected\",\n\t\t\t\t\tcachedCount: this.cachedCount,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"evicting\":\n\t\t\t\tthis.#setState({ ...s, cachedCount: this.cachedCount });\n\t\t\t\tbreak;\n\t\t\tcase \"connected\":\n\t\t\t\tif (this.#connected && this.cachedCount > 0) {\n\t\t\t\t\tthis.#setState({\n\t\t\t\t\t\tstatus: \"realtime\",\n\t\t\t\t\t\tcachedCount: this.cachedCount,\n\t\t\t\t\t\ttotalCount: this.#totalCount,\n\t\t\t\t\t\tcacheUtilization: this.#cacheUtilization,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Updates `#cachedIds` after {@link SyncClientBridge} has already applied the same messages via `receiveSync`\n\t * (e.g. `syncBatch`) so we do not double-apply.\n\t */\n\tsyncTrackedIdsFromMessages(changes: SyncMessage<TItem>[]): void {\n\t\tfor (const change of changes) {\n\t\t\tswitch (change.type) {\n\t\t\t\tcase \"insert\":\n\t\t\t\t\tthis.#cachedIds.add(partialSyncRowKey(change.value.id));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"update\":\n\t\t\t\t\tthis.#cachedIds.add(partialSyncRowKey(change.value.id));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tthis.#cachedIds.delete(change.key);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"truncate\":\n\t\t\t\t\tthis.#cachedIds.clear();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\texhaustiveGuard(change);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #drainPendingCoalescedUpdates(): Promise<void> {\n\t\tif (this.#pendingCoalescedUpdatesByKey.size === 0) return;\n\t\tconst batch = [...this.#pendingCoalescedUpdatesByKey.values()];\n\t\tthis.#pendingCoalescedUpdatesByKey.clear();\n\t\tconst get = this.options.collection.get;\n\t\tconst toApply =\n\t\t\tget === undefined\n\t\t\t\t? batch\n\t\t\t\t: batch.map((ch) => {\n\t\t\t\t\t\tif (ch.type !== \"update\") return ch;\n\t\t\t\t\t\tconst id = ch.value.id;\n\t\t\t\t\t\tconst current =\n\t\t\t\t\t\t\t(typeof id === \"string\" || typeof id === \"number\"\n\t\t\t\t\t\t\t\t? get(id)\n\t\t\t\t\t\t\t\t: undefined) ?? get(partialSyncRowKey(id));\n\t\t\t\t\t\tif (current === undefined) return ch;\n\t\t\t\t\t\treturn { ...ch, previousValue: current };\n\t\t\t\t\t});\n\t\tawait this.#receiveSyncAndTrack(toApply);\n\t}\n\n\t/**\n\t * Apply pending plain `rangePatch` updates coalesced by row id. Idempotent when the map is empty.\n\t * Invoked automatically by `connectPartialSync` after each inbound pump drain.\n\t */\n\tasync flushPendingCoalescedInboundUpdates(): Promise<void> {\n\t\tawait this.#drainPendingCoalescedUpdates();\n\t}\n\n\tasync #receiveSyncAndTrack(changes: SyncMessage<TItem>[]): Promise<void> {\n\t\tif (changes.length === 0) return;\n\t\tawait this.options.collection.utils.receiveSync(changes);\n\t\tthis.syncTrackedIdsFromMessages(changes);\n\t}\n\n\t/**\n\t * @param coalesceSameRowUpdates When true (plain `rangePatch` updates only), merge by row key;\n\t * the transport layer must call `flushPendingCoalescedInboundUpdates` after processing queued inbound work.\n\t */\n\tasync #applyAndTrack(\n\t\tchanges: SyncMessage<TItem>[],\n\t\tcoalesceSameRowUpdates = false,\n\t): Promise<void> {\n\t\tif (changes.length === 0) return;\n\n\t\tif (!coalesceSameRowUpdates) {\n\t\t\tawait this.#drainPendingCoalescedUpdates();\n\t\t\tawait this.#receiveSyncAndTrack(changes);\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const ch of changes) {\n\t\t\tif (ch.type !== \"update\") {\n\t\t\t\tawait this.#drainPendingCoalescedUpdates();\n\t\t\t\tawait this.#receiveSyncAndTrack(changes);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#pendingCoalescedUpdatesByKey.set(\n\t\t\t\tpartialSyncRowKey(ch.value.id),\n\t\t\t\tch,\n\t\t\t);\n\t\t}\n\t}\n\n\t#setState(state: PartialSyncState): void {\n\t\tthis.#state = state;\n\t\tthis.options.onStateChange?.(state);\n\t}\n}\n"]}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import { DEFAULT_SYNC_COLLECTION_ID, createClientMutationId } from './chunk-BJJEAKXL.js';
|
|
2
|
+
import { partialSyncRowKey, partialSyncRowVersionWatermarkMs, partialSyncRowVersionWatermarkMsUnknown } from './chunk-UJ24XW52.js';
|
|
3
|
+
import { __privateAdd, __privateSet, __privateGet, __privateMethod } from './chunk-HMLY7DHA.js';
|
|
4
|
+
import { exhaustiveGuard } from '@firtoz/maybe-error';
|
|
5
|
+
|
|
6
|
+
var _pendingMutations, _pendingMutationByKey, _pendingTruncateMutationId, _lastAckedServerVersion, _connected, _activeBackfill, _sendSyncHelloOnConnect, _rowGet, _SyncClientBridge_instances, out_fn, toIntents_fn, rememberPendingIntent_fn, forgetPendingMutation_fn, sendPendingIntents_fn, localRowForIncomingInsert_fn, coerceInsertsWhenRowExists_fn, filterIncomingChanges_fn, intentKey_fn, intentUpdatedAt_fn, updateLastAckedServerVersion_fn;
|
|
7
|
+
var SyncClientBridge = class {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.options = options;
|
|
10
|
+
__privateAdd(this, _SyncClientBridge_instances);
|
|
11
|
+
__privateAdd(this, _pendingMutations, /* @__PURE__ */ new Map());
|
|
12
|
+
__privateAdd(this, _pendingMutationByKey, /* @__PURE__ */ new Map());
|
|
13
|
+
/** Truncate has no row key; track at most one pending truncate mutation. */
|
|
14
|
+
__privateAdd(this, _pendingTruncateMutationId, null);
|
|
15
|
+
__privateAdd(this, _lastAckedServerVersion, 0);
|
|
16
|
+
__privateAdd(this, _connected, false);
|
|
17
|
+
__privateAdd(this, _activeBackfill);
|
|
18
|
+
__privateAdd(this, _sendSyncHelloOnConnect);
|
|
19
|
+
/**
|
|
20
|
+
* When set (via {@link SyncClientBridge.setRowGet} after `createCollection`), server `insert`
|
|
21
|
+
* messages are turned into `update` if that row is already in the collection — required when
|
|
22
|
+
* partial `rangePatch` hydrated the row before an `ack`/`syncBatch` insert arrives.
|
|
23
|
+
*/
|
|
24
|
+
__privateAdd(this, _rowGet);
|
|
25
|
+
this.clientId = options.clientId;
|
|
26
|
+
this.collectionId = options.collectionId ?? DEFAULT_SYNC_COLLECTION_ID;
|
|
27
|
+
__privateSet(this, _sendSyncHelloOnConnect, options.sendSyncHelloOnConnect ?? true);
|
|
28
|
+
__privateSet(this, _lastAckedServerVersion, Math.max(
|
|
29
|
+
0,
|
|
30
|
+
options.initialLastAckedServerVersion ?? 0
|
|
31
|
+
));
|
|
32
|
+
}
|
|
33
|
+
get pendingCount() {
|
|
34
|
+
return __privateGet(this, _pendingMutations).size;
|
|
35
|
+
}
|
|
36
|
+
setConnected(connected) {
|
|
37
|
+
__privateSet(this, _connected, connected);
|
|
38
|
+
if (connected && __privateGet(this, _sendSyncHelloOnConnect)) {
|
|
39
|
+
this.sendHello();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Wire `collection.get` after the TanStack collection exists so mutation-path `receiveSync` can
|
|
44
|
+
* coerce duplicate `insert` echoes to `update` (partial sync + `mutateBatch`).
|
|
45
|
+
*/
|
|
46
|
+
setRowGet(get) {
|
|
47
|
+
__privateSet(this, _rowGet, get);
|
|
48
|
+
}
|
|
49
|
+
sendHello() {
|
|
50
|
+
__privateMethod(this, _SyncClientBridge_instances, out_fn).call(this, {
|
|
51
|
+
type: "syncHello",
|
|
52
|
+
clientId: this.clientId,
|
|
53
|
+
lastAckedServerVersion: __privateGet(this, _lastAckedServerVersion)
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
onLocalMutation(changes) {
|
|
57
|
+
const intents = __privateMethod(this, _SyncClientBridge_instances, toIntents_fn).call(this, changes);
|
|
58
|
+
for (const intent of intents) {
|
|
59
|
+
__privateMethod(this, _SyncClientBridge_instances, rememberPendingIntent_fn).call(this, intent);
|
|
60
|
+
}
|
|
61
|
+
if (__privateGet(this, _connected)) {
|
|
62
|
+
__privateMethod(this, _SyncClientBridge_instances, sendPendingIntents_fn).call(this);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
sendInsert(value) {
|
|
66
|
+
const mutationId = createClientMutationId("insert");
|
|
67
|
+
const intent = {
|
|
68
|
+
clientMutationId: mutationId,
|
|
69
|
+
type: "insert",
|
|
70
|
+
value
|
|
71
|
+
};
|
|
72
|
+
__privateMethod(this, _SyncClientBridge_instances, rememberPendingIntent_fn).call(this, intent);
|
|
73
|
+
if (__privateGet(this, _connected)) __privateMethod(this, _SyncClientBridge_instances, sendPendingIntents_fn).call(this);
|
|
74
|
+
return mutationId;
|
|
75
|
+
}
|
|
76
|
+
sendUpdate(updated, previousValue) {
|
|
77
|
+
const mutationId = createClientMutationId("update");
|
|
78
|
+
const intent = {
|
|
79
|
+
clientMutationId: mutationId,
|
|
80
|
+
type: "update",
|
|
81
|
+
key: partialSyncRowKey(updated.id),
|
|
82
|
+
value: updated,
|
|
83
|
+
previousValue
|
|
84
|
+
};
|
|
85
|
+
__privateMethod(this, _SyncClientBridge_instances, rememberPendingIntent_fn).call(this, intent);
|
|
86
|
+
if (__privateGet(this, _connected)) __privateMethod(this, _SyncClientBridge_instances, sendPendingIntents_fn).call(this);
|
|
87
|
+
return mutationId;
|
|
88
|
+
}
|
|
89
|
+
sendDelete(key) {
|
|
90
|
+
const mutationId = createClientMutationId("delete");
|
|
91
|
+
const intent = {
|
|
92
|
+
clientMutationId: mutationId,
|
|
93
|
+
type: "delete",
|
|
94
|
+
key
|
|
95
|
+
};
|
|
96
|
+
__privateMethod(this, _SyncClientBridge_instances, rememberPendingIntent_fn).call(this, intent);
|
|
97
|
+
if (__privateGet(this, _connected)) __privateMethod(this, _SyncClientBridge_instances, sendPendingIntents_fn).call(this);
|
|
98
|
+
return mutationId;
|
|
99
|
+
}
|
|
100
|
+
async handleServerMessage(message) {
|
|
101
|
+
const mid = message.collectionId ?? DEFAULT_SYNC_COLLECTION_ID;
|
|
102
|
+
if (mid !== this.collectionId) return;
|
|
103
|
+
switch (message.type) {
|
|
104
|
+
case "ack":
|
|
105
|
+
__privateMethod(this, _SyncClientBridge_instances, updateLastAckedServerVersion_fn).call(this, message.serverVersion);
|
|
106
|
+
await this.options.collection.utils.receiveSync(
|
|
107
|
+
__privateMethod(this, _SyncClientBridge_instances, coerceInsertsWhenRowExists_fn).call(this, __privateMethod(this, _SyncClientBridge_instances, filterIncomingChanges_fn).call(this, message.changes))
|
|
108
|
+
);
|
|
109
|
+
for (const mutationId of message.clientMutationIds) {
|
|
110
|
+
__privateMethod(this, _SyncClientBridge_instances, forgetPendingMutation_fn).call(this, mutationId);
|
|
111
|
+
}
|
|
112
|
+
return;
|
|
113
|
+
case "syncBatch":
|
|
114
|
+
__privateMethod(this, _SyncClientBridge_instances, updateLastAckedServerVersion_fn).call(this, message.serverVersion);
|
|
115
|
+
await this.options.collection.utils.receiveSync(
|
|
116
|
+
__privateMethod(this, _SyncClientBridge_instances, coerceInsertsWhenRowExists_fn).call(this, __privateMethod(this, _SyncClientBridge_instances, filterIncomingChanges_fn).call(this, message.changes))
|
|
117
|
+
);
|
|
118
|
+
return;
|
|
119
|
+
case "syncBackfill": {
|
|
120
|
+
__privateMethod(this, _SyncClientBridge_instances, updateLastAckedServerVersion_fn).call(this, message.serverVersion);
|
|
121
|
+
const incomingChanges = __privateMethod(this, _SyncClientBridge_instances, filterIncomingChanges_fn).call(this, message.changes);
|
|
122
|
+
const totalChunks = message.totalChunks ?? 1;
|
|
123
|
+
const chunkIndex = message.chunkIndex ?? 0;
|
|
124
|
+
const isChunked = totalChunks > 1 || message.chunkIndex !== void 0;
|
|
125
|
+
if (!__privateGet(this, _activeBackfill) || chunkIndex === 0 || __privateGet(this, _activeBackfill).serverVersion !== message.serverVersion || __privateGet(this, _activeBackfill).mode !== message.mode) {
|
|
126
|
+
__privateSet(this, _activeBackfill, {
|
|
127
|
+
mode: message.mode,
|
|
128
|
+
serverVersion: message.serverVersion,
|
|
129
|
+
totalChunks,
|
|
130
|
+
receivedChunks: 0,
|
|
131
|
+
snapshotTruncateApplied: false
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
const active = __privateGet(this, _activeBackfill);
|
|
135
|
+
const outgoingChanges = [];
|
|
136
|
+
if (active.mode === "snapshot" && !active.snapshotTruncateApplied) {
|
|
137
|
+
outgoingChanges.push({ type: "truncate" });
|
|
138
|
+
active.snapshotTruncateApplied = true;
|
|
139
|
+
}
|
|
140
|
+
outgoingChanges.push(...incomingChanges);
|
|
141
|
+
if (outgoingChanges.length > 0) {
|
|
142
|
+
await this.options.collection.utils.receiveSync(
|
|
143
|
+
__privateMethod(this, _SyncClientBridge_instances, coerceInsertsWhenRowExists_fn).call(this, outgoingChanges)
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
active.receivedChunks += 1;
|
|
147
|
+
const isFinalChunk = isChunked ? chunkIndex >= totalChunks - 1 : active.receivedChunks >= 1;
|
|
148
|
+
if (isFinalChunk) {
|
|
149
|
+
__privateSet(this, _activeBackfill, void 0);
|
|
150
|
+
__privateMethod(this, _SyncClientBridge_instances, sendPendingIntents_fn).call(this);
|
|
151
|
+
}
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
case "reject": {
|
|
155
|
+
__privateMethod(this, _SyncClientBridge_instances, forgetPendingMutation_fn).call(this, message.clientMutationId);
|
|
156
|
+
const allChanges = message.correctiveChanges;
|
|
157
|
+
if (allChanges.length > 0) {
|
|
158
|
+
await this.options.collection.utils.receiveSync(
|
|
159
|
+
__privateMethod(this, _SyncClientBridge_instances, coerceInsertsWhenRowExists_fn).call(this, allChanges)
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
this.options.onRejectedMutation?.(
|
|
163
|
+
message.reason,
|
|
164
|
+
message.clientMutationId
|
|
165
|
+
);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
case "pong":
|
|
169
|
+
return;
|
|
170
|
+
case "queryRangeChunk":
|
|
171
|
+
case "rangePatch":
|
|
172
|
+
case "rangeUpToDate":
|
|
173
|
+
case "rangeDelta":
|
|
174
|
+
case "rangeReconcileResult":
|
|
175
|
+
return;
|
|
176
|
+
default:
|
|
177
|
+
exhaustiveGuard(message);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
_pendingMutations = new WeakMap();
|
|
182
|
+
_pendingMutationByKey = new WeakMap();
|
|
183
|
+
_pendingTruncateMutationId = new WeakMap();
|
|
184
|
+
_lastAckedServerVersion = new WeakMap();
|
|
185
|
+
_connected = new WeakMap();
|
|
186
|
+
_activeBackfill = new WeakMap();
|
|
187
|
+
_sendSyncHelloOnConnect = new WeakMap();
|
|
188
|
+
_rowGet = new WeakMap();
|
|
189
|
+
_SyncClientBridge_instances = new WeakSet();
|
|
190
|
+
out_fn = function(msg) {
|
|
191
|
+
this.options.send({
|
|
192
|
+
...msg,
|
|
193
|
+
collectionId: this.collectionId
|
|
194
|
+
});
|
|
195
|
+
};
|
|
196
|
+
toIntents_fn = function(changes) {
|
|
197
|
+
const intents = [];
|
|
198
|
+
for (const change of changes) {
|
|
199
|
+
const clientMutationId = createClientMutationId(change.type);
|
|
200
|
+
switch (change.type) {
|
|
201
|
+
case "insert":
|
|
202
|
+
intents.push({
|
|
203
|
+
clientMutationId,
|
|
204
|
+
type: "insert",
|
|
205
|
+
value: change.value
|
|
206
|
+
});
|
|
207
|
+
break;
|
|
208
|
+
case "update":
|
|
209
|
+
intents.push({
|
|
210
|
+
clientMutationId,
|
|
211
|
+
type: "update",
|
|
212
|
+
key: partialSyncRowKey(change.value.id),
|
|
213
|
+
value: change.value,
|
|
214
|
+
previousValue: change.previousValue
|
|
215
|
+
});
|
|
216
|
+
break;
|
|
217
|
+
case "delete":
|
|
218
|
+
intents.push({
|
|
219
|
+
clientMutationId,
|
|
220
|
+
type: "delete",
|
|
221
|
+
key: change.key
|
|
222
|
+
});
|
|
223
|
+
break;
|
|
224
|
+
case "truncate":
|
|
225
|
+
intents.push({
|
|
226
|
+
clientMutationId,
|
|
227
|
+
type: "truncate"
|
|
228
|
+
});
|
|
229
|
+
break;
|
|
230
|
+
default:
|
|
231
|
+
exhaustiveGuard(change);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return intents;
|
|
235
|
+
};
|
|
236
|
+
rememberPendingIntent_fn = function(intent) {
|
|
237
|
+
const key = __privateMethod(this, _SyncClientBridge_instances, intentKey_fn).call(this, intent);
|
|
238
|
+
if (intent.type === "truncate") {
|
|
239
|
+
if (__privateGet(this, _pendingTruncateMutationId)) {
|
|
240
|
+
__privateGet(this, _pendingMutations).delete(__privateGet(this, _pendingTruncateMutationId));
|
|
241
|
+
}
|
|
242
|
+
__privateSet(this, _pendingTruncateMutationId, intent.clientMutationId);
|
|
243
|
+
const pending2 = {
|
|
244
|
+
clientMutationId: intent.clientMutationId,
|
|
245
|
+
key: "__truncate__",
|
|
246
|
+
intent,
|
|
247
|
+
updatedAt: 0
|
|
248
|
+
};
|
|
249
|
+
__privateGet(this, _pendingMutations).set(intent.clientMutationId, pending2);
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
if (key === null) return;
|
|
253
|
+
const pending = {
|
|
254
|
+
clientMutationId: intent.clientMutationId,
|
|
255
|
+
key,
|
|
256
|
+
intent,
|
|
257
|
+
updatedAt: __privateMethod(this, _SyncClientBridge_instances, intentUpdatedAt_fn).call(this, intent)
|
|
258
|
+
};
|
|
259
|
+
__privateGet(this, _pendingMutationByKey).set(key, intent.clientMutationId);
|
|
260
|
+
__privateGet(this, _pendingMutations).set(intent.clientMutationId, pending);
|
|
261
|
+
};
|
|
262
|
+
forgetPendingMutation_fn = function(mutationId) {
|
|
263
|
+
const pending = __privateGet(this, _pendingMutations).get(mutationId);
|
|
264
|
+
if (!pending) return;
|
|
265
|
+
__privateGet(this, _pendingMutations).delete(mutationId);
|
|
266
|
+
if (pending.intent.type === "truncate") {
|
|
267
|
+
if (__privateGet(this, _pendingTruncateMutationId) === mutationId) {
|
|
268
|
+
__privateSet(this, _pendingTruncateMutationId, null);
|
|
269
|
+
}
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
if (__privateGet(this, _pendingMutationByKey).get(pending.key) === mutationId) {
|
|
273
|
+
__privateGet(this, _pendingMutationByKey).delete(pending.key);
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
sendPendingIntents_fn = function() {
|
|
277
|
+
if (!__privateGet(this, _connected)) return;
|
|
278
|
+
if (__privateGet(this, _pendingMutations).size === 0) return;
|
|
279
|
+
const intents = Array.from(__privateGet(this, _pendingMutations).values()).map(
|
|
280
|
+
(p) => p.intent
|
|
281
|
+
);
|
|
282
|
+
__privateMethod(this, _SyncClientBridge_instances, out_fn).call(this, {
|
|
283
|
+
type: "mutateBatch",
|
|
284
|
+
clientId: this.clientId,
|
|
285
|
+
mutations: intents
|
|
286
|
+
});
|
|
287
|
+
};
|
|
288
|
+
localRowForIncomingInsert_fn = function(id) {
|
|
289
|
+
const get = __privateGet(this, _rowGet);
|
|
290
|
+
if (get === void 0) return void 0;
|
|
291
|
+
if (typeof id === "string" || typeof id === "number") {
|
|
292
|
+
return get(id) ?? get(partialSyncRowKey(id));
|
|
293
|
+
}
|
|
294
|
+
return get(partialSyncRowKey(id));
|
|
295
|
+
};
|
|
296
|
+
coerceInsertsWhenRowExists_fn = function(changes) {
|
|
297
|
+
if (__privateGet(this, _rowGet) === void 0) return changes;
|
|
298
|
+
const out = [];
|
|
299
|
+
for (const ch of changes) {
|
|
300
|
+
if (ch.type !== "insert") {
|
|
301
|
+
out.push(ch);
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
const local = __privateMethod(this, _SyncClientBridge_instances, localRowForIncomingInsert_fn).call(this, ch.value.id);
|
|
305
|
+
if (local === void 0) {
|
|
306
|
+
out.push(ch);
|
|
307
|
+
} else {
|
|
308
|
+
out.push({
|
|
309
|
+
type: "update",
|
|
310
|
+
value: ch.value,
|
|
311
|
+
previousValue: local
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return out;
|
|
316
|
+
};
|
|
317
|
+
filterIncomingChanges_fn = function(changes) {
|
|
318
|
+
const out = [];
|
|
319
|
+
for (const change of changes) {
|
|
320
|
+
if (change.type !== "update") {
|
|
321
|
+
out.push(change);
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
const pendingMutationId = __privateGet(this, _pendingMutationByKey).get(
|
|
325
|
+
partialSyncRowKey(change.value.id)
|
|
326
|
+
);
|
|
327
|
+
if (!pendingMutationId) {
|
|
328
|
+
out.push(change);
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
const pending = __privateGet(this, _pendingMutations).get(pendingMutationId);
|
|
332
|
+
if (!pending) {
|
|
333
|
+
out.push(change);
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
if (partialSyncRowVersionWatermarkMs(change.value) >= pending.updatedAt) {
|
|
337
|
+
out.push(change);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return out;
|
|
341
|
+
};
|
|
342
|
+
intentKey_fn = function(intent) {
|
|
343
|
+
switch (intent.type) {
|
|
344
|
+
case "insert": {
|
|
345
|
+
const raw = intent.value.id;
|
|
346
|
+
return raw === void 0 ? "" : partialSyncRowKey(raw);
|
|
347
|
+
}
|
|
348
|
+
case "update":
|
|
349
|
+
return intent.key ?? null;
|
|
350
|
+
case "delete":
|
|
351
|
+
return intent.key ?? null;
|
|
352
|
+
case "truncate":
|
|
353
|
+
return null;
|
|
354
|
+
default:
|
|
355
|
+
exhaustiveGuard(intent.type);
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
intentUpdatedAt_fn = function(intent) {
|
|
359
|
+
if (intent.type === "insert" || intent.type === "update") {
|
|
360
|
+
return partialSyncRowVersionWatermarkMsUnknown(intent.value);
|
|
361
|
+
}
|
|
362
|
+
return 0;
|
|
363
|
+
};
|
|
364
|
+
updateLastAckedServerVersion_fn = function(version) {
|
|
365
|
+
const nextVersion = Math.max(__privateGet(this, _lastAckedServerVersion), version);
|
|
366
|
+
if (nextVersion === __privateGet(this, _lastAckedServerVersion)) return;
|
|
367
|
+
__privateSet(this, _lastAckedServerVersion, nextVersion);
|
|
368
|
+
this.options.onLastAckedServerVersionChange?.(nextVersion);
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
export { SyncClientBridge };
|
|
372
|
+
//# sourceMappingURL=chunk-QJP4GSJH.js.map
|
|
373
|
+
//# sourceMappingURL=chunk-QJP4GSJH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sync-client-bridge.ts"],"names":["pending"],"mappings":"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","file":"chunk-QJP4GSJH.js","sourcesContent":["import type { SyncMessage } from \"@firtoz/db-helpers\";\nimport { exhaustiveGuard } from \"@firtoz/maybe-error\";\nimport {\n\tpartialSyncRowKey,\n\tpartialSyncRowVersionWatermarkMs,\n\tpartialSyncRowVersionWatermarkMsUnknown,\n\ttype PartialSyncRowId,\n\ttype PartialSyncRowShape,\n} from \"./partial-sync-row-key\";\nimport {\n\tcreateClientMutationId,\n\tDEFAULT_SYNC_COLLECTION_ID,\n\ttype MutationIntent,\n\ttype SyncClientMessage,\n\ttype SyncClientMessageBody,\n\ttype SyncServerMessage,\n} from \"./sync-protocol\";\n\ntype CollectionWithReceiveSync<TItem> = {\n\tutils: {\n\t\treceiveSync: (messages: SyncMessage<TItem>[]) => Promise<void>;\n\t};\n};\n\ntype SendFn = (msg: SyncClientMessage) => void;\n\ntype PendingMutation = {\n\tclientMutationId: string;\n\tkey: string | number;\n\tintent: MutationIntent;\n\tupdatedAt: number;\n};\n\nexport interface SyncClientBridgeOptions<TItem extends PartialSyncRowShape> {\n\tclientId: string;\n\t/** Must match the server's {@link SyncServerBridgeOptions.collectionId}. */\n\tcollectionId?: string;\n\tcollection: CollectionWithReceiveSync<TItem>;\n\tsend: SendFn;\n\tinitialLastAckedServerVersion?: number;\n\tonLastAckedServerVersionChange?: (version: number) => void;\n\tonRejectedMutation?: (reason: string, mutationId: string) => void;\n\t/**\n\t * When `false`, `setConnected(true)` does not send `syncHello` (partial-sync + `mutateBatch` only).\n\t * Default `true` for full sync.\n\t */\n\tsendSyncHelloOnConnect?: boolean;\n}\n\nexport class SyncClientBridge<TItem extends PartialSyncRowShape> {\n\treadonly clientId: string;\n\treadonly collectionId: string;\n\t#pendingMutations = new Map<string, PendingMutation>();\n\t#pendingMutationByKey = new Map<string | number, string>();\n\t/** Truncate has no row key; track at most one pending truncate mutation. */\n\t#pendingTruncateMutationId: string | null = null;\n\t#lastAckedServerVersion = 0;\n\t#connected = false;\n\t#activeBackfill:\n\t\t| {\n\t\t\t\tmode: \"snapshot\" | \"delta\";\n\t\t\t\tserverVersion: number;\n\t\t\t\ttotalChunks: number;\n\t\t\t\treceivedChunks: number;\n\t\t\t\tsnapshotTruncateApplied: boolean;\n\t\t }\n\t\t| undefined;\n\treadonly #sendSyncHelloOnConnect: boolean;\n\t/**\n\t * When set (via {@link SyncClientBridge.setRowGet} after `createCollection`), server `insert`\n\t * messages are turned into `update` if that row is already in the collection — required when\n\t * partial `rangePatch` hydrated the row before an `ack`/`syncBatch` insert arrives.\n\t */\n\t#rowGet: ((key: string | number) => TItem | undefined) | undefined;\n\n\tconstructor(private readonly options: SyncClientBridgeOptions<TItem>) {\n\t\tthis.clientId = options.clientId;\n\t\tthis.collectionId = options.collectionId ?? DEFAULT_SYNC_COLLECTION_ID;\n\t\tthis.#sendSyncHelloOnConnect = options.sendSyncHelloOnConnect ?? true;\n\t\tthis.#lastAckedServerVersion = Math.max(\n\t\t\t0,\n\t\t\toptions.initialLastAckedServerVersion ?? 0,\n\t\t);\n\t}\n\n\tget pendingCount(): number {\n\t\treturn this.#pendingMutations.size;\n\t}\n\n\tsetConnected(connected: boolean): void {\n\t\tthis.#connected = connected;\n\t\tif (connected && this.#sendSyncHelloOnConnect) {\n\t\t\tthis.sendHello();\n\t\t}\n\t}\n\n\t/**\n\t * Wire `collection.get` after the TanStack collection exists so mutation-path `receiveSync` can\n\t * coerce duplicate `insert` echoes to `update` (partial sync + `mutateBatch`).\n\t */\n\tsetRowGet(\n\t\tget: ((key: string | number) => TItem | undefined) | undefined,\n\t): void {\n\t\tthis.#rowGet = get;\n\t}\n\n\tsendHello(): void {\n\t\tthis.#out({\n\t\t\ttype: \"syncHello\",\n\t\t\tclientId: this.clientId,\n\t\t\tlastAckedServerVersion: this.#lastAckedServerVersion,\n\t\t});\n\t}\n\n\t#out(msg: SyncClientMessageBody): void {\n\t\tthis.options.send({\n\t\t\t...msg,\n\t\t\tcollectionId: this.collectionId,\n\t\t} as SyncClientMessage);\n\t}\n\n\tonLocalMutation(changes: SyncMessage<TItem>[]): void {\n\t\tconst intents = this.#toIntents(changes);\n\t\tfor (const intent of intents) {\n\t\t\tthis.#rememberPendingIntent(intent);\n\t\t}\n\t\tif (this.#connected) {\n\t\t\tthis.#sendPendingIntents();\n\t\t}\n\t}\n\n\tsendInsert(value: TItem): string {\n\t\tconst mutationId = createClientMutationId(\"insert\");\n\t\tconst intent: MutationIntent = {\n\t\t\tclientMutationId: mutationId,\n\t\t\ttype: \"insert\",\n\t\t\tvalue: value as Record<string, unknown>,\n\t\t};\n\t\tthis.#rememberPendingIntent(intent);\n\t\tif (this.#connected) this.#sendPendingIntents();\n\t\treturn mutationId;\n\t}\n\n\tsendUpdate(updated: TItem, previousValue: TItem): string {\n\t\tconst mutationId = createClientMutationId(\"update\");\n\t\tconst intent: MutationIntent = {\n\t\t\tclientMutationId: mutationId,\n\t\t\ttype: \"update\",\n\t\t\tkey: partialSyncRowKey(updated.id),\n\t\t\tvalue: updated as Record<string, unknown>,\n\t\t\tpreviousValue: previousValue as Record<string, unknown>,\n\t\t};\n\t\tthis.#rememberPendingIntent(intent);\n\t\tif (this.#connected) this.#sendPendingIntents();\n\t\treturn mutationId;\n\t}\n\n\tsendDelete(key: string | number): string {\n\t\tconst mutationId = createClientMutationId(\"delete\");\n\t\tconst intent: MutationIntent = {\n\t\t\tclientMutationId: mutationId,\n\t\t\ttype: \"delete\",\n\t\t\tkey,\n\t\t};\n\t\tthis.#rememberPendingIntent(intent);\n\t\tif (this.#connected) this.#sendPendingIntents();\n\t\treturn mutationId;\n\t}\n\n\tasync handleServerMessage(message: SyncServerMessage<TItem>): Promise<void> {\n\t\tconst mid = message.collectionId ?? DEFAULT_SYNC_COLLECTION_ID;\n\t\tif (mid !== this.collectionId) return;\n\t\tswitch (message.type) {\n\t\t\tcase \"ack\":\n\t\t\t\tthis.#updateLastAckedServerVersion(message.serverVersion);\n\t\t\t\tawait this.options.collection.utils.receiveSync(\n\t\t\t\t\tthis.#coerceInsertsWhenRowExists(\n\t\t\t\t\t\tthis.#filterIncomingChanges(\n\t\t\t\t\t\t\tmessage.changes as SyncMessage<TItem>[],\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tfor (const mutationId of message.clientMutationIds) {\n\t\t\t\t\tthis.#forgetPendingMutation(mutationId);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"syncBatch\":\n\t\t\t\tthis.#updateLastAckedServerVersion(message.serverVersion);\n\t\t\t\tawait this.options.collection.utils.receiveSync(\n\t\t\t\t\tthis.#coerceInsertsWhenRowExists(\n\t\t\t\t\t\tthis.#filterIncomingChanges(\n\t\t\t\t\t\t\tmessage.changes as SyncMessage<TItem>[],\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\tcase \"syncBackfill\": {\n\t\t\t\tthis.#updateLastAckedServerVersion(message.serverVersion);\n\t\t\t\tconst incomingChanges = this.#filterIncomingChanges(\n\t\t\t\t\tmessage.changes as SyncMessage<TItem>[],\n\t\t\t\t);\n\t\t\t\tconst totalChunks = message.totalChunks ?? 1;\n\t\t\t\tconst chunkIndex = message.chunkIndex ?? 0;\n\t\t\t\tconst isChunked = totalChunks > 1 || message.chunkIndex !== undefined;\n\t\t\t\tif (\n\t\t\t\t\t!this.#activeBackfill ||\n\t\t\t\t\tchunkIndex === 0 ||\n\t\t\t\t\tthis.#activeBackfill.serverVersion !== message.serverVersion ||\n\t\t\t\t\tthis.#activeBackfill.mode !== message.mode\n\t\t\t\t) {\n\t\t\t\t\tthis.#activeBackfill = {\n\t\t\t\t\t\tmode: message.mode,\n\t\t\t\t\t\tserverVersion: message.serverVersion,\n\t\t\t\t\t\ttotalChunks,\n\t\t\t\t\t\treceivedChunks: 0,\n\t\t\t\t\t\tsnapshotTruncateApplied: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst active = this.#activeBackfill;\n\t\t\t\tconst outgoingChanges: SyncMessage<TItem>[] = [];\n\t\t\t\tif (active.mode === \"snapshot\" && !active.snapshotTruncateApplied) {\n\t\t\t\t\toutgoingChanges.push({ type: \"truncate\" });\n\t\t\t\t\tactive.snapshotTruncateApplied = true;\n\t\t\t\t}\n\t\t\t\toutgoingChanges.push(...incomingChanges);\n\n\t\t\t\tif (outgoingChanges.length > 0) {\n\t\t\t\t\tawait this.options.collection.utils.receiveSync(\n\t\t\t\t\t\tthis.#coerceInsertsWhenRowExists(outgoingChanges),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tactive.receivedChunks += 1;\n\t\t\t\tconst isFinalChunk = isChunked\n\t\t\t\t\t? chunkIndex >= totalChunks - 1\n\t\t\t\t\t: active.receivedChunks >= 1;\n\t\t\t\tif (isFinalChunk) {\n\t\t\t\t\tthis.#activeBackfill = undefined;\n\t\t\t\t\tthis.#sendPendingIntents();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"reject\": {\n\t\t\t\tthis.#forgetPendingMutation(message.clientMutationId);\n\t\t\t\tconst allChanges = message.correctiveChanges as SyncMessage<TItem>[];\n\t\t\t\tif (allChanges.length > 0) {\n\t\t\t\t\tawait this.options.collection.utils.receiveSync(\n\t\t\t\t\t\tthis.#coerceInsertsWhenRowExists(allChanges),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthis.options.onRejectedMutation?.(\n\t\t\t\t\tmessage.reason,\n\t\t\t\t\tmessage.clientMutationId,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"pong\":\n\t\t\t\treturn;\n\t\t\tcase \"queryRangeChunk\":\n\t\t\tcase \"rangePatch\":\n\t\t\tcase \"rangeUpToDate\":\n\t\t\tcase \"rangeDelta\":\n\t\t\tcase \"rangeReconcileResult\":\n\t\t\t\t// Not supported by the full-sync bridge; partial sync uses PartialSyncClientBridge.\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\texhaustiveGuard(message);\n\t\t}\n\t}\n\n\t#toIntents(changes: SyncMessage<TItem>[]): MutationIntent[] {\n\t\tconst intents: MutationIntent[] = [];\n\t\tfor (const change of changes) {\n\t\t\tconst clientMutationId = createClientMutationId(change.type);\n\t\t\tswitch (change.type) {\n\t\t\t\tcase \"insert\":\n\t\t\t\t\tintents.push({\n\t\t\t\t\t\tclientMutationId,\n\t\t\t\t\t\ttype: \"insert\",\n\t\t\t\t\t\tvalue: change.value as Record<string, unknown>,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"update\":\n\t\t\t\t\tintents.push({\n\t\t\t\t\t\tclientMutationId,\n\t\t\t\t\t\ttype: \"update\",\n\t\t\t\t\t\tkey: partialSyncRowKey(change.value.id),\n\t\t\t\t\t\tvalue: change.value as Record<string, unknown>,\n\t\t\t\t\t\tpreviousValue: change.previousValue as Record<string, unknown>,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tintents.push({\n\t\t\t\t\t\tclientMutationId,\n\t\t\t\t\t\ttype: \"delete\",\n\t\t\t\t\t\tkey: change.key,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"truncate\":\n\t\t\t\t\tintents.push({\n\t\t\t\t\t\tclientMutationId,\n\t\t\t\t\t\ttype: \"truncate\",\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\texhaustiveGuard(change);\n\t\t\t}\n\t\t}\n\t\treturn intents;\n\t}\n\n\t#rememberPendingIntent(intent: MutationIntent): void {\n\t\tconst key = this.#intentKey(intent);\n\t\tif (intent.type === \"truncate\") {\n\t\t\tif (this.#pendingTruncateMutationId) {\n\t\t\t\tthis.#pendingMutations.delete(this.#pendingTruncateMutationId);\n\t\t\t}\n\t\t\tthis.#pendingTruncateMutationId = intent.clientMutationId;\n\t\t\tconst pending: PendingMutation = {\n\t\t\t\tclientMutationId: intent.clientMutationId,\n\t\t\t\tkey: \"__truncate__\",\n\t\t\t\tintent,\n\t\t\t\tupdatedAt: 0,\n\t\t\t};\n\t\t\tthis.#pendingMutations.set(intent.clientMutationId, pending);\n\t\t\treturn;\n\t\t}\n\t\tif (key === null) return;\n\t\tconst pending: PendingMutation = {\n\t\t\tclientMutationId: intent.clientMutationId,\n\t\t\tkey,\n\t\t\tintent,\n\t\t\tupdatedAt: this.#intentUpdatedAt(intent),\n\t\t};\n\t\tthis.#pendingMutationByKey.set(key, intent.clientMutationId);\n\t\tthis.#pendingMutations.set(intent.clientMutationId, pending);\n\t}\n\n\t#forgetPendingMutation(mutationId: string): void {\n\t\tconst pending = this.#pendingMutations.get(mutationId);\n\t\tif (!pending) return;\n\t\tthis.#pendingMutations.delete(mutationId);\n\t\tif (pending.intent.type === \"truncate\") {\n\t\t\tif (this.#pendingTruncateMutationId === mutationId) {\n\t\t\t\tthis.#pendingTruncateMutationId = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (this.#pendingMutationByKey.get(pending.key) === mutationId) {\n\t\t\tthis.#pendingMutationByKey.delete(pending.key);\n\t\t}\n\t}\n\n\t#sendPendingIntents(): void {\n\t\tif (!this.#connected) return;\n\t\tif (this.#pendingMutations.size === 0) return;\n\t\tconst intents = Array.from(this.#pendingMutations.values()).map(\n\t\t\t(p) => p.intent,\n\t\t);\n\t\tthis.#out({\n\t\t\ttype: \"mutateBatch\",\n\t\t\tclientId: this.clientId,\n\t\t\tmutations: intents,\n\t\t});\n\t}\n\n\t#localRowForIncomingInsert(id: PartialSyncRowId): TItem | undefined {\n\t\tconst get = this.#rowGet;\n\t\tif (get === undefined) return undefined;\n\t\tif (typeof id === \"string\" || typeof id === \"number\") {\n\t\t\treturn get(id) ?? get(partialSyncRowKey(id));\n\t\t}\n\t\treturn get(partialSyncRowKey(id));\n\t}\n\n\t#coerceInsertsWhenRowExists(\n\t\tchanges: SyncMessage<TItem>[],\n\t): SyncMessage<TItem>[] {\n\t\tif (this.#rowGet === undefined) return changes;\n\t\tconst out: SyncMessage<TItem>[] = [];\n\t\tfor (const ch of changes) {\n\t\t\tif (ch.type !== \"insert\") {\n\t\t\t\tout.push(ch);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst local = this.#localRowForIncomingInsert(ch.value.id);\n\t\t\tif (local === undefined) {\n\t\t\t\tout.push(ch);\n\t\t\t} else {\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"update\",\n\t\t\t\t\tvalue: ch.value,\n\t\t\t\t\tpreviousValue: local,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\t#filterIncomingChanges(changes: SyncMessage<TItem>[]): SyncMessage<TItem>[] {\n\t\tconst out: SyncMessage<TItem>[] = [];\n\t\tfor (const change of changes) {\n\t\t\tif (change.type !== \"update\") {\n\t\t\t\tout.push(change);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst pendingMutationId = this.#pendingMutationByKey.get(\n\t\t\t\tpartialSyncRowKey(change.value.id),\n\t\t\t);\n\t\t\tif (!pendingMutationId) {\n\t\t\t\tout.push(change);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst pending = this.#pendingMutations.get(pendingMutationId);\n\t\t\tif (!pending) {\n\t\t\t\tout.push(change);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (partialSyncRowVersionWatermarkMs(change.value) >= pending.updatedAt) {\n\t\t\t\tout.push(change);\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\t#intentKey(intent: MutationIntent): string | number | null {\n\t\tswitch (intent.type) {\n\t\t\tcase \"insert\": {\n\t\t\t\tconst raw = (intent.value as { id?: PartialSyncRowId }).id;\n\t\t\t\treturn raw === undefined ? \"\" : partialSyncRowKey(raw);\n\t\t\t}\n\t\t\tcase \"update\":\n\t\t\t\treturn intent.key ?? null;\n\t\t\tcase \"delete\":\n\t\t\t\treturn intent.key ?? null;\n\t\t\tcase \"truncate\":\n\t\t\t\treturn null;\n\t\t\tdefault:\n\t\t\t\texhaustiveGuard(intent.type);\n\t\t}\n\t}\n\n\t#intentUpdatedAt(intent: MutationIntent): number {\n\t\tif (intent.type === \"insert\" || intent.type === \"update\") {\n\t\t\treturn partialSyncRowVersionWatermarkMsUnknown(intent.value);\n\t\t}\n\t\treturn 0;\n\t}\n\n\t#updateLastAckedServerVersion(version: number): void {\n\t\tconst nextVersion = Math.max(this.#lastAckedServerVersion, version);\n\t\tif (nextVersion === this.#lastAckedServerVersion) return;\n\t\tthis.#lastAckedServerVersion = nextVersion;\n\t\tthis.options.onLastAckedServerVersionChange?.(nextVersion);\n\t}\n}\n"]}
|