@abloatai/ablo 0.25.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 (425) hide show
  1. package/AGENTS.md +5 -3
  2. package/CHANGELOG.md +34 -0
  3. package/README.md +104 -88
  4. package/dist/BaseSyncedStore.d.ts +140 -266
  5. package/dist/BaseSyncedStore.js +338 -739
  6. package/dist/Database.d.ts +62 -77
  7. package/dist/Database.js +106 -127
  8. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  9. package/dist/{ObjectPool.js → InstanceCache.js} +91 -83
  10. package/dist/LazyReferenceCollection.d.ts +11 -15
  11. package/dist/LazyReferenceCollection.js +16 -15
  12. package/dist/Model.d.ts +37 -52
  13. package/dist/Model.js +52 -69
  14. package/dist/ModelRegistry.d.ts +46 -25
  15. package/dist/ModelRegistry.js +32 -30
  16. package/dist/NetworkMonitor.d.ts +5 -6
  17. package/dist/NetworkMonitor.js +6 -7
  18. package/dist/SyncClient.d.ts +119 -109
  19. package/dist/SyncClient.js +303 -224
  20. package/dist/SyncEngineContext.d.ts +1 -3
  21. package/dist/SyncEngineContext.js +1 -2
  22. package/dist/adapters/alwaysOnline.d.ts +6 -8
  23. package/dist/adapters/alwaysOnline.js +6 -8
  24. package/dist/adapters/inMemoryStorage.d.ts +9 -9
  25. package/dist/adapters/inMemoryStorage.js +9 -9
  26. package/dist/agent/Agent.d.ts +39 -31
  27. package/dist/agent/Agent.js +35 -23
  28. package/dist/agent/index.d.ts +4 -4
  29. package/dist/agent/index.js +5 -5
  30. package/dist/agent/session.d.ts +47 -44
  31. package/dist/agent/session.js +37 -48
  32. package/dist/agent/types.d.ts +26 -31
  33. package/dist/agent/types.js +6 -7
  34. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  35. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  36. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  37. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +30 -31
  38. package/dist/ai-sdk/index.d.ts +25 -22
  39. package/dist/ai-sdk/index.js +25 -22
  40. package/dist/ai-sdk/wrap.d.ts +7 -8
  41. package/dist/ai-sdk/wrap.js +2 -2
  42. package/dist/auth/credentialPolicy.d.ts +74 -71
  43. package/dist/auth/credentialPolicy.js +51 -56
  44. package/dist/auth/credentialSource.d.ts +7 -18
  45. package/dist/auth/credentialSource.js +10 -18
  46. package/dist/auth/index.d.ts +59 -58
  47. package/dist/auth/index.js +34 -40
  48. package/dist/auth/schemas.d.ts +5 -4
  49. package/dist/auth/schemas.js +5 -4
  50. package/dist/batching/index.d.ts +19 -21
  51. package/dist/batching/index.js +14 -17
  52. package/dist/cli.cjs +483 -369
  53. package/dist/client/Ablo.d.ts +107 -836
  54. package/dist/client/Ablo.js +174 -833
  55. package/dist/client/ApiClient.d.ts +44 -20
  56. package/dist/client/ApiClient.js +193 -44
  57. package/dist/client/auth.d.ts +51 -60
  58. package/dist/client/auth.js +137 -110
  59. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  60. package/dist/client/claimHeartbeatLoop.js +88 -0
  61. package/dist/client/consoleLogger.d.ts +35 -0
  62. package/dist/client/consoleLogger.js +44 -0
  63. package/dist/client/createInternalComponents.d.ts +14 -17
  64. package/dist/client/createInternalComponents.js +26 -31
  65. package/dist/client/createModelProxy.d.ts +130 -120
  66. package/dist/client/createModelProxy.js +158 -124
  67. package/dist/client/credentialEndpoint.d.ts +61 -0
  68. package/dist/client/credentialEndpoint.js +86 -0
  69. package/dist/client/functionalUpdate.d.ts +29 -27
  70. package/dist/client/functionalUpdate.js +21 -21
  71. package/dist/client/hostedEndpoints.d.ts +21 -0
  72. package/dist/client/hostedEndpoints.js +21 -0
  73. package/dist/client/httpClient.d.ts +58 -54
  74. package/dist/client/httpClient.js +29 -31
  75. package/dist/client/identity.d.ts +15 -20
  76. package/dist/client/identity.js +49 -59
  77. package/dist/client/modelRegistration.d.ts +10 -0
  78. package/dist/client/modelRegistration.js +301 -0
  79. package/dist/client/options.d.ts +373 -0
  80. package/dist/client/options.js +6 -0
  81. package/dist/client/registerDataSource.d.ts +9 -9
  82. package/dist/client/registerDataSource.js +15 -16
  83. package/dist/client/resourceTypes.d.ts +333 -0
  84. package/dist/client/resourceTypes.js +7 -0
  85. package/dist/client/schemaConfig.d.ts +44 -0
  86. package/dist/client/schemaConfig.js +176 -0
  87. package/dist/client/sessionMint.d.ts +17 -13
  88. package/dist/client/sessionMint.js +26 -31
  89. package/dist/client/validateAbloOptions.d.ts +12 -14
  90. package/dist/client/validateAbloOptions.js +9 -10
  91. package/dist/client/writeOptionsSchema.d.ts +18 -16
  92. package/dist/client/writeOptionsSchema.js +23 -20
  93. package/dist/client/wsMutationExecutor.d.ts +28 -0
  94. package/dist/client/wsMutationExecutor.js +71 -0
  95. package/dist/context.d.ts +6 -4
  96. package/dist/context.js +6 -7
  97. package/dist/coordination/index.d.ts +13 -4
  98. package/dist/coordination/index.js +29 -4
  99. package/dist/coordination/schema.d.ts +176 -128
  100. package/dist/coordination/schema.js +197 -133
  101. package/dist/coordination/trace.d.ts +9 -11
  102. package/dist/coordination/trace.js +13 -15
  103. package/dist/core/DatabaseManager.d.ts +5 -8
  104. package/dist/core/DatabaseManager.js +38 -40
  105. package/dist/core/QueryProcessor.d.ts +7 -9
  106. package/dist/core/QueryProcessor.js +27 -34
  107. package/dist/core/QueryView.d.ts +17 -5
  108. package/dist/core/QueryView.js +6 -7
  109. package/dist/core/StoreManager.d.ts +14 -16
  110. package/dist/core/StoreManager.js +26 -25
  111. package/dist/core/ViewRegistry.d.ts +5 -5
  112. package/dist/core/ViewRegistry.js +4 -4
  113. package/dist/core/index.d.ts +18 -13
  114. package/dist/core/index.js +32 -26
  115. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  116. package/dist/core/openIDBWithTimeout.js +57 -54
  117. package/dist/core/queryUtils.d.ts +45 -0
  118. package/dist/core/queryUtils.js +69 -0
  119. package/dist/core/storeContract.d.ts +145 -0
  120. package/dist/core/storeContract.js +12 -0
  121. package/dist/environment.d.ts +28 -0
  122. package/dist/environment.js +21 -0
  123. package/dist/errorCodes.d.ts +118 -101
  124. package/dist/errorCodes.js +277 -260
  125. package/dist/errors.d.ts +170 -165
  126. package/dist/errors.js +161 -151
  127. package/dist/index.d.ts +30 -27
  128. package/dist/index.js +90 -82
  129. package/dist/interfaces/index.d.ts +108 -133
  130. package/dist/interfaces/index.js +5 -4
  131. package/dist/keys/index.d.ts +27 -29
  132. package/dist/keys/index.js +59 -49
  133. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  134. package/dist/mutators/RecordingTransaction.js +31 -37
  135. package/dist/mutators/Transaction.d.ts +18 -26
  136. package/dist/mutators/Transaction.js +14 -20
  137. package/dist/mutators/UndoManager.d.ts +122 -131
  138. package/dist/mutators/UndoManager.js +149 -155
  139. package/dist/mutators/defineMutators.d.ts +24 -37
  140. package/dist/mutators/defineMutators.js +14 -20
  141. package/dist/mutators/inverseOp.d.ts +12 -15
  142. package/dist/mutators/inverseOp.js +12 -15
  143. package/dist/mutators/mutateActions.d.ts +10 -9
  144. package/dist/mutators/mutateActions.js +1 -1
  145. package/dist/mutators/readerActions.d.ts +9 -8
  146. package/dist/mutators/readerActions.js +2 -2
  147. package/dist/mutators/undoApply.d.ts +31 -27
  148. package/dist/mutators/undoApply.js +26 -24
  149. package/dist/policy/index.d.ts +5 -3
  150. package/dist/policy/index.js +5 -3
  151. package/dist/policy/types.d.ts +105 -101
  152. package/dist/policy/types.js +67 -66
  153. package/dist/query/client.d.ts +32 -16
  154. package/dist/query/client.js +103 -72
  155. package/dist/query/types.d.ts +37 -60
  156. package/dist/query/types.js +13 -33
  157. package/dist/react/AbloProvider.d.ts +7 -11
  158. package/dist/react/AbloProvider.js +24 -17
  159. package/dist/react/context.d.ts +27 -146
  160. package/dist/react/context.js +9 -10
  161. package/dist/react/index.d.ts +41 -42
  162. package/dist/react/index.js +37 -38
  163. package/dist/react/internalContext.d.ts +17 -19
  164. package/dist/react/useAblo.d.ts +23 -22
  165. package/dist/react/useAblo.js +17 -15
  166. package/dist/react/useCurrentUserId.d.ts +8 -7
  167. package/dist/react/useCurrentUserId.js +8 -7
  168. package/dist/react/useErrorListener.d.ts +7 -7
  169. package/dist/react/useErrorListener.js +11 -12
  170. package/dist/react/useMutationFailureListener.d.ts +8 -8
  171. package/dist/react/useMutationFailureListener.js +9 -9
  172. package/dist/react/useMutators.d.ts +11 -11
  173. package/dist/react/useMutators.js +10 -4
  174. package/dist/react/useReactive.js +2 -3
  175. package/dist/react/useSyncStatus.d.ts +4 -6
  176. package/dist/react/useUndoScope.d.ts +7 -9
  177. package/dist/react/useUndoScope.js +3 -3
  178. package/dist/schema/coordination.d.ts +21 -25
  179. package/dist/schema/coordination.js +21 -25
  180. package/dist/schema/ddl.d.ts +43 -39
  181. package/dist/schema/ddl.js +75 -68
  182. package/dist/schema/ddlLock.d.ts +35 -0
  183. package/dist/schema/ddlLock.js +46 -0
  184. package/dist/schema/diff.d.ts +99 -61
  185. package/dist/schema/diff.js +43 -34
  186. package/dist/schema/field.d.ts +37 -42
  187. package/dist/schema/field.js +36 -49
  188. package/dist/schema/generate.d.ts +12 -12
  189. package/dist/schema/generate.js +12 -12
  190. package/dist/schema/index.d.ts +5 -4
  191. package/dist/schema/index.js +29 -21
  192. package/dist/schema/model.d.ts +121 -146
  193. package/dist/schema/model.js +24 -35
  194. package/dist/schema/openapi.d.ts +10 -9
  195. package/dist/schema/openapi.js +7 -1
  196. package/dist/schema/queries.d.ts +30 -32
  197. package/dist/schema/queries.js +24 -25
  198. package/dist/schema/relation.d.ts +89 -99
  199. package/dist/schema/relation.js +13 -13
  200. package/dist/schema/residency.d.ts +38 -0
  201. package/dist/schema/residency.js +30 -0
  202. package/dist/schema/roles.d.ts +45 -27
  203. package/dist/schema/roles.js +52 -21
  204. package/dist/schema/schema.d.ts +36 -45
  205. package/dist/schema/schema.js +42 -39
  206. package/dist/schema/select.d.ts +13 -13
  207. package/dist/schema/select.js +13 -13
  208. package/dist/schema/serialize.d.ts +36 -39
  209. package/dist/schema/serialize.js +27 -31
  210. package/dist/schema/sugar.d.ts +17 -32
  211. package/dist/schema/sugar.js +14 -29
  212. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +27 -50
  213. package/dist/schema/syncDeltaRow.js +89 -0
  214. package/dist/schema/tenancy.d.ts +44 -46
  215. package/dist/schema/tenancy.js +46 -48
  216. package/dist/server/adapter.d.ts +58 -58
  217. package/dist/server/adapter.js +13 -14
  218. package/dist/server/commit.d.ts +60 -64
  219. package/dist/server/index.d.ts +9 -10
  220. package/dist/server/index.js +1 -1
  221. package/dist/server/readConfig.d.ts +70 -0
  222. package/dist/server/readConfig.js +8 -0
  223. package/dist/server/storageMode.d.ts +23 -0
  224. package/dist/server/storageMode.js +17 -0
  225. package/dist/source/adapter.d.ts +31 -26
  226. package/dist/source/adapter.js +10 -10
  227. package/dist/source/adapters/drizzle.d.ts +28 -23
  228. package/dist/source/adapters/drizzle.js +34 -28
  229. package/dist/source/adapters/kysely.d.ts +27 -25
  230. package/dist/source/adapters/kysely.js +28 -26
  231. package/dist/source/adapters/memory.d.ts +8 -7
  232. package/dist/source/adapters/memory.js +10 -9
  233. package/dist/source/adapters/prisma.d.ts +13 -12
  234. package/dist/source/adapters/prisma.js +27 -29
  235. package/dist/source/conformance.d.ts +18 -11
  236. package/dist/source/conformance.js +27 -19
  237. package/dist/source/connector.d.ts +31 -32
  238. package/dist/source/connector.js +30 -28
  239. package/dist/source/connectorProtocol.d.ts +160 -0
  240. package/dist/source/connectorProtocol.js +162 -0
  241. package/dist/source/contract.d.ts +26 -27
  242. package/dist/source/contract.js +28 -29
  243. package/dist/source/factory.d.ts +94 -0
  244. package/dist/source/factory.js +268 -0
  245. package/dist/source/index.d.ts +10 -462
  246. package/dist/source/index.js +17 -421
  247. package/dist/source/migrations.d.ts +9 -9
  248. package/dist/source/migrations.js +9 -9
  249. package/dist/source/next.d.ts +10 -11
  250. package/dist/source/next.js +7 -8
  251. package/dist/source/pushQueue.d.ts +70 -48
  252. package/dist/source/pushQueue.js +36 -29
  253. package/dist/source/signing.d.ts +88 -0
  254. package/dist/source/signing.js +159 -0
  255. package/dist/source/types.d.ts +351 -0
  256. package/dist/source/types.js +43 -0
  257. package/dist/stores/ObjectStore.d.ts +11 -12
  258. package/dist/stores/ObjectStore.js +34 -35
  259. package/dist/stores/ObjectStoreContract.d.ts +12 -15
  260. package/dist/stores/SyncActionStore.d.ts +8 -12
  261. package/dist/stores/SyncActionStore.js +77 -46
  262. package/dist/surface.d.ts +28 -21
  263. package/dist/surface.js +28 -20
  264. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +37 -45
  265. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +101 -80
  266. package/dist/sync/ConnectionManager.d.ts +47 -50
  267. package/dist/sync/ConnectionManager.js +74 -70
  268. package/dist/sync/NetworkProbe.d.ts +27 -31
  269. package/dist/sync/NetworkProbe.js +67 -72
  270. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +49 -36
  271. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +79 -54
  272. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +45 -59
  273. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +44 -52
  274. package/dist/sync/SyncWebSocket.d.ts +175 -250
  275. package/dist/sync/SyncWebSocket.js +431 -769
  276. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  277. package/dist/sync/awaitClaimGrant.js +38 -30
  278. package/dist/sync/bootstrapApply.d.ts +70 -0
  279. package/dist/sync/bootstrapApply.js +73 -0
  280. package/dist/sync/commitFrames.d.ts +44 -0
  281. package/dist/sync/commitFrames.js +94 -0
  282. package/dist/sync/createClaimStream.d.ts +23 -22
  283. package/dist/sync/createClaimStream.js +108 -25
  284. package/dist/sync/createPresenceStream.d.ts +19 -18
  285. package/dist/sync/createPresenceStream.js +25 -26
  286. package/dist/sync/createSnapshot.d.ts +13 -17
  287. package/dist/sync/createSnapshot.js +20 -26
  288. package/dist/sync/credentialLifecycle.d.ts +175 -0
  289. package/dist/sync/credentialLifecycle.js +322 -0
  290. package/dist/sync/deltaPipeline.d.ts +113 -0
  291. package/dist/sync/deltaPipeline.js +261 -0
  292. package/dist/sync/groupChange.d.ts +113 -0
  293. package/dist/sync/groupChange.js +242 -0
  294. package/dist/sync/heartbeat.d.ts +63 -0
  295. package/dist/sync/heartbeat.js +91 -0
  296. package/dist/sync/participants.d.ts +27 -27
  297. package/dist/sync/schemas.d.ts +3 -2
  298. package/dist/sync/schemas.js +14 -10
  299. package/dist/sync/syncCursor.d.ts +40 -0
  300. package/dist/sync/syncCursor.js +55 -0
  301. package/dist/sync/syncPlan.d.ts +54 -0
  302. package/dist/sync/syncPlan.js +50 -0
  303. package/dist/sync/syncPosition.d.ts +54 -49
  304. package/dist/sync/syncPosition.js +57 -52
  305. package/dist/sync/wsFrameHandlers.d.ts +116 -0
  306. package/dist/sync/wsFrameHandlers.js +374 -0
  307. package/dist/testing/fixtures/bootstrap.d.ts +21 -17
  308. package/dist/testing/fixtures/bootstrap.js +12 -6
  309. package/dist/testing/fixtures/deltas.d.ts +31 -34
  310. package/dist/testing/fixtures/deltas.js +30 -33
  311. package/dist/testing/fixtures/models.d.ts +11 -10
  312. package/dist/testing/fixtures/models.js +12 -10
  313. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  314. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  315. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -18
  316. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +14 -11
  317. package/dist/testing/helpers/wait.d.ts +13 -8
  318. package/dist/testing/helpers/wait.js +13 -8
  319. package/dist/testing/index.d.ts +4 -4
  320. package/dist/testing/index.js +3 -3
  321. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  322. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  323. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  324. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  325. package/dist/testing/mocks/MockSyncContext.d.ts +21 -34
  326. package/dist/testing/mocks/MockSyncContext.js +16 -45
  327. package/dist/testing/mocks/MockSyncStore.d.ts +14 -14
  328. package/dist/testing/mocks/MockSyncStore.js +11 -11
  329. package/dist/testing/mocks/MockWebSocket.d.ts +28 -24
  330. package/dist/testing/mocks/MockWebSocket.js +22 -21
  331. package/dist/transactions/TransactionQueue.d.ts +190 -221
  332. package/dist/transactions/TransactionQueue.js +424 -822
  333. package/dist/transactions/TransactionStore.d.ts +20 -0
  334. package/dist/transactions/TransactionStore.js +53 -0
  335. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  336. package/dist/transactions/UnconfirmedWrites.js +104 -0
  337. package/dist/transactions/coalesceRules.d.ts +58 -0
  338. package/dist/transactions/coalesceRules.js +140 -0
  339. package/dist/transactions/commitPayload.d.ts +130 -0
  340. package/dist/transactions/commitPayload.js +143 -0
  341. package/dist/transactions/deltaConfirmation.d.ts +58 -0
  342. package/dist/transactions/deltaConfirmation.js +215 -0
  343. package/dist/transactions/optimisticApply.d.ts +49 -0
  344. package/dist/transactions/optimisticApply.js +65 -0
  345. package/dist/transactions/replayValidation.d.ts +99 -0
  346. package/dist/transactions/replayValidation.js +111 -0
  347. package/dist/types/global.d.ts +46 -41
  348. package/dist/types/global.js +20 -19
  349. package/dist/types/index.d.ts +74 -80
  350. package/dist/types/index.js +22 -27
  351. package/dist/types/modelData.d.ts +10 -0
  352. package/dist/types/modelData.js +9 -0
  353. package/dist/types/participant.d.ts +20 -0
  354. package/dist/types/participant.js +10 -0
  355. package/dist/types/streams.d.ts +216 -209
  356. package/dist/types/streams.js +7 -7
  357. package/dist/utils/asyncIterator.d.ts +25 -32
  358. package/dist/utils/asyncIterator.js +25 -32
  359. package/dist/utils/duration.d.ts +12 -15
  360. package/dist/utils/duration.js +12 -15
  361. package/dist/utils/mobxSetup.d.ts +53 -0
  362. package/dist/utils/{mobx-setup.js → mobxSetup.js} +44 -100
  363. package/dist/webhooks/events.d.ts +21 -16
  364. package/dist/webhooks/events.js +10 -8
  365. package/dist/webhooks/index.d.ts +5 -7
  366. package/dist/webhooks/index.js +5 -7
  367. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  368. package/dist/wire/delta.js +114 -0
  369. package/dist/wire/errorEnvelope.d.ts +35 -27
  370. package/dist/wire/errorEnvelope.js +38 -32
  371. package/dist/wire/frames.d.ts +150 -67
  372. package/dist/wire/frames.js +48 -1
  373. package/dist/wire/index.d.ts +18 -13
  374. package/dist/wire/index.js +36 -13
  375. package/dist/wire/listEnvelope.d.ts +16 -23
  376. package/dist/wire/listEnvelope.js +7 -6
  377. package/dist/wire/protocol.d.ts +38 -0
  378. package/dist/wire/protocol.js +38 -0
  379. package/dist/wire/protocolVersion.d.ts +60 -0
  380. package/dist/wire/protocolVersion.js +67 -0
  381. package/docs/api-keys.md +4 -3
  382. package/docs/coordination.md +59 -0
  383. package/docs/examples/existing-python-backend.md +3 -3
  384. package/docs/identity.md +4 -4
  385. package/docs/integration-guide.md +1 -1
  386. package/docs/react.md +1 -1
  387. package/docs/sessions.md +5 -7
  388. package/package.json +24 -21
  389. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  390. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  391. package/dist/client/index.d.ts +0 -36
  392. package/dist/client/index.js +0 -33
  393. package/dist/config/index.d.ts +0 -10
  394. package/dist/config/index.js +0 -12
  395. package/dist/core/query-utils.d.ts +0 -34
  396. package/dist/core/query-utils.js +0 -59
  397. package/dist/interfaces/headless.d.ts +0 -95
  398. package/dist/interfaces/headless.js +0 -41
  399. package/dist/query/index.d.ts +0 -6
  400. package/dist/query/index.js +0 -5
  401. package/dist/realtime/index.d.ts +0 -10
  402. package/dist/realtime/index.js +0 -9
  403. package/dist/schema/plane.d.ts +0 -23
  404. package/dist/schema/plane.js +0 -19
  405. package/dist/schema/sync-delta-row.js +0 -103
  406. package/dist/schema/sync-delta-wire.js +0 -102
  407. package/dist/server/next.d.ts +0 -51
  408. package/dist/server/next.js +0 -47
  409. package/dist/server/read-config.d.ts +0 -67
  410. package/dist/server/read-config.js +0 -8
  411. package/dist/server/storage-mode.d.ts +0 -1
  412. package/dist/server/storage-mode.js +0 -18
  413. package/dist/source/connector-protocol.d.ts +0 -159
  414. package/dist/source/connector-protocol.js +0 -161
  415. package/dist/sync/OfflineFlush.d.ts +0 -9
  416. package/dist/sync/OfflineFlush.js +0 -22
  417. package/dist/sync/OfflineTransactionStore.d.ts +0 -37
  418. package/dist/sync/OfflineTransactionStore.js +0 -263
  419. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  420. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  421. package/dist/transactions/index.d.ts +0 -16
  422. package/dist/transactions/index.js +0 -7
  423. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  424. package/dist/transactions/mutation-error-handler.js +0 -39
  425. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -1,17 +1,21 @@
