@livestore/common 0.3.1 → 0.3.2-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +35 -0
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -0
  4. package/dist/ClientSessionLeaderThreadProxy.js +6 -0
  5. package/dist/ClientSessionLeaderThreadProxy.js.map +1 -0
  6. package/dist/__tests__/fixture.d.ts +4 -4
  7. package/dist/__tests__/fixture.js +2 -2
  8. package/dist/adapter-types.d.ts +11 -162
  9. package/dist/adapter-types.d.ts.map +1 -1
  10. package/dist/adapter-types.js +5 -49
  11. package/dist/adapter-types.js.map +1 -1
  12. package/dist/debug-info.d.ts +2 -2
  13. package/dist/debug-info.js +2 -2
  14. package/dist/defs.d.ts +20 -0
  15. package/dist/defs.d.ts.map +1 -0
  16. package/dist/defs.js +12 -0
  17. package/dist/defs.js.map +1 -0
  18. package/dist/devtools/devtools-messages-client-session.d.ts +29 -27
  19. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  20. package/dist/devtools/devtools-messages-client-session.js +4 -4
  21. package/dist/devtools/devtools-messages-common.d.ts +6 -6
  22. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  23. package/dist/devtools/devtools-messages-common.js +1 -1
  24. package/dist/devtools/devtools-messages-leader.d.ts +37 -35
  25. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  26. package/dist/devtools/devtools-messages-leader.js +4 -4
  27. package/dist/devtools/devtools-messages.d.ts +3 -3
  28. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  29. package/dist/devtools/devtools-messages.js +3 -3
  30. package/dist/devtools/devtools-messages.js.map +1 -1
  31. package/dist/devtools/mod.d.ts +3 -3
  32. package/dist/devtools/mod.js +3 -3
  33. package/dist/errors.d.ts +50 -0
  34. package/dist/errors.d.ts.map +1 -0
  35. package/dist/errors.js +36 -0
  36. package/dist/errors.js.map +1 -0
  37. package/dist/index.d.ts +16 -16
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +16 -16
  40. package/dist/index.js.map +1 -1
  41. package/dist/leader-thread/LeaderSyncProcessor.d.ts +10 -11
  42. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  43. package/dist/leader-thread/LeaderSyncProcessor.js +122 -132
  44. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  45. package/dist/leader-thread/connection.d.ts +4 -4
  46. package/dist/leader-thread/connection.js +2 -2
  47. package/dist/leader-thread/eventlog.d.ts +21 -10
  48. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  49. package/dist/leader-thread/eventlog.js +39 -24
  50. package/dist/leader-thread/eventlog.js.map +1 -1
  51. package/dist/leader-thread/leader-worker-devtools.d.ts +3 -3
  52. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  53. package/dist/leader-thread/leader-worker-devtools.js +4 -5
  54. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  55. package/dist/leader-thread/make-leader-thread-layer.d.ts +7 -7
  56. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  57. package/dist/leader-thread/make-leader-thread-layer.js +44 -14
  58. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  59. package/dist/leader-thread/materialize-event.d.ts +4 -4
  60. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  61. package/dist/leader-thread/materialize-event.js +14 -8
  62. package/dist/leader-thread/materialize-event.js.map +1 -1
  63. package/dist/leader-thread/mod.d.ts +8 -7
  64. package/dist/leader-thread/mod.d.ts.map +1 -1
  65. package/dist/leader-thread/mod.js +8 -7
  66. package/dist/leader-thread/mod.js.map +1 -1
  67. package/dist/leader-thread/recreate-db.d.ts +14 -7
  68. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  69. package/dist/leader-thread/recreate-db.js +3 -5
  70. package/dist/leader-thread/recreate-db.js.map +1 -1
  71. package/dist/leader-thread/shutdown-channel.d.ts +1 -1
  72. package/dist/leader-thread/shutdown-channel.js +1 -1
  73. package/dist/leader-thread/types.d.ts +8 -10
  74. package/dist/leader-thread/types.d.ts.map +1 -1
  75. package/dist/make-client-session.d.ts +3 -3
  76. package/dist/make-client-session.d.ts.map +1 -1
  77. package/dist/make-client-session.js +3 -3
  78. package/dist/make-client-session.js.map +1 -1
  79. package/dist/materializer-helper.d.ts +5 -5
  80. package/dist/materializer-helper.js +5 -5
  81. package/dist/rematerialize-from-eventlog.d.ts +4 -4
  82. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  83. package/dist/rematerialize-from-eventlog.js +13 -5
  84. package/dist/rematerialize-from-eventlog.js.map +1 -1
  85. package/dist/schema/EventDef.d.ts +5 -5
  86. package/dist/schema/EventDef.d.ts.map +1 -1
  87. package/dist/schema/EventDef.js +2 -2
  88. package/dist/schema/EventDef.js.map +1 -1
  89. package/dist/schema/EventSequenceNumber.d.ts +20 -2
  90. package/dist/schema/EventSequenceNumber.d.ts.map +1 -1
  91. package/dist/schema/EventSequenceNumber.js +71 -19
  92. package/dist/schema/EventSequenceNumber.js.map +1 -1
  93. package/dist/schema/EventSequenceNumber.test.js +89 -4
  94. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  95. package/dist/schema/LiveStoreEvent.d.ts +26 -12
  96. package/dist/schema/LiveStoreEvent.d.ts.map +1 -1
  97. package/dist/schema/LiveStoreEvent.js +13 -5
  98. package/dist/schema/LiveStoreEvent.js.map +1 -1
  99. package/dist/schema/events.d.ts +1 -1
  100. package/dist/schema/events.d.ts.map +1 -1
  101. package/dist/schema/events.js +1 -1
  102. package/dist/schema/events.js.map +1 -1
  103. package/dist/schema/mod.d.ts +9 -9
  104. package/dist/schema/mod.d.ts.map +1 -1
  105. package/dist/schema/mod.js +9 -9
  106. package/dist/schema/mod.js.map +1 -1
  107. package/dist/schema/schema.d.ts +4 -4
  108. package/dist/schema/schema.js +3 -3
  109. package/dist/schema/state/mod.d.ts +2 -2
  110. package/dist/schema/state/mod.js +2 -2
  111. package/dist/schema/state/sqlite/client-document-def.d.ts +5 -5
  112. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  113. package/dist/schema/state/sqlite/client-document-def.js +6 -6
  114. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  115. package/dist/schema/state/sqlite/client-document-def.test.js +4 -6
  116. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  117. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +1 -1
  118. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts +1 -1
  119. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +2 -2
  120. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  121. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +1 -1
  122. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +3 -3
  123. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  124. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +1 -1
  125. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  126. package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +1 -1
  127. package/dist/schema/state/sqlite/db-schema/hash.js +3 -2
  128. package/dist/schema/state/sqlite/db-schema/hash.js.map +1 -1
  129. package/dist/schema/state/sqlite/db-schema/mod.d.ts +2 -2
  130. package/dist/schema/state/sqlite/db-schema/mod.d.ts.map +1 -1
  131. package/dist/schema/state/sqlite/db-schema/mod.js +2 -2
  132. package/dist/schema/state/sqlite/db-schema/mod.js.map +1 -1
  133. package/dist/schema/state/sqlite/mod.d.ts +7 -7
  134. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  135. package/dist/schema/state/sqlite/mod.js +7 -7
  136. package/dist/schema/state/sqlite/mod.js.map +1 -1
  137. package/dist/schema/state/sqlite/query-builder/api.d.ts +40 -13
  138. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  139. package/dist/schema/state/sqlite/query-builder/api.js.map +1 -1
  140. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts +2 -2
  141. package/dist/schema/state/sqlite/query-builder/astToSql.js +1 -1
  142. package/dist/schema/state/sqlite/query-builder/impl.d.ts +2 -2
  143. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  144. package/dist/schema/state/sqlite/query-builder/impl.js +20 -25
  145. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  146. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts +1 -81
  147. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts.map +1 -1
  148. package/dist/schema/state/sqlite/query-builder/impl.test.js +36 -22
  149. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  150. package/dist/schema/state/sqlite/query-builder/mod.d.ts +2 -2
  151. package/dist/schema/state/sqlite/query-builder/mod.js +2 -2
  152. package/dist/schema/state/sqlite/schema-helpers.d.ts +1 -1
  153. package/dist/schema/state/sqlite/schema-helpers.js +1 -1
  154. package/dist/schema/state/sqlite/system-tables.d.ts +72 -67
  155. package/dist/schema/state/sqlite/system-tables.d.ts.map +1 -1
  156. package/dist/schema/state/sqlite/system-tables.js +11 -20
  157. package/dist/schema/state/sqlite/system-tables.js.map +1 -1
  158. package/dist/schema/state/sqlite/table-def.d.ts +3 -3
  159. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  160. package/dist/schema/state/sqlite/table-def.js +2 -2
  161. package/dist/schema-management/common.d.ts +2 -2
  162. package/dist/schema-management/common.js +1 -1
  163. package/dist/schema-management/migrations.d.ts +6 -4
  164. package/dist/schema-management/migrations.d.ts.map +1 -1
  165. package/dist/schema-management/migrations.js +5 -5
  166. package/dist/schema-management/migrations.js.map +1 -1
  167. package/dist/schema-management/validate-schema.d.ts +4 -4
  168. package/dist/schema-management/validate-schema.js +1 -1
  169. package/dist/sql-queries/index.d.ts +3 -3
  170. package/dist/sql-queries/index.js +3 -3
  171. package/dist/sql-queries/sql-queries.d.ts +2 -2
  172. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  173. package/dist/sql-queries/sql-queries.js +5 -3
  174. package/dist/sql-queries/sql-queries.js.map +1 -1
  175. package/dist/sql-queries/sql-query-builder.d.ts +3 -3
  176. package/dist/sql-queries/sql-query-builder.js +1 -1
  177. package/dist/sql-queries/types.d.ts +1 -1
  178. package/dist/sqlite-db-helper.d.ts +2 -2
  179. package/dist/sqlite-db-helper.js +1 -1
  180. package/dist/sqlite-types.d.ts +72 -0
  181. package/dist/sqlite-types.d.ts.map +1 -0
  182. package/dist/sqlite-types.js +5 -0
  183. package/dist/sqlite-types.js.map +1 -0
  184. package/dist/sync/ClientSessionSyncProcessor.d.ts +22 -7
  185. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  186. package/dist/sync/ClientSessionSyncProcessor.js +43 -21
  187. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  188. package/dist/sync/index.d.ts +3 -3
  189. package/dist/sync/index.d.ts.map +1 -1
  190. package/dist/sync/index.js +3 -3
  191. package/dist/sync/index.js.map +1 -1
  192. package/dist/sync/next/compact-events.d.ts +1 -1
  193. package/dist/sync/next/compact-events.js +4 -4
  194. package/dist/sync/next/facts.d.ts +3 -3
  195. package/dist/sync/next/facts.js +2 -2
  196. package/dist/sync/next/graphology.d.ts.map +1 -1
  197. package/dist/sync/next/graphology.js +0 -6
  198. package/dist/sync/next/graphology.js.map +1 -1
  199. package/dist/sync/next/graphology_.d.ts +1 -1
  200. package/dist/sync/next/graphology_.d.ts.map +1 -1
  201. package/dist/sync/next/graphology_.js +1 -1
  202. package/dist/sync/next/graphology_.js.map +1 -1
  203. package/dist/sync/next/history-dag-common.d.ts +3 -3
  204. package/dist/sync/next/history-dag-common.js +2 -2
  205. package/dist/sync/next/history-dag.d.ts +2 -2
  206. package/dist/sync/next/history-dag.js +3 -3
  207. package/dist/sync/next/mod.d.ts +5 -5
  208. package/dist/sync/next/mod.d.ts.map +1 -1
  209. package/dist/sync/next/mod.js +5 -5
  210. package/dist/sync/next/mod.js.map +1 -1
  211. package/dist/sync/next/rebase-events.d.ts +4 -4
  212. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  213. package/dist/sync/next/rebase-events.js +3 -2
  214. package/dist/sync/next/rebase-events.js.map +1 -1
  215. package/dist/sync/next/test/compact-events.calculator.test.js +4 -4
  216. package/dist/sync/next/test/compact-events.test.js +5 -5
  217. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  218. package/dist/sync/next/test/event-fixtures.d.ts +3 -3
  219. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  220. package/dist/sync/next/test/event-fixtures.js +17 -8
  221. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  222. package/dist/sync/next/test/mod.d.ts +1 -1
  223. package/dist/sync/next/test/mod.js +1 -1
  224. package/dist/sync/sync.d.ts +6 -4
  225. package/dist/sync/sync.d.ts.map +1 -1
  226. package/dist/sync/sync.js +4 -1
  227. package/dist/sync/sync.js.map +1 -1
  228. package/dist/sync/syncstate.d.ts +14 -5
  229. package/dist/sync/syncstate.d.ts.map +1 -1
  230. package/dist/sync/syncstate.js +25 -12
  231. package/dist/sync/syncstate.js.map +1 -1
  232. package/dist/sync/syncstate.test.js +20 -21
  233. package/dist/sync/syncstate.test.js.map +1 -1
  234. package/dist/sync/validate-push-payload.d.ts +2 -2
  235. package/dist/sync/validate-push-payload.js +1 -1
  236. package/dist/util.d.ts.map +1 -1
  237. package/dist/util.js +0 -1
  238. package/dist/util.js.map +1 -1
  239. package/dist/version.d.ts +1 -1
  240. package/dist/version.d.ts.map +1 -1
  241. package/dist/version.js +1 -1
  242. package/dist/version.js.map +1 -1
  243. package/package.json +6 -5
  244. package/src/ClientSessionLeaderThreadProxy.ts +40 -0
  245. package/src/__tests__/fixture.ts +2 -2
  246. package/src/adapter-types.ts +21 -167
  247. package/src/debug-info.ts +2 -2
  248. package/src/defs.ts +17 -0
  249. package/src/devtools/devtools-messages-client-session.ts +4 -4
  250. package/src/devtools/devtools-messages-common.ts +1 -1
  251. package/src/devtools/devtools-messages-leader.ts +4 -4
  252. package/src/devtools/devtools-messages.ts +3 -3
  253. package/src/devtools/mod.ts +3 -3
  254. package/src/errors.ts +49 -0
  255. package/src/index.ts +16 -16
  256. package/src/leader-thread/LeaderSyncProcessor.ts +154 -193
  257. package/src/leader-thread/connection.ts +5 -5
  258. package/src/leader-thread/eventlog.ts +89 -67
  259. package/src/leader-thread/leader-worker-devtools.ts +5 -6
  260. package/src/leader-thread/make-leader-thread-layer.ts +64 -20
  261. package/src/leader-thread/materialize-event.ts +17 -10
  262. package/src/leader-thread/mod.ts +8 -7
  263. package/src/leader-thread/recreate-db.ts +101 -93
  264. package/src/leader-thread/shutdown-channel.ts +1 -1
  265. package/src/leader-thread/types.ts +10 -15
  266. package/src/make-client-session.ts +5 -6
  267. package/src/materializer-helper.ts +11 -11
  268. package/src/rematerialize-from-eventlog.ts +16 -8
  269. package/src/schema/EventDef.ts +8 -6
  270. package/src/schema/EventSequenceNumber.test.ts +121 -4
  271. package/src/schema/EventSequenceNumber.ts +95 -23
  272. package/src/schema/LiveStoreEvent.ts +23 -7
  273. package/src/schema/events.ts +1 -1
  274. package/src/schema/mod.ts +9 -9
  275. package/src/schema/schema.ts +7 -7
  276. package/src/schema/state/mod.ts +2 -2
  277. package/src/schema/state/sqlite/client-document-def.test.ts +9 -7
  278. package/src/schema/state/sqlite/client-document-def.ts +45 -33
  279. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +1 -1
  280. package/src/schema/state/sqlite/db-schema/ast/validate.ts +1 -1
  281. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +1 -1
  282. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +2 -2
  283. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +19 -13
  284. package/src/schema/state/sqlite/db-schema/hash.ts +3 -4
  285. package/src/schema/state/sqlite/db-schema/mod.ts +2 -2
  286. package/src/schema/state/sqlite/mod.ts +13 -13
  287. package/src/schema/state/sqlite/query-builder/api.ts +43 -13
  288. package/src/schema/state/sqlite/query-builder/astToSql.ts +4 -4
  289. package/src/schema/state/sqlite/query-builder/impl.test.ts +63 -23
  290. package/src/schema/state/sqlite/query-builder/impl.ts +23 -28
  291. package/src/schema/state/sqlite/query-builder/mod.ts +2 -2
  292. package/src/schema/state/sqlite/schema-helpers.ts +2 -2
  293. package/src/schema/state/sqlite/system-tables.ts +12 -25
  294. package/src/schema/state/sqlite/table-def.ts +4 -4
  295. package/src/schema-management/common.ts +3 -3
  296. package/src/schema-management/migrations.ts +11 -9
  297. package/src/schema-management/validate-schema.ts +4 -4
  298. package/src/sql-queries/index.ts +3 -3
  299. package/src/sql-queries/sql-queries.ts +6 -4
  300. package/src/sql-queries/sql-query-builder.ts +4 -4
  301. package/src/sql-queries/types.ts +1 -1
  302. package/src/sqlite-db-helper.ts +3 -3
  303. package/src/sqlite-types.ts +76 -0
  304. package/src/sync/ClientSessionSyncProcessor.ts +65 -30
  305. package/src/sync/index.ts +3 -3
  306. package/src/sync/next/compact-events.ts +5 -5
  307. package/src/sync/next/facts.ts +4 -4
  308. package/src/sync/next/graphology.ts +3 -11
  309. package/src/sync/next/graphology_.ts +1 -1
  310. package/src/sync/next/history-dag-common.ts +3 -3
  311. package/src/sync/next/history-dag.ts +3 -3
  312. package/src/sync/next/mod.ts +5 -5
  313. package/src/sync/next/rebase-events.ts +7 -6
  314. package/src/sync/next/test/compact-events.calculator.test.ts +4 -4
  315. package/src/sync/next/test/compact-events.test.ts +6 -6
  316. package/src/sync/next/test/event-fixtures.ts +19 -10
  317. package/src/sync/next/test/mod.ts +1 -1
  318. package/src/sync/sync.ts +7 -4
  319. package/src/sync/syncstate.test.ts +25 -22
  320. package/src/sync/syncstate.ts +33 -12
  321. package/src/sync/validate-push-payload.ts +2 -2
  322. package/src/util.ts +0 -1
  323. package/src/version.ts +1 -1
