@livestore/common 0.3.0-dev.2 → 0.3.0-dev.22

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 (328) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/__tests__/fixture.d.ts +21 -21
  3. package/dist/adapter-types.d.ts +97 -53
  4. package/dist/adapter-types.d.ts.map +1 -1
  5. package/dist/adapter-types.js +17 -0
  6. package/dist/adapter-types.js.map +1 -1
  7. package/dist/bounded-collections.d.ts +1 -1
  8. package/dist/bounded-collections.d.ts.map +1 -1
  9. package/dist/debug-info.d.ts +1 -1
  10. package/dist/debug-info.d.ts.map +1 -1
  11. package/dist/derived-mutations.d.ts +5 -5
  12. package/dist/derived-mutations.d.ts.map +1 -1
  13. package/dist/derived-mutations.js +3 -3
  14. package/dist/derived-mutations.js.map +1 -1
  15. package/dist/derived-mutations.test.js.map +1 -1
  16. package/dist/devtools/devtools-messages-client-session.d.ts +389 -0
  17. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
  18. package/dist/devtools/devtools-messages-client-session.js +96 -0
  19. package/dist/devtools/devtools-messages-client-session.js.map +1 -0
  20. package/dist/devtools/devtools-messages-common.d.ts +61 -0
  21. package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
  22. package/dist/devtools/devtools-messages-common.js +54 -0
  23. package/dist/devtools/devtools-messages-common.js.map +1 -0
  24. package/dist/devtools/devtools-messages-leader.d.ts +393 -0
  25. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
  26. package/dist/devtools/devtools-messages-leader.js +148 -0
  27. package/dist/devtools/devtools-messages-leader.js.map +1 -0
  28. package/dist/devtools/devtools-messages.d.ts +3 -592
  29. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  30. package/dist/devtools/devtools-messages.js +3 -171
  31. package/dist/devtools/devtools-messages.js.map +1 -1
  32. package/dist/devtools/devtools-sessioninfo.d.ts +28 -0
  33. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -0
  34. package/dist/devtools/devtools-sessioninfo.js +34 -0
  35. package/dist/devtools/devtools-sessioninfo.js.map +1 -0
  36. package/dist/devtools/mod.d.ts +39 -0
  37. package/dist/devtools/mod.d.ts.map +1 -0
  38. package/dist/devtools/mod.js +27 -0
  39. package/dist/devtools/mod.js.map +1 -0
  40. package/dist/index.d.ts +2 -6
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +2 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/init-singleton-tables.d.ts +2 -2
  45. package/dist/init-singleton-tables.d.ts.map +1 -1
  46. package/dist/init-singleton-tables.js.map +1 -1
  47. package/dist/leader-thread/LeaderSyncProcessor.d.ts +39 -0
  48. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -0
  49. package/dist/leader-thread/LeaderSyncProcessor.js +527 -0
  50. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -0
  51. package/dist/leader-thread/apply-mutation.d.ts +5 -2
  52. package/dist/leader-thread/apply-mutation.d.ts.map +1 -1
  53. package/dist/leader-thread/apply-mutation.js +55 -35
  54. package/dist/leader-thread/apply-mutation.js.map +1 -1
  55. package/dist/leader-thread/connection.d.ts +34 -6
  56. package/dist/leader-thread/connection.d.ts.map +1 -1
  57. package/dist/leader-thread/connection.js +22 -7
  58. package/dist/leader-thread/connection.js.map +1 -1
  59. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  60. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  61. package/dist/leader-thread/leader-worker-devtools.js +147 -124
  62. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  63. package/dist/leader-thread/make-leader-thread-layer.d.ts +12 -11
  64. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  65. package/dist/leader-thread/make-leader-thread-layer.js +55 -18
  66. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  67. package/dist/leader-thread/mutationlog.d.ts +6 -19
  68. package/dist/leader-thread/mutationlog.d.ts.map +1 -1
  69. package/dist/leader-thread/mutationlog.js +12 -9
  70. package/dist/leader-thread/mutationlog.js.map +1 -1
  71. package/dist/leader-thread/pull-queue-set.d.ts +3 -3
  72. package/dist/leader-thread/pull-queue-set.d.ts.map +1 -1
  73. package/dist/leader-thread/pull-queue-set.js +9 -0
  74. package/dist/leader-thread/pull-queue-set.js.map +1 -1
  75. package/dist/leader-thread/recreate-db.d.ts +4 -2
  76. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  77. package/dist/leader-thread/recreate-db.js +32 -21
  78. package/dist/leader-thread/recreate-db.js.map +1 -1
  79. package/dist/leader-thread/shutdown-channel.d.ts +2 -5
  80. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  81. package/dist/leader-thread/shutdown-channel.js +2 -4
  82. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  83. package/dist/leader-thread/types.d.ts +58 -26
  84. package/dist/leader-thread/types.d.ts.map +1 -1
  85. package/dist/leader-thread/types.js +1 -3
  86. package/dist/leader-thread/types.js.map +1 -1
  87. package/dist/mutation.d.ts +9 -2
  88. package/dist/mutation.d.ts.map +1 -1
  89. package/dist/mutation.js +5 -5
  90. package/dist/mutation.js.map +1 -1
  91. package/dist/otel.d.ts +2 -0
  92. package/dist/otel.d.ts.map +1 -1
  93. package/dist/otel.js +5 -0
  94. package/dist/otel.js.map +1 -1
  95. package/dist/query-builder/api.d.ts +3 -3
  96. package/dist/query-builder/api.d.ts.map +1 -1
  97. package/dist/query-builder/impl.d.ts +4 -4
  98. package/dist/query-builder/impl.d.ts.map +1 -1
  99. package/dist/query-builder/impl.js.map +1 -1
  100. package/dist/query-builder/impl.test.js +16 -1
  101. package/dist/query-builder/impl.test.js.map +1 -1
  102. package/dist/query-info.d.ts +3 -3
  103. package/dist/query-info.d.ts.map +1 -1
  104. package/dist/rehydrate-from-mutationlog.d.ts +5 -5
  105. package/dist/rehydrate-from-mutationlog.d.ts.map +1 -1
  106. package/dist/rehydrate-from-mutationlog.js +23 -27
  107. package/dist/rehydrate-from-mutationlog.js.map +1 -1
  108. package/dist/schema/EventId.d.ts +27 -16
  109. package/dist/schema/EventId.d.ts.map +1 -1
  110. package/dist/schema/EventId.js +36 -11
  111. package/dist/schema/EventId.js.map +1 -1
  112. package/dist/schema/EventId.test.d.ts +2 -0
  113. package/dist/schema/EventId.test.d.ts.map +1 -0
  114. package/dist/schema/EventId.test.js +11 -0
  115. package/dist/schema/EventId.test.js.map +1 -0
  116. package/dist/schema/MutationEvent.d.ts +76 -82
  117. package/dist/schema/MutationEvent.d.ts.map +1 -1
  118. package/dist/schema/MutationEvent.js +53 -20
  119. package/dist/schema/MutationEvent.js.map +1 -1
  120. package/dist/schema/db-schema/ast/sqlite.d.ts +69 -0
  121. package/dist/schema/db-schema/ast/sqlite.d.ts.map +1 -0
  122. package/dist/schema/db-schema/ast/sqlite.js +71 -0
  123. package/dist/schema/db-schema/ast/sqlite.js.map +1 -0
  124. package/dist/schema/db-schema/ast/validate.d.ts +3 -0
  125. package/dist/schema/db-schema/ast/validate.d.ts.map +1 -0
  126. package/dist/schema/db-schema/ast/validate.js +12 -0
  127. package/dist/schema/db-schema/ast/validate.js.map +1 -0
  128. package/dist/schema/db-schema/dsl/field-defs.d.ts +90 -0
  129. package/dist/schema/db-schema/dsl/field-defs.d.ts.map +1 -0
  130. package/dist/schema/db-schema/dsl/field-defs.js +87 -0
  131. package/dist/schema/db-schema/dsl/field-defs.js.map +1 -0
  132. package/dist/schema/db-schema/dsl/field-defs.test.d.ts +2 -0
  133. package/dist/schema/db-schema/dsl/field-defs.test.d.ts.map +1 -0
  134. package/dist/schema/db-schema/dsl/field-defs.test.js +29 -0
  135. package/dist/schema/db-schema/dsl/field-defs.test.js.map +1 -0
  136. package/dist/schema/db-schema/dsl/mod.d.ts +88 -0
  137. package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -0
  138. package/dist/schema/db-schema/dsl/mod.js +35 -0
  139. package/dist/schema/db-schema/dsl/mod.js.map +1 -0
  140. package/dist/schema/db-schema/hash.d.ts +2 -0
  141. package/dist/schema/db-schema/hash.d.ts.map +1 -0
  142. package/dist/schema/db-schema/hash.js +14 -0
  143. package/dist/schema/db-schema/hash.js.map +1 -0
  144. package/dist/schema/db-schema/mod.d.ts +3 -0
  145. package/dist/schema/db-schema/mod.d.ts.map +1 -0
  146. package/dist/schema/db-schema/mod.js +3 -0
  147. package/dist/schema/db-schema/mod.js.map +1 -0
  148. package/dist/schema/mod.d.ts +1 -0
  149. package/dist/schema/mod.d.ts.map +1 -1
  150. package/dist/schema/mod.js +1 -0
  151. package/dist/schema/mod.js.map +1 -1
  152. package/dist/schema/mutations.d.ts +8 -9
  153. package/dist/schema/mutations.d.ts.map +1 -1
  154. package/dist/schema/mutations.js +2 -2
  155. package/dist/schema/mutations.js.map +1 -1
  156. package/dist/schema/schema-helpers.d.ts.map +1 -1
  157. package/dist/schema/schema-helpers.js +1 -1
  158. package/dist/schema/schema-helpers.js.map +1 -1
  159. package/dist/schema/schema.d.ts +5 -2
  160. package/dist/schema/schema.d.ts.map +1 -1
  161. package/dist/schema/schema.js +20 -9
  162. package/dist/schema/schema.js.map +1 -1
  163. package/dist/schema/system-tables.d.ts +65 -47
  164. package/dist/schema/system-tables.d.ts.map +1 -1
  165. package/dist/schema/system-tables.js +24 -13
  166. package/dist/schema/system-tables.js.map +1 -1
  167. package/dist/schema/table-def.d.ts +18 -24
  168. package/dist/schema/table-def.d.ts.map +1 -1
  169. package/dist/schema/table-def.js +3 -4
  170. package/dist/schema/table-def.js.map +1 -1
  171. package/dist/schema-management/common.d.ts +3 -3
  172. package/dist/schema-management/common.d.ts.map +1 -1
  173. package/dist/schema-management/common.js.map +1 -1
  174. package/dist/schema-management/migrations.d.ts +6 -6
  175. package/dist/schema-management/migrations.d.ts.map +1 -1
  176. package/dist/schema-management/migrations.js +13 -8
  177. package/dist/schema-management/migrations.js.map +1 -1
  178. package/dist/schema-management/validate-mutation-defs.d.ts.map +1 -1
  179. package/dist/schema-management/validate-mutation-defs.js +2 -2
  180. package/dist/schema-management/validate-mutation-defs.js.map +1 -1
  181. package/dist/sql-queries/misc.d.ts.map +1 -1
  182. package/dist/sql-queries/sql-queries.d.ts +1 -1
  183. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  184. package/dist/sql-queries/sql-queries.js.map +1 -1
  185. package/dist/sql-queries/sql-query-builder.d.ts +1 -1
  186. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  187. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  188. package/dist/sql-queries/types.d.ts +2 -1
  189. package/dist/sql-queries/types.d.ts.map +1 -1
  190. package/dist/sql-queries/types.js.map +1 -1
  191. package/dist/sync/{client-session-sync-processor.d.ts → ClientSessionSyncProcessor.d.ts} +25 -14
  192. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -0
  193. package/dist/sync/ClientSessionSyncProcessor.js +199 -0
  194. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -0
  195. package/dist/sync/index.d.ts +1 -1
  196. package/dist/sync/index.d.ts.map +1 -1
  197. package/dist/sync/index.js +1 -1
  198. package/dist/sync/index.js.map +1 -1
  199. package/dist/sync/next/compact-events.d.ts.map +1 -1
  200. package/dist/sync/next/facts.d.ts.map +1 -1
  201. package/dist/sync/next/facts.js +1 -1
  202. package/dist/sync/next/facts.js.map +1 -1
  203. package/dist/sync/next/history-dag-common.d.ts +3 -4
  204. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  205. package/dist/sync/next/history-dag-common.js +3 -1
  206. package/dist/sync/next/history-dag-common.js.map +1 -1
  207. package/dist/sync/next/history-dag.d.ts.map +1 -1
  208. package/dist/sync/next/history-dag.js +1 -1
  209. package/dist/sync/next/history-dag.js.map +1 -1
  210. package/dist/sync/next/rebase-events.d.ts +6 -4
  211. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  212. package/dist/sync/next/rebase-events.js +6 -3
  213. package/dist/sync/next/rebase-events.js.map +1 -1
  214. package/dist/sync/next/test/compact-events.calculator.test.js +12 -12
  215. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  216. package/dist/sync/next/test/compact-events.test.js +43 -43
  217. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  218. package/dist/sync/next/test/mutation-fixtures.d.ts +4 -4
  219. package/dist/sync/next/test/mutation-fixtures.d.ts.map +1 -1
  220. package/dist/sync/next/test/mutation-fixtures.js +12 -16
  221. package/dist/sync/next/test/mutation-fixtures.js.map +1 -1
  222. package/dist/sync/sync.d.ts +31 -16
  223. package/dist/sync/sync.d.ts.map +1 -1
  224. package/dist/sync/sync.js +7 -3
  225. package/dist/sync/sync.js.map +1 -1
  226. package/dist/sync/syncstate.d.ts +177 -44
  227. package/dist/sync/syncstate.d.ts.map +1 -1
  228. package/dist/sync/syncstate.js +188 -56
  229. package/dist/sync/syncstate.js.map +1 -1
  230. package/dist/sync/syncstate.test.js +162 -92
  231. package/dist/sync/syncstate.test.js.map +1 -1
  232. package/dist/sync/validate-push-payload.d.ts +2 -2
  233. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  234. package/dist/sync/validate-push-payload.js +2 -2
  235. package/dist/sync/validate-push-payload.js.map +1 -1
  236. package/dist/util.d.ts +2 -2
  237. package/dist/util.d.ts.map +1 -1
  238. package/dist/version.d.ts +1 -1
  239. package/dist/version.d.ts.map +1 -1
  240. package/dist/version.js +1 -1
  241. package/dist/version.js.map +1 -1
  242. package/package.json +6 -6
  243. package/src/adapter-types.ts +80 -56
  244. package/src/derived-mutations.test.ts +1 -1
  245. package/src/derived-mutations.ts +13 -9
  246. package/src/devtools/devtools-messages-client-session.ts +141 -0
  247. package/src/devtools/devtools-messages-common.ts +106 -0
  248. package/src/devtools/devtools-messages-leader.ts +192 -0
  249. package/src/devtools/devtools-messages.ts +3 -243
  250. package/src/devtools/devtools-sessioninfo.ts +99 -0
  251. package/src/devtools/mod.ts +36 -0
  252. package/src/index.ts +2 -8
  253. package/src/init-singleton-tables.ts +2 -2
  254. package/src/leader-thread/LeaderSyncProcessor.ts +833 -0
  255. package/src/leader-thread/apply-mutation.ts +87 -43
  256. package/src/leader-thread/connection.ts +54 -9
  257. package/src/leader-thread/leader-worker-devtools.ts +199 -174
  258. package/src/leader-thread/make-leader-thread-layer.ts +89 -35
  259. package/src/leader-thread/mutationlog.ts +20 -14
  260. package/src/leader-thread/pull-queue-set.ts +10 -1
  261. package/src/leader-thread/recreate-db.ts +38 -25
  262. package/src/leader-thread/shutdown-channel.ts +2 -4
  263. package/src/leader-thread/types.ts +68 -34
  264. package/src/mutation.ts +17 -7
  265. package/src/otel.ts +8 -0
  266. package/src/query-builder/api.ts +4 -4
  267. package/src/query-builder/impl.test.ts +22 -1
  268. package/src/query-builder/impl.ts +2 -2
  269. package/src/query-info.ts +3 -3
  270. package/src/rehydrate-from-mutationlog.ts +28 -34
  271. package/src/schema/EventId.test.ts +12 -0
  272. package/src/schema/EventId.ts +49 -15
  273. package/src/schema/MutationEvent.ts +78 -31
  274. package/src/schema/db-schema/ast/sqlite.ts +142 -0
  275. package/src/schema/db-schema/ast/validate.ts +13 -0
  276. package/src/schema/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
  277. package/src/schema/db-schema/dsl/field-defs.test.ts +35 -0
  278. package/src/schema/db-schema/dsl/field-defs.ts +242 -0
  279. package/src/schema/db-schema/dsl/mod.ts +195 -0
  280. package/src/schema/db-schema/hash.ts +14 -0
  281. package/src/schema/db-schema/mod.ts +2 -0
  282. package/src/schema/mod.ts +1 -0
  283. package/src/schema/mutations.ts +10 -20
  284. package/src/schema/schema-helpers.ts +1 -1
  285. package/src/schema/schema.ts +22 -10
  286. package/src/schema/system-tables.ts +24 -13
  287. package/src/schema/table-def.ts +17 -17
  288. package/src/schema-management/common.ts +3 -3
  289. package/src/schema-management/migrations.ts +19 -15
  290. package/src/schema-management/validate-mutation-defs.ts +2 -2
  291. package/src/sql-queries/sql-queries.ts +1 -1
  292. package/src/sql-queries/sql-query-builder.ts +1 -2
  293. package/src/sql-queries/types.ts +3 -1
  294. package/src/sync/ClientSessionSyncProcessor.ts +313 -0
  295. package/src/sync/index.ts +1 -1
  296. package/src/sync/next/facts.ts +1 -1
  297. package/src/sync/next/history-dag-common.ts +5 -1
  298. package/src/sync/next/history-dag.ts +1 -1
  299. package/src/sync/next/rebase-events.ts +13 -7
  300. package/src/sync/next/test/compact-events.calculator.test.ts +12 -12
  301. package/src/sync/next/test/compact-events.test.ts +43 -43
  302. package/src/sync/next/test/mutation-fixtures.ts +16 -19
  303. package/src/sync/sync.ts +26 -10
  304. package/src/sync/syncstate.test.ts +178 -98
  305. package/src/sync/syncstate.ts +170 -83
  306. package/src/sync/validate-push-payload.ts +7 -4
  307. package/src/version.ts +1 -1
  308. package/tmp/pack.tgz +0 -0
  309. package/tsconfig.json +1 -1
  310. package/dist/devtools/devtools-bridge.d.ts +0 -12
  311. package/dist/devtools/devtools-bridge.d.ts.map +0 -1
  312. package/dist/devtools/devtools-bridge.js +0 -2
  313. package/dist/devtools/devtools-bridge.js.map +0 -1
  314. package/dist/devtools/index.d.ts +0 -42
  315. package/dist/devtools/index.d.ts.map +0 -1
  316. package/dist/devtools/index.js +0 -48
  317. package/dist/devtools/index.js.map +0 -1
  318. package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
  319. package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
  320. package/dist/leader-thread/leader-sync-processor.js +0 -422
  321. package/dist/leader-thread/leader-sync-processor.js.map +0 -1
  322. package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
  323. package/dist/sync/client-session-sync-processor.js +0 -131
  324. package/dist/sync/client-session-sync-processor.js.map +0 -1
  325. package/src/devtools/devtools-bridge.ts +0 -13
  326. package/src/devtools/index.ts +0 -48
  327. package/src/leader-thread/leader-sync-processor.ts +0 -666
  328. package/src/sync/client-session-sync-processor.ts +0 -207
