@livestore/common 0.3.0-dev.1 → 0.3.0-dev.11

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 (181) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/adapter-types.d.ts +47 -35
  3. package/dist/adapter-types.d.ts.map +1 -1
  4. package/dist/adapter-types.js.map +1 -1
  5. package/dist/derived-mutations.d.ts +4 -4
  6. package/dist/derived-mutations.d.ts.map +1 -1
  7. package/dist/derived-mutations.test.js.map +1 -1
  8. package/dist/devtools/devtool-message-leader.d.ts +2 -0
  9. package/dist/devtools/devtool-message-leader.d.ts.map +1 -0
  10. package/dist/devtools/devtool-message-leader.js +2 -0
  11. package/dist/devtools/devtool-message-leader.js.map +1 -0
  12. package/dist/devtools/devtools-bridge.d.ts +2 -1
  13. package/dist/devtools/devtools-bridge.d.ts.map +1 -1
  14. package/dist/devtools/devtools-messages-client-session.d.ts +297 -0
  15. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
  16. package/dist/devtools/devtools-messages-client-session.js +61 -0
  17. package/dist/devtools/devtools-messages-client-session.js.map +1 -0
  18. package/dist/devtools/devtools-messages-common.d.ts +65 -0
  19. package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
  20. package/dist/devtools/devtools-messages-common.js +35 -0
  21. package/dist/devtools/devtools-messages-common.js.map +1 -0
  22. package/dist/devtools/devtools-messages-leader.d.ts +261 -0
  23. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
  24. package/dist/devtools/devtools-messages-leader.js +85 -0
  25. package/dist/devtools/devtools-messages-leader.js.map +1 -0
  26. package/dist/devtools/devtools-messages.d.ts +3 -592
  27. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  28. package/dist/devtools/devtools-messages.js +3 -171
  29. package/dist/devtools/devtools-messages.js.map +1 -1
  30. package/dist/index.d.ts +0 -4
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/init-singleton-tables.d.ts +2 -2
  33. package/dist/init-singleton-tables.d.ts.map +1 -1
  34. package/dist/init-singleton-tables.js.map +1 -1
  35. package/dist/leader-thread/LeaderSyncProcessor.d.ts +37 -0
  36. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -0
  37. package/dist/leader-thread/LeaderSyncProcessor.js +432 -0
  38. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -0
  39. package/dist/leader-thread/apply-mutation.d.ts +5 -2
  40. package/dist/leader-thread/apply-mutation.d.ts.map +1 -1
  41. package/dist/leader-thread/apply-mutation.js +41 -29
  42. package/dist/leader-thread/apply-mutation.js.map +1 -1
  43. package/dist/leader-thread/connection.d.ts +4 -4
  44. package/dist/leader-thread/connection.d.ts.map +1 -1
  45. package/dist/leader-thread/connection.js +5 -5
  46. package/dist/leader-thread/connection.js.map +1 -1
  47. package/dist/leader-thread/leader-sync-processor.d.ts +2 -2
  48. package/dist/leader-thread/leader-sync-processor.d.ts.map +1 -1
  49. package/dist/leader-thread/leader-sync-processor.js +20 -12
  50. package/dist/leader-thread/leader-sync-processor.js.map +1 -1
  51. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  52. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  53. package/dist/leader-thread/leader-worker-devtools.js +37 -81
  54. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  55. package/dist/leader-thread/make-leader-thread-layer.d.ts +12 -11
  56. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  57. package/dist/leader-thread/make-leader-thread-layer.js +33 -14
  58. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  59. package/dist/leader-thread/mutationlog.d.ts +6 -19
  60. package/dist/leader-thread/mutationlog.d.ts.map +1 -1
  61. package/dist/leader-thread/mutationlog.js +7 -6
  62. package/dist/leader-thread/mutationlog.js.map +1 -1
  63. package/dist/leader-thread/pull-queue-set.d.ts.map +1 -1
  64. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  65. package/dist/leader-thread/recreate-db.js +24 -18
  66. package/dist/leader-thread/recreate-db.js.map +1 -1
  67. package/dist/leader-thread/types.d.ts +36 -16
  68. package/dist/leader-thread/types.d.ts.map +1 -1
  69. package/dist/leader-thread/types.js.map +1 -1
  70. package/dist/mutation.d.ts +9 -2
  71. package/dist/mutation.d.ts.map +1 -1
  72. package/dist/mutation.js +5 -5
  73. package/dist/mutation.js.map +1 -1
  74. package/dist/query-builder/impl.d.ts +1 -1
  75. package/dist/rehydrate-from-mutationlog.d.ts +5 -5
  76. package/dist/rehydrate-from-mutationlog.d.ts.map +1 -1
  77. package/dist/rehydrate-from-mutationlog.js +13 -19
  78. package/dist/rehydrate-from-mutationlog.js.map +1 -1
  79. package/dist/schema/EventId.d.ts +16 -14
  80. package/dist/schema/EventId.d.ts.map +1 -1
  81. package/dist/schema/EventId.js +15 -7
  82. package/dist/schema/EventId.js.map +1 -1
  83. package/dist/schema/EventId.test.d.ts +2 -0
  84. package/dist/schema/EventId.test.d.ts.map +1 -0
  85. package/dist/schema/EventId.test.js +11 -0
  86. package/dist/schema/EventId.test.js.map +1 -0
  87. package/dist/schema/MutationEvent.d.ts +49 -80
  88. package/dist/schema/MutationEvent.d.ts.map +1 -1
  89. package/dist/schema/MutationEvent.js +32 -15
  90. package/dist/schema/MutationEvent.js.map +1 -1
  91. package/dist/schema/MutationEvent.test.d.ts +2 -0
  92. package/dist/schema/MutationEvent.test.d.ts.map +1 -0
  93. package/dist/schema/MutationEvent.test.js +2 -0
  94. package/dist/schema/MutationEvent.test.js.map +1 -0
  95. package/dist/schema/system-tables.d.ts +26 -26
  96. package/dist/schema/system-tables.d.ts.map +1 -1
  97. package/dist/schema/system-tables.js +19 -11
  98. package/dist/schema/system-tables.js.map +1 -1
  99. package/dist/schema-management/common.d.ts +3 -3
  100. package/dist/schema-management/common.d.ts.map +1 -1
  101. package/dist/schema-management/common.js.map +1 -1
  102. package/dist/schema-management/migrations.d.ts +4 -4
  103. package/dist/schema-management/migrations.d.ts.map +1 -1
  104. package/dist/schema-management/migrations.js +6 -6
  105. package/dist/schema-management/migrations.js.map +1 -1
  106. package/dist/sync/ClientSessionSyncProcessor.d.ts +43 -0
  107. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -0
  108. package/dist/sync/ClientSessionSyncProcessor.js +141 -0
  109. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -0
  110. package/dist/sync/client-session-sync-processor.d.ts +4 -4
  111. package/dist/sync/client-session-sync-processor.d.ts.map +1 -1
  112. package/dist/sync/index.d.ts +1 -1
  113. package/dist/sync/index.d.ts.map +1 -1
  114. package/dist/sync/index.js +1 -1
  115. package/dist/sync/index.js.map +1 -1
  116. package/dist/sync/next/history-dag-common.d.ts +1 -4
  117. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  118. package/dist/sync/next/history-dag-common.js +1 -1
  119. package/dist/sync/next/history-dag-common.js.map +1 -1
  120. package/dist/sync/next/rebase-events.d.ts +3 -3
  121. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  122. package/dist/sync/next/rebase-events.js +3 -2
  123. package/dist/sync/next/rebase-events.js.map +1 -1
  124. package/dist/sync/next/test/mutation-fixtures.d.ts +7 -7
  125. package/dist/sync/next/test/mutation-fixtures.d.ts.map +1 -1
  126. package/dist/sync/next/test/mutation-fixtures.js +3 -9
  127. package/dist/sync/next/test/mutation-fixtures.js.map +1 -1
  128. package/dist/sync/sync.d.ts +21 -11
  129. package/dist/sync/sync.d.ts.map +1 -1
  130. package/dist/sync/sync.js.map +1 -1
  131. package/dist/sync/syncstate.d.ts +45 -23
  132. package/dist/sync/syncstate.d.ts.map +1 -1
  133. package/dist/sync/syncstate.js +56 -12
  134. package/dist/sync/syncstate.js.map +1 -1
  135. package/dist/sync/syncstate.test.js +125 -69
  136. package/dist/sync/syncstate.test.js.map +1 -1
  137. package/dist/sync/validate-push-payload.d.ts +2 -2
  138. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  139. package/dist/sync/validate-push-payload.js +2 -2
  140. package/dist/sync/validate-push-payload.js.map +1 -1
  141. package/dist/version.d.ts +1 -1
  142. package/dist/version.d.ts.map +1 -1
  143. package/dist/version.js +1 -1
  144. package/dist/version.js.map +1 -1
  145. package/package.json +6 -5
  146. package/src/adapter-types.ts +39 -40
  147. package/src/derived-mutations.test.ts +1 -1
  148. package/src/derived-mutations.ts +9 -5
  149. package/src/devtools/devtools-bridge.ts +2 -1
  150. package/src/devtools/devtools-messages-client-session.ts +109 -0
  151. package/src/devtools/devtools-messages-common.ts +52 -0
  152. package/src/devtools/devtools-messages-leader.ts +115 -0
  153. package/src/devtools/devtools-messages.ts +3 -243
  154. package/src/index.ts +0 -6
  155. package/src/init-singleton-tables.ts +2 -2
  156. package/src/leader-thread/{leader-sync-processor.ts → LeaderSyncProcessor.ts} +306 -268
  157. package/src/leader-thread/apply-mutation.ts +53 -35
  158. package/src/leader-thread/connection.ts +7 -7
  159. package/src/leader-thread/leader-worker-devtools.ts +52 -124
  160. package/src/leader-thread/make-leader-thread-layer.ts +62 -30
  161. package/src/leader-thread/mutationlog.ts +14 -10
  162. package/src/leader-thread/recreate-db.ts +24 -20
  163. package/src/leader-thread/types.ts +41 -20
  164. package/src/mutation.ts +17 -7
  165. package/src/rehydrate-from-mutationlog.ts +18 -26
  166. package/src/schema/EventId.test.ts +12 -0
  167. package/src/schema/EventId.ts +23 -9
  168. package/src/schema/MutationEvent.ts +46 -24
  169. package/src/schema/system-tables.ts +19 -11
  170. package/src/schema-management/common.ts +3 -3
  171. package/src/schema-management/migrations.ts +10 -10
  172. package/src/sync/{client-session-sync-processor.ts → ClientSessionSyncProcessor.ts} +26 -19
  173. package/src/sync/index.ts +1 -1
  174. package/src/sync/next/history-dag-common.ts +1 -1
  175. package/src/sync/next/rebase-events.ts +7 -7
  176. package/src/sync/next/test/mutation-fixtures.ts +3 -10
  177. package/src/sync/sync.ts +19 -6
  178. package/src/sync/syncstate.test.ts +127 -67
  179. package/src/sync/syncstate.ts +21 -19
  180. package/src/sync/validate-push-payload.ts +7 -4
  181. package/src/version.ts +1 -1
