@abloatai/ablo 0.35.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (622) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +71 -1929
  3. package/NOTICE +2 -2
  4. package/README.md +23 -532
  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 -112
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +3 -161
  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 +2 -2
  59. package/docs/api-keys.md +13 -12
  60. package/docs/api.md +15 -53
  61. package/docs/audit.md +4 -3
  62. package/docs/cli.md +11 -11
  63. package/docs/client-behavior.md +9 -9
  64. package/docs/concurrency-convention.md +28 -42
  65. package/docs/coordination.md +228 -86
  66. package/docs/data-sources.md +5 -5
  67. package/docs/debugging.md +34 -12
  68. package/docs/deployment.md +8 -8
  69. package/docs/examples/agent-human.md +4 -4
  70. package/docs/examples/ai-sdk-tool.md +1 -1
  71. package/docs/examples/existing-python-backend.md +15 -4
  72. package/docs/examples/nextjs.md +27 -6
  73. package/docs/examples/scoped-agent.md +3 -3
  74. package/docs/examples/server-agent.md +2 -2
  75. package/docs/groups.md +57 -3
  76. package/docs/guarantees.md +37 -10
  77. package/docs/how-it-works.md +32 -8
  78. package/docs/idempotency.md +6 -6
  79. package/docs/identity.md +24 -24
  80. package/docs/index.md +8 -8
  81. package/docs/integration-guide.md +38 -16
  82. package/docs/internal/README.md +18 -0
  83. package/docs/internal/agent-fleet-coordination-design.md +171 -0
  84. package/docs/internal/agent-orchestration.md +58 -0
  85. package/docs/internal/commit-identifiers.md +91 -0
  86. package/docs/internal/concurrency-open-decisions.md +37 -0
  87. package/docs/internal/data-source-reverse-channel.md +150 -0
  88. package/docs/internal/per-field-conflict-detection.md +165 -0
  89. package/docs/internal/postgres-replication.md +64 -0
  90. package/docs/internal/serializable-schema.md +119 -0
  91. package/docs/internal/structure.md +32 -0
  92. package/docs/mcp.md +9 -9
  93. package/docs/migration.md +37 -18
  94. package/docs/projects.md +1 -1
  95. package/docs/quickstart.md +2 -2
  96. package/docs/react.md +24 -13
  97. package/docs/schema-contract.md +3 -3
  98. package/docs/sessions.md +91 -37
  99. package/docs/webhooks.md +9 -9
  100. package/examples/README.md +2 -2
  101. package/examples/data-source/README.md +1 -1
  102. package/examples/data-source/ablo-driver.ts +1 -1
  103. package/examples/data-source/customer-server.ts +1 -1
  104. package/examples/data-source/run.ts +1 -1
  105. package/examples/data-source/schema.ts +1 -1
  106. package/examples/quickstart.ts +2 -2
  107. package/llms.txt +12 -12
  108. package/package.json +64 -174
  109. package/dist/BaseSyncedStore.d.ts +0 -823
  110. package/dist/BaseSyncedStore.js +0 -1955
  111. package/dist/Database.d.ts +0 -335
  112. package/dist/Database.js +0 -1500
  113. package/dist/InstanceCache.d.ts +0 -233
  114. package/dist/InstanceCache.js +0 -1164
  115. package/dist/LazyReferenceCollection.d.ts +0 -177
  116. package/dist/LazyReferenceCollection.js +0 -461
  117. package/dist/Model.d.ts +0 -444
  118. package/dist/Model.js +0 -909
  119. package/dist/ModelRegistry.d.ts +0 -221
  120. package/dist/ModelRegistry.js +0 -537
  121. package/dist/NetworkMonitor.d.ts +0 -26
  122. package/dist/NetworkMonitor.js +0 -77
  123. package/dist/RuntimeContext.d.ts +0 -52
  124. package/dist/RuntimeContext.js +0 -80
  125. package/dist/SyncClient.d.ts +0 -551
  126. package/dist/SyncClient.js +0 -2199
  127. package/dist/adapters/alwaysOnline.d.ts +0 -14
  128. package/dist/adapters/alwaysOnline.js +0 -17
  129. package/dist/adapters/inMemoryStorage.d.ts +0 -31
  130. package/dist/adapters/inMemoryStorage.js +0 -110
  131. package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
  132. package/dist/ai-sdk/coordinatedTool.js +0 -134
  133. package/dist/ai-sdk/coordinationContext.d.ts +0 -46
  134. package/dist/ai-sdk/coordinationContext.js +0 -106
  135. package/dist/ai-sdk/index.d.ts +0 -121
  136. package/dist/ai-sdk/index.js +0 -121
  137. package/dist/ai-sdk/wrap.d.ts +0 -65
  138. package/dist/ai-sdk/wrap.js +0 -39
  139. package/dist/auth/index.d.ts +0 -1
  140. package/dist/auth/index.js +0 -8
  141. package/dist/batching/index.d.ts +0 -55
  142. package/dist/batching/index.js +0 -147
  143. package/dist/cli.cjs +0 -288600
  144. package/dist/client/Ablo.d.ts +0 -231
  145. package/dist/client/Ablo.js +0 -149
  146. package/dist/client/abloClient.d.ts +0 -309
  147. package/dist/client/abloClient.js +0 -13
  148. package/dist/client/clientPrelude.d.ts +0 -52
  149. package/dist/client/clientPrelude.js +0 -60
  150. package/dist/client/consoleLogger.d.ts +0 -35
  151. package/dist/client/consoleLogger.js +0 -44
  152. package/dist/client/coreClient.d.ts +0 -60
  153. package/dist/client/coreClient.js +0 -118
  154. package/dist/client/createInternalComponents.d.ts +0 -46
  155. package/dist/client/createInternalComponents.js +0 -92
  156. package/dist/client/createModelProxy.d.ts +0 -228
  157. package/dist/client/createModelProxy.js +0 -818
  158. package/dist/client/humans.d.ts +0 -48
  159. package/dist/client/humans.js +0 -52
  160. package/dist/client/modelRegistration.d.ts +0 -10
  161. package/dist/client/modelRegistration.js +0 -312
  162. package/dist/client/options.d.ts +0 -461
  163. package/dist/client/options.js +0 -7
  164. package/dist/client/reactiveEngine.d.ts +0 -48
  165. package/dist/client/reactiveEngine.js +0 -910
  166. package/dist/client/resourceTypes.d.ts +0 -12
  167. package/dist/client/resourceTypes.js +0 -10
  168. package/dist/client/schemaConfig.d.ts +0 -44
  169. package/dist/client/schemaConfig.js +0 -185
  170. package/dist/client/validateAbloOptions.d.ts +0 -42
  171. package/dist/client/validateAbloOptions.js +0 -43
  172. package/dist/client/wsMutationExecutor.d.ts +0 -27
  173. package/dist/client/wsMutationExecutor.js +0 -72
  174. package/dist/context.d.ts +0 -29
  175. package/dist/context.js +0 -58
  176. package/dist/coordination/ClaimLog.d.ts +0 -26
  177. package/dist/coordination/ClaimLog.js +0 -32
  178. package/dist/coordination/index.d.ts +0 -1
  179. package/dist/coordination/index.js +0 -8
  180. package/dist/core/DatabaseManager.d.ts +0 -105
  181. package/dist/core/DatabaseManager.js +0 -387
  182. package/dist/core/QueryProcessor.d.ts +0 -75
  183. package/dist/core/QueryProcessor.js +0 -255
  184. package/dist/core/QueryView.d.ts +0 -79
  185. package/dist/core/QueryView.js +0 -218
  186. package/dist/core/StoreManager.d.ts +0 -112
  187. package/dist/core/StoreManager.js +0 -302
  188. package/dist/core/ViewRegistry.d.ts +0 -20
  189. package/dist/core/ViewRegistry.js +0 -55
  190. package/dist/core/index.d.ts +0 -33
  191. package/dist/core/index.js +0 -48
  192. package/dist/core/openIDBWithTimeout.d.ts +0 -65
  193. package/dist/core/openIDBWithTimeout.js +0 -153
  194. package/dist/core/queryUtils.d.ts +0 -45
  195. package/dist/core/queryUtils.js +0 -69
  196. package/dist/core/storeContract.d.ts +0 -145
  197. package/dist/core/storeContract.js +0 -12
  198. package/dist/docs/catalog.d.ts +0 -72
  199. package/dist/docs/catalog.js +0 -227
  200. package/dist/docs/index.d.ts +0 -10
  201. package/dist/docs/index.js +0 -10
  202. package/dist/environment.d.ts +0 -1
  203. package/dist/environment.js +0 -8
  204. package/dist/interfaces/index.d.ts +0 -311
  205. package/dist/interfaces/index.js +0 -9
  206. package/dist/keys/index.d.ts +0 -1
  207. package/dist/keys/index.js +0 -8
  208. package/dist/mutators/RecordingMutation.d.ts +0 -36
  209. package/dist/mutators/RecordingMutation.js +0 -182
  210. package/dist/mutators/Transaction.d.ts +0 -40
  211. package/dist/mutators/Transaction.js +0 -58
  212. package/dist/mutators/UndoManager.d.ts +0 -258
  213. package/dist/mutators/UndoManager.js +0 -658
  214. package/dist/mutators/defineMutators.d.ts +0 -60
  215. package/dist/mutators/defineMutators.js +0 -18
  216. package/dist/mutators/inverseOp.d.ts +0 -126
  217. package/dist/mutators/inverseOp.js +0 -71
  218. package/dist/mutators/mutateActions.d.ts +0 -45
  219. package/dist/mutators/mutateActions.js +0 -105
  220. package/dist/mutators/readerActions.d.ts +0 -33
  221. package/dist/mutators/readerActions.js +0 -57
  222. package/dist/mutators/undoApply.d.ts +0 -51
  223. package/dist/mutators/undoApply.js +0 -117
  224. package/dist/policy/index.d.ts +0 -21
  225. package/dist/policy/index.js +0 -20
  226. package/dist/query/client.d.ts +0 -61
  227. package/dist/query/client.js +0 -137
  228. package/dist/query/types.d.ts +0 -85
  229. package/dist/query/types.js +0 -16
  230. package/dist/react/AbloProvider.d.ts +0 -230
  231. package/dist/react/AbloProvider.js +0 -455
  232. package/dist/react/ClientSideSuspense.d.ts +0 -36
  233. package/dist/react/ClientSideSuspense.js +0 -17
  234. package/dist/react/DefaultFallback.d.ts +0 -24
  235. package/dist/react/DefaultFallback.js +0 -43
  236. package/dist/react/context.d.ts +0 -55
  237. package/dist/react/context.js +0 -29
  238. package/dist/react/index.d.ts +0 -61
  239. package/dist/react/index.js +0 -66
  240. package/dist/react/internalContext.d.ts +0 -33
  241. package/dist/react/internalContext.js +0 -3
  242. package/dist/react/useAblo.d.ts +0 -75
  243. package/dist/react/useAblo.js +0 -102
  244. package/dist/react/useCurrentUserId.d.ts +0 -22
  245. package/dist/react/useCurrentUserId.js +0 -34
  246. package/dist/react/useErrorListener.d.ts +0 -20
  247. package/dist/react/useErrorListener.js +0 -38
  248. package/dist/react/useMutationFailureListener.d.ts +0 -26
  249. package/dist/react/useMutationFailureListener.js +0 -38
  250. package/dist/react/useMutators.d.ts +0 -56
  251. package/dist/react/useMutators.js +0 -84
  252. package/dist/react/useReactive.d.ts +0 -35
  253. package/dist/react/useReactive.js +0 -123
  254. package/dist/react/useSyncStatus.d.ts +0 -59
  255. package/dist/react/useSyncStatus.js +0 -76
  256. package/dist/react/useUndoScope.d.ts +0 -34
  257. package/dist/react/useUndoScope.js +0 -81
  258. package/dist/schema/coordination.d.ts +0 -112
  259. package/dist/schema/coordination.js +0 -129
  260. package/dist/schema/ddl.d.ts +0 -97
  261. package/dist/schema/ddl.js +0 -491
  262. package/dist/schema/ddlLock.d.ts +0 -35
  263. package/dist/schema/ddlLock.js +0 -46
  264. package/dist/schema/diff.d.ts +0 -225
  265. package/dist/schema/diff.js +0 -289
  266. package/dist/schema/generate.d.ts +0 -19
  267. package/dist/schema/generate.js +0 -86
  268. package/dist/schema/index.d.ts +0 -41
  269. package/dist/schema/index.js +0 -76
  270. package/dist/schema/queries.d.ts +0 -201
  271. package/dist/schema/queries.js +0 -144
  272. package/dist/schema/select.d.ts +0 -40
  273. package/dist/schema/select.js +0 -87
  274. package/dist/schema/serialize.d.ts +0 -115
  275. package/dist/schema/serialize.js +0 -262
  276. package/dist/schema/sugar.d.ts +0 -109
  277. package/dist/schema/sugar.js +0 -83
  278. package/dist/schema/syncDeltaRow.d.ts +0 -6
  279. package/dist/schema/syncDeltaRow.js +0 -6
  280. package/dist/server/adapter.d.ts +0 -173
  281. package/dist/server/adapter.js +0 -18
  282. package/dist/server/commit.d.ts +0 -107
  283. package/dist/server/commit.js +0 -1
  284. package/dist/server/index.d.ts +0 -14
  285. package/dist/server/index.js +0 -2
  286. package/dist/server/readConfig.d.ts +0 -80
  287. package/dist/server/readConfig.js +0 -8
  288. package/dist/server/storageMode.d.ts +0 -23
  289. package/dist/server/storageMode.js +0 -17
  290. package/dist/source/adapter.d.ts +0 -81
  291. package/dist/source/adapter.js +0 -22
  292. package/dist/source/adapters/drizzle.d.ts +0 -48
  293. package/dist/source/adapters/drizzle.js +0 -219
  294. package/dist/source/adapters/kysely.d.ts +0 -42
  295. package/dist/source/adapters/kysely.js +0 -205
  296. package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
  297. package/dist/source/adapters/kyselyMutationCore.js +0 -125
  298. package/dist/source/adapters/memory.d.ts +0 -13
  299. package/dist/source/adapters/memory.js +0 -130
  300. package/dist/source/adapters/prisma.d.ts +0 -63
  301. package/dist/source/adapters/prisma.js +0 -202
  302. package/dist/source/conformance.d.ts +0 -37
  303. package/dist/source/conformance.js +0 -215
  304. package/dist/source/connector.d.ts +0 -95
  305. package/dist/source/connector.js +0 -266
  306. package/dist/source/connectorProtocol.d.ts +0 -154
  307. package/dist/source/connectorProtocol.js +0 -163
  308. package/dist/source/contract.d.ts +0 -195
  309. package/dist/source/contract.js +0 -164
  310. package/dist/source/factory.d.ts +0 -92
  311. package/dist/source/factory.js +0 -286
  312. package/dist/source/footprint.d.ts +0 -111
  313. package/dist/source/footprint.js +0 -0
  314. package/dist/source/idempotency.d.ts +0 -61
  315. package/dist/source/idempotency.js +0 -144
  316. package/dist/source/index.d.ts +0 -23
  317. package/dist/source/index.js +0 -30
  318. package/dist/source/migrations.d.ts +0 -21
  319. package/dist/source/migrations.js +0 -103
  320. package/dist/source/next.d.ts +0 -32
  321. package/dist/source/next.js +0 -25
  322. package/dist/source/pushQueue.d.ts +0 -134
  323. package/dist/source/pushQueue.js +0 -256
  324. package/dist/source/signing.d.ts +0 -92
  325. package/dist/source/signing.js +0 -162
  326. package/dist/source/types.d.ts +0 -401
  327. package/dist/source/types.js +0 -59
  328. package/dist/stores/ObjectStore.d.ts +0 -115
  329. package/dist/stores/ObjectStore.js +0 -393
  330. package/dist/stores/ObjectStoreContract.d.ts +0 -38
  331. package/dist/stores/ObjectStoreContract.js +0 -1
  332. package/dist/stores/SyncActionStore.d.ts +0 -97
  333. package/dist/stores/SyncActionStore.js +0 -504
  334. package/dist/stores/syncAction.d.ts +0 -26
  335. package/dist/stores/syncAction.js +0 -16
  336. package/dist/surface.d.ts +0 -36
  337. package/dist/surface.js +0 -75
  338. package/dist/sync/BootstrapFetcher.d.ts +0 -280
  339. package/dist/sync/BootstrapFetcher.js +0 -962
  340. package/dist/sync/ConnectionManager.d.ts +0 -8
  341. package/dist/sync/ConnectionManager.js +0 -8
  342. package/dist/sync/OnDemandLoader.d.ts +0 -228
  343. package/dist/sync/OnDemandLoader.js +0 -742
  344. package/dist/sync/SubscriptionManager.d.ts +0 -159
  345. package/dist/sync/SubscriptionManager.js +0 -243
  346. package/dist/sync/SyncWebSocket.d.ts +0 -173
  347. package/dist/sync/SyncWebSocket.js +0 -438
  348. package/dist/sync/awaitClaimGrant.d.ts +0 -6
  349. package/dist/sync/awaitClaimGrant.js +0 -6
  350. package/dist/sync/bootstrapApply.d.ts +0 -70
  351. package/dist/sync/bootstrapApply.js +0 -73
  352. package/dist/sync/commitFrames.d.ts +0 -8
  353. package/dist/sync/commitFrames.js +0 -8
  354. package/dist/sync/contextPorts.d.ts +0 -18
  355. package/dist/sync/contextPorts.js +0 -31
  356. package/dist/sync/createClaimStream.d.ts +0 -7
  357. package/dist/sync/createClaimStream.js +0 -7
  358. package/dist/sync/createPresenceStream.d.ts +0 -69
  359. package/dist/sync/createPresenceStream.js +0 -200
  360. package/dist/sync/createSnapshot.d.ts +0 -29
  361. package/dist/sync/createSnapshot.js +0 -118
  362. package/dist/sync/credentialLifecycle.d.ts +0 -7
  363. package/dist/sync/credentialLifecycle.js +0 -7
  364. package/dist/sync/deltaPipeline.d.ts +0 -113
  365. package/dist/sync/deltaPipeline.js +0 -261
  366. package/dist/sync/groupChange.d.ts +0 -113
  367. package/dist/sync/groupChange.js +0 -242
  368. package/dist/sync/participants.d.ts +0 -115
  369. package/dist/sync/participants.js +0 -344
  370. package/dist/sync/persistedPrefix.d.ts +0 -12
  371. package/dist/sync/persistedPrefix.js +0 -22
  372. package/dist/sync/schemaDrift.d.ts +0 -55
  373. package/dist/sync/schemaDrift.js +0 -53
  374. package/dist/sync/schemas.d.ts +0 -70
  375. package/dist/sync/schemas.js +0 -94
  376. package/dist/sync/syncCursor.d.ts +0 -40
  377. package/dist/sync/syncCursor.js +0 -55
  378. package/dist/sync/syncPlan.d.ts +0 -54
  379. package/dist/sync/syncPlan.js +0 -50
  380. package/dist/sync/wsFrameHandlers.d.ts +0 -8
  381. package/dist/sync/wsFrameHandlers.js +0 -8
  382. package/dist/testing/fixtures/bootstrap.d.ts +0 -49
  383. package/dist/testing/fixtures/bootstrap.js +0 -59
  384. package/dist/testing/fixtures/deltas.d.ts +0 -83
  385. package/dist/testing/fixtures/deltas.js +0 -136
  386. package/dist/testing/fixtures/httpResponses.d.ts +0 -70
  387. package/dist/testing/fixtures/httpResponses.js +0 -90
  388. package/dist/testing/fixtures/models.d.ts +0 -83
  389. package/dist/testing/fixtures/models.js +0 -272
  390. package/dist/testing/helpers/reactWrapper.d.ts +0 -69
  391. package/dist/testing/helpers/reactWrapper.js +0 -67
  392. package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
  393. package/dist/testing/helpers/syncEngineHarness.js +0 -73
  394. package/dist/testing/helpers/wait.d.ts +0 -30
  395. package/dist/testing/helpers/wait.js +0 -49
  396. package/dist/testing/index.d.ts +0 -23
  397. package/dist/testing/index.js +0 -33
  398. package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
  399. package/dist/testing/mocks/FakeDatabase.js +0 -10
  400. package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
  401. package/dist/testing/mocks/MockMutationExecutor.js +0 -186
  402. package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
  403. package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
  404. package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
  405. package/dist/testing/mocks/MockSyncContext.js +0 -72
  406. package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
  407. package/dist/testing/mocks/MockSyncStore.js +0 -171
  408. package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
  409. package/dist/testing/mocks/MockWebSocket.js +0 -118
  410. package/dist/transaction/ablo.d.ts +0 -88
  411. package/dist/transaction/ablo.js +0 -33
  412. package/dist/transaction/auth/apiKey.d.ts +0 -152
  413. package/dist/transaction/auth/apiKey.js +0 -419
  414. package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
  415. package/dist/transaction/auth/bootstrapScope.js +0 -1
  416. package/dist/transaction/auth/capability.d.ts +0 -177
  417. package/dist/transaction/auth/capability.js +0 -199
  418. package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
  419. package/dist/transaction/auth/credentialEndpoint.js +0 -86
  420. package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
  421. package/dist/transaction/auth/credentialPolicy.js +0 -125
  422. package/dist/transaction/auth/credentialSource.d.ts +0 -30
  423. package/dist/transaction/auth/credentialSource.js +0 -55
  424. package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
  425. package/dist/transaction/auth/hostedEndpoints.js +0 -21
  426. package/dist/transaction/auth/identity.d.ts +0 -55
  427. package/dist/transaction/auth/identity.js +0 -210
  428. package/dist/transaction/auth/index.d.ts +0 -162
  429. package/dist/transaction/auth/index.js +0 -304
  430. package/dist/transaction/auth/schemas.d.ts +0 -59
  431. package/dist/transaction/auth/schemas.js +0 -85
  432. package/dist/transaction/auth/sessionMint.d.ts +0 -28
  433. package/dist/transaction/auth/sessionMint.js +0 -85
  434. package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
  435. package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
  436. package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
  437. package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
  438. package/dist/transaction/coordination/claimMeta.d.ts +0 -49
  439. package/dist/transaction/coordination/claimMeta.js +0 -52
  440. package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
  441. package/dist/transaction/coordination/createClaimStream.js +0 -475
  442. package/dist/transaction/coordination/events.d.ts +0 -74
  443. package/dist/transaction/coordination/events.js +0 -7
  444. package/dist/transaction/coordination/index.d.ts +0 -19
  445. package/dist/transaction/coordination/index.js +0 -44
  446. package/dist/transaction/coordination/locator.d.ts +0 -83
  447. package/dist/transaction/coordination/locator.js +0 -82
  448. package/dist/transaction/coordination/schema.d.ts +0 -1473
  449. package/dist/transaction/coordination/schema.js +0 -1013
  450. package/dist/transaction/coordination/targetConflict.d.ts +0 -2
  451. package/dist/transaction/coordination/targetConflict.js +0 -103
  452. package/dist/transaction/coordination/trace.d.ts +0 -78
  453. package/dist/transaction/coordination/trace.js +0 -138
  454. package/dist/transaction/durableWrites.d.ts +0 -62
  455. package/dist/transaction/durableWrites.js +0 -71
  456. package/dist/transaction/environment.d.ts +0 -105
  457. package/dist/transaction/environment.js +0 -108
  458. package/dist/transaction/errorCodes.d.ts +0 -403
  459. package/dist/transaction/errorCodes.js +0 -480
  460. package/dist/transaction/errors.d.ts +0 -428
  461. package/dist/transaction/errors.js +0 -686
  462. package/dist/transaction/index.d.ts +0 -20
  463. package/dist/transaction/index.js +0 -20
  464. package/dist/transaction/keys/index.d.ts +0 -87
  465. package/dist/transaction/keys/index.js +0 -207
  466. package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
  467. package/dist/transaction/log/syncDeltaRow.js +0 -95
  468. package/dist/transaction/logPosition.d.ts +0 -97
  469. package/dist/transaction/logPosition.js +0 -125
  470. package/dist/transaction/logger.d.ts +0 -16
  471. package/dist/transaction/logger.js +0 -7
  472. package/dist/transaction/observability.d.ts +0 -53
  473. package/dist/transaction/observability.js +0 -19
  474. package/dist/transaction/persistence.d.ts +0 -12
  475. package/dist/transaction/persistence.js +0 -11
  476. package/dist/transaction/plugin.d.ts +0 -192
  477. package/dist/transaction/plugin.js +0 -87
  478. package/dist/transaction/policy/types.d.ts +0 -217
  479. package/dist/transaction/policy/types.js +0 -126
  480. package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
  481. package/dist/transaction/resources/functionalUpdate.js +0 -87
  482. package/dist/transaction/resources/httpResources.d.ts +0 -266
  483. package/dist/transaction/resources/httpResources.js +0 -7
  484. package/dist/transaction/resources/modelOperations.d.ts +0 -319
  485. package/dist/transaction/resources/modelOperations.js +0 -12
  486. package/dist/transaction/resources/mutationOptions.d.ts +0 -66
  487. package/dist/transaction/resources/mutationOptions.js +0 -9
  488. package/dist/transaction/resources/where.d.ts +0 -85
  489. package/dist/transaction/resources/where.js +0 -70
  490. package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
  491. package/dist/transaction/resources/writeOptionsSchema.js +0 -73
  492. package/dist/transaction/schema/field.d.ts +0 -126
  493. package/dist/transaction/schema/field.js +0 -265
  494. package/dist/transaction/schema/loadStrategy.d.ts +0 -45
  495. package/dist/transaction/schema/loadStrategy.js +0 -46
  496. package/dist/transaction/schema/model.d.ts +0 -379
  497. package/dist/transaction/schema/model.js +0 -123
  498. package/dist/transaction/schema/openapi.d.ts +0 -57
  499. package/dist/transaction/schema/openapi.js +0 -340
  500. package/dist/transaction/schema/relation.d.ts +0 -199
  501. package/dist/transaction/schema/relation.js +0 -104
  502. package/dist/transaction/schema/residency.d.ts +0 -29
  503. package/dist/transaction/schema/residency.js +0 -25
  504. package/dist/transaction/schema/roles.d.ts +0 -249
  505. package/dist/transaction/schema/roles.js +0 -230
  506. package/dist/transaction/schema/schema.d.ts +0 -324
  507. package/dist/transaction/schema/schema.js +0 -305
  508. package/dist/transaction/schema/tenancy.d.ts +0 -139
  509. package/dist/transaction/schema/tenancy.js +0 -190
  510. package/dist/transaction/transactionLayer.d.ts +0 -82
  511. package/dist/transaction/transactionLayer.js +0 -24
  512. package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
  513. package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
  514. package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
  515. package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
  516. package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
  517. package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
  518. package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
  519. package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
  520. package/dist/transaction/transport/commitFrames.d.ts +0 -90
  521. package/dist/transaction/transport/commitFrames.js +0 -134
  522. package/dist/transaction/transport/connectionManager.d.ts +0 -215
  523. package/dist/transaction/transport/connectionManager.js +0 -673
  524. package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
  525. package/dist/transaction/transport/credentialLifecycle.js +0 -324
  526. package/dist/transaction/transport/heartbeat.d.ts +0 -65
  527. package/dist/transaction/transport/heartbeat.js +0 -93
  528. package/dist/transaction/transport/httpClient.d.ts +0 -123
  529. package/dist/transaction/transport/httpClient.js +0 -145
  530. package/dist/transaction/transport/httpOptions.d.ts +0 -33
  531. package/dist/transaction/transport/httpOptions.js +0 -12
  532. package/dist/transaction/transport/httpTransport.d.ts +0 -8
  533. package/dist/transaction/transport/httpTransport.js +0 -1276
  534. package/dist/transaction/transport/networkProbe.d.ts +0 -84
  535. package/dist/transaction/transport/networkProbe.js +0 -207
  536. package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
  537. package/dist/transaction/transport/wsFrameHandlers.js +0 -429
  538. package/dist/transaction/transport/wsTransport.d.ts +0 -576
  539. package/dist/transaction/transport/wsTransport.js +0 -1017
  540. package/dist/transaction/types/assertExact.d.ts +0 -17
  541. package/dist/transaction/types/assertExact.js +0 -1
  542. package/dist/transaction/types/global.d.ts +0 -107
  543. package/dist/transaction/types/global.js +0 -40
  544. package/dist/transaction/types/index.d.ts +0 -205
  545. package/dist/transaction/types/index.js +0 -56
  546. package/dist/transaction/types/modelData.d.ts +0 -10
  547. package/dist/transaction/types/modelData.js +0 -9
  548. package/dist/transaction/types/participant.d.ts +0 -20
  549. package/dist/transaction/types/participant.js +0 -10
  550. package/dist/transaction/types/streams.d.ts +0 -540
  551. package/dist/transaction/types/streams.js +0 -11
  552. package/dist/transaction/utils/asyncIterator.d.ts +0 -34
  553. package/dist/transaction/utils/asyncIterator.js +0 -135
  554. package/dist/transaction/utils/duration.d.ts +0 -25
  555. package/dist/transaction/utils/duration.js +0 -45
  556. package/dist/transaction/utils/json.d.ts +0 -57
  557. package/dist/transaction/utils/json.js +0 -276
  558. package/dist/transaction/wire/accountResponses.d.ts +0 -351
  559. package/dist/transaction/wire/accountResponses.js +0 -255
  560. package/dist/transaction/wire/auth.d.ts +0 -49
  561. package/dist/transaction/wire/auth.js +0 -57
  562. package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
  563. package/dist/transaction/wire/bootstrapReason.js +0 -8
  564. package/dist/transaction/wire/claimEvent.d.ts +0 -76
  565. package/dist/transaction/wire/claimEvent.js +0 -73
  566. package/dist/transaction/wire/claims.d.ts +0 -463
  567. package/dist/transaction/wire/claims.js +0 -229
  568. package/dist/transaction/wire/commit.d.ts +0 -603
  569. package/dist/transaction/wire/commit.js +0 -321
  570. package/dist/transaction/wire/delta.d.ts +0 -250
  571. package/dist/transaction/wire/delta.js +0 -147
  572. package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
  573. package/dist/transaction/wire/errorEnvelope.js +0 -123
  574. package/dist/transaction/wire/feedCursor.d.ts +0 -60
  575. package/dist/transaction/wire/feedCursor.js +0 -82
  576. package/dist/transaction/wire/feedEvent.d.ts +0 -177
  577. package/dist/transaction/wire/feedEvent.js +0 -39
  578. package/dist/transaction/wire/frames.d.ts +0 -194
  579. package/dist/transaction/wire/frames.js +0 -50
  580. package/dist/transaction/wire/inboundFrames.d.ts +0 -552
  581. package/dist/transaction/wire/inboundFrames.js +0 -116
  582. package/dist/transaction/wire/index.d.ts +0 -50
  583. package/dist/transaction/wire/index.js +0 -74
  584. package/dist/transaction/wire/listEnvelope.d.ts +0 -37
  585. package/dist/transaction/wire/listEnvelope.js +0 -42
  586. package/dist/transaction/wire/modelResponses.d.ts +0 -85
  587. package/dist/transaction/wire/modelResponses.js +0 -43
  588. package/dist/transaction/wire/protocol.d.ts +0 -38
  589. package/dist/transaction/wire/protocol.js +0 -38
  590. package/dist/transaction/wire/protocolVersion.d.ts +0 -73
  591. package/dist/transaction/wire/protocolVersion.js +0 -83
  592. package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
  593. package/dist/transactions/mutations/MutationQueue.js +0 -2797
  594. package/dist/transactions/mutations/MutationStore.d.ts +0 -20
  595. package/dist/transactions/mutations/MutationStore.js +0 -53
  596. package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
  597. package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
  598. package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
  599. package/dist/transactions/mutations/coalesceRules.js +0 -140
  600. package/dist/transactions/mutations/commitLatency.d.ts +0 -52
  601. package/dist/transactions/mutations/commitLatency.js +0 -130
  602. package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
  603. package/dist/transactions/mutations/commitOutboxStore.js +0 -26
  604. package/dist/transactions/mutations/commitPayload.d.ts +0 -164
  605. package/dist/transactions/mutations/commitPayload.js +0 -152
  606. package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
  607. package/dist/transactions/mutations/deltaConfirmation.js +0 -233
  608. package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
  609. package/dist/transactions/mutations/durableWriteStore.js +0 -12
  610. package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
  611. package/dist/transactions/mutations/optimisticApply.js +0 -65
  612. package/dist/transactions/mutations/replayValidation.d.ts +0 -186
  613. package/dist/transactions/mutations/replayValidation.js +0 -163
  614. package/dist/utils/mobxSetup.d.ts +0 -53
  615. package/dist/utils/mobxSetup.js +0 -330
  616. package/dist/webhooks/events.d.ts +0 -43
  617. package/dist/webhooks/events.js +0 -42
  618. package/dist/webhooks/index.d.ts +0 -8
  619. package/dist/webhooks/index.js +0 -8
  620. package/dist/wire/index.d.ts +0 -1
  621. package/dist/wire/index.js +0 -8
  622. package/docs/interaction-model.md +0 -99
