@livestore/common 0.4.0 → 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 (421) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +1 -1
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/MaterializationJournal.d.ts +44 -0
  5. package/dist/MaterializationJournal.d.ts.map +1 -0
  6. package/dist/MaterializationJournal.js +112 -0
  7. package/dist/MaterializationJournal.js.map +1 -0
  8. package/dist/StateHead.d.ts +26 -0
  9. package/dist/StateHead.d.ts.map +1 -0
  10. package/dist/StateHead.js +50 -0
  11. package/dist/StateHead.js.map +1 -0
  12. package/dist/WorkerTransportError.d.ts +3 -3
  13. package/dist/WorkerTransportError.d.ts.map +1 -1
  14. package/dist/WorkerTransportError.js +3 -3
  15. package/dist/WorkerTransportError.js.map +1 -1
  16. package/dist/__tests__/fixture.d.ts +1 -1
  17. package/dist/__tests__/fixture.d.ts.map +1 -1
  18. package/dist/__tests__/fixture.js +3 -3
  19. package/dist/__tests__/fixture.js.map +1 -1
  20. package/dist/adapter-types.d.ts +29 -57
  21. package/dist/adapter-types.d.ts.map +1 -1
  22. package/dist/adapter-types.js +20 -37
  23. package/dist/adapter-types.js.map +1 -1
  24. package/dist/debug-info.d.ts +56 -56
  25. package/dist/debug-info.d.ts.map +1 -1
  26. package/dist/debug-info.js +28 -41
  27. package/dist/debug-info.js.map +1 -1
  28. package/dist/defs.d.ts +9 -9
  29. package/dist/defs.js +2 -2
  30. package/dist/devtools/devtools-compatibility.test.js +1 -0
  31. package/dist/devtools/devtools-compatibility.test.js.map +1 -1
  32. package/dist/devtools/devtools-messages-client-session.d.ts +520 -332
  33. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  34. package/dist/devtools/devtools-messages-client-session.js +76 -74
  35. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  36. package/dist/devtools/devtools-messages-common.d.ts +27 -27
  37. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  38. package/dist/devtools/devtools-messages-common.js +5 -5
  39. package/dist/devtools/devtools-messages-common.js.map +1 -1
  40. package/dist/devtools/devtools-messages-leader.d.ts +405 -343
  41. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  42. package/dist/devtools/devtools-messages-leader.js +101 -89
  43. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  44. package/dist/devtools/devtools-sessioninfo.d.ts +18 -19
  45. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  46. package/dist/devtools/devtools-sessioninfo.js +8 -5
  47. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  48. package/dist/devtools/mod.d.ts +4 -5
  49. package/dist/devtools/mod.d.ts.map +1 -1
  50. package/dist/devtools/mod.js +9 -5
  51. package/dist/devtools/mod.js.map +1 -1
  52. package/dist/errors.d.ts +45 -69
  53. package/dist/errors.d.ts.map +1 -1
  54. package/dist/errors.js +18 -16
  55. package/dist/errors.js.map +1 -1
  56. package/dist/index.d.ts +4 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +4 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/leader-thread/LeaderSyncProcessor.d.ts +66 -18
  61. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  62. package/dist/leader-thread/LeaderSyncProcessor.js +519 -461
  63. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  64. package/dist/leader-thread/RejectedPushError.d.ts +67 -36
  65. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -1
  66. package/dist/leader-thread/RejectedPushError.js +24 -5
  67. package/dist/leader-thread/RejectedPushError.js.map +1 -1
  68. package/dist/leader-thread/connection.d.ts +1 -0
  69. package/dist/leader-thread/connection.d.ts.map +1 -1
  70. package/dist/leader-thread/connection.js +9 -8
  71. package/dist/leader-thread/connection.js.map +1 -1
  72. package/dist/leader-thread/eventlog.d.ts +4 -4
  73. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  74. package/dist/leader-thread/eventlog.js +6 -6
  75. package/dist/leader-thread/eventlog.js.map +1 -1
  76. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  77. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  78. package/dist/leader-thread/leader-worker-devtools.js +33 -17
  79. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  80. package/dist/leader-thread/make-leader-thread-layer.d.ts +9 -5
  81. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  82. package/dist/leader-thread/make-leader-thread-layer.js +25 -35
  83. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  84. package/dist/leader-thread/make-leader-thread-layer.test.js +7 -7
  85. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -1
  86. package/dist/leader-thread/materialize-event.d.ts +2 -1
  87. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  88. package/dist/leader-thread/materialize-event.js +4 -0
  89. package/dist/leader-thread/materialize-event.js.map +1 -1
  90. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  91. package/dist/leader-thread/recreate-db.js +18 -39
  92. package/dist/leader-thread/recreate-db.js.map +1 -1
  93. package/dist/leader-thread/shutdown-channel.d.ts +2 -6
  94. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  95. package/dist/leader-thread/shutdown-channel.js +2 -3
  96. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  97. package/dist/leader-thread/stream-events.d.ts +4 -7
  98. package/dist/leader-thread/stream-events.d.ts.map +1 -1
  99. package/dist/leader-thread/stream-events.js +13 -16
  100. package/dist/leader-thread/stream-events.js.map +1 -1
  101. package/dist/leader-thread/types.d.ts +32 -69
  102. package/dist/leader-thread/types.d.ts.map +1 -1
  103. package/dist/leader-thread/types.js +5 -5
  104. package/dist/leader-thread/types.js.map +1 -1
  105. package/dist/logging.d.ts +5 -30
  106. package/dist/logging.d.ts.map +1 -1
  107. package/dist/logging.js +1 -32
  108. package/dist/logging.js.map +1 -1
  109. package/dist/make-client-session.d.ts +1 -2
  110. package/dist/make-client-session.d.ts.map +1 -1
  111. package/dist/make-client-session.js +3 -3
  112. package/dist/make-client-session.js.map +1 -1
  113. package/dist/materializer-helper.d.ts +0 -1
  114. package/dist/materializer-helper.d.ts.map +1 -1
  115. package/dist/materializer-helper.js +7 -35
  116. package/dist/materializer-helper.js.map +1 -1
  117. package/dist/otel.d.ts +2 -3
  118. package/dist/otel.d.ts.map +1 -1
  119. package/dist/otel.js +2 -7
  120. package/dist/otel.js.map +1 -1
  121. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  122. package/dist/rematerialize-from-eventlog.js +28 -26
  123. package/dist/rematerialize-from-eventlog.js.map +1 -1
  124. package/dist/schema/EventDef/define.d.ts +4 -4
  125. package/dist/schema/EventDef/define.d.ts.map +1 -1
  126. package/dist/schema/EventDef/define.js +5 -5
  127. package/dist/schema/EventDef/define.js.map +1 -1
  128. package/dist/schema/EventDef/define.test.d.ts +2 -0
  129. package/dist/schema/EventDef/define.test.d.ts.map +1 -0
  130. package/dist/schema/EventDef/define.test.js +23 -0
  131. package/dist/schema/EventDef/define.test.js.map +1 -0
  132. package/dist/schema/EventDef/deprecated.d.ts +8 -13
  133. package/dist/schema/EventDef/deprecated.d.ts.map +1 -1
  134. package/dist/schema/EventDef/deprecated.js +12 -13
  135. package/dist/schema/EventDef/deprecated.js.map +1 -1
  136. package/dist/schema/EventDef/deprecated.test.js +1 -1
  137. package/dist/schema/EventDef/deprecated.test.js.map +1 -1
  138. package/dist/schema/EventDef/event-def.d.ts +1 -1
  139. package/dist/schema/EventDef/event-def.d.ts.map +1 -1
  140. package/dist/schema/EventSequenceNumber/client.d.ts +12 -12
  141. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -1
  142. package/dist/schema/EventSequenceNumber/client.js +8 -9
  143. package/dist/schema/EventSequenceNumber/client.js.map +1 -1
  144. package/dist/schema/EventSequenceNumber/global.d.ts +2 -2
  145. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -1
  146. package/dist/schema/EventSequenceNumber/global.js +1 -1
  147. package/dist/schema/EventSequenceNumber/global.js.map +1 -1
  148. package/dist/schema/EventSequenceNumber.test.js +5 -5
  149. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  150. package/dist/schema/LiveStoreEvent/client.d.ts +50 -179
  151. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -1
  152. package/dist/schema/LiveStoreEvent/client.js +32 -29
  153. package/dist/schema/LiveStoreEvent/client.js.map +1 -1
  154. package/dist/schema/LiveStoreEvent/client.test.js +11 -2
  155. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -1
  156. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +7 -7
  157. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -1
  158. package/dist/schema/LiveStoreEvent/global.d.ts +6 -6
  159. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -1
  160. package/dist/schema/LiveStoreEvent/global.js +1 -1
  161. package/dist/schema/LiveStoreEvent/global.js.map +1 -1
  162. package/dist/schema/LiveStoreEvent/input.d.ts +5 -5
  163. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -1
  164. package/dist/schema/LiveStoreEvent/input.js +3 -3
  165. package/dist/schema/LiveStoreEvent/input.js.map +1 -1
  166. package/dist/schema/mod.d.ts +1 -0
  167. package/dist/schema/mod.d.ts.map +1 -1
  168. package/dist/schema/mod.js +1 -0
  169. package/dist/schema/mod.js.map +1 -1
  170. package/dist/schema/schema.d.ts.map +1 -1
  171. package/dist/schema/schema.js +3 -2
  172. package/dist/schema/schema.js.map +1 -1
  173. package/dist/schema/state/sqlite/client-document-def.d.ts +12 -17
  174. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  175. package/dist/schema/state/sqlite/client-document-def.js +23 -20
  176. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  177. package/dist/schema/state/sqlite/client-document-def.test.js +29 -8
  178. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  179. package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
  180. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  181. package/dist/schema/state/sqlite/column-annotations.js +13 -15
  182. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  183. package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
  184. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  185. package/dist/schema/state/sqlite/column-def.d.ts +1 -1
  186. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  187. package/dist/schema/state/sqlite/column-def.js +57 -31
  188. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  189. package/dist/schema/state/sqlite/column-def.test.js +118 -72
  190. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  191. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  192. package/dist/schema/state/sqlite/column-spec.test.js +2 -2
  193. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -2
  194. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  195. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +13 -4
  196. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  197. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +9 -9
  198. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  199. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +8 -13
  200. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  201. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +27 -16
  202. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  203. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +13 -11
  204. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  205. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +5 -3
  206. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  207. package/dist/schema/state/sqlite/mod.d.ts +1 -3
  208. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  209. package/dist/schema/state/sqlite/mod.js +1 -1
  210. package/dist/schema/state/sqlite/mod.js.map +1 -1
  211. package/dist/schema/state/sqlite/persistence.d.ts +11 -0
  212. package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
  213. package/dist/schema/state/sqlite/persistence.js +10 -0
  214. package/dist/schema/state/sqlite/persistence.js.map +1 -0
  215. package/dist/schema/state/sqlite/query-builder/api.d.ts +7 -7
  216. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  217. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  218. package/dist/schema/state/sqlite/query-builder/astToSql.js +27 -23
  219. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  220. package/dist/schema/state/sqlite/query-builder/impl.d.ts +3 -1
  221. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  222. package/dist/schema/state/sqlite/query-builder/impl.js +16 -14
  223. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  224. package/dist/schema/state/sqlite/query-builder/impl.test.js +362 -596
  225. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  226. package/dist/schema/state/sqlite/schema-helpers.js +1 -1
  227. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  228. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +102 -134
  229. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -1
  230. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +2 -2
  231. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -1
  232. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +328 -106
  233. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -1
  234. package/dist/schema/state/sqlite/system-tables/state-tables.js +33 -1
  235. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -1
  236. package/dist/schema/state/sqlite/table-def.d.ts +16 -19
  237. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  238. package/dist/schema/state/sqlite/table-def.js +53 -3
  239. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  240. package/dist/schema/state/sqlite/table-def.test.js +153 -36
  241. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  242. package/dist/schema/unknown-events.d.ts.map +1 -1
  243. package/dist/schema/unknown-events.js +2 -1
  244. package/dist/schema/unknown-events.js.map +1 -1
  245. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +2 -2
  246. package/dist/session-id-symbol.d.ts +29 -0
  247. package/dist/session-id-symbol.d.ts.map +1 -0
  248. package/dist/session-id-symbol.js +44 -0
  249. package/dist/session-id-symbol.js.map +1 -0
  250. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  251. package/dist/sql-queries/sql-queries.js +8 -10
  252. package/dist/sql-queries/sql-queries.js.map +1 -1
  253. package/dist/sql-queries/types.d.ts +6 -7
  254. package/dist/sql-queries/types.d.ts.map +1 -1
  255. package/dist/sql-queries/types.js.map +1 -1
  256. package/dist/sqlite-db-helper.d.ts +21 -1
  257. package/dist/sqlite-db-helper.d.ts.map +1 -1
  258. package/dist/sqlite-db-helper.js +37 -2
  259. package/dist/sqlite-db-helper.js.map +1 -1
  260. package/dist/sqlite-types.d.ts +3 -6
  261. package/dist/sqlite-types.d.ts.map +1 -1
  262. package/dist/sqlite-types.js +3 -3
  263. package/dist/sqlite-types.js.map +1 -1
  264. package/dist/sync/ClientSessionSyncProcessor.d.ts +38 -16
  265. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  266. package/dist/sync/ClientSessionSyncProcessor.js +196 -66
  267. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  268. package/dist/sync/errors.d.ts +12 -18
  269. package/dist/sync/errors.d.ts.map +1 -1
  270. package/dist/sync/errors.js +2 -2
  271. package/dist/sync/errors.js.map +1 -1
  272. package/dist/sync/mock-sync-backend.d.ts +2 -3
  273. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  274. package/dist/sync/mock-sync-backend.js +54 -33
  275. package/dist/sync/mock-sync-backend.js.map +1 -1
  276. package/dist/sync/mock-sync-backend.test.d.ts +2 -0
  277. package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
  278. package/dist/sync/mock-sync-backend.test.js +49 -0
  279. package/dist/sync/mock-sync-backend.test.js.map +1 -0
  280. package/dist/sync/next/history-dag-common.d.ts +4 -0
  281. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  282. package/dist/sync/next/history-dag-common.js +52 -31
  283. package/dist/sync/next/history-dag-common.js.map +1 -1
  284. package/dist/sync/next/history-dag.d.ts.map +1 -1
  285. package/dist/sync/next/history-dag.js +2 -1
  286. package/dist/sync/next/history-dag.js.map +1 -1
  287. package/dist/sync/next/test/compact-events.calculator.test.js +2 -2
  288. package/dist/sync/next/test/event-fixtures.d.ts +7 -7
  289. package/dist/sync/next/test/event-fixtures.js +1 -1
  290. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  291. package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
  292. package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
  293. package/dist/sync/next/test/history-dag-common.test.js +73 -0
  294. package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
  295. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  296. package/dist/sync/sync-backend-kv.js +4 -2
  297. package/dist/sync/sync-backend-kv.js.map +1 -1
  298. package/dist/sync/sync-backend.d.ts +15 -15
  299. package/dist/sync/sync-backend.d.ts.map +1 -1
  300. package/dist/sync/sync-backend.js +9 -5
  301. package/dist/sync/sync-backend.js.map +1 -1
  302. package/dist/sync/sync.d.ts +1 -1
  303. package/dist/sync/sync.d.ts.map +1 -1
  304. package/dist/sync/syncstate.d.ts +97 -173
  305. package/dist/sync/syncstate.d.ts.map +1 -1
  306. package/dist/sync/syncstate.js +34 -37
  307. package/dist/sync/syncstate.js.map +1 -1
  308. package/dist/sync/syncstate.test.js +100 -61
  309. package/dist/sync/syncstate.test.js.map +1 -1
  310. package/dist/sync/transport-chunking.d.ts +15 -16
  311. package/dist/sync/transport-chunking.d.ts.map +1 -1
  312. package/dist/sync/transport-chunking.js +23 -32
  313. package/dist/sync/transport-chunking.js.map +1 -1
  314. package/dist/util.d.ts +11 -4
  315. package/dist/util.d.ts.map +1 -1
  316. package/dist/util.js +19 -2
  317. package/dist/util.js.map +1 -1
  318. package/dist/version.d.ts.map +1 -1
  319. package/dist/version.js.map +1 -1
  320. package/package.json +19 -37
  321. package/src/ClientSessionLeaderThreadProxy.ts +1 -1
  322. package/src/MaterializationJournal.ts +184 -0
  323. package/src/StateHead.ts +80 -0
  324. package/src/WorkerTransportError.ts +4 -4
  325. package/src/__tests__/fixture.ts +3 -3
  326. package/src/adapter-types.ts +24 -61
  327. package/src/debug-info.ts +50 -70
  328. package/src/defs.ts +2 -2
  329. package/src/devtools/devtools-compatibility.test.ts +1 -0
  330. package/src/devtools/devtools-messages-client-session.ts +56 -65
  331. package/src/devtools/devtools-messages-common.ts +12 -11
  332. package/src/devtools/devtools-messages-leader.ts +71 -69
  333. package/src/devtools/devtools-sessioninfo.ts +13 -11
  334. package/src/devtools/mod.ts +4 -5
  335. package/src/errors.ts +46 -34
  336. package/src/index.ts +8 -1
  337. package/src/leader-thread/LeaderSyncProcessor.ts +794 -691
  338. package/src/leader-thread/RejectedPushError.ts +40 -27
  339. package/src/leader-thread/connection.ts +12 -8
  340. package/src/leader-thread/eventlog.ts +7 -7
  341. package/src/leader-thread/leader-worker-devtools.ts +37 -19
  342. package/src/leader-thread/make-leader-thread-layer.test.ts +7 -7
  343. package/src/leader-thread/make-leader-thread-layer.ts +56 -53
  344. package/src/leader-thread/materialize-event.ts +13 -8
  345. package/src/leader-thread/recreate-db.ts +24 -59
  346. package/src/leader-thread/shutdown-channel.ts +3 -14
  347. package/src/leader-thread/stream-events.ts +104 -101
  348. package/src/leader-thread/types.ts +24 -62
  349. package/src/logging.ts +5 -52
  350. package/src/make-client-session.ts +6 -6
  351. package/src/materializer-helper.ts +8 -37
  352. package/src/otel.ts +5 -14
  353. package/src/rematerialize-from-eventlog.ts +97 -94
  354. package/src/schema/EventDef/define.test.ts +28 -0
  355. package/src/schema/EventDef/define.ts +20 -19
  356. package/src/schema/EventDef/deprecated.test.ts +1 -8
  357. package/src/schema/EventDef/deprecated.ts +17 -20
  358. package/src/schema/EventDef/event-def.ts +2 -4
  359. package/src/schema/EventSequenceNumber/client.ts +8 -9
  360. package/src/schema/EventSequenceNumber/global.ts +1 -1
  361. package/src/schema/EventSequenceNumber.test.ts +5 -5
  362. package/src/schema/LiveStoreEvent/client.test.ts +17 -4
  363. package/src/schema/LiveStoreEvent/client.ts +36 -35
  364. package/src/schema/LiveStoreEvent/for-event-def.ts +7 -7
  365. package/src/schema/LiveStoreEvent/global.ts +1 -1
  366. package/src/schema/LiveStoreEvent/input.ts +6 -6
  367. package/src/schema/mod.ts +1 -0
  368. package/src/schema/schema.ts +3 -2
  369. package/src/schema/state/sqlite/client-document-def.test.ts +32 -13
  370. package/src/schema/state/sqlite/client-document-def.ts +95 -80
  371. package/src/schema/state/sqlite/column-annotations.test.ts +26 -45
  372. package/src/schema/state/sqlite/column-annotations.ts +26 -30
  373. package/src/schema/state/sqlite/column-def.test.ts +132 -77
  374. package/src/schema/state/sqlite/column-def.ts +72 -37
  375. package/src/schema/state/sqlite/column-spec.test.ts +2 -2
  376. package/src/schema/state/sqlite/column-spec.ts +3 -2
  377. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +15 -5
  378. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
  379. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -16
  380. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +25 -31
  381. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +35 -21
  382. package/src/schema/state/sqlite/mod.ts +2 -4
  383. package/src/schema/state/sqlite/persistence.ts +11 -0
  384. package/src/schema/state/sqlite/query-builder/api.ts +9 -9
  385. package/src/schema/state/sqlite/query-builder/astToSql.ts +31 -26
  386. package/src/schema/state/sqlite/query-builder/impl.test.ts +433 -669
  387. package/src/schema/state/sqlite/query-builder/impl.ts +19 -15
  388. package/src/schema/state/sqlite/schema-helpers.ts +1 -1
  389. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +2 -2
  390. package/src/schema/state/sqlite/system-tables/state-tables.ts +41 -1
  391. package/src/schema/state/sqlite/table-def.test.ts +204 -66
  392. package/src/schema/state/sqlite/table-def.ts +96 -45
  393. package/src/schema/unknown-events.ts +3 -2
  394. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +2 -2
  395. package/src/session-id-symbol.ts +59 -0
  396. package/src/sql-queries/sql-queries.ts +8 -12
  397. package/src/sql-queries/types.ts +6 -7
  398. package/src/sqlite-db-helper.ts +64 -2
  399. package/src/sqlite-types.ts +5 -8
  400. package/src/sync/ClientSessionSyncProcessor.ts +303 -119
  401. package/src/sync/errors.ts +14 -12
  402. package/src/sync/mock-sync-backend.test.ts +78 -0
  403. package/src/sync/mock-sync-backend.ts +93 -47
  404. package/src/sync/next/history-dag-common.ts +60 -34
  405. package/src/sync/next/history-dag.ts +4 -1
  406. package/src/sync/next/test/compact-events.calculator.test.ts +2 -2
  407. package/src/sync/next/test/event-fixtures.ts +1 -1
  408. package/src/sync/next/test/history-dag-common.test.ts +87 -0
  409. package/src/sync/sync-backend-kv.ts +4 -2
  410. package/src/sync/sync-backend.ts +15 -15
  411. package/src/sync/sync.ts +1 -1
  412. package/src/sync/syncstate.test.ts +191 -140
  413. package/src/sync/syncstate.ts +63 -53
  414. package/src/sync/transport-chunking.ts +34 -39
  415. package/src/util.ts +18 -9
  416. package/src/version.ts +1 -2
  417. package/dist/sql-queries/misc.d.ts +0 -2
  418. package/dist/sql-queries/misc.d.ts.map +0 -1
  419. package/dist/sql-queries/misc.js +0 -2
  420. package/dist/sql-queries/misc.js.map +0 -1
  421. package/src/sql-queries/misc.ts +0 -2
