@livestore/common 0.4.0 → 0.5.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +1 -1
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/MaterializationJournal.d.ts +44 -0
  5. package/dist/MaterializationJournal.d.ts.map +1 -0
  6. package/dist/MaterializationJournal.js +112 -0
  7. package/dist/MaterializationJournal.js.map +1 -0
  8. package/dist/StateHead.d.ts +26 -0
  9. package/dist/StateHead.d.ts.map +1 -0
  10. package/dist/StateHead.js +50 -0
  11. package/dist/StateHead.js.map +1 -0
  12. package/dist/WorkerTransportError.d.ts +3 -3
  13. package/dist/WorkerTransportError.d.ts.map +1 -1
  14. package/dist/WorkerTransportError.js +3 -3
  15. package/dist/WorkerTransportError.js.map +1 -1
  16. package/dist/__tests__/fixture.d.ts +8 -8
  17. package/dist/__tests__/fixture.d.ts.map +1 -1
  18. package/dist/__tests__/fixture.js +4 -4
  19. package/dist/__tests__/fixture.js.map +1 -1
  20. package/dist/adapter-types.d.ts +33 -57
  21. package/dist/adapter-types.d.ts.map +1 -1
  22. package/dist/adapter-types.js +24 -41
  23. package/dist/adapter-types.js.map +1 -1
  24. package/dist/bounded-collections.d.ts.map +1 -1
  25. package/dist/bounded-collections.js.map +1 -1
  26. package/dist/debug-info.d.ts +56 -56
  27. package/dist/debug-info.d.ts.map +1 -1
  28. package/dist/debug-info.js +32 -44
  29. package/dist/debug-info.js.map +1 -1
  30. package/dist/defs.d.ts +9 -9
  31. package/dist/defs.js +2 -2
  32. package/dist/devtools/devtools-compatibility.test.js +2 -1
  33. package/dist/devtools/devtools-compatibility.test.js.map +1 -1
  34. package/dist/devtools/devtools-messages-client-session.d.ts +522 -334
  35. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  36. package/dist/devtools/devtools-messages-client-session.js +80 -78
  37. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  38. package/dist/devtools/devtools-messages-common.d.ts +27 -27
  39. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  40. package/dist/devtools/devtools-messages-common.js +6 -6
  41. package/dist/devtools/devtools-messages-common.js.map +1 -1
  42. package/dist/devtools/devtools-messages-leader.d.ts +410 -348
  43. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  44. package/dist/devtools/devtools-messages-leader.js +105 -93
  45. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  46. package/dist/devtools/devtools-messages.js +3 -3
  47. package/dist/devtools/devtools-sessioninfo.d.ts +18 -19
  48. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  49. package/dist/devtools/devtools-sessioninfo.js +8 -5
  50. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  51. package/dist/devtools/mod.d.ts +4 -5
  52. package/dist/devtools/mod.d.ts.map +1 -1
  53. package/dist/devtools/mod.js +12 -8
  54. package/dist/devtools/mod.js.map +1 -1
  55. package/dist/errors.d.ts +45 -69
  56. package/dist/errors.d.ts.map +1 -1
  57. package/dist/errors.js +19 -17
  58. package/dist/errors.js.map +1 -1
  59. package/dist/index.d.ts +4 -1
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +22 -19
  62. package/dist/index.js.map +1 -1
  63. package/dist/leader-thread/LeaderSyncProcessor.d.ts +87 -18
  64. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  65. package/dist/leader-thread/LeaderSyncProcessor.js +548 -480
  66. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  67. package/dist/leader-thread/RejectedPushError.d.ts +72 -41
  68. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -1
  69. package/dist/leader-thread/RejectedPushError.js +25 -6
  70. package/dist/leader-thread/RejectedPushError.js.map +1 -1
  71. package/dist/leader-thread/connection.d.ts +1 -0
  72. package/dist/leader-thread/connection.d.ts.map +1 -1
  73. package/dist/leader-thread/connection.js +11 -10
  74. package/dist/leader-thread/connection.js.map +1 -1
  75. package/dist/leader-thread/eventlog.d.ts +15 -5
  76. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  77. package/dist/leader-thread/eventlog.js +19 -19
  78. package/dist/leader-thread/eventlog.js.map +1 -1
  79. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  80. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  81. package/dist/leader-thread/leader-worker-devtools.js +36 -20
  82. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  83. package/dist/leader-thread/make-leader-thread-layer.d.ts +15 -5
  84. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  85. package/dist/leader-thread/make-leader-thread-layer.js +62 -58
  86. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  87. package/dist/leader-thread/make-leader-thread-layer.test.js +9 -9
  88. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -1
  89. package/dist/leader-thread/materialize-event.d.ts +2 -1
  90. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  91. package/dist/leader-thread/materialize-event.js +12 -8
  92. package/dist/leader-thread/materialize-event.js.map +1 -1
  93. package/dist/leader-thread/mod.js +9 -9
  94. package/dist/leader-thread/recreate-db.d.ts +5 -1
  95. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  96. package/dist/leader-thread/recreate-db.js +34 -59
  97. package/dist/leader-thread/recreate-db.js.map +1 -1
  98. package/dist/leader-thread/shutdown-channel.d.ts +2 -6
  99. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  100. package/dist/leader-thread/shutdown-channel.js +2 -3
  101. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  102. package/dist/leader-thread/stream-events.d.ts +4 -7
  103. package/dist/leader-thread/stream-events.d.ts.map +1 -1
  104. package/dist/leader-thread/stream-events.js +16 -21
  105. package/dist/leader-thread/stream-events.js.map +1 -1
  106. package/dist/leader-thread/types.d.ts +38 -73
  107. package/dist/leader-thread/types.d.ts.map +1 -1
  108. package/dist/leader-thread/types.js +10 -6
  109. package/dist/leader-thread/types.js.map +1 -1
  110. package/dist/logging.d.ts +5 -30
  111. package/dist/logging.d.ts.map +1 -1
  112. package/dist/logging.js +1 -32
  113. package/dist/logging.js.map +1 -1
  114. package/dist/make-client-session.d.ts +2 -3
  115. package/dist/make-client-session.d.ts.map +1 -1
  116. package/dist/make-client-session.js +5 -5
  117. package/dist/make-client-session.js.map +1 -1
  118. package/dist/materializer-helper.d.ts +0 -1
  119. package/dist/materializer-helper.d.ts.map +1 -1
  120. package/dist/materializer-helper.js +9 -37
  121. package/dist/materializer-helper.js.map +1 -1
  122. package/dist/otel.d.ts +2 -3
  123. package/dist/otel.d.ts.map +1 -1
  124. package/dist/otel.js +2 -7
  125. package/dist/otel.js.map +1 -1
  126. package/dist/rematerialize-from-eventlog.d.ts +3 -1
  127. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  128. package/dist/rematerialize-from-eventlog.js +42 -33
  129. package/dist/rematerialize-from-eventlog.js.map +1 -1
  130. package/dist/schema/EventDef/define.d.ts +6 -6
  131. package/dist/schema/EventDef/define.d.ts.map +1 -1
  132. package/dist/schema/EventDef/define.js +5 -5
  133. package/dist/schema/EventDef/define.js.map +1 -1
  134. package/dist/schema/EventDef/define.test.d.ts +2 -0
  135. package/dist/schema/EventDef/define.test.d.ts.map +1 -0
  136. package/dist/schema/EventDef/define.test.js +23 -0
  137. package/dist/schema/EventDef/define.test.js.map +1 -0
  138. package/dist/schema/EventDef/deprecated.d.ts +8 -13
  139. package/dist/schema/EventDef/deprecated.d.ts.map +1 -1
  140. package/dist/schema/EventDef/deprecated.js +12 -13
  141. package/dist/schema/EventDef/deprecated.js.map +1 -1
  142. package/dist/schema/EventDef/deprecated.test.js +3 -3
  143. package/dist/schema/EventDef/deprecated.test.js.map +1 -1
  144. package/dist/schema/EventDef/event-def.d.ts +1 -1
  145. package/dist/schema/EventDef/event-def.d.ts.map +1 -1
  146. package/dist/schema/EventDef/facts.d.ts.map +1 -1
  147. package/dist/schema/EventDef/materializer.d.ts +2 -2
  148. package/dist/schema/EventDef/materializer.d.ts.map +1 -1
  149. package/dist/schema/EventDef/mod.js +5 -5
  150. package/dist/schema/EventSequenceNumber/client.d.ts +12 -17
  151. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -1
  152. package/dist/schema/EventSequenceNumber/client.js +20 -24
  153. package/dist/schema/EventSequenceNumber/client.js.map +1 -1
  154. package/dist/schema/EventSequenceNumber/global.d.ts +2 -2
  155. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -1
  156. package/dist/schema/EventSequenceNumber/global.js +1 -1
  157. package/dist/schema/EventSequenceNumber/global.js.map +1 -1
  158. package/dist/schema/EventSequenceNumber/mod.js +2 -2
  159. package/dist/schema/EventSequenceNumber.test.js +6 -6
  160. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  161. package/dist/schema/LiveStoreEvent/client.d.ts +58 -187
  162. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -1
  163. package/dist/schema/LiveStoreEvent/client.js +33 -30
  164. package/dist/schema/LiveStoreEvent/client.js.map +1 -1
  165. package/dist/schema/LiveStoreEvent/client.test.js +13 -4
  166. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -1
  167. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +7 -7
  168. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -1
  169. package/dist/schema/LiveStoreEvent/global.d.ts +6 -6
  170. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -1
  171. package/dist/schema/LiveStoreEvent/global.js +2 -2
  172. package/dist/schema/LiveStoreEvent/global.js.map +1 -1
  173. package/dist/schema/LiveStoreEvent/input.d.ts +6 -6
  174. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -1
  175. package/dist/schema/LiveStoreEvent/input.js +3 -3
  176. package/dist/schema/LiveStoreEvent/input.js.map +1 -1
  177. package/dist/schema/LiveStoreEvent/mod.js +4 -4
  178. package/dist/schema/events.js +1 -1
  179. package/dist/schema/mod.d.ts +1 -0
  180. package/dist/schema/mod.d.ts.map +1 -1
  181. package/dist/schema/mod.js +11 -10
  182. package/dist/schema/mod.js.map +1 -1
  183. package/dist/schema/schema.d.ts +1 -1
  184. package/dist/schema/schema.d.ts.map +1 -1
  185. package/dist/schema/schema.js +6 -5
  186. package/dist/schema/schema.js.map +1 -1
  187. package/dist/schema/state/mod.js +2 -2
  188. package/dist/schema/state/sqlite/client-document-def.d.ts +13 -18
  189. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  190. package/dist/schema/state/sqlite/client-document-def.js +30 -27
  191. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  192. package/dist/schema/state/sqlite/client-document-def.test.js +53 -18
  193. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  194. package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
  195. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  196. package/dist/schema/state/sqlite/column-annotations.js +13 -15
  197. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  198. package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
  199. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  200. package/dist/schema/state/sqlite/column-def.d.ts +1 -1
  201. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  202. package/dist/schema/state/sqlite/column-def.js +73 -33
  203. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  204. package/dist/schema/state/sqlite/column-def.test.js +176 -75
  205. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  206. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  207. package/dist/schema/state/sqlite/column-spec.js +1 -1
  208. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  209. package/dist/schema/state/sqlite/column-spec.test.js +4 -4
  210. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  211. package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.d.ts +3 -0
  212. package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.d.ts.map +1 -0
  213. package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.js +5 -0
  214. package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.js.map +1 -0
  215. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.d.ts +5 -0
  216. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.d.ts.map +1 -0
  217. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.js +183 -0
  218. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.js.map +1 -0
  219. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.d.ts +2 -0
  220. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.d.ts.map +1 -0
  221. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.js +142 -0
  222. package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.js.map +1 -0
  223. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +3 -8
  224. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  225. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +1 -73
  226. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  227. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts.map +1 -1
  228. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +9 -9
  229. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  230. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +9 -13
  231. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  232. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +28 -17
  233. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  234. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +13 -11
  235. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  236. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +6 -4
  237. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  238. package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.d.ts +3 -0
  239. package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.d.ts.map +1 -0
  240. package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.js +6 -0
  241. package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.js.map +1 -0
  242. package/dist/schema/state/sqlite/db-schema/mod.js +2 -2
  243. package/dist/schema/state/sqlite/mod.d.ts +1 -3
  244. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  245. package/dist/schema/state/sqlite/mod.js +11 -10
  246. package/dist/schema/state/sqlite/mod.js.map +1 -1
  247. package/dist/schema/state/sqlite/persistence.d.ts +11 -0
  248. package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
  249. package/dist/schema/state/sqlite/persistence.js +10 -0
  250. package/dist/schema/state/sqlite/persistence.js.map +1 -0
  251. package/dist/schema/state/sqlite/query-builder/api.d.ts +7 -7
  252. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  253. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  254. package/dist/schema/state/sqlite/query-builder/astToSql.js +22 -23
  255. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  256. package/dist/schema/state/sqlite/query-builder/impl.d.ts +1 -1
  257. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  258. package/dist/schema/state/sqlite/query-builder/impl.js +18 -16
  259. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  260. package/dist/schema/state/sqlite/query-builder/impl.test.js +364 -598
  261. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  262. package/dist/schema/state/sqlite/query-builder/mod.js +2 -2
  263. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  264. package/dist/schema/state/sqlite/schema-helpers.js +2 -2
  265. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  266. package/dist/schema/state/sqlite/schema-helpers.test.js +2 -2
  267. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +102 -134
  268. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -1
  269. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +5 -5
  270. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -1
  271. package/dist/schema/state/sqlite/system-tables/mod.js +2 -2
  272. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +380 -115
  273. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -1
  274. package/dist/schema/state/sqlite/system-tables/state-tables.js +47 -6
  275. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -1
  276. package/dist/schema/state/sqlite/table-def.d.ts +17 -20
  277. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  278. package/dist/schema/state/sqlite/table-def.js +72 -6
  279. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  280. package/dist/schema/state/sqlite/table-def.test.js +207 -37
  281. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  282. package/dist/schema/unknown-events.d.ts.map +1 -1
  283. package/dist/schema/unknown-events.js +3 -2
  284. package/dist/schema/unknown-events.js.map +1 -1
  285. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +28 -6
  286. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -1
  287. package/dist/schema-management/common.d.ts.map +1 -1
  288. package/dist/schema-management/common.js +2 -2
  289. package/dist/schema-management/migrations.d.ts +4 -4
  290. package/dist/schema-management/migrations.d.ts.map +1 -1
  291. package/dist/schema-management/migrations.js +9 -9
  292. package/dist/schema-management/migrations.js.map +1 -1
  293. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  294. package/dist/schema-management/validate-schema.js +1 -1
  295. package/dist/session-id-symbol.d.ts +29 -0
  296. package/dist/session-id-symbol.d.ts.map +1 -0
  297. package/dist/session-id-symbol.js +44 -0
  298. package/dist/session-id-symbol.js.map +1 -0
  299. package/dist/sql-queries/index.js +3 -3
  300. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  301. package/dist/sql-queries/sql-queries.js +11 -13
  302. package/dist/sql-queries/sql-queries.js.map +1 -1
  303. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  304. package/dist/sql-queries/sql-query-builder.js +1 -1
  305. package/dist/sql-queries/types.d.ts +6 -7
  306. package/dist/sql-queries/types.d.ts.map +1 -1
  307. package/dist/sql-queries/types.js.map +1 -1
  308. package/dist/sqlite-db-helper.d.ts +23 -3
  309. package/dist/sqlite-db-helper.d.ts.map +1 -1
  310. package/dist/sqlite-db-helper.js +39 -4
  311. package/dist/sqlite-db-helper.js.map +1 -1
  312. package/dist/sqlite-types.d.ts +3 -6
  313. package/dist/sqlite-types.d.ts.map +1 -1
  314. package/dist/sqlite-types.js +3 -3
  315. package/dist/sqlite-types.js.map +1 -1
  316. package/dist/sync/ClientSessionSyncProcessor.d.ts +41 -19
  317. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  318. package/dist/sync/ClientSessionSyncProcessor.js +200 -70
  319. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  320. package/dist/sync/errors.d.ts +12 -18
  321. package/dist/sync/errors.d.ts.map +1 -1
  322. package/dist/sync/errors.js +3 -3
  323. package/dist/sync/errors.js.map +1 -1
  324. package/dist/sync/index.js +6 -6
  325. package/dist/sync/mock-sync-backend.d.ts +2 -3
  326. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  327. package/dist/sync/mock-sync-backend.js +58 -37
  328. package/dist/sync/mock-sync-backend.js.map +1 -1
  329. package/dist/sync/mock-sync-backend.test.d.ts +2 -0
  330. package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
  331. package/dist/sync/mock-sync-backend.test.js +49 -0
  332. package/dist/sync/mock-sync-backend.test.js.map +1 -0
  333. package/dist/sync/next/compact-events.d.ts.map +1 -1
  334. package/dist/sync/next/compact-events.js +3 -3
  335. package/dist/sync/next/facts.d.ts.map +1 -1
  336. package/dist/sync/next/facts.js +1 -1
  337. package/dist/sync/next/history-dag-common.d.ts +5 -1
  338. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  339. package/dist/sync/next/history-dag-common.js +53 -32
  340. package/dist/sync/next/history-dag-common.js.map +1 -1
  341. package/dist/sync/next/history-dag.d.ts.map +1 -1
  342. package/dist/sync/next/history-dag.js +5 -4
  343. package/dist/sync/next/history-dag.js.map +1 -1
  344. package/dist/sync/next/mod.js +5 -5
  345. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  346. package/dist/sync/next/rebase-events.js +2 -2
  347. package/dist/sync/next/test/compact-events.calculator.test.js +6 -6
  348. package/dist/sync/next/test/compact-events.test.js +4 -4
  349. package/dist/sync/next/test/event-fixtures.d.ts +8 -8
  350. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  351. package/dist/sync/next/test/event-fixtures.js +6 -6
  352. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  353. package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
  354. package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
  355. package/dist/sync/next/test/history-dag-common.test.js +73 -0
  356. package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
  357. package/dist/sync/next/test/mod.js +1 -1
  358. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  359. package/dist/sync/sync-backend-kv.js +5 -3
  360. package/dist/sync/sync-backend-kv.js.map +1 -1
  361. package/dist/sync/sync-backend.d.ts +15 -15
  362. package/dist/sync/sync-backend.d.ts.map +1 -1
  363. package/dist/sync/sync-backend.js +10 -6
  364. package/dist/sync/sync-backend.js.map +1 -1
  365. package/dist/sync/sync.d.ts +1 -1
  366. package/dist/sync/sync.d.ts.map +1 -1
  367. package/dist/sync/sync.js +2 -2
  368. package/dist/sync/syncstate.d.ts +100 -176
  369. package/dist/sync/syncstate.d.ts.map +1 -1
  370. package/dist/sync/syncstate.js +36 -39
  371. package/dist/sync/syncstate.js.map +1 -1
  372. package/dist/sync/syncstate.test.js +103 -64
  373. package/dist/sync/syncstate.test.js.map +1 -1
  374. package/dist/sync/transport-chunking.d.ts +15 -16
  375. package/dist/sync/transport-chunking.d.ts.map +1 -1
  376. package/dist/sync/transport-chunking.js +23 -32
  377. package/dist/sync/transport-chunking.js.map +1 -1
  378. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  379. package/dist/sync/validate-push-payload.js +2 -2
  380. package/dist/testing/event-factory.d.ts.map +1 -1
  381. package/dist/testing/event-factory.js +2 -2
  382. package/dist/testing/event-factory.js.map +1 -1
  383. package/dist/testing/mod.js +1 -1
  384. package/dist/util.d.ts +11 -4
  385. package/dist/util.d.ts.map +1 -1
  386. package/dist/util.js +20 -2
  387. package/dist/util.js.map +1 -1
  388. package/dist/version.d.ts.map +1 -1
  389. package/dist/version.js.map +1 -1
  390. package/package.json +40 -57
  391. package/src/ClientSessionLeaderThreadProxy.ts +1 -1
  392. package/src/MaterializationJournal.ts +184 -0
  393. package/src/StateHead.ts +80 -0
  394. package/src/WorkerTransportError.ts +4 -4
  395. package/src/__tests__/fixture.ts +3 -3
  396. package/src/adapter-types.ts +28 -61
  397. package/src/debug-info.ts +53 -70
  398. package/src/defs.ts +2 -2
  399. package/src/devtools/devtools-compatibility.test.ts +1 -0
  400. package/src/devtools/devtools-messages-client-session.ts +56 -65
  401. package/src/devtools/devtools-messages-common.ts +12 -11
  402. package/src/devtools/devtools-messages-leader.ts +71 -69
  403. package/src/devtools/devtools-sessioninfo.ts +13 -11
  404. package/src/devtools/mod.ts +4 -5
  405. package/src/errors.ts +46 -34
  406. package/src/index.ts +8 -1
  407. package/src/leader-thread/LeaderSyncProcessor.ts +777 -650
  408. package/src/leader-thread/RejectedPushError.ts +40 -27
  409. package/src/leader-thread/connection.ts +12 -8
  410. package/src/leader-thread/eventlog.ts +20 -12
  411. package/src/leader-thread/leader-worker-devtools.ts +38 -20
  412. package/src/leader-thread/make-leader-thread-layer.test.ts +7 -7
  413. package/src/leader-thread/make-leader-thread-layer.ts +100 -71
  414. package/src/leader-thread/materialize-event.ts +13 -8
  415. package/src/leader-thread/recreate-db.ts +41 -75
  416. package/src/leader-thread/shutdown-channel.ts +3 -14
  417. package/src/leader-thread/stream-events.ts +102 -101
  418. package/src/leader-thread/types.ts +29 -62
  419. package/src/logging.ts +5 -52
  420. package/src/make-client-session.ts +6 -6
  421. package/src/materializer-helper.ts +7 -36
  422. package/src/otel.ts +5 -14
  423. package/src/rematerialize-from-eventlog.ts +116 -98
  424. package/src/schema/EventDef/define.test.ts +28 -0
  425. package/src/schema/EventDef/define.ts +20 -19
  426. package/src/schema/EventDef/deprecated.test.ts +1 -8
  427. package/src/schema/EventDef/deprecated.ts +17 -20
  428. package/src/schema/EventDef/event-def.ts +2 -4
  429. package/src/schema/EventSequenceNumber/client.ts +20 -24
  430. package/src/schema/EventSequenceNumber/global.ts +1 -1
  431. package/src/schema/EventSequenceNumber.test.ts +5 -5
  432. package/src/schema/LiveStoreEvent/client.test.ts +17 -4
  433. package/src/schema/LiveStoreEvent/client.ts +36 -35
  434. package/src/schema/LiveStoreEvent/for-event-def.ts +7 -7
  435. package/src/schema/LiveStoreEvent/global.ts +1 -1
  436. package/src/schema/LiveStoreEvent/input.ts +6 -6
  437. package/src/schema/mod.ts +1 -0
  438. package/src/schema/schema.ts +4 -3
  439. package/src/schema/state/sqlite/client-document-def.test.ts +55 -20
  440. package/src/schema/state/sqlite/client-document-def.ts +95 -80
  441. package/src/schema/state/sqlite/column-annotations.test.ts +26 -45
  442. package/src/schema/state/sqlite/column-annotations.ts +26 -30
  443. package/src/schema/state/sqlite/column-def.test.ts +213 -77
  444. package/src/schema/state/sqlite/column-def.ts +87 -37
  445. package/src/schema/state/sqlite/column-spec.test.ts +2 -2
  446. package/src/schema/state/sqlite/column-spec.ts +3 -2
  447. package/src/schema/state/sqlite/db-schema/ast/fingerprint-digest.ts +6 -0
  448. package/src/schema/state/sqlite/db-schema/ast/fingerprint.test.ts +209 -0
  449. package/src/schema/state/sqlite/db-schema/ast/fingerprint.ts +225 -0
  450. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +2 -81
  451. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
  452. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -16
  453. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +26 -31
  454. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +35 -21
  455. package/src/schema/state/sqlite/db-schema/has-json-string-encoding.ts +9 -0
  456. package/src/schema/state/sqlite/mod.ts +4 -5
  457. package/src/schema/state/sqlite/persistence.ts +11 -0
  458. package/src/schema/state/sqlite/query-builder/api.ts +9 -9
  459. package/src/schema/state/sqlite/query-builder/astToSql.ts +24 -26
  460. package/src/schema/state/sqlite/query-builder/impl.test.ts +433 -669
  461. package/src/schema/state/sqlite/query-builder/impl.ts +19 -15
  462. package/src/schema/state/sqlite/schema-helpers.ts +1 -1
  463. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +2 -2
  464. package/src/schema/state/sqlite/system-tables/state-tables.ts +54 -3
  465. package/src/schema/state/sqlite/table-def.test.ts +270 -66
  466. package/src/schema/state/sqlite/table-def.ts +112 -45
  467. package/src/schema/unknown-events.ts +3 -2
  468. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +35 -4
  469. package/src/schema-management/migrations.ts +7 -6
  470. package/src/session-id-symbol.ts +59 -0
  471. package/src/sql-queries/sql-queries.ts +9 -13
  472. package/src/sql-queries/types.ts +6 -7
  473. package/src/sqlite-db-helper.ts +64 -2
  474. package/src/sqlite-types.ts +5 -8
  475. package/src/sync/ClientSessionSyncProcessor.ts +303 -119
  476. package/src/sync/errors.ts +14 -12
  477. package/src/sync/mock-sync-backend.test.ts +78 -0
  478. package/src/sync/mock-sync-backend.ts +93 -47
  479. package/src/sync/next/history-dag-common.ts +60 -34
  480. package/src/sync/next/history-dag.ts +4 -1
  481. package/src/sync/next/test/compact-events.calculator.test.ts +2 -2
  482. package/src/sync/next/test/event-fixtures.ts +1 -1
  483. package/src/sync/next/test/history-dag-common.test.ts +87 -0
  484. package/src/sync/sync-backend-kv.ts +4 -2
  485. package/src/sync/sync-backend.ts +15 -15
  486. package/src/sync/sync.ts +1 -1
  487. package/src/sync/syncstate.test.ts +191 -140
  488. package/src/sync/syncstate.ts +63 -53
  489. package/src/sync/transport-chunking.ts +34 -39
  490. package/src/util.ts +19 -9
  491. package/src/version.ts +1 -2
  492. package/dist/schema/state/sqlite/db-schema/hash.d.ts +0 -2
  493. package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +0 -1
  494. package/dist/schema/state/sqlite/db-schema/hash.js +0 -15
  495. package/dist/schema/state/sqlite/db-schema/hash.js.map +0 -1
  496. package/dist/sql-queries/misc.d.ts +0 -2
  497. package/dist/sql-queries/misc.d.ts.map +0 -1
  498. package/dist/sql-queries/misc.js +0 -2
  499. package/dist/sql-queries/misc.js.map +0 -1
  500. package/src/schema/state/sqlite/db-schema/hash.ts +0 -13
  501. package/src/sql-queries/misc.ts +0 -2
