@abloatai/ablo 0.26.0 → 0.27.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 (398) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +101 -85
  3. package/dist/BaseSyncedStore.d.ts +85 -88
  4. package/dist/BaseSyncedStore.js +131 -147
  5. package/dist/Database.d.ts +54 -68
  6. package/dist/Database.js +97 -113
  7. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  8. package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
  9. package/dist/LazyReferenceCollection.d.ts +11 -15
  10. package/dist/LazyReferenceCollection.js +12 -16
  11. package/dist/Model.d.ts +37 -52
  12. package/dist/Model.js +46 -61
  13. package/dist/ModelRegistry.d.ts +21 -19
  14. package/dist/ModelRegistry.js +23 -27
  15. package/dist/NetworkMonitor.d.ts +5 -6
  16. package/dist/NetworkMonitor.js +5 -6
  17. package/dist/SyncClient.d.ts +112 -112
  18. package/dist/SyncClient.js +165 -172
  19. package/dist/adapters/alwaysOnline.d.ts +6 -8
  20. package/dist/adapters/alwaysOnline.js +6 -8
  21. package/dist/adapters/inMemoryStorage.d.ts +9 -9
  22. package/dist/adapters/inMemoryStorage.js +9 -9
  23. package/dist/agent/Agent.d.ts +27 -32
  24. package/dist/agent/Agent.js +18 -19
  25. package/dist/agent/index.d.ts +4 -4
  26. package/dist/agent/index.js +5 -5
  27. package/dist/agent/session.d.ts +47 -44
  28. package/dist/agent/session.js +37 -48
  29. package/dist/agent/types.d.ts +26 -31
  30. package/dist/agent/types.js +6 -7
  31. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  32. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  33. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  34. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
  35. package/dist/ai-sdk/index.d.ts +25 -22
  36. package/dist/ai-sdk/index.js +25 -22
  37. package/dist/ai-sdk/wrap.d.ts +6 -7
  38. package/dist/ai-sdk/wrap.js +1 -1
  39. package/dist/auth/credentialPolicy.d.ts +69 -74
  40. package/dist/auth/credentialPolicy.js +51 -56
  41. package/dist/auth/credentialSource.d.ts +6 -5
  42. package/dist/auth/credentialSource.js +9 -10
  43. package/dist/auth/index.d.ts +59 -58
  44. package/dist/auth/index.js +31 -37
  45. package/dist/auth/schemas.d.ts +5 -4
  46. package/dist/auth/schemas.js +5 -4
  47. package/dist/batching/index.d.ts +19 -21
  48. package/dist/batching/index.js +14 -17
  49. package/dist/cli.cjs +167 -119
  50. package/dist/client/Ablo.d.ts +73 -73
  51. package/dist/client/Ablo.js +125 -160
  52. package/dist/client/ApiClient.d.ts +30 -19
  53. package/dist/client/ApiClient.js +133 -38
  54. package/dist/client/auth.d.ts +47 -47
  55. package/dist/client/auth.js +108 -117
  56. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  57. package/dist/client/claimHeartbeatLoop.js +88 -0
  58. package/dist/client/consoleLogger.d.ts +5 -6
  59. package/dist/client/consoleLogger.js +5 -6
  60. package/dist/client/createInternalComponents.d.ts +14 -17
  61. package/dist/client/createInternalComponents.js +25 -30
  62. package/dist/client/createModelProxy.d.ts +130 -120
  63. package/dist/client/createModelProxy.js +152 -122
  64. package/dist/client/credentialEndpoint.d.ts +40 -42
  65. package/dist/client/credentialEndpoint.js +35 -36
  66. package/dist/client/functionalUpdate.d.ts +29 -27
  67. package/dist/client/functionalUpdate.js +21 -21
  68. package/dist/client/hostedEndpoints.d.ts +9 -12
  69. package/dist/client/hostedEndpoints.js +9 -12
  70. package/dist/client/httpClient.d.ts +57 -53
  71. package/dist/client/httpClient.js +29 -31
  72. package/dist/client/identity.d.ts +15 -20
  73. package/dist/client/identity.js +47 -58
  74. package/dist/client/modelRegistration.d.ts +5 -9
  75. package/dist/client/modelRegistration.js +67 -87
  76. package/dist/client/options.d.ts +134 -157
  77. package/dist/client/options.js +3 -7
  78. package/dist/client/registerDataSource.d.ts +9 -9
  79. package/dist/client/registerDataSource.js +15 -16
  80. package/dist/client/resourceTypes.d.ts +64 -75
  81. package/dist/client/resourceTypes.js +4 -10
  82. package/dist/client/schemaConfig.d.ts +31 -43
  83. package/dist/client/schemaConfig.js +38 -50
  84. package/dist/client/sessionMint.d.ts +16 -12
  85. package/dist/client/sessionMint.js +26 -31
  86. package/dist/client/validateAbloOptions.d.ts +12 -14
  87. package/dist/client/validateAbloOptions.js +8 -9
  88. package/dist/client/writeOptionsSchema.d.ts +18 -16
  89. package/dist/client/writeOptionsSchema.js +23 -20
  90. package/dist/client/wsMutationExecutor.d.ts +15 -20
  91. package/dist/client/wsMutationExecutor.js +17 -23
  92. package/dist/context.d.ts +6 -4
  93. package/dist/context.js +6 -4
  94. package/dist/coordination/index.d.ts +10 -8
  95. package/dist/coordination/index.js +14 -12
  96. package/dist/coordination/schema.d.ts +176 -128
  97. package/dist/coordination/schema.js +197 -133
  98. package/dist/coordination/trace.d.ts +9 -10
  99. package/dist/coordination/trace.js +13 -14
  100. package/dist/core/DatabaseManager.d.ts +5 -7
  101. package/dist/core/DatabaseManager.js +15 -19
  102. package/dist/core/QueryProcessor.d.ts +7 -9
  103. package/dist/core/QueryProcessor.js +22 -28
  104. package/dist/core/QueryView.d.ts +8 -8
  105. package/dist/core/QueryView.js +2 -2
  106. package/dist/core/StoreManager.d.ts +12 -14
  107. package/dist/core/StoreManager.js +21 -24
  108. package/dist/core/ViewRegistry.d.ts +5 -5
  109. package/dist/core/ViewRegistry.js +4 -4
  110. package/dist/core/index.d.ts +17 -12
  111. package/dist/core/index.js +32 -26
  112. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  113. package/dist/core/openIDBWithTimeout.js +42 -43
  114. package/dist/core/queryUtils.d.ts +45 -0
  115. package/dist/core/queryUtils.js +69 -0
  116. package/dist/core/storeContract.d.ts +63 -61
  117. package/dist/core/storeContract.js +8 -12
  118. package/dist/environment.d.ts +28 -0
  119. package/dist/environment.js +21 -0
  120. package/dist/errorCodes.d.ts +107 -99
  121. package/dist/errorCodes.js +131 -132
  122. package/dist/errors.d.ts +160 -166
  123. package/dist/errors.js +155 -158
  124. package/dist/index.d.ts +30 -27
  125. package/dist/index.js +89 -86
  126. package/dist/interfaces/index.d.ts +102 -113
  127. package/dist/interfaces/index.js +5 -4
  128. package/dist/keys/index.d.ts +27 -29
  129. package/dist/keys/index.js +41 -40
  130. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  131. package/dist/mutators/RecordingTransaction.js +31 -37
  132. package/dist/mutators/Transaction.d.ts +18 -26
  133. package/dist/mutators/Transaction.js +14 -20
  134. package/dist/mutators/UndoManager.d.ts +122 -131
  135. package/dist/mutators/UndoManager.js +145 -156
  136. package/dist/mutators/defineMutators.d.ts +23 -34
  137. package/dist/mutators/defineMutators.js +14 -20
  138. package/dist/mutators/inverseOp.d.ts +12 -15
  139. package/dist/mutators/inverseOp.js +12 -15
  140. package/dist/mutators/mutateActions.d.ts +10 -9
  141. package/dist/mutators/mutateActions.js +1 -1
  142. package/dist/mutators/readerActions.d.ts +9 -8
  143. package/dist/mutators/readerActions.js +2 -2
  144. package/dist/mutators/undoApply.d.ts +31 -27
  145. package/dist/mutators/undoApply.js +26 -24
  146. package/dist/policy/index.d.ts +5 -3
  147. package/dist/policy/index.js +5 -3
  148. package/dist/policy/types.d.ts +104 -100
  149. package/dist/policy/types.js +67 -66
  150. package/dist/query/client.d.ts +28 -23
  151. package/dist/query/client.js +45 -43
  152. package/dist/query/types.d.ts +37 -60
  153. package/dist/query/types.js +13 -33
  154. package/dist/react/AbloProvider.d.ts +1 -1
  155. package/dist/react/AbloProvider.js +2 -2
  156. package/dist/react/context.d.ts +25 -28
  157. package/dist/react/context.js +9 -10
  158. package/dist/react/index.d.ts +41 -42
  159. package/dist/react/index.js +37 -38
  160. package/dist/react/internalContext.d.ts +17 -19
  161. package/dist/react/useAblo.d.ts +23 -22
  162. package/dist/react/useAblo.js +16 -14
  163. package/dist/react/useCurrentUserId.d.ts +8 -7
  164. package/dist/react/useCurrentUserId.js +8 -7
  165. package/dist/react/useErrorListener.d.ts +7 -7
  166. package/dist/react/useErrorListener.js +10 -11
  167. package/dist/react/useMutationFailureListener.d.ts +8 -8
  168. package/dist/react/useMutationFailureListener.js +8 -8
  169. package/dist/react/useMutators.d.ts +11 -11
  170. package/dist/react/useMutators.js +3 -3
  171. package/dist/react/useReactive.js +2 -2
  172. package/dist/react/useSyncStatus.d.ts +4 -6
  173. package/dist/react/useUndoScope.d.ts +7 -9
  174. package/dist/react/useUndoScope.js +1 -1
  175. package/dist/schema/coordination.d.ts +21 -25
  176. package/dist/schema/coordination.js +21 -25
  177. package/dist/schema/ddl.d.ts +43 -39
  178. package/dist/schema/ddl.js +75 -68
  179. package/dist/schema/ddlLock.d.ts +20 -24
  180. package/dist/schema/ddlLock.js +18 -23
  181. package/dist/schema/diff.d.ts +99 -61
  182. package/dist/schema/diff.js +43 -34
  183. package/dist/schema/field.d.ts +37 -42
  184. package/dist/schema/field.js +35 -48
  185. package/dist/schema/generate.d.ts +12 -12
  186. package/dist/schema/generate.js +12 -12
  187. package/dist/schema/index.d.ts +2 -2
  188. package/dist/schema/index.js +21 -23
  189. package/dist/schema/model.d.ts +118 -143
  190. package/dist/schema/model.js +22 -33
  191. package/dist/schema/openapi.d.ts +10 -9
  192. package/dist/schema/openapi.js +5 -3
  193. package/dist/schema/queries.d.ts +29 -31
  194. package/dist/schema/queries.js +23 -25
  195. package/dist/schema/relation.d.ts +89 -99
  196. package/dist/schema/relation.js +13 -13
  197. package/dist/schema/residency.d.ts +16 -13
  198. package/dist/schema/residency.js +16 -13
  199. package/dist/schema/roles.d.ts +36 -43
  200. package/dist/schema/roles.js +31 -37
  201. package/dist/schema/schema.d.ts +33 -42
  202. package/dist/schema/schema.js +31 -32
  203. package/dist/schema/select.d.ts +13 -13
  204. package/dist/schema/select.js +13 -13
  205. package/dist/schema/serialize.d.ts +28 -31
  206. package/dist/schema/serialize.js +27 -31
  207. package/dist/schema/sugar.d.ts +17 -32
  208. package/dist/schema/sugar.js +14 -29
  209. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
  210. package/dist/schema/syncDeltaRow.js +89 -0
  211. package/dist/schema/tenancy.d.ts +44 -46
  212. package/dist/schema/tenancy.js +46 -48
  213. package/dist/server/adapter.d.ts +58 -58
  214. package/dist/server/adapter.js +13 -14
  215. package/dist/server/commit.d.ts +60 -64
  216. package/dist/server/index.d.ts +9 -10
  217. package/dist/server/index.js +1 -1
  218. package/dist/server/readConfig.d.ts +70 -0
  219. package/dist/server/readConfig.js +8 -0
  220. package/dist/server/storageMode.d.ts +23 -0
  221. package/dist/server/storageMode.js +17 -0
  222. package/dist/source/adapter.d.ts +30 -25
  223. package/dist/source/adapter.js +10 -10
  224. package/dist/source/adapters/drizzle.d.ts +28 -23
  225. package/dist/source/adapters/drizzle.js +30 -25
  226. package/dist/source/adapters/kysely.d.ts +27 -25
  227. package/dist/source/adapters/kysely.js +24 -23
  228. package/dist/source/adapters/memory.d.ts +8 -7
  229. package/dist/source/adapters/memory.js +9 -8
  230. package/dist/source/adapters/prisma.d.ts +13 -12
  231. package/dist/source/adapters/prisma.js +22 -25
  232. package/dist/source/conformance.d.ts +18 -11
  233. package/dist/source/conformance.js +17 -11
  234. package/dist/source/connector.d.ts +31 -32
  235. package/dist/source/connector.js +28 -28
  236. package/dist/source/connectorProtocol.d.ts +160 -0
  237. package/dist/source/connectorProtocol.js +162 -0
  238. package/dist/source/contract.d.ts +26 -27
  239. package/dist/source/contract.js +28 -29
  240. package/dist/source/factory.d.ts +46 -58
  241. package/dist/source/factory.js +22 -27
  242. package/dist/source/index.d.ts +7 -9
  243. package/dist/source/index.js +12 -14
  244. package/dist/source/migrations.d.ts +9 -9
  245. package/dist/source/migrations.js +9 -9
  246. package/dist/source/next.d.ts +9 -10
  247. package/dist/source/next.js +6 -7
  248. package/dist/source/pushQueue.d.ts +69 -47
  249. package/dist/source/pushQueue.js +32 -28
  250. package/dist/source/signing.d.ts +46 -17
  251. package/dist/source/signing.js +28 -11
  252. package/dist/source/types.d.ts +121 -104
  253. package/dist/source/types.js +13 -14
  254. package/dist/stores/ObjectStore.d.ts +10 -11
  255. package/dist/stores/ObjectStore.js +11 -12
  256. package/dist/stores/ObjectStoreContract.d.ts +12 -15
  257. package/dist/stores/SyncActionStore.d.ts +7 -11
  258. package/dist/stores/SyncActionStore.js +13 -17
  259. package/dist/surface.d.ts +27 -20
  260. package/dist/surface.js +27 -20
  261. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
  262. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
  263. package/dist/sync/ConnectionManager.d.ts +39 -50
  264. package/dist/sync/ConnectionManager.js +55 -66
  265. package/dist/sync/NetworkProbe.d.ts +24 -29
  266. package/dist/sync/NetworkProbe.js +63 -69
  267. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
  268. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
  269. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
  270. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
  271. package/dist/sync/SyncWebSocket.d.ts +139 -165
  272. package/dist/sync/SyncWebSocket.js +191 -223
  273. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  274. package/dist/sync/awaitClaimGrant.js +11 -11
  275. package/dist/sync/bootstrapApply.d.ts +34 -24
  276. package/dist/sync/bootstrapApply.js +27 -19
  277. package/dist/sync/commitFrames.d.ts +21 -20
  278. package/dist/sync/commitFrames.js +18 -18
  279. package/dist/sync/createClaimStream.d.ts +23 -22
  280. package/dist/sync/createClaimStream.js +105 -23
  281. package/dist/sync/createPresenceStream.d.ts +19 -18
  282. package/dist/sync/createPresenceStream.js +25 -26
  283. package/dist/sync/createSnapshot.d.ts +12 -14
  284. package/dist/sync/createSnapshot.js +20 -26
  285. package/dist/sync/credentialLifecycle.d.ts +104 -104
  286. package/dist/sync/credentialLifecycle.js +140 -147
  287. package/dist/sync/deltaPipeline.d.ts +36 -34
  288. package/dist/sync/deltaPipeline.js +64 -65
  289. package/dist/sync/groupChange.d.ts +63 -61
  290. package/dist/sync/groupChange.js +74 -78
  291. package/dist/sync/heartbeat.d.ts +34 -33
  292. package/dist/sync/heartbeat.js +31 -31
  293. package/dist/sync/participants.d.ts +19 -19
  294. package/dist/sync/schemas.d.ts +3 -2
  295. package/dist/sync/schemas.js +14 -10
  296. package/dist/sync/syncCursor.d.ts +17 -21
  297. package/dist/sync/syncCursor.js +17 -21
  298. package/dist/sync/syncPlan.d.ts +28 -36
  299. package/dist/sync/syncPlan.js +18 -19
  300. package/dist/sync/syncPosition.d.ts +54 -49
  301. package/dist/sync/syncPosition.js +57 -52
  302. package/dist/sync/wsFrameHandlers.d.ts +35 -36
  303. package/dist/sync/wsFrameHandlers.js +63 -67
  304. package/dist/testing/fixtures/bootstrap.d.ts +12 -6
  305. package/dist/testing/fixtures/bootstrap.js +12 -6
  306. package/dist/testing/fixtures/deltas.d.ts +30 -33
  307. package/dist/testing/fixtures/deltas.js +30 -33
  308. package/dist/testing/fixtures/models.d.ts +11 -10
  309. package/dist/testing/fixtures/models.js +11 -10
  310. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  311. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  312. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
  313. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
  314. package/dist/testing/helpers/wait.d.ts +13 -8
  315. package/dist/testing/helpers/wait.js +13 -8
  316. package/dist/testing/index.d.ts +3 -3
  317. package/dist/testing/index.js +2 -2
  318. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  319. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  320. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  321. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  322. package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
  323. package/dist/testing/mocks/MockSyncContext.js +15 -13
  324. package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
  325. package/dist/testing/mocks/MockSyncStore.js +11 -11
  326. package/dist/testing/mocks/MockWebSocket.d.ts +26 -22
  327. package/dist/testing/mocks/MockWebSocket.js +22 -21
  328. package/dist/transactions/TransactionQueue.d.ts +181 -176
  329. package/dist/transactions/TransactionQueue.js +338 -350
  330. package/dist/transactions/TransactionStore.d.ts +6 -4
  331. package/dist/transactions/TransactionStore.js +6 -4
  332. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  333. package/dist/transactions/UnconfirmedWrites.js +104 -0
  334. package/dist/transactions/coalesceRules.d.ts +41 -17
  335. package/dist/transactions/coalesceRules.js +40 -17
  336. package/dist/transactions/commitPayload.d.ts +48 -52
  337. package/dist/transactions/commitPayload.js +48 -57
  338. package/dist/transactions/deltaConfirmation.d.ts +20 -22
  339. package/dist/transactions/deltaConfirmation.js +37 -45
  340. package/dist/transactions/optimisticApply.d.ts +49 -0
  341. package/dist/transactions/optimisticApply.js +65 -0
  342. package/dist/transactions/{persistedReplay.d.ts → replayValidation.d.ts} +28 -22
  343. package/dist/transactions/{persistedReplay.js → replayValidation.js} +33 -27
  344. package/dist/types/global.d.ts +46 -41
  345. package/dist/types/global.js +20 -19
  346. package/dist/types/index.d.ts +71 -77
  347. package/dist/types/index.js +22 -22
  348. package/dist/types/modelData.d.ts +6 -8
  349. package/dist/types/modelData.js +5 -7
  350. package/dist/types/participant.d.ts +10 -11
  351. package/dist/types/participant.js +6 -8
  352. package/dist/types/streams.d.ts +208 -195
  353. package/dist/types/streams.js +7 -7
  354. package/dist/utils/asyncIterator.d.ts +25 -32
  355. package/dist/utils/asyncIterator.js +25 -32
  356. package/dist/utils/duration.d.ts +12 -15
  357. package/dist/utils/duration.js +12 -15
  358. package/dist/utils/mobxSetup.d.ts +53 -0
  359. package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
  360. package/dist/webhooks/events.d.ts +21 -16
  361. package/dist/webhooks/events.js +10 -8
  362. package/dist/webhooks/index.d.ts +5 -7
  363. package/dist/webhooks/index.js +5 -7
  364. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  365. package/dist/wire/delta.js +114 -0
  366. package/dist/wire/errorEnvelope.d.ts +30 -31
  367. package/dist/wire/errorEnvelope.js +34 -40
  368. package/dist/wire/frames.d.ts +79 -86
  369. package/dist/wire/frames.js +26 -33
  370. package/dist/wire/index.d.ts +14 -12
  371. package/dist/wire/index.js +30 -26
  372. package/dist/wire/listEnvelope.d.ts +16 -23
  373. package/dist/wire/listEnvelope.js +7 -6
  374. package/dist/wire/protocol.d.ts +25 -32
  375. package/dist/wire/protocol.js +25 -32
  376. package/dist/wire/protocolVersion.d.ts +44 -40
  377. package/dist/wire/protocolVersion.js +44 -40
  378. package/docs/coordination.md +59 -0
  379. package/package.json +11 -10
  380. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  381. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  382. package/dist/core/query-utils.d.ts +0 -34
  383. package/dist/core/query-utils.js +0 -59
  384. package/dist/schema/sync-delta-row.js +0 -103
  385. package/dist/schema/sync-delta-wire.js +0 -102
  386. package/dist/server/read-config.d.ts +0 -67
  387. package/dist/server/read-config.js +0 -8
  388. package/dist/server/storage-mode.d.ts +0 -8
  389. package/dist/server/storage-mode.js +0 -28
  390. package/dist/source/connector-protocol.d.ts +0 -159
  391. package/dist/source/connector-protocol.js +0 -161
  392. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  393. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  394. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  395. package/dist/transactions/mutation-error-handler.js +0 -39
  396. package/dist/transactions/optimistic.d.ts +0 -24
  397. package/dist/transactions/optimistic.js +0 -45
  398. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -1,32 +1,37 @@