@@ -1,66 +1,112 @@
1
+ import { assert, expect } from 'vitest'
2
+
1
3
  import { Vitest } from '@livestore/utils-dev/node-vitest'
2
4
  import { Cause, Effect, Exit, Schema } from '@livestore/utils/effect'
3
- import { assert, expect } from 'vitest'
4
5
 
5
6
  import * as EventSequenceNumber from '../schema/EventSequenceNumber/mod.ts'
6
7
  import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts'
7
8
  import * as SyncState from './syncstate.ts'
8
9
 
9
- class TestEvent extends LiveStoreEvent.Client.EncodedWithMeta {
10
- public payload = 'uninitialized'
11
- public isClient = false
12
-
13
- static new = (
14
- seqNum: EventSequenceNumber.Client.CompositeInput,
15
- parentSeqNum: EventSequenceNumber.Client.CompositeInput,
16
- payload: string,
17
- isClient: boolean,
18
- ) => {
19
- const event = new TestEvent({
20
- seqNum: EventSequenceNumber.Client.Composite.make(seqNum),
21
- parentSeqNum: EventSequenceNumber.Client.Composite.make(parentSeqNum),
22
- name: 'a',
23
- args: payload,
24
- clientId: 'static-local-id',
25
- sessionId: 'static-session-id',
26
- })
27
- event.payload = payload
28
- event.isClient = isClient
29
- return event
30
- }
31
-
32
- rebase_ = (parentSeqNum: EventSequenceNumber.Client.Composite, rebaseGeneration: number) => {
33
- return this.rebase({ parentSeqNum, isClient: this.isClient, rebaseGeneration })
34
- }
35
-
36
- // Only used for Vitest printing
37
- // toJSON = () => `(${this.seqNum.global},${this.seqNum.client},${this.payload})`
38
- // toString = () => this.toJSON()
39
- }
10
+ /** Module-scoped JSON codecs; keeping the sync codecs out of Effect generators avoids `schemaSyncInEffect`. */
11
+ const jsonStringify = Schema.encodeSync(Schema.fromJsonString(Schema.Unknown))
12
+ const jsonParse = Schema.decodeUnknownSync(Schema.fromJsonString(Schema.Unknown))
13
+
14
+ const makeTestEvent = ({
15
+ seqNum,
16
+ parentSeqNum,
17
+ payload,
18
+ isClientOnly,
19
+ }: {
20
+ seqNum: EventSequenceNumber.Client.CompositeInput
21
+ parentSeqNum: EventSequenceNumber.Client.CompositeInput
22
+ payload: string
23
+ isClientOnly: boolean
24
+ }) =>
25
+ new LiveStoreEvent.Client.EncodedWithMeta({
26
+ seqNum: EventSequenceNumber.Client.Composite.make(seqNum),
27
+ parentSeqNum: EventSequenceNumber.Client.Composite.make(parentSeqNum),
28
+ name: 'a',
29
+ // Effect v4 normalizes nested Schema.Class values to their declared schema fields.
30
+ // Keep this test-only flag inside `args`, which is part of EncodedWithMeta,
31
+ // instead of relying on subclass fields that are stripped during parsing.
32
+ args: { payload, isClientOnly },
33
+ clientId: 'static-local-id',
34
+ sessionId: 'static-session-id',
35
+ })
40
36
 