@@ -0,0 +1,432 @@
1
+ import { isNotUndefined, shouldNeverHappen, TRACE_VERBOSE } from '@livestore/utils';
2
+ import { BucketQueue, Deferred, Effect, Exit, FiberHandle, Option, OtelTracer, ReadonlyArray, Schema, Stream, Subscribable, SubscriptionRef, } from '@livestore/utils/effect';
3
+ import { UnexpectedError } from '../adapter-types.js';
4
+ import { EventId, MUTATION_LOG_META_TABLE, MutationEvent, mutationLogMetaTable, SESSION_CHANGESET_META_TABLE, } from '../schema/mod.js';
5
+ import { updateRows } from '../sql-queries/index.js';
6
+ import { InvalidPushError } from '../sync/sync.js';
7
+ import * as SyncState from '../sync/syncstate.js';
8
+ import { sql } from '../util.js';
9
+ import { makeApplyMutation } from './apply-mutation.js';
10
+ import { execSql } from './connection.js';
11
+ import { getBackendHeadFromDb, getLocalHeadFromDb, getMutationEventsSince, updateBackendHead } from './mutationlog.js';
12
+ import { LeaderThreadCtx } from './types.js';
13
+ /**
14
+ * The LeaderSyncProcessor manages synchronization of mutations between
15
+ * the local state and the sync backend, ensuring efficient and orderly processing.
16
+ *
17
+ * In the LeaderSyncProcessor, pulling always has precedence over pushing.
18
+ *
19
+ * Responsibilities:
20
+ * - Queueing incoming local mutations in a localPushMailbox.
21
+ * - Broadcasting mutations to client sessions via pull queues.
22
+ * - Pushing mutations to the sync backend.
23
+ *
24
+ * Notes:
25
+ *
26
+ * local push processing:
27
+ * - localPushMailbox:
28
+ * - Maintains events in ascending order.
29
+ * - Uses `Deferred` objects to resolve/reject events based on application success.
30
+ * - Processes events from the mailbox, applying mutations in batches.
31
+ * - Controlled by a `Latch` to manage execution flow.
32
+ * - The latch closes on pull receipt and re-opens post-pull completion.
33
+ * - Processes up to `maxBatchSize` events per cycle.
34
+ *
35
+ */
36
+ export const makeLeaderSyncProcessor = ({ schema, dbMissing, dbMutationLog, initialBlockingSyncContext, }) => Effect.gen(function* () {
37
+ const syncBackendQueue = yield* BucketQueue.make();
38
+ const syncStateSref = yield* SubscriptionRef.make(undefined);
39
+ const isLocalEvent = (mutationEventEncoded) => {
40
+ const mutationDef = schema.mutations.get(mutationEventEncoded.mutation);
41
+ return mutationDef.options.localOnly;
42
+ };
43
+ // This context depends on data from `boot`, we should find a better implementation to avoid this ref indirection.
44
+ const ctxRef = {
45
+ current: undefined,
46
+ };
47
+ const localPushesQueue = yield* BucketQueue.make();
48
+ const localPushesLatch = yield* Effect.makeLatch(true);
49
+ const pullLatch = yield* Effect.makeLatch(true);
50
+ const push = (newEvents, options) => Effect.gen(function* () {
51
+ // TODO validate batch
52
+ if (newEvents.length === 0)
53
+ return;
54
+ if (ctxRef.current?.devtoolsPushLatch !== undefined) {
55
+ yield* ctxRef.current.devtoolsPushLatch.await;
56
+ }
57
+ const waitForProcessing = options?.waitForProcessing ?? false;
58
+ if (waitForProcessing) {
59
+ const deferreds = yield* Effect.forEach(newEvents, () => Deferred.make());
60
+ const items = newEvents.map((mutationEventEncoded, i) => [mutationEventEncoded, deferreds[i]]);
61
+ yield* BucketQueue.offerAll(localPushesQueue, items);
62
+ yield* Effect.all(deferreds);
63
+ }
64
+ else {
65
+ const items = newEvents.map((mutationEventEncoded) => [mutationEventEncoded, undefined]);
66
+ yield* BucketQueue.offerAll(localPushesQueue, items);
67
+ }
68
+ }).pipe(Effect.withSpan('@livestore/common:leader-thread:syncing:local-push', {
69
+ attributes: {
70
+ batchSize: newEvents.length,
71
+ batch: TRACE_VERBOSE ? newEvents : undefined,
72
+ },
73
+ links: ctxRef.current?.span ? [{ _tag: 'SpanLink', span: ctxRef.current.span, attributes: {} }] : undefined,
74
+ }));
75
+ const pushPartial = (mutationEventEncoded_) => Effect.gen(function* () {
76
+ const syncState = yield* syncStateSref;
77
+ if (syncState === undefined)
78
+ return shouldNeverHappen('Not initialized');
79
+ const mutationDef = schema.mutations.get(mutationEventEncoded_.mutation) ??
80
+ shouldNeverHappen(`Unknown mutation: ${mutationEventEncoded_.mutation}`);
81
+ const mutationEventEncoded = new MutationEvent.EncodedWithMeta({
82
+ ...mutationEventEncoded_,
83
+ ...EventId.nextPair(syncState.localHead, mutationDef.options.localOnly),
84
+ });
85
+ yield* push([mutationEventEncoded]);
86
+ }).pipe(Effect.catchTag('InvalidPushError', Effect.orDie));
87
+ // Starts various background loops
88
+ const boot = ({ dbReady }) => Effect.gen(function* () {
89
+ const span = yield* Effect.currentSpan.pipe(Effect.orDie);
90
+ const otelSpan = yield* OtelTracer.currentOtelSpan.pipe(Effect.catchAll(() => Effect.succeed(undefined)));
91
+ const { devtools } = yield* LeaderThreadCtx;
92
+ ctxRef.current = {
93
+ otelSpan,
94
+ span,
95
+ devtoolsPullLatch: devtools.enabled ? devtools.syncBackendPullLatch : undefined,
96
+ devtoolsPushLatch: devtools.enabled ? devtools.syncBackendPushLatch : undefined,
97
+ };
98
+ const initialBackendHead = dbMissing ? EventId.ROOT.global : getBackendHeadFromDb(dbMutationLog);
99
+ const initialLocalHead = dbMissing ? EventId.ROOT : getLocalHeadFromDb(dbMutationLog);
100
+ if (initialBackendHead > initialLocalHead.global) {
101
+ return shouldNeverHappen(`During boot the backend head (${initialBackendHead}) should never be greater than the local head (${initialLocalHead.global})`);
102
+ }
103
+ const pendingMutationEvents = yield* getMutationEventsSince({
104
+ global: initialBackendHead,
105
+ local: EventId.localDefault,
106
+ }).pipe(Effect.map(ReadonlyArray.map((_) => new MutationEvent.EncodedWithMeta(_))));
107
+ const initialSyncState = new SyncState.SyncState({
108
+ pending: pendingMutationEvents,
109
+ // On the leader we don't need a rollback tail beyond `pending` items
110
+ rollbackTail: [],
111
+ upstreamHead: { global: initialBackendHead, local: EventId.localDefault },
112
+ localHead: initialLocalHead,
113
+ });
114
+ /** State transitions need to happen atomically, so we use a Ref to track the state */
115
+ yield* SubscriptionRef.set(syncStateSref, initialSyncState);
116
+ // Rehydrate sync queue
117
+ if (pendingMutationEvents.length > 0) {
118
+ const filteredBatch = pendingMutationEvents
119
+ // Don't sync localOnly mutations
120
+ .filter((mutationEventEncoded) => {
121
+ const mutationDef = schema.mutations.get(mutationEventEncoded.mutation);
122
+ return mutationDef.options.localOnly === false;
123
+ });
124
+ yield* BucketQueue.offerAll(syncBackendQueue, filteredBatch);
125
+ }
126
+ yield* backgroundApplyLocalPushes({
127
+ localPushesLatch,
128
+ localPushesQueue,
129
+ pullLatch,
130
+ syncStateSref,
131
+ syncBackendQueue,
132
+ schema,
133
+ isLocalEvent,
134
+ otelSpan,
135
+ }).pipe(Effect.tapCauseLogPretty, Effect.forkScoped);
136
+ const backendPushingFiberHandle = yield* FiberHandle.make();
137
+ yield* FiberHandle.run(backendPushingFiberHandle, backgroundBackendPushing({ dbReady, syncBackendQueue, otelSpan }).pipe(Effect.tapCauseLogPretty));
138
+ yield* backgroundBackendPulling({
139
+ dbReady,
140
+ initialBackendHead,
141
+ isLocalEvent,
142
+ restartBackendPushing: (filteredRebasedPending) => Effect.gen(function* () {
143
+ // Stop current pushing fiber
144
+ yield* FiberHandle.clear(backendPushingFiberHandle);
145
+ // Reset the sync queue
146
+ yield* BucketQueue.clear(syncBackendQueue);
147
+ yield* BucketQueue.offerAll(syncBackendQueue, filteredRebasedPending);
148
+ // Restart pushing fiber
149
+ yield* FiberHandle.run(backendPushingFiberHandle, backgroundBackendPushing({ dbReady, syncBackendQueue, otelSpan }).pipe(Effect.tapCauseLogPretty));
150
+ }),
151
+ syncStateSref,
152
+ localPushesLatch,
153
+ pullLatch,
154
+ otelSpan,
155
+ initialBlockingSyncContext,
156
+ devtoolsPullLatch: ctxRef.current?.devtoolsPullLatch,
157
+ }).pipe(Effect.tapCauseLogPretty, Effect.forkScoped);
158
+ }).pipe(Effect.withSpanScoped('@livestore/common:leader-thread:syncing'));
159
+ return {
160
+ push,
161
+ pushPartial,
162
+ boot,
163
+ syncState: Subscribable.make({
164
+ get: Effect.gen(function* () {
165
+ const syncState = yield* syncStateSref;
166
+ if (syncState === undefined)
167
+ return shouldNeverHappen('Not initialized');
168
+ return syncState;
169
+ }),
170
+ changes: syncStateSref.changes.pipe(Stream.filter(isNotUndefined)),
171
+ }),
172
+ };
173
+ });
174
+ const backgroundApplyLocalPushes = ({ localPushesLatch, localPushesQueue, pullLatch, syncStateSref, syncBackendQueue, schema, isLocalEvent, otelSpan, }) => Effect.gen(function* () {
175
+ const { connectedClientSessionPullQueues } = yield* LeaderThreadCtx;
176
+ const applyMutationItems = yield* makeApplyMutationItems;
177
+ while (true) {
178
+ // TODO make batch size configurable
179
+ const batchItems = yield* BucketQueue.takeBetween(localPushesQueue, 1, 10);
180
+ const [newEvents, deferreds] = ReadonlyArray.unzip(batchItems);
181
+ // Wait for the backend pulling to finish
182
+ yield* localPushesLatch.await;
183
+ // Prevent the backend pulling from starting until this local push is finished
184
+ yield* pullLatch.close;
185
+ const syncState = yield* syncStateSref;
186
+ if (syncState === undefined)
187
+ return shouldNeverHappen('Not initialized');
188
+ const updateResult = SyncState.updateSyncState({
189
+ syncState,
190
+ payload: { _tag: 'local-push', newEvents },
191
+ isLocalEvent,
192
+ isEqualEvent: MutationEvent.isEqualEncoded,
193
+ });
194
+ if (updateResult._tag === 'rebase') {
195
+ return shouldNeverHappen('The leader thread should never have to rebase due to a local push');
196
+ }
197
+ else if (updateResult._tag === 'reject') {
198
+ otelSpan?.addEvent('local-push:reject', {
199
+ batchSize: newEvents.length,
200
+ updateResult: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
201
+ });
202
+ const providedId = newEvents.at(0).id;
203
+ const remainingEvents = yield* BucketQueue.takeAll(localPushesQueue);
204
+ const allDeferreds = [...deferreds, ...remainingEvents.map(([_, deferred]) => deferred)].filter(isNotUndefined);
205
+ yield* Effect.forEach(allDeferreds, (deferred) => Deferred.fail(deferred, InvalidPushError.make({
206
+ // TODO improve error handling so it differentiates between a push being rejected
207
+ // because of itself or because of another push
208
+ reason: {
209
+ _tag: 'LeaderAhead',
210
+ minimumExpectedId: updateResult.expectedMinimumId,
211
+ providedId,
212
+ },
213
+ })));
214
+ // Allow the backend pulling to start
215
+ yield* pullLatch.open;
216
+ // In this case we're skipping state update and down/upstream processing
217
+ // We've cleared the local push queue and are now waiting for new local pushes / backend pulls
218
+ continue;
219
+ }
220
+ yield* SubscriptionRef.set(syncStateSref, updateResult.newSyncState);
221
+ yield* connectedClientSessionPullQueues.offer({
222
+ payload: { _tag: 'upstream-advance', newEvents: updateResult.newEvents },
223
+ remaining: 0,
224
+ });
225
+ otelSpan?.addEvent('local-push', {
226
+ batchSize: newEvents.length,
227
+ updateResult: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
228
+ });
229
+ // Don't sync localOnly mutations
230
+ const filteredBatch = updateResult.newEvents.filter((mutationEventEncoded) => {
231
+ const mutationDef = schema.mutations.get(mutationEventEncoded.mutation);
232
+ return mutationDef.options.localOnly === false;
233
+ });
234
+ yield* BucketQueue.offerAll(syncBackendQueue, filteredBatch);
235
+ yield* applyMutationItems({ batchItems: newEvents, deferreds });
236
+ // Allow the backend pulling to start
237
+ yield* pullLatch.open;
238
+ }
239
+ });
240
+ // TODO how to handle errors gracefully
241
+ const makeApplyMutationItems = Effect.gen(function* () {
242
+ const leaderThreadCtx = yield* LeaderThreadCtx;
243
+ const { dbReadModel: db, dbMutationLog } = leaderThreadCtx;
244
+ const applyMutation = yield* makeApplyMutation;
245
+ return ({ batchItems, deferreds }) => Effect.gen(function* () {
246
+ db.execute('BEGIN TRANSACTION', undefined); // Start the transaction
247
+ dbMutationLog.execute('BEGIN TRANSACTION', undefined); // Start the transaction
248
+ yield* Effect.addFinalizer((exit) => Effect.gen(function* () {
249
+ if (Exit.isSuccess(exit))
250
+ return;
251
+ // Rollback in case of an error
252
+ db.execute('ROLLBACK', undefined);
253
+ dbMutationLog.execute('ROLLBACK', undefined);
254
+ }));
255
+ for (let i = 0; i < batchItems.length; i++) {
256
+ yield* applyMutation(batchItems[i]);
257
+ if (deferreds?.[i] !== undefined) {
258
+ yield* Deferred.succeed(deferreds[i], void 0);
259
+ }
260
+ }
261
+ db.execute('COMMIT', undefined); // Commit the transaction
262
+ dbMutationLog.execute('COMMIT', undefined); // Commit the transaction
263
+ }).pipe(Effect.uninterruptible, Effect.scoped, Effect.withSpan('@livestore/common:leader-thread:syncing:applyMutationItems', {
264
+ attributes: { count: batchItems.length },
265
+ }), Effect.tapCauseLogPretty, UnexpectedError.mapToUnexpectedError);
266
+ });
267
+ const backgroundBackendPulling = ({ dbReady, initialBackendHead, isLocalEvent, restartBackendPushing, otelSpan, syncStateSref, localPushesLatch, pullLatch, devtoolsPullLatch, initialBlockingSyncContext, }) => Effect.gen(function* () {
268
+ const { syncBackend, dbReadModel: db, dbMutationLog, connectedClientSessionPullQueues, schema, } = yield* LeaderThreadCtx;
269
+ if (syncBackend === undefined)
270
+ return;
271
+ const cursorInfo = yield* getCursorInfo(initialBackendHead);
272
+ const applyMutationItems = yield* makeApplyMutationItems;
273
+ const onNewPullChunk = (newEvents, remaining) => Effect.gen(function* () {
274
+ if (newEvents.length === 0)
275
+ return;
276
+ if (devtoolsPullLatch !== undefined) {
277
+ yield* devtoolsPullLatch.await;
278
+ }
279
+ // Prevent more local pushes from being processed until this pull is finished
280
+ yield* localPushesLatch.close;
281
+ // Wait for pending local pushes to finish
282
+ yield* pullLatch.await;
283
+ const syncState = yield* syncStateSref;
284
+ if (syncState === undefined)
285
+ return shouldNeverHappen('Not initialized');
286
+ const trimRollbackUntil = newEvents.at(-1).id;
287
+ const updateResult = SyncState.updateSyncState({
288
+ syncState,
289
+ payload: { _tag: 'upstream-advance', newEvents, trimRollbackUntil },
290
+ isLocalEvent,
291
+ isEqualEvent: MutationEvent.isEqualEncoded,
292
+ ignoreLocalEvents: true,
293
+ });
294
+ if (updateResult._tag === 'reject') {
295
+ return shouldNeverHappen('The leader thread should never reject upstream advances');
296
+ }
297
+ const newBackendHead = newEvents.at(-1).id;
298
+ updateBackendHead(dbMutationLog, newBackendHead);
299
+ if (updateResult._tag === 'rebase') {
300
+ otelSpan?.addEvent('backend-pull:rebase', {
301
+ newEventsCount: newEvents.length,
302
+ newEvents: TRACE_VERBOSE ? JSON.stringify(newEvents) : undefined,
303
+ rollbackCount: updateResult.eventsToRollback.length,
304
+ updateResult: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
305
+ });
306
+ const filteredRebasedPending = updateResult.newSyncState.pending.filter((mutationEvent) => {
307
+ const mutationDef = schema.mutations.get(mutationEvent.mutation);
308
+ return mutationDef.options.localOnly === false;
309
+ });
310
+ yield* restartBackendPushing(filteredRebasedPending);
311
+ if (updateResult.eventsToRollback.length > 0) {
312
+ yield* rollback({ db, dbMutationLog, eventIdsToRollback: updateResult.eventsToRollback.map((_) => _.id) });
313
+ }
314
+ yield* connectedClientSessionPullQueues.offer({
315
+ payload: {
316
+ _tag: 'upstream-rebase',
317
+ newEvents: updateResult.newEvents,
318
+ rollbackUntil: updateResult.eventsToRollback.at(0).id,
319
+ trimRollbackUntil,
320
+ },
321
+ remaining,
322
+ });
323
+ }
324
+ else {
325
+ otelSpan?.addEvent('backend-pull:advance', {
326
+ newEventsCount: newEvents.length,
327
+ updateResult: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
328
+ });
329
+ yield* connectedClientSessionPullQueues.offer({
330
+ payload: { _tag: 'upstream-advance', newEvents: updateResult.newEvents, trimRollbackUntil },
331
+ remaining,
332
+ });
333
+ }
334
+ trimChangesetRows(db, newBackendHead);
335
+ yield* applyMutationItems({ batchItems: updateResult.newEvents, deferreds: undefined });
336
+ yield* SubscriptionRef.set(syncStateSref, updateResult.newSyncState);
337
+ if (remaining === 0) {
338
+ // Allow local pushes to be processed again
339
+ yield* localPushesLatch.open;
340
+ }
341
+ });
342
+ yield* syncBackend.pull(cursorInfo).pipe(
343
+ // TODO only take from queue while connected
344
+ Stream.tap(({ batch, remaining }) => Effect.gen(function* () {
345
+ // yield* Effect.spanEvent('batch', {
346
+ // attributes: {
347
+ // batchSize: batch.length,
348
+ // batch: TRACE_VERBOSE ? batch : undefined,
349
+ // },
350
+ // })
351
+ // Wait for the db to be initially created
352
+ yield* dbReady;
353
+ // NOTE we only want to take process mutations when the sync backend is connected
354
+ // (e.g. needed for simulating being offline)
355
+ // TODO remove when there's a better way to handle this in stream above
356
+ yield* SubscriptionRef.waitUntil(syncBackend.isConnected, (isConnected) => isConnected === true);
357
+ yield* onNewPullChunk(batch.map((_) => MutationEvent.EncodedWithMeta.fromGlobal(_.mutationEventEncoded)), remaining);
358
+ yield* initialBlockingSyncContext.update({ processed: batch.length, remaining });
359
+ })), Stream.runDrain, Effect.interruptible);
360
+ }).pipe(Effect.withSpan('@livestore/common:leader-thread:syncing:backend-pulling'));
361
+ const rollback = ({ db, dbMutationLog, eventIdsToRollback, }) => Effect.gen(function* () {
362
+ const rollbackEvents = db
363
+ .select(sql `SELECT * FROM ${SESSION_CHANGESET_META_TABLE} WHERE (idGlobal, idLocal) IN (${eventIdsToRollback.map((id) => `(${id.global}, ${id.local})`).join(', ')})`)
364
+ .map((_) => ({ id: { global: _.idGlobal, local: _.idLocal }, changeset: _.changeset, debug: _.debug }))
365
+ .toSorted((a, b) => EventId.compare(a.id, b.id));
366
+ // Apply changesets in reverse order
367
+ for (let i = rollbackEvents.length - 1; i >= 0; i--) {
368
+ const { changeset } = rollbackEvents[i];
369
+ if (changeset !== null) {
370
+ db.makeChangeset(changeset).invert().apply();
371
+ }
372
+ }
373
+ // Delete the changeset rows
374
+ db.execute(sql `DELETE FROM ${SESSION_CHANGESET_META_TABLE} WHERE (idGlobal, idLocal) IN (${eventIdsToRollback.map((id) => `(${id.global}, ${id.local})`).join(', ')})`);
375
+ // Delete the mutation log rows
376
+ dbMutationLog.execute(sql `DELETE FROM ${MUTATION_LOG_META_TABLE} WHERE (idGlobal, idLocal) IN (${eventIdsToRollback.map((id) => `(${id.global}, ${id.local})`).join(', ')})`);
377
+ }).pipe(Effect.withSpan('@livestore/common:leader-thread:syncing:rollback', {
378
+ attributes: { count: eventIdsToRollback.length },
379
+ }));
380
+ const getCursorInfo = (remoteHead) => Effect.gen(function* () {
381
+ const { dbMutationLog } = yield* LeaderThreadCtx;
382
+ if (remoteHead === EventId.ROOT.global)
383
+ return Option.none();
384
+ const MutationlogQuerySchema = Schema.Struct({
385
+ syncMetadataJson: Schema.parseJson(Schema.Option(Schema.JsonValue)),
386
+ }).pipe(Schema.pluck('syncMetadataJson'), Schema.Array, Schema.head);
387
+ const syncMetadataOption = yield* Effect.sync(() => dbMutationLog.select(sql `SELECT syncMetadataJson FROM ${MUTATION_LOG_META_TABLE} WHERE idGlobal = ${remoteHead} ORDER BY idLocal ASC LIMIT 1`)).pipe(Effect.andThen(Schema.decode(MutationlogQuerySchema)), Effect.map(Option.flatten), Effect.orDie);
388
+ return Option.some({
389
+ cursor: { global: remoteHead, local: EventId.localDefault },
390
+ metadata: syncMetadataOption,
391
+ });
392
+ }).pipe(Effect.withSpan('@livestore/common:leader-thread:syncing:getCursorInfo', { attributes: { remoteHead } }));
393
+ const backgroundBackendPushing = ({ dbReady, syncBackendQueue, otelSpan, }) => Effect.gen(function* () {
394
+ const { syncBackend, dbMutationLog } = yield* LeaderThreadCtx;
395
+ if (syncBackend === undefined)
396
+ return;
397
+ yield* dbReady;
398
+ while (true) {
399
+ yield* SubscriptionRef.waitUntil(syncBackend.isConnected, (isConnected) => isConnected === true);
400
+ // TODO make batch size configurable
401
+ const queueItems = yield* BucketQueue.takeBetween(syncBackendQueue, 1, 50);
402
+ yield* SubscriptionRef.waitUntil(syncBackend.isConnected, (isConnected) => isConnected === true);
403
+ otelSpan?.addEvent('backend-push', {
404
+ batchSize: queueItems.length,
405
+ batch: TRACE_VERBOSE ? JSON.stringify(queueItems) : undefined,
406
+ });
407
+ // TODO handle push errors (should only happen during concurrent pull+push)
408
+ const pushResult = yield* syncBackend.push(queueItems.map((_) => _.toGlobal())).pipe(Effect.either);
409
+ if (pushResult._tag === 'Left') {
410
+ otelSpan?.addEvent('backend-push-error', { error: pushResult.left.toString() });
411
+ // wait for interrupt caused by background pulling which will then restart pushing
412
+ return yield* Effect.never;
413
+ }
414
+ const { metadata } = pushResult.right;
415
+ // TODO try to do this in a single query
416
+ for (let i = 0; i < queueItems.length; i++) {
417
+ const mutationEventEncoded = queueItems[i];
418
+ yield* execSql(dbMutationLog, ...updateRows({
419
+ tableName: MUTATION_LOG_META_TABLE,
420
+ columns: mutationLogMetaTable.sqliteDef.columns,
421
+ where: { idGlobal: mutationEventEncoded.id.global, idLocal: mutationEventEncoded.id.local },
422
+ updateValues: { syncMetadataJson: metadata[i] },
423
+ }));
424
+ }
425
+ }
426
+ }).pipe(Effect.interruptible, Effect.withSpan('@livestore/common:leader-thread:syncing:backend-pushing'));
427
+ const trimChangesetRows = (db, newHead) => {
428
+ // Since we're using the session changeset rows to query for the current head,
429
+ // we're keeping at least one row for the current head, and thus are using `<` instead of `<=`
430
+ db.execute(sql `DELETE FROM ${SESSION_CHANGESET_META_TABLE} WHERE idGlobal < ${newHead.global}`);
431
+ };
432
+ //# sourceMappingURL=LeaderSyncProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LeaderSyncProcessor.js","sourceRoot":"","sources":["../../src/leader-thread/LeaderSyncProcessor.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,11 @@
1
1
  import type { Scope } from '@livestore/utils/effect';
