@abloatai/humans 0.37.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 (404) hide show
  1. package/README.md +52 -0
  2. package/dist/Ablo.d.ts +208 -0
  3. package/dist/Ablo.js +120 -0
  4. package/dist/client.d.ts +317 -0
  5. package/dist/client.js +13 -0
  6. package/dist/core.d.ts +35 -0
  7. package/dist/core.js +48 -0
  8. package/dist/humans.d.ts +28 -0
  9. package/dist/humans.js +34 -0
  10. package/dist/index.d.ts +10 -0
  11. package/dist/index.js +6 -0
  12. package/dist/local/BaseSyncedStore.d.ts +807 -0
  13. package/dist/local/BaseSyncedStore.js +1516 -0
  14. package/dist/local/Database.d.ts +322 -0
  15. package/dist/local/Database.js +1589 -0
  16. package/dist/local/InstanceCache.d.ts +255 -0
  17. package/dist/local/InstanceCache.js +1263 -0
  18. package/dist/local/LazyReferenceCollection.d.ts +177 -0
  19. package/dist/local/LazyReferenceCollection.js +461 -0
  20. package/dist/local/Model.d.ts +475 -0
  21. package/dist/local/Model.js +950 -0
  22. package/dist/local/ModelRegistry.d.ts +225 -0
  23. package/dist/local/ModelRegistry.js +539 -0
  24. package/dist/local/NetworkMonitor.d.ts +28 -0
  25. package/dist/local/NetworkMonitor.js +79 -0
  26. package/dist/local/RuntimeContext.d.ts +52 -0
  27. package/dist/local/RuntimeContext.js +80 -0
  28. package/dist/local/SyncClient.d.ts +516 -0
  29. package/dist/local/SyncClient.js +1754 -0
  30. package/dist/local/adapters/alwaysOnline.d.ts +14 -0
  31. package/dist/local/adapters/alwaysOnline.js +17 -0
  32. package/dist/local/adapters/inMemoryStorage.d.ts +37 -0
  33. package/dist/local/adapters/inMemoryStorage.js +122 -0
  34. package/dist/local/client/clientPrelude.d.ts +52 -0
  35. package/dist/local/client/clientPrelude.js +60 -0
  36. package/dist/local/client/consoleLogger.d.ts +35 -0
  37. package/dist/local/client/consoleLogger.js +44 -0
  38. package/dist/local/client/createInternalComponents.d.ts +50 -0
  39. package/dist/local/client/createInternalComponents.js +98 -0
  40. package/dist/local/client/createModelProxy.d.ts +248 -0
  41. package/dist/local/client/createModelProxy.js +880 -0
  42. package/dist/local/client/modelRegistration.d.ts +10 -0
  43. package/dist/local/client/modelRegistration.js +316 -0
  44. package/dist/local/client/options.d.ts +440 -0
  45. package/dist/local/client/options.js +7 -0
  46. package/dist/local/client/reactiveEngine.d.ts +53 -0
  47. package/dist/local/client/reactiveEngine.js +705 -0
  48. package/dist/local/client/resourceTypes.d.ts +12 -0
  49. package/dist/local/client/resourceTypes.js +10 -0
  50. package/dist/local/client/schemaConfig.d.ts +44 -0
  51. package/dist/local/client/schemaConfig.js +185 -0
  52. package/dist/local/client/storeCluster.d.ts +46 -0
  53. package/dist/local/client/storeCluster.js +133 -0
  54. package/dist/local/client/storeLifecycle.d.ts +61 -0
  55. package/dist/local/client/storeLifecycle.js +236 -0
  56. package/dist/local/client/validateAbloOptions.d.ts +42 -0
  57. package/dist/local/client/validateAbloOptions.js +43 -0
  58. package/dist/local/client/wsMutationExecutor.d.ts +27 -0
  59. package/dist/local/client/wsMutationExecutor.js +72 -0
  60. package/dist/local/context.d.ts +42 -0
  61. package/dist/local/context.js +81 -0
  62. package/dist/local/coordination/ClaimLog.d.ts +26 -0
  63. package/dist/local/coordination/ClaimLog.js +32 -0
  64. package/dist/local/interfaces/index.d.ts +311 -0
  65. package/dist/local/interfaces/index.js +9 -0
  66. package/dist/local/localModelContract.d.ts +14 -0
  67. package/dist/local/localModelContract.js +1 -0
  68. package/dist/local/logPosition.d.ts +31 -0
  69. package/dist/local/logPosition.js +53 -0
  70. package/dist/local/mutationPersistence.d.ts +6 -0
  71. package/dist/local/mutationPersistence.js +1 -0
  72. package/dist/local/mutators/RecordingMutation.d.ts +36 -0
  73. package/dist/local/mutators/RecordingMutation.js +182 -0
  74. package/dist/local/mutators/Transaction.d.ts +40 -0
  75. package/dist/local/mutators/Transaction.js +58 -0
  76. package/dist/local/mutators/UndoManager.d.ts +258 -0
  77. package/dist/local/mutators/UndoManager.js +665 -0
  78. package/dist/local/mutators/defineMutators.d.ts +60 -0
  79. package/dist/local/mutators/defineMutators.js +18 -0
  80. package/dist/local/mutators/inverseOp.d.ts +126 -0
  81. package/dist/local/mutators/inverseOp.js +71 -0
  82. package/dist/local/mutators/mutateActions.d.ts +45 -0
  83. package/dist/local/mutators/mutateActions.js +105 -0
  84. package/dist/local/mutators/readerActions.d.ts +33 -0
  85. package/dist/local/mutators/readerActions.js +57 -0
  86. package/dist/local/mutators/undoApply.d.ts +51 -0
  87. package/dist/local/mutators/undoApply.js +117 -0
  88. package/dist/local/persistence.d.ts +7 -0
  89. package/dist/local/persistence.js +9 -0
  90. package/dist/local/query/QueryProcessor.d.ts +75 -0
  91. package/dist/local/query/QueryProcessor.js +255 -0
  92. package/dist/local/query/client.d.ts +64 -0
  93. package/dist/local/query/client.js +138 -0
  94. package/dist/local/query/types.d.ts +85 -0
  95. package/dist/local/query/types.js +16 -0
  96. package/dist/local/schema/serialize.d.ts +1 -0
  97. package/dist/local/schema/serialize.js +1 -0
  98. package/dist/local/store/queryApi.d.ts +13 -0
  99. package/dist/local/store/queryApi.js +35 -0
  100. package/dist/local/storeContract.d.ts +145 -0
  101. package/dist/local/storeContract.js +12 -0
  102. package/dist/local/stores/DatabaseManager.d.ts +112 -0
  103. package/dist/local/stores/DatabaseManager.js +400 -0
  104. package/dist/local/stores/ObjectStore.d.ts +115 -0
  105. package/dist/local/stores/ObjectStore.js +393 -0
  106. package/dist/local/stores/ObjectStoreContract.d.ts +38 -0
  107. package/dist/local/stores/ObjectStoreContract.js +1 -0
  108. package/dist/local/stores/StoreManager.d.ts +114 -0
  109. package/dist/local/stores/StoreManager.js +304 -0
  110. package/dist/local/stores/SyncActionStore.d.ts +99 -0
  111. package/dist/local/stores/SyncActionStore.js +506 -0
  112. package/dist/local/stores/openIDBWithTimeout.d.ts +65 -0
  113. package/dist/local/stores/openIDBWithTimeout.js +153 -0
  114. package/dist/local/stores/persistenceCleanup.d.ts +7 -0
  115. package/dist/local/stores/persistenceCleanup.js +26 -0
  116. package/dist/local/stores/persistenceIdentity.d.ts +27 -0
  117. package/dist/local/stores/persistenceIdentity.js +38 -0
  118. package/dist/local/stores/syncAction.d.ts +26 -0
  119. package/dist/local/stores/syncAction.js +16 -0
  120. package/dist/local/stores/v1PersistenceDeletion.d.ts +8 -0
  121. package/dist/local/stores/v1PersistenceDeletion.js +16 -0
  122. package/dist/local/sync/BootstrapFetcher.d.ts +284 -0
  123. package/dist/local/sync/BootstrapFetcher.js +964 -0
  124. package/dist/local/sync/ConnectionManager.d.ts +8 -0
  125. package/dist/local/sync/ConnectionManager.js +8 -0
  126. package/dist/local/sync/OnDemandLoader.d.ts +231 -0
  127. package/dist/local/sync/OnDemandLoader.js +743 -0
  128. package/dist/local/sync/SubscriptionManager.d.ts +159 -0
  129. package/dist/local/sync/SubscriptionManager.js +243 -0
  130. package/dist/local/sync/SyncWebSocket.d.ts +173 -0
  131. package/dist/local/sync/SyncWebSocket.js +438 -0
  132. package/dist/local/sync/bootstrapApply.d.ts +73 -0
  133. package/dist/local/sync/bootstrapApply.js +73 -0
  134. package/dist/local/sync/commitFrames.d.ts +8 -0
  135. package/dist/local/sync/commitFrames.js +8 -0
  136. package/dist/local/sync/connectionManagerLifecycle.d.ts +23 -0
  137. package/dist/local/sync/connectionManagerLifecycle.js +126 -0
  138. package/dist/local/sync/contextPorts.d.ts +18 -0
  139. package/dist/local/sync/contextPorts.js +31 -0
  140. package/dist/local/sync/createClaimStream.d.ts +64 -0
  141. package/dist/local/sync/createClaimStream.js +475 -0
  142. package/dist/local/sync/createSnapshot.d.ts +29 -0
  143. package/dist/local/sync/createSnapshot.js +116 -0
  144. package/dist/local/sync/credentialLifecycle.d.ts +7 -0
  145. package/dist/local/sync/credentialLifecycle.js +7 -0
  146. package/dist/local/sync/deltaPipeline.d.ts +116 -0
  147. package/dist/local/sync/deltaPipeline.js +357 -0
  148. package/dist/local/sync/groupChange.d.ts +116 -0
  149. package/dist/local/sync/groupChange.js +244 -0
  150. package/dist/local/sync/initialize.d.ts +27 -0
  151. package/dist/local/sync/initialize.js +137 -0
  152. package/dist/local/sync/participants.d.ts +132 -0
  153. package/dist/local/sync/participants.js +342 -0
  154. package/dist/local/sync/persistedPrefix.d.ts +12 -0
  155. package/dist/local/sync/persistedPrefix.js +22 -0
  156. package/dist/local/sync/reconnect.d.ts +23 -0
  157. package/dist/local/sync/reconnect.js +55 -0
  158. package/dist/local/sync/schemaDrift.d.ts +55 -0
  159. package/dist/local/sync/schemaDrift.js +53 -0
  160. package/dist/local/sync/schemas.d.ts +71 -0
  161. package/dist/local/sync/schemas.js +94 -0
  162. package/dist/local/sync/socketEventWiring.d.ts +31 -0
  163. package/dist/local/sync/socketEventWiring.js +130 -0
  164. package/dist/local/sync/syncCursor.d.ts +40 -0
  165. package/dist/local/sync/syncCursor.js +55 -0
  166. package/dist/local/sync/syncPlan.d.ts +54 -0
  167. package/dist/local/sync/syncPlan.js +50 -0
  168. package/dist/local/sync/terminalSessionLifecycle.d.ts +20 -0
  169. package/dist/local/sync/terminalSessionLifecycle.js +50 -0
  170. package/dist/local/sync/wsFrameHandlers.d.ts +8 -0
  171. package/dist/local/sync/wsFrameHandlers.js +8 -0
  172. package/dist/local/transactions/databaseCommitOutbox.d.ts +15 -0
  173. package/dist/local/transactions/databaseCommitOutbox.js +16 -0
  174. package/dist/local/transactions/localMutation.d.ts +10 -0
  175. package/dist/local/transactions/localMutation.js +37 -0
  176. package/dist/local/transactions/mutations/MutationQueue.d.ts +511 -0
  177. package/dist/local/transactions/mutations/MutationQueue.js +1498 -0
  178. package/dist/local/transactions/mutations/MutationStore.d.ts +20 -0
  179. package/dist/local/transactions/mutations/MutationStore.js +53 -0
  180. package/dist/local/transactions/mutations/UnconfirmedWrites.d.ts +82 -0
  181. package/dist/local/transactions/mutations/UnconfirmedWrites.js +104 -0
  182. package/dist/local/transactions/mutations/batchProcessing.d.ts +64 -0
  183. package/dist/local/transactions/mutations/batchProcessing.js +349 -0
  184. package/dist/local/transactions/mutations/coalesceRules.d.ts +58 -0
  185. package/dist/local/transactions/mutations/coalesceRules.js +140 -0
  186. package/dist/local/transactions/mutations/commitApi.d.ts +19 -0
  187. package/dist/local/transactions/mutations/commitApi.js +74 -0
  188. package/dist/local/transactions/mutations/commitLane.d.ts +70 -0
  189. package/dist/local/transactions/mutations/commitLane.js +140 -0
  190. package/dist/local/transactions/mutations/commitLatency.d.ts +52 -0
  191. package/dist/local/transactions/mutations/commitLatency.js +130 -0
  192. package/dist/local/transactions/mutations/commitPayload.d.ts +165 -0
  193. package/dist/local/transactions/mutations/commitPayload.js +152 -0
  194. package/dist/local/transactions/mutations/commitTransport.d.ts +36 -0
  195. package/dist/local/transactions/mutations/commitTransport.js +104 -0
  196. package/dist/local/transactions/mutations/deltaConfirmation.d.ts +63 -0
  197. package/dist/local/transactions/mutations/deltaConfirmation.js +235 -0
  198. package/dist/local/transactions/mutations/durableCommitRestore.d.ts +17 -0
  199. package/dist/local/transactions/mutations/durableCommitRestore.js +95 -0
  200. package/dist/local/transactions/mutations/durableWriteStore.d.ts +14 -0
  201. package/dist/local/transactions/mutations/durableWriteStore.js +12 -0
  202. package/dist/local/transactions/mutations/executionSelection.d.ts +6 -0
  203. package/dist/local/transactions/mutations/executionSelection.js +42 -0
  204. package/dist/local/transactions/mutations/failureHandling.d.ts +16 -0
  205. package/dist/local/transactions/mutations/failureHandling.js +130 -0
  206. package/dist/local/transactions/mutations/failurePolicy.d.ts +13 -0
  207. package/dist/local/transactions/mutations/failurePolicy.js +48 -0
  208. package/dist/local/transactions/mutations/localMutation.d.ts +58 -0
  209. package/dist/local/transactions/mutations/localMutation.js +75 -0
  210. package/dist/local/transactions/mutations/modelOperations.d.ts +44 -0
  211. package/dist/local/transactions/mutations/modelOperations.js +144 -0
  212. package/dist/local/transactions/mutations/mutationPersistence.d.ts +25 -0
  213. package/dist/local/transactions/mutations/mutationPersistence.js +188 -0
  214. package/dist/local/transactions/mutations/pendingDrain.d.ts +33 -0
  215. package/dist/local/transactions/mutations/pendingDrain.js +112 -0
  216. package/dist/local/transactions/mutations/processingScheduler.d.ts +14 -0
  217. package/dist/local/transactions/mutations/processingScheduler.js +24 -0
  218. package/dist/local/transactions/mutations/queueCoalescing.d.ts +13 -0
  219. package/dist/local/transactions/mutations/queueCoalescing.js +35 -0
  220. package/dist/local/transactions/mutations/replayValidation.d.ts +187 -0
  221. package/dist/local/transactions/mutations/replayValidation.js +164 -0
  222. package/dist/local/transactions/reconnectDrain.d.ts +11 -0
  223. package/dist/local/transactions/reconnectDrain.js +13 -0
  224. package/dist/local/utils/mobxSetup.d.ts +53 -0
  225. package/dist/local/utils/mobxSetup.js +330 -0
  226. package/dist/local/views/QueryView.d.ts +79 -0
  227. package/dist/local/views/QueryView.js +218 -0
  228. package/dist/local/views/ViewRegistry.d.ts +20 -0
  229. package/dist/local/views/ViewRegistry.js +57 -0
  230. package/dist/local/views/incrementalView.d.ts +45 -0
  231. package/dist/local/views/incrementalView.js +69 -0
  232. package/dist/plugin.d.ts +285 -0
  233. package/dist/plugin.js +106 -0
  234. package/dist/presenceStream.d.ts +69 -0
  235. package/dist/presenceStream.js +200 -0
  236. package/dist/react/AbloProvider.d.ts +242 -0
  237. package/dist/react/AbloProvider.js +456 -0
  238. package/dist/react/ClientSideSuspense.d.ts +36 -0
  239. package/dist/react/ClientSideSuspense.js +17 -0
  240. package/dist/react/DefaultFallback.d.ts +24 -0
  241. package/dist/react/DefaultFallback.js +43 -0
  242. package/dist/react/context.d.ts +55 -0
  243. package/dist/react/context.js +29 -0
  244. package/dist/react/createAbloReact.d.ts +50 -0
  245. package/dist/react/createAbloReact.js +48 -0
  246. package/dist/react/internalContext.d.ts +33 -0
  247. package/dist/react/internalContext.js +3 -0
  248. package/dist/react/useAblo.d.ts +96 -0
  249. package/dist/react/useAblo.js +120 -0
  250. package/dist/react/useCurrentUserId.d.ts +2 -0
  251. package/dist/react/useCurrentUserId.js +12 -0
  252. package/dist/react/useErrorListener.d.ts +2 -0
  253. package/dist/react/useErrorListener.js +14 -0
  254. package/dist/react/useMutationFailureListener.d.ts +8 -0
  255. package/dist/react/useMutationFailureListener.js +19 -0
  256. package/dist/react/useMutators.d.ts +56 -0
  257. package/dist/react/useMutators.js +84 -0
  258. package/dist/react/useSyncStatus.d.ts +19 -0
  259. package/dist/react/useSyncStatus.js +37 -0
  260. package/dist/react/useUndoScope.d.ts +34 -0
  261. package/dist/react/useUndoScope.js +73 -0
  262. package/dist/react.d.ts +18 -0
  263. package/dist/react.js +14 -0
  264. package/dist/reactRuntime.d.ts +4 -0
  265. package/dist/reactRuntime.js +2 -0
  266. package/dist/surface.d.ts +36 -0
  267. package/dist/surface.js +77 -0
  268. package/dist/useReactive.d.ts +6 -0
  269. package/dist/useReactive.js +43 -0
  270. package/package.json +119 -0
  271. package/src/Ablo.ts +456 -0
  272. package/src/client.ts +374 -0
  273. package/src/core.ts +104 -0
  274. package/src/humans.ts +61 -0
  275. package/src/index.ts +40 -0
  276. package/src/local/BaseSyncedStore.ts +1991 -0
  277. package/src/local/Database.ts +2052 -0
  278. package/src/local/InstanceCache.ts +1503 -0
  279. package/src/local/LazyReferenceCollection.ts +563 -0
  280. package/src/local/Model.ts +1124 -0
  281. package/src/local/ModelRegistry.ts +762 -0
  282. package/src/local/NetworkMonitor.ts +88 -0
  283. package/src/local/RuntimeContext.ts +141 -0
  284. package/src/local/SyncClient.ts +2131 -0
  285. package/src/local/adapters/alwaysOnline.ts +20 -0
  286. package/src/local/adapters/inMemoryStorage.ts +141 -0
  287. package/src/local/client/clientPrelude.ts +112 -0
  288. package/src/local/client/consoleLogger.ts +60 -0
  289. package/src/local/client/createInternalComponents.ts +163 -0
  290. package/src/local/client/createModelProxy.ts +1390 -0
  291. package/src/local/client/modelRegistration.ts +350 -0
  292. package/src/local/client/options.ts +526 -0
  293. package/src/local/client/reactiveEngine.ts +935 -0
  294. package/src/local/client/resourceTypes.ts +37 -0
  295. package/src/local/client/schemaConfig.ts +194 -0
  296. package/src/local/client/storeCluster.ts +172 -0
  297. package/src/local/client/storeLifecycle.ts +343 -0
  298. package/src/local/client/validateAbloOptions.ts +95 -0
  299. package/src/local/client/wsMutationExecutor.ts +110 -0
  300. package/src/local/context.ts +96 -0
  301. package/src/local/coordination/ClaimLog.ts +39 -0
  302. package/src/local/interfaces/index.ts +468 -0
  303. package/src/local/localModelContract.ts +15 -0
  304. package/src/local/logPosition.ts +84 -0
  305. package/src/local/mutationPersistence.ts +7 -0
  306. package/src/local/mutators/RecordingMutation.ts +222 -0
  307. package/src/local/mutators/Transaction.ts +97 -0
  308. package/src/local/mutators/UndoManager.ts +741 -0
  309. package/src/local/mutators/defineMutators.ts +76 -0
  310. package/src/local/mutators/inverseOp.ts +83 -0
  311. package/src/local/mutators/mutateActions.ts +167 -0
  312. package/src/local/mutators/readerActions.ts +99 -0
  313. package/src/local/mutators/undoApply.ts +141 -0
  314. package/src/local/persistence.ts +16 -0
  315. package/src/local/query/QueryProcessor.ts +347 -0
  316. package/src/local/query/client.ts +197 -0
  317. package/src/local/query/types.ts +102 -0
  318. package/src/local/schema/serialize.ts +1 -0
  319. package/src/local/store/queryApi.ts +56 -0
  320. package/src/local/storeContract.ts +146 -0
  321. package/src/local/stores/DatabaseManager.ts +507 -0
  322. package/src/local/stores/ObjectStore.ts +449 -0
  323. package/src/local/stores/ObjectStoreContract.ts +48 -0
  324. package/src/local/stores/StoreManager.ts +388 -0
  325. package/src/local/stores/SyncActionStore.ts +579 -0
  326. package/src/local/stores/openIDBWithTimeout.ts +195 -0
  327. package/src/local/stores/persistenceCleanup.ts +43 -0
  328. package/src/local/stores/persistenceIdentity.ts +83 -0
  329. package/src/local/stores/syncAction.ts +21 -0
  330. package/src/local/stores/v1PersistenceDeletion.ts +21 -0
  331. package/src/local/sync/BootstrapFetcher.ts +1224 -0
  332. package/src/local/sync/ConnectionManager.ts +15 -0
  333. package/src/local/sync/OnDemandLoader.ts +927 -0
  334. package/src/local/sync/SubscriptionManager.ts +300 -0
  335. package/src/local/sync/SyncWebSocket.ts +584 -0
  336. package/src/local/sync/bootstrapApply.ts +130 -0
  337. package/src/local/sync/commitFrames.ts +16 -0
  338. package/src/local/sync/connectionManagerLifecycle.ts +158 -0
  339. package/src/local/sync/contextPorts.ts +37 -0
  340. package/src/local/sync/createClaimStream.ts +668 -0
  341. package/src/local/sync/createSnapshot.ts +160 -0
  342. package/src/local/sync/credentialLifecycle.ts +18 -0
  343. package/src/local/sync/deltaPipeline.ts +473 -0
  344. package/src/local/sync/groupChange.ts +343 -0
  345. package/src/local/sync/initialize.ts +205 -0
  346. package/src/local/sync/participants.ts +564 -0
  347. package/src/local/sync/persistedPrefix.ts +27 -0
  348. package/src/local/sync/reconnect.ts +88 -0
  349. package/src/local/sync/schemaDrift.ts +86 -0
  350. package/src/local/sync/schemas.ts +118 -0
  351. package/src/local/sync/socketEventWiring.ts +196 -0
  352. package/src/local/sync/syncCursor.ts +62 -0
  353. package/src/local/sync/syncPlan.ts +89 -0
  354. package/src/local/sync/terminalSessionLifecycle.ts +66 -0
  355. package/src/local/sync/wsFrameHandlers.ts +20 -0
  356. package/src/local/transactions/databaseCommitOutbox.ts +33 -0
  357. package/src/local/transactions/localMutation.ts +58 -0
  358. package/src/local/transactions/mutations/MutationQueue.ts +1998 -0
  359. package/src/local/transactions/mutations/MutationStore.ts +65 -0
  360. package/src/local/transactions/mutations/UnconfirmedWrites.ts +133 -0
  361. package/src/local/transactions/mutations/batchProcessing.ts +469 -0
  362. package/src/local/transactions/mutations/coalesceRules.ts +192 -0
  363. package/src/local/transactions/mutations/commitApi.ts +97 -0
  364. package/src/local/transactions/mutations/commitLane.ts +191 -0
  365. package/src/local/transactions/mutations/commitLatency.ts +164 -0
  366. package/src/local/transactions/mutations/commitPayload.ts +281 -0
  367. package/src/local/transactions/mutations/commitTransport.ts +174 -0
  368. package/src/local/transactions/mutations/deltaConfirmation.ts +298 -0
  369. package/src/local/transactions/mutations/durableCommitRestore.ts +128 -0
  370. package/src/local/transactions/mutations/durableWriteStore.ts +21 -0
  371. package/src/local/transactions/mutations/executionSelection.ts +42 -0
  372. package/src/local/transactions/mutations/failureHandling.ts +154 -0
  373. package/src/local/transactions/mutations/failurePolicy.ts +61 -0
  374. package/src/local/transactions/mutations/localMutation.ts +135 -0
  375. package/src/local/transactions/mutations/modelOperations.ts +210 -0
  376. package/src/local/transactions/mutations/mutationPersistence.ts +231 -0
  377. package/src/local/transactions/mutations/pendingDrain.ts +160 -0
  378. package/src/local/transactions/mutations/processingScheduler.ts +35 -0
  379. package/src/local/transactions/mutations/queueCoalescing.ts +45 -0
  380. package/src/local/transactions/mutations/replayValidation.ts +192 -0
  381. package/src/local/transactions/reconnectDrain.ts +24 -0
  382. package/src/local/utils/mobxSetup.ts +388 -0
  383. package/src/local/views/QueryView.ts +311 -0
  384. package/src/local/views/ViewRegistry.ts +61 -0
  385. package/src/local/views/incrementalView.ts +92 -0
  386. package/src/plugin.ts +396 -0
  387. package/src/presenceStream.ts +279 -0
  388. package/src/react/AbloProvider.tsx +744 -0
  389. package/src/react/ClientSideSuspense.tsx +57 -0
  390. package/src/react/DefaultFallback.tsx +60 -0
  391. package/src/react/context.ts +89 -0
  392. package/src/react/createAbloReact.ts +116 -0
  393. package/src/react/internalContext.ts +38 -0
  394. package/src/react/useAblo.ts +280 -0
  395. package/src/react/useCurrentUserId.ts +17 -0
  396. package/src/react/useErrorListener.ts +22 -0
  397. package/src/react/useMutationFailureListener.ts +34 -0
  398. package/src/react/useMutators.ts +184 -0
  399. package/src/react/useSyncStatus.ts +42 -0
  400. package/src/react/useUndoScope.ts +143 -0
  401. package/src/react.ts +69 -0
  402. package/src/reactRuntime.ts +10 -0
  403. package/src/surface.ts +106 -0
  404. package/src/useReactive.ts +51 -0
