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

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 +35 -47
  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/devtools-bridge.d.ts +1 -2
  9. package/dist/devtools/devtools-bridge.d.ts.map +1 -1
  10. package/dist/devtools/devtools-messages.d.ts +592 -3
  11. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  12. package/dist/devtools/devtools-messages.js +171 -3
  13. package/dist/devtools/devtools-messages.js.map +1 -1
  14. package/dist/index.d.ts +4 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/init-singleton-tables.d.ts +2 -2
  17. package/dist/init-singleton-tables.d.ts.map +1 -1
  18. package/dist/init-singleton-tables.js.map +1 -1
  19. package/dist/leader-thread/apply-mutation.d.ts +2 -5
  20. package/dist/leader-thread/apply-mutation.d.ts.map +1 -1
  21. package/dist/leader-thread/apply-mutation.js +29 -41
  22. package/dist/leader-thread/apply-mutation.js.map +1 -1
  23. package/dist/leader-thread/connection.d.ts +4 -4
  24. package/dist/leader-thread/connection.d.ts.map +1 -1
  25. package/dist/leader-thread/connection.js +5 -5
  26. package/dist/leader-thread/connection.js.map +1 -1
  27. package/dist/leader-thread/leader-sync-processor.d.ts +2 -2
  28. package/dist/leader-thread/leader-sync-processor.d.ts.map +1 -1
  29. package/dist/leader-thread/leader-sync-processor.js +12 -20
  30. package/dist/leader-thread/leader-sync-processor.js.map +1 -1
  31. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  32. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  33. package/dist/leader-thread/leader-worker-devtools.js +81 -37
  34. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  35. package/dist/leader-thread/make-leader-thread-layer.d.ts +11 -12
  36. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  37. package/dist/leader-thread/make-leader-thread-layer.js +14 -33
  38. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  39. package/dist/leader-thread/mutationlog.d.ts +19 -6
  40. package/dist/leader-thread/mutationlog.d.ts.map +1 -1
  41. package/dist/leader-thread/mutationlog.js +6 -7
  42. package/dist/leader-thread/mutationlog.js.map +1 -1
  43. package/dist/leader-thread/pull-queue-set.d.ts.map +1 -1
  44. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  45. package/dist/leader-thread/recreate-db.js +18 -24
  46. package/dist/leader-thread/recreate-db.js.map +1 -1
  47. package/dist/leader-thread/types.d.ts +16 -36
  48. package/dist/leader-thread/types.d.ts.map +1 -1
  49. package/dist/leader-thread/types.js.map +1 -1
  50. package/dist/mutation.d.ts +2 -9
  51. package/dist/mutation.d.ts.map +1 -1
  52. package/dist/mutation.js +5 -5
  53. package/dist/mutation.js.map +1 -1
  54. package/dist/query-builder/impl.d.ts +1 -1
  55. package/dist/rehydrate-from-mutationlog.d.ts +5 -5
  56. package/dist/rehydrate-from-mutationlog.d.ts.map +1 -1
  57. package/dist/rehydrate-from-mutationlog.js +19 -13
  58. package/dist/rehydrate-from-mutationlog.js.map +1 -1
  59. package/dist/schema/EventId.d.ts +14 -16
  60. package/dist/schema/EventId.d.ts.map +1 -1
  61. package/dist/schema/EventId.js +7 -15
  62. package/dist/schema/EventId.js.map +1 -1
  63. package/dist/schema/MutationEvent.d.ts +80 -49
  64. package/dist/schema/MutationEvent.d.ts.map +1 -1
  65. package/dist/schema/MutationEvent.js +15 -32
  66. package/dist/schema/MutationEvent.js.map +1 -1
  67. package/dist/schema/system-tables.d.ts +26 -26
  68. package/dist/schema/system-tables.d.ts.map +1 -1
  69. package/dist/schema/system-tables.js +11 -19
  70. package/dist/schema/system-tables.js.map +1 -1
  71. package/dist/schema-management/common.d.ts +3 -3
  72. package/dist/schema-management/common.d.ts.map +1 -1
  73. package/dist/schema-management/common.js.map +1 -1
  74. package/dist/schema-management/migrations.d.ts +4 -4
  75. package/dist/schema-management/migrations.d.ts.map +1 -1
  76. package/dist/schema-management/migrations.js +6 -6
  77. package/dist/schema-management/migrations.js.map +1 -1
  78. package/dist/sync/client-session-sync-processor.d.ts +4 -4
  79. package/dist/sync/client-session-sync-processor.d.ts.map +1 -1
  80. package/dist/sync/index.d.ts +1 -1
  81. package/dist/sync/index.d.ts.map +1 -1
  82. package/dist/sync/index.js +1 -1
  83. package/dist/sync/index.js.map +1 -1
  84. package/dist/sync/next/history-dag-common.d.ts +4 -1
  85. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  86. package/dist/sync/next/history-dag-common.js +1 -1
  87. package/dist/sync/next/history-dag-common.js.map +1 -1
  88. package/dist/sync/next/rebase-events.d.ts +3 -3
  89. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  90. package/dist/sync/next/rebase-events.js +2 -3
  91. package/dist/sync/next/rebase-events.js.map +1 -1
  92. package/dist/sync/next/test/mutation-fixtures.d.ts +7 -7
  93. package/dist/sync/next/test/mutation-fixtures.d.ts.map +1 -1
  94. package/dist/sync/next/test/mutation-fixtures.js +9 -3
  95. package/dist/sync/next/test/mutation-fixtures.js.map +1 -1
  96. package/dist/sync/sync.d.ts +11 -21
  97. package/dist/sync/sync.d.ts.map +1 -1
  98. package/dist/sync/sync.js.map +1 -1
  99. package/dist/sync/syncstate.d.ts +23 -45
  100. package/dist/sync/syncstate.d.ts.map +1 -1
  101. package/dist/sync/syncstate.js +12 -56
  102. package/dist/sync/syncstate.js.map +1 -1
  103. package/dist/sync/syncstate.test.js +69 -125
  104. package/dist/sync/syncstate.test.js.map +1 -1
  105. package/dist/sync/validate-push-payload.d.ts +2 -2
  106. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  107. package/dist/sync/validate-push-payload.js +2 -2
  108. package/dist/sync/validate-push-payload.js.map +1 -1
  109. package/dist/version.d.ts +1 -1
  110. package/dist/version.d.ts.map +1 -1
  111. package/dist/version.js +1 -1
  112. package/dist/version.js.map +1 -1
  113. package/package.json +5 -6
  114. package/src/adapter-types.ts +40 -39
  115. package/src/derived-mutations.test.ts +1 -1
  116. package/src/derived-mutations.ts +5 -9
  117. package/src/devtools/devtools-bridge.ts +1 -2
  118. package/src/devtools/devtools-messages.ts +243 -3
  119. package/src/index.ts +6 -0
  120. package/src/init-singleton-tables.ts +2 -2
  121. package/src/leader-thread/apply-mutation.ts +35 -53
  122. package/src/leader-thread/connection.ts +7 -7
  123. package/src/leader-thread/{LeaderSyncProcessor.ts → leader-sync-processor.ts} +268 -306
  124. package/src/leader-thread/leader-worker-devtools.ts +124 -52
  125. package/src/leader-thread/make-leader-thread-layer.ts +30 -62
  126. package/src/leader-thread/mutationlog.ts +10 -14
  127. package/src/leader-thread/recreate-db.ts +20 -24
  128. package/src/leader-thread/types.ts +20 -41
  129. package/src/mutation.ts +7 -17
  130. package/src/rehydrate-from-mutationlog.ts +26 -18
  131. package/src/schema/EventId.ts +9 -23
  132. package/src/schema/MutationEvent.ts +24 -46
  133. package/src/schema/system-tables.ts +11 -19
  134. package/src/schema-management/common.ts +3 -3
  135. package/src/schema-management/migrations.ts +10 -10
  136. package/src/sync/{ClientSessionSyncProcessor.ts → client-session-sync-processor.ts} +19 -26
  137. package/src/sync/index.ts +1 -1
  138. package/src/sync/next/history-dag-common.ts +1 -1
  139. package/src/sync/next/rebase-events.ts +7 -7
  140. package/src/sync/next/test/mutation-fixtures.ts +10 -3
  141. package/src/sync/sync.ts +6 -19
  142. package/src/sync/syncstate.test.ts +67 -127
  143. package/src/sync/syncstate.ts +19 -21
  144. package/src/sync/validate-push-payload.ts +4 -7
  145. package/src/version.ts +1 -1
  146. package/dist/devtools/devtool-message-leader.d.ts +0 -2
  147. package/dist/devtools/devtool-message-leader.d.ts.map +0 -1
  148. package/dist/devtools/devtool-message-leader.js +0 -2
  149. package/dist/devtools/devtool-message-leader.js.map +0 -1
  150. package/dist/devtools/devtools-messages-client-session.d.ts +0 -297
  151. package/dist/devtools/devtools-messages-client-session.d.ts.map +0 -1
  152. package/dist/devtools/devtools-messages-client-session.js +0 -61
  153. package/dist/devtools/devtools-messages-client-session.js.map +0 -1
  154. package/dist/devtools/devtools-messages-common.d.ts +0 -65
  155. package/dist/devtools/devtools-messages-common.d.ts.map +0 -1
  156. package/dist/devtools/devtools-messages-common.js +0 -35
  157. package/dist/devtools/devtools-messages-common.js.map +0 -1
  158. package/dist/devtools/devtools-messages-leader.d.ts +0 -261
  159. package/dist/devtools/devtools-messages-leader.d.ts.map +0 -1
  160. package/dist/devtools/devtools-messages-leader.js +0 -85
  161. package/dist/devtools/devtools-messages-leader.js.map +0 -1
  162. package/dist/leader-thread/LeaderSyncProcessor.d.ts +0 -37
  163. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +0 -1
  164. package/dist/leader-thread/LeaderSyncProcessor.js +0 -432
  165. package/dist/leader-thread/LeaderSyncProcessor.js.map +0 -1
  166. package/dist/schema/EventId.test.d.ts +0 -2
  167. package/dist/schema/EventId.test.d.ts.map +0 -1
  168. package/dist/schema/EventId.test.js +0 -11
  169. package/dist/schema/EventId.test.js.map +0 -1
  170. package/dist/schema/MutationEvent.test.d.ts +0 -2
  171. package/dist/schema/MutationEvent.test.d.ts.map +0 -1
  172. package/dist/schema/MutationEvent.test.js +0 -2
  173. package/dist/schema/MutationEvent.test.js.map +0 -1
  174. package/dist/sync/ClientSessionSyncProcessor.d.ts +0 -43
  175. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +0 -1
  176. package/dist/sync/ClientSessionSyncProcessor.js +0 -141
  177. package/dist/sync/ClientSessionSyncProcessor.js.map +0 -1
  178. package/src/devtools/devtools-messages-client-session.ts +0 -109
  179. package/src/devtools/devtools-messages-common.ts +0 -52
  180. package/src/devtools/devtools-messages-leader.ts +0 -115
  181. package/src/schema/EventId.test.ts +0 -12
