@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,400 @@
1
+ /**
2
+ * Manages the client-side IndexedDB databases the sync engine keeps in the
3
+ * browser. There are two tiers. A single registry database, `ablo_databases`,
4
+ * records metadata about every workspace database. Each user-and-workspace pair
5
+ * then gets its own data database, named `ablo_<hash>`, that holds the synced
6
+ * rows. {@link DatabaseManager} creates, versions, and deletes both tiers.
7
+ */
8
+ import { globalRuntime } from '../context.js';
9
+ import { openIDBWithTimeout, deleteIDBWithTimeout, IDBOpenTimeoutError, } from './openIDBWithTimeout.js';
10
+ import { AbloConnectionError } from '@abloatai/transaction/errors';
11
+ import { getActiveRegistry, hasActiveRegistry } from '../ModelRegistry.js';
12
+ import { PERSISTENCE_NAMESPACE_VERSION, persistenceDatabaseName, persistenceIdentityMatches, } from './persistenceIdentity.js';
13
+ function indexedDbError(error, operation) {
14
+ return error ?? new Error(`IndexedDB ${operation} failed`);
15
+ }
16
+ /**
17
+ * DatabaseManager - Manages Ablo's two-tier database architecture
18
+ *
19
+ * Key responsibilities:
20
+ * - Manages ablo_databases (database registry)
21
+ * - Creates workspace-specific databases (ablo_hash)
22
+ * - Handles database migration and versioning
23
+ * - Provides database info and metadata management
24
+ */
25
+ export class DatabaseManager {
26
+ runtime;
27
+ metaDb = null;
28
+ metaDbName = 'ablo_databases';
29
+ constructor(runtime = globalRuntime) {
30
+ this.runtime = runtime;
31
+ }
32
+ /**
33
+ * Initialize the meta database (ablo_databases)
34
+ */
35
+ async initializeMetaDatabase() {
36
+ const open = () => openIDBWithTimeout(this.metaDbName, 1, {
37
+ onUpgrade: (request) => {
38
+ const db = request.result;
39
+ if (!db.objectStoreNames.contains('databases')) {
40
+ const store = db.createObjectStore('databases', { keyPath: 'name' });
41
+ store.createIndex('userId', 'userId');
42
+ store.createIndex('workspaceId', 'workspaceId');
43
+ store.createIndex('schemaHash', 'schemaHash');
44
+ store.createIndex('updatedAt', 'updatedAt');
45
+ }
46
+ },
47
+ });
48
+ try {
49
+ this.metaDb = await open();
50
+ }
51
+ catch (error) {
52
+ // Self-heal a wedged meta DB. When `ablo_databases`'s backing store gets
53
+ // stuck (a corrupted store, or a leaked connection from a prior
54
+ // timed-out open), every open of that name hangs with no event and the
55
+ // app is permanently bricked until the user manually clears site data —
56
+ // the "open did not resolve within 10000ms" dead end. The registry this
57
+ // DB holds is rebuildable from the server on the next bootstrap, so it is
58
+ // safe to delete and re-create. Try exactly once: delete, then re-open.
59
+ if (!(error instanceof IDBOpenTimeoutError))
60
+ throw error;
61
+ this.runtime.logger.debug('[sync-engine] meta DB open timed out — attempting self-heal (delete + retry)', { db: this.metaDbName, reason: error.reason });
62
+ this.runtime.observability.captureBootstrapFailure(error, {
63
+ type: 'meta-db-open-timeout',
64
+ });
65
+ const deleted = await deleteIDBWithTimeout(this.metaDbName);
66
+ if (!deleted) {
67
+ // The delete itself was blocked/stuck — a live connection in another
68
+ // window or a deadlocked backing store. We cannot recover in-page;
69
+ // rethrow so the provider surfaces the real (now actionable) error.
70
+ throw error;
71
+ }
72
+ // Fresh store — this open creates `ablo_databases` from scratch.
73
+ this.metaDb = await open();
74
+ this.runtime.logger.info('[sync-engine] meta DB self-heal succeeded');
75
+ }
76
+ }
77
+ /**
78
+ * Calculate database info for a user/workspace combination
79
+ */
80
+ async calculateDatabaseInfo(identity, userVersion = 1) {
81
+ // Get schema hash from the active ModelRegistry
82
+ const schemaHash = hasActiveRegistry()
83
+ ? getActiveRegistry().getSchemaHash()
84
+ : 'no-registry-hash';
85
+ // Generate database name from userId, workspaceId, and versions
86
+ const dbName = await persistenceDatabaseName(identity, userVersion);
87
+ // Check if we need to increment schema version
88
+ const existingInfo = await this.getDatabaseInfo(dbName);
89
+ if (existingInfo && !persistenceIdentityMatches(existingInfo, identity)) {
90
+ throw new AbloConnectionError('Local database identity mismatch. Refusing to open persisted data ' +
91
+ 'owned by a different authenticated plane.', { code: 'db_identity_mismatch' });
92
+ }
93
+ let schemaVersion = 1;
94
+ if (existingInfo && existingInfo.schemaHash !== schemaHash) {
95
+ schemaVersion = (existingInfo.schemaVersion || 1) + 1;
96
+ }
97
+ else if (existingInfo) {
98
+ schemaVersion = existingInfo.schemaVersion || 1;
99
+ }
100
+ // Record the existing databases for this user so duplicates can be detected.
101
+ const allUserDatabases = await this.getDatabasesForUser(identity.participantId);
102
+ const allIndexedDBs = (await indexedDB.databases?.()) || [];
103
+ const abloDatabases = allIndexedDBs.filter((db) => db.name?.startsWith('ablo_'));
104
+ this.runtime.observability.breadcrumb('Database info calculated', 'sync.database', 'info', {
105
+ dbName,
106
+ schemaVersion,
107
+ existingDbCount: allUserDatabases.length,
108
+ abloDbCount: abloDatabases.length,
109
+ });
110
+ return {
111
+ name: dbName,
112
+ namespaceVersion: PERSISTENCE_NAMESPACE_VERSION,
113
+ userId: identity.participantId,
114
+ workspaceId: identity.organizationId,
115
+ participantKind: identity.participantKind,
116
+ projectId: identity.projectId,
117
+ environment: identity.environment,
118
+ sandboxId: identity.sandboxId,
119
+ schemaHash,
120
+ schemaVersion,
121
+ userVersion,
122
+ createdAt: existingInfo?.createdAt ?? new Date(),
123
+ updatedAt: new Date(),
124
+ };
125
+ }
126
+ /**
127
+ * Register database info in ablo_databases
128
+ */
129
+ async registerDatabase(info) {
130
+ const metaDb = this.metaDb;
131
+ if (!metaDb) {
132
+ throw new AbloConnectionError('Meta database not initialized', {
133
+ code: 'meta_db_not_initialized',
134
+ });
135
+ }
136
+ return new Promise((resolve, reject) => {
137
+ const tx = metaDb.transaction(['databases'], 'readwrite');
138
+ const store = tx.objectStore('databases');
139
+ const request = store.put(info);
140
+ tx.oncomplete = () => {
141
+ resolve();
142
+ };
143
+ tx.onerror = () => { reject(indexedDbError(tx.error, 'registry transaction')); };
144
+ request.onerror = () => { reject(indexedDbError(request.error, 'registry write')); };
145
+ });
146
+ }
147
+ /**
148
+ * Get database info by name
149
+ */
150
+ async getDatabaseInfo(name) {
151
+ const metaDb = this.metaDb;
152
+ if (!metaDb)
153
+ return null;
154
+ return new Promise((resolve, reject) => {
155
+ const tx = metaDb.transaction(['databases'], 'readonly');
156
+ const store = tx.objectStore('databases');
157
+ const request = store.get(name);
158
+ request.onsuccess = () => { resolve(request.result ?? null); };
159
+ request.onerror = () => { reject(indexedDbError(request.error, 'registry read')); };
160
+ });
161
+ }
162
+ /** Remove only the named ownership records; the shared registry stays live. */
163
+ async unregisterDatabases(names) {
164
+ const metaDb = this.metaDb;
165
+ if (!metaDb || names.length === 0)
166
+ return;
167
+ return new Promise((resolve, reject) => {
168
+ const tx = metaDb.transaction(['databases'], 'readwrite');
169
+ const store = tx.objectStore('databases');
170
+ for (const name of new Set(names))
171
+ store.delete(name);
172
+ tx.oncomplete = () => { resolve(); };
173
+ tx.onerror = () => { reject(indexedDbError(tx.error, 'registry cleanup')); };
174
+ tx.onabort = () => { reject(indexedDbError(tx.error, 'registry cleanup')); };
175
+ });
176
+ }
177
+ /**
178
+ * Get all databases for a user
179
+ */
180
+ async getDatabasesForUser(userId) {
181
+ const metaDb = this.metaDb;
182
+ if (!metaDb)
183
+ return [];
184
+ return new Promise((resolve, reject) => {
185
+ const tx = metaDb.transaction(['databases'], 'readonly');
186
+ const store = tx.objectStore('databases');
187
+ const index = store.index('userId');
188
+ const request = index.getAll(userId);
189
+ request.onsuccess = () => { resolve(request.result || []); };
190
+ request.onerror = () => { reject(indexedDbError(request.error, 'user database lookup')); };
191
+ });
192
+ }
193
+ /**
194
+ * Open workspace-specific database
195
+ */
196
+ async openWorkspaceDatabase(dbInfo, createStoresFn) {
197
+ try {
198
+ return await openIDBWithTimeout(dbInfo.name, dbInfo.schemaVersion, {
199
+ onUpgrade: (request, event) => {
200
+ const db = request.result;
201
+ const tx = event.target.transaction;
202
+ // IndexedDB rule: only awaits on IndexedDB requests keep an upgrade
203
+ // transaction alive. Any other await — a fetch, a timer — commits the
204
+ // transaction early, and later operations then throw
205
+ // `TransactionInactiveError`. StoreManager.createStores runs only
206
+ // synchronous createObjectStore / createIndex calls under an `async`
207
+ // keyword, so calling it without awaiting is safe here.
208
+ if (createStoresFn && tx) {
209
+ try {
210
+ void createStoresFn(db, tx).catch((err) => {
211
+ this.runtime.observability.captureBootstrapFailure(err, {
212
+ type: 'store-creation',
213
+ });
214
+ });
215
+ }
216
+ catch (err) {
217
+ this.runtime.observability.captureBootstrapFailure(err, {
218
+ type: 'store-creation',
219
+ });
220
+ }
221
+ }
222
+ },
223
+ });
224
+ }
225
+ catch (error) {
226
+ this.runtime.observability.captureBootstrapFailure(error, {
227
+ type: 'database-open',
228
+ });
229
+ throw error;
230
+ }
231
+ }
232
+ /**
233
+ * Read workspace metadata from __meta table
234
+ */
235
+ async getWorkspaceMetadata(db) {
236
+ return new Promise((resolve, reject) => {
237
+ const tx = db.transaction(['__meta'], 'readonly');
238
+ const store = tx.objectStore('__meta');
239
+ const request = store.get('metadata');
240
+ request.onsuccess = () => {
241
+ const data = request.result;
242
+ if (!data) {
243
+ resolve(null);
244
+ return;
245
+ }
246
+ const meta = {
247
+ lastSyncId: data.lastSyncId ?? 0,
248
+ firstSyncId: data.firstSyncId ?? 0,
249
+ backendDatabaseVersion: data.backendDatabaseVersion ?? 1,
250
+ subscribedSyncGroups: data.subscribedSyncGroups ?? [],
251
+ updatedAt: data.updatedAt ? new Date(data.updatedAt) : new Date(),
252
+ schemaHash: data.schemaHash,
253
+ syncGroups: data.syncGroups,
254
+ // Older persisted records may still carry an extra `versions` key
255
+ // that is no longer used; it is tolerated by simply not reading it here.
256
+ };
257
+ resolve(meta);
258
+ };
259
+ request.onerror = () => { reject(indexedDbError(request.error, 'workspace metadata read')); };
260
+ });
261
+ }
262
+ /**
263
+ * Write workspace metadata to __meta table
264
+ */
265
+ async setWorkspaceMetadata(db, metadata) {
266
+ return new Promise((resolve, reject) => {
267
+ const tx = db.transaction(['__meta'], 'readwrite');
268
+ const store = tx.objectStore('__meta');
269
+ const request = store.put(metadata, 'metadata');
270
+ tx.oncomplete = () => { resolve(); };
271
+ tx.onerror = () => { reject(indexedDbError(tx.error, 'workspace metadata transaction')); };
272
+ request.onerror = () => { reject(indexedDbError(request.error, 'workspace metadata write')); };
273
+ });
274
+ }
275
+ /**
276
+ * Check if a model is persisted (all instances loaded)
277
+ */
278
+ async isModelPersisted(db, modelName) {
279
+ return new Promise((resolve, reject) => {
280
+ const tx = db.transaction(['__meta'], 'readonly');
281
+ const store = tx.objectStore('__meta');
282
+ const request = store.get(modelName);
283
+ request.onsuccess = () => {
284
+ const data = request.result;
285
+ resolve(data?.persisted === true);
286
+ };
287
+ request.onerror = () => { reject(indexedDbError(request.error, 'model persistence read')); };
288
+ });
289
+ }
290
+ /**
291
+ * Mark a model as persisted
292
+ */
293
+ async setModelPersisted(db, modelName, persisted) {
294
+ return new Promise((resolve, reject) => {
295
+ const tx = db.transaction(['__meta'], 'readwrite');
296
+ const store = tx.objectStore('__meta');
297
+ const persistenceData = {
298
+ persisted,
299
+ modelName,
300
+ timestamp: Date.now(),
301
+ updatedAt: new Date().toISOString(),
302
+ };
303
+ const request = store.put(persistenceData, modelName);
304
+ tx.oncomplete = () => { resolve(); };
305
+ tx.onerror = () => { reject(indexedDbError(tx.error, 'model persistence transaction')); };
306
+ request.onerror = () => { reject(indexedDbError(request.error, 'model persistence write')); };
307
+ });
308
+ }
309
+ /**
310
+ * Get all model persistence states
311
+ */
312
+ async getAllModelPersistenceStates(db) {
313
+ return new Promise((resolve, reject) => {
314
+ const tx = db.transaction(['__meta'], 'readonly');
315
+ const store = tx.objectStore('__meta');
316
+ const request = store.getAll();
317
+ request.onsuccess = () => {
318
+ const states = {};
319
+ for (const item of request.result) {
320
+ // Skip metadata entry
321
+ if (item.key === 'metadata')
322
+ continue;
323
+ if (item.modelName) {
324
+ states[item.modelName] = item.persisted === true;
325
+ }
326
+ }
327
+ resolve(states);
328
+ };
329
+ request.onerror = () => { reject(indexedDbError(request.error, 'model persistence scan')); };
330
+ });
331
+ }
332
+ /**
333
+ * Delete a workspace database
334
+ */
335
+ async deleteWorkspaceDatabase(dbInfo) {
336
+ const deleted = await deleteIDBWithTimeout(dbInfo.name);
337
+ if (!deleted) {
338
+ this.runtime.observability.breadcrumb(`Database deletion failed or was blocked: ${dbInfo.name}`, 'sync.database', 'error');
339
+ return false;
340
+ }
341
+ if (this.metaDb) {
342
+ const metaDb = this.metaDb;
343
+ await new Promise((resolve, reject) => {
344
+ const tx = metaDb.transaction(['databases'], 'readwrite');
345
+ tx.objectStore('databases').delete(dbInfo.name);
346
+ tx.oncomplete = () => { resolve(); };
347
+ tx.onerror = () => { reject(indexedDbError(tx.error, 'registry delete')); };
348
+ tx.onabort = () => { reject(indexedDbError(tx.error, 'registry delete')); };
349
+ });
350
+ }
351
+ return true;
352
+ }
353
+ /**
354
+ * Get comprehensive database statistics
355
+ */
356
+ async getDatabaseStatistics() {
357
+ const metaDb = this.metaDb;
358
+ if (!metaDb) {
359
+ return {
360
+ metaDatabaseSize: 0,
361
+ totalWorkspaceDatabases: 0,
362
+ databasesByUser: {},
363
+ schemaVersions: {},
364
+ };
365
+ }
366
+ return new Promise((resolve, reject) => {
367
+ const tx = metaDb.transaction(['databases'], 'readonly');
368
+ const store = tx.objectStore('databases');
369
+ const request = store.getAll();
370
+ request.onsuccess = () => {
371
+ const databases = request.result;
372
+ const databasesByUser = {};
373
+ const schemaVersions = {};
374
+ for (const db of databases) {
375
+ // Count by user
376
+ databasesByUser[db.userId] = (databasesByUser[db.userId] ?? 0) + 1;
377
+ // Count schema versions
378
+ const versionKey = `v${db.schemaVersion}`;
379
+ schemaVersions[versionKey] = (schemaVersions[versionKey] ?? 0) + 1;
380
+ }
381
+ resolve({
382
+ metaDatabaseSize: databases.length,
383
+ totalWorkspaceDatabases: databases.length,
384
+ databasesByUser,
385
+ schemaVersions,
386
+ });
387
+ };
388
+ request.onerror = () => { reject(indexedDbError(request.error, 'registry statistics read')); };
389
+ });
390
+ }
391
+ /**
392
+ * Close all database connections
393
+ */
394
+ async close() {
395
+ if (this.metaDb) {
396
+ this.metaDb.close();
397
+ this.metaDb = null;
398
+ }
399
+ }
400
+ }
@@ -0,0 +1,115 @@
1
+ /**
2
+ * The IndexedDB-backed object store: durable, per-model record storage for
3
+ * the browser. See {@link ObjectStore}.
4
+ */
5
+ import type { ModelMetadata } from '@abloatai/transaction/types';
6
+ import type { ObjectStoreContract } from './ObjectStoreContract.js';
7
+ /**
8
+ * IDB transaction options type (TypeScript's lib.dom.d.ts may be outdated)
9
+ * durability: 'relaxed' provides ~16x write performance improvement
10
+ * by not requiring fsync on each transaction commit.
11
+ * Safe for optimistic sync engines that can recover from server state.
12
+ */
13
+ interface IDBTransactionOptionsWithDurability {
14
+ durability?: 'default' | 'relaxed' | 'strict';
15
+ }
16
+ /**
17
+ * An IndexedDB-backed store holding the records of a single model.
18
+ *
19
+ * It implements {@link ObjectStoreContract}, the shared surface that
20
+ * {@link InMemoryObjectStore} also satisfies, so callers can hold either
21
+ * implementation behind one type. Because both are checked against the same
22
+ * interface, any drift between them surfaces as a typecheck error rather
23
+ * than a runtime surprise.
24
+ *
25
+ * The store talks to the native IndexedDB API directly and uses relaxed
26
+ * transaction durability on writes.
27
+ */
28
+ export declare class ObjectStore implements ObjectStoreContract {
29
+ protected db: IDBDatabase;
30
+ protected modelName: string;
31
+ protected storeName: string;
32
+ protected metadata: ModelMetadata;
33
+ private readonly writeDurability;
34
+ private isClosing;
35
+ constructor(db: IDBDatabase, modelName: string, storeName: string, metadata: ModelMetadata, writeDurability?: NonNullable<IDBTransactionOptionsWithDurability['durability']>);
36
+ /** Insert without replacing an existing key (used by the commit outbox). */
37
+ add(data: Record<string, unknown>): Promise<void>;
38
+ /**
39
+ * Mark this store as closing to prevent new operations
40
+ */
41
+ markAsClosing(): void;
42
+ /**
43
+ * Check if database is available for operations
44
+ */
45
+ private checkDatabaseAvailable;
46
+ /**
47
+ * Store a model in IndexedDB.
48
+ * Matches the {@link InMemoryObjectStore.put} signature so both
49
+ * stores satisfy the same caller-visible contract.
50
+ */
51
+ put(data: Record<string, unknown>): Promise<void>;
52
+ /**
53
+ * Get a model by ID
54
+ */
55
+ get(id: string): Promise<Record<string, unknown> | undefined>;
56
+ /**
57
+ * Batch get multiple models by IDs in a single IDB transaction.
58
+ * Much faster than N sequential get() calls (1 transaction vs N).
59
+ */
60
+ getMany(ids: string[]): Promise<Map<string, Record<string, unknown>>>;
61
+ /**
62
+ * Get all models
63
+ */
64
+ getAll(): Promise<Record<string, unknown>[]>;
65
+ /**
66
+ * Delete a model by ID
67
+ */
68
+ delete(id: string): Promise<void>;
69
+ /**
70
+ * Check if store is ready (has data)
71
+ */
72
+ checkIsReady(): Promise<boolean>;
73
+ /**
74
+ * Clear all data in store
75
+ */
76
+ clear(): Promise<void>;
77
+ /**
78
+ * Get count of models in store
79
+ */
80
+ count(): Promise<number>;
81
+ /**
82
+ * Get models by indexed property
83
+ */
84
+ getAllFromIndex(indexName: string, value: IDBValidKey): Promise<Record<string, unknown>[]>;
85
+ /**
86
+ * Get models by indexed key (supports compound keys)
87
+ */
88
+ getAllForIndexedKey(indexedKey: string, keyValue: IDBValidKey): Promise<Record<string, unknown>[]>;
89
+ /**
90
+ * Get first model matching index
91
+ */
92
+ getFromIndex(indexName: string, value: IDBValidKey): Promise<Record<string, unknown> | undefined>;
93
+ /**
94
+ * Get count from index
95
+ */
96
+ countFromIndex(indexName: string, value: IDBValidKey): Promise<number>;
97
+ /**
98
+ * Check if any models exist for index value
99
+ */
100
+ hasModelsForIndex(indexName: string, value: IDBValidKey): Promise<boolean>;
101
+ /**
102
+ * Get store statistics
103
+ */
104
+ getStats(): Promise<{
105
+ count: number;
106
+ ready: boolean;
107
+ loadStrategy: string;
108
+ indexes: string[];
109
+ }>;
110
+ /**
111
+ * Perform maintenance (override in subclasses for specific needs)
112
+ */
113
+ performMaintenance(): Promise<void>;
114
+ }
115
+ export {};