@livestore/common 0.4.0-dev.9 → 0.5.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (580) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +27 -12
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
  5. package/dist/MaterializationJournal.d.ts +44 -0
  6. package/dist/MaterializationJournal.d.ts.map +1 -0
  7. package/dist/MaterializationJournal.js +112 -0
  8. package/dist/MaterializationJournal.js.map +1 -0
  9. package/dist/StateHead.d.ts +26 -0
  10. package/dist/StateHead.d.ts.map +1 -0
  11. package/dist/StateHead.js +50 -0
  12. package/dist/StateHead.js.map +1 -0
  13. package/dist/WorkerTransportError.d.ts +11 -0
  14. package/dist/WorkerTransportError.d.ts.map +1 -0
  15. package/dist/WorkerTransportError.js +11 -0
  16. package/dist/WorkerTransportError.js.map +1 -0
  17. package/dist/__tests__/fixture.d.ts +1 -1
  18. package/dist/__tests__/fixture.d.ts.map +1 -1
  19. package/dist/__tests__/fixture.js +3 -3
  20. package/dist/__tests__/fixture.js.map +1 -1
  21. package/dist/adapter-types.d.ts +59 -57
  22. package/dist/adapter-types.d.ts.map +1 -1
  23. package/dist/adapter-types.js +31 -22
  24. package/dist/adapter-types.js.map +1 -1
  25. package/dist/bounded-collections.d.ts.map +1 -1
  26. package/dist/bounded-collections.js +6 -4
  27. package/dist/bounded-collections.js.map +1 -1
  28. package/dist/debug-info.d.ts +56 -56
  29. package/dist/debug-info.d.ts.map +1 -1
  30. package/dist/debug-info.js +46 -32
  31. package/dist/debug-info.js.map +1 -1
  32. package/dist/defs.d.ts +9 -9
  33. package/dist/defs.js +2 -2
  34. package/dist/devtools/devtools-compatibility.test.d.ts +2 -0
  35. package/dist/devtools/devtools-compatibility.test.d.ts.map +1 -0
  36. package/dist/devtools/devtools-compatibility.test.js +16 -0
  37. package/dist/devtools/devtools-compatibility.test.js.map +1 -0
  38. package/dist/devtools/devtools-messages-client-session.d.ts +531 -312
  39. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  40. package/dist/devtools/devtools-messages-client-session.js +86 -67
  41. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  42. package/dist/devtools/devtools-messages-common.d.ts +32 -35
  43. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  44. package/dist/devtools/devtools-messages-common.js +12 -14
  45. package/dist/devtools/devtools-messages-common.js.map +1 -1
  46. package/dist/devtools/devtools-messages-leader.d.ts +417 -320
  47. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  48. package/dist/devtools/devtools-messages-leader.js +117 -87
  49. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  50. package/dist/devtools/devtools-sessioninfo.d.ts +28 -17
  51. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  52. package/dist/devtools/devtools-sessioninfo.js +12 -6
  53. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  54. package/dist/devtools/mod.d.ts +17 -7
  55. package/dist/devtools/mod.d.ts.map +1 -1
  56. package/dist/devtools/mod.js +19 -8
  57. package/dist/devtools/mod.js.map +1 -1
  58. package/dist/errors.d.ts +52 -46
  59. package/dist/errors.d.ts.map +1 -1
  60. package/dist/errors.js +31 -21
  61. package/dist/errors.js.map +1 -1
  62. package/dist/index.d.ts +7 -1
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +7 -1
  65. package/dist/index.js.map +1 -1
  66. package/dist/leader-thread/LeaderSyncProcessor.d.ts +116 -21
  67. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  68. package/dist/leader-thread/LeaderSyncProcessor.js +596 -470
  69. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  70. package/dist/leader-thread/RejectedPushError.d.ts +138 -0
  71. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
  72. package/dist/leader-thread/RejectedPushError.js +97 -0
  73. package/dist/leader-thread/RejectedPushError.js.map +1 -0
  74. package/dist/leader-thread/connection.d.ts +1 -0
  75. package/dist/leader-thread/connection.d.ts.map +1 -1
  76. package/dist/leader-thread/connection.js +10 -9
  77. package/dist/leader-thread/connection.js.map +1 -1
  78. package/dist/leader-thread/eventlog.d.ts +20 -15
  79. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  80. package/dist/leader-thread/eventlog.js +80 -20
  81. package/dist/leader-thread/eventlog.js.map +1 -1
  82. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
  83. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  84. package/dist/leader-thread/leader-worker-devtools.js +110 -62
  85. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  86. package/dist/leader-thread/make-leader-thread-layer.d.ts +19 -7
  87. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  88. package/dist/leader-thread/make-leader-thread-layer.js +67 -45
  89. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  90. package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
  91. package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
  92. package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
  93. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
  94. package/dist/leader-thread/materialize-event.d.ts +3 -2
  95. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  96. package/dist/leader-thread/materialize-event.js +32 -9
  97. package/dist/leader-thread/materialize-event.js.map +1 -1
  98. package/dist/leader-thread/mod.d.ts +1 -0
  99. package/dist/leader-thread/mod.d.ts.map +1 -1
  100. package/dist/leader-thread/mod.js +1 -0
  101. package/dist/leader-thread/mod.js.map +1 -1
  102. package/dist/leader-thread/recreate-db.d.ts +2 -2
  103. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  104. package/dist/leader-thread/recreate-db.js +19 -40
  105. package/dist/leader-thread/recreate-db.js.map +1 -1
  106. package/dist/leader-thread/shutdown-channel.d.ts +3 -7
  107. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  108. package/dist/leader-thread/shutdown-channel.js +2 -3
  109. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  110. package/dist/leader-thread/stream-events.d.ts +53 -0
  111. package/dist/leader-thread/stream-events.d.ts.map +1 -0
  112. package/dist/leader-thread/stream-events.js +164 -0
  113. package/dist/leader-thread/stream-events.js.map +1 -0
  114. package/dist/leader-thread/types.d.ts +92 -51
  115. package/dist/leader-thread/types.d.ts.map +1 -1
  116. package/dist/leader-thread/types.js +17 -4
  117. package/dist/leader-thread/types.js.map +1 -1
  118. package/dist/logging.d.ts +15 -0
  119. package/dist/logging.d.ts.map +1 -0
  120. package/dist/logging.js +2 -0
  121. package/dist/logging.js.map +1 -0
  122. package/dist/make-client-session.d.ts +6 -5
  123. package/dist/make-client-session.d.ts.map +1 -1
  124. package/dist/make-client-session.js +10 -7
  125. package/dist/make-client-session.js.map +1 -1
  126. package/dist/materializer-helper.d.ts +6 -7
  127. package/dist/materializer-helper.d.ts.map +1 -1
  128. package/dist/materializer-helper.js +22 -40
  129. package/dist/materializer-helper.js.map +1 -1
  130. package/dist/otel.d.ts +4 -4
  131. package/dist/otel.d.ts.map +1 -1
  132. package/dist/otel.js +8 -8
  133. package/dist/otel.js.map +1 -1
  134. package/dist/rematerialize-from-eventlog.d.ts +3 -3
  135. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  136. package/dist/rematerialize-from-eventlog.js +52 -39
  137. package/dist/rematerialize-from-eventlog.js.map +1 -1
  138. package/dist/schema/EventDef/define.d.ts +161 -0
  139. package/dist/schema/EventDef/define.d.ts.map +1 -0
  140. package/dist/schema/EventDef/define.js +140 -0
  141. package/dist/schema/EventDef/define.js.map +1 -0
  142. package/dist/schema/EventDef/define.test.d.ts +2 -0
  143. package/dist/schema/EventDef/define.test.d.ts.map +1 -0
  144. package/dist/schema/EventDef/define.test.js +23 -0
  145. package/dist/schema/EventDef/define.test.js.map +1 -0
  146. package/dist/schema/EventDef/deprecated.d.ts +94 -0
  147. package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
  148. package/dist/schema/EventDef/deprecated.js +143 -0
  149. package/dist/schema/EventDef/deprecated.js.map +1 -0
  150. package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
  151. package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
  152. package/dist/schema/EventDef/deprecated.test.js +95 -0
  153. package/dist/schema/EventDef/deprecated.test.js.map +1 -0
  154. package/dist/schema/EventDef/event-def.d.ts +110 -0
  155. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  156. package/dist/schema/EventDef/event-def.js +2 -0
  157. package/dist/schema/EventDef/event-def.js.map +1 -0
  158. package/dist/schema/EventDef/facts.d.ts +118 -0
  159. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  160. package/dist/schema/EventDef/facts.js +53 -0
  161. package/dist/schema/EventDef/facts.js.map +1 -0
  162. package/dist/schema/EventDef/materializer.d.ts +155 -0
  163. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  164. package/dist/schema/EventDef/materializer.js +83 -0
  165. package/dist/schema/EventDef/materializer.js.map +1 -0
  166. package/dist/schema/EventDef/mod.d.ts +6 -0
  167. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  168. package/dist/schema/EventDef/mod.js +6 -0
  169. package/dist/schema/EventDef/mod.js.map +1 -0
  170. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  171. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  172. package/dist/schema/EventSequenceNumber/client.js +192 -0
  173. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  174. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  175. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  176. package/dist/schema/EventSequenceNumber/global.js +14 -0
  177. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  178. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  179. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  180. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  181. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  182. package/dist/schema/EventSequenceNumber.test.js +44 -44
  183. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  184. package/dist/schema/LiveStoreEvent/client.d.ts +168 -0
  185. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  186. package/dist/schema/LiveStoreEvent/client.js +179 -0
  187. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  188. package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
  189. package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
  190. package/dist/schema/LiveStoreEvent/client.test.js +120 -0
  191. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
  192. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  193. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  194. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  195. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  196. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  197. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  198. package/dist/schema/LiveStoreEvent/global.js +31 -0
  199. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  200. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  201. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  202. package/dist/schema/LiveStoreEvent/input.js +26 -0
  203. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  204. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  205. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  206. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  207. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  208. package/dist/schema/events.d.ts +1 -1
  209. package/dist/schema/events.d.ts.map +1 -1
  210. package/dist/schema/events.js +1 -1
  211. package/dist/schema/events.js.map +1 -1
  212. package/dist/schema/mod.d.ts +7 -4
  213. package/dist/schema/mod.d.ts.map +1 -1
  214. package/dist/schema/mod.js +6 -4
  215. package/dist/schema/mod.js.map +1 -1
  216. package/dist/schema/schema.d.ts +16 -1
  217. package/dist/schema/schema.d.ts.map +1 -1
  218. package/dist/schema/schema.js +34 -5
  219. package/dist/schema/schema.js.map +1 -1
  220. package/dist/schema/state/sqlite/client-document-def.d.ts +14 -18
  221. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  222. package/dist/schema/state/sqlite/client-document-def.js +54 -30
  223. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  224. package/dist/schema/state/sqlite/client-document-def.test.js +146 -6
  225. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  226. package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
  227. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  228. package/dist/schema/state/sqlite/column-annotations.js +13 -15
  229. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  230. package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
  231. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  232. package/dist/schema/state/sqlite/column-def.d.ts +1 -1
  233. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  234. package/dist/schema/state/sqlite/column-def.js +132 -57
  235. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  236. package/dist/schema/state/sqlite/column-def.test.js +155 -70
  237. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  238. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  239. package/dist/schema/state/sqlite/column-spec.js +30 -12
  240. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  241. package/dist/schema/state/sqlite/column-spec.test.js +26 -17
  242. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  243. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -2
  244. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  245. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +15 -6
  246. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  247. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +25 -19
  248. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  249. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +22 -16
  250. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  251. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +28 -17
  252. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  253. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +14 -12
  254. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  255. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +6 -4
  256. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  257. package/dist/schema/state/sqlite/mod.d.ts +3 -5
  258. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  259. package/dist/schema/state/sqlite/mod.js +6 -8
  260. package/dist/schema/state/sqlite/mod.js.map +1 -1
  261. package/dist/schema/state/sqlite/persistence.d.ts +11 -0
  262. package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
  263. package/dist/schema/state/sqlite/persistence.js +10 -0
  264. package/dist/schema/state/sqlite/persistence.js.map +1 -0
  265. package/dist/schema/state/sqlite/query-builder/api.d.ts +58 -29
  266. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  267. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  268. package/dist/schema/state/sqlite/query-builder/astToSql.js +105 -24
  269. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  270. package/dist/schema/state/sqlite/query-builder/impl.d.ts +4 -2
  271. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  272. package/dist/schema/state/sqlite/query-builder/impl.js +42 -27
  273. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  274. package/dist/schema/state/sqlite/query-builder/impl.test.js +402 -498
  275. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  276. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  277. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  278. package/dist/schema/state/sqlite/schema-helpers.js +24 -14
  279. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  280. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  281. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  282. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  283. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  284. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +515 -0
  285. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
  286. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
  287. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
  288. package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
  289. package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
  290. package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
  291. package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
  292. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +678 -0
  293. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
  294. package/dist/schema/state/sqlite/system-tables/state-tables.js +87 -0
  295. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
  296. package/dist/schema/state/sqlite/table-def.d.ts +19 -20
  297. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  298. package/dist/schema/state/sqlite/table-def.js +54 -4
  299. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  300. package/dist/schema/state/sqlite/table-def.test.js +226 -20
  301. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  302. package/dist/schema/unknown-events.d.ts +47 -0
  303. package/dist/schema/unknown-events.d.ts.map +1 -0
  304. package/dist/schema/unknown-events.js +70 -0
  305. package/dist/schema/unknown-events.js.map +1 -0
  306. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
  307. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
  308. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
  309. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
  310. package/dist/schema-management/common.js +2 -2
  311. package/dist/schema-management/common.js.map +1 -1
  312. package/dist/schema-management/migrations.d.ts +32 -2
  313. package/dist/schema-management/migrations.d.ts.map +1 -1
  314. package/dist/schema-management/migrations.js +38 -6
  315. package/dist/schema-management/migrations.js.map +1 -1
  316. package/dist/schema-management/validate-schema.d.ts +3 -3
  317. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  318. package/dist/schema-management/validate-schema.js +2 -2
  319. package/dist/schema-management/validate-schema.js.map +1 -1
  320. package/dist/session-id-symbol.d.ts +29 -0
  321. package/dist/session-id-symbol.d.ts.map +1 -0
  322. package/dist/session-id-symbol.js +44 -0
  323. package/dist/session-id-symbol.js.map +1 -0
  324. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  325. package/dist/sql-queries/sql-queries.js +26 -16
  326. package/dist/sql-queries/sql-queries.js.map +1 -1
  327. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  328. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  329. package/dist/sql-queries/types.d.ts +6 -7
  330. package/dist/sql-queries/types.d.ts.map +1 -1
  331. package/dist/sql-queries/types.js.map +1 -1
  332. package/dist/sqlite-db-helper.d.ts +21 -1
  333. package/dist/sqlite-db-helper.d.ts.map +1 -1
  334. package/dist/sqlite-db-helper.js +40 -5
  335. package/dist/sqlite-db-helper.js.map +1 -1
  336. package/dist/sqlite-types.d.ts +8 -11
  337. package/dist/sqlite-types.d.ts.map +1 -1
  338. package/dist/sqlite-types.js +3 -3
  339. package/dist/sqlite-types.js.map +1 -1
  340. package/dist/sync/ClientSessionSyncProcessor.d.ts +47 -25
  341. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  342. package/dist/sync/ClientSessionSyncProcessor.js +269 -154
  343. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  344. package/dist/sync/errors.d.ts +12 -51
  345. package/dist/sync/errors.d.ts.map +1 -1
  346. package/dist/sync/errors.js +7 -24
  347. package/dist/sync/errors.js.map +1 -1
  348. package/dist/sync/index.d.ts +2 -0
  349. package/dist/sync/index.d.ts.map +1 -1
  350. package/dist/sync/index.js +2 -0
  351. package/dist/sync/index.js.map +1 -1
  352. package/dist/sync/mock-sync-backend.d.ts +11 -10
  353. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  354. package/dist/sync/mock-sync-backend.js +97 -74
  355. package/dist/sync/mock-sync-backend.js.map +1 -1
  356. package/dist/sync/mock-sync-backend.test.d.ts +2 -0
  357. package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
  358. package/dist/sync/mock-sync-backend.test.js +49 -0
  359. package/dist/sync/mock-sync-backend.test.js.map +1 -0
  360. package/dist/sync/next/compact-events.d.ts.map +1 -1
  361. package/dist/sync/next/compact-events.js +11 -12
  362. package/dist/sync/next/compact-events.js.map +1 -1
  363. package/dist/sync/next/facts.d.ts +5 -5
  364. package/dist/sync/next/facts.d.ts.map +1 -1
  365. package/dist/sync/next/facts.js +7 -8
  366. package/dist/sync/next/facts.js.map +1 -1
  367. package/dist/sync/next/history-dag-common.d.ts +58 -15
  368. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  369. package/dist/sync/next/history-dag-common.js +219 -9
  370. package/dist/sync/next/history-dag-common.js.map +1 -1
  371. package/dist/sync/next/history-dag.d.ts.map +1 -1
  372. package/dist/sync/next/history-dag.js +12 -11
  373. package/dist/sync/next/history-dag.js.map +1 -1
  374. package/dist/sync/next/rebase-events.d.ts +5 -5
  375. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  376. package/dist/sync/next/rebase-events.js +6 -6
  377. package/dist/sync/next/rebase-events.js.map +1 -1
  378. package/dist/sync/next/test/compact-events.calculator.test.js +4 -4
  379. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  380. package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
  381. package/dist/sync/next/test/compact-events.test.js +2 -2
  382. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  383. package/dist/sync/next/test/event-fixtures.d.ts +9 -9
  384. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  385. package/dist/sync/next/test/event-fixtures.js +12 -12
  386. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  387. package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
  388. package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
  389. package/dist/sync/next/test/history-dag-common.test.js +73 -0
  390. package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
  391. package/dist/sync/sync-backend-kv.d.ts +3 -3
  392. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  393. package/dist/sync/sync-backend-kv.js +6 -4
  394. package/dist/sync/sync-backend-kv.js.map +1 -1
  395. package/dist/sync/sync-backend.d.ts +41 -21
  396. package/dist/sync/sync-backend.d.ts.map +1 -1
  397. package/dist/sync/sync-backend.js +45 -4
  398. package/dist/sync/sync-backend.js.map +1 -1
  399. package/dist/sync/sync.d.ts +23 -2
  400. package/dist/sync/sync.d.ts.map +1 -1
  401. package/dist/sync/syncstate.d.ts +115 -191
  402. package/dist/sync/syncstate.d.ts.map +1 -1
  403. package/dist/sync/syncstate.js +108 -129
  404. package/dist/sync/syncstate.js.map +1 -1
  405. package/dist/sync/syncstate.test.js +289 -161
  406. package/dist/sync/syncstate.test.js.map +1 -1
  407. package/dist/sync/transport-chunking.d.ts +35 -0
  408. package/dist/sync/transport-chunking.d.ts.map +1 -0
  409. package/dist/sync/transport-chunking.js +47 -0
  410. package/dist/sync/transport-chunking.js.map +1 -0
  411. package/dist/sync/validate-push-payload.d.ts +2 -2
  412. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  413. package/dist/sync/validate-push-payload.js +4 -6
  414. package/dist/sync/validate-push-payload.js.map +1 -1
  415. package/dist/testing/event-factory.d.ts +3 -3
  416. package/dist/testing/event-factory.d.ts.map +1 -1
  417. package/dist/testing/event-factory.js +5 -7
  418. package/dist/testing/event-factory.js.map +1 -1
  419. package/dist/util.d.ts +11 -4
  420. package/dist/util.d.ts.map +1 -1
  421. package/dist/util.js +21 -4
  422. package/dist/util.js.map +1 -1
  423. package/dist/version.d.ts +24 -5
  424. package/dist/version.d.ts.map +1 -1
  425. package/dist/version.js +25 -8
  426. package/dist/version.js.map +1 -1
  427. package/package.json +50 -16
  428. package/src/ClientSessionLeaderThreadProxy.ts +27 -12
  429. package/src/MaterializationJournal.ts +184 -0
  430. package/src/StateHead.ts +80 -0
  431. package/src/WorkerTransportError.ts +12 -0
  432. package/src/__tests__/fixture.ts +3 -3
  433. package/src/adapter-types.ts +62 -56
  434. package/src/bounded-collections.ts +6 -5
  435. package/src/debug-info.ts +54 -43
  436. package/src/defs.ts +2 -2
  437. package/src/devtools/devtools-compatibility.test.ts +19 -0
  438. package/src/devtools/devtools-messages-client-session.ts +72 -63
  439. package/src/devtools/devtools-messages-common.ts +18 -22
  440. package/src/devtools/devtools-messages-leader.ts +89 -68
  441. package/src/devtools/devtools-sessioninfo.ts +17 -12
  442. package/src/devtools/mod.ts +15 -7
  443. package/src/errors.ts +58 -38
  444. package/src/index.ts +11 -1
  445. package/src/leader-thread/LeaderSyncProcessor.ts +927 -674
  446. package/src/leader-thread/RejectedPushError.ts +119 -0
  447. package/src/leader-thread/connection.ts +13 -9
  448. package/src/leader-thread/eventlog.ts +114 -41
  449. package/src/leader-thread/leader-worker-devtools.ts +223 -124
  450. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  451. package/src/leader-thread/make-leader-thread-layer.ts +170 -82
  452. package/src/leader-thread/materialize-event.ts +51 -16
  453. package/src/leader-thread/mod.ts +1 -0
  454. package/src/leader-thread/recreate-db.ts +26 -61
  455. package/src/leader-thread/shutdown-channel.ts +3 -18
  456. package/src/leader-thread/stream-events.ts +209 -0
  457. package/src/leader-thread/types.ts +77 -65
  458. package/src/logging.ts +15 -0
  459. package/src/make-client-session.ts +16 -10
  460. package/src/materializer-helper.ts +31 -49
  461. package/src/otel.ts +15 -13
  462. package/src/rematerialize-from-eventlog.ts +106 -93
  463. package/src/schema/EventDef/define.test.ts +28 -0
  464. package/src/schema/EventDef/define.ts +218 -0
  465. package/src/schema/EventDef/deprecated.test.ts +122 -0
  466. package/src/schema/EventDef/deprecated.ts +172 -0
  467. package/src/schema/EventDef/event-def.ts +123 -0
  468. package/src/schema/EventDef/facts.ts +135 -0
  469. package/src/schema/EventDef/materializer.ts +172 -0
  470. package/src/schema/EventDef/mod.ts +5 -0
  471. package/src/schema/EventSequenceNumber/client.ts +256 -0
  472. package/src/schema/EventSequenceNumber/global.ts +19 -0
  473. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  474. package/src/schema/EventSequenceNumber.test.ts +72 -53
  475. package/src/schema/LiveStoreEvent/client.test.ts +142 -0
  476. package/src/schema/LiveStoreEvent/client.ts +236 -0
  477. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  478. package/src/schema/LiveStoreEvent/global.ts +45 -0
  479. package/src/schema/LiveStoreEvent/input.ts +63 -0
  480. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  481. package/src/schema/events.ts +1 -1
  482. package/src/schema/mod.ts +7 -4
  483. package/src/schema/schema.ts +48 -6
  484. package/src/schema/state/sqlite/client-document-def.test.ts +172 -14
  485. package/src/schema/state/sqlite/client-document-def.ts +126 -98
  486. package/src/schema/state/sqlite/column-annotations.test.ts +27 -45
  487. package/src/schema/state/sqlite/column-annotations.ts +27 -30
  488. package/src/schema/state/sqlite/column-def.test.ts +186 -77
  489. package/src/schema/state/sqlite/column-def.ts +169 -62
  490. package/src/schema/state/sqlite/column-spec.test.ts +34 -19
  491. package/src/schema/state/sqlite/column-spec.ts +38 -11
  492. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +17 -7
  493. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
  494. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +37 -17
  495. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +65 -45
  496. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +48 -40
  497. package/src/schema/state/sqlite/mod.ts +9 -12
  498. package/src/schema/state/sqlite/persistence.ts +11 -0
  499. package/src/schema/state/sqlite/query-builder/api.ts +61 -23
  500. package/src/schema/state/sqlite/query-builder/astToSql.ts +117 -23
  501. package/src/schema/state/sqlite/query-builder/impl.test.ts +489 -551
  502. package/src/schema/state/sqlite/query-builder/impl.ts +43 -26
  503. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  504. package/src/schema/state/sqlite/schema-helpers.ts +30 -22
  505. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  506. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  507. package/src/schema/state/sqlite/system-tables/state-tables.ts +109 -0
  508. package/src/schema/state/sqlite/table-def.test.ts +295 -46
  509. package/src/schema/state/sqlite/table-def.ts +109 -64
  510. package/src/schema/unknown-events.ts +132 -0
  511. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
  512. package/src/schema-management/common.ts +2 -2
  513. package/src/schema-management/migrations.ts +42 -9
  514. package/src/schema-management/validate-schema.ts +3 -3
  515. package/src/session-id-symbol.ts +59 -0
  516. package/src/sql-queries/sql-queries.ts +26 -18
  517. package/src/sql-queries/sql-query-builder.ts +1 -0
  518. package/src/sql-queries/types.ts +6 -7
  519. package/src/sqlite-db-helper.ts +67 -5
  520. package/src/sqlite-types.ts +9 -11
  521. package/src/sync/ClientSessionSyncProcessor.ts +388 -194
  522. package/src/sync/errors.ts +18 -28
  523. package/src/sync/index.ts +2 -0
  524. package/src/sync/mock-sync-backend.test.ts +78 -0
  525. package/src/sync/mock-sync-backend.ts +196 -108
  526. package/src/sync/next/compact-events.ts +10 -11
  527. package/src/sync/next/facts.ts +13 -14
  528. package/src/sync/next/history-dag-common.ts +306 -26
  529. package/src/sync/next/history-dag.ts +20 -13
  530. package/src/sync/next/rebase-events.ts +12 -12
  531. package/src/sync/next/test/compact-events.calculator.test.ts +5 -4
  532. package/src/sync/next/test/compact-events.test.ts +4 -3
  533. package/src/sync/next/test/event-fixtures.ts +14 -14
  534. package/src/sync/next/test/history-dag-common.test.ts +87 -0
  535. package/src/sync/sync-backend-kv.ts +7 -4
  536. package/src/sync/sync-backend.ts +75 -26
  537. package/src/sync/sync.ts +24 -2
  538. package/src/sync/syncstate.test.ts +657 -442
  539. package/src/sync/syncstate.ts +175 -160
  540. package/src/sync/transport-chunking.ts +85 -0
  541. package/src/sync/validate-push-payload.ts +6 -8
  542. package/src/testing/event-factory.ts +10 -12
  543. package/src/util.ts +20 -11
  544. package/src/version.ts +32 -8
  545. package/dist/schema/EventDef.d.ts +0 -126
  546. package/dist/schema/EventDef.d.ts.map +0 -1
  547. package/dist/schema/EventDef.js +0 -46
  548. package/dist/schema/EventDef.js.map +0 -1
  549. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  550. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  551. package/dist/schema/EventSequenceNumber.js +0 -139
  552. package/dist/schema/EventSequenceNumber.js.map +0 -1
  553. package/dist/schema/LiveStoreEvent.d.ts +0 -306
  554. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  555. package/dist/schema/LiveStoreEvent.js +0 -147
  556. package/dist/schema/LiveStoreEvent.js.map +0 -1
  557. package/dist/schema/state/sqlite/system-tables.d.ts +0 -976
  558. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  559. package/dist/schema/state/sqlite/system-tables.js +0 -81
  560. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  561. package/dist/sql-queries/misc.d.ts +0 -2
  562. package/dist/sql-queries/misc.d.ts.map +0 -1
  563. package/dist/sql-queries/misc.js +0 -2
  564. package/dist/sql-queries/misc.js.map +0 -1
  565. package/dist/sync/next/graphology.d.ts +0 -8
  566. package/dist/sync/next/graphology.d.ts.map +0 -1
  567. package/dist/sync/next/graphology.js +0 -30
  568. package/dist/sync/next/graphology.js.map +0 -1
  569. package/dist/sync/next/graphology_.d.ts +0 -3
  570. package/dist/sync/next/graphology_.d.ts.map +0 -1
  571. package/dist/sync/next/graphology_.js +0 -3
  572. package/dist/sync/next/graphology_.js.map +0 -1
  573. package/src/schema/EventDef.ts +0 -222
  574. package/src/schema/EventSequenceNumber.ts +0 -199
  575. package/src/schema/LiveStoreEvent.ts +0 -286
  576. package/src/schema/state/sqlite/system-tables.ts +0 -106
  577. package/src/sql-queries/misc.ts +0 -2
  578. package/src/sync/next/ambient.d.ts +0 -3
  579. package/src/sync/next/graphology.ts +0 -41
  580. package/src/sync/next/graphology_.ts +0 -2
