@livestore/common 0.4.0-dev.9 → 0.4.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 (513) 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/WorkerTransportError.d.ts +11 -0
  6. package/dist/WorkerTransportError.d.ts.map +1 -0
  7. package/dist/WorkerTransportError.js +11 -0
  8. package/dist/WorkerTransportError.js.map +1 -0
  9. package/dist/adapter-types.d.ts +37 -7
  10. package/dist/adapter-types.d.ts.map +1 -1
  11. package/dist/adapter-types.js +27 -1
  12. package/dist/adapter-types.js.map +1 -1
  13. package/dist/bounded-collections.d.ts.map +1 -1
  14. package/dist/bounded-collections.js +6 -4
  15. package/dist/bounded-collections.js.map +1 -1
  16. package/dist/debug-info.d.ts.map +1 -1
  17. package/dist/debug-info.js +33 -6
  18. package/dist/debug-info.js.map +1 -1
  19. package/dist/devtools/devtools-compatibility.test.d.ts +2 -0
  20. package/dist/devtools/devtools-compatibility.test.d.ts.map +1 -0
  21. package/dist/devtools/devtools-compatibility.test.js +15 -0
  22. package/dist/devtools/devtools-compatibility.test.js.map +1 -0
  23. package/dist/devtools/devtools-messages-client-session.d.ts +55 -24
  24. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  25. package/dist/devtools/devtools-messages-client-session.js +22 -5
  26. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  27. package/dist/devtools/devtools-messages-common.d.ts +11 -14
  28. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  29. package/dist/devtools/devtools-messages-common.js +7 -9
  30. package/dist/devtools/devtools-messages-common.js.map +1 -1
  31. package/dist/devtools/devtools-messages-leader.d.ts +65 -30
  32. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  33. package/dist/devtools/devtools-messages-leader.js +29 -11
  34. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  35. package/dist/devtools/devtools-sessioninfo.d.ts +14 -2
  36. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  37. package/dist/devtools/devtools-sessioninfo.js +7 -4
  38. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  39. package/dist/devtools/mod.d.ts +13 -2
  40. package/dist/devtools/mod.d.ts.map +1 -1
  41. package/dist/devtools/mod.js +10 -3
  42. package/dist/devtools/mod.js.map +1 -1
  43. package/dist/errors.d.ts +48 -18
  44. package/dist/errors.d.ts.map +1 -1
  45. package/dist/errors.js +20 -12
  46. package/dist/errors.js.map +1 -1
  47. package/dist/index.d.ts +4 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +4 -1
  50. package/dist/index.js.map +1 -1
  51. package/dist/leader-thread/LeaderSyncProcessor.d.ts +53 -6
  52. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  53. package/dist/leader-thread/LeaderSyncProcessor.js +325 -257
  54. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  55. package/dist/leader-thread/RejectedPushError.d.ts +107 -0
  56. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
  57. package/dist/leader-thread/RejectedPushError.js +78 -0
  58. package/dist/leader-thread/RejectedPushError.js.map +1 -0
  59. package/dist/leader-thread/connection.js +1 -1
  60. package/dist/leader-thread/connection.js.map +1 -1
  61. package/dist/leader-thread/eventlog.d.ts +19 -14
  62. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  63. package/dist/leader-thread/eventlog.js +78 -18
  64. package/dist/leader-thread/eventlog.js.map +1 -1
  65. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
  66. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  67. package/dist/leader-thread/leader-worker-devtools.js +90 -58
  68. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  69. package/dist/leader-thread/make-leader-thread-layer.d.ts +15 -7
  70. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  71. package/dist/leader-thread/make-leader-thread-layer.js +49 -17
  72. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  73. package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
  74. package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
  75. package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
  76. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
  77. package/dist/leader-thread/materialize-event.d.ts +1 -1
  78. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  79. package/dist/leader-thread/materialize-event.js +28 -9
  80. package/dist/leader-thread/materialize-event.js.map +1 -1
  81. package/dist/leader-thread/mod.d.ts +1 -0
  82. package/dist/leader-thread/mod.d.ts.map +1 -1
  83. package/dist/leader-thread/mod.js +1 -0
  84. package/dist/leader-thread/mod.js.map +1 -1
  85. package/dist/leader-thread/recreate-db.d.ts +2 -2
  86. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  87. package/dist/leader-thread/recreate-db.js +6 -6
  88. package/dist/leader-thread/recreate-db.js.map +1 -1
  89. package/dist/leader-thread/shutdown-channel.d.ts +2 -2
  90. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  91. package/dist/leader-thread/shutdown-channel.js +2 -2
  92. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  93. package/dist/leader-thread/stream-events.d.ts +56 -0
  94. package/dist/leader-thread/stream-events.d.ts.map +1 -0
  95. package/dist/leader-thread/stream-events.js +167 -0
  96. package/dist/leader-thread/stream-events.js.map +1 -0
  97. package/dist/leader-thread/types.d.ts +95 -17
  98. package/dist/leader-thread/types.d.ts.map +1 -1
  99. package/dist/leader-thread/types.js +13 -0
  100. package/dist/leader-thread/types.js.map +1 -1
  101. package/dist/logging.d.ts +40 -0
  102. package/dist/logging.d.ts.map +1 -0
  103. package/dist/logging.js +33 -0
  104. package/dist/logging.js.map +1 -0
  105. package/dist/make-client-session.d.ts +5 -3
  106. package/dist/make-client-session.d.ts.map +1 -1
  107. package/dist/make-client-session.js +7 -4
  108. package/dist/make-client-session.js.map +1 -1
  109. package/dist/materializer-helper.d.ts +6 -6
  110. package/dist/materializer-helper.d.ts.map +1 -1
  111. package/dist/materializer-helper.js +18 -8
  112. package/dist/materializer-helper.js.map +1 -1
  113. package/dist/otel.d.ts +2 -1
  114. package/dist/otel.d.ts.map +1 -1
  115. package/dist/otel.js +7 -2
  116. package/dist/otel.js.map +1 -1
  117. package/dist/rematerialize-from-eventlog.d.ts +3 -3
  118. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  119. package/dist/rematerialize-from-eventlog.js +40 -29
  120. package/dist/rematerialize-from-eventlog.js.map +1 -1
  121. package/dist/schema/EventDef/define.d.ts +161 -0
  122. package/dist/schema/EventDef/define.d.ts.map +1 -0
  123. package/dist/schema/EventDef/define.js +140 -0
  124. package/dist/schema/EventDef/define.js.map +1 -0
  125. package/dist/schema/EventDef/deprecated.d.ts +99 -0
  126. package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
  127. package/dist/schema/EventDef/deprecated.js +144 -0
  128. package/dist/schema/EventDef/deprecated.js.map +1 -0
  129. package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
  130. package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
  131. package/dist/schema/EventDef/deprecated.test.js +95 -0
  132. package/dist/schema/EventDef/deprecated.test.js.map +1 -0
  133. package/dist/schema/EventDef/event-def.d.ts +110 -0
  134. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  135. package/dist/schema/EventDef/event-def.js +2 -0
  136. package/dist/schema/EventDef/event-def.js.map +1 -0
  137. package/dist/schema/EventDef/facts.d.ts +118 -0
  138. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  139. package/dist/schema/EventDef/facts.js +53 -0
  140. package/dist/schema/EventDef/facts.js.map +1 -0
  141. package/dist/schema/EventDef/materializer.d.ts +155 -0
  142. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  143. package/dist/schema/EventDef/materializer.js +83 -0
  144. package/dist/schema/EventDef/materializer.js.map +1 -0
  145. package/dist/schema/EventDef/mod.d.ts +6 -0
  146. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  147. package/dist/schema/EventDef/mod.js +6 -0
  148. package/dist/schema/EventDef/mod.js.map +1 -0
  149. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  150. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  151. package/dist/schema/EventSequenceNumber/client.js +193 -0
  152. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  153. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  154. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  155. package/dist/schema/EventSequenceNumber/global.js +14 -0
  156. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  157. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  158. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  159. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  160. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  161. package/dist/schema/EventSequenceNumber.test.js +44 -44
  162. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  163. package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +102 -111
  164. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  165. package/dist/schema/LiveStoreEvent/client.js +176 -0
  166. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  167. package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
  168. package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
  169. package/dist/schema/LiveStoreEvent/client.test.js +111 -0
  170. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
  171. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  172. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  173. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  174. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  175. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  176. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  177. package/dist/schema/LiveStoreEvent/global.js +31 -0
  178. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  179. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  180. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  181. package/dist/schema/LiveStoreEvent/input.js +26 -0
  182. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  183. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  184. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  185. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  186. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  187. package/dist/schema/events.d.ts +1 -1
  188. package/dist/schema/events.d.ts.map +1 -1
  189. package/dist/schema/events.js +1 -1
  190. package/dist/schema/events.js.map +1 -1
  191. package/dist/schema/mod.d.ts +6 -4
  192. package/dist/schema/mod.d.ts.map +1 -1
  193. package/dist/schema/mod.js +5 -4
  194. package/dist/schema/mod.js.map +1 -1
  195. package/dist/schema/schema.d.ts +16 -1
  196. package/dist/schema/schema.d.ts.map +1 -1
  197. package/dist/schema/schema.js +32 -4
  198. package/dist/schema/schema.js.map +1 -1
  199. package/dist/schema/state/sqlite/client-document-def.d.ts +2 -1
  200. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  201. package/dist/schema/state/sqlite/client-document-def.js +36 -15
  202. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  203. package/dist/schema/state/sqlite/client-document-def.test.js +121 -2
  204. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  205. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  206. package/dist/schema/state/sqlite/column-annotations.js +1 -1
  207. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  208. package/dist/schema/state/sqlite/column-annotations.test.js +2 -2
  209. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  210. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  211. package/dist/schema/state/sqlite/column-def.js +96 -47
  212. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  213. package/dist/schema/state/sqlite/column-def.test.js +51 -12
  214. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  215. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  216. package/dist/schema/state/sqlite/column-spec.js +30 -12
  217. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  218. package/dist/schema/state/sqlite/column-spec.test.js +24 -15
  219. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  220. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +2 -2
  221. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  222. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +16 -10
  223. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  224. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +15 -4
  225. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  226. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +1 -1
  227. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  228. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +1 -1
  229. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  230. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +1 -1
  231. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  232. package/dist/schema/state/sqlite/mod.d.ts +2 -2
  233. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  234. package/dist/schema/state/sqlite/mod.js +5 -7
  235. package/dist/schema/state/sqlite/mod.js.map +1 -1
  236. package/dist/schema/state/sqlite/query-builder/api.d.ts +51 -22
  237. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  238. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  239. package/dist/schema/state/sqlite/query-builder/astToSql.js +99 -22
  240. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  241. package/dist/schema/state/sqlite/query-builder/impl.d.ts +1 -1
  242. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  243. package/dist/schema/state/sqlite/query-builder/impl.js +28 -15
  244. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  245. package/dist/schema/state/sqlite/query-builder/impl.test.js +231 -93
  246. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  247. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  248. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  249. package/dist/schema/state/sqlite/schema-helpers.js +24 -14
  250. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  251. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  252. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  253. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  254. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  255. package/dist/schema/state/sqlite/{system-tables.d.ts → system-tables/eventlog-tables.d.ts} +21 -450
  256. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
  257. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
  258. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
  259. package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
  260. package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
  261. package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
  262. package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
  263. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +456 -0
  264. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
  265. package/dist/schema/state/sqlite/system-tables/state-tables.js +55 -0
  266. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
  267. package/dist/schema/state/sqlite/table-def.d.ts +5 -3
  268. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  269. package/dist/schema/state/sqlite/table-def.js +1 -1
  270. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  271. package/dist/schema/state/sqlite/table-def.test.js +92 -3
  272. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  273. package/dist/schema/unknown-events.d.ts +47 -0
  274. package/dist/schema/unknown-events.d.ts.map +1 -0
  275. package/dist/schema/unknown-events.js +69 -0
  276. package/dist/schema/unknown-events.js.map +1 -0
  277. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
  278. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
  279. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
  280. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
  281. package/dist/schema-management/common.js +2 -2
  282. package/dist/schema-management/common.js.map +1 -1
  283. package/dist/schema-management/migrations.d.ts +32 -2
  284. package/dist/schema-management/migrations.d.ts.map +1 -1
  285. package/dist/schema-management/migrations.js +38 -6
  286. package/dist/schema-management/migrations.js.map +1 -1
  287. package/dist/schema-management/validate-schema.d.ts +3 -3
  288. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  289. package/dist/schema-management/validate-schema.js +2 -2
  290. package/dist/schema-management/validate-schema.js.map +1 -1
  291. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  292. package/dist/sql-queries/sql-queries.js +18 -6
  293. package/dist/sql-queries/sql-queries.js.map +1 -1
  294. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  295. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  296. package/dist/sqlite-db-helper.js +3 -3
  297. package/dist/sqlite-db-helper.js.map +1 -1
  298. package/dist/sqlite-types.d.ts +5 -5
  299. package/dist/sqlite-types.d.ts.map +1 -1
  300. package/dist/sqlite-types.js.map +1 -1
  301. package/dist/sync/ClientSessionSyncProcessor.d.ts +12 -12
  302. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  303. package/dist/sync/ClientSessionSyncProcessor.js +99 -114
  304. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  305. package/dist/sync/errors.d.ts +0 -33
  306. package/dist/sync/errors.d.ts.map +1 -1
  307. package/dist/sync/errors.js +5 -22
  308. package/dist/sync/errors.js.map +1 -1
  309. package/dist/sync/index.d.ts +2 -0
  310. package/dist/sync/index.d.ts.map +1 -1
  311. package/dist/sync/index.js +2 -0
  312. package/dist/sync/index.js.map +1 -1
  313. package/dist/sync/mock-sync-backend.d.ts +10 -8
  314. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  315. package/dist/sync/mock-sync-backend.js +71 -69
  316. package/dist/sync/mock-sync-backend.js.map +1 -1
  317. package/dist/sync/next/compact-events.d.ts.map +1 -1
  318. package/dist/sync/next/compact-events.js +11 -12
  319. package/dist/sync/next/compact-events.js.map +1 -1
  320. package/dist/sync/next/facts.d.ts +5 -5
  321. package/dist/sync/next/facts.d.ts.map +1 -1
  322. package/dist/sync/next/facts.js +7 -8
  323. package/dist/sync/next/facts.js.map +1 -1
  324. package/dist/sync/next/history-dag-common.d.ts +54 -15
  325. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  326. package/dist/sync/next/history-dag-common.js +198 -9
  327. package/dist/sync/next/history-dag-common.js.map +1 -1
  328. package/dist/sync/next/history-dag.d.ts.map +1 -1
  329. package/dist/sync/next/history-dag.js +11 -11
  330. package/dist/sync/next/history-dag.js.map +1 -1
  331. package/dist/sync/next/rebase-events.d.ts +5 -5
  332. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  333. package/dist/sync/next/rebase-events.js +6 -6
  334. package/dist/sync/next/rebase-events.js.map +1 -1
  335. package/dist/sync/next/test/compact-events.calculator.test.js +2 -2
  336. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  337. package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
  338. package/dist/sync/next/test/compact-events.test.js +2 -2
  339. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  340. package/dist/sync/next/test/event-fixtures.d.ts +2 -2
  341. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  342. package/dist/sync/next/test/event-fixtures.js +11 -11
  343. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  344. package/dist/sync/sync-backend-kv.d.ts +3 -3
  345. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  346. package/dist/sync/sync-backend-kv.js +3 -3
  347. package/dist/sync/sync-backend-kv.js.map +1 -1
  348. package/dist/sync/sync-backend.d.ts +33 -13
  349. package/dist/sync/sync-backend.d.ts.map +1 -1
  350. package/dist/sync/sync-backend.js +38 -1
  351. package/dist/sync/sync-backend.js.map +1 -1
  352. package/dist/sync/sync.d.ts +23 -2
  353. package/dist/sync/sync.d.ts.map +1 -1
  354. package/dist/sync/syncstate.d.ts +55 -55
  355. package/dist/sync/syncstate.d.ts.map +1 -1
  356. package/dist/sync/syncstate.js +80 -98
  357. package/dist/sync/syncstate.js.map +1 -1
  358. package/dist/sync/syncstate.test.js +221 -132
  359. package/dist/sync/syncstate.test.js.map +1 -1
  360. package/dist/sync/transport-chunking.d.ts +36 -0
  361. package/dist/sync/transport-chunking.d.ts.map +1 -0
  362. package/dist/sync/transport-chunking.js +56 -0
  363. package/dist/sync/transport-chunking.js.map +1 -0
  364. package/dist/sync/validate-push-payload.d.ts +2 -2
  365. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  366. package/dist/sync/validate-push-payload.js +4 -6
  367. package/dist/sync/validate-push-payload.js.map +1 -1
  368. package/dist/testing/event-factory.d.ts +3 -3
  369. package/dist/testing/event-factory.d.ts.map +1 -1
  370. package/dist/testing/event-factory.js +5 -7
  371. package/dist/testing/event-factory.js.map +1 -1
  372. package/dist/util.js +2 -2
  373. package/dist/util.js.map +1 -1
  374. package/dist/version.d.ts +24 -5
  375. package/dist/version.d.ts.map +1 -1
  376. package/dist/version.js +25 -8
  377. package/dist/version.js.map +1 -1
  378. package/package.json +67 -15
  379. package/src/ClientSessionLeaderThreadProxy.ts +27 -12
  380. package/src/WorkerTransportError.ts +12 -0
  381. package/src/adapter-types.ts +50 -7
  382. package/src/bounded-collections.ts +6 -5
  383. package/src/debug-info.ts +37 -6
  384. package/src/devtools/devtools-compatibility.test.ts +18 -0
  385. package/src/devtools/devtools-messages-client-session.ts +22 -4
  386. package/src/devtools/devtools-messages-common.ts +7 -12
  387. package/src/devtools/devtools-messages-leader.ts +29 -10
  388. package/src/devtools/devtools-sessioninfo.ts +8 -5
  389. package/src/devtools/mod.ts +11 -2
  390. package/src/errors.ts +32 -24
  391. package/src/index.ts +4 -1
  392. package/src/leader-thread/LeaderSyncProcessor.ts +523 -373
  393. package/src/leader-thread/RejectedPushError.ts +106 -0
  394. package/src/leader-thread/connection.ts +1 -1
  395. package/src/leader-thread/eventlog.ts +112 -39
  396. package/src/leader-thread/leader-worker-devtools.ts +201 -120
  397. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  398. package/src/leader-thread/make-leader-thread-layer.ts +125 -40
  399. package/src/leader-thread/materialize-event.ts +40 -10
  400. package/src/leader-thread/mod.ts +1 -0
  401. package/src/leader-thread/recreate-db.ts +7 -7
  402. package/src/leader-thread/shutdown-channel.ts +4 -8
  403. package/src/leader-thread/stream-events.ts +206 -0
  404. package/src/leader-thread/types.ts +68 -18
  405. package/src/logging.ts +62 -0
  406. package/src/make-client-session.ts +11 -5
  407. package/src/materializer-helper.ts +27 -16
  408. package/src/otel.ts +13 -2
  409. package/src/rematerialize-from-eventlog.ts +61 -51
  410. package/src/schema/EventDef/define.ts +217 -0
  411. package/src/schema/EventDef/deprecated.test.ts +129 -0
  412. package/src/schema/EventDef/deprecated.ts +175 -0
  413. package/src/schema/EventDef/event-def.ts +125 -0
  414. package/src/schema/EventDef/facts.ts +135 -0
  415. package/src/schema/EventDef/materializer.ts +172 -0
  416. package/src/schema/EventDef/mod.ts +5 -0
  417. package/src/schema/EventSequenceNumber/client.ts +257 -0
  418. package/src/schema/EventSequenceNumber/global.ts +19 -0
  419. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  420. package/src/schema/EventSequenceNumber.test.ts +72 -53
  421. package/src/schema/LiveStoreEvent/client.test.ts +129 -0
  422. package/src/schema/LiveStoreEvent/client.ts +235 -0
  423. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  424. package/src/schema/LiveStoreEvent/global.ts +45 -0
  425. package/src/schema/LiveStoreEvent/input.ts +63 -0
  426. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  427. package/src/schema/events.ts +1 -1
  428. package/src/schema/mod.ts +6 -4
  429. package/src/schema/schema.ts +46 -5
  430. package/src/schema/state/sqlite/client-document-def.test.ts +144 -5
  431. package/src/schema/state/sqlite/client-document-def.ts +47 -34
  432. package/src/schema/state/sqlite/column-annotations.test.ts +3 -2
  433. package/src/schema/state/sqlite/column-annotations.ts +2 -1
  434. package/src/schema/state/sqlite/column-def.test.ts +66 -12
  435. package/src/schema/state/sqlite/column-def.ts +119 -47
  436. package/src/schema/state/sqlite/column-spec.test.ts +32 -17
  437. package/src/schema/state/sqlite/column-spec.ts +37 -11
  438. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +2 -2
  439. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +2 -1
  440. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +41 -15
  441. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +13 -19
  442. package/src/schema/state/sqlite/mod.ts +7 -8
  443. package/src/schema/state/sqlite/query-builder/api.ts +55 -17
  444. package/src/schema/state/sqlite/query-builder/astToSql.ts +110 -21
  445. package/src/schema/state/sqlite/query-builder/impl.test.ts +267 -93
  446. package/src/schema/state/sqlite/query-builder/impl.ts +26 -13
  447. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  448. package/src/schema/state/sqlite/schema-helpers.ts +30 -22
  449. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  450. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  451. package/src/schema/state/sqlite/system-tables/state-tables.ts +69 -0
  452. package/src/schema/state/sqlite/table-def.test.ts +114 -3
  453. package/src/schema/state/sqlite/table-def.ts +16 -22
  454. package/src/schema/unknown-events.ts +131 -0
  455. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
  456. package/src/schema-management/common.ts +2 -2
  457. package/src/schema-management/migrations.ts +42 -9
  458. package/src/schema-management/validate-schema.ts +3 -3
  459. package/src/sql-queries/sql-queries.ts +18 -6
  460. package/src/sql-queries/sql-query-builder.ts +1 -0
  461. package/src/sqlite-db-helper.ts +3 -3
  462. package/src/sqlite-types.ts +6 -5
  463. package/src/sync/ClientSessionSyncProcessor.ts +152 -142
  464. package/src/sync/errors.ts +12 -24
  465. package/src/sync/index.ts +2 -0
  466. package/src/sync/mock-sync-backend.ts +146 -104
  467. package/src/sync/next/compact-events.ts +10 -11
  468. package/src/sync/next/facts.ts +13 -14
  469. package/src/sync/next/history-dag-common.ts +280 -26
  470. package/src/sync/next/history-dag.ts +17 -13
  471. package/src/sync/next/rebase-events.ts +12 -12
  472. package/src/sync/next/test/compact-events.calculator.test.ts +3 -2
  473. package/src/sync/next/test/compact-events.test.ts +4 -3
  474. package/src/sync/next/test/event-fixtures.ts +13 -13
  475. package/src/sync/sync-backend-kv.ts +4 -3
  476. package/src/sync/sync-backend.ts +66 -17
  477. package/src/sync/sync.ts +24 -2
  478. package/src/sync/syncstate.test.ts +583 -419
  479. package/src/sync/syncstate.ts +127 -122
  480. package/src/sync/transport-chunking.ts +90 -0
  481. package/src/sync/validate-push-payload.ts +6 -8
  482. package/src/testing/event-factory.ts +10 -12
  483. package/src/util.ts +2 -2
  484. package/src/version.ts +33 -8
  485. package/dist/schema/EventDef.d.ts +0 -126
  486. package/dist/schema/EventDef.d.ts.map +0 -1
  487. package/dist/schema/EventDef.js +0 -46
  488. package/dist/schema/EventDef.js.map +0 -1
  489. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  490. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  491. package/dist/schema/EventSequenceNumber.js +0 -139
  492. package/dist/schema/EventSequenceNumber.js.map +0 -1
  493. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  494. package/dist/schema/LiveStoreEvent.js +0 -147
  495. package/dist/schema/LiveStoreEvent.js.map +0 -1
  496. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  497. package/dist/schema/state/sqlite/system-tables.js +0 -81
  498. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  499. package/dist/sync/next/graphology.d.ts +0 -8
  500. package/dist/sync/next/graphology.d.ts.map +0 -1
  501. package/dist/sync/next/graphology.js +0 -30
  502. package/dist/sync/next/graphology.js.map +0 -1
  503. package/dist/sync/next/graphology_.d.ts +0 -3
  504. package/dist/sync/next/graphology_.d.ts.map +0 -1
  505. package/dist/sync/next/graphology_.js +0 -3
  506. package/dist/sync/next/graphology_.js.map +0 -1
  507. package/src/schema/EventDef.ts +0 -222
  508. package/src/schema/EventSequenceNumber.ts +0 -199
  509. package/src/schema/LiveStoreEvent.ts +0 -286
  510. package/src/schema/state/sqlite/system-tables.ts +0 -106
  511. package/src/sync/next/ambient.d.ts +0 -3
  512. package/src/sync/next/graphology.ts +0 -41
  513. package/src/sync/next/graphology_.ts +0 -2