@@ -1,5 +1,4 @@
1
- import type { Subscribable } from '@livestore/utils/effect'
2
- import { Chunk, Effect, Option, Queue, Stream } from '@livestore/utils/effect'
1
+ import { type Subscribable, Effect, Option, Queue, Stream } from '@livestore/utils/effect'
3
2
 
4
3
  import { EventSequenceNumber, type LiveStoreEvent } from '../schema/mod.ts'
5
4
  import type * as SyncState from '../sync/syncstate.ts'
@@ -15,19 +14,17 @@ import type { LeaderSqliteDb, StreamEventsOptions } from './types.ts'
15
14
  * The batch size is set to 100 by default as this was meassured to provide the
16
15
  * best performance and 1000 as the upper limit.
17
16
  *
18
- * Adapters that call this helper:
17
+ * Adapters that call this helper include:
19
18
  * - `packages/@livestore/adapter-web/src/in-memory/in-memory-adapter.ts`
20
19
  * - `packages/@livestore/adapter-web/src/web-worker/leader-worker/make-leader-worker.ts`
21
- * - `packages/@livestore/adapter-node/src/client-session/adapter.ts`
22
- * - `packages/@livestore/adapter-node/src/make-leader-worker.ts`
23
20
  * - `packages/@livestore/adapter-cloudflare/src/make-adapter.ts`
