@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,23 +1,8 @@
1
- import type { WebChannel } from '@livestore/utils/effect'
2
- import { Schema } from '@livestore/utils/effect'
1
+ import { type WebChannel, Schema } from '@livestore/utils/effect'
3
2
 
4
- import {
5
- IntentionalShutdownCause,
6
- InvalidPullError,
7
- InvalidPushError,
8
- IsOfflineError,
9
- MaterializeError,
10
- UnexpectedError,
11
- } from '../index.ts'
3
+ import { BackendIdMismatchError, IntentionalShutdownCause, MaterializeError, UnknownError } from '../index.ts'
12
4
 
13
- export class All extends Schema.Union(
14
- IntentionalShutdownCause,
15
- UnexpectedError,
16
- IsOfflineError,
17
- InvalidPushError,
18
- InvalidPullError,
19
- MaterializeError,
20
- ) {}
5
+ export const All = Schema.Union([IntentionalShutdownCause, UnknownError, BackendIdMismatchError, MaterializeError])
21
6
 
22
7
  /**
23
8
  * Used internally by an adapter to shutdown gracefully.
@@ -0,0 +1,209 @@
1
+ import { type Subscribable, Effect, Option, Queue, Stream } from '@livestore/utils/effect'
2
+
3
+ import { EventSequenceNumber, type LiveStoreEvent } from '../schema/mod.ts'
4
+ import type * as SyncState from '../sync/syncstate.ts'
5
+ import * as Eventlog from './eventlog.ts'
6
+ import type { LeaderSqliteDb, StreamEventsOptions } from './types.ts'
7
+
8
+ /**
9
+ * Streams events for leader-thread adapters.
10
+ *
11
+ * Provides a continuous stream from the eventlog as the upstream head advances.
12
+ * When an until event is passed in the stream finalizes upon reaching it.
13
+ *
14
+ * The batch size is set to 100 by default as this was meassured to provide the
15
+ * best performance and 1000 as the upper limit.
16
+ *
17
+ * Adapters that call this helper include:
18
+ * - `packages/@livestore/adapter-web/src/in-memory/in-memory-adapter.ts`
19
+ * - `packages/@livestore/adapter-web/src/web-worker/leader-worker/make-leader-worker.ts`
20
+ * - `packages/@livestore/adapter-cloudflare/src/make-adapter.ts`
21
+ * - external leader-thread adapters
22
+ *
23
+ * Each caller resolves dependencies inside the leader scope before invoking this helper,
24
+ * so the stream stays environment-agnostic and does not leak `LeaderThreadCtx` into runtime
25
+ * entry points such as `Store.eventsStream`.
26
+ *
27
+ * Test files:
28
+ * Integration: `packages/@livestore/livestore/src/store/store-eventstream.test.ts`
29
+ * Performance: `tests/perf-eventlog/tests/suites/event-streaming.test.ts`
30
+ *
31
+ * Optimization explorations
32
+ *
33
+ * In order to alleviate the occurence of many small queries when the syncState
34
+ * is sequentially progressing quickly we have explored some time-based batching
35
+ * approaches. It remains to be determined if and when the added complexity of
36
+ * these approaches are worth the benefit. They come with some drawbacks such as
37
+ * degraded time to first event or general performance degredation for larger
38
+ * query steps. These aspects can likely be mitigated with some more work but
39
+ * that is best assessed when we have a final implementation of event streaming
40
+ * with support for session and leader level streams.
41
+ *
42
+ * Fetch plans into a Sink
43
+ * https://gist.github.com/slashv/f1223689f2d1171d2eeb60a2823f4c7c
44
+ *
45
+ * Fetch plans into sink and decompose into windows
46
+ * https://gist.github.com/slashv/a8f55f50121c080937f42e44b4039ac8
47
+ *
48
+ * Queue and Latch approach (suggestion by Tim Smart)
49
+ * https://gist.github.com/slashv/d6b12395c85415bf0d3363372a1636c3
50
+ */
51
+ export const streamEventsWithSyncState = ({
52
+ dbEventlog,
53
+ syncState,
54
+ options,
55
+ }: {
56
+ dbEventlog: LeaderSqliteDb
57
+ syncState: Subscribable.Subscribable<SyncState.SyncState>
58
+ options: StreamEventsOptions
59
+ }): Stream.Stream<LiveStoreEvent.Client.Encoded> => {
60
+ const initialCursor = options.since ?? EventSequenceNumber.Client.ROOT
61
+ const batchSize = options.batchSize ?? 100
62
+
63
+ return Stream.unwrap(
64
+ Effect.gen(function* () {
65
+ /**
66
+ * Single-element Queue allows suspending the event stream until head
67
+ * advances because Queue.take is a suspending effect. SubscriptionRef in
68
+ * comparrison lacks a primitive for suspending a stream until a new value
69
+ * is set and would require polling.
70
+ *
71
+ * The use of a sliding Queue here is useful since it ensures only the
72
+ * lastest head from syncState is the one present on the queue without the
73
+ * need for manual substitution.
74
+ */
75
+ const headQueue = yield* Queue.sliding<EventSequenceNumber.Client.Composite>(1)
76
+
77
+ /**
78
+ * We run a separate fiber which listens to changes in syncState and
79
+ * offer the latest head to the headQueue. Keeping track of the previous
80
+ * value is done to prevent syncState changes unrelated to the
81
+ * upstreamHead triggering empty queries.
82
+ *
83
+ * When we implement support for leader and session level streams
84
+ * this will need to be adapted to support the relevant value from
85
+ * syncState that we are interested in tracking.
86
+ */
87
+ let prevGlobalHead = -1
88
+ yield* syncState.changes.pipe(
89
+ Stream.map((state) => state.upstreamHead),
90
+ Stream.filter((head) => {
91
+ if (head.global > prevGlobalHead) {
92
+ prevGlobalHead = head.global
93
+ return true
94
+ }
95
+ return false
96
+ }),
97
+ Stream.runForEach((head) => Queue.offer(headQueue, head)),
98
+ Effect.forkScoped,
99
+ )
100
+
101
+ return Stream.paginate({ cursor: initialCursor, head: EventSequenceNumber.Client.ROOT }, ({ cursor, head }) =>
102
+ Effect.gen(function* () {
103
+ /**
104
+ * Early check guards agains:
105
+ * since === until : Prevent empty query
106
+ * since > until : Incorrectly inverted interval
107
+ */
108
+ if (
109
+ options.until !== undefined &&
110
+ EventSequenceNumber.Client.isGreaterThanOrEqual(cursor, options.until) === true
111
+ ) {
112
+ const done: readonly [
113
+ ReadonlyArray<LiveStoreEvent.Client.Encoded>,
114
+ Option.Option<{
115
+ cursor: EventSequenceNumber.Client.Composite
116
+ head: EventSequenceNumber.Client.Composite
117
+ }>,
118
+ ] = [[], Option.none()]
119
+ return done
120
+ }
121
+
122
+ /**
123
+ * There are two scenarios where we take the next head from the headQueue:
124
+ *
125
+ * 1. We need to wait for the head to advance
126
+ * The Stream suspends until a new head is available on the headQueue
127
+ *
128
+ * 2. Head has advanced during itteration
129
+ * While itterating towards the lastest head taken from the headQueue
130
+ * in increments of batchSize it's possible the head could have
131
+ * advanced. This leads to a suboptimal amount of queries. Therefor we
132
+ * check if the headQueue is full which tells us that there's a new
133
+ * head available to take. Example:
134
+ *
135
+ * batchSize: 2
136
+ *
137
+ * --> head at: e3
138
+ * First query: e0 -> e2 (two events)
139
+ * --> head advances to: e4
140
+ * Second query: e2 -> e3 (one event but we could have taken 2)
141
+ * --> Take the new head of e4
142
+ * Third query: e3 -> e4 (unnecessary third query)
143
+ *
144
+ *
145
+ * To define the target, which will be used as the temporary until
146
+ * marker for the eventlog query, we select the lowest of three possible values:
147
+ *
148
+ * hardStop: A user supplied until marker
149
+ * current cursor + batchSize: A batchSize step towards the latest head from headQueue
150
+ * nextHead: The latest head from headQueue
151
+ */
152
+ const waitForHead = EventSequenceNumber.Client.isGreaterThanOrEqual(cursor, head)
153
+ const maybeHead =
154
+ waitForHead === true
155
+ ? yield* Queue.take(headQueue).pipe(Effect.map(Option.some))
156
+ : yield* Queue.poll(headQueue)
157
+ const nextHead = Option.getOrElse(maybeHead, () => head)
158
+ const hardStop = options.until?.global ?? Number.POSITIVE_INFINITY
159
+ const target = EventSequenceNumber.Client.Composite.make({
160
+ global: Math.min(hardStop, cursor.global + batchSize, nextHead.global),
161
+ client: EventSequenceNumber.Client.DEFAULT,
162
+ })
163
+
164
+ /**
165
+ * Eventlog.getEventsFromEventlog returns a batch from each query
166
+ * which is what we emit at each itteration.
167
+ */
168
+ const events = yield* Eventlog.getEventsFromEventlog({
169
+ dbEventlog,
170
+ options: {
171
+ ...options,
172
+ since: cursor,
173
+ until: target,
174
+ },
175
+ })
176
+
177
+ /**
178
+ * We construct the state for the following itteration of the stream
179
+ * loop by setting the current target as the since cursor and pass
180
+ * along the latest head.
181
+ *
182
+ * If we have the reached the user supplied until marker we signal the
183
+ * finalization of the stream by passing Option.none() instead.
184
+ */
185
+ const reachedUntil =
186
+ options.until !== undefined && EventSequenceNumber.Client.isGreaterThanOrEqual(target, options.until)
187
+
188
+ const nextState: Option.Option<{
189
+ cursor: EventSequenceNumber.Client.Composite
190
+ head: EventSequenceNumber.Client.Composite
191
+ }> = reachedUntil === true ? Option.none() : Option.some({ cursor: target, head: nextHead })
192
+
193
+ const spanAttributes = {
194
+ 'livestore.streamEvents.cursor.global': cursor.global,
195
+ 'livestore.streamEvents.target.global': target.global,
196
+ 'livestore.streamEvents.batchSize': batchSize,
197
+ 'livestore.streamEvents.waitedForHead': waitForHead,
198
+ }
199
+
200
+ const result: readonly [ReadonlyArray<LiveStoreEvent.Client.Encoded>, typeof nextState] = [events, nextState]
201
+
202
+ return yield* Effect.succeed(result).pipe(
203
+ Effect.withSpan('@livestore/common:streamEvents:segment', { attributes: spanAttributes }),
204
+ )
205
+ }),
206
+ )
207
+ }),
208
+ )
209
+ }
@@ -1,15 +1,17 @@
1
- import type {
2
- Deferred,
3
- Effect,
4
- HttpClient,
5
- Option,
6
- Queue,
7
- Scope,
8
- Stream,
9
- Subscribable,
10
- SubscriptionRef,
1
+ import {
2
+ type Deferred,
3
+ type Effect,
4
+ type HttpClient,
5
+ type Latch,
6
+ type Option,
7
+ type Queue,
8
+ type Scope,
9
+ type Stream,
10
+ type Subscribable,
11
+ type SubscriptionRef,
12
+ Context,
13
+ Schema,
11
14
  } from '@livestore/utils/effect'
12
- import { Context, Schema } from '@livestore/utils/effect'
13
15
  import type { MeshNode } from '@livestore/webmesh'
14
16
 
15
17
  import type { MigrationsReport } from '../defs.ts'
@@ -17,15 +19,15 @@ import type { MaterializeError } from '../errors.ts'
17
19
  import type {
18
20
  BootStatus,
19
21
  Devtools,
20
- LeaderAheadError,
21
22
  MakeSqliteDb,
22
23
  PersistenceInfo,
23
24
  SqliteDb,
24
25
  SyncBackend,
25
- UnexpectedError,
26
+ UnknownError,
26
27
  } from '../index.ts'
27
- import type { EventSequenceNumber, LiveStoreEvent, LiveStoreSchema } from '../schema/mod.ts'
28
+ import { EventSequenceNumber, type LiveStoreEvent, type LiveStoreSchema } from '../schema/mod.ts'
28
29
  import type * as SyncState from '../sync/syncstate.ts'
30
+ import type * as LeaderSyncProcessor from './LeaderSyncProcessor.ts'
29
31
  import type { ShutdownChannel } from './shutdown-channel.ts'
30
32
 
31
33
  export type ShutdownState = 'running' | 'shutting-down'
@@ -34,17 +36,17 @@ export const InitialSyncOptionsSkip = Schema.TaggedStruct('Skip', {})
34
36
  export type InitialSyncOptionsSkip = typeof InitialSyncOptionsSkip.Type
35
37
 
36
38
  export const InitialSyncOptionsBlocking = Schema.TaggedStruct('Blocking', {
37
- timeout: Schema.Union(Schema.DurationFromMillis, Schema.Number),
39
+ timeout: Schema.Union([Schema.DurationFromMillis, Schema.Finite]),
38
40
  })
39
41
 
40
42
  export type InitialSyncOptionsBlocking = typeof InitialSyncOptionsBlocking.Type
41
43
 
42
- export const InitialSyncOptions = Schema.Union(InitialSyncOptionsSkip, InitialSyncOptionsBlocking)
44
+ export const InitialSyncOptions = Schema.Union([InitialSyncOptionsSkip, InitialSyncOptionsBlocking])
43
45
  export type InitialSyncOptions = typeof InitialSyncOptions.Type
44
46
 
45
47
  export type InitialSyncInfo = Option.Option<{
46
- eventSequenceNumber: EventSequenceNumber.GlobalEventSequenceNumber
47
- metadata: Option.Option<Schema.JsonValue>
48
+ eventSequenceNumber: EventSequenceNumber.Global.Type
49
+ metadata: Option.Option<Schema.Json>
48
50
  }>
49
51
 
50
52
  // export type InitialSetup =
@@ -66,7 +68,7 @@ export type DevtoolsOptions =
66
68
  persistenceInfo: PersistenceInfoPair
67
69
  mode: 'proxy' | 'direct'
68
70
  },
