@livestore/common 0.3.0-dev.24 → 0.3.0-dev.26
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 +4 -2
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +1 -1
- 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 +6 -6
- package/dist/devtools/devtools-messages-leader.d.ts +24 -24
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +2 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +39 -37
- package/dist/leader-thread/LeaderSyncProcessor.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 +1 -0
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/mutationlog.d.ts +1 -0
- package/dist/leader-thread/mutationlog.d.ts.map +1 -1
- package/dist/leader-thread/mutationlog.js +1 -0
- package/dist/leader-thread/mutationlog.js.map +1 -1
- package/dist/schema/MutationEvent.d.ts +17 -1
- package/dist/schema/MutationEvent.d.ts.map +1 -1
- package/dist/schema/MutationEvent.js +18 -2
- package/dist/schema/MutationEvent.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +2 -0
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +36 -33
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/sync.d.ts +10 -0
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +38 -16
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +110 -40
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +60 -29
- 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 +4 -2
- package/src/leader-thread/LeaderSyncProcessor.ts +42 -38
- package/src/leader-thread/make-leader-thread-layer.ts +1 -0
- package/src/leader-thread/mutationlog.ts +1 -0
- package/src/schema/MutationEvent.ts +18 -2
- package/src/sync/ClientSessionSyncProcessor.ts +39 -33
- package/src/sync/sync.ts +10 -0
- package/src/sync/syncstate.test.ts +72 -38
- package/src/sync/syncstate.ts +138 -58
- package/src/version.ts +1 -1
- package/tmp/pack.tgz +0 -0
@@ -13,6 +13,8 @@ import * as SyncState from './syncstate.js';
|
|
13
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
14
|
* - We also want to avoid "backwards-jumping" in the UI, so we'll transactionally apply a read model changes during a rebase.
|
15
15
|
* - We might need to make the rebase behaviour configurable e.g. to let users manually trigger a rebase
|
16
|
+
*
|
17
|
+
* Longer term we should evalutate whether we can unify the ClientSessionSyncProcessor with the LeaderSyncProcessor.
|
16
18
|
*/
|
17
19
|
export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime, applyMutation, rollback, refreshTables, span, params, confirmUnsavedChanges, }) => {
|
18
20
|
const mutationEventSchema = MutationEvent.makeMutationEventSchemaMemo(schema);
|
@@ -26,7 +28,7 @@ export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime,
|
|
26
28
|
}),
|
27
29
|
};
|
28
30
|
const syncStateUpdateQueue = Queue.unbounded().pipe(Effect.runSync);
|
29
|
-
const
|
31
|
+
const isClientEvent = (mutationEventEncoded) => getMutationDef(schema, mutationEventEncoded.mutation).options.clientOnly;
|
30
32
|
/** We're queuing push requests to reduce the number of messages sent to the leader by batching them */
|
31
33
|
const leaderPushQueue = BucketQueue.make().pipe(Effect.runSync);
|
32
34
|
const push = (batch, { otelContext }) => {
|
@@ -43,26 +45,26 @@ export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime,
|
|
43
45
|
sessionId: clientSession.sessionId,
|
44
46
|
}));
|
45
47
|
});
|
46
|
-
const
|
48
|
+
const mergeResult = SyncState.merge({
|
47
49
|
syncState: syncStateRef.current,
|
48
50
|
payload: { _tag: 'local-push', newEvents: encodedMutationEvents },
|
49
|
-
|
51
|
+
isClientEvent,
|
50
52
|
isEqualEvent: MutationEvent.isEqualEncoded,
|
51
53
|
});
|
52
|
-
if (
|
53
|
-
return shouldNeverHappen('Unexpected error in client-session-sync-processor',
|
54
|
+
if (mergeResult._tag === 'unexpected-error') {
|
55
|
+
return shouldNeverHappen('Unexpected error in client-session-sync-processor', mergeResult.cause);
|
54
56
|
}
|
55
57
|
span.addEvent('local-push', {
|
56
58
|
batchSize: encodedMutationEvents.length,
|
57
|
-
|
59
|
+
mergeResult: TRACE_VERBOSE ? JSON.stringify(mergeResult) : undefined,
|
58
60
|
});
|
59
|
-
if (
|
60
|
-
return shouldNeverHappen(`Expected advance, got ${
|
61
|
+
if (mergeResult._tag !== 'advance') {
|
62
|
+
return shouldNeverHappen(`Expected advance, got ${mergeResult._tag}`);
|
61
63
|
}
|
62
|
-
syncStateRef.current =
|
63
|
-
syncStateUpdateQueue.offer(
|
64
|
+
syncStateRef.current = mergeResult.newSyncState;
|
65
|
+
syncStateUpdateQueue.offer(mergeResult.newSyncState).pipe(Effect.runSync);
|
64
66
|
const writeTables = new Set();
|
65
|
-
for (const mutationEvent of
|
67
|
+
for (const mutationEvent of mergeResult.newEvents) {
|
66
68
|
// TODO avoid encoding and decoding here again
|
67
69
|
const decodedMutationEvent = Schema.decodeSync(mutationEventSchema)(mutationEvent);
|
68
70
|
const res = applyMutation(decodedMutationEvent, { otelContext, withChangeset: true });
|
@@ -101,32 +103,33 @@ export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime,
|
|
101
103
|
}));
|
102
104
|
}).pipe(Effect.forever, Effect.interruptible, Effect.tapCauseLogPretty);
|
103
105
|
yield* FiberHandle.run(leaderPushingFiberHandle, backgroundLeaderPushing);
|
104
|
-
|
106
|
+
// NOTE We need to lazily call `.pull` as we want the cursor to be updated
|
107
|
+
yield* Stream.suspend(() => clientSession.leaderThread.mutations.pull({ cursor: syncStateRef.current.localHead })).pipe(Stream.tap(({ payload, remaining }) => Effect.gen(function* () {
|
105
108
|
// console.log('pulled payload from leader', { payload, remaining })
|
106
109
|
if (clientSession.devtools.enabled) {
|
107
110
|
yield* clientSession.devtools.pullLatch.await;
|
108
111
|
}
|
109
|
-
const
|
112
|
+
const mergeResult = SyncState.merge({
|
110
113
|
syncState: syncStateRef.current,
|
111
114
|
payload,
|
112
|
-
|
115
|
+
isClientEvent,
|
113
116
|
isEqualEvent: MutationEvent.isEqualEncoded,
|
114
117
|
});
|
115
|
-
if (
|
116
|
-
return yield* Effect.fail(
|
118
|
+
if (mergeResult._tag === 'unexpected-error') {
|
119
|
+
return yield* Effect.fail(mergeResult.cause);
|
117
120
|
}
|
118
|
-
else if (
|
119
|
-
return shouldNeverHappen('Unexpected reject in client-session-sync-processor',
|
121
|
+
else if (mergeResult._tag === 'reject') {
|
122
|
+
return shouldNeverHappen('Unexpected reject in client-session-sync-processor', mergeResult);
|
120
123
|
}
|
121
|
-
syncStateRef.current =
|
122
|
-
syncStateUpdateQueue.offer(
|
123
|
-
if (
|
124
|
+
syncStateRef.current = mergeResult.newSyncState;
|
125
|
+
syncStateUpdateQueue.offer(mergeResult.newSyncState).pipe(Effect.runSync);
|
126
|
+
if (mergeResult._tag === 'rebase') {
|
124
127
|
span.addEvent('pull:rebase', {
|
125
128
|
payloadTag: payload._tag,
|
126
129
|
payload: TRACE_VERBOSE ? JSON.stringify(payload) : undefined,
|
127
|
-
newEventsCount:
|
128
|
-
rollbackCount:
|
129
|
-
res: TRACE_VERBOSE ? JSON.stringify(
|
130
|
+
newEventsCount: mergeResult.newEvents.length,
|
131
|
+
rollbackCount: mergeResult.eventsToRollback.length,
|
132
|
+
res: TRACE_VERBOSE ? JSON.stringify(mergeResult) : undefined,
|
130
133
|
remaining,
|
131
134
|
});
|
132
135
|
debugInfo.rebaseCount++;
|
@@ -135,31 +138,31 @@ export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime,
|
|
135
138
|
yield* BucketQueue.clear(leaderPushQueue);
|
136
139
|
yield* FiberHandle.run(leaderPushingFiberHandle, backgroundLeaderPushing);
|
137
140
|
if (LS_DEV) {
|
138
|
-
Effect.logDebug('pull:rebase: rollback',
|
141
|
+
Effect.logDebug('pull:rebase: rollback', mergeResult.eventsToRollback.length, ...mergeResult.eventsToRollback.slice(0, 10).map((_) => _.toJSON())).pipe(Effect.provide(runtime), Effect.runSync);
|
139
142
|
}
|
140
|
-
for (let i =
|
141
|
-
const event =
|
143
|
+
for (let i = mergeResult.eventsToRollback.length - 1; i >= 0; i--) {
|
144
|
+
const event = mergeResult.eventsToRollback[i];
|
142
145
|
if (event.meta.sessionChangeset) {
|
143
146
|
rollback(event.meta.sessionChangeset);
|
144
147
|
event.meta.sessionChangeset = undefined;
|
145
148
|
}
|
146
149
|
}
|
147
|
-
yield* BucketQueue.offerAll(leaderPushQueue,
|
150
|
+
yield* BucketQueue.offerAll(leaderPushQueue, mergeResult.newSyncState.pending);
|
148
151
|
}
|
149
152
|
else {
|
150
153
|
span.addEvent('pull:advance', {
|
151
154
|
payloadTag: payload._tag,
|
152
155
|
payload: TRACE_VERBOSE ? JSON.stringify(payload) : undefined,
|
153
|
-
newEventsCount:
|
154
|
-
res: TRACE_VERBOSE ? JSON.stringify(
|
156
|
+
newEventsCount: mergeResult.newEvents.length,
|
157
|
+
res: TRACE_VERBOSE ? JSON.stringify(mergeResult) : undefined,
|
155
158
|
remaining,
|
156
159
|
});
|
157
160
|
debugInfo.advanceCount++;
|
158
161
|
}
|
159
|
-
if (
|
162
|
+
if (mergeResult.newEvents.length === 0)
|
160
163
|
return;
|
161
164
|
const writeTables = new Set();
|
162
|
-
for (const mutationEvent of
|
165
|
+
for (const mutationEvent of mergeResult.newEvents) {
|
163
166
|
const decodedMutationEvent = Schema.decodeSync(mutationEventSchema)(mutationEvent);
|
164
167
|
const res = applyMutation(decodedMutationEvent, { otelContext, withChangeset: true });
|
165
168
|
for (const table of res.writeTables) {
|
@@ -169,7 +172,7 @@ export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime,
|
|
169
172
|
}
|
170
173
|
refreshTables(writeTables);
|
171
174
|
}).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);
|
175
|
+
Effect.interruptible, Effect.withSpan('client-session-sync-processor:pull'), Effect.tapCauseLogPretty, Effect.forkScoped);
|
173
176
|
});
|
174
177
|
return {
|
175
178
|
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;AACvE,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAA;AAC3D,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C
|
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,6 +16,16 @@ 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> = {
|
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,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,CAChB;QACE,sCAAsC;QACtC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAA;KACtD,EACD,cAAc,GAAG,gBAAgB,EACjC,UAAU,CAAC,UAAU,CACtB,CAAA;IACD,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;AAwE/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
@@ -4,6 +4,7 @@ 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
|
rollbackTail: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
7
|
+
/** What this node expects the next upstream node to have as its own local head */
|
7
8
|
upstreamHead: Schema.Struct<{
|
8
9
|
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
|
9
10
|
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventId">, number, never>;
|
@@ -15,6 +16,7 @@ declare const SyncState_base: Schema.Class<SyncState, {
|
|
15
16
|
}, Schema.Struct.Encoded<{
|
16
17
|
pending: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
17
18
|
rollbackTail: Schema.Array$<typeof MutationEvent.EncodedWithMeta>;
|
19
|
+
/** What this node expects the next upstream node to have as its own local head */
|
18
20
|
upstreamHead: Schema.Struct<{
|
19
21
|
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
|
20
22
|
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventId">, number, never>;
|
@@ -57,6 +59,9 @@ declare const SyncState_base: Schema.Class<SyncState, {
|
|
57
59
|
* - Can be confirmed or rejected by the upstream.
|
58
60
|
* - Subject to rebase if rejected.
|
59
61
|
* - **Rollback Tail**: Events that are kept around temporarily for potential rollback until confirmed by upstream.
|
62
|
+
* - Currently only needed for ClientSessionSyncProcessor.
|
63
|
+
* - Note: Confirmation of an event is stronger than acknowledgment of an event and can only be done by the
|
64
|
+
* absolute authority in the sync hierarchy (i.e. the sync backend in our case).
|
60
65
|
*
|
61
66
|
* Payloads:
|
62
67
|
* - `PayloadUpstreamRebase`: Upstream has performed a rebase, so downstream must roll back to the specified event
|
@@ -70,7 +75,13 @@ declare const SyncState_base: Schema.Class<SyncState, {
|
|
70
75
|
* 2. **Head Ordering**: Upstream Head ≤ Local Head.
|
71
76
|
* 3. **ID Sequence**: Must follow the pattern (1,0)→(1,1)→(1,2)→(2,0).
|
72
77
|
*
|
73
|
-
*
|
78
|
+
* A few further notes to help form an intuition:
|
79
|
+
* - The goal is to keep the pending events as small as possible (i.e. to have synced with the next upstream node)
|
80
|
+
* - There are 2 cases for rebasing:
|
81
|
+
* - The conflicting event only conflicts with the pending events -> only (some of) the pending events need to be rolled back
|
82
|
+
* - The conflicting event conflicts even with the rollback tail (additionally to the pending events) -> events from both need to be rolled back
|
83
|
+
*
|
84
|
+
* The `merge` function processes updates to the sync state based on incoming payloads,
|
74
85
|
* handling cases such as upstream rebase, advance, local push, and rollback tail trimming.
|
75
86
|
*/
|
76
87
|
export declare class SyncState extends SyncState_base {
|
@@ -147,7 +158,7 @@ declare const UpdateContext_base: Schema.Class<UpdateContext, {
|
|
147
158
|
export declare class UpdateContext extends UpdateContext_base {
|
148
159
|
toJSON: () => any;
|
149
160
|
}
|
150
|
-
declare const
|
161
|
+
declare const MergeResultAdvance_base: Schema.Class<MergeResultAdvance, {
|
151
162
|
_tag: Schema.Literal<["advance"]>;
|
152
163
|
newSyncState: typeof SyncState;
|
153
164
|
/** Events which weren't pending before the update */
|
@@ -168,10 +179,10 @@ declare const UpdateResultAdvance_base: Schema.Class<UpdateResultAdvance, {
|
|
168
179
|
} & {
|
169
180
|
readonly updateContext: UpdateContext;
|
170
181
|
}, {}, {}>;
|
171
|
-
export declare class
|
182
|
+
export declare class MergeResultAdvance extends MergeResultAdvance_base {
|
172
183
|
toJSON: () => any;
|
173
184
|
}
|
174
|
-
declare const
|
185
|
+
declare const MergeResultRebase_base: Schema.Class<MergeResultRebase, {
|
175
186
|
_tag: Schema.Literal<["rebase"]>;
|
176
187
|
newSyncState: typeof SyncState;
|
177
188
|
/** Events which weren't pending before the update */
|
@@ -196,10 +207,10 @@ declare const UpdateResultRebase_base: Schema.Class<UpdateResultRebase, {
|
|
196
207
|
} & {
|
197
208
|
readonly eventsToRollback: readonly MutationEvent.EncodedWithMeta[];
|
198
209
|
}, {}, {}>;
|
199
|
-
export declare class
|
210
|
+
export declare class MergeResultRebase extends MergeResultRebase_base {
|
200
211
|
toJSON: () => any;
|
201
212
|
}
|
202
|
-
declare const
|
213
|
+
declare const MergeResultReject_base: Schema.Class<MergeResultReject, {
|
203
214
|
_tag: Schema.Literal<["reject"]>;
|
204
215
|
/** The minimum id that the new events must have */
|
205
216
|
expectedMinimumId: Schema.Struct<{
|
@@ -225,10 +236,10 @@ declare const UpdateResultReject_base: Schema.Class<UpdateResultReject, {
|
|
225
236
|
readonly client: number & import("effect/Brand").Brand<"ClientEventId">;
|
226
237
|
};
|
227
238
|
}, {}, {}>;
|
228
|
-
export declare class
|
239
|
+
export declare class MergeResultReject extends MergeResultReject_base {
|
229
240
|
toJSON: () => any;
|
230
241
|
}
|
231
|
-
declare const
|
242
|
+
declare const MergeResultUnexpectedError_base: Schema.Class<MergeResultUnexpectedError, {
|
232
243
|
_tag: Schema.Literal<["unexpected-error"]>;
|
233
244
|
cause: typeof UnexpectedError;
|
234
245
|
}, Schema.Struct.Encoded<{
|
@@ -239,18 +250,29 @@ declare const UpdateResultUnexpectedError_base: Schema.Class<UpdateResultUnexpec
|
|
239
250
|
} & {
|
240
251
|
readonly cause: UnexpectedError;
|
241
252
|
}, {}, {}>;
|
242
|
-
export declare class
|
253
|
+
export declare class MergeResultUnexpectedError extends MergeResultUnexpectedError_base {
|
243
254
|
}
|
244
|
-
declare const
|
245
|
-
export declare class
|
255
|
+
declare const MergeResult_base: Schema.Union<[typeof MergeResultAdvance, typeof MergeResultRebase, typeof MergeResultReject, typeof MergeResultUnexpectedError]>;
|
256
|
+
export declare class MergeResult extends MergeResult_base {
|
246
257
|
}
|
247
|
-
export declare const
|
258
|
+
export declare const merge: ({ syncState, payload, isClientEvent, isEqualEvent, ignoreClientEvents, }: {
|
248
259
|
syncState: SyncState;
|
249
260
|
payload: typeof Payload.Type;
|
250
|
-
|
261
|
+
isClientEvent: (event: MutationEvent.EncodedWithMeta) => boolean;
|
262
|
+
isEqualEvent: (a: MutationEvent.EncodedWithMeta, b: MutationEvent.EncodedWithMeta) => boolean;
|
263
|
+
/** This is used in the leader which should ignore client events when receiving an upstream-advance payload */
|
264
|
+
ignoreClientEvents?: boolean;
|
265
|
+
}) => typeof MergeResult.Type;
|
266
|
+
/**
|
267
|
+
* Gets the index relative to `existingEvents` where the divergence point is
|
268
|
+
* by comparing each event in `existingEvents` to the corresponding event in `incomingEvents`
|
269
|
+
*/
|
270
|
+
export declare const findDivergencePoint: ({ existingEvents, incomingEvents, isEqualEvent, isClientEvent, ignoreClientEvents, }: {
|
271
|
+
existingEvents: ReadonlyArray<MutationEvent.EncodedWithMeta>;
|
272
|
+
incomingEvents: ReadonlyArray<MutationEvent.EncodedWithMeta>;
|
251
273
|
isEqualEvent: (a: MutationEvent.EncodedWithMeta, b: MutationEvent.EncodedWithMeta) => boolean;
|
252
|
-
|
253
|
-
|
254
|
-
}) =>
|
274
|
+
isClientEvent: (event: MutationEvent.EncodedWithMeta) => boolean;
|
275
|
+
ignoreClientEvents: boolean;
|
276
|
+
}) => number;
|
255
277
|
export {};
|
256
278
|
//# sourceMappingURL=syncstate.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"syncstate.d.ts","sourceRoot":"","sources":["../../src/sync/syncstate.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEtE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAA
|
1
|
+
{"version":3,"file":"syncstate.d.ts","sourceRoot":"","sources":["../../src/sync/syncstate.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEtE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAA;;;;IAiDzD,kFAAkF;;;;;;;;;;;;IAAlF,kFAAkF;;;;;;;;;;;;;;;;;;;;;;;;AA/CpF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,qBAAa,SAAU,SAAQ,cAM7B;IACA,MAAM,QAAO,GAAG,CAOf;CACF;;IAGC,8GAA8G;;;;;;IAG9G,uDAAuD;;;;;;AAJzD,qBAAa,qBAAsB,SAAQ,0BAMzC;CAAG;;;IAIH,uDAAuD;;;;;;AAFzD,qBAAa,sBAAuB,SAAQ,2BAI1C;CAAG;;;;AAEL,qBAAa,gBAAiB,SAAQ,qBAEpC;CAAG;;AAEL,qBAAa,OAAQ,SAAQ,YAA6E;CAAG;AAE7G,eAAO,MAAM,eAAe,6EAA8D,CAAA;AAE1F,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEzD,uCAAuC;AACvC,qBAAa,aAAc,SAAQ,kBAGjC;IACA,MAAM,QAAO,GAAG,CAoBf;CACF;;;;IAKC,qDAAqD;;;;;;IAArD,qDAAqD;;;;;;;;;;;;AAHvD,qBAAa,kBAAmB,SAAQ,uBAMtC;IACA,MAAM,QAAO,GAAG,CAOf;CACF;;;;IAKC,qDAAqD;;;;;;;IAArD,qDAAqD;;;;;;;;;;;;;;;AAHvD,qBAAa,iBAAkB,SAAQ,sBAOrC;IACA,MAAM,QAAO,GAAG,CAQf;CACF;;;IAIC,mDAAmD;;;;;;;;IAAnD,mDAAmD;;;;;;;;;;;;;;;;AAFrD,qBAAa,iBAAkB,SAAQ,sBAKrC;IACA,MAAM,QAAO,GAAG,CAMf;CACF;;;;;;;;;;;;AAED,qBAAa,0BAA2B,SAAQ,+BAG9C;CAAG;;AAEL,qBAAa,WAAY,SAAQ,gBAKhC;CAAG;AAQJ,eAAO,MAAM,KAAK,GAAI,0EAMnB;IACD,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,OAAO,OAAO,CAAC,IAAI,CAAA;IAC5B,aAAa,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,eAAe,KAAK,OAAO,CAAA;IAChE,YAAY,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,eAAe,EAAE,CAAC,EAAE,aAAa,CAAC,eAAe,KAAK,OAAO,CAAA;IAC7F,8GAA8G;IAC9G,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,KAAG,OAAO,WAAW,CAAC,IAoOtB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,sFAMjC;IACD,cAAc,EAAE,aAAa,CAAC,aAAa,CAAC,eAAe,CAAC,CAAA;IAC5D,cAAc,EAAE,aAAa,CAAC,aAAa,CAAC,eAAe,CAAC,CAAA;IAC5D,YAAY,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,eAAe,EAAE,CAAC,EAAE,aAAa,CAAC,eAAe,KAAK,OAAO,CAAA;IAC7F,aAAa,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,eAAe,KAAK,OAAO,CAAA;IAChE,kBAAkB,EAAE,OAAO,CAAA;CAC5B,KAAG,MAuBH,CAAA"}
|