@livestore/common 0.4.0-dev.2 → 0.4.0-dev.21

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 (465) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +20 -12
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
  5. package/dist/adapter-types.d.ts +14 -6
  6. package/dist/adapter-types.d.ts.map +1 -1
  7. package/dist/adapter-types.js.map +1 -1
  8. package/dist/debug-info.d.ts.map +1 -1
  9. package/dist/debug-info.js +33 -6
  10. package/dist/debug-info.js.map +1 -1
  11. package/dist/devtools/devtools-messages-client-session.d.ts +28 -23
  12. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  13. package/dist/devtools/devtools-messages-client-session.js +2 -2
  14. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  15. package/dist/devtools/devtools-messages-common.d.ts +7 -14
  16. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  17. package/dist/devtools/devtools-messages-common.js +1 -6
  18. package/dist/devtools/devtools-messages-common.js.map +1 -1
  19. package/dist/devtools/devtools-messages-leader.d.ts +38 -29
  20. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  21. package/dist/devtools/devtools-messages-leader.js +9 -8
  22. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  23. package/dist/devtools/devtools-sessioninfo.d.ts +14 -2
  24. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  25. package/dist/devtools/devtools-sessioninfo.js +7 -4
  26. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  27. package/dist/devtools/mod.d.ts +13 -2
  28. package/dist/devtools/mod.d.ts.map +1 -1
  29. package/dist/devtools/mod.js +10 -3
  30. package/dist/devtools/mod.js.map +1 -1
  31. package/dist/errors.d.ts +52 -10
  32. package/dist/errors.d.ts.map +1 -1
  33. package/dist/errors.js +25 -6
  34. package/dist/errors.js.map +1 -1
  35. package/dist/index.d.ts +2 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +2 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/leader-thread/LeaderSyncProcessor.d.ts +41 -4
  40. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  41. package/dist/leader-thread/LeaderSyncProcessor.js +158 -75
  42. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  43. package/dist/leader-thread/eventlog.d.ts +21 -22
  44. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  45. package/dist/leader-thread/eventlog.js +77 -20
  46. package/dist/leader-thread/eventlog.js.map +1 -1
  47. package/dist/leader-thread/leader-worker-devtools.d.ts +2 -2
  48. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  49. package/dist/leader-thread/leader-worker-devtools.js +56 -45
  50. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  51. package/dist/leader-thread/make-leader-thread-layer.d.ts +6 -6
  52. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  53. package/dist/leader-thread/make-leader-thread-layer.js +79 -27
  54. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  55. package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
  56. package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
  57. package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
  58. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
  59. package/dist/leader-thread/materialize-event.d.ts +3 -3
  60. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  61. package/dist/leader-thread/materialize-event.js +25 -11
  62. package/dist/leader-thread/materialize-event.js.map +1 -1
  63. package/dist/leader-thread/mod.d.ts +1 -0
  64. package/dist/leader-thread/mod.d.ts.map +1 -1
  65. package/dist/leader-thread/mod.js +1 -0
  66. package/dist/leader-thread/mod.js.map +1 -1
  67. package/dist/leader-thread/recreate-db.d.ts +2 -3
  68. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  69. package/dist/leader-thread/recreate-db.js +5 -5
  70. package/dist/leader-thread/recreate-db.js.map +1 -1
  71. package/dist/leader-thread/shutdown-channel.d.ts +2 -2
  72. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  73. package/dist/leader-thread/shutdown-channel.js +2 -2
  74. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  75. package/dist/leader-thread/stream-events.d.ts +56 -0
  76. package/dist/leader-thread/stream-events.d.ts.map +1 -0
  77. package/dist/leader-thread/stream-events.js +166 -0
  78. package/dist/leader-thread/stream-events.js.map +1 -0
  79. package/dist/leader-thread/types.d.ts +98 -20
  80. package/dist/leader-thread/types.d.ts.map +1 -1
  81. package/dist/leader-thread/types.js +13 -0
  82. package/dist/leader-thread/types.js.map +1 -1
  83. package/dist/logging.d.ts +40 -0
  84. package/dist/logging.d.ts.map +1 -0
  85. package/dist/logging.js +33 -0
  86. package/dist/logging.js.map +1 -0
  87. package/dist/make-client-session.d.ts +5 -3
  88. package/dist/make-client-session.d.ts.map +1 -1
  89. package/dist/make-client-session.js +5 -2
  90. package/dist/make-client-session.js.map +1 -1
  91. package/dist/materializer-helper.d.ts +6 -6
  92. package/dist/materializer-helper.d.ts.map +1 -1
  93. package/dist/materializer-helper.js +20 -4
  94. package/dist/materializer-helper.js.map +1 -1
  95. package/dist/otel.d.ts +2 -1
  96. package/dist/otel.d.ts.map +1 -1
  97. package/dist/otel.js +5 -0
  98. package/dist/otel.js.map +1 -1
  99. package/dist/rematerialize-from-eventlog.d.ts +2 -2
  100. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  101. package/dist/rematerialize-from-eventlog.js +29 -20
  102. package/dist/rematerialize-from-eventlog.js.map +1 -1
  103. package/dist/schema/EventDef/define.d.ts +147 -0
  104. package/dist/schema/EventDef/define.d.ts.map +1 -0
  105. package/dist/schema/EventDef/define.js +139 -0
  106. package/dist/schema/EventDef/define.js.map +1 -0
  107. package/dist/schema/EventDef/event-def.d.ts +106 -0
  108. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  109. package/dist/schema/EventDef/event-def.js +2 -0
  110. package/dist/schema/EventDef/event-def.js.map +1 -0
  111. package/dist/schema/EventDef/facts.d.ts +118 -0
  112. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  113. package/dist/schema/EventDef/facts.js +53 -0
  114. package/dist/schema/EventDef/facts.js.map +1 -0
  115. package/dist/schema/EventDef/materializer.d.ts +155 -0
  116. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  117. package/dist/schema/EventDef/materializer.js +83 -0
  118. package/dist/schema/EventDef/materializer.js.map +1 -0
  119. package/dist/schema/EventDef/mod.d.ts +5 -0
  120. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  121. package/dist/schema/EventDef/mod.js +5 -0
  122. package/dist/schema/EventDef/mod.js.map +1 -0
  123. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  124. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  125. package/dist/schema/EventSequenceNumber/client.js +193 -0
  126. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  127. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  128. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  129. package/dist/schema/EventSequenceNumber/global.js +14 -0
  130. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  131. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  132. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  133. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  134. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  135. package/dist/schema/EventSequenceNumber.test.js +43 -43
  136. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  137. package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +89 -106
  138. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  139. package/dist/schema/{LiveStoreEvent.js → LiveStoreEvent/client.js} +74 -58
  140. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  141. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  142. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  143. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  144. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  145. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  146. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  147. package/dist/schema/LiveStoreEvent/global.js +31 -0
  148. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  149. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  150. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  151. package/dist/schema/LiveStoreEvent/input.js +26 -0
  152. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  153. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  154. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  155. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  156. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  157. package/dist/schema/events.d.ts +1 -1
  158. package/dist/schema/events.d.ts.map +1 -1
  159. package/dist/schema/events.js +1 -1
  160. package/dist/schema/events.js.map +1 -1
  161. package/dist/schema/mod.d.ts +6 -4
  162. package/dist/schema/mod.d.ts.map +1 -1
  163. package/dist/schema/mod.js +5 -4
  164. package/dist/schema/mod.js.map +1 -1
  165. package/dist/schema/schema.d.ts +16 -1
  166. package/dist/schema/schema.d.ts.map +1 -1
  167. package/dist/schema/schema.js +27 -2
  168. package/dist/schema/schema.js.map +1 -1
  169. package/dist/schema/state/sqlite/client-document-def.d.ts +36 -6
  170. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  171. package/dist/schema/state/sqlite/client-document-def.js +97 -6
  172. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  173. package/dist/schema/state/sqlite/client-document-def.test.js +16 -0
  174. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  175. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  176. package/dist/schema/state/sqlite/column-annotations.js +14 -6
  177. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  178. package/dist/schema/state/sqlite/column-annotations.test.js +1 -1
  179. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  180. package/dist/schema/state/sqlite/column-def.js +69 -22
  181. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  182. package/dist/schema/state/sqlite/column-def.test.js +48 -10
  183. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  184. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  185. package/dist/schema/state/sqlite/column-spec.js +30 -12
  186. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  187. package/dist/schema/state/sqlite/column-spec.test.js +23 -14
  188. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  189. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -1
  190. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  191. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +23 -6
  192. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  193. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +14 -8
  194. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  195. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +5 -3
  196. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  197. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  198. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +2 -1
  199. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  200. package/dist/schema/state/sqlite/mod.d.ts +3 -3
  201. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  202. package/dist/schema/state/sqlite/mod.js +3 -3
  203. package/dist/schema/state/sqlite/mod.js.map +1 -1
  204. package/dist/schema/state/sqlite/query-builder/api.d.ts +19 -11
  205. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  206. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  207. package/dist/schema/state/sqlite/query-builder/astToSql.js +22 -15
  208. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  209. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  210. package/dist/schema/state/sqlite/query-builder/impl.js +6 -3
  211. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  212. package/dist/schema/state/sqlite/query-builder/impl.test.js +252 -88
  213. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  214. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  215. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  216. package/dist/schema/state/sqlite/schema-helpers.js +22 -12
  217. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  218. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  219. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  220. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  221. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  222. package/dist/schema/state/sqlite/{system-tables.d.ts → system-tables/eventlog-tables.d.ts} +63 -456
  223. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
  224. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
  225. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
  226. package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
  227. package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
  228. package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
  229. package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
  230. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +456 -0
  231. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
  232. package/dist/schema/state/sqlite/system-tables/state-tables.js +55 -0
  233. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
  234. package/dist/schema/state/sqlite/table-def.d.ts +4 -4
  235. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  236. package/dist/schema/state/sqlite/table-def.js +2 -2
  237. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  238. package/dist/schema/state/sqlite/table-def.test.js +80 -0
  239. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  240. package/dist/schema/unknown-events.d.ts +47 -0
  241. package/dist/schema/unknown-events.d.ts.map +1 -0
  242. package/dist/schema/unknown-events.js +69 -0
  243. package/dist/schema/unknown-events.js.map +1 -0
  244. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
  245. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
  246. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
  247. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
  248. package/dist/schema-management/migrations.d.ts +32 -2
  249. package/dist/schema-management/migrations.d.ts.map +1 -1
  250. package/dist/schema-management/migrations.js +37 -5
  251. package/dist/schema-management/migrations.js.map +1 -1
  252. package/dist/schema-management/validate-schema.d.ts +3 -3
  253. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  254. package/dist/schema-management/validate-schema.js +2 -2
  255. package/dist/schema-management/validate-schema.js.map +1 -1
  256. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  257. package/dist/sql-queries/sql-queries.js +11 -1
  258. package/dist/sql-queries/sql-queries.js.map +1 -1
  259. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  260. package/dist/sql-queries/sql-query-builder.js +2 -1
  261. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  262. package/dist/sqlite-types.d.ts +3 -3
  263. package/dist/sqlite-types.d.ts.map +1 -1
  264. package/dist/sync/ClientSessionSyncProcessor.d.ts +11 -13
  265. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  266. package/dist/sync/ClientSessionSyncProcessor.js +45 -42
  267. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  268. package/dist/sync/errors.d.ts +66 -0
  269. package/dist/sync/errors.d.ts.map +1 -0
  270. package/dist/sync/errors.js +36 -0
  271. package/dist/sync/errors.js.map +1 -0
  272. package/dist/sync/index.d.ts +3 -0
  273. package/dist/sync/index.d.ts.map +1 -1
  274. package/dist/sync/index.js +3 -0
  275. package/dist/sync/index.js.map +1 -1
  276. package/dist/sync/mock-sync-backend.d.ts +23 -0
  277. package/dist/sync/mock-sync-backend.d.ts.map +1 -0
  278. package/dist/sync/mock-sync-backend.js +114 -0
  279. package/dist/sync/mock-sync-backend.js.map +1 -0
  280. package/dist/sync/next/compact-events.d.ts.map +1 -1
  281. package/dist/sync/next/compact-events.js +6 -7
  282. package/dist/sync/next/compact-events.js.map +1 -1
  283. package/dist/sync/next/facts.d.ts +5 -5
  284. package/dist/sync/next/facts.d.ts.map +1 -1
  285. package/dist/sync/next/facts.js +1 -2
  286. package/dist/sync/next/facts.js.map +1 -1
  287. package/dist/sync/next/history-dag-common.d.ts +54 -15
  288. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  289. package/dist/sync/next/history-dag-common.js +198 -9
  290. package/dist/sync/next/history-dag-common.js.map +1 -1
  291. package/dist/sync/next/history-dag.d.ts.map +1 -1
  292. package/dist/sync/next/history-dag.js +10 -8
  293. package/dist/sync/next/history-dag.js.map +1 -1
  294. package/dist/sync/next/rebase-events.d.ts +5 -5
  295. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  296. package/dist/sync/next/rebase-events.js +5 -5
  297. package/dist/sync/next/rebase-events.js.map +1 -1
  298. package/dist/sync/next/test/event-fixtures.d.ts +2 -2
  299. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  300. package/dist/sync/next/test/event-fixtures.js +9 -9
  301. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  302. package/dist/sync/sync-backend-kv.d.ts +7 -0
  303. package/dist/sync/sync-backend-kv.d.ts.map +1 -0
  304. package/dist/sync/sync-backend-kv.js +18 -0
  305. package/dist/sync/sync-backend-kv.js.map +1 -0
  306. package/dist/sync/sync-backend.d.ts +105 -0
  307. package/dist/sync/sync-backend.d.ts.map +1 -0
  308. package/dist/sync/sync-backend.js +61 -0
  309. package/dist/sync/sync-backend.js.map +1 -0
  310. package/dist/sync/sync.d.ts +9 -86
  311. package/dist/sync/sync.d.ts.map +1 -1
  312. package/dist/sync/sync.js +2 -27
  313. package/dist/sync/sync.js.map +1 -1
  314. package/dist/sync/syncstate.d.ts +57 -44
  315. package/dist/sync/syncstate.d.ts.map +1 -1
  316. package/dist/sync/syncstate.js +50 -45
  317. package/dist/sync/syncstate.js.map +1 -1
  318. package/dist/sync/syncstate.test.js +83 -46
  319. package/dist/sync/syncstate.test.js.map +1 -1
  320. package/dist/sync/transport-chunking.d.ts +36 -0
  321. package/dist/sync/transport-chunking.d.ts.map +1 -0
  322. package/dist/sync/transport-chunking.js +56 -0
  323. package/dist/sync/transport-chunking.js.map +1 -0
  324. package/dist/sync/validate-push-payload.d.ts +2 -2
  325. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  326. package/dist/sync/validate-push-payload.js +6 -6
  327. package/dist/sync/validate-push-payload.js.map +1 -1
  328. package/dist/testing/event-factory.d.ts +68 -0
  329. package/dist/testing/event-factory.d.ts.map +1 -0
  330. package/dist/testing/event-factory.js +78 -0
  331. package/dist/testing/event-factory.js.map +1 -0
  332. package/dist/testing/mod.d.ts +2 -0
  333. package/dist/testing/mod.d.ts.map +1 -0
  334. package/dist/testing/mod.js +2 -0
  335. package/dist/testing/mod.js.map +1 -0
  336. package/dist/version.d.ts +16 -6
  337. package/dist/version.d.ts.map +1 -1
  338. package/dist/version.js +16 -6
  339. package/dist/version.js.map +1 -1
  340. package/package.json +7 -8
  341. package/src/ClientSessionLeaderThreadProxy.ts +20 -12
  342. package/src/adapter-types.ts +18 -6
  343. package/src/debug-info.ts +37 -6
  344. package/src/devtools/devtools-messages-client-session.ts +2 -2
  345. package/src/devtools/devtools-messages-common.ts +1 -8
  346. package/src/devtools/devtools-messages-leader.ts +9 -8
  347. package/src/devtools/devtools-sessioninfo.ts +8 -5
  348. package/src/devtools/mod.ts +11 -2
  349. package/src/errors.ts +38 -11
  350. package/src/index.ts +2 -1
  351. package/src/leader-thread/LeaderSyncProcessor.ts +277 -105
  352. package/src/leader-thread/eventlog.ts +113 -38
  353. package/src/leader-thread/leader-worker-devtools.ts +86 -55
  354. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  355. package/src/leader-thread/make-leader-thread-layer.ts +156 -37
  356. package/src/leader-thread/materialize-event.ts +37 -12
  357. package/src/leader-thread/mod.ts +1 -0
  358. package/src/leader-thread/recreate-db.ts +15 -7
  359. package/src/leader-thread/shutdown-channel.ts +16 -2
  360. package/src/leader-thread/stream-events.ts +201 -0
  361. package/src/leader-thread/types.ts +70 -20
  362. package/src/logging.ts +62 -0
  363. package/src/make-client-session.ts +9 -3
  364. package/src/materializer-helper.ts +27 -10
  365. package/src/otel.ts +10 -0
  366. package/src/rematerialize-from-eventlog.ts +37 -27
  367. package/src/schema/EventDef/define.ts +201 -0
  368. package/src/schema/EventDef/event-def.ts +120 -0
  369. package/src/schema/EventDef/facts.ts +135 -0
  370. package/src/schema/EventDef/materializer.ts +172 -0
  371. package/src/schema/EventDef/mod.ts +4 -0
  372. package/src/schema/EventSequenceNumber/client.ts +257 -0
  373. package/src/schema/EventSequenceNumber/global.ts +19 -0
  374. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  375. package/src/schema/EventSequenceNumber.test.ts +70 -52
  376. package/src/schema/LiveStoreEvent/client.ts +221 -0
  377. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  378. package/src/schema/LiveStoreEvent/global.ts +45 -0
  379. package/src/schema/LiveStoreEvent/input.ts +63 -0
  380. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  381. package/src/schema/events.ts +1 -1
  382. package/src/schema/mod.ts +6 -4
  383. package/src/schema/schema.ts +39 -3
  384. package/src/schema/state/sqlite/client-document-def.test.ts +19 -2
  385. package/src/schema/state/sqlite/client-document-def.ts +127 -25
  386. package/src/schema/state/sqlite/column-annotations.test.ts +1 -1
  387. package/src/schema/state/sqlite/column-annotations.ts +16 -6
  388. package/src/schema/state/sqlite/column-def.test.ts +62 -10
  389. package/src/schema/state/sqlite/column-def.ts +88 -21
  390. package/src/schema/state/sqlite/column-spec.test.ts +29 -16
  391. package/src/schema/state/sqlite/column-spec.ts +36 -11
  392. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +26 -6
  393. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +29 -12
  394. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +12 -17
  395. package/src/schema/state/sqlite/mod.ts +4 -3
  396. package/src/schema/state/sqlite/query-builder/api.ts +25 -11
  397. package/src/schema/state/sqlite/query-builder/astToSql.ts +23 -14
  398. package/src/schema/state/sqlite/query-builder/impl.test.ts +305 -92
  399. package/src/schema/state/sqlite/query-builder/impl.ts +8 -3
  400. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  401. package/src/schema/state/sqlite/schema-helpers.ts +28 -20
  402. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  403. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  404. package/src/schema/state/sqlite/system-tables/state-tables.ts +69 -0
  405. package/src/schema/state/sqlite/table-def.test.ts +101 -0
  406. package/src/schema/state/sqlite/table-def.ts +8 -6
  407. package/src/schema/unknown-events.ts +131 -0
  408. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +86 -0
  409. package/src/schema-management/migrations.ts +41 -8
  410. package/src/schema-management/validate-schema.ts +3 -3
  411. package/src/sql-queries/sql-queries.ts +9 -1
  412. package/src/sql-queries/sql-query-builder.ts +2 -1
  413. package/src/sqlite-types.ts +3 -3
  414. package/src/sync/ClientSessionSyncProcessor.ts +69 -62
  415. package/src/sync/errors.ts +38 -0
  416. package/src/sync/index.ts +3 -0
  417. package/src/sync/mock-sync-backend.ts +184 -0
  418. package/src/sync/next/compact-events.ts +6 -7
  419. package/src/sync/next/facts.ts +7 -9
  420. package/src/sync/next/history-dag-common.ts +277 -26
  421. package/src/sync/next/history-dag.ts +16 -10
  422. package/src/sync/next/rebase-events.ts +11 -11
  423. package/src/sync/next/test/event-fixtures.ts +11 -11
  424. package/src/sync/sync-backend-kv.ts +22 -0
  425. package/src/sync/sync-backend.ts +185 -0
  426. package/src/sync/sync.ts +9 -91
  427. package/src/sync/syncstate.test.ts +96 -52
  428. package/src/sync/syncstate.ts +69 -58
  429. package/src/sync/transport-chunking.ts +90 -0
  430. package/src/sync/validate-push-payload.ts +8 -9
  431. package/src/testing/event-factory.ts +131 -0
  432. package/src/testing/mod.ts +1 -0
  433. package/src/version.ts +16 -6
  434. package/dist/schema/EventDef.d.ts +0 -123
  435. package/dist/schema/EventDef.d.ts.map +0 -1
  436. package/dist/schema/EventDef.js +0 -46
  437. package/dist/schema/EventDef.js.map +0 -1
  438. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  439. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  440. package/dist/schema/EventSequenceNumber.js +0 -139
  441. package/dist/schema/EventSequenceNumber.js.map +0 -1
  442. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  443. package/dist/schema/LiveStoreEvent.js.map +0 -1
  444. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  445. package/dist/schema/state/sqlite/system-tables.js +0 -79
  446. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  447. package/dist/schema-management/migrations.test.d.ts +0 -2
  448. package/dist/schema-management/migrations.test.d.ts.map +0 -1
  449. package/dist/schema-management/migrations.test.js +0 -52
  450. package/dist/schema-management/migrations.test.js.map +0 -1
  451. package/dist/sync/next/graphology.d.ts +0 -8
  452. package/dist/sync/next/graphology.d.ts.map +0 -1
  453. package/dist/sync/next/graphology.js +0 -30
  454. package/dist/sync/next/graphology.js.map +0 -1
  455. package/dist/sync/next/graphology_.d.ts +0 -3
  456. package/dist/sync/next/graphology_.d.ts.map +0 -1
  457. package/dist/sync/next/graphology_.js +0 -3
  458. package/dist/sync/next/graphology_.js.map +0 -1
  459. package/src/schema/EventDef.ts +0 -219
  460. package/src/schema/EventSequenceNumber.ts +0 -199
  461. package/src/schema/LiveStoreEvent.ts +0 -287
  462. package/src/schema/state/sqlite/system-tables.ts +0 -104
  463. package/src/sync/next/ambient.d.ts +0 -3
  464. package/src/sync/next/graphology.ts +0 -41
  465. package/src/sync/next/graphology_.ts +0 -2
