@livestore/common 0.4.0-dev.9 → 0.5.0-dev.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 (580) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +27 -12
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
  5. package/dist/MaterializationJournal.d.ts +44 -0
  6. package/dist/MaterializationJournal.d.ts.map +1 -0
  7. package/dist/MaterializationJournal.js +112 -0
  8. package/dist/MaterializationJournal.js.map +1 -0
  9. package/dist/StateHead.d.ts +26 -0
  10. package/dist/StateHead.d.ts.map +1 -0
  11. package/dist/StateHead.js +50 -0
  12. package/dist/StateHead.js.map +1 -0
  13. package/dist/WorkerTransportError.d.ts +11 -0
  14. package/dist/WorkerTransportError.d.ts.map +1 -0
  15. package/dist/WorkerTransportError.js +11 -0
  16. package/dist/WorkerTransportError.js.map +1 -0
  17. package/dist/__tests__/fixture.d.ts +1 -1
  18. package/dist/__tests__/fixture.d.ts.map +1 -1
  19. package/dist/__tests__/fixture.js +3 -3
  20. package/dist/__tests__/fixture.js.map +1 -1
  21. package/dist/adapter-types.d.ts +59 -57
  22. package/dist/adapter-types.d.ts.map +1 -1
  23. package/dist/adapter-types.js +31 -22
  24. package/dist/adapter-types.js.map +1 -1
  25. package/dist/bounded-collections.d.ts.map +1 -1
  26. package/dist/bounded-collections.js +6 -4
  27. package/dist/bounded-collections.js.map +1 -1
  28. package/dist/debug-info.d.ts +56 -56
  29. package/dist/debug-info.d.ts.map +1 -1
  30. package/dist/debug-info.js +46 -32
  31. package/dist/debug-info.js.map +1 -1
  32. package/dist/defs.d.ts +9 -9
  33. package/dist/defs.js +2 -2
  34. package/dist/devtools/devtools-compatibility.test.d.ts +2 -0
  35. package/dist/devtools/devtools-compatibility.test.d.ts.map +1 -0
  36. package/dist/devtools/devtools-compatibility.test.js +16 -0
  37. package/dist/devtools/devtools-compatibility.test.js.map +1 -0
  38. package/dist/devtools/devtools-messages-client-session.d.ts +531 -312
  39. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  40. package/dist/devtools/devtools-messages-client-session.js +86 -67
  41. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  42. package/dist/devtools/devtools-messages-common.d.ts +32 -35
  43. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  44. package/dist/devtools/devtools-messages-common.js +12 -14
  45. package/dist/devtools/devtools-messages-common.js.map +1 -1
  46. package/dist/devtools/devtools-messages-leader.d.ts +417 -320
  47. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  48. package/dist/devtools/devtools-messages-leader.js +117 -87
  49. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  50. package/dist/devtools/devtools-sessioninfo.d.ts +28 -17
  51. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  52. package/dist/devtools/devtools-sessioninfo.js +12 -6
  53. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  54. package/dist/devtools/mod.d.ts +17 -7
  55. package/dist/devtools/mod.d.ts.map +1 -1
  56. package/dist/devtools/mod.js +19 -8
  57. package/dist/devtools/mod.js.map +1 -1
  58. package/dist/errors.d.ts +52 -46
  59. package/dist/errors.d.ts.map +1 -1
  60. package/dist/errors.js +31 -21
  61. package/dist/errors.js.map +1 -1
  62. package/dist/index.d.ts +7 -1
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +7 -1
  65. package/dist/index.js.map +1 -1
  66. package/dist/leader-thread/LeaderSyncProcessor.d.ts +116 -21
  67. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  68. package/dist/leader-thread/LeaderSyncProcessor.js +596 -470
  69. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  70. package/dist/leader-thread/RejectedPushError.d.ts +138 -0
  71. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
  72. package/dist/leader-thread/RejectedPushError.js +97 -0
  73. package/dist/leader-thread/RejectedPushError.js.map +1 -0
  74. package/dist/leader-thread/connection.d.ts +1 -0
  75. package/dist/leader-thread/connection.d.ts.map +1 -1
  76. package/dist/leader-thread/connection.js +10 -9
  77. package/dist/leader-thread/connection.js.map +1 -1
  78. package/dist/leader-thread/eventlog.d.ts +20 -15
  79. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  80. package/dist/leader-thread/eventlog.js +80 -20
  81. package/dist/leader-thread/eventlog.js.map +1 -1
  82. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
  83. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  84. package/dist/leader-thread/leader-worker-devtools.js +110 -62
  85. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  86. package/dist/leader-thread/make-leader-thread-layer.d.ts +19 -7
  87. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  88. package/dist/leader-thread/make-leader-thread-layer.js +67 -45
  89. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  90. package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
  91. package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
  92. package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
  93. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
  94. package/dist/leader-thread/materialize-event.d.ts +3 -2
  95. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  96. package/dist/leader-thread/materialize-event.js +32 -9
  97. package/dist/leader-thread/materialize-event.js.map +1 -1
  98. package/dist/leader-thread/mod.d.ts +1 -0
  99. package/dist/leader-thread/mod.d.ts.map +1 -1
  100. package/dist/leader-thread/mod.js +1 -0
  101. package/dist/leader-thread/mod.js.map +1 -1
  102. package/dist/leader-thread/recreate-db.d.ts +2 -2
  103. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  104. package/dist/leader-thread/recreate-db.js +19 -40
  105. package/dist/leader-thread/recreate-db.js.map +1 -1
  106. package/dist/leader-thread/shutdown-channel.d.ts +3 -7
  107. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  108. package/dist/leader-thread/shutdown-channel.js +2 -3
  109. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  110. package/dist/leader-thread/stream-events.d.ts +53 -0
  111. package/dist/leader-thread/stream-events.d.ts.map +1 -0
  112. package/dist/leader-thread/stream-events.js +164 -0
  113. package/dist/leader-thread/stream-events.js.map +1 -0
  114. package/dist/leader-thread/types.d.ts +92 -51
  115. package/dist/leader-thread/types.d.ts.map +1 -1
  116. package/dist/leader-thread/types.js +17 -4
  117. package/dist/leader-thread/types.js.map +1 -1
  118. package/dist/logging.d.ts +15 -0
  119. package/dist/logging.d.ts.map +1 -0
  120. package/dist/logging.js +2 -0
  121. package/dist/logging.js.map +1 -0
  122. package/dist/make-client-session.d.ts +6 -5
  123. package/dist/make-client-session.d.ts.map +1 -1
  124. package/dist/make-client-session.js +10 -7
  125. package/dist/make-client-session.js.map +1 -1
  126. package/dist/materializer-helper.d.ts +6 -7
  127. package/dist/materializer-helper.d.ts.map +1 -1
  128. package/dist/materializer-helper.js +22 -40
  129. package/dist/materializer-helper.js.map +1 -1
  130. package/dist/otel.d.ts +4 -4
  131. package/dist/otel.d.ts.map +1 -1
  132. package/dist/otel.js +8 -8
  133. package/dist/otel.js.map +1 -1
  134. package/dist/rematerialize-from-eventlog.d.ts +3 -3
  135. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  136. package/dist/rematerialize-from-eventlog.js +52 -39
  137. package/dist/rematerialize-from-eventlog.js.map +1 -1
  138. package/dist/schema/EventDef/define.d.ts +161 -0
  139. package/dist/schema/EventDef/define.d.ts.map +1 -0
  140. package/dist/schema/EventDef/define.js +140 -0
  141. package/dist/schema/EventDef/define.js.map +1 -0
  142. package/dist/schema/EventDef/define.test.d.ts +2 -0
  143. package/dist/schema/EventDef/define.test.d.ts.map +1 -0
  144. package/dist/schema/EventDef/define.test.js +23 -0
  145. package/dist/schema/EventDef/define.test.js.map +1 -0
  146. package/dist/schema/EventDef/deprecated.d.ts +94 -0
  147. package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
  148. package/dist/schema/EventDef/deprecated.js +143 -0
  149. package/dist/schema/EventDef/deprecated.js.map +1 -0
  150. package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
  151. package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
  152. package/dist/schema/EventDef/deprecated.test.js +95 -0
  153. package/dist/schema/EventDef/deprecated.test.js.map +1 -0
  154. package/dist/schema/EventDef/event-def.d.ts +110 -0
  155. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  156. package/dist/schema/EventDef/event-def.js +2 -0
  157. package/dist/schema/EventDef/event-def.js.map +1 -0
  158. package/dist/schema/EventDef/facts.d.ts +118 -0
  159. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  160. package/dist/schema/EventDef/facts.js +53 -0
  161. package/dist/schema/EventDef/facts.js.map +1 -0
  162. package/dist/schema/EventDef/materializer.d.ts +155 -0
  163. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  164. package/dist/schema/EventDef/materializer.js +83 -0
  165. package/dist/schema/EventDef/materializer.js.map +1 -0
  166. package/dist/schema/EventDef/mod.d.ts +6 -0
  167. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  168. package/dist/schema/EventDef/mod.js +6 -0
  169. package/dist/schema/EventDef/mod.js.map +1 -0
  170. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  171. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  172. package/dist/schema/EventSequenceNumber/client.js +192 -0
  173. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  174. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  175. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  176. package/dist/schema/EventSequenceNumber/global.js +14 -0
  177. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  178. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  179. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  180. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  181. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  182. package/dist/schema/EventSequenceNumber.test.js +44 -44
  183. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  184. package/dist/schema/LiveStoreEvent/client.d.ts +168 -0
  185. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  186. package/dist/schema/LiveStoreEvent/client.js +179 -0
  187. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  188. package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
  189. package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
  190. package/dist/schema/LiveStoreEvent/client.test.js +120 -0
  191. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
  192. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  193. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  194. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  195. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  196. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  197. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  198. package/dist/schema/LiveStoreEvent/global.js +31 -0
  199. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  200. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  201. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  202. package/dist/schema/LiveStoreEvent/input.js +26 -0
  203. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  204. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  205. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  206. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  207. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  208. package/dist/schema/events.d.ts +1 -1
  209. package/dist/schema/events.d.ts.map +1 -1
  210. package/dist/schema/events.js +1 -1
  211. package/dist/schema/events.js.map +1 -1
  212. package/dist/schema/mod.d.ts +7 -4
  213. package/dist/schema/mod.d.ts.map +1 -1
  214. package/dist/schema/mod.js +6 -4
  215. package/dist/schema/mod.js.map +1 -1
  216. package/dist/schema/schema.d.ts +16 -1
  217. package/dist/schema/schema.d.ts.map +1 -1
  218. package/dist/schema/schema.js +34 -5
  219. package/dist/schema/schema.js.map +1 -1
  220. package/dist/schema/state/sqlite/client-document-def.d.ts +14 -18
  221. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  222. package/dist/schema/state/sqlite/client-document-def.js +54 -30
  223. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  224. package/dist/schema/state/sqlite/client-document-def.test.js +146 -6
  225. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  226. package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
  227. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  228. package/dist/schema/state/sqlite/column-annotations.js +13 -15
  229. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  230. package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
  231. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  232. package/dist/schema/state/sqlite/column-def.d.ts +1 -1
  233. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  234. package/dist/schema/state/sqlite/column-def.js +132 -57
  235. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  236. package/dist/schema/state/sqlite/column-def.test.js +155 -70
  237. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  238. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  239. package/dist/schema/state/sqlite/column-spec.js +30 -12
  240. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  241. package/dist/schema/state/sqlite/column-spec.test.js +26 -17
  242. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  243. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -2
  244. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  245. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +15 -6
  246. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  247. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +25 -19
  248. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  249. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +22 -16
  250. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  251. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +28 -17
  252. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  253. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +14 -12
  254. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  255. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +6 -4
  256. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  257. package/dist/schema/state/sqlite/mod.d.ts +3 -5
  258. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  259. package/dist/schema/state/sqlite/mod.js +6 -8
  260. package/dist/schema/state/sqlite/mod.js.map +1 -1
  261. package/dist/schema/state/sqlite/persistence.d.ts +11 -0
  262. package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
  263. package/dist/schema/state/sqlite/persistence.js +10 -0
  264. package/dist/schema/state/sqlite/persistence.js.map +1 -0
  265. package/dist/schema/state/sqlite/query-builder/api.d.ts +58 -29
  266. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  267. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  268. package/dist/schema/state/sqlite/query-builder/astToSql.js +105 -24
  269. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  270. package/dist/schema/state/sqlite/query-builder/impl.d.ts +4 -2
  271. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  272. package/dist/schema/state/sqlite/query-builder/impl.js +42 -27
  273. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  274. package/dist/schema/state/sqlite/query-builder/impl.test.js +402 -498
  275. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  276. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  277. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  278. package/dist/schema/state/sqlite/schema-helpers.js +24 -14
  279. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  280. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  281. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  282. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  283. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  284. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +515 -0
  285. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
  286. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
  287. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
  288. package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
  289. package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
  290. package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
  291. package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
  292. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +678 -0
  293. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
  294. package/dist/schema/state/sqlite/system-tables/state-tables.js +87 -0
  295. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
  296. package/dist/schema/state/sqlite/table-def.d.ts +19 -20
  297. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  298. package/dist/schema/state/sqlite/table-def.js +54 -4
  299. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  300. package/dist/schema/state/sqlite/table-def.test.js +226 -20
  301. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  302. package/dist/schema/unknown-events.d.ts +47 -0
  303. package/dist/schema/unknown-events.d.ts.map +1 -0
  304. package/dist/schema/unknown-events.js +70 -0
  305. package/dist/schema/unknown-events.js.map +1 -0
  306. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
  307. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
  308. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
  309. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
  310. package/dist/schema-management/common.js +2 -2
  311. package/dist/schema-management/common.js.map +1 -1
  312. package/dist/schema-management/migrations.d.ts +32 -2
  313. package/dist/schema-management/migrations.d.ts.map +1 -1
  314. package/dist/schema-management/migrations.js +38 -6
  315. package/dist/schema-management/migrations.js.map +1 -1
  316. package/dist/schema-management/validate-schema.d.ts +3 -3
  317. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  318. package/dist/schema-management/validate-schema.js +2 -2
  319. package/dist/schema-management/validate-schema.js.map +1 -1
  320. package/dist/session-id-symbol.d.ts +29 -0
  321. package/dist/session-id-symbol.d.ts.map +1 -0
  322. package/dist/session-id-symbol.js +44 -0
  323. package/dist/session-id-symbol.js.map +1 -0
  324. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  325. package/dist/sql-queries/sql-queries.js +26 -16
  326. package/dist/sql-queries/sql-queries.js.map +1 -1
  327. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  328. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  329. package/dist/sql-queries/types.d.ts +6 -7
  330. package/dist/sql-queries/types.d.ts.map +1 -1
  331. package/dist/sql-queries/types.js.map +1 -1
  332. package/dist/sqlite-db-helper.d.ts +21 -1
  333. package/dist/sqlite-db-helper.d.ts.map +1 -1
  334. package/dist/sqlite-db-helper.js +40 -5
  335. package/dist/sqlite-db-helper.js.map +1 -1
  336. package/dist/sqlite-types.d.ts +8 -11
  337. package/dist/sqlite-types.d.ts.map +1 -1
  338. package/dist/sqlite-types.js +3 -3
  339. package/dist/sqlite-types.js.map +1 -1
  340. package/dist/sync/ClientSessionSyncProcessor.d.ts +47 -25
  341. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  342. package/dist/sync/ClientSessionSyncProcessor.js +269 -154
  343. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  344. package/dist/sync/errors.d.ts +12 -51
  345. package/dist/sync/errors.d.ts.map +1 -1
  346. package/dist/sync/errors.js +7 -24
  347. package/dist/sync/errors.js.map +1 -1
  348. package/dist/sync/index.d.ts +2 -0
  349. package/dist/sync/index.d.ts.map +1 -1
  350. package/dist/sync/index.js +2 -0
  351. package/dist/sync/index.js.map +1 -1
  352. package/dist/sync/mock-sync-backend.d.ts +11 -10
  353. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  354. package/dist/sync/mock-sync-backend.js +97 -74
  355. package/dist/sync/mock-sync-backend.js.map +1 -1
  356. package/dist/sync/mock-sync-backend.test.d.ts +2 -0
  357. package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
  358. package/dist/sync/mock-sync-backend.test.js +49 -0
  359. package/dist/sync/mock-sync-backend.test.js.map +1 -0
  360. package/dist/sync/next/compact-events.d.ts.map +1 -1
  361. package/dist/sync/next/compact-events.js +11 -12
  362. package/dist/sync/next/compact-events.js.map +1 -1
  363. package/dist/sync/next/facts.d.ts +5 -5
  364. package/dist/sync/next/facts.d.ts.map +1 -1
  365. package/dist/sync/next/facts.js +7 -8
  366. package/dist/sync/next/facts.js.map +1 -1
  367. package/dist/sync/next/history-dag-common.d.ts +58 -15
  368. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  369. package/dist/sync/next/history-dag-common.js +219 -9
  370. package/dist/sync/next/history-dag-common.js.map +1 -1
  371. package/dist/sync/next/history-dag.d.ts.map +1 -1
  372. package/dist/sync/next/history-dag.js +12 -11
  373. package/dist/sync/next/history-dag.js.map +1 -1
  374. package/dist/sync/next/rebase-events.d.ts +5 -5
  375. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  376. package/dist/sync/next/rebase-events.js +6 -6
  377. package/dist/sync/next/rebase-events.js.map +1 -1
  378. package/dist/sync/next/test/compact-events.calculator.test.js +4 -4
  379. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  380. package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
  381. package/dist/sync/next/test/compact-events.test.js +2 -2
  382. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  383. package/dist/sync/next/test/event-fixtures.d.ts +9 -9
  384. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  385. package/dist/sync/next/test/event-fixtures.js +12 -12
  386. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  387. package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
  388. package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
  389. package/dist/sync/next/test/history-dag-common.test.js +73 -0
  390. package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
  391. package/dist/sync/sync-backend-kv.d.ts +3 -3
  392. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  393. package/dist/sync/sync-backend-kv.js +6 -4
  394. package/dist/sync/sync-backend-kv.js.map +1 -1
  395. package/dist/sync/sync-backend.d.ts +41 -21
  396. package/dist/sync/sync-backend.d.ts.map +1 -1
  397. package/dist/sync/sync-backend.js +45 -4
  398. package/dist/sync/sync-backend.js.map +1 -1
  399. package/dist/sync/sync.d.ts +23 -2
  400. package/dist/sync/sync.d.ts.map +1 -1
  401. package/dist/sync/syncstate.d.ts +115 -191
  402. package/dist/sync/syncstate.d.ts.map +1 -1
  403. package/dist/sync/syncstate.js +108 -129
  404. package/dist/sync/syncstate.js.map +1 -1
  405. package/dist/sync/syncstate.test.js +289 -161
  406. package/dist/sync/syncstate.test.js.map +1 -1
  407. package/dist/sync/transport-chunking.d.ts +35 -0
  408. package/dist/sync/transport-chunking.d.ts.map +1 -0
  409. package/dist/sync/transport-chunking.js +47 -0
  410. package/dist/sync/transport-chunking.js.map +1 -0
  411. package/dist/sync/validate-push-payload.d.ts +2 -2
  412. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  413. package/dist/sync/validate-push-payload.js +4 -6
  414. package/dist/sync/validate-push-payload.js.map +1 -1
  415. package/dist/testing/event-factory.d.ts +3 -3
  416. package/dist/testing/event-factory.d.ts.map +1 -1
  417. package/dist/testing/event-factory.js +5 -7
  418. package/dist/testing/event-factory.js.map +1 -1
  419. package/dist/util.d.ts +11 -4
  420. package/dist/util.d.ts.map +1 -1
  421. package/dist/util.js +21 -4
  422. package/dist/util.js.map +1 -1
  423. package/dist/version.d.ts +24 -5
  424. package/dist/version.d.ts.map +1 -1
  425. package/dist/version.js +25 -8
  426. package/dist/version.js.map +1 -1
  427. package/package.json +50 -16
  428. package/src/ClientSessionLeaderThreadProxy.ts +27 -12
  429. package/src/MaterializationJournal.ts +184 -0
  430. package/src/StateHead.ts +80 -0
  431. package/src/WorkerTransportError.ts +12 -0
  432. package/src/__tests__/fixture.ts +3 -3
  433. package/src/adapter-types.ts +62 -56
  434. package/src/bounded-collections.ts +6 -5
  435. package/src/debug-info.ts +54 -43
  436. package/src/defs.ts +2 -2
  437. package/src/devtools/devtools-compatibility.test.ts +19 -0
  438. package/src/devtools/devtools-messages-client-session.ts +72 -63
  439. package/src/devtools/devtools-messages-common.ts +18 -22
  440. package/src/devtools/devtools-messages-leader.ts +89 -68
  441. package/src/devtools/devtools-sessioninfo.ts +17 -12
  442. package/src/devtools/mod.ts +15 -7
  443. package/src/errors.ts +58 -38
  444. package/src/index.ts +11 -1
  445. package/src/leader-thread/LeaderSyncProcessor.ts +927 -674
  446. package/src/leader-thread/RejectedPushError.ts +119 -0
  447. package/src/leader-thread/connection.ts +13 -9
  448. package/src/leader-thread/eventlog.ts +114 -41
  449. package/src/leader-thread/leader-worker-devtools.ts +223 -124
  450. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  451. package/src/leader-thread/make-leader-thread-layer.ts +170 -82
  452. package/src/leader-thread/materialize-event.ts +51 -16
  453. package/src/leader-thread/mod.ts +1 -0
  454. package/src/leader-thread/recreate-db.ts +26 -61
  455. package/src/leader-thread/shutdown-channel.ts +3 -18
  456. package/src/leader-thread/stream-events.ts +209 -0
  457. package/src/leader-thread/types.ts +77 -65
  458. package/src/logging.ts +15 -0
  459. package/src/make-client-session.ts +16 -10
  460. package/src/materializer-helper.ts +31 -49
  461. package/src/otel.ts +15 -13
  462. package/src/rematerialize-from-eventlog.ts +106 -93
  463. package/src/schema/EventDef/define.test.ts +28 -0
  464. package/src/schema/EventDef/define.ts +218 -0
  465. package/src/schema/EventDef/deprecated.test.ts +122 -0
  466. package/src/schema/EventDef/deprecated.ts +172 -0
  467. package/src/schema/EventDef/event-def.ts +123 -0
  468. package/src/schema/EventDef/facts.ts +135 -0
  469. package/src/schema/EventDef/materializer.ts +172 -0
  470. package/src/schema/EventDef/mod.ts +5 -0
  471. package/src/schema/EventSequenceNumber/client.ts +256 -0
  472. package/src/schema/EventSequenceNumber/global.ts +19 -0
  473. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  474. package/src/schema/EventSequenceNumber.test.ts +72 -53
  475. package/src/schema/LiveStoreEvent/client.test.ts +142 -0
  476. package/src/schema/LiveStoreEvent/client.ts +236 -0
  477. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  478. package/src/schema/LiveStoreEvent/global.ts +45 -0
  479. package/src/schema/LiveStoreEvent/input.ts +63 -0
  480. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  481. package/src/schema/events.ts +1 -1
  482. package/src/schema/mod.ts +7 -4
  483. package/src/schema/schema.ts +48 -6
  484. package/src/schema/state/sqlite/client-document-def.test.ts +172 -14
  485. package/src/schema/state/sqlite/client-document-def.ts +126 -98
  486. package/src/schema/state/sqlite/column-annotations.test.ts +27 -45
  487. package/src/schema/state/sqlite/column-annotations.ts +27 -30
  488. package/src/schema/state/sqlite/column-def.test.ts +186 -77
  489. package/src/schema/state/sqlite/column-def.ts +169 -62
  490. package/src/schema/state/sqlite/column-spec.test.ts +34 -19
  491. package/src/schema/state/sqlite/column-spec.ts +38 -11
  492. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +17 -7
  493. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
  494. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +37 -17
  495. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +65 -45
  496. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +48 -40
  497. package/src/schema/state/sqlite/mod.ts +9 -12
  498. package/src/schema/state/sqlite/persistence.ts +11 -0
  499. package/src/schema/state/sqlite/query-builder/api.ts +61 -23
  500. package/src/schema/state/sqlite/query-builder/astToSql.ts +117 -23
  501. package/src/schema/state/sqlite/query-builder/impl.test.ts +489 -551
  502. package/src/schema/state/sqlite/query-builder/impl.ts +43 -26
  503. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  504. package/src/schema/state/sqlite/schema-helpers.ts +30 -22
  505. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  506. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  507. package/src/schema/state/sqlite/system-tables/state-tables.ts +109 -0
  508. package/src/schema/state/sqlite/table-def.test.ts +295 -46
  509. package/src/schema/state/sqlite/table-def.ts +109 -64
  510. package/src/schema/unknown-events.ts +132 -0
  511. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
  512. package/src/schema-management/common.ts +2 -2
  513. package/src/schema-management/migrations.ts +42 -9
  514. package/src/schema-management/validate-schema.ts +3 -3
  515. package/src/session-id-symbol.ts +59 -0
  516. package/src/sql-queries/sql-queries.ts +26 -18
  517. package/src/sql-queries/sql-query-builder.ts +1 -0
  518. package/src/sql-queries/types.ts +6 -7
  519. package/src/sqlite-db-helper.ts +67 -5
  520. package/src/sqlite-types.ts +9 -11
  521. package/src/sync/ClientSessionSyncProcessor.ts +388 -194
  522. package/src/sync/errors.ts +18 -28
  523. package/src/sync/index.ts +2 -0
  524. package/src/sync/mock-sync-backend.test.ts +78 -0
  525. package/src/sync/mock-sync-backend.ts +196 -108
  526. package/src/sync/next/compact-events.ts +10 -11
  527. package/src/sync/next/facts.ts +13 -14
  528. package/src/sync/next/history-dag-common.ts +306 -26
  529. package/src/sync/next/history-dag.ts +20 -13
  530. package/src/sync/next/rebase-events.ts +12 -12
  531. package/src/sync/next/test/compact-events.calculator.test.ts +5 -4
  532. package/src/sync/next/test/compact-events.test.ts +4 -3
  533. package/src/sync/next/test/event-fixtures.ts +14 -14
  534. package/src/sync/next/test/history-dag-common.test.ts +87 -0
  535. package/src/sync/sync-backend-kv.ts +7 -4
  536. package/src/sync/sync-backend.ts +75 -26
  537. package/src/sync/sync.ts +24 -2
  538. package/src/sync/syncstate.test.ts +657 -442
  539. package/src/sync/syncstate.ts +175 -160
  540. package/src/sync/transport-chunking.ts +85 -0
  541. package/src/sync/validate-push-payload.ts +6 -8
  542. package/src/testing/event-factory.ts +10 -12
  543. package/src/util.ts +20 -11
  544. package/src/version.ts +32 -8
  545. package/dist/schema/EventDef.d.ts +0 -126
  546. package/dist/schema/EventDef.d.ts.map +0 -1
  547. package/dist/schema/EventDef.js +0 -46
  548. package/dist/schema/EventDef.js.map +0 -1
  549. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  550. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  551. package/dist/schema/EventSequenceNumber.js +0 -139
  552. package/dist/schema/EventSequenceNumber.js.map +0 -1
  553. package/dist/schema/LiveStoreEvent.d.ts +0 -306
  554. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  555. package/dist/schema/LiveStoreEvent.js +0 -147
  556. package/dist/schema/LiveStoreEvent.js.map +0 -1
  557. package/dist/schema/state/sqlite/system-tables.d.ts +0 -976
  558. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  559. package/dist/schema/state/sqlite/system-tables.js +0 -81
  560. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  561. package/dist/sql-queries/misc.d.ts +0 -2
  562. package/dist/sql-queries/misc.d.ts.map +0 -1
  563. package/dist/sql-queries/misc.js +0 -2
  564. package/dist/sql-queries/misc.js.map +0 -1
  565. package/dist/sync/next/graphology.d.ts +0 -8
  566. package/dist/sync/next/graphology.d.ts.map +0 -1
  567. package/dist/sync/next/graphology.js +0 -30
  568. package/dist/sync/next/graphology.js.map +0 -1
  569. package/dist/sync/next/graphology_.d.ts +0 -3
  570. package/dist/sync/next/graphology_.d.ts.map +0 -1
  571. package/dist/sync/next/graphology_.js +0 -3
  572. package/dist/sync/next/graphology_.js.map +0 -1
  573. package/src/schema/EventDef.ts +0 -222
  574. package/src/schema/EventSequenceNumber.ts +0 -199
  575. package/src/schema/LiveStoreEvent.ts +0 -286
  576. package/src/schema/state/sqlite/system-tables.ts +0 -106
  577. package/src/sql-queries/misc.ts +0 -2
  578. package/src/sync/next/ambient.d.ts +0 -3
  579. package/src/sync/next/graphology.ts +0 -41
  580. package/src/sync/next/graphology_.ts +0 -2
