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