@livestore/common 0.4.0 → 0.5.0-dev.1

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 (501) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +1 -1
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/MaterializationJournal.d.ts +44 -0
  5. package/dist/MaterializationJournal.d.ts.map +1 -0
  6. package/dist/MaterializationJournal.js +112 -0
  7. package/dist/MaterializationJournal.js.map +1 -0
  8. package/dist/StateHead.d.ts +26 -0
  9. package/dist/StateHead.d.ts.map +1 -0
  10. package/dist/StateHead.js +50 -0
  11. package/dist/StateHead.js.map +1 -0
  12. package/dist/WorkerTransportError.d.ts +3 -3
  13. package/dist/WorkerTransportError.d.ts.map +1 -1
  14. package/dist/WorkerTransportError.js +3 -3
  15. package/dist/WorkerTransportError.js.map +1 -1
  16. package/dist/__tests__/fixture.d.ts +8 -8
  17. package/dist/__tests__/fixture.d.ts.map +1 -1
  18. package/dist/__tests__/fixture.js +4 -4
  19. package/dist/__tests__/fixture.js.map +1 -1
  20. package/dist/adapter-types.d.ts +33 -57
  21. package/dist/adapter-types.d.ts.map +1 -1
  22. package/dist/adapter-types.js +24 -41
  23. package/dist/adapter-types.js.map +1 -1
  24. package/dist/bounded-collections.d.ts.map +1 -1
  25. package/dist/bounded-collections.js.map +1 -1
  26. package/dist/debug-info.d.ts +56 -56
  27. package/dist/debug-info.d.ts.map +1 -1
  28. package/dist/debug-info.js +32 -44
  29. package/dist/debug-info.js.map +1 -1
  30. package/dist/defs.d.ts +9 -9
  31. package/dist/defs.js +2 -2
  32. package/dist/devtools/devtools-compatibility.test.js +2 -1
  33. package/dist/devtools/devtools-compatibility.test.js.map +1 -1
  34. package/dist/devtools/devtools-messages-client-session.d.ts +522 -334
  35. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  36. package/dist/devtools/devtools-messages-client-session.js +80 -78
  37. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  38. package/dist/devtools/devtools-messages-common.d.ts +27 -27
  39. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  40. package/dist/devtools/devtools-messages-common.js +6 -6
  41. package/dist/devtools/devtools-messages-common.js.map +1 -1
  42. package/dist/devtools/devtools-messages-leader.d.ts +410 -348
  43. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  44. package/dist/devtools/devtools-messages-leader.js +105 -93
  45. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  46. package/dist/devtools/devtools-messages.js +3 -3
  47. package/dist/devtools/devtools-sessioninfo.d.ts +18 -19
  48. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  49. package/dist/devtools/devtools-sessioninfo.js +8 -5
  50. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  51. package/dist/devtools/mod.d.ts +4 -5
  52. package/dist/devtools/mod.d.ts.map +1 -1
  53. package/dist/devtools/mod.js +12 -8
  54. package/dist/devtools/mod.js.map +1 -1
  55. package/dist/errors.d.ts +45 -69
  56. package/dist/errors.d.ts.map +1 -1
  57. package/dist/errors.js +19 -17
  58. package/dist/errors.js.map +1 -1
  59. package/dist/index.d.ts +4 -1
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +22 -19
  62. package/dist/index.js.map +1 -1
  63. package/dist/leader-thread/LeaderSyncProcessor.d.ts +87 -18
  64. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  65. package/dist/leader-thread/LeaderSyncProcessor.js +548 -480
  66. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  67. package/dist/leader-thread/RejectedPushError.d.ts +72 -41
  68. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -1
  69. package/dist/leader-thread/RejectedPushError.js +25 -6
  70. package/dist/leader-thread/RejectedPushError.js.map +1 -1
  71. package/dist/leader-thread/connection.d.ts +1 -0
  72. package/dist/leader-thread/connection.d.ts.map +1 -1
  73. package/dist/leader-thread/connection.js +11 -10
  74. package/dist/leader-thread/connection.js.map +1 -1
  75. package/dist/leader-thread/eventlog.d.ts +15 -5
  76. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  77. package/dist/leader-thread/eventlog.js +19 -19
  78. package/dist/leader-thread/eventlog.js.map +1 -1
  79. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  80. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  81. package/dist/leader-thread/leader-worker-devtools.js +36 -20
  82. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  83. package/dist/leader-thread/make-leader-thread-layer.d.ts +15 -5
  84. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  85. package/dist/leader-thread/make-leader-thread-layer.js +62 -58
  86. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  87. package/dist/leader-thread/make-leader-thread-layer.test.js +9 -9
  88. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -1
  89. package/dist/leader-thread/materialize-event.d.ts +2 -1
  90. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  91. package/dist/leader-thread/materialize-event.js +12 -8
  92. package/dist/leader-thread/materialize-event.js.map +1 -1
  93. package/dist/leader-thread/mod.js +9 -9
  94. package/dist/leader-thread/recreate-db.d.ts +5 -1
  95. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  96. package/dist/leader-thread/recreate-db.js +34 -59
  97. package/dist/leader-thread/recreate-db.js.map +1 -1
  98. package/dist/leader-thread/shutdown-channel.d.ts +2 -6
  99. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  100. package/dist/leader-thread/shutdown-channel.js +2 -3
  101. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  102. package/dist/leader-thread/stream-events.d.ts +4 -7
  103. package/dist/leader-thread/stream-events.d.ts.map +1 -1
  104. package/dist/leader-thread/stream-events.js +16 -21
  105. package/dist/leader-thread/stream-events.js.map +1 -1
  106. package/dist/leader-thread/types.d.ts +38 -73
  107. package/dist/leader-thread/types.d.ts.map +1 -1
  108. package/dist/leader-thread/types.js +10 -6
  109. package/dist/leader-thread/types.js.map +1 -1
  110. package/dist/logging.d.ts +5 -30
  111. package/dist/logging.d.ts.map +1 -1
  112. package/dist/logging.js +1 -32
  113. package/dist/logging.js.map +1 -1
  114. package/dist/make-client-session.d.ts +2 -3
  115. package/dist/make-client-session.d.ts.map +1 -1
  116. package/dist/make-client-session.js +5 -5
  117. package/dist/make-client-session.js.map +1 -1
  118. package/dist/materializer-helper.d.ts +0 -1
  119. package/dist/materializer-helper.d.ts.map +1 -1
  120. package/dist/materializer-helper.js +9 -37
  121. package/dist/materializer-helper.js.map +1 -1
  122. package/dist/otel.d.ts +2 -3
  123. package/dist/otel.d.ts.map +1 -1
  124. package/dist/otel.js +2 -7
  125. package/dist/otel.js.map +1 -1
  126. package/dist/rematerialize-from-eventlog.d.ts +3 -1
  127. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  128. package/dist/rematerialize-from-eventlog.js +42 -33
  129. package/dist/rematerialize-from-eventlog.js.map +1 -1
  130. package/dist/schema/EventDef/define.d.ts +6 -6
  131. package/dist/schema/EventDef/define.d.ts.map +1 -1
  132. package/dist/schema/EventDef/define.js +5 -5
  133. package/dist/schema/EventDef/define.js.map +1 -1
  134. package/dist/schema/EventDef/define.test.d.ts +2 -0
  135. package/dist/schema/EventDef/define.test.d.ts.map +1 -0
  136. package/dist/schema/EventDef/define.test.js +23 -0
  137. package/dist/schema/EventDef/define.test.js.map +1 -0
  138. package/dist/schema/EventDef/deprecated.d.ts +8 -13
  139. package/dist/schema/EventDef/deprecated.d.ts.map +1 -1
  140. package/dist/schema/EventDef/deprecated.js +12 -13
  141. package/dist/schema/EventDef/deprecated.js.map +1 -1
  142. package/dist/schema/EventDef/deprecated.test.js +3 -3
  143. package/dist/schema/EventDef/deprecated.test.js.map +1 -1
  144. package/dist/schema/EventDef/event-def.d.ts +1 -1
  145. package/dist/schema/EventDef/event-def.d.ts.map +1 -1
  146. package/dist/schema/EventDef/facts.d.ts.map +1 -1
  147. package/dist/schema/EventDef/materializer.d.ts +2 -2
  148. package/dist/schema/EventDef/materializer.d.ts.map +1 -1
  149. package/dist/schema/EventDef/mod.js +5 -5
  150. package/dist/schema/EventSequenceNumber/client.d.ts +12 -17
  151. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -1
  152. package/dist/schema/EventSequenceNumber/client.js +20 -24
  153. package/dist/schema/EventSequenceNumber/client.js.map +1 -1
  154. package/dist/schema/EventSequenceNumber/global.d.ts +2 -2
  155. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -1
  156. package/dist/schema/EventSequenceNumber/global.js +1 -1
  157. package/dist/schema/EventSequenceNumber/global.js.map +1 -1
  158. package/dist/schema/EventSequenceNumber/mod.js +2 -2
  159. package/dist/schema/EventSequenceNumber.test.js +6 -6
  160. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  161. package/dist/schema/LiveStoreEvent/client.d.ts +58 -187
  162. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -1
  163. package/dist/schema/LiveStoreEvent/client.js +33 -30
  164. package/dist/schema/LiveStoreEvent/client.js.map +1 -1
  165. package/dist/schema/LiveStoreEvent/client.test.js +13 -4
  166. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -1
  167. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +7 -7
  168. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -1
  169. package/dist/schema/LiveStoreEvent/global.d.ts +6 -6
  170. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -1
  171. package/dist/schema/LiveStoreEvent/global.js +2 -2
  172. package/dist/schema/LiveStoreEvent/global.js.map +1 -1
  173. package/dist/schema/LiveStoreEvent/input.d.ts +6 -6
  174. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -1
  175. package/dist/schema/LiveStoreEvent/input.js +3 -3
  176. package/dist/schema/LiveStoreEvent/input.js.map +1 -1
  177. package/dist/schema/LiveStoreEvent/mod.js +4 -4
  178. package/dist/schema/events.js +1 -1
  179. package/dist/schema/mod.d.ts +1 -0
  180. package/dist/schema/mod.d.ts.map +1 -1
  181. package/dist/schema/mod.js +11 -10
  182. package/dist/schema/mod.js.map +1 -1
  183. package/dist/schema/schema.d.ts +1 -1
  184. package/dist/schema/schema.d.ts.map +1 -1
  185. package/dist/schema/schema.js +6 -5
  186. package/dist/schema/schema.js.map +1 -1
  187. package/dist/schema/state/mod.js +2 -2
  188. package/dist/schema/state/sqlite/client-document-def.d.ts +13 -18
  189. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  190. package/dist/schema/state/sqlite/client-document-def.js +30 -27
  191. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  192. package/dist/schema/state/sqlite/client-document-def.test.js +53 -18
  193. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  194. package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
  195. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  196. package/dist/schema/state/sqlite/column-annotations.js +13 -15
  197. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  198. package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
  199. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  200. package/dist/schema/state/sqlite/column-def.d.ts +1 -1
  201. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  202. package/dist/schema/state/sqlite/column-def.js +73 -33
  203. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  204. package/dist/schema/state/sqlite/column-def.test.js +176 -75
  205. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  206. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  207. package/dist/schema/state/sqlite/column-spec.js +1 -1
  208. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  209. package/dist/schema/state/sqlite/column-spec.test.js +4 -4
  210. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  211. package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.d.ts +3 -0
  212. package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.d.ts.map +1 -0
  213. package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.js +5 -0
  214. package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.js.map +1 -0
  215. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.d.ts +5 -0
  216. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.d.ts.map +1 -0
  217. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.js +183 -0
  218. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.js.map +1 -0
  219. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.d.ts +2 -0
  220. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.d.ts.map +1 -0
  221. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.js +142 -0
  222. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.js.map +1 -0
  223. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +3 -8
  224. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  225. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +1 -73
  226. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  227. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts.map +1 -1
  228. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +9 -9
  229. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  230. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +9 -13
  231. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  232. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +28 -17
  233. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  234. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +13 -11
  235. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  236. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +6 -4
  237. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  238. package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.d.ts +3 -0
  239. package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.d.ts.map +1 -0
  240. package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.js +6 -0
  241. package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.js.map +1 -0
  242. package/dist/schema/state/sqlite/db-schema/mod.js +2 -2
  243. package/dist/schema/state/sqlite/mod.d.ts +1 -3
  244. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  245. package/dist/schema/state/sqlite/mod.js +11 -10
  246. package/dist/schema/state/sqlite/mod.js.map +1 -1
  247. package/dist/schema/state/sqlite/persistence.d.ts +11 -0
  248. package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
  249. package/dist/schema/state/sqlite/persistence.js +10 -0
  250. package/dist/schema/state/sqlite/persistence.js.map +1 -0
  251. package/dist/schema/state/sqlite/query-builder/api.d.ts +7 -7
  252. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  253. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  254. package/dist/schema/state/sqlite/query-builder/astToSql.js +22 -23
  255. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  256. package/dist/schema/state/sqlite/query-builder/impl.d.ts +1 -1
  257. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  258. package/dist/schema/state/sqlite/query-builder/impl.js +18 -16
  259. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  260. package/dist/schema/state/sqlite/query-builder/impl.test.js +364 -598
  261. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  262. package/dist/schema/state/sqlite/query-builder/mod.js +2 -2
  263. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  264. package/dist/schema/state/sqlite/schema-helpers.js +2 -2
  265. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  266. package/dist/schema/state/sqlite/schema-helpers.test.js +2 -2
  267. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +102 -134
  268. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -1
  269. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +5 -5
  270. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -1
  271. package/dist/schema/state/sqlite/system-tables/mod.js +2 -2
  272. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +380 -115
  273. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -1
  274. package/dist/schema/state/sqlite/system-tables/state-tables.js +47 -6
  275. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -1
  276. package/dist/schema/state/sqlite/table-def.d.ts +17 -20
  277. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  278. package/dist/schema/state/sqlite/table-def.js +72 -6
  279. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  280. package/dist/schema/state/sqlite/table-def.test.js +207 -37
  281. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  282. package/dist/schema/unknown-events.d.ts.map +1 -1
  283. package/dist/schema/unknown-events.js +3 -2
  284. package/dist/schema/unknown-events.js.map +1 -1
  285. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +28 -6
  286. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -1
  287. package/dist/schema-management/common.d.ts.map +1 -1
  288. package/dist/schema-management/common.js +2 -2
  289. package/dist/schema-management/migrations.d.ts +4 -4
  290. package/dist/schema-management/migrations.d.ts.map +1 -1
  291. package/dist/schema-management/migrations.js +9 -9
  292. package/dist/schema-management/migrations.js.map +1 -1
  293. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  294. package/dist/schema-management/validate-schema.js +1 -1
  295. package/dist/session-id-symbol.d.ts +29 -0
  296. package/dist/session-id-symbol.d.ts.map +1 -0
  297. package/dist/session-id-symbol.js +44 -0
  298. package/dist/session-id-symbol.js.map +1 -0
  299. package/dist/sql-queries/index.js +3 -3
  300. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  301. package/dist/sql-queries/sql-queries.js +11 -13
  302. package/dist/sql-queries/sql-queries.js.map +1 -1
  303. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  304. package/dist/sql-queries/sql-query-builder.js +1 -1
  305. package/dist/sql-queries/types.d.ts +6 -7
  306. package/dist/sql-queries/types.d.ts.map +1 -1
  307. package/dist/sql-queries/types.js.map +1 -1
  308. package/dist/sqlite-db-helper.d.ts +23 -3
  309. package/dist/sqlite-db-helper.d.ts.map +1 -1
  310. package/dist/sqlite-db-helper.js +39 -4
  311. package/dist/sqlite-db-helper.js.map +1 -1
  312. package/dist/sqlite-types.d.ts +3 -6
  313. package/dist/sqlite-types.d.ts.map +1 -1
  314. package/dist/sqlite-types.js +3 -3
  315. package/dist/sqlite-types.js.map +1 -1
  316. package/dist/sync/ClientSessionSyncProcessor.d.ts +41 -19
  317. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  318. package/dist/sync/ClientSessionSyncProcessor.js +200 -70
  319. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  320. package/dist/sync/errors.d.ts +12 -18
  321. package/dist/sync/errors.d.ts.map +1 -1
  322. package/dist/sync/errors.js +3 -3
  323. package/dist/sync/errors.js.map +1 -1
  324. package/dist/sync/index.js +6 -6
  325. package/dist/sync/mock-sync-backend.d.ts +2 -3
  326. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  327. package/dist/sync/mock-sync-backend.js +58 -37
  328. package/dist/sync/mock-sync-backend.js.map +1 -1
  329. package/dist/sync/mock-sync-backend.test.d.ts +2 -0
  330. package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
  331. package/dist/sync/mock-sync-backend.test.js +49 -0
  332. package/dist/sync/mock-sync-backend.test.js.map +1 -0
  333. package/dist/sync/next/compact-events.d.ts.map +1 -1
  334. package/dist/sync/next/compact-events.js +3 -3
  335. package/dist/sync/next/facts.d.ts.map +1 -1
  336. package/dist/sync/next/facts.js +1 -1
  337. package/dist/sync/next/history-dag-common.d.ts +5 -1
  338. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  339. package/dist/sync/next/history-dag-common.js +53 -32
  340. package/dist/sync/next/history-dag-common.js.map +1 -1
  341. package/dist/sync/next/history-dag.d.ts.map +1 -1
  342. package/dist/sync/next/history-dag.js +5 -4
  343. package/dist/sync/next/history-dag.js.map +1 -1
  344. package/dist/sync/next/mod.js +5 -5
  345. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  346. package/dist/sync/next/rebase-events.js +2 -2
  347. package/dist/sync/next/test/compact-events.calculator.test.js +6 -6
  348. package/dist/sync/next/test/compact-events.test.js +4 -4
  349. package/dist/sync/next/test/event-fixtures.d.ts +8 -8
  350. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  351. package/dist/sync/next/test/event-fixtures.js +6 -6
  352. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  353. package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
  354. package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
  355. package/dist/sync/next/test/history-dag-common.test.js +73 -0
  356. package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
  357. package/dist/sync/next/test/mod.js +1 -1
  358. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  359. package/dist/sync/sync-backend-kv.js +5 -3
  360. package/dist/sync/sync-backend-kv.js.map +1 -1
  361. package/dist/sync/sync-backend.d.ts +15 -15
  362. package/dist/sync/sync-backend.d.ts.map +1 -1
  363. package/dist/sync/sync-backend.js +10 -6
  364. package/dist/sync/sync-backend.js.map +1 -1
  365. package/dist/sync/sync.d.ts +1 -1
  366. package/dist/sync/sync.d.ts.map +1 -1
  367. package/dist/sync/sync.js +2 -2
  368. package/dist/sync/syncstate.d.ts +100 -176
  369. package/dist/sync/syncstate.d.ts.map +1 -1
  370. package/dist/sync/syncstate.js +36 -39
  371. package/dist/sync/syncstate.js.map +1 -1
  372. package/dist/sync/syncstate.test.js +103 -64
  373. package/dist/sync/syncstate.test.js.map +1 -1
  374. package/dist/sync/transport-chunking.d.ts +15 -16
  375. package/dist/sync/transport-chunking.d.ts.map +1 -1
  376. package/dist/sync/transport-chunking.js +23 -32
  377. package/dist/sync/transport-chunking.js.map +1 -1
  378. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  379. package/dist/sync/validate-push-payload.js +2 -2
  380. package/dist/testing/event-factory.d.ts.map +1 -1
  381. package/dist/testing/event-factory.js +2 -2
  382. package/dist/testing/event-factory.js.map +1 -1
  383. package/dist/testing/mod.js +1 -1
  384. package/dist/util.d.ts +11 -4
  385. package/dist/util.d.ts.map +1 -1
  386. package/dist/util.js +20 -2
  387. package/dist/util.js.map +1 -1
  388. package/dist/version.d.ts.map +1 -1
  389. package/dist/version.js.map +1 -1
  390. package/package.json +40 -57
  391. package/src/ClientSessionLeaderThreadProxy.ts +1 -1
  392. package/src/MaterializationJournal.ts +184 -0
  393. package/src/StateHead.ts +80 -0
  394. package/src/WorkerTransportError.ts +4 -4
  395. package/src/__tests__/fixture.ts +3 -3
  396. package/src/adapter-types.ts +28 -61
  397. package/src/debug-info.ts +53 -70
  398. package/src/defs.ts +2 -2
  399. package/src/devtools/devtools-compatibility.test.ts +1 -0
  400. package/src/devtools/devtools-messages-client-session.ts +56 -65
  401. package/src/devtools/devtools-messages-common.ts +12 -11
  402. package/src/devtools/devtools-messages-leader.ts +71 -69
  403. package/src/devtools/devtools-sessioninfo.ts +13 -11
  404. package/src/devtools/mod.ts +4 -5
  405. package/src/errors.ts +46 -34
  406. package/src/index.ts +8 -1
  407. package/src/leader-thread/LeaderSyncProcessor.ts +777 -650
  408. package/src/leader-thread/RejectedPushError.ts +40 -27
  409. package/src/leader-thread/connection.ts +12 -8
  410. package/src/leader-thread/eventlog.ts +20 -12
  411. package/src/leader-thread/leader-worker-devtools.ts +38 -20
  412. package/src/leader-thread/make-leader-thread-layer.test.ts +7 -7
  413. package/src/leader-thread/make-leader-thread-layer.ts +100 -71
  414. package/src/leader-thread/materialize-event.ts +13 -8
  415. package/src/leader-thread/recreate-db.ts +41 -75
  416. package/src/leader-thread/shutdown-channel.ts +3 -14
  417. package/src/leader-thread/stream-events.ts +102 -101
  418. package/src/leader-thread/types.ts +29 -62
  419. package/src/logging.ts +5 -52
  420. package/src/make-client-session.ts +6 -6
  421. package/src/materializer-helper.ts +7 -36
  422. package/src/otel.ts +5 -14
  423. package/src/rematerialize-from-eventlog.ts +116 -98
  424. package/src/schema/EventDef/define.test.ts +28 -0
  425. package/src/schema/EventDef/define.ts +20 -19
  426. package/src/schema/EventDef/deprecated.test.ts +1 -8
  427. package/src/schema/EventDef/deprecated.ts +17 -20
  428. package/src/schema/EventDef/event-def.ts +2 -4
  429. package/src/schema/EventSequenceNumber/client.ts +20 -24
  430. package/src/schema/EventSequenceNumber/global.ts +1 -1
  431. package/src/schema/EventSequenceNumber.test.ts +5 -5
  432. package/src/schema/LiveStoreEvent/client.test.ts +17 -4
  433. package/src/schema/LiveStoreEvent/client.ts +36 -35
  434. package/src/schema/LiveStoreEvent/for-event-def.ts +7 -7
  435. package/src/schema/LiveStoreEvent/global.ts +1 -1
  436. package/src/schema/LiveStoreEvent/input.ts +6 -6
  437. package/src/schema/mod.ts +1 -0
  438. package/src/schema/schema.ts +4 -3
  439. package/src/schema/state/sqlite/client-document-def.test.ts +55 -20
  440. package/src/schema/state/sqlite/client-document-def.ts +95 -80
  441. package/src/schema/state/sqlite/column-annotations.test.ts +26 -45
  442. package/src/schema/state/sqlite/column-annotations.ts +26 -30
  443. package/src/schema/state/sqlite/column-def.test.ts +213 -77
  444. package/src/schema/state/sqlite/column-def.ts +87 -37
  445. package/src/schema/state/sqlite/column-spec.test.ts +2 -2
  446. package/src/schema/state/sqlite/column-spec.ts +3 -2
  447. package/src/schema/state/sqlite/db-schema/ast/fingerprint-digest.ts +6 -0
  448. package/src/schema/state/sqlite/db-schema/ast/fingerprint.test.ts +209 -0
  449. package/src/schema/state/sqlite/db-schema/ast/fingerprint.ts +225 -0
  450. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +2 -81
  451. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
  452. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -16
  453. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +26 -31
  454. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +35 -21
  455. package/src/schema/state/sqlite/db-schema/has-json-string-encoding.ts +9 -0
  456. package/src/schema/state/sqlite/mod.ts +4 -5
  457. package/src/schema/state/sqlite/persistence.ts +11 -0
  458. package/src/schema/state/sqlite/query-builder/api.ts +9 -9
  459. package/src/schema/state/sqlite/query-builder/astToSql.ts +24 -26
  460. package/src/schema/state/sqlite/query-builder/impl.test.ts +433 -669
  461. package/src/schema/state/sqlite/query-builder/impl.ts +19 -15
  462. package/src/schema/state/sqlite/schema-helpers.ts +1 -1
  463. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +2 -2
  464. package/src/schema/state/sqlite/system-tables/state-tables.ts +54 -3
  465. package/src/schema/state/sqlite/table-def.test.ts +270 -66
  466. package/src/schema/state/sqlite/table-def.ts +112 -45
  467. package/src/schema/unknown-events.ts +3 -2
  468. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +35 -4
  469. package/src/schema-management/migrations.ts +7 -6
  470. package/src/session-id-symbol.ts +59 -0
  471. package/src/sql-queries/sql-queries.ts +9 -13
  472. package/src/sql-queries/types.ts +6 -7
  473. package/src/sqlite-db-helper.ts +64 -2
  474. package/src/sqlite-types.ts +5 -8
  475. package/src/sync/ClientSessionSyncProcessor.ts +303 -119
  476. package/src/sync/errors.ts +14 -12
  477. package/src/sync/mock-sync-backend.test.ts +78 -0
  478. package/src/sync/mock-sync-backend.ts +93 -47
  479. package/src/sync/next/history-dag-common.ts +60 -34
  480. package/src/sync/next/history-dag.ts +4 -1
  481. package/src/sync/next/test/compact-events.calculator.test.ts +2 -2
  482. package/src/sync/next/test/event-fixtures.ts +1 -1
  483. package/src/sync/next/test/history-dag-common.test.ts +87 -0
  484. package/src/sync/sync-backend-kv.ts +4 -2
  485. package/src/sync/sync-backend.ts +15 -15
  486. package/src/sync/sync.ts +1 -1
  487. package/src/sync/syncstate.test.ts +191 -140
  488. package/src/sync/syncstate.ts +63 -53
  489. package/src/sync/transport-chunking.ts +34 -39
  490. package/src/util.ts +19 -9
  491. package/src/version.ts +1 -2
  492. package/dist/schema/state/sqlite/db-schema/hash.d.ts +0 -2
  493. package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +0 -1
  494. package/dist/schema/state/sqlite/db-schema/hash.js +0 -15
  495. package/dist/schema/state/sqlite/db-schema/hash.js.map +0 -1
  496. package/dist/sql-queries/misc.d.ts +0 -2
  497. package/dist/sql-queries/misc.d.ts.map +0 -1
  498. package/dist/sql-queries/misc.js +0 -2
  499. package/dist/sql-queries/misc.js.map +0 -1
  500. package/src/schema/state/sqlite/db-schema/hash.ts +0 -13
  501. package/src/sql-queries/misc.ts +0 -2