@@ -1,17 +1,18 @@
1
- import { Vitest } from '@livestore/utils-dev/node-vitest'
2
1
  import { expect } from 'vitest'
3
2
 
3
+ import { Vitest } from '@livestore/utils-dev/node-vitest'
4
+
4
5
  import { EventSequenceNumber } from './mod.ts'
5
6
 
6
7
  Vitest.describe('EventSequenceNumber', () => {
7
8
  Vitest.test('nextPair (no rebase)', () => {
8
- const e_0_0 = EventSequenceNumber.make({ global: 0, client: 0 })
9
- expect(EventSequenceNumber.nextPair({ seqNum: e_0_0, isClient: false }).seqNum).toStrictEqual({
9
+ const e_0_0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 })
10
+ expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: false }).seqNum).toStrictEqual({
10
11
  global: 1,
11
12
  client: 0,
12
13
  rebaseGeneration: 0,
13
14
  })
14
- expect(EventSequenceNumber.nextPair({ seqNum: e_0_0, isClient: true }).seqNum).toStrictEqual({
15
+ expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: true }).seqNum).toStrictEqual({
15
16
  global: 0,
16
17
  client: 1,
17
18
  rebaseGeneration: 0,
@@ -19,65 +20,83 @@ Vitest.describe('EventSequenceNumber', () => {
19
20
  })
20
21
 
21
22
  Vitest.test('nextPair (rebase)', () => {
22
- const e_0_0 = EventSequenceNumber.make({ global: 0, client: 0 })
23
- expect(EventSequenceNumber.nextPair({ seqNum: e_0_0, isClient: false, rebaseGeneration: 1 }).seqNum).toStrictEqual({
23
+ const e_0_0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 })
24
+ expect(
25
+ EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: false, rebaseGeneration: 1 }).seqNum,
26
+ ).toStrictEqual({
24
27
  global: 1,
25
28
  client: 0,
26
- rebaseGeneration: 0,
29
+ rebaseGeneration: 1,
27
30
  })
28
- expect(EventSequenceNumber.nextPair({ seqNum: e_0_0, isClient: true, rebaseGeneration: 1 }).seqNum).toStrictEqual({
31
+ expect(
32
+ EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: true, rebaseGeneration: 1 }).seqNum,
33
+ ).toStrictEqual({
29
34
  global: 0,
30
35
  client: 1,
31
36
  rebaseGeneration: 1,
32
37
  })
33
38
 
34
- const e_0_0_g1 = EventSequenceNumber.make({ global: 0, client: 0, rebaseGeneration: 2 })
35
- expect(EventSequenceNumber.nextPair({ seqNum: e_0_0_g1, isClient: false }).seqNum).toStrictEqual({
39
+ const e_0_0_g1 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 2 })
40
+ expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0_g1, isClientOnly: false }).seqNum).toStrictEqual({
36
41
  global: 1,
37
42
  client: 0,
38
- rebaseGeneration: 0,
43
+ rebaseGeneration: 2,
39
44
  })
