@livestore/common 0.3.0-dev.14 → 0.3.0-dev.16
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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/fixture.d.ts +6 -6
- package/dist/devtools/devtools-messages-client-session.d.ts +21 -21
- package/dist/devtools/devtools-messages-common.d.ts +6 -6
- package/dist/devtools/devtools-messages-leader.d.ts +28 -28
- package/dist/devtools/index.d.ts +17 -0
- package/dist/devtools/index.d.ts.map +1 -1
- package/dist/devtools/index.js +20 -0
- package/dist/devtools/index.js.map +1 -1
- package/dist/schema/table-def.d.ts +2 -5
- package/dist/schema/table-def.d.ts.map +1 -1
- package/dist/schema/table-def.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/src/devtools/index.ts +27 -0
- package/src/schema/table-def.ts +2 -3
- package/src/version.ts +1 -1
- package/dist/db-schema/ast/sqlite.d.ts +0 -69
- package/dist/db-schema/ast/sqlite.d.ts.map +0 -1
- package/dist/db-schema/ast/sqlite.js +0 -71
- package/dist/db-schema/ast/sqlite.js.map +0 -1
- package/dist/db-schema/ast/validate.d.ts +0 -3
- package/dist/db-schema/ast/validate.d.ts.map +0 -1
- package/dist/db-schema/ast/validate.js +0 -12
- package/dist/db-schema/ast/validate.js.map +0 -1
- package/dist/db-schema/dsl/field-defs.d.ts +0 -90
- package/dist/db-schema/dsl/field-defs.d.ts.map +0 -1
- package/dist/db-schema/dsl/field-defs.js +0 -87
- package/dist/db-schema/dsl/field-defs.js.map +0 -1
- package/dist/db-schema/dsl/field-defs.test.d.ts +0 -2
- package/dist/db-schema/dsl/field-defs.test.d.ts.map +0 -1
- package/dist/db-schema/dsl/field-defs.test.js +0 -29
- package/dist/db-schema/dsl/field-defs.test.js.map +0 -1
- package/dist/db-schema/dsl/index.d.ts +0 -88
- package/dist/db-schema/dsl/index.d.ts.map +0 -1
- package/dist/db-schema/dsl/index.js +0 -35
- package/dist/db-schema/dsl/index.js.map +0 -1
- package/dist/db-schema/dsl/mod.d.ts +0 -90
- package/dist/db-schema/dsl/mod.d.ts.map +0 -1
- package/dist/db-schema/dsl/mod.js +0 -35
- package/dist/db-schema/dsl/mod.js.map +0 -1
- package/dist/db-schema/dsl/sqlite/field-defs.d.ts +0 -90
- package/dist/db-schema/dsl/sqlite/field-defs.d.ts.map +0 -1
- package/dist/db-schema/dsl/sqlite/field-defs.js +0 -86
- package/dist/db-schema/dsl/sqlite/field-defs.js.map +0 -1
- package/dist/db-schema/dsl/sqlite/field-defs.test.d.ts +0 -2
- package/dist/db-schema/dsl/sqlite/field-defs.test.d.ts.map +0 -1
- package/dist/db-schema/dsl/sqlite/field-defs.test.js +0 -29
- package/dist/db-schema/dsl/sqlite/field-defs.test.js.map +0 -1
- package/dist/db-schema/dsl/sqlite/index.d.ts +0 -88
- package/dist/db-schema/dsl/sqlite/index.d.ts.map +0 -1
- package/dist/db-schema/dsl/sqlite/index.js +0 -35
- package/dist/db-schema/dsl/sqlite/index.js.map +0 -1
- package/dist/db-schema/hash.d.ts +0 -2
- package/dist/db-schema/hash.d.ts.map +0 -1
- package/dist/db-schema/hash.js +0 -14
- package/dist/db-schema/hash.js.map +0 -1
- package/dist/db-schema/index.d.ts +0 -4
- package/dist/db-schema/index.d.ts.map +0 -1
- package/dist/db-schema/index.js +0 -6
- package/dist/db-schema/index.js.map +0 -1
- package/dist/db-schema/mod.d.ts +0 -3
- package/dist/db-schema/mod.d.ts.map +0 -1
- package/dist/db-schema/mod.js +0 -3
- package/dist/db-schema/mod.js.map +0 -1
- package/dist/devtools/devtool-message-leader.d.ts +0 -2
- package/dist/devtools/devtool-message-leader.d.ts.map +0 -1
- package/dist/devtools/devtool-message-leader.js +0 -2
- package/dist/devtools/devtool-message-leader.js.map +0 -1
- package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
- package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
- package/dist/leader-thread/leader-sync-processor.js +0 -430
- package/dist/leader-thread/leader-sync-processor.js.map +0 -1
- package/dist/schema/MutationEvent.test.d.ts +0 -2
- package/dist/schema/MutationEvent.test.d.ts.map +0 -1
- package/dist/schema/MutationEvent.test.js +0 -2
- package/dist/schema/MutationEvent.test.js.map +0 -1
- package/dist/sync/client-session-sync-processor.d.ts +0 -45
- package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
- package/dist/sync/client-session-sync-processor.js +0 -131
- package/dist/sync/client-session-sync-processor.js.map +0 -1
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db-schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAA;AAClD,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAA;AAG5C,cAAc,YAAY,CAAA"}
|
package/dist/db-schema/index.js
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db-schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAA;AAClD,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAA;AAE5C,0BAA0B;AAC1B,cAAc,YAAY,CAAA;AAC1B,uCAAuC"}
|
package/dist/db-schema/mod.d.ts
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/db-schema/mod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,cAAc,CAAA;AACzC,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAA"}
|
package/dist/db-schema/mod.js
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/db-schema/mod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,cAAc,CAAA;AACzC,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAA"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"devtool-message-leader.d.ts","sourceRoot":"","sources":["../../src/devtools/devtool-message-leader.ts"],"names":[],"mappings":""}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"devtool-message-leader.js","sourceRoot":"","sources":["../../src/devtools/devtool-message-leader.ts"],"names":[],"mappings":""}
|
@@ -1,47 +0,0 @@
|
|
1
|
-
import type { Scope } from '@livestore/utils/effect';
|
2
|
-
import { Effect } from '@livestore/utils/effect';
|
3
|
-
import type { SynchronousDatabase } from '../adapter-types.js';
|
4
|
-
import { UnexpectedError } from '../adapter-types.js';
|
5
|
-
import type { LiveStoreSchema } from '../schema/mod.js';
|
6
|
-
import type { InitialBlockingSyncContext, LeaderSyncProcessor } from './types.js';
|
7
|
-
/**
|
8
|
-
* The general idea of the sync processor is to "follow the sync state"
|
9
|
-
* and apply/rollback mutations as needed to the read model and mutation log.
|
10
|
-
* The leader sync processor is also responsible for
|
11
|
-
* - broadcasting mutations to client sessions via the pull queues.
|
12
|
-
* - pushing mutations to the sync backend
|
13
|
-
*
|
14
|
-
* In the leader sync processor, pulling always has precedence over pushing.
|
15
|
-
*
|
16
|
-
* External events:
|
17
|
-
* - Mutation pushed from client session
|
18
|
-
* - Mutation pushed from devtools (via pushPartial)
|
19
|
-
* - Mutation pulled from sync backend
|
20
|
-
*
|
21
|
-
* The machine can be in the following states:
|
22
|
-
* - in-sync: fully synced with remote, now idling
|
23
|
-
* - applying-syncstate-advance (with pointer to current progress in case of rebase interrupt)
|
24
|
-
*
|
25
|
-
* Transitions:
|
26
|
-
* - in-sync -> applying-syncstate-advance
|
27
|
-
* - applying-syncstate-advance -> in-sync
|
28
|
-
* - applying-syncstate-advance -> applying-syncstate-advance (need to interrupt previous operation)
|
29
|
-
*
|
30
|
-
* Queuing vs interrupting behaviour:
|
31
|
-
* - Operations caused by pull can never be interrupted
|
32
|
-
* - Incoming pull can interrupt current push
|
33
|
-
* - Incoming pull needs to wait to previous pull to finish
|
34
|
-
* - Incoming push needs to wait to previous push to finish
|
35
|
-
*
|
36
|
-
* Backend pushing:
|
37
|
-
* - continously push to backend
|
38
|
-
* - only interrupted and restarted on rebase
|
39
|
-
*/
|
40
|
-
export declare const makeLeaderSyncProcessor: ({ schema, dbMissing, dbLog, initialBlockingSyncContext, }: {
|
41
|
-
schema: LiveStoreSchema;
|
42
|
-
/** Only used to know whether we can safely query dbLog during setup execution */
|
43
|
-
dbMissing: boolean;
|
44
|
-
dbLog: SynchronousDatabase;
|
45
|
-
initialBlockingSyncContext: InitialBlockingSyncContext;
|
46
|
-
}) => Effect.Effect<LeaderSyncProcessor, UnexpectedError, Scope.Scope>;
|
47
|
-
//# sourceMappingURL=leader-sync-processor.d.ts.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"leader-sync-processor.d.ts","sourceRoot":"","sources":["../../src/leader-thread/leader-sync-processor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,EAGL,MAAM,EAWP,MAAM,yBAAyB,CAAA;AAGhC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAA2B,MAAM,kBAAkB,CAAA;AAehF,OAAO,KAAK,EAAE,0BAA0B,EAAmB,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAuBlG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,uBAAuB,8DAKjC;IACD,MAAM,EAAE,eAAe,CAAA;IACvB,iFAAiF;IACjF,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,mBAAmB,CAAA;IAC1B,0BAA0B,EAAE,0BAA0B,CAAA;CACvD,KAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,eAAe,EAAE,KAAK,CAAC,KAAK,CAuO/D,CAAA"}
|
@@ -1,430 +0,0 @@
|
|
1
|
-
import { shouldNeverHappen, TRACE_VERBOSE } from '@livestore/utils';
|
2
|
-
import { BucketQueue, Deferred, Effect, Exit, Fiber, FiberHandle, Option, OtelTracer, ReadonlyArray, Ref, Schema, Stream, 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 general idea of the sync processor is to "follow the sync state"
|
15
|
-
* and apply/rollback mutations as needed to the read model and mutation log.
|
16
|
-
* The leader sync processor is also responsible for
|
17
|
-
* - broadcasting mutations to client sessions via the pull queues.
|
18
|
-
* - pushing mutations to the sync backend
|
19
|
-
*
|
20
|
-
* In the leader sync processor, pulling always has precedence over pushing.
|
21
|
-
*
|
22
|
-
* External events:
|
23
|
-
* - Mutation pushed from client session
|
24
|
-
* - Mutation pushed from devtools (via pushPartial)
|
25
|
-
* - Mutation pulled from sync backend
|
26
|
-
*
|
27
|
-
* The machine can be in the following states:
|
28
|
-
* - in-sync: fully synced with remote, now idling
|
29
|
-
* - applying-syncstate-advance (with pointer to current progress in case of rebase interrupt)
|
30
|
-
*
|
31
|
-
* Transitions:
|
32
|
-
* - in-sync -> applying-syncstate-advance
|
33
|
-
* - applying-syncstate-advance -> in-sync
|
34
|
-
* - applying-syncstate-advance -> applying-syncstate-advance (need to interrupt previous operation)
|
35
|
-
*
|
36
|
-
* Queuing vs interrupting behaviour:
|
37
|
-
* - Operations caused by pull can never be interrupted
|
38
|
-
* - Incoming pull can interrupt current push
|
39
|
-
* - Incoming pull needs to wait to previous pull to finish
|
40
|
-
* - Incoming push needs to wait to previous push to finish
|
41
|
-
*
|
42
|
-
* Backend pushing:
|
43
|
-
* - continously push to backend
|
44
|
-
* - only interrupted and restarted on rebase
|
45
|
-
*/
|
46
|
-
export const makeLeaderSyncProcessor = ({ schema, dbMissing, dbLog, initialBlockingSyncContext, }) => Effect.gen(function* () {
|
47
|
-
const syncBackendQueue = yield* BucketQueue.make();
|
48
|
-
const stateRef = yield* Ref.make({ _tag: 'init' });
|
49
|
-
const semaphore = yield* Effect.makeSemaphore(1);
|
50
|
-
const isLocalEvent = (mutationEventEncoded) => {
|
51
|
-
const mutationDef = schema.mutations.get(mutationEventEncoded.mutation);
|
52
|
-
return mutationDef.options.localOnly;
|
53
|
-
};
|
54
|
-
const spanRef = { current: undefined };
|
55
|
-
const applyMutationItemsRef = { current: undefined };
|
56
|
-
// TODO get rid of counters once Effect semaphore ordering is fixed
|
57
|
-
let counterRef = 0;
|
58
|
-
let expectedCounter = 0;
|
59
|
-
/*
|
60
|
-
TODO: refactor
|
61
|
-
- Pushes go directly into a Mailbox
|
62
|
-
- Have a worker fiber that takes from the mailbox (wouldn't need a semaphore)
|
63
|
-
*/
|
64
|
-
const waitForSyncState = (counter) => Effect.gen(function* () {
|
65
|
-
// console.log('waitForSyncState: waiting for semaphore', counter)
|
66
|
-
yield* semaphore.take(1);
|
67
|
-
// NOTE this is a workaround to ensure the semaphore take-order is respected
|
68
|
-
// TODO this needs to be fixed upstream in Effect
|
69
|
-
if (counter !== expectedCounter) {
|
70
|
-
console.log(`waitForSyncState: counter mismatch (expected: ${expectedCounter}, got: ${counter}), releasing semaphore`);
|
71
|
-
yield* semaphore.release(1);
|
72
|
-
yield* Effect.yieldNow();
|
73
|
-
// Retrying...
|
74
|
-
return yield* waitForSyncState(counter);
|
75
|
-
}
|
76
|
-
// console.log('waitForSyncState: took semaphore', counter)
|
77
|
-
const state = yield* Ref.get(stateRef);
|
78
|
-
if (state._tag !== 'in-sync') {
|
79
|
-
return shouldNeverHappen('Expected to be in-sync but got ' + state._tag);
|
80
|
-
}
|
81
|
-
expectedCounter = counter + 1;
|
82
|
-
return state;
|
83
|
-
}).pipe(Effect.withSpan(`@livestore/common:leader-thread:syncing:waitForSyncState(${counter})`));
|
84
|
-
const push = (newEvents) => Effect.gen(function* () {
|
85
|
-
const counter = counterRef;
|
86
|
-
counterRef++;
|
87
|
-
// TODO validate batch
|
88
|
-
if (newEvents.length === 0)
|
89
|
-
return;
|
90
|
-
const { connectedClientSessionPullQueues } = yield* LeaderThreadCtx;
|
91
|
-
// TODO if there are multiple pending pushes, we should batch them together
|
92
|
-
const state = yield* waitForSyncState(counter);
|
93
|
-
const updateResult = SyncState.updateSyncState({
|
94
|
-
syncState: state.syncState,
|
95
|
-
payload: { _tag: 'local-push', newEvents },
|
96
|
-
isLocalEvent,
|
97
|
-
isEqualEvent: MutationEvent.isEqualEncoded,
|
98
|
-
});
|
99
|
-
if (updateResult._tag === 'rebase') {
|
100
|
-
return shouldNeverHappen('The leader thread should never have to rebase due to a local push');
|
101
|
-
}
|
102
|
-
else if (updateResult._tag === 'reject') {
|
103
|
-
return yield* Effect.fail(InvalidPushError.make({
|
104
|
-
reason: {
|
105
|
-
_tag: 'LeaderAhead',
|
106
|
-
minimumExpectedId: updateResult.expectedMinimumId,
|
107
|
-
providedId: newEvents.at(0).id,
|
108
|
-
},
|
109
|
-
}));
|
110
|
-
}
|
111
|
-
const fiber = yield* applyMutationItemsRef.current({ batchItems: updateResult.newEvents }).pipe(Effect.fork);
|
112
|
-
yield* Ref.set(stateRef, {
|
113
|
-
_tag: 'applying-syncstate-advance',
|
114
|
-
origin: 'push',
|
115
|
-
syncState: updateResult.newSyncState,
|
116
|
-
fiber,
|
117
|
-
});
|
118
|
-
// console.log('setRef:applying-syncstate-advance after push', counter)
|
119
|
-
yield* connectedClientSessionPullQueues.offer({
|
120
|
-
payload: { _tag: 'upstream-advance', newEvents: updateResult.newEvents },
|
121
|
-
remaining: 0,
|
122
|
-
});
|
123
|
-
spanRef.current?.addEvent('local-push', {
|
124
|
-
batchSize: newEvents.length,
|
125
|
-
updateResult: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
|
126
|
-
});
|
127
|
-
// Don't sync localOnly mutations
|
128
|
-
const filteredBatch = updateResult.newEvents.filter((mutationEventEncoded) => {
|
129
|
-
const mutationDef = schema.mutations.get(mutationEventEncoded.mutation);
|
130
|
-
return mutationDef.options.localOnly === false;
|
131
|
-
});
|
132
|
-
yield* BucketQueue.offerAll(syncBackendQueue, filteredBatch);
|
133
|
-
yield* fiber; // Waiting for the mutation to be applied
|
134
|
-
}).pipe(Effect.withSpan('@livestore/common:leader-thread:syncing:local-push', {
|
135
|
-
attributes: {
|
136
|
-
batchSize: newEvents.length,
|
137
|
-
batch: TRACE_VERBOSE ? newEvents : undefined,
|
138
|
-
},
|
139
|
-
links: spanRef.current
|
140
|
-
? [{ _tag: 'SpanLink', span: OtelTracer.makeExternalSpan(spanRef.current.spanContext()), attributes: {} }]
|
141
|
-
: undefined,
|
142
|
-
}));
|
143
|
-
const pushPartial = (mutationEventEncoded_) => Effect.gen(function* () {
|
144
|
-
const state = yield* Ref.get(stateRef);
|
145
|
-
if (state._tag === 'init')
|
146
|
-
return shouldNeverHappen('Not initialized');
|
147
|
-
const mutationDef = schema.mutations.get(mutationEventEncoded_.mutation) ??
|
148
|
-
shouldNeverHappen(`Unknown mutation: ${mutationEventEncoded_.mutation}`);
|
149
|
-
const mutationEventEncoded = new MutationEvent.EncodedWithMeta({
|
150
|
-
...mutationEventEncoded_,
|
151
|
-
...EventId.nextPair(state.syncState.localHead, mutationDef.options.localOnly),
|
152
|
-
});
|
153
|
-
yield* push([mutationEventEncoded]);
|
154
|
-
}).pipe(Effect.catchTag('InvalidPushError', Effect.orDie));
|
155
|
-
// Starts various background loops
|
156
|
-
const boot = ({ dbReady }) => Effect.gen(function* () {
|
157
|
-
const span = yield* OtelTracer.currentOtelSpan.pipe(Effect.catchAll(() => Effect.succeed(undefined)));
|
158
|
-
spanRef.current = span;
|
159
|
-
const initialBackendHead = dbMissing ? EventId.ROOT.global : getBackendHeadFromDb(dbLog);
|
160
|
-
const initialLocalHead = dbMissing ? EventId.ROOT : getLocalHeadFromDb(dbLog);
|
161
|
-
if (initialBackendHead > initialLocalHead.global) {
|
162
|
-
return shouldNeverHappen(`During boot the backend head (${initialBackendHead}) should never be greater than the local head (${initialLocalHead.global})`);
|
163
|
-
}
|
164
|
-
const pendingMutationEvents = yield* getMutationEventsSince({
|
165
|
-
global: initialBackendHead,
|
166
|
-
local: EventId.localDefault,
|
167
|
-
}).pipe(Effect.map(ReadonlyArray.map((_) => new MutationEvent.EncodedWithMeta(_))));
|
168
|
-
const initialSyncState = {
|
169
|
-
pending: pendingMutationEvents,
|
170
|
-
// On the leader we don't need a rollback tail beyond `pending` items
|
171
|
-
rollbackTail: [],
|
172
|
-
upstreamHead: { global: initialBackendHead, local: EventId.localDefault },
|
173
|
-
localHead: initialLocalHead,
|
174
|
-
};
|
175
|
-
/** State transitions need to happen atomically, so we use a Ref to track the state */
|
176
|
-
yield* Ref.set(stateRef, { _tag: 'in-sync', syncState: initialSyncState });
|
177
|
-
applyMutationItemsRef.current = yield* makeApplyMutationItems({ stateRef, semaphore });
|
178
|
-
// Rehydrate sync queue
|
179
|
-
if (pendingMutationEvents.length > 0) {
|
180
|
-
const filteredBatch = pendingMutationEvents
|
181
|
-
// Don't sync localOnly mutations
|
182
|
-
.filter((mutationEventEncoded) => {
|
183
|
-
const mutationDef = schema.mutations.get(mutationEventEncoded.mutation);
|
184
|
-
return mutationDef.options.localOnly === false;
|
185
|
-
});
|
186
|
-
yield* BucketQueue.offerAll(syncBackendQueue, filteredBatch);
|
187
|
-
}
|
188
|
-
const backendPushingFiberHandle = yield* FiberHandle.make();
|
189
|
-
yield* FiberHandle.run(backendPushingFiberHandle, backgroundBackendPushing({ dbReady, syncBackendQueue, span }).pipe(Effect.tapCauseLogPretty));
|
190
|
-
yield* backgroundBackendPulling({
|
191
|
-
dbReady,
|
192
|
-
initialBackendHead,
|
193
|
-
isLocalEvent,
|
194
|
-
restartBackendPushing: (filteredRebasedPending) => Effect.gen(function* () {
|
195
|
-
// Stop current pushing fiber
|
196
|
-
yield* FiberHandle.clear(backendPushingFiberHandle);
|
197
|
-
// Reset the sync queue
|
198
|
-
yield* BucketQueue.clear(syncBackendQueue);
|
199
|
-
yield* BucketQueue.offerAll(syncBackendQueue, filteredRebasedPending);
|
200
|
-
// Restart pushing fiber
|
201
|
-
yield* FiberHandle.run(backendPushingFiberHandle, backgroundBackendPushing({ dbReady, syncBackendQueue, span }).pipe(Effect.tapCauseLogPretty));
|
202
|
-
}),
|
203
|
-
applyMutationItemsRef,
|
204
|
-
stateRef,
|
205
|
-
semaphore,
|
206
|
-
span,
|
207
|
-
initialBlockingSyncContext,
|
208
|
-
}).pipe(Effect.tapCauseLogPretty, Effect.forkScoped);
|
209
|
-
}).pipe(Effect.withSpanScoped('@livestore/common:leader-thread:syncing'));
|
210
|
-
return {
|
211
|
-
push,
|
212
|
-
pushPartial,
|
213
|
-
boot,
|
214
|
-
syncState: Effect.gen(function* () {
|
215
|
-
const state = yield* Ref.get(stateRef);
|
216
|
-
if (state._tag === 'init')
|
217
|
-
return shouldNeverHappen('Not initialized');
|
218
|
-
return state.syncState;
|
219
|
-
}),
|
220
|
-
};
|
221
|
-
});
|
222
|
-
// TODO how to handle errors gracefully
|
223
|
-
const makeApplyMutationItems = ({ stateRef, semaphore, }) => Effect.gen(function* () {
|
224
|
-
const leaderThreadCtx = yield* LeaderThreadCtx;
|
225
|
-
const { db, dbLog } = leaderThreadCtx;
|
226
|
-
const applyMutation = yield* makeApplyMutation;
|
227
|
-
return ({ batchItems }) => Effect.gen(function* () {
|
228
|
-
const state = yield* Ref.get(stateRef);
|
229
|
-
if (state._tag !== 'applying-syncstate-advance') {
|
230
|
-
// console.log('applyMutationItems: counter', counter)
|
231
|
-
return shouldNeverHappen(`Expected to be applying-syncstate-advance but got ${state._tag}`);
|
232
|
-
}
|
233
|
-
db.execute('BEGIN TRANSACTION', undefined); // Start the transaction
|
234
|
-
dbLog.execute('BEGIN TRANSACTION', undefined); // Start the transaction
|
235
|
-
yield* Effect.addFinalizer((exit) => Effect.gen(function* () {
|
236
|
-
if (Exit.isSuccess(exit))
|
237
|
-
return;
|
238
|
-
// Rollback in case of an error
|
239
|
-
db.execute('ROLLBACK', undefined);
|
240
|
-
dbLog.execute('ROLLBACK', undefined);
|
241
|
-
}));
|
242
|
-
for (let i = 0; i < batchItems.length; i++) {
|
243
|
-
const { meta, ...mutationEventEncoded } = batchItems[i];
|
244
|
-
yield* applyMutation(mutationEventEncoded);
|
245
|
-
if (meta?.deferred) {
|
246
|
-
yield* Deferred.succeed(meta.deferred, void 0);
|
247
|
-
}
|
248
|
-
// TODO re-introduce this
|
249
|
-
// if (i < batchItems.length - 1) {
|
250
|
-
// yield* Ref.set(stateRef, { ...state, proccesHead: batchItems[i + 1]!.id })
|
251
|
-
// }
|
252
|
-
}
|
253
|
-
db.execute('COMMIT', undefined); // Commit the transaction
|
254
|
-
dbLog.execute('COMMIT', undefined); // Commit the transaction
|
255
|
-
yield* Ref.set(stateRef, { _tag: 'in-sync', syncState: state.syncState });
|
256
|
-
// console.log('setRef:sync after applyMutationItems', counter)
|
257
|
-
yield* semaphore.release(1);
|
258
|
-
}).pipe(Effect.scoped, Effect.withSpan('@livestore/common:leader-thread:syncing:applyMutationItems'), Effect.tapCauseLogPretty, UnexpectedError.mapToUnexpectedError);
|
259
|
-
});
|
260
|
-
const backgroundBackendPulling = ({ dbReady, initialBackendHead, isLocalEvent, restartBackendPushing, span, stateRef, applyMutationItemsRef, semaphore, initialBlockingSyncContext, }) => Effect.gen(function* () {
|
261
|
-
const { syncBackend, db, dbLog, connectedClientSessionPullQueues, schema } = yield* LeaderThreadCtx;
|
262
|
-
if (syncBackend === undefined)
|
263
|
-
return;
|
264
|
-
const cursorInfo = yield* getCursorInfo(initialBackendHead);
|
265
|
-
const onNewPullChunk = (newEvents, remaining) => Effect.gen(function* () {
|
266
|
-
if (newEvents.length === 0)
|
267
|
-
return;
|
268
|
-
const state = yield* Ref.get(stateRef);
|
269
|
-
if (state._tag === 'init')
|
270
|
-
return shouldNeverHappen('Not initialized');
|
271
|
-
// const counter = state.counter + 1
|
272
|
-
if (state._tag === 'applying-syncstate-advance') {
|
273
|
-
if (state.origin === 'push') {
|
274
|
-
yield* Fiber.interrupt(state.fiber);
|
275
|
-
// In theory we should force-take the semaphore here, but as it's still taken,
|
276
|
-
// it's already in the right state we want it to be in
|
277
|
-
}
|
278
|
-
else {
|
279
|
-
// Wait for previous advance to finish
|
280
|
-
yield* semaphore.take(1);
|
281
|
-
}
|
282
|
-
}
|
283
|
-
const trimRollbackUntil = newEvents.at(-1).id;
|
284
|
-
const updateResult = SyncState.updateSyncState({
|
285
|
-
syncState: state.syncState,
|
286
|
-
payload: { _tag: 'upstream-advance', newEvents, trimRollbackUntil },
|
287
|
-
isLocalEvent,
|
288
|
-
isEqualEvent: MutationEvent.isEqualEncoded,
|
289
|
-
ignoreLocalEvents: true,
|
290
|
-
});
|
291
|
-
if (updateResult._tag === 'reject') {
|
292
|
-
return shouldNeverHappen('The leader thread should never reject upstream advances');
|
293
|
-
}
|
294
|
-
const newBackendHead = newEvents.at(-1).id;
|
295
|
-
updateBackendHead(dbLog, newBackendHead);
|
296
|
-
if (updateResult._tag === 'rebase') {
|
297
|
-
span?.addEvent('backend-pull:rebase', {
|
298
|
-
newEventsCount: newEvents.length,
|
299
|
-
newEvents: TRACE_VERBOSE ? JSON.stringify(newEvents) : undefined,
|
300
|
-
rollbackCount: updateResult.eventsToRollback.length,
|
301
|
-
updateResult: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
|
302
|
-
});
|
303
|
-
const filteredRebasedPending = updateResult.newSyncState.pending.filter((mutationEvent) => {
|
304
|
-
const mutationDef = schema.mutations.get(mutationEvent.mutation);
|
305
|
-
return mutationDef.options.localOnly === false;
|
306
|
-
});
|
307
|
-
yield* restartBackendPushing(filteredRebasedPending);
|
308
|
-
if (updateResult.eventsToRollback.length > 0) {
|
309
|
-
yield* rollback({ db, dbLog, eventIdsToRollback: updateResult.eventsToRollback.map((_) => _.id) });
|
310
|
-
}
|
311
|
-
yield* connectedClientSessionPullQueues.offer({
|
312
|
-
payload: {
|
313
|
-
_tag: 'upstream-rebase',
|
314
|
-
newEvents: updateResult.newEvents,
|
315
|
-
rollbackUntil: updateResult.eventsToRollback.at(0).id,
|
316
|
-
trimRollbackUntil,
|
317
|
-
},
|
318
|
-
remaining,
|
319
|
-
});
|
320
|
-
}
|
321
|
-
else {
|
322
|
-
span?.addEvent('backend-pull:advance', {
|
323
|
-
newEventsCount: newEvents.length,
|
324
|
-
updateResult: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
|
325
|
-
});
|
326
|
-
yield* connectedClientSessionPullQueues.offer({
|
327
|
-
payload: { _tag: 'upstream-advance', newEvents: updateResult.newEvents, trimRollbackUntil },
|
328
|
-
remaining,
|
329
|
-
});
|
330
|
-
}
|
331
|
-
trimChangesetRows(db, newBackendHead);
|
332
|
-
const fiber = yield* applyMutationItemsRef.current({ batchItems: updateResult.newEvents }).pipe(Effect.fork);
|
333
|
-
yield* Ref.set(stateRef, {
|
334
|
-
_tag: 'applying-syncstate-advance',
|
335
|
-
origin: 'pull',
|
336
|
-
syncState: updateResult.newSyncState,
|
337
|
-
fiber,
|
338
|
-
});
|
339
|
-
});
|
340
|
-
yield* syncBackend.pull(cursorInfo).pipe(
|
341
|
-
// TODO only take from queue while connected
|
342
|
-
Stream.tap(({ batch, remaining }) => Effect.gen(function* () {
|
343
|
-
// yield* Effect.spanEvent('batch', {
|
344
|
-
// attributes: {
|
345
|
-
// batchSize: batch.length,
|
346
|
-
// batch: TRACE_VERBOSE ? batch : undefined,
|
347
|
-
// },
|
348
|
-
// })
|
349
|
-
// Wait for the db to be initially created
|
350
|
-
yield* dbReady;
|
351
|
-
// NOTE we only want to take process mutations when the sync backend is connected
|
352
|
-
// (e.g. needed for simulating being offline)
|
353
|
-
// TODO remove when there's a better way to handle this in stream above
|
354
|
-
yield* SubscriptionRef.waitUntil(syncBackend.isConnected, (isConnected) => isConnected === true);
|
355
|
-
yield* onNewPullChunk(batch.map((_) => MutationEvent.EncodedWithMeta.fromGlobal(_.mutationEventEncoded)), remaining);
|
356
|
-
yield* initialBlockingSyncContext.update({ processed: batch.length, remaining });
|
357
|
-
})), Stream.runDrain, Effect.interruptible);
|
358
|
-
}).pipe(Effect.withSpan('@livestore/common:leader-thread:syncing:backend-pulling'));
|
359
|
-
const rollback = ({ db, dbLog, eventIdsToRollback, }) => Effect.gen(function* () {
|
360
|
-
const rollbackEvents = db
|
361
|
-
.select(sql `SELECT * FROM ${SESSION_CHANGESET_META_TABLE} WHERE (idGlobal, idLocal) IN (${eventIdsToRollback.map((id) => `(${id.global}, ${id.local})`).join(', ')})`)
|
362
|
-
.map((_) => ({ id: { global: _.idGlobal, local: _.idLocal }, changeset: _.changeset, debug: _.debug }))
|
363
|
-
.toSorted((a, b) => EventId.compare(a.id, b.id));
|
364
|
-
// Apply changesets in reverse order
|
365
|
-
for (let i = rollbackEvents.length - 1; i >= 0; i--) {
|
366
|
-
const { changeset } = rollbackEvents[i];
|
367
|
-
if (changeset !== null) {
|
368
|
-
db.makeChangeset(changeset).invert().apply();
|
369
|
-
}
|
370
|
-
}
|
371
|
-
// Delete the changeset rows
|
372
|
-
db.execute(sql `DELETE FROM ${SESSION_CHANGESET_META_TABLE} WHERE (idGlobal, idLocal) IN (${eventIdsToRollback.map((id) => `(${id.global}, ${id.local})`).join(', ')})`);
|
373
|
-
// Delete the mutation log rows
|
374
|
-
dbLog.execute(sql `DELETE FROM ${MUTATION_LOG_META_TABLE} WHERE (idGlobal, idLocal) IN (${eventIdsToRollback.map((id) => `(${id.global}, ${id.local})`).join(', ')})`);
|
375
|
-
}).pipe(Effect.withSpan('@livestore/common:leader-thread:syncing:rollback', {
|
376
|
-
attributes: { count: eventIdsToRollback.length },
|
377
|
-
}));
|
378
|
-
const getCursorInfo = (remoteHead) => Effect.gen(function* () {
|
379
|
-
const { dbLog } = yield* LeaderThreadCtx;
|
380
|
-
if (remoteHead === EventId.ROOT.global)
|
381
|
-
return Option.none();
|
382
|
-
const MutationlogQuerySchema = Schema.Struct({
|
383
|
-
syncMetadataJson: Schema.parseJson(Schema.Option(Schema.JsonValue)),
|
384
|
-
}).pipe(Schema.pluck('syncMetadataJson'), Schema.Array, Schema.head);
|
385
|
-
const syncMetadataOption = yield* Effect.sync(() => dbLog.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);
|
386
|
-
return Option.some({
|
387
|
-
cursor: { global: remoteHead, local: EventId.localDefault },
|
388
|
-
metadata: syncMetadataOption,
|
389
|
-
});
|
390
|
-
}).pipe(Effect.withSpan('@livestore/common:leader-thread:syncing:getCursorInfo', { attributes: { remoteHead } }));
|
391
|
-
const backgroundBackendPushing = ({ dbReady, syncBackendQueue, span, }) => Effect.gen(function* () {
|
392
|
-
const { syncBackend, dbLog } = yield* LeaderThreadCtx;
|
393
|
-
if (syncBackend === undefined)
|
394
|
-
return;
|
395
|
-
yield* dbReady;
|
396
|
-
while (true) {
|
397
|
-
yield* SubscriptionRef.waitUntil(syncBackend.isConnected, (isConnected) => isConnected === true);
|
398
|
-
// TODO make batch size configurable
|
399
|
-
const queueItems = yield* BucketQueue.takeBetween(syncBackendQueue, 1, 50);
|
400
|
-
yield* SubscriptionRef.waitUntil(syncBackend.isConnected, (isConnected) => isConnected === true);
|
401
|
-
span?.addEvent('backend-push', {
|
402
|
-
batchSize: queueItems.length,
|
403
|
-
batch: TRACE_VERBOSE ? JSON.stringify(queueItems) : undefined,
|
404
|
-
});
|
405
|
-
// TODO handle push errors (should only happen during concurrent pull+push)
|
406
|
-
const pushResult = yield* syncBackend.push(queueItems.map((_) => _.toGlobal())).pipe(Effect.either);
|
407
|
-
if (pushResult._tag === 'Left') {
|
408
|
-
span?.addEvent('backend-push-error', { error: pushResult.left.toString() });
|
409
|
-
// wait for interrupt and restarting of pushing
|
410
|
-
return yield* Effect.never;
|
411
|
-
}
|
412
|
-
const { metadata } = pushResult.right;
|
413
|
-
// TODO try to do this in a single query
|
414
|
-
for (let i = 0; i < queueItems.length; i++) {
|
415
|
-
const mutationEventEncoded = queueItems[i];
|
416
|
-
yield* execSql(dbLog, ...updateRows({
|
417
|
-
tableName: MUTATION_LOG_META_TABLE,
|
418
|
-
columns: mutationLogMetaTable.sqliteDef.columns,
|
419
|
-
where: { idGlobal: mutationEventEncoded.id.global, idLocal: mutationEventEncoded.id.local },
|
420
|
-
updateValues: { syncMetadataJson: metadata[i] },
|
421
|
-
}));
|
422
|
-
}
|
423
|
-
}
|
424
|
-
}).pipe(Effect.interruptible, Effect.withSpan('@livestore/common:leader-thread:syncing:backend-pushing'));
|
425
|
-
const trimChangesetRows = (db, newHead) => {
|
426
|
-
// Since we're using the session changeset rows to query for the current head,
|
427
|
-
// we're keeping at least one row for the current head, and thus are using `<` instead of `<=`
|
428
|
-
db.execute(sql `DELETE FROM ${SESSION_CHANGESET_META_TABLE} WHERE idGlobal < ${newHead.global}`);
|
429
|
-
};
|
430
|
-
//# sourceMappingURL=leader-sync-processor.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"leader-sync-processor.js","sourceRoot":"","sources":["../../src/leader-thread/leader-sync-processor.ts"],"names":[],"mappings":"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"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"MutationEvent.test.d.ts","sourceRoot":"","sources":["../../src/schema/MutationEvent.test.ts"],"names":[],"mappings":""}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"MutationEvent.test.js","sourceRoot":"","sources":["../../src/schema/MutationEvent.test.ts"],"names":[],"mappings":""}
|
@@ -1,45 +0,0 @@
|
|
1
|
-
import type { Scope } from '@livestore/utils/effect';
|
2
|
-
import { Effect } from '@livestore/utils/effect';
|
3
|
-
import * as otel from '@opentelemetry/api';
|
4
|
-
import type { ClientSessionLeaderThreadProxy, UnexpectedError } from '../adapter-types.js';
|
5
|
-
import * as EventId from '../schema/EventId.js';
|
6
|
-
import { type LiveStoreSchema } from '../schema/mod.js';
|
7
|
-
import * as MutationEvent from '../schema/MutationEvent.js';
|
8
|
-
import type { SyncState } from './syncstate.js';
|
9
|
-
/**
|
10
|
-
* Rebase behaviour:
|
11
|
-
* - We continously pull mutations from the leader and apply them to the local store.
|
12
|
-
* - If there was a race condition (i.e. the leader and client session have both advacned),
|
13
|
-
* we'll need to rebase the local pending mutations on top of the leader's head.
|
14
|
-
* - The goal is to never block the UI, so we'll interrupt rebasing if a new mutations is pushed by the client session.
|
15
|
-
* - We also want to avoid "backwards-jumping" in the UI, so we'll transactionally apply a read model changes during a rebase.
|
16
|
-
* - We might need to make the rebase behaviour configurable e.g. to let users manually trigger a rebase
|
17
|
-
*/
|
18
|
-
export declare const makeClientSessionSyncProcessor: ({ schema, initialLeaderHead, pushToLeader, pullFromLeader, applyMutation, rollback, refreshTables, span, }: {
|
19
|
-
schema: LiveStoreSchema;
|
20
|
-
initialLeaderHead: EventId.EventId;
|
21
|
-
pushToLeader: (batch: ReadonlyArray<MutationEvent.AnyEncoded>) => void;
|
22
|
-
pullFromLeader: ClientSessionLeaderThreadProxy["mutations"]["pull"];
|
23
|
-
applyMutation: (mutationEventDecoded: MutationEvent.PartialAnyDecoded, options: {
|
24
|
-
otelContext: otel.Context;
|
25
|
-
withChangeset: boolean;
|
26
|
-
}) => {
|
27
|
-
writeTables: Set<string>;
|
28
|
-
sessionChangeset: Uint8Array | undefined;
|
29
|
-
};
|
30
|
-
rollback: (changeset: Uint8Array) => void;
|
31
|
-
refreshTables: (tables: Set<string>) => void;
|
32
|
-
span: otel.Span;
|
33
|
-
}) => ClientSessionSyncProcessor;
|
34
|
-
export interface ClientSessionSyncProcessor {
|
35
|
-
push: (batch: ReadonlyArray<MutationEvent.PartialAnyDecoded>, options: {
|
36
|
-
otelContext: otel.Context;
|
37
|
-
}) => {
|
38
|
-
writeTables: Set<string>;
|
39
|
-
};
|
40
|
-
boot: Effect.Effect<void, UnexpectedError, Scope.Scope>;
|
41
|
-
syncStateRef: {
|
42
|
-
current: SyncState;
|
43
|
-
};
|
44
|
-
}
|
45
|
-
//# sourceMappingURL=client-session-sync-processor.d.ts.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"client-session-sync-processor.d.ts","sourceRoot":"","sources":["../../src/sync/client-session-sync-processor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAkB,MAAM,yBAAyB,CAAA;AAChE,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE1C,OAAO,KAAK,EAAE,8BAA8B,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1F,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAA;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAG/C;;;;;;;;GAQG;AACH,eAAO,MAAM,8BAA8B,+GASxC;IACD,MAAM,EAAE,eAAe,CAAA;IACvB,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAA;IAClC,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,IAAI,CAAA;IACtE,cAAc,EAAE,8BAA8B,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;IACnE,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;IAE5C,IAAI,EAAE,IAAI,CAAC,IAAI,CAAA;CAChB,KAAG,0BAoJH,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"}
|