@@ -1,135 +1,153 @@
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
4
  import { type SqliteDb, UnknownError } from './adapter-types.ts'
5
5
  import type { MaterializeEvent } from './leader-thread/mod.ts'
6
+ import { STATE_REBUILD_BATCH_SIZE_DEFAULT, StateRebuildBatchSizeSchema } from './leader-thread/types.ts'
6
7
  import type { EventDef, LiveStoreSchema } from './schema/mod.ts'
7
- import { EventSequenceNumber, LiveStoreEvent, resolveEventDef, SystemTables } from './schema/mod.ts'
8
+ import { EventSequenceNumber, LiveStoreEvent, SystemTables } from './schema/mod.ts'
9
+ import { withSavepoint } from './sqlite-db-helper.ts'
8
10
  import type { PreparedBindValues } from './util.ts'
9
11
  import { sql } from './util.ts'
10
12
 
11
13
  /** Parse JSON string to unknown value */
12
- const jsonParse = Schema.decodeUnknownSync(Schema.parseJson())
14
+ const jsonParse = Schema.decodeUnknownSync(Schema.fromJsonString(Schema.Unknown))
13
15
 
14
16
  export const rematerializeFromEventlog = Effect.fn('@livestore/common:rematerializeFromEventlog')(function* ({
15
17
  dbEventlog,
16
18
  // TODO re-use this db when bringing back the boot in-memory db implementation
17
- // db,
19
+ dbState,
18
20
  schema,
19
21
  onProgress,
20
22
  materializeEvent,
23
+ batchSize = STATE_REBUILD_BATCH_SIZE_DEFAULT,
21
24
  }: {
22
25
  dbEventlog: SqliteDb
23
- // db: SqliteDb
26
+ dbState: SqliteDb
24
27
  schema: LiveStoreSchema
25
28
  onProgress: (_: { done: number; total: number }) => Effect.Effect<void>
26
29
  materializeEvent: MaterializeEvent
30
+ batchSize?: number
27
31
  }) {
28
- const eventsCount = dbEventlog.select<{ count: number }>(
29
- `SELECT COUNT(*) AS count FROM ${SystemTables.EVENTLOG_META_TABLE}`,
30
- )[0]!.count
31
-
32
- const hashEventDef = memoizeByRef((event: EventDef.AnyWithoutFn) => Schema.hash(event.schema))
33
-
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 resolution = yield* resolveEventDef(schema, {
56
- operation: '@livestore/common:rematerializeFromEventlog:processEvent',
57
- event: eventEncoded,
58
- }).pipe(UnknownError.mapToUnknownError)
59
-
60
- if (resolution._tag === 'unknown') {
61
- // Old snapshots can contain newer events. Skip until the runtime has
62
- // been updated; the event stays in the log for future replays.
63
- return
64
- }
32
+ if (Schema.is(StateRebuildBatchSizeSchema)(batchSize) === false) {
33
+ return yield* UnknownError.make({
34
+ cause: `Invalid stateRebuildBatchSize: ${String(batchSize)}. Expected a positive integer.`,
35
+ payload: { batchSize },
36
+ })
37
+ }
38
+
39
+ const eventsCount = dbEventlog.select<{ count: number }>(
40
+ `SELECT COUNT(*) AS count FROM ${SystemTables.EVENTLOG_META_TABLE}`,
41
+ )[0]!.count
42
+
43
+ const hashEventDef = memoizeByRef((event: EventDef.AnyWithoutFn) => Schema.hash(event.schema))
44
+
45
+ const processEvent = Effect.fn(`@livestore/common:rematerializeFromEventlog:processEvent`)(function* (
46
+ row: SystemTables.EventlogMetaRow,
47
+ ) {
48
+ const args = jsonParse(row.argsJson)
49
+ const eventEncoded = LiveStoreEvent.Client.EncodedWithMeta.make({
50
+ name: row.name,
51
+ args,
52
+ seqNum: {
53
+ global: row.seqNumGlobal,
54
+ client: row.seqNumClient,
55
+ rebaseGeneration: row.seqNumRebaseGeneration,
56
+ },
57
+ parentSeqNum: {
58
+ global: row.parentSeqNumGlobal,
59
+ client: row.parentSeqNumClient,
60
+ rebaseGeneration: row.parentSeqNumRebaseGeneration,
61
+ },
62
+ clientId: row.clientId,
63
+ sessionId: row.sessionId,
64
+ })
65
65
 
66
- const { eventDef } = resolution
66
+ const eventDef = schema.eventsDefsMap.get(row.name)
67
+ const materializer = schema.state.materializers.get(row.name)
67
68
 
68
- if (hashEventDef(eventDef) !== row.schemaHash) {
69
- yield* Effect.logWarning(
70
- `Schema hash mismatch for event definition ${row.name}. Trying to materialize event anyway.`,
71
- )
72
- }
69
+ if (eventDef === undefined || materializer === undefined) {
70
+ // Route unknown events through the normal materialization boundary so
71
+ // they advance the state snapshot head as no-ops.
72
+ yield* materializeEvent(eventEncoded, { skipEventlog: true })
73
+ return
74
+ }
73
75
 
74
- // Checking whether the schema has changed in an incompatible way
75
- yield* Schema.decodeUnknown(eventDef.schema)(args).pipe(
76
- Effect.mapError((cause) =>
77
- UnknownError.make({
78
- cause,
79
- note: `\
76
+ if (hashEventDef(eventDef) !== row.schemaHash) {
77
+ yield* Effect.logWarning(
78
+ `Schema hash mismatch for event definition ${row.name}. Trying to materialize event anyway.`,
79
+ )
80
+ }
81
+
82
+ // Checking whether the schema has changed in an incompatible way
83
+ yield* Schema.decodeUnknownEffect(eventDef.schema)(args).pipe(
84
+ Effect.mapError((cause) =>
85
+ UnknownError.make({
86
+ cause,
87
+ note: `\
80
88
  There was an error during rematerializing from the eventlog while decoding
81
89
  the persisted event args for event definition "${row.name}".
82
90
  This likely means the schema has changed in an incompatible way.
83
91
  `,
84
- }),
85
- ),
86
- )
87
-
88
- yield* materializeEvent(eventEncoded, { skipEventlog: true })
89
- })
92
+ }),
93
+ ),
94
+ )
90
95
 
91
- const CHUNK_SIZE = 100
96
+ yield* materializeEvent(eventEncoded, { skipEventlog: true })
97
+ })
92
98
 
93
- const stmt = dbEventlog.prepare(sql`\
99
+ const stmt = dbEventlog.prepare(sql`\
94
100
  SELECT * FROM ${SystemTables.EVENTLOG_META_TABLE}
95
101
  WHERE seqNumGlobal > $seqNumGlobal OR (seqNumGlobal = $seqNumGlobal AND seqNumClient > $seqNumClient)
96
102
  ORDER BY seqNumGlobal ASC, seqNumClient ASC
97
- LIMIT ${CHUNK_SIZE}
103
+ LIMIT $batchSize
98
104
  `)
99
105
 
100
- let processedEvents = 0
101
-
102
- yield* Stream.unfoldChunk<
103
- Chunk.Chunk<SystemTables.EventlogMetaRow> | { _tag: 'Initial' },
104
- SystemTables.EventlogMetaRow
105
- >({ _tag: 'Initial' }, (item) => {
106
- // End stream if no more rows
107
- if (Chunk.isChunk(item) === true && item.length === 0) return Option.none()
108
-
109
- const lastId = Chunk.isChunk(item) === true
110
- ? Chunk.last(item).pipe(
111
- Option.map((_) => ({ global: _.seqNumGlobal, client: _.seqNumClient })),
112
- Option.getOrElse(() => EventSequenceNumber.Client.ROOT),
113
- )
114
- : EventSequenceNumber.Client.ROOT
115
- const nextItem = Chunk.fromIterable(
116
- stmt.select<SystemTables.EventlogMetaRow>({
117
- $seqNumGlobal: lastId?.global,
118
- $seqNumClient: lastId?.client,
119
- } as any as PreparedBindValues),
120
- )
121
- const prevItem = Chunk.isChunk(item) === true ? item : Chunk.empty()
122
- return Option.some([prevItem, nextItem])
123
- }).pipe(
124
- Stream.bufferChunks({ capacity: 2 }),
125
- Stream.tap((row) =>
126
- Effect.gen(function* () {
127
- yield* processEvent(row)
128
-
129
- processedEvents++
130
- yield* onProgress({ done: processedEvents, total: eventsCount })
131
- }),
132
- ),
133
- Stream.runDrain,
134
- )
106
+ let processedEvents = 0
107
+
108
+ yield* Stream.paginate(EventSequenceNumber.Client.ROOT, (lastId) =>
109
+ Effect.sync(() => {
110
+ const rows = stmt.select<SystemTables.EventlogMetaRow>({
111
+ $seqNumGlobal: lastId.global,
112
+ $seqNumClient: lastId.client,
113
+ $batchSize: batchSize,
114
+ } as any as PreparedBindValues)
115
+
116
+ if (EffectArray.isReadonlyArrayNonEmpty(rows) === false) {
117
+ const done: readonly [
118
+ ReadonlyArray<SystemTables.EventlogMetaRow>,
119
+ Option.Option<EventSequenceNumber.Client.Composite>,
120
+ ] = [rows, Option.none()]
121
+ return done
122
+ }
123
+
124
+ const lastRow = EffectArray.lastNonEmpty(rows)
125
+ const nextCursor = EventSequenceNumber.Client.Composite.make({
126
+ global: lastRow.seqNumGlobal,
127
+ client: lastRow.seqNumClient,
128
+ rebaseGeneration: lastRow.seqNumRebaseGeneration,
129
+ })
130
+ const next: readonly [
131
+ ReadonlyArray<SystemTables.EventlogMetaRow>,
132
+ Option.Option<EventSequenceNumber.Client.Composite>,
133
+ ] = [rows, Option.some(nextCursor)]
134
+ return next
135
+ }),
136
+ ).pipe(
137
+ Stream.bufferArray({ capacity: 2 }),
138
+ Stream.runForEachArray((rows) =>
139
+ Effect.forEach(
140
+ rows,
141
+ (row) =>
142
+ Effect.gen(function* () {
143
+ yield* processEvent(row)
144
+
145
+ processedEvents++
146
+ yield* onProgress({ done: processedEvents, total: eventsCount })
147
+ }),
148
+ { discard: true },
149
+ ).pipe(withSavepoint(dbState)),
150
+ ),
151
+ Effect.ensuring(Effect.sync(() => stmt.finalize())),
152
+ )
135
153
  }, 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
+ })
@@ -29,7 +29,7 @@
29
29
  */
30
30
 
31
31
  import { shouldNeverHappen } from '@livestore/utils'
32
- import { Schema } from '@livestore/utils/effect'
32
+ import { Result, Schema } from '@livestore/utils/effect'
33
33
 
34
34
  import type { EventDef } from './event-def.ts'
35
35
  import type { EventDefFactInput, EventDefFacts } from './facts.ts'
@@ -105,15 +105,15 @@ export type DefineEventOptions<TTo, TDerived extends boolean = false> = {
105
105
  export const defineEvent = <TName extends string, TType, TEncoded = TType, TDerived extends boolean = false>(
106
106
  args: {
107
107
  name: TName
108
- schema: Schema.Schema<TType, TEncoded>
108
+ schema: Schema.Codec<TType, TEncoded>
109
109
  } & DefineEventOptions<TType, TDerived>,
110
110
  ): EventDef<TName, TType, TEncoded, TDerived> => {
111
111
  const { name, schema, ...options } = args
112
112
 
113
113
  const makePartialEvent = (args: TType) => {
114
- const res = Schema.validateEither(schema)(args)
115
- if (res._tag === 'Left') {
116
- shouldNeverHappen(`Invalid event args for event '${name}':`, res.left.message, '\n')
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
117
  }
118
118
  return { name: name, args }
119
119
  }
@@ -127,18 +127,19 @@ export const defineEvent = <TName extends string, TType, TEncoded = TType, TDeri
127
127
  Object.defineProperty(makePartialEvent, 'options', {
128
128
  value: {
129
129
  clientOnly: options?.clientOnly ?? false,
130
- facts: options?.facts !== undefined
131
- ? (args, currentFacts) => {
132
- const res = options.facts!(args, currentFacts)
133
- return {
134
- modify: {
135
- set: res.modify?.set !== undefined ? new Set(res.modify.set) : new Set(),
136
- unset: res.modify?.unset !== undefined ? new Set(res.modify.unset) : new Set(),
137
- },
138
- require: res.require !== undefined ? new Set(res.require) : new Set(),
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
+ }
139
141
  }
140
- }
141
- : undefined,
142
+ : undefined,
142
143
  derived: options?.derived ?? false,
143
144
  deprecated: options?.deprecated,
144
145
  } satisfies EventDef.Any['options'],
@@ -178,7 +179,7 @@ export const defineEvent = <TName extends string, TType, TEncoded = TType, TDeri
178
179
  export const synced = <TName extends string, TType, TEncoded = TType>(
179
180
  args: {
180
181
  name: TName
181
- schema: Schema.Schema<TType, TEncoded>
182
+ schema: Schema.Codec<TType, TEncoded>
182
183
  } & Omit<DefineEventOptions<TType>, 'derived' | 'clientOnly'>,
183
184
  ): EventDef<TName, TType, TEncoded> => defineEvent({ ...args, clientOnly: false })
184
185
 
@@ -201,7 +202,7 @@ export const synced = <TName extends string, TType, TEncoded = TType>(
201
202
  * name: 'UiStateSet',
202
203
  * schema: Schema.Struct({
203
204
  * selectedTodoId: Schema.NullOr(Schema.String),
204
- * filterMode: Schema.Literal('all', 'active', 'completed'),
205
+ * filterMode: Schema.Literals(['all', 'active', 'completed']),
205
206
  * }),
206
207
  * })
207
208
  *
@@ -212,6 +213,6 @@ export const synced = <TName extends string, TType, TEncoded = TType>(
212
213
  export const clientOnly = <TName extends string, TType, TEncoded = TType>(
213
214
  args: {
214
215
  name: TName
215
- schema: Schema.Schema<TType, TEncoded>
216
+ schema: Schema.Codec<TType, TEncoded>
216
217
  } & Omit<DefineEventOptions<TType>, 'derived' | 'clientOnly'>,
217
218
  ): EventDef<TName, TType, TEncoded> => defineEvent({ ...args, clientOnly: true })
@@ -60,14 +60,7 @@ describe('logDeprecationWarnings', () => {
60
60
 
61
61
  const run = (effect: Effect.Effect<void>) =>
62
62
  Effect.runSync(
63
- effect.pipe(
64
- Effect.provide(
65
- Logger.replace(
66
- Logger.defaultLogger,
67
- Logger.make(({ message }) => logs.push(message as unknown[])),
68
- ),
69
- ),
70
- ),
63
+ effect.pipe(Effect.provide(Logger.layer([Logger.make(({ message }) => logs.push(message as unknown[]))]))),
71
64
  )
72
65
 
73
66
  test('logs event deprecation warning', () => {
@@ -30,20 +30,19 @@
30
30
  * @module
31
31
  */
32
32
 
33
- import type { Schema } from '@livestore/utils/effect'
34
- import { Effect, Option, SchemaAST } from '@livestore/utils/effect'
33
+ import { type Schema, Effect, Option, SchemaAST } from '@livestore/utils/effect'
35
34
 
36
35
  import type { EventDef } from './event-def.ts'
37
36
 
38
- /** Symbol used to mark schemas as deprecated. */
39
- export const DeprecatedId = Symbol.for('livestore/schema/annotations/deprecated')
37
+ /** Annotation key used to mark schemas as deprecated. */
38
+ export const DeprecatedId = 'livestore/schema/annotations/deprecated'
40
39
 
41
40
  /**
42
41
  * Marks a schema field as deprecated with a reason message.
43
42
  * When an event is committed with a deprecated field that has a value,
44
43
  * a warning will be logged.
45
44
  *
46
- * Works with both Schema types and PropertySignatures (from Schema.optional).
45
+ * Works with Schema fields, including optional fields from Schema.optional.
47
46
  *
48
47
  * @param reason - Explanation of why this field is deprecated and what to use instead
49
48
  * @returns A function that adds the deprecation annotation to the schema
@@ -58,8 +57,8 @@ export const DeprecatedId = Symbol.for('livestore/schema/annotations/deprecated'
58
57
  */
59
58
  export const deprecated =
60
59
  (reason: string) =>
61
- <T extends { annotations: (annotations: { readonly [DeprecatedId]?: string }) => T }>(schema: T): T =>
62
- schema.annotations({ [DeprecatedId]: reason })
60
+ <T extends Schema.Top>(schema: T): T['Rebuild'] =>
61
+ schema.annotate({ [DeprecatedId]: reason })
63
62
 
64
63
  /**
65
64
  * Checks if a schema has a deprecation annotation.
@@ -67,8 +66,8 @@ export const deprecated =
67
66
  * @param schema - The schema to check
68
67
  * @returns The deprecation reason if deprecated, None otherwise
69
68
  */
70
- export const getDeprecatedReason = <A, I, R>(schema: Schema.Schema<A, I, R>): Option.Option<string> =>
71
- SchemaAST.getAnnotation<string>(DeprecatedId)(schema.ast)
69
+ export const getDeprecatedReason = (schema: Schema.Top): Option.Option<string> =>
70
+ Option.fromUndefinedOr(SchemaAST.resolveAt<string>(DeprecatedId)(schema.ast))
72
71
 
73
72
  /**
74
73
  * Checks if a schema is deprecated.
@@ -76,8 +75,7 @@ export const getDeprecatedReason = <A, I, R>(schema: Schema.Schema<A, I, R>): Op
76
75
  * @param schema - The schema to check
77
76
  * @returns true if the schema is deprecated
78
77
  */
79
- export const isDeprecated = <A, I, R>(schema: Schema.Schema<A, I, R>): boolean =>
80
- Option.isSome(getDeprecatedReason(schema))
78
+ export const isDeprecated = (schema: Schema.Top): boolean => Option.isSome(getDeprecatedReason(schema))
81
79
 
82
80
  /**
83
81
  * Finds deprecated fields with values in the given event arguments.
@@ -88,28 +86,27 @@ export const isDeprecated = <A, I, R>(schema: Schema.Schema<A, I, R>): boolean =
88
86
  * @returns Array of objects containing field name and deprecation reason
89
87
  */
90
88
  export const findDeprecatedFieldsWithValues = (
91
- schema: Schema.Schema.All,
89
+ schema: Schema.Top,
92
90
  args: Record<string, unknown>,
93
91
  ): Array<{ field: string; reason: string }> => {
94
92
  const result: Array<{ field: string; reason: string }> = []
95
- const ast = schema.ast
93
+ const ast = SchemaAST.toType(schema.ast)
96
94
 
97
- // Handle TypeLiteral (Struct) schemas
98
- if (ast._tag === 'TypeLiteral') {
95
+ // Handle Objects (Struct) schemas
96
+ if (SchemaAST.isObjects(ast) === true) {
99
97
  for (const prop of ast.propertySignatures) {
100
98
  const fieldName = String(prop.name)
101
99
  const fieldValue = args[fieldName]
102
100
 
103
101
  // Only check fields that have a value (not undefined)
104
102
  if (fieldValue !== undefined) {
105
- // Check deprecation on the property signature itself (for Schema.optional(...).pipe(deprecated(...)))
106
- const propAnnotations = prop.annotations as Record<symbol, unknown> | undefined
107
- const deprecationReason = propAnnotations?.[DeprecatedId] as string | undefined
103
+ // Check deprecation on the property key itself (for Schema.optional(...).pipe(deprecated(...)))
104
+ const deprecationReason = prop.type.context?.annotations?.[DeprecatedId] as string | undefined
108
105
 
109
106
  // Also check deprecation on the type (for direct field deprecation)
110
- const typeDeprecation = SchemaAST.getAnnotation<string>(DeprecatedId)(prop.type)
107
+ const typeDeprecation = SchemaAST.resolveAt<string>(DeprecatedId)(prop.type)
111
108
 
112
- const reason = deprecationReason ?? (Option.isSome(typeDeprecation) === true ? typeDeprecation.value : undefined)
109
+ const reason = deprecationReason ?? typeDeprecation
113
110
  if (reason !== undefined) {
114
111
  result.push({ field: fieldName, reason })
115
112
  }
@@ -34,7 +34,7 @@ export type EventDef<TName extends string, TType, TEncoded = TType, TDerived ext
34
34
  name: TName
35
35
 
36
36
  /** Effect Schema used for validating and encoding/decoding event arguments. */
37
- schema: Schema.Schema<TType, TEncoded>
37
+ schema: Schema.Codec<TType, TEncoded>
38
38
 
39
39
  options: {
40
40
  /**
@@ -62,9 +62,7 @@ export type EventDef<TName extends string, TType, TEncoded = TType, TDerived ext
62
62
  * Callable signature - creates a partial event with decoded arguments.
63
63
  * The returned object can be passed directly to `store.commit()`.
64
64
  */
65
- (
66
- args: TType,
67
- ): {
65
+ (args: TType): {
68
66
  name: TName
69
67
  args: TType
70
68
  }
@@ -8,7 +8,7 @@ export type Type = Brand.Branded<number, 'ClientEventSequenceNumber'>
8
8
  const ClientBrand = Brand.nominal<Type>()
9
9
 
10
10
  /** Effect Schema for encoding/decoding client sequence numbers. */
11
- export const Schema = S.fromBrand(ClientBrand)(S.Int)
11
+ export const Schema = S.fromBrand('ClientEventSequenceNumber', ClientBrand)(S.Int)
12
12
 
13
13
  /**
14
14
  * Creates a branded client sequence number from a plain number.
@@ -177,27 +177,13 @@ const CompositeSchema = S.Struct({
177
177
  client: Schema,
178
178
  // Client only
179
179
  rebaseGeneration: S.Int,
180
- }).annotations({
181
- title: 'EventSequenceNumber.Composite',
182
- pretty: () => (seqNum) => toString(seqNum),
183
180
  })
184
-
185
- /**
186
- * Creates a validated Composite sequence number from input.
187
- * If rebaseGeneration is omitted, defaults to REBASE_GENERATION_DEFAULT (0).
188
- */
189
- const makeComposite = (seqNum: CompositeInput): Composite => {
190
- return S.is(CompositeSchema)(seqNum) === true
191
- ? seqNum
192
- : S.decodeSync(CompositeSchema)({
193
- ...seqNum,
194
- rebaseGeneration: seqNum.rebaseGeneration ?? REBASE_GENERATION_DEFAULT,
195
- })
196
- }
181
+ .annotate({ title: 'EventSequenceNumber.Composite' })
182
+ .pipe(S.overrideToFormatter(() => (seqNum) => toString(seqNum)))
197
183
 
198
184
  /**
199
185
  * Effect Schema for the composite event sequence number (global + client + rebaseGeneration).
200
- * Also includes a `make` helper for creating validated Composite values.
186
+ * Its `make` validates input and defaults an omitted rebaseGeneration to REBASE_GENERATION_DEFAULT (0).
201
187
  *
202
188
  * @example
203
189
  * ```ts
@@ -210,7 +196,17 @@ const makeComposite = (seqNum: CompositeInput): Composite => {
210
196
  * const validated = EventSequenceNumber.Client.Composite.make({ global: 5, client: 0, rebaseGeneration: 0 })
211
197
  * ```
212
198
  */
213
- export const Composite = Object.assign(CompositeSchema, { make: makeComposite })
199
+ export const Composite: typeof CompositeSchema & { make(seqNum: CompositeInput): Composite } =
200
+ class extends CompositeSchema {
201
+ static override make(seqNum: CompositeInput): Composite {
202
+ return S.is(CompositeSchema)(seqNum) === true
203
+ ? seqNum
204
+ : S.decodeSync(CompositeSchema)({
205
+ ...seqNum,
206
+ rebaseGeneration: seqNum.rebaseGeneration ?? REBASE_GENERATION_DEFAULT,
207
+ })
208
+ }
209
+ }
214
210
 
215
211
  /** The root sequence number (global=0, client=0, rebaseGeneration=0). Parent of the first event. */
216
212
  export const ROOT = {
@@ -222,19 +218,19 @@ export const ROOT = {
222
218
  /**
223
219
  * Computes the next sequence number and its parent based on the current position.
224
220
  *
225
- * For client-local events (isClient=true): increments the client component, keeps global.
226
- * For global events (isClient=false): increments global, resets client to 0.
221
+ * For client-only events (isClientOnly=true): increments the client component, keeps global.
222
+ * For global events (isClientOnly=false): increments global, resets client to 0.
227
223
  */
228
224
  export const nextPair = ({
229
225
  seqNum,
230
- isClient,
226
+ isClientOnly,
231
227
  rebaseGeneration,
232
228
  }: {
233
229
  seqNum: Composite
234
- isClient: boolean
230
+ isClientOnly: boolean
235
231
  rebaseGeneration?: number
236
232
  }): CompositePair => {
237
- if (isClient === true) {
233
+ if (isClientOnly === true) {
238
234
  return {
239
235
  seqNum: {
240
236
  global: seqNum.global,
@@ -6,7 +6,7 @@ export type Type = Brand.Branded<number, 'GlobalEventSequenceNumber'>
6
6
  const GlobalBrand = Brand.nominal<Type>()
7
7
 
8
8
  /** Effect Schema for encoding/decoding global sequence numbers. */
9
- export const Schema = S.fromBrand(GlobalBrand)(S.Int)
9
+ export const Schema = S.fromBrand('GlobalEventSequenceNumber', GlobalBrand)(S.Int)
10
10
 
11
11
  /**
12
12
  * Creates a branded global sequence number from a plain number.
@@ -7,12 +7,12 @@ import { EventSequenceNumber } from './mod.ts'
7
7
  Vitest.describe('EventSequenceNumber', () => {
8
8
  Vitest.test('nextPair (no rebase)', () => {
9
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
+ expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: false }).seqNum).toStrictEqual({
11
11
  global: 1,
12
12
  client: 0,
13
13
  rebaseGeneration: 0,
14
14
  })
15
- expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClient: true }).seqNum).toStrictEqual({
15
+ expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: true }).seqNum).toStrictEqual({
16
16
  global: 0,
17
17
  client: 1,
18
18
  rebaseGeneration: 0,
@@ -22,14 +22,14 @@ Vitest.describe('EventSequenceNumber', () => {
22
22
  Vitest.test('nextPair (rebase)', () => {
23
23
  const e_0_0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 })
24
24
  expect(
25
- EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClient: false, rebaseGeneration: 1 }).seqNum,
25
+ EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: false, rebaseGeneration: 1 }).seqNum,
26
26
  ).toStrictEqual({
27
27
  global: 1,
28
28
  client: 0,
29
29
  rebaseGeneration: 1,
30
30
  })
31
31
  expect(
32
- EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClient: true, rebaseGeneration: 1 }).seqNum,
32
+ EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: true, rebaseGeneration: 1 }).seqNum,
33
33
  ).toStrictEqual({
34
34
  global: 0,
35
35
  client: 1,
@@ -37,7 +37,7 @@ Vitest.describe('EventSequenceNumber', () => {
37
37
  })
38
38
 
39
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({
40
+ expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0_g1, isClientOnly: false }).seqNum).toStrictEqual({
41
41
  global: 1,
42
42
  client: 0,
43
43
  rebaseGeneration: 2,