40
45
  })
41
46
 
42
47
  Vitest.test('toString', () => {
43
- expect(EventSequenceNumber.toString(EventSequenceNumber.make({ global: 0, client: 0 }))).toBe('e0')
44
- expect(EventSequenceNumber.toString(EventSequenceNumber.make({ global: 0, client: 0, rebaseGeneration: 1 }))).toBe(
45
- 'e0r1',
46
- )
47
- expect(EventSequenceNumber.toString(EventSequenceNumber.make({ global: 0, client: 1 }))).toBe('e0+1')
48
- expect(EventSequenceNumber.toString(EventSequenceNumber.make({ global: 0, client: 1, rebaseGeneration: 1 }))).toBe(
49
- 'e0+1r1',
50
- )
51
- expect(EventSequenceNumber.toString(EventSequenceNumber.make({ global: 5, client: 3, rebaseGeneration: 2 }))).toBe(
52
- 'e5+3r2',
53
- )
48
+ expect(
49
+ EventSequenceNumber.Client.toString(EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 })),
50
+ ).toBe('e0')
51
+ expect(
52
+ EventSequenceNumber.Client.toString(
53
+ EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 1 }),
54
+ ),
55
+ ).toBe('e0r1')
56
+ expect(
57
+ EventSequenceNumber.Client.toString(EventSequenceNumber.Client.Composite.make({ global: 0, client: 1 })),
58
+ ).toBe('e0.1')
59
+ expect(
60
+ EventSequenceNumber.Client.toString(
61
+ EventSequenceNumber.Client.Composite.make({ global: 0, client: 1, rebaseGeneration: 1 }),
62
+ ),
63
+ ).toBe('e0.1r1')
64
+ expect(
65
+ EventSequenceNumber.Client.toString(
66
+ EventSequenceNumber.Client.Composite.make({ global: 5, client: 3, rebaseGeneration: 2 }),
67
+ ),
68
+ ).toBe('e5.3r2')
54
69
  })
