@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,7 +1,7 @@
1
1
  /**
2
2
  * Push validation errors returned by {@link LeaderSyncProcessor.push}.
3
3
  *
4
- * All three errors share a common {@link RejectedPushErrorTypeId} so consumers can catch the
4
+ * All errors share a common {@link RejectedPushErrorTypeId} so consumers can catch the
5
5
  * family as a group via {@link isRejectedPushError} instead of matching individual tags.
6
6
  * Recovery is the same in every case: the client should rebase and retry.
7
7
  *
@@ -23,19 +23,16 @@ export const RejectedPushErrorTypeId = '~@livestore/common/RejectedPushError' as
23
23
  */
24
24
  export class NonMonotonicBatchError extends Schema.TaggedError<NonMonotonicBatchError>(
25
25
  `${RejectedPushErrorTypeId}/NonMonotonicBatchError`,
26
- )(
27
- 'NonMonotonicBatchError',
28
- {
29
- /** The sequence number that broke the monotonic invariant (i.e. the one that is >= the next). */
30
- precedingSeqNum: EventSequenceNumber.Client.Composite,
31
- /** The sequence number that was expected to be greater than `precedingSeqNum`. */
32
- violatingSeqNum: EventSequenceNumber.Client.Composite,
33
- /** The index in the batch where the violation occurred. */
34
- violationIndex: Schema.Number,
35
- /** The session that produced the malformed batch. */
36
- sessionId: Schema.String,
37
- },
38
- ) {
26
+ )('NonMonotonicBatchError', {
27
+ /** The sequence number that broke the monotonic invariant (i.e. the one that is >= the next). */
28
+ precedingSeqNum: EventSequenceNumber.Client.Composite,
29
+ /** The sequence number that was expected to be greater than `precedingSeqNum`. */
30
+ violatingSeqNum: EventSequenceNumber.Client.Composite,
31
+ /** The index in the batch where the violation occurred. */
32
+ violationIndex: Schema.Finite,
33
+ /** The session that produced the malformed batch. */
34
+ sessionId: Schema.String,
35
+ }) {
39
36
  readonly [RejectedPushErrorTypeId] = RejectedPushErrorTypeId
40
37
 
41
38
  override get message(): string {
@@ -43,6 +40,24 @@ export class NonMonotonicBatchError extends Schema.TaggedError<NonMonotonicBatch
43
40
  }
44
41
  }
45
42
 
43
+ /** A pushed batch skips an event required to connect it to the leader's admitted push prefix. */
44
+ export class NonContiguousBatchError extends Schema.TaggedError<NonContiguousBatchError>(
45
+ `${RejectedPushErrorTypeId}/NonContiguousBatchError`,
46
+ )('NonContiguousBatchError', {
47
+ expectedSeqNum: EventSequenceNumber.Client.Composite,
48
+ providedSeqNum: EventSequenceNumber.Client.Composite,
49
+ expectedParentSeqNum: EventSequenceNumber.Client.Composite,
50
+ providedParentSeqNum: EventSequenceNumber.Client.Composite,
51
+ violationIndex: Schema.Finite,
52
+ sessionId: Schema.String,
53
+ }) {
54
+ readonly [RejectedPushErrorTypeId] = RejectedPushErrorTypeId
55
+
56
+ override get message(): string {
57
+ return `Pushed events are not contiguous at index ${this.violationIndex} (session ${this.sessionId}): expected ${EventSequenceNumber.Client.toString(this.expectedSeqNum)} after ${EventSequenceNumber.Client.toString(this.expectedParentSeqNum)}, got ${EventSequenceNumber.Client.toString(this.providedSeqNum)} after ${EventSequenceNumber.Client.toString(this.providedParentSeqNum)}`
58
+ }
59
+ }
60
+
46
61
  /**
47
62
  * A pushed batch of events failed validation because its rebase generation is older than the leader's current rebase generation.
48
63
  *
@@ -52,17 +67,14 @@ export class NonMonotonicBatchError extends Schema.TaggedError<NonMonotonicBatch
52
67
  */
