@livestore/common 0.4.0-dev.2 → 0.4.0-dev.20

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 (449) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +17 -12
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
  5. package/dist/adapter-types.d.ts +14 -6
  6. package/dist/adapter-types.d.ts.map +1 -1
  7. package/dist/adapter-types.js.map +1 -1
  8. package/dist/debug-info.d.ts.map +1 -1
  9. package/dist/debug-info.js +33 -6
  10. package/dist/debug-info.js.map +1 -1
  11. package/dist/devtools/devtools-messages-client-session.d.ts +28 -23
  12. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  13. package/dist/devtools/devtools-messages-client-session.js +2 -2
  14. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  15. package/dist/devtools/devtools-messages-common.d.ts +7 -14
  16. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  17. package/dist/devtools/devtools-messages-common.js +1 -6
  18. package/dist/devtools/devtools-messages-common.js.map +1 -1
  19. package/dist/devtools/devtools-messages-leader.d.ts +36 -29
  20. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  21. package/dist/devtools/devtools-messages-leader.js +8 -8
  22. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  23. package/dist/devtools/devtools-sessioninfo.d.ts +14 -2
  24. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  25. package/dist/devtools/devtools-sessioninfo.js +7 -4
  26. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  27. package/dist/devtools/mod.d.ts +13 -2
  28. package/dist/devtools/mod.d.ts.map +1 -1
  29. package/dist/devtools/mod.js +10 -3
  30. package/dist/devtools/mod.js.map +1 -1
  31. package/dist/errors.d.ts +52 -10
  32. package/dist/errors.d.ts.map +1 -1
  33. package/dist/errors.js +25 -6
  34. package/dist/errors.js.map +1 -1
  35. package/dist/index.d.ts +2 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +2 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/leader-thread/LeaderSyncProcessor.d.ts +8 -4
  40. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  41. package/dist/leader-thread/LeaderSyncProcessor.js +156 -73
  42. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  43. package/dist/leader-thread/eventlog.d.ts +15 -21
  44. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  45. package/dist/leader-thread/eventlog.js +18 -18
  46. package/dist/leader-thread/eventlog.js.map +1 -1
  47. package/dist/leader-thread/leader-worker-devtools.d.ts +2 -2
  48. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  49. package/dist/leader-thread/leader-worker-devtools.js +30 -42
  50. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  51. package/dist/leader-thread/make-leader-thread-layer.d.ts +6 -6
  52. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  53. package/dist/leader-thread/make-leader-thread-layer.js +79 -27
  54. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  55. package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
  56. package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
  57. package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
  58. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
  59. package/dist/leader-thread/materialize-event.d.ts +3 -3
  60. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  61. package/dist/leader-thread/materialize-event.js +25 -11
  62. package/dist/leader-thread/materialize-event.js.map +1 -1
  63. package/dist/leader-thread/recreate-db.d.ts +2 -3
  64. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  65. package/dist/leader-thread/recreate-db.js +5 -5
  66. package/dist/leader-thread/recreate-db.js.map +1 -1
  67. package/dist/leader-thread/shutdown-channel.d.ts +2 -2
  68. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  69. package/dist/leader-thread/shutdown-channel.js +2 -2
  70. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  71. package/dist/leader-thread/types.d.ts +21 -19
  72. package/dist/leader-thread/types.d.ts.map +1 -1
  73. package/dist/leader-thread/types.js.map +1 -1
  74. package/dist/logging.d.ts +40 -0
  75. package/dist/logging.d.ts.map +1 -0
  76. package/dist/logging.js +33 -0
  77. package/dist/logging.js.map +1 -0
  78. package/dist/make-client-session.d.ts +5 -3
  79. package/dist/make-client-session.d.ts.map +1 -1
  80. package/dist/make-client-session.js +5 -2
  81. package/dist/make-client-session.js.map +1 -1
  82. package/dist/materializer-helper.d.ts +6 -6
  83. package/dist/materializer-helper.d.ts.map +1 -1
  84. package/dist/materializer-helper.js +20 -4
  85. package/dist/materializer-helper.js.map +1 -1
  86. package/dist/rematerialize-from-eventlog.d.ts +2 -2
  87. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  88. package/dist/rematerialize-from-eventlog.js +29 -20
  89. package/dist/rematerialize-from-eventlog.js.map +1 -1
  90. package/dist/schema/EventDef/define.d.ts +147 -0
  91. package/dist/schema/EventDef/define.d.ts.map +1 -0
  92. package/dist/schema/EventDef/define.js +139 -0
  93. package/dist/schema/EventDef/define.js.map +1 -0
  94. package/dist/schema/EventDef/event-def.d.ts +106 -0
  95. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  96. package/dist/schema/EventDef/event-def.js +2 -0
  97. package/dist/schema/EventDef/event-def.js.map +1 -0
  98. package/dist/schema/EventDef/facts.d.ts +118 -0
  99. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  100. package/dist/schema/EventDef/facts.js +53 -0
  101. package/dist/schema/EventDef/facts.js.map +1 -0
  102. package/dist/schema/EventDef/materializer.d.ts +155 -0
  103. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  104. package/dist/schema/EventDef/materializer.js +83 -0
  105. package/dist/schema/EventDef/materializer.js.map +1 -0
  106. package/dist/schema/EventDef/mod.d.ts +5 -0
  107. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  108. package/dist/schema/EventDef/mod.js +5 -0
  109. package/dist/schema/EventDef/mod.js.map +1 -0
  110. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  111. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  112. package/dist/schema/EventSequenceNumber/client.js +193 -0
  113. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  114. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  115. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  116. package/dist/schema/EventSequenceNumber/global.js +14 -0
  117. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  118. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  119. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  120. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  121. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  122. package/dist/schema/EventSequenceNumber.test.js +43 -43
  123. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  124. package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +89 -106
  125. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  126. package/dist/schema/{LiveStoreEvent.js → LiveStoreEvent/client.js} +74 -58
  127. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  128. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  129. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  130. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  131. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  132. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  133. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  134. package/dist/schema/LiveStoreEvent/global.js +31 -0
  135. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  136. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  137. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  138. package/dist/schema/LiveStoreEvent/input.js +26 -0
  139. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  140. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  141. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  142. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  143. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  144. package/dist/schema/events.d.ts +1 -1
  145. package/dist/schema/events.d.ts.map +1 -1
  146. package/dist/schema/events.js +1 -1
  147. package/dist/schema/events.js.map +1 -1
  148. package/dist/schema/mod.d.ts +6 -4
  149. package/dist/schema/mod.d.ts.map +1 -1
  150. package/dist/schema/mod.js +5 -4
  151. package/dist/schema/mod.js.map +1 -1
  152. package/dist/schema/schema.d.ts +16 -1
  153. package/dist/schema/schema.d.ts.map +1 -1
  154. package/dist/schema/schema.js +27 -2
  155. package/dist/schema/schema.js.map +1 -1
  156. package/dist/schema/state/sqlite/client-document-def.d.ts +36 -6
  157. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  158. package/dist/schema/state/sqlite/client-document-def.js +97 -6
  159. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  160. package/dist/schema/state/sqlite/client-document-def.test.js +16 -0
  161. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  162. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  163. package/dist/schema/state/sqlite/column-annotations.js +14 -6
  164. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  165. package/dist/schema/state/sqlite/column-annotations.test.js +1 -1
  166. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  167. package/dist/schema/state/sqlite/column-def.js +69 -22
  168. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  169. package/dist/schema/state/sqlite/column-def.test.js +46 -7
  170. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  171. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  172. package/dist/schema/state/sqlite/column-spec.js +30 -12
  173. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  174. package/dist/schema/state/sqlite/column-spec.test.js +23 -14
  175. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  176. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -1
  177. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  178. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +23 -6
  179. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  180. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +14 -8
  181. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  182. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +5 -3
  183. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  184. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  185. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +2 -1
  186. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  187. package/dist/schema/state/sqlite/mod.d.ts +3 -3
  188. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  189. package/dist/schema/state/sqlite/mod.js +3 -3
  190. package/dist/schema/state/sqlite/mod.js.map +1 -1
  191. package/dist/schema/state/sqlite/query-builder/api.d.ts +17 -10
  192. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  193. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  194. package/dist/schema/state/sqlite/query-builder/astToSql.js +22 -15
  195. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  196. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  197. package/dist/schema/state/sqlite/query-builder/impl.js +6 -3
  198. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  199. package/dist/schema/state/sqlite/query-builder/impl.test.js +252 -88
  200. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  201. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  202. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  203. package/dist/schema/state/sqlite/schema-helpers.js +22 -12
  204. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  205. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  206. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  207. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  208. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  209. package/dist/schema/state/sqlite/{system-tables.d.ts → system-tables/eventlog-tables.d.ts} +63 -456
  210. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
  211. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
  212. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
  213. package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
  214. package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
  215. package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
  216. package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
  217. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +456 -0
  218. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
  219. package/dist/schema/state/sqlite/system-tables/state-tables.js +55 -0
  220. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
  221. package/dist/schema/state/sqlite/table-def.d.ts +4 -4
  222. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  223. package/dist/schema/state/sqlite/table-def.js +2 -2
  224. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  225. package/dist/schema/state/sqlite/table-def.test.js +80 -0
  226. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  227. package/dist/schema/unknown-events.d.ts +47 -0
  228. package/dist/schema/unknown-events.d.ts.map +1 -0
  229. package/dist/schema/unknown-events.js +69 -0
  230. package/dist/schema/unknown-events.js.map +1 -0
  231. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
  232. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
  233. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
  234. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
  235. package/dist/schema-management/migrations.d.ts +32 -2
  236. package/dist/schema-management/migrations.d.ts.map +1 -1
  237. package/dist/schema-management/migrations.js +37 -5
  238. package/dist/schema-management/migrations.js.map +1 -1
  239. package/dist/schema-management/validate-schema.d.ts +3 -3
  240. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  241. package/dist/schema-management/validate-schema.js +2 -2
  242. package/dist/schema-management/validate-schema.js.map +1 -1
  243. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  244. package/dist/sql-queries/sql-queries.js +11 -1
  245. package/dist/sql-queries/sql-queries.js.map +1 -1
  246. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  247. package/dist/sql-queries/sql-query-builder.js +2 -1
  248. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  249. package/dist/sqlite-types.d.ts +3 -3
  250. package/dist/sqlite-types.d.ts.map +1 -1
  251. package/dist/sync/ClientSessionSyncProcessor.d.ts +11 -13
  252. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  253. package/dist/sync/ClientSessionSyncProcessor.js +45 -42
  254. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  255. package/dist/sync/errors.d.ts +66 -0
  256. package/dist/sync/errors.d.ts.map +1 -0
  257. package/dist/sync/errors.js +36 -0
  258. package/dist/sync/errors.js.map +1 -0
  259. package/dist/sync/index.d.ts +3 -0
  260. package/dist/sync/index.d.ts.map +1 -1
  261. package/dist/sync/index.js +3 -0
  262. package/dist/sync/index.js.map +1 -1
  263. package/dist/sync/mock-sync-backend.d.ts +23 -0
  264. package/dist/sync/mock-sync-backend.d.ts.map +1 -0
  265. package/dist/sync/mock-sync-backend.js +114 -0
  266. package/dist/sync/mock-sync-backend.js.map +1 -0
  267. package/dist/sync/next/compact-events.d.ts.map +1 -1
  268. package/dist/sync/next/compact-events.js +6 -7
  269. package/dist/sync/next/compact-events.js.map +1 -1
  270. package/dist/sync/next/facts.d.ts +5 -5
  271. package/dist/sync/next/facts.d.ts.map +1 -1
  272. package/dist/sync/next/facts.js +1 -2
  273. package/dist/sync/next/facts.js.map +1 -1
  274. package/dist/sync/next/history-dag-common.d.ts +54 -15
  275. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  276. package/dist/sync/next/history-dag-common.js +198 -9
  277. package/dist/sync/next/history-dag-common.js.map +1 -1
  278. package/dist/sync/next/history-dag.d.ts.map +1 -1
  279. package/dist/sync/next/history-dag.js +10 -8
  280. package/dist/sync/next/history-dag.js.map +1 -1
  281. package/dist/sync/next/rebase-events.d.ts +5 -5
  282. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  283. package/dist/sync/next/rebase-events.js +5 -5
  284. package/dist/sync/next/rebase-events.js.map +1 -1
  285. package/dist/sync/next/test/event-fixtures.d.ts +2 -2
  286. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  287. package/dist/sync/next/test/event-fixtures.js +9 -9
  288. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  289. package/dist/sync/sync-backend-kv.d.ts +7 -0
  290. package/dist/sync/sync-backend-kv.d.ts.map +1 -0
  291. package/dist/sync/sync-backend-kv.js +18 -0
  292. package/dist/sync/sync-backend-kv.js.map +1 -0
  293. package/dist/sync/sync-backend.d.ts +105 -0
  294. package/dist/sync/sync-backend.d.ts.map +1 -0
  295. package/dist/sync/sync-backend.js +61 -0
  296. package/dist/sync/sync-backend.js.map +1 -0
  297. package/dist/sync/sync.d.ts +9 -86
  298. package/dist/sync/sync.d.ts.map +1 -1
  299. package/dist/sync/sync.js +2 -27
  300. package/dist/sync/sync.js.map +1 -1
  301. package/dist/sync/syncstate.d.ts +57 -44
  302. package/dist/sync/syncstate.d.ts.map +1 -1
  303. package/dist/sync/syncstate.js +50 -45
  304. package/dist/sync/syncstate.js.map +1 -1
  305. package/dist/sync/syncstate.test.js +83 -46
  306. package/dist/sync/syncstate.test.js.map +1 -1
  307. package/dist/sync/transport-chunking.d.ts +36 -0
  308. package/dist/sync/transport-chunking.d.ts.map +1 -0
  309. package/dist/sync/transport-chunking.js +56 -0
  310. package/dist/sync/transport-chunking.js.map +1 -0
  311. package/dist/sync/validate-push-payload.d.ts +2 -2
  312. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  313. package/dist/sync/validate-push-payload.js +6 -6
  314. package/dist/sync/validate-push-payload.js.map +1 -1
  315. package/dist/testing/event-factory.d.ts +68 -0
  316. package/dist/testing/event-factory.d.ts.map +1 -0
  317. package/dist/testing/event-factory.js +78 -0
  318. package/dist/testing/event-factory.js.map +1 -0
  319. package/dist/testing/mod.d.ts +2 -0
  320. package/dist/testing/mod.d.ts.map +1 -0
  321. package/dist/testing/mod.js +2 -0
  322. package/dist/testing/mod.js.map +1 -0
  323. package/dist/version.d.ts +16 -6
  324. package/dist/version.d.ts.map +1 -1
  325. package/dist/version.js +16 -6
  326. package/dist/version.js.map +1 -1
  327. package/package.json +7 -8
  328. package/src/ClientSessionLeaderThreadProxy.ts +17 -12
  329. package/src/adapter-types.ts +18 -6
  330. package/src/debug-info.ts +37 -6
  331. package/src/devtools/devtools-messages-client-session.ts +2 -2
  332. package/src/devtools/devtools-messages-common.ts +1 -8
  333. package/src/devtools/devtools-messages-leader.ts +8 -8
  334. package/src/devtools/devtools-sessioninfo.ts +8 -5
  335. package/src/devtools/mod.ts +11 -2
  336. package/src/errors.ts +38 -11
  337. package/src/index.ts +2 -1
  338. package/src/leader-thread/LeaderSyncProcessor.ts +242 -103
  339. package/src/leader-thread/eventlog.ts +33 -34
  340. package/src/leader-thread/leader-worker-devtools.ts +50 -54
  341. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  342. package/src/leader-thread/make-leader-thread-layer.ts +156 -37
  343. package/src/leader-thread/materialize-event.ts +37 -12
  344. package/src/leader-thread/recreate-db.ts +15 -7
  345. package/src/leader-thread/shutdown-channel.ts +16 -2
  346. package/src/leader-thread/types.ts +21 -19
  347. package/src/logging.ts +62 -0
  348. package/src/make-client-session.ts +9 -3
  349. package/src/materializer-helper.ts +27 -10
  350. package/src/rematerialize-from-eventlog.ts +37 -27
  351. package/src/schema/EventDef/define.ts +201 -0
  352. package/src/schema/EventDef/event-def.ts +120 -0
  353. package/src/schema/EventDef/facts.ts +135 -0
  354. package/src/schema/EventDef/materializer.ts +172 -0
  355. package/src/schema/EventDef/mod.ts +4 -0
  356. package/src/schema/EventSequenceNumber/client.ts +257 -0
  357. package/src/schema/EventSequenceNumber/global.ts +19 -0
  358. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  359. package/src/schema/EventSequenceNumber.test.ts +70 -52
  360. package/src/schema/LiveStoreEvent/client.ts +221 -0
  361. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  362. package/src/schema/LiveStoreEvent/global.ts +45 -0
  363. package/src/schema/LiveStoreEvent/input.ts +63 -0
  364. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  365. package/src/schema/events.ts +1 -1
  366. package/src/schema/mod.ts +6 -4
  367. package/src/schema/schema.ts +39 -3
  368. package/src/schema/state/sqlite/client-document-def.test.ts +19 -2
  369. package/src/schema/state/sqlite/client-document-def.ts +120 -8
  370. package/src/schema/state/sqlite/column-annotations.test.ts +1 -1
  371. package/src/schema/state/sqlite/column-annotations.ts +16 -6
  372. package/src/schema/state/sqlite/column-def.test.ts +60 -7
  373. package/src/schema/state/sqlite/column-def.ts +88 -21
  374. package/src/schema/state/sqlite/column-spec.test.ts +29 -16
  375. package/src/schema/state/sqlite/column-spec.ts +36 -11
  376. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +26 -6
  377. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +29 -12
  378. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +2 -1
  379. package/src/schema/state/sqlite/mod.ts +4 -3
  380. package/src/schema/state/sqlite/query-builder/api.ts +19 -10
  381. package/src/schema/state/sqlite/query-builder/astToSql.ts +23 -14
  382. package/src/schema/state/sqlite/query-builder/impl.test.ts +305 -92
  383. package/src/schema/state/sqlite/query-builder/impl.ts +8 -3
  384. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  385. package/src/schema/state/sqlite/schema-helpers.ts +28 -20
  386. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  387. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  388. package/src/schema/state/sqlite/system-tables/state-tables.ts +69 -0
  389. package/src/schema/state/sqlite/table-def.test.ts +101 -0
  390. package/src/schema/state/sqlite/table-def.ts +9 -8
  391. package/src/schema/unknown-events.ts +131 -0
  392. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +86 -0
  393. package/src/schema-management/migrations.ts +41 -8
  394. package/src/schema-management/validate-schema.ts +3 -3
  395. package/src/sql-queries/sql-queries.ts +9 -1
  396. package/src/sql-queries/sql-query-builder.ts +2 -1
  397. package/src/sqlite-types.ts +3 -3
  398. package/src/sync/ClientSessionSyncProcessor.ts +69 -62
  399. package/src/sync/errors.ts +38 -0
  400. package/src/sync/index.ts +3 -0
  401. package/src/sync/mock-sync-backend.ts +184 -0
  402. package/src/sync/next/compact-events.ts +6 -7
  403. package/src/sync/next/facts.ts +7 -9
  404. package/src/sync/next/history-dag-common.ts +277 -26
  405. package/src/sync/next/history-dag.ts +16 -10
  406. package/src/sync/next/rebase-events.ts +11 -11
  407. package/src/sync/next/test/event-fixtures.ts +11 -11
  408. package/src/sync/sync-backend-kv.ts +22 -0
  409. package/src/sync/sync-backend.ts +185 -0
  410. package/src/sync/sync.ts +9 -91
  411. package/src/sync/syncstate.test.ts +96 -52
  412. package/src/sync/syncstate.ts +69 -58
  413. package/src/sync/transport-chunking.ts +90 -0
  414. package/src/sync/validate-push-payload.ts +8 -9
  415. package/src/testing/event-factory.ts +131 -0
  416. package/src/testing/mod.ts +1 -0
  417. package/src/version.ts +16 -6
  418. package/dist/schema/EventDef.d.ts +0 -123
  419. package/dist/schema/EventDef.d.ts.map +0 -1
  420. package/dist/schema/EventDef.js +0 -46
  421. package/dist/schema/EventDef.js.map +0 -1
  422. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  423. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  424. package/dist/schema/EventSequenceNumber.js +0 -139
  425. package/dist/schema/EventSequenceNumber.js.map +0 -1
  426. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  427. package/dist/schema/LiveStoreEvent.js.map +0 -1
  428. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  429. package/dist/schema/state/sqlite/system-tables.js +0 -79
  430. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  431. package/dist/schema-management/migrations.test.d.ts +0 -2
  432. package/dist/schema-management/migrations.test.d.ts.map +0 -1
  433. package/dist/schema-management/migrations.test.js +0 -52
  434. package/dist/schema-management/migrations.test.js.map +0 -1
  435. package/dist/sync/next/graphology.d.ts +0 -8
  436. package/dist/sync/next/graphology.d.ts.map +0 -1
  437. package/dist/sync/next/graphology.js +0 -30
  438. package/dist/sync/next/graphology.js.map +0 -1
  439. package/dist/sync/next/graphology_.d.ts +0 -3
  440. package/dist/sync/next/graphology_.d.ts.map +0 -1
  441. package/dist/sync/next/graphology_.js +0 -3
  442. package/dist/sync/next/graphology_.js.map +0 -1
  443. package/src/schema/EventDef.ts +0 -219
  444. package/src/schema/EventSequenceNumber.ts +0 -199
  445. package/src/schema/LiveStoreEvent.ts +0 -287
  446. package/src/schema/state/sqlite/system-tables.ts +0 -104
  447. package/src/sync/next/ambient.d.ts +0 -3
  448. package/src/sync/next/graphology.ts +0 -41
  449. package/src/sync/next/graphology_.ts +0 -2