@@ -1,23 +1,23 @@
1
1
  import { LS_DEV, shouldNeverHappen } from '@livestore/utils'
2
2
  import { Effect, Option, Schema } from '@livestore/utils/effect'
3
3
 
4
- import type { SqliteDb } from '../adapter-types.js'
5
- import * as EventSequenceNumber from '../schema/EventSequenceNumber.js'
6
- import * as LiveStoreEvent from '../schema/LiveStoreEvent.js'
4
+ import type { SqliteDb } from '../adapter-types.ts'
5
+ import * as EventSequenceNumber from '../schema/EventSequenceNumber.ts'
6
+ import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
7
7
  import {
8
8
  EVENTLOG_META_TABLE,
9
9
  eventlogMetaTable,
10
10
  eventlogSystemTables,
11
- sessionChangesetMetaTable,
12
11
  SYNC_STATUS_TABLE,
13
- } from '../schema/state/sqlite/system-tables.js'
14
- import { migrateTable } from '../schema-management/migrations.js'
15
- import { insertRow, updateRows } from '../sql-queries/sql-queries.js'
16
- import type { PreparedBindValues } from '../util.js'
17
- import { prepareBindValues, sql } from '../util.js'
18
- import { execSql } from './connection.js'
19
- import type { InitialSyncInfo } from './types.js'
20
- import { LeaderThreadCtx } from './types.js'
12
+ sessionChangesetMetaTable,
13
+ } from '../schema/state/sqlite/system-tables.ts'
14
+ import { migrateTable } from '../schema-management/migrations.ts'
15
+ import { insertRow, updateRows } from '../sql-queries/sql-queries.ts'
16
+ import type { PreparedBindValues } from '../util.ts'
17
+ import { sql } from '../util.ts'
18
+ import { execSql } from './connection.ts'
19
+ import type { InitialSyncInfo } from './types.ts'
20
+ import { LeaderThreadCtx } from './types.ts'
21
21
 
