@livestore/common 0.4.0-dev.2 → 0.4.0-dev.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (465) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +20 -12
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
  5. package/dist/adapter-types.d.ts +14 -6
  6. package/dist/adapter-types.d.ts.map +1 -1
  7. package/dist/adapter-types.js.map +1 -1
  8. package/dist/debug-info.d.ts.map +1 -1
  9. package/dist/debug-info.js +33 -6
  10. package/dist/debug-info.js.map +1 -1
  11. package/dist/devtools/devtools-messages-client-session.d.ts +28 -23
  12. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  13. package/dist/devtools/devtools-messages-client-session.js +2 -2
  14. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  15. package/dist/devtools/devtools-messages-common.d.ts +7 -14
  16. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  17. package/dist/devtools/devtools-messages-common.js +1 -6
  18. package/dist/devtools/devtools-messages-common.js.map +1 -1
  19. package/dist/devtools/devtools-messages-leader.d.ts +38 -29
  20. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  21. package/dist/devtools/devtools-messages-leader.js +9 -8
  22. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  23. package/dist/devtools/devtools-sessioninfo.d.ts +14 -2
  24. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  25. package/dist/devtools/devtools-sessioninfo.js +7 -4
  26. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  27. package/dist/devtools/mod.d.ts +13 -2
  28. package/dist/devtools/mod.d.ts.map +1 -1
  29. package/dist/devtools/mod.js +10 -3
  30. package/dist/devtools/mod.js.map +1 -1
  31. package/dist/errors.d.ts +52 -10
  32. package/dist/errors.d.ts.map +1 -1
  33. package/dist/errors.js +25 -6
  34. package/dist/errors.js.map +1 -1
  35. package/dist/index.d.ts +2 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +2 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/leader-thread/LeaderSyncProcessor.d.ts +41 -4
  40. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  41. package/dist/leader-thread/LeaderSyncProcessor.js +158 -75
  42. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  43. package/dist/leader-thread/eventlog.d.ts +21 -22
  44. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  45. package/dist/leader-thread/eventlog.js +77 -20
  46. package/dist/leader-thread/eventlog.js.map +1 -1
  47. package/dist/leader-thread/leader-worker-devtools.d.ts +2 -2
  48. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  49. package/dist/leader-thread/leader-worker-devtools.js +56 -45
  50. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  51. package/dist/leader-thread/make-leader-thread-layer.d.ts +6 -6
  52. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  53. package/dist/leader-thread/make-leader-thread-layer.js +79 -27
  54. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  55. package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
  56. package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
  57. package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
  58. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
  59. package/dist/leader-thread/materialize-event.d.ts +3 -3
  60. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  61. package/dist/leader-thread/materialize-event.js +25 -11
  62. package/dist/leader-thread/materialize-event.js.map +1 -1
  63. package/dist/leader-thread/mod.d.ts +1 -0
  64. package/dist/leader-thread/mod.d.ts.map +1 -1
  65. package/dist/leader-thread/mod.js +1 -0
  66. package/dist/leader-thread/mod.js.map +1 -1
  67. package/dist/leader-thread/recreate-db.d.ts +2 -3
  68. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  69. package/dist/leader-thread/recreate-db.js +5 -5
  70. package/dist/leader-thread/recreate-db.js.map +1 -1
  71. package/dist/leader-thread/shutdown-channel.d.ts +2 -2
  72. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  73. package/dist/leader-thread/shutdown-channel.js +2 -2
  74. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  75. package/dist/leader-thread/stream-events.d.ts +56 -0
  76. package/dist/leader-thread/stream-events.d.ts.map +1 -0
  77. package/dist/leader-thread/stream-events.js +166 -0
  78. package/dist/leader-thread/stream-events.js.map +1 -0
  79. package/dist/leader-thread/types.d.ts +98 -20
  80. package/dist/leader-thread/types.d.ts.map +1 -1
  81. package/dist/leader-thread/types.js +13 -0
  82. package/dist/leader-thread/types.js.map +1 -1
  83. package/dist/logging.d.ts +40 -0
  84. package/dist/logging.d.ts.map +1 -0
  85. package/dist/logging.js +33 -0
  86. package/dist/logging.js.map +1 -0
  87. package/dist/make-client-session.d.ts +5 -3
  88. package/dist/make-client-session.d.ts.map +1 -1
  89. package/dist/make-client-session.js +5 -2
  90. package/dist/make-client-session.js.map +1 -1
  91. package/dist/materializer-helper.d.ts +6 -6
  92. package/dist/materializer-helper.d.ts.map +1 -1
  93. package/dist/materializer-helper.js +20 -4
  94. package/dist/materializer-helper.js.map +1 -1
  95. package/dist/otel.d.ts +2 -1
  96. package/dist/otel.d.ts.map +1 -1
  97. package/dist/otel.js +5 -0
  98. package/dist/otel.js.map +1 -1
  99. package/dist/rematerialize-from-eventlog.d.ts +2 -2
  100. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  101. package/dist/rematerialize-from-eventlog.js +29 -20
  102. package/dist/rematerialize-from-eventlog.js.map +1 -1
  103. package/dist/schema/EventDef/define.d.ts +147 -0
  104. package/dist/schema/EventDef/define.d.ts.map +1 -0
  105. package/dist/schema/EventDef/define.js +139 -0
  106. package/dist/schema/EventDef/define.js.map +1 -0
  107. package/dist/schema/EventDef/event-def.d.ts +106 -0
  108. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  109. package/dist/schema/EventDef/event-def.js +2 -0
  110. package/dist/schema/EventDef/event-def.js.map +1 -0
  111. package/dist/schema/EventDef/facts.d.ts +118 -0
  112. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  113. package/dist/schema/EventDef/facts.js +53 -0
  114. package/dist/schema/EventDef/facts.js.map +1 -0
  115. package/dist/schema/EventDef/materializer.d.ts +155 -0
  116. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  117. package/dist/schema/EventDef/materializer.js +83 -0
  118. package/dist/schema/EventDef/materializer.js.map +1 -0
  119. package/dist/schema/EventDef/mod.d.ts +5 -0
  120. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  121. package/dist/schema/EventDef/mod.js +5 -0
  122. package/dist/schema/EventDef/mod.js.map +1 -0
  123. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  124. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  125. package/dist/schema/EventSequenceNumber/client.js +193 -0
  126. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  127. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  128. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  129. package/dist/schema/EventSequenceNumber/global.js +14 -0
  130. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  131. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  132. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  133. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  134. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  135. package/dist/schema/EventSequenceNumber.test.js +43 -43
  136. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  137. package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +89 -106
  138. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  139. package/dist/schema/{LiveStoreEvent.js → LiveStoreEvent/client.js} +74 -58
  140. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  141. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  142. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  143. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  144. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  145. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  146. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  147. package/dist/schema/LiveStoreEvent/global.js +31 -0
  148. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  149. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  150. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  151. package/dist/schema/LiveStoreEvent/input.js +26 -0
  152. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  153. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  154. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  155. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  156. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  157. package/dist/schema/events.d.ts +1 -1
  158. package/dist/schema/events.d.ts.map +1 -1
  159. package/dist/schema/events.js +1 -1
  160. package/dist/schema/events.js.map +1 -1
  161. package/dist/schema/mod.d.ts +6 -4
  162. package/dist/schema/mod.d.ts.map +1 -1
  163. package/dist/schema/mod.js +5 -4
  164. package/dist/schema/mod.js.map +1 -1
  165. package/dist/schema/schema.d.ts +16 -1
  166. package/dist/schema/schema.d.ts.map +1 -1
  167. package/dist/schema/schema.js +27 -2
  168. package/dist/schema/schema.js.map +1 -1
  169. package/dist/schema/state/sqlite/client-document-def.d.ts +36 -6
  170. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  171. package/dist/schema/state/sqlite/client-document-def.js +97 -6
  172. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  173. package/dist/schema/state/sqlite/client-document-def.test.js +16 -0
  174. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  175. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  176. package/dist/schema/state/sqlite/column-annotations.js +14 -6
  177. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  178. package/dist/schema/state/sqlite/column-annotations.test.js +1 -1
  179. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  180. package/dist/schema/state/sqlite/column-def.js +69 -22
  181. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  182. package/dist/schema/state/sqlite/column-def.test.js +48 -10
  183. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  184. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  185. package/dist/schema/state/sqlite/column-spec.js +30 -12
  186. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  187. package/dist/schema/state/sqlite/column-spec.test.js +23 -14
  188. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  189. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -1
  190. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  191. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +23 -6
  192. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  193. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +14 -8
  194. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  195. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +5 -3
  196. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  197. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  198. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +2 -1
  199. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  200. package/dist/schema/state/sqlite/mod.d.ts +3 -3
  201. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  202. package/dist/schema/state/sqlite/mod.js +3 -3
  203. package/dist/schema/state/sqlite/mod.js.map +1 -1
  204. package/dist/schema/state/sqlite/query-builder/api.d.ts +19 -11
  205. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  206. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  207. package/dist/schema/state/sqlite/query-builder/astToSql.js +22 -15
  208. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  209. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  210. package/dist/schema/state/sqlite/query-builder/impl.js +6 -3
  211. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  212. package/dist/schema/state/sqlite/query-builder/impl.test.js +252 -88
  213. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  214. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  215. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  216. package/dist/schema/state/sqlite/schema-helpers.js +22 -12
  217. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  218. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  219. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  220. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  221. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  222. package/dist/schema/state/sqlite/{system-tables.d.ts → system-tables/eventlog-tables.d.ts} +63 -456
  223. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
  224. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
  225. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
  226. package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
  227. package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
  228. package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
  229. package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
  230. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +456 -0
  231. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
  232. package/dist/schema/state/sqlite/system-tables/state-tables.js +55 -0
  233. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
  234. package/dist/schema/state/sqlite/table-def.d.ts +4 -4
  235. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  236. package/dist/schema/state/sqlite/table-def.js +2 -2
  237. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  238. package/dist/schema/state/sqlite/table-def.test.js +80 -0
  239. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  240. package/dist/schema/unknown-events.d.ts +47 -0
  241. package/dist/schema/unknown-events.d.ts.map +1 -0
  242. package/dist/schema/unknown-events.js +69 -0
  243. package/dist/schema/unknown-events.js.map +1 -0
  244. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
  245. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
  246. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
  247. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
  248. package/dist/schema-management/migrations.d.ts +32 -2
  249. package/dist/schema-management/migrations.d.ts.map +1 -1
  250. package/dist/schema-management/migrations.js +37 -5
  251. package/dist/schema-management/migrations.js.map +1 -1
  252. package/dist/schema-management/validate-schema.d.ts +3 -3
  253. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  254. package/dist/schema-management/validate-schema.js +2 -2
  255. package/dist/schema-management/validate-schema.js.map +1 -1
  256. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  257. package/dist/sql-queries/sql-queries.js +11 -1
  258. package/dist/sql-queries/sql-queries.js.map +1 -1
  259. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  260. package/dist/sql-queries/sql-query-builder.js +2 -1
  261. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  262. package/dist/sqlite-types.d.ts +3 -3
  263. package/dist/sqlite-types.d.ts.map +1 -1
  264. package/dist/sync/ClientSessionSyncProcessor.d.ts +11 -13
  265. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  266. package/dist/sync/ClientSessionSyncProcessor.js +45 -42
  267. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  268. package/dist/sync/errors.d.ts +66 -0
  269. package/dist/sync/errors.d.ts.map +1 -0
  270. package/dist/sync/errors.js +36 -0
  271. package/dist/sync/errors.js.map +1 -0
  272. package/dist/sync/index.d.ts +3 -0
  273. package/dist/sync/index.d.ts.map +1 -1
  274. package/dist/sync/index.js +3 -0
  275. package/dist/sync/index.js.map +1 -1
  276. package/dist/sync/mock-sync-backend.d.ts +23 -0
  277. package/dist/sync/mock-sync-backend.d.ts.map +1 -0
  278. package/dist/sync/mock-sync-backend.js +114 -0
  279. package/dist/sync/mock-sync-backend.js.map +1 -0
  280. package/dist/sync/next/compact-events.d.ts.map +1 -1
  281. package/dist/sync/next/compact-events.js +6 -7
  282. package/dist/sync/next/compact-events.js.map +1 -1
  283. package/dist/sync/next/facts.d.ts +5 -5
  284. package/dist/sync/next/facts.d.ts.map +1 -1
  285. package/dist/sync/next/facts.js +1 -2
  286. package/dist/sync/next/facts.js.map +1 -1
  287. package/dist/sync/next/history-dag-common.d.ts +54 -15
  288. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  289. package/dist/sync/next/history-dag-common.js +198 -9
  290. package/dist/sync/next/history-dag-common.js.map +1 -1
  291. package/dist/sync/next/history-dag.d.ts.map +1 -1
  292. package/dist/sync/next/history-dag.js +10 -8
  293. package/dist/sync/next/history-dag.js.map +1 -1
  294. package/dist/sync/next/rebase-events.d.ts +5 -5
  295. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  296. package/dist/sync/next/rebase-events.js +5 -5
  297. package/dist/sync/next/rebase-events.js.map +1 -1
  298. package/dist/sync/next/test/event-fixtures.d.ts +2 -2
  299. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  300. package/dist/sync/next/test/event-fixtures.js +9 -9
  301. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  302. package/dist/sync/sync-backend-kv.d.ts +7 -0
  303. package/dist/sync/sync-backend-kv.d.ts.map +1 -0
  304. package/dist/sync/sync-backend-kv.js +18 -0
  305. package/dist/sync/sync-backend-kv.js.map +1 -0
  306. package/dist/sync/sync-backend.d.ts +105 -0
  307. package/dist/sync/sync-backend.d.ts.map +1 -0
  308. package/dist/sync/sync-backend.js +61 -0
  309. package/dist/sync/sync-backend.js.map +1 -0
  310. package/dist/sync/sync.d.ts +9 -86
  311. package/dist/sync/sync.d.ts.map +1 -1
  312. package/dist/sync/sync.js +2 -27
  313. package/dist/sync/sync.js.map +1 -1
  314. package/dist/sync/syncstate.d.ts +57 -44
  315. package/dist/sync/syncstate.d.ts.map +1 -1
  316. package/dist/sync/syncstate.js +50 -45
  317. package/dist/sync/syncstate.js.map +1 -1
  318. package/dist/sync/syncstate.test.js +83 -46
  319. package/dist/sync/syncstate.test.js.map +1 -1
  320. package/dist/sync/transport-chunking.d.ts +36 -0
  321. package/dist/sync/transport-chunking.d.ts.map +1 -0
  322. package/dist/sync/transport-chunking.js +56 -0
  323. package/dist/sync/transport-chunking.js.map +1 -0
  324. package/dist/sync/validate-push-payload.d.ts +2 -2
  325. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  326. package/dist/sync/validate-push-payload.js +6 -6
  327. package/dist/sync/validate-push-payload.js.map +1 -1
  328. package/dist/testing/event-factory.d.ts +68 -0
  329. package/dist/testing/event-factory.d.ts.map +1 -0
  330. package/dist/testing/event-factory.js +78 -0
  331. package/dist/testing/event-factory.js.map +1 -0
  332. package/dist/testing/mod.d.ts +2 -0
  333. package/dist/testing/mod.d.ts.map +1 -0
  334. package/dist/testing/mod.js +2 -0
  335. package/dist/testing/mod.js.map +1 -0
  336. package/dist/version.d.ts +16 -6
  337. package/dist/version.d.ts.map +1 -1
  338. package/dist/version.js +16 -6
  339. package/dist/version.js.map +1 -1
  340. package/package.json +7 -8
  341. package/src/ClientSessionLeaderThreadProxy.ts +20 -12
  342. package/src/adapter-types.ts +18 -6
  343. package/src/debug-info.ts +37 -6
  344. package/src/devtools/devtools-messages-client-session.ts +2 -2
  345. package/src/devtools/devtools-messages-common.ts +1 -8
  346. package/src/devtools/devtools-messages-leader.ts +9 -8
  347. package/src/devtools/devtools-sessioninfo.ts +8 -5
  348. package/src/devtools/mod.ts +11 -2
  349. package/src/errors.ts +38 -11
  350. package/src/index.ts +2 -1
  351. package/src/leader-thread/LeaderSyncProcessor.ts +277 -105
  352. package/src/leader-thread/eventlog.ts +113 -38
  353. package/src/leader-thread/leader-worker-devtools.ts +86 -55
  354. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  355. package/src/leader-thread/make-leader-thread-layer.ts +156 -37
  356. package/src/leader-thread/materialize-event.ts +37 -12
  357. package/src/leader-thread/mod.ts +1 -0
  358. package/src/leader-thread/recreate-db.ts +15 -7
  359. package/src/leader-thread/shutdown-channel.ts +16 -2
  360. package/src/leader-thread/stream-events.ts +201 -0
  361. package/src/leader-thread/types.ts +70 -20
  362. package/src/logging.ts +62 -0
  363. package/src/make-client-session.ts +9 -3
  364. package/src/materializer-helper.ts +27 -10
  365. package/src/otel.ts +10 -0
  366. package/src/rematerialize-from-eventlog.ts +37 -27
  367. package/src/schema/EventDef/define.ts +201 -0
  368. package/src/schema/EventDef/event-def.ts +120 -0
  369. package/src/schema/EventDef/facts.ts +135 -0
  370. package/src/schema/EventDef/materializer.ts +172 -0
  371. package/src/schema/EventDef/mod.ts +4 -0
  372. package/src/schema/EventSequenceNumber/client.ts +257 -0
  373. package/src/schema/EventSequenceNumber/global.ts +19 -0
  374. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  375. package/src/schema/EventSequenceNumber.test.ts +70 -52
  376. package/src/schema/LiveStoreEvent/client.ts +221 -0
  377. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  378. package/src/schema/LiveStoreEvent/global.ts +45 -0
  379. package/src/schema/LiveStoreEvent/input.ts +63 -0
  380. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  381. package/src/schema/events.ts +1 -1
  382. package/src/schema/mod.ts +6 -4
  383. package/src/schema/schema.ts +39 -3
  384. package/src/schema/state/sqlite/client-document-def.test.ts +19 -2
  385. package/src/schema/state/sqlite/client-document-def.ts +127 -25
  386. package/src/schema/state/sqlite/column-annotations.test.ts +1 -1
  387. package/src/schema/state/sqlite/column-annotations.ts +16 -6
  388. package/src/schema/state/sqlite/column-def.test.ts +62 -10
  389. package/src/schema/state/sqlite/column-def.ts +88 -21
  390. package/src/schema/state/sqlite/column-spec.test.ts +29 -16
  391. package/src/schema/state/sqlite/column-spec.ts +36 -11
  392. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +26 -6
  393. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +29 -12
  394. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +12 -17
  395. package/src/schema/state/sqlite/mod.ts +4 -3
  396. package/src/schema/state/sqlite/query-builder/api.ts +25 -11
  397. package/src/schema/state/sqlite/query-builder/astToSql.ts +23 -14
  398. package/src/schema/state/sqlite/query-builder/impl.test.ts +305 -92
  399. package/src/schema/state/sqlite/query-builder/impl.ts +8 -3
  400. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  401. package/src/schema/state/sqlite/schema-helpers.ts +28 -20
  402. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  403. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  404. package/src/schema/state/sqlite/system-tables/state-tables.ts +69 -0
  405. package/src/schema/state/sqlite/table-def.test.ts +101 -0
  406. package/src/schema/state/sqlite/table-def.ts +8 -6
  407. package/src/schema/unknown-events.ts +131 -0
  408. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +86 -0
  409. package/src/schema-management/migrations.ts +41 -8
  410. package/src/schema-management/validate-schema.ts +3 -3
  411. package/src/sql-queries/sql-queries.ts +9 -1
  412. package/src/sql-queries/sql-query-builder.ts +2 -1
  413. package/src/sqlite-types.ts +3 -3
  414. package/src/sync/ClientSessionSyncProcessor.ts +69 -62
  415. package/src/sync/errors.ts +38 -0
  416. package/src/sync/index.ts +3 -0
  417. package/src/sync/mock-sync-backend.ts +184 -0
  418. package/src/sync/next/compact-events.ts +6 -7
  419. package/src/sync/next/facts.ts +7 -9
  420. package/src/sync/next/history-dag-common.ts +277 -26
  421. package/src/sync/next/history-dag.ts +16 -10
  422. package/src/sync/next/rebase-events.ts +11 -11
  423. package/src/sync/next/test/event-fixtures.ts +11 -11
  424. package/src/sync/sync-backend-kv.ts +22 -0
  425. package/src/sync/sync-backend.ts +185 -0
  426. package/src/sync/sync.ts +9 -91
  427. package/src/sync/syncstate.test.ts +96 -52
  428. package/src/sync/syncstate.ts +69 -58
  429. package/src/sync/transport-chunking.ts +90 -0
  430. package/src/sync/validate-push-payload.ts +8 -9
  431. package/src/testing/event-factory.ts +131 -0
  432. package/src/testing/mod.ts +1 -0
  433. package/src/version.ts +16 -6
  434. package/dist/schema/EventDef.d.ts +0 -123
  435. package/dist/schema/EventDef.d.ts.map +0 -1
  436. package/dist/schema/EventDef.js +0 -46
  437. package/dist/schema/EventDef.js.map +0 -1
  438. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  439. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  440. package/dist/schema/EventSequenceNumber.js +0 -139
  441. package/dist/schema/EventSequenceNumber.js.map +0 -1
  442. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  443. package/dist/schema/LiveStoreEvent.js.map +0 -1
  444. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  445. package/dist/schema/state/sqlite/system-tables.js +0 -79
  446. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  447. package/dist/schema-management/migrations.test.d.ts +0 -2
  448. package/dist/schema-management/migrations.test.d.ts.map +0 -1
  449. package/dist/schema-management/migrations.test.js +0 -52
  450. package/dist/schema-management/migrations.test.js.map +0 -1
  451. package/dist/sync/next/graphology.d.ts +0 -8
  452. package/dist/sync/next/graphology.d.ts.map +0 -1
  453. package/dist/sync/next/graphology.js +0 -30
  454. package/dist/sync/next/graphology.js.map +0 -1
  455. package/dist/sync/next/graphology_.d.ts +0 -3
  456. package/dist/sync/next/graphology_.d.ts.map +0 -1
  457. package/dist/sync/next/graphology_.js +0 -3
  458. package/dist/sync/next/graphology_.js.map +0 -1
  459. package/src/schema/EventDef.ts +0 -219
  460. package/src/schema/EventSequenceNumber.ts +0 -199
  461. package/src/schema/LiveStoreEvent.ts +0 -287
  462. package/src/schema/state/sqlite/system-tables.ts +0 -104
  463. package/src/sync/next/ambient.d.ts +0 -3
  464. package/src/sync/next/graphology.ts +0 -41
  465. package/src/sync/next/graphology_.ts +0 -2
