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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (580) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +27 -12
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
  4. package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
  5. package/dist/MaterializationJournal.d.ts +44 -0
  6. package/dist/MaterializationJournal.d.ts.map +1 -0
  7. package/dist/MaterializationJournal.js +112 -0
  8. package/dist/MaterializationJournal.js.map +1 -0
  9. package/dist/StateHead.d.ts +26 -0
  10. package/dist/StateHead.d.ts.map +1 -0
  11. package/dist/StateHead.js +50 -0
  12. package/dist/StateHead.js.map +1 -0
  13. package/dist/WorkerTransportError.d.ts +11 -0
  14. package/dist/WorkerTransportError.d.ts.map +1 -0
  15. package/dist/WorkerTransportError.js +11 -0
  16. package/dist/WorkerTransportError.js.map +1 -0
  17. package/dist/__tests__/fixture.d.ts +1 -1
  18. package/dist/__tests__/fixture.d.ts.map +1 -1
  19. package/dist/__tests__/fixture.js +3 -3
  20. package/dist/__tests__/fixture.js.map +1 -1
  21. package/dist/adapter-types.d.ts +59 -57
  22. package/dist/adapter-types.d.ts.map +1 -1
  23. package/dist/adapter-types.js +31 -22
  24. package/dist/adapter-types.js.map +1 -1
  25. package/dist/bounded-collections.d.ts.map +1 -1
  26. package/dist/bounded-collections.js +6 -4
  27. package/dist/bounded-collections.js.map +1 -1
  28. package/dist/debug-info.d.ts +56 -56
  29. package/dist/debug-info.d.ts.map +1 -1
  30. package/dist/debug-info.js +46 -32
  31. package/dist/debug-info.js.map +1 -1
  32. package/dist/defs.d.ts +9 -9
  33. package/dist/defs.js +2 -2
  34. package/dist/devtools/devtools-compatibility.test.d.ts +2 -0
  35. package/dist/devtools/devtools-compatibility.test.d.ts.map +1 -0
  36. package/dist/devtools/devtools-compatibility.test.js +16 -0
  37. package/dist/devtools/devtools-compatibility.test.js.map +1 -0
  38. package/dist/devtools/devtools-messages-client-session.d.ts +531 -312
  39. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  40. package/dist/devtools/devtools-messages-client-session.js +86 -67
  41. package/dist/devtools/devtools-messages-client-session.js.map +1 -1
  42. package/dist/devtools/devtools-messages-common.d.ts +32 -35
  43. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  44. package/dist/devtools/devtools-messages-common.js +12 -14
  45. package/dist/devtools/devtools-messages-common.js.map +1 -1
  46. package/dist/devtools/devtools-messages-leader.d.ts +417 -320
  47. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  48. package/dist/devtools/devtools-messages-leader.js +117 -87
  49. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  50. package/dist/devtools/devtools-sessioninfo.d.ts +28 -17
  51. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  52. package/dist/devtools/devtools-sessioninfo.js +12 -6
  53. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  54. package/dist/devtools/mod.d.ts +17 -7
  55. package/dist/devtools/mod.d.ts.map +1 -1
  56. package/dist/devtools/mod.js +19 -8
  57. package/dist/devtools/mod.js.map +1 -1
  58. package/dist/errors.d.ts +52 -46
  59. package/dist/errors.d.ts.map +1 -1
  60. package/dist/errors.js +31 -21
  61. package/dist/errors.js.map +1 -1
  62. package/dist/index.d.ts +7 -1
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +7 -1
  65. package/dist/index.js.map +1 -1
  66. package/dist/leader-thread/LeaderSyncProcessor.d.ts +116 -21
  67. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  68. package/dist/leader-thread/LeaderSyncProcessor.js +596 -470
  69. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  70. package/dist/leader-thread/RejectedPushError.d.ts +138 -0
  71. package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
  72. package/dist/leader-thread/RejectedPushError.js +97 -0
  73. package/dist/leader-thread/RejectedPushError.js.map +1 -0
  74. package/dist/leader-thread/connection.d.ts +1 -0
  75. package/dist/leader-thread/connection.d.ts.map +1 -1
  76. package/dist/leader-thread/connection.js +10 -9
  77. package/dist/leader-thread/connection.js.map +1 -1
  78. package/dist/leader-thread/eventlog.d.ts +20 -15
  79. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  80. package/dist/leader-thread/eventlog.js +80 -20
  81. package/dist/leader-thread/eventlog.js.map +1 -1
  82. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
  83. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  84. package/dist/leader-thread/leader-worker-devtools.js +110 -62
  85. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  86. package/dist/leader-thread/make-leader-thread-layer.d.ts +19 -7
  87. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  88. package/dist/leader-thread/make-leader-thread-layer.js +67 -45
  89. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  90. package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
  91. package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
  92. package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
  93. package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
  94. package/dist/leader-thread/materialize-event.d.ts +3 -2
  95. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  96. package/dist/leader-thread/materialize-event.js +32 -9
  97. package/dist/leader-thread/materialize-event.js.map +1 -1
  98. package/dist/leader-thread/mod.d.ts +1 -0
  99. package/dist/leader-thread/mod.d.ts.map +1 -1
  100. package/dist/leader-thread/mod.js +1 -0
  101. package/dist/leader-thread/mod.js.map +1 -1
  102. package/dist/leader-thread/recreate-db.d.ts +2 -2
  103. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  104. package/dist/leader-thread/recreate-db.js +19 -40
  105. package/dist/leader-thread/recreate-db.js.map +1 -1
  106. package/dist/leader-thread/shutdown-channel.d.ts +3 -7
  107. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  108. package/dist/leader-thread/shutdown-channel.js +2 -3
  109. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  110. package/dist/leader-thread/stream-events.d.ts +53 -0
  111. package/dist/leader-thread/stream-events.d.ts.map +1 -0
  112. package/dist/leader-thread/stream-events.js +164 -0
  113. package/dist/leader-thread/stream-events.js.map +1 -0
  114. package/dist/leader-thread/types.d.ts +92 -51
  115. package/dist/leader-thread/types.d.ts.map +1 -1
  116. package/dist/leader-thread/types.js +17 -4
  117. package/dist/leader-thread/types.js.map +1 -1
  118. package/dist/logging.d.ts +15 -0
  119. package/dist/logging.d.ts.map +1 -0
  120. package/dist/logging.js +2 -0
  121. package/dist/logging.js.map +1 -0
  122. package/dist/make-client-session.d.ts +6 -5
  123. package/dist/make-client-session.d.ts.map +1 -1
  124. package/dist/make-client-session.js +10 -7
  125. package/dist/make-client-session.js.map +1 -1
  126. package/dist/materializer-helper.d.ts +6 -7
  127. package/dist/materializer-helper.d.ts.map +1 -1
  128. package/dist/materializer-helper.js +22 -40
  129. package/dist/materializer-helper.js.map +1 -1
  130. package/dist/otel.d.ts +4 -4
  131. package/dist/otel.d.ts.map +1 -1
  132. package/dist/otel.js +8 -8
  133. package/dist/otel.js.map +1 -1
  134. package/dist/rematerialize-from-eventlog.d.ts +3 -3
  135. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  136. package/dist/rematerialize-from-eventlog.js +52 -39
  137. package/dist/rematerialize-from-eventlog.js.map +1 -1
  138. package/dist/schema/EventDef/define.d.ts +161 -0
  139. package/dist/schema/EventDef/define.d.ts.map +1 -0
  140. package/dist/schema/EventDef/define.js +140 -0
  141. package/dist/schema/EventDef/define.js.map +1 -0
  142. package/dist/schema/EventDef/define.test.d.ts +2 -0
  143. package/dist/schema/EventDef/define.test.d.ts.map +1 -0
  144. package/dist/schema/EventDef/define.test.js +23 -0
  145. package/dist/schema/EventDef/define.test.js.map +1 -0
  146. package/dist/schema/EventDef/deprecated.d.ts +94 -0
  147. package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
  148. package/dist/schema/EventDef/deprecated.js +143 -0
  149. package/dist/schema/EventDef/deprecated.js.map +1 -0
  150. package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
  151. package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
  152. package/dist/schema/EventDef/deprecated.test.js +95 -0
  153. package/dist/schema/EventDef/deprecated.test.js.map +1 -0
  154. package/dist/schema/EventDef/event-def.d.ts +110 -0
  155. package/dist/schema/EventDef/event-def.d.ts.map +1 -0
  156. package/dist/schema/EventDef/event-def.js +2 -0
  157. package/dist/schema/EventDef/event-def.js.map +1 -0
  158. package/dist/schema/EventDef/facts.d.ts +118 -0
  159. package/dist/schema/EventDef/facts.d.ts.map +1 -0
  160. package/dist/schema/EventDef/facts.js +53 -0
  161. package/dist/schema/EventDef/facts.js.map +1 -0
  162. package/dist/schema/EventDef/materializer.d.ts +155 -0
  163. package/dist/schema/EventDef/materializer.d.ts.map +1 -0
  164. package/dist/schema/EventDef/materializer.js +83 -0
  165. package/dist/schema/EventDef/materializer.js.map +1 -0
  166. package/dist/schema/EventDef/mod.d.ts +6 -0
  167. package/dist/schema/EventDef/mod.d.ts.map +1 -0
  168. package/dist/schema/EventDef/mod.js +6 -0
  169. package/dist/schema/EventDef/mod.js.map +1 -0
  170. package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
  171. package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
  172. package/dist/schema/EventSequenceNumber/client.js +192 -0
  173. package/dist/schema/EventSequenceNumber/client.js.map +1 -0
  174. package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
  175. package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
  176. package/dist/schema/EventSequenceNumber/global.js +14 -0
  177. package/dist/schema/EventSequenceNumber/global.js.map +1 -0
  178. package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
  179. package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
  180. package/dist/schema/EventSequenceNumber/mod.js +37 -0
  181. package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
  182. package/dist/schema/EventSequenceNumber.test.js +44 -44
  183. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  184. package/dist/schema/LiveStoreEvent/client.d.ts +168 -0
  185. package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
  186. package/dist/schema/LiveStoreEvent/client.js +179 -0
  187. package/dist/schema/LiveStoreEvent/client.js.map +1 -0
  188. package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
  189. package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
  190. package/dist/schema/LiveStoreEvent/client.test.js +120 -0
  191. package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
  192. package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
  193. package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
  194. package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
  195. package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
  196. package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
  197. package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
  198. package/dist/schema/LiveStoreEvent/global.js +31 -0
  199. package/dist/schema/LiveStoreEvent/global.js.map +1 -0
  200. package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
  201. package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
  202. package/dist/schema/LiveStoreEvent/input.js +26 -0
  203. package/dist/schema/LiveStoreEvent/input.js.map +1 -0
  204. package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
  205. package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
  206. package/dist/schema/LiveStoreEvent/mod.js +5 -0
  207. package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
  208. package/dist/schema/events.d.ts +1 -1
  209. package/dist/schema/events.d.ts.map +1 -1
  210. package/dist/schema/events.js +1 -1
  211. package/dist/schema/events.js.map +1 -1
  212. package/dist/schema/mod.d.ts +7 -4
  213. package/dist/schema/mod.d.ts.map +1 -1
  214. package/dist/schema/mod.js +6 -4
  215. package/dist/schema/mod.js.map +1 -1
  216. package/dist/schema/schema.d.ts +16 -1
  217. package/dist/schema/schema.d.ts.map +1 -1
  218. package/dist/schema/schema.js +34 -5
  219. package/dist/schema/schema.js.map +1 -1
  220. package/dist/schema/state/sqlite/client-document-def.d.ts +14 -18
  221. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  222. package/dist/schema/state/sqlite/client-document-def.js +54 -30
  223. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  224. package/dist/schema/state/sqlite/client-document-def.test.js +146 -6
  225. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  226. package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
  227. package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
  228. package/dist/schema/state/sqlite/column-annotations.js +13 -15
  229. package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
  230. package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
  231. package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
  232. package/dist/schema/state/sqlite/column-def.d.ts +1 -1
  233. package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
  234. package/dist/schema/state/sqlite/column-def.js +132 -57
  235. package/dist/schema/state/sqlite/column-def.js.map +1 -1
  236. package/dist/schema/state/sqlite/column-def.test.js +155 -70
  237. package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
  238. package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
  239. package/dist/schema/state/sqlite/column-spec.js +30 -12
  240. package/dist/schema/state/sqlite/column-spec.js.map +1 -1
  241. package/dist/schema/state/sqlite/column-spec.test.js +26 -17
  242. package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
  243. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -2
  244. package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
  245. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +15 -6
  246. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
  247. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +25 -19
  248. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
  249. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +22 -16
  250. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  251. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +28 -17
  252. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
  253. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +14 -12
  254. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  255. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +6 -4
  256. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  257. package/dist/schema/state/sqlite/mod.d.ts +3 -5
  258. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  259. package/dist/schema/state/sqlite/mod.js +6 -8
  260. package/dist/schema/state/sqlite/mod.js.map +1 -1
  261. package/dist/schema/state/sqlite/persistence.d.ts +11 -0
  262. package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
  263. package/dist/schema/state/sqlite/persistence.js +10 -0
  264. package/dist/schema/state/sqlite/persistence.js.map +1 -0
  265. package/dist/schema/state/sqlite/query-builder/api.d.ts +58 -29
  266. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  267. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
  268. package/dist/schema/state/sqlite/query-builder/astToSql.js +105 -24
  269. package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
  270. package/dist/schema/state/sqlite/query-builder/impl.d.ts +4 -2
  271. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  272. package/dist/schema/state/sqlite/query-builder/impl.js +42 -27
  273. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  274. package/dist/schema/state/sqlite/query-builder/impl.test.js +402 -498
  275. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  276. package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
  277. package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
  278. package/dist/schema/state/sqlite/schema-helpers.js +24 -14
  279. package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
  280. package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
  281. package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
  282. package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
  283. package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
  284. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +515 -0
  285. package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
  286. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
  287. package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
  288. package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
  289. package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
  290. package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
  291. package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
  292. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +678 -0
  293. package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
  294. package/dist/schema/state/sqlite/system-tables/state-tables.js +87 -0
  295. package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
  296. package/dist/schema/state/sqlite/table-def.d.ts +19 -20
  297. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  298. package/dist/schema/state/sqlite/table-def.js +54 -4
  299. package/dist/schema/state/sqlite/table-def.js.map +1 -1
  300. package/dist/schema/state/sqlite/table-def.test.js +226 -20
  301. package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
  302. package/dist/schema/unknown-events.d.ts +47 -0
  303. package/dist/schema/unknown-events.d.ts.map +1 -0
  304. package/dist/schema/unknown-events.js +70 -0
  305. package/dist/schema/unknown-events.js.map +1 -0
  306. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
  307. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
  308. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
  309. package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
  310. package/dist/schema-management/common.js +2 -2
  311. package/dist/schema-management/common.js.map +1 -1
  312. package/dist/schema-management/migrations.d.ts +32 -2
  313. package/dist/schema-management/migrations.d.ts.map +1 -1
  314. package/dist/schema-management/migrations.js +38 -6
  315. package/dist/schema-management/migrations.js.map +1 -1
  316. package/dist/schema-management/validate-schema.d.ts +3 -3
  317. package/dist/schema-management/validate-schema.d.ts.map +1 -1
  318. package/dist/schema-management/validate-schema.js +2 -2
  319. package/dist/schema-management/validate-schema.js.map +1 -1
  320. package/dist/session-id-symbol.d.ts +29 -0
  321. package/dist/session-id-symbol.d.ts.map +1 -0
  322. package/dist/session-id-symbol.js +44 -0
  323. package/dist/session-id-symbol.js.map +1 -0
  324. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  325. package/dist/sql-queries/sql-queries.js +26 -16
  326. package/dist/sql-queries/sql-queries.js.map +1 -1
  327. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  328. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  329. package/dist/sql-queries/types.d.ts +6 -7
  330. package/dist/sql-queries/types.d.ts.map +1 -1
  331. package/dist/sql-queries/types.js.map +1 -1
  332. package/dist/sqlite-db-helper.d.ts +21 -1
  333. package/dist/sqlite-db-helper.d.ts.map +1 -1
  334. package/dist/sqlite-db-helper.js +40 -5
  335. package/dist/sqlite-db-helper.js.map +1 -1
  336. package/dist/sqlite-types.d.ts +8 -11
  337. package/dist/sqlite-types.d.ts.map +1 -1
  338. package/dist/sqlite-types.js +3 -3
  339. package/dist/sqlite-types.js.map +1 -1
  340. package/dist/sync/ClientSessionSyncProcessor.d.ts +47 -25
  341. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  342. package/dist/sync/ClientSessionSyncProcessor.js +269 -154
  343. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  344. package/dist/sync/errors.d.ts +12 -51
  345. package/dist/sync/errors.d.ts.map +1 -1
  346. package/dist/sync/errors.js +7 -24
  347. package/dist/sync/errors.js.map +1 -1
  348. package/dist/sync/index.d.ts +2 -0
  349. package/dist/sync/index.d.ts.map +1 -1
  350. package/dist/sync/index.js +2 -0
  351. package/dist/sync/index.js.map +1 -1
  352. package/dist/sync/mock-sync-backend.d.ts +11 -10
  353. package/dist/sync/mock-sync-backend.d.ts.map +1 -1
  354. package/dist/sync/mock-sync-backend.js +97 -74
  355. package/dist/sync/mock-sync-backend.js.map +1 -1
  356. package/dist/sync/mock-sync-backend.test.d.ts +2 -0
  357. package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
  358. package/dist/sync/mock-sync-backend.test.js +49 -0
  359. package/dist/sync/mock-sync-backend.test.js.map +1 -0
  360. package/dist/sync/next/compact-events.d.ts.map +1 -1
  361. package/dist/sync/next/compact-events.js +11 -12
  362. package/dist/sync/next/compact-events.js.map +1 -1
  363. package/dist/sync/next/facts.d.ts +5 -5
  364. package/dist/sync/next/facts.d.ts.map +1 -1
  365. package/dist/sync/next/facts.js +7 -8
  366. package/dist/sync/next/facts.js.map +1 -1
  367. package/dist/sync/next/history-dag-common.d.ts +58 -15
  368. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  369. package/dist/sync/next/history-dag-common.js +219 -9
  370. package/dist/sync/next/history-dag-common.js.map +1 -1
  371. package/dist/sync/next/history-dag.d.ts.map +1 -1
  372. package/dist/sync/next/history-dag.js +12 -11
  373. package/dist/sync/next/history-dag.js.map +1 -1
  374. package/dist/sync/next/rebase-events.d.ts +5 -5
  375. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  376. package/dist/sync/next/rebase-events.js +6 -6
  377. package/dist/sync/next/rebase-events.js.map +1 -1
  378. package/dist/sync/next/test/compact-events.calculator.test.js +4 -4
  379. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  380. package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
  381. package/dist/sync/next/test/compact-events.test.js +2 -2
  382. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  383. package/dist/sync/next/test/event-fixtures.d.ts +9 -9
  384. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  385. package/dist/sync/next/test/event-fixtures.js +12 -12
  386. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  387. package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
  388. package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
  389. package/dist/sync/next/test/history-dag-common.test.js +73 -0
  390. package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
  391. package/dist/sync/sync-backend-kv.d.ts +3 -3
  392. package/dist/sync/sync-backend-kv.d.ts.map +1 -1
  393. package/dist/sync/sync-backend-kv.js +6 -4
  394. package/dist/sync/sync-backend-kv.js.map +1 -1
  395. package/dist/sync/sync-backend.d.ts +41 -21
  396. package/dist/sync/sync-backend.d.ts.map +1 -1
  397. package/dist/sync/sync-backend.js +45 -4
  398. package/dist/sync/sync-backend.js.map +1 -1
  399. package/dist/sync/sync.d.ts +23 -2
  400. package/dist/sync/sync.d.ts.map +1 -1
  401. package/dist/sync/syncstate.d.ts +115 -191
  402. package/dist/sync/syncstate.d.ts.map +1 -1
  403. package/dist/sync/syncstate.js +108 -129
  404. package/dist/sync/syncstate.js.map +1 -1
  405. package/dist/sync/syncstate.test.js +289 -161
  406. package/dist/sync/syncstate.test.js.map +1 -1
  407. package/dist/sync/transport-chunking.d.ts +35 -0
  408. package/dist/sync/transport-chunking.d.ts.map +1 -0
  409. package/dist/sync/transport-chunking.js +47 -0
  410. package/dist/sync/transport-chunking.js.map +1 -0
  411. package/dist/sync/validate-push-payload.d.ts +2 -2
  412. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  413. package/dist/sync/validate-push-payload.js +4 -6
  414. package/dist/sync/validate-push-payload.js.map +1 -1
  415. package/dist/testing/event-factory.d.ts +3 -3
  416. package/dist/testing/event-factory.d.ts.map +1 -1
  417. package/dist/testing/event-factory.js +5 -7
  418. package/dist/testing/event-factory.js.map +1 -1
  419. package/dist/util.d.ts +11 -4
  420. package/dist/util.d.ts.map +1 -1
  421. package/dist/util.js +21 -4
  422. package/dist/util.js.map +1 -1
  423. package/dist/version.d.ts +24 -5
  424. package/dist/version.d.ts.map +1 -1
  425. package/dist/version.js +25 -8
  426. package/dist/version.js.map +1 -1
  427. package/package.json +50 -16
  428. package/src/ClientSessionLeaderThreadProxy.ts +27 -12
  429. package/src/MaterializationJournal.ts +184 -0
  430. package/src/StateHead.ts +80 -0
  431. package/src/WorkerTransportError.ts +12 -0
  432. package/src/__tests__/fixture.ts +3 -3
  433. package/src/adapter-types.ts +62 -56
  434. package/src/bounded-collections.ts +6 -5
  435. package/src/debug-info.ts +54 -43
  436. package/src/defs.ts +2 -2
  437. package/src/devtools/devtools-compatibility.test.ts +19 -0
  438. package/src/devtools/devtools-messages-client-session.ts +72 -63
  439. package/src/devtools/devtools-messages-common.ts +18 -22
  440. package/src/devtools/devtools-messages-leader.ts +89 -68
  441. package/src/devtools/devtools-sessioninfo.ts +17 -12
  442. package/src/devtools/mod.ts +15 -7
  443. package/src/errors.ts +58 -38
  444. package/src/index.ts +11 -1
  445. package/src/leader-thread/LeaderSyncProcessor.ts +927 -674
  446. package/src/leader-thread/RejectedPushError.ts +119 -0
  447. package/src/leader-thread/connection.ts +13 -9
  448. package/src/leader-thread/eventlog.ts +114 -41
  449. package/src/leader-thread/leader-worker-devtools.ts +223 -124
  450. package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
  451. package/src/leader-thread/make-leader-thread-layer.ts +170 -82
  452. package/src/leader-thread/materialize-event.ts +51 -16
  453. package/src/leader-thread/mod.ts +1 -0
  454. package/src/leader-thread/recreate-db.ts +26 -61
  455. package/src/leader-thread/shutdown-channel.ts +3 -18
  456. package/src/leader-thread/stream-events.ts +209 -0
  457. package/src/leader-thread/types.ts +77 -65
  458. package/src/logging.ts +15 -0
  459. package/src/make-client-session.ts +16 -10
  460. package/src/materializer-helper.ts +31 -49
  461. package/src/otel.ts +15 -13
  462. package/src/rematerialize-from-eventlog.ts +106 -93
  463. package/src/schema/EventDef/define.test.ts +28 -0
  464. package/src/schema/EventDef/define.ts +218 -0
  465. package/src/schema/EventDef/deprecated.test.ts +122 -0
  466. package/src/schema/EventDef/deprecated.ts +172 -0
  467. package/src/schema/EventDef/event-def.ts +123 -0
  468. package/src/schema/EventDef/facts.ts +135 -0
  469. package/src/schema/EventDef/materializer.ts +172 -0
  470. package/src/schema/EventDef/mod.ts +5 -0
  471. package/src/schema/EventSequenceNumber/client.ts +256 -0
  472. package/src/schema/EventSequenceNumber/global.ts +19 -0
  473. package/src/schema/EventSequenceNumber/mod.ts +37 -0
  474. package/src/schema/EventSequenceNumber.test.ts +72 -53
  475. package/src/schema/LiveStoreEvent/client.test.ts +142 -0
  476. package/src/schema/LiveStoreEvent/client.ts +236 -0
  477. package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
  478. package/src/schema/LiveStoreEvent/global.ts +45 -0
  479. package/src/schema/LiveStoreEvent/input.ts +63 -0
  480. package/src/schema/LiveStoreEvent/mod.ts +4 -0
  481. package/src/schema/events.ts +1 -1
  482. package/src/schema/mod.ts +7 -4
  483. package/src/schema/schema.ts +48 -6
  484. package/src/schema/state/sqlite/client-document-def.test.ts +172 -14
  485. package/src/schema/state/sqlite/client-document-def.ts +126 -98
  486. package/src/schema/state/sqlite/column-annotations.test.ts +27 -45
  487. package/src/schema/state/sqlite/column-annotations.ts +27 -30
  488. package/src/schema/state/sqlite/column-def.test.ts +186 -77
  489. package/src/schema/state/sqlite/column-def.ts +169 -62
  490. package/src/schema/state/sqlite/column-spec.test.ts +34 -19
  491. package/src/schema/state/sqlite/column-spec.ts +38 -11
  492. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +17 -7
  493. package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
  494. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +37 -17
  495. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +65 -45
  496. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +48 -40
  497. package/src/schema/state/sqlite/mod.ts +9 -12
  498. package/src/schema/state/sqlite/persistence.ts +11 -0
  499. package/src/schema/state/sqlite/query-builder/api.ts +61 -23
  500. package/src/schema/state/sqlite/query-builder/astToSql.ts +117 -23
  501. package/src/schema/state/sqlite/query-builder/impl.test.ts +489 -551
  502. package/src/schema/state/sqlite/query-builder/impl.ts +43 -26
  503. package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
  504. package/src/schema/state/sqlite/schema-helpers.ts +30 -22
  505. package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
  506. package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
  507. package/src/schema/state/sqlite/system-tables/state-tables.ts +109 -0
  508. package/src/schema/state/sqlite/table-def.test.ts +295 -46
  509. package/src/schema/state/sqlite/table-def.ts +109 -64
  510. package/src/schema/unknown-events.ts +132 -0
  511. package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
  512. package/src/schema-management/common.ts +2 -2
  513. package/src/schema-management/migrations.ts +42 -9
  514. package/src/schema-management/validate-schema.ts +3 -3
  515. package/src/session-id-symbol.ts +59 -0
  516. package/src/sql-queries/sql-queries.ts +26 -18
  517. package/src/sql-queries/sql-query-builder.ts +1 -0
  518. package/src/sql-queries/types.ts +6 -7
  519. package/src/sqlite-db-helper.ts +67 -5
  520. package/src/sqlite-types.ts +9 -11
  521. package/src/sync/ClientSessionSyncProcessor.ts +388 -194
  522. package/src/sync/errors.ts +18 -28
  523. package/src/sync/index.ts +2 -0
  524. package/src/sync/mock-sync-backend.test.ts +78 -0
  525. package/src/sync/mock-sync-backend.ts +196 -108
  526. package/src/sync/next/compact-events.ts +10 -11
  527. package/src/sync/next/facts.ts +13 -14
  528. package/src/sync/next/history-dag-common.ts +306 -26
  529. package/src/sync/next/history-dag.ts +20 -13
  530. package/src/sync/next/rebase-events.ts +12 -12
  531. package/src/sync/next/test/compact-events.calculator.test.ts +5 -4
  532. package/src/sync/next/test/compact-events.test.ts +4 -3
  533. package/src/sync/next/test/event-fixtures.ts +14 -14
  534. package/src/sync/next/test/history-dag-common.test.ts +87 -0
  535. package/src/sync/sync-backend-kv.ts +7 -4
  536. package/src/sync/sync-backend.ts +75 -26
  537. package/src/sync/sync.ts +24 -2
  538. package/src/sync/syncstate.test.ts +657 -442
  539. package/src/sync/syncstate.ts +175 -160
  540. package/src/sync/transport-chunking.ts +85 -0
  541. package/src/sync/validate-push-payload.ts +6 -8
  542. package/src/testing/event-factory.ts +10 -12
  543. package/src/util.ts +20 -11
  544. package/src/version.ts +32 -8
  545. package/dist/schema/EventDef.d.ts +0 -126
  546. package/dist/schema/EventDef.d.ts.map +0 -1
  547. package/dist/schema/EventDef.js +0 -46
  548. package/dist/schema/EventDef.js.map +0 -1
  549. package/dist/schema/EventSequenceNumber.d.ts +0 -80
  550. package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
  551. package/dist/schema/EventSequenceNumber.js +0 -139
  552. package/dist/schema/EventSequenceNumber.js.map +0 -1
  553. package/dist/schema/LiveStoreEvent.d.ts +0 -306
  554. package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
  555. package/dist/schema/LiveStoreEvent.js +0 -147
  556. package/dist/schema/LiveStoreEvent.js.map +0 -1
  557. package/dist/schema/state/sqlite/system-tables.d.ts +0 -976
  558. package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
  559. package/dist/schema/state/sqlite/system-tables.js +0 -81
  560. package/dist/schema/state/sqlite/system-tables.js.map +0 -1
  561. package/dist/sql-queries/misc.d.ts +0 -2
  562. package/dist/sql-queries/misc.d.ts.map +0 -1
  563. package/dist/sql-queries/misc.js +0 -2
  564. package/dist/sql-queries/misc.js.map +0 -1
  565. package/dist/sync/next/graphology.d.ts +0 -8
  566. package/dist/sync/next/graphology.d.ts.map +0 -1
  567. package/dist/sync/next/graphology.js +0 -30
  568. package/dist/sync/next/graphology.js.map +0 -1
  569. package/dist/sync/next/graphology_.d.ts +0 -3
  570. package/dist/sync/next/graphology_.d.ts.map +0 -1
  571. package/dist/sync/next/graphology_.js +0 -3
  572. package/dist/sync/next/graphology_.js.map +0 -1
  573. package/src/schema/EventDef.ts +0 -222
  574. package/src/schema/EventSequenceNumber.ts +0 -199
  575. package/src/schema/LiveStoreEvent.ts +0 -286
  576. package/src/schema/state/sqlite/system-tables.ts +0 -106
  577. package/src/sql-queries/misc.ts +0 -2
  578. package/src/sync/next/ambient.d.ts +0 -3
  579. package/src/sync/next/graphology.ts +0 -41
  580. package/src/sync/next/graphology_.ts +0 -2