41
- const e0_1 = TestEvent.new({ global: 0, client: 1 }, EventSequenceNumber.Client.ROOT, 'a', true)
42
- const e1_0 = TestEvent.new({ global: 1, client: 0 }, EventSequenceNumber.Client.ROOT, 'a', false)
43
- const e1_1 = TestEvent.new({ global: 1, client: 1 }, e1_0.seqNum, 'a', true)
44
- const e1_2 = TestEvent.new({ global: 1, client: 2 }, e1_1.seqNum, 'a', true)
45
- const e1_3 = TestEvent.new({ global: 1, client: 3 }, e1_2.seqNum, 'a', true)
46
- const e2_0 = TestEvent.new({ global: 2, client: 0 }, e1_0.seqNum, 'a', false)
47
- const e2_1 = TestEvent.new({ global: 2, client: 1 }, e2_0.seqNum, 'a', true)
37
+ const e0_1 = makeTestEvent({
38
+ seqNum: { global: 0, client: 1 },
39
+ parentSeqNum: EventSequenceNumber.Client.ROOT,
40
+ payload: 'a',
41
+ isClientOnly: true,
42
+ })
43
+ const e1_0 = makeTestEvent({
44
+ seqNum: { global: 1, client: 0 },
45
+ parentSeqNum: EventSequenceNumber.Client.ROOT,
46
+ payload: 'a',
47
+ isClientOnly: false,
48
+ })
49
+ const e1_1 = makeTestEvent({
50
+ seqNum: { global: 1, client: 1 },
51
+ parentSeqNum: e1_0.seqNum,
52
+ payload: 'a',
53
+ isClientOnly: true,
54
+ })
55
+ const e1_2 = makeTestEvent({
56
+ seqNum: { global: 1, client: 2 },
57
+ parentSeqNum: e1_1.seqNum,
58
+ payload: 'a',
59
+ isClientOnly: true,
60
+ })
61
+ const e1_3 = makeTestEvent({
62
+ seqNum: { global: 1, client: 3 },
63
+ parentSeqNum: e1_2.seqNum,
64
+ payload: 'a',
65
+ isClientOnly: true,
66
+ })
67
+ const e2_0 = makeTestEvent({
68
+ seqNum: { global: 2, client: 0 },
69
+ parentSeqNum: e1_0.seqNum,
70
+ payload: 'a',
71
+ isClientOnly: false,
72
+ })
73
+ const e2_1 = makeTestEvent({
74
+ seqNum: { global: 2, client: 1 },
75
+ parentSeqNum: e2_0.seqNum,
76
+ payload: 'a',
77
+ isClientOnly: true,
78
+ })
48
79
 