69
- UnexpectedError,
71
+ UnknownError,
70
72
  Scope.Scope | HttpClient.HttpClient | LeaderThreadCtx
71
73
  >
72
74
  }
@@ -74,16 +76,16 @@ export type DevtoolsOptions =
74
76
  export type DevtoolsContext =
75
77
  | {
76
78
  enabled: true
77
- // syncBackendPullLatch: Effect.Latch
78
- // syncBackendPushLatch: Effect.Latch
79
- syncBackendLatch: Effect.Latch
79
+ // syncBackendPullLatch: Latch.Latch
80
+ // syncBackendPushLatch: Latch.Latch
81
+ syncBackendLatch: Latch.Latch
80
82
  syncBackendLatchState: SubscriptionRef.SubscriptionRef<{ latchClosed: boolean }>
81
83
  }
82
84
  | {
83
85
  enabled: false
84
86
  }
85
87
 
86
- export class LeaderThreadCtx extends Context.Tag('LeaderThreadCtx')<
88
+ export class LeaderThreadCtx extends Context.Service<
87
89
  LeaderThreadCtx,
88
90
  {
89
91
  schema: LiveStoreSchema
@@ -96,13 +98,13 @@ export class LeaderThreadCtx extends Context.Tag('LeaderThreadCtx')<
96
98
  // TODO we should find a more elegant way to handle cases which need this ref for their implementation
97
99
  shutdownStateSubRef: SubscriptionRef.SubscriptionRef<ShutdownState>
98
100
  shutdownChannel: ShutdownChannel
99
- eventSchema: LiveStoreEvent.ForEventDefRecord<any>
101
+ eventSchema: LiveStoreEvent.ForEventDef.ForRecord<any>
100
102
  devtools: DevtoolsContext
101
103
  syncBackend: SyncBackend.SyncBackend | undefined
102
- syncProcessor: LeaderSyncProcessor
104
+ syncProcessor: LeaderSyncProcessor.Service
103
105
  materializeEvent: MaterializeEvent
104
106
  initialState: {
105
- leaderHead: EventSequenceNumber.EventSequenceNumber
107
+ leaderHead: EventSequenceNumber.Client.Composite
106
108
  migrationsReport: MigrationsReport
107
109
  }
108
110
  /**
@@ -111,11 +113,12 @@ export class LeaderThreadCtx extends Context.Tag('LeaderThreadCtx')<
111
113
  * This is currently separated from `.devtools` as it also needs to work when devtools are disabled
112
114
  */
113
115
  extraIncomingMessagesQueue: Queue.Queue<Devtools.Leader.MessageToApp>
116
+ networkStatus: Subscribable.Subscribable<SyncBackend.NetworkStatus>
114
117
  }