2
2
  import { Effect } from '@livestore/utils/effect';
3
3
  import type { SqliteError, UnexpectedError } from '../index.js';
4
- import type { MutationEvent } from '../schema/mod.js';
4
+ import { type MutationEvent } from '../schema/mod.js';
5
5
  import { LeaderThreadCtx } from './types.js';
6
- export type ApplyMutation = (mutationEventEncoded: MutationEvent.AnyEncoded) => Effect.Effect<void, SqliteError | UnexpectedError>;
6
+ export type ApplyMutation = (mutationEventEncoded: MutationEvent.AnyEncoded, options?: {
7
+ /** Needed for rehydrateFromMutationLog */
8
+ skipMutationLog?: boolean;
9
+ }) => Effect.Effect<void, SqliteError | UnexpectedError>;
7
10
  export declare const makeApplyMutation: Effect.Effect<ApplyMutation, never, Scope.Scope | LeaderThreadCtx>;
8
11
  //# sourceMappingURL=apply-mutation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"apply-mutation.d.ts","sourceRoot":"","sources":["../../src/leader-thread/apply-mutation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAkB,MAAM,yBAAyB,CAAA;AAEhE,OAAO,KAAK,EAAE,WAAW,EAAuB,eAAe,EAAE,MAAM,aAAa,CAAA;AAQpF,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGtE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,MAAM,aAAa,GAAG,CAC1B,oBAAoB,EAAE,aAAa,CAAC,UAAU,KAC3C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,CAAC,CAAA;AAEvD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,eAAe,CAyEhG,CAAA"}
