@abloatai/ablo 0.26.0 → 0.27.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 (398) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +101 -85
  3. package/dist/BaseSyncedStore.d.ts +85 -88
  4. package/dist/BaseSyncedStore.js +131 -147
  5. package/dist/Database.d.ts +54 -68
  6. package/dist/Database.js +97 -113
  7. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  8. package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
  9. package/dist/LazyReferenceCollection.d.ts +11 -15
  10. package/dist/LazyReferenceCollection.js +12 -16
  11. package/dist/Model.d.ts +37 -52
  12. package/dist/Model.js +46 -61
  13. package/dist/ModelRegistry.d.ts +21 -19
  14. package/dist/ModelRegistry.js +23 -27
  15. package/dist/NetworkMonitor.d.ts +5 -6
  16. package/dist/NetworkMonitor.js +5 -6
  17. package/dist/SyncClient.d.ts +112 -112
  18. package/dist/SyncClient.js +165 -172
  19. package/dist/adapters/alwaysOnline.d.ts +6 -8
  20. package/dist/adapters/alwaysOnline.js +6 -8
  21. package/dist/adapters/inMemoryStorage.d.ts +9 -9
  22. package/dist/adapters/inMemoryStorage.js +9 -9
  23. package/dist/agent/Agent.d.ts +27 -32
  24. package/dist/agent/Agent.js +18 -19
  25. package/dist/agent/index.d.ts +4 -4
  26. package/dist/agent/index.js +5 -5
  27. package/dist/agent/session.d.ts +47 -44
  28. package/dist/agent/session.js +37 -48
  29. package/dist/agent/types.d.ts +26 -31
  30. package/dist/agent/types.js +6 -7
  31. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  32. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  33. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  34. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
  35. package/dist/ai-sdk/index.d.ts +25 -22
  36. package/dist/ai-sdk/index.js +25 -22
  37. package/dist/ai-sdk/wrap.d.ts +6 -7
  38. package/dist/ai-sdk/wrap.js +1 -1
  39. package/dist/auth/credentialPolicy.d.ts +69 -74
  40. package/dist/auth/credentialPolicy.js +51 -56
  41. package/dist/auth/credentialSource.d.ts +6 -5
  42. package/dist/auth/credentialSource.js +9 -10
  43. package/dist/auth/index.d.ts +59 -58
  44. package/dist/auth/index.js +31 -37
  45. package/dist/auth/schemas.d.ts +5 -4
  46. package/dist/auth/schemas.js +5 -4
  47. package/dist/batching/index.d.ts +19 -21
  48. package/dist/batching/index.js +14 -17
  49. package/dist/cli.cjs +167 -119
  50. package/dist/client/Ablo.d.ts +73 -73
  51. package/dist/client/Ablo.js +125 -160
  52. package/dist/client/ApiClient.d.ts +30 -19
  53. package/dist/client/ApiClient.js +133 -38
  54. package/dist/client/auth.d.ts +47 -47
  55. package/dist/client/auth.js +108 -117
  56. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  57. package/dist/client/claimHeartbeatLoop.js +88 -0
  58. package/dist/client/consoleLogger.d.ts +5 -6
  59. package/dist/client/consoleLogger.js +5 -6
  60. package/dist/client/createInternalComponents.d.ts +14 -17
  61. package/dist/client/createInternalComponents.js +25 -30
  62. package/dist/client/createModelProxy.d.ts +130 -120
  63. package/dist/client/createModelProxy.js +152 -122
  64. package/dist/client/credentialEndpoint.d.ts +40 -42
  65. package/dist/client/credentialEndpoint.js +35 -36
  66. package/dist/client/functionalUpdate.d.ts +29 -27
  67. package/dist/client/functionalUpdate.js +21 -21
  68. package/dist/client/hostedEndpoints.d.ts +9 -12
  69. package/dist/client/hostedEndpoints.js +9 -12
  70. package/dist/client/httpClient.d.ts +57 -53
  71. package/dist/client/httpClient.js +29 -31
  72. package/dist/client/identity.d.ts +15 -20
  73. package/dist/client/identity.js +47 -58
  74. package/dist/client/modelRegistration.d.ts +5 -9
  75. package/dist/client/modelRegistration.js +67 -87
  76. package/dist/client/options.d.ts +134 -157
  77. package/dist/client/options.js +3 -7
  78. package/dist/client/registerDataSource.d.ts +9 -9
  79. package/dist/client/registerDataSource.js +15 -16
  80. package/dist/client/resourceTypes.d.ts +64 -75
  81. package/dist/client/resourceTypes.js +4 -10
  82. package/dist/client/schemaConfig.d.ts +31 -43
  83. package/dist/client/schemaConfig.js +38 -50
  84. package/dist/client/sessionMint.d.ts +16 -12
  85. package/dist/client/sessionMint.js +26 -31
  86. package/dist/client/validateAbloOptions.d.ts +12 -14
  87. package/dist/client/validateAbloOptions.js +8 -9
  88. package/dist/client/writeOptionsSchema.d.ts +18 -16
  89. package/dist/client/writeOptionsSchema.js +23 -20
  90. package/dist/client/wsMutationExecutor.d.ts +15 -20
  91. package/dist/client/wsMutationExecutor.js +17 -23
  92. package/dist/context.d.ts +6 -4
  93. package/dist/context.js +6 -4
  94. package/dist/coordination/index.d.ts +10 -8
  95. package/dist/coordination/index.js +14 -12
  96. package/dist/coordination/schema.d.ts +176 -128
  97. package/dist/coordination/schema.js +197 -133
  98. package/dist/coordination/trace.d.ts +9 -10
  99. package/dist/coordination/trace.js +13 -14
  100. package/dist/core/DatabaseManager.d.ts +5 -7
  101. package/dist/core/DatabaseManager.js +15 -19
  102. package/dist/core/QueryProcessor.d.ts +7 -9
  103. package/dist/core/QueryProcessor.js +22 -28
  104. package/dist/core/QueryView.d.ts +8 -8
  105. package/dist/core/QueryView.js +2 -2
  106. package/dist/core/StoreManager.d.ts +12 -14
  107. package/dist/core/StoreManager.js +21 -24
  108. package/dist/core/ViewRegistry.d.ts +5 -5
  109. package/dist/core/ViewRegistry.js +4 -4
  110. package/dist/core/index.d.ts +17 -12
  111. package/dist/core/index.js +32 -26
  112. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  113. package/dist/core/openIDBWithTimeout.js +42 -43
  114. package/dist/core/queryUtils.d.ts +45 -0
  115. package/dist/core/queryUtils.js +69 -0
  116. package/dist/core/storeContract.d.ts +63 -61
  117. package/dist/core/storeContract.js +8 -12
  118. package/dist/environment.d.ts +28 -0
  119. package/dist/environment.js +21 -0
  120. package/dist/errorCodes.d.ts +107 -99
  121. package/dist/errorCodes.js +131 -132
  122. package/dist/errors.d.ts +160 -166
  123. package/dist/errors.js +155 -158
  124. package/dist/index.d.ts +30 -27
  125. package/dist/index.js +89 -86
  126. package/dist/interfaces/index.d.ts +102 -113
  127. package/dist/interfaces/index.js +5 -4
  128. package/dist/keys/index.d.ts +27 -29
  129. package/dist/keys/index.js +41 -40
  130. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  131. package/dist/mutators/RecordingTransaction.js +31 -37
  132. package/dist/mutators/Transaction.d.ts +18 -26
  133. package/dist/mutators/Transaction.js +14 -20
  134. package/dist/mutators/UndoManager.d.ts +122 -131
  135. package/dist/mutators/UndoManager.js +145 -156
  136. package/dist/mutators/defineMutators.d.ts +23 -34
  137. package/dist/mutators/defineMutators.js +14 -20
  138. package/dist/mutators/inverseOp.d.ts +12 -15
  139. package/dist/mutators/inverseOp.js +12 -15
  140. package/dist/mutators/mutateActions.d.ts +10 -9
  141. package/dist/mutators/mutateActions.js +1 -1
  142. package/dist/mutators/readerActions.d.ts +9 -8
  143. package/dist/mutators/readerActions.js +2 -2
  144. package/dist/mutators/undoApply.d.ts +31 -27
  145. package/dist/mutators/undoApply.js +26 -24
  146. package/dist/policy/index.d.ts +5 -3
  147. package/dist/policy/index.js +5 -3
  148. package/dist/policy/types.d.ts +104 -100
  149. package/dist/policy/types.js +67 -66
  150. package/dist/query/client.d.ts +28 -23
  151. package/dist/query/client.js +45 -43
  152. package/dist/query/types.d.ts +37 -60
  153. package/dist/query/types.js +13 -33
  154. package/dist/react/AbloProvider.d.ts +1 -1
  155. package/dist/react/AbloProvider.js +2 -2
  156. package/dist/react/context.d.ts +25 -28
  157. package/dist/react/context.js +9 -10
  158. package/dist/react/index.d.ts +41 -42
  159. package/dist/react/index.js +37 -38
  160. package/dist/react/internalContext.d.ts +17 -19
  161. package/dist/react/useAblo.d.ts +23 -22
  162. package/dist/react/useAblo.js +16 -14
  163. package/dist/react/useCurrentUserId.d.ts +8 -7
  164. package/dist/react/useCurrentUserId.js +8 -7
  165. package/dist/react/useErrorListener.d.ts +7 -7
  166. package/dist/react/useErrorListener.js +10 -11
  167. package/dist/react/useMutationFailureListener.d.ts +8 -8
  168. package/dist/react/useMutationFailureListener.js +8 -8
  169. package/dist/react/useMutators.d.ts +11 -11
  170. package/dist/react/useMutators.js +3 -3
  171. package/dist/react/useReactive.js +2 -2
  172. package/dist/react/useSyncStatus.d.ts +4 -6
  173. package/dist/react/useUndoScope.d.ts +7 -9
  174. package/dist/react/useUndoScope.js +1 -1
  175. package/dist/schema/coordination.d.ts +21 -25
  176. package/dist/schema/coordination.js +21 -25
  177. package/dist/schema/ddl.d.ts +43 -39
  178. package/dist/schema/ddl.js +75 -68
  179. package/dist/schema/ddlLock.d.ts +20 -24
  180. package/dist/schema/ddlLock.js +18 -23
  181. package/dist/schema/diff.d.ts +99 -61
  182. package/dist/schema/diff.js +43 -34
  183. package/dist/schema/field.d.ts +37 -42
  184. package/dist/schema/field.js +35 -48
  185. package/dist/schema/generate.d.ts +12 -12
  186. package/dist/schema/generate.js +12 -12
  187. package/dist/schema/index.d.ts +2 -2
  188. package/dist/schema/index.js +21 -23
  189. package/dist/schema/model.d.ts +118 -143
  190. package/dist/schema/model.js +22 -33
  191. package/dist/schema/openapi.d.ts +10 -9
  192. package/dist/schema/openapi.js +5 -3
  193. package/dist/schema/queries.d.ts +29 -31
  194. package/dist/schema/queries.js +23 -25
  195. package/dist/schema/relation.d.ts +89 -99
  196. package/dist/schema/relation.js +13 -13
  197. package/dist/schema/residency.d.ts +16 -13
  198. package/dist/schema/residency.js +16 -13
  199. package/dist/schema/roles.d.ts +36 -43
  200. package/dist/schema/roles.js +31 -37
  201. package/dist/schema/schema.d.ts +33 -42
  202. package/dist/schema/schema.js +31 -32
  203. package/dist/schema/select.d.ts +13 -13
  204. package/dist/schema/select.js +13 -13
  205. package/dist/schema/serialize.d.ts +28 -31
  206. package/dist/schema/serialize.js +27 -31
  207. package/dist/schema/sugar.d.ts +17 -32
  208. package/dist/schema/sugar.js +14 -29
  209. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
  210. package/dist/schema/syncDeltaRow.js +89 -0
  211. package/dist/schema/tenancy.d.ts +44 -46
  212. package/dist/schema/tenancy.js +46 -48
  213. package/dist/server/adapter.d.ts +58 -58
  214. package/dist/server/adapter.js +13 -14
  215. package/dist/server/commit.d.ts +60 -64
  216. package/dist/server/index.d.ts +9 -10
  217. package/dist/server/index.js +1 -1
  218. package/dist/server/readConfig.d.ts +70 -0
  219. package/dist/server/readConfig.js +8 -0
  220. package/dist/server/storageMode.d.ts +23 -0
  221. package/dist/server/storageMode.js +17 -0
  222. package/dist/source/adapter.d.ts +30 -25
  223. package/dist/source/adapter.js +10 -10
  224. package/dist/source/adapters/drizzle.d.ts +28 -23
  225. package/dist/source/adapters/drizzle.js +30 -25
  226. package/dist/source/adapters/kysely.d.ts +27 -25
  227. package/dist/source/adapters/kysely.js +24 -23
  228. package/dist/source/adapters/memory.d.ts +8 -7
  229. package/dist/source/adapters/memory.js +9 -8
  230. package/dist/source/adapters/prisma.d.ts +13 -12
  231. package/dist/source/adapters/prisma.js +22 -25
  232. package/dist/source/conformance.d.ts +18 -11
  233. package/dist/source/conformance.js +17 -11
  234. package/dist/source/connector.d.ts +31 -32
  235. package/dist/source/connector.js +28 -28
  236. package/dist/source/connectorProtocol.d.ts +160 -0
  237. package/dist/source/connectorProtocol.js +162 -0
  238. package/dist/source/contract.d.ts +26 -27
  239. package/dist/source/contract.js +28 -29
  240. package/dist/source/factory.d.ts +46 -58
  241. package/dist/source/factory.js +22 -27
  242. package/dist/source/index.d.ts +7 -9
  243. package/dist/source/index.js +12 -14
  244. package/dist/source/migrations.d.ts +9 -9
  245. package/dist/source/migrations.js +9 -9
  246. package/dist/source/next.d.ts +9 -10
  247. package/dist/source/next.js +6 -7
  248. package/dist/source/pushQueue.d.ts +69 -47
  249. package/dist/source/pushQueue.js +32 -28
  250. package/dist/source/signing.d.ts +46 -17
  251. package/dist/source/signing.js +28 -11
  252. package/dist/source/types.d.ts +121 -104
  253. package/dist/source/types.js +13 -14
  254. package/dist/stores/ObjectStore.d.ts +10 -11
  255. package/dist/stores/ObjectStore.js +11 -12
  256. package/dist/stores/ObjectStoreContract.d.ts +12 -15
  257. package/dist/stores/SyncActionStore.d.ts +7 -11
  258. package/dist/stores/SyncActionStore.js +13 -17
  259. package/dist/surface.d.ts +27 -20
  260. package/dist/surface.js +27 -20
  261. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
  262. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
  263. package/dist/sync/ConnectionManager.d.ts +39 -50
  264. package/dist/sync/ConnectionManager.js +55 -66
  265. package/dist/sync/NetworkProbe.d.ts +24 -29
  266. package/dist/sync/NetworkProbe.js +63 -69
  267. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
  268. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
  269. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
  270. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
  271. package/dist/sync/SyncWebSocket.d.ts +139 -165
  272. package/dist/sync/SyncWebSocket.js +191 -223
  273. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  274. package/dist/sync/awaitClaimGrant.js +11 -11
  275. package/dist/sync/bootstrapApply.d.ts +34 -24
  276. package/dist/sync/bootstrapApply.js +27 -19
  277. package/dist/sync/commitFrames.d.ts +21 -20
  278. package/dist/sync/commitFrames.js +18 -18
  279. package/dist/sync/createClaimStream.d.ts +23 -22
  280. package/dist/sync/createClaimStream.js +105 -23
  281. package/dist/sync/createPresenceStream.d.ts +19 -18
  282. package/dist/sync/createPresenceStream.js +25 -26
  283. package/dist/sync/createSnapshot.d.ts +12 -14
  284. package/dist/sync/createSnapshot.js +20 -26
  285. package/dist/sync/credentialLifecycle.d.ts +104 -104
  286. package/dist/sync/credentialLifecycle.js +140 -147
  287. package/dist/sync/deltaPipeline.d.ts +36 -34
  288. package/dist/sync/deltaPipeline.js +64 -65
  289. package/dist/sync/groupChange.d.ts +63 -61
  290. package/dist/sync/groupChange.js +74 -78
  291. package/dist/sync/heartbeat.d.ts +34 -33
  292. package/dist/sync/heartbeat.js +31 -31
  293. package/dist/sync/participants.d.ts +19 -19
  294. package/dist/sync/schemas.d.ts +3 -2
  295. package/dist/sync/schemas.js +14 -10
  296. package/dist/sync/syncCursor.d.ts +17 -21
  297. package/dist/sync/syncCursor.js +17 -21
  298. package/dist/sync/syncPlan.d.ts +28 -36
  299. package/dist/sync/syncPlan.js +18 -19
  300. package/dist/sync/syncPosition.d.ts +54 -49
  301. package/dist/sync/syncPosition.js +57 -52
  302. package/dist/sync/wsFrameHandlers.d.ts +35 -36
  303. package/dist/sync/wsFrameHandlers.js +63 -67
  304. package/dist/testing/fixtures/bootstrap.d.ts +12 -6
  305. package/dist/testing/fixtures/bootstrap.js +12 -6
  306. package/dist/testing/fixtures/deltas.d.ts +30 -33
  307. package/dist/testing/fixtures/deltas.js +30 -33
  308. package/dist/testing/fixtures/models.d.ts +11 -10
  309. package/dist/testing/fixtures/models.js +11 -10
  310. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  311. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  312. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
  313. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
  314. package/dist/testing/helpers/wait.d.ts +13 -8
  315. package/dist/testing/helpers/wait.js +13 -8
  316. package/dist/testing/index.d.ts +3 -3
  317. package/dist/testing/index.js +2 -2
  318. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  319. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  320. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  321. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  322. package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
  323. package/dist/testing/mocks/MockSyncContext.js +15 -13
  324. package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
  325. package/dist/testing/mocks/MockSyncStore.js +11 -11
  326. package/dist/testing/mocks/MockWebSocket.d.ts +26 -22
  327. package/dist/testing/mocks/MockWebSocket.js +22 -21
  328. package/dist/transactions/TransactionQueue.d.ts +181 -176
  329. package/dist/transactions/TransactionQueue.js +338 -350
  330. package/dist/transactions/TransactionStore.d.ts +6 -4
  331. package/dist/transactions/TransactionStore.js +6 -4
  332. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  333. package/dist/transactions/UnconfirmedWrites.js +104 -0
  334. package/dist/transactions/coalesceRules.d.ts +41 -17
  335. package/dist/transactions/coalesceRules.js +40 -17
  336. package/dist/transactions/commitPayload.d.ts +48 -52
  337. package/dist/transactions/commitPayload.js +48 -57
  338. package/dist/transactions/deltaConfirmation.d.ts +20 -22
  339. package/dist/transactions/deltaConfirmation.js +37 -45
  340. package/dist/transactions/optimisticApply.d.ts +49 -0
  341. package/dist/transactions/optimisticApply.js +65 -0
  342. package/dist/transactions/{persistedReplay.d.ts → replayValidation.d.ts} +28 -22
  343. package/dist/transactions/{persistedReplay.js → replayValidation.js} +33 -27
  344. package/dist/types/global.d.ts +46 -41
  345. package/dist/types/global.js +20 -19
  346. package/dist/types/index.d.ts +71 -77
  347. package/dist/types/index.js +22 -22
  348. package/dist/types/modelData.d.ts +6 -8
  349. package/dist/types/modelData.js +5 -7
  350. package/dist/types/participant.d.ts +10 -11
  351. package/dist/types/participant.js +6 -8
  352. package/dist/types/streams.d.ts +208 -195
  353. package/dist/types/streams.js +7 -7
  354. package/dist/utils/asyncIterator.d.ts +25 -32
  355. package/dist/utils/asyncIterator.js +25 -32
  356. package/dist/utils/duration.d.ts +12 -15
  357. package/dist/utils/duration.js +12 -15
  358. package/dist/utils/mobxSetup.d.ts +53 -0
  359. package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
  360. package/dist/webhooks/events.d.ts +21 -16
  361. package/dist/webhooks/events.js +10 -8
  362. package/dist/webhooks/index.d.ts +5 -7
  363. package/dist/webhooks/index.js +5 -7
  364. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  365. package/dist/wire/delta.js +114 -0
  366. package/dist/wire/errorEnvelope.d.ts +30 -31
  367. package/dist/wire/errorEnvelope.js +34 -40
  368. package/dist/wire/frames.d.ts +79 -86
  369. package/dist/wire/frames.js +26 -33
  370. package/dist/wire/index.d.ts +14 -12
  371. package/dist/wire/index.js +30 -26
  372. package/dist/wire/listEnvelope.d.ts +16 -23
  373. package/dist/wire/listEnvelope.js +7 -6
  374. package/dist/wire/protocol.d.ts +25 -32
  375. package/dist/wire/protocol.js +25 -32
  376. package/dist/wire/protocolVersion.d.ts +44 -40
  377. package/dist/wire/protocolVersion.js +44 -40
  378. package/docs/coordination.md +59 -0
  379. package/package.json +11 -10
  380. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  381. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  382. package/dist/core/query-utils.d.ts +0 -34
  383. package/dist/core/query-utils.js +0 -59
  384. package/dist/schema/sync-delta-row.js +0 -103
  385. package/dist/schema/sync-delta-wire.js +0 -102
  386. package/dist/server/read-config.d.ts +0 -67
  387. package/dist/server/read-config.js +0 -8
  388. package/dist/server/storage-mode.d.ts +0 -8
  389. package/dist/server/storage-mode.js +0 -28
  390. package/dist/source/connector-protocol.d.ts +0 -159
  391. package/dist/source/connector-protocol.js +0 -161
  392. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  393. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  394. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  395. package/dist/transactions/mutation-error-handler.js +0 -39
  396. package/dist/transactions/optimistic.d.ts +0 -24
  397. package/dist/transactions/optimistic.js +0 -45
  398. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -1,27 +1,25 @@