115
- >() {}
118
+ >()('LeaderThreadCtx') {}
116
119
 
117
120
  export type MaterializeEvent = (
118
- eventEncoded: LiveStoreEvent.EncodedWithMeta,
121
+ eventEncoded: LiveStoreEvent.Client.EncodedWithMeta,
119
122
  options?: {
120
123
  /** Needed for rematerializeFromEventlog */
121
124
  skipEventlog?: boolean
@@ -133,41 +136,50 @@ export type InitialBlockingSyncContext = {
133
136
  update: (_: { pageInfo: SyncBackend.PullResPageInfo; processed: number }) => Effect.Effect<void>
134
137
  }
135
138
 
136
- export interface LeaderSyncProcessor {
137
- /** Used by client sessions to subscribe to upstream sync state changes */
138
- pull: (args: {
139
- cursor: EventSequenceNumber.EventSequenceNumber
140
- }) => Stream.Stream<{ payload: typeof SyncState.PayloadUpstream.Type }, UnexpectedError>
141
- /** The `pullQueue` API can be used instead of `pull` when more convenient */
142
- pullQueue: (args: {
143
- cursor: EventSequenceNumber.EventSequenceNumber
144
- }) => Effect.Effect<Queue.Queue<{ payload: typeof SyncState.PayloadUpstream.Type }>, UnexpectedError, Scope.Scope>
145
-
146
- /** Used by client sessions to push events to the leader thread */
147
- push: (
148
- /** `batch` needs to follow the same rules as `batch` in `SyncBackend.push` */
149
- batch: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>,
150
- options?: {
151
- /**
152
- * If true, the effect will only finish when the local push has been processed (i.e. succeeded or was rejected).
153
- * `true` doesn't mean the events have been pushed to the sync backend.
154
- * @default false
155
- */
156
- waitForProcessing?: boolean
157
- },
158
- ) => Effect.Effect<void, LeaderAheadError>
159
-
160
- /** Currently only used by devtools which don't provide their own event numbers */
161
- pushPartial: (args: {
162
- event: LiveStoreEvent.PartialAnyEncoded
163
- clientId: string
164
- sessionId: string
165
- }) => Effect.Effect<void, UnexpectedError>
166
-
167
- boot: Effect.Effect<
168
- { initialLeaderHead: EventSequenceNumber.EventSequenceNumber },
169
- UnexpectedError,
170
- LeaderThreadCtx | Scope.Scope | HttpClient.HttpClient
171
- >
172
- syncState: Subscribable.Subscribable<SyncState.SyncState>
139
+ export const STREAM_EVENTS_BATCH_SIZE_DEFAULT = 100
140
+ export const STREAM_EVENTS_BATCH_SIZE_MAX = 1_000
141
+
142
+ export const StreamEventsOptionsFields = {
143
+ since: Schema.optional(EventSequenceNumber.Client.Composite),
144
+ until: Schema.optional(EventSequenceNumber.Client.Composite),
145
+ filter: Schema.optional(Schema.Array(Schema.String)),
146
+ clientIds: Schema.optional(Schema.Array(Schema.String)),
147
+ sessionIds: Schema.optional(Schema.Array(Schema.String)),
148
+ batchSize: Schema.optional(Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: STREAM_EVENTS_BATCH_SIZE_MAX }))),
149
+ includeClientOnly: Schema.optional(Schema.Boolean),
150
+ } as const
151
+
152
+ export const StreamEventsOptionsSchema = Schema.Struct(StreamEventsOptionsFields)
153
+
154
+ export interface StreamEventsOptions {
155
+ /**
156
+ * Only include events after this logical timestamp (exclusive).
157
+ * Defaults to `EventSequenceNumber.Client.ROOT` when omitted.
158
+ */
159
+ since?: EventSequenceNumber.Client.Composite
160
+ /**
161
+ * Only include events up to this logical timestamp (inclusive).
162
+ */
163
+ until?: EventSequenceNumber.Client.Composite
164
+ /**
165
+ * Only include events of the given names.
166
+ */
167
+ filter?: ReadonlyArray<string>
168
+ /**
169
+ * Only include events from specific client identifiers.
170
+ */
171
+ clientIds?: ReadonlyArray<string>
172
+ /**
173
+ * Only include events from specific session identifiers.
174
+ */
175
+ sessionIds?: ReadonlyArray<string>
176
+ /**
177
+ * Number of events to fetch in each batch when streaming from the eventlog.
178
+ * Defaults to 100.
179
+ */
180
+ batchSize?: number
181
+ /**
182
+ * Include client-only events (i.e. events with a positive client sequence number).
183
+ */
184
+ includeClientOnly?: boolean
173
185
  }
