@livestore/common 0.4.0-dev.9 → 0.5.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (580) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +27 -12
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
  5. package/dist/MaterializationJournal.d.ts +44 -0
  6. package/dist/MaterializationJournal.d.ts.map +1 -0
  7. package/dist/MaterializationJournal.js +112 -0
  8. package/dist/MaterializationJournal.js.map +1 -0
  9. package/dist/StateHead.d.ts +26 -0
  10. package/dist/StateHead.d.ts.map +1 -0
  11. package/dist/StateHead.js +50 -0
  12. package/dist/StateHead.js.map +1 -0
  13. package/dist/WorkerTransportError.d.ts +11 -0
  14. package/dist/WorkerTransportError.d.ts.map +1 -0
  15. package/dist/WorkerTransportError.js +11 -0
  16. package/dist/WorkerTransportError.js.map +1 -0
  17. package/dist/__tests__/fixture.d.ts +1 -1
  18. package/dist/__tests__/fixture.d.ts.map +1 -1
  19. package/dist/__tests__/fixture.js +3 -3
  20. package/dist/__tests__/fixture.js.map +1 -1
  21. package/dist/adapter-types.d.ts +59 -57
  22. package/dist/adapter-types.d.ts.map +1 -1
  23. package/dist/adapter-types.js +31 -22
  24. package/dist/adapter-types.js.map +1 -1
  25. package/dist/bounded-collections.d.ts.map +1 -1
  26. package/dist/bounded-collections.js +6 -4
  27. package/dist/bounded-collections.js.map +1 -1
  28. package/dist/debug-info.d.ts +56 -56
  29. package/dist/debug-info.d.ts.map +1 -1
  30. package/dist/debug-info.js +46 -32
  31. package/dist/debug-info.js.map +1 -1
  32. package/dist/defs.d.ts +9 -9
  33. package/dist/defs.js +2 -2
  34. package/dist/devtools/devtools-compatibility.test.d.ts +2 -0
  35. package/dist/devtools/devtools-compatibility.test.d.ts.map +1 -0
  36. package/dist/devtools/devtools-compatibility.test.js +16 -0
  37. package/dist/devtools/devtools-compatibility.test.js.map +1 -0
  38. package/dist/devtools/devtools-messages-client-session.d.ts +531 -312
  39. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  40. package/dist/devtools/devtools-messages-client-session.js +86 -67
  41. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  42. package/dist/devtools/devtools-messages-common.d.ts +32 -35
  43. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  44. package/dist/devtools/devtools-messages-common.js +12 -14
  45. package/dist/devtools/devtools-messages-common.js.map +1 -1
  46. package/dist/devtools/devtools-messages-leader.d.ts +417 -320
  47. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  48. package/dist/devtools/devtools-messages-leader.js +117 -87
  49. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  50. package/dist/devtools/devtools-sessioninfo.d.ts +28 -17
  51. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  52. package/dist/devtools/devtools-sessioninfo.js +12 -6
  53. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  54. package/dist/devtools/mod.d.ts +17 -7
  55. package/dist/devtools/mod.d.ts.map +1 -1
  56. package/dist/devtools/mod.js +19 -8
  57. package/dist/devtools/mod.js.map +1 -1
  58. package/dist/errors.d.ts +52 -46
  59. package/dist/errors.d.ts.map +1 -1
  60. package/dist/errors.js +31 -21
  61. package/dist/errors.js.map +1 -1
  62. package/dist/index.d.ts +7 -1
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +7 -1
  65. package/dist/index.js.map +1 -1
  66. package/dist/leader-thread/LeaderSyncProcessor.d.ts +116 -21
  67. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  68. package/dist/leader-thread/LeaderSyncProcessor.js +596 -470
  69. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  70. package/dist/leader-thread/RejectedPushError.d.ts +138 -0
  71. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
  72. package/dist/leader-thread/RejectedPushError.js +97 -0
  73. package/dist/leader-thread/RejectedPushError.js.map +1 -0
  74. package/dist/leader-thread/connection.d.ts +1 -0
  75. package/dist/leader-thread/connection.d.ts.map +1 -1
  76. package/dist/leader-thread/connection.js +10 -9
  77. package/dist/leader-thread/connection.js.map +1 -1
  78. package/dist/leader-thread/eventlog.d.ts +20 -15
  79. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  80. package/dist/leader-thread/eventlog.js +80 -20
  81. package/dist/leader-thread/eventlog.js.map +1 -1
  82. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
  83. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  84. package/dist/leader-thread/leader-worker-devtools.js +110 -62
  85. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  86. package/dist/leader-thread/make-leader-thread-layer.d.ts +19 -7
  87. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  88. package/dist/leader-thread/make-leader-thread-layer.js +67 -45
  89. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  90. package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
  91. package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
  92. package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
  93. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
  94. package/dist/leader-thread/materialize-event.d.ts +3 -2
  95. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  96. package/dist/leader-thread/materialize-event.js +32 -9
  97. package/dist/leader-thread/materialize-event.js.map +1 -1
  98. package/dist/leader-thread/mod.d.ts +1 -0
  99. package/dist/leader-thread/mod.d.ts.map +1 -1
  100. package/dist/leader-thread/mod.js +1 -0
  101. package/dist/leader-thread/mod.js.map +1 -1
  102. package/dist/leader-thread/recreate-db.d.ts +2 -2
  103. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  104. package/dist/leader-thread/recreate-db.js +19 -40
  105. package/dist/leader-thread/recreate-db.js.map +1 -1
  106. package/dist/leader-thread/shutdown-channel.d.ts +3 -7
  107. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  108. package/dist/leader-thread/shutdown-channel.js +2 -3
  109. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  110. package/dist/leader-thread/stream-events.d.ts +53 -0
  111. package/dist/leader-thread/stream-events.d.ts.map +1 -0
  112. package/dist/leader-thread/stream-events.js +164 -0
  113. package/dist/leader-thread/stream-events.js.map +1 -0
  114. package/dist/leader-thread/types.d.ts +92 -51
  115. package/dist/leader-thread/types.d.ts.map +1 -1
  116. package/dist/leader-thread/types.js +17 -4
  117. package/dist/leader-thread/types.js.map +1 -1
  118. package/dist/logging.d.ts +15 -0
  119. package/dist/logging.d.ts.map +1 -0
  120. package/dist/logging.js +2 -0
  121. package/dist/logging.js.map +1 -0
  122. package/dist/make-client-session.d.ts +6 -5
  123. package/dist/make-client-session.d.ts.map +1 -1
  124. package/dist/make-client-session.js +10 -7
  125. package/dist/make-client-session.js.map +1 -1
  126. package/dist/materializer-helper.d.ts +6 -7
  127. package/dist/materializer-helper.d.ts.map +1 -1
  128. package/dist/materializer-helper.js +22 -40
  129. package/dist/materializer-helper.js.map +1 -1
  130. package/dist/otel.d.ts +4 -4
  131. package/dist/otel.d.ts.map +1 -1
  132. package/dist/otel.js +8 -8
  133. package/dist/otel.js.map +1 -1
  134. package/dist/rematerialize-from-eventlog.d.ts +3 -3
  135. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  136. package/dist/rematerialize-from-eventlog.js +52 -39
  137. package/dist/rematerialize-from-eventlog.js.map +1 -1
  138. package/dist/schema/EventDef/define.d.ts +161 -0
  139. package/dist/schema/EventDef/define.d.ts.map +1 -0
  140. package/dist/schema/EventDef/define.js +140 -0
  141. package/dist/schema/EventDef/define.js.map +1 -0
  142. package/dist/schema/EventDef/define.test.d.ts +2 -0
  143. package/dist/schema/EventDef/define.test.d.ts.map +1 -0
  144. package/dist/schema/EventDef/define.test.js +23 -0
  145. package/dist/schema/EventDef/define.test.js.map +1 -0
  146. package/dist/schema/EventDef/deprecated.d.ts +94 -0
  147. package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
  148. package/dist/schema/EventDef/deprecated.js +143 -0
  149. package/dist/schema/EventDef/deprecated.js.map +1 -0
  150. package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
  151. package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
  152. package/dist/schema/EventDef/deprecated.test.js +95 -0
  153. package/dist/schema/EventDef/deprecated.test.js.map +1 -0
  154. package/dist/schema/EventDef/event-def.d.ts +110 -0
  155. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  156. package/dist/schema/EventDef/event-def.js +2 -0
  157. package/dist/schema/EventDef/event-def.js.map +1 -0
  158. package/dist/schema/EventDef/facts.d.ts +118 -0
  159. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  160. package/dist/schema/EventDef/facts.js +53 -0
  161. package/dist/schema/EventDef/facts.js.map +1 -0
  162. package/dist/schema/EventDef/materializer.d.ts +155 -0
  163. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  164. package/dist/schema/EventDef/materializer.js +83 -0
  165. package/dist/schema/EventDef/materializer.js.map +1 -0
  166. package/dist/schema/EventDef/mod.d.ts +6 -0
  167. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  168. package/dist/schema/EventDef/mod.js +6 -0
  169. package/dist/schema/EventDef/mod.js.map +1 -0
  170. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  171. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  172. package/dist/schema/EventSequenceNumber/client.js +192 -0
  173. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  174. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  175. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  176. package/dist/schema/EventSequenceNumber/global.js +14 -0
  177. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  178. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  179. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  180. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  181. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  182. package/dist/schema/EventSequenceNumber.test.js +44 -44
  183. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  184. package/dist/schema/LiveStoreEvent/client.d.ts +168 -0
  185. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  186. package/dist/schema/LiveStoreEvent/client.js +179 -0
  187. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  188. package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
  189. package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
  190. package/dist/schema/LiveStoreEvent/client.test.js +120 -0
  191. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
  192. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  193. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  194. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  195. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  196. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  197. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  198. package/dist/schema/LiveStoreEvent/global.js +31 -0
  199. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  200. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  201. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  202. package/dist/schema/LiveStoreEvent/input.js +26 -0
  203. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  204. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  205. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  206. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  207. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  208. package/dist/schema/events.d.ts +1 -1
  209. package/dist/schema/events.d.ts.map +1 -1
  210. package/dist/schema/events.js +1 -1
  211. package/dist/schema/events.js.map +1 -1
  212. package/dist/schema/mod.d.ts +7 -4
  213. package/dist/schema/mod.d.ts.map +1 -1
  214. package/dist/schema/mod.js +6 -4
  215. package/dist/schema/mod.js.map +1 -1
  216. package/dist/schema/schema.d.ts +16 -1
  217. package/dist/schema/schema.d.ts.map +1 -1
  218. package/dist/schema/schema.js +34 -5
  219. package/dist/schema/schema.js.map +1 -1
  220. package/dist/schema/state/sqlite/client-document-def.d.ts +14 -18
  221. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  222. package/dist/schema/state/sqlite/client-document-def.js +54 -30
  223. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  224. package/dist/schema/state/sqlite/client-document-def.test.js +146 -6
  225. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  226. package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
  227. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  228. package/dist/schema/state/sqlite/column-annotations.js +13 -15
  229. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  230. package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
  231. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  232. package/dist/schema/state/sqlite/column-def.d.ts +1 -1
  233. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  234. package/dist/schema/state/sqlite/column-def.js +132 -57
  235. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  236. package/dist/schema/state/sqlite/column-def.test.js +155 -70
  237. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  238. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  239. package/dist/schema/state/sqlite/column-spec.js +30 -12
  240. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  241. package/dist/schema/state/sqlite/column-spec.test.js +26 -17
  242. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  243. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -2
  244. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  245. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +15 -6
  246. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  247. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +25 -19
  248. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  249. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +22 -16
  250. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  251. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +28 -17
  252. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  253. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +14 -12
  254. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  255. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +6 -4
  256. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  257. package/dist/schema/state/sqlite/mod.d.ts +3 -5
  258. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  259. package/dist/schema/state/sqlite/mod.js +6 -8
  260. package/dist/schema/state/sqlite/mod.js.map +1 -1
  261. package/dist/schema/state/sqlite/persistence.d.ts +11 -0
  262. package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
  263. package/dist/schema/state/sqlite/persistence.js +10 -0
  264. package/dist/schema/state/sqlite/persistence.js.map +1 -0
  265. package/dist/schema/state/sqlite/query-builder/api.d.ts +58 -29
  266. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  267. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  268. package/dist/schema/state/sqlite/query-builder/astToSql.js +105 -24
  269. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  270. package/dist/schema/state/sqlite/query-builder/impl.d.ts +4 -2
  271. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  272. package/dist/schema/state/sqlite/query-builder/impl.js +42 -27
  273. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  274. package/dist/schema/state/sqlite/query-builder/impl.test.js +402 -498
  275. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  276. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  277. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  278. package/dist/schema/state/sqlite/schema-helpers.js +24 -14
  279. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  280. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  281. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  282. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  283. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  284. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +515 -0
  285. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
  286. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
  287. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
  288. package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
  289. package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
  290. package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
  291. package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
  292. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +678 -0
  293. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
  294. package/dist/schema/state/sqlite/system-tables/state-tables.js +87 -0
  295. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
  296. package/dist/schema/state/sqlite/table-def.d.ts +19 -20
  297. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  298. package/dist/schema/state/sqlite/table-def.js +54 -4
  299. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  300. package/dist/schema/state/sqlite/table-def.test.js +226 -20
  301. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  302. package/dist/schema/unknown-events.d.ts +47 -0
  303. package/dist/schema/unknown-events.d.ts.map +1 -0
  304. package/dist/schema/unknown-events.js +70 -0
  305. package/dist/schema/unknown-events.js.map +1 -0
  306. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
  307. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
  308. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
  309. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
  310. package/dist/schema-management/common.js +2 -2
  311. package/dist/schema-management/common.js.map +1 -1
  312. package/dist/schema-management/migrations.d.ts +32 -2
  313. package/dist/schema-management/migrations.d.ts.map +1 -1
  314. package/dist/schema-management/migrations.js +38 -6
  315. package/dist/schema-management/migrations.js.map +1 -1
  316. package/dist/schema-management/validate-schema.d.ts +3 -3
  317. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  318. package/dist/schema-management/validate-schema.js +2 -2
  319. package/dist/schema-management/validate-schema.js.map +1 -1
  320. package/dist/session-id-symbol.d.ts +29 -0
  321. package/dist/session-id-symbol.d.ts.map +1 -0
  322. package/dist/session-id-symbol.js +44 -0
  323. package/dist/session-id-symbol.js.map +1 -0
  324. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  325. package/dist/sql-queries/sql-queries.js +26 -16
  326. package/dist/sql-queries/sql-queries.js.map +1 -1
  327. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  328. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  329. package/dist/sql-queries/types.d.ts +6 -7
  330. package/dist/sql-queries/types.d.ts.map +1 -1
  331. package/dist/sql-queries/types.js.map +1 -1
  332. package/dist/sqlite-db-helper.d.ts +21 -1
  333. package/dist/sqlite-db-helper.d.ts.map +1 -1
  334. package/dist/sqlite-db-helper.js +40 -5
  335. package/dist/sqlite-db-helper.js.map +1 -1
  336. package/dist/sqlite-types.d.ts +8 -11
  337. package/dist/sqlite-types.d.ts.map +1 -1
  338. package/dist/sqlite-types.js +3 -3
  339. package/dist/sqlite-types.js.map +1 -1
  340. package/dist/sync/ClientSessionSyncProcessor.d.ts +47 -25
  341. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  342. package/dist/sync/ClientSessionSyncProcessor.js +269 -154
  343. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  344. package/dist/sync/errors.d.ts +12 -51
  345. package/dist/sync/errors.d.ts.map +1 -1
  346. package/dist/sync/errors.js +7 -24
  347. package/dist/sync/errors.js.map +1 -1
  348. package/dist/sync/index.d.ts +2 -0
  349. package/dist/sync/index.d.ts.map +1 -1
  350. package/dist/sync/index.js +2 -0
  351. package/dist/sync/index.js.map +1 -1
  352. package/dist/sync/mock-sync-backend.d.ts +11 -10
  353. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  354. package/dist/sync/mock-sync-backend.js +97 -74
  355. package/dist/sync/mock-sync-backend.js.map +1 -1
  356. package/dist/sync/mock-sync-backend.test.d.ts +2 -0
  357. package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
  358. package/dist/sync/mock-sync-backend.test.js +49 -0
  359. package/dist/sync/mock-sync-backend.test.js.map +1 -0
  360. package/dist/sync/next/compact-events.d.ts.map +1 -1
  361. package/dist/sync/next/compact-events.js +11 -12
  362. package/dist/sync/next/compact-events.js.map +1 -1
  363. package/dist/sync/next/facts.d.ts +5 -5
  364. package/dist/sync/next/facts.d.ts.map +1 -1
  365. package/dist/sync/next/facts.js +7 -8
  366. package/dist/sync/next/facts.js.map +1 -1
  367. package/dist/sync/next/history-dag-common.d.ts +58 -15
  368. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  369. package/dist/sync/next/history-dag-common.js +219 -9
  370. package/dist/sync/next/history-dag-common.js.map +1 -1
  371. package/dist/sync/next/history-dag.d.ts.map +1 -1
  372. package/dist/sync/next/history-dag.js +12 -11
  373. package/dist/sync/next/history-dag.js.map +1 -1
  374. package/dist/sync/next/rebase-events.d.ts +5 -5
  375. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  376. package/dist/sync/next/rebase-events.js +6 -6
  377. package/dist/sync/next/rebase-events.js.map +1 -1
  378. package/dist/sync/next/test/compact-events.calculator.test.js +4 -4
  379. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  380. package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
  381. package/dist/sync/next/test/compact-events.test.js +2 -2
  382. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  383. package/dist/sync/next/test/event-fixtures.d.ts +9 -9
  384. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  385. package/dist/sync/next/test/event-fixtures.js +12 -12
  386. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  387. package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
  388. package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
  389. package/dist/sync/next/test/history-dag-common.test.js +73 -0
  390. package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
  391. package/dist/sync/sync-backend-kv.d.ts +3 -3
  392. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  393. package/dist/sync/sync-backend-kv.js +6 -4
  394. package/dist/sync/sync-backend-kv.js.map +1 -1
  395. package/dist/sync/sync-backend.d.ts +41 -21
  396. package/dist/sync/sync-backend.d.ts.map +1 -1
  397. package/dist/sync/sync-backend.js +45 -4
  398. package/dist/sync/sync-backend.js.map +1 -1
  399. package/dist/sync/sync.d.ts +23 -2
  400. package/dist/sync/sync.d.ts.map +1 -1
  401. package/dist/sync/syncstate.d.ts +115 -191
  402. package/dist/sync/syncstate.d.ts.map +1 -1
  403. package/dist/sync/syncstate.js +108 -129
  404. package/dist/sync/syncstate.js.map +1 -1
  405. package/dist/sync/syncstate.test.js +289 -161
  406. package/dist/sync/syncstate.test.js.map +1 -1
  407. package/dist/sync/transport-chunking.d.ts +35 -0
  408. package/dist/sync/transport-chunking.d.ts.map +1 -0
  409. package/dist/sync/transport-chunking.js +47 -0
  410. package/dist/sync/transport-chunking.js.map +1 -0
  411. package/dist/sync/validate-push-payload.d.ts +2 -2
  412. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  413. package/dist/sync/validate-push-payload.js +4 -6
  414. package/dist/sync/validate-push-payload.js.map +1 -1
  415. package/dist/testing/event-factory.d.ts +3 -3
  416. package/dist/testing/event-factory.d.ts.map +1 -1
  417. package/dist/testing/event-factory.js +5 -7
  418. package/dist/testing/event-factory.js.map +1 -1
  419. package/dist/util.d.ts +11 -4
  420. package/dist/util.d.ts.map +1 -1
  421. package/dist/util.js +21 -4
  422. package/dist/util.js.map +1 -1
  423. package/dist/version.d.ts +24 -5
  424. package/dist/version.d.ts.map +1 -1
  425. package/dist/version.js +25 -8
  426. package/dist/version.js.map +1 -1
  427. package/package.json +50 -16
  428. package/src/ClientSessionLeaderThreadProxy.ts +27 -12
  429. package/src/MaterializationJournal.ts +184 -0
  430. package/src/StateHead.ts +80 -0
  431. package/src/WorkerTransportError.ts +12 -0
  432. package/src/__tests__/fixture.ts +3 -3
  433. package/src/adapter-types.ts +62 -56
  434. package/src/bounded-collections.ts +6 -5
  435. package/src/debug-info.ts +54 -43
  436. package/src/defs.ts +2 -2
  437. package/src/devtools/devtools-compatibility.test.ts +19 -0
  438. package/src/devtools/devtools-messages-client-session.ts +72 -63
  439. package/src/devtools/devtools-messages-common.ts +18 -22
  440. package/src/devtools/devtools-messages-leader.ts +89 -68
  441. package/src/devtools/devtools-sessioninfo.ts +17 -12
  442. package/src/devtools/mod.ts +15 -7
  443. package/src/errors.ts +58 -38
  444. package/src/index.ts +11 -1
  445. package/src/leader-thread/LeaderSyncProcessor.ts +927 -674
  446. package/src/leader-thread/RejectedPushError.ts +119 -0
  447. package/src/leader-thread/connection.ts +13 -9
  448. package/src/leader-thread/eventlog.ts +114 -41
  449. package/src/leader-thread/leader-worker-devtools.ts +223 -124
  450. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  451. package/src/leader-thread/make-leader-thread-layer.ts +170 -82
  452. package/src/leader-thread/materialize-event.ts +51 -16
  453. package/src/leader-thread/mod.ts +1 -0
  454. package/src/leader-thread/recreate-db.ts +26 -61
  455. package/src/leader-thread/shutdown-channel.ts +3 -18
  456. package/src/leader-thread/stream-events.ts +209 -0
  457. package/src/leader-thread/types.ts +77 -65
  458. package/src/logging.ts +15 -0
  459. package/src/make-client-session.ts +16 -10
  460. package/src/materializer-helper.ts +31 -49
  461. package/src/otel.ts +15 -13
  462. package/src/rematerialize-from-eventlog.ts +106 -93
  463. package/src/schema/EventDef/define.test.ts +28 -0
  464. package/src/schema/EventDef/define.ts +218 -0
  465. package/src/schema/EventDef/deprecated.test.ts +122 -0
  466. package/src/schema/EventDef/deprecated.ts +172 -0
  467. package/src/schema/EventDef/event-def.ts +123 -0
  468. package/src/schema/EventDef/facts.ts +135 -0
  469. package/src/schema/EventDef/materializer.ts +172 -0
  470. package/src/schema/EventDef/mod.ts +5 -0
  471. package/src/schema/EventSequenceNumber/client.ts +256 -0
  472. package/src/schema/EventSequenceNumber/global.ts +19 -0
  473. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  474. package/src/schema/EventSequenceNumber.test.ts +72 -53
  475. package/src/schema/LiveStoreEvent/client.test.ts +142 -0
  476. package/src/schema/LiveStoreEvent/client.ts +236 -0
  477. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  478. package/src/schema/LiveStoreEvent/global.ts +45 -0
  479. package/src/schema/LiveStoreEvent/input.ts +63 -0
  480. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  481. package/src/schema/events.ts +1 -1
  482. package/src/schema/mod.ts +7 -4
  483. package/src/schema/schema.ts +48 -6
  484. package/src/schema/state/sqlite/client-document-def.test.ts +172 -14
  485. package/src/schema/state/sqlite/client-document-def.ts +126 -98
  486. package/src/schema/state/sqlite/column-annotations.test.ts +27 -45
  487. package/src/schema/state/sqlite/column-annotations.ts +27 -30
  488. package/src/schema/state/sqlite/column-def.test.ts +186 -77
  489. package/src/schema/state/sqlite/column-def.ts +169 -62
  490. package/src/schema/state/sqlite/column-spec.test.ts +34 -19
  491. package/src/schema/state/sqlite/column-spec.ts +38 -11
  492. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +17 -7
  493. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
  494. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +37 -17
  495. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +65 -45
  496. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +48 -40
  497. package/src/schema/state/sqlite/mod.ts +9 -12
  498. package/src/schema/state/sqlite/persistence.ts +11 -0
  499. package/src/schema/state/sqlite/query-builder/api.ts +61 -23
  500. package/src/schema/state/sqlite/query-builder/astToSql.ts +117 -23
  501. package/src/schema/state/sqlite/query-builder/impl.test.ts +489 -551
  502. package/src/schema/state/sqlite/query-builder/impl.ts +43 -26
  503. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  504. package/src/schema/state/sqlite/schema-helpers.ts +30 -22
  505. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  506. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  507. package/src/schema/state/sqlite/system-tables/state-tables.ts +109 -0
  508. package/src/schema/state/sqlite/table-def.test.ts +295 -46
  509. package/src/schema/state/sqlite/table-def.ts +109 -64
  510. package/src/schema/unknown-events.ts +132 -0
  511. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
  512. package/src/schema-management/common.ts +2 -2
  513. package/src/schema-management/migrations.ts +42 -9
  514. package/src/schema-management/validate-schema.ts +3 -3
  515. package/src/session-id-symbol.ts +59 -0
  516. package/src/sql-queries/sql-queries.ts +26 -18
  517. package/src/sql-queries/sql-query-builder.ts +1 -0
  518. package/src/sql-queries/types.ts +6 -7
  519. package/src/sqlite-db-helper.ts +67 -5
  520. package/src/sqlite-types.ts +9 -11
  521. package/src/sync/ClientSessionSyncProcessor.ts +388 -194
  522. package/src/sync/errors.ts +18 -28
  523. package/src/sync/index.ts +2 -0
  524. package/src/sync/mock-sync-backend.test.ts +78 -0
  525. package/src/sync/mock-sync-backend.ts +196 -108
  526. package/src/sync/next/compact-events.ts +10 -11
  527. package/src/sync/next/facts.ts +13 -14
  528. package/src/sync/next/history-dag-common.ts +306 -26
  529. package/src/sync/next/history-dag.ts +20 -13
  530. package/src/sync/next/rebase-events.ts +12 -12
  531. package/src/sync/next/test/compact-events.calculator.test.ts +5 -4
  532. package/src/sync/next/test/compact-events.test.ts +4 -3
  533. package/src/sync/next/test/event-fixtures.ts +14 -14
  534. package/src/sync/next/test/history-dag-common.test.ts +87 -0
  535. package/src/sync/sync-backend-kv.ts +7 -4
  536. package/src/sync/sync-backend.ts +75 -26
  537. package/src/sync/sync.ts +24 -2
  538. package/src/sync/syncstate.test.ts +657 -442
  539. package/src/sync/syncstate.ts +175 -160
  540. package/src/sync/transport-chunking.ts +85 -0
  541. package/src/sync/validate-push-payload.ts +6 -8
  542. package/src/testing/event-factory.ts +10 -12
  543. package/src/util.ts +20 -11
  544. package/src/version.ts +32 -8
  545. package/dist/schema/EventDef.d.ts +0 -126
  546. package/dist/schema/EventDef.d.ts.map +0 -1
  547. package/dist/schema/EventDef.js +0 -46
  548. package/dist/schema/EventDef.js.map +0 -1
  549. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  550. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  551. package/dist/schema/EventSequenceNumber.js +0 -139
  552. package/dist/schema/EventSequenceNumber.js.map +0 -1
  553. package/dist/schema/LiveStoreEvent.d.ts +0 -306
  554. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  555. package/dist/schema/LiveStoreEvent.js +0 -147
  556. package/dist/schema/LiveStoreEvent.js.map +0 -1
  557. package/dist/schema/state/sqlite/system-tables.d.ts +0 -976
  558. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  559. package/dist/schema/state/sqlite/system-tables.js +0 -81
  560. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  561. package/dist/sql-queries/misc.d.ts +0 -2
  562. package/dist/sql-queries/misc.d.ts.map +0 -1
  563. package/dist/sql-queries/misc.js +0 -2
  564. package/dist/sql-queries/misc.js.map +0 -1
  565. package/dist/sync/next/graphology.d.ts +0 -8
  566. package/dist/sync/next/graphology.d.ts.map +0 -1
  567. package/dist/sync/next/graphology.js +0 -30
  568. package/dist/sync/next/graphology.js.map +0 -1
  569. package/dist/sync/next/graphology_.d.ts +0 -3
  570. package/dist/sync/next/graphology_.d.ts.map +0 -1
  571. package/dist/sync/next/graphology_.js +0 -3
  572. package/dist/sync/next/graphology_.js.map +0 -1
  573. package/src/schema/EventDef.ts +0 -222
  574. package/src/schema/EventSequenceNumber.ts +0 -199
  575. package/src/schema/LiveStoreEvent.ts +0 -286
  576. package/src/schema/state/sqlite/system-tables.ts +0 -106
  577. package/src/sql-queries/misc.ts +0 -2
  578. package/src/sync/next/ambient.d.ts +0 -3
  579. package/src/sync/next/graphology.ts +0 -41
  580. package/src/sync/next/graphology_.ts +0 -2