53
68
  export class StaleRebaseGenerationError extends Schema.TaggedError<StaleRebaseGenerationError>(
54
69
  `${RejectedPushErrorTypeId}/StaleRebaseGenerationError`,
55
- )(
56
- 'StaleRebaseGenerationError',
57
- {
58
- /** The leader's current rebase generation. */
59
- currentRebaseGeneration: Schema.Number,
60
- /** The rebase generation carried by the dropped events. */
61
- providedRebaseGeneration: Schema.Number,
62
- /** The session that produced the stale batch. */
63
- sessionId: Schema.String,
64
- },
65
- ) {
70
+ )('StaleRebaseGenerationError', {
71
+ /** The leader's current rebase generation. */
72
+ currentRebaseGeneration: Schema.Finite,
73
+ /** The rebase generation carried by the dropped events. */
74
+ providedRebaseGeneration: Schema.Finite,
75
+ /** The session that produced the stale batch. */
76
+ sessionId: Schema.String,
77
+ }) {
66
78
  readonly [RejectedPushErrorTypeId] = RejectedPushErrorTypeId
67
79
 
68
80
  override get message(): string {
@@ -94,11 +106,12 @@ export class LeaderAheadError extends Schema.TaggedError<LeaderAheadError>(
94
106
  }
95
107
  }
96
108
 
97
- export const RejectedPushError = Schema.Union(
109
+ export const RejectedPushError = Schema.Union([
98
110
  LeaderAheadError,
111
+ NonContiguousBatchError,
99
112
  NonMonotonicBatchError,
100
113
  StaleRebaseGenerationError,
101
- )
114
+ ])
102
115
 
103
116
  export type RejectedPushError = typeof RejectedPushError.Type
104
117
 
@@ -83,14 +83,18 @@ export const execSql = (sqliteDb: SqliteDb, sql: string, bind: BindValues) => {
83
83
  )
84
84
  }
85
85
 
86
- // const selectSqlPrepared = <T>(stmt: PreparedStatement, bind: BindValues) => {
87
- // const bindValues = prepareBindValues(bind, stmt.sql)
88
- // return Effect.try({
89
- // try: () => stmt.select<T>(bindValues),
90
- // catch: (cause) =>
91
- // new SqliteError({ cause, query: { bindValues, sql: stmt.sql }, code: (cause as WaSqlite.SQLiteError).code }),
92
- // })
93
- // }
86
+ export const selectSql = <T>(sqliteDb: SqliteDb, sql: string, bind: BindValues) => {
87
+ const bindValues = prepareBindValues(bind, sql)
88
+ return Effect.try({
89
+ try: () => sqliteDb.select<T>(sql, bindValues),
90
+ catch: (cause) =>
91
+ new SqliteError({ cause, query: { bindValues, sql }, code: (cause as WaSqlite.SQLiteError).code }),
92
+ }).pipe(
93
+ Effect.withSpan(`@livestore/common:selectSql`, {
94
+ attributes: { 'span.label': sql, sql, bindValueKeys: Object.keys(bindValues) },
95
+ }),
96
+ )
97
+ }
94
98
 
95
99
  // TODO actually use prepared statements