1
1
  /**
2
- * Full sync engine test harness.
3
- *
4
- * Creates a complete stack (ModelRegistry, ObjectPool, TransactionQueue, etc.)
5
- * with real implementations backed by mocked I/O for integration tests.
2
+ * An integration-test harness that assembles a full sync engine stack
3
+ * the model registry, object pool, transaction queue, and related parts —
4
+ * from the real implementations, but with mocked input and output. It lets
5
+ * tests exercise the engine end to end without a network or a live server.
6
6
  */
7
7
  import { ModelRegistry, setActiveRegistry } from '../../ModelRegistry.js';
8
- import { ObjectPool } from '../../ObjectPool.js';
8
+ import { InstanceCache } from '../../InstanceCache.js';
9
+ import { MockMutationExecutor } from '../mocks/MockMutationExecutor.js';
10
+ import { MockNetworkMonitor } from '../mocks/MockNetworkMonitor.js';
9
11
  import { MockWebSocket } from '../mocks/MockWebSocket.js';
10
12
  import { createTestContext } from '../mocks/MockSyncContext.js';
11
13
  import { registerTestModels, createTestConfig, resetFixtureCounter, } from '../fixtures/models.js';
12
14
  import { resetDeltaCounter } from '../fixtures/deltas.js';
13
15
  /**
14
- * Create a full test harness with real sync engine components + mocked I/O.
16
+ * Builds a full test harness: real sync engine components wired to mocked
17
+ * input and output. Reset the counters and tear everything down through the
18
+ * returned {@link TestHarness.cleanup}.
15
19
  *
16
20
  * Usage:
17
21
  * ```ts
@@ -28,7 +32,7 @@ export function createTestHarness(options = {}) {
28
32
  const registry = new ModelRegistry();
29
33
  setActiveRegistry(registry);
30
34
  registerTestModels(registry);
31
- // Create DI context with test config
35
+ // Create the dependency-injection context with the test config
32
36
  const testConfig = createTestConfig();
33
37
  const context = createTestContext({
34
38
  config: testConfig,
@@ -37,14 +41,14 @@ export function createTestHarness(options = {}) {
37
41
  initialSyncId: options.initialSyncId ?? 1,
38
42
  },
39
43
  });
40
- // Create real ObjectPool with FK indexes
41
- const pool = new ObjectPool({
44
+ // Create the real object pool with foreign-key indexes
45
+ const pool = new InstanceCache({
42
46
  maxSize: options.poolConfig?.maxSize ?? 10000,
43
47
  maxAge: options.poolConfig?.maxAge ?? 5 * 60 * 1000,
44
48
  gcInterval: options.poolConfig?.gcInterval ?? 0, // Disable auto-GC in tests
45
49
  useWeakRefs: options.poolConfig?.useWeakRefs ?? false, // Disable WeakRefs for predictable tests
46
50
  }, registry);
47
- // Register FK indexes for test models
51
+ // Register foreign-key indexes for the test models
48
52
  pool.registerForeignKey('Task', 'projectId');
49
53
  pool.registerForeignKey('Comment', 'taskId');
50
54
  pool.registerForeignKey('Slide', 'deckId');
@@ -58,7 +62,6 @@ export function createTestHarness(options = {}) {
58
62
  context,
59
63
  mutationExecutor: context.mocks.mutationExecutor,
60
64
  networkMonitor: context.mocks.networkMonitor,
61
- mutationDispatcher: context.mocks.mutationDispatcher,
62
65
  cleanup: () => {
63
66
  pool.clear();
64
67
  webSocket.reset();
@@ -1,25 +1,30 @@
1
1
  /**
2
- * Async test helpers for timing-sensitive sync engine tests.
2
+ * Asynchronous helpers for tests whose assertions depend on timing for
3
+ * flushing pending work, polling for a condition, or waiting a fixed delay.
3
4
  */
