@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,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,44 +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
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
33
  networkMonitor: MockNetworkMonitor;
33
34
  };
34
- /** Cleanup: calls resetSyncEngine() */
35
+ /** Tears the test down by resetting the engine and the mocks. Call it when the test finishes. */
35
36
  cleanup: () => void;
36
37
  }
37
38
  /**
38
- * Create a test SyncEngineContext with all mocks pre-wired.
39
- * 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.
40
43
  *
41
- * Usage:
44
+ * @example
42
45
  * ```ts
43
46
  * const { context, mocks, cleanup } = createTestContext();
44
47
  * // ... run tests using mocks.mutationExecutor, mocks.networkMonitor
@@ -1,9 +1,10 @@
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';
@@ -12,10 +13,12 @@ import { registerTestModels } from '../fixtures/models.js';
12
13
  import { MockMutationExecutor } from './MockMutationExecutor.js';
13
14
  import { MockNetworkMonitor } from './MockNetworkMonitor.js';
14
15
  /**
15
- * Create a test SyncEngineContext with all mocks pre-wired.
16
- * 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.
17
20
  *
18
- * Usage:
21
+ * @example
19
22
  * ```ts
20
23
  * const { context, mocks, cleanup } = createTestContext();
21
24
  * // ... run tests using mocks.mutationExecutor, mocks.networkMonitor
@@ -57,11 +60,10 @@ export function createTestContext(options = {}) {
57
60
  },
58
61
  cleanup: () => {
59
62
  resetSyncEngine();
60
- // Intentionally do NOT clear the active ModelRegistry async callbacks
61
- // from in-flight transactions (e.g. fc.asyncProperty iterations) may
62
- // call Model.toJSON() after afterEach runs. Leaving the default
63
- // registry in place keeps those calls valid; the next createTestContext
64
- // 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.
65
67
  mutationExecutor.reset();
66
68
  networkMonitor.reset();
67
69
  },
@@ -1,11 +1,10 @@
1
1
  /**
2
- * MockSyncStore a SyncStoreContract implementation for testing.
3
- *
4
- * Provides an in-memory store that tests can configure, inspect, and mutate.
5
- * All reactive operations are synchronous and observable via Jest spies.
2
+ * An in-memory {@link SyncStoreContract} for tests. It lets you seed rows,
3
+ * read and write them synchronously, and inspect every call the code under
4
+ * test made all without a real sync backend.
6
5
  */
7
6
  import type { Model } from '../../Model.js';
8
- import type { ModelScope } from '../../ObjectPool.js';
7
+ import type { ModelScope } from '../../InstanceCache.js';
9
8
  import type { SyncStoreContract } from '../../react/context.js';