96
100
  export const execSqlPrepared = (sqliteDb: SqliteDb, sql: string, bindValues: PreparedBindValues) => {
@@ -1,5 +1,5 @@
1
1
  import { LS_DEV, shouldNeverHappen } from '@livestore/utils'
2
- import { Chunk, Effect, Option, Schema } from '@livestore/utils/effect'
2
+ import { Effect, Option, Schema } from '@livestore/utils/effect'
3
3
 
4
4
  import type { SqliteDb } from '../adapter-types.ts'
5
5
  import { migrateTable } from '../schema-management/migrations.ts'
@@ -107,7 +107,7 @@ export const getEventsFromEventlog = ({
107
107
  }: {
108
108
  dbEventlog: SqliteDb
109
109
  options: StreamEventsOptions
110
- }): Effect.Effect<Chunk.Chunk<LiveStoreEvent.Client.Encoded>> =>
110
+ }): Effect.Effect<ReadonlyArray<LiveStoreEvent.Client.Encoded>> =>
111
111
  Effect.gen(function* () {
112
112
  const since = options.since ?? EventSequenceNumber.Client.ROOT
113
113
  const batchSize = options.batchSize ?? STREAM_EVENTS_BATCH_SIZE_DEFAULT
@@ -146,7 +146,7 @@ export const getEventsFromEventlog = ({
146
146
  const eventlogEvents = yield* Effect.sync(() => dbEventlog.select(makeQuery()))
147
147
 
148
148
  if (eventlogEvents.length === 0) {
149
- return Chunk.empty<LiveStoreEvent.Client.Encoded>()
149
+ return []
150
150
  }
151
151
 
152
152
  const spanAttributes = {
@@ -174,7 +174,7 @@ export const getEventsFromEventlog = ({
174
174
  })
175
175
  })
176
176
 
177
- return Chunk.fromIterable(encodedEvents)
177
+ return encodedEvents
178
178
  }).pipe(Effect.withSpan('@livestore/common:eventlog:getEventsFromEventlog', { attributes: spanAttributes }))
179
179
  })
180
180
 