49
80
  const isEqualEvent = LiveStoreEvent.Client.isEqualEncoded
50
81
 
51
- const isClientEvent = (event: LiveStoreEvent.Client.EncodedWithMeta) => (event as TestEvent).isClient
52
-
82
+ const isClientOnlyEvent = (event: LiveStoreEvent.Client.EncodedWithMeta) =>
83
+ typeof event.args === 'object' &&
84
+ event.args !== null &&
85
+ 'isClientOnly' in event.args &&
86
+ event.args.isClientOnly === true
87
+
88
+ const rebaseTestEvent = ({
89
+ event,
90
+ parentSeqNum,
91
+ rebaseGeneration,
92
+ }: {
93
+ event: LiveStoreEvent.Client.EncodedWithMeta
94
+ parentSeqNum: EventSequenceNumber.Client.Composite
95
+ rebaseGeneration: number
96
+ }) => event.rebase({ parentSeqNum, isClientOnly: isClientOnlyEvent(event), rebaseGeneration })
97
+
98
+ /** Verifies: LS.SYS.SYNC.SS-R01, LS.SYS.SYNC.SS-R02, LS.SYS.SYNC.SS-R03, LS.SYS.SYNC.SS-R05, LS.SYS.SYNC.SS-R06 */
53
99
  Vitest.describe('syncstate', () => {
54
100
  Vitest.describe('merge', () => {
55
101
  const merge = ({
56
102
  syncState,
57
103
  payload,
58
- ignoreClientEvents = false,
104
+ ignoreClientOnlyEvents = false,
59
105
  }: {
60
106
  syncState: SyncState.SyncState
61
107
  payload: typeof SyncState.Payload.Type
62
- ignoreClientEvents?: boolean
63
- }) => SyncState.merge({ syncState, payload, isClientEvent, isEqualEvent, ignoreClientEvents })
108
+ ignoreClientOnlyEvents?: boolean
109
+ }) => SyncState.merge({ syncState, payload, isClientOnlyEvent, isEqualEvent, ignoreClientOnlyEvents })
64
110
 
65
111
  Vitest.describe('upstream-rebase', () => {
66
112
  Vitest.it.effect('should rollback until start', () =>
@@ -70,8 +116,8 @@ Vitest.describe('syncstate', () => {
70
116
  upstreamHead: EventSequenceNumber.Client.ROOT,
71
117
  localHead: e2_0.seqNum,
72
118
  })
73
- const e1_0_e2_0 = e1_0.rebase_(e2_0.seqNum, 0)
74
- const e1_1_e2_1 = e1_1.rebase_(e1_0_e2_0.seqNum, 0)
119
+ const e1_0_e2_0 = rebaseTestEvent({ event: e1_0, parentSeqNum: e2_0.seqNum, rebaseGeneration: 0 })
120
+ const e1_1_e2_1 = rebaseTestEvent({ event: e1_1, parentSeqNum: e1_0_e2_0.seqNum, rebaseGeneration: 0 })
75
121
  const result = yield* merge({
76
122
  syncState,
77
123
  payload: SyncState.PayloadUpstreamRebase.make({
@@ -79,7 +125,7 @@ Vitest.describe('syncstate', () => {
79
125
  newEvents: [e1_0_e2_0, e1_1_e2_1],
80
126
  }),
81
127
  })
82
- const e2_0_e3_0 = e2_0.rebase_(e1_0_e2_0.seqNum, 1)
128
+ const e2_0_e3_0 = rebaseTestEvent({ event: e2_0, parentSeqNum: e1_0_e2_0.seqNum, rebaseGeneration: 1 })
83
129
  expectRebase(result)
84
130
  expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0])
85
131
  expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_1.seqNum)
@@ -96,7 +142,7 @@ Vitest.describe('syncstate', () => {
96
142
  upstreamHead: EventSequenceNumber.Client.ROOT,
97
143
  localHead: e2_0.seqNum,
98
144
  })
99
- const e1_1_e2_0 = e1_1.rebase_(e1_0.seqNum, 0)
145
+ const e1_1_e2_0 = rebaseTestEvent({ event: e1_1, parentSeqNum: e1_0.seqNum, rebaseGeneration: 0 })
100
146
  const result = yield* merge({
101
147
  syncState,
102
148
  payload: SyncState.PayloadUpstreamRebase.make({
@@ -104,7 +150,7 @@ Vitest.describe('syncstate', () => {
104
150
  rollbackEvents: [e1_1],
105
151
  }),
106
152
  })
107
- const e2_0_e3_0 = e2_0.rebase_(e1_1_e2_0.seqNum, 1)
153
+ const e2_0_e3_0 = rebaseTestEvent({ event: e2_0, parentSeqNum: e1_1_e2_0.seqNum, rebaseGeneration: 1 })
108
154
  expectRebase(result)
109
155
  expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0])
110
156
  expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_0.seqNum)
@@ -129,7 +175,7 @@ Vitest.describe('syncstate', () => {
129
175
  expectEventArraysEqual(result.newSyncState.pending, [])
130
176
  expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum)
131
177
  expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum)
132
- expect(result.newEvents).toStrictEqual([e2_0])
178
+ expectEventArraysEqual(result.newEvents, [e2_0])
133
179
  }),
134
180
  )