@@ -1,6 +1,7 @@
1
- import { memoizeByRef, shouldNeverHappen } from '@livestore/utils';
1
+ import { LS_DEV, memoizeByRef, shouldNeverHappen } from '@livestore/utils';
2
2
  import { Effect, Option, Schema } from '@livestore/utils/effect';
3
- import { getExecArgsFromMutation, MUTATION_LOG_META_TABLE, mutationLogMetaTable, SESSION_CHANGESET_META_TABLE, sessionChangesetMetaTable, } from '../index.js';
3
+ import { getExecArgsFromMutation } from '../mutation.js';
4
+ import { EventId, getMutationDef, MUTATION_LOG_META_TABLE, mutationLogMetaTable, SESSION_CHANGESET_META_TABLE, sessionChangesetMetaTable, } from '../schema/mod.js';
4
5
  import { insertRow } from '../sql-queries/index.js';
5
6
  import { execSql, execSqlPrepared } from './connection.js';
6
7
  import { LeaderThreadCtx } from './types.js';
@@ -11,13 +12,24 @@ export const makeApplyMutation = Effect.gen(function* () {
11
12
  // TODO Running `Schema.hash` can be a bottleneck for larger schemas. There is an opportunity to run this
12
13
  // at build time and lookup the pre-computed hash at runtime.
13
14
  // Also see https://github.com/Effect-TS/effect/issues/2719
14
- [...leaderThreadCtx.schema.mutations.entries()].map(([k, v]) => [k, Schema.hash(v.schema)]));
15
- return (mutationEventEncoded) => Effect.gen(function* () {
16
- const { mutationEventSchema, schema, db, dbLog } = leaderThreadCtx;
17
- const mutationEventDecoded = Schema.decodeUnknownSync(mutationEventSchema)(mutationEventEncoded);
18
- const mutationName = mutationEventDecoded.mutation;
19
- const mutationDef = schema.mutations.get(mutationName) ?? shouldNeverHappen(`Unknown mutation: ${mutationName}`);
20
- const execArgsArr = getExecArgsFromMutation({ mutationDef, mutationEventDecoded });
15
+ [...leaderThreadCtx.schema.mutations.map.entries()].map(([k, v]) => [k, Schema.hash(v.schema)]));
16
+ return (mutationEventEncoded, options) => Effect.gen(function* () {
17
+ const { schema, dbReadModel: db, dbMutationLog } = leaderThreadCtx;
18
+ const skipMutationLog = options?.skipMutationLog ?? false;
19
+ const mutationName = mutationEventEncoded.mutation;
20
+ const mutationDef = getMutationDef(schema, mutationName);
21
+ const execArgsArr = getExecArgsFromMutation({
22
+ mutationDef,
23
+ mutationEvent: { decoded: undefined, encoded: mutationEventEncoded },
24
+ });
25
+ // NOTE we might want to bring this back if we want to debug no-op mutations
26
+ // const makeExecuteOptions = (statementSql: string, bindValues: any) => ({
27
+ // onRowsChanged: (rowsChanged: number) => {
28
+ // if (rowsChanged === 0) {
29
+ // console.warn(`Mutation "${mutationDef.name}" did not affect any rows:`, statementSql, bindValues)
30
+ // }
31
+ // },
32
+ // })
21
33
  // console.group('[@livestore/common:leader-thread:applyMutation]', { mutationName })
22
34
  const session = db.session();
23
35
  for (const { statementSql, bindValues } of execArgsArr) {
@@ -27,26 +39,23 @@ export const makeApplyMutation = Effect.gen(function* () {
27
39
  }
28
40
  const changeset = session.changeset();
29
41
  session.finish();
30
- // NOTE for no-op mutations (e.g. if the state didn't change) the changeset will be empty
31
- // TODO possibly write a null value instead of omitting the row
32
- if (changeset !== undefined && changeset.length > 0) {
33
- // TODO use prepared statements
34
- yield* execSql(db, ...insertRow({
35
- tableName: SESSION_CHANGESET_META_TABLE,
36
- columns: sessionChangesetMetaTable.sqliteDef.columns,
37
- values: {
38
- idGlobal: mutationEventEncoded.id.global,
39
- idLocal: mutationEventEncoded.id.local,
40
- changeset,
41
- debug: execArgsArr,
42
- },
43
- }));
44
- }
42
+ // TODO use prepared statements
43
+ yield* execSql(db, ...insertRow({
44
+ tableName: SESSION_CHANGESET_META_TABLE,
45
+ columns: sessionChangesetMetaTable.sqliteDef.columns,
46
+ values: {
47
+ idGlobal: mutationEventEncoded.id.global,
48
+ idClient: mutationEventEncoded.id.client,
49
+ // NOTE the changeset will be empty (i.e. null) for no-op mutations
50
+ changeset: changeset ?? null,
51
+ debug: execArgsArr,
52
+ },
53
+ }));
45
54
  // console.groupEnd()
46
55
  // write to mutation_log
47
- const excludeFromMutationLog = shouldExcludeMutationFromLog(mutationName, mutationEventDecoded);
48
- if (excludeFromMutationLog === false) {
49
- yield* insertIntoMutationLog(mutationEventEncoded, dbLog, mutationDefSchemaHashMap);
56
+ const excludeFromMutationLog = shouldExcludeMutationFromLog(mutationName, mutationEventEncoded);
57
+ if (skipMutationLog === false && excludeFromMutationLog === false) {
58
+ yield* insertIntoMutationLog(mutationEventEncoded, dbMutationLog, mutationDefSchemaHashMap, mutationEventEncoded.clientId, mutationEventEncoded.sessionId);
50
59
  }
51
60
  else {
52
61
  // console.debug('[@livestore/common:leader-thread] skipping mutation log write', mutation, statementSql, bindValues)
@@ -55,24 +64,32 @@ export const makeApplyMutation = Effect.gen(function* () {
55
64
  attributes: {
56
65
  mutationName: mutationEventEncoded.mutation,
57
66
  mutationId: mutationEventEncoded.id,
58
- 'span.label': mutationEventEncoded.mutation,
67
+ 'span.label': `(${mutationEventEncoded.id.global},${mutationEventEncoded.id.client}) ${mutationEventEncoded.mutation}`,
59
68
  },
60
69
  }));
61
70
  });
62
- const insertIntoMutationLog = (mutationEventEncoded, dbLog, mutationDefSchemaHashMap) => Effect.gen(function* () {
71
+ const insertIntoMutationLog = (mutationEventEncoded, dbMutationLog, mutationDefSchemaHashMap, clientId, sessionId) => Effect.gen(function* () {
63
72
  const mutationName = mutationEventEncoded.mutation;
64
73
  const mutationDefSchemaHash = mutationDefSchemaHashMap.get(mutationName) ?? shouldNeverHappen(`Unknown mutation: ${mutationName}`);
74
+ if (LS_DEV && mutationEventEncoded.parentId.global !== EventId.ROOT.global) {
75
+ const parentMutationExists = dbMutationLog.select(`SELECT COUNT(*) as count FROM ${MUTATION_LOG_META_TABLE} WHERE idGlobal = ? AND idClient = ?`, [mutationEventEncoded.parentId.global, mutationEventEncoded.parentId.client])[0].count === 1;
76
+ if (parentMutationExists === false) {
77
+ shouldNeverHappen(`Parent mutation ${mutationEventEncoded.parentId.global},${mutationEventEncoded.parentId.client} does not exist`);
78
+ }
79
+ }
65
80
  // TODO use prepared statements
66
- yield* execSql(dbLog, ...insertRow({
81
+ yield* execSql(dbMutationLog, ...insertRow({
67
82
  tableName: MUTATION_LOG_META_TABLE,
68
83
  columns: mutationLogMetaTable.sqliteDef.columns,
69
84
  values: {
70
85
  idGlobal: mutationEventEncoded.id.global,
71
- idLocal: mutationEventEncoded.id.local,
86
+ idClient: mutationEventEncoded.id.client,
72
87
  parentIdGlobal: mutationEventEncoded.parentId.global,
73
- parentIdLocal: mutationEventEncoded.parentId.local,
88
+ parentIdClient: mutationEventEncoded.parentId.client,
74
89
  mutation: mutationEventEncoded.mutation,
75
90
  argsJson: mutationEventEncoded.args ?? {},
91
+ clientId,
92
+ sessionId: sessionId ?? null,
76
93
  schemaHash: mutationDefSchemaHash,
77
94
  syncMetadataJson: Option.none(),
78
95
  },
@@ -84,11 +101,14 @@ const makeShouldExcludeMutationFromLog = memoizeByRef((schema) => {
84
101
  const mutationLogExclude = migrationOptions.strategy === 'from-mutation-log'
85
102
  ? (migrationOptions.excludeMutations ?? new Set(['livestore.RawSql']))
86
103
  : new Set(['livestore.RawSql']);
87
- return (mutationName, mutationEventDecoded) => {
104
+ return (mutationName, mutationEventEncoded) => {
88
105
  if (mutationLogExclude.has(mutationName))
89
106
  return true;
90
- const mutationDef = schema.mutations.get(mutationName) ?? shouldNeverHappen(`Unknown mutation: ${mutationName}`);
91
- const execArgsArr = getExecArgsFromMutation({ mutationDef, mutationEventDecoded });
107
+ const mutationDef = getMutationDef(schema, mutationName);
108
+ const execArgsArr = getExecArgsFromMutation({
109
+ mutationDef,
110
+ mutationEvent: { decoded: undefined, encoded: mutationEventEncoded },
111
+ });
92
112
  return execArgsArr.some((_) => _.statementSql.includes('__livestore'));
93
113
  };
94
114
  });
@@ -1 +1 @@
1
- {"version":3,"file":"apply-mutation.js","sourceRoot":"","sources":["../../src/leader-thread/apply-mutation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apply-mutation.js","sourceRoot":"","sources":["../../src/leader-thread/apply-mutation.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,39 @@
1
1
  import { Effect } from '@livestore/utils/effect';
2
- import type { SynchronousDatabase } from '../adapter-types.js';
2
+ import type { SqliteDb } from '../adapter-types.js';
3
3
  import { SqliteError } from '../adapter-types.js';
4
4
  import type { BindValues } from '../sql-queries/index.js';
5
5
  import type { PreparedBindValues } from '../util.js';
6
- export declare const configureConnection: (syncDb: SynchronousDatabase, { fkEnabled }: {
7
- fkEnabled: boolean;
8
- }) => Effect.Effect<void, SqliteError, never>;
9
- export declare const execSql: (syncDb: SynchronousDatabase, sql: string, bind: BindValues) => Effect.Effect<void, SqliteError, never>;
10
- export declare const execSqlPrepared: (syncDb: SynchronousDatabase, sql: string, bindValues: PreparedBindValues) => Effect.Effect<void, SqliteError, never>;
6
+ type ConnectionOptions = {
7
+ /**
8
+ * The database connection locking mode.
9
+ *
10
+ * @remarks
11
+ *
12
+ * This **option is ignored** when used on an **in-memory database** as they can only operate in exclusive locking mode.
13
+ * In-memory databases can’t share state between connections (unless using a
14
+ * {@link https://www.sqlite.org/sharedcache.html#shared_cache_and_in_memory_databases|shared cache}),
15
+ * making concurrent access impossible. This is functionally equivalent to exclusive locking.
16
+ *
17
+ * @defaultValue
18
+ * The default is `"NORMAL"` unless it was unless overridden at compile-time using `SQLITE_DEFAULT_LOCKING_MODE`.
19
+ *
20
+ * @see {@link https://www.sqlite.org/pragma.html#pragma_locking_mode|`locking_mode` pragma}
21
+ */
22
+ lockingMode?: 'NORMAL' | 'EXCLUSIVE';
23
+ /**
24
+ * Whether to enforce foreign key constraints.
25
+ *
26
+ * @privateRemarks
27
+ *
28
+ * We require a value for this option to minimize future problems, as the default value might change in future
29
+ * versions of SQLite.
30
+ *
31
+ * @see {@link https://www.sqlite.org/pragma.html#pragma_foreign_keys|`foreign_keys` pragma}
32
+ */
33
+ foreignKeys: boolean;
34
+ };
35
+ export declare const configureConnection: (sqliteDb: SqliteDb, { foreignKeys, lockingMode }: ConnectionOptions) => Effect.Effect<void, SqliteError, never>;
36
+ export declare const execSql: (sqliteDb: SqliteDb, sql: string, bind: BindValues) => Effect.Effect<void, SqliteError, never>;
37
+ export declare const execSqlPrepared: (sqliteDb: SqliteDb, sql: string, bindValues: PreparedBindValues) => Effect.Effect<void, SqliteError, never>;
38
+ export {};
11
39
  //# sourceMappingURL=connection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/leader-thread/connection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAQpD,eAAO,MAAM,mBAAmB,WAAY,mBAAmB,iBAAiB;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,4CASnG,CAAA;AAEH,eAAO,MAAM,OAAO,WAAY,mBAAmB,OAAO,MAAM,QAAQ,UAAU,4CAajF,CAAA;AAYD,eAAO,MAAM,eAAe,WAAY,mBAAmB,OAAO,MAAM,cAAc,kBAAkB,4CAgBvG,CAAA"}
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/leader-thread/connection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAQpD,KAAK,iBAAiB,GAAG;IACvB;;;;;;;;;;;;;;OAcG;IACH,WAAW,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAA;IAEpC;;;;;;;;;OASG;IACH,WAAW,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,UAAU,QAAQ,EAAE,8BAA8B,iBAAiB,4CAuBpG,CAAA;AAEH,eAAO,MAAM,OAAO,GAAI,UAAU,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,4CAaxE,CAAA;AAYD,eAAO,MAAM,eAAe,GAAI,UAAU,QAAQ,EAAE,KAAK,MAAM,EAAE,YAAY,kBAAkB,4CAgB9F,CAAA"}
@@ -2,15 +2,30 @@
2
2
  import { Effect } from '@livestore/utils/effect';
3
3
  import { SqliteError } from '../adapter-types.js';
4
4
  import { prepareBindValues, sql } from '../util.js';
5
- export const configureConnection = (syncDb, { fkEnabled }) => execSql(syncDb, sql `
5
+ export const configureConnection = (sqliteDb, { foreignKeys, lockingMode }) => execSql(sqliteDb,
6
+ // We use the WAL journal mode is significantly faster in most scenarios than the traditional rollback journal mode.
7
+ // It specifically significantly improves write performance. However, when using the WAL journal mode, transactions
8
+ // that involve changes against multiple ATTACHed databases are atomic for each database but are not atomic
9
+ // across all databases as a set. Additionally, it is not possible to change the page size after entering WAL mode,
10
+ // whether on an empty database or by using VACUUM or the backup API. To change the page size, we must switch to the
11
+ // rollback journal mode.
12
+ //
13
+ // When connected to an in-memory database, the WAL journal mode option is ignored because an in-memory database can
14
+ // only be in either the MEMORY or OFF options. By default, an in-memory database is in the MEMORY option, which
15
+ // means that it stores the rollback journal in volatile RAM. This saves disk I/O but at the expense of safety and
16
+ // integrity. If the thread using SQLite crashes in the middle of a transaction, then the database file will very
17
+ // likely go corrupt.
18
+ sql `
19
+ -- disable WAL until we have it working properly
20
+ -- PRAGMA journal_mode=WAL;
6
21
  PRAGMA page_size=8192;
7
- PRAGMA journal_mode=MEMORY;
8
- ${fkEnabled ? sql `PRAGMA foreign_keys='ON';` : sql `PRAGMA foreign_keys='OFF';`}
22
+ PRAGMA foreign_keys=${foreignKeys ? 'ON' : 'OFF'};
23
+ ${lockingMode === undefined ? '' : sql `PRAGMA locking_mode=${lockingMode};`}
9
24
  `, {});
10
- export const execSql = (syncDb, sql, bind) => {
25
+ export const execSql = (sqliteDb, sql, bind) => {
11
26
  const bindValues = prepareBindValues(bind, sql);
12
27
  return Effect.try({
13
- try: () => syncDb.execute(sql, bindValues),
28
+ try: () => sqliteDb.execute(sql, bindValues),
14
29
  catch: (cause) => new SqliteError({ cause, query: { bindValues, sql }, code: cause.code }),
15
30
  }).pipe(Effect.asVoid,
16
31
  // Effect.logDuration(`@livestore/common:execSql:${sql}`),
@@ -27,9 +42,9 @@ export const execSql = (syncDb, sql, bind) => {
27
42
  // })
28
43
  // }
29
44
  // TODO actually use prepared statements
30
- export const execSqlPrepared = (syncDb, sql, bindValues) => {
45
+ export const execSqlPrepared = (sqliteDb, sql, bindValues) => {
31
46
  return Effect.try({
32
- try: () => syncDb.execute(sql, bindValues),
47
+ try: () => sqliteDb.execute(sql, bindValues),
33
48
  catch: (cause) => new SqliteError({ cause, query: { bindValues, sql }, code: cause.code }),
34
49
  }).pipe(Effect.asVoid,
35
50
  // Effect.logDuration(`@livestore/common:execSqlPrepared:${sql}`),
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/leader-thread/connection.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGhD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGjD,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AAOnD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAA2B,EAAE,EAAE,SAAS,EAA0B,EAAE,EAAE,CACxG,OAAO,CACL,MAAM,EACN,GAAG,CAAA;;;MAGD,SAAS,CAAC,CAAC,CAAC,GAAG,CAAA,2BAA2B,CAAC,CAAC,CAAC,GAAG,CAAA,4BAA4B;GAC/E,EACC,EAAE,CACH,CAAA;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAA2B,EAAE,GAAW,EAAE,IAAgB,EAAE,EAAE;IACpF,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC/C,OAAO,MAAM,CAAC,GAAG,CAAC;QAChB,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC;QAC1C,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,IAAI,EAAG,KAA8B,CAAC,IAAI,EAAE,CAAC;KACrG,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,MAAM;IACb,0DAA0D;IAC1D,MAAM,CAAC,QAAQ,CAAC,2BAA2B,EAAE;QAC3C,UAAU,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;KAC/E,CAAC,CACH,CAAA;AACH,CAAC,CAAA;AAED,gFAAgF;AAChF,yDAAyD;AACzD,wBAAwB;AACxB,6CAA6C;AAC7C,wBAAwB;AACxB,sHAAsH;AACtH,OAAO;AACP,IAAI;AAEJ,wCAAwC;AACxC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAA2B,EAAE,GAAW,EAAE,UAA8B,EAAE,EAAE;IAC1G,OAAO,MAAM,CAAC,GAAG,CAAC;QAChB,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC;QAC1C,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,IAAI,EAAG,KAA8B,CAAC,IAAI,EAAE,CAAC;KACrG,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,MAAM;IACb,kEAAkE;IAClE,MAAM,CAAC,QAAQ,CAAC,mCAAmC,EAAE;QACnD,UAAU,EAAE;YACV,YAAY,EAAE,GAAG;YACjB,GAAG;YACH,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;SACvC;KACF,CAAC,CACH,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/leader-thread/connection.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGhD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGjD,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AAsCnD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAkB,EAAE,EAAE,WAAW,EAAE,WAAW,EAAqB,EAAE,EAAE,CACzG,OAAO,CACL,QAAQ;AACR,oHAAoH;AACpH,mHAAmH;AACnH,2GAA2G;AAC3G,mHAAmH;AACnH,oHAAoH;AACpH,yBAAyB;AACzB,EAAE;AACF,oHAAoH;AACpH,gHAAgH;AAChH,kHAAkH;AAClH,iHAAiH;AACjH,qBAAqB;AACrB,GAAG,CAAA;;;;0BAImB,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;MAC9C,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA,uBAAuB,WAAW,GAAG;GAC5E,EACC,EAAE,CACH,CAAA;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,QAAkB,EAAE,GAAW,EAAE,IAAgB,EAAE,EAAE;IAC3E,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC/C,OAAO,MAAM,CAAC,GAAG,CAAC;QAChB,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC;QAC5C,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,IAAI,EAAG,KAA8B,CAAC,IAAI,EAAE,CAAC;KACrG,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,MAAM;IACb,0DAA0D;IAC1D,MAAM,CAAC,QAAQ,CAAC,2BAA2B,EAAE;QAC3C,UAAU,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;KAC/E,CAAC,CACH,CAAA;AACH,CAAC,CAAA;AAED,gFAAgF;AAChF,yDAAyD;AACzD,wBAAwB;AACxB,6CAA6C;AAC7C,wBAAwB;AACxB,sHAAsH;AACtH,OAAO;AACP,IAAI;AAEJ,wCAAwC;AACxC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAkB,EAAE,GAAW,EAAE,UAA8B,EAAE,EAAE;IACjG,OAAO,MAAM,CAAC,GAAG,CAAC;QAChB,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC;QAC5C,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,IAAI,EAAG,KAA8B,CAAC,IAAI,EAAE,CAAC;KACrG,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,MAAM;IACb,kEAAkE;IAClE,MAAM,CAAC,QAAQ,CAAC,mCAAmC,EAAE;QACnD,UAAU,EAAE;YACV,YAAY,EAAE,GAAG;YACjB,GAAG;YACH,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;SACvC;KACF,CAAC,CACH,CAAA;AACH,CAAC,CAAA"}
@@ -2,5 +2,5 @@ import { Effect } from '@livestore/utils/effect';
2
2
  import { UnexpectedError } from '../index.js';
3
3
  import type { DevtoolsOptions } from './types.js';
4
4
  import { LeaderThreadCtx } from './types.js';
5
- export declare const bootDevtools: (options: DevtoolsOptions) => Effect.Effect<void, UnexpectedError, import("effect/Scope").Scope | import("@effect/platform/HttpClient").HttpClient | LeaderThreadCtx>;
5
+ export declare const bootDevtools: (options: DevtoolsOptions) => Effect.Effect<void, UnexpectedError, import("effect/Scope").Scope | LeaderThreadCtx | import("@effect/platform/HttpClient").HttpClient>;
6
6
  //# sourceMappingURL=leader-worker-devtools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"leader-worker-devtools.d.ts","sourceRoot":"","sources":["../../src/leader-thread/leader-worker-devtools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA4D,MAAM,yBAAyB,CAAA;AAE1G,OAAO,EAAwD,eAAe,EAAE,MAAM,aAAa,CAAA;AAGnG,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,YAAY,CAAA;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAW5C,eAAO,MAAM,YAAY,YAAa,eAAe,4IA2GsB,CAAA"}
1
+ {"version":3,"file":"leader-worker-devtools.d.ts","sourceRoot":"","sources":["../../src/leader-thread/leader-worker-devtools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA6C,MAAM,yBAAyB,CAAA;AAG3F,OAAO,EAAwD,eAAe,EAAE,MAAM,aAAa,CAAA;AAEnG,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,YAAY,CAAA;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAK5C,eAAO,MAAM,YAAY,GAAI,SAAS,eAAe,4IAwCsB,CAAA"}