@@ -1,432 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"LeaderSyncProcessor.js","sourceRoot":"","sources":["../../src/leader-thread/LeaderSyncProcessor.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=EventId.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventId.test.d.ts","sourceRoot":"","sources":["../../src/schema/EventId.test.ts"],"names":[],"mappings":""}
@@ -1,11 +0,0 @@
1
- import { Vitest } from '@livestore/utils/node-vitest';
2
- import { expect } from 'vitest';
3
- import { EventId } from './mod.js';
4
- Vitest.describe('EventId', () => {
5
- Vitest.test('nextPair', () => {
6
- const e_0_0 = EventId.make({ global: 0, local: 0 });
7
- expect(EventId.nextPair(e_0_0, false).id).toStrictEqual({ global: 1, local: 0 });
8
- expect(EventId.nextPair(e_0_0, true).id).toStrictEqual({ global: 0, local: 1 });
9
- });
10
- });
11
- //# sourceMappingURL=EventId.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventId.test.js","sourceRoot":"","sources":["../../src/schema/EventId.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAElC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IAC9B,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QACnD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QAChF,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;IACjF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=MutationEvent.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MutationEvent.test.d.ts","sourceRoot":"","sources":["../../src/schema/MutationEvent.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=MutationEvent.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MutationEvent.test.js","sourceRoot":"","sources":["../../src/schema/MutationEvent.test.ts"],"names":[],"mappings":""}
@@ -1,43 +0,0 @@
1
- import type { Runtime, Scope } from '@livestore/utils/effect';
2
- import { Effect } from '@livestore/utils/effect';
3
- import * as otel from '@opentelemetry/api';
4
- import type { ClientSession, UnexpectedError } from '../adapter-types.js';
5
- import { type LiveStoreSchema } from '../schema/mod.js';
6
- import * as MutationEvent from '../schema/MutationEvent.js';
7
- import { SyncState } from './syncstate.js';
8
- /**
9
- * Rebase behaviour:
10
- * - We continously pull mutations from the leader and apply them to the local store.
11
- * - If there was a race condition (i.e. the leader and client session have both advacned),
12
- * we'll need to rebase the local pending mutations on top of the leader's head.
13
- * - The goal is to never block the UI, so we'll interrupt rebasing if a new mutations is pushed by the client session.
14
- * - We also want to avoid "backwards-jumping" in the UI, so we'll transactionally apply a read model changes during a rebase.
15
- * - We might need to make the rebase behaviour configurable e.g. to let users manually trigger a rebase
16
- */
17
- export declare const makeClientSessionSyncProcessor: ({ schema, clientSession, runtime, applyMutation, rollback, refreshTables, span, }: {
18
- schema: LiveStoreSchema;
19
- clientSession: ClientSession;
20
- runtime: Runtime.Runtime<Scope.Scope>;
21
- applyMutation: (mutationEventDecoded: MutationEvent.PartialAnyDecoded, options: {
22
- otelContext: otel.Context;
23
- withChangeset: boolean;
24
- }) => {
25
- writeTables: Set<string>;
26
- sessionChangeset: Uint8Array | undefined;
27
- };
28
- rollback: (changeset: Uint8Array) => void;
29
- refreshTables: (tables: Set<string>) => void;
30
- span: otel.Span;
31
- }) => ClientSessionSyncProcessor;
32
- export interface ClientSessionSyncProcessor {
33
- push: (batch: ReadonlyArray<MutationEvent.PartialAnyDecoded>, options: {
34
- otelContext: otel.Context;
35
- }) => {
36
- writeTables: Set<string>;
37
- };
38
- boot: Effect.Effect<void, UnexpectedError, Scope.Scope>;
39
- syncStateRef: {
40
- current: SyncState;
41
- };
42
- }
43
- //# sourceMappingURL=ClientSessionSyncProcessor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ClientSessionSyncProcessor.d.ts","sourceRoot":"","sources":["../../src/sync/ClientSessionSyncProcessor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAAE,MAAM,EAAkB,MAAM,yBAAyB,CAAA;AAChE,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE1C,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAEzE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAmB,MAAM,gBAAgB,CAAA;AAE3D;;;;;;;;GAQG;AACH,eAAO,MAAM,8BAA8B,sFAQxC;IACD,MAAM,EAAE,eAAe,CAAA;IACvB,aAAa,EAAE,aAAa,CAAA;IAC5B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACrC,aAAa,EAAE,CACb,oBAAoB,EAAE,aAAa,CAAC,iBAAiB,EACrD,OAAO,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC;QAAC,aAAa,EAAE,OAAO,CAAA;KAAE,KAC3D;QACH,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;QACxB,gBAAgB,EAAE,UAAU,GAAG,SAAS,CAAA;KACzC,CAAA;IACD,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,IAAI,CAAA;IACzC,aAAa,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;IAC5C,IAAI,EAAE,IAAI,CAAC,IAAI,CAAA;CAChB,KAAG,0BA+JH,CAAA;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,CACJ,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,iBAAiB,CAAC,EACrD,OAAO,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAA;KAAE,KACnC;QACH,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;KACzB,CAAA;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IAEvD,YAAY,EAAE;QAAE,OAAO,EAAE,SAAS,CAAA;KAAE,CAAA;CACrC"}