@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,8 +1,8 @@
1
- import { casesHandled, LS_DEV, shouldNeverHappen } from '@livestore/utils'
2
- import { Match, ReadonlyArray, Schema } from '@livestore/utils/effect'
1
+ import { casesHandled } from '@livestore/utils'
2
+ import { Effect, Match, ReadonlyArray, Schema } from '@livestore/utils/effect'
3
3
 
4
- import * as EventSequenceNumber from '../schema/EventSequenceNumber.ts'
5
- import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
4
+ import * as EventSequenceNumber from '../schema/EventSequenceNumber/mod.ts'
5
+ import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts'
6
6
 
7
7
  /**
8
8
  * SyncState represents the current sync state of a sync node relative to an upstream node.
@@ -15,7 +15,7 @@ import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
15
15
  * +------------------------+
16
16
  * ▼ ▼
17
17
  * Upstream Head Local Head
18
- * (1,0) (1,1), (1,2), (2,0)
18
+ * e1 e1.1, e1.2, e2
19
19
  * ```
20
20
  *
21
21
  * **Pending Events**: Events awaiting acknowledgment from the upstream.
@@ -31,7 +31,7 @@ import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
31
31
  * Invariants:
32
32
  * 1. **Chain Continuity**: Each event must reference its immediate parent.
33
33
  * 2. **Head Ordering**: Upstream Head ≤ Local Head.
34
- * 3. **Event number sequence**: Must follow the pattern (1,0)(1,1)(1,2)(2,0).
34
+ * 3. **Event number sequence**: Must follow the pattern e1e1.1→e1.2→e2.
35
35
  *
36
36
  * A few further notes to help form an intuition:
37
37
  * - The goal is to keep the pending events as small as possible (i.e. to have synced with the next upstream node)
@@ -42,40 +42,40 @@ import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
42
42
  * handling cases such as upstream rebase, advance and local push.
43
43
  */
44
44
  export class SyncState extends Schema.Class<SyncState>('SyncState')({
45
- pending: Schema.Array(LiveStoreEvent.EncodedWithMeta),
45
+ pending: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
46
46
  /** What this node expects the next upstream node to have as its own local head */
47
- upstreamHead: EventSequenceNumber.EventSequenceNumber,
47
+ upstreamHead: EventSequenceNumber.Client.Composite,
48
48
  /** Equivalent to `pending.at(-1)?.id` if there are pending events */
49
- localHead: EventSequenceNumber.EventSequenceNumber,
49
+ localHead: EventSequenceNumber.Client.Composite,
50
50
  }) {
51
51
  toJSON = (): any => ({
52
52
  pending: this.pending.map((e) => e.toJSON()),
53
- upstreamHead: EventSequenceNumber.toString(this.upstreamHead),
54
- localHead: EventSequenceNumber.toString(this.localHead),
53
+ upstreamHead: EventSequenceNumber.Client.toString(this.upstreamHead),
54
+ localHead: EventSequenceNumber.Client.toString(this.localHead),
55
55
  })
56
56
  }
57
57
 
58
58
  /**
59
59
  * This payload propagates a rebase from the upstream node
60
60
  */
61
- export class PayloadUpstreamRebase extends Schema.TaggedStruct('upstream-rebase', {
61
+ export const PayloadUpstreamRebase = Schema.TaggedStruct('upstream-rebase', {
62
62
  /** Events which need to be rolled back */
63
- rollbackEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
63
+ rollbackEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
64
64
  /** Events which need to be applied after the rollback (already rebased by the upstream node) */
65
- newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
66
- }) {}
65
+ newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
66
+ })
67
67
 
68
- export class PayloadUpstreamAdvance extends Schema.TaggedStruct('upstream-advance', {
69
- newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
70
- }) {}
68
+ export const PayloadUpstreamAdvance = Schema.TaggedStruct('upstream-advance', {
69
+ newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
70
+ })
71
71
 
72
- export class PayloadLocalPush extends Schema.TaggedStruct('local-push', {
73
- newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
74
- }) {}
72
+ export const PayloadLocalPush = Schema.TaggedStruct('local-push', {
73
+ newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
74
+ })
75
75
 