21
+ * - external leader-thread adapters
24
22
  *
25
23
  * Each caller resolves dependencies inside the leader scope before invoking this helper,
26
24
  * so the stream stays environment-agnostic and does not leak `LeaderThreadCtx` into runtime
27
25
  * entry points such as `Store.eventsStream`.
28
26
  *
29
27
  * Test files:
30
- * Unit: `tests/package-common/src/leader-thread/stream-events.test.ts`
31
28
  * Integration: `packages/@livestore/livestore/src/store/store-eventstream.test.ts`
32
29
  * Performance: `tests/perf-eventlog/tests/suites/event-streaming.test.ts`
33
30
  *
@@ -48,7 +45,7 @@ import type { LeaderSqliteDb, StreamEventsOptions } from './types.ts'
48
45
  * Fetch plans into sink and decompose into windows
49
46
  * https://gist.github.com/slashv/a8f55f50121c080937f42e44b4039ac8
50
47
  *
51
- * Mailbox and Latch approach (suggestion by Tim Smart)
48
+ * Queue and Latch approach (suggestion by Tim Smart)
52
49
  * https://gist.github.com/slashv/d6b12395c85415bf0d3363372a1636c3
53
50
  */
54
51
  export const streamEventsWithSyncState = ({
@@ -63,7 +60,7 @@ export const streamEventsWithSyncState = ({
63
60
  const initialCursor = options.since ?? EventSequenceNumber.Client.ROOT
64
61
  const batchSize = options.batchSize ?? 100
65
62
 
66
- return Stream.unwrapScoped(
63
+ return Stream.unwrap(
67
64
  Effect.gen(function* () {
68
65
  /**
69
66
  * Single-element Queue allows suspending the event stream until head
@@ -101,105 +98,109 @@ export const streamEventsWithSyncState = ({
101
98
  Effect.forkScoped,
102
99
  )
103
100
 
104
- return Stream.paginateChunkEffect(
105
- { cursor: initialCursor, head: EventSequenceNumber.Client.ROOT },
106
- ({ cursor, head }) =>
107
- Effect.gen(function* () {
108
- /**
109
- * Early check guards agains:
110
- * since === until : Prevent empty query
111
- * since > until : Incorrectly inverted interval
112
- */
113
- if (
114
- options.until !== undefined &&
115
- EventSequenceNumber.Client.isGreaterThanOrEqual(cursor, options.until) === true
116
- ) {
117
- return [Chunk.empty(), Option.none()]
118
- }
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 ? yield* Queue.take(headQueue).pipe(Effect.asSome) : yield* Queue.poll(headQueue)
155
+ const nextHead = Option.getOrElse(maybeHead, () => head)
156
+ const hardStop = options.until?.global ?? Number.POSITIVE_INFINITY
157
+ const target = EventSequenceNumber.Client.Composite.make({
158
+ global: Math.min(hardStop, cursor.global + batchSize, nextHead.global),
159
+ client: EventSequenceNumber.Client.DEFAULT,
160
+ })
119
161
 
120
- /**
121
- * There are two scenarios where we take the next head from the headQueue:
122
- *
123
- * 1. We need to wait for the head to advance
124
- * The Stream suspends until a new head is available on the headQueue
125
- *
126
- * 2. Head has advanced during itteration
127
- * While itterating towards the lastest head taken from the headQueue
128
- * in increments of batchSize it's possible the head could have
129
- * advanced. This leads to a suboptimal amount of queries. Therefor we
130
- * check if the headQueue is full which tells us that there's a new
131
- * head available to take. Example:
132
- *
133
- * batchSize: 2
134
- *
135
- * --> head at: e3
136
- * First query: e0 -> e2 (two events)
137
- * --> head advances to: e4
138
- * Second query: e2 -> e3 (one event but we could have taken 2)
139
- * --> Take the new head of e4
140
- * Third query: e3 -> e4 (unnecessary third query)
141
- *
142
- *
143
- * To define the target, which will be used as the temporary until
144
- * marker for the eventlog query, we select the lowest of three possible values:
145
- *
146
- * hardStop: A user supplied until marker
147
- * current cursor + batchSize: A batchSize step towards the latest head from headQueue
148
- * nextHead: The latest head from headQueue
149
- */
150
- const waitForHead = EventSequenceNumber.Client.isGreaterThanOrEqual(cursor, head)
151
- const maybeHead =
152
- waitForHead === true
153
- ? yield* Queue.take(headQueue).pipe(Effect.map(Option.some))
154
- : yield* Queue.poll(headQueue)
155
- const nextHead = Option.getOrElse(maybeHead, () => head)
156
- const hardStop = options.until?.global ?? Number.POSITIVE_INFINITY
157
- const target = EventSequenceNumber.Client.Composite.make({
158
- global: Math.min(hardStop, cursor.global + batchSize, nextHead.global),
159
- client: EventSequenceNumber.Client.DEFAULT,
160
- })
162
+ /**
163
+ * Eventlog.getEventsFromEventlog returns a batch from each query
164
+ * which is what we emit at each itteration.
165
+ */
166
+ const events = yield* Eventlog.getEventsFromEventlog({
167
+ dbEventlog,
168
+ options: {
169
+ ...options,
170
+ since: cursor,
171
+ until: target,
172
+ },
173
+ })
161
174
 
162
- /**
163
- * Eventlog.getEventsFromEventlog returns a Chunk from each
164
- * query which is what we emit at each itteration.
165
- */
166
- const chunk = yield* Eventlog.getEventsFromEventlog({
167
- dbEventlog,
168
- options: {
169
- ...options,
170
- since: cursor,
171
- until: target,
172
- },
173
- })
175
+ /**
176
+ * We construct the state for the following itteration of the stream
177
+ * loop by setting the current target as the since cursor and pass
178
+ * along the latest head.
179
+ *
180
+ * If we have the reached the user supplied until marker we signal the
181
+ * finalization of the stream by passing Option.none() instead.
182
+ */
183
+ const reachedUntil =
184
+ options.until !== undefined && EventSequenceNumber.Client.isGreaterThanOrEqual(target, options.until)
174
185
 
175
- /**
176
- * We construct the state for the following itteration of the stream
177
- * loop by setting the current target as the since cursor and pass
178
- * along the latest head.
179
- *
180
- * If we have the reached the user supplied until marker we signal the
181
- * finalization of the stream by passing Option.none() instead.
182
- */
183
- const reachedUntil =
184
- options.until !== undefined && EventSequenceNumber.Client.isGreaterThanOrEqual(target, options.until)
186
+ const nextState: Option.Option<{
187
+ cursor: EventSequenceNumber.Client.Composite
188
+ head: EventSequenceNumber.Client.Composite
189
+ }> = reachedUntil === true ? Option.none() : Option.some({ cursor: target, head: nextHead })
185
190
 
186
- const nextState: Option.Option<{
187
- cursor: EventSequenceNumber.Client.Composite
188
- head: EventSequenceNumber.Client.Composite
189
- }> = reachedUntil === true ? Option.none() : Option.some({ cursor: target, head: nextHead })
191
+ const spanAttributes = {
192
+ 'livestore.streamEvents.cursor.global': cursor.global,
193
+ 'livestore.streamEvents.target.global': target.global,
194
+ 'livestore.streamEvents.batchSize': batchSize,
195
+ 'livestore.streamEvents.waitedForHead': waitForHead,
196
+ }
190
197
 
191
- const spanAttributes = {
192
- 'livestore.streamEvents.cursor.global': cursor.global,
193
- 'livestore.streamEvents.target.global': target.global,
194
- 'livestore.streamEvents.batchSize': batchSize,
195
- 'livestore.streamEvents.waitedForHead': waitForHead,
196
- }
198
+ const result: readonly [ReadonlyArray<LiveStoreEvent.Client.Encoded>, typeof nextState] = [events, nextState]
197
199
 
198
- return yield* Effect.succeed<[Chunk.Chunk<LiveStoreEvent.Client.Encoded>, typeof nextState]>([
199
- chunk,
200
- nextState,
201
- ]).pipe(Effect.withSpan('@livestore/common:streamEvents:segment', { attributes: spanAttributes }))
202
- }),
200
+ return yield* Effect.succeed(result).pipe(
201
+ Effect.withSpan('@livestore/common:streamEvents:segment', { attributes: spanAttributes }),
202
+ )
203
+ }),
203
204
  )
204
205
  }),
205
206
  )
