@livestore/common 0.0.0-snapshot-2ef046b02334f52613d31dbe06af53487685edc0 → 0.0.0-snapshot-8115ad48d5a57244358c943ecc92bb0a30274b87

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 (272) 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 +34 -13
  7. package/dist/adapter-types.d.ts.map +1 -1
  8. package/dist/adapter-types.js +20 -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 +146 -98
  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-mutation.js → apply-event.js} +45 -45
  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.d.ts.map +1 -1
  38. package/dist/leader-thread/leader-worker-devtools.js +21 -19
  39. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  40. package/dist/leader-thread/make-leader-thread-layer.d.ts +16 -4
  41. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  42. package/dist/leader-thread/make-leader-thread-layer.js +23 -16
  43. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  44. package/dist/leader-thread/mod.d.ts +1 -1
  45. package/dist/leader-thread/mod.d.ts.map +1 -1
  46. package/dist/leader-thread/mod.js +1 -1
  47. package/dist/leader-thread/mod.js.map +1 -1
  48. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  49. package/dist/leader-thread/recreate-db.js +6 -7
  50. package/dist/leader-thread/recreate-db.js.map +1 -1
  51. package/dist/leader-thread/types.d.ts +14 -15
  52. package/dist/leader-thread/types.d.ts.map +1 -1
  53. package/dist/materializer-helper.d.ts +23 -0
  54. package/dist/materializer-helper.d.ts.map +1 -0
  55. package/dist/materializer-helper.js +70 -0
  56. package/dist/materializer-helper.js.map +1 -0
  57. package/dist/query-builder/api.d.ts +56 -51
  58. package/dist/query-builder/api.d.ts.map +1 -1
  59. package/dist/query-builder/api.js +3 -5
  60. package/dist/query-builder/api.js.map +1 -1
  61. package/dist/query-builder/astToSql.d.ts.map +1 -1
  62. package/dist/query-builder/astToSql.js +59 -37
  63. package/dist/query-builder/astToSql.js.map +1 -1
  64. package/dist/query-builder/impl.d.ts +2 -3
  65. package/dist/query-builder/impl.d.ts.map +1 -1
  66. package/dist/query-builder/impl.js +48 -46
  67. package/dist/query-builder/impl.js.map +1 -1
  68. package/dist/query-builder/impl.test.d.ts +86 -1
  69. package/dist/query-builder/impl.test.d.ts.map +1 -1
  70. package/dist/query-builder/impl.test.js +223 -36
  71. package/dist/query-builder/impl.test.js.map +1 -1
  72. package/dist/rehydrate-from-eventlog.d.ts +15 -0
  73. package/dist/rehydrate-from-eventlog.d.ts.map +1 -0
  74. package/dist/{rehydrate-from-mutationlog.js → rehydrate-from-eventlog.js} +26 -25
  75. package/dist/rehydrate-from-eventlog.js.map +1 -0
  76. package/dist/schema/EventDef.d.ts +136 -0
  77. package/dist/schema/EventDef.d.ts.map +1 -0
  78. package/dist/schema/EventDef.js +58 -0
  79. package/dist/schema/EventDef.js.map +1 -0
  80. package/dist/schema/EventId.d.ts +7 -2
  81. package/dist/schema/EventId.d.ts.map +1 -1
  82. package/dist/schema/EventId.js +18 -3
  83. package/dist/schema/EventId.js.map +1 -1
  84. package/dist/schema/{MutationEvent.d.ts → LiveStoreEvent.d.ts} +56 -56
  85. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  86. package/dist/schema/{MutationEvent.js → LiveStoreEvent.js} +25 -25
  87. package/dist/schema/LiveStoreEvent.js.map +1 -0
  88. package/dist/schema/client-document-def.d.ts +223 -0
  89. package/dist/schema/client-document-def.d.ts.map +1 -0
  90. package/dist/schema/client-document-def.js +170 -0
  91. package/dist/schema/client-document-def.js.map +1 -0
  92. package/dist/schema/client-document-def.test.d.ts +2 -0
  93. package/dist/schema/client-document-def.test.d.ts.map +1 -0
  94. package/dist/schema/client-document-def.test.js +201 -0
  95. package/dist/schema/client-document-def.test.js.map +1 -0
  96. package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -1
  97. package/dist/schema/events.d.ts +2 -0
  98. package/dist/schema/events.d.ts.map +1 -0
  99. package/dist/schema/events.js +2 -0
  100. package/dist/schema/events.js.map +1 -0
  101. package/dist/schema/mod.d.ts +4 -3
  102. package/dist/schema/mod.d.ts.map +1 -1
  103. package/dist/schema/mod.js +4 -3
  104. package/dist/schema/mod.js.map +1 -1
  105. package/dist/schema/schema.d.ts +26 -22
  106. package/dist/schema/schema.d.ts.map +1 -1
  107. package/dist/schema/schema.js +45 -43
  108. package/dist/schema/schema.js.map +1 -1
  109. package/dist/schema/sqlite-state.d.ts +12 -0
  110. package/dist/schema/sqlite-state.d.ts.map +1 -0
  111. package/dist/schema/sqlite-state.js +36 -0
  112. package/dist/schema/sqlite-state.js.map +1 -0
  113. package/dist/schema/system-tables.d.ts +67 -98
  114. package/dist/schema/system-tables.d.ts.map +1 -1
  115. package/dist/schema/system-tables.js +62 -48
  116. package/dist/schema/system-tables.js.map +1 -1
  117. package/dist/schema/table-def.d.ts +26 -96
  118. package/dist/schema/table-def.d.ts.map +1 -1
  119. package/dist/schema/table-def.js +14 -64
  120. package/dist/schema/table-def.js.map +1 -1
  121. package/dist/schema/view.d.ts +3 -0
  122. package/dist/schema/view.d.ts.map +1 -0
  123. package/dist/schema/view.js +3 -0
  124. package/dist/schema/view.js.map +1 -0
  125. package/dist/schema-management/common.d.ts +4 -4
  126. package/dist/schema-management/common.d.ts.map +1 -1
  127. package/dist/schema-management/migrations.d.ts.map +1 -1
  128. package/dist/schema-management/migrations.js +6 -6
  129. package/dist/schema-management/migrations.js.map +1 -1
  130. package/dist/schema-management/validate-mutation-defs.d.ts +3 -3
  131. package/dist/schema-management/validate-mutation-defs.d.ts.map +1 -1
  132. package/dist/schema-management/validate-mutation-defs.js +17 -17
  133. package/dist/schema-management/validate-mutation-defs.js.map +1 -1
  134. package/dist/sync/ClientSessionSyncProcessor.d.ts +7 -7
  135. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  136. package/dist/sync/ClientSessionSyncProcessor.js +33 -30
  137. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  138. package/dist/sync/next/facts.d.ts +19 -19
  139. package/dist/sync/next/facts.d.ts.map +1 -1
  140. package/dist/sync/next/facts.js +2 -2
  141. package/dist/sync/next/facts.js.map +1 -1
  142. package/dist/sync/next/history-dag-common.d.ts +3 -3
  143. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  144. package/dist/sync/next/history-dag-common.js +1 -1
  145. package/dist/sync/next/history-dag-common.js.map +1 -1
  146. package/dist/sync/next/history-dag.js +1 -1
  147. package/dist/sync/next/history-dag.js.map +1 -1
  148. package/dist/sync/next/rebase-events.d.ts +7 -7
  149. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  150. package/dist/sync/next/rebase-events.js +5 -5
  151. package/dist/sync/next/rebase-events.js.map +1 -1
  152. package/dist/sync/next/test/compact-events.calculator.test.js +38 -33
  153. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  154. package/dist/sync/next/test/compact-events.test.js +71 -71
  155. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  156. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +25 -25
  157. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  158. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +60 -25
  159. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  160. package/dist/sync/next/test/mod.d.ts +1 -1
  161. package/dist/sync/next/test/mod.d.ts.map +1 -1
  162. package/dist/sync/next/test/mod.js +1 -1
  163. package/dist/sync/next/test/mod.js.map +1 -1
  164. package/dist/sync/sync.d.ts +3 -3
  165. package/dist/sync/sync.d.ts.map +1 -1
  166. package/dist/sync/syncstate.d.ts +30 -30
  167. package/dist/sync/syncstate.d.ts.map +1 -1
  168. package/dist/sync/syncstate.js +73 -40
  169. package/dist/sync/syncstate.js.map +1 -1
  170. package/dist/sync/syncstate.test.js +175 -184
  171. package/dist/sync/syncstate.test.js.map +1 -1
  172. package/dist/sync/validate-push-payload.d.ts +2 -2
  173. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  174. package/dist/sync/validate-push-payload.js.map +1 -1
  175. package/dist/version.d.ts +1 -1
  176. package/dist/version.js +1 -1
  177. package/package.json +3 -3
  178. package/src/__tests__/fixture.ts +36 -15
  179. package/src/adapter-types.ts +33 -13
  180. package/src/debug-info.ts +1 -0
  181. package/src/devtools/devtools-messages-leader.ts +13 -13
  182. package/src/index.ts +2 -5
  183. package/src/leader-thread/LeaderSyncProcessor.ts +210 -138
  184. package/src/leader-thread/{apply-mutation.ts → apply-event.ts} +61 -61
  185. package/src/leader-thread/eventlog.ts +199 -0
  186. package/src/leader-thread/leader-worker-devtools.ts +22 -19
  187. package/src/leader-thread/make-leader-thread-layer.ts +51 -29
  188. package/src/leader-thread/mod.ts +1 -1
  189. package/src/leader-thread/recreate-db.ts +6 -8
  190. package/src/leader-thread/types.ts +15 -16
  191. package/src/materializer-helper.ts +110 -0
  192. package/src/query-builder/api.ts +77 -103
  193. package/src/query-builder/astToSql.ts +68 -39
  194. package/src/query-builder/impl.test.ts +239 -42
  195. package/src/query-builder/impl.ts +72 -56
  196. package/src/{rehydrate-from-mutationlog.ts → rehydrate-from-eventlog.ts} +35 -38
  197. package/src/schema/EventDef.ts +216 -0
  198. package/src/schema/EventId.ts +23 -4
  199. package/src/schema/{MutationEvent.ts → LiveStoreEvent.ts} +68 -69
  200. package/src/schema/client-document-def.test.ts +239 -0
  201. package/src/schema/client-document-def.ts +444 -0
  202. package/src/schema/db-schema/dsl/mod.ts +0 -1
  203. package/src/schema/events.ts +1 -0
  204. package/src/schema/mod.ts +4 -3
  205. package/src/schema/schema.ts +78 -68
  206. package/src/schema/sqlite-state.ts +62 -0
  207. package/src/schema/system-tables.ts +42 -53
  208. package/src/schema/table-def.ts +51 -209
  209. package/src/schema/view.ts +2 -0
  210. package/src/schema-management/common.ts +4 -4
  211. package/src/schema-management/migrations.ts +8 -9
  212. package/src/schema-management/validate-mutation-defs.ts +22 -24
  213. package/src/sync/ClientSessionSyncProcessor.ts +41 -36
  214. package/src/sync/next/facts.ts +31 -32
  215. package/src/sync/next/history-dag-common.ts +4 -4
  216. package/src/sync/next/history-dag.ts +1 -1
  217. package/src/sync/next/rebase-events.ts +13 -13
  218. package/src/sync/next/test/compact-events.calculator.test.ts +45 -45
  219. package/src/sync/next/test/compact-events.test.ts +73 -73
  220. package/src/sync/next/test/event-fixtures.ts +219 -0
  221. package/src/sync/next/test/mod.ts +1 -1
  222. package/src/sync/sync.ts +3 -3
  223. package/src/sync/syncstate.test.ts +180 -189
  224. package/src/sync/syncstate.ts +162 -100
  225. package/src/sync/validate-push-payload.ts +2 -2
  226. package/src/version.ts +1 -1
  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.map +0 -1
  242. package/dist/leader-thread/mutationlog.d.ts +0 -27
  243. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  244. package/dist/leader-thread/mutationlog.js +0 -124
  245. package/dist/leader-thread/mutationlog.js.map +0 -1
  246. package/dist/mutation.d.ts +0 -20
  247. package/dist/mutation.d.ts.map +0 -1
  248. package/dist/mutation.js +0 -68
  249. package/dist/mutation.js.map +0 -1
  250. package/dist/query-info.d.ts +0 -41
  251. package/dist/query-info.d.ts.map +0 -1
  252. package/dist/query-info.js +0 -7
  253. package/dist/query-info.js.map +0 -1
  254. package/dist/rehydrate-from-mutationlog.d.ts +0 -15
  255. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  256. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  257. package/dist/schema/MutationEvent.d.ts.map +0 -1
  258. package/dist/schema/MutationEvent.js.map +0 -1
  259. package/dist/schema/mutations.d.ts +0 -115
  260. package/dist/schema/mutations.d.ts.map +0 -1
  261. package/dist/schema/mutations.js +0 -42
  262. package/dist/schema/mutations.js.map +0 -1
  263. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  264. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  265. package/src/derived-mutations.test.ts +0 -101
  266. package/src/derived-mutations.ts +0 -170
  267. package/src/init-singleton-tables.ts +0 -24
  268. package/src/leader-thread/mutationlog.ts +0 -202
  269. package/src/mutation.ts +0 -108
  270. package/src/query-info.ts +0 -83
  271. package/src/schema/mutations.ts +0 -193
  272. 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,24 @@ 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