@@ -1,91 +1,128 @@
1
- import { describe, expect, it } from 'vitest';
2
- import * as EventSequenceNumber from "../schema/EventSequenceNumber.js";
3
- import * as LiveStoreEvent from "../schema/LiveStoreEvent.js";
1
+ import { assert, expect } from 'vitest';
2
+ import { Vitest } from '@livestore/utils-dev/node-vitest';
3
+ import { Cause, Effect, Exit, Schema } from '@livestore/utils/effect';
4
+ import * as EventSequenceNumber from "../schema/EventSequenceNumber/mod.js";
5
+ import * as LiveStoreEvent from "../schema/LiveStoreEvent/mod.js";
4
6
  import * as SyncState from "./syncstate.js";
5
- class TestEvent extends LiveStoreEvent.EncodedWithMeta {
6
- payload;
7
- isClient;
8
- constructor(seqNum, parentSeqNum, payload, isClient) {
9
- super({
10
- seqNum: EventSequenceNumber.make(seqNum),
11
- parentSeqNum: EventSequenceNumber.make(parentSeqNum),
12
- name: 'a',
13
- args: payload,
14
- clientId: 'static-local-id',
15
- sessionId: 'static-session-id',
16
- });
17
- this.payload = payload;
18
- this.isClient = isClient;
19
- }
20
- rebase_ = (parentSeqNum, rebaseGeneration) => {
21
- return this.rebase({ parentSeqNum, isClient: this.isClient, rebaseGeneration });
22
- };
23
- }
24
- const e0_1 = new TestEvent({ global: 0, client: 1 }, EventSequenceNumber.ROOT, 'a', true);
25
- const e1_0 = new TestEvent({ global: 1, client: 0 }, EventSequenceNumber.ROOT, 'a', false);
26
- const e1_1 = new TestEvent({ global: 1, client: 1 }, e1_0.seqNum, 'a', true);
27
- const e1_2 = new TestEvent({ global: 1, client: 2 }, e1_1.seqNum, 'a', true);
28
- const e1_3 = new TestEvent({ global: 1, client: 3 }, e1_2.seqNum, 'a', true);
29
- const e2_0 = new TestEvent({ global: 2, client: 0 }, e1_0.seqNum, 'a', false);
30
- const e2_1 = new TestEvent({ global: 2, client: 1 }, e2_0.seqNum, 'a', true);
31
- const isEqualEvent = LiveStoreEvent.isEqualEncoded;
32
- const isClientEvent = (event) => event.isClient;
33
- describe('syncstate', () => {
34
- describe('merge', () => {
35
- const merge = ({ syncState, payload, ignoreClientEvents = false, }) => SyncState.merge({ syncState, payload, isClientEvent, isEqualEvent, ignoreClientEvents });
36
- describe('upstream-rebase', () => {
37
- it('should rollback until start', () => {
7
+ /** Module-scoped JSON codecs; keeping the sync codecs out of Effect generators avoids `schemaSyncInEffect`. */
8
+ const jsonStringify = Schema.encodeSync(Schema.fromJsonString(Schema.Unknown));
9
+ const jsonParse = Schema.decodeUnknownSync(Schema.fromJsonString(Schema.Unknown));
10
+ const makeTestEvent = ({ seqNum, parentSeqNum, payload, isClientOnly, }) => new LiveStoreEvent.Client.EncodedWithMeta({
11
+ seqNum: EventSequenceNumber.Client.Composite.make(seqNum),
12
+ parentSeqNum: EventSequenceNumber.Client.Composite.make(parentSeqNum),
13
+ name: 'a',
14
+ // Effect v4 normalizes nested Schema.Class values to their declared schema fields.
15
+ // Keep this test-only flag inside `args`, which is part of EncodedWithMeta,
16
+ // instead of relying on subclass fields that are stripped during parsing.
17
+ args: { payload, isClientOnly },
18
+ clientId: 'static-local-id',
19
+ sessionId: 'static-session-id',
20
+ });
21
+ const e0_1 = makeTestEvent({
22
+ seqNum: { global: 0, client: 1 },
23
+ parentSeqNum: EventSequenceNumber.Client.ROOT,
24
+ payload: 'a',
25
+ isClientOnly: true,
26
+ });
27
+ const e1_0 = makeTestEvent({
28
+ seqNum: { global: 1, client: 0 },
29
+ parentSeqNum: EventSequenceNumber.Client.ROOT,
30
+ payload: 'a',
31
+ isClientOnly: false,
32
+ });
33
+ const e1_1 = makeTestEvent({
34
+ seqNum: { global: 1, client: 1 },
35
+ parentSeqNum: e1_0.seqNum,
36
+ payload: 'a',
37
+ isClientOnly: true,
38
+ });
39
+ const e1_2 = makeTestEvent({
40
+ seqNum: { global: 1, client: 2 },
41
+ parentSeqNum: e1_1.seqNum,
42
+ payload: 'a',
43
+ isClientOnly: true,
44
+ });
45
+ const e1_3 = makeTestEvent({
46
+ seqNum: { global: 1, client: 3 },
47
+ parentSeqNum: e1_2.seqNum,
48
+ payload: 'a',
49
+ isClientOnly: true,
50
+ });
51
+ const e2_0 = makeTestEvent({
52
+ seqNum: { global: 2, client: 0 },
53
+ parentSeqNum: e1_0.seqNum,
54
+ payload: 'a',
55
+ isClientOnly: false,
56
+ });
57
+ const e2_1 = makeTestEvent({
58
+ seqNum: { global: 2, client: 1 },
59
+ parentSeqNum: e2_0.seqNum,
60
+ payload: 'a',
61
+ isClientOnly: true,
62
+ });
63
+ const isEqualEvent = LiveStoreEvent.Client.isEqualEncoded;
64
+ const isClientOnlyEvent = (event) => typeof event.args === 'object' &&
65
+ event.args !== null &&
66
+ 'isClientOnly' in event.args &&
67
+ event.args.isClientOnly === true;
68
+ const rebaseTestEvent = ({ event, parentSeqNum, rebaseGeneration, }) => event.rebase({ parentSeqNum, isClientOnly: isClientOnlyEvent(event), rebaseGeneration });
69
+ /** Verifies: LS.SYS.SYNC.SS-R01, LS.SYS.SYNC.SS-R02, LS.SYS.SYNC.SS-R03, LS.SYS.SYNC.SS-R05, LS.SYS.SYNC.SS-R06 */
70
+ Vitest.describe('syncstate', () => {
71
+ Vitest.describe('merge', () => {
72
+ const merge = ({ syncState, payload, ignoreClientOnlyEvents = false, }) => SyncState.merge({ syncState, payload, isClientOnlyEvent, isEqualEvent, ignoreClientOnlyEvents });
73
+ Vitest.describe('upstream-rebase', () => {
74
+ Vitest.it.effect('should rollback until start', () => Effect.gen(function* () {
38
75
  const syncState = new SyncState.SyncState({
39
76
  pending: [e2_0],
40
- upstreamHead: EventSequenceNumber.ROOT,
77
+ upstreamHead: EventSequenceNumber.Client.ROOT,
41
78
  localHead: e2_0.seqNum,
42
79
  });
43
- const e1_0_e2_0 = e1_0.rebase_(e2_0.seqNum, 0);
44
- const e1_1_e2_1 = e1_1.rebase_(e1_0_e2_0.seqNum, 0);
45
- const result = merge({
80
+ const e1_0_e2_0 = rebaseTestEvent({ event: e1_0, parentSeqNum: e2_0.seqNum, rebaseGeneration: 0 });
81
+ const e1_1_e2_1 = rebaseTestEvent({ event: e1_1, parentSeqNum: e1_0_e2_0.seqNum, rebaseGeneration: 0 });
82
+ const result = yield* merge({
46
83
  syncState,
47
84
  payload: SyncState.PayloadUpstreamRebase.make({
48
85
  rollbackEvents: [e1_0, e1_1],
49
86
  newEvents: [e1_0_e2_0, e1_1_e2_1],
50
87
  }),
51
88
  });
52
- const e2_0_e3_0 = e2_0.rebase_(e1_0_e2_0.seqNum, 1);
89
+ const e2_0_e3_0 = rebaseTestEvent({ event: e2_0, parentSeqNum: e1_0_e2_0.seqNum, rebaseGeneration: 1 });
53
90
  expectRebase(result);
54
91
  expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0]);
55
92
  expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_1.seqNum);
56
93
  expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.seqNum);
57
94
  expectEventArraysEqual(result.newEvents, [e1_0_e2_0, e1_1_e2_1, e2_0_e3_0]);
58
95
  expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1, e2_0]);
59
- });
60
- it('should rollback only to specified point', () => {
96
+ }));
97
+ Vitest.it.effect('should rollback only to specified point', () => Effect.gen(function* () {
61
98
  const syncState = new SyncState.SyncState({
62
99
  pending: [e2_0],
63
- upstreamHead: EventSequenceNumber.ROOT,
100
+ upstreamHead: EventSequenceNumber.Client.ROOT,
64
101
  localHead: e2_0.seqNum,
65
102
  });
66
- const e1_1_e2_0 = e1_1.rebase_(e1_0.seqNum, 0);
67
- const result = merge({
103
+ const e1_1_e2_0 = rebaseTestEvent({ event: e1_1, parentSeqNum: e1_0.seqNum, rebaseGeneration: 0 });
104
+ const result = yield* merge({
68
105
  syncState,
69
106
  payload: SyncState.PayloadUpstreamRebase.make({
70
107
  newEvents: [e1_1_e2_0],
71
108
  rollbackEvents: [e1_1],
72
109
  }),
73
110
  });
74
- const e2_0_e3_0 = e2_0.rebase_(e1_1_e2_0.seqNum, 1);
111
+ const e2_0_e3_0 = rebaseTestEvent({ event: e2_0, parentSeqNum: e1_1_e2_0.seqNum, rebaseGeneration: 1 });
75
112
  expectRebase(result);
76
113
  expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0]);
77
114
  expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_0.seqNum);
78
115
  expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.seqNum);
79
116
  expectEventArraysEqual(result.newEvents, [e1_1_e2_0, e2_0_e3_0]);
80
117
  expectEventArraysEqual(result.rollbackEvents, [e1_1, e2_0]);
81
- });
82
- it('should work for empty pending', () => {
118
+ }));
119
+ Vitest.it.effect('should work for empty pending', () => Effect.gen(function* () {
83
120
  const syncState = new SyncState.SyncState({
84
121
  pending: [],
85
- upstreamHead: EventSequenceNumber.ROOT,
122
+ upstreamHead: EventSequenceNumber.Client.ROOT,
86
123
  localHead: e1_0.seqNum,
87
124
  });
88
- const result = merge({
125
+ const result = yield* merge({
89
126
  syncState,
90
127
  payload: SyncState.PayloadUpstreamRebase.make({ rollbackEvents: [e1_0], newEvents: [e2_0] }),
91
128
  });
@@ -93,95 +130,102 @@ describe('syncstate', () => {
93
130
  expectEventArraysEqual(result.newSyncState.pending, []);
94
131
  expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
95
132
  expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
96
- expect(result.newEvents).toStrictEqual([e2_0]);
97
- });
133
+ expectEventArraysEqual(result.newEvents, [e2_0]);
134
+ }));
98
135
  });
99
- describe('upstream-advance: advance', () => {
100
- it('should throw error if newEvents are not sorted in ascending order by event number (client)', () => {
136
+ Vitest.describe('upstream-advance: advance', () => {
137
+ Vitest.it.effect('should die if newEvents are not sorted in ascending order by event number (client)', () => Effect.gen(function* () {
101
138
  const syncState = new SyncState.SyncState({
102
139
  pending: [e1_0],
103
- upstreamHead: EventSequenceNumber.ROOT,
140
+ upstreamHead: EventSequenceNumber.Client.ROOT,
104
141
  localHead: e1_0.seqNum,
105
142
  });
106
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_0] } });
107
- expect(result).toMatchObject({ _tag: 'unexpected-error' });
108
- });
109
- it('should throw error if newEvents are not sorted in ascending order by event number (global)', () => {
143
+ const exit = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_0] } }).pipe(Effect.exit);
144
+ assert(Exit.isFailure(exit));
145
+ expect(Cause.hasDies(exit.cause)).toBe(true);
146
+ }));
147
+ Vitest.it.effect('should die if newEvents are not sorted in ascending order by event number (global)', () => Effect.gen(function* () {
110
148
  const syncState = new SyncState.SyncState({
111
149
  pending: [e1_0],
112
- upstreamHead: EventSequenceNumber.ROOT,
150
+ upstreamHead: EventSequenceNumber.Client.ROOT,
113
151
  localHead: e1_0.seqNum,
114
152
  });
115
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0, e1_0] } });
116
- expect(result).toMatchObject({ _tag: 'unexpected-error' });
117
- });
118
- it('should throw error if incoming event is < expected upstream head', () => {
153
+ const exit = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0, e1_0] } }).pipe(Effect.exit);
154
+ assert(Exit.isFailure(exit));
155
+ expect(Cause.hasDies(exit.cause)).toBe(true);
156
+ }));
157
+ Vitest.it.effect('should die if incoming event is < expected upstream head', () => Effect.gen(function* () {
119
158
  const syncState = new SyncState.SyncState({
120
159
  pending: [],
121
160
  upstreamHead: e2_0.seqNum,
122
161
  localHead: e2_0.seqNum,
123
162
  });
124
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
125
- expect(result).toMatchObject({ _tag: 'unexpected-error' });
126
- });
127
- it('should throw error if incoming event is = expected upstream head', () => {
163
+ const exit = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } }).pipe(Effect.exit);
164
+ assert(Exit.isFailure(exit));
165
+ expect(Cause.hasDies(exit.cause)).toBe(true);
166
+ }));
167
+ Vitest.it.effect('should die if incoming event is = expected upstream head', () => Effect.gen(function* () {
128
168
  const syncState = new SyncState.SyncState({
129
169
  pending: [],
130
170
  upstreamHead: e2_0.seqNum,
131
171
  localHead: e2_0.seqNum,
132
172
  });
133
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0] } });
134
- expect(result).toMatchObject({ _tag: 'unexpected-error' });
135
- });
136
- it('should confirm pending event when receiving matching event', () => {
173
+ const exit = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0] } }).pipe(Effect.exit);
174
+ assert(Exit.isFailure(exit));
175
+ expect(Cause.hasDies(exit.cause)).toBe(true);
176
+ }));
177
+ Vitest.it.effect('should confirm pending event when receiving matching event', () => Effect.gen(function* () {
137
178
  const syncState = new SyncState.SyncState({
138
179
  pending: [e1_0],
139
- upstreamHead: EventSequenceNumber.ROOT,
180
+ upstreamHead: EventSequenceNumber.Client.ROOT,
140
181
  localHead: e1_0.seqNum,
141
182
  });
142
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
183
+ const result = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
143
184
  expectAdvance(result);
144
185
  expectEventArraysEqual(result.newSyncState.pending, []);
145
186
  expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum);
146
187
  expect(result.newSyncState.localHead).toMatchObject(e1_0.seqNum);
147
188
  expectEventArraysEqual(result.newEvents, []);
148
189
  expectEventArraysEqual(result.confirmedEvents, [e1_0]);
149
- });
150
- it('should confirm partial pending event when receiving matching event', () => {
190
+ }));
191
+ Vitest.it.effect('should confirm partial pending event when receiving matching event', () => Effect.gen(function* () {
151
192
  const syncState = new SyncState.SyncState({
152
193
  pending: [e1_0, e2_0],
153
- upstreamHead: EventSequenceNumber.ROOT,
194
+ upstreamHead: EventSequenceNumber.Client.ROOT,
154
195
  localHead: e2_0.seqNum,
155
196
  });
156
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
197
+ const result = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
157
198
  expectAdvance(result);
158
199
  expectEventArraysEqual(result.newSyncState.pending, [e2_0]);
159
200
  expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum);
160
201
  expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
161
202
  expectEventArraysEqual(result.newEvents, []);
162
203
  expectEventArraysEqual(result.confirmedEvents, [e1_0]);
163
- });
164
- it('should confirm pending event and add new event', () => {
204
+ }));
205
+ Vitest.it.effect('should confirm pending event and add new event', () => Effect.gen(function* () {
165
206
  const syncState = new SyncState.SyncState({
166
207
  pending: [e1_0],
167
- upstreamHead: EventSequenceNumber.ROOT,
208
+ upstreamHead: EventSequenceNumber.Client.ROOT,
168
209
  localHead: e1_0.seqNum,
169
210
  });
170
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0, e1_1] } });
211
+ const result = yield* merge({
212
+ syncState,
213
+ payload: { _tag: 'upstream-advance', newEvents: [e1_0, e1_1] },
214
+ });
171
215
  expectAdvance(result);
