@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,11 +1,10 @@
1
- import { isDevEnv, isNil, isReadonlyArray } from '@livestore/utils'
2
- import { Hash, Option, Schema } from '@livestore/utils/effect'
1
+ import { isDevEnv } from '@livestore/utils'
2
+ import { Hash, Option, Predicate, ReadonlyArray, Schema } from '@livestore/utils/effect'
3
3
 
4
4
  import type { SqliteDb } from './adapter-types.ts'
5
- import { SessionIdSymbol } from './adapter-types.ts'
6
- import type { EventDef, Materializer, MaterializerContextQuery, MaterializerResult } from './schema/EventDef.ts'
7
- import type * as LiveStoreEvent from './schema/LiveStoreEvent.ts'
8
- import { getEventDef, type LiveStoreSchema } from './schema/schema.ts'
5
+ import type { EventDef, Materializer, MaterializerContextQuery, MaterializerResult } from './schema/EventDef/mod.ts'
6
+ import type * as LiveStoreEvent from './schema/LiveStoreEvent/mod.ts'
7
+ import type { LiveStoreSchema } from './schema/schema.ts'
9
8
  import type { QueryBuilder } from './schema/state/sqlite/query-builder/api.ts'
10
9
  import { isQueryBuilder } from './schema/state/sqlite/query-builder/api.ts'
11
10
  import { getResultSchema } from './schema/state/sqlite/query-builder/impl.ts'
