@livestore/common 0.3.0-dev.27 → 0.3.0-dev.29

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 (277) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/__tests__/fixture.d.ts +83 -221
  3. package/dist/__tests__/fixture.d.ts.map +1 -1
  4. package/dist/__tests__/fixture.js +33 -11
  5. package/dist/__tests__/fixture.js.map +1 -1
  6. package/dist/adapter-types.d.ts +22 -15
  7. package/dist/adapter-types.d.ts.map +1 -1
  8. package/dist/adapter-types.js +15 -2
  9. package/dist/adapter-types.js.map +1 -1
  10. package/dist/bounded-collections.d.ts +1 -1
  11. package/dist/bounded-collections.d.ts.map +1 -1
  12. package/dist/debug-info.d.ts.map +1 -1
  13. package/dist/debug-info.js +1 -0
  14. package/dist/debug-info.js.map +1 -1
  15. package/dist/devtools/devtools-messages-client-session.d.ts +21 -21
  16. package/dist/devtools/devtools-messages-common.d.ts +6 -6
  17. package/dist/devtools/devtools-messages-leader.d.ts +45 -45
  18. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  19. package/dist/devtools/devtools-messages-leader.js +11 -11
  20. package/dist/devtools/devtools-messages-leader.js.map +1 -1
  21. package/dist/index.d.ts +2 -5
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +2 -5
  24. package/dist/index.js.map +1 -1
  25. package/dist/leader-thread/LeaderSyncProcessor.d.ts +25 -12
  26. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  27. package/dist/leader-thread/LeaderSyncProcessor.js +125 -89
  28. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  29. package/dist/leader-thread/{apply-mutation.d.ts → apply-event.d.ts} +7 -7
  30. package/dist/leader-thread/apply-event.d.ts.map +1 -0
  31. package/dist/leader-thread/apply-event.js +103 -0
  32. package/dist/leader-thread/apply-event.js.map +1 -0
  33. package/dist/leader-thread/eventlog.d.ts +27 -0
  34. package/dist/leader-thread/eventlog.d.ts.map +1 -0
  35. package/dist/leader-thread/eventlog.js +123 -0
  36. package/dist/leader-thread/eventlog.js.map +1 -0
  37. package/dist/leader-thread/leader-worker-devtools.js +18 -18
  38. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  39. package/dist/leader-thread/make-leader-thread-layer.d.ts +16 -4
  40. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  41. package/dist/leader-thread/make-leader-thread-layer.js +23 -16
  42. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  43. package/dist/leader-thread/mod.d.ts +1 -1
  44. package/dist/leader-thread/mod.d.ts.map +1 -1
  45. package/dist/leader-thread/mod.js +1 -1
  46. package/dist/leader-thread/mod.js.map +1 -1
  47. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  48. package/dist/leader-thread/recreate-db.js +6 -8
  49. package/dist/leader-thread/recreate-db.js.map +1 -1
  50. package/dist/leader-thread/types.d.ts +11 -11
  51. package/dist/leader-thread/types.d.ts.map +1 -1
  52. package/dist/materializer-helper.d.ts +23 -0
  53. package/dist/materializer-helper.d.ts.map +1 -0
  54. package/dist/materializer-helper.js +70 -0
  55. package/dist/materializer-helper.js.map +1 -0
  56. package/dist/query-builder/api.d.ts +58 -53
  57. package/dist/query-builder/api.d.ts.map +1 -1
  58. package/dist/query-builder/api.js +3 -5
  59. package/dist/query-builder/api.js.map +1 -1
  60. package/dist/query-builder/astToSql.d.ts.map +1 -1
  61. package/dist/query-builder/astToSql.js +59 -37
  62. package/dist/query-builder/astToSql.js.map +1 -1
  63. package/dist/query-builder/impl.d.ts +2 -3
  64. package/dist/query-builder/impl.d.ts.map +1 -1
  65. package/dist/query-builder/impl.js +48 -46
  66. package/dist/query-builder/impl.js.map +1 -1
  67. package/dist/query-builder/impl.test.d.ts +86 -1
  68. package/dist/query-builder/impl.test.d.ts.map +1 -1
  69. package/dist/query-builder/impl.test.js +244 -36
  70. package/dist/query-builder/impl.test.js.map +1 -1
  71. package/dist/rehydrate-from-eventlog.d.ts +14 -0
  72. package/dist/rehydrate-from-eventlog.d.ts.map +1 -0
  73. package/dist/{rehydrate-from-mutationlog.js → rehydrate-from-eventlog.js} +25 -26
  74. package/dist/rehydrate-from-eventlog.js.map +1 -0
  75. package/dist/schema/EventDef.d.ts +136 -0
  76. package/dist/schema/EventDef.d.ts.map +1 -0
  77. package/dist/schema/EventDef.js +58 -0
  78. package/dist/schema/EventDef.js.map +1 -0
  79. package/dist/schema/EventId.d.ts +2 -2
  80. package/dist/schema/EventId.d.ts.map +1 -1
  81. package/dist/schema/EventId.js +8 -2
  82. package/dist/schema/EventId.js.map +1 -1
  83. package/dist/schema/{MutationEvent.d.ts → LiveStoreEvent.d.ts} +56 -56
  84. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  85. package/dist/schema/{MutationEvent.js → LiveStoreEvent.js} +25 -25
  86. package/dist/schema/LiveStoreEvent.js.map +1 -0
  87. package/dist/schema/client-document-def.d.ts +223 -0
  88. package/dist/schema/client-document-def.d.ts.map +1 -0
  89. package/dist/schema/client-document-def.js +170 -0
  90. package/dist/schema/client-document-def.js.map +1 -0
  91. package/dist/schema/client-document-def.test.d.ts +2 -0
  92. package/dist/schema/client-document-def.test.d.ts.map +1 -0
  93. package/dist/schema/client-document-def.test.js +201 -0
  94. package/dist/schema/client-document-def.test.js.map +1 -0
  95. package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -1
  96. package/dist/schema/events.d.ts +2 -0
  97. package/dist/schema/events.d.ts.map +1 -0
  98. package/dist/schema/events.js +2 -0
  99. package/dist/schema/events.js.map +1 -0
  100. package/dist/schema/mod.d.ts +4 -3
  101. package/dist/schema/mod.d.ts.map +1 -1
  102. package/dist/schema/mod.js +4 -3
  103. package/dist/schema/mod.js.map +1 -1
  104. package/dist/schema/schema.d.ts +27 -23
  105. package/dist/schema/schema.d.ts.map +1 -1
  106. package/dist/schema/schema.js +45 -43
  107. package/dist/schema/schema.js.map +1 -1
  108. package/dist/schema/sqlite-state.d.ts +12 -0
  109. package/dist/schema/sqlite-state.d.ts.map +1 -0
  110. package/dist/schema/sqlite-state.js +36 -0
  111. package/dist/schema/sqlite-state.js.map +1 -0
  112. package/dist/schema/system-tables.d.ts +67 -98
  113. package/dist/schema/system-tables.d.ts.map +1 -1
  114. package/dist/schema/system-tables.js +62 -48
  115. package/dist/schema/system-tables.js.map +1 -1
  116. package/dist/schema/table-def.d.ts +26 -96
  117. package/dist/schema/table-def.d.ts.map +1 -1
  118. package/dist/schema/table-def.js +16 -64
  119. package/dist/schema/table-def.js.map +1 -1
  120. package/dist/schema/view.d.ts +3 -0
  121. package/dist/schema/view.d.ts.map +1 -0
  122. package/dist/schema/view.js +3 -0
  123. package/dist/schema/view.js.map +1 -0
  124. package/dist/schema-management/common.d.ts +4 -4
  125. package/dist/schema-management/common.d.ts.map +1 -1
  126. package/dist/schema-management/migrations.d.ts.map +1 -1
  127. package/dist/schema-management/migrations.js +6 -6
  128. package/dist/schema-management/migrations.js.map +1 -1
  129. package/dist/schema-management/validate-mutation-defs.d.ts +3 -3
  130. package/dist/schema-management/validate-mutation-defs.d.ts.map +1 -1
  131. package/dist/schema-management/validate-mutation-defs.js +17 -17
  132. package/dist/schema-management/validate-mutation-defs.js.map +1 -1
  133. package/dist/sync/ClientSessionSyncProcessor.d.ts +7 -7
  134. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  135. package/dist/sync/ClientSessionSyncProcessor.js +31 -30
  136. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  137. package/dist/sync/next/facts.d.ts +19 -19
  138. package/dist/sync/next/facts.d.ts.map +1 -1
  139. package/dist/sync/next/facts.js +2 -2
  140. package/dist/sync/next/facts.js.map +1 -1
  141. package/dist/sync/next/history-dag-common.d.ts +3 -3
  142. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  143. package/dist/sync/next/history-dag-common.js +1 -1
  144. package/dist/sync/next/history-dag-common.js.map +1 -1
  145. package/dist/sync/next/history-dag.js +1 -1
  146. package/dist/sync/next/history-dag.js.map +1 -1
  147. package/dist/sync/next/rebase-events.d.ts +7 -7
  148. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  149. package/dist/sync/next/rebase-events.js +5 -5
  150. package/dist/sync/next/rebase-events.js.map +1 -1
  151. package/dist/sync/next/test/compact-events.calculator.test.js +38 -33
  152. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  153. package/dist/sync/next/test/compact-events.test.js +71 -71
  154. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  155. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +29 -29
  156. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  157. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +60 -25
  158. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  159. package/dist/sync/next/test/mod.d.ts +1 -1
  160. package/dist/sync/next/test/mod.d.ts.map +1 -1
  161. package/dist/sync/next/test/mod.js +1 -1
  162. package/dist/sync/next/test/mod.js.map +1 -1
  163. package/dist/sync/sync.d.ts +3 -3
  164. package/dist/sync/sync.d.ts.map +1 -1
  165. package/dist/sync/syncstate.d.ts +32 -32
  166. package/dist/sync/syncstate.d.ts.map +1 -1
  167. package/dist/sync/syncstate.js +31 -25
  168. package/dist/sync/syncstate.js.map +1 -1
  169. package/dist/sync/syncstate.test.js +165 -175
  170. package/dist/sync/syncstate.test.js.map +1 -1
  171. package/dist/sync/validate-push-payload.d.ts +2 -2
  172. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  173. package/dist/sync/validate-push-payload.js.map +1 -1
  174. package/dist/version.d.ts +1 -1
  175. package/dist/version.js +1 -1
  176. package/package.json +3 -3
  177. package/src/__tests__/fixture.ts +36 -15
  178. package/src/adapter-types.ts +23 -16
  179. package/src/debug-info.ts +1 -0
  180. package/src/devtools/devtools-messages-leader.ts +13 -13
  181. package/src/index.ts +2 -5
  182. package/src/leader-thread/LeaderSyncProcessor.ts +183 -122
  183. package/src/leader-thread/{apply-mutation.ts → apply-event.ts} +50 -74
  184. package/src/leader-thread/eventlog.ts +199 -0
  185. package/src/leader-thread/leader-worker-devtools.ts +18 -18
  186. package/src/leader-thread/make-leader-thread-layer.ts +51 -29
  187. package/src/leader-thread/mod.ts +1 -1
  188. package/src/leader-thread/recreate-db.ts +6 -9
  189. package/src/leader-thread/types.ts +12 -12
  190. package/src/materializer-helper.ts +110 -0
  191. package/src/query-builder/api.ts +79 -105
  192. package/src/query-builder/astToSql.ts +68 -39
  193. package/src/query-builder/impl.test.ts +264 -42
  194. package/src/query-builder/impl.ts +72 -56
  195. package/src/{rehydrate-from-mutationlog.ts → rehydrate-from-eventlog.ts} +33 -40
  196. package/src/schema/EventDef.ts +216 -0
  197. package/src/schema/EventId.ts +11 -3
  198. package/src/schema/{MutationEvent.ts → LiveStoreEvent.ts} +68 -69
  199. package/src/schema/client-document-def.test.ts +239 -0
  200. package/src/schema/client-document-def.ts +444 -0
  201. package/src/schema/db-schema/dsl/mod.ts +0 -1
  202. package/src/schema/events.ts +1 -0
  203. package/src/schema/mod.ts +4 -3
  204. package/src/schema/schema.ts +79 -69
  205. package/src/schema/sqlite-state.ts +62 -0
  206. package/src/schema/system-tables.ts +42 -53
  207. package/src/schema/table-def.ts +53 -209
  208. package/src/schema/view.ts +2 -0
  209. package/src/schema-management/common.ts +4 -4
  210. package/src/schema-management/migrations.ts +8 -9
  211. package/src/schema-management/validate-mutation-defs.ts +22 -24
  212. package/src/sync/ClientSessionSyncProcessor.ts +37 -36
  213. package/src/sync/next/facts.ts +31 -32
  214. package/src/sync/next/history-dag-common.ts +4 -4
  215. package/src/sync/next/history-dag.ts +1 -1
  216. package/src/sync/next/rebase-events.ts +13 -13
  217. package/src/sync/next/test/compact-events.calculator.test.ts +45 -45
  218. package/src/sync/next/test/compact-events.test.ts +73 -73
  219. package/src/sync/next/test/event-fixtures.ts +219 -0
  220. package/src/sync/next/test/mod.ts +1 -1
  221. package/src/sync/sync.ts +3 -3
  222. package/src/sync/syncstate.test.ts +168 -179
  223. package/src/sync/syncstate.ts +48 -38
  224. package/src/sync/validate-push-payload.ts +2 -2
  225. package/src/version.ts +1 -1
  226. package/tmp/pack.tgz +0 -0
  227. package/tsconfig.json +1 -0
  228. package/dist/derived-mutations.d.ts +0 -109
  229. package/dist/derived-mutations.d.ts.map +0 -1
  230. package/dist/derived-mutations.js +0 -54
  231. package/dist/derived-mutations.js.map +0 -1
  232. package/dist/derived-mutations.test.d.ts +0 -2
  233. package/dist/derived-mutations.test.d.ts.map +0 -1
  234. package/dist/derived-mutations.test.js +0 -93
  235. package/dist/derived-mutations.test.js.map +0 -1
  236. package/dist/init-singleton-tables.d.ts +0 -4
  237. package/dist/init-singleton-tables.d.ts.map +0 -1
  238. package/dist/init-singleton-tables.js +0 -16
  239. package/dist/init-singleton-tables.js.map +0 -1
  240. package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
  241. package/dist/leader-thread/apply-mutation.js +0 -122
  242. package/dist/leader-thread/apply-mutation.js.map +0 -1
  243. package/dist/leader-thread/mutationlog.d.ts +0 -27
  244. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  245. package/dist/leader-thread/mutationlog.js +0 -124
  246. package/dist/leader-thread/mutationlog.js.map +0 -1
  247. package/dist/leader-thread/pull-queue-set.d.ts +0 -7
  248. package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
  249. package/dist/leader-thread/pull-queue-set.js +0 -38
  250. package/dist/leader-thread/pull-queue-set.js.map +0 -1
  251. package/dist/mutation.d.ts +0 -20
  252. package/dist/mutation.d.ts.map +0 -1
  253. package/dist/mutation.js +0 -68
  254. package/dist/mutation.js.map +0 -1
  255. package/dist/query-info.d.ts +0 -41
  256. package/dist/query-info.d.ts.map +0 -1
  257. package/dist/query-info.js +0 -7
  258. package/dist/query-info.js.map +0 -1
  259. package/dist/rehydrate-from-mutationlog.d.ts +0 -15
  260. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  261. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  262. package/dist/schema/MutationEvent.d.ts.map +0 -1
  263. package/dist/schema/MutationEvent.js.map +0 -1
  264. package/dist/schema/mutations.d.ts +0 -115
  265. package/dist/schema/mutations.d.ts.map +0 -1
  266. package/dist/schema/mutations.js +0 -42
  267. package/dist/schema/mutations.js.map +0 -1
  268. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  269. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  270. package/src/derived-mutations.test.ts +0 -101
  271. package/src/derived-mutations.ts +0 -170
  272. package/src/init-singleton-tables.ts +0 -24
  273. package/src/leader-thread/mutationlog.ts +0 -202
  274. package/src/mutation.ts +0 -108
  275. package/src/query-info.ts +0 -83
  276. package/src/schema/mutations.ts +0 -193
  277. package/src/sync/next/test/mutation-fixtures.ts +0 -228