76
- export class Payload extends Schema.Union(PayloadUpstreamRebase, PayloadUpstreamAdvance, PayloadLocalPush) {}
76
+ export const Payload = Schema.Union([PayloadUpstreamRebase, PayloadUpstreamAdvance, PayloadLocalPush])
77
77
 
78
- export class PayloadUpstream extends Schema.Union(PayloadUpstreamRebase, PayloadUpstreamAdvance) {}
78
+ export const PayloadUpstream = Schema.Union([PayloadUpstreamRebase, PayloadUpstreamAdvance])
79
79
 
80
80
  /** Only used for debugging purposes */
81
81
  export class MergeContext extends Schema.Class<MergeContext>('MergeContext')({
@@ -109,9 +109,9 @@ export class MergeContext extends Schema.Class<MergeContext>('MergeContext')({
109
109
  export class MergeResultAdvance extends Schema.Class<MergeResultAdvance>('MergeResultAdvance')({
110
110
  _tag: Schema.Literal('advance'),
111
111
  newSyncState: SyncState,
112
- newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
112
+ newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
113
113
  /** Events which were previously pending but are now confirmed */
114
- confirmedEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
114
+ confirmedEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
115
115
  mergeContext: MergeContext,
116
116
  }) {
117
117
  toJSON = (): any => {
@@ -128,9 +128,9 @@ export class MergeResultAdvance extends Schema.Class<MergeResultAdvance>('MergeR
128
128
  export class MergeResultRebase extends Schema.Class<MergeResultRebase>('MergeResultRebase')({
129
129
  _tag: Schema.Literal('rebase'),
130
130
  newSyncState: SyncState,
131
- newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
131
+ newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
132
132
  /** Events which need to be rolled back */
133
- rollbackEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
133
+ rollbackEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
134
134
  mergeContext: MergeContext,
135
135
  }) {
136
136
  toJSON = (): any => {
@@ -147,32 +147,22 @@ export class MergeResultRebase extends Schema.Class<MergeResultRebase>('MergeRes
147
147
  export class MergeResultReject extends Schema.Class<MergeResultReject>('MergeResultReject')({
148
148
  _tag: Schema.Literal('reject'),
149
149
  /** The minimum id that the new events must have */
150
- expectedMinimumId: EventSequenceNumber.EventSequenceNumber,
150
+ expectedMinimumId: EventSequenceNumber.Client.Composite,
151
151
  mergeContext: MergeContext,
152
152
  }) {
153
153
  toJSON = (): any => {
154
154
  return {
155
155
  _tag: this._tag,
156
- expectedMinimumId: EventSequenceNumber.toString(this.expectedMinimumId),
156
+ expectedMinimumId: EventSequenceNumber.Client.toString(this.expectedMinimumId),
157
157
  mergeContext: this.mergeContext.toJSON(),
158
158
  }
159
159
  }
160
160
  }
161
161
 
162
- export class MergeResultUnexpectedError extends Schema.Class<MergeResultUnexpectedError>('MergeResultUnexpectedError')({
163
- _tag: Schema.Literal('unexpected-error'),
164
- message: Schema.String,
165
- }) {}
166
-
167
- export class MergeResult extends Schema.Union(
168
- MergeResultAdvance,
169
- MergeResultRebase,
170
- MergeResultReject,
171
- MergeResultUnexpectedError,
172
- ) {}
162
+ export const MergeResult = Schema.Union([MergeResultAdvance, MergeResultRebase, MergeResultReject])
173
163
 
174
164
  export const payloadFromMergeResult = (
175
- mergeResult: typeof MergeResultAdvance.Type | typeof MergeResultRebase.Type,
165
+ mergeResult: MergeResultAdvance | MergeResultRebase,
176
166
  ): typeof PayloadUpstream.Type =>
177
167
  Match.value(mergeResult).pipe(
178
168
  Match.tag('advance', (result) => ({
@@ -187,15 +177,6 @@ export const payloadFromMergeResult = (
187
177
  Match.exhaustive,
188
178
  )
189
179
 
190
- const unexpectedError = (message: string): MergeResultUnexpectedError => {
191
- if (LS_DEV) {
192
- // biome-ignore lint/suspicious/noDebugger: debug
193
- debugger
194
- }
195
-
196
- return MergeResultUnexpectedError.make({ _tag: 'unexpected-error', message })
197
- }
198
-
199
180
  // TODO Idea: call merge recursively through hierarchy levels
200
181
  /*
201
182
  Idea: have a map that maps from `globalEventSequenceNumber` to Array<ClientEvents>
@@ -203,22 +184,37 @@ The same applies to even further hierarchy levels
203
184
 
204
185
  TODO: possibly even keep the client events in a separate table in the client leader
205
186
  */
206
- export const merge = ({
187
+ export const merge = Effect.fnUntraced(function* ({
207
188
  syncState,
208
189
  payload,
209
- isClientEvent,
190
+ isClientOnlyEvent,
210
191
  isEqualEvent,
211
- ignoreClientEvents = false,
192
+ ignoreClientOnlyEvents = false,
212
193
  }: {
213
194
  syncState: SyncState
214
195
  payload: typeof Payload.Type
215
- isClientEvent: (event: LiveStoreEvent.EncodedWithMeta) => boolean
216
- isEqualEvent: (a: LiveStoreEvent.EncodedWithMeta, b: LiveStoreEvent.EncodedWithMeta) => boolean
217
- /** This is used in the leader which should ignore client events when receiving an upstream-advance payload */
218
- ignoreClientEvents?: boolean
219
- }): typeof MergeResult.Type => {
220
- validateSyncState(syncState)
221
- validatePayload(payload)
196
+ /**
197
+ * `LiveStoreEvent.Client.EncodedWithMeta` does not carry the event definition's
198
+ * `clientOnly` flag. The caller supplies this schema-aware predicate so `merge`
199
+ * can preserve the correct sequence-number shape when rebasing: client-only
200
+ * events advance the client component, synced events advance the global component.
201
+ */
202
+ isClientOnlyEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean
203
+ /**
204
+ * Pending events are confirmed by comparing their logical encoded identity with
205
+ * upstream events. This is caller-supplied because comparing encoded args may
206
+ * require event-schema knowledge that the generic merge algorithm does not own.
207
+ * Implementations should ignore transport/runtime metadata.
208
+ */
209
+ isEqualEvent: (a: LiveStoreEvent.Client.EncodedWithMeta, b: LiveStoreEvent.Client.EncodedWithMeta) => boolean
210
+ /**
211
+ * This is used in the leader which should ignore client events when
212
+ * receiving an upstream-advance payload
213
+ */
214
+ ignoreClientOnlyEvents?: boolean
215
+ }) {
216
+ yield* validateSyncState(syncState)
217
+ yield* validatePayload(payload)
222
218
 
223
219
  const mergeContext = MergeContext.make({ payload, syncState })
224
220
 
@@ -233,10 +229,10 @@ export const merge = ({
233
229
  const rebasedPending = rebaseEvents({
234
230
  events: syncState.pending,
235
231
  baseEventSequenceNumber: newUpstreamHead,
236
- isClientEvent,
232
+ isClientOnlyEvent,
237
233
  })
238
234
 
239
- return validateMergeResult(
235
+ return yield* validateMergeResult(
240
236
  MergeResultRebase.make({
241
237
  _tag: 'rebase',
242
238
  newSyncState: new SyncState({
@@ -251,10 +247,10 @@ export const merge = ({
251
247
  )
252
248
  }
253
249
 
254
- // #region upstream-advance
250
+ //#region upstream-advance
255
251
  case 'upstream-advance': {
256
252
  if (payload.newEvents.length === 0) {
257
- return validateMergeResult(
253
+ return yield* validateMergeResult(
258
254
  MergeResultAdvance.make({
259
255
  _tag: 'advance',
260
256
  newSyncState: new SyncState({
@@ -271,20 +267,23 @@ export const merge = ({
271
267
 
272
268
  // Validate that newEvents are sorted in ascending order by eventNum
273
269
  for (let i = 1; i < payload.newEvents.length; i++) {
274
- if (EventSequenceNumber.isGreaterThan(payload.newEvents[i - 1]!.seqNum, payload.newEvents[i]!.seqNum)) {
275
- return unexpectedError(
276
- `Events must be sorted in ascending order by event number. Received: [${payload.newEvents.map((e) => EventSequenceNumber.toString(e.seqNum)).join(', ')}]`,
270
+ if (
271
+ EventSequenceNumber.Client.isGreaterThan(payload.newEvents[i - 1]!.seqNum, payload.newEvents[i]!.seqNum) ===
272
+ true
273
+ ) {
274
+ return yield* Effect.dieDebugger(
275
+ `Events must be sorted in ascending order by event number. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
277
276
  )
278
277
  }
279
278
  }
280
279
 
281
280
  // Validate that incoming events are larger than upstream head
282
281
  if (
283
- EventSequenceNumber.isGreaterThan(syncState.upstreamHead, payload.newEvents[0]!.seqNum) ||
284
- EventSequenceNumber.isEqual(syncState.upstreamHead, payload.newEvents[0]!.seqNum)
282
+ EventSequenceNumber.Client.isGreaterThan(syncState.upstreamHead, payload.newEvents[0]!.seqNum) === true ||
283
+ EventSequenceNumber.Client.isEqual(syncState.upstreamHead, payload.newEvents[0]!.seqNum) === true
285
284
  ) {
286
- return unexpectedError(
287
- `Incoming events must be greater than upstream head. Expected greater than: ${EventSequenceNumber.toString(syncState.upstreamHead)}. Received: [${payload.newEvents.map((e) => EventSequenceNumber.toString(e.seqNum)).join(', ')}]`,
285
+ return yield* Effect.dieDebugger(
286
+ `Incoming events must be greater than upstream head. Expected greater than: ${EventSequenceNumber.Client.toString(syncState.upstreamHead)}. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
288
287
  )
289
288
  }
290
289
 
@@ -294,8 +293,8 @@ export const merge = ({
294
293
  existingEvents: syncState.pending,
295
294
  incomingEvents: payload.newEvents,
296
295
  isEqualEvent,
297
- isClientEvent,
298
- ignoreClientEvents,
296
+ isClientOnlyEvent,
297
+ ignoreClientOnlyEvents,
299
298
  })
300
299
 
301
300
  // No divergent pending events, thus we can just advance (some of) the pending events
@@ -316,27 +315,27 @@ export const merge = ({
316
315
  const [pendingMatching, pendingRemaining] = ReadonlyArray.splitWhere(
317
316
  syncState.pending,
318
317
  (pendingEvent, index) => {
319
- if (ignoreClientEvents && isClientEvent(pendingEvent)) {
318
+ if (ignoreClientOnlyEvents === true && isClientOnlyEvent(pendingEvent) === true) {
320
319
  clientIndexOffset++
321
320
  return false
322
321
  }
323
322
 
324
323
  const newEvent = payload.newEvents.at(index - clientIndexOffset)
325
- if (!newEvent) {
324
+ if (newEvent == null) {
326
325
  return true
327
326
  }
328
- return isEqualEvent(pendingEvent, newEvent) === false
327
+ return !isEqualEvent(pendingEvent, newEvent)
329
328
  },
330
329
  )
331
330
 
332
- return validateMergeResult(
331
+ return yield* validateMergeResult(
333
332
  MergeResultAdvance.make({
334
333
  _tag: 'advance',
335
334
  newSyncState: new SyncState({
336
335
  pending: pendingRemaining,
337
336
  upstreamHead: newUpstreamHead,
338
337
  localHead:
339
- pendingRemaining.at(-1)?.seqNum ?? EventSequenceNumber.max(syncState.localHead, newUpstreamHead),
338
+ pendingRemaining.at(-1)?.seqNum ?? EventSequenceNumber.Client.max(syncState.localHead, newUpstreamHead),
340
339
  }),
341
340
  newEvents,
342
341
  confirmedEvents: pendingMatching,
@@ -348,18 +347,18 @@ export const merge = ({
348
347
  const rebasedPending = rebaseEvents({
349
348
  events: divergentPending,
350
349
  baseEventSequenceNumber: newUpstreamHead,
351
- isClientEvent,
350
+ isClientOnlyEvent: isClientOnlyEvent,
352
351
  })
353
352
 
354
353
  const divergentNewEventsIndex = findDivergencePoint({
355
354
  existingEvents: payload.newEvents,
356
355
  incomingEvents: syncState.pending,
357
356
  isEqualEvent,
358
- isClientEvent,
359
- ignoreClientEvents,
357
+ isClientOnlyEvent: isClientOnlyEvent,
358
+ ignoreClientOnlyEvents: ignoreClientOnlyEvents,
360
359
  })
361
360
 
362
- return validateMergeResult(
361
+ return yield* validateMergeResult(
363
362
  MergeResultRebase.make({
364
363
  _tag: 'rebase',
365
364
  newSyncState: new SyncState({
@@ -374,12 +373,12 @@ export const merge = ({
374
373
  )
375
374
  }
376
375
  }
377
- // #endregion
376
+ //#endregion upstream-advance
378
377
 
379
378
  // This is the same as what's running in the sync backend
380
379
  case 'local-push': {
381
380
  if (payload.newEvents.length === 0) {
382
- return validateMergeResult(
381
+ return yield* validateMergeResult(
383
382
  MergeResultAdvance.make({
384
383
  _tag: 'advance',
385
384
  newSyncState: syncState,
@@ -391,15 +390,17 @@ export const merge = ({
391
390
  }
392
391
 
393
392
  const newEventsFirst = payload.newEvents.at(0)!
394
- const invalidEventSequenceNumber =
395
- EventSequenceNumber.isGreaterThan(newEventsFirst.seqNum, syncState.localHead) === false
393
+ const invalidEventSequenceNumber = !EventSequenceNumber.Client.isGreaterThan(
394
+ newEventsFirst.seqNum,
395
+ syncState.localHead,
396
+ )
396
397
 
397
- if (invalidEventSequenceNumber) {
398
- const expectedMinimumId = EventSequenceNumber.nextPair({
398
+ if (invalidEventSequenceNumber === true) {
399
+ const expectedMinimumId = EventSequenceNumber.Client.nextPair({
399
400
  seqNum: syncState.localHead,
400
- isClient: true,
401
+ isClientOnly: true,
401
402
  }).seqNum
402
- return validateMergeResult(
403
+ return yield* validateMergeResult(
403
404
  MergeResultReject.make({
404
405
  _tag: 'reject',
405
406
  expectedMinimumId,
@@ -407,13 +408,21 @@ export const merge = ({
407
408
  }),
408
409
  )
409
410
  } else {
410
- return validateMergeResult(
411
+ const nonClientOnlyEvents =
412
+ ignoreClientOnlyEvents === true
413
+ ? payload.newEvents.filter((event) => !isClientOnlyEvent(event))
414
+ : payload.newEvents
415
+ const newPending = [...syncState.pending, ...nonClientOnlyEvents]
416
+ const newLocalHead =
417
+ newPending.at(-1)?.seqNum ?? EventSequenceNumber.Client.max(syncState.localHead, syncState.upstreamHead)
418
+
419
+ return yield* validateMergeResult(
411
420
  MergeResultAdvance.make({
412
421
  _tag: 'advance',
413
422
  newSyncState: new SyncState({
414
- pending: [...syncState.pending, ...payload.newEvents],
423
+ pending: newPending,
415
424
  upstreamHead: syncState.upstreamHead,
416
- localHead: payload.newEvents.at(-1)!.seqNum,
425
+ localHead: newLocalHead,
417
426
  }),
418
427
  newEvents: payload.newEvents,
419
428
  confirmedEvents: [],
@@ -423,11 +432,10 @@ export const merge = ({
423
432
  }
424
433
  }
425
434
 
426
- default: {
427
- casesHandled(payload)
428
- }
435
+ default:
436
+ return casesHandled(payload)
429
437
  }
430
- }
438
+ })
431
439
 
432
440
  /**
433
441
  * Gets the index relative to `existingEvents` where the divergence point is
@@ -437,57 +445,58 @@ export const findDivergencePoint = ({
437
445
  existingEvents,
438
446
  incomingEvents,
439
447
  isEqualEvent,
440
- isClientEvent,
441
- ignoreClientEvents,
448
+ isClientOnlyEvent,
449
+ ignoreClientOnlyEvents,
442
450
  }: {
443
- existingEvents: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>
444
- incomingEvents: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>
445
- isEqualEvent: (a: LiveStoreEvent.EncodedWithMeta, b: LiveStoreEvent.EncodedWithMeta) => boolean
446
- isClientEvent: (event: LiveStoreEvent.EncodedWithMeta) => boolean
447
- ignoreClientEvents: boolean
451
+ existingEvents: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>
452
+ incomingEvents: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>
453
+ isEqualEvent: (a: LiveStoreEvent.Client.EncodedWithMeta, b: LiveStoreEvent.Client.EncodedWithMeta) => boolean
454
+ isClientOnlyEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean
455
+ ignoreClientOnlyEvents: boolean
448
456
  }): number => {
449
- if (ignoreClientEvents) {
450
- const filteredExistingEvents = existingEvents.filter((event) => !isClientEvent(event))
451
- const divergencePointWithoutClientEvents = findDivergencePoint({
457
+ if (ignoreClientOnlyEvents === true) {
458
+ const filteredExistingEvents = existingEvents.filter((event) => !isClientOnlyEvent(event))
459
+ const divergencePointWithoutClientOnlyEvents = findDivergencePoint({
452
460
  existingEvents: filteredExistingEvents,
453
461
  incomingEvents,
454
462
  isEqualEvent,
455
- isClientEvent,
456
- ignoreClientEvents: false,
463
+ isClientOnlyEvent,
464
+ ignoreClientOnlyEvents: false,
457
465
  })
458
466
 
459
- if (divergencePointWithoutClientEvents === -1) return -1
467
+ if (divergencePointWithoutClientOnlyEvents === -1) return -1
460
468
 
461
- const divergencePointEventSequenceNumber = existingEvents[divergencePointWithoutClientEvents]!.seqNum
469
+ const divergencePointEventSequenceNumber = existingEvents[divergencePointWithoutClientOnlyEvents]!.seqNum
462
470
  // Now find the divergence point in the original array
463
471
  return existingEvents.findIndex((event) =>
464
- EventSequenceNumber.isEqual(event.seqNum, divergencePointEventSequenceNumber),
472
+ EventSequenceNumber.Client.isEqual(event.seqNum, divergencePointEventSequenceNumber),
465
473
  )
466
474
  }
467
475
 
468
476
  return existingEvents.findIndex((existingEvent, index) => {
469
477
  const incomingEvent = incomingEvents[index]
470
478
  // return !incomingEvent || !isEqualEvent(existingEvent, incomingEvent)
471
- return incomingEvent && !isEqualEvent(existingEvent, incomingEvent)
479
+ return incomingEvent !== undefined && isEqualEvent(existingEvent, incomingEvent) === false
472
480
  })
473
481
  }
474
482
 
475
483
  const rebaseEvents = ({
476
484
  events,
477
485
  baseEventSequenceNumber,
478
- isClientEvent,
486
+ isClientOnlyEvent,
479
487
  }: {
480
- events: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>
481
- baseEventSequenceNumber: EventSequenceNumber.EventSequenceNumber
482
- isClientEvent: (event: LiveStoreEvent.EncodedWithMeta) => boolean
483
- }): ReadonlyArray<LiveStoreEvent.EncodedWithMeta> => {
488
+ events: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>
489
+ baseEventSequenceNumber: EventSequenceNumber.Client.Composite
490
+ isClientOnlyEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean
491
+ }): ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta> => {
484
492
  let prevEventSequenceNumber = baseEventSequenceNumber
485
493
  const rebaseGeneration = baseEventSequenceNumber.rebaseGeneration + 1
486
494
  return events.map((event) => {
487
- const isClient = isClientEvent(event)
495
+ // Rebasing must preserve whether an event is client-only: client-only
496
+ // events become eN.1/eN.2, while synced events become eN+1.
488
497
  const newEvent = event.rebase({
489
498
  parentSeqNum: prevEventSequenceNumber,
490
- isClient,
499
+ isClientOnly: isClientOnlyEvent(event),
491
500
  rebaseGeneration,
492
501
  })
493
502
  prevEventSequenceNumber = newEvent.seqNum
@@ -502,67 +511,73 @@ const rebaseEvents = ({
502
511
  * it could make sense to "flatten" update results into a single update result which the client session
503
512
  * can process more efficiently which avoids push-threshing
504
513
  */
505
- const _flattenMergeResults = (_updateResults: ReadonlyArray<MergeResult>) => {}
514
+ const _flattenMergeResults = (_updateResults: ReadonlyArray<typeof MergeResult>) => {}
506
515
 
507
- const validatePayload = (payload: typeof Payload.Type) => {
508
- for (let i = 1; i < payload.newEvents.length; i++) {
509
- if (EventSequenceNumber.isGreaterThanOrEqual(payload.newEvents[i - 1]!.seqNum, payload.newEvents[i]!.seqNum)) {
510
- return unexpectedError(
511
- `Events must be ordered in monotonically ascending order by eventNum. Received: [${payload.newEvents.map((e) => EventSequenceNumber.toString(e.seqNum)).join(', ')}]`,
512
- )
516
+ const validatePayload = (payload: typeof Payload.Type) =>
517
+ Effect.gen(function* () {
518
+ for (let i = 1; i < payload.newEvents.length; i++) {
519
+ if (
520
+ EventSequenceNumber.Client.isGreaterThanOrEqual(
521
+ payload.newEvents[i - 1]!.seqNum,
522
+ payload.newEvents[i]!.seqNum,
523
+ ) === true
524
+ ) {
525
+ return yield* Effect.dieDebugger(
526
+ `Events must be ordered in monotonically ascending order by eventNum. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
527
+ )
528
+ }
513
529
  }
514
- }
515
- }
530
+ })
516
531
 
517
- const validateSyncState = (syncState: SyncState) => {
532
+ const validateSyncState = Effect.fnUntraced(function* (syncState: SyncState) {
518
533
  for (let i = 0; i < syncState.pending.length; i++) {
519
534
  const event = syncState.pending[i]!
520
535
  const nextEvent = syncState.pending[i + 1]
521
536
  if (nextEvent === undefined) break // Reached end of chain
522
537
 
523
- if (EventSequenceNumber.isGreaterThanOrEqual(event.seqNum, nextEvent.seqNum)) {
524
- shouldNeverHappen(
525
- `Events must be ordered in monotonically ascending order by eventNum. Received: [${syncState.pending.map((e) => EventSequenceNumber.toString(e.seqNum)).join(', ')}]`,
526
- {
527
- event,
528
- nextEvent,
529
- },
538
+ if (EventSequenceNumber.Client.isGreaterThanOrEqual(event.seqNum, nextEvent.seqNum) === true) {
539
+ return yield* Effect.dieDebugger(
540
+ `Events must be ordered in monotonically ascending order by eventNum. Received: [${syncState.pending.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
541
+ { event, nextEvent },
530
542
  )
531
543
  }
532
544
 
533
545
  // If the global id has increased, then the client id must be 0
534
546
  const globalIdHasIncreased = nextEvent.seqNum.global > event.seqNum.global
535
- if (globalIdHasIncreased) {
547
+ if (globalIdHasIncreased === true) {
536
548
  if (nextEvent.seqNum.client !== 0) {
537
- shouldNeverHappen(
538
- `New global events must point to clientId 0 in the parentSeqNum. Received: (${EventSequenceNumber.toString(nextEvent.seqNum)})`,
549
+ return yield* Effect.dieDebugger(
550
+ `New global events must point to clientId 0 in the parentSeqNum. Received: (${EventSequenceNumber.Client.toString(nextEvent.seqNum)})`,
539
551
  syncState.pending,
540
- {
541
- event,
542
- nextEvent,
543
- },
552
+ { event, nextEvent },
544
553
  )
545
554
  }
546
555
  } else {
547
556
  // Otherwise, the parentSeqNum must be the same as the previous event's id
548
- if (EventSequenceNumber.isEqual(nextEvent.parentSeqNum, event.seqNum) === false) {
549
- shouldNeverHappen('Events must be linked in a continuous chain via the parentSeqNum', syncState.pending, {
550
- event,
551
- nextEvent,
552
- })
557
+ if (EventSequenceNumber.Client.isEqual(nextEvent.parentSeqNum, event.seqNum) === false) {
558
+ return yield* Effect.dieDebugger(
559
+ 'Events must be linked in a continuous chain via the parentSeqNum',
560
+ syncState.pending,
561
+ { event, nextEvent },
562
+ )
553
563
  }
554
564
  }
555
565
  }
556
- }
566
+ })
557
567
 
558
- const validateMergeResult = (mergeResult: typeof MergeResult.Type) => {
559
- if (mergeResult._tag === 'unexpected-error' || mergeResult._tag === 'reject') return mergeResult
568
+ const validateMergeResult = Effect.fnUntraced(function* (mergeResult: typeof MergeResult.Type) {
569
+ if (mergeResult._tag === 'reject') return mergeResult
560
570
 
561
- validateSyncState(mergeResult.newSyncState)
571
+ yield* validateSyncState(mergeResult.newSyncState)
562
572
 
563
573
  // Ensure local head is always greater than or equal to upstream head
564
- if (EventSequenceNumber.isGreaterThan(mergeResult.newSyncState.upstreamHead, mergeResult.newSyncState.localHead)) {
565
- shouldNeverHappen('Local head must be greater than or equal to upstream head', {
574
+ if (
575
+ EventSequenceNumber.Client.isGreaterThan(
576
+ mergeResult.newSyncState.upstreamHead,
577
+ mergeResult.newSyncState.localHead,
578
+ ) === true
579
+ ) {
580
+ return yield* Effect.dieDebugger('Local head must be greater than or equal to upstream head', {
566
581
  localHead: mergeResult.newSyncState.localHead,
567
582
  upstreamHead: mergeResult.newSyncState.upstreamHead,
568
583
  })
@@ -570,12 +585,12 @@ const validateMergeResult = (mergeResult: typeof MergeResult.Type) => {
570
585
 
571
586
  // Ensure new local head is greater than or equal to the previous local head
572
587
  if (
573
- EventSequenceNumber.isGreaterThanOrEqual(
588
+ EventSequenceNumber.Client.isGreaterThanOrEqual(
574
589
  mergeResult.newSyncState.localHead,
575
590
  mergeResult.mergeContext.syncState.localHead,
576
591
  ) === false
577
592
  ) {
578
- shouldNeverHappen('New local head must be greater than or equal to the previous local head', {
593
+ return yield* Effect.dieDebugger('New local head must be greater than or equal to the previous local head', {
579
594
  localHead: mergeResult.newSyncState.localHead,
580
595
  previousLocalHead: mergeResult.mergeContext.syncState.localHead,
581
596
  })
@@ -583,16 +598,16 @@ const validateMergeResult = (mergeResult: typeof MergeResult.Type) => {
583
598
 
584
599
  // Ensure new upstream head is greater than or equal to the previous upstream head
585
600
  if (
586
- EventSequenceNumber.isGreaterThanOrEqual(
601
+ EventSequenceNumber.Client.isGreaterThanOrEqual(
587
602
  mergeResult.newSyncState.upstreamHead,
588
603
  mergeResult.mergeContext.syncState.upstreamHead,
589
604
  ) === false
590
605
  ) {
591
- shouldNeverHappen('New upstream head must be greater than or equal to the previous upstream head', {
606
+ return yield* Effect.dieDebugger('New upstream head must be greater than or equal to the previous upstream head', {
592
607
  upstreamHead: mergeResult.newSyncState.upstreamHead,
593
608
  previousUpstreamHead: mergeResult.mergeContext.syncState.upstreamHead,
594
609
  })
595
610
  }
596
611
 
597
612
  return mergeResult
598
- }
613
+ })