@abloatai/ablo 0.36.0 → 0.37.1

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 (597) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +55 -2014
  3. package/NOTICE +2 -2
  4. package/README.md +45 -63
  5. package/assets/banner.png +0 -0
  6. package/dist/auth.d.ts +2 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +2 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/client.d.ts +3 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +3 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/coordination.d.ts +2 -0
  15. package/dist/coordination.d.ts.map +1 -0
  16. package/dist/coordination.js +2 -0
  17. package/dist/coordination.js.map +1 -0
  18. package/dist/index.d.ts +3 -114
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +3 -163
  21. package/dist/index.js.map +1 -0
  22. package/dist/react.d.ts +4 -0
  23. package/dist/react.d.ts.map +1 -0
  24. package/dist/react.js +3 -0
  25. package/dist/react.js.map +1 -0
  26. package/dist/schema.d.ts +2 -0
  27. package/dist/schema.d.ts.map +1 -0
  28. package/dist/schema.js +2 -0
  29. package/dist/schema.js.map +1 -0
  30. package/dist/server.d.ts +2 -0
  31. package/dist/server.d.ts.map +1 -0
  32. package/dist/server.js +2 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/source-conformance.d.ts +2 -0
  35. package/dist/source-conformance.d.ts.map +1 -0
  36. package/dist/source-conformance.js +2 -0
  37. package/dist/source-conformance.js.map +1 -0
  38. package/dist/source-drizzle.d.ts +2 -0
  39. package/dist/source-drizzle.d.ts.map +1 -0
  40. package/dist/source-drizzle.js +2 -0
  41. package/dist/source-drizzle.js.map +1 -0
  42. package/dist/source-kysely.d.ts +2 -0
  43. package/dist/source-kysely.d.ts.map +1 -0
  44. package/dist/source-kysely.js +2 -0
  45. package/dist/source-kysely.js.map +1 -0
  46. package/dist/source-next.d.ts +2 -0
  47. package/dist/source-next.d.ts.map +1 -0
  48. package/dist/source-next.js +2 -0
  49. package/dist/source-next.js.map +1 -0
  50. package/dist/source.d.ts +2 -0
  51. package/dist/source.d.ts.map +1 -0
  52. package/dist/source.js +2 -0
  53. package/dist/source.js.map +1 -0
  54. package/dist/wire.d.ts +2 -0
  55. package/dist/wire.d.ts.map +1 -0
  56. package/dist/wire.js +2 -0
  57. package/dist/wire.js.map +1 -0
  58. package/docs/agents.md +1 -1
  59. package/docs/api-keys.md +7 -6
  60. package/docs/api.md +10 -10
  61. package/docs/client-behavior.md +5 -5
  62. package/docs/coordination.md +52 -62
  63. package/docs/data-sources.md +1 -1
  64. package/docs/examples/agent-human.md +4 -4
  65. package/docs/examples/ai-sdk-tool.md +1 -1
  66. package/docs/examples/existing-python-backend.md +15 -4
  67. package/docs/examples/nextjs.md +27 -6
  68. package/docs/examples/server-agent.md +2 -2
  69. package/docs/how-it-works.md +4 -4
  70. package/docs/identity.md +2 -1
  71. package/docs/integration-guide.md +24 -13
  72. package/docs/internal/README.md +18 -0
  73. package/docs/internal/agent-fleet-coordination-design.md +171 -0
  74. package/docs/internal/agent-orchestration.md +58 -0
  75. package/docs/internal/commit-identifiers.md +91 -0
  76. package/docs/internal/concurrency-open-decisions.md +37 -0
  77. package/docs/internal/data-source-reverse-channel.md +150 -0
  78. package/docs/internal/per-field-conflict-detection.md +165 -0
  79. package/docs/internal/postgres-replication.md +64 -0
  80. package/docs/internal/serializable-schema.md +119 -0
  81. package/docs/internal/structure.md +32 -0
  82. package/docs/mcp.md +2 -2
  83. package/docs/migration.md +3 -3
  84. package/docs/quickstart.md +2 -2
  85. package/docs/react.md +5 -5
  86. package/docs/schema-contract.md +3 -3
  87. package/docs/sessions.md +91 -37
  88. package/examples/README.md +2 -2
  89. package/examples/data-source/README.md +1 -1
  90. package/examples/data-source/ablo-driver.ts +1 -1
  91. package/examples/data-source/customer-server.ts +1 -1
  92. package/examples/data-source/run.ts +1 -1
  93. package/examples/data-source/schema.ts +1 -1
  94. package/examples/quickstart.ts +2 -2
  95. package/llms.txt +8 -8
  96. package/package.json +63 -166
  97. package/bin/ablo.cjs +0 -39
  98. package/dist/BaseSyncedStore.d.ts +0 -843
  99. package/dist/BaseSyncedStore.js +0 -1971
  100. package/dist/Database.d.ts +0 -323
  101. package/dist/Database.js +0 -1502
  102. package/dist/InstanceCache.d.ts +0 -237
  103. package/dist/InstanceCache.js +0 -1166
  104. package/dist/LazyReferenceCollection.d.ts +0 -177
  105. package/dist/LazyReferenceCollection.js +0 -461
  106. package/dist/Model.d.ts +0 -454
  107. package/dist/Model.js +0 -919
  108. package/dist/ModelRegistry.d.ts +0 -225
  109. package/dist/ModelRegistry.js +0 -539
  110. package/dist/NetworkMonitor.d.ts +0 -28
  111. package/dist/NetworkMonitor.js +0 -79
  112. package/dist/RuntimeContext.d.ts +0 -52
  113. package/dist/RuntimeContext.js +0 -80
  114. package/dist/SyncClient.d.ts +0 -541
  115. package/dist/SyncClient.js +0 -2202
  116. package/dist/adapters/alwaysOnline.d.ts +0 -14
  117. package/dist/adapters/alwaysOnline.js +0 -17
  118. package/dist/adapters/inMemoryStorage.d.ts +0 -31
  119. package/dist/adapters/inMemoryStorage.js +0 -110
  120. package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
  121. package/dist/ai-sdk/coordinatedTool.js +0 -134
  122. package/dist/ai-sdk/coordinationContext.d.ts +0 -46
  123. package/dist/ai-sdk/coordinationContext.js +0 -106
  124. package/dist/ai-sdk/index.d.ts +0 -121
  125. package/dist/ai-sdk/index.js +0 -121
  126. package/dist/ai-sdk/wrap.d.ts +0 -65
  127. package/dist/ai-sdk/wrap.js +0 -39
  128. package/dist/auth/index.d.ts +0 -1
  129. package/dist/auth/index.js +0 -8
  130. package/dist/batching/index.d.ts +0 -55
  131. package/dist/batching/index.js +0 -147
  132. package/dist/client/Ablo.d.ts +0 -231
  133. package/dist/client/Ablo.js +0 -160
  134. package/dist/client/abloClient.d.ts +0 -309
  135. package/dist/client/abloClient.js +0 -13
  136. package/dist/client/clientPrelude.d.ts +0 -52
  137. package/dist/client/clientPrelude.js +0 -60
  138. package/dist/client/consoleLogger.d.ts +0 -35
  139. package/dist/client/consoleLogger.js +0 -44
  140. package/dist/client/coreClient.d.ts +0 -60
  141. package/dist/client/coreClient.js +0 -118
  142. package/dist/client/createInternalComponents.d.ts +0 -50
  143. package/dist/client/createInternalComponents.js +0 -98
  144. package/dist/client/createModelProxy.d.ts +0 -248
  145. package/dist/client/createModelProxy.js +0 -884
  146. package/dist/client/humans.d.ts +0 -69
  147. package/dist/client/humans.js +0 -78
  148. package/dist/client/modelRegistration.d.ts +0 -10
  149. package/dist/client/modelRegistration.js +0 -312
  150. package/dist/client/options.d.ts +0 -461
  151. package/dist/client/options.js +0 -7
  152. package/dist/client/reactiveEngine.d.ts +0 -53
  153. package/dist/client/reactiveEngine.js +0 -688
  154. package/dist/client/resourceTypes.d.ts +0 -12
  155. package/dist/client/resourceTypes.js +0 -10
  156. package/dist/client/schemaConfig.d.ts +0 -44
  157. package/dist/client/schemaConfig.js +0 -185
  158. package/dist/client/storeCluster.d.ts +0 -47
  159. package/dist/client/storeCluster.js +0 -118
  160. package/dist/client/storeLifecycle.d.ts +0 -61
  161. package/dist/client/storeLifecycle.js +0 -231
  162. package/dist/client/validateAbloOptions.d.ts +0 -42
  163. package/dist/client/validateAbloOptions.js +0 -43
  164. package/dist/client/wsMutationExecutor.d.ts +0 -27
  165. package/dist/client/wsMutationExecutor.js +0 -72
  166. package/dist/context.d.ts +0 -42
  167. package/dist/context.js +0 -81
  168. package/dist/coordination/ClaimLog.d.ts +0 -26
  169. package/dist/coordination/ClaimLog.js +0 -32
  170. package/dist/coordination/index.d.ts +0 -1
  171. package/dist/coordination/index.js +0 -8
  172. package/dist/core/index.d.ts +0 -33
  173. package/dist/core/index.js +0 -48
  174. package/dist/docs/catalog.d.ts +0 -72
  175. package/dist/docs/catalog.js +0 -230
  176. package/dist/docs/index.d.ts +0 -10
  177. package/dist/docs/index.js +0 -10
  178. package/dist/environment.d.ts +0 -1
  179. package/dist/environment.js +0 -8
  180. package/dist/interfaces/index.d.ts +0 -311
  181. package/dist/interfaces/index.js +0 -9
  182. package/dist/keys/index.d.ts +0 -1
  183. package/dist/keys/index.js +0 -8
  184. package/dist/mutators/RecordingMutation.d.ts +0 -36
  185. package/dist/mutators/RecordingMutation.js +0 -182
  186. package/dist/mutators/Transaction.d.ts +0 -40
  187. package/dist/mutators/Transaction.js +0 -58
  188. package/dist/mutators/UndoManager.d.ts +0 -258
  189. package/dist/mutators/UndoManager.js +0 -658
  190. package/dist/mutators/defineMutators.d.ts +0 -60
  191. package/dist/mutators/defineMutators.js +0 -18
  192. package/dist/mutators/inverseOp.d.ts +0 -126
  193. package/dist/mutators/inverseOp.js +0 -71
  194. package/dist/mutators/mutateActions.d.ts +0 -45
  195. package/dist/mutators/mutateActions.js +0 -105
  196. package/dist/mutators/readerActions.d.ts +0 -33
  197. package/dist/mutators/readerActions.js +0 -57
  198. package/dist/mutators/undoApply.d.ts +0 -51
  199. package/dist/mutators/undoApply.js +0 -117
  200. package/dist/policy/index.d.ts +0 -21
  201. package/dist/policy/index.js +0 -20
  202. package/dist/query/QueryProcessor.d.ts +0 -75
  203. package/dist/query/QueryProcessor.js +0 -255
  204. package/dist/query/client.d.ts +0 -64
  205. package/dist/query/client.js +0 -138
  206. package/dist/query/types.d.ts +0 -85
  207. package/dist/query/types.js +0 -16
  208. package/dist/react/AbloProvider.d.ts +0 -242
  209. package/dist/react/AbloProvider.js +0 -458
  210. package/dist/react/ClientSideSuspense.d.ts +0 -36
  211. package/dist/react/ClientSideSuspense.js +0 -17
  212. package/dist/react/DefaultFallback.d.ts +0 -24
  213. package/dist/react/DefaultFallback.js +0 -43
  214. package/dist/react/context.d.ts +0 -55
  215. package/dist/react/context.js +0 -29
  216. package/dist/react/createAbloReact.d.ts +0 -56
  217. package/dist/react/createAbloReact.js +0 -51
  218. package/dist/react/index.d.ts +0 -62
  219. package/dist/react/index.js +0 -69
  220. package/dist/react/internalContext.d.ts +0 -33
  221. package/dist/react/internalContext.js +0 -3
  222. package/dist/react/useAblo.d.ts +0 -82
  223. package/dist/react/useAblo.js +0 -120
  224. package/dist/react/useCurrentUserId.d.ts +0 -22
  225. package/dist/react/useCurrentUserId.js +0 -34
  226. package/dist/react/useErrorListener.d.ts +0 -20
  227. package/dist/react/useErrorListener.js +0 -38
  228. package/dist/react/useMutationFailureListener.d.ts +0 -26
  229. package/dist/react/useMutationFailureListener.js +0 -38
  230. package/dist/react/useMutators.d.ts +0 -56
  231. package/dist/react/useMutators.js +0 -84
  232. package/dist/react/useReactive.d.ts +0 -35
  233. package/dist/react/useReactive.js +0 -123
  234. package/dist/react/useSyncStatus.d.ts +0 -59
  235. package/dist/react/useSyncStatus.js +0 -76
  236. package/dist/react/useUndoScope.d.ts +0 -34
  237. package/dist/react/useUndoScope.js +0 -81
  238. package/dist/schema/coordination.d.ts +0 -112
  239. package/dist/schema/coordination.js +0 -133
  240. package/dist/schema/ddl.d.ts +0 -97
  241. package/dist/schema/ddl.js +0 -491
  242. package/dist/schema/ddlLock.d.ts +0 -35
  243. package/dist/schema/ddlLock.js +0 -46
  244. package/dist/schema/diff.d.ts +0 -225
  245. package/dist/schema/diff.js +0 -289
  246. package/dist/schema/generate.d.ts +0 -19
  247. package/dist/schema/generate.js +0 -86
  248. package/dist/schema/index.d.ts +0 -42
  249. package/dist/schema/index.js +0 -80
  250. package/dist/schema/queries.d.ts +0 -201
  251. package/dist/schema/queries.js +0 -144
  252. package/dist/schema/select.d.ts +0 -40
  253. package/dist/schema/select.js +0 -90
  254. package/dist/schema/serialize.d.ts +0 -115
  255. package/dist/schema/serialize.js +0 -265
  256. package/dist/schema/sugar.d.ts +0 -109
  257. package/dist/schema/sugar.js +0 -83
  258. package/dist/schema/syncDeltaRow.d.ts +0 -6
  259. package/dist/schema/syncDeltaRow.js +0 -6
  260. package/dist/server/adapter.d.ts +0 -173
  261. package/dist/server/adapter.js +0 -18
  262. package/dist/server/commit.d.ts +0 -107
  263. package/dist/server/commit.js +0 -1
  264. package/dist/server/index.d.ts +0 -14
  265. package/dist/server/index.js +0 -2
  266. package/dist/server/readConfig.d.ts +0 -80
  267. package/dist/server/readConfig.js +0 -8
  268. package/dist/server/storageMode.d.ts +0 -23
  269. package/dist/server/storageMode.js +0 -17
  270. package/dist/source/adapter.d.ts +0 -83
  271. package/dist/source/adapter.js +0 -24
  272. package/dist/source/adapters/drizzle.d.ts +0 -48
  273. package/dist/source/adapters/drizzle.js +0 -219
  274. package/dist/source/adapters/kysely.d.ts +0 -42
  275. package/dist/source/adapters/kysely.js +0 -205
  276. package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
  277. package/dist/source/adapters/kyselyMutationCore.js +0 -125
  278. package/dist/source/adapters/memory.d.ts +0 -13
  279. package/dist/source/adapters/memory.js +0 -130
  280. package/dist/source/adapters/prisma.d.ts +0 -63
  281. package/dist/source/adapters/prisma.js +0 -202
  282. package/dist/source/conformance.d.ts +0 -37
  283. package/dist/source/conformance.js +0 -215
  284. package/dist/source/connector.d.ts +0 -95
  285. package/dist/source/connector.js +0 -266
  286. package/dist/source/connectorProtocol.d.ts +0 -154
  287. package/dist/source/connectorProtocol.js +0 -163
  288. package/dist/source/contract.d.ts +0 -195
  289. package/dist/source/contract.js +0 -164
  290. package/dist/source/factory.d.ts +0 -92
  291. package/dist/source/factory.js +0 -286
  292. package/dist/source/idempotency.d.ts +0 -61
  293. package/dist/source/idempotency.js +0 -144
  294. package/dist/source/index.d.ts +0 -23
  295. package/dist/source/index.js +0 -30
  296. package/dist/source/migrations.d.ts +0 -21
  297. package/dist/source/migrations.js +0 -103
  298. package/dist/source/next.d.ts +0 -32
  299. package/dist/source/next.js +0 -25
  300. package/dist/source/pushQueue.d.ts +0 -134
  301. package/dist/source/pushQueue.js +0 -256
  302. package/dist/source/signing.d.ts +0 -92
  303. package/dist/source/signing.js +0 -162
  304. package/dist/source/types.d.ts +0 -401
  305. package/dist/source/types.js +0 -59
  306. package/dist/storeContract.d.ts +0 -145
  307. package/dist/storeContract.js +0 -12
  308. package/dist/stores/DatabaseManager.d.ts +0 -107
  309. package/dist/stores/DatabaseManager.js +0 -388
  310. package/dist/stores/ObjectStore.d.ts +0 -115
  311. package/dist/stores/ObjectStore.js +0 -393
  312. package/dist/stores/ObjectStoreContract.d.ts +0 -38
  313. package/dist/stores/ObjectStoreContract.js +0 -1
  314. package/dist/stores/StoreManager.d.ts +0 -114
  315. package/dist/stores/StoreManager.js +0 -304
  316. package/dist/stores/SyncActionStore.d.ts +0 -99
  317. package/dist/stores/SyncActionStore.js +0 -506
  318. package/dist/stores/openIDBWithTimeout.d.ts +0 -65
  319. package/dist/stores/openIDBWithTimeout.js +0 -153
  320. package/dist/stores/syncAction.d.ts +0 -26
  321. package/dist/stores/syncAction.js +0 -16
  322. package/dist/surface.d.ts +0 -36
  323. package/dist/surface.js +0 -75
  324. package/dist/sync/BootstrapFetcher.d.ts +0 -284
  325. package/dist/sync/BootstrapFetcher.js +0 -964
  326. package/dist/sync/ConnectionManager.d.ts +0 -8
  327. package/dist/sync/ConnectionManager.js +0 -8
  328. package/dist/sync/OnDemandLoader.d.ts +0 -231
  329. package/dist/sync/OnDemandLoader.js +0 -743
  330. package/dist/sync/SubscriptionManager.d.ts +0 -159
  331. package/dist/sync/SubscriptionManager.js +0 -243
  332. package/dist/sync/SyncWebSocket.d.ts +0 -173
  333. package/dist/sync/SyncWebSocket.js +0 -438
  334. package/dist/sync/awaitClaimGrant.d.ts +0 -6
  335. package/dist/sync/awaitClaimGrant.js +0 -6
  336. package/dist/sync/bootstrapApply.d.ts +0 -73
  337. package/dist/sync/bootstrapApply.js +0 -73
  338. package/dist/sync/commitFrames.d.ts +0 -8
  339. package/dist/sync/commitFrames.js +0 -8
  340. package/dist/sync/contextPorts.d.ts +0 -18
  341. package/dist/sync/contextPorts.js +0 -31
  342. package/dist/sync/createClaimStream.d.ts +0 -7
  343. package/dist/sync/createClaimStream.js +0 -7
  344. package/dist/sync/createPresenceStream.d.ts +0 -69
  345. package/dist/sync/createPresenceStream.js +0 -200
  346. package/dist/sync/createSnapshot.d.ts +0 -29
  347. package/dist/sync/createSnapshot.js +0 -118
  348. package/dist/sync/credentialLifecycle.d.ts +0 -7
  349. package/dist/sync/credentialLifecycle.js +0 -7
  350. package/dist/sync/deltaPipeline.d.ts +0 -114
  351. package/dist/sync/deltaPipeline.js +0 -278
  352. package/dist/sync/groupChange.d.ts +0 -116
  353. package/dist/sync/groupChange.js +0 -244
  354. package/dist/sync/participants.d.ts +0 -132
  355. package/dist/sync/participants.js +0 -346
  356. package/dist/sync/persistedPrefix.d.ts +0 -12
  357. package/dist/sync/persistedPrefix.js +0 -22
  358. package/dist/sync/schemaDrift.d.ts +0 -55
  359. package/dist/sync/schemaDrift.js +0 -53
  360. package/dist/sync/schemas.d.ts +0 -71
  361. package/dist/sync/schemas.js +0 -94
  362. package/dist/sync/syncCursor.d.ts +0 -40
  363. package/dist/sync/syncCursor.js +0 -55
  364. package/dist/sync/syncPlan.d.ts +0 -54
  365. package/dist/sync/syncPlan.js +0 -50
  366. package/dist/sync/wsFrameHandlers.d.ts +0 -8
  367. package/dist/sync/wsFrameHandlers.js +0 -8
  368. package/dist/syncLog/contract.d.ts +0 -20
  369. package/dist/syncLog/contract.js +0 -19
  370. package/dist/syncLog/index.d.ts +0 -1
  371. package/dist/syncLog/index.js +0 -1
  372. package/dist/transaction/ablo.d.ts +0 -88
  373. package/dist/transaction/ablo.js +0 -33
  374. package/dist/transaction/auth/apiKey.d.ts +0 -152
  375. package/dist/transaction/auth/apiKey.js +0 -419
  376. package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
  377. package/dist/transaction/auth/bootstrapScope.js +0 -1
  378. package/dist/transaction/auth/capability.d.ts +0 -212
  379. package/dist/transaction/auth/capability.js +0 -224
  380. package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
  381. package/dist/transaction/auth/credentialEndpoint.js +0 -86
  382. package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
  383. package/dist/transaction/auth/credentialPolicy.js +0 -125
  384. package/dist/transaction/auth/credentialSource.d.ts +0 -30
  385. package/dist/transaction/auth/credentialSource.js +0 -55
  386. package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
  387. package/dist/transaction/auth/hostedEndpoints.js +0 -21
  388. package/dist/transaction/auth/identity.d.ts +0 -55
  389. package/dist/transaction/auth/identity.js +0 -210
  390. package/dist/transaction/auth/index.d.ts +0 -162
  391. package/dist/transaction/auth/index.js +0 -304
  392. package/dist/transaction/auth/schemas.d.ts +0 -59
  393. package/dist/transaction/auth/schemas.js +0 -85
  394. package/dist/transaction/auth/sessionMint.d.ts +0 -28
  395. package/dist/transaction/auth/sessionMint.js +0 -85
  396. package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -56
  397. package/dist/transaction/coordination/awaitClaimGrant.js +0 -124
  398. package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -84
  399. package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -108
  400. package/dist/transaction/coordination/claimMeta.d.ts +0 -49
  401. package/dist/transaction/coordination/claimMeta.js +0 -52
  402. package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
  403. package/dist/transaction/coordination/createClaimStream.js +0 -475
  404. package/dist/transaction/coordination/events.d.ts +0 -74
  405. package/dist/transaction/coordination/events.js +0 -7
  406. package/dist/transaction/coordination/index.d.ts +0 -19
  407. package/dist/transaction/coordination/index.js +0 -45
  408. package/dist/transaction/coordination/locator.d.ts +0 -104
  409. package/dist/transaction/coordination/locator.js +0 -102
  410. package/dist/transaction/coordination/schema.d.ts +0 -1536
  411. package/dist/transaction/coordination/schema.js +0 -1177
  412. package/dist/transaction/coordination/targetConflict.d.ts +0 -2
  413. package/dist/transaction/coordination/targetConflict.js +0 -107
  414. package/dist/transaction/coordination/trace.d.ts +0 -78
  415. package/dist/transaction/coordination/trace.js +0 -138
  416. package/dist/transaction/durableWrites.d.ts +0 -62
  417. package/dist/transaction/durableWrites.js +0 -71
  418. package/dist/transaction/environment.d.ts +0 -105
  419. package/dist/transaction/environment.js +0 -108
  420. package/dist/transaction/errorCodes.d.ts +0 -403
  421. package/dist/transaction/errorCodes.js +0 -484
  422. package/dist/transaction/errors.d.ts +0 -428
  423. package/dist/transaction/errors.js +0 -686
  424. package/dist/transaction/footprint.d.ts +0 -111
  425. package/dist/transaction/footprint.js +0 -0
  426. package/dist/transaction/index.d.ts +0 -20
  427. package/dist/transaction/index.js +0 -20
  428. package/dist/transaction/keys/index.d.ts +0 -87
  429. package/dist/transaction/keys/index.js +0 -207
  430. package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
  431. package/dist/transaction/log/syncDeltaRow.js +0 -95
  432. package/dist/transaction/logPosition.d.ts +0 -97
  433. package/dist/transaction/logPosition.js +0 -125
  434. package/dist/transaction/logger.d.ts +0 -16
  435. package/dist/transaction/logger.js +0 -7
  436. package/dist/transaction/observability.d.ts +0 -53
  437. package/dist/transaction/observability.js +0 -19
  438. package/dist/transaction/persistence.d.ts +0 -12
  439. package/dist/transaction/persistence.js +0 -11
  440. package/dist/transaction/plugin.d.ts +0 -285
  441. package/dist/transaction/plugin.js +0 -106
  442. package/dist/transaction/policy/types.d.ts +0 -217
  443. package/dist/transaction/policy/types.js +0 -126
  444. package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
  445. package/dist/transaction/resources/functionalUpdate.js +0 -87
  446. package/dist/transaction/resources/httpResources.d.ts +0 -321
  447. package/dist/transaction/resources/httpResources.js +0 -7
  448. package/dist/transaction/resources/modelOperations.d.ts +0 -427
  449. package/dist/transaction/resources/modelOperations.js +0 -12
  450. package/dist/transaction/resources/mutationOptions.d.ts +0 -66
  451. package/dist/transaction/resources/mutationOptions.js +0 -9
  452. package/dist/transaction/resources/where.d.ts +0 -101
  453. package/dist/transaction/resources/where.js +0 -115
  454. package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
  455. package/dist/transaction/resources/writeOptionsSchema.js +0 -73
  456. package/dist/transaction/schema/field.d.ts +0 -120
  457. package/dist/transaction/schema/field.js +0 -265
  458. package/dist/transaction/schema/fieldRef.d.ts +0 -38
  459. package/dist/transaction/schema/fieldRef.js +0 -11
  460. package/dist/transaction/schema/loadStrategy.d.ts +0 -45
  461. package/dist/transaction/schema/loadStrategy.js +0 -46
  462. package/dist/transaction/schema/model.d.ts +0 -379
  463. package/dist/transaction/schema/model.js +0 -123
  464. package/dist/transaction/schema/openapi.d.ts +0 -58
  465. package/dist/transaction/schema/openapi.js +0 -501
  466. package/dist/transaction/schema/relation.d.ts +0 -204
  467. package/dist/transaction/schema/relation.js +0 -104
  468. package/dist/transaction/schema/residency.d.ts +0 -29
  469. package/dist/transaction/schema/residency.js +0 -25
  470. package/dist/transaction/schema/roles.d.ts +0 -249
  471. package/dist/transaction/schema/roles.js +0 -230
  472. package/dist/transaction/schema/schema.d.ts +0 -351
  473. package/dist/transaction/schema/schema.js +0 -325
  474. package/dist/transaction/schema/tenancy.d.ts +0 -139
  475. package/dist/transaction/schema/tenancy.js +0 -190
  476. package/dist/transaction/transactionLayer.d.ts +0 -82
  477. package/dist/transaction/transactionLayer.js +0 -24
  478. package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
  479. package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
  480. package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
  481. package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
  482. package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
  483. package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
  484. package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
  485. package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
  486. package/dist/transaction/transport/commitFrames.d.ts +0 -90
  487. package/dist/transaction/transport/commitFrames.js +0 -134
  488. package/dist/transaction/transport/connectionManager.d.ts +0 -215
  489. package/dist/transaction/transport/connectionManager.js +0 -673
  490. package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
  491. package/dist/transaction/transport/credentialLifecycle.js +0 -324
  492. package/dist/transaction/transport/heartbeat.d.ts +0 -65
  493. package/dist/transaction/transport/heartbeat.js +0 -93
  494. package/dist/transaction/transport/httpClient.d.ts +0 -131
  495. package/dist/transaction/transport/httpClient.js +0 -146
  496. package/dist/transaction/transport/httpOptions.d.ts +0 -33
  497. package/dist/transaction/transport/httpOptions.js +0 -12
  498. package/dist/transaction/transport/httpTransport.d.ts +0 -8
  499. package/dist/transaction/transport/httpTransport.js +0 -1388
  500. package/dist/transaction/transport/networkProbe.d.ts +0 -84
  501. package/dist/transaction/transport/networkProbe.js +0 -207
  502. package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
  503. package/dist/transaction/transport/wsFrameHandlers.js +0 -429
  504. package/dist/transaction/transport/wsTransport.d.ts +0 -574
  505. package/dist/transaction/transport/wsTransport.js +0 -1023
  506. package/dist/transaction/types/assertExact.d.ts +0 -17
  507. package/dist/transaction/types/assertExact.js +0 -1
  508. package/dist/transaction/types/global.d.ts +0 -107
  509. package/dist/transaction/types/global.js +0 -40
  510. package/dist/transaction/types/index.d.ts +0 -205
  511. package/dist/transaction/types/index.js +0 -56
  512. package/dist/transaction/types/modelData.d.ts +0 -10
  513. package/dist/transaction/types/modelData.js +0 -9
  514. package/dist/transaction/types/participant.d.ts +0 -20
  515. package/dist/transaction/types/participant.js +0 -10
  516. package/dist/transaction/types/streams.d.ts +0 -550
  517. package/dist/transaction/types/streams.js +0 -11
  518. package/dist/transaction/utils/asyncIterator.d.ts +0 -34
  519. package/dist/transaction/utils/asyncIterator.js +0 -135
  520. package/dist/transaction/utils/duration.d.ts +0 -50
  521. package/dist/transaction/utils/duration.js +0 -77
  522. package/dist/transaction/utils/json.d.ts +0 -57
  523. package/dist/transaction/utils/json.js +0 -276
  524. package/dist/transaction/wire/accountResponses.d.ts +0 -420
  525. package/dist/transaction/wire/accountResponses.js +0 -290
  526. package/dist/transaction/wire/auth.d.ts +0 -56
  527. package/dist/transaction/wire/auth.js +0 -63
  528. package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
  529. package/dist/transaction/wire/bootstrapReason.js +0 -8
  530. package/dist/transaction/wire/claimEvent.d.ts +0 -76
  531. package/dist/transaction/wire/claimEvent.js +0 -73
  532. package/dist/transaction/wire/claims.d.ts +0 -530
  533. package/dist/transaction/wire/claims.js +0 -327
  534. package/dist/transaction/wire/commit.d.ts +0 -603
  535. package/dist/transaction/wire/commit.js +0 -321
  536. package/dist/transaction/wire/delta.d.ts +0 -250
  537. package/dist/transaction/wire/delta.js +0 -147
  538. package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
  539. package/dist/transaction/wire/errorEnvelope.js +0 -123
  540. package/dist/transaction/wire/feedCursor.d.ts +0 -60
  541. package/dist/transaction/wire/feedCursor.js +0 -82
  542. package/dist/transaction/wire/feedEvent.d.ts +0 -204
  543. package/dist/transaction/wire/feedEvent.js +0 -65
  544. package/dist/transaction/wire/frames.d.ts +0 -194
  545. package/dist/transaction/wire/frames.js +0 -50
  546. package/dist/transaction/wire/inboundFrames.d.ts +0 -562
  547. package/dist/transaction/wire/inboundFrames.js +0 -116
  548. package/dist/transaction/wire/index.d.ts +0 -54
  549. package/dist/transaction/wire/index.js +0 -83
  550. package/dist/transaction/wire/listEnvelope.d.ts +0 -37
  551. package/dist/transaction/wire/listEnvelope.js +0 -42
  552. package/dist/transaction/wire/modelMutations.d.ts +0 -31
  553. package/dist/transaction/wire/modelMutations.js +0 -52
  554. package/dist/transaction/wire/modelResponses.d.ts +0 -85
  555. package/dist/transaction/wire/modelResponses.js +0 -43
  556. package/dist/transaction/wire/modelShape.d.ts +0 -78
  557. package/dist/transaction/wire/modelShape.js +0 -74
  558. package/dist/transaction/wire/protocol.d.ts +0 -38
  559. package/dist/transaction/wire/protocol.js +0 -38
  560. package/dist/transaction/wire/protocolVersion.d.ts +0 -73
  561. package/dist/transaction/wire/protocolVersion.js +0 -83
  562. package/dist/transactions/mutations/MutationQueue.d.ts +0 -661
  563. package/dist/transactions/mutations/MutationQueue.js +0 -2807
  564. package/dist/transactions/mutations/MutationStore.d.ts +0 -20
  565. package/dist/transactions/mutations/MutationStore.js +0 -53
  566. package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
  567. package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
  568. package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
  569. package/dist/transactions/mutations/coalesceRules.js +0 -140
  570. package/dist/transactions/mutations/commitLatency.d.ts +0 -52
  571. package/dist/transactions/mutations/commitLatency.js +0 -130
  572. package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
  573. package/dist/transactions/mutations/commitOutboxStore.js +0 -26
  574. package/dist/transactions/mutations/commitPayload.d.ts +0 -165
  575. package/dist/transactions/mutations/commitPayload.js +0 -152
  576. package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -63
  577. package/dist/transactions/mutations/deltaConfirmation.js +0 -235
  578. package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
  579. package/dist/transactions/mutations/durableWriteStore.js +0 -12
  580. package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
  581. package/dist/transactions/mutations/optimisticApply.js +0 -65
  582. package/dist/transactions/mutations/replayValidation.d.ts +0 -187
  583. package/dist/transactions/mutations/replayValidation.js +0 -164
  584. package/dist/utils/mobxSetup.d.ts +0 -53
  585. package/dist/utils/mobxSetup.js +0 -330
  586. package/dist/views/QueryView.d.ts +0 -79
  587. package/dist/views/QueryView.js +0 -218
  588. package/dist/views/ViewRegistry.d.ts +0 -20
  589. package/dist/views/ViewRegistry.js +0 -55
  590. package/dist/views/incrementalView.d.ts +0 -45
  591. package/dist/views/incrementalView.js +0 -69
  592. package/dist/webhooks/events.d.ts +0 -43
  593. package/dist/webhooks/events.js +0 -42
  594. package/dist/webhooks/index.d.ts +0 -8
  595. package/dist/webhooks/index.js +0 -8
  596. package/dist/wire/index.d.ts +0 -1
  597. package/dist/wire/index.js +0 -8