135
181
  })
@@ -146,7 +192,7 @@ Vitest.describe('syncstate', () => {
146
192
  Effect.exit,
147
193
  )
148
194
  assert(Exit.isFailure(exit))
149
- expect(Cause.isDie(exit.cause)).toBe(true)
195
+ expect(Cause.hasDies(exit.cause)).toBe(true)
150
196
  }),
151
197
  )
152
198
 
@@ -161,7 +207,7 @@ Vitest.describe('syncstate', () => {
161
207
  Effect.exit,
162
208
  )
163
209
  assert(Exit.isFailure(exit))
164
- expect(Cause.isDie(exit.cause)).toBe(true)
210
+ expect(Cause.hasDies(exit.cause)).toBe(true)
165
211
  }),
166
212
  )
167
213
 
@@ -176,7 +222,7 @@ Vitest.describe('syncstate', () => {
176
222
  Effect.exit,
177
223
  )
178
224
  assert(Exit.isFailure(exit))
179
- expect(Cause.isDie(exit.cause)).toBe(true)
225
+ expect(Cause.hasDies(exit.cause)).toBe(true)
180
226
  }),
181
227
  )
182
228
 
@@ -191,7 +237,7 @@ Vitest.describe('syncstate', () => {
191
237
  Effect.exit,
192
238
  )
193
239
  assert(Exit.isFailure(exit))
194
- expect(Cause.isDie(exit.cause)).toBe(true)
240
+ expect(Cause.hasDies(exit.cause)).toBe(true)
195
241
  }),