1
1
  /**
2
- * Drizzle Data Source adapter. Same adapter interface + conformance as `prismaDataSource`,
3
- * built against Drizzle's REAL API (read from drizzle-orm's own source/docs):
4
- * - `db.transaction(async (tx) => …)` interactive transaction (commit/rollback).
5
- * - `db.execute(sql`…`)` parametrized raw SQL; `sql.identifier()` safely quotes
6
- * dynamic table/column names, `sql`${value}`` parametrizes values.
2
+ * The Drizzle adapter for the data-source interface. It implements the same
3
+ * {@link DataSourceAdapter} contract as {@link prismaDataSource} and passes the
4
+ * same conformance suite, built against Drizzle's query API:
5
+ * - `db.transaction(async (tx) => …)` runs an interactive transaction that
6
+ * commits or rolls back as a unit.
7
+ * - `db.execute(sql`…`)` runs parameterized raw SQL; `sql.identifier()` safely
8
+ * quotes dynamic table and column names, and `sql`${value}`` parameterizes
9
+ * values.
7
10
  *
8
- * SCHEMA-DRIVEN COLUMNS. Unlike Prisma whose delegate applies the model's
9
- * `@map` for free — this adapter writes raw SQL, so it would otherwise bypass any
10
- * fieldcolumn translation. It therefore derives every table + column name from
11
- * the SAME rule the provisioner uses (`generateProvisionPlan`):
11
+ * Table and column names come from your schema, not from a hand-written Drizzle
12
+ * table. Because this adapter issues raw SQL, it would otherwise bypass any
13
+ * field-to-column translation, so it derives every name from the same rule the
14
+ * table provisioner uses:
12
15
  * table = `model.tableName ?? key`
13
- * column = `fieldMeta.column ?? camelToSnake(field)` (+ the model's tenancy column)
14
- * so `ablo migrate` (which emits `operator_id`) and this adapter (which now writes
15
- * `operator_id`) COMPOSE. Define the schema once, point Ablo at your Postgres
16
- * no hand-written parallel Drizzle table. The adapter is the translation boundary:
17
- * its public surface (rows in/out, outbox `data`) is field-keyed (the SDK shape);
18
- * the physical columns it reads/writes are snake_case.
16
+ * column = `fieldMeta.column ?? camelToSnake(field)` (plus the tenancy column)
17
+ * This keeps the tables `ablo migrate` creates (for example `operator_id`) and the
18
+ * columns this adapter reads and writes in agreement. You define the schema once
19
+ * and point the engine at your Postgres database. The adapter is the translation
20
+ * boundary: the rows it accepts and returns, and the outbox `data` it writes, are
21
+ * keyed by field name, while the physical columns it touches are snake_case.
19
22
  *
20
- * IMPORTANT GOTCHAS (from drizzle-orm docs):
21
- * 1. Interactive `db.transaction` requires a driver that supports it. Neon's
22
- * `neon-http` driver does NOT (single-shot only) use `neon-serverless`
23
- * (WebSocket) or `pg`. With neon-http the commit path throws at runtime.
24
- * 2. `db.execute` result shape is driver-specific (postgres-js returns an
25
- * array-like RowList; node-postgres returns `{ rows }`). `rowsOf()`
23
+ * Two things to know about drivers:
24
+ * 1. Interactive `db.transaction` needs a driver that supports it. Neon's
25
+ * `neon-http` driver is single-shot and does not, so use `neon-serverless`
26
+ * (over WebSocket) or `pg`; under `neon-http` the commit path throws at
27
+ * runtime.
28
+ * 2. The `db.execute` result shape is driver-specific `postgres-js` returns an
29
+ * array-like row list, while `node-postgres` returns `{ rows }`. `rowsOf`
26
30
  * normalizes both.
27
31
  *
28
- * We use `sql` + `db.execute` for ALL writes (not the fluent builder) so the
29
- * adapter is one small, fully-typed unit with no per-driver builder generics.
32
+ * Every write goes through `sql` and `db.execute` rather than the fluent builder,
33
+ * which keeps the adapter one small, fully typed unit with no per-driver builder
34
+ * generics.
30
35
  */