55
70
 
56
71
  Vitest.test('fromString', () => {
57
72
  // Basic cases
58
- expect(EventSequenceNumber.fromString('e0')).toStrictEqual(EventSequenceNumber.make({ global: 0, client: 0 }))
59
- expect(EventSequenceNumber.fromString('e0r1')).toStrictEqual(
60
- EventSequenceNumber.make({ global: 0, client: 0, rebaseGeneration: 1 }),
73
+ expect(EventSequenceNumber.Client.fromString('e0')).toStrictEqual(
74
+ EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 }),
75
+ )
76
+ expect(EventSequenceNumber.Client.fromString('e0r1')).toStrictEqual(
77
+ EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 1 }),
78
+ )
79
+ expect(EventSequenceNumber.Client.fromString('e0.1')).toStrictEqual(
80
+ EventSequenceNumber.Client.Composite.make({ global: 0, client: 1 }),
61
81
  )
62
- expect(EventSequenceNumber.fromString('e0+1')).toStrictEqual(EventSequenceNumber.make({ global: 0, client: 1 }))
63
- expect(EventSequenceNumber.fromString('e0+1r1')).toStrictEqual(
64
- EventSequenceNumber.make({ global: 0, client: 1, rebaseGeneration: 1 }),
82
+ expect(EventSequenceNumber.Client.fromString('e0.1r1')).toStrictEqual(
83
+ EventSequenceNumber.Client.Composite.make({ global: 0, client: 1, rebaseGeneration: 1 }),
65
84
  )
66
- expect(EventSequenceNumber.fromString('e5+3r2')).toStrictEqual(
67
- EventSequenceNumber.make({ global: 5, client: 3, rebaseGeneration: 2 }),
85
+ expect(EventSequenceNumber.Client.fromString('e5.3r2')).toStrictEqual(
86
+ EventSequenceNumber.Client.Composite.make({ global: 5, client: 3, rebaseGeneration: 2 }),
68
87
  )
69
88
 
70
89
  // Error cases
71
- expect(() => EventSequenceNumber.fromString('0')).toThrow(
90
+ expect(() => EventSequenceNumber.Client.fromString('0')).toThrow(
72
91
  'Invalid event sequence number string: must start with "e"',
73
92
  )
74
- expect(() => EventSequenceNumber.fromString('eabc')).toThrow(
93
+ expect(() => EventSequenceNumber.Client.fromString('eabc')).toThrow(
75
94
  'Invalid event sequence number string: invalid number format',
76
95
  )
77
- expect(() => EventSequenceNumber.fromString('e0+abc')).toThrow(
96
+ expect(() => EventSequenceNumber.Client.fromString('e0.abc')).toThrow(
78
97
  'Invalid event sequence number string: invalid number format',
79
98
  )
80
- expect(() => EventSequenceNumber.fromString('e0rabc')).toThrow(
99
+ expect(() => EventSequenceNumber.Client.fromString('e0rabc')).toThrow(
81
100
  'Invalid event sequence number string: invalid number format',
82
101
  )
83
102
  })
@@ -93,37 +112,37 @@ Vitest.describe('EventSequenceNumber', () => {
93
112
  ]
94
113
 
95
114
  for (const testCase of testCases) {
96
- const original = EventSequenceNumber.make(testCase)
97
- const str = EventSequenceNumber.toString(original)
98
- const parsed = EventSequenceNumber.fromString(str)
115
+ const original = EventSequenceNumber.Client.Composite.make(testCase)
116
+ const str = EventSequenceNumber.Client.toString(original)
117
+ const parsed = EventSequenceNumber.Client.fromString(str)
99
118
  expect(parsed).toStrictEqual(original)
100
119
  }
101
120
  })
102
121
 
103
122
  Vitest.test('compare', () => {
104
- const e_0_0_r0 = EventSequenceNumber.make({ global: 0, client: 0, rebaseGeneration: 0 })
105
- const e_0_0_r1 = EventSequenceNumber.make({ global: 0, client: 0, rebaseGeneration: 1 })
106
- const e_0_1_r0 = EventSequenceNumber.make({ global: 0, client: 1, rebaseGeneration: 0 })
107
- const e_0_1_r1 = EventSequenceNumber.make({ global: 0, client: 1, rebaseGeneration: 1 })
108
- const e_1_0_r0 = EventSequenceNumber.make({ global: 1, client: 0, rebaseGeneration: 0 })
109
- const e_1_1_r0 = EventSequenceNumber.make({ global: 1, client: 1, rebaseGeneration: 0 })
123
+ const e_0_0_r0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 0 })
124
+ const e_0_0_r1 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 1 })
125
+ const e_0_1_r0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 1, rebaseGeneration: 0 })
126
+ const e_0_1_r1 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 1, rebaseGeneration: 1 })
127
+ const e_1_0_r0 = EventSequenceNumber.Client.Composite.make({ global: 1, client: 0, rebaseGeneration: 0 })
128
+ const e_1_1_r0 = EventSequenceNumber.Client.Composite.make({ global: 1, client: 1, rebaseGeneration: 0 })
110
129
 
