@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,21 +0,0 @@
1
- /**
2
- * The table-creation SQL every ORM adapter ships for its own infrastructure
3
- * tables: `ablo_idempotency`, whose legacy-named `client_tx_id` column stores the
4
- * scoped server correlation, and (for endpoint wrappers only) `ablo_outbox`, the
5
- * transactional outbox the `events()` feed reads. Direct wrappers install only
6
- * the ledger migration because WAL is their authoritative feed.
7
- *
8
- * These are infrastructure tables, not model tables, and they exist only on your
9
- * own database when you run a Data Source. Ablo's hosted storage does not use them;
10
- * it records changes in its own `sync_deltas` log instead.
11
- */
12
- import type { Migration } from './contract.js';
13
- /** The idempotency ledger shared by direct and endpoint mutation wrappers. New
14
- * rows carry a bounded `expires_at` (set by the adapter at write time) so the
15
- * customer can prune them; the `infinity` column default is only a fallback for
16
- * a row inserted without one. */
17
- export declare function idempotencyLedgerMigrations(): readonly Migration[];
18
- /** Endpoint-only transactional outbox and its correlation columns. */
19
- export declare function endpointOutboxMigrations(): readonly Migration[];
20
- /** Full endpoint adapter migrations (ledger + outbox). */
21
- export declare function adapterTableMigrations(): readonly Migration[];
@@ -1,103 +0,0 @@
1
- /**
2
- * The table-creation SQL every ORM adapter ships for its own infrastructure
3
- * tables: `ablo_idempotency`, whose legacy-named `client_tx_id` column stores the
4
- * scoped server correlation, and (for endpoint wrappers only) `ablo_outbox`, the
5
- * transactional outbox the `events()` feed reads. Direct wrappers install only
6
- * the ledger migration because WAL is their authoritative feed.
7
- *
8
- * These are infrastructure tables, not model tables, and they exist only on your
9
- * own database when you run a Data Source. Ablo's hosted storage does not use them;
10
- * it records changes in its own `sync_deltas` log instead.
11
- */
12
- /**
13
- * Add a column to `ablo_idempotency` only when it is genuinely missing.
14
- *
15
- * `ADD COLUMN IF NOT EXISTS` performs its ownership check before the existence
16
- * short-circuit, so on a ledger owned by another role the no-op re-run still
17
- * errors "must be owner of table ablo_idempotency" — the setup's re-run promise
18
- * breaks. `pg_attribute` is readable regardless of table ownership, so this DO
19
- * block resolves the ledger through the search path and runs the `ALTER` only
20
- * when the column is absent — a true no-op on a table that already has it.
21
- */
22
- function addColumnIfAbsent(column, definition) {
23
- return `DO $$
24
- DECLARE ledger regclass := to_regclass('ablo_idempotency');
25
- BEGIN
26
- IF ledger IS NOT NULL AND NOT EXISTS (
27
- SELECT 1 FROM pg_attribute
28
- WHERE attrelid = ledger AND attname = '${column}' AND attnum > 0 AND NOT attisdropped
29
- ) THEN
30
- ALTER TABLE ablo_idempotency ADD COLUMN ${column} ${definition};
31
- END IF;
32
- END $$;`;
33
- }
34
- /** The idempotency ledger shared by direct and endpoint mutation wrappers. New
35
- * rows carry a bounded `expires_at` (set by the adapter at write time) so the
36
- * customer can prune them; the `infinity` column default is only a fallback for
37
- * a row inserted without one. */
38
- export function idempotencyLedgerMigrations() {
39
- return [
40
- {
41
- name: 'ablo_idempotency',
42
- up: `CREATE TABLE IF NOT EXISTS ablo_idempotency (
43
- client_tx_id TEXT PRIMARY KEY,
44
- response JSONB NOT NULL,
45
- request_hash TEXT,
46
- expires_at TIMESTAMPTZ NOT NULL DEFAULT 'infinity',
47
- created_at TIMESTAMPTZ NOT NULL DEFAULT now()
48
- );`,
49
- },
50
- {
51
- name: 'ablo_idempotency_request_hash',
52
- // Nullable only for rows created by older adapter versions. New writes
53
- // always populate it; replaying a legacy NULL row fails closed because
54
- // the adapter cannot prove that the intent matches.
55
- //
56
- // The column already exists on any current table (the CREATE above
57
- // includes it), so this only matters when upgrading a pre-existing
58
- // ledger. `ALTER TABLE ... ADD COLUMN IF NOT EXISTS` checks ownership
59
- // BEFORE it evaluates IF NOT EXISTS, so on a ledger that predates the
60
- // setup — owned by another role — the no-op still errors "must be owner".
61
- // Guard on the catalog (readable regardless of ownership) so the ALTER
62
- // runs only when the column is genuinely absent, keeping re-runs safe.
63
- up: addColumnIfAbsent('request_hash', 'TEXT'),
64
- },
65
- {
66
- name: 'ablo_idempotency_permanent_retention',
67
- up: addColumnIfAbsent('expires_at', `TIMESTAMPTZ NOT NULL DEFAULT 'infinity'`),
68
- },
69
- ];
70
- }
71
- /** Endpoint-only transactional outbox and its correlation columns. */
72
- export function endpointOutboxMigrations() {
73
- return [
74
- {
75
- name: 'ablo_outbox',
76
- up: `CREATE TABLE IF NOT EXISTS ablo_outbox (
77
- cursor BIGSERIAL PRIMARY KEY,
78
- id TEXT NOT NULL UNIQUE,
79
- model TEXT NOT NULL,
80
- entity_id TEXT NOT NULL,
81
- type TEXT NOT NULL,
82
- data JSONB,
83
- organization_id TEXT,
84
- client_tx_id TEXT,
85
- correlation_id TEXT,
86
- transaction_id TEXT,
87
- occurred_at BIGINT,
88
- created_at TIMESTAMPTZ NOT NULL DEFAULT now()
89
- );`,
90
- },
91
- {
92
- name: 'ablo_outbox_correlation',
93
- up: `ALTER TABLE ablo_outbox
94
- ADD COLUMN IF NOT EXISTS correlation_id TEXT;
95
- ALTER TABLE ablo_outbox
96
- ADD COLUMN IF NOT EXISTS transaction_id TEXT;`,
97
- },
98
- ];
99
- }
100
- /** Full endpoint adapter migrations (ledger + outbox). */
101
- export function adapterTableMigrations() {
102
- return [...idempotencyLedgerMigrations(), ...endpointOutboxMigrations()];
103
- }
@@ -1,32 +0,0 @@
1
- /**
2
- * A thin Next.js App Router wrapper for a Data Source. The core `dataSource()`
3
- * already returns a standard `(Request) => Promise<Response>`, which the App Router
4
- * accepts directly, so this helper adds only convenience: it names the handler
5
- * `POST` so your route file can export it in one line.
6
- *
7
- * // app/api/ablo/source/route.ts
8
- * import { dataSourceNext } from '@abloatai/ablo/source/next';
9
- * import { prismaDataSource } from '@abloatai/ablo/source';
10
- * import { schema } from '@/ablo/schema';
11
- * import { prisma } from '@/lib/prisma';
12
- *
13
- * export const { POST } = dataSourceNext({
14
- * schema,
15
- * apiKey: process.env.ABLO_API_KEY!,
16
- * adapter: prismaDataSource(prisma, schema),
17
- * });
18
- *
19
- * For hand-written handlers, or another framework, call the core `dataSource()`
20
- * directly and export its result however that framework expects.
21
- */
22
- import type { SchemaRecord } from '../transaction/schema/schema.js';
23
- import { type DataSourceOptions } from './factory.js';
24
- /**
25
- * The options for `dataSourceNext`, which are exactly the core
26
- * `DataSourceOptions`. Pass `{ schema, apiKey, adapter }`, the same shape
27
- * `dataSource()` takes.
28
- */
29
- export type DataSourceNextOptions<S extends SchemaRecord, TAuth = unknown> = DataSourceOptions<S, TAuth>;
30
- export declare function dataSourceNext<const S extends SchemaRecord, TAuth = unknown>(options: DataSourceNextOptions<S, TAuth>): {
31
- readonly POST: (request: Request) => Promise<Response>;
32
- };
@@ -1,25 +0,0 @@
1
- /**
2
- * A thin Next.js App Router wrapper for a Data Source. The core `dataSource()`
3
- * already returns a standard `(Request) => Promise<Response>`, which the App Router
4
- * accepts directly, so this helper adds only convenience: it names the handler
5
- * `POST` so your route file can export it in one line.
6
- *
7
- * // app/api/ablo/source/route.ts
8
- * import { dataSourceNext } from '@abloatai/ablo/source/next';
9
- * import { prismaDataSource } from '@abloatai/ablo/source';
10
- * import { schema } from '@/ablo/schema';
11
- * import { prisma } from '@/lib/prisma';
12
- *
13
- * export const { POST } = dataSourceNext({
14
- * schema,
15
- * apiKey: process.env.ABLO_API_KEY!,
16
- * adapter: prismaDataSource(prisma, schema),
17
- * });
18
- *
19
- * For hand-written handlers, or another framework, call the core `dataSource()`
20
- * directly and export its result however that framework expects.
21
- */
22
- import { dataSource } from './factory.js';
23
- export function dataSourceNext(options) {
24
- return { POST: dataSource(options) };
25
- }
@@ -1,134 +0,0 @@
1
- /**
2
- * A durable retry queue for delivering source events to the server.
3
- *
4
- * When your application changes a row, it can push the resulting event to
5
- * the server, which acknowledges delivery synchronously. If your process
6
- * crashes mid-call, the network drops, or the server returns a 5xx, that
7
- * event would be lost without a safety net. This queue is the safety net:
8
- * it persists each event first, then delivers it from a background worker
9
- * with automatic retries. (Polling the change feed is the slower fallback
10
- * for anything the queue never manages to deliver.)
11
- *
12
- * The queue follows a familiar enqueue-and-worker shape:
13
- *
14
- * - `enqueue(events)` returns as soon as the events are persisted.
15
- * - A background worker delivers them and retries on failure, following
16
- * the Standard Webhooks schedule (0, 5s, 5m, 30m, 2h, 5h, 10h, 14h,
17
- * 20h, 24h — roughly three days in total).
18
- * - Items that exhaust every retry move to a dead-letter queue you can
19
- * monitor.
20
- *
21
- * Persistence is pluggable through {@link PushQueueStorage}. Use
22
- * {@link InMemoryPushQueueStorage} for a single process, or implement that
23
- * interface against your own outbox table for production durability.
24
- */
25
- import type { SourceEvent } from './types.js';
26
- /** One queued delivery: a batch of source events plus its retry bookkeeping. */
27
- export interface PushQueueItem {
28
- readonly id: string;
29
- readonly events: readonly SourceEvent[];
30
- readonly attempts: number;
31
- /** When the next attempt is due, in epoch milliseconds. The worker skips items due later. */
32
- readonly nextAttemptAt: number;
33
- /** The most recent error message, set once an attempt has failed. */
34
- readonly lastError?: string;
35
- /** `pending` while awaiting delivery, `delivered` on success, `dlq` once retries are exhausted. */
36
- readonly status: 'pending' | 'delivered' | 'dlq';
37
- }
38
- /**
39
- * The persistence behind a {@link PushQueue}. Implement it against your own
40
- * durable table (or use {@link InMemoryPushQueueStorage}) so queued events
41
- * survive a process restart. The queue calls these methods; you decide where
42
- * the rows actually live.
43
- */
44
- export interface PushQueueStorage {
45
- /**
46
- * Append a new item and return the persisted record. Generate a stable id
47
- * — it doubles as the `webhook-id` on the delivered request — and set
48
- * `nextAttemptAt` to the current time so the item is due immediately.
49
- */
50
- enqueue(events: readonly SourceEvent[]): Promise<PushQueueItem>;
51
- /** Return pending items whose `nextAttemptAt` is at or before `now`, up to `limit`. */
52
- due(now: number, limit: number): Promise<readonly PushQueueItem[]>;
53
- /** Increase the attempt count and set the next attempt time after a failed delivery. */
54
- reschedule(id: string, nextAttemptAt: number, lastError: string): Promise<void>;
55
- /** Mark the item delivered so no further attempts are made. */
56
- markDelivered(id: string): Promise<void>;
57
- /** Move the item to the dead-letter queue after its retries are exhausted. */
58
- markDlq(id: string, lastError: string): Promise<void>;
59
- /** Read the dead-letter queue. Your monitoring reads this to surface deliveries that never succeeded. */
60
- listDlq(): Promise<readonly PushQueueItem[]>;
61
- }
62
- /**
63
- * The default retry schedule, taken from the Standard Webhooks
64
- * specification. The index is the attempt number and the value is the delay
65
- * in milliseconds after the previous attempt failed. Once an item runs off
66
- * the end of this array, it moves to the dead-letter queue.
67
- *
68
- * See https://www.standardwebhooks.com/.
69
- */
70
- export declare const STANDARD_WEBHOOKS_RETRY_SCHEDULE: readonly number[];
71
- /** Configuration for {@link createPushQueue}. */
72
- export interface PushQueueOptions {
73
- /** The URL the worker delivers events to. */
74
- readonly endpoint: string;
75
- /** The API key used to sign each delivery. */
76
- readonly apiKey: string;
77
- /** Where queued items are persisted. */
78
- readonly storage: PushQueueStorage;
79
- /**
80
- * Override the retry delays. Defaults to {@link STANDARD_WEBHOOKS_RETRY_SCHEDULE}.
81
- * The number of attempts equals the array length, and the i-th entry is the
82
- * delay after attempt `i` failed.
83
- */
84
- readonly retrySchedule?: readonly number[];
85
- /** How often the worker checks for due items, in milliseconds. Defaults to 1000. */
86
- readonly tickIntervalMs?: number;
87
- /** The most items the worker delivers per tick. Defaults to 50. */
88
- readonly batchSize?: number;
89
- /** A custom fetch implementation, for tests or runtimes without a global `fetch`. */
90
- readonly fetch?: typeof fetch;
91
- /** A custom clock source, mainly for tests. Defaults to `Date.now`. */
92
- readonly now?: () => number;
93
- /** Random jitter applied to each retry delay, as a fraction. Defaults to ±10%; set 0 to disable. */
94
- readonly jitter?: number;
95
- /** Called when an item is dead-lettered or the worker loop hits an error. */
96
- readonly onError?: (item: PushQueueItem, err: unknown) => void;
97
- }
98
- /** A running push queue: persist events, deliver them, and recover dead-lettered ones. */
99
- export interface PushQueue {
100
- /** Persist a batch of events for delivery and return the queued item. */
101
- enqueue(events: readonly SourceEvent[]): Promise<PushQueueItem>;
102
- /** Run the delivery worker until `signal` aborts. */
103
- run(signal: AbortSignal): Promise<void>;
104
- /**
105
- * Re-enqueue every dead-lettered item for another round of delivery. Call
106
- * this yourself once you have fixed whatever caused the failures. Returns
107
- * the number of items re-enqueued.
108
- */
109
- redriveDlq(): Promise<number>;
110
- }
111
- /** Create a {@link PushQueue} from the given {@link PushQueueOptions}. */
112
- export declare function createPushQueue(options: PushQueueOptions): PushQueue;
113
- /**
114
- * A {@link PushQueueStorage} that keeps items in memory. It is not durable —
115
- * items are lost when the process restarts — so it suits development and
116
- * low-volume use. For production, implement {@link PushQueueStorage} against
117
- * your own table.
118
- */
119
- export declare class InMemoryPushQueueStorage implements PushQueueStorage {
120
- private items;
121
- private nextId;
122
- private readonly now;
123
- constructor(options?: {
124
- now?: () => number;
125
- });
126
- enqueue(events: readonly SourceEvent[]): Promise<PushQueueItem>;
127
- due(now: number, limit: number): Promise<readonly PushQueueItem[]>;
128
- reschedule(id: string, nextAttemptAt: number, lastError: string): Promise<void>;
129
- markDelivered(id: string): Promise<void>;
130
- markDlq(id: string, lastError: string): Promise<void>;
131
- listDlq(): Promise<readonly PushQueueItem[]>;
132
- /** Test helper — read all items regardless of status. */
133
- snapshot(): readonly PushQueueItem[];
134
- }
@@ -1,256 +0,0 @@
1
- /**
2
- * A durable retry queue for delivering source events to the server.
3
- *
4
- * When your application changes a row, it can push the resulting event to
5
- * the server, which acknowledges delivery synchronously. If your process
6
- * crashes mid-call, the network drops, or the server returns a 5xx, that
7
- * event would be lost without a safety net. This queue is the safety net:
8
- * it persists each event first, then delivers it from a background worker
9
- * with automatic retries. (Polling the change feed is the slower fallback
10
- * for anything the queue never manages to deliver.)
11
- *
12
- * The queue follows a familiar enqueue-and-worker shape:
13
- *
14
- * - `enqueue(events)` returns as soon as the events are persisted.
15
- * - A background worker delivers them and retries on failure, following
16
- * the Standard Webhooks schedule (0, 5s, 5m, 30m, 2h, 5h, 10h, 14h,
17
- * 20h, 24h — roughly three days in total).
18
- * - Items that exhaust every retry move to a dead-letter queue you can
19
- * monitor.
20
- *
21
- * Persistence is pluggable through {@link PushQueueStorage}. Use
22
- * {@link InMemoryPushQueueStorage} for a single process, or implement that
23
- * interface against your own outbox table for production durability.
24
- */
25
- import { ABLO_SOURCE_HEADERS, signAbloSourceRequest } from './signing.js';
26
- /**
27
- * The default retry schedule, taken from the Standard Webhooks
28
- * specification. The index is the attempt number and the value is the delay
29
- * in milliseconds after the previous attempt failed. Once an item runs off
30
- * the end of this array, it moves to the dead-letter queue.
31
- *
32
- * See https://www.standardwebhooks.com/.
33
- */
34
- export const STANDARD_WEBHOOKS_RETRY_SCHEDULE = [
35
- 0, // immediate
36
- 5_000, // 5s
37
- 5 * 60_000, // 5m
38
- 30 * 60_000, // 30m
39
- 2 * 60 * 60_000, // 2h
40
- 5 * 60 * 60_000, // 5h
41
- 10 * 60 * 60_000, // 10h
42
- 14 * 60 * 60_000, // 14h
43
- 20 * 60 * 60_000, // 20h
44
- 24 * 60 * 60_000, // 24h
45
- ];
46
- /** Create a {@link PushQueue} from the given {@link PushQueueOptions}. */
47
- export function createPushQueue(options) {
48
- const tickIntervalMs = options.tickIntervalMs ?? 1000;
49
- const batchSize = options.batchSize ?? 50;
50
- const fetchImpl = options.fetch ?? fetch;
51
- const now = options.now ?? Date.now;
52
- const schedule = options.retrySchedule ?? STANDARD_WEBHOOKS_RETRY_SCHEDULE;
53
- const jitter = options.jitter ?? 0.1;
54
- return {
55
- async enqueue(events) {
56
- return options.storage.enqueue(events);
57
- },
58
- async run(signal) {
59
- while (!signal.aborted) {
60
- try {
61
- const due = await options.storage.due(now(), batchSize);
62
- for (const item of due) {
63
- if (signal.aborted)
64
- return;
65
- await deliver(item);
66
- }
67
- }
68
- catch (err) {
69
- // Storage failures shouldn't kill the loop; surface and
70
- // back off the tick interval.
71
- options.onError?.({ id: 'storage', events: [], attempts: 0, nextAttemptAt: 0, status: 'pending' }, err);
72
- }
73
- await sleep(tickIntervalMs, signal);
74
- }
75
- },
76
- async redriveDlq() {
77
- const items = await options.storage.listDlq();
78
- let redriven = 0;
79
- for (const item of items) {
80
- await options.storage.enqueue(item.events);
81
- redriven++;
82
- }
83
- return redriven;
84
- },
85
- };
86
- async function deliver(item) {
87
- const rawBody = JSON.stringify({ events: item.events });
88
- let signed;
89
- try {
90
- signed = await signAbloSourceRequest({
91
- apiKey: options.apiKey,
92
- body: rawBody,
93
- timestamp: Math.floor(now() / 1000),
94
- // Reuse the queue id as the webhook-id across all retry
95
- // attempts so the receiver can dedupe replays per spec.
96
- messageId: item.id,
97
- });
98
- }
99
- catch (err) {
100
- // Signing should not fail in practice (no network, just HMAC).
101
- // If it does, treat as a permanent failure.
102
- await options.storage.markDlq(item.id, formatError(err));
103
- options.onError?.(item, err);
104
- return;
105
- }
106
- let response;
107
- try {
108
- response = await fetchImpl(options.endpoint, {
109
- method: 'POST',
110
- headers: {
111
- 'Content-Type': 'application/json',
112
- ...signed.headers,
113
- [ABLO_SOURCE_HEADERS.idempotencyKey]: item.id,
114
- },
115
- body: rawBody,
116
- });
117
- }
118
- catch (err) {
119
- await reschedule(item, formatError(err));
120
- return;
121
- }
122
- if (response.ok) {
123
- await options.storage.markDelivered(item.id);
124
- return;
125
- }
126
- // 4xx other than 408/429 are unrecoverable — don't retry. Move
127
- // straight to DLQ so the customer's monitoring catches the bad
128
- // request shape early instead of waiting 3 days for retries.
129
- if (response.status >= 400 &&
130
- response.status < 500 &&
131
- response.status !== 408 &&
132
- response.status !== 429) {
133
- await options.storage.markDlq(item.id, `HTTP ${response.status}`);
134
- return;
135
- }
136
- await reschedule(item, `HTTP ${response.status}`);
137
- }
138
- async function reschedule(item, error) {
139
- const nextAttempt = item.attempts + 1;
140
- // Past the end of the backoff schedule: no attempts left, so dead-letter
141
- // the item.
142
- const backoff = schedule[nextAttempt];
143
- if (backoff === undefined) {
144
- await options.storage.markDlq(item.id, error);
145
- options.onError?.(item, new Error(error));
146
- return;
147
- }
148
- const delay = applyJitter(backoff, jitter);
149
- await options.storage.reschedule(item.id, now() + delay, error);
150
- }
151
- }
152
- /**
153
- * A {@link PushQueueStorage} that keeps items in memory. It is not durable —
154
- * items are lost when the process restarts — so it suits development and
155
- * low-volume use. For production, implement {@link PushQueueStorage} against
156
- * your own table.
157
- */
158
- export class InMemoryPushQueueStorage {
159
- items = new Map();
160
- nextId = 0;
161
- now;
162
- constructor(options = {}) {
163
- this.now = options.now ?? Date.now;
164
- }
165
- async enqueue(events) {
166
- const id = `q_${(++this.nextId).toString(36)}_${Math.random()
167
- .toString(36)
168
- .slice(2, 8)}`;
169
- const item = {
170
- id,
171
- events,
172
- attempts: 0,
173
- nextAttemptAt: this.now(),
174
- status: 'pending',
175
- };
176
- this.items.set(id, item);
177
- return item;
178
- }
179
- async due(now, limit) {
180
- const out = [];
181
- for (const item of this.items.values()) {
182
- if (out.length >= limit)
183
- break;
184
- if (item.status !== 'pending')
185
- continue;
186
- if (item.nextAttemptAt > now)
187
- continue;
188
- out.push(item);
189
- }
190
- return out;
191
- }
192
- async reschedule(id, nextAttemptAt, lastError) {
193
- const item = this.items.get(id);
194
- if (!item)
195
- return;
196
- this.items.set(id, {
197
- ...item,
198
- attempts: item.attempts + 1,
199
- nextAttemptAt,
200
- lastError,
201
- });
202
- }
203
- async markDelivered(id) {
204
- const item = this.items.get(id);
205
- if (!item)
206
- return;
207
- this.items.set(id, { ...item, status: 'delivered' });
208
- }
209
- async markDlq(id, lastError) {
210
- const item = this.items.get(id);
211
- if (!item)
212
- return;
213
- this.items.set(id, {
214
- ...item,
215
- attempts: item.attempts + 1,
216
- status: 'dlq',
217
- lastError,
218
- });
219
- }
220
- async listDlq() {
221
- return Array.from(this.items.values()).filter((i) => i.status === 'dlq');
222
- }
223
- /** Test helper — read all items regardless of status. */
224
- snapshot() {
225
- return Array.from(this.items.values());
226
- }
227
- }
228
- function applyJitter(delayMs, factor) {
229
- if (factor <= 0 || delayMs === 0)
230
- return delayMs;
231
- const swing = delayMs * factor;
232
- return Math.max(0, delayMs + (Math.random() * 2 - 1) * swing);
233
- }
234
- function formatError(err) {
235
- if (err instanceof Error)
236
- return err.message;
237
- return String(err);
238
- }
239
- function sleep(ms, signal) {
240
- return new Promise((resolve) => {
241
- if (signal.aborted) {
242
- resolve();
243
- return;
244
- }
245
- const timer = setTimeout(() => {
246
- signal.removeEventListener('abort', onAbort);
247
- resolve();
248
- }, ms);
249
- const onAbort = () => {
250
- clearTimeout(timer);
251
- signal.removeEventListener('abort', onAbort);
252
- resolve();
253
- };
254
- signal.addEventListener('abort', onAbort, { once: true });
255
- });
256
- }
@@ -1,92 +0,0 @@
1
- /**
2
- * Signs and verifies source requests using the Standard Webhooks scheme.
3
- *
4
- * Every request Ablo sends to a data source is signed with that source's API
5
- * key, and the receiving endpoint verifies the signature before any handler
6
- * runs. This module provides both halves: {@link signAbloSourceRequest} for
7
- * the sender and {@link verifyAbloSourceRequest} for the receiver. Because the
8
- * signature format follows the Standard Webhooks specification, you can verify
9
- * it with any compatible library instead of these functions if you prefer.
10
- */
11
- /** Inputs to {@link signAbloSourceRequest}. */
12
- export interface SourceSignatureOptions {
13
- /** The API key to sign with; the receiver verifies against the same key. */
14
- readonly apiKey: string;
15
- /** The exact request body being signed. */
16
- readonly body: string;
17
- /**
18
- * The unique message id, sent as the `webhook-id` header. It is folded into
19
- * the signature to defend against replay, and receivers may deduplicate on
20
- * it. Retries of the same request must reuse the same id.
21
- */
22
- readonly messageId: string;
23
- /** The signing time as a Unix timestamp in seconds. Defaults to the current time. */
24
- readonly timestamp?: number;
25
- }
26
- /** Inputs to {@link verifyAbloSourceRequest}. */
27
- export interface SourceSignatureVerificationOptions {
28
- /**
29
- * The incoming request, whose headers carry the signature to check. Any
30
- * request-shaped object works: a fetch `Request` (its `Headers` is read with
31
- * `.get`), or a plain header record like Node's `req.headers` — matching
32
- * what the runtime has always accepted.
33
- */
34
- readonly request: {
35
- readonly headers?: Headers | Record<string, string | string[] | undefined>;
36
- };
37
- /** The request body, which must match what was signed. */
38
- readonly body: string;
39
- /** The API key to verify against. */
40
- readonly apiKey: string;
41
- /**
42
- * How far the request's timestamp may differ from the current clock, in
43
- * milliseconds, before it is rejected as expired. Defaults to five minutes.
44
- */
45
- readonly toleranceMs?: number;
46
- }
47
- /** What {@link verifyAbloSourceRequest} returns once a signature checks out. */
48
- export interface SourceSignatureVerificationResult {
49
- /** The verified `webhook-id` of the request. */
50
- readonly messageId: string;
51
- /** The time the request was signed, as a Unix timestamp in seconds. */
52
- readonly signedAt: number;
53
- }
54
- /**
55
- * The HTTP header names carried on a signed source request. They follow the
56
- * Standard Webhooks specification (https://www.standardwebhooks.com/), so you
57
- * can verify the signature with any compatible library rather than
58
- * {@link verifyAbloSourceRequest} if you prefer.
59
- */
60
- export declare const ABLO_SOURCE_HEADERS: {
61
- readonly signature: "webhook-signature";
62
- readonly timestamp: "webhook-timestamp";
63
- readonly id: "webhook-id";
64
- readonly idempotencyKey: "Idempotency-Key";
65
- };
66
- /**
67
- * Thrown when a source request fails signature verification. The
68
- * {@link SourceSignatureError.code} names the specific reason — a missing
69
- * header, a malformed or expired timestamp, or a signature that does not
70
- * match.
71
- */
72
- export declare class SourceSignatureError extends Error {
73
- readonly code: 'source_signature_missing' | 'source_id_missing' | 'source_timestamp_missing' | 'source_timestamp_invalid' | 'source_timestamp_expired' | 'source_signature_invalid' | 'source_forbidden';
74
- constructor(code: SourceSignatureError['code'], message: string);
75
- }
76
- /**
77
- * Sign a source request and return the headers to send with it. The signature
78
- * covers the message id, the timestamp, and the body, so any change to those
79
- * invalidates it. The receiver checks it with {@link verifyAbloSourceRequest}.
80
- */
81
- export declare function signAbloSourceRequest(options: SourceSignatureOptions): Promise<{
82
- readonly headers: Record<string, string>;
83
- readonly signedAt: number;
84
- readonly signature: string;
85
- }>;
86
- /**
87
- * Verify a signed source request, throwing {@link SourceSignatureError} when
88
- * the message id, timestamp, or signature is missing, malformed, or outside
89
- * the allowed clock-skew window. On success it returns the request's message
90
- * id and signing time. This is the counterpart to {@link signAbloSourceRequest}.
91
- */
92
- export declare function verifyAbloSourceRequest(options: SourceSignatureVerificationOptions): Promise<SourceSignatureVerificationResult>;