22
22
  export const initEventlogDb = (dbEventlog: SqliteDb) =>
23
23
  Effect.gen(function* () {
@@ -40,68 +40,78 @@ export const initEventlogDb = (dbEventlog: SqliteDb) =>
40
40
  )
41
41
  })
42
42
 
43
- /** Exclusive of the "since event" */
44
- export const getEventsSince = (
45
- since: EventSequenceNumber.EventSequenceNumber,
46
- ): Effect.Effect<ReadonlyArray<LiveStoreEvent.EncodedWithMeta>, never, LeaderThreadCtx> =>
47
- Effect.gen(function* () {
48
- const { dbEventlog, dbState } = yield* LeaderThreadCtx
49
-
50
- const query = eventlogMetaTable.where('seqNumGlobal', '>=', since.global).asSql()
51
- const pendingEventsRaw = dbEventlog.select(query.query, prepareBindValues(query.bindValues, query.query))
52
- const pendingEvents = Schema.decodeUnknownSync(eventlogMetaTable.rowSchema.pipe(Schema.Array))(pendingEventsRaw)
53
-
54
- const sessionChangesetRows = sessionChangesetMetaTable.where('seqNumGlobal', '>=', since.global).asSql()
55
- const sessionChangesetRowsRaw = dbState.select(
56
- sessionChangesetRows.query,
57
- prepareBindValues(sessionChangesetRows.bindValues, sessionChangesetRows.query),
58
- )
59
- const sessionChangesetRowsDecoded = Schema.decodeUnknownSync(
60
- sessionChangesetMetaTable.rowSchema.pipe(Schema.Array),
61
- )(sessionChangesetRowsRaw)
62
-
63
- return pendingEvents
64
- .map((eventlogEvent) => {
65
- const sessionChangeset = sessionChangesetRowsDecoded.find(
66
- (readModelEvent) =>
67
- readModelEvent.seqNumGlobal === eventlogEvent.seqNumGlobal &&
68
- readModelEvent.seqNumClient === eventlogEvent.seqNumClient,
69
- )
70
- return LiveStoreEvent.EncodedWithMeta.make({
71
- name: eventlogEvent.name,
72
- args: eventlogEvent.argsJson,
73
- seqNum: { global: eventlogEvent.seqNumGlobal, client: eventlogEvent.seqNumClient },
74
- parentSeqNum: { global: eventlogEvent.parentSeqNumGlobal, client: eventlogEvent.parentSeqNumClient },
75
- clientId: eventlogEvent.clientId,
76
- sessionId: eventlogEvent.sessionId,
77
- meta: {
78
- sessionChangeset:
79
- sessionChangeset && sessionChangeset.changeset !== null
80
- ? {
81
- _tag: 'sessionChangeset' as const,
82
- data: sessionChangeset.changeset,
83
- debug: sessionChangeset.debug,
84
- }
85
- : { _tag: 'unset' as const },
86
- syncMetadata: eventlogEvent.syncMetadataJson,
87
- materializerHashLeader: Option.none(),
88
- materializerHashSession: Option.none(),
89
- },
90
- })
43
+ /**
44
+ * Exclusive of the "since event"
45
+ * Also queries the state db in order to get the SQLite session changeset data.
46
+ */
47
+ export const getEventsSince = ({
48
+ dbEventlog,
49
+ dbState,
50
+ since,
51
+ }: {
52
+ dbEventlog: SqliteDb
53
+ dbState: SqliteDb
54
+ since: EventSequenceNumber.EventSequenceNumber
55
+ }): ReadonlyArray<LiveStoreEvent.EncodedWithMeta> => {
56
+ const pendingEvents = dbEventlog.select(eventlogMetaTable.where('seqNumGlobal', '>=', since.global))
57
+
58
+ const sessionChangesetRowsDecoded = dbState.select(
59
+ sessionChangesetMetaTable.where('seqNumGlobal', '>=', since.global),
60
+ )
61
+
62
+ return pendingEvents
63
+ .map((eventlogEvent) => {
64
+ const sessionChangeset = sessionChangesetRowsDecoded.find(
65
+ (readModelEvent) =>
66
+ readModelEvent.seqNumGlobal === eventlogEvent.seqNumGlobal &&
67
+ readModelEvent.seqNumClient === eventlogEvent.seqNumClient,
68
+ )
69
+ return LiveStoreEvent.EncodedWithMeta.make({
70
+ name: eventlogEvent.name,
71
+ args: eventlogEvent.argsJson,
72
+ seqNum: {
73
+ global: eventlogEvent.seqNumGlobal,
74
+ client: eventlogEvent.seqNumClient,
75
+ rebaseGeneration: eventlogEvent.seqNumRebaseGeneration,
76
+ },
77
+ parentSeqNum: {
78
+ global: eventlogEvent.parentSeqNumGlobal,
79
+ client: eventlogEvent.parentSeqNumClient,
80
+ rebaseGeneration: eventlogEvent.parentSeqNumRebaseGeneration,
81
+ },
82
+ clientId: eventlogEvent.clientId,
83
+ sessionId: eventlogEvent.sessionId,
84
+ meta: {
85
+ sessionChangeset:
86
+ sessionChangeset && sessionChangeset.changeset !== null
87
+ ? {
88
+ _tag: 'sessionChangeset' as const,
89
+ data: sessionChangeset.changeset,
90
+ debug: sessionChangeset.debug,
91
+ }
92
+ : { _tag: 'unset' as const },
93
+ syncMetadata: eventlogEvent.syncMetadataJson,
94
+ materializerHashLeader: Option.none(),
95
+ materializerHashSession: Option.none(),
96
+ },
91
97
  })
92
- .filter((_) => EventSequenceNumber.compare(_.seqNum, since) > 0)
93
- .sort((a, b) => EventSequenceNumber.compare(a.seqNum, b.seqNum))
94
- })
98
+ })
99
+ .filter((_) => EventSequenceNumber.compare(_.seqNum, since) > 0)
100
+ .sort((a, b) => EventSequenceNumber.compare(a.seqNum, b.seqNum))
101
+ }
95
102
 
96
103
  export const getClientHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.EventSequenceNumber => {
97
104
  const res = dbEventlog.select<{
98
105
  seqNumGlobal: EventSequenceNumber.GlobalEventSequenceNumber
99
106
  seqNumClient: EventSequenceNumber.ClientEventSequenceNumber
107
+ seqNumRebaseGeneration: number
100
108
  }>(
101
- sql`select seqNumGlobal, seqNumClient from ${EVENTLOG_META_TABLE} order by seqNumGlobal DESC, seqNumClient DESC limit 1`,
109
+ sql`select seqNumGlobal, seqNumClient, seqNumRebaseGeneration from ${EVENTLOG_META_TABLE} order by seqNumGlobal DESC, seqNumClient DESC limit 1`,
102
110
  )[0]
103
111
 
104
- return res ? { global: res.seqNumGlobal, client: res.seqNumClient } : EventSequenceNumber.ROOT
112
+ return res
113
+ ? { global: res.seqNumGlobal, client: res.seqNumClient, rebaseGeneration: res.seqNumRebaseGeneration }
114
+ : EventSequenceNumber.ROOT
105
115
  }
106
116
 
107
117
  export const getBackendHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.GlobalEventSequenceNumber =>
@@ -145,8 +155,10 @@ export const insertIntoEventlog = (
145
155
  values: {
146
156
  seqNumGlobal: eventEncoded.seqNum.global,
147
157
  seqNumClient: eventEncoded.seqNum.client,
158
+ seqNumRebaseGeneration: eventEncoded.seqNum.rebaseGeneration,
148
159
  parentSeqNumGlobal: eventEncoded.parentSeqNum.global,
149
160
  parentSeqNumClient: eventEncoded.parentSeqNum.client,
161
+ parentSeqNumRebaseGeneration: eventEncoded.parentSeqNum.rebaseGeneration,
150
162
  name: eventEncoded.name,
151
163
  argsJson: eventEncoded.args ?? {},
152
164
  clientId,
@@ -156,6 +168,8 @@ export const insertIntoEventlog = (
156
168
  },
157
169
  }),
158
170
  )
171
+
172
+ dbEventlog.debug.head = eventEncoded.seqNum
159
173
  })