31
36
  import { AbloValidationError } from '../../errors.js';
32
37
  import { sql } from 'drizzle-orm';
@@ -82,14 +87,14 @@ export function drizzleDataSource(db, schema) {
82
87
  };
83
88
  const columnFor = (mc, field) => mc.fieldToColumn.get(field) ?? camelToSnake(field);
84
89
  const fieldFor = (mc, column) => mc.columnToField.get(column) ?? snakeToCamel(column);
85
- /** Field-keyed (SDK shape) column-keyed (physical), for INSERT/UPDATE. */
90
+ /** Field-keyed row to column-keyed row, for INSERT and UPDATE values. */
86
91
  const toColumns = (mc, row) => {
87
92
  const out = {};
88
93
  for (const k of Object.keys(row))
89
94
  out[columnFor(mc, k)] = row[k];
90
95
  return out;
91
96
  };
92
- /** Column-keyed (RETURNING * / SELECT *) field-keyed (SDK shape), for reads + results. */
97
+ /** Column-keyed row (from `RETURNING *` or `SELECT *`) back to a field-keyed row, for reads and results. */
93
98
  const toFields = (mc, row) => {
94
99
  const out = {};
95
100
  for (const k of Object.keys(row))
@@ -1,36 +1,38 @@
1
1
  /**
2
- * Kysely Data Source adapter. Same adapter interface + conformance shape as
3
- * `prismaDataSource` / `drizzleDataSource`, built against Kysely's REAL
4
- * query-builder API:
5
- * - `db.transaction().execute(async (trx) => …)` — interactive transaction.
6
- * - `insertInto/updateTable/deleteFrom/selectFrom` + `returningAll()`
7
- * the fluent builder; table/column names are plain strings, so no raw
8
- * SQL tag is needed and this module imports NOTHING from `kysely`
9
- * (structural `KyselyLike`, mirroring the Prisma adapter's zero-dep
10
- * `PrismaLike`).
2
+ * The Kysely adapter for the data-source interface. It implements the same
3
+ * {@link DataSourceAdapter} contract as {@link prismaDataSource} and
4
+ * {@link drizzleDataSource} and passes the same conformance suite, built against
5
+ * Kysely's query builder:
6
+ * - `db.transaction().execute(async (trx) => …)` runs an interactive transaction.
7
+ * - `insertInto` / `updateTable` / `deleteFrom` / `selectFrom` with
8
+ * `returningAll()` form the fluent query. Table and column names are plain
9
+ * strings, so the adapter needs no raw-SQL tag and imports nothing from
10
+ * `kysely`; it depends only on the structural {@link KyselyLike} shape, the
11
+ * same approach the Prisma adapter takes with {@link PrismaLike}.
11
12
  *
12
- * SCHEMA-DRIVEN COLUMNS. Kysely is SQL-near: it passes the column names you
13
- * give it through verbatim (no Prisma-style `@map`). Like the Drizzle
14
- * adapter, every table + column name is derived from the SAME rule the
15
- * provisioner uses (`generateProvisionPlan`):
13
+ * Table and column names come from your schema. Kysely passes the column names you
14
+ * give it straight through to SQL, so, like the Drizzle adapter, this one derives
15
+ * every name from the same rule the table provisioner uses:
16
16
  * table = `model.tableName ?? key`
17
- * column = `fieldMeta.column ?? camelToSnake(field)` (+ the tenancy column)
18
- * so `ablo migrate` (which emits `operator_id`) and this adapter COMPOSE.
19
- * The adapter is the translation boundary: rows in/out are field-keyed (the
20
- * SDK shape); the physical columns it reads/writes are snake_case.
17
+ * column = `fieldMeta.column ?? camelToSnake(field)` (plus the tenancy column)
18
+ * This keeps the tables `ablo migrate` creates (for example `operator_id`) and the
19
+ * columns this adapter uses in agreement. The adapter is the translation boundary:
20
+ * the rows it accepts and returns are keyed by field name, while the physical
21
+ * columns are snake_case.
21
22
  *
22
- * JSONB note: the outbox `data` / idempotency `response` values are passed
23
- * as JSON strings Postgres infers the parameter type from the target
24
- * `jsonb` column, so the coercion is server-side and driver-agnostic (no
25
- * `::jsonb` cast available without raw SQL).
23
+ * A note on JSON columns: the outbox `data` and idempotency `response` values are
24
+ * passed as JSON strings. Postgres infers the parameter type from the target
25
+ * `jsonb` column, so the conversion happens on the server and works across drivers,
26
+ * without the `::jsonb` cast that only raw SQL allows.
26
27
  */
27
28
  import type { DataSourceAdapter, Row } from '../adapter.js';
28
29
  import type { Schema, SchemaRecord } from '../../schema/schema.js';
29
30
  /**
30
- * The subset of a Kysely instance (or transaction handle) the adapter calls.
31
- * Structural on purpose declared with method shorthand so a real
32
- * `Kysely<DB>` (whose params are narrowed to `keyof DB`) stays assignable
33
- * under TypeScript's method bivariance, exactly like `PrismaLike`.
31
+ * The subset of a Kysely instance, or transaction handle, that the adapter calls.
32
+ * It is structural by design: declaring the members with method shorthand lets a
33
+ * real `Kysely<DB>` whose parameters are narrowed to `keyof DB` stay assignable
34
+ * under TypeScript's method-parameter bivariance, the same way {@link PrismaLike}
35
+ * accepts a real `PrismaClient`.
34
36
  */
35
37
  export interface KyselyLike {
36
38
  selectFrom(table: string): KyselySelectBuilder;
@@ -1,28 +1,29 @@
1
1
  /**
2
- * Kysely Data Source adapter. Same adapter interface + conformance shape as
3
- * `prismaDataSource` / `drizzleDataSource`, built against Kysely's REAL
4
- * query-builder API:
5
- * - `db.transaction().execute(async (trx) => …)` — interactive transaction.
6
- * - `insertInto/updateTable/deleteFrom/selectFrom` + `returningAll()`
7
- * the fluent builder; table/column names are plain strings, so no raw
8
- * SQL tag is needed and this module imports NOTHING from `kysely`
9
- * (structural `KyselyLike`, mirroring the Prisma adapter's zero-dep
10
- * `PrismaLike`).
2
+ * The Kysely adapter for the data-source interface. It implements the same
3
+ * {@link DataSourceAdapter} contract as {@link prismaDataSource} and
4
+ * {@link drizzleDataSource} and passes the same conformance suite, built against
5
+ * Kysely's query builder:
6
+ * - `db.transaction().execute(async (trx) => …)` runs an interactive transaction.
7
+ * - `insertInto` / `updateTable` / `deleteFrom` / `selectFrom` with
8
+ * `returningAll()` form the fluent query. Table and column names are plain
9
+ * strings, so the adapter needs no raw-SQL tag and imports nothing from
10
+ * `kysely`; it depends only on the structural {@link KyselyLike} shape, the
11
+ * same approach the Prisma adapter takes with {@link PrismaLike}.
11
12
  *
12
- * SCHEMA-DRIVEN COLUMNS. Kysely is SQL-near: it passes the column names you
13
- * give it through verbatim (no Prisma-style `@map`). Like the Drizzle
14
- * adapter, every table + column name is derived from the SAME rule the
15
- * provisioner uses (`generateProvisionPlan`):
13
+ * Table and column names come from your schema. Kysely passes the column names you
14
+ * give it straight through to SQL, so, like the Drizzle adapter, this one derives
15
+ * every name from the same rule the table provisioner uses:
16
16
  * table = `model.tableName ?? key`
17
- * column = `fieldMeta.column ?? camelToSnake(field)` (+ the tenancy column)
18
- * so `ablo migrate` (which emits `operator_id`) and this adapter COMPOSE.
19
- * The adapter is the translation boundary: rows in/out are field-keyed (the
20
- * SDK shape); the physical columns it reads/writes are snake_case.
17
+ * column = `fieldMeta.column ?? camelToSnake(field)` (plus the tenancy column)
18
+ * This keeps the tables `ablo migrate` creates (for example `operator_id`) and the
19
+ * columns this adapter uses in agreement. The adapter is the translation boundary:
20
+ * the rows it accepts and returns are keyed by field name, while the physical
21
+ * columns are snake_case.
21
22
  *
22
- * JSONB note: the outbox `data` / idempotency `response` values are passed
23
- * as JSON strings Postgres infers the parameter type from the target
24
- * `jsonb` column, so the coercion is server-side and driver-agnostic (no
25
- * `::jsonb` cast available without raw SQL).
23
+ * A note on JSON columns: the outbox `data` and idempotency `response` values are
24
+ * passed as JSON strings. Postgres infers the parameter type from the target
25
+ * `jsonb` column, so the conversion happens on the server and works across drivers,
26
+ * without the `::jsonb` cast that only raw SQL allows.
26
27
  */
27
28
  import { AbloValidationError } from '../../errors.js';
28
29
  import { outboxEventSchema } from '../contract.js';
@@ -75,14 +76,14 @@ export function kyselyDataSource(db, schema) {
75
76
  };
76
77
  const columnFor = (mc, field) => mc.fieldToColumn.get(field) ?? camelToSnake(field);
77
78
  const fieldFor = (mc, column) => mc.columnToField.get(column) ?? snakeToCamel(column);
78
- /** Field-keyed (SDK shape) column-keyed (physical), for INSERT/UPDATE. */
79
+ /** Field-keyed row to column-keyed row, for INSERT and UPDATE values. */
79
80
  const toColumns = (mc, row) => {
80
81
  const out = {};
81
82
  for (const k of Object.keys(row))
82
83
  out[columnFor(mc, k)] = row[k];
83
84
  return out;
84
85
  };
85
- /** Column-keyed (RETURNING * / SELECT *) field-keyed (SDK shape). */
86
+ /** Column-keyed row (from `RETURNING *` or `SELECT *`) back to a field-keyed row. */
86
87
  const toFields = (mc, row) => {
87
88
  const out = {};
88
89
  for (const k of Object.keys(row))
@@ -1,12 +1,13 @@
1
1
  /**
2
- * In-memory reference Data Source adapter the canonical correct implementation
3
- * of the adapter interface. It is the test double for the bridge/handler AND the thing the
4
- * conformance suite runs against to prove the suite itself is real (same role as
5
- * the server's `memoryTenantDirectory`). A new ORM adapter is "done" when it
6
- * passes the same suite this one passes.
2
+ * The in-memory reference implementation of {@link DataSourceAdapter}. It is the
3
+ * simplest correct adapter: a stand-in you can commit to and read from in tests
4
+ * without a database, and the fixture the conformance suite runs against to confirm
5
+ * the suite exercises real behavior. An adapter for a given object-relational
6
+ * mapper is complete when it passes the same suite this one passes.
7
7
  *
8
- * It models the real semantics minimally but faithfully: one canonical row store
9
- * per model, an idempotency ledger keyed by `clientTxId`, and a monotonic outbox.
8
+ * It models the semantics minimally but faithfully: one row store per model, an
9
+ * idempotency ledger keyed by `clientTxId`, and an append-only outbox with a
10
+ * monotonic cursor.
10
11
  */
11
12
  import type { DataSourceAdapter } from '../adapter.js';
12
13
  export declare function memoryDataSource(): DataSourceAdapter;
@@ -1,12 +1,13 @@
1
1
  /**
2
- * In-memory reference Data Source adapter the canonical correct implementation
3
- * of the adapter interface. It is the test double for the bridge/handler AND the thing the
4
- * conformance suite runs against to prove the suite itself is real (same role as
5
- * the server's `memoryTenantDirectory`). A new ORM adapter is "done" when it
6
- * passes the same suite this one passes.
2
+ * The in-memory reference implementation of {@link DataSourceAdapter}. It is the
3
+ * simplest correct adapter: a stand-in you can commit to and read from in tests
4
+ * without a database, and the fixture the conformance suite runs against to confirm
5
+ * the suite exercises real behavior. An adapter for a given object-relational
6
+ * mapper is complete when it passes the same suite this one passes.
7
7
  *
8
- * It models the real semantics minimally but faithfully: one canonical row store
9
- * per model, an idempotency ledger keyed by `clientTxId`, and a monotonic outbox.
8
+ * It models the semantics minimally but faithfully: one row store per model, an
9
+ * idempotency ledger keyed by `clientTxId`, and an append-only outbox with a
10
+ * monotonic cursor.
10
11
  */
11
12
  import { AbloValidationError } from '../../errors.js';
12
13
  function rowId(op) {
@@ -63,7 +64,7 @@ export function memoryDataSource() {
63
64
  return {
64
65
  capabilities: { transactions: true, propose: false, schemaIntrospection: false },
65
66
  migrations() {
66
- // In-memory: no table-creation SQL. A real ORM adapter ships ablo_idempotency + ablo_outbox here.
67
+ // Nothing to create in memory. A database-backed adapter returns the SQL for its ablo_idempotency and ablo_outbox tables here.
67
68
  return [];
68
69
  },
69
70
  async read(req) {
@@ -1,20 +1,21 @@
1
1
  /**
2
- * Prisma Data Source adapter. The first real ORM adapter (Auth.js pattern: one
3
- * package per ORM, all behind the `DataSourceAdapter` interface, all proven by the
4
- * same conformance suite the in-memory reference passes).
2
+ * The Prisma adapter for the data-source interface. It implements
3
+ * {@link DataSourceAdapter} against a Prisma client and passes the same conformance
4
+ * suite as the in-memory reference and the other adapters.
5
5
  *
6
- * It owns the transactional outbox + idempotency so the customer never writes
7
- * them: `commit` runs the app-row mutations, the `ablo_outbox` append, and the
8
- * `ablo_idempotency` record in ONE `prisma.$transaction`. `migrations()` ships
9
- * the table-creation SQL for those two tables.
6
+ * The adapter owns the transactional outbox and idempotency bookkeeping, so you
7
+ * never write them: `commit` runs the row mutations, the `ablo_outbox` append, and
8
+ * the `ablo_idempotency` record inside a single `prisma.$transaction`, and
9
+ * `migrations` returns the SQL that creates those two tables.
10
10
  *
11
- * No `@prisma/client` dependency: the client is accepted structurally
12
- * (`PrismaLike`), so this compiles in the SDK package and is unit-testable with
13
- * a fake, while a real `PrismaClient` satisfies it at the call site.
11
+ * It takes no dependency on `@prisma/client`. The client is accepted structurally
12
+ * as {@link PrismaLike}, so this module compiles without Prisma installed and can
13
+ * be tested with a fake, while a real `PrismaClient` satisfies the shape at the
14
+ * call site.
14
15
  */
15
16
  import type { DataSourceAdapter, Row } from '../adapter.js';
16
17
  import type { SchemaRecord, Schema } from '../../schema/schema.js';
17
- /** A Prisma model delegate (the subset we call). */
18
+ /** A Prisma model delegate the subset of its methods the adapter calls. */
18
19
  export interface PrismaDelegate {
19
20
  findUnique(args: {
20
21
  where: {
@@ -46,7 +47,7 @@ export interface PrismaRaw {
46
47
  $executeRawUnsafe(query: string, ...values: unknown[]): Promise<number>;
47
48
  $queryRawUnsafe<T = unknown>(query: string, ...values: unknown[]): Promise<T>;
48
49
  }
49
- /** A Prisma client (or interactive-transaction client) structural, no SDK dependency. */
50
+ /** A Prisma client, or its interactive-transaction client, as a structural shape that needs no `@prisma/client` import. */
50
51
  export interface PrismaLike extends PrismaRaw {
51
52
  $transaction<T>(fn: (tx: PrismaLike & PrismaRaw) => Promise<T>): Promise<T>;
52
53
  }
@@ -1,34 +1,31 @@
1
1
  /**
2
- * Prisma Data Source adapter. The first real ORM adapter (Auth.js pattern: one
3
- * package per ORM, all behind the `DataSourceAdapter` interface, all proven by the
4
- * same conformance suite the in-memory reference passes).
2
+ * The Prisma adapter for the data-source interface. It implements
3
+ * {@link DataSourceAdapter} against a Prisma client and passes the same conformance
4
+ * suite as the in-memory reference and the other adapters.
5
5
  *
6
- * It owns the transactional outbox + idempotency so the customer never writes
7
- * them: `commit` runs the app-row mutations, the `ablo_outbox` append, and the
8
- * `ablo_idempotency` record in ONE `prisma.$transaction`. `migrations()` ships
9
- * the table-creation SQL for those two tables.
6
+ * The adapter owns the transactional outbox and idempotency bookkeeping, so you
7
+ * never write them: `commit` runs the row mutations, the `ablo_outbox` append, and
8
+ * the `ablo_idempotency` record inside a single `prisma.$transaction`, and
9
+ * `migrations` returns the SQL that creates those two tables.
10
10
  *
11
- * No `@prisma/client` dependency: the client is accepted structurally
12
- * (`PrismaLike`), so this compiles in the SDK package and is unit-testable with
13
- * a fake, while a real `PrismaClient` satisfies it at the call site.
11
+ * It takes no dependency on `@prisma/client`. The client is accepted structurally
12
+ * as {@link PrismaLike}, so this module compiles without Prisma installed and can
13
+ * be tested with a fake, while a real `PrismaClient` satisfies the shape at the
14
+ * call site.
14
15
  */
15
16
  import { AbloValidationError } from '../../errors.js';
16
17
  import { outboxEventSchema } from '../contract.js';
17
18
  import { adapterTableMigrations } from '../migrations.js';
18
19
  const lowerFirst = (s) => (s ? s.charAt(0).toLowerCase() + s.slice(1) : s);
19
20
  /**
20
- * Resolve a model's Prisma delegate by name. This is the ONE irreducible cast in
21
- * the adapter layer, and it's a genuine type-system limit, not laziness:
22
- *
23
- * - Inside `prisma.$transaction(tx => …)` the writes MUST go through the
24
- * transactional client `tx`, and the model is only known as a runtime string.
25
- * - Prisma's client (and transaction handle) is NOMINALLY keyed (`{ task: TaskDelegate; }`), so a
26
- * dynamic `tx[name]` is `unknown` to the compiler there is no key to infer.
27
- *
28
- * Dynamic property access on a statically-keyed type cannot be typed without an
29
- * assertion; this is the reflection boundary, validated at runtime (`findMany` is
30
- * a function) right after. `ablo generate` removes even this by emitting a typed
31
- * `model → delegate` map, at which point this helper is replaced by a lookup.
21
+ * Resolves a model's Prisma delegate by name. This is the one unavoidable cast in
22
+ * the adapter, and it reflects a real limit of the type system rather than a
23
+ * shortcut. Writes inside `prisma.$transaction(tx => …)` must go through the
24
+ * transactional client `tx`, and the model is known only as a runtime string.
25
+ * Prisma keys its client by fixed property names (`{ task: TaskDelegate; }`), so
26
+ * a dynamic `tx[name]` lookup is `unknown` to the compiler: there is no static key
27
+ * to infer from a string. The cast is checked at runtime immediately afterward by
28
+ * confirming that `findMany` is a function on the resolved delegate.
32
29
  */
33
30
  function delegateFor(client, name) {
34
31
  const delegate = client[name];
@@ -37,7 +34,7 @@ function delegateFor(client, name) {
37
34
  }
38
35
  return delegate;
39
36
  }
40
- /** Translate a Source `where` tuple set into a Prisma `where` object. */
37
+ /** Translates a source-query `where` tuple set into a Prisma `where` object. */
41
38
  function toPrismaWhere(where) {
42
39
  const out = {};
43
40
  for (const clause of where ?? []) {
@@ -104,7 +101,7 @@ function rowId(op) {
104
101
  }
105
102
  export function prismaDataSource(prisma, schema, options = {}) {
106
103
  const delegateName = options.delegateName ?? lowerFirst;
107
- void schema; // reserved for codegen-typed reads / model validation
104
+ void schema; // held for typed reads and model validation
108
105
  const applyOperation = async (tx, op) => {
109
106
  const delegate = delegateFor(tx, delegateName(op.model));
110
107
  const id = rowId(op);
@@ -146,7 +143,7 @@ export function prismaDataSource(prisma, schema, options = {}) {
146
143
  const row = await applyOperation(tx, op);
147
144
  rows.push(row);
148
145
  const entityId = String(row.id ?? rowId(op));
149
- // Transactional outbox: one event per op, written in THIS transaction.
146
+ // Transactional outbox: one event per operation, written in this same transaction.
150
147
  await tx.$executeRawUnsafe(`INSERT INTO ablo_outbox (id, model, entity_id, type, data, client_tx_id, occurred_at)
151
148
  VALUES ($1, $2, $3, $4, $5::jsonb, $6, $7)`, `${change.clientTxId}:${index}`, op.model, entityId, op.type, JSON.stringify(op.type === 'DELETE' ? null : row), change.clientTxId, Date.now());
152
149
  }
@@ -1,28 +1,35 @@
1
1
  /**
2
- * Data Source adapter conformance suite the shared "is this adapter correct?"
3
- * test set, in the Auth.js `@auth/adapter-test` mould. Every ORM adapter
4
- * (Prisma/Drizzle/Kysely) and any hand-written handler runs THIS to prove,
5
- * before production, the guarantees the adapter interface promises. A new adapter is "done"
6
- * when it passes not when it compiles.
2
+ * The conformance suite for data-source adapters: a shared set of tests that checks
3
+ * whether an adapter is correct. Every adapter in this package (Prisma, Drizzle,
4
+ * Kysely) and any adapter you write yourself runs this suite to confirm it upholds
5
+ * the guarantees {@link DataSourceAdapter} promises. An adapter is complete when it
6
+ * passes, not merely when it compiles.
7
7
  *
8
- * Runner-agnostic: checks are plain async functions that throw (node:assert) on
9
- * failure. `runDataSourceTests` registers them with whatever `it`/`test` you
10
- * pass, so it works under vitest, jest, or node:test:
8
+ * The suite is runner-agnostic: each check is a plain async function that throws,
9
+ * via `node:assert`, on failure. {@link runDataSourceTests} registers the checks
10
+ * with whichever `it` or `test` function you pass, so it runs under vitest, jest,
11
+ * or `node:test`:
11
12
  *
12
13
  * import { it } from 'vitest';
13
14
  * runDataSourceTests(memoryDataSource, it);
14
15
  *
15
- * Scope: this covers the ADAPTER contract (commit idempotency, read-after-write,
16
- * the transactional outbox + cursor). Signature/scope rejection is a HANDLER
17
- * concern (the adapter never sees a signature) and is tested separately.
16
+ * The checks cover the adapter contract: commit idempotency, read-after-write, and
17
+ * the transactional outbox with its cursor. They do not cover request-signature or
18
+ * scope rejection, which the HTTP handler enforces before the adapter is ever
19
+ * called and which is tested separately.
18
20
  */
19
21
  import type { DataSourceAdapter } from './adapter.js';
22
+ /** A factory that returns a fresh adapter. Each check calls it to start from clean state. */
20
23
  export type MakeAdapter = () => DataSourceAdapter | Promise<DataSourceAdapter>;
21
24
  /** A single conformance check. `run` throws on failure. */
22
25
  export interface ConformanceCheck {
23
26
  readonly name: string;
24
27
  run(): Promise<void>;
25
28
  }
29
+ /**
30
+ * Builds the list of conformance checks for an adapter. Call this to run the checks
31
+ * yourself, or use {@link runDataSourceTests} to register them with a test runner.
32
+ */
26
33
  export declare function dataSourceConformanceChecks(make: MakeAdapter): ConformanceCheck[];
27
34
  /**
28
35
  * Register the conformance checks with a test runner's `it`/`test` function.
@@ -1,26 +1,32 @@
1
1
  /**
2
- * Data Source adapter conformance suite the shared "is this adapter correct?"
3
- * test set, in the Auth.js `@auth/adapter-test` mould. Every ORM adapter
4
- * (Prisma/Drizzle/Kysely) and any hand-written handler runs THIS to prove,
5
- * before production, the guarantees the adapter interface promises. A new adapter is "done"
6
- * when it passes not when it compiles.
2
+ * The conformance suite for data-source adapters: a shared set of tests that checks
3
+ * whether an adapter is correct. Every adapter in this package (Prisma, Drizzle,
4
+ * Kysely) and any adapter you write yourself runs this suite to confirm it upholds
5
+ * the guarantees {@link DataSourceAdapter} promises. An adapter is complete when it
6
+ * passes, not merely when it compiles.
7
7
  *
8
- * Runner-agnostic: checks are plain async functions that throw (node:assert) on
9
- * failure. `runDataSourceTests` registers them with whatever `it`/`test` you
10
- * pass, so it works under vitest, jest, or node:test:
8
+ * The suite is runner-agnostic: each check is a plain async function that throws,
9
+ * via `node:assert`, on failure. {@link runDataSourceTests} registers the checks
10
+ * with whichever `it` or `test` function you pass, so it runs under vitest, jest,
11
+ * or `node:test`:
11
12
  *
12
13
  * import { it } from 'vitest';
13
14
  * runDataSourceTests(memoryDataSource, it);
14
15
  *
15
- * Scope: this covers the ADAPTER contract (commit idempotency, read-after-write,
16
- * the transactional outbox + cursor). Signature/scope rejection is a HANDLER
17
- * concern (the adapter never sees a signature) and is tested separately.
16
+ * The checks cover the adapter contract: commit idempotency, read-after-write, and
17
+ * the transactional outbox with its cursor. They do not cover request-signature or
18
+ * scope rejection, which the HTTP handler enforces before the adapter is ever
19
+ * called and which is tested separately.
18
20
  */
19
21
  import assert from 'node:assert/strict';
20
22
  const change = (clientTxId, ops) => ({
21
23
  clientTxId,
22
24
  operations: ops,
23
25
  });
26
+ /**
27
+ * Builds the list of conformance checks for an adapter. Call this to run the checks
28
+ * yourself, or use {@link runDataSourceTests} to register them with a test runner.
29
+ */
24
30
  export function dataSourceConformanceChecks(make) {
25
31
  return [
26
32
  {
@@ -1,15 +1,13 @@
1
1
  /**
2
- * Customer-side Data Source reverse-channel connector.
2
+ * Opens the connector's side of the Data Source reverse channel. You run this
3
+ * process next to your database; it dials an outbound WebSocket to Ablo and serves
4
+ * the load, list, and commit requests over that socket, so a handler with no
5
+ * public URL never needs to receive inbound webhooks. It is the counterpart to
6
+ * `createPushQueue`, which gives the outbound events feed the same treatment, and
7
+ * it speaks the frames defined in `connectorProtocol.ts`.
3
8
  *
4
- * The dial-out half of the reverse channel (see `connector-protocol.ts`). The
5
- * customer runs this next to their database; it opens an OUTBOUND WebSocket to
6
- * Ablo Cloud and serves the `commit`/`load`/`list` leg over that socket instead
7
- * of receiving inbound webhooks. This is the symmetric primitive to
8
- * `createPushQueue` (which already gives the `events` leg an outbound transport)
9
- * and mirrors the Stripe CLI's `stripe listen`.
10
- *
11
- * The connector does NOT reimplement any handler logic. It wraps the SAME
12
- * `(request: Request) => Promise<Response>` the customer's deployed route uses:
9
+ * The connector reimplements none of the handler logic. It wraps the same
10
+ * `(request: Request) => Promise<Response>` your deployed route already uses:
13
11
  *
14
12
  * import { dataSource, createSourceConnector } from '@abloatai/ablo';
15
13
  * import { sourceOptions } from './ablo.source'; // shared with route.ts
@@ -20,23 +18,24 @@
20
18
  * });
21
19
  * await connector.run(controller.signal);
22
20
  *
23
- * Each drained `request` frame is replayed into a synthesized `Request` carrying
24
- * the original Standard Webhooks signature headers, so the handler verifies it
25
- * through the unchanged `verifyAbloSourceRequest` identical to the webhook
26
- * path. The transport changes; the trust model does not.
21
+ * Each incoming `request` frame is replayed into a `Request` that carries the
22
+ * original signature headers, so the handler verifies it through the same
23
+ * `verifyAbloSourceRequest` it uses on the webhook path. The transport changes;
24
+ * the trust model does not.
27
25
  */
28
26
  /**
29
- * Reconnect backoff, in ms, indexed by consecutive failed connect attempts.
30
- * Unlike the (multi-day) Standard Webhooks delivery schedule, a long-lived
31
- * control socket should re-establish quickly and cap at a steady interval, so
32
- * this is a short capped curve. The last entry repeats for further attempts. A
33
- * clean `ready` resets the counter to 0.
27
+ * The reconnect backoff, in milliseconds, indexed by the number of consecutive
28
+ * failed connect attempts. A long-lived control socket should recover quickly and
29
+ * then settle at a steady interval, so this is a short curve that caps rather than
30
+ * growing without bound. The final entry repeats for any further attempts, and a
31
+ * connection that reaches `ready` resets the count to zero.
34
32
  */
35
33
  export declare const DEFAULT_RECONNECT_SCHEDULE: readonly number[];
36
34
  /**
37
- * Minimal structural WebSocket surface the browser/`globalThis.WebSocket` API,
38
- * which Node 24+ implements natively. The `ws` package's default export also
39
- * satisfies this (it exposes `addEventListener`). Injectable for tests.
35
+ * The minimal WebSocket surface the connector needs, matching the standard
36
+ * `globalThis.WebSocket` API that browsers and current Node versions provide. The
37
+ * `ws` package's default export also satisfies it. Supply your own implementation
38
+ * to substitute a fake in tests.
40
39
  */
41
40
  export interface ConnectorWebSocket {
42
41
  send(data: string): void;
@@ -57,18 +56,18 @@ export type ConnectorWebSocketFactory = (url: string, protocols: readonly string
57
56
  export type ConnectorStatus = 'connecting' | 'ready' | 'disconnected';
58
57
  export interface SourceConnectorOptions {
59
58
  /**
60
- * Ablo project API key. Defaults gate to `sk_test_*` (local-dev / sandbox);
61
- * an `sk_live_*` key is only accepted when the source has opted into
62
- * reverse-channel for production server-side.
59
+ * Your Ablo project API key. A test key (`sk_test_*`) works by default for local
60
+ * development and sandboxes; a live key (`sk_live_*`) is accepted only once the
61
+ * source has opted the reverse channel in for production use.
63
62
  */
64
63
  readonly apiKey: string;
65
64
  /**
66
- * The unchanged Data Source handler `dataSource(options)` /
67
- * `abloSource(options)`. The connector feeds it synthesized `Request`s and
68
- * relays the `Response`s back; it never inspects or alters them.
65
+ * The Data Source handler to serve, as returned by `dataSource(options)` or
66
+ * `abloSource(options)`. The connector feeds it each request and relays the
67
+ * response back untouched; it never inspects or alters either one.
69
68
  */
70
69
  readonly handler: (request: Request) => Promise<Response>;
71
- /** Ablo Cloud base URL. Default `https://api.abloatai.com`. */
70
+ /** The Ablo base URL to dial. Defaults to `https://api.abloatai.com`. */
72
71
  readonly baseURL?: string;
73
72
  /** Inject a WebSocket implementation. Default `globalThis.WebSocket`. */
74
73
  readonly webSocket?: ConnectorWebSocketFactory;
@@ -87,9 +86,9 @@ export interface SourceConnectorOptions {
87
86
  }
88
87
  export interface SourceConnector {
89
88
  /**
90
- * Run the connect serve reconnect loop until `signal` aborts. Resolves
91
- * when aborted. Rejects only on a fatal, non-retryable condition (e.g. no
92
- * WebSocket implementation available).
89
+ * Runs the connect, serve, and reconnect loop until `signal` aborts, then
90
+ * resolves. It rejects only on a fatal condition that cannot be retried, such as
91
+ * no WebSocket implementation being available.
93
92
  */
94
93
  run(signal: AbortSignal): Promise<void>;
95
94
  }