196
242
  )
197
243
 
@@ -247,7 +293,7 @@ Vitest.describe('syncstate', () => {
247
293
  expectEventArraysEqual(result.newSyncState.pending, [])
248
294
  expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.seqNum)
249
295
  expect(result.newSyncState.localHead).toMatchObject(e1_1.seqNum)
250
- expect(result.newEvents).toStrictEqual([e1_1])
296
+ expectEventArraysEqual(result.newEvents, [e1_1])
251
297
  expectEventArraysEqual(result.confirmedEvents, [e1_0])
252
298
  }),
253
299
  )
@@ -268,7 +314,7 @@ Vitest.describe('syncstate', () => {
268
314
  expectEventArraysEqual(result.newSyncState.pending, [])
269
315
  expect(result.newSyncState.upstreamHead).toMatchObject(e2_1.seqNum)
270
316
  expect(result.newSyncState.localHead).toMatchObject(e2_1.seqNum)
271
- expect(result.newEvents).toStrictEqual([e1_2, e1_3, e2_0, e2_1])
317
+ expectEventArraysEqual(result.newEvents, [e1_2, e1_3, e2_0, e2_1])
272
318
  expectEventArraysEqual(result.confirmedEvents, [e1_1])
273
319
  }),
274
320
  )
@@ -304,7 +350,7 @@ Vitest.describe('syncstate', () => {
304
350
  const result = yield* merge({
305
351
  syncState,
306
352
  payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
307
- ignoreClientEvents: true,
353
+ ignoreClientOnlyEvents: true,
308
354
  })
309
355
  expectAdvance(result)
310
356
  expectEventArraysEqual(result.newSyncState.pending, [])
@@ -325,7 +371,7 @@ Vitest.describe('syncstate', () => {
325
371
  const result = yield* merge({
326
372
  syncState,
327
373
  payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
328
- ignoreClientEvents: true,
374
+ ignoreClientOnlyEvents: true,
329
375
  })
330
376
  expectAdvance(result)
331
377
  expectEventArraysEqual(result.newSyncState.pending, [e2_0])
@@ -346,14 +392,14 @@ Vitest.describe('syncstate', () => {
346
392
  const result = yield* merge({
347
393
  syncState,
348
394
  payload: { _tag: 'upstream-advance', newEvents: [e1_0, e2_0] },
349
- ignoreClientEvents: true,
395
+ ignoreClientOnlyEvents: true,
350
396
  })
351
397
 
352
398
  expectAdvance(result)
353
399
  expectEventArraysEqual(result.newSyncState.pending, [])
354
400
  expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum)
355
401
  expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum)
356
- expect(result.newEvents).toStrictEqual([e2_0])
402
+ expectEventArraysEqual(result.newEvents, [e2_0])
357
403
  expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0, e1_1])
358
404
  }),