@@ -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'
@@ -22,11 +24,10 @@ import type {
22
24
  SqliteDb,
23
25
  SyncBackend,
24
26
  UnknownError,
25
- UnknownEventError,
26
27
  } from '../index.ts'
27
- import type { RejectedPushError } from './RejectedPushError.ts'
28
28
  import { EventSequenceNumber, type LiveStoreEvent, type LiveStoreSchema } from '../schema/mod.ts'
29
29
  import type * as SyncState from '../sync/syncstate.ts'
30
+ import type * as LeaderSyncProcessor from './LeaderSyncProcessor.ts'
30
31
  import type { ShutdownChannel } from './shutdown-channel.ts'
31
32
 
32
33
  export type ShutdownState = 'running' | 'shutting-down'
@@ -35,17 +36,17 @@ export const InitialSyncOptionsSkip = Schema.TaggedStruct('Skip', {})
35
36
  export type InitialSyncOptionsSkip = typeof InitialSyncOptionsSkip.Type
36
37
 
37
38
  export const InitialSyncOptionsBlocking = Schema.TaggedStruct('Blocking', {
38
- timeout: Schema.Union(Schema.DurationFromMillis, Schema.Number),
39
+ timeout: Schema.Union([Schema.DurationFromMillis, Schema.Finite]),
39
40
  })