@@ -201,7 +201,7 @@ export const updateBackendHead = (dbEventlog: SqliteDb, head: EventSequenceNumbe
201
201
  dbEventlog.execute(sql`UPDATE ${SYNC_STATUS_TABLE} SET head = ${head.global}`)
202
202
 
203
203
  export const getBackendIdFromDb = (dbEventlog: SqliteDb): Option.Option<string> =>
204
- Option.fromNullable(
204
+ Option.fromNullishOr(
205
205
  dbEventlog.select<{ backendId: string | null }>(sql`select backendId from ${SYNC_STATUS_TABLE}`)[0]?.backendId,
206
206
  )
207
207
 
@@ -258,9 +258,13 @@ export const insertIntoEventlog = (
258
258
  })
259
259
 
260
260
  export const updateSyncMetadata = (items: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>) =>
261
- Effect.gen(function* () {
262
- const { dbEventlog } = yield* LeaderThreadCtx
261
+ LeaderThreadCtx.pipe(Effect.flatMap(({ dbEventlog }) => updateSyncMetadataForDb(dbEventlog, items)))
263
262
 
263
+ export const updateSyncMetadataForDb = (
264
+ dbEventlog: SqliteDb,
265
+ items: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>,
266
+ ) =>
267
+ Effect.gen(function* () {
264
268
  // TODO try to do this in a single query
265
269
  for (let i = 0; i < items.length; i++) {
266
270
  const event = items[i]!
@@ -277,21 +281,25 @@ export const updateSyncMetadata = (items: ReadonlyArray<LiveStoreEvent.Client.En
277
281
  }
278
282
  })
279
283
 
280
- export const getSyncBackendCursorInfo = ({ remoteHead }: { remoteHead: EventSequenceNumber.Global.Type }) =>
281
- Effect.gen(function* () {
282
- const { dbEventlog } = yield* LeaderThreadCtx
284
+ export const getSyncBackendCursorInfo = (args: { remoteHead: EventSequenceNumber.Global.Type }) =>
285
+ LeaderThreadCtx.pipe(Effect.flatMap(({ dbEventlog }) => getSyncBackendCursorInfoForDb(dbEventlog, args)))
283
286
 
287
+ export const getSyncBackendCursorInfoForDb = (
288
+ dbEventlog: SqliteDb,
289
+ { remoteHead }: { remoteHead: EventSequenceNumber.Global.Type },
290
+ ) =>
291
+ Effect.gen(function* () {
284
292
  if (remoteHead === EventSequenceNumber.Client.ROOT.global) return Option.none()
285
293
 
286
294
  const EventlogQuerySchema = Schema.Struct({
287
- syncMetadataJson: Schema.parseJson(Schema.Option(Schema.JsonValue)),
295
+ syncMetadataJson: Schema.fromJsonString(Schema.toCodecJson(Schema.Option(Schema.Json))),
288
296
  }).pipe(Schema.pluck('syncMetadataJson'), Schema.Array, Schema.head)
289
297
 
290
298
  const syncMetadataOption = yield* Effect.sync(() =>
291
299
  dbEventlog.select<{ syncMetadataJson: string }>(
292
300
  sql`SELECT syncMetadataJson FROM ${EVENTLOG_META_TABLE} WHERE seqNumGlobal = ${remoteHead} ORDER BY seqNumClient ASC LIMIT 1`,
293
301
  ),
294
- ).pipe(Effect.andThen(Schema.decode(EventlogQuerySchema)), Effect.map(Option.flatten), Effect.orDie)
302
+ ).pipe(Effect.andThen(Schema.decodeEffect(EventlogQuerySchema)), Effect.map(Option.flatten), Effect.orDie)
295
303
 
296
304
  return Option.some({
297
305
  eventSequenceNumber: remoteHead,
@@ -1,4 +1,4 @@
1
- import { Effect, FiberMap, Option, Stream, SubscriptionRef } from '@livestore/utils/effect'
1
+ import { Cause, Effect, FiberMap, Option, Stream, SubscriptionRef } from '@livestore/utils/effect'
2
2
  import { nanoid } from '@livestore/utils/nanoid'
3
3
 
4
4
  import {
@@ -18,7 +18,8 @@ type SendMessageToDevtools = (message: Devtools.Leader.MessageFromApp) => Effect
18
18
 
19
19
  /**
20
20
  * Type guard for DevtoolsViteNotInstalledError.
21
- * This error is defined in @livestore/adapter-node but we need to handle it here.
21
+ * Adapter-specific devtools boot implementations may surface this tagged error;
22
+ * common handles it structurally to keep devtools startup environment-agnostic.
22
23
  */
23
24
  const isDevtoolsViteNotInstalledError = (
24
25
  error: unknown,
@@ -41,13 +42,13 @@ export const bootDevtools = Effect.fn('@livestore/common:leader-thread:devtools:
41
42
  }).pipe(Effect.tapCauseLogPretty, Effect.forkScoped)
42
43
 
43
44
  const bootResult = yield* options.boot.pipe(
44
- Effect.map(Option.some),
45
+ Effect.asSome,
45
46
  Effect.catchIf(isDevtoolsViteNotInstalledError, (error) =>
46
47
  Effect.logWarning(`[@livestore/devtools] ${error.message} Devtools will be disabled.`).pipe(
47
48
  Effect.as(Option.none()),
48
49
  ),
49
50
  ),
50
- Effect.catchAllCause((cause) =>
51
+ Effect.catchCause((cause) =>
51
52
  Effect.logWarning(
52
53
  `[@livestore/devtools] Failed to start devtools server. Devtools will be disabled.`,
53
54
  cause,
@@ -80,7 +81,7 @@ export const bootDevtools = Effect.fn('@livestore/common:leader-thread:devtools:
80
81
  .pipe(
81
82
  Effect.withSpan('@livestore/common:leader-thread:devtools:sendToDevtools'),
82
83
  Effect.interruptible,
83
- Effect.ignoreLogged,
84
+ Effect.ignore,
84
85
  )
85
86
 
86
87
  const syncState = yield* syncProcessor.syncState
@@ -92,7 +93,7 @@ export const bootDevtools = Effect.fn('@livestore/common:leader-thread:devtools:
92
93
  )
93
94
 
94
95
  yield* listenToDevtools({
95
- incomingMessages: channel.listen.pipe(Stream.flatten(), Stream.orDie),
96
+ incomingMessages: channel.listen.pipe(Stream.mapEffect(Effect.fromResult), Stream.orDie),
96
97
  sendMessage,
97
98
  persistenceInfo,
98
99
  })
@@ -181,7 +182,9 @@ const listenToDevtools = ({
181
182
  appVersion: liveStoreVersion,
182
183
  receivedVersion: decodedEvent.liveStoreVersion,
183
184
  appDevtoolsProtocolVersion: devtoolsProtocolVersion,
184
- receivedDevtoolsProtocolVersion: resolveDevtoolsProtocolVersion(decodedEvent.devtoolsProtocolVersion),
185
+ receivedDevtoolsProtocolVersion: resolveDevtoolsProtocolVersion(
186
+ decodedEvent.devtoolsProtocolVersion,
187
+ ),
185
188
  }),
186
189
  )
187
190
  return
@@ -204,10 +207,13 @@ const listenToDevtools = ({
204
207
  Effect.sync(() => db.close()),
205
208
  ).pipe(
206
209
  Effect.flatMap((db) =>
207
- Effect.try(() => {
208
- db.import(data)
209
- const rows = db.select<{ name: string }>(`select name from sqlite_master where type = 'table'`)
210
- return new Set(rows.map((r) => r.name))
210
+ Effect.try({
211
+ try: () => {
212
+ db.import(data)
213
+ const rows = db.select<{ name: string }>(`select name from sqlite_master where type = 'table'`)
214
+ return new Set(rows.map((r) => r.name))
215
+ },
216
+ catch: (cause) => new Cause.UnknownError(cause),
211
217
  }),
212
218
  ),
213
219
  )
@@ -217,10 +223,16 @@ const listenToDevtools = ({
217
223
  if (tableNames.has(SystemTables.EVENTLOG_META_TABLE) === true) {
218
224
  databaseKind = 'eventlog'
219
225
  yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
220
- yield* Effect.try(() => dbEventlog.import(data))
226
+ yield* Effect.try({
227
+ try: () => dbEventlog.import(data),
228
+ catch: (cause) => new Cause.UnknownError(cause),
229
+ })
221
230
 
222
231
  if (batchId === undefined) {
223
- yield* Effect.try(() => dbState.destroy())
232
+ yield* Effect.try({
233
+ try: () => dbState.destroy(),
234
+ catch: (cause) => new Cause.UnknownError(cause),
235
+ })
224
236
  }
225
237
  } else if (
226
238
  tableNames.has(SystemTables.SCHEMA_META_TABLE) === true &&
@@ -228,10 +240,16 @@ const listenToDevtools = ({
228
240
  ) {
229
241
  databaseKind = 'state'
230
242
  yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
231
- yield* Effect.try(() => dbState.import(data))
243
+ yield* Effect.try({
244
+ try: () => dbState.import(data),
245
+ catch: (cause) => new Cause.UnknownError(cause),
246
+ })
232
247
 
233
248
  if (batchId === undefined) {
234
- yield* Effect.try(() => dbEventlog.destroy())
249
+ yield* Effect.try({
250
+ try: () => dbEventlog.destroy(),
251
+ catch: (cause) => new Cause.UnknownError(cause),
252
+ })
235
253
  }
236
254
  } else {
237
255
  return yield* Effect.fail({ _tag: 'unsupported-database' } as const)
@@ -261,9 +279,9 @@ const listenToDevtools = ({
261
279
  }),
262
280
  ),
263
281
  ),
264
- Effect.catchAll((cause) =>
282
+ Effect.catch((cause) =>
265
283
  Effect.logWarning('Error importing database file', cause).pipe(
266
- Effect.zipRight(
284
+ Effect.andThen(
267
285
  sendMessage(
268
286
  Devtools.Leader.LoadDatabaseFile.Error.make({
269
287
  ...reqPayload,
@@ -339,7 +357,7 @@ const listenToDevtools = ({
339
357
  // TODO consider piggybacking on the existing leader-thread sync-pulling
340
358
  yield* syncBackend.pull(Option.none(), { live: true }).pipe(
341
359
  Stream.map((_) => _.batch),
342
- Stream.flattenIterables,
360
+ Stream.flattenIterable,
343
361
  Stream.tap(({ eventEncoded, metadata }) =>
344
362
  sendMessage(
345
363
  Devtools.Leader.SyncHistoryRes.make({
@@ -388,9 +406,9 @@ const listenToDevtools = ({
388
406
  yield* Effect.sleep(1000)
389
407
 
390
408
  yield* Stream.zipLatest(
391
- syncBackend.isConnected.changes,
409
+ SubscriptionRef.changes(syncBackend.isConnected),
392
410
  devtools.enabled === true
393
- ? devtools.syncBackendLatchState.changes
411
+ ? SubscriptionRef.changes(devtools.syncBackendLatchState)
394
412
  : Stream.make({ latchClosed: false }),
395
413
  ).pipe(
396
414
  Stream.tap(([isConnected, { latchClosed }]) =>
@@ -1,5 +1,5 @@
1
1
  import { Vitest } from '@livestore/utils-dev/node-vitest'
2
- import { Effect, Stream, SubscriptionRef } from '@livestore/utils/effect'
2
+ import { Effect, Fiber, Latch, Stream, SubscriptionRef } from '@livestore/utils/effect'
3
3
 
4
4
  import { makeMockSyncBackend } from '../sync/mock-sync-backend.ts'
5
5
  import type { SyncBackend } from '../sync/sync.ts'
@@ -7,7 +7,7 @@ import { makeNetworkStatusSubscribable } from './make-leader-thread-layer.ts'
7
7
  import type { DevtoolsContext } from './types.ts'
8
8
 
9
9
  Vitest.describe('makeNetworkStatusSubscribable', () => {
10
- Vitest.scopedLive('tracks sync backend connectivity and devtools latch state', () =>
10
+ Vitest.live('tracks sync backend connectivity and devtools latch state', () =>
11
11
  Effect.gen(function* () {
12
12
  const mockBackend = yield* makeMockSyncBackend({ startConnected: false })
13
13
  const syncBackend = yield* mockBackend.makeSyncBackend
@@ -15,7 +15,7 @@ Vitest.describe('makeNetworkStatusSubscribable', () => {
15
15
 
16
16
  const devtoolsContext: DevtoolsContext = {
17
17
  enabled: true,
18
- syncBackendLatch: yield* Effect.makeLatch(true),
18
+ syncBackendLatch: yield* Latch.make(true),
19
19
  syncBackendLatchState: latchStateRef,
20
20
  }
21
21
 
@@ -26,17 +26,17 @@ Vitest.describe('makeNetworkStatusSubscribable', () => {
26
26
  Vitest.expect(initial.devtools.latchClosed).toBe(false)
27
27
 
28
28
  const waitFor = (predicate: (status: SyncBackend.NetworkStatus) => boolean) =>
29
- networkStatus.changes.pipe(Stream.filter(predicate), Stream.runHead, Effect.flatten)
29
+ networkStatus.changes.pipe(Stream.filter(predicate), Stream.runFirstUnsafe)
30
30
 
31
31
  const onlineFiber = yield* waitFor((status) => status.isConnected).pipe(Effect.forkScoped)
32
32
  yield* mockBackend.connect
33
- const online = yield* onlineFiber
33
+ const online = yield* Fiber.join(onlineFiber)
34
34
  Vitest.expect(online.isConnected).toBe(true)
35
- Vitest.expect(online.timestampMs).toBeGreaterThan(initial.timestampMs)
35
+ Vitest.expect(online.timestampMs).toBeGreaterThanOrEqual(initial.timestampMs)
36
36
 
37
37
  const latchedFiber = yield* waitFor((status) => status.devtools.latchClosed).pipe(Effect.forkScoped)
38
38
  yield* SubscriptionRef.set(latchStateRef, { latchClosed: true })
39
- const latched = yield* latchedFiber
39
+ const latched = yield* Fiber.join(latchedFiber)
40
40
  Vitest.expect(latched.devtools.latchClosed).toBe(true)
41
41
  Vitest.expect(latched.timestampMs).toBeGreaterThanOrEqual(online.timestampMs)
42
42
  }),