package/dist/sync/sync.js CHANGED
@@ -1,28 +1,3 @@
1
- import { Schema } from '@livestore/utils/effect';
2
- import * as EventSequenceNumber from "../schema/EventSequenceNumber.js";
3
- export class IsOfflineError extends Schema.TaggedError()('IsOfflineError', {}) {
4
- }
5
- // TODO gt rid of this error in favour of SyncError
6
- export class InvalidPushError extends Schema.TaggedError()('InvalidPushError', {
7
- reason: Schema.Union(Schema.TaggedStruct('Unexpected', {
8
- message: Schema.String,
9
- }), Schema.TaggedStruct('ServerAhead', {
10
- minimumExpectedNum: Schema.Number,
11
- providedNum: Schema.Number,
12
- })),
13
- }) {
14
- }
15
- // TODO gt rid of this error in favour of SyncError
16
- export class InvalidPullError extends Schema.TaggedError()('InvalidPullError', {
17
- message: Schema.String,
18
- }) {
19
- }
20
- // TODO gt rid of this error in favour of SyncError
21
- export class LeaderAheadError extends Schema.TaggedError()('LeaderAheadError', {
22
- minimumExpectedNum: EventSequenceNumber.EventSequenceNumber,
23
- providedNum: EventSequenceNumber.EventSequenceNumber,
24
- /** Generation number the client session should use for subsequent pushes */
25
- // nextGeneration: Schema.Number,
26
- }) {
27
- }
1
+ export * from "./errors.js";
2
+ export * as SyncBackend from "./sync-backend.js";
28
3
  //# sourceMappingURL=sync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAIhD,OAAO,KAAK,mBAAmB,MAAM,kCAAkC,CAAA;AA6EvE,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,WAAW,EAAkB,CAAC,gBAAgB,EAAE,EAAE,CAAC;CAAG;AAEjG,mDAAmD;AACnD,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,MAAM,EAAE,MAAM,CAAC,KAAK,CAClB,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE;QAChC,OAAO,EAAE,MAAM,CAAC,MAAM;KACvB,CAAC,EACF,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE;QACjC,kBAAkB,EAAE,MAAM,CAAC,MAAM;QACjC,WAAW,EAAE,MAAM,CAAC,MAAM;KAC3B,CAAC,CACH;CACF,CAAC;CAAG;AAEL,mDAAmD;AACnD,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AAEL,mDAAmD;AACnD,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,kBAAkB,EAAE,mBAAmB,CAAC,mBAAmB;IAC3D,WAAW,EAAE,mBAAmB,CAAC,mBAAmB;IACpD,4EAA4E;IAC5E,iCAAiC;CAClC,CAAC;CAAG"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAA"}