40
41
 
41
42
  export type InitialSyncOptionsBlocking = typeof InitialSyncOptionsBlocking.Type
42
43
 
43
- export const InitialSyncOptions = Schema.Union(InitialSyncOptionsSkip, InitialSyncOptionsBlocking)
44
+ export const InitialSyncOptions = Schema.Union([InitialSyncOptionsSkip, InitialSyncOptionsBlocking])
44
45
  export type InitialSyncOptions = typeof InitialSyncOptions.Type
45
46
 
46
47
  export type InitialSyncInfo = Option.Option<{
47
48
  eventSequenceNumber: EventSequenceNumber.Global.Type
48
- metadata: Option.Option<Schema.JsonValue>
49
+ metadata: Option.Option<Schema.Json>
49
50
  }>
50
51
 
51
52
  // export type InitialSetup =
@@ -75,16 +76,16 @@ export type DevtoolsOptions =
75
76
  export type DevtoolsContext =
76
77
  | {
77
78
  enabled: true
78
- // syncBackendPullLatch: Effect.Latch
79
- // syncBackendPushLatch: Effect.Latch
80
- syncBackendLatch: Effect.Latch
79
+ // syncBackendPullLatch: Latch.Latch
80
+ // syncBackendPushLatch: Latch.Latch
81
+ syncBackendLatch: Latch.Latch
81
82
  syncBackendLatchState: SubscriptionRef.SubscriptionRef<{ latchClosed: boolean }>
82
83
  }