172
216
  expectEventArraysEqual(result.newSyncState.pending, []);
173
217
  expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.seqNum);
174
218
  expect(result.newSyncState.localHead).toMatchObject(e1_1.seqNum);
175
- expect(result.newEvents).toStrictEqual([e1_1]);
219
+ expectEventArraysEqual(result.newEvents, [e1_1]);
176
220
  expectEventArraysEqual(result.confirmedEvents, [e1_0]);
177
- });
178
- it('should confirm pending event and add multiple new events', () => {
221
+ }));
222
+ Vitest.it.effect('should confirm pending event and add multiple new events', () => Effect.gen(function* () {
179
223
  const syncState = new SyncState.SyncState({
180
224
  pending: [e1_1],
181
225
  upstreamHead: e1_0.seqNum,
182
226
  localHead: e1_1.seqNum,
183
227
  });
184
- const result = merge({
228
+ const result = yield* merge({
185
229
  syncState,
186
230
  payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_2, e1_3, e2_0, e2_1] },
187
231
  });
@@ -189,16 +233,16 @@ describe('syncstate', () => {
189
233
  expectEventArraysEqual(result.newSyncState.pending, []);
190
234
  expect(result.newSyncState.upstreamHead).toMatchObject(e2_1.seqNum);
191
235
  expect(result.newSyncState.localHead).toMatchObject(e2_1.seqNum);
192
- expect(result.newEvents).toStrictEqual([e1_2, e1_3, e2_0, e2_1]);
236
+ expectEventArraysEqual(result.newEvents, [e1_2, e1_3, e2_0, e2_1]);
193
237
  expectEventArraysEqual(result.confirmedEvents, [e1_1]);
194
- });
195
- it('should confirm pending global event while keep pending client events', () => {
238
+ }));
239
+ Vitest.it.effect('should confirm pending global event while keep pending client events', () => Effect.gen(function* () {
196
240
  const syncState = new SyncState.SyncState({
197
241
  pending: [e1_0, e1_1],
198
- upstreamHead: EventSequenceNumber.ROOT,
242
+ upstreamHead: EventSequenceNumber.Client.ROOT,
199
243
  localHead: e1_1.seqNum,
200
244
  });
201
- const result = merge({
245
+ const result = yield* merge({
202
246
  syncState,
203
247
  payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
204
248
  });
@@ -208,17 +252,17 @@ describe('syncstate', () => {
208
252
  expect(result.newSyncState.localHead).toMatchObject(e1_1.seqNum);
209
253
  expectEventArraysEqual(result.newEvents, []);
210
254
  expectEventArraysEqual(result.confirmedEvents, [e1_0]);
211
- });
212
- it('should ignore client events (incoming is subset of pending)', () => {
255
+ }));
256
+ Vitest.it.effect('should ignore client events (incoming is subset of pending)', () => Effect.gen(function* () {
213
257
  const syncState = new SyncState.SyncState({
214
258
  pending: [e0_1, e1_0],
215
- upstreamHead: EventSequenceNumber.ROOT,
259
+ upstreamHead: EventSequenceNumber.Client.ROOT,
216
260
  localHead: e1_0.seqNum,
217
261
  });
218
- const result = merge({
262
+ const result = yield* merge({
219
263
  syncState,
220
264
  payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
221
- ignoreClientEvents: true,
265
+ ignoreClientOnlyEvents: true,
222
266
  });
223
267
  expectAdvance(result);
224
268
  expectEventArraysEqual(result.newSyncState.pending, []);
@@ -226,17 +270,17 @@ describe('syncstate', () => {
226
270
  expect(result.newSyncState.localHead).toMatchObject(e1_0.seqNum);
227
271
  expectEventArraysEqual(result.newEvents, []);
228
272
  expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0]);
229
- });
230
- it('should ignore client events (incoming is subset of pending case 2)', () => {
273
+ }));
274
+ Vitest.it.effect('should ignore client events (incoming is subset of pending case 2)', () => Effect.gen(function* () {
231
275
  const syncState = new SyncState.SyncState({
232
276
  pending: [e0_1, e1_0, e2_0],
233
- upstreamHead: EventSequenceNumber.ROOT,
277
+ upstreamHead: EventSequenceNumber.Client.ROOT,
234
278
  localHead: e1_0.seqNum,
235
279
  });
236
- const result = merge({
280
+ const result = yield* merge({
237
281
  syncState,
238
282
  payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
239
- ignoreClientEvents: true,
283
+ ignoreClientOnlyEvents: true,
240
284
  });
241
285
  expectAdvance(result);
242
286
  expectEventArraysEqual(result.newSyncState.pending, [e2_0]);
@@ -244,154 +288,238 @@ describe('syncstate', () => {
244
288
  expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
245
289
  expectEventArraysEqual(result.newEvents, []);
246
290
  expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0]);
247
- });
248
- it('should ignore client events (incoming goes beyond pending)', () => {
291
+ }));
292
+ Vitest.it.effect('should ignore client events (incoming goes beyond pending)', () => Effect.gen(function* () {
249
293
  const syncState = new SyncState.SyncState({
250
294
  pending: [e0_1, e1_0, e1_1],
251
- upstreamHead: EventSequenceNumber.ROOT,
295
+ upstreamHead: EventSequenceNumber.Client.ROOT,
252
296
  localHead: e1_1.seqNum,
253
297
  });
254
- const result = merge({
298
+ const result = yield* merge({
255
299
  syncState,
256
300
  payload: { _tag: 'upstream-advance', newEvents: [e1_0, e2_0] },
257
- ignoreClientEvents: true,
301
+ ignoreClientOnlyEvents: true,
258
302
  });
259
303
  expectAdvance(result);
260
304
  expectEventArraysEqual(result.newSyncState.pending, []);
261
305
  expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
262
306
  expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
263
- expect(result.newEvents).toStrictEqual([e2_0]);
307
+ expectEventArraysEqual(result.newEvents, [e2_0]);
264
308
  expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0, e1_1]);
265
- });
266
- it('should fail if incoming event is ≤ local head', () => {
309
+ }));
310
+ Vitest.it.effect('should die if incoming event is ≤ local head', () => Effect.gen(function* () {
267
311
  const syncState = new SyncState.SyncState({
268
312
  pending: [],
269
313
  upstreamHead: e2_0.seqNum,
270
314
  localHead: e2_0.seqNum,
271
315
  });
272
- const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
273
- expect(result).toMatchObject({ _tag: 'unexpected-error' });
274
- });
316
+ const exit = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } }).pipe(Effect.exit);
317
+ assert(Exit.isFailure(exit));
318
+ expect(Cause.hasDies(exit.cause)).toBe(true);
319
+ }));
320
+ Vitest.it.effect('should advance (not rebase) when pending event has undefined-valued key dropped by JSON wire round-trip', () => Effect.gen(function* () {
321
+ const argsSchema = Schema.Struct({
322
+ id: Schema.String,
323
+ flag: Schema.optional(Schema.Boolean),
324
+ });
325
+ const localArgs = yield* Schema.encodeUnknownEffect(argsSchema)({ id: 'abc' }).pipe(Effect.orDie);
326
+ const wireArgs = jsonParse(jsonStringify(localArgs));
327
+ const localPending = new LiveStoreEvent.Client.EncodedWithMeta({
328
+ seqNum: e1_0.seqNum,
329
+ parentSeqNum: e1_0.parentSeqNum,
330
+ name: e1_0.name,
331
+ args: localArgs,
332
+ clientId: e1_0.clientId,
333
+ sessionId: e1_0.sessionId,
334
+ });
335
+ const fromUpstream = new LiveStoreEvent.Client.EncodedWithMeta({
336
+ seqNum: e1_0.seqNum,
337
+ parentSeqNum: e1_0.parentSeqNum,
338
+ name: e1_0.name,
339
+ args: wireArgs,
340
+ clientId: e1_0.clientId,
341
+ sessionId: e1_0.sessionId,
342
+ });
343
+ const syncState = new SyncState.SyncState({
344
+ pending: [localPending],
345
+ upstreamHead: EventSequenceNumber.Client.ROOT,
346
+ localHead: localPending.seqNum,
347
+ });
348
+ const result = yield* merge({
349
+ syncState,
350
+ payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [fromUpstream] }),
351
+ });
352
+ expectAdvance(result);
353
+ expect(result.confirmedEvents).toHaveLength(1);
354
+ expect(result.newSyncState.pending).toHaveLength(0);
355
+ }));
275
356
  });
276
- describe('upstream-advance: rebase', () => {
277
- it('should rebase single client event to end', () => {
357
+ Vitest.describe('upstream-advance: rebase', () => {
358
+ Vitest.it.effect('should rebase single client event to end', () => Effect.gen(function* () {
278
359
  const syncState = new SyncState.SyncState({
279
360
  pending: [e1_0],
280
- upstreamHead: EventSequenceNumber.ROOT,
361
+ upstreamHead: EventSequenceNumber.Client.ROOT,
281
362
  localHead: e1_0.seqNum,
282
363
  });
283
- const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1] }) });
284
- const e1_0_e1_2 = e1_0.rebase_(e1_1.seqNum, 1);
364
+ const result = yield* merge({
365
+ syncState,
366
+ payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1] }),
367
+ });
368
+ const e1_0_e1_2 = rebaseTestEvent({ event: e1_0, parentSeqNum: e1_1.seqNum, rebaseGeneration: 1 });
285
369
  expectRebase(result);
286
370
  expectEventArraysEqual(result.newSyncState.pending, [e1_0_e1_2]);
287
371
  expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.seqNum);
288
372
  expect(result.newSyncState.localHead).toMatchObject(e1_0_e1_2.seqNum);
289
373
  expectEventArraysEqual(result.rollbackEvents, [e1_0]);
290
374
  expectEventArraysEqual(result.newEvents, [e1_1, e1_0_e1_2]);
291
- });
292
- it('should rebase different event with same id', () => {
293
- const e2_0_b = new TestEvent({ global: 1, client: 0 }, e1_0.seqNum, '1_0_b', false);
375
+ }));
376
+ Vitest.it.effect('should rebase different event with same id', () => Effect.gen(function* () {
377
+ const e2_0_b = makeTestEvent({
378
+ seqNum: { global: 1, client: 0 },
379
+ parentSeqNum: e1_0.seqNum,
380
+ payload: '1_0_b',
381
+ isClientOnly: false,
382
+ });
294
383
  const syncState = new SyncState.SyncState({
295
384
  pending: [e2_0_b],
296
- upstreamHead: EventSequenceNumber.ROOT,
385
+ upstreamHead: EventSequenceNumber.Client.ROOT,
297
386
  localHead: e2_0_b.seqNum,
298
387
  });
299
- const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e2_0] }) });
300
- const e2_0_e3_0 = e2_0_b.rebase_(e2_0.seqNum, 1);
388
+ const result = yield* merge({
389
+ syncState,
390
+ payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e2_0] }),
391
+ });
392
+ const e2_0_e3_0 = rebaseTestEvent({ event: e2_0_b, parentSeqNum: e2_0.seqNum, rebaseGeneration: 1 });
301
393
  expectRebase(result);