4
5
  /**
5
- * Flush all pending microtasks (Promise.resolve, queueMicrotask).
6
- * Critical for testing TransactionQueue's microtask batching.
6
+ * Flushes all pending microtasks, such as resolved promises and
7
+ * `queueMicrotask` callbacks. Useful for testing work the transaction queue
8
+ * batches on the microtask queue.
7
9
  */
8
10
  export declare function flushMicrotasks(): Promise<void>;
9
11
  /**
10
- * Wait for a condition to become true, polling at intervals.
11
- * Times out after maxWait ms.
12
+ * Polls `condition` until it returns true, checking every `interval`
13
+ * milliseconds. Rejects with an {@link AbloConnectionError} if `maxWait`
14
+ * milliseconds pass first.
12
15
  */
13
16
  export declare function waitFor(condition: () => boolean, options?: {
14
17
  maxWait?: number;
15
18
  interval?: number;
16
19
  }): Promise<void>;
17
20
  /**
18
- * Wait for N milliseconds. Use sparingly prefer flushMicrotasks() or waitFor().
21
+ * Waits for the given number of milliseconds. Use sparingly; prefer
22
+ * {@link flushMicrotasks} or {@link waitFor}, which don't tie tests to
23
+ * wall-clock time.
19
24
  */
20
25
  export declare function delay(ms: number): Promise<void>;