83
84
  | {
84
85
  enabled: false
85
86
  }
86
87
 
87
- export class LeaderThreadCtx extends Context.Tag('LeaderThreadCtx')<
88
+ export class LeaderThreadCtx extends Context.Service<
88
89
  LeaderThreadCtx,
89
90
  {
90
91
  schema: LiveStoreSchema
@@ -100,7 +101,7 @@ export class LeaderThreadCtx extends Context.Tag('LeaderThreadCtx')<
100
101
  eventSchema: LiveStoreEvent.ForEventDef.ForRecord<any>
101
102
  devtools: DevtoolsContext
102
103
  syncBackend: SyncBackend.SyncBackend | undefined
103
- syncProcessor: LeaderSyncProcessor
104
+ syncProcessor: LeaderSyncProcessor.Service
104
105
  materializeEvent: MaterializeEvent
105
106
  initialState: {
106
107
  leaderHead: EventSequenceNumber.Client.Composite
@@ -114,7 +115,7 @@ export class LeaderThreadCtx extends Context.Tag('LeaderThreadCtx')<
114
115
  extraIncomingMessagesQueue: Queue.Queue<Devtools.Leader.MessageToApp>
115
116
  networkStatus: Subscribable.Subscribable<SyncBackend.NetworkStatus>
116
117
  }
117
- >() {}
118
+ >()('LeaderThreadCtx') {}
118
119
 
119
120
  export type MaterializeEvent = (
120
121
  eventEncoded: LiveStoreEvent.Client.EncodedWithMeta,
@@ -138,13 +139,18 @@ export type InitialBlockingSyncContext = {
138
139
  export const STREAM_EVENTS_BATCH_SIZE_DEFAULT = 100
139
140
  export const STREAM_EVENTS_BATCH_SIZE_MAX = 1_000
140
141
 
142
+ export const STATE_REBUILD_BATCH_SIZE_DEFAULT = 100
143
+ export const StateRebuildBatchSizeSchema = Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)).annotate({
144
+ title: 'stateRebuildBatchSize',
145
+ })
146
+
141
147
  export const StreamEventsOptionsFields = {
142
148
  since: Schema.optional(EventSequenceNumber.Client.Composite),
143
149
  until: Schema.optional(EventSequenceNumber.Client.Composite),
144
150
  filter: Schema.optional(Schema.Array(Schema.String)),
145
151
  clientIds: Schema.optional(Schema.Array(Schema.String)),
146
152
  sessionIds: Schema.optional(Schema.Array(Schema.String)),
147
- batchSize: Schema.optional(Schema.Int.pipe(Schema.between(1, STREAM_EVENTS_BATCH_SIZE_MAX))),
153
+ batchSize: Schema.optional(Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: STREAM_EVENTS_BATCH_SIZE_MAX }))),
148
154
  includeClientOnly: Schema.optional(Schema.Boolean),