302
394
  expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0]);
303
395
  expectEventArraysEqual(result.newEvents, [e2_0, e2_0_e3_0]);
304
396
  expectEventArraysEqual(result.rollbackEvents, [e2_0_b]);
305
397
  expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
306
398
  expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.seqNum);
307
- });
308
- it('should rebase single client event to end (more incoming events)', () => {
399
+ }));
400
+ Vitest.it.effect('should rebase single client event to end (more incoming events)', () => Effect.gen(function* () {
309
401
  const syncState = new SyncState.SyncState({
310
402
  pending: [e1_0],
311
- upstreamHead: EventSequenceNumber.ROOT,
403
+ upstreamHead: EventSequenceNumber.Client.ROOT,
312
404
  localHead: e1_0.seqNum,
313
405
  });
314
- const result = merge({
406
+ const result = yield* merge({
315
407
  syncState,
316
408
  payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
317
409
  });
318
- const e1_0_e3_0 = e1_0.rebase_(e2_0.seqNum, 1);
410
+ const e1_0_e3_0 = rebaseTestEvent({ event: e1_0, parentSeqNum: e2_0.seqNum, rebaseGeneration: 1 });
319
411
  expectRebase(result);
320
412
  expectEventArraysEqual(result.newSyncState.pending, [e1_0_e3_0]);
321
413
  expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
322
414
  expect(result.newSyncState.localHead).toMatchObject(e1_0_e3_0.seqNum);
323
- });
324
- it('should only rebase divergent events when first event matches', () => {
415
+ }));
416
+ Vitest.it.effect('should only rebase divergent events when first event matches', () => Effect.gen(function* () {
325
417
  const syncState = new SyncState.SyncState({
326
418
  pending: [e1_0, e1_1],
327
- upstreamHead: EventSequenceNumber.ROOT,
419
+ upstreamHead: EventSequenceNumber.Client.ROOT,
328
420
  localHead: e1_0.seqNum,
329
421
  });
330
- const result = merge({
422
+ const result = yield* merge({
331
423
  syncState,
332
424
  payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_0, e1_2, e1_3, e2_0] }),
333
425
  });
334
- const e1_1_e2_1 = e1_1.rebase_(e2_0.seqNum, 1);
426
+ const e1_1_e2_1 = rebaseTestEvent({ event: e1_1, parentSeqNum: e2_0.seqNum, rebaseGeneration: 1 });
335
427
  expectRebase(result);
336
428
  expectEventArraysEqual(result.newSyncState.pending, [e1_1_e2_1]);
337
429
  expectEventArraysEqual(result.rollbackEvents, [e1_1]);
338
430
  expectEventArraysEqual(result.newEvents, [e1_2, e1_3, e2_0, e1_1_e2_1]);
339
431
  expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
340
432
  expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_1.seqNum);
341
- });
342
- it('should rebase all client events when incoming chain starts differently', () => {
433
+ }));
434
+ Vitest.it.effect('should rebase all client events when incoming chain starts differently', () => Effect.gen(function* () {
343
435
  const syncState = new SyncState.SyncState({
344
436
  pending: [e1_0, e1_1],
345
- upstreamHead: EventSequenceNumber.ROOT,
437
+ upstreamHead: EventSequenceNumber.Client.ROOT,
346
438
  localHead: e1_1.seqNum,
347
439
  });
348
- const result = merge({
440
+ const result = yield* merge({
349
441
  syncState,
350
442
  payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
351
443
  });
352
- const e1_0_e2_1 = e1_0.rebase_(e2_0.seqNum, 1);
353
- const e1_1_e2_2 = e1_1.rebase_(e1_0_e2_1.seqNum, 1);
444
+ const e1_0_e2_1 = rebaseTestEvent({ event: e1_0, parentSeqNum: e2_0.seqNum, rebaseGeneration: 1 });
445
+ const e1_1_e2_2 = rebaseTestEvent({ event: e1_1, parentSeqNum: e1_0_e2_1.seqNum, rebaseGeneration: 1 });
354
446
  expectRebase(result);
355
447
  expectEventArraysEqual(result.newSyncState.pending, [e1_0_e2_1, e1_1_e2_2]);
356
448
  expectEventArraysEqual(result.newEvents, [e1_1, e1_2, e1_3, e2_0, e1_0_e2_1, e1_1_e2_2]);
357
449
  expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1]);
358
450
  expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
359
451
  expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_2.seqNum);
360
- });
361
- describe('local-push', () => {
362
- describe('advance', () => {
363
- it('should advance with new events', () => {
452
+ }));
453
+ Vitest.describe('local-push', () => {
454
+ Vitest.describe('advance', () => {
455
+ Vitest.it.effect('should advance with new events', () => Effect.gen(function* () {
364
456
  const syncState = new SyncState.SyncState({
365
457
  pending: [e1_0],
366
- upstreamHead: EventSequenceNumber.ROOT,
458
+ upstreamHead: EventSequenceNumber.Client.ROOT,
367
459
  localHead: e1_0.seqNum,
368
460
  });
369
- const result = merge({
461
+ const result = yield* merge({
370
462
  syncState,
371
463
  payload: SyncState.PayloadLocalPush.make({ newEvents: [e1_1, e1_2, e1_3] }),
372
464
  });
373
465
  expectAdvance(result);
374
466
  expectEventArraysEqual(result.newSyncState.pending, [e1_0, e1_1, e1_2, e1_3]);
375
- expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.ROOT);
467
+ expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.Client.ROOT);
376
468
  expect(result.newSyncState.localHead).toMatchObject(e1_3.seqNum);
377
469
  expectEventArraysEqual(result.newEvents, [e1_1, e1_2, e1_3]);
378
470
  expectEventArraysEqual(result.confirmedEvents, []);
379
- });
380
- });
381
- describe('reject', () => {
382
- it('should reject when new events are greater than pending events', () => {
471
+ }));
472
+ // Leaders can choose to ignore client-only events while still returning them for broadcast.
473
+ // Ensure pending/local head only reflects events that must be pushed upstream.
474
+ Vitest.it.effect('keeps pending empty when pushing only client-only events that are being ignored', () => Effect.gen(function* () {
475
+ const syncState = new SyncState.SyncState({
476
+ pending: [],
477
+ upstreamHead: EventSequenceNumber.Client.ROOT,
478
+ localHead: EventSequenceNumber.Client.ROOT,
479
+ });
480
+ const result = yield* merge({
481
+ syncState,
482
+ payload: SyncState.PayloadLocalPush.make({ newEvents: [e0_1] }),
483
+ ignoreClientOnlyEvents: true,
484
+ });
485
+ expectAdvance(result);
486
+ expectEventArraysEqual(result.newSyncState.pending, []);
487
+ expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.Client.ROOT);
488
+ expect(result.newSyncState.localHead).toMatchObject(EventSequenceNumber.Client.ROOT);
489
+ expectEventArraysEqual(result.newEvents, [e0_1]);
490
+ }));
491
+ Vitest.it.effect('appends only upstream-bound events to pending when ignoring client-only pushes', () => Effect.gen(function* () {
492
+ const syncState = new SyncState.SyncState({
493
+ pending: [],
494
+ upstreamHead: EventSequenceNumber.Client.ROOT,
495
+ localHead: EventSequenceNumber.Client.ROOT,
496
+ });
497
+ const result = yield* merge({
498
+ syncState,
499
+ payload: SyncState.PayloadLocalPush.make({ newEvents: [e0_1, e1_0] }),
500
+ ignoreClientOnlyEvents: true,
501
+ });
502
+ expectAdvance(result);
503
+ expectEventArraysEqual(result.newSyncState.pending, [e1_0]);
504
+ expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.Client.ROOT);
505
+ expect(result.newSyncState.localHead).toMatchObject(e1_0.seqNum);
506
+ expectEventArraysEqual(result.newEvents, [e0_1, e1_0]);
507
+ }));
508
+ });
509
+ Vitest.describe('reject', () => {
510
+ Vitest.it.effect('should reject when new events are greater than pending events', () => Effect.gen(function* () {
383
511
  const syncState = new SyncState.SyncState({
384
512
  pending: [e1_0, e1_1],
385
- upstreamHead: EventSequenceNumber.ROOT,
513
+ upstreamHead: EventSequenceNumber.Client.ROOT,
386
514
  localHead: e1_1.seqNum,
387
515
  });
388
- const result = merge({
516
+ const result = yield* merge({
389
517
  syncState,
390
518
  payload: SyncState.PayloadLocalPush.make({ newEvents: [e1_1, e1_2] }),
391
519
  });
392
520
  expectReject(result);
393
521
  expect(result.expectedMinimumId).toMatchObject(e1_2.seqNum);
394
- });
522
+ }));
395
523
  });
396
524
  });
397
525
  });
@@ -406,13 +534,13 @@ const expectEventArraysEqual = (actual, expected) => {
406
534
  expect(event.args).toStrictEqual(expected[i].args);
407
535
  });
408
536
  };
409
- function expectAdvance(result) {
537
+ const expectAdvance = (result) => {
410
538
  expect(result._tag).toBe('advance');
411
- }
412
- function expectRebase(result) {
413
- expect(result._tag, `Expected rebase, got ${result}`).toBe('rebase');
414
- }
415
- function expectReject(result) {
539
+ };
540
+ const expectRebase = (result) => {
541
+ expect(result._tag, `Expected rebase, got ${result._tag}`).toBe('rebase');
542
+ };
543
+ const expectReject = (result) => {
416
544
  expect(result._tag).toBe('reject');
417
- }
545
+ };
418
546
  //# sourceMappingURL=syncstate.test.js.map