@firtoz/collection-sync 5.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.
Files changed (128) hide show
  1. package/README.md +46 -0
  2. package/dist/cache-manager.d.ts +52 -0
  3. package/dist/cache-manager.js +5 -0
  4. package/dist/cache-manager.js.map +1 -0
  5. package/dist/chunk-3EHHMLSV.js +57 -0
  6. package/dist/chunk-3EHHMLSV.js.map +1 -0
  7. package/dist/chunk-43KYAIKY.js +46 -0
  8. package/dist/chunk-43KYAIKY.js.map +1 -0
  9. package/dist/chunk-4BEXLBCH.js +64 -0
  10. package/dist/chunk-4BEXLBCH.js.map +1 -0
  11. package/dist/chunk-5V6BSQAB.js +148 -0
  12. package/dist/chunk-5V6BSQAB.js.map +1 -0
  13. package/dist/chunk-5VMFQT5Z.js +112 -0
  14. package/dist/chunk-5VMFQT5Z.js.map +1 -0
  15. package/dist/chunk-6EHROJFY.js +111 -0
  16. package/dist/chunk-6EHROJFY.js.map +1 -0
  17. package/dist/chunk-6X3434GJ.js +21 -0
  18. package/dist/chunk-6X3434GJ.js.map +1 -0
  19. package/dist/chunk-BGJH6PH2.js +175 -0
  20. package/dist/chunk-BGJH6PH2.js.map +1 -0
  21. package/dist/chunk-BJJEAKXL.js +252 -0
  22. package/dist/chunk-BJJEAKXL.js.map +1 -0
  23. package/dist/chunk-GWIOC5CP.js +51 -0
  24. package/dist/chunk-GWIOC5CP.js.map +1 -0
  25. package/dist/chunk-HMLY7DHA.js +12 -0
  26. package/dist/chunk-HMLY7DHA.js.map +1 -0
  27. package/dist/chunk-I6RJWBGF.js +112 -0
  28. package/dist/chunk-I6RJWBGF.js.map +1 -0
  29. package/dist/chunk-M5MJHS6A.js +10 -0
  30. package/dist/chunk-M5MJHS6A.js.map +1 -0
  31. package/dist/chunk-O3KBDCEI.js +615 -0
  32. package/dist/chunk-O3KBDCEI.js.map +1 -0
  33. package/dist/chunk-OP53UBPN.js +19 -0
  34. package/dist/chunk-OP53UBPN.js.map +1 -0
  35. package/dist/chunk-P3JOTUAB.js +802 -0
  36. package/dist/chunk-P3JOTUAB.js.map +1 -0
  37. package/dist/chunk-QJP4GSJH.js +373 -0
  38. package/dist/chunk-QJP4GSJH.js.map +1 -0
  39. package/dist/chunk-RDDS7JQW.js +623 -0
  40. package/dist/chunk-RDDS7JQW.js.map +1 -0
  41. package/dist/chunk-TEH7V76G.js +209 -0
  42. package/dist/chunk-TEH7V76G.js.map +1 -0
  43. package/dist/chunk-UJ24XW52.js +20 -0
  44. package/dist/chunk-UJ24XW52.js.map +1 -0
  45. package/dist/chunk-UVZJL6QV.js +18 -0
  46. package/dist/chunk-UVZJL6QV.js.map +1 -0
  47. package/dist/chunk-XC4QNFSQ.js +238 -0
  48. package/dist/chunk-XC4QNFSQ.js.map +1 -0
  49. package/dist/chunk-YD5LVGWX.js +125 -0
  50. package/dist/chunk-YD5LVGWX.js.map +1 -0
  51. package/dist/chunk-YYGPIHHJ.js +166 -0
  52. package/dist/chunk-YYGPIHHJ.js.map +1 -0
  53. package/dist/connect-partial-sync.d.ts +41 -0
  54. package/dist/connect-partial-sync.js +6 -0
  55. package/dist/connect-partial-sync.js.map +1 -0
  56. package/dist/connect-sync.d.ts +26 -0
  57. package/dist/connect-sync.js +5 -0
  58. package/dist/connect-sync.js.map +1 -0
  59. package/dist/create-partial-synced-collection.d.ts +24 -0
  60. package/dist/create-partial-synced-collection.js +8 -0
  61. package/dist/create-partial-synced-collection.js.map +1 -0
  62. package/dist/create-synced-collection.d.ts +26 -0
  63. package/dist/create-synced-collection.js +8 -0
  64. package/dist/create-synced-collection.js.map +1 -0
  65. package/dist/index.d.ts +18 -0
  66. package/dist/index.js +18 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/partial-sync-client-bridge.d.ts +157 -0
  69. package/dist/partial-sync-client-bridge.js +6 -0
  70. package/dist/partial-sync-client-bridge.js.map +1 -0
  71. package/dist/partial-sync-interest.d.ts +48 -0
  72. package/dist/partial-sync-interest.js +6 -0
  73. package/dist/partial-sync-interest.js.map +1 -0
  74. package/dist/partial-sync-mutation-handler.d.ts +31 -0
  75. package/dist/partial-sync-mutation-handler.js +6 -0
  76. package/dist/partial-sync-mutation-handler.js.map +1 -0
  77. package/dist/partial-sync-predicate-match.d.ts +8 -0
  78. package/dist/partial-sync-predicate-match.js +4 -0
  79. package/dist/partial-sync-predicate-match.js.map +1 -0
  80. package/dist/partial-sync-row-key.d.ts +41 -0
  81. package/dist/partial-sync-row-key.js +4 -0
  82. package/dist/partial-sync-row-key.js.map +1 -0
  83. package/dist/partial-sync-server-bridge.d.ts +102 -0
  84. package/dist/partial-sync-server-bridge.js +8 -0
  85. package/dist/partial-sync-server-bridge.js.map +1 -0
  86. package/dist/react/constants.d.ts +12 -0
  87. package/dist/react/constants.js +4 -0
  88. package/dist/react/constants.js.map +1 -0
  89. package/dist/react/index.d.ts +19 -0
  90. package/dist/react/index.js +17 -0
  91. package/dist/react/index.js.map +1 -0
  92. package/dist/react/partial-sync-adapter.d.ts +40 -0
  93. package/dist/react/partial-sync-adapter.js +4 -0
  94. package/dist/react/partial-sync-adapter.js.map +1 -0
  95. package/dist/react/partial-sync-utils.d.ts +42 -0
  96. package/dist/react/partial-sync-utils.js +5 -0
  97. package/dist/react/partial-sync-utils.js.map +1 -0
  98. package/dist/react/range-conditions-expression.d.ts +49 -0
  99. package/dist/react/range-conditions-expression.js +4 -0
  100. package/dist/react/range-conditions-expression.js.map +1 -0
  101. package/dist/react/types.d.ts +196 -0
  102. package/dist/react/types.js +3 -0
  103. package/dist/react/types.js.map +1 -0
  104. package/dist/react/usePartialSyncCollection.d.ts +20 -0
  105. package/dist/react/usePartialSyncCollection.js +10 -0
  106. package/dist/react/usePartialSyncCollection.js.map +1 -0
  107. package/dist/react/usePartialSyncViewport.d.ts +20 -0
  108. package/dist/react/usePartialSyncViewport.js +7 -0
  109. package/dist/react/usePartialSyncViewport.js.map +1 -0
  110. package/dist/react/usePartialSyncWindow.d.ts +17 -0
  111. package/dist/react/usePartialSyncWindow.js +12 -0
  112. package/dist/react/usePartialSyncWindow.js.map +1 -0
  113. package/dist/react/usePredicateFilteredRows.d.ts +20 -0
  114. package/dist/react/usePredicateFilteredRows.js +6 -0
  115. package/dist/react/usePredicateFilteredRows.js.map +1 -0
  116. package/dist/sync-client-bridge.d.ts +48 -0
  117. package/dist/sync-client-bridge.js +6 -0
  118. package/dist/sync-client-bridge.js.map +1 -0
  119. package/dist/sync-protocol.d.ts +378 -0
  120. package/dist/sync-protocol.js +4 -0
  121. package/dist/sync-protocol.js.map +1 -0
  122. package/dist/sync-server-bridge.d.ts +35 -0
  123. package/dist/sync-server-bridge.js +6 -0
  124. package/dist/sync-server-bridge.js.map +1 -0
  125. package/dist/with-sync.d.ts +107 -0
  126. package/dist/with-sync.js +7 -0
  127. package/dist/with-sync.js.map +1 -0
  128. package/package.json +23 -17
@@ -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"]}