149
155
  } as const
150
156
 
@@ -182,42 +188,3 @@ export interface StreamEventsOptions {
182
188
  */
183
189
  includeClientOnly?: boolean
184
190
  }
185
-
186
- export interface LeaderSyncProcessor {
187
- /** Used by client sessions to subscribe to upstream sync state changes */
188
- pull: (args: {
189
- cursor: EventSequenceNumber.Client.Composite
190
- }) => Stream.Stream<{ payload: typeof SyncState.PayloadUpstream.Type }>
191
- /** The `pullQueue` API can be used instead of `pull` when more convenient */
192
- pullQueue: (args: {
193
- cursor: EventSequenceNumber.Client.Composite
194
- }) => Effect.Effect<Queue.Queue<{ payload: typeof SyncState.PayloadUpstream.Type }>, never, Scope.Scope>
195
-
196
- /** Used by client sessions to push events to the leader thread */
197
- push: (
198
- /** `batch` needs to follow the same rules as `batch` in `SyncBackend.push` */
199
- batch: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>,
200
- options?: {
201
- /**
202
- * If true, the effect will only finish when the local push has been processed (i.e. succeeded or was rejected).
203
- * `true` doesn't mean the events have been pushed to the sync backend.
204
- * @default false
205
- */
206
- waitForProcessing?: boolean
207
- },
208
- ) => Effect.Effect<void, RejectedPushError>
209
-
210
- /** Currently only used by devtools which don't provide their own event numbers */
211
- pushPartial: (args: {
212
- event: LiveStoreEvent.Input.Encoded
213
- clientId: string
214
- sessionId: string
215
- }) => Effect.Effect<void, UnknownEventError>
216
-
217
- boot: Effect.Effect<
218
- { initialLeaderHead: EventSequenceNumber.Client.Composite },
219
- never,
220
- LeaderThreadCtx | Scope.Scope | HttpClient.HttpClient
221
- >
222
- syncState: Subscribable.Subscribable<SyncState.SyncState>
223
- }
package/src/logging.ts CHANGED
@@ -1,62 +1,15 @@
1
- import { isDevEnv } from '@livestore/utils'
2
- import { Effect, type Layer, Logger, LogLevel } from '@livestore/utils/effect'
1
+ import type { Layer, LogLevel } from '@livestore/utils/effect'
3
2
 
4
3
  /**
5
- * Optional Effect logger configuration that LiveStore entry points accept.
4
+ * Optional Effect logger configuration accepted by LiveStore entry points.
6
5
  *
7
- * When provided, `logger` replaces the default pretty logger for the runtime.
8
- * Use `logLevel` to control verbosity. Set to `LogLevel.None` to disable logging
6
+ * When provided, `logger` replaces the default logger for the runtime.
7
+ * Use `logLevel` to control verbosity. Set to `"None"` to disable logging
9
8
  * entirely while keeping the same logger implementation.
10
9
  */
