@abloatai/ablo 0.36.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 (597) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +71 -2013
  3. package/NOTICE +2 -2
  4. package/README.md +25 -71
  5. package/assets/banner.png +0 -0
  6. package/dist/auth.d.ts +2 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +2 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/client.d.ts +3 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +3 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/coordination.d.ts +2 -0
  15. package/dist/coordination.d.ts.map +1 -0
  16. package/dist/coordination.js +2 -0
  17. package/dist/coordination.js.map +1 -0
  18. package/dist/index.d.ts +3 -114
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +3 -163
  21. package/dist/index.js.map +1 -0
  22. package/dist/react.d.ts +4 -0
  23. package/dist/react.d.ts.map +1 -0
  24. package/dist/react.js +3 -0
  25. package/dist/react.js.map +1 -0
  26. package/dist/schema.d.ts +2 -0
  27. package/dist/schema.d.ts.map +1 -0
  28. package/dist/schema.js +2 -0
  29. package/dist/schema.js.map +1 -0
  30. package/dist/server.d.ts +2 -0
  31. package/dist/server.d.ts.map +1 -0
  32. package/dist/server.js +2 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/source-conformance.d.ts +2 -0
  35. package/dist/source-conformance.d.ts.map +1 -0
  36. package/dist/source-conformance.js +2 -0
  37. package/dist/source-conformance.js.map +1 -0
  38. package/dist/source-drizzle.d.ts +2 -0
  39. package/dist/source-drizzle.d.ts.map +1 -0
  40. package/dist/source-drizzle.js +2 -0
  41. package/dist/source-drizzle.js.map +1 -0
  42. package/dist/source-kysely.d.ts +2 -0
  43. package/dist/source-kysely.d.ts.map +1 -0
  44. package/dist/source-kysely.js +2 -0
  45. package/dist/source-kysely.js.map +1 -0
  46. package/dist/source-next.d.ts +2 -0
  47. package/dist/source-next.d.ts.map +1 -0
  48. package/dist/source-next.js +2 -0
  49. package/dist/source-next.js.map +1 -0
  50. package/dist/source.d.ts +2 -0
  51. package/dist/source.d.ts.map +1 -0
  52. package/dist/source.js +2 -0
  53. package/dist/source.js.map +1 -0
  54. package/dist/wire.d.ts +2 -0
  55. package/dist/wire.d.ts.map +1 -0
  56. package/dist/wire.js +2 -0
  57. package/dist/wire.js.map +1 -0
  58. package/docs/agents.md +1 -1
  59. package/docs/api-keys.md +7 -6
  60. package/docs/api.md +10 -10
  61. package/docs/client-behavior.md +5 -5
  62. package/docs/coordination.md +52 -62
  63. package/docs/data-sources.md +1 -1
  64. package/docs/examples/agent-human.md +4 -4
  65. package/docs/examples/ai-sdk-tool.md +1 -1
  66. package/docs/examples/existing-python-backend.md +15 -4
  67. package/docs/examples/nextjs.md +27 -6
  68. package/docs/examples/server-agent.md +2 -2
  69. package/docs/how-it-works.md +4 -4
  70. package/docs/identity.md +2 -1
  71. package/docs/integration-guide.md +24 -13
  72. package/docs/internal/README.md +18 -0
  73. package/docs/internal/agent-fleet-coordination-design.md +171 -0
  74. package/docs/internal/agent-orchestration.md +58 -0
  75. package/docs/internal/commit-identifiers.md +91 -0
  76. package/docs/internal/concurrency-open-decisions.md +37 -0
  77. package/docs/internal/data-source-reverse-channel.md +150 -0
  78. package/docs/internal/per-field-conflict-detection.md +165 -0
  79. package/docs/internal/postgres-replication.md +64 -0
  80. package/docs/internal/serializable-schema.md +119 -0
  81. package/docs/internal/structure.md +32 -0
  82. package/docs/mcp.md +2 -2
  83. package/docs/migration.md +3 -3
  84. package/docs/quickstart.md +2 -2
  85. package/docs/react.md +5 -5
  86. package/docs/schema-contract.md +3 -3
  87. package/docs/sessions.md +91 -37
  88. package/examples/README.md +2 -2
  89. package/examples/data-source/README.md +1 -1
  90. package/examples/data-source/ablo-driver.ts +1 -1
  91. package/examples/data-source/customer-server.ts +1 -1
  92. package/examples/data-source/run.ts +1 -1
  93. package/examples/data-source/schema.ts +1 -1
  94. package/examples/quickstart.ts +2 -2
  95. package/llms.txt +8 -8
  96. package/package.json +63 -166
  97. package/bin/ablo.cjs +0 -39
  98. package/dist/BaseSyncedStore.d.ts +0 -843
  99. package/dist/BaseSyncedStore.js +0 -1971
  100. package/dist/Database.d.ts +0 -323
  101. package/dist/Database.js +0 -1502
  102. package/dist/InstanceCache.d.ts +0 -237
  103. package/dist/InstanceCache.js +0 -1166
  104. package/dist/LazyReferenceCollection.d.ts +0 -177
  105. package/dist/LazyReferenceCollection.js +0 -461
  106. package/dist/Model.d.ts +0 -454
  107. package/dist/Model.js +0 -919
  108. package/dist/ModelRegistry.d.ts +0 -225
  109. package/dist/ModelRegistry.js +0 -539
  110. package/dist/NetworkMonitor.d.ts +0 -28
  111. package/dist/NetworkMonitor.js +0 -79
  112. package/dist/RuntimeContext.d.ts +0 -52
  113. package/dist/RuntimeContext.js +0 -80
  114. package/dist/SyncClient.d.ts +0 -541
  115. package/dist/SyncClient.js +0 -2202
  116. package/dist/adapters/alwaysOnline.d.ts +0 -14
  117. package/dist/adapters/alwaysOnline.js +0 -17
  118. package/dist/adapters/inMemoryStorage.d.ts +0 -31
  119. package/dist/adapters/inMemoryStorage.js +0 -110
  120. package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
  121. package/dist/ai-sdk/coordinatedTool.js +0 -134
  122. package/dist/ai-sdk/coordinationContext.d.ts +0 -46
  123. package/dist/ai-sdk/coordinationContext.js +0 -106
  124. package/dist/ai-sdk/index.d.ts +0 -121
  125. package/dist/ai-sdk/index.js +0 -121
  126. package/dist/ai-sdk/wrap.d.ts +0 -65
  127. package/dist/ai-sdk/wrap.js +0 -39
  128. package/dist/auth/index.d.ts +0 -1
  129. package/dist/auth/index.js +0 -8
  130. package/dist/batching/index.d.ts +0 -55
  131. package/dist/batching/index.js +0 -147
  132. package/dist/client/Ablo.d.ts +0 -231
  133. package/dist/client/Ablo.js +0 -160
  134. package/dist/client/abloClient.d.ts +0 -309
  135. package/dist/client/abloClient.js +0 -13
  136. package/dist/client/clientPrelude.d.ts +0 -52
  137. package/dist/client/clientPrelude.js +0 -60
  138. package/dist/client/consoleLogger.d.ts +0 -35
  139. package/dist/client/consoleLogger.js +0 -44
  140. package/dist/client/coreClient.d.ts +0 -60
  141. package/dist/client/coreClient.js +0 -118
  142. package/dist/client/createInternalComponents.d.ts +0 -50
  143. package/dist/client/createInternalComponents.js +0 -98
  144. package/dist/client/createModelProxy.d.ts +0 -248
  145. package/dist/client/createModelProxy.js +0 -884
  146. package/dist/client/humans.d.ts +0 -69
  147. package/dist/client/humans.js +0 -78
  148. package/dist/client/modelRegistration.d.ts +0 -10
  149. package/dist/client/modelRegistration.js +0 -312
  150. package/dist/client/options.d.ts +0 -461
  151. package/dist/client/options.js +0 -7
  152. package/dist/client/reactiveEngine.d.ts +0 -53
  153. package/dist/client/reactiveEngine.js +0 -688
  154. package/dist/client/resourceTypes.d.ts +0 -12
  155. package/dist/client/resourceTypes.js +0 -10
  156. package/dist/client/schemaConfig.d.ts +0 -44
  157. package/dist/client/schemaConfig.js +0 -185
  158. package/dist/client/storeCluster.d.ts +0 -47
  159. package/dist/client/storeCluster.js +0 -118
  160. package/dist/client/storeLifecycle.d.ts +0 -61
  161. package/dist/client/storeLifecycle.js +0 -231
  162. package/dist/client/validateAbloOptions.d.ts +0 -42
  163. package/dist/client/validateAbloOptions.js +0 -43
  164. package/dist/client/wsMutationExecutor.d.ts +0 -27
  165. package/dist/client/wsMutationExecutor.js +0 -72
  166. package/dist/context.d.ts +0 -42
  167. package/dist/context.js +0 -81
  168. package/dist/coordination/ClaimLog.d.ts +0 -26
  169. package/dist/coordination/ClaimLog.js +0 -32
  170. package/dist/coordination/index.d.ts +0 -1
  171. package/dist/coordination/index.js +0 -8
  172. package/dist/core/index.d.ts +0 -33
  173. package/dist/core/index.js +0 -48
  174. package/dist/docs/catalog.d.ts +0 -72
  175. package/dist/docs/catalog.js +0 -230
  176. package/dist/docs/index.d.ts +0 -10
  177. package/dist/docs/index.js +0 -10
  178. package/dist/environment.d.ts +0 -1
  179. package/dist/environment.js +0 -8
  180. package/dist/interfaces/index.d.ts +0 -311
  181. package/dist/interfaces/index.js +0 -9
  182. package/dist/keys/index.d.ts +0 -1
  183. package/dist/keys/index.js +0 -8
  184. package/dist/mutators/RecordingMutation.d.ts +0 -36
  185. package/dist/mutators/RecordingMutation.js +0 -182
  186. package/dist/mutators/Transaction.d.ts +0 -40
  187. package/dist/mutators/Transaction.js +0 -58
  188. package/dist/mutators/UndoManager.d.ts +0 -258
  189. package/dist/mutators/UndoManager.js +0 -658
  190. package/dist/mutators/defineMutators.d.ts +0 -60
  191. package/dist/mutators/defineMutators.js +0 -18
  192. package/dist/mutators/inverseOp.d.ts +0 -126
  193. package/dist/mutators/inverseOp.js +0 -71
  194. package/dist/mutators/mutateActions.d.ts +0 -45
  195. package/dist/mutators/mutateActions.js +0 -105
  196. package/dist/mutators/readerActions.d.ts +0 -33
  197. package/dist/mutators/readerActions.js +0 -57
  198. package/dist/mutators/undoApply.d.ts +0 -51
  199. package/dist/mutators/undoApply.js +0 -117
  200. package/dist/policy/index.d.ts +0 -21
  201. package/dist/policy/index.js +0 -20
  202. package/dist/query/QueryProcessor.d.ts +0 -75
  203. package/dist/query/QueryProcessor.js +0 -255
  204. package/dist/query/client.d.ts +0 -64
  205. package/dist/query/client.js +0 -138
  206. package/dist/query/types.d.ts +0 -85
  207. package/dist/query/types.js +0 -16
  208. package/dist/react/AbloProvider.d.ts +0 -242
  209. package/dist/react/AbloProvider.js +0 -458
  210. package/dist/react/ClientSideSuspense.d.ts +0 -36
  211. package/dist/react/ClientSideSuspense.js +0 -17
  212. package/dist/react/DefaultFallback.d.ts +0 -24
  213. package/dist/react/DefaultFallback.js +0 -43
  214. package/dist/react/context.d.ts +0 -55
  215. package/dist/react/context.js +0 -29
  216. package/dist/react/createAbloReact.d.ts +0 -56
  217. package/dist/react/createAbloReact.js +0 -51
  218. package/dist/react/index.d.ts +0 -62
  219. package/dist/react/index.js +0 -69
  220. package/dist/react/internalContext.d.ts +0 -33
  221. package/dist/react/internalContext.js +0 -3
  222. package/dist/react/useAblo.d.ts +0 -82
  223. package/dist/react/useAblo.js +0 -120
  224. package/dist/react/useCurrentUserId.d.ts +0 -22
  225. package/dist/react/useCurrentUserId.js +0 -34
  226. package/dist/react/useErrorListener.d.ts +0 -20
  227. package/dist/react/useErrorListener.js +0 -38
  228. package/dist/react/useMutationFailureListener.d.ts +0 -26
  229. package/dist/react/useMutationFailureListener.js +0 -38
  230. package/dist/react/useMutators.d.ts +0 -56
  231. package/dist/react/useMutators.js +0 -84
  232. package/dist/react/useReactive.d.ts +0 -35
  233. package/dist/react/useReactive.js +0 -123
  234. package/dist/react/useSyncStatus.d.ts +0 -59
  235. package/dist/react/useSyncStatus.js +0 -76
  236. package/dist/react/useUndoScope.d.ts +0 -34
  237. package/dist/react/useUndoScope.js +0 -81
  238. package/dist/schema/coordination.d.ts +0 -112
  239. package/dist/schema/coordination.js +0 -133
  240. package/dist/schema/ddl.d.ts +0 -97
  241. package/dist/schema/ddl.js +0 -491
  242. package/dist/schema/ddlLock.d.ts +0 -35
  243. package/dist/schema/ddlLock.js +0 -46
  244. package/dist/schema/diff.d.ts +0 -225
  245. package/dist/schema/diff.js +0 -289
  246. package/dist/schema/generate.d.ts +0 -19
  247. package/dist/schema/generate.js +0 -86
  248. package/dist/schema/index.d.ts +0 -42
  249. package/dist/schema/index.js +0 -80
  250. package/dist/schema/queries.d.ts +0 -201
  251. package/dist/schema/queries.js +0 -144
  252. package/dist/schema/select.d.ts +0 -40
  253. package/dist/schema/select.js +0 -90
  254. package/dist/schema/serialize.d.ts +0 -115
  255. package/dist/schema/serialize.js +0 -265
  256. package/dist/schema/sugar.d.ts +0 -109
  257. package/dist/schema/sugar.js +0 -83
  258. package/dist/schema/syncDeltaRow.d.ts +0 -6
  259. package/dist/schema/syncDeltaRow.js +0 -6
  260. package/dist/server/adapter.d.ts +0 -173
  261. package/dist/server/adapter.js +0 -18
  262. package/dist/server/commit.d.ts +0 -107
  263. package/dist/server/commit.js +0 -1
  264. package/dist/server/index.d.ts +0 -14
  265. package/dist/server/index.js +0 -2
  266. package/dist/server/readConfig.d.ts +0 -80
  267. package/dist/server/readConfig.js +0 -8
  268. package/dist/server/storageMode.d.ts +0 -23
  269. package/dist/server/storageMode.js +0 -17
  270. package/dist/source/adapter.d.ts +0 -83
  271. package/dist/source/adapter.js +0 -24
  272. package/dist/source/adapters/drizzle.d.ts +0 -48
  273. package/dist/source/adapters/drizzle.js +0 -219
  274. package/dist/source/adapters/kysely.d.ts +0 -42
  275. package/dist/source/adapters/kysely.js +0 -205
  276. package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
  277. package/dist/source/adapters/kyselyMutationCore.js +0 -125
  278. package/dist/source/adapters/memory.d.ts +0 -13
  279. package/dist/source/adapters/memory.js +0 -130
  280. package/dist/source/adapters/prisma.d.ts +0 -63
  281. package/dist/source/adapters/prisma.js +0 -202
  282. package/dist/source/conformance.d.ts +0 -37
  283. package/dist/source/conformance.js +0 -215
  284. package/dist/source/connector.d.ts +0 -95
  285. package/dist/source/connector.js +0 -266
  286. package/dist/source/connectorProtocol.d.ts +0 -154
  287. package/dist/source/connectorProtocol.js +0 -163
  288. package/dist/source/contract.d.ts +0 -195
  289. package/dist/source/contract.js +0 -164
  290. package/dist/source/factory.d.ts +0 -92
  291. package/dist/source/factory.js +0 -286
  292. package/dist/source/idempotency.d.ts +0 -61
  293. package/dist/source/idempotency.js +0 -144
  294. package/dist/source/index.d.ts +0 -23
  295. package/dist/source/index.js +0 -30
  296. package/dist/source/migrations.d.ts +0 -21
  297. package/dist/source/migrations.js +0 -103
  298. package/dist/source/next.d.ts +0 -32
  299. package/dist/source/next.js +0 -25
  300. package/dist/source/pushQueue.d.ts +0 -134
  301. package/dist/source/pushQueue.js +0 -256
  302. package/dist/source/signing.d.ts +0 -92
  303. package/dist/source/signing.js +0 -162
  304. package/dist/source/types.d.ts +0 -401
  305. package/dist/source/types.js +0 -59
  306. package/dist/storeContract.d.ts +0 -145
  307. package/dist/storeContract.js +0 -12
  308. package/dist/stores/DatabaseManager.d.ts +0 -107
  309. package/dist/stores/DatabaseManager.js +0 -388
  310. package/dist/stores/ObjectStore.d.ts +0 -115
  311. package/dist/stores/ObjectStore.js +0 -393
  312. package/dist/stores/ObjectStoreContract.d.ts +0 -38
  313. package/dist/stores/ObjectStoreContract.js +0 -1
  314. package/dist/stores/StoreManager.d.ts +0 -114
  315. package/dist/stores/StoreManager.js +0 -304
  316. package/dist/stores/SyncActionStore.d.ts +0 -99
  317. package/dist/stores/SyncActionStore.js +0 -506
  318. package/dist/stores/openIDBWithTimeout.d.ts +0 -65
  319. package/dist/stores/openIDBWithTimeout.js +0 -153
  320. package/dist/stores/syncAction.d.ts +0 -26
  321. package/dist/stores/syncAction.js +0 -16
  322. package/dist/surface.d.ts +0 -36
  323. package/dist/surface.js +0 -75
  324. package/dist/sync/BootstrapFetcher.d.ts +0 -284
  325. package/dist/sync/BootstrapFetcher.js +0 -964
  326. package/dist/sync/ConnectionManager.d.ts +0 -8
  327. package/dist/sync/ConnectionManager.js +0 -8
  328. package/dist/sync/OnDemandLoader.d.ts +0 -231
  329. package/dist/sync/OnDemandLoader.js +0 -743
  330. package/dist/sync/SubscriptionManager.d.ts +0 -159
  331. package/dist/sync/SubscriptionManager.js +0 -243
  332. package/dist/sync/SyncWebSocket.d.ts +0 -173
  333. package/dist/sync/SyncWebSocket.js +0 -438
  334. package/dist/sync/awaitClaimGrant.d.ts +0 -6
  335. package/dist/sync/awaitClaimGrant.js +0 -6
  336. package/dist/sync/bootstrapApply.d.ts +0 -73
  337. package/dist/sync/bootstrapApply.js +0 -73
  338. package/dist/sync/commitFrames.d.ts +0 -8
  339. package/dist/sync/commitFrames.js +0 -8
  340. package/dist/sync/contextPorts.d.ts +0 -18
  341. package/dist/sync/contextPorts.js +0 -31
  342. package/dist/sync/createClaimStream.d.ts +0 -7
  343. package/dist/sync/createClaimStream.js +0 -7
  344. package/dist/sync/createPresenceStream.d.ts +0 -69
  345. package/dist/sync/createPresenceStream.js +0 -200
  346. package/dist/sync/createSnapshot.d.ts +0 -29
  347. package/dist/sync/createSnapshot.js +0 -118
  348. package/dist/sync/credentialLifecycle.d.ts +0 -7
  349. package/dist/sync/credentialLifecycle.js +0 -7
  350. package/dist/sync/deltaPipeline.d.ts +0 -114
  351. package/dist/sync/deltaPipeline.js +0 -278
  352. package/dist/sync/groupChange.d.ts +0 -116
  353. package/dist/sync/groupChange.js +0 -244
  354. package/dist/sync/participants.d.ts +0 -132
  355. package/dist/sync/participants.js +0 -346
  356. package/dist/sync/persistedPrefix.d.ts +0 -12
  357. package/dist/sync/persistedPrefix.js +0 -22
  358. package/dist/sync/schemaDrift.d.ts +0 -55
  359. package/dist/sync/schemaDrift.js +0 -53
  360. package/dist/sync/schemas.d.ts +0 -71
  361. package/dist/sync/schemas.js +0 -94
  362. package/dist/sync/syncCursor.d.ts +0 -40
  363. package/dist/sync/syncCursor.js +0 -55
  364. package/dist/sync/syncPlan.d.ts +0 -54
  365. package/dist/sync/syncPlan.js +0 -50
  366. package/dist/sync/wsFrameHandlers.d.ts +0 -8
  367. package/dist/sync/wsFrameHandlers.js +0 -8
  368. package/dist/syncLog/contract.d.ts +0 -20
  369. package/dist/syncLog/contract.js +0 -19
  370. package/dist/syncLog/index.d.ts +0 -1
  371. package/dist/syncLog/index.js +0 -1
  372. package/dist/transaction/ablo.d.ts +0 -88
  373. package/dist/transaction/ablo.js +0 -33
  374. package/dist/transaction/auth/apiKey.d.ts +0 -152
  375. package/dist/transaction/auth/apiKey.js +0 -419
  376. package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
  377. package/dist/transaction/auth/bootstrapScope.js +0 -1
  378. package/dist/transaction/auth/capability.d.ts +0 -212
  379. package/dist/transaction/auth/capability.js +0 -224
  380. package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
  381. package/dist/transaction/auth/credentialEndpoint.js +0 -86
  382. package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
  383. package/dist/transaction/auth/credentialPolicy.js +0 -125
  384. package/dist/transaction/auth/credentialSource.d.ts +0 -30
  385. package/dist/transaction/auth/credentialSource.js +0 -55
  386. package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
  387. package/dist/transaction/auth/hostedEndpoints.js +0 -21
  388. package/dist/transaction/auth/identity.d.ts +0 -55
  389. package/dist/transaction/auth/identity.js +0 -210
  390. package/dist/transaction/auth/index.d.ts +0 -162
  391. package/dist/transaction/auth/index.js +0 -304
  392. package/dist/transaction/auth/schemas.d.ts +0 -59
  393. package/dist/transaction/auth/schemas.js +0 -85
  394. package/dist/transaction/auth/sessionMint.d.ts +0 -28
  395. package/dist/transaction/auth/sessionMint.js +0 -85
  396. package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -56
  397. package/dist/transaction/coordination/awaitClaimGrant.js +0 -124
  398. package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -84
  399. package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -108
  400. package/dist/transaction/coordination/claimMeta.d.ts +0 -49
  401. package/dist/transaction/coordination/claimMeta.js +0 -52
  402. package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
  403. package/dist/transaction/coordination/createClaimStream.js +0 -475
  404. package/dist/transaction/coordination/events.d.ts +0 -74
  405. package/dist/transaction/coordination/events.js +0 -7
  406. package/dist/transaction/coordination/index.d.ts +0 -19
  407. package/dist/transaction/coordination/index.js +0 -45
  408. package/dist/transaction/coordination/locator.d.ts +0 -104
  409. package/dist/transaction/coordination/locator.js +0 -102
  410. package/dist/transaction/coordination/schema.d.ts +0 -1536
  411. package/dist/transaction/coordination/schema.js +0 -1177
  412. package/dist/transaction/coordination/targetConflict.d.ts +0 -2
  413. package/dist/transaction/coordination/targetConflict.js +0 -107
  414. package/dist/transaction/coordination/trace.d.ts +0 -78
  415. package/dist/transaction/coordination/trace.js +0 -138
  416. package/dist/transaction/durableWrites.d.ts +0 -62
  417. package/dist/transaction/durableWrites.js +0 -71
  418. package/dist/transaction/environment.d.ts +0 -105
  419. package/dist/transaction/environment.js +0 -108
  420. package/dist/transaction/errorCodes.d.ts +0 -403
  421. package/dist/transaction/errorCodes.js +0 -484
  422. package/dist/transaction/errors.d.ts +0 -428
  423. package/dist/transaction/errors.js +0 -686
  424. package/dist/transaction/footprint.d.ts +0 -111
  425. package/dist/transaction/footprint.js +0 -0
  426. package/dist/transaction/index.d.ts +0 -20
  427. package/dist/transaction/index.js +0 -20
  428. package/dist/transaction/keys/index.d.ts +0 -87
  429. package/dist/transaction/keys/index.js +0 -207
  430. package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
  431. package/dist/transaction/log/syncDeltaRow.js +0 -95
  432. package/dist/transaction/logPosition.d.ts +0 -97
  433. package/dist/transaction/logPosition.js +0 -125
  434. package/dist/transaction/logger.d.ts +0 -16
  435. package/dist/transaction/logger.js +0 -7
  436. package/dist/transaction/observability.d.ts +0 -53
  437. package/dist/transaction/observability.js +0 -19
  438. package/dist/transaction/persistence.d.ts +0 -12
  439. package/dist/transaction/persistence.js +0 -11
  440. package/dist/transaction/plugin.d.ts +0 -285
  441. package/dist/transaction/plugin.js +0 -106
  442. package/dist/transaction/policy/types.d.ts +0 -217
  443. package/dist/transaction/policy/types.js +0 -126
  444. package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
  445. package/dist/transaction/resources/functionalUpdate.js +0 -87
  446. package/dist/transaction/resources/httpResources.d.ts +0 -321
  447. package/dist/transaction/resources/httpResources.js +0 -7
  448. package/dist/transaction/resources/modelOperations.d.ts +0 -427
  449. package/dist/transaction/resources/modelOperations.js +0 -12
  450. package/dist/transaction/resources/mutationOptions.d.ts +0 -66
  451. package/dist/transaction/resources/mutationOptions.js +0 -9
  452. package/dist/transaction/resources/where.d.ts +0 -101
  453. package/dist/transaction/resources/where.js +0 -115
  454. package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
  455. package/dist/transaction/resources/writeOptionsSchema.js +0 -73
  456. package/dist/transaction/schema/field.d.ts +0 -120
  457. package/dist/transaction/schema/field.js +0 -265
  458. package/dist/transaction/schema/fieldRef.d.ts +0 -38
  459. package/dist/transaction/schema/fieldRef.js +0 -11
  460. package/dist/transaction/schema/loadStrategy.d.ts +0 -45
  461. package/dist/transaction/schema/loadStrategy.js +0 -46
  462. package/dist/transaction/schema/model.d.ts +0 -379
  463. package/dist/transaction/schema/model.js +0 -123
  464. package/dist/transaction/schema/openapi.d.ts +0 -58
  465. package/dist/transaction/schema/openapi.js +0 -501
  466. package/dist/transaction/schema/relation.d.ts +0 -204
  467. package/dist/transaction/schema/relation.js +0 -104
  468. package/dist/transaction/schema/residency.d.ts +0 -29
  469. package/dist/transaction/schema/residency.js +0 -25
  470. package/dist/transaction/schema/roles.d.ts +0 -249
  471. package/dist/transaction/schema/roles.js +0 -230
  472. package/dist/transaction/schema/schema.d.ts +0 -351
  473. package/dist/transaction/schema/schema.js +0 -325
  474. package/dist/transaction/schema/tenancy.d.ts +0 -139
  475. package/dist/transaction/schema/tenancy.js +0 -190
  476. package/dist/transaction/transactionLayer.d.ts +0 -82
  477. package/dist/transaction/transactionLayer.js +0 -24
  478. package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
  479. package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
  480. package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
  481. package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
  482. package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
  483. package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
  484. package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
  485. package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
  486. package/dist/transaction/transport/commitFrames.d.ts +0 -90
  487. package/dist/transaction/transport/commitFrames.js +0 -134
  488. package/dist/transaction/transport/connectionManager.d.ts +0 -215
  489. package/dist/transaction/transport/connectionManager.js +0 -673
  490. package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
  491. package/dist/transaction/transport/credentialLifecycle.js +0 -324
  492. package/dist/transaction/transport/heartbeat.d.ts +0 -65
  493. package/dist/transaction/transport/heartbeat.js +0 -93
  494. package/dist/transaction/transport/httpClient.d.ts +0 -131
  495. package/dist/transaction/transport/httpClient.js +0 -146
  496. package/dist/transaction/transport/httpOptions.d.ts +0 -33
  497. package/dist/transaction/transport/httpOptions.js +0 -12
  498. package/dist/transaction/transport/httpTransport.d.ts +0 -8
  499. package/dist/transaction/transport/httpTransport.js +0 -1388
  500. package/dist/transaction/transport/networkProbe.d.ts +0 -84
  501. package/dist/transaction/transport/networkProbe.js +0 -207
  502. package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
  503. package/dist/transaction/transport/wsFrameHandlers.js +0 -429
  504. package/dist/transaction/transport/wsTransport.d.ts +0 -574
  505. package/dist/transaction/transport/wsTransport.js +0 -1023
  506. package/dist/transaction/types/assertExact.d.ts +0 -17
  507. package/dist/transaction/types/assertExact.js +0 -1
  508. package/dist/transaction/types/global.d.ts +0 -107
  509. package/dist/transaction/types/global.js +0 -40
  510. package/dist/transaction/types/index.d.ts +0 -205
  511. package/dist/transaction/types/index.js +0 -56
  512. package/dist/transaction/types/modelData.d.ts +0 -10
  513. package/dist/transaction/types/modelData.js +0 -9
  514. package/dist/transaction/types/participant.d.ts +0 -20
  515. package/dist/transaction/types/participant.js +0 -10
  516. package/dist/transaction/types/streams.d.ts +0 -550
  517. package/dist/transaction/types/streams.js +0 -11
  518. package/dist/transaction/utils/asyncIterator.d.ts +0 -34
  519. package/dist/transaction/utils/asyncIterator.js +0 -135
  520. package/dist/transaction/utils/duration.d.ts +0 -50
  521. package/dist/transaction/utils/duration.js +0 -77
  522. package/dist/transaction/utils/json.d.ts +0 -57
  523. package/dist/transaction/utils/json.js +0 -276
  524. package/dist/transaction/wire/accountResponses.d.ts +0 -420
  525. package/dist/transaction/wire/accountResponses.js +0 -290
  526. package/dist/transaction/wire/auth.d.ts +0 -56
  527. package/dist/transaction/wire/auth.js +0 -63
  528. package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
  529. package/dist/transaction/wire/bootstrapReason.js +0 -8
  530. package/dist/transaction/wire/claimEvent.d.ts +0 -76
  531. package/dist/transaction/wire/claimEvent.js +0 -73
  532. package/dist/transaction/wire/claims.d.ts +0 -530
  533. package/dist/transaction/wire/claims.js +0 -327
  534. package/dist/transaction/wire/commit.d.ts +0 -603
  535. package/dist/transaction/wire/commit.js +0 -321
  536. package/dist/transaction/wire/delta.d.ts +0 -250
  537. package/dist/transaction/wire/delta.js +0 -147
  538. package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
  539. package/dist/transaction/wire/errorEnvelope.js +0 -123
  540. package/dist/transaction/wire/feedCursor.d.ts +0 -60
  541. package/dist/transaction/wire/feedCursor.js +0 -82
  542. package/dist/transaction/wire/feedEvent.d.ts +0 -204
  543. package/dist/transaction/wire/feedEvent.js +0 -65
  544. package/dist/transaction/wire/frames.d.ts +0 -194
  545. package/dist/transaction/wire/frames.js +0 -50
  546. package/dist/transaction/wire/inboundFrames.d.ts +0 -562
  547. package/dist/transaction/wire/inboundFrames.js +0 -116
  548. package/dist/transaction/wire/index.d.ts +0 -54
  549. package/dist/transaction/wire/index.js +0 -83
  550. package/dist/transaction/wire/listEnvelope.d.ts +0 -37
  551. package/dist/transaction/wire/listEnvelope.js +0 -42
  552. package/dist/transaction/wire/modelMutations.d.ts +0 -31
  553. package/dist/transaction/wire/modelMutations.js +0 -52
  554. package/dist/transaction/wire/modelResponses.d.ts +0 -85
  555. package/dist/transaction/wire/modelResponses.js +0 -43
  556. package/dist/transaction/wire/modelShape.d.ts +0 -78
  557. package/dist/transaction/wire/modelShape.js +0 -74
  558. package/dist/transaction/wire/protocol.d.ts +0 -38
  559. package/dist/transaction/wire/protocol.js +0 -38
  560. package/dist/transaction/wire/protocolVersion.d.ts +0 -73
  561. package/dist/transaction/wire/protocolVersion.js +0 -83
  562. package/dist/transactions/mutations/MutationQueue.d.ts +0 -661
  563. package/dist/transactions/mutations/MutationQueue.js +0 -2807
  564. package/dist/transactions/mutations/MutationStore.d.ts +0 -20
  565. package/dist/transactions/mutations/MutationStore.js +0 -53
  566. package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
  567. package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
  568. package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
  569. package/dist/transactions/mutations/coalesceRules.js +0 -140
  570. package/dist/transactions/mutations/commitLatency.d.ts +0 -52
  571. package/dist/transactions/mutations/commitLatency.js +0 -130
  572. package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
  573. package/dist/transactions/mutations/commitOutboxStore.js +0 -26
  574. package/dist/transactions/mutations/commitPayload.d.ts +0 -165
  575. package/dist/transactions/mutations/commitPayload.js +0 -152
  576. package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -63
  577. package/dist/transactions/mutations/deltaConfirmation.js +0 -235
  578. package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
  579. package/dist/transactions/mutations/durableWriteStore.js +0 -12
  580. package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
  581. package/dist/transactions/mutations/optimisticApply.js +0 -65
  582. package/dist/transactions/mutations/replayValidation.d.ts +0 -187
  583. package/dist/transactions/mutations/replayValidation.js +0 -164
  584. package/dist/utils/mobxSetup.d.ts +0 -53
  585. package/dist/utils/mobxSetup.js +0 -330
  586. package/dist/views/QueryView.d.ts +0 -79
  587. package/dist/views/QueryView.js +0 -218
  588. package/dist/views/ViewRegistry.d.ts +0 -20
  589. package/dist/views/ViewRegistry.js +0 -55
  590. package/dist/views/incrementalView.d.ts +0 -45
  591. package/dist/views/incrementalView.js +0 -69
  592. package/dist/webhooks/events.d.ts +0 -43
  593. package/dist/webhooks/events.js +0 -42
  594. package/dist/webhooks/index.d.ts +0 -8
  595. package/dist/webhooks/index.js +0 -8
  596. package/dist/wire/index.d.ts +0 -1
  597. package/dist/wire/index.js +0 -8
@@ -1,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>;