160
174
 
161
175
  export const updateSyncMetadata = (items: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>) =>
@@ -178,7 +192,11 @@ export const updateSyncMetadata = (items: ReadonlyArray<LiveStoreEvent.EncodedWi
178
192
  }
179
193
  })
180
194
 
181
- export const getSyncBackendCursorInfo = (remoteHead: EventSequenceNumber.GlobalEventSequenceNumber) =>
195
+ export const getSyncBackendCursorInfo = ({
196
+ remoteHead,
197
+ }: {
198
+ remoteHead: EventSequenceNumber.GlobalEventSequenceNumber
199
+ }) =>
182
200
  Effect.gen(function* () {
183
201
  const { dbEventlog } = yield* LeaderThreadCtx
184
202
 
@@ -195,7 +213,11 @@ export const getSyncBackendCursorInfo = (remoteHead: EventSequenceNumber.GlobalE
195
213
  ).pipe(Effect.andThen(Schema.decode(EventlogQuerySchema)), Effect.map(Option.flatten), Effect.orDie)
196
214
 
197
215
  return Option.some({
198
- cursor: { global: remoteHead, client: EventSequenceNumber.clientDefault },
216
+ cursor: {
217
+ global: remoteHead,
218
+ client: EventSequenceNumber.clientDefault,
219
+ rebaseGeneration: EventSequenceNumber.rebaseGenerationDefault,
220
+ },
199
221
  metadata: syncMetadataOption,
200
222
  }) satisfies InitialSyncInfo
201
223
  }).pipe(Effect.withSpan('@livestore/common:eventlog:getSyncBackendCursorInfo', { attributes: { remoteHead } }))