@@ -1,278 +0,0 @@
1
- /**
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}.
12
- */
13
- import { runInAction } from 'mobx';
14
- import { globalRuntime } from '../context.js';
15
- import { ModelScope } from '../InstanceCache.js';
16
- import { runStage, pluginsForStage, } from '../transaction/plugin.js';
17
- /**
18
- * Handles a sync-group ('G' or 'S') delta whose handler rejected after the
19
- * applied watermark had already advanced. That delta will never be redelivered,
20
- * so a failed security clear — revoked data that must not stay cached — would
21
- * otherwise fail silently. The safe fallback is blunt: drop the whole in-memory
22
- * pool and force a full re-bootstrap, rebuilding local state from the server.
23
- * It never throws, because it runs inside the pipeline's fire-and-forget path.
24
- */
25
- export function handleGroupHandlerFailure(ctx, delta, error) {
26
- (ctx.runtime ?? globalRuntime).logger.error('Your access changed but cached data could not be cleared — resetting local data.', {
27
- syncId: delta.id,
28
- error: error instanceof Error ? error.message : String(error),
29
- });
30
- try {
31
- ctx.objectPool.clear();
32
- }
33
- catch {
34
- // In-memory clear must never mask the re-bootstrap below.
35
- }
36
- try {
37
- ctx.forceFullRebootstrap();
38
- }
39
- catch {
40
- // Best-effort: the reconnect/bootstrap cycle self-heals on next connect.
41
- }
42
- }
43
- /** Builds a small signature of a delta's state fields, used to detect no-op duplicate deltas. */
44
- function extractStateSignature(ctx, delta) {
45
- if (!delta.data || typeof delta.data !== 'object')
46
- return null;
47
- const data = typeof delta.data === 'string'
48
- ? JSON.parse(delta.data)
49
- : (delta.data);
50
- // Generic state fields — subclasses can override getStateFields() for model-specific fields
51
- const fieldsToCheck = ctx.getStateFields(delta.modelName);
52
- const signature = {
53
- actionType: delta.actionType,
54
- modelName: delta.modelName,
55
- };
56
- for (const field of fieldsToCheck) {
57
- if (field in data)
58
- signature[field] = data[field];
59
- }
60
- return signature;
61
- }
62
- function isSameState(a, b) {
63
- if (!a || !b)
64
- return false;
65
- const keys = Object.keys(a);
66
- if (keys.length !== Object.keys(b).length)
67
- return false;
68
- return keys.every((k) => a[k] === b[k]);
69
- }
70
- /** Deduplicate deltas to the same entity — keep meaningful state transitions only */
71
- export function deduplicateDeltas(ctx, deltas) {
72
- const byEntity = new Map();
73
- for (const d of deltas) {
74
- const key = `${d.modelName}:${d.modelId}`;
75
- if (!byEntity.has(key))
76
- byEntity.set(key, []);
77
- byEntity.get(key).push(d);
78
- }
79
- const result = [];
80
- for (const entityDeltas of byEntity.values()) {
81
- const sorted = entityDeltas.sort((a, b) => a.id - b.id);
82
- // DELETE wins — it's the final state
83
- const del = sorted.find((d) => d.actionType === 'D');
84
- if (del) {
85
- result.push(del);
86
- continue;
87
- }
88
- // Keep deltas that represent different states
89
- const unique = [];
90
- let prev = null;
91
- for (const d of sorted) {
92
- const sig = extractStateSignature(ctx, d);
93
- if (!isSameState(prev, sig)) {
94
- unique.push(d);
95
- prev = sig;
96
- }
97
- }
98
- if (unique.length > 0) {
99
- result.push(...unique);
100
- }
101
- else {
102
- // `sorted` is never empty (every byEntity bucket gets at least one
103
- // delta pushed) — the guard only narrows the indexed access.
104
- const last = sorted.at(-1);
105
- if (last)
106
- result.push(last);
107
- }
108
- }
109
- return result.sort((a, b) => a.id - b.id);
110
- }
111
- /**
112
- * Performs per-delta bookkeeping and enqueues the delta. Returns `true` when
113
- * the delta was pushed onto `pendingDeltas` — a regular batchable insert,
114
- * update, covering, or delete that a later flush must drain — and `false` when
115
- * it was skipped as a duplicate, deferred into the bootstrap queue, or handled
116
- * immediately (a 'G'/'S' sync-group change). It does not schedule the flush
117
- * itself; the caller chooses whether to debounce live traffic or flush a
118
- * catch-up frame atomically.
119
- */
120
- export function enqueueDelta(ctx, delta, options = {}) {
121
- // 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, so an out-of-order live delta that advanced the
124
- // watermark can't cause the frame's lower ids to be dropped silently.
125
- if (!options.authoritative && delta.id > 0 && delta.id <= ctx.highestProcessedSyncId) {
126
- return false;
127
- }
128
- // Confirm awaiting transactions via sync ID threshold (before batching)
129
- ctx.onDeltaReceived(delta.id, delta.transactionId, delta.correlationId);
130
- // Queue during active bootstrap
131
- if (ctx.bootstrapDeltaQueue !== null) {
132
- ctx.bootstrapDeltaQueue.push(delta);
133
- return false;
134
- }
135
- // Advance watermark
136
- ctx.advanceApplied(delta.id);
137
- // Sync group added — handle immediately. Accepts both the batched
138
- // (addedGroups/removedGroups) and incremental (group/userId) payloads. This
139
- // is deliberately not fire-and-forget: the watermark has already advanced, so
140
- // a rejected handler (a failed security clear) must trigger the fallback
141
- // rather than vanish.
142
- if (delta.actionType === 'G') {
143
- void ctx.handleSyncGroupChange(delta).catch((error) => {
144
- handleGroupHandlerFailure(ctx, delta, error);
145
- });
146
- return false;
147
- }
148
- // Sync group removed — handle immediately. Clears affected local state
149
- // and forces re-bootstrap with the updated group list. Same fallback:
150
- // a failed revocation clear escalates instead of leaving revoked rows.
151
- if (delta.actionType === 'S') {
152
- void ctx.handleGroupRemoved(delta).catch((error) => {
153
- handleGroupHandlerFailure(ctx, delta, error);
154
- });
155
- return false;
156
- }
157
- // Delete — run the cascade cancel immediately (O(1) through the foreign-key
158
- // index; it must run before any later update on the same model lands, so
159
- // pending update transactions for soon-deleted children don't race their
160
- // parent's delete). The persistence and pool write still goes through the
161
- // same batched path as updates: flushing each delete on its own produced one
162
- // store write, one pool mutation, and one `models:changed` event per row, so
163
- // deleting a parent with many children fanned out into many of each, whereas
164
- // the batched path collapses them into one per flush. Deduplication in
165
- // `flushPendingDeltas` handles an update-then-delete on the same model by
166
- // replaying in arrival order.
167
- if (delta.actionType === 'D') {
168
- ctx.cascadeCancelTransactionsForDeletedParent(delta.modelName, delta.modelId);
169
- }
170
- // The delta is accepted and queued — the `receive` stage boundary.
171
- runStage(ctx.stagePlugins ?? [], 'receive', { delta });
172
- ctx.pendingDeltas.push(delta);
173
- return true;
174
- }
175
- /** Debounce a flush for live single-delta traffic. */
176
- export function scheduleDeltaFlush(ctx) {
177
- if (ctx.batchTimer)
178
- clearTimeout(ctx.batchTimer);
179
- if (ctx.pendingDeltas.length >= ctx.smartSyncOptions.maxBatchSize) {
180
- void ctx.flushPendingDeltas().catch(ctx.handleFlushError);
181
- }
182
- else {
183
- ctx.batchTimer = setTimeout(() => {
184
- void ctx.flushPendingDeltas().catch(ctx.handleFlushError);
185
- }, ctx.smartSyncOptions.batchingDelay);
186
- }
187
- }
188
- /**
189
- * Flushes the queued deltas: deduplicates them, applies custom-entity deltas
190
- * straight to the pool, writes the rest to the local store and then the pool,
191
- * and advances the acknowledgement cursor once the store write has committed.
192
- */
193
- export async function flushPendingDeltas(ctx) {
194
- if (ctx.pendingDeltas.length === 0)
195
- return;
196
- const stagePlugins = ctx.stagePlugins ?? [];
197
- const deduplicatedDeltas = ctx.deduplicateDeltas(ctx.pendingDeltas);
198
- runStage(stagePlugins, 'dedupe', { deltas: deduplicatedDeltas });
199
- // Custom entities → apply straight to the pool, skipping the local store.
200
- const customDeltas = deduplicatedDeltas.filter((d) => ctx.isCustomEntity(d.modelName));
201
- if (customDeltas.length > 0) {
202
- runInAction(() => {
203
- for (const delta of customDeltas) {
204
- const data = typeof delta.data === 'string'
205
- ? JSON.parse(delta.data)
206
- : (delta.data);
207
- // 'C' (Covering) is treated identically to 'I' here — the client
208
- // gained permission to see the entity, so we insert it into the
209
- // pool as if newly created.
210
- if (delta.actionType === 'I' || delta.actionType === 'U' || delta.actionType === 'C') {
211
- const existing = ctx.objectPool.get(delta.modelId);
212
- if (existing) {
213
- existing.updateFromData(data);
214
- }
215
- else {
216
- const model = ctx.createCustomEntity(delta.modelName, delta.modelId, data);
217
- if (model) {
218
- model.markAsPersisted();
219
- ctx.objectPool.add(model, ModelScope.live);
220
- }
221
- }
222
- }
223
- else if (delta.actionType === 'D') {
224
- ctx.objectPool.remove(delta.modelId);
225
- }
226
- }
227
- });
228
- }
229
- // Regular deltas → the local store, then the pool.
230
- // 'G' and 'S' deltas are handled earlier (handleSyncGroupChange /
231
- // handleGroupRemoved) and never reach here, though the persistence
232
- // signature accepts them defensively.
233
- const regularDeltas = deduplicatedDeltas.filter((d) => !ctx.isCustomEntity(d.modelName));
234
- const batch = await ctx.processDeltaBatch(regularDeltas.map((d) => ({
235
- syncId: d.id,
236
- actionType: d.actionType,
237
- modelName: d.modelName,
238
- modelId: d.modelId,
239
- data: typeof d.data === 'string' ? JSON.parse(d.data) : d.data,
240
- // Thread `transactionId` through so the receive layer can recognize
241
- // echoes of locally-applied transactions and skip the pool mutation.
242
- transactionId: d.transactionId,
243
- })));
244
- const dbResults = batch.results;
245
- runStage(stagePlugins, 'persist', { deltas: regularDeltas });
246
- // Apply the batch results to the in-memory graph. When a plugin has
247
- // declared the `apply` stage, its handlers ARE the apply — the
248
- // materialiser attached where it said it would. The direct call is the
249
- // bridge for stores constructed without plugins (subclasses, tests),
250
- // whose own apply is the whole pipeline.
251
- if (pluginsForStage(stagePlugins, 'apply').length > 0) {
252
- runStage(stagePlugins, 'apply', { changes: dbResults });
253
- }
254
- else {
255
- ctx.applyDeltaBatchToPool(dbResults);
256
- }
257
- // Acknowledge and advance the sync cursor, gated on persistence.
258
- //
259
- // We must acknowledge `persistedSyncId` — the high-water mark of deltas whose
260
- // store transaction actually committed — not the input batch's last delta id.
261
- // Acknowledging the input range would advance the server's view past deltas
262
- // that never persisted; the next catch-up would then send the advanced cursor,
263
- // the server would answer "you're up to date", and the unpersisted delta would
264
- // be lost. The cursor and the persisted state must move together.
265
- const persistedSyncId = batch.persistedSyncId;
266
- if (persistedSyncId > ctx.lastAckedId) {
267
- ctx.acknowledge(persistedSyncId);
268
- ctx.advancePersisted(persistedSyncId);
269
- runStage(stagePlugins, 'acknowledge', { syncId: persistedSyncId });
270
- }
271
- // Cache invalidation happens automatically via the 'models:changed' event.
272
- runStage(stagePlugins, 'notify', { changes: dbResults });
273
- ctx.pendingDeltas = [];
274
- if (ctx.batchTimer) {
275
- clearTimeout(ctx.batchTimer);
276
- ctx.batchTimer = null;
277
- }
278
- }
@@ -1,116 +0,0 @@
1
- /**
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.
8
- *
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
- */
12
- import type { RuntimeContext } from '../RuntimeContext.js';
13
- import type { SyncDelta, SyncGroupChangePayload, GroupAddedPayload } from './SyncWebSocket.js';
14
- /**
15
- * The collaborators the group-change handlers depend on. It gathers the
16
- * client's local storage, in-memory pool, and connection lifecycle hooks
17
- * behind one narrow interface, so the handlers stay decoupled from the larger
18
- * store that supplies them.
19
- */
20
- export interface GroupChangeContext {
21
- /**
22
- * Local persistence. Performs the security clear, reads and writes the
23
- * subscription metadata, and sets the flag that forces a full bootstrap.
24
- */
25
- readonly database: {
26
- clear(): Promise<void>;
27
- getWorkspaceMetadata(): Promise<{
28
- subscribedSyncGroups?: string[];
29
- } | null>;
30
- updateWorkspaceMetadata(metadata: {
31
- subscribedSyncGroups: string[];
32
- }): Promise<void>;
33
- markRequiresFullBootstrap(): void;
34
- };
35
- /** The in-memory object cache, cleared alongside local storage when access is revoked. */
36
- readonly objectPool: {
37
- clear(): void;
38
- };
39
- /** Returns the sync groups the live connection is currently subscribed to. */
40
- getSubscribedSyncGroups(): readonly string[];
41
- /**
42
- * Returns the session's authoritative sync groups, resolved from the current
43
- * user context via {@link resolveSyncGroups}; null when no user context has
44
- * been set yet.
45
- */
46
- getCurrentSyncGroups(): readonly string[] | null;
47
- /**
48
- * Returns the session's bootstrap mode. A value of 'none' means the
49
- * participant never pulls a baseline, so it never re-bootstraps.
50
- */
51
- getBootstrapMode(): 'full' | 'none' | undefined;
52
- /** Disconnects the live connection, one step of the forced re-bootstrap cycle. */
53
- disconnectWebSocket(): void;
54
- /** Emits a connection lifecycle event to any registered listener; a no-op when none is set. */
55
- emitConnectionEvent(event: string): void;
56
- handleGroupAdded(payload: GroupAddedPayload, syncId: number): Promise<void>;
57
- computeUpdatedSyncGroups(payload: SyncGroupChangePayload): string[];
58
- forceFullRebootstrap(): void;
59
- /** The owning client's runtime. Defaults to the module-global bridge. */
60
- readonly runtime?: RuntimeContext;
61
- }
62
- /**
63
- * Handles a 'G' (group-change) delta. The server sends two shapes of this
64
- * delta, told apart by the payload:
65
- *
66
- * Incremental — `{ group, userId }`: the recipient was added to a single
67
- * sync group. No re-bootstrap follows; the newly visible entities arrive as
68
- * ordinary 'C' (covering) deltas through the normal insert path.
69
- *
70
- * Full diff — `{ addedGroups, removedGroups }`: one delta carrying the whole
71
- * membership change. This forces a full re-bootstrap (disconnect, reconnect,
72
- * and refetch), clearing cached data first if any group was removed.
73
- */
74
- export declare function handleSyncGroupChange(ctx: GroupChangeContext, delta: SyncDelta): Promise<void>;
75
- /**
76
- * Handles an incremental group-added delta. It records the new sync group in
77
- * the subscription metadata without forcing a re-bootstrap; the server then
78
- * sends a 'C' (covering) delta for each newly visible entity, which flows
79
- * through the normal insert path.
80
- */
81
- export declare function handleGroupAdded(ctx: GroupChangeContext, payload: GroupAddedPayload, syncId: number): Promise<void>;
82
- /**
83
- * Handles an 'S' (group-removed) delta, which signals the recipient has lost
84
- * access to a sync group. The client does not track which entities belong to
85
- * which group, so it cannot purge only the affected rows; instead it clears
86
- * local state and forces a re-bootstrap with the updated group list.
87
- */
88
- export declare function handleGroupRemoved(ctx: GroupChangeContext, delta: SyncDelta): Promise<void>;
89
- /** Computes the new sync-group set after applying the additions and removals in a diff. */
90
- export declare function computeUpdatedSyncGroups(ctx: GroupChangeContext, payload: SyncGroupChangePayload): string[];
91
- /**
92
- * Forces a full re-bootstrap by marking local storage as needing one,
93
- * disconnecting, and emitting a connection lifecycle event that the reconnect
94
- * path acts on. Does nothing for participants whose bootstrap mode is 'none':
95
- * they never pull a baseline, so after a trigger such as a sync-group shrink or
96
- * an access revocation they rely on covering deltas to repopulate the data they
97
- * subscribe to.
98
- */
99
- export declare function forceFullRebootstrap(ctx: GroupChangeContext): void;
100
- /**
101
- * Resolves the sync-group list this session subscribes to, and is the single
102
- * place that decision is made. The server-issued `context.syncGroups` is
103
- * authoritative; when it is absent, the session subscribes to no explicit
104
- * groups. {@link checkSyncGroupShrinkage} and connection setup both read
105
- * through here, so the live subscription and the access-revocation check can
106
- * never disagree.
107
- */
108
- export declare function resolveSyncGroups(context: {
109
- syncGroups?: readonly string[];
110
- }): readonly string[];
111
- /**
112
- * Compares the session's current sync groups against the set stored from the
113
- * last session. If any group is now missing, access has narrowed, so this
114
- * clears cached data and forces a full bootstrap before recording the new set.
115
- */
116
- export declare function checkSyncGroupShrinkage(ctx: GroupChangeContext): Promise<void>;
@@ -1,244 +0,0 @@
1
- /**
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.
8
- *
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
- */
12
- import { globalRuntime } from '../context.js';
13
- /** The context's runtime, falling back to the module-global bridge. */
14
- const runtimeOf = (ctx) => ctx.runtime ?? globalRuntime;
15
- /**
16
- * Marker returned when a group-change payload cannot be parsed, kept distinct
17
- * from a valid null or absent payload, which the handlers accept normally.
18
- */
19
- const MALFORMED_PAYLOAD = Symbol('malformed-group-change-payload');
20
- /**
21
- * Parses a group-change delta payload without ever throwing. The server sends
22
- * these as JSON strings. If a frame is corrupt, this returns
23
- * {@link MALFORMED_PAYLOAD} rather than raising, because an error escaping here
24
- * would leave the delta pipeline after the watermark has already advanced. The
25
- * delta is never re-delivered, so the security clear it carried would be lost.
26
- */
27
- function parseGroupChangePayload(delta, runtime) {
28
- if (typeof delta.data !== 'string')
29
- return delta.data;
30
- try {
31
- return JSON.parse(delta.data);
32
- }
33
- catch (error) {
34
- runtime.logger.debug('[BaseSyncedStore] Malformed group-change payload', {
35
- syncId: delta.id,
36
- actionType: delta.actionType,
37
- error: error instanceof Error ? error.message : String(error),
38
- });
39
- return MALFORMED_PAYLOAD;
40
- }
41
- }
42
- /**
43
- * Fallback for a group-change delta that could not be read. Because we know
44
- * access changed but not how, this treats it as a revocation: it clears cached
45
- * data from both local storage and the in-memory pool, then forces a full
46
- * re-bootstrap from the server.
47
- */
48
- async function clearForUnknownGroupChange(ctx, delta, kind) {
49
- runtimeOf(ctx).logger.debug(`[BaseSyncedStore] Unreadable ${kind} payload — clearing cached data and re-bootstrapping`, { syncId: delta.id });
50
- // Revoked data must not persist if the device goes offline before the
51
- // re-bootstrap, the same reasoning as the explicit removed-groups path.
52
- await ctx.database.clear();
53
- ctx.objectPool.clear();
54
- ctx.forceFullRebootstrap();
55
- }
56
- /**
57
- * Handles a 'G' (group-change) delta. The server sends two shapes of this
58
- * delta, told apart by the payload:
59
- *
60
- * Incremental — `{ group, userId }`: the recipient was added to a single
61
- * sync group. No re-bootstrap follows; the newly visible entities arrive as
62
- * ordinary 'C' (covering) deltas through the normal insert path.
63
- *
64
- * Full diff — `{ addedGroups, removedGroups }`: one delta carrying the whole
65
- * membership change. This forces a full re-bootstrap (disconnect, reconnect,
66
- * and refetch), clearing cached data first if any group was removed.
67
- */
68
- export async function handleSyncGroupChange(ctx, delta) {
69
- const raw = parseGroupChangePayload(delta, runtimeOf(ctx));
70
- if (raw === MALFORMED_PAYLOAD) {
71
- // The payload is unreadable, so we cannot tell which groups changed, and
72
- // this delta will never be re-delivered because the watermark has already
73
- // advanced. Fall back to the safe direction: assume a revocation, clear
74
- // cached data, and rebuild from the server rather than throwing.
75
- await clearForUnknownGroupChange(ctx, delta, 'sync-group change');
76
- return;
77
- }
78
- const rawObj = (raw ?? {});
79
- // Detect incremental payload shape: { group, userId }
80
- if (typeof rawObj.group === 'string' && typeof rawObj.userId === 'string') {
81
- const incremental = {
82
- group: rawObj.group,
83
- userId: rawObj.userId,
84
- };
85
- await ctx.handleGroupAdded(incremental, delta.id);
86
- return;
87
- }
88
- // Full-diff payload: { addedGroups, removedGroups }
89
- const payload = {
90
- removedGroups: rawObj.removedGroups ?? [],
91
- addedGroups: rawObj.addedGroups ?? [],
92
- };
93
- runtimeOf(ctx).logger.info('[BaseSyncedStore] Sync group change received (legacy)', {
94
- removedGroups: payload.removedGroups,
95
- addedGroups: payload.addedGroups,
96
- syncId: delta.id,
97
- });
98
- // If any groups were removed, clear cached data immediately so revoked data
99
- // cannot persist should the device go offline before the re-bootstrap
100
- // completes.
101
- if (payload.removedGroups.length > 0) {
102
- await ctx.database.clear();
103
- ctx.objectPool.clear();
104
- runtimeOf(ctx).logger.info('[BaseSyncedStore] Cleared cached data due to revoked sync groups', {
105
- removedGroups: payload.removedGroups,
106
- });
107
- }
108
- const updatedGroups = ctx.computeUpdatedSyncGroups(payload);
109
- await ctx.database.updateWorkspaceMetadata({ subscribedSyncGroups: updatedGroups });
110
- ctx.forceFullRebootstrap();
111
- }
112
- /**
113
- * Handles an incremental group-added delta. It records the new sync group in
114
- * the subscription metadata without forcing a re-bootstrap; the server then
115
- * sends a 'C' (covering) delta for each newly visible entity, which flows
116
- * through the normal insert path.
117
- */
118
- export async function handleGroupAdded(ctx, payload, syncId) {
119
- runtimeOf(ctx).logger.info('[BaseSyncedStore] Group added (incremental)', {
120
- group: payload.group,
121
- syncId,
122
- });
123
- const current = new Set(ctx.getSubscribedSyncGroups());
124
- current.add(payload.group);
125
- await ctx.database.updateWorkspaceMetadata({ subscribedSyncGroups: Array.from(current) });
126
- // No forceFullRebootstrap() here; the covering deltas will bring the entities.
127
- }
128
- /**
129
- * Handles an 'S' (group-removed) delta, which signals the recipient has lost
130
- * access to a sync group. The client does not track which entities belong to
131
- * which group, so it cannot purge only the affected rows; instead it clears
132
- * local state and forces a re-bootstrap with the updated group list.
133
- */
134
- export async function handleGroupRemoved(ctx, delta) {
135
- const raw = parseGroupChangePayload(delta, runtimeOf(ctx));
136
- if (raw === MALFORMED_PAYLOAD) {
137
- // The payload is unreadable: access was revoked but we cannot tell which
138
- // group. Fall back to a full clear, the safe direction for an
139
- // access-revocation delta, rather than throwing.
140
- await clearForUnknownGroupChange(ctx, delta, 'group-removed');
141
- return;
142
- }
143
- const rawObj = (raw ?? {});
144
- const groupKey = typeof rawObj.group === 'string' ? rawObj.group : undefined;
145
- if (!groupKey) {
146
- runtimeOf(ctx).logger.debug('[BaseSyncedStore] Group removed delta missing group key', {
147
- syncId: delta.id,
148
- });
149
- return;
150
- }
151
- runtimeOf(ctx).logger.info('[BaseSyncedStore] Group removed', {
152
- group: groupKey,
153
- syncId: delta.id,
154
- });
155
- // Clear cached data before the re-bootstrap so revoked-group data cannot
156
- // persist if the device goes offline between receiving this delta and
157
- // completing the re-bootstrap.
158
- await ctx.database.clear();
159
- ctx.objectPool.clear();
160
- // Update subscription metadata so the re-bootstrap fetches the
161
- // correct set of groups.
162
- const current = new Set(ctx.getSubscribedSyncGroups());
163
- current.delete(groupKey);
164
- await ctx.database.updateWorkspaceMetadata({ subscribedSyncGroups: Array.from(current) });
165
- ctx.forceFullRebootstrap();
166
- }
167
- /** Computes the new sync-group set after applying the additions and removals in a diff. */
168
- export function computeUpdatedSyncGroups(ctx, payload) {
169
- const current = new Set(ctx.getSubscribedSyncGroups());
170
- for (const g of payload.removedGroups)
171
- current.delete(g);
172
- for (const g of payload.addedGroups)
173
- current.add(g);
174
- return Array.from(current);
175
- }
176
- /**
177
- * Forces a full re-bootstrap by marking local storage as needing one,
178
- * disconnecting, and emitting a connection lifecycle event that the reconnect
179
- * path acts on. Does nothing for participants whose bootstrap mode is 'none':
180
- * they never pull a baseline, so after a trigger such as a sync-group shrink or
181
- * an access revocation they rely on covering deltas to repopulate the data they
182
- * subscribe to.
183
- */
184
- export function forceFullRebootstrap(ctx) {
185
- if (ctx.getBootstrapMode() === 'none') {
186
- runtimeOf(ctx).logger.info('[BaseSyncedStore] forceFullRebootstrap skipped (bootstrapMode=none)');
187
- return;
188
- }
189
- ctx.database.markRequiresFullBootstrap();
190
- ctx.disconnectWebSocket();
191
- ctx.emitConnectionEvent('WS_DISCONNECTED');
192
- }
193
- /**
194
- * Resolves the sync-group list this session subscribes to, and is the single
195
- * place that decision is made. The server-issued `context.syncGroups` is
196
- * authoritative; when it is absent, the session subscribes to no explicit
197
- * groups. {@link checkSyncGroupShrinkage} and connection setup both read
198
- * through here, so the live subscription and the access-revocation check can
199
- * never disagree.
200
- */
201
- export function resolveSyncGroups(context) {
202
- if (context.syncGroups && context.syncGroups.length > 0) {
203
- return context.syncGroups;
204
- }
205
- return [];
206
- }
207
- /**
208
- * Compares the session's current sync groups against the set stored from the
209
- * last session. If any group is now missing, access has narrowed, so this
210
- * clears cached data and forces a full bootstrap before recording the new set.
211
- */
212
- export async function checkSyncGroupShrinkage(ctx) {
213
- const currentSyncGroups = ctx.getCurrentSyncGroups();
214
- if (!currentSyncGroups)
215
- return;
216
- try {
217
- const metadata = await ctx.database.getWorkspaceMetadata();
218
- const stored = metadata?.subscribedSyncGroups ?? [];
219
- if (stored.length === 0)
220
- return;
221
- const currentGroups = new Set(currentSyncGroups);
222
- const removedGroups = stored.filter((g) => !currentGroups.has(g));
223
- if (removedGroups.length > 0) {
224
- runtimeOf(ctx).logger.info('[BaseSyncedStore] Sync groups shrank — forcing full bootstrap', {
225
- removedGroups,
226
- storedCount: stored.length,
227
- currentCount: currentGroups.size,
228
- });
229
- // Clear cached data before the re-bootstrap so revoked-group data cannot
230
- // persist if the device goes offline first.
231
- await ctx.database.clear();
232
- ctx.objectPool.clear();
233
- ctx.database.markRequiresFullBootstrap();
234
- }
235
- await ctx.database.updateWorkspaceMetadata({
236
- subscribedSyncGroups: Array.from(currentGroups),
237
- });
238
- }
239
- catch (error) {
240
- runtimeOf(ctx).logger.debug('[BaseSyncedStore] Failed to check sync group shrinkage', {
241
- error: error instanceof Error ? error.message : String(error),
242
- });
243
- }
244
- }