1
1
  /**
2
- * deltaPipeline the incoming-delta dedup/batch/flush pipeline.
3
- *
4
- * Extracted from BaseSyncedStore.ts as a cohesive leaf: state-signature
5
- * dedup, per-delta bookkeeping + enqueue, the live-traffic debounce, and
6
- * the IDB→pool flush. The store keeps thin protected delegates with
7
- * unchanged signatures, and the leaf routes every call to a protected
8
- * override point (getStateFields, isCustomEntity, deduplicateDeltas,
9
- * flushPendingDeltas, the G/S handlers, …) back through the minimal
10
- * {@link DeltaPipelineContext} so subclass dynamic dispatch is preserved.
11
- * `applyDeltaFrame` the authoritative-apply correctness seam — stays in
12
- * BaseSyncedStore and drives this pipeline via `enqueueDelta` +
13
- * `flushPendingDeltas`.
2
+ * The pipeline that takes incoming deltas from the server and lands them in
3
+ * local state. It has four stages: deduplicating deltas by state signature,
4
+ * per-delta bookkeeping and enqueue, a debounce for live traffic, and a flush
5
+ * that writes to the local store and then the in-memory pool. Every call it
6
+ * makes back into the surrounding store resolving state fields, identifying
7
+ * custom entities, deduplicating, flushing, handling sync-group changes
8
+ * routes through the {@link DeltaPipelineContext} interface, so a subclass that
9
+ * overrides any of those hooks still takes effect. The atomic frame-apply entry
10
+ * point lives on the store and drives this pipeline through {@link enqueueDelta}
11
+ * and {@link flushPendingDeltas}.
14
12
  */