111
130
  // Global comparison (strongest level)
112
- expect(EventSequenceNumber.compare(e_0_0_r0, e_1_0_r0)).toBeLessThan(0)
113
- expect(EventSequenceNumber.compare(e_1_0_r0, e_0_0_r0)).toBeGreaterThan(0)
114
- expect(EventSequenceNumber.compare(e_0_1_r1, e_1_0_r0)).toBeLessThan(0) // global overrides client and rebase
131
+ expect(EventSequenceNumber.Client.compare(e_0_0_r0, e_1_0_r0)).toBeLessThan(0)
132
+ expect(EventSequenceNumber.Client.compare(e_1_0_r0, e_0_0_r0)).toBeGreaterThan(0)
133
+ expect(EventSequenceNumber.Client.compare(e_0_1_r1, e_1_0_r0)).toBeLessThan(0) // global overrides client and rebase
115
134
 
116
135
  // Client comparison (second level)
117
- expect(EventSequenceNumber.compare(e_0_0_r0, e_0_1_r0)).toBeLessThan(0)
118
- expect(EventSequenceNumber.compare(e_0_1_r0, e_0_0_r0)).toBeGreaterThan(0)
119
- expect(EventSequenceNumber.compare(e_0_0_r1, e_0_1_r0)).toBeLessThan(0) // client overrides rebase
136
+ expect(EventSequenceNumber.Client.compare(e_0_0_r0, e_0_1_r0)).toBeLessThan(0)
137
+ expect(EventSequenceNumber.Client.compare(e_0_1_r0, e_0_0_r0)).toBeGreaterThan(0)
138
+ expect(EventSequenceNumber.Client.compare(e_0_0_r1, e_0_1_r0)).toBeLessThan(0) // client overrides rebase
120
139
 
