@livestore/common 0.3.0-dev.11 → 0.3.0-dev.3
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 +35 -47
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js.map +1 -1
- package/dist/derived-mutations.d.ts +4 -4
- package/dist/derived-mutations.d.ts.map +1 -1
- package/dist/derived-mutations.test.js.map +1 -1
- package/dist/devtools/devtools-bridge.d.ts +1 -2
- package/dist/devtools/devtools-bridge.d.ts.map +1 -1
- package/dist/devtools/devtools-messages.d.ts +592 -3
- package/dist/devtools/devtools-messages.d.ts.map +1 -1
- package/dist/devtools/devtools-messages.js +171 -3
- package/dist/devtools/devtools-messages.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/init-singleton-tables.d.ts +2 -2
- package/dist/init-singleton-tables.d.ts.map +1 -1
- package/dist/init-singleton-tables.js.map +1 -1
- package/dist/leader-thread/apply-mutation.d.ts +2 -5
- package/dist/leader-thread/apply-mutation.d.ts.map +1 -1
- package/dist/leader-thread/apply-mutation.js +29 -41
- package/dist/leader-thread/apply-mutation.js.map +1 -1
- package/dist/leader-thread/connection.d.ts +4 -4
- package/dist/leader-thread/connection.d.ts.map +1 -1
- package/dist/leader-thread/connection.js +5 -5
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/leader-sync-processor.d.ts +2 -2
- package/dist/leader-thread/leader-sync-processor.d.ts.map +1 -1
- package/dist/leader-thread/leader-sync-processor.js +12 -20
- package/dist/leader-thread/leader-sync-processor.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +81 -37
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +11 -12
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +14 -33
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/mutationlog.d.ts +19 -6
- package/dist/leader-thread/mutationlog.d.ts.map +1 -1
- package/dist/leader-thread/mutationlog.js +6 -7
- package/dist/leader-thread/mutationlog.js.map +1 -1
- package/dist/leader-thread/pull-queue-set.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +18 -24
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/types.d.ts +16 -36
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/mutation.d.ts +2 -9
- package/dist/mutation.d.ts.map +1 -1
- package/dist/mutation.js +5 -5
- package/dist/mutation.js.map +1 -1
- package/dist/query-builder/impl.d.ts +1 -1
- package/dist/rehydrate-from-mutationlog.d.ts +5 -5
- package/dist/rehydrate-from-mutationlog.d.ts.map +1 -1
- package/dist/rehydrate-from-mutationlog.js +19 -13
- package/dist/rehydrate-from-mutationlog.js.map +1 -1
- package/dist/schema/EventId.d.ts +14 -16
- package/dist/schema/EventId.d.ts.map +1 -1
- package/dist/schema/EventId.js +7 -15
- package/dist/schema/EventId.js.map +1 -1
- package/dist/schema/MutationEvent.d.ts +80 -49
- package/dist/schema/MutationEvent.d.ts.map +1 -1
- package/dist/schema/MutationEvent.js +15 -32
- package/dist/schema/MutationEvent.js.map +1 -1
- package/dist/schema/system-tables.d.ts +26 -26
- package/dist/schema/system-tables.d.ts.map +1 -1
- package/dist/schema/system-tables.js +11 -19
- package/dist/schema/system-tables.js.map +1 -1
- package/dist/schema-management/common.d.ts +3 -3
- package/dist/schema-management/common.d.ts.map +1 -1
- package/dist/schema-management/common.js.map +1 -1
- package/dist/schema-management/migrations.d.ts +4 -4
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +6 -6
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/sync/client-session-sync-processor.d.ts +4 -4
- package/dist/sync/client-session-sync-processor.d.ts.map +1 -1
- package/dist/sync/index.d.ts +1 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -1
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +4 -1
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +1 -1
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +3 -3
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +2 -3
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/mutation-fixtures.d.ts +7 -7
- package/dist/sync/next/test/mutation-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/mutation-fixtures.js +9 -3
- package/dist/sync/next/test/mutation-fixtures.js.map +1 -1
- package/dist/sync/sync.d.ts +11 -21
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +23 -45
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +12 -56
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +69 -125
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/validate-push-payload.d.ts +2 -2
- package/dist/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js +2 -2
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +5 -6
- package/src/adapter-types.ts +40 -39
- package/src/derived-mutations.test.ts +1 -1
- package/src/derived-mutations.ts +5 -9
- package/src/devtools/devtools-bridge.ts +1 -2
- package/src/devtools/devtools-messages.ts +243 -3
- package/src/index.ts +6 -0
- package/src/init-singleton-tables.ts +2 -2
- package/src/leader-thread/apply-mutation.ts +35 -53
- package/src/leader-thread/connection.ts +7 -7
- package/src/leader-thread/{LeaderSyncProcessor.ts → leader-sync-processor.ts} +268 -306
- package/src/leader-thread/leader-worker-devtools.ts +124 -52
- package/src/leader-thread/make-leader-thread-layer.ts +30 -62
- package/src/leader-thread/mutationlog.ts +10 -14
- package/src/leader-thread/recreate-db.ts +20 -24
- package/src/leader-thread/types.ts +20 -41
- package/src/mutation.ts +7 -17
- package/src/rehydrate-from-mutationlog.ts +26 -18
- package/src/schema/EventId.ts +9 -23
- package/src/schema/MutationEvent.ts +24 -46
- package/src/schema/system-tables.ts +11 -19
- package/src/schema-management/common.ts +3 -3
- package/src/schema-management/migrations.ts +10 -10
- package/src/sync/{ClientSessionSyncProcessor.ts → client-session-sync-processor.ts} +19 -26
- package/src/sync/index.ts +1 -1
- package/src/sync/next/history-dag-common.ts +1 -1
- package/src/sync/next/rebase-events.ts +7 -7
- package/src/sync/next/test/mutation-fixtures.ts +10 -3
- package/src/sync/sync.ts +6 -19
- package/src/sync/syncstate.test.ts +67 -127
- package/src/sync/syncstate.ts +19 -21
- package/src/sync/validate-push-payload.ts +4 -7
- package/src/version.ts +1 -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/devtools/devtools-messages-client-session.d.ts +0 -297
- package/dist/devtools/devtools-messages-client-session.d.ts.map +0 -1
- package/dist/devtools/devtools-messages-client-session.js +0 -61
- package/dist/devtools/devtools-messages-client-session.js.map +0 -1
- package/dist/devtools/devtools-messages-common.d.ts +0 -65
- package/dist/devtools/devtools-messages-common.d.ts.map +0 -1
- package/dist/devtools/devtools-messages-common.js +0 -35
- package/dist/devtools/devtools-messages-common.js.map +0 -1
- package/dist/devtools/devtools-messages-leader.d.ts +0 -261
- package/dist/devtools/devtools-messages-leader.d.ts.map +0 -1
- package/dist/devtools/devtools-messages-leader.js +0 -85
- package/dist/devtools/devtools-messages-leader.js.map +0 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +0 -37
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +0 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +0 -432
- package/dist/leader-thread/LeaderSyncProcessor.js.map +0 -1
- package/dist/schema/EventId.test.d.ts +0 -2
- package/dist/schema/EventId.test.d.ts.map +0 -1
- package/dist/schema/EventId.test.js +0 -11
- package/dist/schema/EventId.test.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/ClientSessionSyncProcessor.d.ts +0 -43
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +0 -1
- package/dist/sync/ClientSessionSyncProcessor.js +0 -141
- package/dist/sync/ClientSessionSyncProcessor.js.map +0 -1
- package/src/devtools/devtools-messages-client-session.ts +0 -109
- package/src/devtools/devtools-messages-common.ts +0 -52
- package/src/devtools/devtools-messages-leader.ts +0 -115
- package/src/schema/EventId.test.ts +0 -12
package/dist/sync/syncstate.js
CHANGED
@@ -2,56 +2,12 @@ import { shouldNeverHappen } from '@livestore/utils';
|
|
2
2
|
import { ReadonlyArray, Schema } from '@livestore/utils/effect';
|
3
3
|
import * as EventId from '../schema/EventId.js';
|
4
4
|
import * as MutationEvent from '../schema/MutationEvent.js';
|
5
|
-
|
6
|
-
* SyncState represents the current sync state of a sync node relative to an upstream node.
|
7
|
-
* Events flow from local to upstream, with each state maintaining its own event head.
|
8
|
-
*
|
9
|
-
* Event Chain Structure:
|
10
|
-
* ```
|
11
|
-
* +-------------------------+------------------------+
|
12
|
-
* | ROLLBACK TAIL | PENDING EVENTS |
|
13
|
-
* +-------------------------+------------------------+
|
14
|
-
* ▼ ▼
|
15
|
-
* Upstream Head Local Head
|
16
|
-
* Example: (0,0), (0,1), (1,0) (1,1), (1,2), (2,0)
|
17
|
-
* ```
|
18
|
-
*
|
19
|
-
* State:
|
20
|
-
* - **Pending Events**: Events awaiting acknowledgment from the upstream.
|
21
|
-
* - Can be confirmed or rejected by the upstream.
|
22
|
-
* - Subject to rebase if rejected.
|
23
|
-
* - **Rollback Tail**: Events that are kept around temporarily for potential rollback until confirmed by upstream.
|
24
|
-
*
|
25
|
-
* Payloads:
|
26
|
-
* - `PayloadUpstreamRebase`: Upstream has performed a rebase, so downstream must roll back to the specified event
|
27
|
-
* and rebase the pending events on top of the new events.
|
28
|
-
* - `PayloadUpstreamAdvance`: Upstream has advanced, so downstream must rebase the pending events on top of the new events.
|
29
|
-
* - `PayloadUpstreamTrimRollbackTail`: Upstream has advanced, so downstream can trim the rollback tail.
|
30
|
-
* - `PayloadLocalPush`: Local push payload
|
31
|
-
*
|
32
|
-
* Invariants:
|
33
|
-
* 1. **Chain Continuity**: Each event must reference its immediate parent.
|
34
|
-
* 2. **Head Ordering**: Upstream Head ≤ Local Head.
|
35
|
-
* 3. **ID Sequence**: Must follow the pattern (1,0)→(1,1)→(1,2)→(2,0).
|
36
|
-
*
|
37
|
-
* The `updateSyncState` function processes updates to the sync state based on incoming payloads,
|
38
|
-
* handling cases such as upstream rebase, advance, local push, and rollback tail trimming.
|
39
|
-
*/
|
40
|
-
export class SyncState extends Schema.Class('SyncState')({
|
5
|
+
export const SyncState = Schema.Struct({
|
41
6
|
pending: Schema.Array(MutationEvent.EncodedWithMeta),
|
42
7
|
rollbackTail: Schema.Array(MutationEvent.EncodedWithMeta),
|
43
8
|
upstreamHead: EventId.EventId,
|
44
9
|
localHead: EventId.EventId,
|
45
|
-
})
|
46
|
-
toJSON = () => {
|
47
|
-
return {
|
48
|
-
pending: this.pending.map((e) => e.toJSON()),
|
49
|
-
rollbackTail: this.rollbackTail.map((e) => e.toJSON()),
|
50
|
-
upstreamHead: `(${this.upstreamHead.global},${this.upstreamHead.local})`,
|
51
|
-
localHead: `(${this.localHead.global},${this.localHead.local})`,
|
52
|
-
};
|
53
|
-
};
|
54
|
-
}
|
10
|
+
}).annotations({ title: 'SyncState' });
|
55
11
|
export class PayloadUpstreamRebase extends Schema.TaggedStruct('upstream-rebase', {
|
56
12
|
/** Rollback until this event in the rollback tail (inclusive). Starting from the end of the rollback tail. */
|
57
13
|
rollbackUntil: EventId.EventId,
|
@@ -101,12 +57,12 @@ export const updateSyncState = ({ syncState, payload, isLocalEvent, isEqualEvent
|
|
101
57
|
});
|
102
58
|
return {
|
103
59
|
_tag: 'rebase',
|
104
|
-
newSyncState:
|
60
|
+
newSyncState: {
|
105
61
|
pending: rebasedPending,
|
106
62
|
rollbackTail: trimRollbackTail([...syncState.rollbackTail.slice(0, rollbackIndex), ...payload.newEvents]),
|
107
63
|
upstreamHead: newUpstreamHead,
|
108
64
|
localHead: rebasedPending.at(-1)?.id ?? newUpstreamHead,
|
109
|
-
}
|
65
|
+
},
|
110
66
|
previousSyncState: syncState,
|
111
67
|
newEvents: payload.newEvents,
|
112
68
|
eventsToRollback,
|
@@ -116,12 +72,12 @@ export const updateSyncState = ({ syncState, payload, isLocalEvent, isEqualEvent
|
|
116
72
|
if (payload.newEvents.length === 0) {
|
117
73
|
return {
|
118
74
|
_tag: 'advance',
|
119
|
-
newSyncState:
|
75
|
+
newSyncState: {
|
120
76
|
pending: syncState.pending,
|
121
77
|
rollbackTail: trimRollbackTail(syncState.rollbackTail),
|
122
78
|
upstreamHead: syncState.upstreamHead,
|
123
79
|
localHead: syncState.localHead,
|
124
|
-
}
|
80
|
+
},
|
125
81
|
previousSyncState: syncState,
|
126
82
|
newEvents: [],
|
127
83
|
};
|
@@ -171,12 +127,12 @@ export const updateSyncState = ({ syncState, payload, isLocalEvent, isEqualEvent
|
|
171
127
|
});
|
172
128
|
return {
|
173
129
|
_tag: 'advance',
|
174
|
-
newSyncState:
|
130
|
+
newSyncState: {
|
175
131
|
pending: pendingRemaining,
|
176
132
|
rollbackTail: trimRollbackTail([...syncState.rollbackTail, ...pendingAndNewEvents]),
|
177
133
|
upstreamHead: newUpstreamHead,
|
178
134
|
localHead: pendingRemaining.at(-1)?.id ?? newUpstreamHead,
|
179
|
-
}
|
135
|
+
},
|
180
136
|
previousSyncState: syncState,
|
181
137
|
newEvents,
|
182
138
|
};
|
@@ -197,12 +153,12 @@ export const updateSyncState = ({ syncState, payload, isLocalEvent, isEqualEvent
|
|
197
153
|
});
|
198
154
|
return {
|
199
155
|
_tag: 'rebase',
|
200
|
-
newSyncState:
|
156
|
+
newSyncState: {
|
201
157
|
pending: rebasedPending,
|
202
158
|
rollbackTail: trimRollbackTail([...syncState.rollbackTail, ...payload.newEvents]),
|
203
159
|
upstreamHead: newUpstreamHead,
|
204
160
|
localHead: rebasedPending.at(-1).id,
|
205
|
-
}
|
161
|
+
},
|
206
162
|
previousSyncState: syncState,
|
207
163
|
newEvents: [...payload.newEvents.slice(divergentNewEventsIndex), ...rebasedPending],
|
208
164
|
eventsToRollback: [...syncState.rollbackTail, ...divergentPending],
|
@@ -222,12 +178,12 @@ export const updateSyncState = ({ syncState, payload, isLocalEvent, isEqualEvent
|
|
222
178
|
else {
|
223
179
|
return {
|
224
180
|
_tag: 'advance',
|
225
|
-
newSyncState:
|
181
|
+
newSyncState: {
|
226
182
|
pending: [...syncState.pending, ...payload.newEvents],
|
227
183
|
rollbackTail: syncState.rollbackTail,
|
228
184
|
upstreamHead: syncState.upstreamHead,
|
229
185
|
localHead: payload.newEvents.at(-1).id,
|
230
|
-
}
|
186
|
+
},
|
231
187
|
previousSyncState: syncState,
|
232
188
|
newEvents: payload.newEvents,
|
233
189
|
};
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"syncstate.js","sourceRoot":"","sources":["../../src/sync/syncstate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAE/D,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAA;AAC/C,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAA;
|
1
|
+
{"version":3,"file":"syncstate.js","sourceRoot":"","sources":["../../src/sync/syncstate.ts"],"names":[],"mappings":"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"}
|
@@ -4,16 +4,20 @@ import * as EventId from '../schema/EventId.js';
|
|
4
4
|
import * as MutationEvent from '../schema/MutationEvent.js';
|
5
5
|
import * as SyncState from './syncstate.js';
|
6
6
|
class TestEvent extends MutationEvent.EncodedWithMeta {
|
7
|
+
id;
|
8
|
+
parentId;
|
7
9
|
payload;
|
8
10
|
isLocal;
|
9
11
|
constructor(id, parentId, payload, isLocal) {
|
10
12
|
super({
|
11
|
-
id
|
12
|
-
parentId
|
13
|
+
id,
|
14
|
+
parentId,
|
13
15
|
mutation: 'a',
|
14
16
|
args: payload,
|
15
17
|
meta: {},
|
16
18
|
});
|
19
|
+
this.id = id;
|
20
|
+
this.parentId = parentId;
|
17
21
|
this.payload = payload;
|
18
22
|
this.isLocal = isLocal;
|
19
23
|
}
|
@@ -35,12 +39,12 @@ describe('syncstate', () => {
|
|
35
39
|
const run = ({ syncState, payload, ignoreLocalEvents = false, }) => SyncState.updateSyncState({ syncState, payload, isLocalEvent, isEqualEvent, ignoreLocalEvents });
|
36
40
|
describe.each([{ trimRollbackUntil: false }, { trimRollbackUntil: true }])('upstream-rebase (trimRollbackUntil: $trimRollbackUntil)', ({ trimRollbackUntil }) => {
|
37
41
|
it('should rollback until start', () => {
|
38
|
-
const syncState =
|
42
|
+
const syncState = {
|
39
43
|
pending: [e_1_0],
|
40
44
|
rollbackTail: [e_0_0, e_0_1],
|
41
45
|
upstreamHead: EventId.ROOT,
|
42
46
|
localHead: e_1_0.id,
|
43
|
-
}
|
47
|
+
};
|
44
48
|
const e_0_0_e_1_0 = e_0_0.rebase_(e_1_0.id);
|
45
49
|
const e_0_1_e_1_1 = e_0_1.rebase_(e_0_0_e_1_0.id);
|
46
50
|
const result = run({
|
@@ -61,18 +65,18 @@ describe('syncstate', () => {
|
|
61
65
|
else {
|
62
66
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0_e_1_0, e_0_1_e_1_1]);
|
63
67
|
}
|
64
|
-
expect(result.newSyncState.upstreamHead).
|
68
|
+
expect(result.newSyncState.upstreamHead).toBe(e_0_1_e_1_1.id);
|
65
69
|
expect(result.newSyncState.localHead).toMatchObject(e_1_0_e_2_0.id);
|
66
70
|
expectEventArraysEqual(result.newEvents, [e_0_0_e_1_0, e_0_1_e_1_1]);
|
67
71
|
expectEventArraysEqual(result.eventsToRollback, [e_0_0, e_0_1, e_1_0]);
|
68
72
|
});
|
69
73
|
it('should rollback only to specified point', () => {
|
70
|
-
const syncState =
|
74
|
+
const syncState = {
|
71
75
|
pending: [e_1_0],
|
72
76
|
rollbackTail: [e_0_0, e_0_1],
|
73
77
|
upstreamHead: EventId.ROOT,
|
74
78
|
localHead: e_1_0.id,
|
75
|
-
}
|
79
|
+
};
|
76
80
|
const e_0_1_e_1_0 = e_0_1.rebase_(e_0_0.id);
|
77
81
|
const result = run({
|
78
82
|
syncState,
|
@@ -92,18 +96,13 @@ describe('syncstate', () => {
|
|
92
96
|
else {
|
93
97
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0, e_0_1_e_1_0]);
|
94
98
|
}
|
95
|
-
expect(result.newSyncState.upstreamHead).
|
99
|
+
expect(result.newSyncState.upstreamHead).toBe(e_0_1_e_1_0.id);
|
96
100
|
expect(result.newSyncState.localHead).toMatchObject(e_1_0_e_2_0.id);
|
97
101
|
expectEventArraysEqual(result.newEvents, [e_0_1_e_1_0]);
|
98
102
|
expectEventArraysEqual(result.eventsToRollback, [e_0_1, e_1_0]);
|
99
103
|
});
|
100
104
|
it('should work for empty pending', () => {
|
101
|
-
const syncState =
|
102
|
-
pending: [],
|
103
|
-
rollbackTail: [e_0_0],
|
104
|
-
upstreamHead: EventId.ROOT,
|
105
|
-
localHead: e_0_0.id,
|
106
|
-
});
|
105
|
+
const syncState = { pending: [], rollbackTail: [e_0_0], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
|
107
106
|
const result = run({
|
108
107
|
syncState,
|
109
108
|
payload: { _tag: 'upstream-rebase', rollbackUntil: e_0_0.id, newEvents: [e_1_0] },
|
@@ -111,29 +110,19 @@ describe('syncstate', () => {
|
|
111
110
|
expectRebase(result);
|
112
111
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
113
112
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_1_0]);
|
114
|
-
expect(result.newSyncState.upstreamHead).
|
113
|
+
expect(result.newSyncState.upstreamHead).toBe(e_1_0.id);
|
115
114
|
expect(result.newSyncState.localHead).toMatchObject(e_1_0.id);
|
116
|
-
expect(result.newEvents).
|
115
|
+
expect(result.newEvents).toEqual([e_1_0]);
|
117
116
|
});
|
118
117
|
it('should fail for empty rollback tail', () => {
|
119
|
-
const syncState =
|
120
|
-
pending: [],
|
121
|
-
rollbackTail: [],
|
122
|
-
upstreamHead: EventId.ROOT,
|
123
|
-
localHead: e_0_0.id,
|
124
|
-
});
|
118
|
+
const syncState = { pending: [], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
|
125
119
|
expect(() => run({
|
126
120
|
syncState,
|
127
121
|
payload: { _tag: 'upstream-rebase', rollbackUntil: e_0_0.id, newEvents: [e_1_0] },
|
128
122
|
})).toThrow();
|
129
123
|
});
|
130
124
|
it('should work for empty incoming', () => {
|
131
|
-
const syncState =
|
132
|
-
pending: [],
|
133
|
-
rollbackTail: [e_0_0],
|
134
|
-
upstreamHead: EventId.ROOT,
|
135
|
-
localHead: e_0_0.id,
|
136
|
-
});
|
125
|
+
const syncState = { pending: [], rollbackTail: [e_0_0], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
|
137
126
|
const result = run({
|
138
127
|
syncState,
|
139
128
|
payload: { _tag: 'upstream-rebase', rollbackUntil: e_0_0.id, newEvents: [] },
|
@@ -141,82 +130,57 @@ describe('syncstate', () => {
|
|
141
130
|
expectRebase(result);
|
142
131
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
143
132
|
expectEventArraysEqual(result.newSyncState.rollbackTail, []);
|
144
|
-
expect(result.newSyncState.upstreamHead).
|
133
|
+
expect(result.newSyncState.upstreamHead).toBe(EventId.ROOT);
|
145
134
|
expect(result.newSyncState.localHead).toMatchObject(EventId.ROOT);
|
146
|
-
expect(result.newEvents).
|
135
|
+
expect(result.newEvents).toEqual([]);
|
147
136
|
});
|
148
137
|
});
|
149
138
|
describe('upstream-advance: advance', () => {
|
150
139
|
it('should throw error if newEvents are not sorted in ascending order by eventId (local)', () => {
|
151
|
-
const syncState =
|
152
|
-
pending: [e_0_0],
|
153
|
-
rollbackTail: [],
|
154
|
-
upstreamHead: EventId.ROOT,
|
155
|
-
localHead: e_0_0.id,
|
156
|
-
});
|
140
|
+
const syncState = { pending: [e_0_0], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
|
157
141
|
expect(() => run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_1, e_0_0] } })).toThrow();
|
158
142
|
});
|
159
143
|
it('should throw error if newEvents are not sorted in ascending order by eventId (global)', () => {
|
160
|
-
const syncState =
|
161
|
-
pending: [e_0_0],
|
162
|
-
rollbackTail: [],
|
163
|
-
upstreamHead: EventId.ROOT,
|
164
|
-
localHead: e_0_0.id,
|
165
|
-
});
|
144
|
+
const syncState = { pending: [e_0_0], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
|
166
145
|
expect(() => run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_1_0, e_0_0] } })).toThrow();
|
167
146
|
});
|
168
147
|
it('should acknowledge pending event when receiving matching event', () => {
|
169
|
-
const syncState =
|
170
|
-
pending: [e_0_0],
|
171
|
-
rollbackTail: [],
|
172
|
-
upstreamHead: EventId.ROOT,
|
173
|
-
localHead: e_0_0.id,
|
174
|
-
});
|
148
|
+
const syncState = { pending: [e_0_0], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
|
175
149
|
const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_0] } });
|
176
150
|
expectAdvance(result);
|
177
151
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
178
152
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0]);
|
179
|
-
expect(result.newSyncState.upstreamHead).
|
153
|
+
expect(result.newSyncState.upstreamHead).toBe(e_0_0.id);
|
180
154
|
expect(result.newSyncState.localHead).toMatchObject(e_0_0.id);
|
181
|
-
expect(result.newEvents).
|
155
|
+
expect(result.newEvents).toEqual([]);
|
182
156
|
});
|
183
157
|
it('should acknowledge partial pending event when receiving matching event', () => {
|
184
|
-
const syncState =
|
158
|
+
const syncState = {
|
185
159
|
pending: [e_0_0, e_1_0],
|
186
160
|
rollbackTail: [],
|
187
161
|
upstreamHead: EventId.ROOT,
|
188
162
|
localHead: e_1_0.id,
|
189
|
-
}
|
163
|
+
};
|
190
164
|
const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_0] } });
|
191
165
|
expectAdvance(result);
|
192
166
|
expectEventArraysEqual(result.newSyncState.pending, [e_1_0]);
|
193
167
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0]);
|
194
|
-
expect(result.newSyncState.upstreamHead).
|
168
|
+
expect(result.newSyncState.upstreamHead).toBe(e_0_0.id);
|
195
169
|
expect(result.newSyncState.localHead).toMatchObject(e_1_0.id);
|
196
|
-
expect(result.newEvents).
|
170
|
+
expect(result.newEvents).toEqual([]);
|
197
171
|
});
|
198
172
|
it('should acknowledge pending event and add new event', () => {
|
199
|
-
const syncState =
|
200
|
-
pending: [e_0_0],
|
201
|
-
rollbackTail: [],
|
202
|
-
upstreamHead: EventId.ROOT,
|
203
|
-
localHead: e_0_0.id,
|
204
|
-
});
|
173
|
+
const syncState = { pending: [e_0_0], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
|
205
174
|
const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_0, e_0_1] } });
|
206
175
|
expectAdvance(result);
|
207
176
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
208
177
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0, e_0_1]);
|
209
|
-
expect(result.newSyncState.upstreamHead).
|
178
|
+
expect(result.newSyncState.upstreamHead).toBe(e_0_1.id);
|
210
179
|
expect(result.newSyncState.localHead).toMatchObject(e_0_1.id);
|
211
|
-
expect(result.newEvents).
|
180
|
+
expect(result.newEvents).toEqual([e_0_1]);
|
212
181
|
});
|
213
182
|
it('should acknowledge pending event and add multiple new events', () => {
|
214
|
-
const syncState =
|
215
|
-
pending: [e_0_1],
|
216
|
-
rollbackTail: [],
|
217
|
-
upstreamHead: e_0_0.id,
|
218
|
-
localHead: e_0_1.id,
|
219
|
-
});
|
183
|
+
const syncState = { pending: [e_0_1], rollbackTail: [], upstreamHead: e_0_0.id, localHead: e_0_1.id };
|
220
184
|
const result = run({
|
221
185
|
syncState,
|
222
186
|
payload: { _tag: 'upstream-advance', newEvents: [e_0_1, e_0_2, e_0_3, e_1_0, e_1_1] },
|
@@ -224,17 +188,17 @@ describe('syncstate', () => {
|
|
224
188
|
expectAdvance(result);
|
225
189
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
226
190
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1, e_0_2, e_0_3, e_1_0, e_1_1]);
|
227
|
-
expect(result.newSyncState.upstreamHead).
|
191
|
+
expect(result.newSyncState.upstreamHead).toBe(e_1_1.id);
|
228
192
|
expect(result.newSyncState.localHead).toMatchObject(e_1_1.id);
|
229
|
-
expect(result.newEvents).
|
193
|
+
expect(result.newEvents).toEqual([e_0_2, e_0_3, e_1_0, e_1_1]);
|
230
194
|
});
|
231
195
|
it('should ignore local events (incoming is subset of pending)', () => {
|
232
|
-
const syncState =
|
196
|
+
const syncState = {
|
233
197
|
pending: [e_r_1, e_0_0],
|
234
198
|
rollbackTail: [],
|
235
199
|
upstreamHead: EventId.ROOT,
|
236
200
|
localHead: e_0_0.id,
|
237
|
-
}
|
201
|
+
};
|
238
202
|
const result = run({
|
239
203
|
syncState,
|
240
204
|
payload: { _tag: 'upstream-advance', newEvents: [e_0_0] },
|
@@ -243,17 +207,17 @@ describe('syncstate', () => {
|
|
243
207
|
expectAdvance(result);
|
244
208
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
245
209
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_r_1, e_0_0]);
|
246
|
-
expect(result.newSyncState.upstreamHead).
|
210
|
+
expect(result.newSyncState.upstreamHead).toBe(e_0_0.id);
|
247
211
|
expect(result.newSyncState.localHead).toMatchObject(e_0_0.id);
|
248
|
-
expect(result.newEvents).
|
212
|
+
expect(result.newEvents).toEqual([]);
|
249
213
|
});
|
250
214
|
it('should ignore local events (incoming is subset of pending case 2)', () => {
|
251
|
-
const syncState =
|
215
|
+
const syncState = {
|
252
216
|
pending: [e_r_1, e_0_0, e_1_0],
|
253
217
|
rollbackTail: [],
|
254
218
|
upstreamHead: EventId.ROOT,
|
255
219
|
localHead: e_0_0.id,
|
256
|
-
}
|
220
|
+
};
|
257
221
|
const result = run({
|
258
222
|
syncState,
|
259
223
|
payload: { _tag: 'upstream-advance', newEvents: [e_0_0] },
|
@@ -262,17 +226,17 @@ describe('syncstate', () => {
|
|
262
226
|
expectAdvance(result);
|
263
227
|
expectEventArraysEqual(result.newSyncState.pending, [e_1_0]);
|
264
228
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_r_1, e_0_0]);
|
265
|
-
expect(result.newSyncState.upstreamHead).
|
229
|
+
expect(result.newSyncState.upstreamHead).toBe(e_0_0.id);
|
266
230
|
expect(result.newSyncState.localHead).toMatchObject(e_1_0.id);
|
267
|
-
expect(result.newEvents).
|
231
|
+
expect(result.newEvents).toEqual([]);
|
268
232
|
});
|
269
233
|
it('should ignore local events (incoming goes beyond pending)', () => {
|
270
|
-
const syncState =
|
234
|
+
const syncState = {
|
271
235
|
pending: [e_r_1, e_0_0, e_0_1],
|
272
236
|
rollbackTail: [],
|
273
237
|
upstreamHead: EventId.ROOT,
|
274
238
|
localHead: e_0_1.id,
|
275
|
-
}
|
239
|
+
};
|
276
240
|
const result = run({
|
277
241
|
syncState,
|
278
242
|
payload: { _tag: 'upstream-advance', newEvents: [e_0_0, e_1_0] },
|
@@ -281,37 +245,27 @@ describe('syncstate', () => {
|
|
281
245
|
expectAdvance(result);
|
282
246
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
283
247
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_r_1, e_0_0, e_0_1, e_1_0]);
|
284
|
-
expect(result.newSyncState.upstreamHead).
|
248
|
+
expect(result.newSyncState.upstreamHead).toBe(e_1_0.id);
|
285
249
|
expect(result.newSyncState.localHead).toMatchObject(e_1_0.id);
|
286
|
-
expect(result.newEvents).
|
250
|
+
expect(result.newEvents).toEqual([e_1_0]);
|
287
251
|
});
|
288
252
|
});
|
289
253
|
describe('upstream-advance: rebase', () => {
|
290
254
|
it('should rebase single local event to end', () => {
|
291
|
-
const syncState =
|
292
|
-
pending: [e_0_0],
|
293
|
-
rollbackTail: [],
|
294
|
-
upstreamHead: EventId.ROOT,
|
295
|
-
localHead: e_0_0.id,
|
296
|
-
});
|
255
|
+
const syncState = { pending: [e_0_0], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
|
297
256
|
const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_1] } });
|
298
257
|
const e_0_0_e_0_2 = e_0_0.rebase_(e_0_1.id);
|
299
258
|
expectRebase(result);
|
300
259
|
expectEventArraysEqual(result.newSyncState.pending, [e_0_0_e_0_2]);
|
301
260
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1]);
|
302
|
-
expect(result.newSyncState.upstreamHead).
|
261
|
+
expect(result.newSyncState.upstreamHead).toBe(e_0_1.id);
|
303
262
|
expect(result.newSyncState.localHead).toMatchObject(e_0_0_e_0_2.id);
|
304
263
|
expectEventArraysEqual(result.eventsToRollback, [e_0_0]);
|
305
264
|
expectEventArraysEqual(result.newEvents, [e_0_1, e_0_0_e_0_2]);
|
306
265
|
});
|
307
266
|
it('should rebase different event with same id (no rollback tail)', () => {
|
308
267
|
const e_0_0_b = new TestEvent({ global: 0, local: 0 }, EventId.ROOT, '0_0_b', true);
|
309
|
-
const syncState =
|
310
|
-
pending: [e_0_0_b],
|
311
|
-
rollbackTail: [],
|
312
|
-
upstreamHead: EventId.ROOT,
|
313
|
-
localHead: e_0_0_b.id,
|
314
|
-
});
|
268
|
+
const syncState = { pending: [e_0_0_b], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0_b.id };
|
315
269
|
const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_0_0] } });
|
316
270
|
const e_0_0_e_1_0 = e_0_0_b.rebase_(e_0_0.id);
|
317
271
|
expectRebase(result);
|
@@ -319,17 +273,17 @@ describe('syncstate', () => {
|
|
319
273
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0]);
|
320
274
|
expectEventArraysEqual(result.newEvents, [e_0_0, e_0_0_e_1_0]);
|
321
275
|
expectEventArraysEqual(result.eventsToRollback, [e_0_0_b]);
|
322
|
-
expect(result.newSyncState.upstreamHead).
|
276
|
+
expect(result.newSyncState.upstreamHead).toBe(e_0_0.id);
|
323
277
|
expect(result.newSyncState.localHead).toMatchObject(e_0_0_e_1_0.id);
|
324
278
|
});
|
325
279
|
it('should rebase different event with same id', () => {
|
326
280
|
const e_1_0_b = new TestEvent({ global: 1, local: 0 }, e_0_0.id, '1_0_b', false);
|
327
|
-
const syncState =
|
281
|
+
const syncState = {
|
328
282
|
pending: [e_1_0_b],
|
329
283
|
rollbackTail: [e_0_0, e_0_1],
|
330
284
|
upstreamHead: EventId.ROOT,
|
331
285
|
localHead: e_1_0_b.id,
|
332
|
-
}
|
286
|
+
};
|
333
287
|
const result = run({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_1_0] } });
|
334
288
|
const e_1_0_e_2_0 = e_1_0_b.rebase_(e_1_0.id);
|
335
289
|
expectRebase(result);
|
@@ -337,16 +291,11 @@ describe('syncstate', () => {
|
|
337
291
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0, e_0_1, e_1_0]);
|
338
292
|
expectEventArraysEqual(result.newEvents, [e_1_0, e_1_0_e_2_0]);
|
339
293
|
expectEventArraysEqual(result.eventsToRollback, [e_0_0, e_0_1, e_1_0_b]);
|
340
|
-
expect(result.newSyncState.upstreamHead).
|
294
|
+
expect(result.newSyncState.upstreamHead).toBe(e_1_0.id);
|
341
295
|
expect(result.newSyncState.localHead).toMatchObject(e_1_0_e_2_0.id);
|
342
296
|
});
|
343
297
|
it('should rebase single local event to end (more incoming events)', () => {
|
344
|
-
const syncState =
|
345
|
-
pending: [e_0_0],
|
346
|
-
rollbackTail: [],
|
347
|
-
upstreamHead: EventId.ROOT,
|
348
|
-
localHead: e_0_0.id,
|
349
|
-
});
|
298
|
+
const syncState = { pending: [e_0_0], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
|
350
299
|
const result = run({
|
351
300
|
syncState,
|
352
301
|
payload: { _tag: 'upstream-advance', newEvents: [e_0_1, e_0_2, e_0_3, e_1_0] },
|
@@ -355,16 +304,16 @@ describe('syncstate', () => {
|
|
355
304
|
expectRebase(result);
|
356
305
|
expectEventArraysEqual(result.newSyncState.pending, [e_0_0_e_2_0]);
|
357
306
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1, e_0_2, e_0_3, e_1_0]);
|
358
|
-
expect(result.newSyncState.upstreamHead).
|
307
|
+
expect(result.newSyncState.upstreamHead).toBe(e_1_0.id);
|
359
308
|
expect(result.newSyncState.localHead).toMatchObject(e_0_0_e_2_0.id);
|
360
309
|
});
|
361
310
|
it('should only rebase divergent events when first event matches', () => {
|
362
|
-
const syncState =
|
311
|
+
const syncState = {
|
363
312
|
pending: [e_0_0, e_0_1],
|
364
313
|
rollbackTail: [],
|
365
314
|
upstreamHead: EventId.ROOT,
|
366
315
|
localHead: e_0_0.id,
|
367
|
-
}
|
316
|
+
};
|
368
317
|
const result = run({
|
369
318
|
syncState,
|
370
319
|
payload: { _tag: 'upstream-advance', newEvents: [e_0_0, e_0_2, e_0_3, e_1_0] },
|
@@ -375,16 +324,16 @@ describe('syncstate', () => {
|
|
375
324
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0, e_0_2, e_0_3, e_1_0]);
|
376
325
|
expectEventArraysEqual(result.eventsToRollback, [e_0_1]);
|
377
326
|
expectEventArraysEqual(result.newEvents, [e_0_2, e_0_3, e_1_0, e_0_1_e_1_1]);
|
378
|
-
expect(result.newSyncState.upstreamHead).
|
327
|
+
expect(result.newSyncState.upstreamHead).toBe(e_1_0.id);
|
379
328
|
expect(result.newSyncState.localHead).toMatchObject(e_0_1_e_1_1.id);
|
380
329
|
});
|
381
330
|
it('should rebase all local events when incoming chain starts differently', () => {
|
382
|
-
const syncState =
|
331
|
+
const syncState = {
|
383
332
|
pending: [e_0_0, e_0_1],
|
384
333
|
rollbackTail: [],
|
385
334
|
upstreamHead: EventId.ROOT,
|
386
335
|
localHead: e_0_1.id,
|
387
|
-
}
|
336
|
+
};
|
388
337
|
const result = run({
|
389
338
|
syncState,
|
390
339
|
payload: { _tag: 'upstream-advance', newEvents: [e_0_1, e_0_2, e_0_3, e_1_0] },
|
@@ -396,35 +345,30 @@ describe('syncstate', () => {
|
|
396
345
|
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1, e_0_2, e_0_3, e_1_0]);
|
397
346
|
expectEventArraysEqual(result.newEvents, [e_0_1, e_0_2, e_0_3, e_1_0, e_0_0_e_1_1, e_0_1_e_1_2]);
|
398
347
|
expectEventArraysEqual(result.eventsToRollback, [e_0_0, e_0_1]);
|
399
|
-
expect(result.newSyncState.upstreamHead).
|
348
|
+
expect(result.newSyncState.upstreamHead).toBe(e_1_0.id);
|
400
349
|
expect(result.newSyncState.localHead).toMatchObject(e_0_1_e_1_2.id);
|
401
350
|
});
|
402
351
|
describe('local-push', () => {
|
403
352
|
describe('advance', () => {
|
404
353
|
it('should advance with new events', () => {
|
405
|
-
const syncState =
|
406
|
-
pending: [e_0_0],
|
407
|
-
rollbackTail: [],
|
408
|
-
upstreamHead: EventId.ROOT,
|
409
|
-
localHead: e_0_0.id,
|
410
|
-
});
|
354
|
+
const syncState = { pending: [e_0_0], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id };
|
411
355
|
const result = run({ syncState, payload: { _tag: 'local-push', newEvents: [e_0_1, e_0_2, e_0_3] } });
|
412
356
|
expectAdvance(result);
|
413
357
|
expectEventArraysEqual(result.newSyncState.pending, [e_0_0, e_0_1, e_0_2, e_0_3]);
|
414
358
|
expectEventArraysEqual(result.newSyncState.rollbackTail, []);
|
415
|
-
expect(result.newSyncState.upstreamHead).
|
359
|
+
expect(result.newSyncState.upstreamHead).toBe(EventId.ROOT);
|
416
360
|
expect(result.newSyncState.localHead).toMatchObject(e_0_3.id);
|
417
361
|
expectEventArraysEqual(result.newEvents, [e_0_1, e_0_2, e_0_3]);
|
418
362
|
});
|
419
363
|
});
|
420
364
|
describe('reject', () => {
|
421
365
|
it('should reject when new events are greater than pending events', () => {
|
422
|
-
const syncState =
|
366
|
+
const syncState = {
|
423
367
|
pending: [e_0_0, e_0_1],
|
424
368
|
rollbackTail: [],
|
425
369
|
upstreamHead: EventId.ROOT,
|
426
370
|
localHead: e_0_1.id,
|
427
|
-
}
|
371
|
+
};
|
428
372
|
const result = run({ syncState, payload: { _tag: 'local-push', newEvents: [e_0_1, e_0_2] } });
|
429
373
|
expectReject(result);
|
430
374
|
expect(result.expectedMinimumId).toMatchObject(e_0_2.id);
|
@@ -437,10 +381,10 @@ describe('syncstate', () => {
|
|
437
381
|
const expectEventArraysEqual = (actual, expected) => {
|
438
382
|
expect(actual.length).toBe(expected.length);
|
439
383
|
actual.forEach((event, i) => {
|
440
|
-
expect(event.id).
|
441
|
-
expect(event.parentId).
|
442
|
-
expect(event.mutation).
|
443
|
-
expect(event.args).
|
384
|
+
expect(event.id).toEqual(expected[i].id);
|
385
|
+
expect(event.parentId).toEqual(expected[i].parentId);
|
386
|
+
expect(event.mutation).toEqual(expected[i].mutation);
|
387
|
+
expect(event.args).toEqual(expected[i].args);
|
444
388
|
});
|
445
389
|
};
|
446
390
|
function expectAdvance(result) {
|