@@ -1,28 +1,44 @@
1
1
  import { omitUndefineds, shouldNeverHappen } from '@livestore/utils'
2
- import type { HttpClient, Schema, Scope } from '@livestore/utils/effect'
3
- import { Deferred, Effect, KeyValueStore, Layer, PlatformError, Queue, SubscriptionRef } from '@livestore/utils/effect'
2
+ import {
3
+ type HttpClient,
4
+ type Scope,
5
+ Deferred,
6
+ Effect,
7
+ KeyValueStore,
8
+ Latch,
9
+ Layer,
10
+ Option,
11
+ Queue,
12
+ ReadonlyArray,
13
+ Schema,
14
+ Stream,
15
+ Subscribable,
16
+ SubscriptionRef,
17
+ } from '@livestore/utils/effect'
18
+
4
19
  import {
5
20
  type BootStatus,
6
21
  type MakeSqliteDb,
7
22
  type MaterializerHashMismatchError,
8
23
  type SqliteDb,
9
- type SqliteError,
10
- UnexpectedError,
24
+ UnknownError,
11
25
  } from '../adapter-types.ts'
12
26
  import type { MigrationsReport } from '../defs.ts'
13
27
  import type * as Devtools from '../devtools/mod.ts'
14
28
  import type { LiveStoreSchema } from '../schema/mod.ts'