@@ -1,33 +1,48 @@
1
- import type { Effect, Stream } from '@livestore/utils/effect'
1
+ import type { Effect, Stream, Subscribable } from '@livestore/utils/effect'
2
2
 
3
+ import type { StorageMode } from './adapter-types.ts'
3
4
  import type { MigrationsReport } from './defs.ts'
4
5
  import type * as Devtools from './devtools/mod.ts'
5
- import type { UnexpectedError } from './errors.ts'
6
- import type * as EventSequenceNumber from './schema/EventSequenceNumber.ts'
6
+ import type { RejectedPushError } from './leader-thread/RejectedPushError.ts'
7
+ import type { StreamEventsOptions } from './leader-thread/types.ts'
8
+ import type * as EventSequenceNumber from './schema/EventSequenceNumber/mod.ts'
7
9
  import type { LiveStoreEvent } from './schema/mod.ts'
8
- import type { LeaderAheadError } from './sync/sync.ts'
10
+ import type { SyncBackend } from './sync/sync.ts'
9
11
  import type { PayloadUpstream, SyncState } from './sync/syncstate.ts'
10
12
 
11
13
  export interface ClientSessionLeaderThreadProxy {
12
14
  events: {
13
15
  pull: (args: {
14
- cursor: EventSequenceNumber.EventSequenceNumber
15
- }) => Stream.Stream<{ payload: typeof PayloadUpstream.Type }, UnexpectedError>
16
+ cursor: EventSequenceNumber.Client.Composite
17
+ }) => Stream.Stream<{ payload: typeof PayloadUpstream.Type }>
16
18
  /** It's important that a client session doesn't call `push` concurrently. */