121
140
  // Rebase generation comparison (weakest level)
122
- expect(EventSequenceNumber.compare(e_0_0_r0, e_0_0_r1)).toBeLessThan(0)
123
- expect(EventSequenceNumber.compare(e_0_0_r1, e_0_0_r0)).toBeGreaterThan(0)
141
+ expect(EventSequenceNumber.Client.compare(e_0_0_r0, e_0_0_r1)).toBeLessThan(0)
142
+ expect(EventSequenceNumber.Client.compare(e_0_0_r1, e_0_0_r0)).toBeGreaterThan(0)
124
143
 
125
144
  // Equal comparison
126
- expect(EventSequenceNumber.compare(e_0_0_r0, e_0_0_r0)).toBe(0)
127
- expect(EventSequenceNumber.compare(e_1_1_r0, e_1_1_r0)).toBe(0)
145
+ expect(EventSequenceNumber.Client.compare(e_0_0_r0, e_0_0_r0)).toBe(0)
146
+ expect(EventSequenceNumber.Client.compare(e_1_1_r0, e_1_1_r0)).toBe(0)
128
147
  })
129
148
  })
@@ -0,0 +1,142 @@
1
+ import { expect } from 'vitest'
2
+
3
+ import { Vitest } from '@livestore/utils-dev/node-vitest'
4
+ import { Option, Schema } from '@livestore/utils/effect'
5
+
6
+ import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
7
+ import { type Encoded, EncodedWithMeta, isEqualEncoded } from './client.ts'
8
+
9
+ Vitest.describe('EncodedWithMeta', () => {
10
+ Vitest.test('toGlobal() produces numeric seqNums through JSON.stringify', () => {
11
+ const event = new EncodedWithMeta({
12
+ name: 'test-v1',
13
+ args: { id: '1' },
14
+ seqNum: EventSequenceNumber.Client.Composite.make({ global: 5, client: 0 }),
15
+ parentSeqNum: EventSequenceNumber.Client.Composite.make({ global: 4, client: 0 }),
16
+ clientId: 'client-1',
17
+ sessionId: 'session-1',
18
+ meta: {
19
+ sessionChangeset: { _tag: 'unset' },
20
+ syncMetadata: Option.none(),
21
+ materializerHashLeader: Option.none(),
22
+ materializerHashSession: Option.none(),
23
+ },
24
+ })
25
+
26
+ const global = event.toGlobal()
27
+ const parsed = JSON.parse(JSON.stringify(global))
28
+
29
+ expect(parsed.seqNum).toBe(5)
30
+ expect(parsed.parentSeqNum).toBe(4)
31
+ })
32
+ })
33
+
34
+ Vitest.describe('isEqualEncoded', () => {
35
+ const makeEncodedEvent = (args: unknown): Encoded => ({
36
+ name: 'testEvent-v1',
37
+ args,
38
+ seqNum: EventSequenceNumber.Client.Composite.make({ global: 1, client: 0 }),
39
+ parentSeqNum: EventSequenceNumber.Client.Composite.make(EventSequenceNumber.Client.ROOT),
40
+ clientId: 'client-1',
41
+ sessionId: 'session-1',
42
+ })
43
+
44
+ Vitest.it('should consider events with identical args as equal', () => {
45
+ const a = makeEncodedEvent({ id: 'abc', text: 'hello' })
46
+ const b = makeEncodedEvent({ id: 'abc', text: 'hello' })
47
+ expect(isEqualEncoded(a, b)).toBe(true)
48
+ })
49
+
50
+ Vitest.it('should consider events with different key order in args as equal', () => {
51
+ const a = makeEncodedEvent({ b: 2, a: 1 })
52
+ const b = makeEncodedEvent({ a: 1, b: 2 })
53
+ expect(isEqualEncoded(a, b)).toBe(true)
54
+ })
55
+
56
+ Vitest.it('should consider events with different key order in nested args as equal', () => {
57
+ const a = makeEncodedEvent({ outer: { b: 2, a: 1 }, x: 'y' })
58
+ const b = makeEncodedEvent({ x: 'y', outer: { a: 1, b: 2 } })
59
+ expect(isEqualEncoded(a, b)).toBe(true)
60
+ })
61
+
62
+ Vitest.it('should consider events with different args values as not equal', () => {
63
+ const a = makeEncodedEvent({ id: 'abc' })
64
+ const b = makeEncodedEvent({ id: 'def' })
65
+ expect(isEqualEncoded(a, b)).toBe(false)
66
+ })
67
+
68
+ Vitest.it('should consider events with different args keys as not equal', () => {
69
+ const a = makeEncodedEvent({ a: 1 })
70
+ const b = makeEncodedEvent({ b: 1 })
71
+ expect(isEqualEncoded(a, b)).toBe(false)
72
+ })
73
+
74
+ Vitest.it('should handle null args', () => {
75
+ const a = makeEncodedEvent(null)
76
+ const b = makeEncodedEvent(null)
77
+ expect(isEqualEncoded(a, b)).toBe(true)
78
+ })
79
+
80
+ Vitest.it('should handle array args', () => {
81
+ const a = makeEncodedEvent([1, 2, 3])
82
+ const b = makeEncodedEvent([1, 2, 3])
83
+ expect(isEqualEncoded(a, b)).toBe(true)
84
+ })
85
+
86
+ Vitest.it('should handle empty object args', () => {
87
+ const a = makeEncodedEvent({})
88
+ const b = makeEncodedEvent({})
89
+ expect(isEqualEncoded(a, b)).toBe(true)
90
+ })
91
+
92
+ Vitest.it('should consider events with different names as not equal', () => {
93
+ const a = { ...makeEncodedEvent({ id: 'abc' }), name: 'eventA' }
94
+ const b = { ...makeEncodedEvent({ id: 'abc' }), name: 'eventB' }
95
+ expect(isEqualEncoded(a, b)).toBe(false)
96
+ })
97
+
98
+ Vitest.it('should consider events with undefined-valued and missing keys as equal', () => {
99
+ const a = makeEncodedEvent({ id: 'abc', flag: undefined })
100
+ const b = makeEncodedEvent({ id: 'abc' })
101
+ expect(isEqualEncoded(a, b)).toBe(true)
102
+ })
103
+
104
+ Vitest.it('should consider events with nested undefined-valued and missing keys as equal', () => {
105
+ const a = makeEncodedEvent({ outer: { x: 1, y: undefined } })
106
+ const b = makeEncodedEvent({ outer: { x: 1 } })
107
+ expect(isEqualEncoded(a, b)).toBe(true)
108
+ })
109
+
110
+ Vitest.it(
111
+ 'should consider Effect Schema UndefinedOr-encoded args with explicit undefined equal to their JSON-roundtripped form',
112
+ () => {
113
+ const argsSchema = Schema.Struct({
114
+ id: Schema.String,
115
+ flag: Schema.UndefinedOr(Schema.Boolean),
116
+ })
117
+ const localArgs = Schema.encodeUnknownSync(argsSchema)({ id: 'abc', flag: undefined } as any)
118
+ const wireArgs = JSON.parse(JSON.stringify(localArgs))
119
+ expect(isEqualEncoded(makeEncodedEvent(localArgs), makeEncodedEvent(wireArgs))).toBe(true)
120
+ },
121
+ )
122
+
123
+ Vitest.it('should consider Effect Schema optionalKey-encoded args equal to their JSON-roundtripped form', () => {
124
+ const argsSchema = Schema.Struct({
125
+ id: Schema.String,
126
+ label: Schema.optionalKey(Schema.String),
127
+ })
128
+ const localArgs = Schema.encodeUnknownSync(argsSchema)({ id: 'abc' } as any)
129
+ const wireArgs = JSON.parse(JSON.stringify(localArgs))
130
+ expect(isEqualEncoded(makeEncodedEvent(localArgs), makeEncodedEvent(wireArgs))).toBe(true)
131
+ })
132
+
133
+ Vitest.it('should consider Effect Schema loose-optional encoded args equal to their JSON-roundtripped form', () => {
134
+ const argsSchema = Schema.Struct({
135
+ id: Schema.String,
136
+ label: Schema.optional(Schema.String),
137
+ })
138
+ const localArgs = Schema.encodeUnknownSync(argsSchema)({ id: 'abc', label: undefined } as any)
139
+ const wireArgs = JSON.parse(JSON.stringify(localArgs))
140
+ expect(isEqualEncoded(makeEncodedEvent(localArgs), makeEncodedEvent(wireArgs))).toBe(true)
141
+ })
142
+ })
@@ -0,0 +1,236 @@
1
+ import { deepEqual, memoizeByRef } from '@livestore/utils'
2
+ import { Effect, Option, Schema, Struct } from '@livestore/utils/effect'
3
+
4
+ import type { EventDef } from '../EventDef/mod.ts'
5
+ import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
6
+ import type { LiveStoreSchema } from '../schema.ts'
7
+ import type * as ForEventDef from './for-event-def.ts'
8
+ import type * as Global from './global.ts'
9
+
10
+ /** Effect Schema for client events with decoded args. */
11
+ export const Decoded = Schema.Struct({
12
+ name: Schema.String,
13
+ args: Schema.Any,
14
+ seqNum: EventSequenceNumber.Client.Composite,
15
+ parentSeqNum: EventSequenceNumber.Client.Composite,
16
+ clientId: Schema.String,
17
+ sessionId: Schema.String,
18
+ }).annotate({ title: 'LiveStoreEvent.Client.Decoded' })
19
+
20
+ /**
21
+ * Effect Schema for client events with encoded args.
22
+ * @example
23
+ * ```ts
24
+ * // Confirmed event (client=0)
25
+ * const event: LiveStoreEvent.Client.Encoded = {
26
+ * name: 'todoCreated-v1',
27
+ * args: { id: 'abc', text: 'Buy milk' },
28
+ * seqNum: { global: 5, client: 0, rebaseGeneration: 0 },
29
+ * parentSeqNum: { global: 4, client: 0, rebaseGeneration: 0 },
30
+ * clientId: 'client-xyz',
31
+ * sessionId: 'session-123'
32
+ * }
33
+ *
34
+ * // Pending local event (client=1, not yet synced)
35
+ * const pending: LiveStoreEvent.Client.Encoded = {
36
+ * ...event,
37
+ * seqNum: { global: 5, client: 1, rebaseGeneration: 0 }, // e5.1
38
+ * }
39
+ * ```
40
+ */
41
+ export const Encoded = Schema.Struct({
42
+ name: Schema.String,
43
+ args: Schema.Any,
44
+ seqNum: EventSequenceNumber.Client.Composite,
45
+ parentSeqNum: EventSequenceNumber.Client.Composite,
46
+ clientId: Schema.String,
47
+ sessionId: Schema.String,
48
+ }).annotate({ title: 'LiveStoreEvent.Client.Encoded' })
49
+
50
+ /** Event with composite sequence numbers and decoded (native TypeScript) args. */
51
+ export type Decoded = ForEventDef.Decoded<EventDef.Any>
52
+
53
+ /** Event with composite sequence numbers and encoded (serialized) args. */
54
+ export type Encoded = ForEventDef.Encoded<EventDef.Any>
55
+
56
+ /** Union of all client event types for a given schema (type-safe event discrimination). */
57
+ export type ForSchema<TSchema extends LiveStoreSchema> = {
58
+ [K in keyof TSchema['_EventDefMapType']]: ForEventDef.Decoded<TSchema['_EventDefMapType'][K]>
59
+ }[keyof TSchema['_EventDefMapType']]
60
+
61
+ /**
62
+ * Internal event representation with metadata for sync processing.
63
+ * Includes changeset data and materializer hashes for conflict detection and rebasing.
64
+ *
65
+ * Note: This class is exported for internal use. The preferred access is via `LiveStoreEvent.Client.EncodedWithMeta`.
66
+ */
67
+ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('LiveStoreEvent.Client.EncodedWithMeta')({
68
+ name: Schema.String,
69
+ args: Schema.Any,
70
+ seqNum: EventSequenceNumber.Client.Composite,
71
+ parentSeqNum: EventSequenceNumber.Client.Composite,
72
+ clientId: Schema.String,
73
+ sessionId: Schema.String,
74
+ // TODO get rid of `meta` again by cleaning up the usage implementations
75
+ meta: Schema.Struct({
76
+ sessionChangeset: Schema.Union([
77
+ Schema.TaggedStruct('sessionChangeset', {
78
+ data: Schema.Uint8Array as any as Schema.Codec<Uint8Array<ArrayBuffer>>,
79
+ debug: Schema.Any.pipe(Schema.optional),
80
+ }),
81
+ Schema.TaggedStruct('no-op', {}),
82
+ Schema.TaggedStruct('unset', {}),
83
+ ]),
84
+ syncMetadata: Schema.Option(Schema.Json),
85
+ /** Used to detect if the materializer is side effecting (during dev) */
86
+ materializerHashLeader: Schema.Option(Schema.Finite),
87
+ materializerHashSession: Schema.Option(Schema.Finite),
88
+ })
89
+ .mapFields(Struct.map(Schema.mutableKey))
90
+ .pipe(
91
+ Schema.withDecodingDefaultType(
92
+ Effect.succeed({
93
+ sessionChangeset: { _tag: 'unset' as const },
94
+ syncMetadata: Option.none(),
95
+ materializerHashLeader: Option.none(),
96
+ materializerHashSession: Option.none(),
97
+ }),
98
+ ),
99
+ Schema.withConstructorDefault(
100
+ Effect.succeed({
101
+ sessionChangeset: { _tag: 'unset' as const },
102
+ syncMetadata: Option.none(),
103
+ materializerHashLeader: Option.none(),
104
+ materializerHashSession: Option.none(),
105
+ }),
106
+ ),
107
+ ),
108
+ }) {
109
+ toJSON = (): any => {
110
+ // Only used for logging/debugging
111
+ // - More readable way to print the seqNum + parentSeqNum
112
+ // - not including `meta`, `clientId`, `sessionId`
113
+ return {
114
+ seqNum: `${EventSequenceNumber.Client.toString(this.seqNum)} → ${EventSequenceNumber.Client.toString(this.parentSeqNum)} (${this.clientId}, ${this.sessionId})`,
115
+ name: this.name,
116
+ args: this.args,
117
+ }
118
+ }
119
+
120
+ /**
121
+ * Example: (global event)
122
+ * For event e2 → e1 which should be rebased on event e3 → e2
123
+ * the resulting event num will be e4 → e3
124
+ *
125
+ * Example: (client event)
126
+ * For event e2.1 → e2 which should be rebased on event e3 → e2
127
+ * the resulting event num will be e3.1 → e3
128
+ *
129
+ * Syntax: e2.2 → e2.1
130
+ * ^ ^ ^ ^
131
+ * | | | +- client parent number
132
+ * | | +--- global parent number
133
+ * | +-- client number
134
+ * +---- global number
135
+ * Client num is omitted for global events
136
+ */
137
+ rebase = ({
138
+ parentSeqNum,
139
+ isClientOnly,
140
+ rebaseGeneration,
141
+ }: {
142
+ parentSeqNum: EventSequenceNumber.Client.Composite
143
+ isClientOnly: boolean
144
+ rebaseGeneration: number
145
+ }) =>
146
+ new EncodedWithMeta({
147
+ ...this,
148
+ ...EventSequenceNumber.Client.nextPair({ seqNum: parentSeqNum, isClientOnly, rebaseGeneration }),
149
+ })
150
+
151
+ static fromGlobal = (
152
+ event: Global.Encoded,
153
+ meta: {
154
+ syncMetadata: Option.Option<Schema.Json>
155
+ materializerHashLeader: Option.Option<number>
156
+ materializerHashSession: Option.Option<number>
157
+ },
158
+ ) =>
159
+ new EncodedWithMeta({
160
+ ...event,
161
+ seqNum: {
162
+ global: event.seqNum,
163
+ client: EventSequenceNumber.Client.DEFAULT,
164
+ rebaseGeneration: EventSequenceNumber.Client.REBASE_GENERATION_DEFAULT,
165
+ },
166
+ parentSeqNum: {
167
+ global: event.parentSeqNum,
168
+ client: EventSequenceNumber.Client.DEFAULT,
169
+ rebaseGeneration: EventSequenceNumber.Client.REBASE_GENERATION_DEFAULT,
170
+ },
171
+ meta: {
172
+ sessionChangeset: { _tag: 'unset' as const },
173
+ syncMetadata: meta.syncMetadata,
174
+ materializerHashLeader: meta.materializerHashLeader,
175
+ materializerHashSession: meta.materializerHashSession,
176
+ },
177
+ })
178
+
179
+ toGlobal = (): Global.Encoded => ({
180
+ name: this.name,
181
+ args: this.args,
182
+ seqNum: this.seqNum.global,
183
+ parentSeqNum: this.parentSeqNum.global,
184
+ clientId: this.clientId,
185
+ sessionId: this.sessionId,
186
+ })
187
+ }
188
+
189
+ /**
190
+ * Structural equality check for client events. Compares seqNum (global + client),
191
+ * name, clientId, sessionId, and args. The `meta` field is ignored.
192
+ *
193
+ * Args are compared in their JSON-canonical form: locally-encoded events with
194
+ * `Schema.UndefinedOr` (or loose `Schema.optional`) fields produce
195
+ * `{ ..., flag: undefined }`, but JSON wire transport drops the key. Without
196
+ * canonicalizing, the local pending event compares unequal to its
197
+ * wire-roundtripped counterpart and the sync merge falsely takes the rebase
198
+ * path, surfacing as `MaterializerHashMismatchError` for state-dependent
199
+ * materializers.
200
+ */
201
+ export const isEqualEncoded = (a: Encoded, b: Encoded) =>
202
+ a.seqNum.global === b.seqNum.global &&
203
+ a.seqNum.client === b.seqNum.client &&
204
+ a.name === b.name &&
205
+ a.clientId === b.clientId &&
206
+ a.sessionId === b.sessionId &&
207
+ deepEqual(canonicalizeArgs(a.args), canonicalizeArgs(b.args)) // TODO use schema equality here
208
+
209
+ const canonicalizeArgs = (args: unknown): unknown => (args === undefined ? args : JSON.parse(JSON.stringify(args)))
210
+
211
+ /**
212
+ * Creates an Effect Schema union for all event types in a schema (with composite sequence numbers).
213
+ * @example
214
+ * ```ts
215
+ * const eventSchema = LiveStoreEvent.Client.makeSchema(schema)
216
+ * const event = Schema.decodeUnknownSync(eventSchema)(rawEvent)
217
+ * ```
218
+ */
219
+ export const makeSchema = <TSchema extends LiveStoreSchema>(
220
+ schema: TSchema,
221
+ ): ForEventDef.ForRecord<TSchema['_EventDefMapType']> =>
222
+ Schema.Union(
223
+ [...schema.eventsDefsMap.values()].map((def) =>
224
+ Schema.Struct({
225
+ name: Schema.Literal(def.name),
226
+ args: def.schema,
227
+ seqNum: EventSequenceNumber.Client.Composite,
228
+ parentSeqNum: EventSequenceNumber.Client.Composite,
229
+ clientId: Schema.String,
230
+ sessionId: Schema.String,
231
+ }),
232
+ ),
233
+ ).annotate({ title: 'LiveStoreEvent.Client' }) as any
234
+
235
+ /** Memoized `makeSchema` - caches the generated schema by reference. */
236
+ export const makeSchemaMemo = memoizeByRef(makeSchema)
@@ -0,0 +1,60 @@
1
+ import type { Schema } from '@livestore/utils/effect'
2
+
3
+ import type { EventDef, EventDefRecord } from '../EventDef/mod.ts'
4
+ import type * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
5
+
6
+ /** Event without sequence numbers, with decoded (native TypeScript) args. Used as input to `store.commit()`. */
7
+ export type InputDecoded<TEventDef extends EventDef.Any> = {
8
+ name: TEventDef['name']
9
+ args: TEventDef['schema']['Type']
10
+ }
11
+
12
+ /** Event without sequence numbers, with encoded (serialized) args. Used as input to `store.commit()`. */
13
+ export type InputEncoded<TEventDef extends EventDef.Any> = {
14
+ name: TEventDef['name']
15
+ args: TEventDef['schema']['Encoded']
16
+ }
17
+
18
+ /** Full event with composite sequence numbers and decoded args. Includes clientId/sessionId for sync. */
19
+ export type Decoded<TEventDef extends EventDef.Any> = {
20
+ name: TEventDef['name']
21
+ args: TEventDef['schema']['Type']
22
+ seqNum: EventSequenceNumber.Client.Composite
23
+ parentSeqNum: EventSequenceNumber.Client.Composite
24
+ clientId: string
25
+ sessionId: string
26
+ }
27
+
28
+ /** Full event with composite sequence numbers and encoded args. Includes clientId/sessionId for sync. */
29
+ export type Encoded<TEventDef extends EventDef.Any> = {
30
+ name: TEventDef['name']
31
+ args: TEventDef['schema']['Encoded']
32
+ seqNum: EventSequenceNumber.Client.Composite
33
+ parentSeqNum: EventSequenceNumber.Client.Composite
34
+ clientId: string
35
+ sessionId: string
36
+ }
37
+
38
+ /** Effect Schema union of all event types in an EventDefRecord (with composite sequence numbers). */
39
+ export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Codec<
40
+ {
41
+ [K in keyof TEventDefRecord]: {
42
+ name: K
43
+ args: TEventDefRecord[K]['schema']['Type']
44
+ seqNum: EventSequenceNumber.Client.Composite
45
+ parentSeqNum: EventSequenceNumber.Client.Composite
46
+ clientId: string
47
+ sessionId: string
48
+ }
49
+ }[keyof TEventDefRecord],
50
+ {
51
+ [K in keyof TEventDefRecord]: {
52
+ name: K
53
+ args: TEventDefRecord[K]['schema']['Encoded']
54
+ seqNum: EventSequenceNumber.Client.Composite
55
+ parentSeqNum: EventSequenceNumber.Client.Composite
56
+ clientId: string
57
+ sessionId: string
58
+ }
59
+ }[keyof TEventDefRecord]
60
+ >
@@ -0,0 +1,45 @@
1
+ import { Schema } from '@livestore/utils/effect'
2
+
3
+ import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
4
+
5
+ /**
6
+ * Effect Schema for global events with integer sequence numbers.
7
+ * @example
8
+ * ```ts
9
+ * const event: LiveStoreEvent.Global.Encoded = {
10
+ * name: 'todoCreated-v1',
11
+ * args: { id: 'abc', text: 'Buy milk' },
12
+ * seqNum: 5, // This event's position in the global log
13
+ * parentSeqNum: 4, // Points to the previous event
14
+ * clientId: 'client-xyz',
15
+ * sessionId: 'session-123'
16
+ * }
17
+ * ```
18
+ */
19
+ export const Encoded = Schema.Struct({
20
+ name: Schema.String,
21
+ args: Schema.Any,
22
+ seqNum: EventSequenceNumber.Global.Schema,
23
+ parentSeqNum: EventSequenceNumber.Global.Schema,
24
+ clientId: Schema.String,
25
+ sessionId: Schema.String,
26
+ }).annotate({ title: 'LiveStoreEvent.Global.Encoded' })
27
+
28
+ /** Event with integer sequence numbers for sync backend wire format. */
29
+ export type Encoded = typeof Encoded.Type
30
+
31
+ /** Converts a Global event to Client format by expanding integer seqNums to composite form. */
32
+ export const toClientEncoded = (
33
+ event: Encoded,
34
+ ): {
35
+ name: string
36
+ args: any
37
+ seqNum: EventSequenceNumber.Client.Composite
38
+ parentSeqNum: EventSequenceNumber.Client.Composite
39
+ clientId: string
40
+ sessionId: string
41
+ } => ({
42
+ ...event,
43
+ seqNum: EventSequenceNumber.Client.fromGlobal(event.seqNum),
44
+ parentSeqNum: EventSequenceNumber.Client.fromGlobal(event.parentSeqNum),
45
+ })