@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,195 @@
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
+ /**
16
+ * A stable identifier for this failure, independent of the message text. When
17
+ * this error is wrapped into an {@link AbloError} by `toAbloError`, the string
18
+ * code is preserved, so error handlers can recognize a wedged-storage failure
19
+ * and offer a recovery path rather than matching on the message.
20
+ */
21
+ readonly code = 'storage_open_timeout';
22
+
23
+ constructor(
24
+ public readonly dbName: string,
25
+ public readonly reason: 'blocked' | 'timeout',
26
+ message: string,
27
+ ) {
28
+ super(message);
29
+ this.name = 'IDBOpenTimeoutError';
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Returns true when a caught value is the storage-open-timeout failure. It
35
+ * detects the failure by its stable `code`, so it still matches after the error
36
+ * has been wrapped into an {@link AbloError} or another error type.
37
+ */
38
+ export function isStorageOpenTimeout(err: unknown): boolean {
39
+ return (
40
+ typeof err === 'object' &&
41
+ err !== null &&
42
+ (err as { code?: unknown }).code === 'storage_open_timeout'
43
+ );
44
+ }
45
+
46
+ export interface OpenIDBOptions {
47
+ /** Called inside `onupgradeneeded` — mirrors `IDBOpenDBRequest.onupgradeneeded`. */
48
+ onUpgrade?: (request: IDBOpenDBRequest, event: IDBVersionChangeEvent) => void;
49
+ /** Max milliseconds to wait for the open request to resolve. Default 10_000. */
50
+ timeoutMs?: number;
51
+ /**
52
+ * Called when another context — a new tab, a page reload after a deploy, or
53
+ * this package's own {@link deleteIDBWithTimeout} recovery — needs to upgrade
54
+ * or delete the database and fires a `versionchange` event on this connection.
55
+ * The connection is always closed first, which is what lets the other
56
+ * context's upgrade or delete proceed instead of blocking on this one. Provide
57
+ * this callback to react after that close, for example to prompt the user to
58
+ * reload. Any error it throws is ignored.
59
+ */
60
+ onVersionChange?: () => void;
61
+ }
62
+
63
+ export function openIDBWithTimeout(
64
+ name: string,
65
+ version: number | undefined,
66
+ options: OpenIDBOptions = {},
67
+ ): Promise<IDBDatabase> {
68
+ const timeoutMs = options.timeoutMs ?? 10_000;
69
+
70
+ return new Promise((resolve, reject) => {
71
+ const request = version === undefined
72
+ ? indexedDB.open(name)
73
+ : indexedDB.open(name, version);
74
+ let settled = false;
75
+ const settle = (fn: () => void) => {
76
+ if (settled) return;
77
+ settled = true;
78
+ clearTimeout(timer);
79
+ fn();
80
+ };
81
+
82
+ if (options.onUpgrade) {
83
+ request.onupgradeneeded = (event) => {
84
+ options.onUpgrade!(request, event);
85
+ };
86
+ }
87
+
88
+ request.onsuccess = () => {
89
+ // If we already timed out or were blocked and rejected, this is a late
90
+ // success: the native open eventually completed after we gave up. The
91
+ // resulting connection is orphaned — nothing up the stack holds it, so
92
+ // nothing will close it. A leaked open connection holds an IndexedDB lock
93
+ // that wedges every later open or delete of this database name, so close
94
+ // it here to keep a timed-out attempt from poisoning the store.
95
+ if (settled) {
96
+ try {
97
+ request.result.close();
98
+ } catch {
99
+ // Best-effort — a half-open connection may already be unusable.
100
+ }
101
+ return;
102
+ }
103
+ const db = request.result;
104
+ // Required resilience handler per the IndexedDB specification: close this
105
+ // connection as soon as any other context wants to upgrade or delete the
106
+ // database. Without it, a connection that ignores `versionchange` blocks
107
+ // the other context's request indefinitely — a common cause of a database
108
+ // that stays wedged across reloads. Closing here makes the store release
109
+ // itself.
110
+ db.onversionchange = () => {
111
+ try {
112
+ db.close();
113
+ } catch {
114
+ // Already closing/closed — nothing to do.
115
+ }
116
+ try {
117
+ options.onVersionChange?.();
118
+ } catch {
119
+ // A consumer reaction must never break the close.
120
+ }
121
+ };
122
+ settle(() => { resolve(db); });
123
+ };
124
+ request.onerror = () => { settle(() => { reject(request.error); }); };
125
+
126
+ // The critical handler: another tab is blocking us. Native API leaves
127
+ // the request pending indefinitely; we fail fast with a clear error so
128
+ // the UI can tell the user to close other tabs.
129
+ request.onblocked = () => {
130
+ settle(() =>
131
+ { reject(
132
+ new IDBOpenTimeoutError(
133
+ name,
134
+ 'blocked',
135
+ `IndexedDB \"${name}\" open blocked — another tab is holding an ` +
136
+ `older version. Close other Ablo tabs and reload.`,
137
+ ),
138
+ ); },
139
+ );
140
+ };
141
+
142
+ // Catch-all timeout: even without `onblocked`, some browsers in some
143
+ // storage states hang without firing any event. Bounded wait →
144
+ // deterministic error.
145
+ const timer = setTimeout(() => {
146
+ settle(() =>
147
+ { reject(
148
+ new IDBOpenTimeoutError(
149
+ name,
150
+ 'timeout',
151
+ `IndexedDB \"${name}\" open did not resolve within ${timeoutMs}ms. ` +
152
+ `Storage may be in a bad state — clearing site data and reloading ` +
153
+ `usually fixes this.`,
154
+ ),
155
+ ); },
156
+ );
157
+ }, timeoutMs);
158
+ });
159
+ }
160
+
161
+ /**
162
+ * Deletes an IndexedDB database within a bounded time — the delete counterpart
163
+ * to {@link openIDBWithTimeout}. It is used to recover from a wedged backing
164
+ * store: when opening a database times out, the caller can delete it and start
165
+ * fresh, which is safe for any database whose contents can be rebuilt on the
166
+ * next load.
167
+ *
168
+ * Like an open request, a native delete can hang indefinitely — it fires a
169
+ * blocked event and waits when another connection still holds the database, and
170
+ * on a truly stuck store it fires no event at all. Both cases become a bounded,
171
+ * resolved result here, so the caller never spins.
172
+ *
173
+ * Resolves to `true` on a clean delete and `false` when the delete was blocked
174
+ * or timed out. Either way the caller can decide whether to retry the open; a
175
+ * delete that did nothing leaves the store no worse off.
176
+ */
177
+ export function deleteIDBWithTimeout(
178
+ name: string,
179
+ timeoutMs = 5_000,
180
+ ): Promise<boolean> {
181
+ return new Promise((resolve) => {
182
+ let settled = false;
183
+ const settle = (value: boolean) => {
184
+ if (settled) return;
185
+ settled = true;
186
+ clearTimeout(timer);
187
+ resolve(value);
188
+ };
189
+ const request = indexedDB.deleteDatabase(name);
190
+ request.onsuccess = () => { settle(true); };
191
+ request.onerror = () => { settle(false); };
192
+ request.onblocked = () => { settle(false); };
193
+ const timer = setTimeout(() => { settle(false); }, timeoutMs);
194
+ });
195
+ }
@@ -0,0 +1,43 @@
1
+ import { AbloConnectionError } from '@abloatai/transaction/errors';
2
+ import type { DatabaseInfo } from './DatabaseManager.js';
3
+ import { deleteIDBWithTimeout } from './openIDBWithTimeout.js';
4
+ import { v1PersistenceDatabaseNameForDeletion } from './v1PersistenceDeletion.js';
5
+
6
+ type DeleteDatabase = (name: string) => Promise<boolean>;
7
+
8
+ /** Exact data-store names that can contain the current identity's state. */
9
+ export function persistenceDatabaseNamesForDeletion(
10
+ current: DatabaseInfo | null,
11
+ ): string[] {
12
+ if (!current) return ['ablo-sync'];
13
+ return [
14
+ current.name,
15
+ v1PersistenceDatabaseNameForDeletion(
16
+ current.userId,
17
+ current.workspaceId,
18
+ current.userVersion ?? 1,
19
+ ),
20
+ // Retired pre-identity store. It cannot be attributed safely, so any
21
+ // terminal cleanup removes it rather than attempting to reuse its data.
22
+ 'ablo-sync',
23
+ ];
24
+ }
25
+
26
+ /** Delete authenticated IndexedDB state after its owners have closed handles. */
27
+ export async function purgeIndexedDbPersistence(
28
+ current: DatabaseInfo | null,
29
+ deleteDatabase: DeleteDatabase = deleteIDBWithTimeout,
30
+ ): Promise<void> {
31
+ const failed = new Set<string>();
32
+
33
+ for (const name of persistenceDatabaseNamesForDeletion(current)) {
34
+ if (!(await deleteDatabase(name))) failed.add(name);
35
+ }
36
+
37
+ if (failed.size > 0) {
38
+ throw new AbloConnectionError(
39
+ `Could not remove authenticated local data from: ${[...failed].join(', ')}`,
40
+ { code: 'db_cleanup_failed' },
41
+ );
42
+ }
43
+ }
@@ -0,0 +1,83 @@
1
+ import { AbloConnectionError } from '@abloatai/transaction/errors';
2
+
3
+ /**
4
+ * The complete authenticated plane that owns one local replica. The same
5
+ * participant can have different data in a project, sandbox, or environment;
6
+ * those replicas must never share a namespace.
7
+ */
8
+ export interface PersistenceIdentity {
9
+ readonly participantId: string;
10
+ readonly participantKind: string;
11
+ readonly organizationId: string;
12
+ readonly projectId: string | null;
13
+ readonly environment: 'sandbox' | 'production' | null;
14
+ readonly sandboxId: string | null;
15
+ }
16
+
17
+ export interface PersistedIdentityMetadata {
18
+ readonly namespaceVersion?: number;
19
+ readonly userId: string;
20
+ readonly workspaceId: string;
21
+ readonly participantKind?: string;
22
+ readonly projectId?: string | null;
23
+ readonly environment?: 'sandbox' | 'production' | null;
24
+ readonly sandboxId?: string | null;
25
+ }
26
+
27
+ export const PERSISTENCE_NAMESPACE_VERSION = 2;
28
+
29
+ function canonicalIdentity(
30
+ identity: PersistenceIdentity,
31
+ userVersion: number,
32
+ ): string {
33
+ return JSON.stringify([
34
+ PERSISTENCE_NAMESPACE_VERSION,
35
+ identity.projectId,
36
+ identity.environment,
37
+ identity.sandboxId,
38
+ identity.organizationId,
39
+ identity.participantKind,
40
+ identity.participantId,
41
+ userVersion,
42
+ ]);
43
+ }
44
+
45
+ async function sha256Hex(value: string): Promise<string> {
46
+ const cryptoProvider = Reflect.get(globalThis, 'crypto') as Crypto | undefined;
47
+ const subtle = cryptoProvider?.subtle;
48
+ if (!subtle) {
49
+ throw new AbloConnectionError(
50
+ 'Secure local persistence requires Web Crypto SHA-256 support.',
51
+ { code: 'db_secure_hash_unavailable' },
52
+ );
53
+ }
54
+ const digest = await subtle.digest('SHA-256', new TextEncoder().encode(value));
55
+ return Array.from(new Uint8Array(digest), (byte) =>
56
+ byte.toString(16).padStart(2, '0'),
57
+ ).join('');
58
+ }
59
+
60
+ /** Collision-resistant IndexedDB name for one authenticated data plane. */
61
+ export async function persistenceDatabaseName(
62
+ identity: PersistenceIdentity,
63
+ userVersion = 1,
64
+ ): Promise<string> {
65
+ const digest = await sha256Hex(canonicalIdentity(identity, userVersion));
66
+ return `ablo_v${PERSISTENCE_NAMESPACE_VERSION}_${digest}`;
67
+ }
68
+
69
+ /** Defense-in-depth check after namespace lookup and before persisted reads. */
70
+ export function persistenceIdentityMatches(
71
+ info: PersistedIdentityMetadata,
72
+ identity: PersistenceIdentity,
73
+ ): boolean {
74
+ return (
75
+ info.namespaceVersion === PERSISTENCE_NAMESPACE_VERSION &&
76
+ info.userId === identity.participantId &&
77
+ info.workspaceId === identity.organizationId &&
78
+ info.participantKind === identity.participantKind &&
79
+ (info.projectId ?? null) === identity.projectId &&
80
+ (info.environment ?? null) === identity.environment &&
81
+ (info.sandboxId ?? null) === identity.sandboxId
82
+ );
83
+ }
@@ -0,0 +1,21 @@
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
+
8
+ import { z } from 'zod';
9
+ import { syncDeltaActionSchema } from '@abloatai/transaction/wire/delta';
10
+
11
+ export const syncActionSchema = z.object({
12
+ id: z.number(),
13
+ modelName: z.string(),
14
+ modelId: z.string(),
15
+ action: syncDeltaActionSchema,
16
+ data: z.unknown(),
17
+ __class: z.literal('SyncAction').default('SyncAction'),
18
+ });
19
+
20
+ export type SyncAction = z.infer<typeof syncActionSchema>;
21
+ export type SyncActionType = SyncAction['action'];
@@ -0,0 +1,21 @@
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
+
9
+ export function v1PersistenceDatabaseNameForDeletion(
10
+ participantId: string,
11
+ organizationId: string,
12
+ userVersion: number,
13
+ ): string {
14
+ const combined = `${participantId}:${organizationId}:${userVersion}`;
15
+ let hash = 0;
16
+ for (let index = 0; index < combined.length; index++) {
17
+ hash = (hash << 5) - hash + combined.charCodeAt(index);
18
+ hash &= hash;
19
+ }
20
+ return `ablo_${Math.abs(hash).toString(16).padStart(8, '0')}`;
21
+ }