@@ -5,13 +5,13 @@ import type { BootStatus, MakeSqliteDb, MigrationsReport, SqliteError } from '..
5
5
  import { UnexpectedError } from '../adapter-types.js'
6
6
  import type * as Devtools from '../devtools/mod.js'
7
7
  import type { LiveStoreSchema } from '../schema/mod.js'
8
- import { MutationEvent } from '../schema/mod.js'
8
+ import { LiveStoreEvent } from '../schema/mod.js'
9
9
  import type { InvalidPullError, IsOfflineError, SyncOptions } from '../sync/sync.js'
10
10
  import { sql } from '../util.js'
11
- import { makeApplyMutation } from './apply-mutation.js'
11
+ import { makeApplyEvent } from './apply-event.js'
12
+ import * as Eventlog from './eventlog.js'
12
13
  import { bootDevtools } from './leader-worker-devtools.js'
13
14
  import { makeLeaderSyncProcessor } from './LeaderSyncProcessor.js'
14
- import * as Mutationlog from './mutationlog.js'
15
15
  import { recreateDb } from './recreate-db.js'
16
16
  import type { ShutdownChannel } from './shutdown-channel.js'
17
17
  import type {
@@ -23,6 +23,30 @@ import type {
23
23
  } from './types.js'
24
24
  import { LeaderThreadCtx } from './types.js'
25
25
 
26
+ export interface MakeLeaderThreadLayerParams {
27
+ storeId: string
28
+ syncPayload: Schema.JsonValue | undefined
29
+ clientId: string
30
+ schema: LiveStoreSchema
31
+ makeSqliteDb: MakeSqliteDb
32
+ syncOptions: SyncOptions | undefined
33
+ dbReadModel: LeaderSqliteDb
34
+ dbEventlog: LeaderSqliteDb
35
+ devtoolsOptions: DevtoolsOptions
36
+ shutdownChannel: ShutdownChannel
37
+ params?: {
38
+ localPushBatchSize?: number
39
+ backendPushBatchSize?: number
40
+ }
41
+ testing?: {
42
+ syncProcessor?: {
43
+ delays?: {
44
+ localPushProcessing?: Effect.Effect<void>
45
+ }
46
+ }
47
+ }
48
+ }
49
+
26
50
  export const makeLeaderThreadLayer = ({
27
51
  schema,
28
52
  storeId,
@@ -31,28 +55,19 @@ export const makeLeaderThreadLayer = ({
31
55
  makeSqliteDb,
32
56
  syncOptions,
33
57
  dbReadModel,
34
- dbMutationLog,
58
+ dbEventlog,
35
59
  devtoolsOptions,
36
60
  shutdownChannel,
37
- }: {
38
- storeId: string
39
- syncPayload: Schema.JsonValue | undefined
40
- clientId: string
41
- schema: LiveStoreSchema
42
- makeSqliteDb: MakeSqliteDb
43
- syncOptions: SyncOptions | undefined
44
- dbReadModel: LeaderSqliteDb
45
- dbMutationLog: LeaderSqliteDb
46
- devtoolsOptions: DevtoolsOptions
47
- shutdownChannel: ShutdownChannel
48
- }): Layer.Layer<LeaderThreadCtx, UnexpectedError, Scope.Scope | HttpClient.HttpClient> =>
61
+ params,
62
+ testing,
63
+ }: MakeLeaderThreadLayerParams): Layer.Layer<LeaderThreadCtx, UnexpectedError, Scope.Scope | HttpClient.HttpClient> =>
49
64
  Effect.gen(function* () {
50
65
  const bootStatusQueue = yield* Queue.unbounded<BootStatus>().pipe(Effect.acquireRelease(Queue.shutdown))
51
66
 
52
67
  // TODO do more validation here than just checking the count of tables
53
68
  // Either happens on initial boot or if schema changes
54
- const dbMutationLogMissing =
55
- dbMutationLog.select<{ count: number }>(sql`select count(*) as count from sqlite_master`)[0]!.count === 0
69
+ const dbEventlogMissing =
70
+ dbEventlog.select<{ count: number }>(sql`select count(*) as count from sqlite_master`)[0]!.count === 0
56
71
 
57
72
  const dbReadModelMissing =
58
73
  dbReadModel.select<{ count: number }>(sql`select count(*) as count from sqlite_master`)[0]!.count === 0
@@ -74,12 +89,19 @@ export const makeLeaderThreadLayer = ({
74
89
 
75
90
  const syncProcessor = yield* makeLeaderSyncProcessor({
76
91
  schema,
77
- dbMutationLogMissing,
78
- dbMutationLog,
92
+ dbEventlogMissing,
93
+ dbEventlog,
79
94
  dbReadModel,
80
95
  dbReadModelMissing,
81
96
  initialBlockingSyncContext,
82
97
  onError: syncOptions?.onSyncError ?? 'ignore',
98
+ params: {
99
+ localPushBatchSize: params?.localPushBatchSize,
100
+ backendPushBatchSize: params?.backendPushBatchSize,
101
+ },
102
+ testing: {
103
+ delays: testing?.syncProcessor?.delays,
104
+ },
83
105
  })
84
106
 
85
107
  const extraIncomingMessagesQueue = yield* Queue.unbounded<Devtools.Leader.MessageToApp>().pipe(
@@ -94,7 +116,7 @@ export const makeLeaderThreadLayer = ({
94
116
  }
95
117
  : { enabled: false as const }
96
118
 
97
- const applyMutation = yield* makeApplyMutation({ schema, dbReadModel, dbMutationLog })
119
+ const applyEvent = yield* makeApplyEvent({ schema, dbReadModel, dbEventlog })
98
120
 
99
121
  const ctx = {
100
122
  schema,
@@ -102,14 +124,14 @@ export const makeLeaderThreadLayer = ({
102
124
  storeId,
103
125
  clientId,
104
126
  dbReadModel,
105
- dbMutationLog,
127
+ dbEventlog,
106
128
  makeSqliteDb,
107
- mutationEventSchema: MutationEvent.makeMutationEventSchema(schema),
129
+ eventSchema: LiveStoreEvent.makeEventDefSchema(schema),
108
130
  shutdownStateSubRef: yield* SubscriptionRef.make<ShutdownState>('running'),
109
131
  shutdownChannel,
110
132
  syncBackend,
111
133
  syncProcessor,
112
- applyMutation,
134
+ applyEvent,
113
135
  extraIncomingMessagesQueue,
114
136
  devtools: devtoolsContext,
115
137
  // State will be set during `bootLeaderThread`
@@ -146,7 +168,7 @@ const makeInitialBlockingSyncContext = ({
146
168
  Effect.gen(function* () {
147
169
  const ctx = {
148
170
  isDone: false,
149
- processedMutations: 0,
171
+ processedEvents: 0,
150
172
  total: -1,
151
173
  }
152
174
 
@@ -169,10 +191,10 @@ const makeInitialBlockingSyncContext = ({
169
191
  ctx.total = remaining + processed
170
192
  }
171
193
 
172
- ctx.processedMutations += processed
194
+ ctx.processedEvents += processed
173
195
  yield* Queue.offer(bootStatusQueue, {
174
196
  stage: 'syncing',
175
- progress: { done: ctx.processedMutations, total: ctx.total },
197
+ progress: { done: ctx.processedEvents, total: ctx.total },
176
198
  })
177
199
 
178
200
  if (remaining === 0 && blockingDeferred !== undefined) {
@@ -201,9 +223,9 @@ const bootLeaderThread = ({
201
223
  LeaderThreadCtx | Scope.Scope | HttpClient.HttpClient
202
224
  > =>
203
225
  Effect.gen(function* () {
204
- const { dbMutationLog, bootStatusQueue, syncProcessor } = yield* LeaderThreadCtx
226
+ const { dbEventlog, bootStatusQueue, syncProcessor } = yield* LeaderThreadCtx
205
227
 
206
- yield* Mutationlog.initMutationLogDb(dbMutationLog)
228
+ yield* Eventlog.initEventlogDb(dbEventlog)
207
229
 
208
230
  let migrationsReport: MigrationsReport
209
231
  if (dbReadModelMissing) {
@@ -3,4 +3,4 @@ export * from './types.js'
3
3
  export * as ShutdownChannel from './shutdown-channel.js'
4
4
  export * from './leader-worker-devtools.js'
5
5
  export * from './make-leader-thread-layer.js'
6
- export * as Mutationlog from './mutationlog.js'
6
+ export * as Eventlog from './eventlog.js'
@@ -3,7 +3,7 @@ import type { HttpClient } from '@livestore/utils/effect'
3
3
  import { Effect, Queue } from '@livestore/utils/effect'
4
4
 
5
5
  import type { InvalidPullError, IsOfflineError, MigrationHooks, MigrationsReport, SqliteError } from '../index.js'
6
- import { initializeSingletonTables, migrateDb, rehydrateFromMutationLog, UnexpectedError } from '../index.js'
6
+ import { migrateDb, rehydrateFromEventlog, UnexpectedError } from '../index.js'
7
7
  import { configureConnection } from './connection.js'
8
8
  import { LeaderThreadCtx } from './types.js'
9
9
 
@@ -12,7 +12,7 @@ export const recreateDb: Effect.Effect<
12
12
  UnexpectedError | SqliteError | IsOfflineError | InvalidPullError,
13
13
  LeaderThreadCtx | HttpClient.HttpClient
14
14
  > = Effect.gen(function* () {
15
- const { dbReadModel, dbMutationLog, schema, bootStatusQueue, applyMutation } = yield* LeaderThreadCtx
15
+ const { dbReadModel, dbEventlog, schema, bootStatusQueue, applyEvent } = yield* LeaderThreadCtx
16
16
 
17
17
  const migrationOptions = schema.migrationOptions
18
18
  let migrationsReport: MigrationsReport
@@ -41,26 +41,23 @@ export const recreateDb: Effect.Effect<
41
41
  Queue.offer(bootStatusQueue, { stage: 'migrating', progress: { done, total } }),
42
42
  })
43
43
 
44
- initializeSingletonTables(schema, tmpDb)
45
-
46
44
  yield* Effect.tryAll(() => hooks?.pre?.(tmpDb)).pipe(UnexpectedError.mapToUnexpectedError)
47
45
 
48
46
  return { migrationsReport, tmpDb }
49
47
  })
50
48
 
51
49
  switch (migrationOptions.strategy) {
52
- case 'from-mutation-log': {
50
+ case 'from-eventlog': {
53
51
  const hooks = migrationOptions.hooks
54
52
  const initResult = yield* initDb(hooks)
55
53
 
56
54
  migrationsReport = initResult.migrationsReport
57
55
 
58
- yield* rehydrateFromMutationLog({
56
+ yield* rehydrateFromEventlog({
59
57
  // db: initResult.tmpDb,
60
- dbMutationLog,
58
+ dbEventlog,
61
59
  schema,
62
- migrationOptions,
63
- applyMutation,
60
+ applyEvent,
64
61
  onProgress: ({ done, total }) =>
65
62
  Queue.offer(bootStatusQueue, { stage: 'rehydrating', progress: { done, total } }),
66
63
  })
@@ -24,7 +24,7 @@ import type {
24
24
  SyncBackend,
25
25
  UnexpectedError,
26
26
  } from '../index.js'
27
- import type { EventId, LiveStoreSchema, MutationEvent } from '../schema/mod.js'
27
+ import type { EventId, LiveStoreEvent, LiveStoreSchema } from '../schema/mod.js'
28
28
  import type * as SyncState from '../sync/syncstate.js'
29
29
  import type { ShutdownChannel } from './shutdown-channel.js'
30
30
 
@@ -52,7 +52,7 @@ export type InitialSyncInfo = Option.Option<{
52
52
  // | { _tag: 'Reuse'; syncInfo: InitialSyncInfo }
53
53
 
54
54
  export type LeaderSqliteDb = SqliteDb<{ dbPointer: number; persistenceInfo: PersistenceInfo }>
55
- export type PersistenceInfoPair = { readModel: PersistenceInfo; mutationLog: PersistenceInfo }
55
+ export type PersistenceInfoPair = { readModel: PersistenceInfo; eventlog: PersistenceInfo }
56
56
 
57
57
  export type DevtoolsOptions =
58
58
  | {
@@ -90,16 +90,16 @@ export class LeaderThreadCtx extends Context.Tag('LeaderThreadCtx')<
90
90
  clientId: string
91
91
  makeSqliteDb: MakeSqliteDb
92
92
  dbReadModel: LeaderSqliteDb
93
- dbMutationLog: LeaderSqliteDb
93
+ dbEventlog: LeaderSqliteDb
94
94
  bootStatusQueue: Queue.Queue<BootStatus>
95
95
  // TODO we should find a more elegant way to handle cases which need this ref for their implementation
96
96
  shutdownStateSubRef: SubscriptionRef.SubscriptionRef<ShutdownState>
97
97
  shutdownChannel: ShutdownChannel
98
- mutationEventSchema: MutationEvent.ForMutationDefRecord<any>
98
+ eventSchema: LiveStoreEvent.ForEventDefRecord<any>
99
99
  devtools: DevtoolsContext
100
100
  syncBackend: SyncBackend | undefined
101
101
  syncProcessor: LeaderSyncProcessor
102
- applyMutation: ApplyMutation
102
+ applyEvent: ApplyEvent
103
103
  initialState: {
104
104
  leaderHead: EventId.EventId
105
105
  migrationsReport: MigrationsReport
@@ -113,11 +113,11 @@ export class LeaderThreadCtx extends Context.Tag('LeaderThreadCtx')<
113
113
  }
114
114
  >() {}
115
115
 
116
- export type ApplyMutation = (
117
- mutationEventEncoded: MutationEvent.EncodedWithMeta,
116
+ export type ApplyEvent = (
117
+ eventEncoded: LiveStoreEvent.EncodedWithMeta,
118
118
  options?: {
119
- /** Needed for rehydrateFromMutationLog */
120
- skipMutationLog?: boolean
119
+ /** Needed for rehydrateFromEventlog */
120
+ skipEventlog?: boolean
121
121
  },
122
122
  ) => Effect.Effect<
123
123
  { sessionChangeset: { _tag: 'sessionChangeset'; data: Uint8Array; debug: any } | { _tag: 'no-op' } },
@@ -143,10 +143,10 @@ export interface LeaderSyncProcessor {
143
143
  Scope.Scope
144
144
  >
145
145
 
146
- /** Used by client sessions to push mutations to the leader thread */
146
+ /** Used by client sessions to push events to the leader thread */
147
147
  push: (
148
148
  /** `batch` needs to follow the same rules as `batch` in `SyncBackend.push` */
149
- batch: ReadonlyArray<MutationEvent.EncodedWithMeta>,
149
+ batch: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>,
150
150
  options?: {
151
151
  /**
152
152
  * If true, the effect will only finish when the local push has been processed (i.e. succeeded or was rejected).
@@ -158,7 +158,7 @@ export interface LeaderSyncProcessor {
158
158
 
159
159
  /** Currently only used by devtools which don't provide their own event numbers */
160
160
  pushPartial: (args: {
161
- mutationEvent: MutationEvent.PartialAnyEncoded
161
+ event: LiveStoreEvent.PartialAnyEncoded
162
162
  clientId: string
163
163
  sessionId: string
164
164
  }) => Effect.Effect<void, UnexpectedError>
@@ -0,0 +1,110 @@
1
+ import { isReadonlyArray } from '@livestore/utils'
2
+ import { Schema } from '@livestore/utils/effect'
3
+
4
+ import { SessionIdSymbol } from './adapter-types.js'
5
+ import { isQueryBuilder } from './query-builder/api.js'
6
+ import type { EventDef, Materializer, MaterializerResult } from './schema/EventDef.js'
7
+ import type * as LiveStoreEvent from './schema/LiveStoreEvent.js'
8
+ import type { BindValues } from './sql-queries/sql-queries.js'
9
+ import type { PreparedBindValues } from './util.js'
10
+ import { prepareBindValues } from './util.js'
11
+
12
+ export const getExecArgsFromEvent = ({
13
+ eventDef: { eventDef, materializer },
14
+ event,
15
+ }: {
16
+ eventDef: {
17
+ eventDef: EventDef.AnyWithoutFn
18
+ materializer: Materializer
19
+ }
20
+ /** Both encoded and decoded events are supported to reduce the number of times we need to decode/encode */
21
+ event:
22
+ | {
23
+ decoded: LiveStoreEvent.AnyDecoded | LiveStoreEvent.PartialAnyDecoded
24
+ encoded: undefined
25
+ }
26
+ | {
27
+ decoded: undefined
28
+ encoded: LiveStoreEvent.AnyEncoded | LiveStoreEvent.PartialAnyEncoded
29
+ }
30
+ }): ReadonlyArray<{
31
+ statementSql: string
32
+ bindValues: PreparedBindValues
33
+ writeTables: ReadonlySet<string> | undefined
34
+ }> => {
35
+ const eventArgsDecoded = event.decoded?.args ?? Schema.decodeUnknownSync(eventDef.schema)(event.encoded!.args)
36
+
37
+ const res = materializer(eventArgsDecoded, {
38
+ clientOnly: eventDef.options.clientOnly,
39
+ // TODO properly implement this
40
+ currentFacts: new Map(),
41
+ })
42
+
43
+ const statementRes = mapMaterializerResult(res)
44
+
45
+ return statementRes.map((statementRes) => {
46
+ const statementSql = statementRes.sql
47
+
48
+ const eventArgsEncoded = event.encoded?.args ?? Schema.encodeUnknownSync(eventDef.schema)(event.decoded!.args)
49
+ const bindValues = typeof statementRes === 'string' ? eventArgsEncoded : statementRes.bindValues
50
+
51
+ const writeTables = typeof statementRes === 'string' ? undefined : statementRes.writeTables
52
+
53
+ return { statementSql, bindValues: prepareBindValues(bindValues ?? {}, statementSql), writeTables }
54
+ })
55
+ }
56
+
57
+ const mapMaterializerResult = (
58
+ materializerResult: MaterializerResult | ReadonlyArray<MaterializerResult>,
59
+ ): ReadonlyArray<{
60
+ sql: string
61
+ bindValues: BindValues
62
+ writeTables: ReadonlySet<string> | undefined
63
+ }> => {
64
+ if (isReadonlyArray(materializerResult)) {
65
+ return materializerResult.flatMap(mapMaterializerResult)
66
+ }
67
+ if (isQueryBuilder(materializerResult)) {
68
+ const { query, bindValues } = materializerResult.asSql()
69
+ return [{ sql: query, bindValues: bindValues as BindValues, writeTables: undefined }]
70
+ } else if (typeof materializerResult === 'string') {
71
+ return [{ sql: materializerResult, bindValues: {} as BindValues, writeTables: undefined }]
72
+ } else {
73
+ return [
74
+ {
75
+ sql: materializerResult.sql,
76
+ bindValues: materializerResult.bindValues,
77
+ writeTables: materializerResult.writeTables,
78
+ },
79
+ ]
80
+ }
81
+ }
82
+
83
+ // NOTE we should explore whether there is a more elegant solution
84
+ // e.g. by leveraging the schema to replace the sessionIdSymbol
85
+ export const replaceSessionIdSymbol = (
86
+ bindValues: Record<string, unknown> | ReadonlyArray<unknown>,
87
+ sessionId: string,
88
+ ) => {
89
+ deepReplaceValue(bindValues, SessionIdSymbol, sessionId)
90
+ }
91
+
92
+ const deepReplaceValue = <S, R>(input: any, searchValue: S, replaceValue: R): void => {
93
+ if (Array.isArray(input)) {
94
+ for (const i in input) {
95
+ if (input[i] === searchValue) {
96
+ input[i] = replaceValue
97
+ } else {
98
+ deepReplaceValue(input[i], searchValue, replaceValue)
99
+ }
100
+ }
101
+ } else if (typeof input === 'object' && input !== null) {
102
+ for (const key in input) {
103
+ if (input[key] === searchValue) {
104
+ input[key] = replaceValue
105
+ } else {
106
+ deepReplaceValue(input[key], searchValue, replaceValue)
107
+ }
108
+ }
109
+ }
110
+ }