@@ -0,0 +1,221 @@
1
+ import { memoizeByRef } from '@livestore/utils'
2
+ import { Option, Schema } from '@livestore/utils/effect'
3
+
4
+ import type { EventDef } from '../EventDef/mod.ts'
5
+ import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
6
+ import type { LiveStoreSchema } from '../schema.ts'
7
+ import type * as ForEventDef from './for-event-def.ts'
8
+ import type * as Global from './global.ts'
9
+
10
+ /** Effect Schema for client events with decoded args. */
11
+ export const Decoded = Schema.Struct({
12
+ name: Schema.String,
13
+ args: Schema.Any,
14
+ seqNum: EventSequenceNumber.Client.Composite,
15
+ parentSeqNum: EventSequenceNumber.Client.Composite,
16
+ clientId: Schema.String,
17
+ sessionId: Schema.String,
18
+ }).annotations({ title: 'LiveStoreEvent.Client.Decoded' })
19
+
20
+ /**
21
+ * Effect Schema for client events with encoded args.
22
+ * @example
23
+ * ```ts
24
+ * // Confirmed event (client=0)
25
+ * const event: LiveStoreEvent.Client.Encoded = {
26
+ * name: 'todoCreated-v1',
27
+ * args: { id: 'abc', text: 'Buy milk' },
28
+ * seqNum: { global: 5, client: 0, rebaseGeneration: 0 },
29
+ * parentSeqNum: { global: 4, client: 0, rebaseGeneration: 0 },
30
+ * clientId: 'client-xyz',
31
+ * sessionId: 'session-123'
32
+ * }
33
+ *
34
+ * // Pending local event (client=1, not yet synced)
35
+ * const pending: LiveStoreEvent.Client.Encoded = {
36
+ * ...event,
37
+ * seqNum: { global: 5, client: 1, rebaseGeneration: 0 }, // e5.1
38
+ * }
39
+ * ```
40
+ */
41
+ export const Encoded = Schema.Struct({
42
+ name: Schema.String,
43
+ args: Schema.Any,
44
+ seqNum: EventSequenceNumber.Client.Composite,
45
+ parentSeqNum: EventSequenceNumber.Client.Composite,
46
+ clientId: Schema.String,
47
+ sessionId: Schema.String,
48
+ }).annotations({ title: 'LiveStoreEvent.Client.Encoded' })
49
+
50
+ /** Event with composite sequence numbers and decoded (native TypeScript) args. */
51
+ export type Decoded = ForEventDef.Decoded<EventDef.Any>
52
+
53
+ /** Event with composite sequence numbers and encoded (serialized) args. */
54
+ export type Encoded = ForEventDef.Encoded<EventDef.Any>
55
+
56
+ /** Union of all client event types for a given schema (type-safe event discrimination). */
57
+ export type ForSchema<TSchema extends LiveStoreSchema> = {
58
+ [K in keyof TSchema['_EventDefMapType']]: ForEventDef.Decoded<TSchema['_EventDefMapType'][K]>
59
+ }[keyof TSchema['_EventDefMapType']]
60
+
61
+ /**
62
+ * Internal event representation with metadata for sync processing.
63
+ * Includes changeset data and materializer hashes for conflict detection and rebasing.
64
+ *
65
+ * Note: This class is exported for internal use. The preferred access is via `LiveStoreEvent.Client.EncodedWithMeta`.
66
+ */
67
+ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('LiveStoreEvent.Client.EncodedWithMeta')({
68
+ name: Schema.String,
69
+ args: Schema.Any,
70
+ seqNum: EventSequenceNumber.Client.Composite,
71
+ parentSeqNum: EventSequenceNumber.Client.Composite,
72
+ clientId: Schema.String,
73
+ sessionId: Schema.String,
74
+ // TODO get rid of `meta` again by cleaning up the usage implementations
75
+ meta: Schema.Struct({
76
+ sessionChangeset: Schema.Union(
77
+ Schema.TaggedStruct('sessionChangeset', {
78
+ data: Schema.Uint8Array as any as Schema.Schema<Uint8Array<ArrayBuffer>>,
79
+ debug: Schema.Any.pipe(Schema.optional),
80
+ }),
81
+ Schema.TaggedStruct('no-op', {}),
82
+ Schema.TaggedStruct('unset', {}),
83
+ ),
84
+ syncMetadata: Schema.Option(Schema.JsonValue),
85
+ /** Used to detect if the materializer is side effecting (during dev) */
86
+ materializerHashLeader: Schema.Option(Schema.Number),
87
+ materializerHashSession: Schema.Option(Schema.Number),
88
+ }).pipe(
89
+ Schema.mutable,
90
+ Schema.optional,
91
+ Schema.withDefaults({
92
+ constructor: () => ({
93
+ sessionChangeset: { _tag: 'unset' as const },
94
+ syncMetadata: Option.none(),
95
+ materializerHashLeader: Option.none(),
96
+ materializerHashSession: Option.none(),
97
+ }),
98
+ decoding: () => ({
99
+ sessionChangeset: { _tag: 'unset' as const },
100
+ syncMetadata: Option.none(),
101
+ materializerHashLeader: Option.none(),
102
+ materializerHashSession: Option.none(),
103
+ }),
104
+ }),
105
+ ),
106
+ }) {
107
+ toJSON = (): any => {
108
+ // Only used for logging/debugging
109
+ // - More readable way to print the seqNum + parentSeqNum
110
+ // - not including `meta`, `clientId`, `sessionId`
111
+ return {
112
+ seqNum: `${EventSequenceNumber.Client.toString(this.seqNum)} → ${EventSequenceNumber.Client.toString(this.parentSeqNum)} (${this.clientId}, ${this.sessionId})`,
113
+ name: this.name,
114
+ args: this.args,
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Example: (global event)
120
+ * For event e2 → e1 which should be rebased on event e3 → e2
121
+ * the resulting event num will be e4 → e3
122
+ *
123
+ * Example: (client event)
124
+ * For event e2.1 → e2 which should be rebased on event e3 → e2
125
+ * the resulting event num will be e3.1 → e3
126
+ *
127
+ * Syntax: e2.2 → e2.1
128
+ * ^ ^ ^ ^
129
+ * | | | +- client parent number
130
+ * | | +--- global parent number
131
+ * | +-- client number
132
+ * +---- global number
133
+ * Client num is omitted for global events
134
+ */
135
+ rebase = ({
136
+ parentSeqNum,
137
+ isClient,
138
+ rebaseGeneration,
139
+ }: {
140
+ parentSeqNum: EventSequenceNumber.Client.Composite
141
+ isClient: boolean
142
+ rebaseGeneration: number
143
+ }) =>
144
+ new EncodedWithMeta({
145
+ ...this,
146
+ ...EventSequenceNumber.Client.nextPair({ seqNum: parentSeqNum, isClient, rebaseGeneration }),
147
+ })
148
+
149
+ static fromGlobal = (
150
+ event: Global.Encoded,
151
+ meta: {
152
+ syncMetadata: Option.Option<Schema.JsonValue>
153
+ materializerHashLeader: Option.Option<number>
154
+ materializerHashSession: Option.Option<number>
155
+ },
156
+ ) =>
157
+ new EncodedWithMeta({
158
+ ...event,
159
+ seqNum: {
160
+ global: event.seqNum,
161
+ client: EventSequenceNumber.Client.DEFAULT,
162
+ rebaseGeneration: EventSequenceNumber.Client.REBASE_GENERATION_DEFAULT,
163
+ },
164
+ parentSeqNum: {
165
+ global: event.parentSeqNum,
166
+ client: EventSequenceNumber.Client.DEFAULT,
167
+ rebaseGeneration: EventSequenceNumber.Client.REBASE_GENERATION_DEFAULT,
168
+ },
169
+ meta: {
170
+ sessionChangeset: { _tag: 'unset' as const },
171
+ syncMetadata: meta.syncMetadata,
172
+ materializerHashLeader: meta.materializerHashLeader,
173
+ materializerHashSession: meta.materializerHashSession,
174
+ },
175
+ })
176
+
177
+ toGlobal = (): Global.Encoded => ({
178
+ ...this,
179
+ seqNum: this.seqNum.global,
180
+ parentSeqNum: this.parentSeqNum.global,
181
+ })
182
+ }
183
+
184
+ /**
185
+ * Structural equality check for client events. Compares seqNum (global + client),
186
+ * name, clientId, sessionId, and args. The `meta` field is ignored.
187
+ */
188
+ export const isEqualEncoded = (a: Encoded, b: Encoded) =>
189
+ a.seqNum.global === b.seqNum.global &&
190
+ a.seqNum.client === b.seqNum.client &&
191
+ a.name === b.name &&
192
+ a.clientId === b.clientId &&
193
+ a.sessionId === b.sessionId &&
194
+ JSON.stringify(a.args) === JSON.stringify(b.args) // TODO use schema equality here
195
+
196
+ /**
197
+ * Creates an Effect Schema union for all event types in a schema (with composite sequence numbers).
198
+ * @example
199
+ * ```ts
200
+ * const eventSchema = LiveStoreEvent.Client.makeSchema(schema)
201
+ * const event = Schema.decodeUnknownSync(eventSchema)(rawEvent)
202
+ * ```
203
+ */
204
+ export const makeSchema = <TSchema extends LiveStoreSchema>(
205
+ schema: TSchema,
206
+ ): ForEventDef.ForRecord<TSchema['_EventDefMapType']> =>
207
+ Schema.Union(
208
+ ...[...schema.eventsDefsMap.values()].map((def) =>
209
+ Schema.Struct({
210
+ name: Schema.Literal(def.name),
211
+ args: def.schema,
212
+ seqNum: EventSequenceNumber.Client.Composite,
213
+ parentSeqNum: EventSequenceNumber.Client.Composite,
214
+ clientId: Schema.String,
215
+ sessionId: Schema.String,
216
+ }),
217
+ ),
218
+ ).annotations({ title: 'LiveStoreEvent.Client' }) as any
219
+
220
+ /** Memoized `makeSchema` - caches the generated schema by reference. */
221
+ export const makeSchemaMemo = memoizeByRef(makeSchema)
@@ -0,0 +1,60 @@
1
+ import type { Schema } from '@livestore/utils/effect'
2
+
3
+ import type { EventDef, EventDefRecord } from '../EventDef/mod.ts'
4
+ import type * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
5
+
6
+ /** Event without sequence numbers, with decoded (native TypeScript) args. Used as input to `store.commit()`. */
7
+ export type InputDecoded<TEventDef extends EventDef.Any> = {
8
+ name: TEventDef['name']
9
+ args: Schema.Schema.Type<TEventDef['schema']>
10
+ }
11
+
12
+ /** Event without sequence numbers, with encoded (serialized) args. Used as input to `store.commit()`. */
13
+ export type InputEncoded<TEventDef extends EventDef.Any> = {
14
+ name: TEventDef['name']
15
+ args: Schema.Schema.Encoded<TEventDef['schema']>
16
+ }
17
+
18
+ /** Full event with composite sequence numbers and decoded args. Includes clientId/sessionId for sync. */
19
+ export type Decoded<TEventDef extends EventDef.Any> = {
20
+ name: TEventDef['name']
21
+ args: Schema.Schema.Type<TEventDef['schema']>
22
+ seqNum: EventSequenceNumber.Client.Composite
23
+ parentSeqNum: EventSequenceNumber.Client.Composite
24
+ clientId: string
25
+ sessionId: string
26
+ }
27
+
28
+ /** Full event with composite sequence numbers and encoded args. Includes clientId/sessionId for sync. */
29
+ export type Encoded<TEventDef extends EventDef.Any> = {
30
+ name: TEventDef['name']
31
+ args: Schema.Schema.Encoded<TEventDef['schema']>
32
+ seqNum: EventSequenceNumber.Client.Composite
33
+ parentSeqNum: EventSequenceNumber.Client.Composite
34
+ clientId: string
35
+ sessionId: string
36
+ }
37
+
38
+ /** Effect Schema union of all event types in an EventDefRecord (with composite sequence numbers). */
39
+ export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
40
+ {
41
+ [K in keyof TEventDefRecord]: {
42
+ name: K
43
+ args: Schema.Schema.Type<TEventDefRecord[K]['schema']>
44
+ seqNum: EventSequenceNumber.Client.Composite
45
+ parentSeqNum: EventSequenceNumber.Client.Composite
46
+ clientId: string
47
+ sessionId: string
48
+ }
49
+ }[keyof TEventDefRecord],
50
+ {
51
+ [K in keyof TEventDefRecord]: {
52
+ name: K
53
+ args: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>
54
+ seqNum: EventSequenceNumber.Client.Composite
55
+ parentSeqNum: EventSequenceNumber.Client.Composite
56
+ clientId: string
57
+ sessionId: string
58
+ }
59
+ }[keyof TEventDefRecord]
60
+ >
@@ -0,0 +1,45 @@
1
+ import { Schema } from '@livestore/utils/effect'
2
+
3
+ import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
4
+
5
+ /**
6
+ * Effect Schema for global events with integer sequence numbers.
7
+ * @example
8
+ * ```ts
9
+ * const event: LiveStoreEvent.Global.Encoded = {
10
+ * name: 'todoCreated-v1',
11
+ * args: { id: 'abc', text: 'Buy milk' },
12
+ * seqNum: 5, // This event's position in the global log
13
+ * parentSeqNum: 4, // Points to the previous event
14
+ * clientId: 'client-xyz',
15
+ * sessionId: 'session-123'
16
+ * }
17
+ * ```
18
+ */
19
+ export const Encoded = Schema.Struct({
20
+ name: Schema.String,
21
+ args: Schema.Any,
22
+ seqNum: EventSequenceNumber.Global.Schema,
23
+ parentSeqNum: EventSequenceNumber.Global.Schema,
24
+ clientId: Schema.String,
25
+ sessionId: Schema.String,
26
+ }).annotations({ title: 'LiveStoreEvent.Global.Encoded' })
27
+
28
+ /** Event with integer sequence numbers for sync backend wire format. */
29
+ export type Encoded = typeof Encoded.Type
30
+
31
+ /** Converts a Global event to Client format by expanding integer seqNums to composite form. */
32
+ export const toClientEncoded = (
33
+ event: Encoded,
34
+ ): {
35
+ name: string
36
+ args: any
37
+ seqNum: EventSequenceNumber.Client.Composite
38
+ parentSeqNum: EventSequenceNumber.Client.Composite
39
+ clientId: string
40
+ sessionId: string
41
+ } => ({
42
+ ...event,
43
+ seqNum: EventSequenceNumber.Client.fromGlobal(event.seqNum),
44
+ parentSeqNum: EventSequenceNumber.Client.fromGlobal(event.parentSeqNum),
45
+ })
@@ -0,0 +1,63 @@
1
+ import { Schema } from '@livestore/utils/effect'
2
+
3
+ import type { EventDef, EventDefRecord } from '../EventDef/mod.ts'
4
+ import type { LiveStoreSchema } from '../schema.ts'
5
+ import type * as ForEventDef from './for-event-def.ts'
6
+
7
+ /**
8
+ * Effect Schema for validating/decoding input events with encoded args.
9
+ * @example
10
+ * ```ts
11
+ * import { Schema } from '@effect/schema'
12
+ * const decoded = Schema.decodeUnknownSync(LiveStoreEvent.Input.Encoded)(rawEvent)
13
+ * ```
14
+ */
15
+ export const Encoded = Schema.Struct({
16
+ name: Schema.String,
17
+ args: Schema.Any,
18
+ }).annotations({ title: 'LiveStoreEvent.Input.Encoded' })
19
+
20
+ /** Event without sequence numbers, with decoded (native TypeScript) args. */
21
+ export type Decoded = ForEventDef.InputDecoded<EventDef.Any>
22
+
23
+ /** Event without sequence numbers, with encoded (serialized) args. */
24
+ export type Encoded = ForEventDef.InputEncoded<EventDef.Any>
25
+
26
+ /** Union of all input event types for a given schema (type-safe event discrimination). */
27
+ export type ForSchema<TSchema extends LiveStoreSchema> = {
28
+ [K in keyof TSchema['_EventDefMapType']]: ForEventDef.InputDecoded<TSchema['_EventDefMapType'][K]>
29
+ }[keyof TSchema['_EventDefMapType']]
30
+
31
+ /** Effect Schema union of all event types in an EventDefRecord (input format, no sequence numbers). */
32
+ export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
33
+ {
34
+ [K in keyof TEventDefRecord]: {
35
+ name: K
36
+ args: Schema.Schema.Type<TEventDefRecord[K]['schema']>
37
+ }
38
+ }[keyof TEventDefRecord],
39
+ {
40
+ [K in keyof TEventDefRecord]: {
41
+ name: K
42
+ args: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>
43
+ }
44
+ }[keyof TEventDefRecord]
45
+ >
46
+
47
+ /**
48
+ * Creates an Effect Schema union for all event types in a schema (input format, no sequence numbers).
49
+ * @example
50
+ * ```ts
51
+ * const inputSchema = LiveStoreEvent.Input.makeSchema(schema)
52
+ * const event = Schema.decodeUnknownSync(inputSchema)(rawEvent)
53
+ * ```
54
+ */
55
+ export const makeSchema = <TSchema extends LiveStoreSchema>(schema: TSchema): ForRecord<TSchema['_EventDefMapType']> =>
56
+ Schema.Union(
57
+ ...[...schema.eventsDefsMap.values()].map((def) =>
58
+ Schema.Struct({
59
+ name: Schema.Literal(def.name),
60
+ args: def.schema,
61
+ }),
62
+ ),
63
+ ).annotations({ title: 'LiveStoreEvent.Input' }) as any
@@ -0,0 +1,4 @@
1
+ export * as Client from './client.ts'
2
+ export * as ForEventDef from './for-event-def.ts'
3
+ export * as Global from './global.ts'
4
+ export * as Input from './input.ts'
@@ -1 +1 @@
1
- export { clientOnly, defineEvent, synced } from './EventDef.ts'
1
+ export { clientOnly, defineEvent, synced } from './EventDef/mod.ts'
package/src/schema/mod.ts CHANGED
@@ -1,9 +1,11 @@
1
- export * from './EventDef.ts'
2
- export * as EventSequenceNumber from './EventSequenceNumber.ts'
1
+ export * from './EventDef/mod.ts'
2
+ export * as EventSequenceNumber from './EventSequenceNumber/mod.ts'
3
3
  export * as Events from './events.ts'
4
- export * as LiveStoreEvent from './LiveStoreEvent.ts'
4
+ export * as LiveStoreEvent from './LiveStoreEvent/mod.ts'
5
5
  export * from './schema.ts'
6
6
  export * as State from './state/mod.ts'
7
7
  export { SqliteAst, SqliteDsl } from './state/sqlite/db-schema/mod.ts'
8
8
  export * from './state/sqlite/schema-helpers.ts'
9
- export * as SystemTables from './state/sqlite/system-tables.ts'
9
+ export * as SystemTables from './state/sqlite/system-tables/mod.ts'
10
+ export type { UnknownEvents } from './unknown-events.ts'
11
+ export { normalizeUnknownEventHandling, resolveEventDef } from './unknown-events.ts'
@@ -1,15 +1,19 @@
1
1
  import { isReadonlyArray, shouldNeverHappen } from '@livestore/utils'
2
2
 
3
3
  import type { MigrationOptions } from '../adapter-types.ts'
4
- import type { EventDef, EventDefRecord, Materializer } from './EventDef.ts'
4
+ import type { EventDef, EventDefRecord, Materializer } from './EventDef/mod.ts'
5
5
  import { tableIsClientDocumentTable } from './state/sqlite/client-document-def.ts'
6
6
  import type { SqliteDsl } from './state/sqlite/db-schema/mod.ts'
7
- import { stateSystemTables } from './state/sqlite/system-tables.ts'
7
+ import { stateSystemTables } from './state/sqlite/system-tables/state-tables.ts'
8
8
  import type { TableDef } from './state/sqlite/table-def.ts'
9
+ import type { UnknownEvents } from './unknown-events.ts'
10
+ import { normalizeUnknownEventHandling } from './unknown-events.ts'
9
11
 
10
12
  export const LiveStoreSchemaSymbol = Symbol.for('livestore.LiveStoreSchema')
11
13
  export type LiveStoreSchemaSymbol = typeof LiveStoreSchemaSymbol
12
14
 
15
+ export const UNKNOWN_EVENT_SCHEMA_HASH = -1
16
+
13
17
  export interface LiveStoreSchema<
14
18
  TDbSchema extends SqliteDsl.DbSchema = SqliteDsl.DbSchema,
15
19
  TEventsDefRecord extends EventDefRecord = EventDefRecord,
@@ -22,6 +26,7 @@ export interface LiveStoreSchema<
22
26
 
23
27
  readonly state: InternalState
24
28
  readonly eventsDefsMap: Map<string, EventDef.AnyWithoutFn>
29
+ readonly unknownEventHandling: UnknownEvents.HandlingConfig
25
30
  readonly devtools: {
26
31
  /** @default 'default' */
27
32
  readonly alias: string
@@ -32,6 +37,30 @@ export namespace LiveStoreSchema {
32
37
  export type Any = LiveStoreSchema<any, any>
33
38
  }
34
39
 
40
+ /**
41
+ * Runtime type guard for LiveStoreSchema.
42
+ *
43
+ * The guard intentionally performs lightweight structural checks that are
44
+ * stable across implementations. It verifies the identifying symbol marker
45
+ * and the presence of core maps/state used at runtime.
46
+ */
47
+ export const isLiveStoreSchema = (value: unknown): value is LiveStoreSchema<any, any> => {
48
+ if (typeof value !== 'object' || value === null) return false
49
+
50
+ const v: any = value
51
+
52
+ // Identity marker must match exactly
53
+ if (v.LiveStoreSchemaSymbol !== LiveStoreSchemaSymbol) return false
54
+
55
+ // Core structures used at runtime
56
+ const hasEventsMap = v.eventsDefsMap instanceof Map
57
+ const hasStateSqliteTables = v.state?.sqlite?.tables instanceof Map
58
+ const hasStateMaterializers = v.state?.materializers instanceof Map
59
+ const hasDevtoolsAlias = typeof v.devtools?.alias === 'string'
60
+
61
+ return hasEventsMap && hasStateSqliteTables && hasStateMaterializers && hasDevtoolsAlias
62
+ }
63
+
35
64
  // TODO abstract this further away from sqlite/tables
36
65
  export interface InternalState {
37
66
  readonly sqlite: {
@@ -55,6 +84,10 @@ export interface InputSchema {
55
84
  */
56
85
  readonly alias?: string
57
86
  }
87
+ /**
88
+ * Configures how unknown events should be handled. Defaults to `{ strategy: 'warn' }`.
89
+ */
90
+ readonly unknownEventHandling?: UnknownEvents.HandlingConfig
58
91
  }
59
92
 
60
93
  export const makeSchema = <TInputSchema extends InputSchema>(
@@ -89,12 +122,15 @@ export const makeSchema = <TInputSchema extends InputSchema>(
89
122
  }
90
123
  }
91
124
 
125
+ const unknownEventHandling = normalizeUnknownEventHandling(inputSchema.unknownEventHandling)
126
+
92
127
  return {
93
128
  LiveStoreSchemaSymbol,
94
129
  _DbSchemaType: Symbol.for('livestore.DbSchemaType') as any,
95
130
  _EventDefMapType: Symbol.for('livestore.EventDefMapType') as any,
96
131
  state,
97
132
  eventsDefsMap,
133
+ unknownEventHandling,
98
134
  devtools: {
99
135
  alias: inputSchema.devtools?.alias ?? 'default',
100
136
  },
@@ -110,7 +146,7 @@ export const getEventDef = <TSchema extends LiveStoreSchema>(
110
146
  } => {
111
147
  const eventDef = schema.eventsDefsMap.get(eventName)
112
148
  if (eventDef === undefined) {
113
- return shouldNeverHappen(`No mutation definition found for \`${eventName}\`.`)
149
+ return shouldNeverHappen(`No event definition found for \`${eventName}\`.`)
114
150
  }
115
151
  const materializer = schema.state.materializers.get(eventName)
116
152
  if (materializer === undefined) {
@@ -2,7 +2,7 @@ import { Schema } from '@livestore/utils/effect'
2
2
  import { describe, expect, test } from 'vitest'
3
3
 
4
4
  import { tables } from '../../../__tests__/fixture.ts'
5
- import type * as LiveStoreEvent from '../../LiveStoreEvent.ts'
5
+ import type * as LiveStoreEvent from '../../LiveStoreEvent/mod.ts'
6
6
  import { ClientDocumentTableDefSymbol, clientDocument, mergeDefaultValues } from './client-document-def.ts'
7
7
 
8
8
  describe('client document table', () => {
@@ -50,6 +50,7 @@ describe('client document table', () => {
50
50
  currentFacts: new Map(),
51
51
  query: {} as any, // unused
52
52
  eventDef: Doc[ClientDocumentTableDefSymbol].derived.setEventDef,
53
+ event: {} as any, // unused in this test
53
54
  })
54
55
  }
55
56
 
@@ -230,10 +231,26 @@ describe('client document table', () => {
230
231
  }
231
232
  `)
232
233
  })
234
+
235
+ test('any value (Schema.Any) should fully replace', () => {
236
+ expect(forSchema(Schema.Any, { a: 1 }, 'id1')).toMatchInlineSnapshot(`
237
+ {
238
+ "bindValues": [
239
+ "id1",
240
+ "{"a":1}",
241
+ "{"a":1}",
242
+ ],
243
+ "sql": "INSERT INTO 'test' (id, value) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET value = ?",
244
+ "writeTables": Set {
245
+ "test",
246
+ },
247
+ }
248
+ `)
249
+ })
233
250
  })
234
251
  })
235
252
 
236
- const patchId = (muationEvent: LiveStoreEvent.PartialAnyDecoded) => {
253
+ const patchId = (muationEvent: LiveStoreEvent.Input.Decoded) => {
237
254
  // TODO use new id paradigm
238
255
  const id = `00000000-0000-0000-0000-000000000000`
239
256
  return { ...muationEvent, id }