11
- export type WithLoggerOptions = {
10
+ export type LoggerOptions = {
12
11
  /** Optional Effect logger layer to control logging output. */
13
12
  logger?: Layer.Layer<never> | undefined
14
13
  /** Optional minimum log level for the runtime. */
15
14
  logLevel?: LogLevel.LogLevel | undefined
16
15
  }
17
-
18
- /**
19
- * Common defaults for resolving a logger configuration.
20
- * - `threadName` is used by the default pretty logger when `logger` is not provided.
21
- * - `mode` selects pretty logger mode (e.g. 'browser' for web workers).
22
- * - `defaultLogLevel` is used when `logLevel` is not provided.
23
- */
24
- export type LoggerDefaults = {
25
- threadName?: string
26
- mode?: 'tty' | 'browser'
27
- defaultLogLevel?: LogLevel.LogLevel
28
- /** Optional default logger layer to use when `config.logger` is not provided. */
29
- defaultLogger?: Layer.Layer<never>
30
- }
31
-
32
- /**
33
- * Resolve the logger layer to provide to the Effect runtime.
34
- */
35
- export const resolveLoggerLayer = (config?: WithLoggerOptions, defaults?: LoggerDefaults): Layer.Layer<never> => {
36
- if (config?.logger !== undefined) return config.logger
37
- if (defaults?.defaultLogger !== undefined) return defaults.defaultLogger
38
- const threadName = defaults?.threadName ?? 'livestore'
39
- const mode = defaults?.mode
40
- return Logger.prettyWithThread(threadName, mode !== undefined ? { mode } : {})
41
- }
42
-
43
- /**
44
- * Resolve the minimum log level, falling back to `defaults.defaultLogLevel` then `LogLevel.Debug`.
45
- */
46
- export const resolveLogLevel = (config?: WithLoggerOptions, defaults?: LoggerDefaults): LogLevel.LogLevel => {
47
- if (config?.logLevel !== undefined) return config.logLevel
48
- if (defaults?.defaultLogLevel !== undefined) return defaults.defaultLogLevel
49
- return isDevEnv() === true ? LogLevel.Debug : LogLevel.Info
50
- }
51
-
52
- /**
53
- * Wrap an effect by applying the resolved minimum log level and providing the resolved logger layer.
54
- */
55
- export const withLoggerConfig = <TEnv, TError, TOut>(
56
- config?: WithLoggerOptions,
57
- defaults?: LoggerDefaults,
58
- ): ((effect: Effect.Effect<TOut, TError, TEnv>) => Effect.Effect<TOut, TError, TEnv>) => {
59
- const level = resolveLogLevel(config, defaults)
60
- const layer = resolveLoggerLayer(config, defaults)
61
- return (effect) => effect.pipe(Logger.withMinimumLogLevel(level), Effect.provide(layer))
62
- }
@@ -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 {
@@ -51,9 +50,10 @@ export const makeClientSession = <R>({
51
50
  origin: string | undefined
52
51
  }): Effect.Effect<ClientSession, never, Scope.Scope | R> =>
53
52
  Effect.gen(function* () {
54
- const devtools: ClientSession['devtools'] = devtoolsEnabled === true
55
- ? { enabled: true, pullLatch: yield* Effect.makeLatch(true), pushLatch: yield* Effect.makeLatch(true) }
56
- : { 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 }
57
57
 
58
58
  if (devtoolsEnabled === true) {
59
59
  yield* Effect.gen(function* () {
@@ -116,7 +116,7 @@ export const makeClientSession = <R>({
116
116
  yield* connectDevtoolsToStore(clientSessionDevtoolsChannel)
117
117
  },
118
118
  Effect.tapCauseLogPretty,
119
- Effect.forkScoped,
119
+ Effect.forkScoped(),
120
120
  ),
121
121
  ),
122
122
  Stream.runDrain,
@@ -1,8 +1,7 @@
1
- import { isDevEnv, isNil, isReadonlyArray } from '@livestore/utils'
2
- import { Hash, Option, Schema } from '@livestore/utils/effect'
1
+ import { isDevEnv } from '@livestore/utils'
2
+ import { Hash, Option, Predicate, ReadonlyArray, Schema } from '@livestore/utils/effect'
3
3
 
4
4
  import type { SqliteDb } from './adapter-types.ts'
5
- import { SessionIdSymbol } from './adapter-types.ts'
6
5
  import type { EventDef, Materializer, MaterializerContextQuery, MaterializerResult } from './schema/EventDef/mod.ts'
7
6
  import type * as LiveStoreEvent from './schema/LiveStoreEvent/mod.ts'
8
7
  import type { LiveStoreSchema } from './schema/schema.ts'
@@ -39,9 +38,10 @@ export const getExecStatementsFromMaterializer = ({
39
38
  }
40
39
  : event.decoded
41
40
 
42
- const eventArgsEncoded = isNil(event.decoded?.args) === true
43
- ? undefined
44
- : Schema.encodeUnknownSync(eventDef.schema)(event.decoded.args)
41
+ const eventArgsEncoded =
42
+ Predicate.isNotUndefined(event.decoded) === true && Predicate.isNotNullish(event.decoded.args) === true
43
+ ? Schema.encodeUnknownSync(eventDef.schema)(event.decoded.args)
44
+ : undefined
45
45
 
46
46
  const query: MaterializerContextQuery = (
47
47
  rawQueryOrQueryBuilder:
@@ -126,7 +126,7 @@ const fromMaterializerResult = (
126
126
  bindValues: BindValues
127
127
  writeTables: ReadonlySet<string> | undefined
128
128
  }> => {
129
- if (isReadonlyArray(materializerResult) === true) {
129
+ if (ReadonlyArray.isArray<MaterializerResult | ReadonlyArray<MaterializerResult>>(materializerResult) === true) {
130
130
  return materializerResult.flatMap(fromMaterializerResult)
131
131
  }
132
132
  if (isQueryBuilder(materializerResult) === true) {
@@ -144,32 +144,3 @@ const fromMaterializerResult = (
144
144
  ]
145
145
  }
146
146
  }
147
-
148
- // NOTE we should explore whether there is a more elegant solution
149
- // e.g. by leveraging the schema to replace the sessionIdSymbol
150
- export const replaceSessionIdSymbol = (
151
- bindValues: Record<string, unknown> | ReadonlyArray<unknown>,
152
- sessionId: string,
153
- ) => {
154
- deepReplaceValue(bindValues, SessionIdSymbol, sessionId)
155
- }
156
-
157
- const deepReplaceValue = <S, R>(input: any, searchValue: S, replaceValue: R): void => {
158
- if (Array.isArray(input) === true) {
159
- for (const i in input) {
160
- if (input[i] === searchValue) {
161
- input[i] = replaceValue
162
- } else {
163
- deepReplaceValue(input[i], searchValue, replaceValue)
164
- }
165
- }
166
- } else if (typeof input === 'object' && input !== null) {
167
- for (const key in input) {
168
- if (input[key] === searchValue) {
169
- input[key] = replaceValue
170
- } else {
171
- deepReplaceValue(input[key], searchValue, replaceValue)
172
- }
173
- }
174
- }
175
- }
package/src/otel.ts CHANGED
@@ -1,26 +1,25 @@
1
1
  import * as otel from '@opentelemetry/api'
2
2
 
3
3
  import { makeNoopTracer } from '@livestore/utils'
4
+ import type { Tracer } from '@livestore/utils/effect'
4
5
  import { Effect, identity, Layer, OtelTracer } from '@livestore/utils/effect'
5
6
 
6
7
  export const OtelLiveDummy: Layer.Layer<OtelTracer.OtelTracer> = Layer.suspend(() => {
7
8
  const OtelTracerLive = Layer.succeed(OtelTracer.OtelTracer, makeNoopTracer())
8
9
 
9
- const TracingLive = Layer.unwrapEffect(Effect.map(OtelTracer.make, Layer.setTracer)).pipe(
10
- Layer.provideMerge(OtelTracerLive),
11
- )
10
+ const TracingLive = OtelTracer.layerWithoutOtelTracer.pipe(Layer.provideMerge(OtelTracerLive))
12
11
 
13
12
  return TracingLive
14
13
  })
15
14
 
16
15
  export const provideOtel =
17
16
  ({ otelTracer, parentSpanContext }: { otelTracer?: otel.Tracer; parentSpanContext?: otel.Context }) =>
18
- <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, Exclude<R, OtelTracer.OtelTracer>> => {
17
+ <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, Exclude<R, OtelTracer.OtelTracer | Tracer.Tracer>> => {
19
18
  const OtelTracerLive = Layer.succeed(OtelTracer.OtelTracer, otelTracer ?? makeNoopTracer())
20
19
 
21
- const TracingLive = Layer.unwrapEffect(Effect.map(OtelTracer.make, Layer.setTracer)).pipe(
20
+ const TracingLive = OtelTracer.layerWithoutOtelTracer.pipe(
22
21
  Layer.provideMerge(OtelTracerLive),
23
- ) as any as Layer.Layer<OtelTracer.OtelTracer>
22
+ ) as any as Layer.Layer<OtelTracer.OtelTracer | Tracer.Tracer>
24
23
 
25
24
  return effect.pipe(
26
25
  parentSpanContext !== undefined
@@ -29,11 +28,3 @@ export const provideOtel =
29
28
  Effect.provide(TracingLive),
30
29
  )
31
30
  }
32
-
33
- export const getDurationMsFromSpan = (span: otel.Span): number => {
34
- const durationHr: [seconds: number, nanos: number] = (span as any)._duration
35
- return durationHr[0] * 1000 + durationHr[1] / 1_000_000
36
- }
37
-
38
- export const getStartTimeHighResFromSpan = (span: otel.Span): DOMHighResTimeStamp =>
39
- (span as any)._performanceStartTime as DOMHighResTimeStamp