@@ -1,10 +1,10 @@
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.js'
5
- import { SystemTables } from '../schema/mod.js'
6
- import type { DevtoolsOptions, PersistenceInfoPair } from './types.js'
7
- import { LeaderThreadCtx } from './types.js'
4
+ import { Devtools, IntentionalShutdownCause, liveStoreVersion, UnexpectedError } from '../index.ts'
5
+ import { SystemTables } from '../schema/mod.ts'
6
+ import type { DevtoolsOptions, PersistenceInfoPair } from './types.ts'
7
+ import { LeaderThreadCtx } from './types.ts'
8
8
 
9
9
  type SendMessageToDevtools = (message: Devtools.Leader.MessageFromApp) => Effect.Effect<void>
10
10
 
@@ -48,9 +48,8 @@ export const bootDevtools = (options: DevtoolsOptions) =>
48
48
  )
49
49
 
50
50
  const syncState = yield* syncProcessor.syncState
51
- const mergeCounter = syncProcessor.getMergeCounter()
52
51
 
53
- yield* syncProcessor.pull({ cursor: { mergeCounter, eventNum: syncState.localHead } }).pipe(
52
+ yield* syncProcessor.pull({ cursor: syncState.localHead }).pipe(
54
53
  Stream.tap(({ payload }) => sendMessage(Devtools.Leader.SyncPull.make({ payload, liveStoreVersion }))),
55
54
  Stream.runDrain,
56
55
  Effect.forkScoped,
@@ -1,27 +1,29 @@
1
+ import { shouldNeverHappen } from '@livestore/utils'
1
2
  import type { HttpClient, Schema, Scope } from '@livestore/utils/effect'
2
3
  import { Deferred, Effect, Layer, Queue, SubscriptionRef } from '@livestore/utils/effect'
3
4
 
4
- import type { BootStatus, MakeSqliteDb, SqliteError } from '../adapter-types.js'
5
- import { UnexpectedError } from '../adapter-types.js'
6
- import type * as Devtools from '../devtools/mod.js'
7
- import type { LiveStoreSchema } from '../schema/mod.js'
8
- import { LiveStoreEvent } from '../schema/mod.js'
9
- import type { InvalidPullError, IsOfflineError, SyncOptions } from '../sync/sync.js'
10
- import { sql } from '../util.js'
11
- import * as Eventlog from './eventlog.js'
12
- import { bootDevtools } from './leader-worker-devtools.js'
13
- import { makeLeaderSyncProcessor } from './LeaderSyncProcessor.js'
14
- import { makeMaterializeEvent } from './materialize-event.js'
15
- import { recreateDb } from './recreate-db.js'
16
- import type { ShutdownChannel } from './shutdown-channel.js'
5
+ import type { BootStatus, MakeSqliteDb, SqliteDb, SqliteError } from '../adapter-types.ts'
6
+ import { UnexpectedError } from '../adapter-types.ts'
7
+ import type * as Devtools from '../devtools/mod.ts'
8
+ import type { LiveStoreSchema } from '../schema/mod.ts'
9
+ import { EventSequenceNumber, LiveStoreEvent } from '../schema/mod.ts'
10
+ import type { InvalidPullError, IsOfflineError, SyncOptions } from '../sync/sync.ts'
11
+ import { SyncState } from '../sync/syncstate.ts'
12
+ import { sql } from '../util.ts'
13
+ import * as Eventlog from './eventlog.ts'
14
+ import { makeLeaderSyncProcessor } from './LeaderSyncProcessor.ts'
15
+ import { bootDevtools } from './leader-worker-devtools.ts'
16
+ import { makeMaterializeEvent } from './materialize-event.ts'
17
+ import { recreateDb } from './recreate-db.ts'
18
+ import type { ShutdownChannel } from './shutdown-channel.ts'
17
19
  import type {
18
20
  DevtoolsOptions,
19
21
  InitialBlockingSyncContext,
20
22
  InitialSyncOptions,
21
23
  LeaderSqliteDb,
22
24
  ShutdownState,
23
- } from './types.js'
24
- import { LeaderThreadCtx } from './types.js'
25
+ } from './types.ts'
26
+ import { LeaderThreadCtx } from './types.ts'
25
27
 
26
28
  export interface MakeLeaderThreadLayerParams {
27
29
  storeId: string
@@ -89,10 +91,8 @@ export const makeLeaderThreadLayer = ({
89
91
 
90
92
  const syncProcessor = yield* makeLeaderSyncProcessor({
91
93
  schema,
92
- dbEventlogMissing,
93
- dbEventlog,
94
94
  dbState,
95
- dbStateMissing,
95
+ initialSyncState: getInitialSyncState({ dbEventlog, dbState, dbEventlogMissing }),
96
96
  initialBlockingSyncContext,
97
97
  onError: syncOptions?.onSyncError ?? 'ignore',
98
98
  params: {
@@ -158,6 +158,48 @@ export const makeLeaderThreadLayer = ({
158
158
  Layer.unwrapScoped,
159
159
  )
160
160
 
161
+ const getInitialSyncState = ({
162
+ dbEventlog,
163
+ dbState,
164
+ dbEventlogMissing,
165
+ }: {
166
+ dbEventlog: SqliteDb
167
+ dbState: SqliteDb
168
+ dbEventlogMissing: boolean
169
+ }) => {
170
+ const initialBackendHead = dbEventlogMissing
171
+ ? EventSequenceNumber.ROOT.global
172
+ : Eventlog.getBackendHeadFromDb(dbEventlog)
173
+
174
+ const initialLocalHead = dbEventlogMissing ? EventSequenceNumber.ROOT : Eventlog.getClientHeadFromDb(dbEventlog)
175
+
176
+ if (initialBackendHead > initialLocalHead.global) {
177
+ return shouldNeverHappen(
178
+ `During boot the backend head (${initialBackendHead}) should never be greater than the local head (${initialLocalHead.global})`,
179
+ )
180
+ }
181
+
182
+ return SyncState.make({
183
+ localHead: initialLocalHead,
184
+ upstreamHead: {
185
+ global: initialBackendHead,
186
+ client: EventSequenceNumber.clientDefault,
187
+ rebaseGeneration: EventSequenceNumber.rebaseGenerationDefault,
188
+ },
189
+ pending: dbEventlogMissing
190
+ ? []
191
+ : Eventlog.getEventsSince({
192
+ dbEventlog,
193
+ dbState,
194
+ since: {
195
+ global: initialBackendHead,
196
+ client: EventSequenceNumber.clientDefault,
197
+ rebaseGeneration: initialLocalHead.rebaseGeneration,
198
+ },
199
+ }),
200
+ })
201
+ }
202
+
161
203
  const makeInitialBlockingSyncContext = ({
162
204
  initialSyncOptions,
163
205
  bootStatusQueue,
@@ -223,11 +265,13 @@ const bootLeaderThread = ({
223
265
  LeaderThreadCtx | Scope.Scope | HttpClient.HttpClient
224
266
  > =>
225
267
  Effect.gen(function* () {
226
- const { dbEventlog, bootStatusQueue, syncProcessor } = yield* LeaderThreadCtx
268
+ const { dbEventlog, bootStatusQueue, syncProcessor, schema, materializeEvent, dbState } = yield* LeaderThreadCtx
227
269
 
228
270
  yield* Eventlog.initEventlogDb(dbEventlog)
229
271
 
230
- const { migrationsReport } = dbStateMissing ? yield* recreateDb : { migrationsReport: { migrations: [] } }
272
+ const { migrationsReport } = dbStateMissing
273
+ ? yield* recreateDb({ dbState, dbEventlog, schema, bootStatusQueue, materializeEvent })
274
+ : { migrationsReport: { migrations: [] } }
231
275
 
232
276
  // NOTE the sync processor depends on the dbs being initialized properly
233
277
  const { initialLeaderHead } = yield* syncProcessor.boot
@@ -1,15 +1,15 @@
1
1
  import { isDevEnv, LS_DEV, shouldNeverHappen } from '@livestore/utils'
2
2
  import { Effect, Option, ReadonlyArray, Schema } from '@livestore/utils/effect'
3
3
 
4
- import { type SqliteDb, UnexpectedError } from '../adapter-types.js'
5
- import { getExecStatementsFromMaterializer, hashMaterializerResults } from '../materializer-helper.js'
6
- import type { LiveStoreSchema } from '../schema/mod.js'
7
- import { EventSequenceNumber, getEventDef, SystemTables } from '../schema/mod.js'
8
- import { insertRow } from '../sql-queries/index.js'
9
- import { sql } from '../util.js'
10
- import { execSql, execSqlPrepared } from './connection.js'
11
- import * as Eventlog from './eventlog.js'
12
- import type { MaterializeEvent } from './types.js'
4
+ import { type SqliteDb, UnexpectedError } from '../adapter-types.ts'
5
+ import { getExecStatementsFromMaterializer, hashMaterializerResults } from '../materializer-helper.ts'
6
+ import type { LiveStoreSchema } from '../schema/mod.ts'
7
+ import { EventSequenceNumber, getEventDef, SystemTables } from '../schema/mod.ts'
8
+ import { insertRow } from '../sql-queries/index.ts'
9
+ import { sql } from '../util.ts'
10
+ import { execSql, execSqlPrepared } from './connection.ts'
11
+ import * as Eventlog from './eventlog.ts'
12
+ import type { MaterializeEvent } from './types.ts'
13
13
 
14
14
  export const makeMaterializeEvent = ({
15
15
  schema,
@@ -74,6 +74,8 @@ export const makeMaterializeEvent = ({
74
74
  yield* execSqlPrepared(dbState, statementSql, bindValues)
75
75
  }
76
76
 
77
+ dbState.debug.head = eventEncoded.seqNum
78
+
77
79
  const changeset = session.changeset()
78
80
  session.finish()
79
81
 
@@ -86,6 +88,7 @@ export const makeMaterializeEvent = ({
86
88
  values: {
87
89
  seqNumGlobal: eventEncoded.seqNum.global,
88
90
  seqNumClient: eventEncoded.seqNum.client,
91
+ seqNumRebaseGeneration: eventEncoded.seqNum.rebaseGeneration,
89
92
  // NOTE the changeset will be empty (i.e. null) for no-op events
90
93
  changeset: changeset ?? null,
91
94
  debug: LS_DEV ? execArgsArr : null,
@@ -149,7 +152,11 @@ export const rollback = ({
149
152
  sql`SELECT * FROM ${SystemTables.SESSION_CHANGESET_META_TABLE} WHERE (seqNumGlobal, seqNumClient) IN (${eventNumsToRollback.map((id) => `(${id.global}, ${id.client})`).join(', ')})`,
150
153
  )
151
154
  .map((_) => ({
152
- seqNum: { global: _.seqNumGlobal, client: _.seqNumClient },
155
+ seqNum: {
156
+ global: _.seqNumGlobal,
157
+ client: _.seqNumClient,
158
+ rebaseGeneration: -1, // unused in this code path
159
+ },
153
160
  changeset: _.changeset,
154
161
  debug: _.debug,
155
162
  }))
@@ -1,7 +1,8 @@
1
- export * from './connection.js'
2
- export * from './types.js'
3
- export * as ShutdownChannel from './shutdown-channel.js'
4
- export * from './leader-worker-devtools.js'
5
- export * from './make-leader-thread-layer.js'
6
- export * as Eventlog from './eventlog.js'
7
- export * from './materialize-event.js'
1
+ export * from './connection.ts'
2
+ export * as Eventlog from './eventlog.ts'
3
+ export * from './leader-worker-devtools.ts'
4
+ export * from './make-leader-thread-layer.ts'
5
+ export * from './materialize-event.ts'
6
+ export * from './recreate-db.ts'
7
+ export * as ShutdownChannel from './shutdown-channel.ts'
8
+ export * from './types.ts'
@@ -1,108 +1,116 @@
1
1
  import { casesHandled } from '@livestore/utils'
2
- import type { HttpClient } from '@livestore/utils/effect'
3
2
  import { Effect, Queue } from '@livestore/utils/effect'
4
3
 
5
- import type { InvalidPullError, IsOfflineError, MigrationHooks, MigrationsReport, SqliteError } from '../index.js'
6
- import { migrateDb, rematerializeFromEventlog, UnexpectedError } from '../index.js'
7
- import { configureConnection } from './connection.js'
8
- import { LeaderThreadCtx } from './types.js'
9
-
10
- export const recreateDb: Effect.Effect<
11
- { migrationsReport: MigrationsReport },
12
- UnexpectedError | SqliteError | IsOfflineError | InvalidPullError,
13
- LeaderThreadCtx | HttpClient.HttpClient
14
- > = Effect.gen(function* () {
15
- const { dbState, dbEventlog, schema, bootStatusQueue, materializeEvent } = yield* LeaderThreadCtx
16
-
17
- const migrationOptions = schema.state.sqlite.migrations
18
- let migrationsReport: MigrationsReport
19
-
20
- yield* Effect.addFinalizer(
21
- Effect.fn('recreateDb:finalizer')(function* (ex) {
22
- if (ex._tag === 'Failure') dbState.destroy()
23
- }),
24
- )
25
-
26
- // NOTE to speed up the operations below, we're creating a temporary in-memory database
27
- // and later we'll overwrite the persisted database with the new data
28
- // TODO bring back this optimization
29
- // const tmpDb = yield* makeSqliteDb({ _tag: 'in-memory' })
30
- const tmpDb = dbState
31
- yield* configureConnection(tmpDb, { foreignKeys: true })
32
-
33
- const initDb = (hooks: Partial<MigrationHooks> | undefined) =>
34
- Effect.gen(function* () {
35
- yield* Effect.tryAll(() => hooks?.init?.(tmpDb)).pipe(UnexpectedError.mapToUnexpectedError)
36
-
37
- const migrationsReport = yield* migrateDb({
38
- db: tmpDb,
39
- schema,
40
- onProgress: ({ done, total }) =>
41
- Queue.offer(bootStatusQueue, { stage: 'migrating', progress: { done, total } }),
4
+ import type { MigrationsReport } from '../defs.ts'
5
+ import type { BootStatus, MigrationHooks, SqliteDb, SqliteError } from '../index.ts'
6
+ import { migrateDb, rematerializeFromEventlog, UnexpectedError } from '../index.ts'
7
+ import type { LiveStoreSchema } from '../schema/mod.ts'
8
+ import { configureConnection } from './connection.ts'
9
+ import type { MaterializeEvent } from './types.ts'
10
+
11
+ export const recreateDb = ({
12
+ dbState,
13
+ dbEventlog,
14
+ schema,
15
+ bootStatusQueue,
16
+ materializeEvent,
17
+ }: {
18
+ dbState: SqliteDb
19
+ dbEventlog: SqliteDb
20
+ schema: LiveStoreSchema
21
+ bootStatusQueue: Queue.Queue<BootStatus>
22
+ materializeEvent: MaterializeEvent
23
+ }): Effect.Effect<{ migrationsReport: MigrationsReport }, UnexpectedError | SqliteError> =>
24
+ Effect.gen(function* () {
25
+ const migrationOptions = schema.state.sqlite.migrations
26
+ let migrationsReport: MigrationsReport
27
+
28
+ yield* Effect.addFinalizer(
29
+ Effect.fn('recreateDb:finalizer')(function* (ex) {
30
+ if (ex._tag === 'Failure') dbState.destroy()
31
+ }),
32
+ )
33
+
34
+ // NOTE to speed up the operations below, we're creating a temporary in-memory database
35
+ // and later we'll overwrite the persisted database with the new data
36
+ // TODO bring back this optimization
37
+ // const tmpDb = yield* makeSqliteDb({ _tag: 'in-memory' })
38
+ const tmpDb = dbState
39
+ yield* configureConnection(tmpDb, { foreignKeys: true })
40
+
41
+ const initDb = (hooks: Partial<MigrationHooks> | undefined) =>
42
+ Effect.gen(function* () {
43
+ yield* Effect.tryAll(() => hooks?.init?.(tmpDb)).pipe(UnexpectedError.mapToUnexpectedError)
44
+
45
+ const migrationsReport = yield* migrateDb({
46
+ db: tmpDb,
47
+ schema,
48
+ onProgress: ({ done, total }) =>
49
+ Queue.offer(bootStatusQueue, { stage: 'migrating', progress: { done, total } }),
50
+ })
51
+
52
+ yield* Effect.tryAll(() => hooks?.pre?.(tmpDb)).pipe(UnexpectedError.mapToUnexpectedError)
53
+
54
+ return { migrationsReport, tmpDb }
42
55
  })
43
56
 
44
- yield* Effect.tryAll(() => hooks?.pre?.(tmpDb)).pipe(UnexpectedError.mapToUnexpectedError)
57
+ switch (migrationOptions.strategy) {
58
+ case 'auto': {
59
+ const hooks = migrationOptions.hooks
60
+ const initResult = yield* initDb(hooks)
45
61
 
46
- return { migrationsReport, tmpDb }
47
- })
62
+ migrationsReport = initResult.migrationsReport
48
63
 
49
- switch (migrationOptions.strategy) {
50
- case 'auto': {
51
- const hooks = migrationOptions.hooks
52
- const initResult = yield* initDb(hooks)
64
+ yield* rematerializeFromEventlog({
65
+ // db: initResult.tmpDb,
66
+ dbEventlog,
67
+ schema,
68
+ materializeEvent,
69
+ onProgress: ({ done, total }) =>
70
+ Queue.offer(bootStatusQueue, { stage: 'rehydrating', progress: { done, total } }),
71
+ })
53
72
 
54
- migrationsReport = initResult.migrationsReport
73
+ yield* Effect.tryAll(() => hooks?.post?.(initResult.tmpDb)).pipe(UnexpectedError.mapToUnexpectedError)
55
74
 
56
- yield* rematerializeFromEventlog({
57
- // db: initResult.tmpDb,
58
- dbEventlog,
59
- schema,
60
- materializeEvent,
61
- onProgress: ({ done, total }) =>
62
- Queue.offer(bootStatusQueue, { stage: 'rehydrating', progress: { done, total } }),
63
- })
75
+ break
76
+ }
77
+ case 'manual': {
78
+ const oldDbData = dbState.export()
64
79
 
65
- yield* Effect.tryAll(() => hooks?.post?.(initResult.tmpDb)).pipe(UnexpectedError.mapToUnexpectedError)
66
-
67
- break
68
- }
69
- case 'manual': {
70
- const oldDbData = dbState.export()
80
+ migrationsReport = { migrations: [] }
71
81
 
72
- migrationsReport = { migrations: [] }
82
+ const newDbData = yield* Effect.tryAll(() => migrationOptions.migrate(oldDbData)).pipe(
83
+ UnexpectedError.mapToUnexpectedError,
84
+ )
73
85
 
74
- const newDbData = yield* Effect.tryAll(() => migrationOptions.migrate(oldDbData)).pipe(
75
- UnexpectedError.mapToUnexpectedError,
76
- )
86
+ tmpDb.import(newDbData)
77
87
 
78
- tmpDb.import(newDbData)
88
+ // TODO validate schema
79
89
 
80
- // TODO validate schema
81
-
82
- break
83
- }
84
- default: {
85
- casesHandled(migrationOptions)
90
+ break
91
+ }
92
+ default: {
93
+ casesHandled(migrationOptions)
94
+ }
86
95
  }
87
- }
88
-
89
- // TODO bring back
90
- // Import the temporary in-memory database into the persistent database
91
- // yield* Effect.sync(() => db.import(tmpDb)).pipe(
92
- // Effect.withSpan('@livestore/common:leader-thread:recreateDb:import'),
93
- // )
94
-
95
- // TODO maybe bring back re-using this initial snapshot to avoid calling `.export()` again
96
- // We've disabled this for now as it made the code too complex, as we often run syncing right after
97
- // so the snapshot is no longer up to date
98
- // const snapshotFromTmpDb = tmpDb.export()
99
-
100
- // TODO bring back
101
- // tmpDb.close()
102
-
103
- return { migrationsReport }
104
- }).pipe(
105
- Effect.scoped, // NOTE we're closing the scope here so finalizers are called when the effect is done
106
- Effect.withSpan('@livestore/common:leader-thread:recreateDb'),
107
- Effect.withPerformanceMeasure('@livestore/common:leader-thread:recreateDb'),
108
- )
96
+
97
+ // TODO bring back
98
+ // Import the temporary in-memory database into the persistent database
99
+ // yield* Effect.sync(() => db.import(tmpDb)).pipe(
100
+ // Effect.withSpan('@livestore/common:leader-thread:recreateDb:import'),
101
+ // )
102
+
103
+ // TODO maybe bring back re-using this initial snapshot to avoid calling `.export()` again
104
+ // We've disabled this for now as it made the code too complex, as we often run syncing right after
105
+ // so the snapshot is no longer up to date
106
+ // const snapshotFromTmpDb = tmpDb.export()
107
+
108
+ // TODO bring back
109
+ // tmpDb.close()
110
+
111
+ return { migrationsReport }
112
+ }).pipe(
113
+ Effect.scoped, // NOTE we're closing the scope here so finalizers are called when the effect is done
114
+ Effect.withSpan('@livestore/common:leader-thread:recreateDb'),
115
+ Effect.withPerformanceMeasure('@livestore/common:leader-thread:recreateDb'),
116
+ )