package/src/logging.ts ADDED
@@ -0,0 +1,15 @@
1
+ import type { Layer, LogLevel } from '@livestore/utils/effect'
2
+
3
+ /**
4
+ * Optional Effect logger configuration accepted by LiveStore entry points.
5
+ *
6
+ * When provided, `logger` replaces the default logger for the runtime.
7
+ * Use `logLevel` to control verbosity. Set to `"None"` to disable logging
8
+ * entirely while keeping the same logger implementation.
9
+ */
10
+ export type LoggerOptions = {
11
+ /** Optional Effect logger layer to control logging output. */
12
+ logger?: Layer.Layer<never> | undefined
13
+ /** Optional minimum log level for the runtime. */
14
+ logLevel?: LogLevel.LogLevel | undefined
15
+ }
@@ -1,5 +1,4 @@
1
- import type { Scope, SubscriptionRef } from '@livestore/utils/effect'
2
- import { Effect, Stream } from '@livestore/utils/effect'
1
+ import { type Scope, type SubscriptionRef, Effect, Latch, Stream } from '@livestore/utils/effect'
3
2
  import * as Webmesh from '@livestore/webmesh'
4
3
 
5
4
  import type {
@@ -8,7 +7,7 @@ import type {
8
7
  ClientSessionLeaderThreadProxy,
9
8
  LockStatus,
10
9
  SqliteDb,
11
- UnexpectedError,
10
+ UnknownError,
12
11
  } from './adapter-types.ts'
13
12
  import * as Devtools from './devtools/mod.ts'
14
13
  import { liveStoreVersion } from './version.ts'
@@ -33,6 +32,7 @@ export const makeClientSession = <R>({
33
32
  webmeshMode,
34
33
  registerBeforeUnload,
35
34
  debugInstanceId,
35
+ origin,
36
36
  }: AdapterArgs & {
37
37
  clientId: string
38
38
  sessionId: string
@@ -43,16 +43,19 @@ export const makeClientSession = <R>({
43
43
  connectWebmeshNode: (args: {
44
44
  webmeshNode: Webmesh.MeshNode
45
45
  sessionInfo: Devtools.SessionInfo.SessionInfo
46
- }) => Effect.Effect<void, UnexpectedError, Scope.Scope | R>
46
+ }) => Effect.Effect<void, UnknownError, Scope.Scope | R>
47
47
  webmeshMode: 'direct' | 'proxy'
48
48
  registerBeforeUnload: (onBeforeUnload: () => void) => () => void
49
+ /** Browser origin of the client session; used for origin-scoped DevTools mesh channels */
50
+ origin: string | undefined
49
51
  }): Effect.Effect<ClientSession, never, Scope.Scope | R> =>
50
52
  Effect.gen(function* () {
51
- const devtools: ClientSession['devtools'] = devtoolsEnabled
52
- ? { enabled: true, pullLatch: yield* Effect.makeLatch(true), pushLatch: yield* Effect.makeLatch(true) }
53
- : { enabled: false }
53
+ const devtools: ClientSession['devtools'] =
54
+ devtoolsEnabled === true
55
+ ? { enabled: true, pullLatch: yield* Latch.make(true), pushLatch: yield* Latch.make(true) }
56
+ : { enabled: false }
54
57
 
55
- if (devtoolsEnabled) {
58
+ if (devtoolsEnabled === true) {
56
59
  yield* Effect.gen(function* () {
57
60
  const webmeshNode = yield* Webmesh.makeMeshNode(
58
61
  Devtools.makeNodeName.client.session({ storeId, clientId, sessionId }),
@@ -67,11 +70,14 @@ export const makeClientSession = <R>({
67
70
  sessionId,
68
71
  schemaAlias,
69
72
  isLeader,
73
+ origin,
70
74
  })
71
75
 
72
76
  yield* connectWebmeshNode({ webmeshNode, sessionInfo })
73
77
 
74
- const sessionInfoBroadcastChannel = yield* Devtools.makeSessionInfoBroadcastChannel(webmeshNode)
78
+ const sessionInfoBroadcastChannel = yield* Devtools.makeSessionInfoBroadcastChannel(webmeshNode, {
79
+ origin,
80
+ })
75
81
 
76
82
  yield* Devtools.SessionInfo.provideSessionInfo({
77
83
  webChannel: sessionInfoBroadcastChannel,
@@ -110,7 +116,7 @@ export const makeClientSession = <R>({
110
116
  yield* connectDevtoolsToStore(clientSessionDevtoolsChannel)
111
117
  },
112
118
  Effect.tapCauseLogPretty,
113
- Effect.forkScoped,
119
+ Effect.forkScoped(),
114
120
  ),
115
121
  ),
116
122
  Stream.runDrain,