@@ -1,23 +1,22 @@
1
1
  import { LS_DEV, shouldNeverHappen } from '@livestore/utils'
2
- import { Effect, Option, Schema } from '@livestore/utils/effect'
3
-
2
+ import { Chunk, Effect, Option, Schema } from '@livestore/utils/effect'
4
3
  import type { SqliteDb } from '../adapter-types.ts'
5
- import * as EventSequenceNumber from '../schema/EventSequenceNumber.ts'
6
- import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
4
+ import * as EventSequenceNumber from '../schema/EventSequenceNumber/mod.ts'
5
+ import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts'
7
6
  import {
8
7
  EVENTLOG_META_TABLE,
9
8
  eventlogMetaTable,
10
9
  eventlogSystemTables,
11
10
  SYNC_STATUS_TABLE,
12
- sessionChangesetMetaTable,
13
- } from '../schema/state/sqlite/system-tables.ts'
11
+ } from '../schema/state/sqlite/system-tables/eventlog-tables.ts'
12
+ import { sessionChangesetMetaTable } from '../schema/state/sqlite/system-tables/state-tables.ts'
14
13
  import { migrateTable } from '../schema-management/migrations.ts'
15
14
  import { insertRow, updateRows } from '../sql-queries/sql-queries.ts'
16
15
  import type { PreparedBindValues } from '../util.ts'
