@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,84 +0,0 @@
1
- /**
2
- * Detects real network and session connectivity for the sync engine. It exists
3
- * because `navigator.onLine` is unreliable: it reports true whenever the device
4
- * has a local network connection, even with no route to the internet, and after
5
- * sleep/wake it can report true before Wi-Fi or DNS are working again.
6
- *
7
- * The probe makes one authenticated request to the sync server's
8
- * `/api/auth/check` endpoint — which runs the same auth middleware as the
9
- * WebSocket upgrade — and classifies the response into a single
10
- * {@link ProbeOutcome} through the recovery taxonomy ({@link classifyRecovery}):
11
- * 204 No Content → `reachable` (credential valid)
12
- * 401 `apikey_expired` (ephemeral key) → `credential_stale` (re-mint and retry, no sign-out)
13
- * 401 `session_expired` / bare 401 → `session_expired` (sign out)
14
- * 401/403 credential-type/config/perm → `auth_blocked` (stop; no loop, no sign-out)
15
- * network failure / offline → `unreachable`
16
- *
17
- * This closes a real gap. The browser's WebSocket API hides the HTTP status of
18
- * a failed handshake, so a 401 on the upgrade surfaces only as close code 1006.
19
- * Without this HTTP probe, the client cannot tell an auth failure from a network
20
- * blip, and loops reconnecting forever instead of sending the user to sign in.
21
- *
22
- * @see https://developer.mozilla.org/en-US/docs/Web/API/Navigator/onLine
23
- */
24
- import { z } from 'zod';
25
- import { type AuthTokenGetter } from '../auth/credentialSource.js';
26
- import { type Logger } from '../logger.js';
27
- /**
28
- * The complete set of probe outcomes. Each value carries both reachability and
29
- * credential state, so the connection state machine can branch on one exhaustive
30
- * discriminant instead of piecing the situation together from several booleans.
31
- * It mirrors the `RecoveryClass` taxonomy at the connectivity layer.
32
- */
33
- export declare const PROBE_OUTCOMES: readonly ["reachable", "unreachable", "session_expired", "credential_stale", "auth_blocked"];
34
- /** Zod enum derived from {@link PROBE_OUTCOMES}. */
35
- export declare const probeOutcomeSchema: z.ZodEnum<{
36
- auth_blocked: "auth_blocked";
37
- session_expired: "session_expired";
38
- reachable: "reachable";
39
- unreachable: "unreachable";
40
- credential_stale: "credential_stale";
41
- }>;
42
- /** A single probe outcome. See {@link PROBE_OUTCOMES}. */
43
- export type ProbeOutcome = z.infer<typeof probeOutcomeSchema>;
44
- /** Result of a network probe: a single {@link ProbeOutcome} plus round-trip
45
- * latency (null when the probe never completed). */
46
- export declare const probeResultSchema: z.ZodObject<{
47
- outcome: z.ZodEnum<{
48
- auth_blocked: "auth_blocked";
49
- session_expired: "session_expired";
50
- reachable: "reachable";
51
- unreachable: "unreachable";
52
- credential_stale: "credential_stale";
53
- }>;
54
- latencyMs: z.ZodNullable<z.ZodNumber>;
55
- }, z.core.$strip>;
56
- /** @see {@link probeResultSchema} */
57
- export type ProbeResult = z.infer<typeof probeResultSchema>;
58
- export interface NetworkProbeOptions {
59
- /**
60
- * Sync-server base URL (HTTP or WS scheme accepted). If omitted, the probe
61
- * targets the canonical hosted endpoint ({@link ABLO_DEFAULT_BASE_URL}) —
62
- * the same default `Ablo()` resolves.
63
- */
64
- baseUrl?: string;
65
- /**
66
- * Optional bearer credential. Browser cookie deployments can omit this;
67
- * bearer-first deployments must pass the same `ek_`/`rk_` token used by
68
- * bootstrap and the WebSocket upgrade.
69
- */
70
- getAuthToken?: AuthTokenGetter;
71
- /** Compatibility fallback for callers with a copied token string. */
72
- authToken?: string | null;
73
- /** Where probe outcomes are logged. Defaults to silent. */
74
- logger?: Logger;
75
- }
76
- /**
77
- * Probes the sync server with a lightweight HEAD request, returning both
78
- * reachability and session status in a single call so the connection state
79
- * machine can pick the right transition without guessing.
80
- *
81
- * @param input The sync-server base URL (an HTTP or WS scheme is accepted), or
82
- * an options bag. A bare string is also accepted.
83
- */
84
- export declare function probeNetwork(input?: string | NetworkProbeOptions): Promise<ProbeResult>;
@@ -1,207 +0,0 @@
1
- /**
2
- * Detects real network and session connectivity for the sync engine. It exists
3
- * because `navigator.onLine` is unreliable: it reports true whenever the device
4
- * has a local network connection, even with no route to the internet, and after
5
- * sleep/wake it can report true before Wi-Fi or DNS are working again.
6
- *
7
- * The probe makes one authenticated request to the sync server's
8
- * `/api/auth/check` endpoint — which runs the same auth middleware as the
9
- * WebSocket upgrade — and classifies the response into a single
10
- * {@link ProbeOutcome} through the recovery taxonomy ({@link classifyRecovery}):
11
- * 204 No Content → `reachable` (credential valid)
12
- * 401 `apikey_expired` (ephemeral key) → `credential_stale` (re-mint and retry, no sign-out)
13
- * 401 `session_expired` / bare 401 → `session_expired` (sign out)
14
- * 401/403 credential-type/config/perm → `auth_blocked` (stop; no loop, no sign-out)
15
- * network failure / offline → `unreachable`
16
- *
17
- * This closes a real gap. The browser's WebSocket API hides the HTTP status of
18
- * a failed handshake, so a 401 on the upgrade surfaces only as close code 1006.
19
- * Without this HTTP probe, the client cannot tell an auth failure from a network
20
- * blip, and loops reconnecting forever instead of sending the user to sign in.
21
- *
22
- * @see https://developer.mozilla.org/en-US/docs/Web/API/Navigator/onLine
23
- */
24
- import { z } from 'zod';
25
- import { classifyRecovery } from '../errors.js';
26
- import { withAuthHeaders } from '../auth/credentialSource.js';
27
- import { ABLO_DEFAULT_BASE_URL } from '../auth/hostedEndpoints.js';
28
- import { noopLogger } from '../logger.js';
29
- /**
30
- * The complete set of probe outcomes. Each value carries both reachability and
31
- * credential state, so the connection state machine can branch on one exhaustive
32
- * discriminant instead of piecing the situation together from several booleans.
33
- * It mirrors the `RecoveryClass` taxonomy at the connectivity layer.
34
- */
35
- export const PROBE_OUTCOMES = [
36
- /** Server reachable and the access credential is currently valid. */
37
- 'reachable',
38
- /** Could not reach the server (offline, DNS, TLS, or timeout). */
39
- 'unreachable',
40
- /** Reachable, but the long-lived login is gone. Terminal: sign out. */
41
- 'session_expired',
42
- /** Reachable, but the ephemeral access key (`ek_`/`rk_`) expired. Silently
43
- * re-mint a fresh key from the still-valid login and retry; not a sign-out. */
44
- 'credential_stale',
45
- /** Reachable, but the credential's type or configuration was rejected (wrong
46
- * key kind, untrusted issuer, no organization, or a 403). Stop: neither
47
- * reconnecting nor re-authenticating helps. Distinct from a sign-out. */
48
- 'auth_blocked',
49
- ];
50
- /** Zod enum derived from {@link PROBE_OUTCOMES}. */
51
- export const probeOutcomeSchema = z.enum(PROBE_OUTCOMES);
52
- /** Result of a network probe: a single {@link ProbeOutcome} plus round-trip
53
- * latency (null when the probe never completed). */
54
- export const probeResultSchema = z.object({
55
- outcome: probeOutcomeSchema,
56
- latencyMs: z.number().nullable(),
57
- });
58
- const PROBE_TIMEOUT_MS = 4000;
59
- /**
60
- * Derive the probe URL from a sync-server base URL. Accepts `ws://`,
61
- * `wss://`, `http://`, `https://`, or a bare host — mirrors the
62
- * normalisation in `BootstrapFetcher` / `createSyncEngine`.
63
- */
64
- function resolveProbeUrl(baseUrl) {
65
- // No explicit baseUrl → probe the canonical hosted endpoint, matching the
66
- // `Ablo()` default.
67
- const resolved = baseUrl ?? ABLO_DEFAULT_BASE_URL;
68
- // Normalize ws → http so fetch() accepts the URL. Strip any trailing slash
69
- // so we don't produce `//api/auth/check`.
70
- const httpBase = resolved.replace(/^ws/, 'http').replace(/\/+$/, '');
71
- return `${httpBase}/api/auth/check`;
72
- }
73
- /**
74
- * Probes the sync server with a lightweight HEAD request, returning both
75
- * reachability and session status in a single call so the connection state
76
- * machine can pick the right transition without guessing.
77
- *
78
- * @param input The sync-server base URL (an HTTP or WS scheme is accepted), or
79
- * an options bag. A bare string is also accepted.
80
- */
81
- export async function probeNetwork(input) {
82
- const baseUrl = typeof input === 'string' ? input : input?.baseUrl;
83
- const getAuthToken = typeof input === 'string' ? undefined : input?.getAuthToken;
84
- const authToken = typeof input === 'string' ? undefined : input?.authToken;
85
- const logger = (typeof input === 'string' ? undefined : input?.logger) ?? noopLogger;
86
- const url = resolveProbeUrl(baseUrl);
87
- // Fast-fail: if navigator.onLine is false, skip the probe entirely. This is
88
- // the one case where navigator.onLine is reliable (MDN: "false means
89
- // definitely offline"). Use `=== false` rather than `!onLine` because Node
90
- // 22+ exposes `navigator` with `onLine === undefined`, and `!undefined` is
91
- // true, which would short-circuit the probe server-side.
92
- if (typeof navigator !== 'undefined' && navigator.onLine === false) {
93
- return { outcome: 'unreachable', latencyMs: null };
94
- }
95
- const controller = new AbortController();
96
- const timeout = setTimeout(() => { controller.abort(); }, PROBE_TIMEOUT_MS);
97
- const start = performance.now();
98
- try {
99
- const headers = withAuthHeaders(getAuthToken, { 'Cache-Control': 'no-cache' }, authToken);
100
- const response = await fetch(url, {
101
- method: 'HEAD',
102
- signal: controller.signal,
103
- // Cache-bust to avoid stale responses
104
- headers,
105
- });
106
- const latencyMs = Math.round(performance.now() - start);
107
- // The probe is a HEAD request (no body), but the server sets
108
- // `X-Auth-Failure: <code>` on every auth rejection. Route the code through
109
- // the recovery taxonomy so each failure mode gets its correct outcome. That
110
- // distinction is the whole point: an expired ephemeral key
111
- // (`access_credential_expiry`) must re-mint, not sign the user out the way a
112
- // genuine login expiry (`session_expiry`) does, and not wedge the way a
113
- // credential type or configuration rejection (`auth_blocked`) does.
114
- const authFailure = response.headers.get('x-auth-failure');
115
- if (authFailure) {
116
- const recovery = classifyRecovery(authFailure);
117
- switch (recovery) {
118
- case 'session_expiry':
119
- logger.info('[NetworkProbe] Server reachable, login expired', {
120
- status: response.status,
121
- code: authFailure,
122
- latencyMs,
123
- });
124
- return { outcome: 'session_expired', latencyMs };
125
- case 'access_credential_expiry':
126
- logger.info('[NetworkProbe] Server reachable, access key stale — will re-mint', {
127
- status: response.status,
128
- code: authFailure,
129
- latencyMs,
130
- });
131
- return { outcome: 'credential_stale', latencyMs };
132
- case 'auth_blocked':
133
- case 'permission':
134
- case 'none':
135
- // A non-expiry auth rejection — wrong credential type or config, a
136
- // 403, or an auth-tagged code this SDK does not recognise.
137
- // Re-authenticating re-mints the same rejected credential and
138
- // retrying will not help, so stop rather than reconnect-loop or sign
139
- // the user out.
140
- logger.debug('[NetworkProbe] Reachable but auth-blocked (non-retryable, non-expiry)', {
141
- status: response.status,
142
- code: authFailure,
143
- recovery,
144
- latencyMs,
145
- });
146
- return { outcome: 'auth_blocked', latencyMs };
147
- case 'transient':
148
- // Retryable auth-tagged response — connectivity is proven; fall
149
- // through to `reachable` and let the normal retry path handle it.
150
- break;
151
- default: {
152
- const _exhaustive = recovery;
153
- void _exhaustive;
154
- }
155
- }
156
- }
157
- else if (response.status === 401) {
158
- // Bare 401 with no readable structured code. This is ambiguous and must
159
- // not sign the user out on its own — two common causes are both
160
- // recoverable, and only one is a real logout:
161
- // 1. The server did send `X-Auth-Failure: apikey_expired`, but it is a
162
- // custom header on a cross-origin response the server did not list in
163
- // `Access-Control-Expose-Headers`, so the browser stripped it to
164
- // null. The access key just needs a re-mint.
165
- // 2. A genuinely expired access key on a non-Ablo proxy or cookie path.
166
- // So route to `credential_stale`: the state machine attempts a re-mint,
167
- // and the only way to actually sign out is that re-mint resolving `null`
168
- // (the login is truly gone). If no refresher is wired, the bounded attempt
169
- // counter falls through to `auth_blocked` (stop) — still never a spurious
170
- // logout. The invariant holds: null is the only terminal path, never a
171
- // bare 401.
172
- logger.info('[NetworkProbe] Server reachable, bare 401 — re-mint (not sign-out)', {
173
- latencyMs,
174
- });
175
- return { outcome: 'credential_stale', latencyMs };
176
- }
177
- // 2xx (including 204) means reachable + credential valid.
178
- // 3xx/4xx (non-auth) still prove connectivity even though the probe
179
- // expected 204; log a warning so misconfigurations surface instead of
180
- // silently passing.
181
- if (response.status < 200 || response.status >= 300) {
182
- logger.debug('[NetworkProbe] Unexpected probe response', {
183
- status: response.status,
184
- url,
185
- latencyMs,
186
- });
187
- }
188
- else {
189
- logger.debug('[NetworkProbe] Server reachable, credential valid', {
190
- status: response.status,
191
- latencyMs,
192
- });
193
- }
194
- return { outcome: 'reachable', latencyMs };
195
- }
196
- catch (error) {
197
- clearTimeout(timeout);
198
- const isAbort = error instanceof DOMException && error.name === 'AbortError';
199
- logger.info('[NetworkProbe] Probe failed', {
200
- reason: isAbort ? 'timeout' : error.message,
201
- });
202
- return { outcome: 'unreachable', latencyMs: null };
203
- }
204
- finally {
205
- clearTimeout(timeout);
206
- }
207
- }
@@ -1,128 +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 { type WsInboundEnvelope } from '../wire/inboundFrames.js';
10
- import { type CommitAck } from './commitFrames.js';
11
- import type { Logger } from '../logger.js';
12
- import type { SocketObservability } from '../observability.js';
13
- /**
14
- * In-flight `commit` request record, keyed by clientTxId in the session.
15
- * Resolved when a matching `mutation_result` frame arrives from the
16
- * server, or rejected on timeout / disconnect.
17
- */
18
- export interface PendingCommit {
19
- resolve: (value: CommitAck) => void;
20
- reject: (err: Error) => void;
21
- timeout: ReturnType<typeof setTimeout>;
22
- }
23
- /**
24
- * In-flight `claim` request record, keyed by claimId. Resolved when the
25
- * matching `claim_ack` arrives, or rejected on timeout/disconnect.
26
- */
27
- export interface PendingClaim {
28
- resolve: (value: {
29
- syncGroups: string[];
30
- ttlSeconds?: number;
31
- }) => void;
32
- reject: (err: Error) => void;
33
- timeout: ReturnType<typeof setTimeout>;
34
- }
35
- /**
36
- * An in-flight `update_subscription` request awaiting its
37
- * `subscription_ack`. The wire carries no correlation id, so requests are
38
- * matched to their acknowledgements in first-in, first-out order, the same
39
- * order the server applies them.
40
- */
41
- export interface PendingSubscription {
42
- resolve: (value: {
43
- syncGroups: string[];
44
- }) => void;
45
- reject: (err: Error) => void;
46
- timeout: ReturnType<typeof setTimeout>;
47
- }
48
- /**
49
- * A parsed inbound wire frame — the envelope only, with its payload still
50
- * untrusted. Inferred from {@link wsInboundEnvelopeSchema} rather than written
51
- * out, so the type a handler sees and the check the socket runs are the same
52
- * statement. The open key set is what carries the oldest delta form, which puts
53
- * a delta's own fields (`actionType`, `modelName`) at the top level instead of
54
- * under `payload`.
55
- */
56
- export type WsInboundFrame = WsInboundEnvelope;
57
- /** Narrow arbitrary wire data to a plain string-keyed record. */
58
- export declare function isRecord(value: unknown): value is Record<string, unknown>;
59
- /**
60
- * Read the envelope off an inbound message, or `null` when it is not one —
61
- * anything that is not an object, or whose `type` is not a string. The payload
62
- * is not checked here; that belongs to the frame's own schema, applied at
63
- * dispatch.
64
- */
65
- export declare function readWsInboundFrame(value: unknown): WsInboundFrame | null;
66
- /**
67
- * The subset of the sync WebSocket that the frame handlers need. The
68
- * transport builds a single object exposing these members over its own
69
- * private state. Handlers read the fields live rather than capturing them,
70
- * so resetting a field elsewhere — such as clearing pending subscriptions
71
- * on close — never leaves a handler holding a stale value.
72
- */
73
- export interface WsSession {
74
- /** EventEmitter surface — handlers emit the typed transport events. */
75
- emit(event: string, ...args: unknown[]): boolean;
76
- /** Where the handlers log. The transport passes its own port. */
77
- logger: Logger;
78
- /** Where coordination outcomes and lifecycle breadcrumbs are reported. */
79
- observability: SocketObservability;
80
- /** In-flight commit acks keyed by clientTxId. */
81
- pendingMutations: Map<string, PendingCommit>;
82
- /** In-flight claim acks keyed by claimId. */
83
- pendingClaims: Map<string, PendingClaim>;
84
- /** Removes and returns the oldest in-flight `update_subscription` request. */
85
- shiftPendingSubscription(): PendingSubscription | undefined;
86
- /** Connection options subset the handlers write back (acked sync groups). */
87
- options: {
88
- syncGroups: string[];
89
- };
90
- /** Registered collaboration event keys (colon format). */
91
- collaborationEventTypes: ReadonlySet<string>;
92
- /**
93
- * Processes one inbound delta. The argument is untrusted wire data; the
94
- * transport validates it against the canonical delta schema and drops
95
- * anything malformed, so handlers here never cast.
96
- */
97
- handleDelta(delta: unknown): void;
98
- handleSyncResponse(payload: unknown): void;
99
- handleBootstrapResponse(payload: unknown): void;
100
- handlePresenceUpdate(message: {
101
- payload?: unknown;
102
- [k: string]: unknown;
103
- }): void;
104
- }
105
- export type WsFrameHandler = (session: WsSession, message: WsInboundFrame) => void;
106
- /**
107
- * Maps each frame type to its handler. Every named server frame this
108
- * package understands is dispatched from this table; anything else falls
109
- * through to the collaboration-event and unknown-type path in
110
- * {@link dispatchWsFrame}.
111
- */
112
- export declare const wsFrameHandlers: Record<string, WsFrameHandler>;
113
- /**
114
- * Routes one inbound frame to its handler, validating the payload first.
115
- *
116
- * A frame the protocol declares with a payload schema is parsed here, so its
117
- * handler works on a proven shape. A frame the protocol does not declare is
118
- * rejected: the server and this package ship together, so an unrecognised type
119
- * means the two have drifted, and a change nobody validated should not reach a
120
- * local store. The one exception is an application's own collaboration events,
121
- * which the consumer registers at construction and the protocol knows nothing
122
- * about.
123
- *
124
- * Throwing is the reporting channel. The transport's message loop catches and
125
- * reports through `captureWebSocketError`, so a bad frame surfaces as a
126
- * captured error and the connection survives.
127
- */
128
- export declare function dispatchWsFrame(session: WsSession, message: WsInboundFrame): void;