359
405
  )
@@ -369,50 +415,52 @@ Vitest.describe('syncstate', () => {
369
415
  Effect.exit,
370
416
  )
371
417
  assert(Exit.isFailure(exit))
372
- expect(Cause.isDie(exit.cause)).toBe(true)
418
+ expect(Cause.hasDies(exit.cause)).toBe(true)
373
419
  }),
374
420
  )
375
421
 
376
- Vitest.it.effect('should advance (not rebase) when pending event has undefined-valued key dropped by JSON wire round-trip', () =>
377
- Effect.gen(function* () {
378
- const argsSchema = Schema.Struct({
379
- id: Schema.String,
380
- flag: Schema.UndefinedOr(Schema.Boolean),
381
- })
382
- const localArgs = Schema.encodeUnknownSync(argsSchema)({ id: 'abc' } as any)
383
- const wireArgs = JSON.parse(JSON.stringify(localArgs))
384
-
385
- const localPending = new TestEvent({
386
- seqNum: e1_0.seqNum,
387
- parentSeqNum: e1_0.parentSeqNum,
388
- name: e1_0.name,
389
- args: localArgs,
390
- clientId: e1_0.clientId,
391
- sessionId: e1_0.sessionId,
392
- })
393
- const fromUpstream = new TestEvent({
394
- seqNum: e1_0.seqNum,
395
- parentSeqNum: e1_0.parentSeqNum,
396
- name: e1_0.name,
397
- args: wireArgs,
398
- clientId: e1_0.clientId,
399
- sessionId: e1_0.sessionId,
400
- })
401
-
402
- const syncState = new SyncState.SyncState({
403
- pending: [localPending],
404
- upstreamHead: EventSequenceNumber.Client.ROOT,
405
- localHead: localPending.seqNum,
406
- })
407
- const result = yield* merge({
408
- syncState,
409
- payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [fromUpstream] }),
410
- })
411
-
412
- expectAdvance(result)
413
- expect(result.confirmedEvents).toHaveLength(1)
414
- expect(result.newSyncState.pending).toHaveLength(0)
415
- }),
422
+ Vitest.it.effect(
423
+ 'should advance (not rebase) when pending event has undefined-valued key dropped by JSON wire round-trip',
424
+ () =>
425
+ Effect.gen(function* () {
426
+ const argsSchema = Schema.Struct({
427
+ id: Schema.String,
428
+ flag: Schema.optional(Schema.Boolean),
429
+ })
430
+ const localArgs = yield* Schema.encodeUnknownEffect(argsSchema)({ id: 'abc' } as any).pipe(Effect.orDie)
431
+ const wireArgs = jsonParse(jsonStringify(localArgs))
432
+
433
+ const localPending = new LiveStoreEvent.Client.EncodedWithMeta({
434
+ seqNum: e1_0.seqNum,
435
+ parentSeqNum: e1_0.parentSeqNum,
436
+ name: e1_0.name,
437
+ args: localArgs,
438
+ clientId: e1_0.clientId,
439
+ sessionId: e1_0.sessionId,
440
+ })
441
+ const fromUpstream = new LiveStoreEvent.Client.EncodedWithMeta({
442
+ seqNum: e1_0.seqNum,
443
+ parentSeqNum: e1_0.parentSeqNum,
444
+ name: e1_0.name,
445
+ args: wireArgs,
446
+ clientId: e1_0.clientId,
447
+ sessionId: e1_0.sessionId,
448
+ })
449
+
450
+ const syncState = new SyncState.SyncState({
451
+ pending: [localPending],
452
+ upstreamHead: EventSequenceNumber.Client.ROOT,
453
+ localHead: localPending.seqNum,
454
+ })
455
+ const result = yield* merge({
456
+ syncState,
457
+ payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [fromUpstream] }),
458
+ })
459
+
460
+ expectAdvance(result)
461
+ expect(result.confirmedEvents).toHaveLength(1)
462
+ expect(result.newSyncState.pending).toHaveLength(0)
463
+ }),
416
464
  )
417
465
  })
418
466
 
@@ -429,7 +477,7 @@ Vitest.describe('syncstate', () => {
429
477
  payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1] }),
430
478
  })
431
479
 
432
- const e1_0_e1_2 = e1_0.rebase_(e1_1.seqNum, 1)
480
+ const e1_0_e1_2 = rebaseTestEvent({ event: e1_0, parentSeqNum: e1_1.seqNum, rebaseGeneration: 1 })
433
481
 
434
482
  expectRebase(result)
435
483
  expectEventArraysEqual(result.newSyncState.pending, [e1_0_e1_2])