@@ -1,33 +1,42 @@
1
1
  import { Schema } from '@livestore/utils/effect';
2
- import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts';
2
+ import * as EventSequenceNumber from '../schema/EventSequenceNumber/mod.ts';
3
+ import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts';
3
4
  declare const SyncState_base: Schema.Class<SyncState, {
4
- pending: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
5
+ pending: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
5
6
  /** What this node expects the next upstream node to have as its own local head */
6
7
  upstreamHead: Schema.Struct<{
7
8
  global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
8
9
  client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
9
10
  rebaseGeneration: typeof Schema.Int;
10
- }>;
11
+ }> & {
12
+ make: (seqNum: EventSequenceNumber.Client.CompositeInput) => EventSequenceNumber.Client.Composite;
13
+ };
11
14
  /** Equivalent to `pending.at(-1)?.id` if there are pending events */
12
15
  localHead: Schema.Struct<{
13
16
  global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
14
17
  client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
15
18
  rebaseGeneration: typeof Schema.Int;
16
- }>;
19
+ }> & {
20
+ make: (seqNum: EventSequenceNumber.Client.CompositeInput) => EventSequenceNumber.Client.Composite;
21
+ };
17
22
  }, Schema.Struct.Encoded<{
18
- pending: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
23
+ pending: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
19
24
  /** What this node expects the next upstream node to have as its own local head */
20
25
  upstreamHead: Schema.Struct<{
21
26
  global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
22
27
  client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
23
28
  rebaseGeneration: typeof Schema.Int;
24
- }>;
29
+ }> & {
30
+ make: (seqNum: EventSequenceNumber.Client.CompositeInput) => EventSequenceNumber.Client.Composite;
31
+ };
25
32
  /** Equivalent to `pending.at(-1)?.id` if there are pending events */