15
13
  import { runInAction } from 'mobx';
16
14
  import { getContext } from '../context.js';
17
- import { ModelScope } from '../ObjectPool.js';
15
+ import { ModelScope } from '../InstanceCache.js';
18
16
  /**
19
- * A 'G'/'S' handler rejected AFTER the applied watermark already advanced —
20
- * the delta will never be re-delivered, so a failed SECURITY clear (revoked
21
- * data must not persist) would otherwise be permanently silent. Fall back to
22
- * the bluntest safe response: drop the whole in-memory pool and force a full
23
- * re-bootstrap so local state is rebuilt from server truth. Never throws —
24
- * this runs inside the delta pipeline's fire-and-forget seam.
17
+ * Handles a sync-group ('G' or 'S') delta whose handler rejected after the
18
+ * applied watermark had already advanced. That delta will never be redelivered,
19
+ * so a failed security clear revoked data that must not stay cached — would
20
+ * otherwise fail silently. The safe fallback is blunt: drop the whole in-memory
21
+ * pool and force a full re-bootstrap, rebuilding local state from the server.
22
+ * It never throws, because it runs inside the pipeline's fire-and-forget path.
25
23
  */
26
24
  export function handleGroupHandlerFailure(ctx, delta, error) {
27
25
  getContext().logger.error('Your access changed but cached data could not be cleared — resetting local data.', {
@@ -41,7 +39,7 @@ export function handleGroupHandlerFailure(ctx, delta, error) {
41
39
  // Best-effort: the reconnect/bootstrap cycle self-heals on next connect.
42
40
  }
43
41
  }
44
- /** State signature for delta deduplication */
42
+ /** Builds a small signature of a delta's state fields, used to detect no-op duplicate deltas. */
45
43
  function extractStateSignature(ctx, delta) {
46
44
  if (!delta.data || typeof delta.data !== 'object')
47
45
  return null;
@@ -110,19 +108,19 @@ export function deduplicateDeltas(ctx, deltas) {
110
108
  return result.sort((a, b) => a.id - b.id);
111
109
  }
112
110
  /**
113
- * Per-delta bookkeeping + enqueue. Returns `true` when the delta was
114
- * pushed onto `pendingDeltas` (a regular batchable I/U/C/D delta that a
115
- * subsequent flush must drain), `false` when it was skipped (dedup),
116
- * deferred (bootstrap queue), or handled immediately out-of-band (G/S
117
- * sync-group mutations). Does NOT schedule a flush — callers decide
118
- * whether to debounce (live) or flush atomically (catch-up frame).
111
+ * Performs per-delta bookkeeping and enqueues the delta. Returns `true` when
112
+ * the delta was pushed onto `pendingDeltas` a regular batchable insert,
113
+ * update, covering, or delete that a later flush must drain — and `false` when
114
+ * it was skipped as a duplicate, deferred into the bootstrap queue, or handled
115
+ * immediately (a 'G'/'S' sync-group change). It does not schedule the flush
116
+ * itself; the caller chooses whether to debounce live traffic or flush a
117
+ * catch-up frame atomically.
119
118
  */
120
119
  export function enqueueDelta(ctx, delta, options = {}) {
121
120
  // Dedup guard — skip already-processed deltas. The `applied` watermark is a
122
- // valid skip threshold ONLY for in-order live traffic; an authoritative
123
- // catch-up frame bypasses it (see `applyDeltaFrame`) so an out-of-order
124
- // live delta that advanced the watermark can't cause the frame's lower ids
125
- // to be silently dropped.
121
+ // valid skip threshold only for in-order live traffic; an authoritative
122
+ // catch-up frame bypasses it, so an out-of-order live delta that advanced the
123
+ // watermark can't cause the frame's lower ids to be dropped silently.
126
124
  if (!options.authoritative && delta.id > 0 && delta.id <= ctx.highestProcessedSyncId) {
127
125
  return false;
128
126
  }
@@ -135,10 +133,11 @@ export function enqueueDelta(ctx, delta, options = {}) {
135
133
  }
136
134
  // Advance watermark
137
135
  ctx.advanceApplied(delta.id);
138
- // Sync group added — handle immediately. Supports both legacy
139
- // (addedGroups/removedGroups) and incremental (group/userId) payloads.
140
- // NOT fire-and-forget: the watermark above already advanced, so a rejected
141
- // handler (a failed security clear) must trigger the fallback, not vanish.
136
+ // Sync group added — handle immediately. Accepts both the batched
137
+ // (addedGroups/removedGroups) and incremental (group/userId) payloads. This
138
+ // is deliberately not fire-and-forget: the watermark has already advanced, so
139
+ // a rejected handler (a failed security clear) must trigger the fallback
140
+ // rather than vanish.
142
141
  if (delta.actionType === 'G') {
143
142
  void ctx.handleSyncGroupChange(delta).catch((error) => {
144
143
  handleGroupHandlerFailure(ctx, delta, error);
@@ -154,16 +153,16 @@ export function enqueueDelta(ctx, delta, options = {}) {
154
153
  });
155
154
  return false;
156
155
  }
157
- // DELETEfire the cascade cancel immediately (O(1) via FK index;
158
- // must run BEFORE any subsequent update on the same model lands so
159
- // pending update transactions for soon-deleted children don't race
160
- // their parent's delete) but route the IDB+pool write through the
161
- // same batched path as UPDATEs. The previous immediate-flush path
162
- // produced N IDB writes + N pool mutations + N `models:changed`
163
- // events when a peer deleted a chart with N layers; the batched
164
- // path produces one of each per microtask flush. Dedup in
165
- // `flushPendingDeltas` handles the U-then-D-on-same-model case
166
- // correctly via arrival-order replay through `processDeltaBatch`.
156
+ // Deleterun the cascade cancel immediately (O(1) through the foreign-key
157
+ // index; it must run before any later update on the same model lands, so
158
+ // pending update transactions for soon-deleted children don't race their
159
+ // parent's delete). The persistence and pool write still goes through the
160
+ // same batched path as updates: flushing each delete on its own produced one
161
+ // store write, one pool mutation, and one `models:changed` event per row, so
162
+ // deleting a parent with many children fanned out into many of each, whereas
163
+ // the batched path collapses them into one per flush. Deduplication in
164
+ // `flushPendingDeltas` handles an update-then-delete on the same model by
165
+ // replaying in arrival order.
167
166
  if (delta.actionType === 'D') {
168
167
  ctx.cascadeCancelTransactionsForDeletedParent(delta.modelName, delta.modelId);
169
168
  }
@@ -183,13 +182,16 @@ export function scheduleDeltaFlush(ctx) {
183
182
  }, ctx.smartSyncOptions.batchingDelay);
184
183
  }
185
184
  }
186
- /** Flush pending deltas with deduplication and batched ObjectPool mutations */
187
- /** Flush pending deltas with deduplication. Delegates pool writes to SyncClient. */
185
+ /**
186
+ * Flushes the queued deltas: deduplicates them, applies custom-entity deltas
187
+ * straight to the pool, writes the rest to the local store and then the pool,
188
+ * and advances the acknowledgement cursor once the store write has committed.
189
+ */
188
190
  export async function flushPendingDeltas(ctx) {
189
191
  if (ctx.pendingDeltas.length === 0)
190
192
  return;
191
193
  const deduplicatedDeltas = ctx.deduplicateDeltas(ctx.pendingDeltas);
192
- // Custom entities → apply directly to ObjectPool (skip IDB)
194
+ // Custom entities → apply straight to the pool, skipping the local store.
193
195
  const customDeltas = deduplicatedDeltas.filter((d) => ctx.isCustomEntity(d.modelName));
194
196
  if (customDeltas.length > 0) {
195
197
  runInAction(() => {
@@ -219,10 +221,10 @@ export async function flushPendingDeltas(ctx) {
219
221
  }
220
222
  });
221
223
  }
222
- // Regular deltas → IDB then ObjectPool via SyncClient.
223
- // 'G' and 'S' deltas are routed upstream (handleSyncGroupChange,
224
- // handleGroupRemoved) and never reach flushPendingDeltas, but the
225
- // Database.processDelta signature accepts them defensively.
224
+ // Regular deltas → the local store, then the pool.
225
+ // 'G' and 'S' deltas are handled earlier (handleSyncGroupChange /
226
+ // handleGroupRemoved) and never reach here, though the persistence
227
+ // signature accepts them defensively.
226
228
  const regularDeltas = deduplicatedDeltas.filter((d) => !ctx.isCustomEntity(d.modelName));
227
229
  const batch = await ctx.processDeltaBatch(regularDeltas.map((d) => ({
228
230
  syncId: d.id,
@@ -230,30 +232,27 @@ export async function flushPendingDeltas(ctx) {
230
232
  modelName: d.modelName,
231
233
  modelId: d.modelId,
232
234
  data: typeof d.data === 'string' ? JSON.parse(d.data) : d.data,
233
- // Thread `transactionId` through so the receive layer can
234
- // recognize echoes of locally-applied transactions and skip
235
- // the pool mutation. See `OPTIMISTIC_RECONCILIATION.md`.
235
+ // Thread `transactionId` through so the receive layer can recognize
236
+ // echoes of locally-applied transactions and skip the pool mutation.
236
237
  transactionId: d.transactionId,
237
238
  })));
238
239
  const dbResults = batch.results;
239
- // Delegate ObjectPool writes to SyncClient (owns pool operations)
240
+ // Apply the batch results to the in-memory pool.
240
241
  ctx.applyDeltaBatchToPool(dbResults);
241
- // Acknowledge + advance sync cursor gated on IDB persistence.
242
+ // Acknowledge and advance the sync cursor, gated on persistence.
242
243
  //
243
- // We MUST ack `persistedSyncId` (the high-water mark of deltas whose
244
- // store transaction actually committed), NOT the input batch's last
245
- // delta id. Acking by input range advances the server's view past
246
- // deltas that never wrote to IDB; the next catch-up request would
247
- // then send the advanced cursor and the server replies "you're up
248
- // to date" losing the un-persisted delta forever. This is the
249
- // Replicache "same-transaction" invariant: the cursor and the
250
- // persisted view must be consistent.
244
+ // We must acknowledge `persistedSyncId` the high-water mark of deltas whose
245
+ // store transaction actually committed not the input batch's last delta id.
246
+ // Acknowledging the input range would advance the server's view past deltas
247
+ // that never persisted; the next catch-up would then send the advanced cursor,
248
+ // the server would answer "you're up to date", and the unpersisted delta would
249
+ // be lost. The cursor and the persisted state must move together.
251
250
  const persistedSyncId = batch.persistedSyncId;
252
251
  if (persistedSyncId > ctx.lastAckedId) {
253
252
  ctx.acknowledge(persistedSyncId);
254
253
  ctx.advancePersisted(persistedSyncId);
255
254
  }
256
- // Cache invalidation is automatic via SyncClient 'models:changed' event
255
+ // Cache invalidation happens automatically via the 'models:changed' event.
257
256
  ctx.pendingDeltas = [];
258
257
  if (ctx.batchTimer) {
259
258
  clearTimeout(ctx.batchTimer);
@@ -1,23 +1,26 @@
1
1
  /**
2
- * groupChange sync-group change / shrinkage handling.
2
+ * Handles the delta types that change which sync groups a session can see. A
3
+ * sync group is a fan-out scope the server uses to decide which entities a
4
+ * client receives. When a session's membership changes, these handlers update
5
+ * the client's subscription list; when access is revoked, they clear cached
6
+ * data and trigger a full re-bootstrap so revoked rows cannot linger on the
7
+ * device.
3
8
  *
4
- * Extracted from BaseSyncedStore.ts as a cohesive leaf: the 'G'/'S' delta
5
- * handlers (incremental group-added, legacy group-diff, group-removed), the
6
- * group-set math, the force-re-bootstrap trigger, and the security-critical
7
- * shrinkage check. The store keeps thin protected delegates with unchanged
8
- * signatures — subclass override points stay overridable, and the leaf
9
- * routes every cross-handler call back through the minimal
10
- * {@link GroupChangeContext} so dynamic dispatch is preserved.
9
+ * Every handler takes a {@link GroupChangeContext}, the narrow facade through
10
+ * which it reaches the client's local storage and connection lifecycle hooks.
11
11
  */
12
12
  import type { SyncDelta, SyncGroupChangePayload, GroupAddedPayload } from './SyncWebSocket.js';
13
13
  /**
14
- * What the group-change handlers need back from their host store —
15
- * narrow collaborator facades plus the host's own protected hooks (so a
16
- * subclass override of e.g. `forceFullRebootstrap` still takes effect).
14
+ * The collaborators the group-change handlers depend on. It gathers the
15
+ * client's local storage, in-memory pool, and connection lifecycle hooks
16
+ * behind one narrow interface, so the handlers stay decoupled from the larger
17
+ * store that supplies them.
17
18
  */
18
19
  export interface GroupChangeContext {
19
- /** Local persistence — SECURITY clears, subscription metadata, and the
20
- * full-bootstrap flag. Structural subset of `Database`. */
20
+ /**
21
+ * Local persistence. Performs the security clear, reads and writes the
22
+ * subscription metadata, and sets the flag that forces a full bootstrap.
23
+ */
21
24
  readonly database: {
22
25
  clear(): Promise<void>;
23
26
  getWorkspaceMetadata(): Promise<{
@@ -28,84 +31,83 @@ export interface GroupChangeContext {
28
31
  }): Promise<void>;
29
32
  markRequiresFullBootstrap(): void;
30
33
  };
31
- /** The in-memory pool cleared alongside IDB on revocation. */
34
+ /** The in-memory object cache, cleared alongside local storage when access is revoked. */
32
35
  readonly objectPool: {
33
36
  clear(): void;
34
37
  };
35
- /** Groups the CURRENT socket is subscribed to (`syncWebSocket?.getSyncGroups() ?? []`). */
38
+ /** Returns the sync groups the live connection is currently subscribed to. */
36
39
  getSubscribedSyncGroups(): readonly string[];
37
- /** The session's authoritative groups via the host's `resolveSyncGroups`;
38
- * null when no user context has been set yet. */
40
+ /**
41
+ * Returns the session's authoritative sync groups, resolved from the current
42
+ * user context via {@link resolveSyncGroups}; null when no user context has
43
+ * been set yet.
44
+ */
39
45
  getCurrentSyncGroups(): readonly string[] | null;
40
- /** `userContext?.bootstrapMode` — 'none' participants never re-bootstrap. */
46
+ /**
47
+ * Returns the session's bootstrap mode. A value of 'none' means the
48
+ * participant never pulls a baseline, so it never re-bootstraps.
49
+ */
41
50
  getBootstrapMode(): 'full' | 'none' | undefined;
42
- /** Disconnect the live socket (part of the force-re-bootstrap cycle). */
51
+ /** Disconnects the live connection, one step of the forced re-bootstrap cycle. */
43
52
  disconnectWebSocket(): void;
44
- /** Forward to the host's `onConnectionEvent` lifecycle hook (no-op when unwired). */
53
+ /** Emits a connection lifecycle event to any registered listener; a no-op when none is set. */
45
54
  emitConnectionEvent(event: string): void;
46
55
  handleGroupAdded(payload: GroupAddedPayload, syncId: number): Promise<void>;
47
56
  computeUpdatedSyncGroups(payload: SyncGroupChangePayload): string[];
48
57
  forceFullRebootstrap(): void;
49
58
  }
50
59
  /**
51
- * Handle an actionType 'G' delta.
60
+ * Handles a 'G' (group-change) delta. The server sends two shapes of this
61
+ * delta, told apart by the payload:
52
62
  *
53
- * The server emits 'G' via two distinct pathways, distinguished by payload
54
- * shape:
63
+ * Incremental `{ group, userId }`: the recipient was added to a single
64
+ * sync group. No re-bootstrap follows; the newly visible entities arrive as
65
+ * ordinary 'C' (covering) deltas through the normal insert path.
55
66
  *
56
- * Incremental (EmitGroupAdded): { group, userId }
57
- * - The recipient was added to a single sync group.
58
- * - Subsequent 'C' (Covering) deltas deliver each newly-visible entity.
59
- * - No re-bootstrap — entities arrive via the normal insert path.
60
- *
61
- * Legacy (EmitGroupChange): { addedGroups, removedGroups }
62
- * - Single delta carrying the full group membership diff.
63
- * - Forces a full re-bootstrap (disconnect + reconnect + fetch all).
64
- * - Deprecated on the server; kept here for wire-level backward compat.
67
+ * Full diff — `{ addedGroups, removedGroups }`: one delta carrying the whole
68
+ * membership change. This forces a full re-bootstrap (disconnect, reconnect,
69
+ * and refetch), clearing cached data first if any group was removed.
65
70
  */
66
71
  export declare function handleSyncGroupChange(ctx: GroupChangeContext, delta: SyncDelta): Promise<void>;
67
72
  /**
68
- * Handle an incremental GroupAdded delta.
69
- *
70
- * Adds the new group to the subscription metadata without triggering a
71
- * re-bootstrap. The server will follow up with 'C' (Covering) deltas for
72
- * each newly-visible entity, which flow through the normal insert path.
73
+ * Handles an incremental group-added delta. It records the new sync group in
74
+ * the subscription metadata without forcing a re-bootstrap; the server then
75
+ * sends a 'C' (covering) delta for each newly visible entity, which flows
76
+ * through the normal insert path.
73
77
  */
74
78
  export declare function handleGroupAdded(ctx: GroupChangeContext, payload: GroupAddedPayload, syncId: number): Promise<void>;
75
79
  /**
76
- * Handle an actionType 'S' (GroupRemoved) delta.
77
- *
78
- * Signals that the recipient has lost access to a sync group. Because
79
- * the client does not track per-entity group membership, we can't
80
- * selectively purge entities belonging to that group. The safe fallback
81
- * is the legacy behavior: clear local state and force a re-bootstrap
82
- * with the updated group list.
83
- *
84
- * Future optimization: track group membership in the ObjectPool so 'S'
85
- * can do a targeted purge instead of a full re-bootstrap.
80
+ * Handles an 'S' (group-removed) delta, which signals the recipient has lost
81
+ * access to a sync group. The client does not track which entities belong to
82
+ * which group, so it cannot purge only the affected rows; instead it clears
83
+ * local state and forces a re-bootstrap with the updated group list.
86
84
  */
87
85
  export declare function handleGroupRemoved(ctx: GroupChangeContext, delta: SyncDelta): Promise<void>;
88
- /** Compute new sync groups after applying additions and removals */
86
+ /** Computes the new sync-group set after applying the additions and removals in a diff. */
89
87
  export declare function computeUpdatedSyncGroups(ctx: GroupChangeContext, payload: SyncGroupChangePayload): string[];
90
- /** Force a full re-bootstrap via connection lifecycle event.
91
- *
92
- * No-op for `bootstrapMode: 'none'` participants they never pull
93
- * baseline state, so a "force re-bootstrap" trigger (sync-group
94
- * shrink, scope revocation) instead just flushes the local pool and
95
- * relies on covering deltas to repopulate the data they actually
88
+ /**
89
+ * Forces a full re-bootstrap by marking local storage as needing one,
90
+ * disconnecting, and emitting a connection lifecycle event that the reconnect
91
+ * path acts on. Does nothing for participants whose bootstrap mode is 'none':
92
+ * they never pull a baseline, so after a trigger such as a sync-group shrink or
93
+ * an access revocation they rely on covering deltas to repopulate the data they
96
94
  * subscribe to.
97
95
  */
98
96
  export declare function forceFullRebootstrap(ctx: GroupChangeContext): void;
99
97
  /**
100
- * Single source of truth for the sync-group list this session is
101
- * subscribed to. Server-issued (`context.syncGroups`) is authoritative.
102
- * When absent, the SDK subscribes to no explicit groups. Both
103
- * `checkSyncGroupShrinkage` and `setupWebSocketSync` resolve through
104
- * here so the WS subscription and the security-critical shrinkage
105
- * check can never disagree.
98
+ * Resolves the sync-group list this session subscribes to, and is the single
99
+ * place that decision is made. The server-issued `context.syncGroups` is
100
+ * authoritative; when it is absent, the session subscribes to no explicit
101
+ * groups. {@link checkSyncGroupShrinkage} and connection setup both read
102
+ * through here, so the live subscription and the access-revocation check can
103
+ * never disagree.
106
104
  */
107
105
  export declare function resolveSyncGroups(context: {
108
106
  syncGroups?: readonly string[];
109
107
  }): readonly string[];
110
- /** Check if sync groups shrank since last session — force full bootstrap if so */
108
+ /**
109
+ * Compares the session's current sync groups against the set stored from the
110
+ * last session. If any group is now missing, access has narrowed, so this
111
+ * clears cached data and forces a full bootstrap before recording the new set.
112
+ */
111
113
  export declare function checkSyncGroupShrinkage(ctx: GroupChangeContext): Promise<void>;