@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
@@ -1,13 +1,30 @@
1
- import { shouldNeverHappen } from '@livestore/utils'
2
- import type { HttpClient, Schema, Scope } from '@livestore/utils/effect'
3
- import { Deferred, Effect, Layer, Queue, SubscriptionRef } from '@livestore/utils/effect'
4
-
5
- import type { BootStatus, MakeSqliteDb, SqliteDb, SqliteError } from '../adapter-types.ts'
6
- import { UnexpectedError } from '../adapter-types.ts'
1
+ import { omitUndefineds, shouldNeverHappen } from '@livestore/utils'
2
+ import type { HttpClient, Scope } from '@livestore/utils/effect'
3
+ import {
4
+ Deferred,
5
+ Effect,
6
+ KeyValueStore,
7
+ Layer,
8
+ PlatformError,
9
+ Queue,
10
+ Schema,
11
+ Stream,
12
+ Subscribable,
13
+ SubscriptionRef,
14
+ } from '@livestore/utils/effect'
15
+ import {
16
+ type BootStatus,
17
+ type MakeSqliteDb,
18
+ type MaterializerHashMismatchError,
19
+ type SqliteDb,
20
+ type SqliteError,
21
+ UnknownError,
22
+ } from '../adapter-types.ts'
23
+ import type { MigrationsReport } from '../defs.ts'
7
24
  import type * as Devtools from '../devtools/mod.ts'
8
25
  import type { LiveStoreSchema } from '../schema/mod.ts'
9
26
  import { EventSequenceNumber, LiveStoreEvent, SystemTables } from '../schema/mod.ts'
10
- import type { InvalidPullError, IsOfflineError, SyncOptions } from '../sync/sync.ts'
27
+ import type { InvalidPullError, IsOfflineError, SyncBackend, SyncOptions } from '../sync/sync.ts'
11
28
  import { SyncState } from '../sync/syncstate.ts'
12
29
  import { sql } from '../util.ts'
13
30
  import * as Eventlog from './eventlog.ts'
@@ -17,6 +34,7 @@ import { makeMaterializeEvent } from './materialize-event.ts'
17
34
  import { recreateDb } from './recreate-db.ts'
18
35
  import type { ShutdownChannel } from './shutdown-channel.ts'