@@ -24,8 +23,8 @@ export const getExecStatementsFromMaterializer = ({
24
23
  dbState: SqliteDb
25
24
  /** Both encoded and decoded events are supported to reduce the number of times we need to decode/encode */
26
25
  event:
27
- | { decoded: LiveStoreEvent.AnyDecoded; encoded: undefined }
28
- | { decoded: undefined; encoded: LiveStoreEvent.AnyEncoded }
26
+ | { decoded: LiveStoreEvent.Client.Decoded; encoded: undefined }
27
+ | { decoded: undefined; encoded: LiveStoreEvent.Client.Encoded }
29
28
  }): ReadonlyArray<{
30
29
  statementSql: string
31
30
  bindValues: PreparedBindValues
@@ -34,14 +33,15 @@ export const getExecStatementsFromMaterializer = ({
34
33
  const eventDecoded =
35
34
  event.decoded === undefined
36
35
  ? {
37
- ...event.encoded!,
38
- args: Schema.decodeUnknownSync(eventDef.schema)(event.encoded!.args),
36
+ ...event.encoded,
37
+ args: Schema.decodeUnknownSync(eventDef.schema)(event.encoded.args),
39
38
  }
40
39
  : event.decoded
41
40
 
42
- const eventArgsEncoded = isNil(event.decoded?.args)
43
- ? undefined
44
- : Schema.encodeUnknownSync(eventDef.schema)(event.decoded!.args)
41
+ const eventArgsEncoded =
42
+ Predicate.isNotUndefined(event.decoded) === true && Predicate.isNotNullish(event.decoded.args) === true
43
+ ? Schema.encodeUnknownSync(eventDef.schema)(event.decoded.args)
44
+ : undefined
45
45
 
46
46
  const query: MaterializerContextQuery = (
47
47
  rawQueryOrQueryBuilder:
@@ -51,11 +51,11 @@ export const getExecStatementsFromMaterializer = ({
51
51
  }
52
52
  | QueryBuilder.Any,
53
53
  ) => {
54
- if (isQueryBuilder(rawQueryOrQueryBuilder)) {
54
+ if (isQueryBuilder(rawQueryOrQueryBuilder) === true) {
55
55
  const { query, bindValues } = rawQueryOrQueryBuilder.asSql()
56
56
  const rawResults = dbState.select(query, prepareBindValues(bindValues, query))
57
57
  const resultSchema = getResultSchema(rawQueryOrQueryBuilder)
58
- return Schema.decodeSync(resultSchema)(rawResults)
58
+ return Schema.decodeUnknownSync(resultSchema)(rawResults)
59
59
  } else {
60
60
  const { query, bindValues } = rawQueryOrQueryBuilder
61
61
  return dbState.select(query, prepareBindValues(bindValues, query))
@@ -85,9 +85,20 @@ export const getExecStatementsFromMaterializer = ({
85
85
 
86
86
  export const makeMaterializerHash =
87
87
  ({ schema, dbState }: { schema: LiveStoreSchema; dbState: SqliteDb }) =>
88
- (event: LiveStoreEvent.AnyEncoded): Option.Option<number> => {
89
- if (isDevEnv()) {
90
- const { eventDef, materializer } = getEventDef(schema, event.name)
88
+ (event: LiveStoreEvent.Client.Encoded): Option.Option<number> => {
89
+ if (isDevEnv() === true) {
90
+ // Hashing is only needed during dev-mode diagnostics. Skip work entirely for
91
+ // unknown events (no definition/materializer) so we do not introduce noisy
92
+ // warnings while still returning `Option.none()` to disable hash checks.
93
+ const eventDef = schema.eventsDefsMap.get(event.name)
94
+ const materializer = schema.state.materializers.get(event.name)
95
+ if (eventDef === undefined || materializer === undefined) {
96
+ return Option.none()
97
+ }
98
+ // For known events we replay the materializer with the encoded payload and
99
+ // hash the resulting SQL statements. This lets us cheaply detect
100
+ // side-effects or logic drift between leader/client materializers without
101
+ // mutating the underlying state.
91
102
  const materializerResults = getExecStatementsFromMaterializer({
92
103
  eventDef,
93
104
  materializer,
@@ -115,10 +126,10 @@ const fromMaterializerResult = (
115
126
  bindValues: BindValues
116
127
  writeTables: ReadonlySet<string> | undefined
117
128
  }> => {
118
- if (isReadonlyArray(materializerResult)) {
129
+ if (ReadonlyArray.isArray<MaterializerResult | ReadonlyArray<MaterializerResult>>(materializerResult) === true) {
119
130
  return materializerResult.flatMap(fromMaterializerResult)
120
131
  }
121
- if (isQueryBuilder(materializerResult)) {
132
+ if (isQueryBuilder(materializerResult) === true) {
122
133
  const { query, bindValues, usedTables } = materializerResult.asSql()
123
134
  return [{ sql: query, bindValues: bindValues as BindValues, writeTables: usedTables }]
124
135
  } else if (typeof materializerResult === 'string') {
@@ -133,32 +144,3 @@ const fromMaterializerResult = (
133
144
  ]
134
145
  }
135
146
  }
136
-
137
- // NOTE we should explore whether there is a more elegant solution
138
- // e.g. by leveraging the schema to replace the sessionIdSymbol
139
- export const replaceSessionIdSymbol = (
140
- bindValues: Record<string, unknown> | ReadonlyArray<unknown>,
141
- sessionId: string,
142
- ) => {
143
- deepReplaceValue(bindValues, SessionIdSymbol, sessionId)
144
- }
145
-
146
- const deepReplaceValue = <S, R>(input: any, searchValue: S, replaceValue: R): void => {
147
- if (Array.isArray(input)) {
148
- for (const i in input) {
149
- if (input[i] === searchValue) {
150
- input[i] = replaceValue
151
- } else {
152
- deepReplaceValue(input[i], searchValue, replaceValue)
153
- }
154
- }
155
- } else if (typeof input === 'object' && input !== null) {
156
- for (const key in input) {
157
- if (input[key] === searchValue) {
158
- input[key] = replaceValue
159
- } else {
160
- deepReplaceValue(input[key], searchValue, replaceValue)
161
- }
162
- }
163
- }
164
- }
package/src/otel.ts CHANGED
@@ -1,28 +1,30 @@
1
+ import * as otel from '@opentelemetry/api'
2
+
1
3
  import { makeNoopTracer } from '@livestore/utils'
4
+ import type { Tracer } from '@livestore/utils/effect'
2
5
  import { Effect, identity, Layer, OtelTracer } from '@livestore/utils/effect'
3
- import * as otel from '@opentelemetry/api'
6
+
7
+ export const OtelLiveDummy: Layer.Layer<OtelTracer.OtelTracer> = Layer.suspend(() => {
8
+ const OtelTracerLive = Layer.succeed(OtelTracer.OtelTracer, makeNoopTracer())
9
+
10
+ const TracingLive = OtelTracer.layerWithoutOtelTracer.pipe(Layer.provideMerge(OtelTracerLive))
11
+
12
+ return TracingLive
13
+ })
4
14
 
5
15
  export const provideOtel =
6
16
  ({ otelTracer, parentSpanContext }: { otelTracer?: otel.Tracer; parentSpanContext?: otel.Context }) =>
7
- <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, Exclude<R, OtelTracer.OtelTracer>> => {
17
+ <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, Exclude<R, OtelTracer.OtelTracer | Tracer.Tracer>> => {
8
18
  const OtelTracerLive = Layer.succeed(OtelTracer.OtelTracer, otelTracer ?? makeNoopTracer())
9
19
 
10
- const TracingLive = Layer.unwrapEffect(Effect.map(OtelTracer.make, Layer.setTracer)).pipe(
20
+ const TracingLive = OtelTracer.layerWithoutOtelTracer.pipe(
11
21
  Layer.provideMerge(OtelTracerLive),
12
- ) as any as Layer.Layer<OtelTracer.OtelTracer>
22
+ ) as any as Layer.Layer<OtelTracer.OtelTracer | Tracer.Tracer>
13
23
 
14
24
  return effect.pipe(
15
- parentSpanContext
25
+ parentSpanContext !== undefined
16
26
  ? Effect.withParentSpan(OtelTracer.makeExternalSpan(otel.trace.getSpanContext(parentSpanContext)!))
17
27
  : identity,
18
28
  Effect.provide(TracingLive),
19
29
  )
20
30
  }
21
-
22
- export const getDurationMsFromSpan = (span: otel.Span): number => {
23
- const durationHr: [seconds: number, nanos: number] = (span as any)._duration
24
- return durationHr[0] * 1000 + durationHr[1] / 1_000_000
25
- }
26
-
27
- export const getStartTimeHighResFromSpan = (span: otel.Span): DOMHighResTimeStamp =>
28
- (span as any)._performanceStartTime as DOMHighResTimeStamp
@@ -1,14 +1,17 @@
1
1
  import { memoizeByRef } from '@livestore/utils'
2
- import { Chunk, Effect, Option, Schema, Stream } from '@livestore/utils/effect'
2
+ import { Effect, Option, ReadonlyArray as EffectArray, Schema, Stream } from '@livestore/utils/effect'
3
3
 
4
- import { type SqliteDb, UnexpectedError } from './adapter-types.ts'
4
+ import { type SqliteDb, UnknownError } from './adapter-types.ts'
5
5
  import type { MaterializeEvent } from './leader-thread/mod.ts'
6
6
  import type { EventDef, LiveStoreSchema } from './schema/mod.ts'
7
- import { EventSequenceNumber, getEventDef, LiveStoreEvent, SystemTables } from './schema/mod.ts'
7
+ import { EventSequenceNumber, LiveStoreEvent, SystemTables } from './schema/mod.ts'
8
8
  import type { PreparedBindValues } from './util.ts'
9
9
  import { sql } from './util.ts'
10
10
 
11
- export const rematerializeFromEventlog = ({
11
+ /** Parse JSON string to unknown value */
12
+ const jsonParse = Schema.decodeUnknownSync(Schema.fromJsonString(Schema.Unknown))
13
+
14
+ export const rematerializeFromEventlog = Effect.fn('@livestore/common:rematerializeFromEventlog')(function* ({
12
15
  dbEventlog,
13
16
  // TODO re-use this db when bringing back the boot in-memory db implementation
14
17
  // db,
@@ -21,105 +24,115 @@ export const rematerializeFromEventlog = ({
21
24
  schema: LiveStoreSchema
22
25
  onProgress: (_: { done: number; total: number }) => Effect.Effect<void>
23
26
  materializeEvent: MaterializeEvent
24
- }) =>
25
- Effect.gen(function* () {
26
- const eventsCount = dbEventlog.select<{ count: number }>(
27
- `SELECT COUNT(*) AS count FROM ${SystemTables.EVENTLOG_META_TABLE}`,
28
- )[0]!.count
27
+ }) {
28
+ const eventsCount = dbEventlog.select<{ count: number }>(
29
+ `SELECT COUNT(*) AS count FROM ${SystemTables.EVENTLOG_META_TABLE}`,
30
+ )[0]!.count
29
31
 
30
- const hashEventDef = memoizeByRef((event: EventDef.AnyWithoutFn) => Schema.hash(event.schema))
32
+ const hashEventDef = memoizeByRef((event: EventDef.AnyWithoutFn) => Schema.hash(event.schema))
31
33
 
32
- const processEvent = (row: SystemTables.EventlogMetaRow) =>
33
- Effect.gen(function* () {
34
- const eventDef = getEventDef(schema, row.name)
35
-
36
- if (hashEventDef(eventDef.eventDef) !== row.schemaHash) {
37
- yield* Effect.logWarning(
38
- `Schema hash mismatch for event definition ${row.name}. Trying to materialize event anyway.`,
39
- )
40
- }
41
-
42
- const args = JSON.parse(row.argsJson)
43
-
44
- // Checking whether the schema has changed in an incompatible way
45
- yield* Schema.decodeUnknown(eventDef.eventDef.schema)(args).pipe(
46
- Effect.mapError((cause) =>
47
- UnexpectedError.make({
48
- cause,
49
- note: `\
34
+ const processEvent = Effect.fn(`@livestore/common:rematerializeFromEventlog:processEvent`)(function* (
35
+ row: SystemTables.EventlogMetaRow,
36
+ ) {
37
+ const args = jsonParse(row.argsJson)
38
+ const eventEncoded = LiveStoreEvent.Client.EncodedWithMeta.make({
39
+ name: row.name,
40
+ args,
41
+ seqNum: {
42
+ global: row.seqNumGlobal,
43
+ client: row.seqNumClient,
44
+ rebaseGeneration: row.seqNumRebaseGeneration,
45
+ },
46
+ parentSeqNum: {
47
+ global: row.parentSeqNumGlobal,
48
+ client: row.parentSeqNumClient,
49
+ rebaseGeneration: row.parentSeqNumRebaseGeneration,
50
+ },
51
+ clientId: row.clientId,
52
+ sessionId: row.sessionId,
53
+ })
54
+
55
+ const eventDef = schema.eventsDefsMap.get(row.name)
56
+ const materializer = schema.state.materializers.get(row.name)
57
+
58
+ if (eventDef === undefined || materializer === undefined) {
59
+ // Route unknown events through the normal materialization boundary so
60
+ // they advance the state snapshot head as no-ops.
61
+ yield* materializeEvent(eventEncoded, { skipEventlog: true })
62
+ return
63
+ }
64
+
65
+ if (hashEventDef(eventDef) !== row.schemaHash) {
66
+ yield* Effect.logWarning(
67
+ `Schema hash mismatch for event definition ${row.name}. Trying to materialize event anyway.`,
68
+ )
69
+ }
70
+
71
+ // Checking whether the schema has changed in an incompatible way
72
+ yield* Schema.decodeUnknownEffect(eventDef.schema)(args).pipe(
73
+ Effect.mapError((cause) =>
74
+ UnknownError.make({
75
+ cause,
76
+ note: `\
50
77
  There was an error during rematerializing from the eventlog while decoding
51
78
  the persisted event args for event definition "${row.name}".
52
79
  This likely means the schema has changed in an incompatible way.
53
80
  `,
54
- }),
55
- ),
56
- )
57
-
58
- const eventEncoded = LiveStoreEvent.EncodedWithMeta.make({
59
- seqNum: {
60
- global: row.seqNumGlobal,
61
- client: row.seqNumClient,
62
- rebaseGeneration: row.seqNumRebaseGeneration,
63
- },
64
- parentSeqNum: {
65
- global: row.parentSeqNumGlobal,
66
- client: row.parentSeqNumClient,
67
- rebaseGeneration: row.parentSeqNumRebaseGeneration,
68
- },
69
- name: row.name,
70
- args,
71
- clientId: row.clientId,
72
- sessionId: row.sessionId,
73
- })
74
-
75
- yield* materializeEvent(eventEncoded, { skipEventlog: true })
76
- }).pipe(Effect.withSpan(`@livestore/common:rematerializeFromEventlog:processEvent`))
77
-
78
- const CHUNK_SIZE = 100
79
-
80
- const stmt = dbEventlog.prepare(sql`\
81
+ }),
82
+ ),
83
+ )
84
+
85
+ yield* materializeEvent(eventEncoded, { skipEventlog: true })
86
+ })
87
+
88
+ const CHUNK_SIZE = 100
89
+
90
+ const stmt = dbEventlog.prepare(sql`\
81
91
  SELECT * FROM ${SystemTables.EVENTLOG_META_TABLE}
82
92
  WHERE seqNumGlobal > $seqNumGlobal OR (seqNumGlobal = $seqNumGlobal AND seqNumClient > $seqNumClient)
83
93
  ORDER BY seqNumGlobal ASC, seqNumClient ASC
84
94
  LIMIT ${CHUNK_SIZE}
85
95
  `)
86
96
 
87
- let processedEvents = 0
88
-
89
- yield* Stream.unfoldChunk<
90
- Chunk.Chunk<SystemTables.EventlogMetaRow> | { _tag: 'Initial' },
91
- SystemTables.EventlogMetaRow
92
- >({ _tag: 'Initial' }, (item) => {
93
- // End stream if no more rows
94
- if (Chunk.isChunk(item) && item.length === 0) return Option.none()
95
-
96
- const lastId = Chunk.isChunk(item)
97
- ? Chunk.last(item).pipe(
98
- Option.map((_) => ({ global: _.seqNumGlobal, client: _.seqNumClient })),
99
- Option.getOrElse(() => EventSequenceNumber.ROOT),
100
- )
101
- : EventSequenceNumber.ROOT
102
- const nextItem = Chunk.fromIterable(
103
- stmt.select<SystemTables.EventlogMetaRow>({
104
- $seqNumGlobal: lastId?.global,
105
- $seqNumClient: lastId?.client,
106
- } as any as PreparedBindValues),
107
- )
108
- const prevItem = Chunk.isChunk(item) ? item : Chunk.empty()
109
- return Option.some([prevItem, nextItem])
110
- }).pipe(
111
- Stream.bufferChunks({ capacity: 2 }),
112
- Stream.tap((row) =>
113
- Effect.gen(function* () {
114
- yield* processEvent(row)
115
-
116
- processedEvents++
117
- yield* onProgress({ done: processedEvents, total: eventsCount })
118
- }),
119
- ),
120
- Stream.runDrain,
121
- )
122
- }).pipe(
123
- Effect.withPerformanceMeasure('@livestore/common:rematerializeFromEventlog'),
124
- Effect.withSpan('@livestore/common:rematerializeFromEventlog'),
97
+ let processedEvents = 0
98
+
99
+ yield* Stream.paginate(EventSequenceNumber.Client.ROOT, (lastId) =>
100
+ Effect.sync(() => {
101
+ const rows = stmt.select<SystemTables.EventlogMetaRow>({
102
+ $seqNumGlobal: lastId.global,
103
+ $seqNumClient: lastId.client,
104
+ } as any as PreparedBindValues)
105
+
106
+ if (EffectArray.isReadonlyArrayNonEmpty(rows) === false) {
107
+ const done: readonly [
108
+ ReadonlyArray<SystemTables.EventlogMetaRow>,
109
+ Option.Option<EventSequenceNumber.Client.Composite>,
110
+ ] = [rows, Option.none()]
111
+ return done
112
+ }
113
+
114
+ const lastRow = EffectArray.lastNonEmpty(rows)
115
+ const nextCursor = EventSequenceNumber.Client.Composite.make({
116
+ global: lastRow.seqNumGlobal,
117
+ client: lastRow.seqNumClient,
118
+ rebaseGeneration: lastRow.seqNumRebaseGeneration,
119
+ })
120
+ const next: readonly [
121
+ ReadonlyArray<SystemTables.EventlogMetaRow>,
122
+ Option.Option<EventSequenceNumber.Client.Composite>,
123
+ ] = [rows, Option.some(nextCursor)]
124
+ return next
125
+ }),
126
+ ).pipe(
127
+ Stream.bufferArray({ capacity: 2 }),
128
+ Stream.tap((row) =>
129
+ Effect.gen(function* () {
130
+ yield* processEvent(row)
131
+
132
+ processedEvents++
133
+ yield* onProgress({ done: processedEvents, total: eventsCount })
134
+ }),
135
+ ),
136
+ Stream.runDrain,
125
137
  )
138
+ }, Effect.withPerformanceMeasure('@livestore/common:rematerializeFromEventlog'))
@@ -0,0 +1,28 @@
1
+ import { describe, expect, test } from 'vitest'
2
+
3
+ import { Schema } from '@livestore/utils/effect'
4
+
5
+ import { synced } from './define.ts'
6
+
7
+ describe('synced event wire schema', () => {
8
+ const occurredAt = new Date('2026-07-17T10:15:30.000Z')
9
+ const event = synced({
10
+ name: 'v1.Occurred',
11
+ schema: Schema.Struct({
12
+ occurredAt: Schema.DateFromString,
13
+ }),
14
+ })
15
+ const jsonSchema = Schema.fromJsonString(event.schema)
16
+
17
+ test('roundtrips a valid date through JSON', () => {
18
+ const encoded = Schema.encodeSync(jsonSchema)({ occurredAt })
19
+
20
+ expect(encoded).toBe('{"occurredAt":"2026-07-17T10:15:30.000Z"}')
21
+ expect(Schema.decodeSync(jsonSchema)(encoded)).toEqual({ occurredAt })
22
+ })
23
+
24
+ test('rejects invalid dates on encode and decode', () => {
25
+ expect(() => Schema.encodeSync(jsonSchema)({ occurredAt: new Date(Number.NaN) })).toThrow()
26
+ expect(() => Schema.decodeSync(jsonSchema)('{"occurredAt":"not-a-date"}')).toThrow()
27
+ })
28
+ })
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Event Definition Functions
3
+ *
4
+ * This module provides functions for creating event definitions in LiveStore.
5
+ * Events are the core unit of state change - all mutations to the database
6
+ * happen through events that are committed to the eventlog.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { Events } from '@livestore/livestore'
11
+ * import { Schema } from 'effect'
12
+ *
13
+ * // Define events for your application
14
+ * export const events = {
15
+ * // Synced events are sent to the sync backend
16
+ * todoCreated: Events.synced({
17
+ * name: 'v1.TodoCreated',
18
+ * schema: Schema.Struct({ id: Schema.String, text: Schema.String }),
19
+ * }),
20
+ *
21
+ * // Client-only events stay local (useful for UI state)
22
+ * uiStateSet: Events.clientOnly({
23
+ * name: 'UiStateSet',
24
+ * schema: Schema.Struct({ selectedId: Schema.NullOr(Schema.String) }),
25
+ * }),
26
+ * }
27
+ * ```
28
+ * @module
29
+ */
30
+
31
+ import { shouldNeverHappen } from '@livestore/utils'
32
+ import { Result, Schema } from '@livestore/utils/effect'
33
+
34
+ import type { EventDef } from './event-def.ts'
35
+ import type { EventDefFactInput, EventDefFacts } from './facts.ts'
36
+
37
+ /** Options for defining an event. */
38
+ export type DefineEventOptions<TTo, TDerived extends boolean = false> = {
39
+ /**
40
+ * Callback defining fact constraints for this event.
41
+ * @experimental This feature is not fully implemented yet.
42
+ */
43
+ facts?: (
44
+ args: TTo,
45
+ currentFacts: EventDefFacts,
46
+ ) => {
47
+ modify?: {
48
+ /** Facts to set (create or update). */
49
+ set?: Iterable<EventDefFactInput>
50
+ /** Facts to unset (remove). */
51
+ unset?: Iterable<EventDefFactInput>
52
+ }
53
+ /**
54
+ * Facts that must exist for this event to be valid.
55
+ * Used for history constraints and compaction rules.
56
+ */
57
+ require?: Iterable<EventDefFactInput>
58
+ }
59
+
60
+ /**
61
+ * When true, the event is only synced within the same client's sessions
62
+ * but never sent to the sync backend. Useful for UI state.
63
+ * @default false
64
+ */
65
+ clientOnly?: boolean
66
+
67
+ /**
68
+ * When true, marks this as a derived event that cannot have materializers.
69
+ * @default false
70
+ */
71
+ derived?: TDerived
72
+
73
+ /**
74
+ * Marks the entire event as deprecated with a reason message.
75
+ * When this event is committed, a warning will be logged.
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * Events.synced({
80
+ * name: 'v1.TodoRenamed',
81
+ * schema: Schema.Struct({ id: Schema.String, name: Schema.String }),
82
+ * deprecated: "Use 'v1.TodoUpdated' instead",
83
+ * })
84
+ * ```
85
+ */
86
+ deprecated?: string
87
+ }
88
+
89
+ /**
90
+ * Creates an event definition with full control over all options.
91
+ *
92
+ * This is the low-level function for creating events. For most cases,
93
+ * prefer using `synced()` or `clientOnly()` which provide simpler APIs.
94
+ *
95
+ * @example
96
+ * ```ts
97
+ * const customEvent = defineEvent({
98
+ * name: 'v1.CustomEvent',
99
+ * schema: Schema.Struct({ data: Schema.String }),
100
+ * clientOnly: false,
101
+ * derived: false,
102
+ * })
103
+ * ```
104
+ */
105
+ export const defineEvent = <TName extends string, TType, TEncoded = TType, TDerived extends boolean = false>(
106
+ args: {
107
+ name: TName
108
+ schema: Schema.Codec<TType, TEncoded>
109
+ } & DefineEventOptions<TType, TDerived>,
110
+ ): EventDef<TName, TType, TEncoded, TDerived> => {
111
+ const { name, schema, ...options } = args
112
+
113
+ const makePartialEvent = (args: TType) => {
114
+ const res = Schema.decodeResult(Schema.toType(schema))(args)
115
+ if (Result.isFailure(res) === true) {
116
+ shouldNeverHappen(`Invalid event args for event '${name}':`, res.failure.message, '\n')
117
+ }
118
+ return { name: name, args }
119
+ }
120
+
121
+ Object.defineProperty(makePartialEvent, 'name', { value: name })
122
+ Object.defineProperty(makePartialEvent, 'schema', { value: schema })
123
+ Object.defineProperty(makePartialEvent, 'encoded', {
124
+ value: (args: TEncoded) => ({ name: name, args }),
125
+ })
126
+
127
+ Object.defineProperty(makePartialEvent, 'options', {
128
+ value: {
129
+ clientOnly: options?.clientOnly ?? false,
130
+ facts:
131
+ options?.facts !== undefined
132
+ ? (args, currentFacts) => {
133
+ const res = options.facts!(args, currentFacts)
134
+ return {
135
+ modify: {
136
+ set: res.modify?.set !== undefined ? new Set(res.modify.set) : new Set(),
137
+ unset: res.modify?.unset !== undefined ? new Set(res.modify.unset) : new Set(),
138
+ },
139
+ require: res.require !== undefined ? new Set(res.require) : new Set(),
140
+ }
141
+ }
142
+ : undefined,
143
+ derived: options?.derived ?? false,
144
+ deprecated: options?.deprecated,
145
+ } satisfies EventDef.Any['options'],
146
+ })
147
+
148
+ return makePartialEvent as EventDef<TName, TType, TEncoded, TDerived>
149
+ }
150
+
151
+ /**
152
+ * Creates a synced event definition.
153
+ *
154
+ * Synced events are sent to the sync backend and distributed to all connected
155
+ * clients. Use this for collaborative data that should be shared across users
156
+ * and devices.
157
+ *
158
+ * Event names should be versioned (e.g., `v1.TodoCreated`) to support
159
+ * schema evolution over time.
160
+ *
161
+ * @example
162
+ * ```ts
163
+ * import { Events } from '@livestore/livestore'
164
+ * import { Schema } from 'effect'
165
+ *
166
+ * const todoCreated = Events.synced({
167
+ * name: 'v1.TodoCreated',
168
+ * schema: Schema.Struct({
169
+ * id: Schema.String,
170
+ * text: Schema.String,
171
+ * completed: Schema.Boolean,
172
+ * }),
173
+ * })
174
+ *
175
+ * // Commit the event
176
+ * store.commit(todoCreated({ id: 'abc', text: 'Buy milk', completed: false }))
177
+ * ```
178
+ */
179
+ export const synced = <TName extends string, TType, TEncoded = TType>(
180
+ args: {
181
+ name: TName
182
+ schema: Schema.Codec<TType, TEncoded>
183
+ } & Omit<DefineEventOptions<TType>, 'derived' | 'clientOnly'>,
184
+ ): EventDef<TName, TType, TEncoded> => defineEvent({ ...args, clientOnly: false })
185
+
186
+ /**
187
+ * Creates a client-only event definition.
188
+ *
189
+ * Client-only events are synced within the same client's sessions (e.g., across
190
+ * browser tabs) but are never sent to the sync backend. Use this for local UI
191
+ * state like selected items, filter settings, or draft content.
192
+ *
193
+ * Note: Client-only events still require materializers and are stored in the
194
+ * local eventlog, they just don't participate in server-side sync.
195
+ *
196
+ * @example
197
+ * ```ts
198
+ * import { Events } from '@livestore/livestore'
199
+ * import { Schema } from 'effect'
200
+ *
201
+ * const uiStateSet = Events.clientOnly({
202
+ * name: 'UiStateSet',
203
+ * schema: Schema.Struct({
204
+ * selectedTodoId: Schema.NullOr(Schema.String),
205
+ * filterMode: Schema.Literals(['all', 'active', 'completed']),
206
+ * }),
207
+ * })
208
+ *
209
+ * // Update local UI state
210
+ * store.commit(uiStateSet({ selectedTodoId: 'abc', filterMode: 'active' }))
211
+ * ```
212
+ */
213
+ export const clientOnly = <TName extends string, TType, TEncoded = TType>(
214
+ args: {
215
+ name: TName
216
+ schema: Schema.Codec<TType, TEncoded>
217
+ } & Omit<DefineEventOptions<TType>, 'derived' | 'clientOnly'>,
218
+ ): EventDef<TName, TType, TEncoded> => defineEvent({ ...args, clientOnly: true })