@livestore/common 0.0.0-snapshot-f6ec49b1a18859aad769f0a0d8edf8bae231ed07 → 0.0.0-snapshot-2ef046b02334f52613d31dbe06af53487685edc0
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/adapter-types.d.ts +7 -12
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +1 -7
- package/dist/adapter-types.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +21 -21
- package/dist/devtools/devtools-messages-common.d.ts +13 -6
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +6 -0
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +25 -25
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +1 -2
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +16 -6
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +227 -215
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/apply-mutation.d.ts +14 -9
- package/dist/leader-thread/apply-mutation.d.ts.map +1 -1
- package/dist/leader-thread/apply-mutation.js +43 -36
- package/dist/leader-thread/apply-mutation.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +2 -5
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +22 -33
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/mod.d.ts +1 -1
- package/dist/leader-thread/mod.d.ts.map +1 -1
- package/dist/leader-thread/mod.js +1 -1
- package/dist/leader-thread/mod.js.map +1 -1
- package/dist/leader-thread/mutationlog.d.ts +20 -3
- package/dist/leader-thread/mutationlog.d.ts.map +1 -1
- package/dist/leader-thread/mutationlog.js +106 -12
- package/dist/leader-thread/mutationlog.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +4 -3
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/types.d.ts +35 -19
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/rehydrate-from-mutationlog.d.ts +5 -4
- package/dist/rehydrate-from-mutationlog.d.ts.map +1 -1
- package/dist/rehydrate-from-mutationlog.js +7 -9
- package/dist/rehydrate-from-mutationlog.js.map +1 -1
- package/dist/schema/EventId.d.ts +4 -0
- package/dist/schema/EventId.d.ts.map +1 -1
- package/dist/schema/EventId.js +7 -1
- package/dist/schema/EventId.js.map +1 -1
- package/dist/schema/MutationEvent.d.ts +87 -18
- package/dist/schema/MutationEvent.d.ts.map +1 -1
- package/dist/schema/MutationEvent.js +35 -6
- package/dist/schema/MutationEvent.js.map +1 -1
- package/dist/schema/schema.js +1 -1
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/system-tables.d.ts +67 -0
- package/dist/schema/system-tables.d.ts.map +1 -1
- package/dist/schema/system-tables.js +12 -1
- package/dist/schema/system-tables.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +11 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +54 -47
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/sync.d.ts +16 -5
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +81 -83
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +159 -125
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +97 -138
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/src/adapter-types.ts +5 -12
- package/src/devtools/devtools-messages-common.ts +9 -0
- package/src/devtools/devtools-messages-leader.ts +1 -2
- package/src/leader-thread/LeaderSyncProcessor.ts +398 -370
- package/src/leader-thread/apply-mutation.ts +81 -71
- package/src/leader-thread/leader-worker-devtools.ts +3 -8
- package/src/leader-thread/make-leader-thread-layer.ts +27 -41
- package/src/leader-thread/mod.ts +1 -1
- package/src/leader-thread/mutationlog.ts +167 -13
- package/src/leader-thread/recreate-db.ts +4 -3
- package/src/leader-thread/types.ts +34 -23
- package/src/rehydrate-from-mutationlog.ts +12 -12
- package/src/schema/EventId.ts +8 -1
- package/src/schema/MutationEvent.ts +42 -10
- package/src/schema/schema.ts +1 -1
- package/src/schema/system-tables.ts +20 -1
- package/src/sync/ClientSessionSyncProcessor.ts +64 -50
- package/src/sync/sync.ts +16 -9
- package/src/sync/syncstate.test.ts +173 -217
- package/src/sync/syncstate.ts +184 -151
- package/src/version.ts +1 -1
- package/dist/leader-thread/pull-queue-set.d.ts +0 -7
- package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
- package/dist/leader-thread/pull-queue-set.js +0 -48
- package/dist/leader-thread/pull-queue-set.js.map +0 -1
- package/src/leader-thread/pull-queue-set.ts +0 -67
|
@@ -2,8 +2,9 @@ import { LS_DEV, shouldNeverHappen, TRACE_VERBOSE } from '@livestore/utils';
|
|
|
2
2
|
import { BucketQueue, Effect, FiberHandle, Queue, Schema, Stream, Subscribable } from '@livestore/utils/effect';
|
|
3
3
|
import * as otel from '@opentelemetry/api';
|
|
4
4
|
import * as EventId from '../schema/EventId.js';
|
|
5
|
-
import { getMutationDef } from '../schema/mod.js';
|
|
5
|
+
import { getMutationDef, LEADER_MERGE_COUNTER_TABLE } from '../schema/mod.js';
|
|
6
6
|
import * as MutationEvent from '../schema/MutationEvent.js';
|
|
7
|
+
import { sql } from '../util.js';
|
|
7
8
|
import * as SyncState from './syncstate.js';
|
|
8
9
|
/**
|
|
9
10
|
* Rebase behaviour:
|
|
@@ -13,56 +14,59 @@ import * as SyncState from './syncstate.js';
|
|
|
13
14
|
* - The goal is to never block the UI, so we'll interrupt rebasing if a new mutations is pushed by the client session.
|
|
14
15
|
* - We also want to avoid "backwards-jumping" in the UI, so we'll transactionally apply a read model changes during a rebase.
|
|
15
16
|
* - We might need to make the rebase behaviour configurable e.g. to let users manually trigger a rebase
|
|
17
|
+
*
|
|
18
|
+
* Longer term we should evalutate whether we can unify the ClientSessionSyncProcessor with the LeaderSyncProcessor.
|
|
16
19
|
*/
|
|
17
20
|
export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime, applyMutation, rollback, refreshTables, span, params, confirmUnsavedChanges, }) => {
|
|
18
21
|
const mutationEventSchema = MutationEvent.makeMutationEventSchemaMemo(schema);
|
|
19
22
|
const syncStateRef = {
|
|
23
|
+
// The initial state is identical to the leader's initial state
|
|
20
24
|
current: new SyncState.SyncState({
|
|
21
25
|
localHead: clientSession.leaderThread.initialState.leaderHead,
|
|
22
26
|
upstreamHead: clientSession.leaderThread.initialState.leaderHead,
|
|
27
|
+
// Given we're starting with the leader's snapshot, we don't have any pending mutations intially
|
|
23
28
|
pending: [],
|
|
24
|
-
// TODO init rollbackTail from leader to be ready for backend rebasing
|
|
25
|
-
rollbackTail: [],
|
|
26
29
|
}),
|
|
27
30
|
};
|
|
28
31
|
const syncStateUpdateQueue = Queue.unbounded().pipe(Effect.runSync);
|
|
29
|
-
const
|
|
32
|
+
const isClientEvent = (mutationEventEncoded) => getMutationDef(schema, mutationEventEncoded.mutation).options.clientOnly;
|
|
30
33
|
/** We're queuing push requests to reduce the number of messages sent to the leader by batching them */
|
|
31
34
|
const leaderPushQueue = BucketQueue.make().pipe(Effect.runSync);
|
|
32
35
|
const push = (batch, { otelContext }) => {
|
|
33
36
|
// TODO validate batch
|
|
34
37
|
let baseEventId = syncStateRef.current.localHead;
|
|
35
|
-
const encodedMutationEvents = batch.map((
|
|
36
|
-
const mutationDef = getMutationDef(schema,
|
|
38
|
+
const encodedMutationEvents = batch.map(({ mutation, args }) => {
|
|
39
|
+
const mutationDef = getMutationDef(schema, mutation);
|
|
37
40
|
const nextIdPair = EventId.nextPair(baseEventId, mutationDef.options.clientOnly);
|
|
38
41
|
baseEventId = nextIdPair.id;
|
|
39
42
|
return new MutationEvent.EncodedWithMeta(Schema.encodeUnknownSync(mutationEventSchema)({
|
|
40
|
-
|
|
43
|
+
mutation,
|
|
44
|
+
args,
|
|
41
45
|
...nextIdPair,
|
|
42
46
|
clientId: clientSession.clientId,
|
|
43
47
|
sessionId: clientSession.sessionId,
|
|
44
48
|
}));
|
|
45
49
|
});
|
|
46
|
-
const
|
|
50
|
+
const mergeResult = SyncState.merge({
|
|
47
51
|
syncState: syncStateRef.current,
|
|
48
52
|
payload: { _tag: 'local-push', newEvents: encodedMutationEvents },
|
|
49
|
-
|
|
53
|
+
isClientEvent,
|
|
50
54
|
isEqualEvent: MutationEvent.isEqualEncoded,
|
|
51
55
|
});
|
|
52
|
-
if (
|
|
53
|
-
return shouldNeverHappen('Unexpected error in client-session-sync-processor',
|
|
56
|
+
if (mergeResult._tag === 'unexpected-error') {
|
|
57
|
+
return shouldNeverHappen('Unexpected error in client-session-sync-processor', mergeResult.cause);
|
|
54
58
|
}
|
|
55
59
|
span.addEvent('local-push', {
|
|
56
60
|
batchSize: encodedMutationEvents.length,
|
|
57
|
-
|
|
61
|
+
mergeResult: TRACE_VERBOSE ? JSON.stringify(mergeResult) : undefined,
|
|
58
62
|
});
|
|
59
|
-
if (
|
|
60
|
-
return shouldNeverHappen(`Expected advance, got ${
|
|
63
|
+
if (mergeResult._tag !== 'advance') {
|
|
64
|
+
return shouldNeverHappen(`Expected advance, got ${mergeResult._tag}`);
|
|
61
65
|
}
|
|
62
|
-
syncStateRef.current =
|
|
63
|
-
syncStateUpdateQueue.offer(
|
|
66
|
+
syncStateRef.current = mergeResult.newSyncState;
|
|
67
|
+
syncStateUpdateQueue.offer(mergeResult.newSyncState).pipe(Effect.runSync);
|
|
64
68
|
const writeTables = new Set();
|
|
65
|
-
for (const mutationEvent of
|
|
69
|
+
for (const mutationEvent of mergeResult.newEvents) {
|
|
66
70
|
// TODO avoid encoding and decoding here again
|
|
67
71
|
const decodedMutationEvent = Schema.decodeSync(mutationEventSchema)(mutationEvent);
|
|
68
72
|
const res = applyMutation(decodedMutationEvent, { otelContext, withChangeset: true });
|
|
@@ -101,33 +105,35 @@ export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime,
|
|
|
101
105
|
}));
|
|
102
106
|
}).pipe(Effect.forever, Effect.interruptible, Effect.tapCauseLogPretty);
|
|
103
107
|
yield* FiberHandle.run(leaderPushingFiberHandle, backgroundLeaderPushing);
|
|
104
|
-
|
|
105
|
-
|
|
108
|
+
const getMergeCounter = () => clientSession.sqliteDb.select(sql `SELECT mergeCounter FROM ${LEADER_MERGE_COUNTER_TABLE} WHERE id = 0`)[0]?.mergeCounter ?? 0;
|
|
109
|
+
// NOTE We need to lazily call `.pull` as we want the cursor to be updated
|
|
110
|
+
yield* Stream.suspend(() => clientSession.leaderThread.mutations.pull({ cursor: getMergeCounter() })).pipe(Stream.tap(({ payload, mergeCounter: leaderMergeCounter }) => Effect.gen(function* () {
|
|
111
|
+
// yield* Effect.logDebug('ClientSessionSyncProcessor:pull', payload)
|
|
106
112
|
if (clientSession.devtools.enabled) {
|
|
107
113
|
yield* clientSession.devtools.pullLatch.await;
|
|
108
114
|
}
|
|
109
|
-
const
|
|
115
|
+
const mergeResult = SyncState.merge({
|
|
110
116
|
syncState: syncStateRef.current,
|
|
111
117
|
payload,
|
|
112
|
-
|
|
118
|
+
isClientEvent,
|
|
113
119
|
isEqualEvent: MutationEvent.isEqualEncoded,
|
|
114
120
|
});
|
|
115
|
-
if (
|
|
116
|
-
return yield* Effect.fail(
|
|
121
|
+
if (mergeResult._tag === 'unexpected-error') {
|
|
122
|
+
return yield* Effect.fail(mergeResult.cause);
|
|
117
123
|
}
|
|
118
|
-
else if (
|
|
119
|
-
return shouldNeverHappen('Unexpected reject in client-session-sync-processor',
|
|
124
|
+
else if (mergeResult._tag === 'reject') {
|
|
125
|
+
return shouldNeverHappen('Unexpected reject in client-session-sync-processor', mergeResult);
|
|
120
126
|
}
|
|
121
|
-
syncStateRef.current =
|
|
122
|
-
syncStateUpdateQueue.offer(
|
|
123
|
-
if (
|
|
124
|
-
span.addEvent('pull:rebase', {
|
|
127
|
+
syncStateRef.current = mergeResult.newSyncState;
|
|
128
|
+
syncStateUpdateQueue.offer(mergeResult.newSyncState).pipe(Effect.runSync);
|
|
129
|
+
if (mergeResult._tag === 'rebase') {
|
|
130
|
+
span.addEvent('merge:pull:rebase', {
|
|
125
131
|
payloadTag: payload._tag,
|
|
126
132
|
payload: TRACE_VERBOSE ? JSON.stringify(payload) : undefined,
|
|
127
|
-
newEventsCount:
|
|
128
|
-
rollbackCount:
|
|
129
|
-
res: TRACE_VERBOSE ? JSON.stringify(
|
|
130
|
-
|
|
133
|
+
newEventsCount: mergeResult.newEvents.length,
|
|
134
|
+
rollbackCount: mergeResult.rollbackEvents.length,
|
|
135
|
+
res: TRACE_VERBOSE ? JSON.stringify(mergeResult) : undefined,
|
|
136
|
+
leaderMergeCounter,
|
|
131
137
|
});
|
|
132
138
|
debugInfo.rebaseCount++;
|
|
133
139
|
yield* FiberHandle.clear(leaderPushingFiberHandle);
|
|
@@ -135,31 +141,32 @@ export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime,
|
|
|
135
141
|
yield* BucketQueue.clear(leaderPushQueue);
|
|
136
142
|
yield* FiberHandle.run(leaderPushingFiberHandle, backgroundLeaderPushing);
|
|
137
143
|
if (LS_DEV) {
|
|
138
|
-
Effect.logDebug('pull:rebase: rollback',
|
|
144
|
+
Effect.logDebug('merge:pull:rebase: rollback', mergeResult.rollbackEvents.length, ...mergeResult.rollbackEvents.slice(0, 10).map((_) => _.toJSON()), { leaderMergeCounter }).pipe(Effect.provide(runtime), Effect.runSync);
|
|
139
145
|
}
|
|
140
|
-
for (let i =
|
|
141
|
-
const event =
|
|
142
|
-
if (event.meta.sessionChangeset) {
|
|
143
|
-
rollback(event.meta.sessionChangeset);
|
|
144
|
-
event.meta.sessionChangeset =
|
|
146
|
+
for (let i = mergeResult.rollbackEvents.length - 1; i >= 0; i--) {
|
|
147
|
+
const event = mergeResult.rollbackEvents[i];
|
|
148
|
+
if (event.meta.sessionChangeset._tag !== 'no-op' && event.meta.sessionChangeset._tag !== 'unset') {
|
|
149
|
+
rollback(event.meta.sessionChangeset.data);
|
|
150
|
+
event.meta.sessionChangeset = { _tag: 'unset' };
|
|
145
151
|
}
|
|
146
152
|
}
|
|
147
|
-
yield* BucketQueue.offerAll(leaderPushQueue,
|
|
153
|
+
yield* BucketQueue.offerAll(leaderPushQueue, mergeResult.newSyncState.pending);
|
|
148
154
|
}
|
|
149
155
|
else {
|
|
150
|
-
span.addEvent('pull:advance', {
|
|
156
|
+
span.addEvent('merge:pull:advance', {
|
|
151
157
|
payloadTag: payload._tag,
|
|
152
158
|
payload: TRACE_VERBOSE ? JSON.stringify(payload) : undefined,
|
|
153
|
-
newEventsCount:
|
|
154
|
-
res: TRACE_VERBOSE ? JSON.stringify(
|
|
155
|
-
|
|
159
|
+
newEventsCount: mergeResult.newEvents.length,
|
|
160
|
+
res: TRACE_VERBOSE ? JSON.stringify(mergeResult) : undefined,
|
|
161
|
+
leaderMergeCounter,
|
|
156
162
|
});
|
|
157
163
|
debugInfo.advanceCount++;
|
|
158
164
|
}
|
|
159
|
-
if (
|
|
165
|
+
if (mergeResult.newEvents.length === 0)
|
|
160
166
|
return;
|
|
161
167
|
const writeTables = new Set();
|
|
162
|
-
for (const mutationEvent of
|
|
168
|
+
for (const mutationEvent of mergeResult.newEvents) {
|
|
169
|
+
// TODO apply changeset if available (will require tracking of write tables as well)
|
|
163
170
|
const decodedMutationEvent = Schema.decodeSync(mutationEventSchema)(mutationEvent);
|
|
164
171
|
const res = applyMutation(decodedMutationEvent, { otelContext, withChangeset: true });
|
|
165
172
|
for (const table of res.writeTables) {
|
|
@@ -169,7 +176,7 @@ export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime,
|
|
|
169
176
|
}
|
|
170
177
|
refreshTables(writeTables);
|
|
171
178
|
}).pipe(Effect.tapCauseLogPretty, Effect.catchAllCause((cause) => Effect.sync(() => clientSession.shutdown(cause))))), Stream.runDrain, Effect.forever, // NOTE Whenever the leader changes, we need to re-start the stream
|
|
172
|
-
Effect.withSpan('client-session-sync-processor:pull'), Effect.tapCauseLogPretty, Effect.forkScoped);
|
|
179
|
+
Effect.interruptible, Effect.withSpan('client-session-sync-processor:pull'), Effect.tapCauseLogPretty, Effect.forkScoped);
|
|
173
180
|
});
|
|
174
181
|
return {
|
|
175
182
|
push,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClientSessionSyncProcessor.js","sourceRoot":"","sources":["../../src/sync/ClientSessionSyncProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAE3E,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC/G,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAG1C,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAwB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"ClientSessionSyncProcessor.js","sourceRoot":"","sources":["../../src/sync/ClientSessionSyncProcessor.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/sync.d.ts
CHANGED
|
@@ -16,9 +16,23 @@ export type SyncOptions = {
|
|
|
16
16
|
backend?: SyncBackendConstructor<any>;
|
|
17
17
|
/** @default { _tag: 'Skip' } */
|
|
18
18
|
initialSyncOptions?: InitialSyncOptions;
|
|
19
|
+
/**
|
|
20
|
+
* What to do if there is an error during sync.
|
|
21
|
+
*
|
|
22
|
+
* Options:
|
|
23
|
+
* `shutdown` will stop the sync processor and cause the app to crash.
|
|
24
|
+
* `ignore` will log the error and let the app continue running acting as if it was offline.
|
|
25
|
+
*
|
|
26
|
+
* @default 'ignore'
|
|
27
|
+
* */
|
|
28
|
+
onSyncError?: 'shutdown' | 'ignore';
|
|
19
29
|
};
|
|
20
30
|
export type SyncBackendConstructor<TSyncMetadata = Schema.JsonValue> = (args: MakeBackendArgs) => Effect.Effect<SyncBackend<TSyncMetadata>, UnexpectedError, Scope.Scope | HttpClient.HttpClient>;
|
|
21
31
|
export type SyncBackend<TSyncMetadata = Schema.JsonValue> = {
|
|
32
|
+
/**
|
|
33
|
+
* Can be implemented to prepare a connection to the sync backend to speed up the first pull/push.
|
|
34
|
+
*/
|
|
35
|
+
connect: Effect.Effect<void, IsOfflineError | UnexpectedError, HttpClient.HttpClient | Scope.Scope>;
|
|
22
36
|
pull: (args: Option.Option<{
|
|
23
37
|
cursor: EventId.EventId;
|
|
24
38
|
metadata: Option.Option<TSyncMetadata>;
|
|
@@ -35,13 +49,10 @@ export type SyncBackend<TSyncMetadata = Schema.JsonValue> = {
|
|
|
35
49
|
* - Number of events: 1-100
|
|
36
50
|
* - event ids must be in ascending order
|
|
37
51
|
* */
|
|
38
|
-
batch: ReadonlyArray<MutationEvent.AnyEncodedGlobal>) => Effect.Effect<
|
|
39
|
-
/** Indexes are relative to `batch` */
|
|
40
|
-
metadata: ReadonlyArray<Option.Option<TSyncMetadata>>;
|
|
41
|
-
}, IsOfflineError | InvalidPushError, HttpClient.HttpClient>;
|
|
52
|
+
batch: ReadonlyArray<MutationEvent.AnyEncodedGlobal>) => Effect.Effect<void, IsOfflineError | InvalidPushError, HttpClient.HttpClient>;
|
|
42
53
|
isConnected: SubscriptionRef.SubscriptionRef<boolean>;
|
|
43
54
|
/**
|
|
44
|
-
* Metadata describing the sync backend.
|
|
55
|
+
* Metadata describing the sync backend. (Currently only used by devtools.)
|
|
45
56
|
*/
|
|
46
57
|
metadata: {
|
|
47
58
|
name: string;
|
package/dist/sync/sync.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzG,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAA;AAC/C,OAAO,KAAK,KAAK,aAAa,MAAM,4BAA4B,CAAA;AAEhE;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAA;CACtC,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,EAAE,sBAAsB,CAAC,GAAG,CAAC,CAAA;IACrC,gCAAgC;IAChC,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzG,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAA;AAC/C,OAAO,KAAK,KAAK,aAAa,MAAM,4BAA4B,CAAA;AAEhE;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAA;CACtC,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,EAAE,sBAAsB,CAAC,GAAG,CAAC,CAAA;IACrC,gCAAgC;IAChC,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC;;;;;;;;SAQK;IACL,WAAW,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,sBAAsB,CAAC,aAAa,GAAG,MAAM,CAAC,SAAS,IAAI,CACrE,IAAI,EAAE,eAAe,KAClB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,CAAA;AAEpG,MAAM,MAAM,WAAW,CAAC,aAAa,GAAG,MAAM,CAAC,SAAS,IAAI;IAC1D;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,eAAe,EAAE,UAAU,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;IACnG,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC,OAAO,CAAA;QACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;KACvC,CAAC,KACC,MAAM,CAAC,MAAM,CAChB;QACE,KAAK,EAAE,aAAa,CAAC;YACnB,oBAAoB,EAAE,aAAa,CAAC,gBAAgB,CAAA;YACpD,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;SACvC,CAAC,CAAA;QACF,SAAS,EAAE,MAAM,CAAA;KAClB,EACD,cAAc,GAAG,gBAAgB,EACjC,UAAU,CAAC,UAAU,CACtB,CAAA;IAED,IAAI,EAAE;IACJ;;;;SAIK;IACL,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,gBAAgB,CAAC,KACjD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB,EAAE,UAAU,CAAC,UAAU,CAAC,CAAA;IAClF,WAAW,EAAE,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IACrD;;OAEG;IACH,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;CACnF,CAAA;;;;AAED,qBAAa,cAAe,SAAQ,mBAA0D;CAAG;;;;;;;;;;;AAEjG,qBAAa,gBAAiB,SAAQ,qBAUpC;CAAG;;;;;;AAEL,qBAAa,gBAAiB,SAAQ,qBAEpC;CAAG;;;;;;;;;;;;;AAEL,qBAAa,gBAAiB,SAAQ,qBAKpC;CAAG"}
|
package/dist/sync/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAIhD,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAIhD,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAA;AAqE/C,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,WAAW,EAAkB,CAAC,gBAAgB,EAAE,EAAE,CAAC;CAAG;AAEjG,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,MAAM,EAAE,MAAM,CAAC,KAAK,CAClB,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE;QAChC,OAAO,EAAE,MAAM,CAAC,MAAM;KACvB,CAAC,EACF,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE;QACjC,iBAAiB,EAAE,MAAM,CAAC,MAAM;QAChC,UAAU,EAAE,MAAM,CAAC,MAAM;KAC1B,CAAC,CACH;CACF,CAAC;CAAG;AAEL,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AAEL,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAoB,CAAC,kBAAkB,EAAE;IAC/F,iBAAiB,EAAE,OAAO,CAAC,OAAO;IAClC,UAAU,EAAE,OAAO,CAAC,OAAO;IAC3B,4EAA4E;IAC5E,iCAAiC;CAClC,CAAC;CAAG"}
|
package/dist/sync/syncstate.d.ts
CHANGED
|
@@ -3,22 +3,24 @@ import { UnexpectedError } from '../adapter-types.js';
|
|
|
3
3
|
import * as MutationEvent from '../schema/MutationEvent.js';
|
|
4
4
|
declare const SyncState_base: Schema.Class<SyncState, {
|
|
5
5
|
pending: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
|
6
|
-
|
|
6
|
+
/** What this node expects the next upstream node to have as its own local head */
|
|
7
7
|
upstreamHead: Schema.Struct<{
|
|
8
8
|
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
|
|
9
9
|
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventId">, number, never>;
|
|
10
10
|
}>;
|
|
11
|
+
/** Equivalent to `pending.at(-1)?.id` if there are pending events */
|
|
11
12
|
localHead: Schema.Struct<{
|
|
12
13
|
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
|
|
13
14
|
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventId">, number, never>;
|
|
14
15
|
}>;
|
|
15
16
|
}, Schema.Struct.Encoded<{
|
|
16
17
|
pending: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
|
17
|
-
|
|
18
|
+
/** What this node expects the next upstream node to have as its own local head */
|
|
18
19
|
upstreamHead: Schema.Struct<{
|
|
19
20
|
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
|
|
20
21
|
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventId">, number, never>;
|
|
21
22
|
}>;
|
|
23
|
+
/** Equivalent to `pending.at(-1)?.id` if there are pending events */
|
|
22
24
|
localHead: Schema.Struct<{
|
|
23
25
|
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
|
|
24
26
|
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventId">, number, never>;
|
|
@@ -35,69 +37,60 @@ declare const SyncState_base: Schema.Class<SyncState, {
|
|
|
35
37
|
readonly global: number & import("effect/Brand").Brand<"GlobalEventId">;
|
|
36
38
|
readonly client: number & import("effect/Brand").Brand<"ClientEventId">;
|
|
37
39
|
};
|
|
38
|
-
} & {
|
|
39
|
-
readonly rollbackTail: readonly MutationEvent.EncodedWithMeta[];
|
|
40
40
|
}, {}, {}>;
|
|
41
41
|
/**
|
|
42
42
|
* SyncState represents the current sync state of a sync node relative to an upstream node.
|
|
43
43
|
* Events flow from local to upstream, with each state maintaining its own event head.
|
|
44
44
|
*
|
|
45
|
-
*
|
|
45
|
+
* Example:
|
|
46
46
|
* ```
|
|
47
|
-
*
|
|
48
|
-
* |
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
47
|
+
* +------------------------+
|
|
48
|
+
* | PENDING EVENTS |
|
|
49
|
+
* +------------------------+
|
|
50
|
+
* ▼ ▼
|
|
51
|
+
* Upstream Head Local Head
|
|
52
|
+
* (1,0) (1,1), (1,2), (2,0)
|
|
53
53
|
* ```
|
|
54
54
|
*
|
|
55
|
-
*
|
|
56
|
-
* -
|
|
57
|
-
*
|
|
58
|
-
* - Subject to rebase if rejected.
|
|
59
|
-
* - **Rollback Tail**: Events that are kept around temporarily for potential rollback until confirmed by upstream.
|
|
55
|
+
* **Pending Events**: Events awaiting acknowledgment from the upstream.
|
|
56
|
+
* - Can be confirmed or rejected by the upstream.
|
|
57
|
+
* - Subject to rebase if rejected.
|
|
60
58
|
*
|
|
61
59
|
* Payloads:
|
|
62
60
|
* - `PayloadUpstreamRebase`: Upstream has performed a rebase, so downstream must roll back to the specified event
|
|
63
61
|
* and rebase the pending events on top of the new events.
|
|
64
62
|
* - `PayloadUpstreamAdvance`: Upstream has advanced, so downstream must rebase the pending events on top of the new events.
|
|
65
|
-
* - `PayloadUpstreamTrimRollbackTail`: Upstream has advanced, so downstream can trim the rollback tail.
|
|
66
63
|
* - `PayloadLocalPush`: Local push payload
|
|
67
64
|
*
|
|
68
65
|
* Invariants:
|
|
69
66
|
* 1. **Chain Continuity**: Each event must reference its immediate parent.
|
|
70
67
|
* 2. **Head Ordering**: Upstream Head ≤ Local Head.
|
|
71
|
-
* 3. **
|
|
68
|
+
* 3. **Event number sequence**: Must follow the pattern (1,0)→(1,1)→(1,2)→(2,0).
|
|
69
|
+
*
|
|
70
|
+
* A few further notes to help form an intuition:
|
|
71
|
+
* - The goal is to keep the pending events as small as possible (i.e. to have synced with the next upstream node)
|
|
72
|
+
* - There are 2 cases for rebasing:
|
|
73
|
+
* - The conflicting event only conflicts with the pending events -> only (some of) the pending events need to be rolled back
|
|
72
74
|
*
|
|
73
|
-
* The `
|
|
74
|
-
* handling cases such as upstream rebase, advance
|
|
75
|
+
* The `merge` function processes updates to the sync state based on incoming payloads,
|
|
76
|
+
* handling cases such as upstream rebase, advance and local push.
|
|
75
77
|
*/
|
|
76
78
|
export declare class SyncState extends SyncState_base {
|
|
77
79
|
toJSON: () => any;
|
|
78
80
|
}
|
|
79
81
|
declare const PayloadUpstreamRebase_base: Schema.TaggedStruct<"upstream-rebase", {
|
|
80
|
-
/**
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventId">, number, never>;
|
|
84
|
-
}>;
|
|
82
|
+
/** Events which need to be rolled back */
|
|
83
|
+
rollbackEvents: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
|
84
|
+
/** Events which need to be applied after the rollback (already rebased by the upstream node) */
|
|
85
85
|
newEvents: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
|
86
|
-
/** Trim rollback tail up to this event (inclusive). */
|
|
87
|
-
trimRollbackUntil: Schema.optional<Schema.Struct<{
|
|
88
|
-
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
|
|
89
|
-
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventId">, number, never>;
|
|
90
|
-
}>>;
|
|
91
86
|
}>;
|
|
87
|
+
/**
|
|
88
|
+
* This payload propagates a rebase from the upstream node
|
|
89
|
+
*/
|
|
92
90
|
export declare class PayloadUpstreamRebase extends PayloadUpstreamRebase_base {
|
|
93
91
|
}
|
|
94
92
|
declare const PayloadUpstreamAdvance_base: Schema.TaggedStruct<"upstream-advance", {
|
|
95
93
|
newEvents: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
|
96
|
-
/** Trim rollback tail up to this event (inclusive). */
|
|
97
|
-
trimRollbackUntil: Schema.optional<Schema.Struct<{
|
|
98
|
-
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
|
|
99
|
-
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventId">, number, never>;
|
|
100
|
-
}>>;
|
|
101
94
|
}>;
|
|
102
95
|
export declare class PayloadUpstreamAdvance extends PayloadUpstreamAdvance_base {
|
|
103
96
|
}
|
|
@@ -109,9 +102,10 @@ export declare class PayloadLocalPush extends PayloadLocalPush_base {
|
|
|
109
102
|
declare const Payload_base: Schema.Union<[typeof PayloadUpstreamRebase, typeof PayloadUpstreamAdvance, typeof PayloadLocalPush]>;
|
|
110
103
|
export declare class Payload extends Payload_base {
|
|
111
104
|
}
|
|
112
|
-
|
|
113
|
-
export
|
|
114
|
-
|
|
105
|
+
declare const PayloadUpstream_base: Schema.Union<[typeof PayloadUpstreamRebase, typeof PayloadUpstreamAdvance]>;
|
|
106
|
+
export declare class PayloadUpstream extends PayloadUpstream_base {
|
|
107
|
+
}
|
|
108
|
+
declare const MergeContext_base: Schema.Class<MergeContext, {
|
|
115
109
|
payload: typeof Payload;
|
|
116
110
|
syncState: typeof SyncState;
|
|
117
111
|
}, Schema.Struct.Encoded<{
|
|
@@ -120,22 +114,11 @@ declare const UpdateContext_base: Schema.Class<UpdateContext, {
|
|
|
120
114
|
}>, never, {
|
|
121
115
|
readonly payload: {
|
|
122
116
|
readonly _tag: "upstream-rebase";
|
|
123
|
-
readonly
|
|
124
|
-
readonly global: number & import("effect/Brand").Brand<"GlobalEventId">;
|
|
125
|
-
readonly client: number & import("effect/Brand").Brand<"ClientEventId">;
|
|
126
|
-
};
|
|
117
|
+
readonly rollbackEvents: readonly MutationEvent.EncodedWithMeta[];
|
|
127
118
|
readonly newEvents: readonly MutationEvent.EncodedWithMeta[];
|
|
128
|
-
readonly trimRollbackUntil?: {
|
|
129
|
-
readonly global: number & import("effect/Brand").Brand<"GlobalEventId">;
|
|
130
|
-
readonly client: number & import("effect/Brand").Brand<"ClientEventId">;
|
|
131
|
-
} | undefined;
|
|
132
119
|
} | {
|
|
133
120
|
readonly _tag: "upstream-advance";
|
|
134
121
|
readonly newEvents: readonly MutationEvent.EncodedWithMeta[];
|
|
135
|
-
readonly trimRollbackUntil?: {
|
|
136
|
-
readonly global: number & import("effect/Brand").Brand<"GlobalEventId">;
|
|
137
|
-
readonly client: number & import("effect/Brand").Brand<"ClientEventId">;
|
|
138
|
-
} | undefined;
|
|
139
122
|
} | {
|
|
140
123
|
readonly _tag: "local-push";
|
|
141
124
|
readonly newEvents: readonly MutationEvent.EncodedWithMeta[];
|
|
@@ -144,21 +127,23 @@ declare const UpdateContext_base: Schema.Class<UpdateContext, {
|
|
|
144
127
|
readonly syncState: SyncState;
|
|
145
128
|
}, {}, {}>;
|
|
146
129
|
/** Only used for debugging purposes */
|
|
147
|
-
export declare class
|
|
130
|
+
export declare class MergeContext extends MergeContext_base {
|
|
148
131
|
toJSON: () => any;
|
|
149
132
|
}
|
|
150
|
-
declare const
|
|
133
|
+
declare const MergeResultAdvance_base: Schema.Class<MergeResultAdvance, {
|
|
151
134
|
_tag: Schema.Literal<["advance"]>;
|
|
152
135
|
newSyncState: typeof SyncState;
|
|
153
|
-
/** Events which weren't pending before the update */
|
|
154
136
|
newEvents: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
|
155
|
-
|
|
137
|
+
/** Events which were previously pending but are now confirmed */
|
|
138
|
+
confirmedEvents: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
|
139
|
+
mergeContext: typeof MergeContext;
|
|
156
140
|
}, Schema.Struct.Encoded<{
|
|
157
141
|
_tag: Schema.Literal<["advance"]>;
|
|
158
142
|
newSyncState: typeof SyncState;
|
|
159
|
-
/** Events which weren't pending before the update */
|
|
160
143
|
newEvents: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
|
161
|
-
|
|
144
|
+
/** Events which were previously pending but are now confirmed */
|
|
145
|
+
confirmedEvents: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
|
146
|
+
mergeContext: typeof MergeContext;
|
|
162
147
|
}>, never, {
|
|
163
148
|
readonly _tag: "advance";
|
|
164
149
|
} & {
|
|
@@ -166,47 +151,49 @@ declare const UpdateResultAdvance_base: Schema.Class<UpdateResultAdvance, {
|
|
|
166
151
|
} & {
|
|
167
152
|
readonly newSyncState: SyncState;
|
|
168
153
|
} & {
|
|
169
|
-
readonly
|
|
154
|
+
readonly mergeContext: MergeContext;
|
|
155
|
+
} & {
|
|
156
|
+
readonly confirmedEvents: readonly MutationEvent.EncodedWithMeta[];
|
|
170
157
|
}, {}, {}>;
|
|
171
|
-
export declare class
|
|
158
|
+
export declare class MergeResultAdvance extends MergeResultAdvance_base {
|
|
172
159
|
toJSON: () => any;
|
|
173
160
|
}
|
|
174
|
-
declare const
|
|
161
|
+
declare const MergeResultRebase_base: Schema.Class<MergeResultRebase, {
|
|
175
162
|
_tag: Schema.Literal<["rebase"]>;
|
|
176
163
|
newSyncState: typeof SyncState;
|
|
177
|
-
/** Events which weren't pending before the update */
|
|
178
164
|
newEvents: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
|
179
|
-
|
|
180
|
-
|
|
165
|
+
/** Events which need to be rolled back */
|
|
166
|
+
rollbackEvents: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
|
167
|
+
mergeContext: typeof MergeContext;
|
|
181
168
|
}, Schema.Struct.Encoded<{
|
|
182
169
|
_tag: Schema.Literal<["rebase"]>;
|
|
183
170
|
newSyncState: typeof SyncState;
|
|
184
|
-
/** Events which weren't pending before the update */
|
|
185
171
|
newEvents: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
|
186
|
-
|
|
187
|
-
|
|
172
|
+
/** Events which need to be rolled back */
|
|
173
|
+
rollbackEvents: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
|
174
|
+
mergeContext: typeof MergeContext;
|
|
188
175
|
}>, never, {
|
|
189
176
|
readonly _tag: "rebase";
|
|
177
|
+
} & {
|
|
178
|
+
readonly rollbackEvents: readonly MutationEvent.EncodedWithMeta[];
|
|
190
179
|
} & {
|
|
191
180
|
readonly newEvents: readonly MutationEvent.EncodedWithMeta[];
|
|
192
181
|
} & {
|
|
193
182
|
readonly newSyncState: SyncState;
|
|
194
183
|
} & {
|
|
195
|
-
readonly
|
|
196
|
-
} & {
|
|
197
|
-
readonly eventsToRollback: readonly MutationEvent.EncodedWithMeta[];
|
|
184
|
+
readonly mergeContext: MergeContext;
|
|
198
185
|
}, {}, {}>;
|
|
199
|
-
export declare class
|
|
186
|
+
export declare class MergeResultRebase extends MergeResultRebase_base {
|
|
200
187
|
toJSON: () => any;
|
|
201
188
|
}
|
|
202
|
-
declare const
|
|
189
|
+
declare const MergeResultReject_base: Schema.Class<MergeResultReject, {
|
|
203
190
|
_tag: Schema.Literal<["reject"]>;
|
|
204
191
|
/** The minimum id that the new events must have */
|
|
205
192
|
expectedMinimumId: Schema.Struct<{
|
|
206
193
|
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
|
|
207
194
|
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventId">, number, never>;
|
|
208
195
|
}>;
|
|
209
|
-
|
|
196
|
+
mergeContext: typeof MergeContext;
|
|
210
197
|
}, Schema.Struct.Encoded<{
|
|
211
198
|
_tag: Schema.Literal<["reject"]>;
|
|
212
199
|
/** The minimum id that the new events must have */
|
|
@@ -214,21 +201,21 @@ declare const UpdateResultReject_base: Schema.Class<UpdateResultReject, {
|
|
|
214
201
|
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
|
|
215
202
|
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventId">, number, never>;
|
|
216
203
|
}>;
|
|
217
|
-
|
|
204
|
+
mergeContext: typeof MergeContext;
|
|
218
205
|
}>, never, {
|
|
219
206
|
readonly _tag: "reject";
|
|
220
207
|
} & {
|
|
221
|
-
readonly
|
|
208
|
+
readonly mergeContext: MergeContext;
|
|
222
209
|
} & {
|
|
223
210
|
readonly expectedMinimumId: {
|
|
224
211
|
readonly global: number & import("effect/Brand").Brand<"GlobalEventId">;
|
|
225
212
|
readonly client: number & import("effect/Brand").Brand<"ClientEventId">;
|
|
226
213
|
};
|
|
227
214
|
}, {}, {}>;
|
|
228
|
-
export declare class
|
|
215
|
+
export declare class MergeResultReject extends MergeResultReject_base {
|
|
229
216
|
toJSON: () => any;
|
|
230
217
|
}
|
|
231
|
-
declare const
|
|
218
|
+
declare const MergeResultUnexpectedError_base: Schema.Class<MergeResultUnexpectedError, {
|
|
232
219
|
_tag: Schema.Literal<["unexpected-error"]>;
|
|
233
220
|
cause: typeof UnexpectedError;
|
|
234
221
|
}, Schema.Struct.Encoded<{
|
|
@@ -239,18 +226,29 @@ declare const UpdateResultUnexpectedError_base: Schema.Class<UpdateResultUnexpec
|
|
|
239
226
|
} & {
|
|
240
227
|
readonly cause: UnexpectedError;
|
|
241
228
|
}, {}, {}>;
|
|
242
|
-
export declare class
|
|
229
|
+
export declare class MergeResultUnexpectedError extends MergeResultUnexpectedError_base {
|
|
243
230
|
}
|
|
244
|
-
declare const
|
|
245
|
-
export declare class
|
|
231
|
+
declare const MergeResult_base: Schema.Union<[typeof MergeResultAdvance, typeof MergeResultRebase, typeof MergeResultReject, typeof MergeResultUnexpectedError]>;
|
|
232
|
+
export declare class MergeResult extends MergeResult_base {
|
|
246
233
|
}
|
|
247
|
-
export declare const
|
|
234
|
+
export declare const merge: ({ syncState, payload, isClientEvent, isEqualEvent, ignoreClientEvents, }: {
|
|
248
235
|
syncState: SyncState;
|
|
249
236
|
payload: typeof Payload.Type;
|
|
250
|
-
|
|
237
|
+
isClientEvent: (event: MutationEvent.EncodedWithMeta) => boolean;
|
|
238
|
+
isEqualEvent: (a: MutationEvent.EncodedWithMeta, b: MutationEvent.EncodedWithMeta) => boolean;
|
|
239
|
+
/** This is used in the leader which should ignore client events when receiving an upstream-advance payload */
|
|
240
|
+
ignoreClientEvents?: boolean;
|
|
241
|
+
}) => typeof MergeResult.Type;
|
|
242
|
+
/**
|
|
243
|
+
* Gets the index relative to `existingEvents` where the divergence point is
|
|
244
|
+
* by comparing each event in `existingEvents` to the corresponding event in `incomingEvents`
|
|
245
|
+
*/
|
|
246
|
+
export declare const findDivergencePoint: ({ existingEvents, incomingEvents, isEqualEvent, isClientEvent, ignoreClientEvents, }: {
|
|
247
|
+
existingEvents: ReadonlyArray<MutationEvent.EncodedWithMeta>;
|
|
248
|
+
incomingEvents: ReadonlyArray<MutationEvent.EncodedWithMeta>;
|
|
251
249
|
isEqualEvent: (a: MutationEvent.EncodedWithMeta, b: MutationEvent.EncodedWithMeta) => boolean;
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
}) =>
|
|
250
|
+
isClientEvent: (event: MutationEvent.EncodedWithMeta) => boolean;
|
|
251
|
+
ignoreClientEvents: boolean;
|
|
252
|
+
}) => number;
|
|
255
253
|
export {};
|
|
256
254
|
//# sourceMappingURL=syncstate.d.ts.map
|