19
36
  import type {
37
+ DevtoolsContext,
20
38
  DevtoolsOptions,
21
39
  InitialBlockingSyncContext,
22
40
  InitialSyncOptions,
@@ -27,7 +45,8 @@ import { LeaderThreadCtx } from './types.ts'
27
45
 
28
46
  export interface MakeLeaderThreadLayerParams {
29
47
  storeId: string
30
- syncPayload: Schema.JsonValue | undefined
48
+ syncPayloadSchema: Schema.Schema<any> | undefined
49
+ syncPayloadEncoded: Schema.JsonValue | undefined
31
50
  clientId: string
32
51
  schema: LiveStoreSchema
33
52
  makeSqliteDb: MakeSqliteDb
@@ -53,7 +72,8 @@ export const makeLeaderThreadLayer = ({
53
72
  schema,
54
73
  storeId,
55
74
  clientId,
56
- syncPayload,
75
+ syncPayloadSchema = Schema.JsonValue,
76
+ syncPayloadEncoded,
57
77
  makeSqliteDb,
58
78
  syncOptions,
59
79
  dbState,
@@ -62,8 +82,11 @@ export const makeLeaderThreadLayer = ({
62
82
  shutdownChannel,
63
83
  params,
64
84
  testing,
65
- }: MakeLeaderThreadLayerParams): Layer.Layer<LeaderThreadCtx, UnexpectedError, Scope.Scope | HttpClient.HttpClient> =>
85
+ }: MakeLeaderThreadLayerParams): Layer.Layer<LeaderThreadCtx, UnknownError, Scope.Scope | HttpClient.HttpClient> =>
66
86
  Effect.gen(function* () {
87
+ const syncPayloadDecoded =
88
+ syncPayloadEncoded === undefined ? undefined : yield* Schema.decodeUnknown(syncPayloadSchema)(syncPayloadEncoded)
89
+
67
90
  const bootStatusQueue = yield* Queue.unbounded<BootStatus>().pipe(Effect.acquireRelease(Queue.shutdown))
68
91
 
69
92
  const dbEventlogMissing = !hasEventlogTables(dbEventlog)
@@ -71,10 +94,45 @@ export const makeLeaderThreadLayer = ({
71
94
  // Either happens on initial boot or if schema changes
72
95
  const dbStateMissing = !hasStateTables(dbState)
73
96
 
97
+ yield* Eventlog.initEventlogDb(dbEventlog)
98
+
74
99
  const syncBackend =
75
100
  syncOptions?.backend === undefined
76
101
  ? undefined
77
- : yield* syncOptions.backend({ storeId, clientId, payload: syncPayload })
102
+ : yield* syncOptions.backend({ storeId, clientId, payload: syncPayloadDecoded }).pipe(
103
+ Effect.provide(
104
+ Layer.succeed(
105
+ KeyValueStore.KeyValueStore,
106
+ KeyValueStore.makeStringOnly({
107
+ get: (_key) =>
108
+ Effect.sync(() => Eventlog.getBackendIdFromDb(dbEventlog)).pipe(
109
+ Effect.catchAllDefect((cause) =>
110
+ PlatformError.BadArgument.make({
111
+ method: 'getBackendIdFromDb',
112
+ description: 'Failed to get backendId',
113
+ module: 'KeyValueStore',
114
+ cause,
115
+ }),
116
+ ),
117
+ ),
118
+ set: (_key, value) =>
119
+ Effect.sync(() => Eventlog.updateBackendId(dbEventlog, value)).pipe(
120
+ Effect.catchAllDefect((cause) =>
121
+ PlatformError.BadArgument.make({
122
+ method: 'updateBackendId',
123
+ module: 'KeyValueStore',
124
+ description: 'Failed to update backendId',
125
+ cause,
126
+ }),
127
+ ),
128
+ ),
129
+ clear: Effect.dieMessage(`Not implemented. Should never be used.`),
130
+ remove: () => Effect.dieMessage(`Not implemented. Should never be used.`),
131
+ size: Effect.dieMessage(`Not implemented. Should never be used.`),
132
+ }),
133
+ ),
134
+ ),
135
+ )
78
136
 
79
137
  if (syncBackend !== undefined) {
80
138
  // We're already connecting to the sync backend concurrently
@@ -86,18 +144,29 @@ export const makeLeaderThreadLayer = ({
86
144
  bootStatusQueue,
87
145
  })
88
146
 
147
+ const materializeEvent = yield* makeMaterializeEvent({ schema, dbState, dbEventlog })
148
+
149
+ // Recreate state database if needed BEFORE creating sync processor
150
+ // This ensures all system tables exist before any queries are made
151
+ const { migrationsReport } = dbStateMissing
152
+ ? yield* recreateDb({ dbState, dbEventlog, schema, bootStatusQueue, materializeEvent })
153
+ : { migrationsReport: { migrations: [] } }
154
+
89
155
  const syncProcessor = yield* makeLeaderSyncProcessor({
90
156
  schema,
91
157
  dbState,
92
158
  initialSyncState: getInitialSyncState({ dbEventlog, dbState, dbEventlogMissing }),
93
159
  initialBlockingSyncContext,
94
160
  onError: syncOptions?.onSyncError ?? 'ignore',
161
+ livePull: syncOptions?.livePull ?? true,
95
162
  params: {
96
- localPushBatchSize: params?.localPushBatchSize,
97
- backendPushBatchSize: params?.backendPushBatchSize,
163
+ ...omitUndefineds({
164
+ localPushBatchSize: params?.localPushBatchSize,
165
+ backendPushBatchSize: params?.backendPushBatchSize,
166
+ }),
98
167
  },
99
168
  testing: {
100
- delays: testing?.syncProcessor?.delays,
169
+ ...omitUndefineds({ delays: testing?.syncProcessor?.delays }),
101
170
  },
102
171
  })
103
172
 
@@ -113,7 +182,7 @@ export const makeLeaderThreadLayer = ({
113
182
  }
114
183
  : { enabled: false as const }
115
184
 
116
- const materializeEvent = yield* makeMaterializeEvent({ schema, dbState, dbEventlog })
185
+ const networkStatus = yield* makeNetworkStatusSubscribable({ syncBackend, devtoolsContext })
117
186
 
118
187
  const ctx = {
119
188
  schema,
@@ -123,7 +192,7 @@ export const makeLeaderThreadLayer = ({
123
192
  dbState,
124
193
  dbEventlog,
125
194
  makeSqliteDb,
126
- eventSchema: LiveStoreEvent.makeEventDefSchema(schema),
195
+ eventSchema: LiveStoreEvent.Client.makeSchema(schema),
127
196
  shutdownStateSubRef: yield* SubscriptionRef.make<ShutdownState>('running'),
128
197
  shutdownChannel,
129
198
  syncBackend,
@@ -131,6 +200,7 @@ export const makeLeaderThreadLayer = ({
131
200
  materializeEvent,
132
201
  extraIncomingMessagesQueue,
133
202
  devtools: devtoolsContext,
203
+ networkStatus,
134
204
  // State will be set during `bootLeaderThread`
135
205
  initialState: {} as any as LeaderThreadCtx['Type']['initialState'],
136
206
  } satisfies typeof LeaderThreadCtx.Service
@@ -141,7 +211,7 @@ export const makeLeaderThreadLayer = ({
141
211
  const layer = Layer.succeed(LeaderThreadCtx, ctx)
142
212
 
143
213
  ctx.initialState = yield* bootLeaderThread({
144
- dbStateMissing,
214
+ migrationsReport,
145
215
  initialBlockingSyncContext,
146
216
  devtoolsOptions,
147
217
  }).pipe(Effect.provide(layer))
@@ -150,7 +220,7 @@ export const makeLeaderThreadLayer = ({
150
220
  }).pipe(
151
221
  Effect.withSpan('@livestore/common:leader-thread:boot'),
152
222
  Effect.withSpanScoped('@livestore/common:leader-thread'),
153
- UnexpectedError.mapToUnexpectedError,
223
+ UnknownError.mapToUnknownError,
154
224
  Effect.tapCauseLogPretty,
155
225
  Layer.unwrapScoped,
156
226
  )
@@ -187,10 +257,12 @@ const getInitialSyncState = ({
187
257
  dbEventlogMissing: boolean
188
258
  }) => {
189
259
  const initialBackendHead = dbEventlogMissing
190
- ? EventSequenceNumber.ROOT.global
260
+ ? EventSequenceNumber.Client.ROOT.global
191
261
  : Eventlog.getBackendHeadFromDb(dbEventlog)
192
262
 
193
- const initialLocalHead = dbEventlogMissing ? EventSequenceNumber.ROOT : Eventlog.getClientHeadFromDb(dbEventlog)
263
+ const initialLocalHead = dbEventlogMissing
264
+ ? EventSequenceNumber.Client.ROOT
265
+ : Eventlog.getClientHeadFromDb(dbEventlog)
194
266
 
195
267
  if (initialBackendHead > initialLocalHead.global) {
196
268
  return shouldNeverHappen(
@@ -202,8 +274,8 @@ const getInitialSyncState = ({
202
274
  localHead: initialLocalHead,
203
275
  upstreamHead: {
204
276
  global: initialBackendHead,
205
- client: EventSequenceNumber.clientDefault,
206
- rebaseGeneration: EventSequenceNumber.rebaseGenerationDefault,
277
+ client: EventSequenceNumber.Client.DEFAULT,
278
+ rebaseGeneration: EventSequenceNumber.Client.REBASE_GENERATION_DEFAULT,
207
279
  },
208
280
  pending: dbEventlogMissing
209
281
  ? []
@@ -212,7 +284,7 @@ const getInitialSyncState = ({
212
284
  dbState,
213
285
  since: {
214
286
  global: initialBackendHead,
215
- client: EventSequenceNumber.clientDefault,
287
+ client: EventSequenceNumber.Client.DEFAULT,
216
288
  rebaseGeneration: initialLocalHead.rebaseGeneration,
217
289
  },
218
290
  }),
@@ -244,12 +316,12 @@ const makeInitialBlockingSyncContext = ({
244
316
 
245
317
  return {
246
318
  blockingDeferred,
247
- update: ({ processed, remaining }) =>
319
+ update: ({ processed, pageInfo }) =>
248
320
  Effect.gen(function* () {
249
321
  if (ctx.isDone === true) return
250
322
 
251
- if (ctx.total === -1) {
252
- ctx.total = remaining + processed
323
+ if (ctx.total === -1 && pageInfo._tag === 'MoreKnown') {
324
+ ctx.total = pageInfo.remaining + processed
253
325
  }
254
326
 
255
327
  ctx.processedEvents += processed
@@ -258,7 +330,7 @@ const makeInitialBlockingSyncContext = ({
258
330
  progress: { done: ctx.processedEvents, total: ctx.total },
259
331
  })
260
332
 
261
- if (remaining === 0 && blockingDeferred !== undefined) {
333
+ if (pageInfo._tag === 'NoMore' && blockingDeferred !== undefined) {
262
334
  yield* Deferred.succeed(blockingDeferred, void 0)
263
335
  ctx.isDone = true
264
336
  }
@@ -271,26 +343,20 @@ const makeInitialBlockingSyncContext = ({
271
343
  * It also starts various background processes (e.g. syncing)
272
344
  */
273
345
  const bootLeaderThread = ({
274
- dbStateMissing,
346
+ migrationsReport,
275
347
  initialBlockingSyncContext,
276
348
  devtoolsOptions,
277
349
  }: {
278
- dbStateMissing: boolean
350
+ migrationsReport: MigrationsReport
279
351
  initialBlockingSyncContext: InitialBlockingSyncContext
280
352
  devtoolsOptions: DevtoolsOptions
281
353
  }): Effect.Effect<
282
354
  LeaderThreadCtx['Type']['initialState'],
283
- UnexpectedError | SqliteError | IsOfflineError | InvalidPullError,
355
+ UnknownError | SqliteError | IsOfflineError | InvalidPullError | MaterializerHashMismatchError,
284
356
  LeaderThreadCtx | Scope.Scope | HttpClient.HttpClient
285
357
  > =>
286
358
  Effect.gen(function* () {
287
- const { dbEventlog, bootStatusQueue, syncProcessor, schema, materializeEvent, dbState } = yield* LeaderThreadCtx
288
-
289
- yield* Eventlog.initEventlogDb(dbEventlog)
290
-
291
- const { migrationsReport } = dbStateMissing
292
- ? yield* recreateDb({ dbState, dbEventlog, schema, bootStatusQueue, materializeEvent })
293
- : { migrationsReport: { migrations: [] } }
359
+ const { bootStatusQueue, syncProcessor } = yield* LeaderThreadCtx
294
360
 
295
361
  // NOTE the sync processor depends on the dbs being initialized properly
296
362
  const { initialLeaderHead } = yield* syncProcessor.boot
@@ -313,3 +379,56 @@ const bootLeaderThread = ({
313
379
 
314
380
  return { migrationsReport, leaderHead: initialLeaderHead }
315
381
  })
382
+
383
+ /** @internal */
384
+ export const makeNetworkStatusSubscribable = ({
385
+ syncBackend,
386
+ devtoolsContext,
387
+ }: {
388
+ syncBackend: SyncBackend.SyncBackend | undefined
389
+ devtoolsContext: DevtoolsContext
390
+ }): Effect.Effect<Subscribable.Subscribable<SyncBackend.NetworkStatus>, never, Scope.Scope> =>
391
+ Effect.gen(function* () {
392
+ const initialIsConnected = syncBackend !== undefined ? yield* SubscriptionRef.get(syncBackend.isConnected) : false
393
+ const initialLatchClosed =
394
+ devtoolsContext.enabled === true
395
+ ? (yield* SubscriptionRef.get(devtoolsContext.syncBackendLatchState)).latchClosed
396
+ : false
397
+
398
+ const networkStatusRef = yield* SubscriptionRef.make<SyncBackend.NetworkStatus>({
399
+ isConnected: initialIsConnected,
400
+ timestampMs: Date.now(),
401
+ devtools: { latchClosed: initialLatchClosed },
402
+ })
403
+
404
+ const updateNetworkStatus = (patch: { isConnected?: boolean; latchClosed?: boolean }) =>
405
+ SubscriptionRef.update(networkStatusRef, (previous) => ({
406
+ isConnected: patch.isConnected ?? previous.isConnected,
407
+ timestampMs: Date.now(),
408
+ devtools: {
409
+ latchClosed: patch.latchClosed ?? previous.devtools.latchClosed,
410
+ },
411
+ }))
412
+
413
+ if (syncBackend !== undefined) {
414
+ yield* syncBackend.isConnected.changes.pipe(
415
+ Stream.tap((isConnected) => updateNetworkStatus({ isConnected })),
416
+ Stream.runDrain,
417
+ Effect.interruptible,
418
+ Effect.tapCauseLogPretty,
419
+ Effect.forkScoped,
420
+ )
421
+ }
422
+
423
+ if (devtoolsContext.enabled === true) {
424
+ yield* devtoolsContext.syncBackendLatchState.changes.pipe(
425
+ Stream.tap(({ latchClosed }) => updateNetworkStatus({ latchClosed })),
426
+ Stream.runDrain,
427
+ Effect.interruptible,
428
+ Effect.tapCauseLogPretty,
429
+ Effect.forkScoped,
430
+ )
431
+ }
432
+
433
+ return Subscribable.fromSubscriptionRef(networkStatusRef)
434
+ })
@@ -1,16 +1,17 @@
1
1
  import { isDevEnv, LS_DEV, shouldNeverHappen } from '@livestore/utils'
2
2
  import { Effect, Option, ReadonlyArray, Schema } from '@livestore/utils/effect'
3
3
 
4
- import { type SqliteDb, UnexpectedError } from '../adapter-types.ts'
4
+ import { MaterializeError, MaterializerHashMismatchError, type SqliteDb } from '../adapter-types.ts'
5
5
  import { getExecStatementsFromMaterializer, hashMaterializerResults } from '../materializer-helper.ts'
6
6
  import type { LiveStoreSchema } from '../schema/mod.ts'
7
- import { EventSequenceNumber, getEventDef, SystemTables } from '../schema/mod.ts'
7
+ import { EventSequenceNumber, resolveEventDef, SystemTables, UNKNOWN_EVENT_SCHEMA_HASH } from '../schema/mod.ts'
8
8
  import { insertRow } from '../sql-queries/index.ts'
9
9
  import { sql } from '../util.ts'
10
10
  import { execSql, execSqlPrepared } from './connection.ts'
11
11
  import * as Eventlog from './eventlog.ts'
12
12
  import type { MaterializeEvent } from './types.ts'
13
13
 
14
+ // TODO refactor `makeMaterializeEvent` to not return an Effect for the constructor as it's not needed
14
15
  export const makeMaterializeEvent = ({
15
16
  schema,
16
17
  dbState,
@@ -19,7 +20,7 @@ export const makeMaterializeEvent = ({
19
20
  schema: LiveStoreSchema
20
21
  dbState: SqliteDb
21
22
  dbEventlog: SqliteDb
22
- }): Effect.Effect<MaterializeEvent, UnexpectedError> =>
23
+ }): Effect.Effect<MaterializeEvent> =>
23
24
  Effect.gen(function* () {
24
25
  const eventDefSchemaHashMap = new Map(
25
26
  // TODO Running `Schema.hash` can be a bottleneck for larger schemas. There is an opportunity to run this
@@ -32,8 +33,34 @@ export const makeMaterializeEvent = ({
32
33
  Effect.gen(function* () {
33
34
  const skipEventlog = options?.skipEventlog ?? false
34
35
 
35
- const eventName = eventEncoded.name
36
- const { eventDef, materializer } = getEventDef(schema, eventName)
36
+ const resolution = yield* resolveEventDef(schema, {
37
+ operation: '@livestore/common:leader-thread:materializeEvent',
38
+ event: eventEncoded,
39
+ })
40
+
41
+ if (resolution._tag === 'unknown') {
42
+ // Unknown events still enter the eventlog so newer clients can replay
43
+ // them once they learn the schema. We skip materialization to keep the
44
+ // local state consistent with the knowledge of the current client.
45
+ if (skipEventlog === false) {
46
+ yield* Eventlog.insertIntoEventlog(
47
+ eventEncoded,
48
+ dbEventlog,
49
+ UNKNOWN_EVENT_SCHEMA_HASH,
50
+ eventEncoded.clientId,
51
+ eventEncoded.sessionId,
52
+ )
53
+ }
54
+
55
+ dbState.debug.head = eventEncoded.seqNum
56
+
57
+ return {
58
+ sessionChangeset: { _tag: 'no-op' as const },
59
+ hash: Option.none(),
60
+ }
61
+ }
62
+
63
+ const { eventDef, materializer } = resolution
37
64
 
38
65
  const execArgsArr = getExecStatementsFromMaterializer({
39
66
  eventDef,
@@ -49,10 +76,7 @@ export const makeMaterializeEvent = ({
49
76
  eventEncoded.meta.materializerHashSession._tag === 'Some' &&
50
77
  eventEncoded.meta.materializerHashSession.value !== materializerHash.value
51
78
  ) {
52
- yield* UnexpectedError.make({
53
- cause: `Materializer hash mismatch detected for event "${eventEncoded.name}".`,
54
- note: `Please make sure your event materializer is a pure function without side effects.`,
55
- })
79
+ return yield* MaterializerHashMismatchError.make({ eventName: eventEncoded.name })
56
80
  }
57
81
 
58
82
  // NOTE we might want to bring this back if we want to debug no-op events
@@ -126,11 +150,12 @@ export const makeMaterializeEvent = ({
126
150
  hash: materializerHash,
127
151
  }
128
152
  }).pipe(
153
+ Effect.mapError((cause) => MaterializeError.make({ cause })),
129
154
  Effect.withSpan(`@livestore/common:leader-thread:materializeEvent`, {
130
155
  attributes: {
131
156
  eventName: eventEncoded.name,
132
157
  eventNum: eventEncoded.seqNum,
133
- 'span.label': `${EventSequenceNumber.toString(eventEncoded.seqNum)} ${eventEncoded.name}`,
158
+ 'span.label': `${EventSequenceNumber.Client.toString(eventEncoded.seqNum)} ${eventEncoded.name}`,
134
159
  },
135
160
  }),
136
161
  // Effect.logDuration('@livestore/common:leader-thread:materializeEvent'),
@@ -144,7 +169,7 @@ export const rollback = ({
144
169
  }: {
145
170
  dbState: SqliteDb
146
171
  dbEventlog: SqliteDb
147
- eventNumsToRollback: EventSequenceNumber.EventSequenceNumber[]
172
+ eventNumsToRollback: EventSequenceNumber.Client.Composite[]
148
173
  }) =>
149
174
  Effect.gen(function* () {
150
175
  const rollbackEvents = dbState
@@ -160,7 +185,7 @@ export const rollback = ({
160
185
  changeset: _.changeset,
161
186
  debug: _.debug,
162
187
  }))
163
- .toSorted((a, b) => EventSequenceNumber.compare(a.seqNum, b.seqNum))
188
+ .toSorted((a, b) => EventSequenceNumber.Client.compare(a.seqNum, b.seqNum))
164
189
 
165
190
  // Apply changesets in reverse order
166
191
  for (let i = rollbackEvents.length - 1; i >= 0; i--) {
@@ -5,4 +5,5 @@ export * from './make-leader-thread-layer.ts'
5
5
  export * from './materialize-event.ts'
6
6
  export * from './recreate-db.ts'
7
7
  export * as ShutdownChannel from './shutdown-channel.ts'
8
+ export * from './stream-events.ts'
8
9
  export * from './types.ts'
@@ -2,8 +2,16 @@ import { casesHandled } from '@livestore/utils'
2
2
  import { Effect, Queue } from '@livestore/utils/effect'
3
3
 
4
4
  import type { MigrationsReport } from '../defs.ts'
5
- import type { BootStatus, MigrationHooks, SqliteDb, SqliteError } from '../index.ts'
6
- import { migrateDb, rematerializeFromEventlog, UnexpectedError } from '../index.ts'
5
+ import {
6
+ type BootStatus,
7
+ type MaterializeError,
8
+ type MigrationHooks,
9
+ migrateDb,
10
+ rematerializeFromEventlog,
11
+ type SqliteDb,
12
+ type SqliteError,
13
+ UnknownError,
14
+ } from '../index.ts'
7
15
  import type { LiveStoreSchema } from '../schema/mod.ts'
8
16
  import { configureConnection } from './connection.ts'
9
17
  import type { MaterializeEvent } from './types.ts'
@@ -20,7 +28,7 @@ export const recreateDb = ({
20
28
  schema: LiveStoreSchema
21
29
  bootStatusQueue: Queue.Queue<BootStatus>
22
30
  materializeEvent: MaterializeEvent
23
- }): Effect.Effect<{ migrationsReport: MigrationsReport }, UnexpectedError | SqliteError> =>
31
+ }): Effect.Effect<{ migrationsReport: MigrationsReport }, UnknownError | MaterializeError | SqliteError> =>
24
32
  Effect.gen(function* () {
25
33
  const migrationOptions = schema.state.sqlite.migrations
26
34
  let migrationsReport: MigrationsReport
@@ -40,7 +48,7 @@ export const recreateDb = ({
40
48
 
41
49
  const initDb = (hooks: Partial<MigrationHooks> | undefined) =>
42
50
  Effect.gen(function* () {
43
- yield* Effect.tryAll(() => hooks?.init?.(tmpDb)).pipe(UnexpectedError.mapToUnexpectedError)
51
+ yield* Effect.tryAll(() => hooks?.init?.(tmpDb)).pipe(UnknownError.mapToUnknownError)
44
52
 
45
53
  const migrationsReport = yield* migrateDb({
46
54
  db: tmpDb,
@@ -49,7 +57,7 @@ export const recreateDb = ({
49
57
  Queue.offer(bootStatusQueue, { stage: 'migrating', progress: { done, total } }),
50
58
  })
51
59
 
52
- yield* Effect.tryAll(() => hooks?.pre?.(tmpDb)).pipe(UnexpectedError.mapToUnexpectedError)
60
+ yield* Effect.tryAll(() => hooks?.pre?.(tmpDb)).pipe(UnknownError.mapToUnknownError)
53
61
 
54
62
  return { migrationsReport, tmpDb }
55
63
  })
@@ -70,7 +78,7 @@ export const recreateDb = ({
70
78
  Queue.offer(bootStatusQueue, { stage: 'rehydrating', progress: { done, total } }),
71
79
  })
72
80
 
73
- yield* Effect.tryAll(() => hooks?.post?.(initResult.tmpDb)).pipe(UnexpectedError.mapToUnexpectedError)
81
+ yield* Effect.tryAll(() => hooks?.post?.(initResult.tmpDb)).pipe(UnknownError.mapToUnknownError)
74
82
 
75
83
  break
76
84
  }
@@ -80,7 +88,7 @@ export const recreateDb = ({
80
88
  migrationsReport = { migrations: [] }
81
89
 
82
90
  const newDbData = yield* Effect.tryAll(() => migrationOptions.migrate(oldDbData)).pipe(
83
- UnexpectedError.mapToUnexpectedError,
91
+ UnknownError.mapToUnknownError,
84
92
  )
85
93
 
86
94
  tmpDb.import(newDbData)
@@ -1,9 +1,23 @@
1
1
  import type { WebChannel } from '@livestore/utils/effect'
2
2
  import { Schema } from '@livestore/utils/effect'
3
3
 
4
- import { IntentionalShutdownCause, SyncError, UnexpectedError } from '../index.ts'
4
+ import {
5
+ IntentionalShutdownCause,
6
+ InvalidPullError,
7
+ InvalidPushError,
8
+ IsOfflineError,
9
+ MaterializeError,
10
+ UnknownError,
11
+ } from '../index.ts'
5
12
 
6
- export class All extends Schema.Union(IntentionalShutdownCause, UnexpectedError, SyncError) {}
13
+ export class All extends Schema.Union(
14
+ IntentionalShutdownCause,
15
+ UnknownError,
16
+ IsOfflineError,
17
+ InvalidPushError,
18
+ InvalidPullError,
19
+ MaterializeError,
20
+ ) {}
7
21
 
8
22
  /**
9
23
  * Used internally by an adapter to shutdown gracefully.