@@ -1,429 +0,0 @@
1
- /**
2
- * Routes each inbound frame from the sync WebSocket to the handler for its
3
- * type. Handlers work against a minimal {@link WsSession} interface — only
4
- * the members they actually touch, rather than the transport object itself,
5
- * which keeps this module free of an import cycle. Reading a message off the
6
- * socket, parsing its JSON, and tracking heartbeats all happen before this
7
- * point; every parsed frame then passes through {@link dispatchWsFrame}.
8
- */
9
- import { z } from 'zod';
10
- import { AbloConnectionError, CapabilityError, errorFromWire, } from '../errors.js';
11
- import { commitAckSchema, commitReceiptSchema } from '../wire/commit.js';
12
- import { subscriptionAckPayloadSchema } from '../coordination/schema.js';
13
- import { WS_INBOUND_FRAMES, isKnownInboundFrame, isSchemaValidatedFrame, wsInboundEnvelopeSchema, } from '../wire/inboundFrames.js';
14
- import { formatConflict } from '../coordination/trace.js';
15
- import { parseNotifications, recordClaim } from './commitFrames.js';
16
- /** Narrow arbitrary wire data to a plain string-keyed record. */
17
- export function isRecord(value) {
18
- return typeof value === 'object' && value !== null && !Array.isArray(value);
19
- }
20
- /**
21
- * Read the envelope off an inbound message, or `null` when it is not one —
22
- * anything that is not an object, or whose `type` is not a string. The payload
23
- * is not checked here; that belongs to the frame's own schema, applied at
24
- * dispatch.
25
- */
26
- export function readWsInboundFrame(value) {
27
- const parsed = wsInboundEnvelopeSchema.safeParse(value);
28
- return parsed.success ? parsed.data : null;
29
- }
30
- /**
31
- * Handles the acknowledgement of a `commit` request. The canonical wire
32
- * shape is `MutationResultMessage`. The payload is parsed defensively
33
- * rather than cast, since it is untrusted and may be malformed or sent by
34
- * an older server.
35
- */
36
- const handleMutationResult = (session, message) => {
37
- const p = (message.payload ?? message);
38
- const { clientTxId, success, error } = p;
39
- // Defensive: validate notifications against the canonical schema —
40
- // untrusted wire data from a possibly-older/newer server.
41
- const notifications = parseNotifications(p?.notifications);
42
- const missingIds = Array.isArray(p.missingIds)
43
- ? [
44
- ...new Set(p.missingIds.filter((id) => typeof id === 'string' && id.length > 0)),
45
- ]
46
- : undefined;
47
- const pending = typeof clientTxId === 'string'
48
- ? session.pendingMutations.get(clientTxId)
49
- : undefined;
50
- if (!pending)
51
- return;
52
- clearTimeout(pending.timeout);
53
- // `pending` exists ⇒ clientTxId was a string key (the guard above).
54
- session.pendingMutations.delete(clientTxId);
55
- if (success) {
56
- const parsedReceipt = commitReceiptSchema.safeParse({
57
- ...p,
58
- notifications,
59
- missingIds,
60
- });
61
- if (!parsedReceipt.success) {
62
- pending.reject(new AbloConnectionError('The sync server returned an invalid commit receipt; its outcome remains pending and is safe to retry.', { code: 'commit_no_result', cause: parsedReceipt.error }));
63
- return;
64
- }
65
- const receipt = parsedReceipt.data;
66
- // The write succeeded, but a guarded premise shifted underneath it.
67
- // Emit the advisory signal so a caller can react, and still resolve
68
- // the receipt, since the commit itself went through.
69
- if (receipt.notifications && receipt.notifications.length > 0) {
70
- const txId = receipt.clientTxId;
71
- const event = {
72
- clientTxId: txId,
73
- rows: receipt.notifications.map((n) => ({
74
- model: n.model,
75
- id: n.id,
76
- fields: n.conflictingFields,
77
- writtenBy: n.writtenBy.kind,
78
- })),
79
- };
80
- const message = formatConflict(event);
81
- session.logger.warn(message);
82
- session.observability.breadcrumb(message, 'sync.coordination', 'warning');
83
- session.observability.captureConflict(event);
84
- session.emit('conflict:notified', {
85
- clientTxId: txId,
86
- notifications: receipt.notifications,
87
- });
88
- }
89
- pending.resolve(commitAckSchema.parse({
90
- status: receipt.status,
91
- ...(receipt.correlationId
92
- ? { correlationId: receipt.correlationId }
93
- : {}),
94
- lastSyncId: receipt.lastSyncId,
95
- ...(receipt.notifications && receipt.notifications.length > 0
96
- ? { notifications: receipt.notifications }
97
- : {}),
98
- ...(receipt.missingIds && receipt.missingIds.length > 0
99
- ? { missingIds: receipt.missingIds }
100
- : {}),
101
- }));
102
- }
103
- else {
104
- // Capture the full server error so the caller can see what actually
105
- // rejected the mutation, rather than a generic "mutation failed on
106
- // server". Object errors are stringified so structured server payloads,
107
- // such as validation issues, survive being wrapped in an Error.
108
- let errorMessage;
109
- let errorCode;
110
- let requiredCapability;
111
- if (typeof error === 'string') {
112
- errorMessage = error;
113
- }
114
- else if (error != null && typeof error === 'object') {
115
- const obj = error;
116
- if (typeof obj.code === 'string')
117
- errorCode = obj.code;
118
- if (typeof obj.message === 'string') {
119
- errorMessage = obj.message;
120
- }
121
- else {
122
- try {
123
- errorMessage = JSON.stringify(error);
124
- }
125
- catch {
126
- errorMessage = String(error);
127
- }
128
- }
129
- if (obj.requiredCapability != null &&
130
- typeof obj.requiredCapability === 'object' &&
131
- typeof obj.requiredCapability.scope === 'string') {
132
- requiredCapability = obj.requiredCapability;
133
- }
134
- }
135
- else {
136
- errorMessage = 'mutation failed on server';
137
- }
138
- // A stale-context rejection (the write read state that has since
139
- // changed) or a foreign-claim conflict is a coordination collision.
140
- // The success-with-notifications path above records the conflict, and a
141
- // hard rejection must record it too, or the collision count would miss
142
- // every rejected write. The conflicting rows ride along on the typed
143
- // error's `conflicts` detail.
144
- if (errorCode === 'stale_context' ||
145
- errorCode === 'claim_conflict' ||
146
- errorCode === 'entity_claimed' ||
147
- errorCode?.startsWith('policy:') === true) {
148
- const rawConflicts = error != null &&
149
- typeof error === 'object' &&
150
- Array.isArray(error.conflicts)
151
- ? error
152
- .conflicts
153
- : [];
154
- const conflictEvent = {
155
- clientTxId: typeof clientTxId === 'string' ? clientTxId : '',
156
- rows: rawConflicts.map((r) => ({
157
- model: typeof r.model === 'string' ? r.model : 'unknown',
158
- id: typeof r.id === 'string' ? r.id : 'unknown',
159
- fields: [],
160
- })),
161
- };
162
- session.observability.breadcrumb(formatConflict(conflictEvent), 'sync.coordination', 'warning');
163
- session.observability.captureConflict(conflictEvent);
164
- }
165
- // Build the proper typed AbloError from the wire code via the
166
- // shared factory — the same code→class mapping the HTTP commit
167
- // path uses (`translateHttpError`). This keeps rejected commits
168
- // inside the typed hierarchy (capability denials →
169
- // CapabilityError with `.requiredCapability`; foreign-claim
170
- // conflicts → AbloClaimedError; everything else → the subclass
171
- // its registry `httpStatus` implies) instead of a hand-rolled
172
- // `new Error`, so callers can `instanceof`/`e.type` it and
173
- // downstream retry logic can read the contract's retryability.
174
- pending.reject(errorFromWire(errorMessage, {
175
- code: errorCode,
176
- requiredCapability,
177
- }));
178
- }
179
- };
180
- /**
181
- * Handles the acknowledgement of a `claim` request. The frame has the shape
182
- * `{ type: 'claim_ack', payload: { claimId, success, syncGroups?,
183
- * ttlSeconds?, error? } }`.
184
- */
185
- const handleClaimAck = (session, message) => {
186
- const p = (message.payload ?? {});
187
- const { claimId, success, syncGroups, ttlSeconds, error } = p;
188
- const pending = typeof claimId === 'string'
189
- ? session.pendingClaims.get(claimId)
190
- : undefined;
191
- if (!pending)
192
- return;
193
- clearTimeout(pending.timeout);
194
- // `pending` exists ⇒ claimId was a string key (the guard above).
195
- session.pendingClaims.delete(claimId);
196
- if (success) {
197
- pending.resolve({
198
- syncGroups: Array.isArray(syncGroups) ? syncGroups : [],
199
- ttlSeconds: typeof ttlSeconds === 'number' ? ttlSeconds : undefined,
200
- });
201
- }
202
- else {
203
- const err = error;
204
- const code = err?.code && typeof err.code === 'string'
205
- ? err.code
206
- : 'claim_rejected';
207
- const msg = err?.message && typeof err.message === 'string'
208
- ? err.message
209
- : 'claim rejected by server';
210
- // Capability denials get the typed CapabilityError so
211
- // callers can read `.requiredCapability` and attenuate-
212
- // and-retry the claim with a narrower token.
213
- if (code === 'capability_scope_denied' ||
214
- code === 'capability_invalid') {
215
- const rc = error
216
- ?.requiredCapability;
217
- const requiredCapability = rc != null &&
218
- typeof rc === 'object' &&
219
- typeof rc.scope === 'string'
220
- ? rc
221
- : undefined;
222
- pending.reject(new CapabilityError(code, msg, requiredCapability));
223
- }
224
- else {
225
- // Route through the shared factory so a failed claim_ack is a
226
- // typed AbloError (registry code → right subclass), symmetric
227
- // with the commit `mutation_result` path — never a bare Error.
228
- pending.reject(errorFromWire(msg, { code }));
229
- }
230
- }
231
- };
232
- /**
233
- * Handles the acknowledgement of an `update_subscription` request. The wire
234
- * carries no correlation id, so the ack is matched to the oldest pending
235
- * request in first-in, first-out order, since the server applies and
236
- * acknowledges subscription updates in the order it receives them. The
237
- * payload is validated against its canonical schema before use.
238
- */
239
- const handleSubscriptionAck = (session, message) => {
240
- const pending = session.shiftPendingSubscription();
241
- if (!pending)
242
- return;
243
- clearTimeout(pending.timeout);
244
- const parsed = subscriptionAckPayloadSchema.safeParse(message.payload);
245
- if (!parsed.success) {
246
- // Unreadable ack — resolve the pending request as a failure
247
- // rather than hang it until timeout.
248
- pending.reject(errorFromWire('malformed subscription_ack from server', {
249
- code: 'malformed_subscription',
250
- }));
251
- return;
252
- }
253
- const ack = parsed.data;
254
- if (ack.success) {
255
- // Keep the reconnect URL aligned with current interest: a
256
- // reconnect re-subscribes from `this.options.syncGroups`.
257
- session.options.syncGroups = ack.syncGroups;
258
- pending.resolve({ syncGroups: ack.syncGroups });
259
- }
260
- else {
261
- pending.reject(errorFromWire(ack.error?.message ?? 'update_subscription rejected by server', { code: ack.error?.code ?? 'malformed_subscription' }));
262
- }
263
- };
264
- /**
265
- * Handles a `delta` frame, which carries either a single delta or a
266
- * `{ deltas: [...] }` batch. This only tells the two shapes apart; each
267
- * delta is validated once downstream, so batch elements are passed along
268
- * raw rather than parsed here.
269
- */
270
- const handleDeltaFrame = (session, message) => {
271
- const p = message.payload;
272
- if (!isRecord(p))
273
- return;
274
- if (p.actionType || p.modelName) {
275
- session.handleDelta(p);
276
- }
277
- else if (Array.isArray(p.deltas)) {
278
- for (const d of p.deltas) {
279
- session.handleDelta(d);
280
- }
281
- // `p.newVersions` from older servers is ignored; `sync_id` is the
282
- // causality token.
283
- }
284
- };
285
- /** The reporting ports of one session, in the shape {@link recordClaim} takes. */
286
- function tracePorts(session) {
287
- return { logger: session.logger, observability: session.observability };
288
- }
289
- /**
290
- * Maps each frame type to its handler. Every named server frame this
291
- * package understands is dispatched from this table; anything else falls
292
- * through to the collaboration-event and unknown-type path in
293
- * {@link dispatchWsFrame}.
294
- */
295
- export const wsFrameHandlers = {
296
- sync_response: (session, message) => { session.handleSyncResponse(message.payload); },
297
- bootstrap_response: (session, message) => { session.handleBootstrapResponse(message.payload); },
298
- presence_update: (session, message) => { session.handlePresenceUpdate(message); },
299
- mutation_result: handleMutationResult,
300
- claim_ack: handleClaimAck,
301
- subscription_ack: handleSubscriptionAck,
302
- delta: handleDeltaFrame,
303
- };
304
- /**
305
- * Binds a handler to the schema that validates its input.
306
- *
307
- * The two are paired here, at the declaration, so the payload type is inferred
308
- * from the schema rather than restated — and the frame's validation cannot be
309
- * changed without the handler's parameter type following it. The bound function
310
- * accepts `unknown`, which is what lets the dispatcher call any of them from a
311
- * lookup without an assertion.
312
- */
313
- function validating(schema, frameType, run) {
314
- return (session, payload) => {
315
- const parsed = schema.safeParse(payload ?? {});
316
- if (!parsed.success) {
317
- throw new AbloConnectionError(`The sync server sent a ${frameType} frame that does not match the protocol; it was not applied.`, { code: 'malformed_response', cause: parsed.error });
318
- }
319
- run(session, parsed.data);
320
- };
321
- }
322
- /**
323
- * Handlers for the frames the protocol validates before dispatch. Each takes
324
- * the parsed payload, typed by the registry's own schema — which is why none of
325
- * them narrows, defaults, or casts. The record's key type makes the table
326
- * exhaustive: adding a `validation: 'schema'` frame to the registry without
327
- * adding it here is a compile error.
328
- */
329
- const validatedFrameHandlers = {
330
- presence_update: validating(WS_INBOUND_FRAMES.presence_update.payload, 'presence_update', (session, payload) => {
331
- session.handlePresenceUpdate({ payload });
332
- }),
333
- claim_expired: validating(WS_INBOUND_FRAMES.claim_expired.payload, 'claim_expired', (session, payload) => {
334
- // Server-initiated expiry. The claim is already inactive by the time
335
- // this arrives, so a consumer either re-claims with a fresh credential
336
- // or accepts the drop.
337
- recordClaim(tracePorts(session), 'expired', payload);
338
- session.emit('claim_expired', payload);
339
- }),
340
- claim_rejected: validating(WS_INBOUND_FRAMES.claim_rejected.payload, 'claim_rejected', (session, payload) => {
341
- // The target is held by another participant and this claim did not opt
342
- // into the wait line.
343
- recordClaim(tracePorts(session), 'rejected', payload);
344
- session.emit('claim_rejected', payload);
345
- }),
346
- claim_acquired: validating(WS_INBOUND_FRAMES.claim_acquired.payload, 'claim_acquired', (session, payload) => {
347
- // The target was free: the lease is ours without waiting.
348
- recordClaim(tracePorts(session), 'acquired', payload);
349
- session.emit('claim_acquired', payload);
350
- }),
351
- claim_queued: validating(WS_INBOUND_FRAMES.claim_queued.payload, 'claim_queued', (session, payload) => {
352
- // Opt-in fair queue: our claim waits in line, carrying its position.
353
- recordClaim(tracePorts(session), 'queued', payload);
354
- session.emit('claim_queued', payload);
355
- }),
356
- claim_granted: validating(WS_INBOUND_FRAMES.claim_granted.payload, 'claim_granted', (session, payload) => {
357
- // Our queued claim reached the head — the lease is now ours.
358
- recordClaim(tracePorts(session), 'granted', payload);
359
- session.emit('claim_granted', payload);
360
- }),
361
- claim_lost: validating(WS_INBOUND_FRAMES.claim_lost.payload, 'claim_lost', (session, payload) => {
362
- // A held or granted lease was taken from us (TTL lapse, preemption).
363
- recordClaim(tracePorts(session), 'lost', payload);
364
- session.emit('claim_lost', payload);
365
- }),
366
- claim_queue: validating(WS_INBOUND_FRAMES.claim_queue.payload, 'claim_queue', (session, payload) => {
367
- // Per-entity wait-line snapshot backing the reactive `queue(id)` read.
368
- // Not logged: the per-claim queued/granted events tell that story.
369
- session.emit('claim_queue', payload);
370
- }),
371
- claim_heartbeat_ack: validating(WS_INBOUND_FRAMES.claim_heartbeat_ack.payload, 'claim_heartbeat_ack', (session, payload) => {
372
- // Reply to our `claim_heartbeat`; the claim stream correlates it back to
373
- // the awaiting caller by claimId. Not logged per-frame — a heartbeat is
374
- // a cadence, and the transition that matters (lost) surfaces as an error.
375
- session.emit('claim_heartbeat_ack', payload);
376
- }),
377
- };
378
- /**
379
- * Routes one inbound frame to its handler, validating the payload first.
380
- *
381
- * A frame the protocol declares with a payload schema is parsed here, so its
382
- * handler works on a proven shape. A frame the protocol does not declare is
383
- * rejected: the server and this package ship together, so an unrecognised type
384
- * means the two have drifted, and a change nobody validated should not reach a
385
- * local store. The one exception is an application's own collaboration events,
386
- * which the consumer registers at construction and the protocol knows nothing
387
- * about.
388
- *
389
- * Throwing is the reporting channel. The transport's message loop catches and
390
- * reports through `captureWebSocketError`, so a bad frame surfaces as a
391
- * captured error and the connection survives.
392
- */
393
- export function dispatchWsFrame(session, message) {
394
- if (message.type === 'pong' || message.type === 'ping') {
395
- // Ignore keepalive messages
396
- session.logger.debug('Received keepalive', { type: message.type });
397
- return;
398
- }
399
- if (message.type === undefined) {
400
- // A bare delta, validated downstream like every other delta.
401
- if (message.actionType || message.modelName) {
402
- session.handleDelta(message);
403
- }
404
- return;
405
- }
406
- const frameType = message.type;
407
- if (isKnownInboundFrame(frameType)) {
408
- if (isSchemaValidatedFrame(frameType)) {
409
- // Validated on the way in — see `validating`, which pairs each handler
410
- // with the registry schema its parameter type is inferred from.
411
- validatedFrameHandlers[frameType](session, message.payload);
412
- return;
413
- }
414
- // `validation: 'handler'` — the check lives inside, cited by the registry.
415
- const handler = wsFrameHandlers[frameType];
416
- if (handler) {
417
- handler(session, message);
418
- return;
419
- }
420
- }
421
- // Collaboration events use underscore wire format (e.g., 'section_selection')
422
- // Convert to colon format for the event map (e.g., 'section:selection')
423
- const eventKey = frameType.replace(/_/g, ':');
424
- if (session.collaborationEventTypes.has(eventKey)) {
425
- session.emit(eventKey, message.payload);
426
- return;
427
- }
428
- throw new AbloConnectionError(`The sync server sent an unrecognised frame type "${frameType}". This client and the server have drifted; the frame was not applied.`, { code: 'malformed_response' });
429
- }