26
33
  localHead: Schema.Struct<{
27
34
  global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
28
35
  client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
29
36
  rebaseGeneration: typeof Schema.Int;
30
- }>;
37
+ }> & {
38
+ make: (seqNum: EventSequenceNumber.Client.CompositeInput) => EventSequenceNumber.Client.Composite;
39
+ };
31
40
  }>, never, {
32
41
  readonly upstreamHead: {
33
42
  readonly global: number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">;
@@ -41,7 +50,7 @@ declare const SyncState_base: Schema.Class<SyncState, {
41
50
  readonly rebaseGeneration: number;
42
51
  };
43
52
  } & {
44
- readonly pending: readonly LiveStoreEvent.EncodedWithMeta[];
53
+ readonly pending: readonly LiveStoreEvent.Client.EncodedWithMeta[];
45
54
  }, {}, {}>;
46
55
  /**
47
56
  * SyncState represents the current sync state of a sync node relative to an upstream node.
@@ -54,7 +63,7 @@ declare const SyncState_base: Schema.Class<SyncState, {
54
63
  * +------------------------+
55
64
  * ▼ ▼
56
65
  * Upstream Head Local Head
57
- * (1,0) (1,1), (1,2), (2,0)
66
+ * e1 e1.1, e1.2, e2
58
67
  * ```
59
68
  *
60
69
  * **Pending Events**: Events awaiting acknowledgment from the upstream.
@@ -70,7 +79,7 @@ declare const SyncState_base: Schema.Class<SyncState, {
70
79
  * Invariants:
71
80
  * 1. **Chain Continuity**: Each event must reference its immediate parent.
72
81
  * 2. **Head Ordering**: Upstream Head ≤ Local Head.
73
- * 3. **Event number sequence**: Must follow the pattern (1,0)(1,1)(1,2)(2,0).
82
+ * 3. **Event number sequence**: Must follow the pattern e1e1.1→e1.2→e2.
74
83
  *
75
84
  * A few further notes to help form an intuition:
76
85
  * - The goal is to keep the pending events as small as possible (i.e. to have synced with the next upstream node)
@@ -85,9 +94,9 @@ export declare class SyncState extends SyncState_base {
85
94
  }
86
95
  declare const PayloadUpstreamRebase_base: Schema.TaggedStruct<"upstream-rebase", {
87
96
  /** Events which need to be rolled back */
88
- rollbackEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
97
+ rollbackEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
89
98
  /** Events which need to be applied after the rollback (already rebased by the upstream node) */
90
- newEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
99
+ newEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
91
100
  }>;
92
101
  /**
93
102
  * This payload propagates a rebase from the upstream node
@@ -95,12 +104,12 @@ declare const PayloadUpstreamRebase_base: Schema.TaggedStruct<"upstream-rebase",
95
104
  export declare class PayloadUpstreamRebase extends PayloadUpstreamRebase_base {
96
105
  }
97
106
  declare const PayloadUpstreamAdvance_base: Schema.TaggedStruct<"upstream-advance", {
98
- newEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
107
+ newEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
99
108
  }>;
100
109
  export declare class PayloadUpstreamAdvance extends PayloadUpstreamAdvance_base {
101
110
  }
102
111
  declare const PayloadLocalPush_base: Schema.TaggedStruct<"local-push", {
103
- newEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
112
+ newEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
104
113
  }>;
105
114
  export declare class PayloadLocalPush extends PayloadLocalPush_base {
106
115
  }
@@ -119,14 +128,14 @@ declare const MergeContext_base: Schema.Class<MergeContext, {
119
128
  }>, never, {
120
129
  readonly payload: {
121
130
  readonly _tag: "upstream-rebase";
122
- readonly rollbackEvents: readonly LiveStoreEvent.EncodedWithMeta[];
123
- readonly newEvents: readonly LiveStoreEvent.EncodedWithMeta[];
131
+ readonly rollbackEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
132
+ readonly newEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
124
133
  } | {
125
134
  readonly _tag: "upstream-advance";
126
- readonly newEvents: readonly LiveStoreEvent.EncodedWithMeta[];
135
+ readonly newEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
127
136
  } | {
128
137
  readonly _tag: "local-push";
129
- readonly newEvents: readonly LiveStoreEvent.EncodedWithMeta[];
138
+ readonly newEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
130
139
  };
131
140
  } & {
132
141
  readonly syncState: SyncState;
@@ -138,27 +147,27 @@ export declare class MergeContext extends MergeContext_base {
138
147
  declare const MergeResultAdvance_base: Schema.Class<MergeResultAdvance, {
139
148
  _tag: Schema.Literal<["advance"]>;
140
149
  newSyncState: typeof SyncState;
141
- newEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
150
+ newEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
142
151
  /** Events which were previously pending but are now confirmed */
143
- confirmedEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
152
+ confirmedEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
144
153
  mergeContext: typeof MergeContext;
145
154
  }, Schema.Struct.Encoded<{
146
155
  _tag: Schema.Literal<["advance"]>;
147
156
  newSyncState: typeof SyncState;
148
- newEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
157
+ newEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
149
158
  /** Events which were previously pending but are now confirmed */
150
- confirmedEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
159
+ confirmedEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
151
160
  mergeContext: typeof MergeContext;
152
161
  }>, never, {
153
162
  readonly _tag: "advance";
154
163
  } & {
155
- readonly newEvents: readonly LiveStoreEvent.EncodedWithMeta[];
164
+ readonly newEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
156
165
  } & {
157
166
  readonly newSyncState: SyncState;
158
167
  } & {
159
168
  readonly mergeContext: MergeContext;
160
169
  } & {
161
- readonly confirmedEvents: readonly LiveStoreEvent.EncodedWithMeta[];
170
+ readonly confirmedEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
162
171
  }, {}, {}>;