15
29
  import { EventSequenceNumber, LiveStoreEvent, SystemTables } from '../schema/mod.ts'
16
- import type { InvalidPullError, IsOfflineError, SyncOptions } from '../sync/sync.ts'
30
+ import type * as StateHead from '../StateHead.ts'
31
+ import type { SyncBackend, SyncOptions } from '../sync/sync.ts'
17
32
  import { SyncState } from '../sync/syncstate.ts'
18
33
  import { sql } from '../util.ts'
19
34
  import * as Eventlog from './eventlog.ts'
20
- import { makeLeaderSyncProcessor } from './LeaderSyncProcessor.ts'
21
35
  import { bootDevtools } from './leader-worker-devtools.ts'
36
+ import * as LeaderSyncProcessor from './LeaderSyncProcessor.ts'
22
37
  import { makeMaterializeEvent } from './materialize-event.ts'
23
38
  import { recreateDb } from './recreate-db.ts'
24
39
  import type { ShutdownChannel } from './shutdown-channel.ts'
25
40
  import type {
41
+ DevtoolsContext,
26
42
  DevtoolsOptions,
27
43
  InitialBlockingSyncContext,
28
44
  InitialSyncOptions,
@@ -33,7 +49,8 @@ import { LeaderThreadCtx } from './types.ts'
33
49
 
34
50
  export interface MakeLeaderThreadLayerParams {
35
51
  storeId: string
36
- syncPayload: Schema.JsonValue | undefined
52
+ syncPayloadSchema: Schema.Decoder<Schema.Json> | undefined
53
+ syncPayloadEncoded: Schema.Json | undefined
37
54
  clientId: string
38
55
  schema: LiveStoreSchema
39
56
  makeSqliteDb: MakeSqliteDb
@@ -42,6 +59,8 @@ export interface MakeLeaderThreadLayerParams {
42
59
  dbEventlog: LeaderSqliteDb
43
60
  devtoolsOptions: DevtoolsOptions
44
61
  shutdownChannel: ShutdownChannel
62
+ /** Boot warning to emit (e.g., OPFS unavailable in private browsing) */
63
+ bootWarning?: BootStatus
45
64
  params?: {
46
65
  localPushBatchSize?: number
47
66
  backendPushBatchSize?: number
@@ -51,6 +70,9 @@ export interface MakeLeaderThreadLayerParams {
51
70
  delays?: {
52
71
  localPushProcessing?: Effect.Effect<void>
53
72
  }
73
+ hooks?: {
74
+ localPushAdmitted?: (events: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>) => Effect.Effect<void>
75
+ }
54
76
  }
55
77
  }
56
78
  }
@@ -59,18 +81,34 @@ export const makeLeaderThreadLayer = ({
59
81
  schema,
60
82
  storeId,
61
83
  clientId,
62
- syncPayload,
84
+ syncPayloadSchema = Schema.Json,
85
+ syncPayloadEncoded,
63
86
  makeSqliteDb,
64
87
  syncOptions,
65
88
  dbState,
66
89
  dbEventlog,
67
90
  devtoolsOptions,
68
91
  shutdownChannel,
92
+ bootWarning,
69
93
  params,
70
94
  testing,
71
- }: MakeLeaderThreadLayerParams): Layer.Layer<LeaderThreadCtx, UnexpectedError, Scope.Scope | HttpClient.HttpClient> =>
95
+ }: MakeLeaderThreadLayerParams): Layer.Layer<
96
+ LeaderThreadCtx,
97
+ UnknownError,
98
+ Scope.Scope | HttpClient.HttpClient | StateHead.StateHead
99
+ > =>
72
100
  Effect.gen(function* () {
73
- const bootStatusQueue = yield* Queue.unbounded<BootStatus>().pipe(Effect.acquireRelease(Queue.shutdown))
101
+ const syncPayloadDecoded =
102
+ syncPayloadEncoded === undefined
103
+ ? undefined
104
+ : yield* Schema.decodeUnknownEffect(syncPayloadSchema)(syncPayloadEncoded)
105
+
106
+ const bootStatusQueue = yield* Effect.acquireRelease(Queue.unbounded<BootStatus>(), Queue.shutdown)
107
+
108
+ // Emit boot warning if present (e.g., OPFS unavailable in private browsing)
109
+ if (bootWarning !== undefined) {
110
+ yield* Queue.offer(bootStatusQueue, bootWarning)
111
+ }
74
112
 
75
113
  const dbEventlogMissing = !hasEventlogTables(dbEventlog)
76
114
 
@@ -82,36 +120,37 @@ export const makeLeaderThreadLayer = ({
82
120
  const syncBackend =
83
121
  syncOptions?.backend === undefined
84
122
  ? undefined
85
- : yield* syncOptions.backend({ storeId, clientId, payload: syncPayload }).pipe(
123
+ : yield* syncOptions.backend({ storeId, clientId, payload: syncPayloadDecoded }).pipe(
86
124
  Effect.provide(
87
125
  Layer.succeed(
88
126
  KeyValueStore.KeyValueStore,
89
127
  KeyValueStore.makeStringOnly({
90
128
  get: (_key) =>
91
129
  Effect.sync(() => Eventlog.getBackendIdFromDb(dbEventlog)).pipe(
92
- Effect.catchAllDefect((cause) =>
93
- PlatformError.BadArgument.make({
94
- method: 'getBackendIdFromDb',
95
- description: 'Failed to get backendId',
96
- module: 'KeyValueStore',
97
- cause,
98
- }),
130
+ Effect.map(Option.getOrUndefined),
131
+ Effect.catchDefect(
132
+ (cause) =>
133
+ new KeyValueStore.KeyValueStoreError({
134
+ method: 'getBackendIdFromDb',
135
+ message: 'Failed to get backendId',
136
+ cause,
137
+ }),
99
138
  ),
100
139
  ),
101
140
  set: (_key, value) =>
102
141
  Effect.sync(() => Eventlog.updateBackendId(dbEventlog, value)).pipe(
103
- Effect.catchAllDefect((cause) =>
104
- PlatformError.BadArgument.make({
105
- method: 'updateBackendId',
106
- module: 'KeyValueStore',
107
- description: 'Failed to update backendId',
108
- cause,
109
- }),
142
+ Effect.catchDefect(
143
+ (cause) =>
144
+ new KeyValueStore.KeyValueStoreError({
145
+ method: 'updateBackendId',
146
+ message: 'Failed to update backendId',
147
+ cause,
148
+ }),
110
149
  ),
111
150
  ),
112
- clear: Effect.dieMessage(`Not implemented. Should never be used.`),
113
- remove: () => Effect.dieMessage(`Not implemented. Should never be used.`),
114
- size: Effect.dieMessage(`Not implemented. Should never be used.`),
151
+ clear: Effect.die(new Error(`Not implemented. Should never be used.`)),
152
+ remove: () => Effect.die(new Error(`Not implemented. Should never be used.`)),
153
+ size: Effect.die(new Error(`Not implemented. Should never be used.`)),
115
154
  }),
116
155
  ),
117
156
  ),
@@ -131,16 +170,18 @@ export const makeLeaderThreadLayer = ({
131
170
 
132
171
  // Recreate state database if needed BEFORE creating sync processor
133
172
  // This ensures all system tables exist before any queries are made
134
- const { migrationsReport } = dbStateMissing
135
- ? yield* recreateDb({ dbState, dbEventlog, schema, bootStatusQueue, materializeEvent })
136
- : { migrationsReport: { migrations: [] } }
173
+ const { migrationsReport } =
174
+ dbStateMissing === true
175
+ ? yield* recreateDb({ dbState, dbEventlog, schema, bootStatusQueue, materializeEvent })
176
+ : { migrationsReport: { migrations: [] } }
137
177
 
138
- const syncProcessor = yield* makeLeaderSyncProcessor({
178
+ const syncProcessor = yield* LeaderSyncProcessor.make({
139
179
  schema,
140
180
  dbState,
141
181
  initialSyncState: getInitialSyncState({ dbEventlog, dbState, dbEventlogMissing }),
142
182
  initialBlockingSyncContext,
143
183
  onError: syncOptions?.onSyncError ?? 'ignore',
184
+ onBackendIdMismatch: syncOptions?.onBackendIdMismatch ?? 'reset',
144
185
  livePull: syncOptions?.livePull ?? true,
145
186
  params: {
146
187
  ...omitUndefineds({
@@ -149,21 +190,25 @@ export const makeLeaderThreadLayer = ({
149
190
  }),
150
191
  },
151
192
  testing: {
152
- ...omitUndefineds({ delays: testing?.syncProcessor?.delays }),
193
+ ...omitUndefineds({ delays: testing?.syncProcessor?.delays, hooks: testing?.syncProcessor?.hooks }),
153
194
  },
154
195
  })
155
196
 
156
- const extraIncomingMessagesQueue = yield* Queue.unbounded<Devtools.Leader.MessageToApp>().pipe(
157
- Effect.acquireRelease(Queue.shutdown),
197
+ const extraIncomingMessagesQueue = yield* Effect.acquireRelease(
198
+ Queue.unbounded<Devtools.Leader.MessageToApp>(),
199
+ Queue.shutdown,
158
200
  )
159
201
 
160
- const devtoolsContext = devtoolsOptions.enabled
161
- ? {
162
- enabled: true as const,
163
- syncBackendLatch: yield* Effect.makeLatch(true),
164
- syncBackendLatchState: yield* SubscriptionRef.make<{ latchClosed: boolean }>({ latchClosed: false }),
165
- }
166
- : { enabled: false as const }
202
+ const devtoolsContext =
203
+ devtoolsOptions.enabled === true
204
+ ? {
205
+ enabled: true as const,
206
+ syncBackendLatch: yield* Latch.make(true),
207
+ syncBackendLatchState: yield* SubscriptionRef.make<{ latchClosed: boolean }>({ latchClosed: false }),
208
+ }
209
+ : { enabled: false as const }
210
+
211
+ const networkStatus = yield* makeNetworkStatusSubscribable({ syncBackend, devtoolsContext })
167
212
 
168
213
  const ctx = {
169
214
  schema,
@@ -173,7 +218,7 @@ export const makeLeaderThreadLayer = ({
173
218
  dbState,
174
219
  dbEventlog,
175
220
  makeSqliteDb,
176
- eventSchema: LiveStoreEvent.makeEventDefSchema(schema),
221
+ eventSchema: LiveStoreEvent.Client.makeSchema(schema),
177
222
  shutdownStateSubRef: yield* SubscriptionRef.make<ShutdownState>('running'),
178
223
  shutdownChannel,
179
224
  syncBackend,
@@ -181,14 +226,15 @@ export const makeLeaderThreadLayer = ({
181
226
  materializeEvent,
182
227
  extraIncomingMessagesQueue,
183
228
  devtools: devtoolsContext,
229
+ networkStatus,
184
230
  // State will be set during `bootLeaderThread`
185
- initialState: {} as any as LeaderThreadCtx['Type']['initialState'],
186
- } satisfies typeof LeaderThreadCtx.Service
231
+ initialState: {} as any as LeaderThreadCtx['Service']['initialState'],
232
+ } satisfies LeaderThreadCtx['Service']
187
233
 
188
234
  // @ts-expect-error For debugging purposes
189
235
  globalThis.__leaderThreadCtx = ctx
190
236
 
191
- const layer = Layer.succeed(LeaderThreadCtx, ctx)
237
+ const layer = Layer.succeed(LeaderThreadCtx, LeaderThreadCtx.of(ctx))
192
238
 
193
239
  ctx.initialState = yield* bootLeaderThread({
194
240
  migrationsReport,
@@ -200,31 +246,19 @@ export const makeLeaderThreadLayer = ({
200
246
  }).pipe(
201
247
  Effect.withSpan('@livestore/common:leader-thread:boot'),
202
248
  Effect.withSpanScoped('@livestore/common:leader-thread'),
203
- UnexpectedError.mapToUnexpectedError,
249
+ UnknownError.mapToUnknownError,
204
250
  Effect.tapCauseLogPretty,
205
- Layer.unwrapScoped,
251
+ Layer.unwrap,
206
252
  )
207
253
 
208
254
  const hasEventlogTables = (db: SqliteDb) => {
209
255
  const tableNames = new Set(db.select<{ name: string }>(sql`select name from sqlite_master`).map((_) => _.name))
210
- const eventlogTables = new Set(SystemTables.eventlogSystemTables.map((_) => _.sqliteDef.name))
211
- return isSubsetOf(eventlogTables, tableNames)
256
+ return ReadonlyArray.every(SystemTables.eventlogSystemTables, (_) => tableNames.has(_.sqliteDef.name))
212
257
  }
213
258
 
214
259
  const hasStateTables = (db: SqliteDb) => {
215
260
  const tableNames = new Set(db.select<{ name: string }>(sql`select name from sqlite_master`).map((_) => _.name))
216
- const stateTables = new Set(SystemTables.stateSystemTables.map((_) => _.sqliteDef.name))
217
- return isSubsetOf(stateTables, tableNames)
218
- }
219
-
220
- const isSubsetOf = (a: Set<string>, b: Set<string>): boolean => {
221
- for (const item of a) {
222
- if (!b.has(item)) {
223
- return false
224
- }
225
- }
226
-
227
- return true
261
+ return ReadonlyArray.every(SystemTables.stateSystemTables, (_) => tableNames.has(_.sqliteDef.name))
228
262
  }
229
263
 
230
264
  const getInitialSyncState = ({
@@ -236,11 +270,11 @@ const getInitialSyncState = ({
236
270
  dbState: SqliteDb
237
271
  dbEventlogMissing: boolean
238
272
  }) => {
239
- const initialBackendHead = dbEventlogMissing
240
- ? EventSequenceNumber.ROOT.global
241
- : Eventlog.getBackendHeadFromDb(dbEventlog)
273
+ const initialBackendHead =
274
+ dbEventlogMissing === true ? EventSequenceNumber.Client.ROOT.global : Eventlog.getBackendHeadFromDb(dbEventlog)
242
275
 
243
- const initialLocalHead = dbEventlogMissing ? EventSequenceNumber.ROOT : Eventlog.getClientHeadFromDb(dbEventlog)
276
+ const initialLocalHead =
277
+ dbEventlogMissing === true ? EventSequenceNumber.Client.ROOT : Eventlog.getClientHeadFromDb(dbEventlog)
244
278
 
245
279
  if (initialBackendHead > initialLocalHead.global) {
246
280
  return shouldNeverHappen(
@@ -252,20 +286,21 @@ const getInitialSyncState = ({
252
286
  localHead: initialLocalHead,
253
287
  upstreamHead: {
254
288
  global: initialBackendHead,
255
- client: EventSequenceNumber.clientDefault,
256
- rebaseGeneration: EventSequenceNumber.rebaseGenerationDefault,
289
+ client: EventSequenceNumber.Client.DEFAULT,
290
+ rebaseGeneration: EventSequenceNumber.Client.REBASE_GENERATION_DEFAULT,
257
291
  },
258
- pending: dbEventlogMissing
259
- ? []
260
- : Eventlog.getEventsSince({
261
- dbEventlog,
262
- dbState,
263
- since: {
264
- global: initialBackendHead,
265
- client: EventSequenceNumber.clientDefault,
266
- rebaseGeneration: initialLocalHead.rebaseGeneration,
267
- },
268
- }),
292
+ pending:
293
+ dbEventlogMissing === true
294
+ ? []
295
+ : Eventlog.getEventsSince({
296
+ dbEventlog,
297
+ dbState,
298
+ since: {
299
+ global: initialBackendHead,
300
+ client: EventSequenceNumber.Client.DEFAULT,
301
+ rebaseGeneration: initialLocalHead.rebaseGeneration,
302
+ },
303
+ }),
269
304
  })
270
305
  }
271
306
 
@@ -329,8 +364,8 @@ const bootLeaderThread = ({
329
364
  initialBlockingSyncContext: InitialBlockingSyncContext
330
365
  devtoolsOptions: DevtoolsOptions
331
366
  }): Effect.Effect<
332
- LeaderThreadCtx['Type']['initialState'],
333
- UnexpectedError | SqliteError | IsOfflineError | InvalidPullError | MaterializerHashMismatchError,
367
+ LeaderThreadCtx['Service']['initialState'],
368
+ UnknownError | MaterializerHashMismatchError,
334
369
  LeaderThreadCtx | Scope.Scope | HttpClient.HttpClient
335
370
  > =>
336
371
  Effect.gen(function* () {
@@ -346,7 +381,7 @@ const bootLeaderThread = ({
346
381
  progress: { done: 0, total: -1 },
347
382
  })
348
383
 
349
- yield* initialBlockingSyncContext.blockingDeferred.pipe(
384
+ yield* Deferred.await(initialBlockingSyncContext.blockingDeferred).pipe(
350
385
  Effect.withSpan('@livestore/common:leader-thread:initial-sync-blocking'),
351
386
  )
352
387
  }
@@ -357,3 +392,56 @@ const bootLeaderThread = ({
357
392
 
358
393
  return { migrationsReport, leaderHead: initialLeaderHead }
359
394
  })
395
+
396
+ /** @internal */
397
+ export const makeNetworkStatusSubscribable = ({
398
+ syncBackend,
399
+ devtoolsContext,
400
+ }: {
401
+ syncBackend: SyncBackend.SyncBackend | undefined
402
+ devtoolsContext: DevtoolsContext
403
+ }): Effect.Effect<Subscribable.Subscribable<SyncBackend.NetworkStatus>, never, Scope.Scope> =>
404
+ Effect.gen(function* () {
405
+ const initialIsConnected = syncBackend !== undefined ? yield* SubscriptionRef.get(syncBackend.isConnected) : false
406
+ const initialLatchClosed =
407
+ devtoolsContext.enabled === true
408
+ ? (yield* SubscriptionRef.get(devtoolsContext.syncBackendLatchState)).latchClosed
409
+ : false
410
+
411
+ const networkStatusRef = yield* SubscriptionRef.make<SyncBackend.NetworkStatus>({
412
+ isConnected: initialIsConnected,
413
+ timestampMs: Date.now(),
414
+ devtools: { latchClosed: initialLatchClosed },
415
+ })
416
+
417
+ const updateNetworkStatus = (patch: { isConnected?: boolean; latchClosed?: boolean }) =>
418
+ SubscriptionRef.update(networkStatusRef, (previous) => ({
419
+ isConnected: patch.isConnected ?? previous.isConnected,
420
+ timestampMs: Date.now(),
421
+ devtools: {
422
+ latchClosed: patch.latchClosed ?? previous.devtools.latchClosed,
423
+ },
424
+ }))
425
+
426
+ if (syncBackend !== undefined) {
427
+ yield* SubscriptionRef.changes(syncBackend.isConnected).pipe(
428
+ Stream.tap((isConnected) => updateNetworkStatus({ isConnected })),
429
+ Stream.runDrain,
430
+ Effect.interruptible,
431
+ Effect.tapCauseLogPretty,
432
+ Effect.forkScoped,
433
+ )
434
+ }
435
+
436
+ if (devtoolsContext.enabled === true) {
437
+ yield* SubscriptionRef.changes(devtoolsContext.syncBackendLatchState).pipe(
438
+ Stream.tap(({ latchClosed }) => updateNetworkStatus({ latchClosed })),
439
+ Stream.runDrain,
440
+ Effect.interruptible,
441
+ Effect.tapCauseLogPretty,
442
+ Effect.forkScoped,
443
+ )
444
+ }
445
+
446
+ return Subscribable.fromSubscriptionRef(networkStatusRef)
447
+ })
@@ -3,9 +3,11 @@ import { Effect, Option, ReadonlyArray, Schema } from '@livestore/utils/effect'
3
3
 
4
4
  import { MaterializeError, MaterializerHashMismatchError, type SqliteDb } from '../adapter-types.ts'
5
5
  import { getExecStatementsFromMaterializer, hashMaterializerResults } from '../materializer-helper.ts'
6
+ import { logDeprecationWarnings } from '../schema/EventDef/deprecated.ts'
6
7
  import type { LiveStoreSchema } from '../schema/mod.ts'
7
- import { EventSequenceNumber, getEventDef, SystemTables } from '../schema/mod.ts'
8
+ import { EventSequenceNumber, resolveEventDef, SystemTables, UNKNOWN_EVENT_SCHEMA_HASH } from '../schema/mod.ts'
8
9
  import { insertRow } from '../sql-queries/index.ts'
10
+ import * as StateHead from '../StateHead.ts'
9
11
  import { sql } from '../util.ts'
10
12
  import { execSql, execSqlPrepared } from './connection.ts'
11
13
  import * as Eventlog from './eventlog.ts'
@@ -20,8 +22,9 @@ export const makeMaterializeEvent = ({
20
22
  schema: LiveStoreSchema
21
23
  dbState: SqliteDb
22
24
  dbEventlog: SqliteDb
23
- }): Effect.Effect<MaterializeEvent> =>
25
+ }): Effect.Effect<MaterializeEvent, never, StateHead.StateHead> =>
24
26
  Effect.gen(function* () {
27
+ const stateHead = yield* StateHead.StateHead
25
28
  const eventDefSchemaHashMap = new Map(
26
29
  // TODO Running `Schema.hash` can be a bottleneck for larger schemas. There is an opportunity to run this
27
30
  // at build time and lookup the pre-computed hash at runtime.
@@ -33,8 +36,38 @@ export const makeMaterializeEvent = ({
33
36
  Effect.gen(function* () {
34
37
  const skipEventlog = options?.skipEventlog ?? false
35
38
 
36
- const eventName = eventEncoded.name
37
- const { eventDef, materializer } = getEventDef(schema, eventName)
39
+ const resolution = yield* resolveEventDef(schema, {
40
+ operation: '@livestore/common:leader-thread:materializeEvent',
41
+ event: eventEncoded,
42
+ })
43
+
44
+ if (resolution._tag === 'unknown') {
45
+ // Unknown events still enter the eventlog so newer clients can replay
46
+ // them once they learn the schema. We skip materialization to keep the
47
+ // local state consistent with the knowledge of the current client.
48
+ if (skipEventlog === false) {
49
+ yield* Eventlog.insertIntoEventlog(
50
+ eventEncoded,
51
+ dbEventlog,
52
+ UNKNOWN_EVENT_SCHEMA_HASH,
53
+ eventEncoded.clientId,
54
+ eventEncoded.sessionId,
55
+ )
56
+ }
57
+
58
+ yield* stateHead.set(eventEncoded.seqNum)
59
+ dbState.debug.head = eventEncoded.seqNum
60
+
61
+ return {
62
+ sessionChangeset: { _tag: 'no-op' as const },
63
+ hash: Option.none(),
64
+ }
65
+ }
66
+
67
+ const { eventDef, materializer } = resolution
68
+
69
+ // Log deprecation warnings for deprecated events/fields
70
+ yield* logDeprecationWarnings(eventDef, eventEncoded.args as Record<string, unknown>)
38
71
 
39
72
  const execArgsArr = getExecStatementsFromMaterializer({
40
73
  eventDef,
@@ -43,7 +76,7 @@ export const makeMaterializeEvent = ({
43
76
  event: { decoded: undefined, encoded: eventEncoded },
44
77
  })
45
78
 
46
- const materializerHash = isDevEnv() ? Option.some(hashMaterializerResults(execArgsArr)) : Option.none()
79
+ const materializerHash = isDevEnv() === true ? Option.some(hashMaterializerResults(execArgsArr)) : Option.none()
47
80
 
48
81
  if (
49
82
  materializerHash._tag === 'Some' &&
@@ -89,10 +122,11 @@ export const makeMaterializeEvent = ({
89
122
  seqNumRebaseGeneration: eventEncoded.seqNum.rebaseGeneration,
90
123
  // NOTE the changeset will be empty (i.e. null) for no-op events
91
124
  changeset: changeset ?? null,
92
- debug: LS_DEV ? execArgsArr : null,
125
+ debug: LS_DEV === true ? execArgsArr : null,
93
126
  },
94
127
  }),
95
128
  )
129
+ yield* stateHead.set(eventEncoded.seqNum)
96
130
 
97
131
  // console.groupEnd()
98
132
 
@@ -114,13 +148,14 @@ export const makeMaterializeEvent = ({
114
148
  }
115
149
 
116
150
  return {
117
- sessionChangeset: changeset
118
- ? {
119
- _tag: 'sessionChangeset' as const,
120
- data: changeset,
121
- debug: LS_DEV ? execArgsArr : null,
122
- }
123
- : { _tag: 'no-op' as const },
151
+ sessionChangeset:
152
+ changeset !== undefined
153
+ ? {
154
+ _tag: 'sessionChangeset' as const,
155
+ data: changeset,
156
+ debug: LS_DEV === true ? execArgsArr : null,
157
+ }
158
+ : { _tag: 'no-op' as const },
124
159
  hash: materializerHash,
125
160
  }
126
161
  }).pipe(
@@ -129,7 +164,7 @@ export const makeMaterializeEvent = ({
129
164
  attributes: {
130
165
  eventName: eventEncoded.name,
131
166
  eventNum: eventEncoded.seqNum,
132
- 'span.label': `${EventSequenceNumber.toString(eventEncoded.seqNum)} ${eventEncoded.name}`,
167
+ 'span.label': `${EventSequenceNumber.Client.toString(eventEncoded.seqNum)} ${eventEncoded.name}`,
133
168
  },
134
169
  }),
135
170
  // Effect.logDuration('@livestore/common:leader-thread:materializeEvent'),
@@ -143,7 +178,7 @@ export const rollback = ({
143
178
  }: {
144
179
  dbState: SqliteDb
145
180
  dbEventlog: SqliteDb
146
- eventNumsToRollback: EventSequenceNumber.EventSequenceNumber[]
181
+ eventNumsToRollback: EventSequenceNumber.Client.Composite[]
147
182
  }) =>
148
183
  Effect.gen(function* () {
149
184
  const rollbackEvents = dbState
@@ -159,7 +194,7 @@ export const rollback = ({
159
194
  changeset: _.changeset,
160
195
  debug: _.debug,
161
196
  }))
162
- .toSorted((a, b) => EventSequenceNumber.compare(a.seqNum, b.seqNum))
197
+ .toSorted((a, b) => EventSequenceNumber.Client.compare(a.seqNum, b.seqNum))
163
198
 
164
199
  // Apply changesets in reverse order
165
200
  for (let i = rollbackEvents.length - 1; i >= 0; i--) {
@@ -5,4 +5,5 @@ export * from './make-leader-thread-layer.ts'
5
5
  export * from './materialize-event.ts'
6
6
  export * from './recreate-db.ts'
7
7
  export * as ShutdownChannel from './shutdown-channel.ts'
8
+ export * from './stream-events.ts'
8
9
  export * from './types.ts'
@@ -1,16 +1,14 @@
1
- import { casesHandled } from '@livestore/utils'
2
1
  import { Effect, Queue } from '@livestore/utils/effect'
3
2
 
4
3
  import type { MigrationsReport } from '../defs.ts'
5
4
  import {
6
5
  type BootStatus,
7
6
  type MaterializeError,
8
- type MigrationHooks,
9
7
  migrateDb,
10
8
  rematerializeFromEventlog,
11
9
  type SqliteDb,
12
10
  type SqliteError,
13
- UnexpectedError,
11
+ UnknownError,
14
12
  } from '../index.ts'
15
13
  import type { LiveStoreSchema } from '../schema/mod.ts'
16
14
  import { configureConnection } from './connection.ts'
@@ -28,10 +26,9 @@ export const recreateDb = ({
28
26
  schema: LiveStoreSchema
29
27
  bootStatusQueue: Queue.Queue<BootStatus>
30
28
  materializeEvent: MaterializeEvent
31
- }): Effect.Effect<{ migrationsReport: MigrationsReport }, UnexpectedError | MaterializeError | SqliteError> =>
29
+ }): Effect.Effect<{ migrationsReport: MigrationsReport }, UnknownError | MaterializeError | SqliteError> =>
32
30
  Effect.gen(function* () {
33
- const migrationOptions = schema.state.sqlite.migrations
34
- let migrationsReport: MigrationsReport
31
+ const hooks = schema.state.sqlite.migrations.hooks
35
32
 
36
33
  yield* Effect.addFinalizer(
37
34
  Effect.fn('recreateDb:finalizer')(function* (ex) {
@@ -46,61 +43,29 @@ export const recreateDb = ({
46
43
  const tmpDb = dbState
47
44
  yield* configureConnection(tmpDb, { foreignKeys: true })
48
45
 
49
- const initDb = (hooks: Partial<MigrationHooks> | undefined) =>
50
- Effect.gen(function* () {
51
- yield* Effect.tryAll(() => hooks?.init?.(tmpDb)).pipe(UnexpectedError.mapToUnexpectedError)
52
-
53
- const migrationsReport = yield* migrateDb({
54
- db: tmpDb,
55
- schema,
56
- onProgress: ({ done, total }) =>
57
- Queue.offer(bootStatusQueue, { stage: 'migrating', progress: { done, total } }),
58
- })
59
-
60
- yield* Effect.tryAll(() => hooks?.pre?.(tmpDb)).pipe(UnexpectedError.mapToUnexpectedError)
61
-
62
- return { migrationsReport, tmpDb }
63
- })
64
-
65
- switch (migrationOptions.strategy) {
66
- case 'auto': {
67
- const hooks = migrationOptions.hooks
68
- const initResult = yield* initDb(hooks)
69
-
70
- migrationsReport = initResult.migrationsReport
71
-
72
- yield* rematerializeFromEventlog({
73
- // db: initResult.tmpDb,
74
- dbEventlog,
75
- schema,
76
- materializeEvent,
77
- onProgress: ({ done, total }) =>
78
- Queue.offer(bootStatusQueue, { stage: 'rehydrating', progress: { done, total } }),
79
- })
80
-
81
- yield* Effect.tryAll(() => hooks?.post?.(initResult.tmpDb)).pipe(UnexpectedError.mapToUnexpectedError)
82
-
83
- break
84
- }
85
- case 'manual': {
86
- const oldDbData = dbState.export()
87
-
88
- migrationsReport = { migrations: [] }
89
-
90
- const newDbData = yield* Effect.tryAll(() => migrationOptions.migrate(oldDbData)).pipe(
91
- UnexpectedError.mapToUnexpectedError,
92
- )
93
-
94
- tmpDb.import(newDbData)
95
-
96
- // TODO validate schema
97
-
98
- break
99
- }
100
- default: {
101
- casesHandled(migrationOptions)
102
- }
103
- }
46
+ // @effect-diagnostics-next-line anyUnknownInErrorContext:off -- user hook errors are immediately normalized to LiveStore UnknownError
47
+ yield* Effect.trySyncOrPromiseOrEffect(() => hooks?.init?.(tmpDb)).pipe(UnknownError.mapToUnknownError)
48
+
49
+ const migrationsReport = yield* migrateDb({
50
+ db: tmpDb,
51
+ schema,
52
+ onProgress: ({ done, total }) => Queue.offer(bootStatusQueue, { stage: 'migrating', progress: { done, total } }),
53
+ })
54
+
55
+ // @effect-diagnostics-next-line anyUnknownInErrorContext:off -- user hook errors are immediately normalized to LiveStore UnknownError
56
+ yield* Effect.trySyncOrPromiseOrEffect(() => hooks?.pre?.(tmpDb)).pipe(UnknownError.mapToUnknownError)
57
+
58
+ yield* rematerializeFromEventlog({
59
+ // db: tmpDb,
60
+ dbEventlog,
61
+ schema,
62
+ materializeEvent,
63
+ onProgress: ({ done, total }) =>
64
+ Queue.offer(bootStatusQueue, { stage: 'rehydrating', progress: { done, total } }),
65
+ })
66
+
67
+ // @effect-diagnostics-next-line anyUnknownInErrorContext:off -- user hook errors are immediately normalized to LiveStore UnknownError
68
+ yield* Effect.trySyncOrPromiseOrEffect(() => hooks?.post?.(tmpDb)).pipe(UnknownError.mapToUnknownError)
104
69
 
105
70
  // TODO bring back
106
71
  // Import the temporary in-memory database into the persistent database