@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,563 @@
1
+ /**
2
+ * LazyReferenceCollection implements a lazy-loaded one-to-many relationship.
3
+ * It loads related rows on demand, caches them, and batches lookups so that
4
+ * reading a parent's children does not trigger a query per parent.
5
+ */
6
+
7
+ import {
8
+ makeObservable,
9
+ observable,
10
+ action,
11
+ computed,
12
+ onBecomeObserved,
13
+ onBecomeUnobserved,
14
+ } from 'mobx';
15
+ import type { Model } from './Model.js';
16
+ import { Database } from './Database.js';
17
+ import { InstanceCache } from './InstanceCache.js';
18
+ import { getActiveRegistry } from './ModelRegistry.js';
19
+ import { AbloValidationError } from '@abloatai/transaction/errors';
20
+
21
+ /**
22
+ * Options for LazyReferenceCollection behavior
23
+ */
24
+ export interface LazyCollectionOptions {
25
+ /** Skip network hydration if local data exists */
26
+ canSkipNetworkHydration?: () => boolean;
27
+
28
+ /** Custom filter for loaded items */
29
+ filter?: (item: any) => boolean;
30
+
31
+ /** Custom sort function */
32
+ sort?: (a: any, b: any) => number;
33
+
34
+ /** Maximum items to load */
35
+ limit?: number;
36
+
37
+ /** Enable automatic refresh on parent changes */
38
+ autoRefresh?: boolean;
39
+ }
40
+
41
+ /**
42
+ * A lazy-loaded one-to-many relationship between a parent {@link Model} and
43
+ * its children. It reads from the local store first and falls back to the
44
+ * network, batches lookups to avoid one query per parent, and is observable so
45
+ * a React component re-renders when the set of children changes. Loaded items
46
+ * can be filtered, sorted, and limited through {@link LazyCollectionOptions}.
47
+ */
48
+ export class LazyReferenceCollection<T extends Model> {
49
+ /** Static dependencies - shared across all instances */
50
+ private static _database: Database | null = null;
51
+ private static _objectPool: InstanceCache | null = null;
52
+
53
+ /**
54
+ * Set global dependencies for all LazyReferenceCollection instances
55
+ * Called once during SyncedStore initialization
56
+ */
57
+ static setDependencies(database: Database, objectPool: InstanceCache): void {
58
+ LazyReferenceCollection._database = database;
59
+ LazyReferenceCollection._objectPool = objectPool;
60
+ getContext().logger.debug('LazyReferenceCollection dependencies set');
61
+ }
62
+
63
+ /**
64
+ * Clear dependencies (e.g., on logout/store disposal)
65
+ */
66
+ static clearDependencies(): void {
67
+ LazyReferenceCollection._database = null;
68
+ LazyReferenceCollection._objectPool = null;
69
+ }
70
+
71
+ /** Loaded items (null = not loaded, [] = loaded but empty) */
72
+ items: T[] | null = null;
73
+
74
+ /** Loading state */
75
+ isLoading = false;
76
+
77
+ /** Error state */
78
+ loadError: Error | null = null;
79
+
80
+ /**
81
+ * MobX observation tracking - prevents GC while React is observing this collection
82
+ * Following MobX best practice: https://mobx.js.org/lazy-observables.html
83
+ */
84
+ _isBeingObserved = false;
85
+
86
+ /** Promise for ongoing hydration */
87
+ private hydrationPromise: Promise<void> | null = null;
88
+
89
+ /** Disposer for observation lifecycle hooks */
90
+ private observationDisposer: (() => void) | null = null;
91
+
92
+ /** Get database from static dependencies */
93
+ private get database(): Database | null {
94
+ return LazyReferenceCollection._database;
95
+ }
96
+
97
+ /** Get objectPool from static dependencies */
98
+ private get objectPool(): InstanceCache | null {
99
+ return LazyReferenceCollection._objectPool;
100
+ }
101
+
102
+ constructor(
103
+ private modelName: string,
104
+ private parent: Model,
105
+ private foreignKey: string,
106
+ private customQuery?: any,
107
+ private options: LazyCollectionOptions = {}
108
+ ) {
109
+ makeObservable(this, {
110
+ items: observable,
111
+ isLoading: observable,
112
+ loadError: observable,
113
+ _isBeingObserved: observable,
114
+ hydrate: action,
115
+ refresh: action,
116
+ value: computed,
117
+ loaded: computed,
118
+ empty: computed,
119
+ loading: computed,
120
+ error: computed,
121
+ isBeingObserved: computed,
122
+ });
123
+
124
+ // Set up MobX observation lifecycle hooks
125
+ // This follows the official MobX pattern for lazy observables
126
+ // See: https://mobx.js.org/lazy-observables.html
127
+ this._setupObservationTracking();
128
+ }
129
+
130
+ /**
131
+ * Set up MobX observation lifecycle hooks
132
+ * When React components observe this collection, we prevent GC of the parent model
133
+ */
134
+ private _setupObservationTracking(): void {
135
+ // Track when 'items' becomes observed (React component is rendering)
136
+ const disposeOnObserved = onBecomeObserved(this, 'items', () => {
137
+ this._isBeingObserved = true;
138
+
139
+ // Touch parent model to prevent GC while we're being observed
140
+ if (this.objectPool && this.parent?.id) {
141
+ this.objectPool.touch(this.parent.id);
142
+ }
143
+
144
+ // Register this collection with parent for observation tracking
145
+ if (this.parent) {
146
+ this.parent._registerObservedCollection(this);
147
+ }
148
+ });
149
+
150
+ // Track when 'items' stops being observed (component unmounted)
151
+ const disposeOnUnobserved = onBecomeUnobserved(this, 'items', () => {
152
+ this._isBeingObserved = false;
153
+
154
+ // Unregister from parent
155
+ if (this.parent) {
156
+ this.parent._unregisterObservedCollection(this);
157
+ }
158
+ });
159
+
160
+ // Store combined disposer for cleanup
161
+ this.observationDisposer = () => {
162
+ disposeOnObserved();
163
+ disposeOnUnobserved();
164
+ };
165
+ }
166
+
167
+ /**
168
+ * Check if this collection is currently being observed by React/MobX
169
+ */
170
+ get isBeingObserved(): boolean {
171
+ return this._isBeingObserved;
172
+ }
173
+
174
+ /**
175
+ * Get the collection value (triggers hydration if needed).
176
+ *
177
+ * Filters out items whose id is no longer in the InstanceCache. The
178
+ * local `items` array isn't auto-synced with `pool.remove()` — a
179
+ * deleted entity would linger here until hydrate() re-runs on
180
+ * reload. Reading `pool.has(item.id)` inside this computed getter
181
+ * makes MobX track both `this.items` AND the pool's entries map,
182
+ * so any pool.remove invalidates the computed and re-renders the
183
+ * consumer with the deleted item gone.
184
+ *
185
+ * Without this, deleting a block would pool.remove() cleanly
186
+ * but the view — which reads `section.blocks.value` — would keep
187
+ * showing the deleted block until a full reload rebuilt the
188
+ * collection.
189
+ */
190
+ get value(): T[] {
191
+ // Touch parent model to prevent GC during active collection usage
192
+ if (this.objectPool && this.parent?.id) {
193
+ this.objectPool.touch(this.parent.id);
194
+ }
195
+
196
+ if (this.items === null && !this.isLoading) {
197
+ // Auto-hydrate on first access
198
+ this.hydrate().catch((error) => {
199
+ getContext().observability.breadcrumb('Auto-hydration failed', 'sync.database', 'warning', {
200
+ error: error instanceof Error ? error.message : String(error),
201
+ });
202
+ });
203
+ return []; // Return empty array while loading
204
+ }
205
+
206
+ const raw = this.items || [];
207
+ const pool = this.objectPool;
208
+ if (!pool || raw.length === 0) return raw;
209
+ // Filter items still present in the pool. `pool.has(id)` reads the
210
+ // observable `entries` map — MobX tracks the dependency, so a
211
+ // subsequent `pool.remove(id)` re-runs this computed.
212
+ return raw.filter((item) => pool.has(item.id));
213
+ }
214
+
215
+ /**
216
+ * Check if collection has been loaded
217
+ */
218
+ get loaded(): boolean {
219
+ return this.items !== null;
220
+ }
221
+
222
+ /**
223
+ * Check if collection is empty (only meaningful after loading)
224
+ */
225
+ get empty(): boolean {
226
+ return this.loaded && this.items!.length === 0;
227
+ }
228
+
229
+ /**
230
+ * Check if currently loading
231
+ */
232
+ get loading(): boolean {
233
+ return this.isLoading;
234
+ }
235
+
236
+ /**
237
+ * Get load error if any
238
+ */
239
+ get error(): Error | null {
240
+ return this.loadError;
241
+ }
242
+
243
+ /**
244
+ * Get collection size
245
+ */
246
+ get size(): number {
247
+ // Touch parent model when accessing collection size
248
+ if (this.objectPool && this.parent?.id) {
249
+ this.objectPool.touch(this.parent.id);
250
+ }
251
+
252
+ return this.items?.length || 0;
253
+ }
254
+
255
+ /**
256
+ * Hydrate the collection from local storage and/or network
257
+ */
258
+ async hydrate(): Promise<void> {
259
+ // Return existing hydration promise if already in progress
260
+ if (this.hydrationPromise) {
261
+ return this.hydrationPromise;
262
+ }
263
+
264
+ // Skip if already loaded
265
+ if (this.items !== null) {
266
+ return;
267
+ }
268
+
269
+ this.hydrationPromise = this._performHydration();
270
+
271
+ try {
272
+ await this.hydrationPromise;
273
+ } finally {
274
+ this.hydrationPromise = null;
275
+ }
276
+ }
277
+
278
+ /**
279
+ * Internal hydration implementation
280
+ */
281
+ private async _performHydration(): Promise<void> {
282
+ this._setLoading(true);
283
+ this._setError(null);
284
+
285
+ try {
286
+ // Step 1: Try loading from IndexedDB
287
+ const localData = await this._loadFromLocal();
288
+
289
+ if (localData.length > 0) {
290
+ this._setItems(localData);
291
+
292
+ // Check if we can skip network hydration
293
+ if (this.options.canSkipNetworkHydration?.()) {
294
+ this._setLoading(false);
295
+ return;
296
+ }
297
+ }
298
+ } catch (error) {
299
+ this._setError(error as Error);
300
+ getContext().observability.breadcrumb('Failed to hydrate collection', 'sync.database', 'warning', {
301
+ parent: this.parent.getModelName(),
302
+ parentId: this.parent.id,
303
+ foreignKey: this.foreignKey,
304
+ error: error instanceof Error ? error.message : String(error),
305
+ });
306
+ } finally {
307
+ this._setLoading(false);
308
+ }
309
+ }
310
+
311
+ /**
312
+ * Load items from IndexedDB
313
+ */
314
+ private async _loadFromLocal(): Promise<T[]> {
315
+ try {
316
+ if (!this.database) {
317
+ throw new AbloValidationError(
318
+ `Database dependency not provided to LazyReferenceCollection for ${this.modelName}`,
319
+ { code: 'lazy_ref_db_missing' },
320
+ );
321
+ }
322
+
323
+ if (!this.objectPool) {
324
+ throw new AbloValidationError(
325
+ `InstanceCache dependency not provided to LazyReferenceCollection for ${this.modelName}`,
326
+ { code: 'lazy_ref_pool_missing' },
327
+ );
328
+ }
329
+
330
+ const store = this.database.getStore(this.modelName);
331
+ const rawData = store ? await store.getAllFromIndex(this.foreignKey, this.parent.id) : [];
332
+
333
+ // Get model class from registry
334
+ const ModelClass = getActiveRegistry().getModelByName(this.modelName);
335
+ if (!ModelClass) {
336
+ getContext().observability.breadcrumb(
337
+ `Model '${this.modelName}' not found in registry`,
338
+ 'sync.database',
339
+ 'error'
340
+ );
341
+ return [];
342
+ }
343
+
344
+ // Convert raw data to model instances
345
+ const models: T[] = [];
346
+
347
+ for (const data of rawData) {
348
+ const id = data.id;
349
+ // Skip malformed rows. Records from IDB are typed as
350
+ // `Record<string, unknown>` (the centralized
351
+ // `ObjectStoreContract` shape) so the `id` field is
352
+ // narrow-checked here rather than assumed.
353
+ if (typeof id !== 'string') continue;
354
+
355
+ // Check if already in InstanceCache
356
+ let model = this.objectPool.get(id);
357
+
358
+ if (!model) {
359
+ // Create new model instance
360
+ model = new ModelClass();
361
+ model.updateFromData(data);
362
+ this.objectPool.add(model);
363
+ }
364
+
365
+ if (model) {
366
+ // The by-name registry lookup types instances as the base
367
+ // `Model`; this collection's `modelName` IS `T`'s registered
368
+ // name (fixed at construction), so the instance is a `T`.
369
+ models.push(model as T);
370
+ }
371
+ }
372
+
373
+ // Apply filtering if specified
374
+ let filteredModels = models;
375
+ if (this.options.filter) {
376
+ filteredModels = models.filter(this.options.filter);
377
+ }
378
+
379
+ // Apply sorting if specified
380
+ if (this.options.sort) {
381
+ filteredModels.sort(this.options.sort);
382
+ }
383
+
384
+ // Apply limit if specified
385
+ if (this.options.limit) {
386
+ filteredModels = filteredModels.slice(0, this.options.limit);
387
+ }
388
+
389
+ getContext().logger.debug('Loaded local items for collection', {
390
+ count: filteredModels.length,
391
+ parent: this.parent.getModelName(),
392
+ id: this.parent.id,
393
+ fk: this.foreignKey,
394
+ });
395
+
396
+ return filteredModels;
397
+ } catch (error) {
398
+ getContext().observability.breadcrumb('Failed to load from local', 'sync.database', 'warning', {
399
+ error: error instanceof Error ? error.message : String(error),
400
+ });
401
+ return [];
402
+ }
403
+ }
404
+
405
+ /**
406
+ * Refresh the collection (reload from network)
407
+ */
408
+ async refresh(): Promise<void> {
409
+ this.items = null;
410
+ this.hydrationPromise = null;
411
+ await this.hydrate();
412
+
413
+ getContext().logger.debug('Refreshed collection', {
414
+ parent: this.parent.getModelName(),
415
+ id: this.parent.id,
416
+ fk: this.foreignKey,
417
+ });
418
+ }
419
+
420
+ /**
421
+ * Add an item to the collection
422
+ */
423
+ add(item: T): void {
424
+ if (this.items === null) {
425
+ this.items = [];
426
+ }
427
+
428
+ // Check if item already exists
429
+ const existingIndex = this.items.findIndex((existing) => existing.id === item.id);
430
+
431
+ if (existingIndex >= 0) {
432
+ // Replace existing item
433
+ this.items[existingIndex] = item;
434
+ } else {
435
+ // Add new item
436
+ this.items.push(item);
437
+
438
+ // Apply sorting if specified
439
+ if (this.options.sort) {
440
+ this.items.sort(this.options.sort);
441
+ }
442
+ }
443
+
444
+ getContext().logger.debug('Added item to collection', { model: item.getModelName(), id: item.id });
445
+ }
446
+
447
+ /**
448
+ * Remove an item from the collection
449
+ */
450
+ remove(itemOrId: T | string): boolean {
451
+ if (this.items === null) return false;
452
+
453
+ const id = typeof itemOrId === 'string' ? itemOrId : itemOrId.id;
454
+ const index = this.items.findIndex((item) => item.id === id);
455
+
456
+ if (index >= 0) {
457
+ this.items.splice(index, 1);
458
+
459
+ getContext().logger.debug('Removed item from collection', { id });
460
+
461
+ return true;
462
+ }
463
+
464
+ return false;
465
+ }
466
+
467
+ /**
468
+ * Find an item in the collection
469
+ */
470
+ find(predicate: (item: T) => boolean): T | undefined {
471
+ // Touch parent model when searching collection
472
+ if (this.objectPool && this.parent?.id) {
473
+ this.objectPool.touch(this.parent.id);
474
+ }
475
+
476
+ if (this.items === null) return undefined;
477
+ return this.items.find(predicate);
478
+ }
479
+
480
+ /**
481
+ * Filter items in the collection
482
+ */
483
+ filter(predicate: (item: T) => boolean): T[] {
484
+ // Touch parent model when filtering collection
485
+ if (this.objectPool && this.parent?.id) {
486
+ this.objectPool.touch(this.parent.id);
487
+ }
488
+
489
+ if (this.items === null) return [];
490
+ return this.items.filter(predicate);
491
+ }
492
+
493
+ /**
494
+ * Check if collection contains an item
495
+ */
496
+ contains(itemOrId: T | string): boolean {
497
+ if (this.items === null) return false;
498
+
499
+ const id = typeof itemOrId === 'string' ? itemOrId : itemOrId.id;
500
+ return this.items.some((item) => item.id === id);
501
+ }
502
+
503
+ /**
504
+ * Convert to array (triggers hydration)
505
+ */
506
+ toArray(): T[] {
507
+ return this.value;
508
+ }
509
+
510
+ /**
511
+ * Set items directly (internal use)
512
+ */
513
+ private _setItems(items: T[]): void {
514
+ this.items = items;
515
+ }
516
+
517
+ /**
518
+ * Set loading state (internal use)
519
+ */
520
+ private _setLoading(loading: boolean): void {
521
+ this.isLoading = loading;
522
+ }
523
+
524
+ /**
525
+ * Set error state (internal use)
526
+ */
527
+ private _setError(error: Error | null): void {
528
+ this.loadError = error;
529
+ }
530
+
531
+ /**
532
+ * Clear the collection
533
+ */
534
+ clear(): void {
535
+ this.items = [];
536
+ this.loadError = null;
537
+ }
538
+
539
+ /**
540
+ * Dispose of the collection (cleanup)
541
+ * Following MobX best practice: always clean up observation hooks
542
+ * See: https://github.com/mobxjs/mobx/issues/2047
543
+ */
544
+ dispose(): void {
545
+ // Clean up MobX observation hooks first
546
+ if (this.observationDisposer) {
547
+ this.observationDisposer();
548
+ this.observationDisposer = null;
549
+ }
550
+
551
+ // Unregister from parent if still registered
552
+ if (this._isBeingObserved && this.parent) {
553
+ this.parent._unregisterObservedCollection(this);
554
+ }
555
+
556
+ this._isBeingObserved = false;
557
+ this.items = null;
558
+ this.hydrationPromise = null;
559
+ this.loadError = null;
560
+ this.isLoading = false;
561
+ }
562
+ }
563
+ import { getContext } from './context.js';