1
+ {"version":3,"file":"apply-mutation.d.ts","sourceRoot":"","sources":["../../src/leader-thread/apply-mutation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAkB,MAAM,yBAAyB,CAAA;AAEhE,OAAO,KAAK,EAAY,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAEzE,OAAO,EAGL,KAAK,aAAa,EAInB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,MAAM,aAAa,GAAG,CAC1B,oBAAoB,EAAE,aAAa,CAAC,UAAU,EAC9C,OAAO,CAAC,EAAE;IACR,0CAA0C;IAC1C,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,KACE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,CAAC,CAAA;AAEvD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,eAAe,CAmFhG,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { 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 { 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';
@@ -12,12 +13,23 @@ export const makeApplyMutation = Effect.gen(function* () {
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
15
  [...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;
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;
19
20
  const mutationDef = schema.mutations.get(mutationName) ?? shouldNeverHappen(`Unknown mutation: ${mutationName}`);
20
- const execArgsArr = getExecArgsFromMutation({ mutationDef, mutationEventDecoded });
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
+ idLocal: mutationEventEncoded.id.local,
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);
50
59
  }
51
60
  else {
52
61
  // console.debug('[@livestore/common:leader-thread] skipping mutation log write', mutation, statementSql, bindValues)
@@ -55,15 +64,15 @@ 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.local}) ${mutationEventEncoded.mutation}`,
59
68
  },
60
69
  }));
61
70
  });
62
- const insertIntoMutationLog = (mutationEventEncoded, dbLog, mutationDefSchemaHashMap) => Effect.gen(function* () {
71
+ const insertIntoMutationLog = (mutationEventEncoded, dbMutationLog, mutationDefSchemaHashMap) => Effect.gen(function* () {
63
72
  const mutationName = mutationEventEncoded.mutation;
64
73
  const mutationDefSchemaHash = mutationDefSchemaHashMap.get(mutationName) ?? shouldNeverHappen(`Unknown mutation: ${mutationName}`);
65
74
  // TODO use prepared statements
66
- yield* execSql(dbLog, ...insertRow({
75
+ yield* execSql(dbMutationLog, ...insertRow({
67
76
  tableName: MUTATION_LOG_META_TABLE,
68
77
  columns: mutationLogMetaTable.sqliteDef.columns,
69
78
  values: {
@@ -84,11 +93,14 @@ const makeShouldExcludeMutationFromLog = memoizeByRef((schema) => {
84
93
  const mutationLogExclude = migrationOptions.strategy === 'from-mutation-log'
85
94
  ? (migrationOptions.excludeMutations ?? new Set(['livestore.RawSql']))
86
95
  : new Set(['livestore.RawSql']);
87
- return (mutationName, mutationEventDecoded) => {
96
+ return (mutationName, mutationEventEncoded) => {
88
97
  if (mutationLogExclude.has(mutationName))
89
98
  return true;
90
99
  const mutationDef = schema.mutations.get(mutationName) ?? shouldNeverHappen(`Unknown mutation: ${mutationName}`);
91
- const execArgsArr = getExecArgsFromMutation({ mutationDef, mutationEventDecoded });
100
+ const execArgsArr = getExecArgsFromMutation({
101
+ mutationDef,
102
+ mutationEvent: { decoded: undefined, encoded: mutationEventEncoded },
103
+ });
92
104
  return execArgsArr.some((_) => _.statementSql.includes('__livestore'));
93
105
  };
94
106
  });
@@ -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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"}