@@ -0,0 +1,153 @@
1
+ /**
2
+ * The error raised when opening an IndexedDB database does not complete in a
3
+ * bounded time. {@link openIDBWithTimeout} throws it in two situations: another
4
+ * browser tab is holding an older version of the database open and blocking the
5
+ * upgrade (`reason: 'blocked'`), or the open request produced no result at all
6
+ * within the timeout (`reason: 'timeout'`).
7
+ *
8
+ * The native open request can otherwise hang indefinitely — when a blocking tab
9
+ * never closes its connection, neither the success nor the error callback fires,
10
+ * and any code awaiting the open waits forever. Turning that into a thrown error
11
+ * lets the surrounding application show a recoverable failure instead of an
12
+ * unbreakable spinner.
13
+ */
14
+ export class IDBOpenTimeoutError extends Error {
15
+ dbName;
16
+ reason;
17
+ /**
18
+ * A stable identifier for this failure, independent of the message text. When
19
+ * this error is wrapped into an {@link AbloError} by `toAbloError`, the string
20
+ * code is preserved, so error handlers can recognize a wedged-storage failure
21
+ * and offer a recovery path rather than matching on the message.
22
+ */
23
+ code = 'storage_open_timeout';
24
+ constructor(dbName, reason, message) {
25
+ super(message);
26
+ this.dbName = dbName;
27
+ this.reason = reason;
28
+ this.name = 'IDBOpenTimeoutError';
29
+ }
30
+ }
31
+ /**
32
+ * Returns true when a caught value is the storage-open-timeout failure. It
33
+ * detects the failure by its stable `code`, so it still matches after the error
34
+ * has been wrapped into an {@link AbloError} or another error type.
35
+ */
36
+ export function isStorageOpenTimeout(err) {
37
+ return (typeof err === 'object' &&
38
+ err !== null &&
39
+ err.code === 'storage_open_timeout');
40
+ }
41
+ export function openIDBWithTimeout(name, version, options = {}) {
42
+ const timeoutMs = options.timeoutMs ?? 10_000;
43
+ return new Promise((resolve, reject) => {
44
+ const request = version === undefined
45
+ ? indexedDB.open(name)
46
+ : indexedDB.open(name, version);
47
+ let settled = false;
48
+ const settle = (fn) => {
49
+ if (settled)
50
+ return;
51
+ settled = true;
52
+ clearTimeout(timer);
53
+ fn();
54
+ };
55
+ if (options.onUpgrade) {
56
+ request.onupgradeneeded = (event) => {
57
+ options.onUpgrade(request, event);
58
+ };
59
+ }
60
+ request.onsuccess = () => {
61
+ // If we already timed out or were blocked and rejected, this is a late
62
+ // success: the native open eventually completed after we gave up. The
63
+ // resulting connection is orphaned — nothing up the stack holds it, so
64
+ // nothing will close it. A leaked open connection holds an IndexedDB lock
65
+ // that wedges every later open or delete of this database name, so close
66
+ // it here to keep a timed-out attempt from poisoning the store.
67
+ if (settled) {
68
+ try {
69
+ request.result.close();
70
+ }
71
+ catch {
72
+ // Best-effort — a half-open connection may already be unusable.
73
+ }
74
+ return;
75
+ }
76
+ const db = request.result;
77
+ // Required resilience handler per the IndexedDB specification: close this
78
+ // connection as soon as any other context wants to upgrade or delete the
79
+ // database. Without it, a connection that ignores `versionchange` blocks
80
+ // the other context's request indefinitely — a common cause of a database
81
+ // that stays wedged across reloads. Closing here makes the store release
82
+ // itself.
83
+ db.onversionchange = () => {
84
+ try {
85
+ db.close();
86
+ }
87
+ catch {
88
+ // Already closing/closed — nothing to do.
89
+ }
90
+ try {
91
+ options.onVersionChange?.();
92
+ }
93
+ catch {
94
+ // A consumer reaction must never break the close.
95
+ }
96
+ };
97
+ settle(() => { resolve(db); });
98
+ };
99
+ request.onerror = () => { settle(() => { reject(request.error); }); };
100
+ // The critical handler: another tab is blocking us. Native API leaves
101
+ // the request pending indefinitely; we fail fast with a clear error so
102
+ // the UI can tell the user to close other tabs.
103
+ request.onblocked = () => {
104
+ settle(() => {
105
+ reject(new IDBOpenTimeoutError(name, 'blocked', `IndexedDB \"${name}\" open blocked — another tab is holding an ` +
106
+ `older version. Close other Ablo tabs and reload.`));
107
+ });
108
+ };
109
+ // Catch-all timeout: even without `onblocked`, some browsers in some
110
+ // storage states hang without firing any event. Bounded wait →
111
+ // deterministic error.
112
+ const timer = setTimeout(() => {
113
+ settle(() => {
114
+ reject(new IDBOpenTimeoutError(name, 'timeout', `IndexedDB \"${name}\" open did not resolve within ${timeoutMs}ms. ` +
115
+ `Storage may be in a bad state — clearing site data and reloading ` +
116
+ `usually fixes this.`));
117
+ });
118
+ }, timeoutMs);
119
+ });
120
+ }
121
+ /**
122
+ * Deletes an IndexedDB database within a bounded time — the delete counterpart
123
+ * to {@link openIDBWithTimeout}. It is used to recover from a wedged backing
124
+ * store: when opening a database times out, the caller can delete it and start
125
+ * fresh, which is safe for any database whose contents can be rebuilt on the
126
+ * next load.
127
+ *
128
+ * Like an open request, a native delete can hang indefinitely — it fires a
129
+ * blocked event and waits when another connection still holds the database, and
130
+ * on a truly stuck store it fires no event at all. Both cases become a bounded,
131
+ * resolved result here, so the caller never spins.
132
+ *
133
+ * Resolves to `true` on a clean delete and `false` when the delete was blocked
134
+ * or timed out. Either way the caller can decide whether to retry the open; a
135
+ * delete that did nothing leaves the store no worse off.
136
+ */
137
+ export function deleteIDBWithTimeout(name, timeoutMs = 5_000) {
138
+ return new Promise((resolve) => {
139
+ let settled = false;
140
+ const settle = (value) => {
141
+ if (settled)
142
+ return;
143
+ settled = true;
144
+ clearTimeout(timer);
145
+ resolve(value);
146
+ };
147
+ const request = indexedDB.deleteDatabase(name);
148
+ request.onsuccess = () => { settle(true); };
149
+ request.onerror = () => { settle(false); };
150
+ request.onblocked = () => { settle(false); };
151
+ const timer = setTimeout(() => { settle(false); }, timeoutMs);
152
+ });
153
+ }
@@ -0,0 +1,7 @@
1
+ import type { DatabaseInfo } from './DatabaseManager.js';
2
+ type DeleteDatabase = (name: string) => Promise<boolean>;
3
+ /** Exact data-store names that can contain the current identity's state. */
4
+ export declare function persistenceDatabaseNamesForDeletion(current: DatabaseInfo | null): string[];
5
+ /** Delete authenticated IndexedDB state after its owners have closed handles. */
6
+ export declare function purgeIndexedDbPersistence(current: DatabaseInfo | null, deleteDatabase?: DeleteDatabase): Promise<void>;
7
+ export {};
@@ -0,0 +1,26 @@
1
+ import { AbloConnectionError } from '@abloatai/transaction/errors';
2
+ import { deleteIDBWithTimeout } from './openIDBWithTimeout.js';
3
+ import { v1PersistenceDatabaseNameForDeletion } from './v1PersistenceDeletion.js';
4
+ /** Exact data-store names that can contain the current identity's state. */
5
+ export function persistenceDatabaseNamesForDeletion(current) {
6
+ if (!current)
7
+ return ['ablo-sync'];
8
+ return [
9
+ current.name,
10
+ v1PersistenceDatabaseNameForDeletion(current.userId, current.workspaceId, current.userVersion ?? 1),
11
+ // Retired pre-identity store. It cannot be attributed safely, so any
12
+ // terminal cleanup removes it rather than attempting to reuse its data.
13
+ 'ablo-sync',
14
+ ];
15
+ }
16
+ /** Delete authenticated IndexedDB state after its owners have closed handles. */
17
+ export async function purgeIndexedDbPersistence(current, deleteDatabase = deleteIDBWithTimeout) {
18
+ const failed = new Set();
19
+ for (const name of persistenceDatabaseNamesForDeletion(current)) {
20
+ if (!(await deleteDatabase(name)))
21
+ failed.add(name);
22
+ }
23
+ if (failed.size > 0) {
24
+ throw new AbloConnectionError(`Could not remove authenticated local data from: ${[...failed].join(', ')}`, { code: 'db_cleanup_failed' });
25
+ }
26
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The complete authenticated plane that owns one local replica. The same
3
+ * participant can have different data in a project, sandbox, or environment;
4
+ * those replicas must never share a namespace.
5
+ */
6
+ export interface PersistenceIdentity {
7
+ readonly participantId: string;
8
+ readonly participantKind: string;
9
+ readonly organizationId: string;
10
+ readonly projectId: string | null;
11
+ readonly environment: 'sandbox' | 'production' | null;
12
+ readonly sandboxId: string | null;
13
+ }
14
+ export interface PersistedIdentityMetadata {
15
+ readonly namespaceVersion?: number;
16
+ readonly userId: string;
17
+ readonly workspaceId: string;
18
+ readonly participantKind?: string;
19
+ readonly projectId?: string | null;
20
+ readonly environment?: 'sandbox' | 'production' | null;
21
+ readonly sandboxId?: string | null;
22
+ }
23
+ export declare const PERSISTENCE_NAMESPACE_VERSION = 2;
24
+ /** Collision-resistant IndexedDB name for one authenticated data plane. */
25
+ export declare function persistenceDatabaseName(identity: PersistenceIdentity, userVersion?: number): Promise<string>;
26
+ /** Defense-in-depth check after namespace lookup and before persisted reads. */
27
+ export declare function persistenceIdentityMatches(info: PersistedIdentityMetadata, identity: PersistenceIdentity): boolean;
@@ -0,0 +1,38 @@
1
+ import { AbloConnectionError } from '@abloatai/transaction/errors';
2
+ export const PERSISTENCE_NAMESPACE_VERSION = 2;
3
+ function canonicalIdentity(identity, userVersion) {
4
+ return JSON.stringify([
5
+ PERSISTENCE_NAMESPACE_VERSION,
6
+ identity.projectId,
7
+ identity.environment,
8
+ identity.sandboxId,
9
+ identity.organizationId,
10
+ identity.participantKind,
11
+ identity.participantId,
12
+ userVersion,
13
+ ]);
14
+ }
15
+ async function sha256Hex(value) {
16
+ const cryptoProvider = Reflect.get(globalThis, 'crypto');
17
+ const subtle = cryptoProvider?.subtle;
18
+ if (!subtle) {
19
+ throw new AbloConnectionError('Secure local persistence requires Web Crypto SHA-256 support.', { code: 'db_secure_hash_unavailable' });
20
+ }
21
+ const digest = await subtle.digest('SHA-256', new TextEncoder().encode(value));
22
+ return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, '0')).join('');
23
+ }
24
+ /** Collision-resistant IndexedDB name for one authenticated data plane. */
25
+ export async function persistenceDatabaseName(identity, userVersion = 1) {
26
+ const digest = await sha256Hex(canonicalIdentity(identity, userVersion));
27
+ return `ablo_v${PERSISTENCE_NAMESPACE_VERSION}_${digest}`;
28
+ }
29
+ /** Defense-in-depth check after namespace lookup and before persisted reads. */
30
+ export function persistenceIdentityMatches(info, identity) {
31
+ return (info.namespaceVersion === PERSISTENCE_NAMESPACE_VERSION &&
32
+ info.userId === identity.participantId &&
33
+ info.workspaceId === identity.organizationId &&
34
+ info.participantKind === identity.participantKind &&
35
+ (info.projectId ?? null) === identity.projectId &&
36
+ (info.environment ?? null) === identity.environment &&
37
+ (info.sandboxId ?? null) === identity.sandboxId);
38
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The persisted local action record consumed by `SyncActionStore`. It is a
3
+ * client materialization artifact, not a transaction-layer wire shape: the
4
+ * authoritative broadcast vocabulary is the settlement core's delta wire
5
+ * schema, while this one adds the local `__class` discriminator IndexedDB uses.
6
+ */
7
+ import { z } from 'zod';
8
+ export declare const syncActionSchema: z.ZodObject<{
9
+ id: z.ZodNumber;
10
+ modelName: z.ZodString;
11
+ modelId: z.ZodString;
12
+ action: z.ZodEnum<{
13
+ I: "I";
14
+ U: "U";
15
+ D: "D";
16
+ A: "A";
17
+ V: "V";
18
+ C: "C";
19
+ G: "G";
20
+ S: "S";
21
+ }>;
22
+ data: z.ZodUnknown;
23
+ __class: z.ZodDefault<z.ZodLiteral<"SyncAction">>;
24
+ }, z.core.$strip>;
25
+ export type SyncAction = z.infer<typeof syncActionSchema>;
26
+ export type SyncActionType = SyncAction['action'];
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The persisted local action record consumed by `SyncActionStore`. It is a
3
+ * client materialization artifact, not a transaction-layer wire shape: the
4
+ * authoritative broadcast vocabulary is the settlement core's delta wire
5
+ * schema, while this one adds the local `__class` discriminator IndexedDB uses.
6
+ */
7
+ import { z } from 'zod';
8
+ import { syncDeltaActionSchema } from '@abloatai/transaction/wire/delta';
9
+ export const syncActionSchema = z.object({
10
+ id: z.number(),
11
+ modelName: z.string(),
12
+ modelId: z.string(),
13
+ action: syncDeltaActionSchema,
14
+ data: z.unknown(),
15
+ __class: z.literal('SyncAction').default('SyncAction'),
16
+ });
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Migration-only knowledge of the removed v1 IndexedDB namespace. Nothing in
3
+ * this module may be used to open or hydrate data; it exists only to find and
4
+ * delete stores created by clients before persistence namespace v2.
5
+ *
6
+ * Remove after the v1 cleanup support window.
7
+ */
8
+ export declare function v1PersistenceDatabaseNameForDeletion(participantId: string, organizationId: string, userVersion: number): string;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Migration-only knowledge of the removed v1 IndexedDB namespace. Nothing in
3
+ * this module may be used to open or hydrate data; it exists only to find and
4
+ * delete stores created by clients before persistence namespace v2.
5
+ *
6
+ * Remove after the v1 cleanup support window.
7
+ */
8
+ export function v1PersistenceDatabaseNameForDeletion(participantId, organizationId, userVersion) {
9
+ const combined = `${participantId}:${organizationId}:${userVersion}`;
10
+ let hash = 0;
11
+ for (let index = 0; index < combined.length; index++) {
12
+ hash = (hash << 5) - hash + combined.charCodeAt(index);
13
+ hash &= hash;
14
+ }
15
+ return `ablo_${Math.abs(hash).toString(16).padStart(8, '0')}`;
16
+ }
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Fetches the initial snapshot the sync engine needs before it can go live: the
3
+ * current rows for the requested models plus the sync position from which to
4
+ * resume live updates. It calls the sync server's `/sync/bootstrap` HTTP
5
+ * endpoint, retries transient failures with backoff, and can fall back to a
6
+ * cached snapshot when the device is offline. {@link BootstrapData} is the
7
+ * shape it returns; {@link BootstrapOptions} configures it.
8
+ */
9
+ export interface BootstrapData {
10
+ type: 'full' | 'partial';
11
+ lastSyncId: number;
12
+ /**
13
+ * Model rows keyed by type name. Each row is opaque at this boundary; the
14
+ * engine asserts the per-model shape against the registered schema when it
15
+ * reduces the rows and writes them to local storage.
16
+ */
17
+ models?: Record<string, unknown[]>;
18
+ deltas?: ValidatedServerDelta[];
19
+ deltaCount?: number;
20
+ /** Model types whose server-side query failed (timeout, RLS error, and the like). */
21
+ failedModels?: string[];
22
+ timestamp: number;
23
+ /**
24
+ * The content hash of the schema the server currently has active for this
25
+ * tenant — the same hash `ablo push` computes. Present once a schema has been
26
+ * pushed. The client compares it against its own `expectedSchemaHash` to warn
27
+ * when the app's schema and the deployed schema have drifted apart.
28
+ */
29
+ schemaHash?: string;
30
+ /**
31
+ * Present when a paged single-model request stopped at its row limit with
32
+ * rows remaining: pass it back as the next page's `cursor`. Absent on the
33
+ * final page, on unpaged responses, and from servers that predate paging.
34
+ */
35
+ nextCursor?: string;
36
+ }
37
+ export interface BootstrapFetchResult {
38
+ notModified: boolean;
39
+ data?: BootstrapData;
40
+ etag?: string | null;
41
+ }
42
+ export interface BootstrapOptions {
43
+ /**
44
+ * Full base URL of the sync server's HTTP API, **including the `/api`
45
+ * prefix**. The bootstrap endpoint is appended as `/sync/bootstrap`, so
46
+ * the final request hits `${baseUrl}/sync/bootstrap`.
47
+ *
48
+ * Example: `'http://localhost:8080/api'` → `http://localhost:8080/api/sync/bootstrap`
49
+ *
50
+ * Default: `'http://localhost:8080/api'`.
51
+ */
52
+ baseUrl?: string;
53
+ /**
54
+ * Namespace for the offline bootstrap cache. Most callers leave this unset;
55
+ * the SDK fills it in once authentication has resolved the account scope, so
56
+ * the fallback cache is partitioned per account.
57
+ */
58
+ cacheScope?: string | null;
59
+ /**
60
+ * @deprecated Use `cacheScope`. Retained so code that constructs
61
+ * {@link BootstrapFetcher} directly keeps its cache namespace.
62
+ */
63
+ organizationId?: string;
64
+ syncGroups?: string[];
65
+ maxRetries?: number;
66
+ retryDelay?: number;
67
+ /**
68
+ * How long to wait for the server to START responding (response headers), in
69
+ * milliseconds. Default 20000 (20 seconds).
70
+ *
71
+ * Deliberately NOT a bound on the whole download: a cold-start snapshot can
72
+ * be tens of megabytes, and its transfer time depends on the connection. A
73
+ * healthy download that is actively delivering bytes is never aborted, no
74
+ * matter how long it takes — {@link stallTimeout} guards the body instead.
75
+ */
76
+ fetchTimeout?: number;
77
+ /**
78
+ * The longest quiet gap allowed between body chunks while downloading, in
79
+ * milliseconds. Default 15000 (15 seconds). This is the progress watchdog:
80
+ * it aborts a download whose stream has gone silent (dead connection,
81
+ * hung proxy) without ever penalizing a slow-but-moving transfer.
82
+ */
83
+ stallTimeout?: number;
84
+ /**
85
+ * The model names to request. When set, the server returns only these models
86
+ * and skips the rest. This is derived from each model's `load` strategy: only
87
+ * models loaded instantly (the default) are included. When unset, the server
88
+ * returns every model.
89
+ */
90
+ instantModels?: string[];
91
+ /**
92
+ * Getter for the current credential, read at request time so a refreshed
93
+ * token takes effect without recreating the helper. Preferred over
94
+ * {@link BootstrapFetcher.setAuthToken}.
95
+ */
96
+ getAuthToken?: AuthTokenGetter;
97
+ /** The owning client's runtime. Defaults to the module-global bridge. */
98
+ runtime?: RuntimeContext;
99
+ }
100
+ import type { RuntimeContext } from '../RuntimeContext.js';
101
+ import { type AuthTokenGetter } from '@abloatai/transaction/auth/credentialSource';
102
+ import { type ValidatedServerDelta } from './schemas.js';
103
+ export declare class BootstrapFetcher {
104
+ private options;
105
+ private readonly runtime;
106
+ /**
107
+ * Every in-flight request's controller, tagged with the lane it belongs to. A
108
+ * registry rather than a single field because a chunked cold start runs
109
+ * several model fetches concurrently — aborting one request (its own
110
+ * TTFB/stall watchdog) must never take its siblings down, while
111
+ * {@link abort} takes down all of them.
112
+ */
113
+ private readonly activeControllers;
114
+ /**
115
+ * Non-scoped bootstraps currently running, keyed by request identity. A
116
+ * second call for the same snapshot joins the one already in flight rather
117
+ * than cancelling and restarting it — see {@link fetchBootstrap}.
118
+ */
119
+ private readonly flights;
120
+ /** Warn about schema drift at most once per helper. */
121
+ private schemaDriftWarned;
122
+ /**
123
+ * Abort every in-flight request in `lane` — or in every lane when none is
124
+ * given — with an explicit reason.
125
+ *
126
+ * The reason is load-bearing, not decoration. `fetch` rejects with the exact
127
+ * value handed to `abort()`, so passing a typed error is what lets the retry
128
+ * loop below tell a deliberate cancellation apart from a dead connection. A
129
+ * bare `abort()` produces an `AbortError` indistinguishable from the one the
130
+ * browser's stop button produces, and a retry loop that cannot tell them
131
+ * apart re-issues the requests it just killed.
132
+ */
133
+ private cancelActive;
134
+ /**
135
+ * The longest a single bootstrap can run before every watchdog below has
136
+ * necessarily fired, derived from those watchdogs rather than guessed. A
137
+ * caller wanting an outer deadline reads this instead of picking a number,
138
+ * so it cannot set one shorter than the work it wraps. A cold start pages
139
+ * through its models {@link CHUNK_CONCURRENCY} at a time; each request may
140
+ * spend `fetchTimeout` waiting for response headers and `stallTimeout`
141
+ * waiting for the next body chunk, and may be retried `maxRetries` times.
142
+ */
143
+ get budgetMs(): number;
144
+ get baseUrl(): string;
145
+ /**
146
+ * Advisory schema-drift check: compare the server's active schema hash (on the
147
+ * bootstrap response) against the hash this client was built with. A mismatch
148
+ * means the app's schema and the deployed schema have diverged — reads/writes
149
+ * relying on undeployed changes will later fail with an opaque DB constraint
150
+ * error. Warn once, actionably; never throws or blocks the bootstrap.
151
+ *
152
+ * The message names the SERVER it connected to, and spans all three real
153
+ * causes rather than assuming "you forgot to push". Drift most often means the
154
+ * schema was pushed to a different server, project, or environment than this
155
+ * client points at (a bare `ablo push` targets the hosted default; a local app
156
+ * usually reads a local server) — so the first, load-bearing pointer is `ablo
157
+ * status`, which names the exact org/project/environment the key resolves to
158
+ * and the deployed hash, turning "which of these is it?" into one glance. The
159
+ * older "Run `ablo push`" copy sent everyone down one path and confused the
160
+ * common wrong-target and version-skew cases.
161
+ */
162
+ private warnOnSchemaDrift;
163
+ /** Fetch the server's per-model schema surface and warn precisely — or stay
164
+ * silent when every model this client declares matches (additive lead). */
165
+ private resolveSemanticDrift;
166
+ private warnWholeHashDrift;
167
+ constructor(options: BootstrapOptions);
168
+ /**
169
+ * Update the offline-cache namespace once auth has resolved the server-side
170
+ * account scope. This is intentionally not a public organizationId input.
171
+ */
172
+ setCacheScope(cacheScope: string): void;
173
+ setSyncGroups(syncGroups: readonly string[] | undefined): void;
174
+ /**
175
+ * Sets a fixed credential for callers that construct the helper directly.
176
+ * The SDK instead supplies `getAuthToken` and never calls this.
177
+ */
178
+ setAuthToken(authToken: string | undefined): void;
179
+ /**
180
+ * Fetch bootstrap data from sync engine with partial bootstrap support
181
+ * @param lastSyncId - Optional: client's current lastSyncId for partial bootstrap
182
+ * @returns Bootstrap data (either full snapshot or delta batch)
183
+ */
184
+ fetchBootstrap(lastSyncId?: number,
185
+ /**
186
+ * A per-call set of sync groups for a scoped hydrate-on-enter. When given,
187
+ * the request uses these groups instead of the configured `syncGroups`, and
188
+ * does so without mutating the shared options, so a concurrent full
189
+ * bootstrap is unaffected. It also bypasses the offline snapshot cache,
190
+ * which holds the full bootstrap and would be a wrong answer to a subset
191
+ * request.
192
+ */
193
+ syncGroupsOverride?: readonly string[]): Promise<BootstrapData>;
194
+ /**
195
+ * The identity of a bootstrap request: everything that determines its answer.
196
+ * Two calls with the same key are asking the same question, so the second can
197
+ * take the first's result.
198
+ */
199
+ private flightKey;
200
+ /** One bootstrap, start to finish. {@link fetchBootstrap} owns whether it runs. */
201
+ private runBootstrap;
202
+ /**
203
+ * One bootstrap URL, fetched with backoff. Session errors and other
204
+ * non-retryable failures throw immediately; only transient failures
205
+ * (5xx, 429, timeouts, network blips) consume attempts. A cancellation is
206
+ * deliberate and therefore non-retryable — it leaves through the same gate.
207
+ */
208
+ private fetchWithRetries;
209
+ /**
210
+ * Cold-start bootstrap, one request per instant model with a small
211
+ * concurrency cap. Any chunk's terminal failure fails the whole
212
+ * bootstrap (a partial snapshot must never masquerade as a full one)
213
+ * and cancels its siblings.
214
+ */
215
+ private fetchChunkedBootstrap;
216
+ /**
217
+ * Fetch bootstrap with ETag, returning 304 hints
218
+ */
219
+ fetchBootstrapWithETag(): Promise<BootstrapFetchResult>;
220
+ private fetchWithETagUsing;
221
+ /**
222
+ * Read a response body as a stream under a progress watchdog: the stall
223
+ * timer re-arms on every chunk, so only a silent stream is aborted — a
224
+ * slow-but-moving download is never killed for total duration. A cold-start
225
+ * snapshot can be tens of megabytes; bounding its total transfer time was
226
+ * what trapped large orgs in an endless full-bootstrap retry loop.
227
+ *
228
+ * Falls back to `response.json()` when the response exposes no readable
229
+ * stream (empty bodies, some test doubles).
230
+ */
231
+ private readJsonWithStallGuard;
232
+ /**
233
+ * Perform one fetch. The timeout here bounds time to response headers
234
+ * only; the body download is guarded by the stall watchdog in
235
+ * {@link readJsonWithStallGuard}. Superseding an older in-flight
236
+ * bootstrap is the caller's job ({@link fetchBootstrap} cancels the
237
+ * registry) — chunk requests run through here concurrently and must
238
+ * not cancel each other.
239
+ */
240
+ private fetchOnce;
241
+ private fetchOnceWith;
242
+ /**
243
+ * Fetch a single entity by ID (on-demand self-healing).
244
+ * Returns `null` for 404 (entity deleted) — this is an expected state, not an error.
245
+ * Throws for unexpected HTTP errors (5xx, network failures).
246
+ */
247
+ fetchEntity(modelName: string, id: string): Promise<Record<string, unknown> | null>;
248
+ /**
249
+ * Clear all cached bootstrap data
250
+ */
251
+ clearCache(): void;
252
+ private getBootstrapCacheKey;
253
+ private saveCachedBootstrap;
254
+ private loadCachedBootstrap;
255
+ /**
256
+ * Abort every ongoing bootstrap request (including all chunks of a
257
+ * chunked cold start). Entity self-heal fetches are unaffected.
258
+ *
259
+ * The flight registry is cleared first and synchronously, so a caller that
260
+ * bootstraps again in the same tick starts a fresh request rather than
261
+ * joining the one being torn down.
262
+ */
263
+ abort(): void;
264
+ /**
265
+ * Helper to delay execution
266
+ */
267
+ private delay;
268
+ /**
269
+ * Get health status of sync engine
270
+ */
271
+ checkHealth(): Promise<boolean>;
272
+ }
273
+ /**
274
+ * Assemble per-model chunk responses into one full snapshot.
275
+ *
276
+ * Each chunk is internally consistent at its own sync position, and the
277
+ * positions differ (the chunks were served seconds apart). Anchoring the
278
+ * merged snapshot at the MINIMUM position turns that skew into an ordinary
279
+ * "briefly offline client": the WS catch-up replays every delta from the
280
+ * anchor, and since deltas carry full rows, re-applying one a later chunk
281
+ * already reflects converges to the same state. Anchoring at anything later
282
+ * would silently skip deltas for the earliest-fetched models.
283
+ */
284
+ export declare function mergeBootstrapChunks(chunks: readonly BootstrapData[]): BootstrapData;