163
172
  export declare class MergeResultAdvance extends MergeResultAdvance_base {
164
173
  toJSON: () => any;
@@ -166,23 +175,23 @@ export declare class MergeResultAdvance extends MergeResultAdvance_base {
166
175
  declare const MergeResultRebase_base: Schema.Class<MergeResultRebase, {
167
176
  _tag: Schema.Literal<["rebase"]>;
168
177
  newSyncState: typeof SyncState;
169
- newEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
178
+ newEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
170
179
  /** Events which need to be rolled back */
171
- rollbackEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
180
+ rollbackEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
172
181
  mergeContext: typeof MergeContext;
173
182
  }, Schema.Struct.Encoded<{
174
183
  _tag: Schema.Literal<["rebase"]>;
175
184
  newSyncState: typeof SyncState;
176
- newEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
185
+ newEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
177
186
  /** Events which need to be rolled back */
178
- rollbackEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
187
+ rollbackEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
179
188
  mergeContext: typeof MergeContext;
180
189
  }>, never, {
181
190
  readonly _tag: "rebase";
182
191
  } & {
183
- readonly rollbackEvents: readonly LiveStoreEvent.EncodedWithMeta[];
192
+ readonly rollbackEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
184
193
  } & {
185
- readonly newEvents: readonly LiveStoreEvent.EncodedWithMeta[];
194
+ readonly newEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
186
195
  } & {
187
196
  readonly newSyncState: SyncState;
188
197
  } & {
@@ -198,7 +207,9 @@ declare const MergeResultReject_base: Schema.Class<MergeResultReject, {
198
207
  global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
199
208
  client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
200
209
  rebaseGeneration: typeof Schema.Int;
201
- }>;
210
+ }> & {
211
+ make: (seqNum: EventSequenceNumber.Client.CompositeInput) => EventSequenceNumber.Client.Composite;
212
+ };
202
213
  mergeContext: typeof MergeContext;
203
214
  }, Schema.Struct.Encoded<{
204
215
  _tag: Schema.Literal<["reject"]>;
@@ -207,7 +218,9 @@ declare const MergeResultReject_base: Schema.Class<MergeResultReject, {
207
218
  global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
208
219
  client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
209
220
  rebaseGeneration: typeof Schema.Int;
210
- }>;
221
+ }> & {
222
+ make: (seqNum: EventSequenceNumber.Client.CompositeInput) => EventSequenceNumber.Client.Composite;
223
+ };
211
224
  mergeContext: typeof MergeContext;
212
225
  }>, never, {
213
226
  readonly _tag: "reject";
@@ -223,28 +236,28 @@ declare const MergeResultReject_base: Schema.Class<MergeResultReject, {
223
236
  export declare class MergeResultReject extends MergeResultReject_base {
224
237
  toJSON: () => any;
225
238
  }
226
- declare const MergeResultUnexpectedError_base: Schema.Class<MergeResultUnexpectedError, {
227
- _tag: Schema.Literal<["unexpected-error"]>;
239
+ declare const MergeResultUnknownError_base: Schema.Class<MergeResultUnknownError, {
240
+ _tag: Schema.Literal<["unknown-error"]>;
228
241
  message: typeof Schema.String;
229
242
  }, Schema.Struct.Encoded<{
230
- _tag: Schema.Literal<["unexpected-error"]>;
243
+ _tag: Schema.Literal<["unknown-error"]>;
231
244
  message: typeof Schema.String;
232
245
  }>, never, {
233
- readonly _tag: "unexpected-error";
246
+ readonly _tag: "unknown-error";
234
247
  } & {
235
248
  readonly message: string;
236
249
  }, {}, {}>;
237
- export declare class MergeResultUnexpectedError extends MergeResultUnexpectedError_base {
250
+ export declare class MergeResultUnknownError extends MergeResultUnknownError_base {
238
251
  }
239
- declare const MergeResult_base: Schema.Union<[typeof MergeResultAdvance, typeof MergeResultRebase, typeof MergeResultReject, typeof MergeResultUnexpectedError]>;
252
+ declare const MergeResult_base: Schema.Union<[typeof MergeResultAdvance, typeof MergeResultRebase, typeof MergeResultReject, typeof MergeResultUnknownError]>;
240
253
  export declare class MergeResult extends MergeResult_base {
241
254
  }
242
255
  export declare const payloadFromMergeResult: (mergeResult: typeof MergeResultAdvance.Type | typeof MergeResultRebase.Type) => typeof PayloadUpstream.Type;
243
256
  export declare const merge: ({ syncState, payload, isClientEvent, isEqualEvent, ignoreClientEvents, }: {
244
257
  syncState: SyncState;
245
258
  payload: typeof Payload.Type;
246
- isClientEvent: (event: LiveStoreEvent.EncodedWithMeta) => boolean;
247
- isEqualEvent: (a: LiveStoreEvent.EncodedWithMeta, b: LiveStoreEvent.EncodedWithMeta) => boolean;
259
+ isClientEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean;
260
+ isEqualEvent: (a: LiveStoreEvent.Client.EncodedWithMeta, b: LiveStoreEvent.Client.EncodedWithMeta) => boolean;
248
261
  /** This is used in the leader which should ignore client events when receiving an upstream-advance payload */
249
262
  ignoreClientEvents?: boolean;
250
263
  }) => typeof MergeResult.Type;
@@ -253,10 +266,10 @@ export declare const merge: ({ syncState, payload, isClientEvent, isEqualEvent,
253
266
  * by comparing each event in `existingEvents` to the corresponding event in `incomingEvents`
254
267
  */
255
268
  export declare const findDivergencePoint: ({ existingEvents, incomingEvents, isEqualEvent, isClientEvent, ignoreClientEvents, }: {
256
- existingEvents: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>;
257
- incomingEvents: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>;
258
- isEqualEvent: (a: LiveStoreEvent.EncodedWithMeta, b: LiveStoreEvent.EncodedWithMeta) => boolean;
259
- isClientEvent: (event: LiveStoreEvent.EncodedWithMeta) => boolean;
269
+ existingEvents: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>;
270
+ incomingEvents: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>;
271
+ isEqualEvent: (a: LiveStoreEvent.Client.EncodedWithMeta, b: LiveStoreEvent.Client.EncodedWithMeta) => boolean;
272
+ isClientEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean;
260
273
  ignoreClientEvents: boolean;
261
274
  }) => number;
262
275
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"syncstate.d.ts","sourceRoot":"","sources":["../../src/sync/syncstate.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGtE,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;;;IAyC3D,kFAAkF;;;;;;IAElF,qEAAqE;;;;;;;;IAFrE,kFAAkF;;;;;;IAElF,qEAAqE;;;;;;;;;;;;;;;;;;;;;AAzCvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,qBAAa,SAAU,SAAQ,cAM7B;IACA,MAAM,QAAO,GAAG,CAId;CACH;;IAMC,0CAA0C;;IAE1C,gGAAgG;;;AANlG;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,0BAKzC;CAAG;;;;AAEL,qBAAa,sBAAuB,SAAQ,2BAE1C;CAAG;;;;AAEL,qBAAa,gBAAiB,SAAQ,qBAEpC;CAAG;;AAEL,qBAAa,OAAQ,SAAQ,YAA6E;CAAG;;AAE7G,qBAAa,eAAgB,SAAQ,oBAA2D;CAAG;;;;;;;;;;;;;;;;;;;;;;AAEnG,uCAAuC;AACvC,qBAAa,YAAa,SAAQ,iBAGhC;IACA,MAAM,QAAO,GAAG,CAqBf;CACF;;;;;IAMC,iEAAiE;;;;;;;IAAjE,iEAAiE;;;;;;;;;;;;;;AAJnE,qBAAa,kBAAmB,SAAQ,uBAOtC;IACA,MAAM,QAAO,GAAG,CAQf;CACF;;;;;IAMC,0CAA0C;;;;;;;IAA1C,0CAA0C;;;;;;;;;;;;;;AAJ5C,qBAAa,iBAAkB,SAAQ,sBAOrC;IACA,MAAM,QAAO,GAAG,CAQf;CACF;;;IAIC,mDAAmD;;;;;;;;;IAAnD,mDAAmD;;;;;;;;;;;;;;;;;;AAFrD,qBAAa,iBAAkB,SAAQ,sBAKrC;IACA,MAAM,QAAO,GAAG,CAMf;CACF;;;;;;;;;;;;AAED,qBAAa,0BAA2B,SAAQ,+BAG9C;CAAG;;AAEL,qBAAa,WAAY,SAAQ,gBAKhC;CAAG;AAEJ,eAAO,MAAM,sBAAsB,GACjC,aAAa,OAAO,kBAAkB,CAAC,IAAI,GAAG,OAAO,iBAAiB,CAAC,IAAI,KAC1E,OAAO,eAAe,CAAC,IAYvB,CAAA;AAkBH,eAAO,MAAM,KAAK,GAAI,0EAMnB;IACD,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,OAAO,OAAO,CAAC,IAAI,CAAA;IAC5B,aAAa,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,eAAe,KAAK,OAAO,CAAA;IACjE,YAAY,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,eAAe,EAAE,CAAC,EAAE,cAAc,CAAC,eAAe,KAAK,OAAO,CAAA;IAC/F,8GAA8G;IAC9G,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,KAAG,OAAO,WAAW,CAAC,IAmNtB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,sFAMjC;IACD,cAAc,EAAE,aAAa,CAAC,cAAc,CAAC,eAAe,CAAC,CAAA;IAC7D,cAAc,EAAE,aAAa,CAAC,cAAc,CAAC,eAAe,CAAC,CAAA;IAC7D,YAAY,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,eAAe,EAAE,CAAC,EAAE,cAAc,CAAC,eAAe,KAAK,OAAO,CAAA;IAC/F,aAAa,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,eAAe,KAAK,OAAO,CAAA;IACjE,kBAAkB,EAAE,OAAO,CAAA;CAC5B,KAAG,MAyBH,CAAA"}
1
+ {"version":3,"file":"syncstate.d.ts","sourceRoot":"","sources":["../../src/sync/syncstate.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEtE,OAAO,KAAK,mBAAmB,MAAM,sCAAsC,CAAA;AAC3E,OAAO,KAAK,cAAc,MAAM,iCAAiC,CAAA;;;IAyC/D,kFAAkF;;;;;;;;IAElF,qEAAqE;;;;;;;;;;IAFrE,kFAAkF;;;;;;;;IAElF,qEAAqE;;;;;;;;;;;;;;;;;;;;;;;AAzCvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,qBAAa,SAAU,SAAQ,cAM7B;IACA,MAAM,QAAO,GAAG,CAId;CACH;;IAMC,0CAA0C;;IAE1C,gGAAgG;;;AANlG;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,0BAKzC;CAAG;;;;AAEL,qBAAa,sBAAuB,SAAQ,2BAE1C;CAAG;;;;AAEL,qBAAa,gBAAiB,SAAQ,qBAEpC;CAAG;;AAEL,qBAAa,OAAQ,SAAQ,YAA6E;CAAG;;AAE7G,qBAAa,eAAgB,SAAQ,oBAA2D;CAAG;;;;;;;;;;;;;;;;;;;;;;AAEnG,uCAAuC;AACvC,qBAAa,YAAa,SAAQ,iBAGhC;IACA,MAAM,QAAO,GAAG,CAqBf;CACF;;;;;IAMC,iEAAiE;;;;;;;IAAjE,iEAAiE;;;;;;;;;;;;;;AAJnE,qBAAa,kBAAmB,SAAQ,uBAOtC;IACA,MAAM,QAAO,GAAG,CAQf;CACF;;;;;IAMC,0CAA0C;;;;;;;IAA1C,0CAA0C;;;;;;;;;;;;;;AAJ5C,qBAAa,iBAAkB,SAAQ,sBAOrC;IACA,MAAM,QAAO,GAAG,CAQf;CACF;;;IAIC,mDAAmD;;;;;;;;;;;IAAnD,mDAAmD;;;;;;;;;;;;;;;;;;;;AAFrD,qBAAa,iBAAkB,SAAQ,sBAKrC;IACA,MAAM,QAAO,GAAG,CAMf;CACF;;;;;;;;;;;;AAED,qBAAa,uBAAwB,SAAQ,4BAG3C;CAAG;;AAEL,qBAAa,WAAY,SAAQ,gBAKhC;CAAG;AAEJ,eAAO,MAAM,sBAAsB,GACjC,aAAa,OAAO,kBAAkB,CAAC,IAAI,GAAG,OAAO,iBAAiB,CAAC,IAAI,KAC1E,OAAO,eAAe,CAAC,IAYvB,CAAA;AAkBH,eAAO,MAAM,KAAK,GAAI,0EAMnB;IACD,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,OAAO,OAAO,CAAC,IAAI,CAAA;IAC5B,aAAa,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,eAAe,KAAK,OAAO,CAAA;IACxE,YAAY,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,eAAe,KAAK,OAAO,CAAA;IAC7G,8GAA8G;IAC9G,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,KAAG,OAAO,WAAW,CAAC,IA0NtB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,sFAMjC;IACD,cAAc,EAAE,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;IACpE,cAAc,EAAE,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;IACpE,YAAY,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,eAAe,KAAK,OAAO,CAAA;IAC7G,aAAa,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,eAAe,KAAK,OAAO,CAAA;IACxE,kBAAkB,EAAE,OAAO,CAAA;CAC5B,KAAG,MAyBH,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { casesHandled, LS_DEV, shouldNeverHappen } from '@livestore/utils';
2
2
  import { Match, ReadonlyArray, Schema } from '@livestore/utils/effect';
3
- import * as EventSequenceNumber from "../schema/EventSequenceNumber.js";
4
- import * as LiveStoreEvent from "../schema/LiveStoreEvent.js";
3
+ import * as EventSequenceNumber from "../schema/EventSequenceNumber/mod.js";
4
+ import * as LiveStoreEvent from "../schema/LiveStoreEvent/mod.js";
5
5
  /**
6
6
  * SyncState represents the current sync state of a sync node relative to an upstream node.
7
7
  * Events flow from local to upstream, with each state maintaining its own event head.
@@ -13,7 +13,7 @@ import * as LiveStoreEvent from "../schema/LiveStoreEvent.js";
13
13
  * +------------------------+
14
14
  * ▼ ▼
15
15
  * Upstream Head Local Head
16
- * (1,0) (1,1), (1,2), (2,0)
16
+ * e1 e1.1, e1.2, e2
17
17
  * ```
18
18
  *
19
19
  * **Pending Events**: Events awaiting acknowledgment from the upstream.
@@ -29,7 +29,7 @@ import * as LiveStoreEvent from "../schema/LiveStoreEvent.js";
29
29
  * Invariants:
30
30
  * 1. **Chain Continuity**: Each event must reference its immediate parent.
31
31
  * 2. **Head Ordering**: Upstream Head ≤ Local Head.
32
- * 3. **Event number sequence**: Must follow the pattern (1,0)(1,1)(1,2)(2,0).
32
+ * 3. **Event number sequence**: Must follow the pattern e1e1.1→e1.2→e2.
33
33
  *
34
34
  * A few further notes to help form an intuition:
35
35
  * - The goal is to keep the pending events as small as possible (i.e. to have synced with the next upstream node)
@@ -40,16 +40,16 @@ import * as LiveStoreEvent from "../schema/LiveStoreEvent.js";
40
40
  * handling cases such as upstream rebase, advance and local push.
41
41
  */
42
42
  export class SyncState extends Schema.Class('SyncState')({
43
- pending: Schema.Array(LiveStoreEvent.EncodedWithMeta),
43
+ pending: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
44
44
  /** What this node expects the next upstream node to have as its own local head */
45
- upstreamHead: EventSequenceNumber.EventSequenceNumber,
45
+ upstreamHead: EventSequenceNumber.Client.Composite,
46
46
  /** Equivalent to `pending.at(-1)?.id` if there are pending events */
47
- localHead: EventSequenceNumber.EventSequenceNumber,
47
+ localHead: EventSequenceNumber.Client.Composite,
48
48
  }) {
49
49
  toJSON = () => ({
50
50
  pending: this.pending.map((e) => e.toJSON()),
51
- upstreamHead: EventSequenceNumber.toString(this.upstreamHead),
52
- localHead: EventSequenceNumber.toString(this.localHead),
51
+ upstreamHead: EventSequenceNumber.Client.toString(this.upstreamHead),
52
+ localHead: EventSequenceNumber.Client.toString(this.localHead),
53
53
  });
54
54
  }
55
55
  /**
@@ -57,17 +57,17 @@ export class SyncState extends Schema.Class('SyncState')({
57
57
  */
58
58
  export class PayloadUpstreamRebase extends Schema.TaggedStruct('upstream-rebase', {
59
59
  /** Events which need to be rolled back */
60
- rollbackEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
60
+ rollbackEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
61
61
  /** Events which need to be applied after the rollback (already rebased by the upstream node) */
62
- newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
62
+ newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
63
63
  }) {
64
64
  }
65
65
  export class PayloadUpstreamAdvance extends Schema.TaggedStruct('upstream-advance', {
66
- newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
66
+ newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
67
67
  }) {
68
68
  }
69
69
  export class PayloadLocalPush extends Schema.TaggedStruct('local-push', {
70
- newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
70
+ newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
71
71
  }) {
72
72
  }
73
73
  export class Payload extends Schema.Union(PayloadUpstreamRebase, PayloadUpstreamAdvance, PayloadLocalPush) {
@@ -100,9 +100,9 @@ export class MergeContext extends Schema.Class('MergeContext')({
100
100
  export class MergeResultAdvance extends Schema.Class('MergeResultAdvance')({
101
101
  _tag: Schema.Literal('advance'),
102
102
  newSyncState: SyncState,
103
- newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
103
+ newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
104
104
  /** Events which were previously pending but are now confirmed */
105
- confirmedEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
105
+ confirmedEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
106
106
  mergeContext: MergeContext,
107
107
  }) {
108
108
  toJSON = () => {
@@ -118,9 +118,9 @@ export class MergeResultAdvance extends Schema.Class('MergeResultAdvance')({
118
118
  export class MergeResultRebase extends Schema.Class('MergeResultRebase')({
119
119
  _tag: Schema.Literal('rebase'),
120
120
  newSyncState: SyncState,
121
- newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
121
+ newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
122
122
  /** Events which need to be rolled back */
123
- rollbackEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
123
+ rollbackEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
124
124
  mergeContext: MergeContext,
125
125
  }) {
126
126
  toJSON = () => {
@@ -136,23 +136,23 @@ export class MergeResultRebase extends Schema.Class('MergeResultRebase')({
136
136
  export class MergeResultReject extends Schema.Class('MergeResultReject')({
137
137
  _tag: Schema.Literal('reject'),
138
138
  /** The minimum id that the new events must have */
139
- expectedMinimumId: EventSequenceNumber.EventSequenceNumber,
139
+ expectedMinimumId: EventSequenceNumber.Client.Composite,
140
140
  mergeContext: MergeContext,
141
141
  }) {
142
142
  toJSON = () => {
143
143
  return {
144
144
  _tag: this._tag,
145
- expectedMinimumId: EventSequenceNumber.toString(this.expectedMinimumId),
145
+ expectedMinimumId: EventSequenceNumber.Client.toString(this.expectedMinimumId),
146
146
  mergeContext: this.mergeContext.toJSON(),
147
147
  };
148
148
  };
149
149
  }
150
- export class MergeResultUnexpectedError extends Schema.Class('MergeResultUnexpectedError')({
151
- _tag: Schema.Literal('unexpected-error'),
150
+ export class MergeResultUnknownError extends Schema.Class('MergeResultUnknownError')({
151
+ _tag: Schema.Literal('unknown-error'),
152
152
  message: Schema.String,
153
153
  }) {
154
154
  }
155
- export class MergeResult extends Schema.Union(MergeResultAdvance, MergeResultRebase, MergeResultReject, MergeResultUnexpectedError) {
155
+ export class MergeResult extends Schema.Union(MergeResultAdvance, MergeResultRebase, MergeResultReject, MergeResultUnknownError) {
156
156
  }
157
157
  export const payloadFromMergeResult = (mergeResult) => Match.value(mergeResult).pipe(Match.tag('advance', (result) => ({
158
158
  _tag: 'upstream-advance',
@@ -162,12 +162,12 @@ export const payloadFromMergeResult = (mergeResult) => Match.value(mergeResult).
162
162
  newEvents: result.newEvents,
163
163
  rollbackEvents: result.rollbackEvents,
164
164
  })), Match.exhaustive);
165
- const unexpectedError = (message) => {
165
+ const unknownError = (message) => {
166
166
  if (LS_DEV) {
167
167
  // biome-ignore lint/suspicious/noDebugger: debug
168
168
  debugger;
169
169
  }
170
- return MergeResultUnexpectedError.make({ _tag: 'unexpected-error', message });
170
+ return MergeResultUnknownError.make({ _tag: 'unknown-error', message });
171
171
  };
172
172
  // TODO Idea: call merge recursively through hierarchy levels
173
173
  /*
@@ -220,14 +220,14 @@ export const merge = ({ syncState, payload, isClientEvent, isEqualEvent, ignoreC
220
220
  }
221
221
  // Validate that newEvents are sorted in ascending order by eventNum
222
222
  for (let i = 1; i < payload.newEvents.length; i++) {
223
- if (EventSequenceNumber.isGreaterThan(payload.newEvents[i - 1].seqNum, payload.newEvents[i].seqNum)) {
224
- return unexpectedError(`Events must be sorted in ascending order by event number. Received: [${payload.newEvents.map((e) => EventSequenceNumber.toString(e.seqNum)).join(', ')}]`);
223
+ if (EventSequenceNumber.Client.isGreaterThan(payload.newEvents[i - 1].seqNum, payload.newEvents[i].seqNum)) {
224
+ return unknownError(`Events must be sorted in ascending order by event number. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`);
225
225
  }
226
226
  }
227
227
  // Validate that incoming events are larger than upstream head
228
- if (EventSequenceNumber.isGreaterThan(syncState.upstreamHead, payload.newEvents[0].seqNum) ||
229
- EventSequenceNumber.isEqual(syncState.upstreamHead, payload.newEvents[0].seqNum)) {
230
- return unexpectedError(`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(', ')}]`);
228
+ if (EventSequenceNumber.Client.isGreaterThan(syncState.upstreamHead, payload.newEvents[0].seqNum) ||
229
+ EventSequenceNumber.Client.isEqual(syncState.upstreamHead, payload.newEvents[0].seqNum)) {
230
+ return unknownError(`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(', ')}]`);
231
231
  }
232
232
  const newUpstreamHead = payload.newEvents.at(-1).seqNum;
233
233
  const divergentPendingIndex = findDivergencePoint({
@@ -263,7 +263,7 @@ export const merge = ({ syncState, payload, isClientEvent, isEqualEvent, ignoreC
263
263
  newSyncState: new SyncState({
264
264
  pending: pendingRemaining,
265
265
  upstreamHead: newUpstreamHead,
266
- localHead: pendingRemaining.at(-1)?.seqNum ?? EventSequenceNumber.max(syncState.localHead, newUpstreamHead),
266
+ localHead: pendingRemaining.at(-1)?.seqNum ?? EventSequenceNumber.Client.max(syncState.localHead, newUpstreamHead),
267
267
  }),
268
268
  newEvents,
269
269
  confirmedEvents: pendingMatching,
@@ -310,9 +310,9 @@ export const merge = ({ syncState, payload, isClientEvent, isEqualEvent, ignoreC
310
310
  }));
311
311
  }
312
312
  const newEventsFirst = payload.newEvents.at(0);
313
- const invalidEventSequenceNumber = EventSequenceNumber.isGreaterThan(newEventsFirst.seqNum, syncState.localHead) === false;
313
+ const invalidEventSequenceNumber = EventSequenceNumber.Client.isGreaterThan(newEventsFirst.seqNum, syncState.localHead) === false;
314
314
  if (invalidEventSequenceNumber) {
315
- const expectedMinimumId = EventSequenceNumber.nextPair({
315
+ const expectedMinimumId = EventSequenceNumber.Client.nextPair({
316
316
  seqNum: syncState.localHead,
317
317
  isClient: true,
318
318
  }).seqNum;
@@ -323,12 +323,17 @@ export const merge = ({ syncState, payload, isClientEvent, isEqualEvent, ignoreC
323
323
  }));
324
324
  }
325
325
  else {
326
+ const nonClientEvents = ignoreClientEvents
327
+ ? payload.newEvents.filter((event) => !isClientEvent(event))
328
+ : payload.newEvents;
329
+ const newPending = [...syncState.pending, ...nonClientEvents];
330
+ const newLocalHead = newPending.at(-1)?.seqNum ?? EventSequenceNumber.Client.max(syncState.localHead, syncState.upstreamHead);
326
331
  return validateMergeResult(MergeResultAdvance.make({
327
332
  _tag: 'advance',
328
333
  newSyncState: new SyncState({
329
- pending: [...syncState.pending, ...payload.newEvents],
334
+ pending: newPending,
330
335
  upstreamHead: syncState.upstreamHead,
331
- localHead: payload.newEvents.at(-1).seqNum,
336
+ localHead: newLocalHead,
332
337
  }),
333
338
  newEvents: payload.newEvents,
334
339
  confirmedEvents: [],
@@ -359,7 +364,7 @@ export const findDivergencePoint = ({ existingEvents, incomingEvents, isEqualEve
359
364
  return -1;
360
365
  const divergencePointEventSequenceNumber = existingEvents[divergencePointWithoutClientEvents].seqNum;
361
366
  // Now find the divergence point in the original array
362
- return existingEvents.findIndex((event) => EventSequenceNumber.isEqual(event.seqNum, divergencePointEventSequenceNumber));
367
+ return existingEvents.findIndex((event) => EventSequenceNumber.Client.isEqual(event.seqNum, divergencePointEventSequenceNumber));
363
368
  }
364
369
  return existingEvents.findIndex((existingEvent, index) => {
365
370
  const incomingEvent = incomingEvents[index];
@@ -391,8 +396,8 @@ const rebaseEvents = ({ events, baseEventSequenceNumber, isClientEvent, }) => {
391
396
  const _flattenMergeResults = (_updateResults) => { };
392
397
  const validatePayload = (payload) => {
393
398
  for (let i = 1; i < payload.newEvents.length; i++) {
394
- if (EventSequenceNumber.isGreaterThanOrEqual(payload.newEvents[i - 1].seqNum, payload.newEvents[i].seqNum)) {
395
- return unexpectedError(`Events must be ordered in monotonically ascending order by eventNum. Received: [${payload.newEvents.map((e) => EventSequenceNumber.toString(e.seqNum)).join(', ')}]`);
399
+ if (EventSequenceNumber.Client.isGreaterThanOrEqual(payload.newEvents[i - 1].seqNum, payload.newEvents[i].seqNum)) {
400
+ return unknownError(`Events must be ordered in monotonically ascending order by eventNum. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`);
396
401
  }
397
402
  }
398
403
  };
@@ -402,8 +407,8 @@ const validateSyncState = (syncState) => {
402
407
  const nextEvent = syncState.pending[i + 1];
403
408
  if (nextEvent === undefined)
404
409
  break; // Reached end of chain
405
- if (EventSequenceNumber.isGreaterThanOrEqual(event.seqNum, nextEvent.seqNum)) {
406
- shouldNeverHappen(`Events must be ordered in monotonically ascending order by eventNum. Received: [${syncState.pending.map((e) => EventSequenceNumber.toString(e.seqNum)).join(', ')}]`, {
410
+ if (EventSequenceNumber.Client.isGreaterThanOrEqual(event.seqNum, nextEvent.seqNum)) {
411
+ shouldNeverHappen(`Events must be ordered in monotonically ascending order by eventNum. Received: [${syncState.pending.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`, {
407
412
  event,
408
413
  nextEvent,
409
414
  });
@@ -412,7 +417,7 @@ const validateSyncState = (syncState) => {
412
417
  const globalIdHasIncreased = nextEvent.seqNum.global > event.seqNum.global;
413
418
  if (globalIdHasIncreased) {
414
419
  if (nextEvent.seqNum.client !== 0) {
415
- shouldNeverHappen(`New global events must point to clientId 0 in the parentSeqNum. Received: (${EventSequenceNumber.toString(nextEvent.seqNum)})`, syncState.pending, {
420
+ shouldNeverHappen(`New global events must point to clientId 0 in the parentSeqNum. Received: (${EventSequenceNumber.Client.toString(nextEvent.seqNum)})`, syncState.pending, {
416
421
  event,
417
422
  nextEvent,
418
423
  });
@@ -420,7 +425,7 @@ const validateSyncState = (syncState) => {
420
425
  }
421
426
  else {
422
427
  // Otherwise, the parentSeqNum must be the same as the previous event's id
423
- if (EventSequenceNumber.isEqual(nextEvent.parentSeqNum, event.seqNum) === false) {
428
+ if (EventSequenceNumber.Client.isEqual(nextEvent.parentSeqNum, event.seqNum) === false) {
424
429
  shouldNeverHappen('Events must be linked in a continuous chain via the parentSeqNum', syncState.pending, {
425
430
  event,
426
431
  nextEvent,
@@ -430,25 +435,25 @@ const validateSyncState = (syncState) => {
430
435
  }
431
436
  };
432
437
  const validateMergeResult = (mergeResult) => {
433
- if (mergeResult._tag === 'unexpected-error' || mergeResult._tag === 'reject')
438
+ if (mergeResult._tag === 'unknown-error' || mergeResult._tag === 'reject')
434
439
  return mergeResult;
435
440
  validateSyncState(mergeResult.newSyncState);
436
441
  // Ensure local head is always greater than or equal to upstream head
437
- if (EventSequenceNumber.isGreaterThan(mergeResult.newSyncState.upstreamHead, mergeResult.newSyncState.localHead)) {
442
+ if (EventSequenceNumber.Client.isGreaterThan(mergeResult.newSyncState.upstreamHead, mergeResult.newSyncState.localHead)) {
438
443
  shouldNeverHappen('Local head must be greater than or equal to upstream head', {
439
444
  localHead: mergeResult.newSyncState.localHead,
440
445
  upstreamHead: mergeResult.newSyncState.upstreamHead,
441
446
  });
442
447
  }
443
448
  // Ensure new local head is greater than or equal to the previous local head
444
- if (EventSequenceNumber.isGreaterThanOrEqual(mergeResult.newSyncState.localHead, mergeResult.mergeContext.syncState.localHead) === false) {
449
+ if (EventSequenceNumber.Client.isGreaterThanOrEqual(mergeResult.newSyncState.localHead, mergeResult.mergeContext.syncState.localHead) === false) {
445
450
  shouldNeverHappen('New local head must be greater than or equal to the previous local head', {
446
451
  localHead: mergeResult.newSyncState.localHead,
447
452
  previousLocalHead: mergeResult.mergeContext.syncState.localHead,
448
453
  });
449
454
  }
450
455
  // Ensure new upstream head is greater than or equal to the previous upstream head
451
- if (EventSequenceNumber.isGreaterThanOrEqual(mergeResult.newSyncState.upstreamHead, mergeResult.mergeContext.syncState.upstreamHead) === false) {
456
+ if (EventSequenceNumber.Client.isGreaterThanOrEqual(mergeResult.newSyncState.upstreamHead, mergeResult.mergeContext.syncState.upstreamHead) === false) {
452
457
  shouldNeverHappen('New upstream head must be greater than or equal to the previous upstream head', {
453
458
  upstreamHead: mergeResult.newSyncState.upstreamHead,
454
459
  previousUpstreamHead: mergeResult.mergeContext.syncState.upstreamHead,