10
9
  interface QueryOptions<T extends Model> {
11
10
  predicate?: (model: T) => boolean;
@@ -20,9 +19,10 @@ interface QueryResult<T extends Model> {
20
19
  }
21
20
  type ModelCtor<T extends Model> = abstract new (...args: never[]) => T;
22
21
  /**
23
- * MockSyncStore is an in-memory implementation of SyncStoreContract.
24
- * Tests can seed data with `setModels()`, inspect calls via `calls`,
25
- * and assert behavior without needing a real sync backend.
22
+ * An in-memory implementation of {@link SyncStoreContract}. Seed rows with
23
+ * {@link MockSyncStore.setModels}, then read and write through the contract
24
+ * methods; every call is recorded on {@link MockSyncStore.calls} so tests can
25
+ * assert on what happened.
26
26
  */
27
27
  export declare class MockSyncStore implements SyncStoreContract {
28
28
  private byClass;
@@ -48,7 +48,7 @@ export declare class MockSyncStore implements SyncStoreContract {
48
48
  */
49
49
  setModels<T extends Model>(modelClass: ModelCtor<T>, models: T[]): void;
50
50
  /**
51
- * Add a single model (upsert).
51
+ * Adds or replaces a single model, keyed by its id.
52
52
  */
53
53
  addModel<T extends Model>(modelClass: ModelCtor<T>, model: T): void;
54
54
  /**
@@ -77,7 +77,7 @@ export declare class MockSyncStore implements SyncStoreContract {
77
77
  pendingChanges: number;
78
78
  isSessionError: boolean;
79
79
  };
80
- /** Mock pool for useEntity/useEntities hooks. */
80
+ /** A minimal object pool backing the useEntity and useEntities hooks in tests. */
81
81
  pool: SyncStoreContract['pool'];
82
82
  }
83
83
  /**
@@ -1,15 +1,15 @@
1
1
  /**
2
- * MockSyncStore a SyncStoreContract implementation for testing.
3
- *
4
- * Provides an in-memory store that tests can configure, inspect, and mutate.
5
- * All reactive operations are synchronous and observable via Jest spies.
2
+ * An in-memory {@link SyncStoreContract} for tests. It lets you seed rows,
3
+ * read and write them synchronously, and inspect every call the code under
4
+ * test made all without a real sync backend.
6
5
  */
7
6
  import { ViewRegistry } from '../../core/ViewRegistry.js';
8
7
  import { AbloValidationError } from '../../errors.js';
9
8
  /**
10
- * MockSyncStore is an in-memory implementation of SyncStoreContract.
11
- * Tests can seed data with `setModels()`, inspect calls via `calls`,
12
- * and assert behavior without needing a real sync backend.
9
+ * An in-memory implementation of {@link SyncStoreContract}. Seed rows with
10
+ * {@link MockSyncStore.setModels}, then read and write through the contract
11
+ * methods; every call is recorded on {@link MockSyncStore.calls} so tests can
12
+ * assert on what happened.
13
13
  */
14
14
  export class MockSyncStore {
15
15
  // Seeded data, keyed by model class
@@ -37,7 +37,7 @@ export class MockSyncStore {
37
37
  this.byClass.set(modelClass, map);
38
38
  }
39
39
  /**
40
- * Add a single model (upsert).
40
+ * Adds or replaces a single model, keyed by its id.
41
41
  */
42
42
  addModel(modelClass, model) {
43
43
  let map = this.byClass.get(modelClass);
@@ -110,8 +110,8 @@ export class MockSyncStore {
110
110
  }
111
111
  async save(model) {
112
112
  this.calls.save.push(model);
113
- // Auto-seed on save so findById returns it afterwards
114
- // Consumer passes a concrete class-less object; we store by constructor
113
+ // Store the model under its constructor so a later retrieve or query
114
+ // returns it.
115
115
  const ctor = model.constructor;
116
116
  this.addModel(ctor, model);
117
117
  }
@@ -140,7 +140,7 @@ export class MockSyncStore {
140
140
  pendingChanges: 0,
141
141
  isSessionError: false,
142
142
  };
143
- /** Mock pool for useEntity/useEntities hooks. */
143
+ /** A minimal object pool backing the useEntity and useEntities hooks in tests. */
144
144
  pool = {
145
145
  get: (id) => {
146
146
  for (const models of this.byClass.values()) {
@@ -1,12 +1,10 @@
1
1
  /**
2
- * MockWebSocket Controllable WebSocket for sync engine tests.
3
- *
4
- * Simulates the SyncWebSocket event interface without a real connection.
5
- * Provides methods to inject deltas, simulate disconnection/reconnection,
6
- * and trigger bootstrap hints.
2
+ * A controllable WebSocket stand-in for sync engine tests. It reproduces the
3
+ * event interface of the real connection without opening a socket, so tests
4
+ * can drive connection changes, deltas, and bootstrap hints by hand.
7
5
  */
8
6
  import type { SyncActionType } from '../../types/index.js';
9
- /** Delta shape matching the SyncAction interface */
7
+ /** The shape of a single delta — one change the server pushes to the client. */
10
8
  export interface MockDelta {
11
9
  id: number;
12
10
  modelName: string;
@@ -14,7 +12,10 @@ export interface MockDelta {
14
12
  action: SyncActionType;
15
13
  data: Record<string, unknown>;
16
14
  }
17
- /** Bootstrap hint from server */
15
+ /**
16
+ * A hint from the server that the client has fallen too far behind and should
17
+ * rebuild its data from scratch rather than catch up one delta at a time.
18
+ */
18
19
  export interface MockBootstrapHint {
19
20
  reason: 'too_far_behind' | 'too_many_deltas' | 'missing_entities';
20
21
  tables?: string[];
@@ -22,14 +23,17 @@ export interface MockBootstrapHint {
22
23
  }
23
24
  type EventHandler = (...args: unknown[]) => void;
24
25
  /**
25
- * MockWebSocket provides a controllable event-based interface
26
- * for testing sync engine components that consume WebSocket events.
26
+ * A controllable, event-based stand-in for the sync engine's WebSocket
27
+ * connection. Subscribe with {@link MockWebSocket.on} exactly as production
28
+ * code does, then use the `simulate*` and `receive*` methods to push
29
+ * connection changes, deltas, and bootstrap hints. Every event the mock emits
30
+ * is recorded on {@link MockWebSocket.emittedEvents} for assertions.
27
31
  */
28
32
  export declare class MockWebSocket {
29
33
  private _connected;
30
34
  private _sessionError;
31
35
  private _listeners;
32
- /** Track all emitted events for assertions */
36
+ /** Every event the mock has emitted, in order, for assertions. */
33
37
  readonly emittedEvents: {
34
38
  type: string;
35
39
  data: unknown;
@@ -38,29 +42,29 @@ export declare class MockWebSocket {
38
42
  get sessionError(): boolean;
39
43
  on(event: string, handler: EventHandler): () => void;
40
44
  private emit;
41
- /** Simulate successful connection */
45
+ /** Fires a successful connection, emitting the `connected` event. */
42
46
  simulateConnect(): void;
43
- /** Simulate disconnection */
47
+ /** Drops the connection, emitting the `disconnected` event. */
44
48
  simulateDisconnect(): void;
45
- /** Simulate reconnection attempt */
49
+ /** Emits a `reconnecting` event carrying the attempt number and retry delay. */
46
50
  simulateReconnecting(attempt: number, delay: number): void;
47
- /** Simulate session error (401/403) */
51
+ /** Emits a `session_error` event, as when the server rejects the session as unauthorized. The code defaults to 401. */
48
52
  simulateSessionError(code?: number): void;
49
- /** Simulate reconnection failure (max attempts reached) */
53
+ /** Emits a `reconnect_failed` event, signaling the client gave up after exhausting its retries. */
50
54
  simulateReconnectFailed(): void;
51
- /** Inject a single delta (as if received from server) */
55
+ /** Delivers a single delta, emitting a `delta` event as if the server had sent it. */
52
56
  receiveDelta(delta: MockDelta): void;
53
- /** Inject a batch of deltas */
57
+ /** Delivers a batch of deltas, emitting a `delta_batch` event. */
54
58
  receiveDeltas(deltas: MockDelta[]): void;
55
- /** Inject a bootstrap_required hint from server */
59
+ /** Emits a `bootstrap_required` hint, telling the client to rebuild its data instead of catching up. */
56
60
  simulateBootstrapHint(hint: MockBootstrapHint): void;
57
- /** Inject a presence update */
61
+ /** Emits a `presence_update` event carrying the given payload. */
58
62
  simulatePresenceUpdate(data: Record<string, unknown>): void;
59
- /** Get all events of a specific type */
63
+ /** Returns the payloads of every emitted event of the given type, in order. */
60
64
  getEvents(type: string): unknown[];
61
- /** Check if a specific event was emitted */
65
+ /** Reports whether an event of the given type has been emitted. */
62
66
  hasEmitted(type: string): boolean;
63
- /** Reset all state */
67
+ /** Clears connection state, listeners, and the record of emitted events. */
64
68
  reset(): void;
65
69
  }
66
70
  export {};
@@ -1,19 +1,20 @@
1
1
  /**
2
- * MockWebSocket Controllable WebSocket for sync engine tests.
3
- *
4
- * Simulates the SyncWebSocket event interface without a real connection.
5
- * Provides methods to inject deltas, simulate disconnection/reconnection,
6
- * and trigger bootstrap hints.
2
+ * A controllable WebSocket stand-in for sync engine tests. It reproduces the
3
+ * event interface of the real connection without opening a socket, so tests
4
+ * can drive connection changes, deltas, and bootstrap hints by hand.
7
5
  */
8
6
  /**
9
- * MockWebSocket provides a controllable event-based interface
10
- * for testing sync engine components that consume WebSocket events.
7
+ * A controllable, event-based stand-in for the sync engine's WebSocket
8
+ * connection. Subscribe with {@link MockWebSocket.on} exactly as production
9
+ * code does, then use the `simulate*` and `receive*` methods to push
10
+ * connection changes, deltas, and bootstrap hints. Every event the mock emits
11
+ * is recorded on {@link MockWebSocket.emittedEvents} for assertions.
11
12
  */
12
13
  export class MockWebSocket {
13
14
  _connected = false;
14
15
  _sessionError = false;
15
16
  _listeners = new Map();
16
- /** Track all emitted events for assertions */
17
+ /** Every event the mock has emitted, in order, for assertions. */
17
18
  emittedEvents = [];
18
19
  get connected() {
19
20
  return this._connected;
@@ -22,7 +23,7 @@ export class MockWebSocket {
22
23
  return this._sessionError;
23
24
  }
24
25
  // ─────────────────────────────────────────────
25
- // Event subscription (matches SyncWebSocket API)
26
+ // Event subscription (matches the real connection's API)
26
27
  // ─────────────────────────────────────────────
27
28
  on(event, handler) {
28
29
  if (!this._listeners.has(event)) {
@@ -45,28 +46,28 @@ export class MockWebSocket {
45
46
  // ─────────────────────────────────────────────
46
47
  // Test control: connection lifecycle
47
48
  // ─────────────────────────────────────────────
48
- /** Simulate successful connection */
49
+ /** Fires a successful connection, emitting the `connected` event. */
49
50
  simulateConnect() {
50
51
  this._connected = true;
51
52
  this._sessionError = false;
52
53
  this.emit('connected');
53
54
  }
54
- /** Simulate disconnection */
55
+ /** Drops the connection, emitting the `disconnected` event. */
55
56
  simulateDisconnect() {
56
57
  this._connected = false;
57
58
  this.emit('disconnected');
58
59
  }
59
- /** Simulate reconnection attempt */
60
+ /** Emits a `reconnecting` event carrying the attempt number and retry delay. */
60
61
  simulateReconnecting(attempt, delay) {
61
62
  this.emit('reconnecting', { attempt, delay });
62
63
  }
63
- /** Simulate session error (401/403) */
64
+ /** Emits a `session_error` event, as when the server rejects the session as unauthorized. The code defaults to 401. */
64
65
  simulateSessionError(code = 401) {
65
66
  this._sessionError = true;
66
67
  this._connected = false;
67
68
  this.emit('session_error', { code });
68
69
  }
69
- /** Simulate reconnection failure (max attempts reached) */
70
+ /** Emits a `reconnect_failed` event, signaling the client gave up after exhausting its retries. */
70
71
  simulateReconnectFailed() {
71
72
  this._connected = false;
72
73
  this.emit('reconnect_failed');
@@ -74,40 +75,40 @@ export class MockWebSocket {
74
75
  // ─────────────────────────────────────────────
75
76
  // Test control: delta injection
76
77
  // ─────────────────────────────────────────────
77
- /** Inject a single delta (as if received from server) */
78
+ /** Delivers a single delta, emitting a `delta` event as if the server had sent it. */
78
79
  receiveDelta(delta) {
79
80
  this.emit('delta', delta);
80
81
  }
81
- /** Inject a batch of deltas */
82
+ /** Delivers a batch of deltas, emitting a `delta_batch` event. */
82
83
  receiveDeltas(deltas) {
83
84
  this.emit('delta_batch', deltas);
84
85
  }
85
86
  // ─────────────────────────────────────────────
86
87
  // Test control: bootstrap hints
87
88
  // ─────────────────────────────────────────────
88
- /** Inject a bootstrap_required hint from server */
89
+ /** Emits a `bootstrap_required` hint, telling the client to rebuild its data instead of catching up. */
89
90
  simulateBootstrapHint(hint) {
90
91
  this.emit('bootstrap_required', hint);
91
92
  }
92
93
  // ─────────────────────────────────────────────
93
94
  // Test control: presence
94
95
  // ─────────────────────────────────────────────
95
- /** Inject a presence update */
96
+ /** Emits a `presence_update` event carrying the given payload. */
96
97
  simulatePresenceUpdate(data) {
97
98
  this.emit('presence_update', data);
98
99
  }
99
100
  // ─────────────────────────────────────────────
100
101
  // Assertions
101
102
  // ─────────────────────────────────────────────
102
- /** Get all events of a specific type */
103
+ /** Returns the payloads of every emitted event of the given type, in order. */
103
104
  getEvents(type) {
104
105
  return this.emittedEvents.filter((e) => e.type === type).map((e) => e.data);
105
106
  }
106
- /** Check if a specific event was emitted */
107
+ /** Reports whether an event of the given type has been emitted. */
107
108
  hasEmitted(type) {
108
109
  return this.emittedEvents.some((e) => e.type === type);
109
110
  }
110
- /** Reset all state */
111
+ /** Clears connection state, listeners, and the record of emitted events. */
111
112
  reset() {
112
113
  this._connected = false;
113
114
  this._sessionError = false;