17
- push(batch: ReadonlyArray<LiveStoreEvent.AnyEncoded>): Effect.Effect<void, UnexpectedError | LeaderAheadError>
19
+ push(batch: ReadonlyArray<LiveStoreEvent.Client.Encoded>): Effect.Effect<void, RejectedPushError>
20
+ /** Stream events with filtering */
21
+ stream(options: StreamEventsOptions): Stream.Stream<LiveStoreEvent.Client.Encoded>
18
22
  }
19
23
  /** The initial state after the leader thread has booted */
20
24
  readonly initialState: {
21
25
  /** The latest event sequence number during boot. Used for the client session to resume syncing. */
22
- readonly leaderHead: EventSequenceNumber.EventSequenceNumber
26
+ readonly leaderHead: EventSequenceNumber.Client.Composite
23
27
  /** The migrations report from the leader thread */
24
28
  readonly migrationsReport: MigrationsReport
29
+ /**
30
+ * Indicates how data is being stored.
31
+ * - `persisted`: Data is persisted to disk (e.g., via OPFS)
32
+ * - `in-memory`: Data is only stored in memory and will be lost on page refresh (e.g., private browsing)
33
+ */
34
+ readonly storageMode: StorageMode
25
35
  }
26
- export: Effect.Effect<Uint8Array<ArrayBuffer>, UnexpectedError>
27
- getEventlogData: Effect.Effect<Uint8Array<ArrayBuffer>, UnexpectedError>
28
- getSyncState: Effect.Effect<SyncState, UnexpectedError>
36
+ export: Effect.Effect<Uint8Array<ArrayBuffer>>
37
+ getEventlogData: Effect.Effect<Uint8Array<ArrayBuffer>>
38
+ syncState: Subscribable.Subscribable<SyncState>
29
39
  /** For debugging purposes it can be useful to manually trigger devtools messages (e.g. to reset the database) */