@@ -442,7 +490,12 @@ Vitest.describe('syncstate', () => {
442
490
 
443
491
  Vitest.it.effect('should rebase different event with same id', () =>
444
492
  Effect.gen(function* () {
445
- const e2_0_b = TestEvent.new({ global: 1, client: 0 }, e1_0.seqNum, '1_0_b', false)
493
+ const e2_0_b = makeTestEvent({
494
+ seqNum: { global: 1, client: 0 },
495
+ parentSeqNum: e1_0.seqNum,
496
+ payload: '1_0_b',
497
+ isClientOnly: false,
498
+ })
446
499
  const syncState = new SyncState.SyncState({
447
500
  pending: [e2_0_b],
448
501
  upstreamHead: EventSequenceNumber.Client.ROOT,
@@ -452,7 +505,7 @@ Vitest.describe('syncstate', () => {
452
505
  syncState,
453
506
  payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e2_0] }),
454
507
  })
455
- const e2_0_e3_0 = e2_0_b.rebase_(e2_0.seqNum, 1)
508
+ const e2_0_e3_0 = rebaseTestEvent({ event: e2_0_b, parentSeqNum: e2_0.seqNum, rebaseGeneration: 1 })
456
509
 
457
510
  expectRebase(result)
458
511
  expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0])
@@ -475,7 +528,7 @@ Vitest.describe('syncstate', () => {
475
528
  payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
476
529
  })
477
530
 
478
- const e1_0_e3_0 = e1_0.rebase_(e2_0.seqNum, 1)
531
+ const e1_0_e3_0 = rebaseTestEvent({ event: e1_0, parentSeqNum: e2_0.seqNum, rebaseGeneration: 1 })
479
532
 
480
533
  expectRebase(result)
481
534
  expectEventArraysEqual(result.newSyncState.pending, [e1_0_e3_0])
@@ -496,7 +549,7 @@ Vitest.describe('syncstate', () => {
496
549
  payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_0, e1_2, e1_3, e2_0] }),
497
550
  })
498
551
 
499
- const e1_1_e2_1 = e1_1.rebase_(e2_0.seqNum, 1)
552
+ const e1_1_e2_1 = rebaseTestEvent({ event: e1_1, parentSeqNum: e2_0.seqNum, rebaseGeneration: 1 })
500
553
 
501
554
  expectRebase(result)
502
555
  expectEventArraysEqual(result.newSyncState.pending, [e1_1_e2_1])
@@ -519,8 +572,8 @@ Vitest.describe('syncstate', () => {
519
572
  payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
520
573
  })
521
574
 
522
- const e1_0_e2_1 = e1_0.rebase_(e2_0.seqNum, 1)
523
- const e1_1_e2_2 = e1_1.rebase_(e1_0_e2_1.seqNum, 1)
575
+ const e1_0_e2_1 = rebaseTestEvent({ event: e1_0, parentSeqNum: e2_0.seqNum, rebaseGeneration: 1 })
576
+ const e1_1_e2_2 = rebaseTestEvent({ event: e1_1, parentSeqNum: e1_0_e2_1.seqNum, rebaseGeneration: 1 })
524
577
 
525
578
  expectRebase(result)
526
579
  expectEventArraysEqual(result.newSyncState.pending, [e1_0_e2_1, e1_1_e2_2])
@@ -567,7 +620,7 @@ Vitest.describe('syncstate', () => {
567
620
  const result = yield* merge({
568
621
  syncState,
569
622
  payload: SyncState.PayloadLocalPush.make({ newEvents: [e0_1] }),
570
- ignoreClientEvents: true,
623
+ ignoreClientOnlyEvents: true,
571
624
  })
572
625
 
573
626
  expectAdvance(result)
@@ -578,28 +631,26 @@ Vitest.describe('syncstate', () => {
578
631
  }),
579
632
  )
580
633
 
581
- Vitest.it.effect(
582
- 'appends only upstream-bound events to pending when ignoring client-only pushes',
583
- () =>
584
- Effect.gen(function* () {
585
- const syncState = new SyncState.SyncState({
586
- pending: [],
587
- upstreamHead: EventSequenceNumber.Client.ROOT,
588
- localHead: EventSequenceNumber.Client.ROOT,
589
- })
590
-
591
- const result = yield* merge({
592
- syncState,
593
- payload: SyncState.PayloadLocalPush.make({ newEvents: [e0_1, e1_0] }),
594
- ignoreClientEvents: true,
595
- })
596
-
597
- expectAdvance(result)
598
- expectEventArraysEqual(result.newSyncState.pending, [e1_0])
599
- expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.Client.ROOT)
600
- expect(result.newSyncState.localHead).toMatchObject(e1_0.seqNum)
601
- expectEventArraysEqual(result.newEvents, [e0_1, e1_0])
602
- }),
634
+ Vitest.it.effect('appends only upstream-bound events to pending when ignoring client-only pushes', () =>
635
+ Effect.gen(function* () {
636
+ const syncState = new SyncState.SyncState({
637
+ pending: [],
638
+ upstreamHead: EventSequenceNumber.Client.ROOT,
639
+ localHead: EventSequenceNumber.Client.ROOT,
640
+ })
641
+
642
+ const result = yield* merge({
643
+ syncState,
644
+ payload: SyncState.PayloadLocalPush.make({ newEvents: [e0_1, e1_0] }),
645
+ ignoreClientOnlyEvents: true,
646
+ })
647
+
648
+ expectAdvance(result)
649
+ expectEventArraysEqual(result.newSyncState.pending, [e1_0])
650
+ expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.Client.ROOT)
651
+ expect(result.newSyncState.localHead).toMatchObject(e1_0.seqNum)
652
+ expectEventArraysEqual(result.newEvents, [e0_1, e1_0])
653
+ }),
603
654
  )
604
655
  })
605
656
 
@@ -639,20 +690,20 @@ const expectEventArraysEqual = (
639
690
  })
640
691
  }
641
692
 
642
- const expectAdvance: (
643
- result: typeof SyncState.MergeResult.Type,
644
- ) => asserts result is typeof SyncState.MergeResultAdvance.Type = (result) => {
693
+ const expectAdvance: (result: typeof SyncState.MergeResult.Type) => asserts result is SyncState.MergeResultAdvance = (
694
+ result,
695
+ ) => {
645
696
  expect(result._tag).toBe('advance')
646
697
  }
647
698
 
648
- const expectRebase: (
649
- result: typeof SyncState.MergeResult.Type,
650
- ) => asserts result is typeof SyncState.MergeResultRebase.Type = (result) => {
699
+ const expectRebase: (result: typeof SyncState.MergeResult.Type) => asserts result is SyncState.MergeResultRebase = (
700
+ result,
701
+ ) => {
651
702
  expect(result._tag, `Expected rebase, got ${result._tag}`).toBe('rebase')
652
703
  }
653
704
 
654
- const expectReject: (
655
- result: typeof SyncState.MergeResult.Type,
656
- ) => asserts result is typeof SyncState.MergeResultReject.Type = (result) => {
705
+ const expectReject: (result: typeof SyncState.MergeResult.Type) => asserts result is SyncState.MergeResultReject = (
706
+ result,
707
+ ) => {
657
708
  expect(result._tag).toBe('reject')
658
709
  }