60
  migrationOptions,
63
- applyMutation,
61
+ applyEvent,
64
62
  onProgress: ({ done, total }) =>
65
63
  Queue.offer(bootStatusQueue, { stage: 'rehydrating', progress: { done, total } }),
66
64
  })
@@ -12,7 +12,7 @@ import type {
12
12
  } from '@livestore/utils/effect'
13
13
  import { Context, Schema } from '@livestore/utils/effect'
14
14
 
15
- import type { SqliteError } from '../adapter-types.js'
15
+ import type { LeaderPullCursor, SqliteError } from '../adapter-types.js'
16
16
  import type {
17
17
  BootStatus,
18
18
  Devtools,
@@ -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' } },
@@ -132,22 +132,21 @@ export type InitialBlockingSyncContext = {
132
132
  export interface LeaderSyncProcessor {
133
133
  /** Used by client sessions to subscribe to upstream sync state changes */
134
134
  pull: (args: {
135
- /** Leader merge counter */
136
- cursor: number
135
+ cursor: LeaderPullCursor
137
136
  }) => Stream.Stream<{ payload: typeof SyncState.PayloadUpstream.Type; mergeCounter: number }, UnexpectedError>
138
137
  /** The `pullQueue` API can be used instead of `pull` when more convenient */
139
138
  pullQueue: (args: {
140
- cursor: number
139
+ cursor: LeaderPullCursor
141
140
  }) => Effect.Effect<
142
141
  Queue.Queue<{ payload: typeof SyncState.PayloadUpstream.Type; mergeCounter: number }>,
143
142
  UnexpectedError,
144
143
  Scope.Scope
145
144
  >
146
145
 
147
- /** Used by client sessions to push mutations to the leader thread */
146
+ /** Used by client sessions to push events to the leader thread */
148
147
  push: (
149
148
  /** `batch` needs to follow the same rules as `batch` in `SyncBackend.push` */
150
- batch: ReadonlyArray<MutationEvent.EncodedWithMeta>,
149
+ batch: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>,
151
150
  options?: {
152
151
  /**
153
152
  * If true, the effect will only finish when the local push has been processed (i.e. succeeded or was rejected).
@@ -159,7 +158,7 @@ export interface LeaderSyncProcessor {
159
158
 
160
159
  /** Currently only used by devtools which don't provide their own event numbers */
161
160
  pushPartial: (args: {
162
- mutationEvent: MutationEvent.PartialAnyEncoded
161
+ event: LiveStoreEvent.PartialAnyEncoded
163
162
  clientId: string
164
163
  sessionId: string
165
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
+ }