@@ -0,0 +1,19 @@
1
+ import { Brand, Schema as S } from '@livestore/utils/effect'
2
+
3
+ /** Branded integer type for global sequence numbers assigned by the sync backend. */
4
+ export type Type = Brand.Branded<number, 'GlobalEventSequenceNumber'>
5
+
6
+ const GlobalBrand = Brand.nominal<Type>()
7
+
8
+ /** Effect Schema for encoding/decoding global sequence numbers. */
9
+ export const Schema = S.fromBrand(GlobalBrand)(S.Int)
10
+
11
+ /**
12
+ * Creates a branded global sequence number from a plain number.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const seqNum = EventSequenceNumber.Global.make(5)
17
+ * ```
18
+ */
19
+ export const make = GlobalBrand
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Client sequence numbers track events created locally before sync confirmation.
3
+ * Also contains the Composite type combining global and client sequence numbers with a rebase
4
+ * generation to fully identify an event's position in the eventlog.
5
+ *
6
+ * For event notation documentation, see: contributor-docs/events-notation.md
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { EventSequenceNumber } from '@livestore/common'
11
+ *
12
+ * // Client sequence number
13
+ * const clientSeq = EventSequenceNumber.Client.make(1)
14
+ *
15
+ * // Composite sequence number
16
+ * const composite: EventSequenceNumber.Client.Composite = {
17
+ * global: EventSequenceNumber.Global.make(5),
18
+ * client: EventSequenceNumber.Client.DEFAULT,
19
+ * rebaseGeneration: 0,
20
+ * }
21
+ * ```
22
+ */
23
+ export * as Client from './client.ts'
24
+
25
+ /**
26
+ * Global sequence numbers are assigned by the sync backend and represent
27
+ * the canonical ordering of events across all clients. They are monotonically
28
+ * increasing integers that establish the authoritative event timeline.
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * import { EventSequenceNumber } from '@livestore/common'
33
+ *
34
+ * const globalSeq = EventSequenceNumber.Global.make(5)
35
+ * ```
36
+ */
37
+ export * as Global from './global.ts'
@@ -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, isClient: 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, isClient: 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, isClient: 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, isClient: 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, isClient: 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,129 @@
1
+ import { expect } from 'vitest'
2
+
3
+ import { Option, Schema } from '@livestore/utils/effect'
4
+ import { Vitest } from '@livestore/utils-dev/node-vitest'
5
+
6
+ import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
7
+ import { EncodedWithMeta, isEqualEncoded, type Encoded } 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('should consider Effect Schema UndefinedOr-encoded args equal to their JSON-roundtripped form', () => {
111
+ const argsSchema = Schema.Struct({
112
+ id: Schema.String,
113
+ flag: Schema.UndefinedOr(Schema.Boolean),
114
+ })
115
+ const localArgs = Schema.encodeUnknownSync(argsSchema)({ id: 'abc' } as any)
116
+ const wireArgs = JSON.parse(JSON.stringify(localArgs))
117
+ expect(isEqualEncoded(makeEncodedEvent(localArgs), makeEncodedEvent(wireArgs))).toBe(true)
118
+ })
119
+
120
+ Vitest.it('should consider Effect Schema loose-optional encoded args equal to their JSON-roundtripped form', () => {
121
+ const argsSchema = Schema.Struct({
122
+ id: Schema.String,
123
+ label: Schema.optional(Schema.String),
124
+ })
125
+ const localArgs = Schema.encodeUnknownSync(argsSchema)({ id: 'abc', label: undefined } as any)
126
+ const wireArgs = JSON.parse(JSON.stringify(localArgs))
127
+ expect(isEqualEncoded(makeEncodedEvent(localArgs), makeEncodedEvent(wireArgs))).toBe(true)
128
+ })
129
+ })
@@ -0,0 +1,235 @@
1
+ import { deepEqual, memoizeByRef } from '@livestore/utils'
2
+ import { Option, Schema } 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
+ }).annotations({ 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
+ }).annotations({ 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.Schema<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.JsonValue),
85
+ /** Used to detect if the materializer is side effecting (during dev) */
86
+ materializerHashLeader: Schema.Option(Schema.Number),
87
+ materializerHashSession: Schema.Option(Schema.Number),
88
+ }).pipe(
89
+ Schema.mutable,
90
+ Schema.optional,
91
+ Schema.withDefaults({
92
+ constructor: () => ({
93
+ sessionChangeset: { _tag: 'unset' as const },
94
+ syncMetadata: Option.none(),
95
+ materializerHashLeader: Option.none(),
96
+ materializerHashSession: Option.none(),
97
+ }),
98
+ decoding: () => ({
99
+ sessionChangeset: { _tag: 'unset' as const },
100
+ syncMetadata: Option.none(),
101
+ materializerHashLeader: Option.none(),
102
+ materializerHashSession: Option.none(),
103
+ }),
104
+ }),
105
+ ),
106
+ }) {
107
+ toJSON = (): any => {
108
+ // Only used for logging/debugging
109
+ // - More readable way to print the seqNum + parentSeqNum
110
+ // - not including `meta`, `clientId`, `sessionId`
111
+ return {
112
+ seqNum: `${EventSequenceNumber.Client.toString(this.seqNum)} → ${EventSequenceNumber.Client.toString(this.parentSeqNum)} (${this.clientId}, ${this.sessionId})`,
113
+ name: this.name,
114
+ args: this.args,
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Example: (global event)
120
+ * For event e2 → e1 which should be rebased on event e3 → e2
121
+ * the resulting event num will be e4 → e3
122
+ *
123
+ * Example: (client event)
124
+ * For event e2.1 → e2 which should be rebased on event e3 → e2
125
+ * the resulting event num will be e3.1 → e3
126
+ *
127
+ * Syntax: e2.2 → e2.1
128
+ * ^ ^ ^ ^
129
+ * | | | +- client parent number
130
+ * | | +--- global parent number
131
+ * | +-- client number
132
+ * +---- global number
133
+ * Client num is omitted for global events
134
+ */
135
+ rebase = ({
136
+ parentSeqNum,
137
+ isClient,
138
+ rebaseGeneration,
139
+ }: {
140
+ parentSeqNum: EventSequenceNumber.Client.Composite
141
+ isClient: boolean
142
+ rebaseGeneration: number
143
+ }) =>
144
+ new EncodedWithMeta({
145
+ ...this,
146
+ ...EventSequenceNumber.Client.nextPair({ seqNum: parentSeqNum, isClient, rebaseGeneration }),
147
+ })
148
+
149
+ static fromGlobal = (
150
+ event: Global.Encoded,
151
+ meta: {
152
+ syncMetadata: Option.Option<Schema.JsonValue>
153
+ materializerHashLeader: Option.Option<number>
154
+ materializerHashSession: Option.Option<number>
155
+ },
156
+ ) =>
157
+ new EncodedWithMeta({
158
+ ...event,
159
+ seqNum: {
160
+ global: event.seqNum,
161
+ client: EventSequenceNumber.Client.DEFAULT,
162
+ rebaseGeneration: EventSequenceNumber.Client.REBASE_GENERATION_DEFAULT,
163
+ },
164
+ parentSeqNum: {
165
+ global: event.parentSeqNum,
166
+ client: EventSequenceNumber.Client.DEFAULT,
167
+ rebaseGeneration: EventSequenceNumber.Client.REBASE_GENERATION_DEFAULT,
168
+ },
169
+ meta: {
170
+ sessionChangeset: { _tag: 'unset' as const },
171
+ syncMetadata: meta.syncMetadata,
172
+ materializerHashLeader: meta.materializerHashLeader,
173
+ materializerHashSession: meta.materializerHashSession,
174
+ },
175
+ })
176
+
177
+ toGlobal = (): Global.Encoded => ({
178
+ name: this.name,
179
+ args: this.args,
180
+ seqNum: this.seqNum.global,
181
+ parentSeqNum: this.parentSeqNum.global,
182
+ clientId: this.clientId,
183
+ sessionId: this.sessionId,
184
+ })
185
+ }
186
+
187
+ /**
188
+ * Structural equality check for client events. Compares seqNum (global + client),
189
+ * name, clientId, sessionId, and args. The `meta` field is ignored.
190
+ *
191
+ * Args are compared in their JSON-canonical form: locally-encoded events with
192
+ * `Schema.UndefinedOr` (or loose `Schema.optional`) fields produce
193
+ * `{ ..., flag: undefined }`, but JSON wire transport drops the key. Without
194
+ * canonicalizing, the local pending event compares unequal to its
195
+ * wire-roundtripped counterpart and the sync merge falsely takes the rebase
196
+ * path, surfacing as `MaterializerHashMismatchError` for state-dependent
197
+ * materializers.
198
+ */
199
+ export const isEqualEncoded = (a: Encoded, b: Encoded) =>
200
+ a.seqNum.global === b.seqNum.global &&
201
+ a.seqNum.client === b.seqNum.client &&
202
+ a.name === b.name &&
203
+ a.clientId === b.clientId &&
204
+ a.sessionId === b.sessionId &&
205
+ deepEqual(canonicalizeArgs(a.args), canonicalizeArgs(b.args)) // TODO use schema equality here
206
+
207
+ const canonicalizeArgs = (args: unknown): unknown =>
208
+ args === undefined ? args : JSON.parse(JSON.stringify(args))
209
+
210
+ /**
211
+ * Creates an Effect Schema union for all event types in a schema (with composite sequence numbers).
212
+ * @example
213
+ * ```ts
214
+ * const eventSchema = LiveStoreEvent.Client.makeSchema(schema)
215
+ * const event = Schema.decodeUnknownSync(eventSchema)(rawEvent)
216
+ * ```
217
+ */
218
+ export const makeSchema = <TSchema extends LiveStoreSchema>(
219
+ schema: TSchema,
220
+ ): ForEventDef.ForRecord<TSchema['_EventDefMapType']> =>
221
+ Schema.Union(
222
+ ...[...schema.eventsDefsMap.values()].map((def) =>
223
+ Schema.Struct({
224
+ name: Schema.Literal(def.name),
225
+ args: def.schema,
226
+ seqNum: EventSequenceNumber.Client.Composite,
227
+ parentSeqNum: EventSequenceNumber.Client.Composite,
228
+ clientId: Schema.String,
229
+ sessionId: Schema.String,
230
+ }),
231
+ ),
232
+ ).annotations({ title: 'LiveStoreEvent.Client' }) as any
233
+
234
+ /** Memoized `makeSchema` - caches the generated schema by reference. */
235
+ 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: Schema.Schema.Type<TEventDef['schema']>
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: Schema.Schema.Encoded<TEventDef['schema']>
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: Schema.Schema.Type<TEventDef['schema']>
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: Schema.Schema.Encoded<TEventDef['schema']>
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.Schema<
40
+ {
41
+ [K in keyof TEventDefRecord]: {
42
+ name: K
43
+ args: Schema.Schema.Type<TEventDefRecord[K]['schema']>
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: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>
54
+ seqNum: EventSequenceNumber.Client.Composite
55
+ parentSeqNum: EventSequenceNumber.Client.Composite
56
+ clientId: string
57
+ sessionId: string
58
+ }
59
+ }[keyof TEventDefRecord]
60
+ >