21
26
  /**
22
- * Run a callback after flushing microtasks.
23
- * Useful for asserting state after TransactionQueue batch processing.
27
+ * Flushes pending microtasks, then runs `fn` and returns its result. Handy
28
+ * for asserting state after the transaction queue processes a batch.
24
29
  */
25
30
  export declare function afterMicrotasks<T>(fn: () => T): Promise<T>;
@@ -1,10 +1,12 @@
1
1
  /**
2
- * Async test helpers for timing-sensitive sync engine tests.
2
+ * Asynchronous helpers for tests whose assertions depend on timing for
3
+ * flushing pending work, polling for a condition, or waiting a fixed delay.
3
4
  */
4
5
  import { AbloConnectionError } from '../../errors.js';
5
6
  /**
6
- * Flush all pending microtasks (Promise.resolve, queueMicrotask).
7
- * Critical for testing TransactionQueue's microtask batching.
7
+ * Flushes all pending microtasks, such as resolved promises and
8
+ * `queueMicrotask` callbacks. Useful for testing work the transaction queue
9
+ * batches on the microtask queue.
8
10
  */
9
11
  export function flushMicrotasks() {
10
12
  return new Promise((resolve) => {
@@ -13,8 +15,9 @@ export function flushMicrotasks() {
13
15
  });
14
16
  }
15
17
  /**
16
- * Wait for a condition to become true, polling at intervals.
17
- * Times out after maxWait ms.
18
+ * Polls `condition` until it returns true, checking every `interval`
19
+ * milliseconds. Rejects with an {@link AbloConnectionError} if `maxWait`
20
+ * milliseconds pass first.
18
21
  */
19
22
  export async function waitFor(condition, options = {}) {
20
23
  const { maxWait = 5000, interval = 10 } = options;
@@ -29,14 +32,16 @@ export async function waitFor(condition, options = {}) {
29
32
  }
30
33
  }
31
34
  /**
32
- * Wait for N milliseconds. Use sparingly prefer flushMicrotasks() or waitFor().
35
+ * Waits for the given number of milliseconds. Use sparingly; prefer
36
+ * {@link flushMicrotasks} or {@link waitFor}, which don't tie tests to
37
+ * wall-clock time.
33
38
  */
34
39
  export function delay(ms) {
35
40
  return new Promise((resolve) => setTimeout(resolve, ms));
36
41
  }
37
42
  /**
38
- * Run a callback after flushing microtasks.
39
- * Useful for asserting state after TransactionQueue batch processing.
43
+ * Flushes pending microtasks, then runs `fn` and returns its result. Handy
44
+ * for asserting state after the transaction queue processes a batch.
40
45
  */
41
46
  export async function afterMicrotasks(fn) {
42
47
  await flushMicrotasks();
@@ -9,13 +9,13 @@ export type { CapturedMutation, MockMutationExecutorOptions } from './mocks/Mock
9
9
  export { MockNetworkMonitor } from './mocks/MockNetworkMonitor.js';
10
10
  export { MockWebSocket } from './mocks/MockWebSocket.js';
11
11
  export type { MockDelta, MockBootstrapHint } from './mocks/MockWebSocket.js';
12
- export { createTestContext, MockMutationDispatcher, } from './mocks/MockSyncContext.js';
12
+ export { createTestContext, } from './mocks/MockSyncContext.js';
13
13
  export type { TestContextOptions, TestContextResult } from './mocks/MockSyncContext.js';
14
14
  export { TestProject, TestTask, TestComment, TestSlideDeck, TestSlide, TestSlideLayer, TEST_MODEL_PRIORITIES, registerTestModels, createTestConfig, resetFixtureCounter, createProjectFixture, createTaskFixture, createCommentFixture, createSlideDeckFixture, createSlideFixture, createSlideLayerFixture, } from './fixtures/models.js';
15
15
  export { createDelta, createInsertDelta, createUpdateDelta, createDeleteDelta, createArchiveDelta, createUnarchiveDelta, createCoveringDelta, createGroupAddedDelta, createLegacyGroupChangeDelta, createGroupRemovedDelta, createDeltaBatch, createConfirmationDelta, resetDeltaCounter, } from './fixtures/deltas.js';
16
16
  export { createFullBootstrapResponse, createPartialBootstrapResponse, createTestBootstrapResponse, } from './fixtures/bootstrap.js';
17
17
  export type { BootstrapModelData, BootstrapResponse } from './fixtures/bootstrap.js';
18
- export { createTestHarness, } from './helpers/sync-engine-harness.js';
19
- export type { TestHarness, TestHarnessOptions } from './helpers/sync-engine-harness.js';
18
+ export { createTestHarness, } from './helpers/syncEngineHarness.js';
19
+ export type { TestHarness, TestHarnessOptions } from './helpers/syncEngineHarness.js';
20
20
  export { flushMicrotasks, waitFor, delay, afterMicrotasks, } from './helpers/wait.js';
21
- export { createReactTestWrapper, renderSyncHook, MockSyncStore, createMockSyncStore, type TestWrapperOptions, } from './helpers/react-wrapper.js';
21
+ export { createReactTestWrapper, renderSyncHook, MockSyncStore, createMockSyncStore, type TestWrapperOptions, } from './helpers/reactWrapper.js';
@@ -10,7 +10,7 @@
10
10
  export { MockMutationExecutor } from './mocks/MockMutationExecutor.js';
11
11
  export { MockNetworkMonitor } from './mocks/MockNetworkMonitor.js';
12
12
  export { MockWebSocket } from './mocks/MockWebSocket.js';
13
- export { createTestContext, MockMutationDispatcher, } from './mocks/MockSyncContext.js';
13
+ export { createTestContext, } from './mocks/MockSyncContext.js';
14
14
  // ─────────────────────────────────────────────
15
15
  // Fixtures: Models
16
16
  // ─────────────────────────────────────────────
@@ -26,7 +26,7 @@ export { createFullBootstrapResponse, createPartialBootstrapResponse, createTest
26
26
  // ─────────────────────────────────────────────
27
27
  // Helpers
28
28
  // ─────────────────────────────────────────────
29
- export { createTestHarness, } from './helpers/sync-engine-harness.js';
29
+ export { createTestHarness, } from './helpers/syncEngineHarness.js';
30
30
  export { flushMicrotasks, waitFor, delay, afterMicrotasks, } from './helpers/wait.js';
31
31
  // React testing helpers
32
- export { createReactTestWrapper, renderSyncHook, MockSyncStore, createMockSyncStore, } from './helpers/react-wrapper.js';
32
+ export { createReactTestWrapper, renderSyncHook, MockSyncStore, createMockSyncStore, } from './helpers/reactWrapper.js';
@@ -1,8 +1,9 @@
1
1
  /**
2
- * MockMutationExecutor Test double for the MutationExecutor interface.
3
- *
4
- * Captures all mutation calls, allows controlled responses (success/failure/latency),
5
- * and returns configurable lastSyncId for delta confirmation testing.
2
+ * A test double for {@link MutationExecutor} that records every call instead
3
+ * of writing to a database. Use it to assert what a component tried to commit
4
+ * and to script the response — success, failure, or added latency — without a
5
+ * live backend. Each successful commit hands back an incrementing `lastSyncId`,
6
+ * so tests can drive the delta-confirmation flow that depends on those ids.
6
7
  */
7
8
  import type { MutationExecutor, MutationOperation, MutationOptions, CommitResult } from '../../interfaces/index.js';
8
9
  export interface CapturedMutation {
@@ -16,15 +17,15 @@ export interface CapturedMutation {
16
17
  timestamp: number;
17
18
  }
18
19
  export interface MockMutationExecutorOptions {
19
- /** Starting lastSyncId increments by 1 per commit call */
20
+ /** The first `lastSyncId` to return. It increments by one after each commit. */
20
21
  initialSyncId?: number;
21
- /** Whether mutations should succeed by default */
22
+ /** Whether mutations succeed by default. Set this false to make every call reject. */
22
23
  shouldSucceed?: boolean;
23
- /** Simulated network latency in ms */
24
+ /** A delay applied before each call resolves, in milliseconds, to simulate a slow network. */
24
25
  latencyMs?: number;
25
26
  }
26
27
  export declare class MockMutationExecutor implements MutationExecutor {
27
- /** All captured mutation calls in order */
28
+ /** Every captured call, in the order it was made. Assertions read from this list. */
28
29
  readonly calls: CapturedMutation[];
29
30
  /** Current sync ID — incremented on each successful commit */
30
31
  private _syncId;
@@ -35,23 +36,23 @@ export declare class MockMutationExecutor implements MutationExecutor {
35
36
  /** Per-method response overrides */
36
37
  private _responseOverrides;
37
38
  constructor(options?: MockMutationExecutorOptions);
38
- /** Get current sync ID without incrementing */
39
+ /** Returns the current sync id without advancing it. */
39
40
  get currentSyncId(): number;
40
- /** Set the next sync ID to return */
41
+ /** Sets the next sync id the executor will return. */
41
42
  setSyncId(id: number): void;
42
- /** Make all mutations fail with given error */
43
+ /** Makes every mutation reject. Pass an error to control what is thrown. */
43
44
  failAll(error?: Error): void;
44
- /** Make all mutations succeed again */
45
+ /** Restores the default where mutations succeed, clearing any failure overrides. */
45
46
  succeedAll(): void;
46
- /** Make a specific method fail */
47
+ /** Makes a single named method reject. Pass an error to control what is thrown. */
47
48
  failMethod(method: string, error?: Error): void;
48
- /** Clear failure override for a method */
49
+ /** Removes the failure override for one method. */
49
50
  clearFailure(method: string): void;
50
- /** Get calls filtered by method */
51
+ /** Returns the captured calls for one method, in order. */
51
52
  getCallsByMethod(method: string): CapturedMutation[];
52
- /** Get the last call made */
53
+ /** The most recent captured call, or undefined if none have been made. */
53
54
  get lastCall(): CapturedMutation | undefined;
54
- /** Reset all state */
55
+ /** Clears captured calls and restores the initial options. */
55
56
  reset(options?: MockMutationExecutorOptions): void;
56
57
  commit(operations: MutationOperation[], options?: MutationOptions): Promise<CommitResult>;
57
58
  executeCreate(modelName: string, id: string, input: Record<string, unknown>, clientMutationId?: string): Promise<void>;
@@ -1,12 +1,13 @@
1
1
  /**
2
- * MockMutationExecutor Test double for the MutationExecutor interface.
3
- *
4
- * Captures all mutation calls, allows controlled responses (success/failure/latency),
5
- * and returns configurable lastSyncId for delta confirmation testing.
2
+ * A test double for {@link MutationExecutor} that records every call instead
3
+ * of writing to a database. Use it to assert what a component tried to commit
4
+ * and to script the response — success, failure, or added latency — without a
5
+ * live backend. Each successful commit hands back an incrementing `lastSyncId`,
6
+ * so tests can drive the delta-confirmation flow that depends on those ids.
6
7
  */
7
8
  import { AbloError } from '../../errors.js';
8
9
  export class MockMutationExecutor {
9
- /** All captured mutation calls in order */
10
+ /** Every captured call, in the order it was made. Assertions read from this list. */
10
11
  calls = [];
11
12
  /** Current sync ID — incremented on each successful commit */
12
13
  _syncId;
@@ -24,43 +25,43 @@ export class MockMutationExecutor {
24
25
  // ─────────────────────────────────────────────
25
26
  // Test control API
26
27
  // ─────────────────────────────────────────────
27
- /** Get current sync ID without incrementing */
28
+ /** Returns the current sync id without advancing it. */
28
29
  get currentSyncId() {
29
30
  return this._syncId;
30
31
  }
31
- /** Set the next sync ID to return */
32
+ /** Sets the next sync id the executor will return. */
32
33
  setSyncId(id) {
33
34
  this._syncId = id;
34
35
  }
35
- /** Make all mutations fail with given error */
36
+ /** Makes every mutation reject. Pass an error to control what is thrown. */
36
37
  failAll(error) {
37
38
  this._shouldSucceed = false;
38
39
  if (error) {
39
40
  this._failureOverrides.set('*', error);
40
41
  }
41
42
  }
42
- /** Make all mutations succeed again */
43
+ /** Restores the default where mutations succeed, clearing any failure overrides. */
43
44
  succeedAll() {
44
45
  this._shouldSucceed = true;
45
46
  this._failureOverrides.clear();
46
47
  }
47
- /** Make a specific method fail */
48
+ /** Makes a single named method reject. Pass an error to control what is thrown. */
48
49
  failMethod(method, error) {
49
50
  this._failureOverrides.set(method, error ?? new Error(`Mock ${method} failed`));
50
51
  }
51
- /** Clear failure override for a method */
52
+ /** Removes the failure override for one method. */
52
53
  clearFailure(method) {
53
54
  this._failureOverrides.delete(method);
54
55
  }
55
- /** Get calls filtered by method */
56
+ /** Returns the captured calls for one method, in order. */
56
57
  getCallsByMethod(method) {
57
58
  return this.calls.filter((c) => c.method === method);
58
59
  }
59
- /** Get the last call made */
60
+ /** The most recent captured call, or undefined if none have been made. */
60
61
  get lastCall() {
61
62
  return this.calls[this.calls.length - 1];
62
63
  }
63
- /** Reset all state */
64
+ /** Clears captured calls and restores the initial options. */
64
65
  reset(options) {
65
66
  this.calls.length = 0;
66
67
  this._syncId = options?.initialSyncId ?? 1;
@@ -1,20 +1,20 @@
1
1
  /**
2
- * MockNetworkMonitor Test double for OnlineStatusProvider.
3
- *
4
- * Allows tests to programmatically toggle online/offline state
5
- * and trigger visibility change events.
2
+ * A test double for {@link OnlineStatusProvider} that lets tests flip the
3
+ * connection between online and offline on demand. Alongside its own state, it
4
+ * updates the global `navigator.onLine` flag so code that reads the browser
5
+ * value directly sees the same status.
6
6
  */
7
7
  import type { OnlineStatusProvider } from '../../interfaces/index.js';
8
8
  export declare class MockNetworkMonitor implements OnlineStatusProvider {
9
9
  private _online;
10
10
  constructor(initialOnline?: boolean);
11
11
  isOnline(): boolean;
12
- /** Simulate going online */
12
+ /** Marks the connection online and sets `navigator.onLine` to true. */
13
13
  goOnline(): void;
14
- /** Simulate going offline */
14
+ /** Marks the connection offline and sets `navigator.onLine` to false. */
15
15
  goOffline(): void;
16
- /** Toggle online state and return new value */
16
+ /** Flips between online and offline, returning the new online state. */
17
17
  toggle(): boolean;
18
- /** Reset to initial state (online) */
18
+ /** Returns the monitor to its online starting state. */
19
19
  reset(): void;
20
20
  }
@@ -1,8 +1,8 @@
1
1
  /**
2
- * MockNetworkMonitor Test double for OnlineStatusProvider.
3
- *
4
- * Allows tests to programmatically toggle online/offline state
5
- * and trigger visibility change events.
2
+ * A test double for {@link OnlineStatusProvider} that lets tests flip the
3
+ * connection between online and offline on demand. Alongside its own state, it
4
+ * updates the global `navigator.onLine` flag so code that reads the browser
5
+ * value directly sees the same status.
6
6
  */
7
7
  export class MockNetworkMonitor {
8
8
  _online;
@@ -12,7 +12,7 @@ export class MockNetworkMonitor {
12
12
  isOnline() {
13
13
  return this._online;
14
14
  }
15
- /** Simulate going online */
15
+ /** Marks the connection online and sets `navigator.onLine` to true. */
16
16
  goOnline() {
17
17
  this._online = true;
18
18
  // Also update navigator.onLine for code that reads it directly
@@ -21,7 +21,7 @@ export class MockNetworkMonitor {
21
21
  value: true,
22
22
  });
23
23
  }
24
- /** Simulate going offline */
24
+ /** Marks the connection offline and sets `navigator.onLine` to false. */
25
25
  goOffline() {
26
26
  this._online = false;
27
27
  Object.defineProperty(navigator, 'onLine', {
@@ -29,7 +29,7 @@ export class MockNetworkMonitor {
29
29
  value: false,
30
30
  });
31
31
  }
32
- /** Toggle online state and return new value */
32
+ /** Flips between online and offline, returning the new online state. */
33
33
  toggle() {
34
34
  if (this._online) {
35
35
  this.goOffline();
@@ -39,7 +39,7 @@ export class MockNetworkMonitor {
39
39
  }
40
40
  return this._online;
41
41
  }
42
- /** Reset to initial state (online) */
42
+ /** Returns the monitor to its online starting state. */
43
43
  reset() {
44
44
  this.goOnline();
45
45
  }
@@ -1,60 +1,47 @@
1
1
  /**
2
- * MockSyncContext — Creates a fully-wired SyncEngineContext for tests.
3
- *
4
- * `createTestContext()` is the primary test utility: it builds a complete
5
- * DI container with mock implementations, calls initSyncEngine(), and
6
- * returns handles to all mocks for test assertions.
2
+ * Assembles a ready-to-use {@link SyncEngineContext} for tests. The context
3
+ * bundles every dependency the engine needs — logger, network monitor,
4
+ * mutation executor, and configuration — so a test can start the engine
5
+ * without a real backend. {@link createTestContext} is the entry point: it
6
+ * wires the mocks, installs the context globally through {@link initSyncEngine},
7
+ * and returns handles to each mock for assertions.
7
8
  */
8
9
  import type { SyncEngineContext } from '../../SyncEngineContext.js';
9
- import type { SyncLogger, SyncObservabilityProvider, SessionErrorDetector, MutationDispatcher, SyncEngineConfig } from '../../interfaces/index.js';
10
+ import type { SyncLogger, SyncObservabilityProvider, SessionErrorDetector, SyncEngineConfig } from '../../interfaces/index.js';
10
11
  import { MockMutationExecutor } from './MockMutationExecutor.js';
11
12
  import { MockNetworkMonitor } from './MockNetworkMonitor.js';
12
13
  export interface TestContextOptions {
13
- /** Override the logger (default: noopLogger) */
14
+ /** Replaces the default no-op logger. */
14
15
  logger?: SyncLogger;
15
- /** Override observability (default: noopObservability) */
16
+ /** Replaces the default no-op observability provider. */
16
17
  observability?: SyncObservabilityProvider;
17
- /** Override session error detector */
18
+ /** Replaces the detector that decides whether an error means the session has expired. */
18
19
  sessionErrorDetector?: SessionErrorDetector;
19
- /** Override mutation executor options */
20
+ /** Options forwarded to the {@link MockMutationExecutor} that the context creates. */
20
21
  mutationExecutorOptions?: ConstructorParameters<typeof MockMutationExecutor>[0];
21
- /** Override the sync engine config */
22
+ /** A partial {@link SyncEngineConfig} merged over the defaults. */
22
23
  config?: Partial<SyncEngineConfig>;
23
- /** Start offline (default: false) */
24
+ /** Starts the network monitor offline. Defaults to online. */
24
25
  startOffline?: boolean;
25
26
  }
26
27
  export interface TestContextResult {
27
- /** The full SyncEngineContext passed to initSyncEngine */
28
+ /** The assembled context that {@link createTestContext} installed globally. */
28
29
  context: SyncEngineContext;
29
- /** Mock handles for test assertions */
30
+ /** Handles to the underlying mocks, so tests can drive them and assert on them. */
30
31
  mocks: {
31
32
  mutationExecutor: MockMutationExecutor;
32
- mutationDispatcher: MockMutationDispatcher;
33
33
  networkMonitor: MockNetworkMonitor;
34
34
  };
35
- /** Cleanup: calls resetSyncEngine() */
35
+ /** Tears the test down by resetting the engine and the mocks. Call it when the test finishes. */
36
36
  cleanup: () => void;
37
37
  }
38
38
  /**
39
- * Simple mock mutation dispatcher that records dispatch calls.
40
- */
41
- export declare class MockMutationDispatcher implements MutationDispatcher {
42
- readonly dispatched: Array<{
43
- operationName: string;
44
- variables: Record<string, unknown>;
45
- }>;
46
- private _shouldSucceed;
47
- private _error?;
48
- dispatch(operationName: string, variables: Record<string, unknown>): Promise<void>;
49
- failAll(error?: Error): void;
50
- succeedAll(): void;
51
- reset(): void;
52
- }
53
- /**
54
- * Create a test SyncEngineContext with all mocks pre-wired.
55
- * Calls initSyncEngine() so the global context is set.
39
+ * Builds a {@link SyncEngineContext} with every mock pre-wired and installs it
40
+ * globally through {@link initSyncEngine}, so code under test reaches the engine
41
+ * the same way it would in production. Returns the context, the mock handles,
42
+ * and a cleanup function to call when the test finishes.
56
43
  *
57
- * Usage:
44
+ * @example
58
45
  * ```ts
59
46
  * const { context, mocks, cleanup } = createTestContext();
60
47
  * // ... run tests using mocks.mutationExecutor, mocks.networkMonitor
@@ -1,48 +1,24 @@
1
1
  /**
2
- * MockSyncContext — Creates a fully-wired SyncEngineContext for tests.
3
- *
4
- * `createTestContext()` is the primary test utility: it builds a complete
5
- * DI container with mock implementations, calls initSyncEngine(), and
6
- * returns handles to all mocks for test assertions.
2
+ * Assembles a ready-to-use {@link SyncEngineContext} for tests. The context
3
+ * bundles every dependency the engine needs — logger, network monitor,
4
+ * mutation executor, and configuration — so a test can start the engine
5
+ * without a real backend. {@link createTestContext} is the entry point: it
6
+ * wires the mocks, installs the context globally through {@link initSyncEngine},
7
+ * and returns handles to each mock for assertions.
7
8
  */
8
9
  import { noopLogger, noopObservability, noopAnalytics, defaultSessionErrorDetector, emptyConfig, } from '../../SyncEngineContext.js';
9
10
  import { initSyncEngine, resetSyncEngine } from '../../context.js';
10
- import { ModelRegistry, setActiveRegistry, hasActiveRegistry, } from '../../ModelRegistry.js';
11
+ import { ModelRegistry, setActiveRegistry, hasActiveRegistry, clearActiveRegistry, } from '../../ModelRegistry.js';
11
12
  import { registerTestModels } from '../fixtures/models.js';
12
13
  import { MockMutationExecutor } from './MockMutationExecutor.js';
13
14
  import { MockNetworkMonitor } from './MockNetworkMonitor.js';
14
15
  /**
15
- * Simple mock mutation dispatcher that records dispatch calls.
16
- */
17
- export class MockMutationDispatcher {
18
- dispatched = [];
19
- _shouldSucceed = true;
20
- _error;
21
- async dispatch(operationName, variables) {
22
- this.dispatched.push({ operationName, variables });
23
- if (!this._shouldSucceed) {
24
- throw this._error ?? new Error(`Mock dispatch failed: ${operationName}`);
25
- }
26
- }
27
- failAll(error) {
28
- this._shouldSucceed = false;
29
- this._error = error;
30
- }
31
- succeedAll() {
32
- this._shouldSucceed = true;
33
- this._error = undefined;
34
- }
35
- reset() {
36
- this.dispatched.length = 0;
37
- this._shouldSucceed = true;
38
- this._error = undefined;
39
- }
40
- }
41
- /**
42
- * Create a test SyncEngineContext with all mocks pre-wired.
43
- * Calls initSyncEngine() so the global context is set.
16
+ * Builds a {@link SyncEngineContext} with every mock pre-wired and installs it
17
+ * globally through {@link initSyncEngine}, so code under test reaches the engine
18
+ * the same way it would in production. Returns the context, the mock handles,
19
+ * and a cleanup function to call when the test finishes.
44
20
  *
45
- * Usage:
21
+ * @example
46
22
  * ```ts
47
23
  * const { context, mocks, cleanup } = createTestContext();
48
24
  * // ... run tests using mocks.mutationExecutor, mocks.networkMonitor
@@ -51,7 +27,6 @@ export class MockMutationDispatcher {
51
27
  */
52
28
  export function createTestContext(options = {}) {
53
29
  const mutationExecutor = new MockMutationExecutor(options.mutationExecutorOptions);
54
- const mutationDispatcher = new MockMutationDispatcher();
55
30
  const networkMonitor = new MockNetworkMonitor(!options.startOffline);
56
31
  const config = {
57
32
  ...emptyConfig,
@@ -66,7 +41,6 @@ export function createTestContext(options = {}) {
66
41
  sessionErrorDetector: options.sessionErrorDetector ?? defaultSessionErrorDetector,
67
42
  onlineStatus: networkMonitor,
68
43
  mutationExecutor,
69
- mutationDispatcher,
70
44
  config,
71
45
  };
72
46
  initSyncEngine(context);
@@ -82,18 +56,15 @@ export function createTestContext(options = {}) {
82
56
  context,
83
57
  mocks: {
84
58
  mutationExecutor,
85
- mutationDispatcher,
86
59
  networkMonitor,
87
60
  },
88
61
  cleanup: () => {
89
62
  resetSyncEngine();
90
- // Intentionally do NOT clear the active ModelRegistry async callbacks
91
- // from in-flight transactions (e.g. fc.asyncProperty iterations) may
92
- // call Model.toJSON() after afterEach runs. Leaving the default
93
- // registry in place keeps those calls valid; the next createTestContext
94
- // with hasActiveRegistry()===true simply reuses it.
63
+ // Leave the active ModelRegistry in place on purpose. Async callbacks
64
+ // from in-flight transactions can call Model.toJSON() after a test's
65
+ // teardown has run; keeping the default registry available keeps those
66
+ // late calls valid, and the next createTestContext simply reuses it.
95
67
  mutationExecutor.reset();
96
- mutationDispatcher.reset();
97
68
  networkMonitor.reset();
98
69
  },
99
70
  };