30
- sendDevtoolsMessage: (message: Devtools.Leader.MessageToApp) => Effect.Effect<void, UnexpectedError>
40
+ sendDevtoolsMessage: (message: Devtools.Leader.MessageToApp) => Effect.Effect<void>
41
+ /**
42
+ * Reactive stream describing the connectivity between the leader and its upstream sync backend.
43
+ * Includes raw connection state, last transition timestamp, and devtools overrides (latch state).
44
+ */
45
+ networkStatus: Subscribable.Subscribable<SyncBackend.NetworkStatus>
31
46
  }
32
47
 
33
48
  export const of = (
@@ -0,0 +1,184 @@
1
+ import { Context, Effect, Layer, Predicate, ReadonlyArray, Schema } from '@livestore/utils/effect'
2
+
3
+ import { SqliteError, type SqliteDb } from './adapter-types.ts'
4
+ import { execSql, execSqlPrepared } from './leader-thread/connection.ts'
5
+ import * as EventSequenceNumber from './schema/EventSequenceNumber/mod.ts'
6
+ import { SystemTables } from './schema/mod.ts'
7
+ import { findManyRows, insertRow } from './sql-queries/index.ts'
8
+ import * as SqliteDbHelper from './sqlite-db-helper.ts'
9
+ import { prepareBindValues, sql } from './util.ts'
10
+
11
+ export const TypeId = '~@livestore/common/MaterializationJournal' as const
12
+ export type TypeId = typeof TypeId
13
+
14
+ export const MaterializationJournalErrorTypeId = '~@livestore/common/MaterializationJournalError' as const
15
+
16
+ export const isMaterializationJournalError = (u: unknown): u is MaterializationJournalError =>
17
+ Predicate.hasProperty(u, MaterializationJournalErrorTypeId)
18
+
19
+ export class MaterializationJournalError extends Schema.TaggedError<MaterializationJournalError>(
20
+ MaterializationJournalErrorTypeId,
21
+ )('MaterializationJournalError', {
22
+ method: Schema.Literals(['record', 'rollback', 'discardUpTo']),
23
+ cause: Schema.Defect(),
24
+ }) {
25
+ readonly [MaterializationJournalErrorTypeId] = MaterializationJournalErrorTypeId
26
+ }
27
+
28
+ export type MaterializationChangeset = { _tag: 'changeset'; data: Uint8Array<ArrayBuffer> } | { _tag: 'no-op' }
29
+
30
+ export type MaterializationRecord = {
31
+ key: EventSequenceNumber.Client.Composite
32
+ changeset: MaterializationChangeset
33
+ }
34
+
35
+ export interface Service {
36
+ readonly [TypeId]: TypeId
37
+ /** Stores a materialization record, replacing any record at the same key. */
38
+ record: (record: MaterializationRecord) => Effect.Effect<void, MaterializationJournalError>
39
+ /** Reverts the keyed materializations in reverse order, then discards their records. */
40
+ rollback: (
41
+ keys: ReadonlyArray<EventSequenceNumber.Client.Composite>,
42
+ ) => Effect.Effect<void, MaterializationJournalError>
43
+ /** Discards records whose key is less than or equal to `key`, ignoring rebase generation. */
44
+ discardUpTo: (key: EventSequenceNumber.Client.Composite) => Effect.Effect<void, MaterializationJournalError>
45
+ }
46
+
47
+ export class MaterializationJournal extends Context.Service<MaterializationJournal, Service>()(
48
+ '@livestore/common/MaterializationJournal',
49
+ ) {}
50
+
51
+ interface Options {
52
+ readonly dbState: SqliteDb
53
+ }
54
+
55
+ export const make = ({ dbState }: Options) => {
56
+ const deleteByKeys = Effect.fnUntraced(function* (keys: ReadonlyArray<EventSequenceNumber.Client.Composite>) {
57
+ // Keep DELETE statements below SQLite's bound-parameter limit.
58
+ const keyChunks = ReadonlyArray.chunksOf(100)(keys)
59
+
60
+ for (const keyChunk of keyChunks) {
61
+ const placeholders = keyChunk.map(() => '(?, ?, ?)').join(', ')
62
+ const bindValues = keyChunk.flatMap((key) => [key.global, key.client, key.rebaseGeneration])
63
+ const statement = sql`DELETE FROM ${SystemTables.MATERIALIZATION_JOURNAL_META_TABLE}
64
+ WHERE (seqNumGlobal, seqNumClient, seqNumRebaseGeneration) IN (${placeholders})`
65
+
66
+ yield* execSqlPrepared(dbState, statement, prepareBindValues(bindValues, statement))
67
+ }
68
+ }, SqliteDbHelper.withSavepoint(dbState))
69
+
70
+ return MaterializationJournal.of({
71
+ [TypeId]: TypeId,
72
+ record: Effect.fnUntraced(
73
+ function* (record: MaterializationRecord) {
74
+ yield* deleteByKeys([record.key])
75
+
76
+ // Generate the parameterized INSERT statement
77
+ const [statement, bindValues] = insertRow({
78
+ tableName: SystemTables.MATERIALIZATION_JOURNAL_META_TABLE,
79
+ columns: SystemTables.materializationJournalMetaTable.sqliteDef.columns,
80
+ values: {
81
+ seqNumGlobal: record.key.global,
82
+ seqNumClient: record.key.client,
83
+ seqNumRebaseGeneration: record.key.rebaseGeneration,
84
+ changeset: record.changeset._tag === 'changeset' ? record.changeset.data : null,
85
+ // Legacy processors still expose this column for development diagnostics.
86
+ debug: null,
87
+ },
88
+ })
89
+
90
+ yield* execSqlPrepared(dbState, statement, prepareBindValues(bindValues, statement))
91
+ },
92
+ SqliteDbHelper.withSavepoint(dbState),
93
+ Effect.mapError((cause) => new MaterializationJournalError({ method: 'record', cause })),
94
+ ),
95
+ rollback: Effect.fnUntraced(
96
+ function* (keys: ReadonlyArray<EventSequenceNumber.Client.Composite>) {
97
+ const sortedKeys = keys.toSorted((a, b) => EventSequenceNumber.Client.compare(b, a))
98
+ const rollbackRecords = yield* Effect.forEach(
99
+ sortedKeys,
100
+ Effect.fnUntraced(function* (key) {
101
+ const [statement, bindValues] = findManyRows({
102
+ tableName: SystemTables.MATERIALIZATION_JOURNAL_META_TABLE,
103
+ columns: SystemTables.materializationJournalMetaTable.sqliteDef.columns,
104
+ where: {
105
+ seqNumGlobal: key.global,
106
+ seqNumClient: key.client,
107
+ seqNumRebaseGeneration: key.rebaseGeneration,
108
+ },
109
+ limit: 1,
110
+ })
111
+ const preparedBindValues = prepareBindValues(bindValues, statement)
112
+ const row = yield* Effect.try({
113
+ try: () => dbState.select<SystemTables.MaterializationJournalMetaRow>(statement, preparedBindValues)[0],
114
+ catch: (cause) => new SqliteError({ cause, query: { sql: statement, bindValues: preparedBindValues } }),
115
+ })
116
+
117
+ if (row === undefined) {
118
+ return yield* new MaterializationJournalError({
119
+ method: 'rollback',
120
+ cause: new Error(
121
+ `Missing materialization journal record for ${EventSequenceNumber.Client.toString(key)}`,
122
+ ),
123
+ })
124
+ }
125
+
126
+ return {
127
+ key,
128
+ changeset:
129
+ row.changeset === null
130
+ ? { _tag: 'no-op' as const }
131
+ : { _tag: 'changeset' as const, data: row.changeset },
132
+ }
133
+ }),
134
+ )
135
+
136
+ for (const record of rollbackRecords) {
137
+ if (record.changeset._tag === 'changeset') {
138
+ const data = record.changeset.data
139
+ yield* Effect.try({
140
+ try: () => dbState.makeChangeset(data).invert().apply(),
141
+ catch: (cause) => new SqliteError({ cause }),
142
+ })
143
+ }
144
+ }
145
+
146
+ yield* deleteByKeys(sortedKeys)
147
+ },
148
+ SqliteDbHelper.withSavepoint(dbState),
149
+ Effect.mapError((cause) =>
150
+ isMaterializationJournalError(cause) === true
151
+ ? cause
152
+ : new MaterializationJournalError({ method: 'rollback', cause }),
153
+ ),
154
+ ),
155
+ discardUpTo: Effect.fnUntraced(
156
+ function* (key: EventSequenceNumber.Client.Composite) {
157
+ yield* execSql(
158
+ dbState,
159
+ sql`DELETE FROM ${SystemTables.MATERIALIZATION_JOURNAL_META_TABLE}
160
+ WHERE seqNumGlobal < ${key.global}
161
+ OR (
162
+ seqNumGlobal = ${key.global}
163
+ AND seqNumClient <= ${key.client}
164
+ )`,
165
+ {},
166
+ )
167
+ },
168
+ SqliteDbHelper.withSavepoint(dbState),
169
+ Effect.mapError((cause) => new MaterializationJournalError({ method: 'discardUpTo', cause })),
170
+ ),
171
+ })
172
+ }
173
+
174
+ export const layer = (options: Options) => Layer.succeed(MaterializationJournal, make(options))
175
+
176
+ export const layerTest = Layer.succeed(
177
+ MaterializationJournal,
178
+ MaterializationJournal.of({
179
+ [TypeId]: TypeId,
180
+ record: () => Effect.void,
181
+ rollback: () => Effect.void,
182
+ discardUpTo: () => Effect.void,
183
+ }),
184
+ )
@@ -0,0 +1,80 @@
1
+ import { Context, Effect, Layer } from '@livestore/utils/effect'
2
+
3
+ import type { SqliteDb, SqliteError } from './adapter-types.ts'
4
+ import { execSql, selectSql } from './leader-thread/connection.ts'
5
+ import * as EventSequenceNumber from './schema/EventSequenceNumber/mod.ts'
6
+ import { SystemTables } from './schema/mod.ts'
7
+ import { findManyRows, insertRow } from './sql-queries/index.ts'
8
+
9
+ export const TypeId = '~@livestore/common/StateHead' as const
10
+ export type TypeId = typeof TypeId
11
+
12
+ const STATE_HEAD_ROW_ID = 1
13
+
14
+ /**
15
+ * Persists and reads the latest event sequence number reflected by the state database.
16
+ */
17
+ export interface Service {
18
+ readonly [TypeId]: TypeId
19
+ /** Persists the latest event sequence number reflected by the state database. */
20
+ set: (head: EventSequenceNumber.Client.Composite) => Effect.Effect<void, SqliteError>
21
+ /** Returns the persisted head, or the root when the current-schema table has no row. */
22
+ get: Effect.Effect<EventSequenceNumber.Client.Composite, SqliteError>
23
+ }
24
+
25
+ export class StateHead extends Context.Service<StateHead, Service>()('@livestore/common/StateHead') {}
26
+
27
+ interface Options {
28
+ readonly dbState: SqliteDb
29
+ }
30
+
31
+ export const make = ({ dbState }: Options) => {
32
+ return StateHead.of({
33
+ [TypeId]: TypeId,
34
+ set: (head) => {
35
+ const [statement, bindValues] = insertRow({
36
+ tableName: SystemTables.STATE_HEAD_META_TABLE,
37
+ columns: SystemTables.stateHeadMetaTable.sqliteDef.columns,
38
+ values: {
39
+ id: STATE_HEAD_ROW_ID,
40
+ seqNumGlobal: head.global,
41
+ seqNumClient: head.client,
42
+ seqNumRebaseGeneration: head.rebaseGeneration,
43
+ },
44
+ options: { orReplace: true },
45
+ })
46
+
47
+ return execSql(dbState, statement, bindValues)
48
+ },
49
+ get: Effect.suspend(() => {
50
+ const [statement, bindValues] = findManyRows({
51
+ tableName: SystemTables.STATE_HEAD_META_TABLE,
52
+ columns: SystemTables.stateHeadMetaTable.sqliteDef.columns,
53
+ where: { id: STATE_HEAD_ROW_ID },
54
+ limit: 1,
55
+ })
56
+ return selectSql<SystemTables.StateHeadMetaRow>(dbState, statement, bindValues).pipe(
57
+ Effect.map(([row]) =>
58
+ row === undefined
59
+ ? EventSequenceNumber.Client.ROOT
60
+ : EventSequenceNumber.Client.Composite.make({
61
+ global: row.seqNumGlobal,
62
+ client: row.seqNumClient,
63
+ rebaseGeneration: row.seqNumRebaseGeneration,
64
+ }),
65
+ ),
66
+ )
67
+ }),
68
+ })
69
+ }
70
+
71
+ export const layer = (options: Options) => Layer.succeed(StateHead, make(options))
72
+
73
+ export const layerTest = Layer.succeed(
74
+ StateHead,
75
+ StateHead.of({
76
+ [TypeId]: TypeId,
77
+ set: () => Effect.void,
78
+ get: Effect.succeed(EventSequenceNumber.Client.ROOT),
79
+ }),
80
+ )
@@ -0,0 +1,12 @@
1
+ import { Schema, WorkerError } from '@livestore/utils/effect'
2
+
3
+ /**
4
+ * Type guard that identifies infrastructure errors from the Effect Worker transport layer.
5
+ *
6
+ * @remarks
7
+ *
8
+ * These errors ({@link WorkerError.WorkerError}, {@link Schema.SchemaError}) represent communication failures between
9
+ * threads/processes — not application-level failures.
10
+ */
11
+ export const isWorkerTransportError = (e: unknown): e is WorkerError.WorkerError | Schema.SchemaError =>
12
+ Schema.isSchemaError(e) || WorkerError.isWorkerError(e)
@@ -1,7 +1,7 @@
1
1
  import { Schema } from '@livestore/utils/effect'
2
2
 
3
- import { SessionIdSymbol } from '../adapter-types.ts'
4
3
  import { makeSchema, State } from '../schema/mod.ts'
4
+ import { SessionIdSymbol } from '../session-id-symbol.ts'
5
5
 
6
6
  export const UiState = State.SQLite.clientDocument({
7
7
  name: 'UiState',
@@ -14,8 +14,8 @@ export const UiState = State.SQLite.clientDocument({
14
14
  })
15
15
 
16
16
  const Config = Schema.Struct({
17
- fontSize: Schema.Number,
18
- theme: Schema.Literal('light', 'dark'),
17
+ fontSize: Schema.Finite,
18
+ theme: Schema.Literals(['light', 'dark']),
19
19
  })
20
20
 
21
21
  export const appConfig = State.SQLite.clientDocument({
@@ -2,6 +2,7 @@ import {
2
2
  type Effect,
3
3
  type Exit,
4
4
  type Queue,
5
+ type Latch,
5
6
  Schema,
6
7
  type Scope,
7
8
  type SubscriptionRef,
@@ -10,26 +11,31 @@ import {
10
11
 
11
12
  import type { ClientSessionLeaderThreadProxy } from './ClientSessionLeaderThreadProxy.ts'
12
13
  import type * as Devtools from './devtools/mod.ts'
13
- import type { IntentionalShutdownCause, MaterializeError, UnexpectedError } from './errors.ts'
14
+ import type { IntentionalShutdownCause, MaterializeError, UnknownError } from './errors.ts'
14
15
  import type { LiveStoreSchema } from './schema/mod.ts'
15
16
  import type { SqliteDb } from './sqlite-types.ts'
16
- import type { IsOfflineError, SyncError } from './sync/index.js'
17
+ import type { BackendIdMismatchError } from './sync/index.ts'
17
18
 
18
19
  export * as ClientSessionLeaderThreadProxy from './ClientSessionLeaderThreadProxy.ts'
19
20
  export * from './defs.ts'
20
21
  export * from './errors.ts'
21
22
  export * from './sqlite-types.ts'
22
23
 
24
+ /**
25
+ * Runtime handle to an active LiveStore client session within the current process.
26
+ * Provides direct access to the embedded SQLite database, leader thread bridge,
27
+ * and lifecycle controls useful for application-level coordination.
28
+ */
23
29
  export interface ClientSession {
24
30
  /** SQLite database with synchronous API running in the same thread (usually in-memory) */
25
31
  sqliteDb: SqliteDb
26
- devtools: { enabled: false } | { enabled: true; pullLatch: Effect.Latch; pushLatch: Effect.Latch }
32
+ devtools: { enabled: false } | { enabled: true; pullLatch: Latch.Latch; pushLatch: Latch.Latch }
27
33
  clientId: string
28
34
  sessionId: string
29
35
  /** Status info whether current session is leader or not */
30
36
  lockStatus: SubscriptionRef.SubscriptionRef<LockStatus>
31
37
  shutdown: (
32
- cause: Exit.Exit<IntentionalShutdownCause, UnexpectedError | SyncError | MaterializeError>,
38
+ cause: Exit.Exit<IntentionalShutdownCause, UnknownError | MaterializeError | BackendIdMismatchError>,
33
39
  ) => Effect.Effect<void>
34
40
  /** A proxy API to communicate with the leader thread */
35
41
  leaderThread: ClientSessionLeaderThreadProxy
@@ -40,83 +46,81 @@ export interface ClientSession {
40
46
  export type ResetMode = 'all-data' | 'only-app-db'
41
47
 
42
48
  export const BootStateProgress = Schema.Struct({
43
- done: Schema.Number,
44
- total: Schema.Number,
49
+ done: Schema.Finite,
50
+ total: Schema.Finite,
45
51
  })
46
52
 
47
- export const BootStatus = Schema.Union(
53
+ /**
54
+ * Describes known reasons why LiveStore boot may encounter storage issues.
55
+ *
56
+ * @remarks
57
+ * - `private-browsing`: OPFS unavailable due to private/incognito browsing mode (Safari, Firefox)
58
+ * - `storage-unavailable`: OPFS access denied for other reasons (permissions, quota)
59
+ * - `unknown`: Unexpected error during storage initialization
60
+ */
61
+ export const BootWarningReason = Schema.Literals(['private-browsing', 'storage-unavailable', 'unknown'])
62
+ export type BootWarningReason = typeof BootWarningReason.Type
63
+
64
+ /**
65
+ * Describes the storage mode the store is operating in.
66
+ *
67
+ * @remarks
68
+ * - `persisted`: Data is persisted to disk (e.g., via OPFS)
69
+ * - `in-memory`: Data is only stored in memory and will be lost on page refresh
70
+ */
71
+ export const StorageMode = Schema.Literals(['persisted', 'in-memory'])
72
+ export type StorageMode = typeof StorageMode.Type
73
+
74
+ export const BootStatus = Schema.Union([
48
75
  Schema.Struct({ stage: Schema.Literal('loading') }),
49
76
  Schema.Struct({ stage: Schema.Literal('migrating'), progress: BootStateProgress }),
50
77
  Schema.Struct({ stage: Schema.Literal('rehydrating'), progress: BootStateProgress }),
51
78
  Schema.Struct({ stage: Schema.Literal('syncing'), progress: BootStateProgress }),
52
79
  Schema.Struct({ stage: Schema.Literal('done') }),
53
- ).annotations({ title: 'BootStatus' })
80
+ /**
81
+ * Indicates a non-fatal issue occurred during boot that may degrade functionality.
82
+ * LiveStore continues running but without full capabilities (e.g., no persistence).
83
+ */
84
+ Schema.Struct({
85
+ stage: Schema.Literal('warning'),
86
+ reason: BootWarningReason,
87
+ message: Schema.String,
88
+ }),
89
+ ]).annotate({ title: 'BootStatus' })
54
90
 
55
91
  export type BootStatus = typeof BootStatus.Type
56
92
 
57
- /**
58
- * Can be used in queries to refer to the current session id.
59
- * Will be replaced with the actual session id at runtime
60
- *
61
- * In client document table:
62
- * ```ts
63
- * const uiState = State.SQLite.clientDocument({
64
- * name: 'ui_state',
65
- * schema: Schema.Struct({
66
- * theme: Schema.Literal('dark', 'light', 'system'),
67
- * user: Schema.String,
68
- * showToolbar: Schema.Boolean,
69
- * }),
70
- * default: { value: defaultFrontendState, id: SessionIdSymbol },
71
- * })
72
- * ```
73
- *
74
- * Or in a client document query:
75
- * ```ts
76
- * const query$ = queryDb(tables.uiState.get(SessionIdSymbol))
77
- * ```
78
- */
79
- export const SessionIdSymbol = Symbol.for('@livestore/session-id')
80
- export type SessionIdSymbol = typeof SessionIdSymbol
81
-
82
93
  export type LockStatus = 'has-lock' | 'no-lock'
83
94
 
84
- // TODO possibly allow a combination of these options
85
95
  // TODO allow a way to stream the migration progress back to the app
86
- export type MigrationOptions =
87
- | {
88
- strategy: 'auto'
89
- hooks?: Partial<MigrationHooks>
90
- logging?: {
91
- excludeAffectedRows?: (sqlStmt: string) => boolean
92
- }
93
- }
94
- | {
95
- strategy: 'manual'
96
- migrate: (
97
- oldDb: Uint8Array<ArrayBuffer>,
98
- ) => Uint8Array<ArrayBuffer> | Promise<Uint8Array<ArrayBuffer>> | Effect.Effect<Uint8Array<ArrayBuffer>, unknown>
99
- }
96
+ export type MigrationOptions = {
97
+ hooks?: Partial<MigrationHooks>
98
+ logging?: {
99
+ excludeAffectedRows?: (sqlStmt: string) => boolean
100
+ }
101
+ }
100
102
 
101
103
  export type MigrationHooks = {
102
104
  /** Runs on the empty in-memory database with no database schemas applied yet */
103
105
  init: MigrationHook
104
- /** Runs before applying the migration strategy but after table schemas have been applied and singleton rows have been created */
106
+ /** Runs after table schemas and singleton rows are created, but before rematerializing state from the eventlog */
105
107
  pre: MigrationHook
106
- /** Runs after applying the migration strategy before creating export snapshot and closing the database */
108
+ /** Runs after rematerializing state from the eventlog */
107
109
  post: MigrationHook
108
110
  }
109
111
 
110
112
  export type MigrationHook = (db: SqliteDb) => void | Promise<void> | Effect.Effect<void, unknown>
111
113
 
112
- export interface ClientSessionDevtoolsChannel
113
- extends WebChannel.WebChannel<Devtools.ClientSession.MessageToApp, Devtools.ClientSession.MessageFromApp> {}
114
+ export interface ClientSessionDevtoolsChannel extends WebChannel.WebChannel<
115
+ Devtools.ClientSession.MessageToApp,
116
+ Devtools.ClientSession.MessageFromApp
117
+ > {}
114
118
 
115
119
  export type ConnectDevtoolsToStore = (
116
120
  storeDevtoolsChannel: ClientSessionDevtoolsChannel,
117
- ) => Effect.Effect<void, UnexpectedError, Scope.Scope>
121
+ ) => Effect.Effect<void, UnknownError, Scope.Scope>
118
122
 
119
- export type Adapter = (args: AdapterArgs) => Effect.Effect<ClientSession, UnexpectedError, Scope.Scope>
123
+ export type Adapter = (args: AdapterArgs) => Effect.Effect<ClientSession, UnknownError, Scope.Scope>
120
124
 
121
125
  export interface AdapterArgs {
122
126
  schema: LiveStoreSchema
@@ -125,7 +129,7 @@ export interface AdapterArgs {
125
129
  debugInstanceId: string
126
130
  bootStatusQueue: Queue.Queue<BootStatus>
127
131
  shutdown: (
128
- exit: Exit.Exit<IntentionalShutdownCause, UnexpectedError | SyncError | MaterializeError | IsOfflineError>,
132
+ exit: Exit.Exit<IntentionalShutdownCause, UnknownError | MaterializeError | BackendIdMismatchError>,
129
133
  ) => Effect.Effect<void>
130
134
  connectDevtoolsToStore: ConnectDevtoolsToStore
131
135
  /**
@@ -133,5 +137,7 @@ export interface AdapterArgs {
133
137
  *
134
138
  * @default undefined
135
139
  */
136
- syncPayload: Schema.JsonValue | undefined
140
+ syncPayloadSchema: Schema.Decoder<Schema.Json> | undefined
141
+ /** Encoded representation of the sync payload matching `syncPayloadSchema`. */
142
+ syncPayloadEncoded: Schema.Json | undefined
137
143
  }
@@ -16,10 +16,11 @@ export class BoundMap<K, V> {
16
16
  this.#map.set(key, value)
17
17
  // console.log(this.#map.size, this.#sizeLimit);
18
18
  if (this.#map.size > this.#sizeLimit) {
19
- const firstKey = this.#map.keys().next().value as K
19
+ const firstKey = this.#map.keys().next().value
20
+ if (firstKey === undefined) return
20
21
  const deletedValue = this.#map.get(firstKey)!
21
22
  this.#map.delete(firstKey)
22
- if (this.onEvict) {
23
+ if (this.onEvict !== undefined) {
23
24
  this.onEvict(firstKey, deletedValue)
24
25
  }
25
26
  }
@@ -47,7 +48,7 @@ export class BoundSet<V> {
47
48
  }
48
49
 
49
50
  #onEvict = (v: V) => {
50
- if (this.onEvict) {
51
+ if (this.onEvict !== undefined) {
51
52
  this.onEvict(v)
52
53
  }
53
54
  }
@@ -85,7 +86,7 @@ export class BoundArray<V> {
85
86
  this.#array.push(v)
86
87
  if (this.#array.length > this.sizeLimit) {
87
88
  const first = this.#array.shift()
88
- if (first && this.onEvict) {
89
+ if (first !== undefined && this.onEvict !== undefined) {
89
90
  this.onEvict(first)
90
91
  }
91
92
  }
@@ -116,6 +117,6 @@ export class BoundArray<V> {
116
117
  }
117
118
 
118
119
  sort = (fn?: (a: V, b: V) => number) => {
119
- return this.#array.sort(fn)
120
+ return this.#array.toSorted(fn)
120
121
  }
121
122
  }