17
16
  import { sql } from '../util.ts'
18
17
  import { execSql } from './connection.ts'
19
- import type { InitialSyncInfo } from './types.ts'
20
- import { LeaderThreadCtx } from './types.ts'
18
+ import type { InitialSyncInfo, StreamEventsOptions } from './types.ts'
19
+ import { LeaderThreadCtx, STREAM_EVENTS_BATCH_SIZE_DEFAULT } from './types.ts'
21
20
 
22
21
  export const initEventlogDb = (dbEventlog: SqliteDb) =>
23
22
  Effect.gen(function* () {
@@ -34,7 +33,7 @@ export const initEventlogDb = (dbEventlog: SqliteDb) =>
34
33
  yield* execSql(
35
34
  dbEventlog,
36
35
  sql`INSERT INTO ${SYNC_STATUS_TABLE} (head)
37
- SELECT ${EventSequenceNumber.ROOT.global}
36
+ SELECT ${EventSequenceNumber.Client.ROOT.global}
38
37
  WHERE NOT EXISTS (SELECT 1 FROM ${SYNC_STATUS_TABLE})`,
39
38
  {},
40
39
  )
@@ -51,8 +50,8 @@ export const getEventsSince = ({
51
50
  }: {
52
51
  dbEventlog: SqliteDb
53
52
  dbState: SqliteDb
54
- since: EventSequenceNumber.EventSequenceNumber
55
- }): ReadonlyArray<LiveStoreEvent.EncodedWithMeta> => {
53
+ since: EventSequenceNumber.Client.Composite
54
+ }): ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta> => {
56
55
  const pendingEvents = dbEventlog.select(eventlogMetaTable.where('seqNumGlobal', '>=', since.global))
57
56
 
58
57
  const sessionChangesetRowsDecoded = dbState.select(
@@ -66,7 +65,7 @@ export const getEventsSince = ({
66
65
  readModelEvent.seqNumGlobal === eventlogEvent.seqNumGlobal &&
67
66
  readModelEvent.seqNumClient === eventlogEvent.seqNumClient,
68
67
  )
69
- return LiveStoreEvent.EncodedWithMeta.make({
68
+ return LiveStoreEvent.Client.EncodedWithMeta.make({
70
69
  name: eventlogEvent.name,
71
70
  args: eventlogEvent.argsJson,
72
71
  seqNum: {
@@ -96,14 +95,91 @@ export const getEventsSince = ({
96
95
  },
97
96
  })
98
97
  })
99
- .filter((_) => EventSequenceNumber.compare(_.seqNum, since) > 0)
100
- .sort((a, b) => EventSequenceNumber.compare(a.seqNum, b.seqNum))
98
+ .filter((_) => EventSequenceNumber.Client.compare(_.seqNum, since) > 0)
99
+ .sort((a, b) => EventSequenceNumber.Client.compare(a.seqNum, b.seqNum))
101
100
  }
102
101
 
103
- export const getClientHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.EventSequenceNumber => {
102
+ export const getEventsFromEventlog = ({
103
+ dbEventlog,
104
+ options,
105
+ }: {
106
+ dbEventlog: SqliteDb
107
+ options: StreamEventsOptions
108
+ }): Effect.Effect<Chunk.Chunk<LiveStoreEvent.Client.Encoded>> =>
109
+ Effect.gen(function* () {
110
+ const since = options.since ?? EventSequenceNumber.Client.ROOT
111
+ const batchSize = options.batchSize ?? STREAM_EVENTS_BATCH_SIZE_DEFAULT
112
+
113
+ const makeQuery = () => {
114
+ let query = eventlogMetaTable.where('seqNumGlobal', '>', since.global)
115
+
116
+ if (options.until) {
117
+ query = query.where('seqNumGlobal', '<=', options.until.global)
118
+ }
119
+
120
+ if (options.filter && options.filter.length > 0) {
121
+ query = query.where({ name: { op: 'IN', value: options.filter } })
122
+ }
123
+
124
+ if (options.clientIds && options.clientIds.length > 0) {
125
+ query = query.where({ clientId: { op: 'IN', value: options.clientIds } })
126
+ }
127
+
128
+ if (options.sessionIds && options.sessionIds.length > 0) {
129
+ query = query.where({ sessionId: { op: 'IN', value: options.sessionIds } })
130
+ }
131
+
132
+ if (options.includeClientOnly !== true) {
133
+ query = query.where('seqNumClient', '<=', EventSequenceNumber.Client.DEFAULT)
134
+ }
135
+
136
+ return query
137
+ .orderBy([
138
+ { col: 'seqNumGlobal', direction: 'asc' },
139
+ { col: 'seqNumClient', direction: 'asc' },
140
+ ])
141
+ .limit(batchSize)
142
+ }
143
+
144
+ const eventlogEvents = yield* Effect.sync(() => dbEventlog.select(makeQuery()))
145
+
146
+ if (eventlogEvents.length === 0) {
147
+ return Chunk.empty<LiveStoreEvent.Client.Encoded>()
148
+ }
149
+
150
+ const spanAttributes = {
151
+ 'livestore.eventLog.since': since.global,
152
+ 'livestore.eventLog.until': options.until?.global,
153
+ }
154
+
155
+ return yield* Effect.sync(() => {
156
+ const encodedEvents = eventlogEvents.map((eventlogEvent) => {
157
+ return LiveStoreEvent.Client.Encoded.make({
158
+ name: eventlogEvent.name,
159
+ args: eventlogEvent.argsJson,
160
+ seqNum: {
161
+ global: eventlogEvent.seqNumGlobal,
162
+ client: eventlogEvent.seqNumClient,
163
+ rebaseGeneration: eventlogEvent.seqNumRebaseGeneration,
164
+ },
165
+ parentSeqNum: {
166
+ global: eventlogEvent.parentSeqNumGlobal,
167
+ client: eventlogEvent.parentSeqNumClient,
168
+ rebaseGeneration: eventlogEvent.parentSeqNumRebaseGeneration,
169
+ },
170
+ clientId: eventlogEvent.clientId,
171
+ sessionId: eventlogEvent.sessionId,
172
+ })
173
+ })
174
+
175
+ return Chunk.fromIterable(encodedEvents)
176
+ }).pipe(Effect.withSpan('@livestore/common:eventlog:getEventsFromEventlog', { attributes: spanAttributes }))
177
+ })
178
+
179
+ export const getClientHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.Client.Composite => {
104
180
  const res = dbEventlog.select<{
105
- seqNumGlobal: EventSequenceNumber.GlobalEventSequenceNumber
106
- seqNumClient: EventSequenceNumber.ClientEventSequenceNumber
181
+ seqNumGlobal: EventSequenceNumber.Global.Type
182
+ seqNumClient: EventSequenceNumber.Client.Type
107
183
  seqNumRebaseGeneration: number
108
184
  }>(
109
185
  sql`select seqNumGlobal, seqNumClient, seqNumRebaseGeneration from ${EVENTLOG_META_TABLE} order by seqNumGlobal DESC, seqNumClient DESC limit 1`,
@@ -111,20 +187,27 @@ export const getClientHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.E
111
187
 
112
188
  return res
113
189
  ? { global: res.seqNumGlobal, client: res.seqNumClient, rebaseGeneration: res.seqNumRebaseGeneration }
114
- : EventSequenceNumber.ROOT
190
+ : EventSequenceNumber.Client.ROOT
115
191
  }
116
192
 
117
- export const getBackendHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.GlobalEventSequenceNumber =>
118
- dbEventlog.select<{ head: EventSequenceNumber.GlobalEventSequenceNumber }>(
119
- sql`select head from ${SYNC_STATUS_TABLE}`,
120
- )[0]?.head ?? EventSequenceNumber.ROOT.global
193
+ export const getBackendHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.Global.Type =>
194
+ dbEventlog.select<{ head: EventSequenceNumber.Global.Type }>(sql`select head from ${SYNC_STATUS_TABLE}`)[0]?.head ??
195
+ EventSequenceNumber.Client.ROOT.global
121
196
 
122
197
  // TODO use prepared statements
123
- export const updateBackendHead = (dbEventlog: SqliteDb, head: EventSequenceNumber.EventSequenceNumber) =>
198
+ export const updateBackendHead = (dbEventlog: SqliteDb, head: EventSequenceNumber.Client.Composite) =>
124
199
  dbEventlog.execute(sql`UPDATE ${SYNC_STATUS_TABLE} SET head = ${head.global}`)
125
200
 
201
+ export const getBackendIdFromDb = (dbEventlog: SqliteDb): Option.Option<string> =>
202
+ Option.fromNullable(
203
+ dbEventlog.select<{ backendId: string | null }>(sql`select backendId from ${SYNC_STATUS_TABLE}`)[0]?.backendId,
204
+ )
205
+
206
+ export const updateBackendId = (dbEventlog: SqliteDb, backendId: string) =>
207
+ dbEventlog.execute(sql`UPDATE ${SYNC_STATUS_TABLE} SET backendId = '${backendId}'`)
208
+
126
209
  export const insertIntoEventlog = (
127
- eventEncoded: LiveStoreEvent.EncodedWithMeta,
210
+ eventEncoded: LiveStoreEvent.Client.EncodedWithMeta,
128
211
  dbEventlog: SqliteDb,
129
212
  eventDefSchemaHash: number,
130
213
  clientId: string,
@@ -132,7 +215,7 @@ export const insertIntoEventlog = (
132
215
  ) =>
133
216
  Effect.gen(function* () {
134
217
  // Check history consistency during LS_DEV
135
- if (LS_DEV && eventEncoded.parentSeqNum.global !== EventSequenceNumber.ROOT.global) {
218
+ if (LS_DEV && eventEncoded.parentSeqNum.global !== EventSequenceNumber.Client.ROOT.global) {
136
219
  const parentEventExists =
137
220
  dbEventlog.select<{ count: number }>(
138
221
  `SELECT COUNT(*) as count FROM ${EVENTLOG_META_TABLE} WHERE seqNumGlobal = ? AND seqNumClient = ?`,
@@ -141,7 +224,7 @@ export const insertIntoEventlog = (
141
224
 
142
225
  if (parentEventExists === false) {
143
226
  shouldNeverHappen(
144
- `Parent mutation ${eventEncoded.parentSeqNum.global},${eventEncoded.parentSeqNum.client} does not exist`,
227
+ `Parent event ${eventEncoded.parentSeqNum.global},${eventEncoded.parentSeqNum.client} does not exist in eventlog`,
145
228
  )
146
229
  }
147
230
  }
@@ -172,7 +255,7 @@ export const insertIntoEventlog = (
172
255
  dbEventlog.debug.head = eventEncoded.seqNum
173
256
  })
174
257
 
175
- export const updateSyncMetadata = (items: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>) =>
258
+ export const updateSyncMetadata = (items: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>) =>
176
259
  Effect.gen(function* () {
177
260
  const { dbEventlog } = yield* LeaderThreadCtx
178
261
 
@@ -192,15 +275,11 @@ export const updateSyncMetadata = (items: ReadonlyArray<LiveStoreEvent.EncodedWi
192
275
  }
193
276
  })
194
277
 
195
- export const getSyncBackendCursorInfo = ({
196
- remoteHead,
197
- }: {
198
- remoteHead: EventSequenceNumber.GlobalEventSequenceNumber
199
- }) =>
278
+ export const getSyncBackendCursorInfo = ({ remoteHead }: { remoteHead: EventSequenceNumber.Global.Type }) =>
200
279
  Effect.gen(function* () {
201
280
  const { dbEventlog } = yield* LeaderThreadCtx
202
281
 
203
- if (remoteHead === EventSequenceNumber.ROOT.global) return Option.none()
282
+ if (remoteHead === EventSequenceNumber.Client.ROOT.global) return Option.none()
204
283
 
205
284
  const EventlogQuerySchema = Schema.Struct({
206
285
  syncMetadataJson: Schema.parseJson(Schema.Option(Schema.JsonValue)),
@@ -213,11 +292,7 @@ export const getSyncBackendCursorInfo = ({
213
292
  ).pipe(Effect.andThen(Schema.decode(EventlogQuerySchema)), Effect.map(Option.flatten), Effect.orDie)
214
293
 
215
294
  return Option.some({
216
- cursor: {
217
- global: remoteHead,
218
- client: EventSequenceNumber.clientDefault,
219
- rebaseGeneration: EventSequenceNumber.rebaseGenerationDefault,
220
- },
295
+ eventSequenceNumber: remoteHead,
221
296
  metadata: syncMetadataOption,
222
297
  }) satisfies InitialSyncInfo
223
298
  }).pipe(Effect.withSpan('@livestore/common:eventlog:getSyncBackendCursorInfo', { attributes: { remoteHead } }))
@@ -1,7 +1,7 @@
1
1
  import { Effect, FiberMap, Option, Stream, SubscriptionRef } from '@livestore/utils/effect'
2
2
  import { nanoid } from '@livestore/utils/nanoid'
3
3
 
4
- import { Devtools, IntentionalShutdownCause, liveStoreVersion, UnexpectedError } from '../index.ts'
4
+ import { Devtools, IntentionalShutdownCause, liveStoreVersion, UnknownError } from '../index.ts'
5
5
  import { SystemTables } from '../schema/mod.ts'
6
6
  import type { DevtoolsOptions, PersistenceInfoPair } from './types.ts'
7
7
  import { LeaderThreadCtx } from './types.ts'
@@ -94,6 +94,22 @@ const listenToDevtools = ({
94
94
  type RequestId = string
95
95
  const handledRequestIds = new Set<RequestId>()
96
96
 
97
+ type LoadDatabaseKind = 'state' | 'eventlog'
98
+ const loadDatabaseBatchTracker = new Map<string, Set<LoadDatabaseKind>>()
99
+
100
+ const registerBatchProgress = (batchId: string, kind: LoadDatabaseKind) => {
101
+ const entry = loadDatabaseBatchTracker.get(batchId) ?? new Set<LoadDatabaseKind>()
102
+ entry.add(kind)
103
+ loadDatabaseBatchTracker.set(batchId, entry)
104
+ const finished = entry.has('state') && entry.has('eventlog')
105
+
106
+ if (finished) {
107
+ loadDatabaseBatchTracker.delete(batchId)
108
+ }
109
+
110
+ return finished
111
+ }
112
+
97
113
  yield* incomingMessages.pipe(
98
114
  Stream.tap((decodedEvent) =>
99
115
  Effect.gen(function* () {
@@ -133,74 +149,85 @@ const listenToDevtools = ({
133
149
  return
134
150
  }
135
151
  case 'LSD.Leader.LoadDatabaseFile.Request': {
136
- const { data } = decodedEvent
137
-
138
- let tableNames: Set<string>
152
+ const { data, batchId } = decodedEvent
139
153
 
140
- try {
141
- const tmpDb = yield* makeSqliteDb({ _tag: 'in-memory' })
142
- tmpDb.import(data)
143
- const tableNameResults = tmpDb.select<{ name: string }>(
144
- `select name from sqlite_master where type = 'table'`,
145
- )
146
-
147
- tableNames = new Set(tableNameResults.map((_) => _.name))
148
-
149
- tmpDb.close()
150
- } catch (cause) {
151
- yield* Effect.logError(`Error importing database file`, cause)
152
- yield* sendMessage(
153
- Devtools.Leader.LoadDatabaseFile.Error.make({
154
- ...reqPayload,
155
- cause: { _tag: 'unexpected-error', cause },
156
- }),
154
+ const handleLoadDb = Effect.gen(function* () {
155
+ const tableNames = yield* Effect.acquireRelease(makeSqliteDb({ _tag: 'in-memory' }), (db) =>
156
+ Effect.sync(() => db.close()),
157
+ ).pipe(
158
+ Effect.flatMap((db) =>
159
+ Effect.try(() => {
160
+ db.import(data)
161
+ const rows = db.select<{ name: string }>(`select name from sqlite_master where type = 'table'`)
162
+ return new Set(rows.map((r) => r.name))
163
+ }),
164
+ ),
157
165
  )
158
166
 
159
- return
160
- }
167
+ let databaseKind: LoadDatabaseKind | undefined
161
168
 
162
- try {
163
169
  if (tableNames.has(SystemTables.EVENTLOG_META_TABLE)) {
164
- // Is eventlog db
170
+ databaseKind = 'eventlog'
165
171
  yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
172
+ yield* Effect.try(() => void dbEventlog.import(data))
166
173
 
167
- dbEventlog.import(data)
168
-
169
- dbState.destroy()
174
+ if (batchId === undefined) {
175
+ yield* Effect.try(() => void dbState.destroy())
176
+ }
170
177
  } else if (
171
178
  tableNames.has(SystemTables.SCHEMA_META_TABLE) &&
172
179
  tableNames.has(SystemTables.SCHEMA_EVENT_DEFS_META_TABLE)
173
180
  ) {
174
- // Is state db
181
+ databaseKind = 'state'
175
182
  yield* SubscriptionRef.set(shutdownStateSubRef, 'shutting-down')
183
+ yield* Effect.try(() => void dbState.import(data))
176
184
 
177
- dbState.import(data)
178
-
179
- dbEventlog.destroy()
185
+ if (batchId === undefined) {
186
+ yield* Effect.try(() => void dbEventlog.destroy())
187
+ }
180
188
  } else {
181
- yield* sendMessage(
182
- Devtools.Leader.LoadDatabaseFile.Error.make({
183
- ...reqPayload,
184
- cause: { _tag: 'unsupported-database' },
185
- }),
186
- )
187
- return
189
+ return yield* Effect.fail({ _tag: 'unsupported-database' } as const)
190
+ }
191
+
192
+ const resolvedDatabaseKind = databaseKind
193
+ if (resolvedDatabaseKind === undefined) {
194
+ return yield* Effect.fail({ _tag: 'unsupported-database' } as const)
188
195
  }
189
196
 
197
+ const shouldShutdown =
198
+ batchId === undefined ? true : registerBatchProgress(batchId, resolvedDatabaseKind)
199
+
190
200
  yield* sendMessage(Devtools.Leader.LoadDatabaseFile.Success.make({ ...reqPayload }))
191
- yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-import' })) ?? Effect.void
192
201
 
193
- return
194
- } catch (cause) {
195
- yield* Effect.logError(`Error importing database file`, cause)
196
- yield* sendMessage(
197
- Devtools.Leader.LoadDatabaseFile.Error.make({
198
- ...reqPayload,
199
- cause: { _tag: 'unexpected-error', cause },
200
- }),
201
- )
202
- return
203
- }
202
+ if (shouldShutdown) {
203
+ yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-import' }))
204
+ }
205
+ })
206
+
207
+ yield* handleLoadDb.pipe(
208
+ Effect.catchTag('unsupported-database', () =>
209
+ sendMessage(
210
+ Devtools.Leader.LoadDatabaseFile.Error.make({
211
+ ...reqPayload,
212
+ cause: { _tag: 'unsupported-database' as const },
213
+ }),
214
+ ),
215
+ ),
216
+ Effect.catchAll((cause) =>
217
+ Effect.logWarning('Error importing database file', cause).pipe(
218
+ Effect.zipRight(
219
+ sendMessage(
220
+ Devtools.Leader.LoadDatabaseFile.Error.make({
221
+ ...reqPayload,
222
+ cause: { _tag: 'unknown-error' as const, cause },
223
+ }),
224
+ ),
225
+ ),
226
+ ),
227
+ ),
228
+ )
229
+
230
+ return
204
231
  }
205
232
  case 'LSD.Leader.ResetAllData.Request': {
206
233
  const { mode } = decodedEvent
@@ -215,7 +242,7 @@ const listenToDevtools = ({
215
242
 
216
243
  yield* sendMessage(Devtools.Leader.ResetAllData.Success.make({ ...reqPayload }))
217
244
 
218
- yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-reset' })) ?? Effect.void
245
+ yield* shutdownChannel.send(IntentionalShutdownCause.make({ reason: 'devtools-reset' }))
219
246
 
220
247
  return
221
248
  }
@@ -262,7 +289,7 @@ const listenToDevtools = ({
262
289
 
263
290
  if (syncBackend !== undefined) {
264
291
  // TODO consider piggybacking on the existing leader-thread sync-pulling
265
- yield* syncBackend.pull(Option.none()).pipe(
292
+ yield* syncBackend.pull(Option.none(), { live: true }).pipe(
266
293
  Stream.map((_) => _.batch),
267
294
  Stream.flattenIterables,
268
295
  Stream.tap(({ eventEncoded, metadata }) =>
@@ -319,7 +346,11 @@ const listenToDevtools = ({
319
346
  Stream.tap(([isConnected, { latchClosed }]) =>
320
347
  sendMessage(
321
348
  Devtools.Leader.NetworkStatusRes.make({
322
- networkStatus: { isConnected, timestampMs: Date.now(), latchClosed },
349
+ networkStatus: {
350
+ isConnected,
351
+ timestampMs: Date.now(),
352
+ devtools: { latchClosed },
353
+ },
323
354
  subscriptionId,
324
355
  ...reqPayload,
325
356
  requestId: nanoid(10),
@@ -395,7 +426,7 @@ const listenToDevtools = ({
395
426
  }
396
427
  }).pipe(Effect.withSpan(`@livestore/common:leader-thread:onDevtoolsMessage:${decodedEvent._tag}`)),
397
428
  ),
398
- UnexpectedError.mapToUnexpectedErrorStream,
429
+ UnknownError.mapToUnknownErrorStream,
399
430
  Stream.runDrain,
400
431
  )
401
432
  })
@@ -0,0 +1,44 @@
1
+ import { Effect, Stream, SubscriptionRef } from '@livestore/utils/effect'
2
+ import { Vitest } from '@livestore/utils-dev/node-vitest'
3
+
4
+ import { makeMockSyncBackend } from '../sync/mock-sync-backend.ts'
5
+ import type { SyncBackend } from '../sync/sync.ts'
6
+ import { makeNetworkStatusSubscribable } from './make-leader-thread-layer.ts'
7
+ import type { DevtoolsContext } from './types.ts'
8
+
9
+ Vitest.describe('makeNetworkStatusSubscribable', () => {
10
+ Vitest.scopedLive('tracks sync backend connectivity and devtools latch state', () =>
11
+ Effect.gen(function* () {
12
+ const mockBackend = yield* makeMockSyncBackend({ startConnected: false })
13
+ const syncBackend = yield* mockBackend.makeSyncBackend
14
+ const latchStateRef = yield* SubscriptionRef.make<{ latchClosed: boolean }>({ latchClosed: false })
15
+
16
+ const devtoolsContext: DevtoolsContext = {
17
+ enabled: true,
18
+ syncBackendLatch: yield* Effect.makeLatch(true),
19
+ syncBackendLatchState: latchStateRef,
20
+ }
21
+
22
+ const networkStatus = yield* makeNetworkStatusSubscribable({ syncBackend, devtoolsContext })
23
+
24
+ const initial = yield* networkStatus
25
+ Vitest.expect(initial.isConnected).toBe(false)
26
+ Vitest.expect(initial.devtools.latchClosed).toBe(false)
27
+
28
+ const waitFor = (predicate: (status: SyncBackend.NetworkStatus) => boolean) =>
29
+ networkStatus.changes.pipe(Stream.filter(predicate), Stream.runHead, Effect.flatten)
30
+
31
+ const onlineFiber = yield* waitFor((status) => status.isConnected).pipe(Effect.forkScoped)
32
+ yield* mockBackend.connect
33
+ const online = yield* onlineFiber
34
+ Vitest.expect(online.isConnected).toBe(true)
35
+ Vitest.expect(online.timestampMs).toBeGreaterThan(initial.timestampMs)
36
+
37
+ const latchedFiber = yield* waitFor((status) => status.devtools.latchClosed).pipe(Effect.forkScoped)
38
+ yield* SubscriptionRef.set(latchStateRef, { latchClosed: true })
39
+ const latched = yield* latchedFiber
40
+ Vitest.expect(latched.devtools.latchClosed).toBe(true)
41
+ Vitest.expect(latched.timestampMs).toBeGreaterThanOrEqual(online.timestampMs)
42
+ }),
43
+ )
44
+ })