@livestore/common 0.3.0-dev.46 → 0.3.0-dev.48
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 +11 -9
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +5 -3
- package/dist/adapter-types.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +25 -25
- package/dist/devtools/devtools-messages-client-session.js +3 -3
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +6 -6
- package/dist/devtools/devtools-messages-leader.d.ts +30 -30
- package/dist/devtools/devtools-messages-leader.js +3 -3
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/devtools/mod.js +1 -1
- package/dist/devtools/mod.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +27 -25
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +10 -10
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +24 -24
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +1 -1
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/materialize-event.d.ts +3 -3
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +19 -15
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/types.d.ts +4 -4
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/make-client-session.d.ts +2 -1
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +11 -12
- package/dist/make-client-session.js.map +1 -1
- package/dist/materializer-helper.d.ts.map +1 -1
- package/dist/materializer-helper.js +4 -2
- package/dist/materializer-helper.js.map +1 -1
- package/dist/rematerialize-from-eventlog.js +9 -9
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventId.d.ts +28 -28
- package/dist/schema/EventId.d.ts.map +1 -1
- package/dist/schema/EventId.js +9 -9
- package/dist/schema/EventId.js.map +1 -1
- package/dist/schema/EventId.test.js +5 -5
- package/dist/schema/EventId.test.js.map +1 -1
- package/dist/schema/EventNumber.d.ts +57 -0
- package/dist/schema/EventNumber.d.ts.map +1 -0
- package/dist/schema/EventNumber.js +82 -0
- package/dist/schema/EventNumber.js.map +1 -0
- package/dist/schema/EventNumber.test.d.ts +2 -0
- package/dist/schema/EventNumber.test.d.ts.map +1 -0
- package/dist/schema/EventNumber.test.js +11 -0
- package/dist/schema/EventNumber.test.js.map +1 -0
- package/dist/schema/EventSequenceNumber.d.ts +57 -0
- package/dist/schema/EventSequenceNumber.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber.js +82 -0
- package/dist/schema/EventSequenceNumber.js.map +1 -0
- package/dist/schema/EventSequenceNumber.test.d.ts +2 -0
- package/dist/schema/EventSequenceNumber.test.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber.test.js +11 -0
- package/dist/schema/EventSequenceNumber.test.js.map +1 -0
- package/dist/schema/LiveStoreEvent.d.ts +81 -79
- package/dist/schema/LiveStoreEvent.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent.js +31 -32
- package/dist/schema/LiveStoreEvent.js.map +1 -1
- package/dist/schema/mod.d.ts +1 -1
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +1 -1
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +2 -2
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.d.ts +3 -3
- package/dist/schema/state/sqlite/query-builder/impl.test.js +9 -0
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/system-tables.d.ts +52 -52
- package/dist/schema/state/sqlite/system-tables.d.ts.map +1 -1
- package/dist/schema/state/sqlite/system-tables.js +11 -10
- package/dist/schema/state/sqlite/system-tables.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +7 -7
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/next/compact-events.js +38 -35
- package/dist/sync/next/compact-events.js.map +1 -1
- package/dist/sync/next/facts.d.ts +4 -4
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +8 -8
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +4 -4
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +7 -4
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/history-dag.d.ts +0 -2
- package/dist/sync/next/history-dag.d.ts.map +1 -1
- package/dist/sync/next/history-dag.js +15 -13
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +10 -4
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +13 -13
- package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +31 -31
- package/dist/sync/next/test/compact-events.test.js.map +1 -1
- package/dist/sync/next/test/event-fixtures.d.ts +10 -0
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +19 -13
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/sync.d.ts +11 -11
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +5 -5
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +18 -18
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +46 -47
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +110 -110
- 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 +4 -4
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/version.d.ts +2 -2
- package/dist/version.js +2 -2
- package/package.json +4 -4
- package/src/adapter-types.ts +11 -7
- package/src/devtools/devtools-messages-client-session.ts +3 -3
- package/src/devtools/devtools-messages-leader.ts +3 -3
- package/src/devtools/mod.ts +1 -1
- package/src/leader-thread/LeaderSyncProcessor.ts +36 -29
- package/src/leader-thread/eventlog.ts +36 -31
- package/src/leader-thread/leader-worker-devtools.ts +1 -1
- package/src/leader-thread/materialize-event.ts +21 -17
- package/src/leader-thread/types.ts +4 -4
- package/src/make-client-session.ts +14 -11
- package/src/materializer-helper.ts +5 -2
- package/src/rematerialize-from-eventlog.ts +10 -10
- package/src/schema/EventSequenceNumber.test.ts +12 -0
- package/src/schema/EventSequenceNumber.ts +121 -0
- package/src/schema/LiveStoreEvent.ts +66 -65
- package/src/schema/mod.ts +1 -1
- package/src/schema/state/sqlite/query-builder/impl.test.ts +9 -0
- package/src/schema/state/sqlite/query-builder/impl.ts +3 -2
- package/src/schema/state/sqlite/system-tables.ts +11 -10
- package/src/sync/ClientSessionSyncProcessor.ts +7 -7
- package/src/sync/next/compact-events.ts +38 -35
- package/src/sync/next/facts.ts +12 -9
- package/src/sync/next/history-dag-common.ts +9 -6
- package/src/sync/next/history-dag.ts +15 -16
- package/src/sync/next/rebase-events.ts +10 -4
- package/src/sync/next/test/compact-events.calculator.test.ts +13 -13
- package/src/sync/next/test/compact-events.test.ts +31 -31
- package/src/sync/next/test/event-fixtures.ts +20 -13
- package/src/sync/sync.ts +7 -7
- package/src/sync/syncstate.test.ts +112 -112
- package/src/sync/syncstate.ts +58 -48
- package/src/sync/validate-push-payload.ts +5 -5
- package/src/version.ts +2 -2
- package/src/schema/EventId.test.ts +0 -12
- package/src/schema/EventId.ts +0 -106
@@ -2,12 +2,19 @@ import { Schema } from '@livestore/utils/effect'
|
|
2
2
|
|
3
3
|
import type { EventDef } from '../../../schema/EventDef.js'
|
4
4
|
import { defineEvent, defineFacts } from '../../../schema/EventDef.js'
|
5
|
-
import * as
|
5
|
+
import * as EventSequenceNumber from '../../../schema/EventSequenceNumber.js'
|
6
6
|
import { factsSnapshotForDag, getFactsGroupForEventArgs } from '../facts.js'
|
7
7
|
import { historyDagFromNodes } from '../history-dag.js'
|
8
8
|
import type { HistoryDagNode } from '../history-dag-common.js'
|
9
9
|
import { rootEventNode } from '../history-dag-common.js'
|
10
10
|
|
11
|
+
export const printEvent = ({ seqNum, parentSeqNum, factsGroup, ...rest }: HistoryDagNode) => ({
|
12
|
+
seqNum: EventSequenceNumber.toString(seqNum),
|
13
|
+
parentSeqNum: EventSequenceNumber.toString(parentSeqNum),
|
14
|
+
...rest,
|
15
|
+
facts: factsGroup,
|
16
|
+
})
|
17
|
+
|
11
18
|
/** Used for conflict detection and event history compaction */
|
12
19
|
export const facts = defineFacts({
|
13
20
|
todoExists: (id: string) => `todo-exists-${id}`,
|
@@ -131,15 +138,15 @@ export const toEventNodes = (
|
|
131
138
|
): HistoryDagNode[] => {
|
132
139
|
const nodesAcc: HistoryDagNode[] = [rootEventNode]
|
133
140
|
|
134
|
-
let
|
141
|
+
let currentEventSequenceNumber: EventSequenceNumber.EventSequenceNumber = EventSequenceNumber.ROOT
|
135
142
|
|
136
143
|
const eventNodes = partialEvents.map((partialEvent) => {
|
137
144
|
const eventDef = eventDefs[partialEvent.name]!
|
138
|
-
const
|
139
|
-
|
145
|
+
const eventNum = EventSequenceNumber.nextPair(currentEventSequenceNumber, eventDef.options.clientOnly).seqNum
|
146
|
+
currentEventSequenceNumber = eventNum
|
140
147
|
|
141
148
|
const factsSnapshot = factsSnapshotForDag(historyDagFromNodes(nodesAcc, { skipFactsCheck: true }), undefined)
|
142
|
-
// console.log('factsSnapshot',
|
149
|
+
// console.log('factsSnapshot', eventNum, factsSnapshot)
|
143
150
|
// const depRead: EventDefFactsSnapshot = new Map<string, any>()
|
144
151
|
// const factsSnapshotProxy = new Proxy(factsSnapshot, {
|
145
152
|
// get: (target, prop) => {
|
@@ -188,8 +195,8 @@ export const toEventNodes = (
|
|
188
195
|
})
|
189
196
|
|
190
197
|
const node = {
|
191
|
-
|
192
|
-
|
198
|
+
seqNum: eventNum,
|
199
|
+
parentSeqNum: getParentNum(eventNum),
|
193
200
|
name: partialEvent.name,
|
194
201
|
args: partialEvent.args,
|
195
202
|
factsGroup: facts,
|
@@ -207,13 +214,13 @@ export const toEventNodes = (
|
|
207
214
|
return eventNodes
|
208
215
|
}
|
209
216
|
|
210
|
-
const
|
211
|
-
const
|
212
|
-
const
|
217
|
+
const getParentNum = (eventNum: EventSequenceNumber.EventSequenceNumber): EventSequenceNumber.EventSequenceNumber => {
|
218
|
+
const globalParentNum = eventNum.global
|
219
|
+
const clientParentNum = eventNum.client - 1
|
213
220
|
|
214
|
-
if (
|
215
|
-
return
|
221
|
+
if (clientParentNum < 0) {
|
222
|
+
return EventSequenceNumber.make({ global: globalParentNum - 1, client: EventSequenceNumber.clientDefault })
|
216
223
|
}
|
217
224
|
|
218
|
-
return
|
225
|
+
return EventSequenceNumber.make({ global: globalParentNum, client: clientParentNum })
|
219
226
|
}
|
package/src/sync/sync.ts
CHANGED
@@ -3,7 +3,7 @@ import { Schema } from '@livestore/utils/effect'
|
|
3
3
|
|
4
4
|
import type { UnexpectedError } from '../adapter-types.js'
|
5
5
|
import type { InitialSyncOptions } from '../leader-thread/types.js'
|
6
|
-
import * as
|
6
|
+
import * as EventSequenceNumber from '../schema/EventSequenceNumber.js'
|
7
7
|
import type * as LiveStoreEvent from '../schema/LiveStoreEvent.js'
|
8
8
|
|
9
9
|
/**
|
@@ -42,7 +42,7 @@ export type SyncBackend<TSyncMetadata = Schema.JsonValue> = {
|
|
42
42
|
connect: Effect.Effect<void, IsOfflineError | UnexpectedError, HttpClient.HttpClient | Scope.Scope>
|
43
43
|
pull: (
|
44
44
|
args: Option.Option<{
|
45
|
-
cursor:
|
45
|
+
cursor: EventSequenceNumber.EventSequenceNumber
|
46
46
|
metadata: Option.Option<TSyncMetadata>
|
47
47
|
}>,
|
48
48
|
) => Stream.Stream<
|
@@ -61,7 +61,7 @@ export type SyncBackend<TSyncMetadata = Schema.JsonValue> = {
|
|
61
61
|
/**
|
62
62
|
* Constraints for batch:
|
63
63
|
* - Number of events: 1-100
|
64
|
-
* -
|
64
|
+
* - sequence numbers must be in ascending order
|
65
65
|
* */
|
66
66
|
batch: ReadonlyArray<LiveStoreEvent.AnyEncodedGlobal>,
|
67
67
|
) => Effect.Effect<void, IsOfflineError | InvalidPushError, HttpClient.HttpClient>
|
@@ -80,8 +80,8 @@ export class InvalidPushError extends Schema.TaggedError<InvalidPushError>()('In
|
|
80
80
|
message: Schema.String,
|
81
81
|
}),
|
82
82
|
Schema.TaggedStruct('ServerAhead', {
|
83
|
-
|
84
|
-
|
83
|
+
minimumExpectedNum: Schema.Number,
|
84
|
+
providedNum: Schema.Number,
|
85
85
|
}),
|
86
86
|
),
|
87
87
|
}) {}
|
@@ -91,8 +91,8 @@ export class InvalidPullError extends Schema.TaggedError<InvalidPullError>()('In
|
|
91
91
|
}) {}
|
92
92
|
|
93
93
|
export class LeaderAheadError extends Schema.TaggedError<LeaderAheadError>()('LeaderAheadError', {
|
94
|
-
|
95
|
-
|
94
|
+
minimumExpectedNum: EventSequenceNumber.EventSequenceNumber,
|
95
|
+
providedNum: EventSequenceNumber.EventSequenceNumber,
|
96
96
|
/** Generation number the client session should use for subsequent pushes */
|
97
97
|
// nextGeneration: Schema.Number,
|
98
98
|
}) {}
|
@@ -1,20 +1,20 @@
|
|
1
1
|
/* eslint-disable prefer-arrow/prefer-arrow-functions */
|
2
2
|
import { describe, expect, it } from 'vitest'
|
3
3
|
|
4
|
-
import * as
|
4
|
+
import * as EventSequenceNumber from '../schema/EventSequenceNumber.js'
|
5
5
|
import * as LiveStoreEvent from '../schema/LiveStoreEvent.js'
|
6
6
|
import * as SyncState from './syncstate.js'
|
7
7
|
|
8
8
|
class TestEvent extends LiveStoreEvent.EncodedWithMeta {
|
9
9
|
constructor(
|
10
|
-
|
11
|
-
|
10
|
+
seqNum: EventSequenceNumber.EventSequenceNumber | typeof EventSequenceNumber.EventSequenceNumber.Encoded,
|
11
|
+
parentSeqNum: EventSequenceNumber.EventSequenceNumber,
|
12
12
|
public readonly payload: string,
|
13
13
|
public readonly isLocal: boolean,
|
14
14
|
) {
|
15
15
|
super({
|
16
|
-
|
17
|
-
|
16
|
+
seqNum: EventSequenceNumber.make(seqNum),
|
17
|
+
parentSeqNum: EventSequenceNumber.make(parentSeqNum),
|
18
18
|
name: 'a',
|
19
19
|
args: payload,
|
20
20
|
clientId: 'static-local-id',
|
@@ -22,22 +22,22 @@ class TestEvent extends LiveStoreEvent.EncodedWithMeta {
|
|
22
22
|
})
|
23
23
|
}
|
24
24
|
|
25
|
-
rebase_ = (
|
26
|
-
return this.rebase(
|
25
|
+
rebase_ = (parentSeqNum: EventSequenceNumber.EventSequenceNumber) => {
|
26
|
+
return this.rebase(parentSeqNum, this.isLocal)
|
27
27
|
}
|
28
28
|
|
29
29
|
// Only used for Vitest printing
|
30
|
-
// toJSON = () => `(${this.
|
30
|
+
// toJSON = () => `(${this.seqNum.global},${this.seqNum.client},${this.payload})`
|
31
31
|
// toString = () => this.toJSON()
|
32
32
|
}
|
33
33
|
|
34
|
-
const e0_1 = new TestEvent({ global: 0, client: 1 },
|
35
|
-
const e1_0 = new TestEvent({ global: 1, client: 0 },
|
36
|
-
const e1_1 = new TestEvent({ global: 1, client: 1 }, e1_0.
|
37
|
-
const e1_2 = new TestEvent({ global: 1, client: 2 }, e1_1.
|
38
|
-
const e1_3 = new TestEvent({ global: 1, client: 3 }, e1_2.
|
39
|
-
const e2_0 = new TestEvent({ global: 2, client: 0 }, e1_0.
|
40
|
-
const e2_1 = new TestEvent({ global: 2, client: 1 }, e2_0.
|
34
|
+
const e0_1 = new TestEvent({ global: 0, client: 1 }, EventSequenceNumber.ROOT, 'a', true)
|
35
|
+
const e1_0 = new TestEvent({ global: 1, client: 0 }, EventSequenceNumber.ROOT, 'a', false)
|
36
|
+
const e1_1 = new TestEvent({ global: 1, client: 1 }, e1_0.seqNum, 'a', true)
|
37
|
+
const e1_2 = new TestEvent({ global: 1, client: 2 }, e1_1.seqNum, 'a', true)
|
38
|
+
const e1_3 = new TestEvent({ global: 1, client: 3 }, e1_2.seqNum, 'a', true)
|
39
|
+
const e2_0 = new TestEvent({ global: 2, client: 0 }, e1_0.seqNum, 'a', false)
|
40
|
+
const e2_1 = new TestEvent({ global: 2, client: 1 }, e2_0.seqNum, 'a', true)
|
41
41
|
|
42
42
|
const isEqualEvent = LiveStoreEvent.isEqualEncoded
|
43
43
|
|
@@ -59,11 +59,11 @@ describe('syncstate', () => {
|
|
59
59
|
it('should rollback until start', () => {
|
60
60
|
const syncState = new SyncState.SyncState({
|
61
61
|
pending: [e2_0],
|
62
|
-
upstreamHead:
|
63
|
-
localHead: e2_0.
|
62
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
63
|
+
localHead: e2_0.seqNum,
|
64
64
|
})
|
65
|
-
const e1_0_e2_0 = e1_0.rebase_(e2_0.
|
66
|
-
const e1_1_e2_1 = e1_1.rebase_(e1_0_e2_0.
|
65
|
+
const e1_0_e2_0 = e1_0.rebase_(e2_0.seqNum)
|
66
|
+
const e1_1_e2_1 = e1_1.rebase_(e1_0_e2_0.seqNum)
|
67
67
|
const result = merge({
|
68
68
|
syncState,
|
69
69
|
payload: SyncState.PayloadUpstreamRebase.make({
|
@@ -71,11 +71,11 @@ describe('syncstate', () => {
|
|
71
71
|
newEvents: [e1_0_e2_0, e1_1_e2_1],
|
72
72
|
}),
|
73
73
|
})
|
74
|
-
const e2_0_e3_0 = e2_0.rebase_(e1_0_e2_0.
|
74
|
+
const e2_0_e3_0 = e2_0.rebase_(e1_0_e2_0.seqNum)
|
75
75
|
expectRebase(result)
|
76
76
|
expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0])
|
77
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_1.
|
78
|
-
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.
|
77
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_1.seqNum)
|
78
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.seqNum)
|
79
79
|
expectEventArraysEqual(result.newEvents, [e1_0_e2_0, e1_1_e2_1, e2_0_e3_0])
|
80
80
|
expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1, e2_0])
|
81
81
|
})
|
@@ -83,10 +83,10 @@ describe('syncstate', () => {
|
|
83
83
|
it('should rollback only to specified point', () => {
|
84
84
|
const syncState = new SyncState.SyncState({
|
85
85
|
pending: [e2_0],
|
86
|
-
upstreamHead:
|
87
|
-
localHead: e2_0.
|
86
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
87
|
+
localHead: e2_0.seqNum,
|
88
88
|
})
|
89
|
-
const e1_1_e2_0 = e1_1.rebase_(e1_0.
|
89
|
+
const e1_1_e2_0 = e1_1.rebase_(e1_0.seqNum)
|
90
90
|
const result = merge({
|
91
91
|
syncState,
|
92
92
|
payload: SyncState.PayloadUpstreamRebase.make({
|
@@ -94,11 +94,11 @@ describe('syncstate', () => {
|
|
94
94
|
rollbackEvents: [e1_1],
|
95
95
|
}),
|
96
96
|
})
|
97
|
-
const e2_0_e3_0 = e2_0.rebase_(e1_1_e2_0.
|
97
|
+
const e2_0_e3_0 = e2_0.rebase_(e1_1_e2_0.seqNum)
|
98
98
|
expectRebase(result)
|
99
99
|
expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0])
|
100
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_0.
|
101
|
-
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.
|
100
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_0.seqNum)
|
101
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.seqNum)
|
102
102
|
expectEventArraysEqual(result.newEvents, [e1_1_e2_0, e2_0_e3_0])
|
103
103
|
expectEventArraysEqual(result.rollbackEvents, [e1_1, e2_0])
|
104
104
|
})
|
@@ -106,8 +106,8 @@ describe('syncstate', () => {
|
|
106
106
|
it('should work for empty pending', () => {
|
107
107
|
const syncState = new SyncState.SyncState({
|
108
108
|
pending: [],
|
109
|
-
upstreamHead:
|
110
|
-
localHead: e1_0.
|
109
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
110
|
+
localHead: e1_0.seqNum,
|
111
111
|
})
|
112
112
|
const result = merge({
|
113
113
|
syncState,
|
@@ -115,28 +115,28 @@ describe('syncstate', () => {
|
|
115
115
|
})
|
116
116
|
expectRebase(result)
|
117
117
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
118
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.
|
119
|
-
expect(result.newSyncState.localHead).toMatchObject(e2_0.
|
118
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum)
|
119
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum)
|
120
120
|
expect(result.newEvents).toStrictEqual([e2_0])
|
121
121
|
})
|
122
122
|
})
|
123
123
|
|
124
124
|
describe('upstream-advance: advance', () => {
|
125
|
-
it('should throw error if newEvents are not sorted in ascending order by
|
125
|
+
it('should throw error if newEvents are not sorted in ascending order by event number (client)', () => {
|
126
126
|
const syncState = new SyncState.SyncState({
|
127
127
|
pending: [e1_0],
|
128
|
-
upstreamHead:
|
129
|
-
localHead: e1_0.
|
128
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
129
|
+
localHead: e1_0.seqNum,
|
130
130
|
})
|
131
131
|
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_0] } })
|
132
132
|
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
133
133
|
})
|
134
134
|
|
135
|
-
it('should throw error if newEvents are not sorted in ascending order by
|
135
|
+
it('should throw error if newEvents are not sorted in ascending order by event number (global)', () => {
|
136
136
|
const syncState = new SyncState.SyncState({
|
137
137
|
pending: [e1_0],
|
138
|
-
upstreamHead:
|
139
|
-
localHead: e1_0.
|
138
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
139
|
+
localHead: e1_0.seqNum,
|
140
140
|
})
|
141
141
|
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0, e1_0] } })
|
142
142
|
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
@@ -145,8 +145,8 @@ describe('syncstate', () => {
|
|
145
145
|
it('should throw error if incoming event is < expected upstream head', () => {
|
146
146
|
const syncState = new SyncState.SyncState({
|
147
147
|
pending: [],
|
148
|
-
upstreamHead: e2_0.
|
149
|
-
localHead: e2_0.
|
148
|
+
upstreamHead: e2_0.seqNum,
|
149
|
+
localHead: e2_0.seqNum,
|
150
150
|
})
|
151
151
|
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
|
152
152
|
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
@@ -155,8 +155,8 @@ describe('syncstate', () => {
|
|
155
155
|
it('should throw error if incoming event is = expected upstream head', () => {
|
156
156
|
const syncState = new SyncState.SyncState({
|
157
157
|
pending: [],
|
158
|
-
upstreamHead: e2_0.
|
159
|
-
localHead: e2_0.
|
158
|
+
upstreamHead: e2_0.seqNum,
|
159
|
+
localHead: e2_0.seqNum,
|
160
160
|
})
|
161
161
|
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0] } })
|
162
162
|
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
@@ -165,15 +165,15 @@ describe('syncstate', () => {
|
|
165
165
|
it('should confirm pending event when receiving matching event', () => {
|
166
166
|
const syncState = new SyncState.SyncState({
|
167
167
|
pending: [e1_0],
|
168
|
-
upstreamHead:
|
169
|
-
localHead: e1_0.
|
168
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
169
|
+
localHead: e1_0.seqNum,
|
170
170
|
})
|
171
171
|
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
|
172
172
|
|
173
173
|
expectAdvance(result)
|
174
174
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
175
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.
|
176
|
-
expect(result.newSyncState.localHead).toMatchObject(e1_0.
|
175
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum)
|
176
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0.seqNum)
|
177
177
|
expectEventArraysEqual(result.newEvents, [])
|
178
178
|
expectEventArraysEqual(result.confirmedEvents, [e1_0])
|
179
179
|
})
|
@@ -181,15 +181,15 @@ describe('syncstate', () => {
|
|
181
181
|
it('should confirm partial pending event when receiving matching event', () => {
|
182
182
|
const syncState = new SyncState.SyncState({
|
183
183
|
pending: [e1_0, e2_0],
|
184
|
-
upstreamHead:
|
185
|
-
localHead: e2_0.
|
184
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
185
|
+
localHead: e2_0.seqNum,
|
186
186
|
})
|
187
187
|
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
|
188
188
|
|
189
189
|
expectAdvance(result)
|
190
190
|
expectEventArraysEqual(result.newSyncState.pending, [e2_0])
|
191
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.
|
192
|
-
expect(result.newSyncState.localHead).toMatchObject(e2_0.
|
191
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum)
|
192
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum)
|
193
193
|
expectEventArraysEqual(result.newEvents, [])
|
194
194
|
expectEventArraysEqual(result.confirmedEvents, [e1_0])
|
195
195
|
})
|
@@ -197,15 +197,15 @@ describe('syncstate', () => {
|
|
197
197
|
it('should confirm pending event and add new event', () => {
|
198
198
|
const syncState = new SyncState.SyncState({
|
199
199
|
pending: [e1_0],
|
200
|
-
upstreamHead:
|
201
|
-
localHead: e1_0.
|
200
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
201
|
+
localHead: e1_0.seqNum,
|
202
202
|
})
|
203
203
|
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0, e1_1] } })
|
204
204
|
|
205
205
|
expectAdvance(result)
|
206
206
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
207
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.
|
208
|
-
expect(result.newSyncState.localHead).toMatchObject(e1_1.
|
207
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.seqNum)
|
208
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1.seqNum)
|
209
209
|
expect(result.newEvents).toStrictEqual([e1_1])
|
210
210
|
expectEventArraysEqual(result.confirmedEvents, [e1_0])
|
211
211
|
})
|
@@ -213,8 +213,8 @@ describe('syncstate', () => {
|
|
213
213
|
it('should confirm pending event and add multiple new events', () => {
|
214
214
|
const syncState = new SyncState.SyncState({
|
215
215
|
pending: [e1_1],
|
216
|
-
upstreamHead: e1_0.
|
217
|
-
localHead: e1_1.
|
216
|
+
upstreamHead: e1_0.seqNum,
|
217
|
+
localHead: e1_1.seqNum,
|
218
218
|
})
|
219
219
|
const result = merge({
|
220
220
|
syncState,
|
@@ -223,8 +223,8 @@ describe('syncstate', () => {
|
|
223
223
|
|
224
224
|
expectAdvance(result)
|
225
225
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
226
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e2_1.
|
227
|
-
expect(result.newSyncState.localHead).toMatchObject(e2_1.
|
226
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_1.seqNum)
|
227
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_1.seqNum)
|
228
228
|
expect(result.newEvents).toStrictEqual([e1_2, e1_3, e2_0, e2_1])
|
229
229
|
expectEventArraysEqual(result.confirmedEvents, [e1_1])
|
230
230
|
})
|
@@ -232,8 +232,8 @@ describe('syncstate', () => {
|
|
232
232
|
it('should confirm pending global event while keep pending client events', () => {
|
233
233
|
const syncState = new SyncState.SyncState({
|
234
234
|
pending: [e1_0, e1_1],
|
235
|
-
upstreamHead:
|
236
|
-
localHead: e1_1.
|
235
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
236
|
+
localHead: e1_1.seqNum,
|
237
237
|
})
|
238
238
|
const result = merge({
|
239
239
|
syncState,
|
@@ -242,8 +242,8 @@ describe('syncstate', () => {
|
|
242
242
|
|
243
243
|
expectAdvance(result)
|
244
244
|
expectEventArraysEqual(result.newSyncState.pending, [e1_1])
|
245
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.
|
246
|
-
expect(result.newSyncState.localHead).toMatchObject(e1_1.
|
245
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum)
|
246
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1.seqNum)
|
247
247
|
expectEventArraysEqual(result.newEvents, [])
|
248
248
|
expectEventArraysEqual(result.confirmedEvents, [e1_0])
|
249
249
|
})
|
@@ -251,8 +251,8 @@ describe('syncstate', () => {
|
|
251
251
|
it('should ignore client events (incoming is subset of pending)', () => {
|
252
252
|
const syncState = new SyncState.SyncState({
|
253
253
|
pending: [e0_1, e1_0],
|
254
|
-
upstreamHead:
|
255
|
-
localHead: e1_0.
|
254
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
255
|
+
localHead: e1_0.seqNum,
|
256
256
|
})
|
257
257
|
const result = merge({
|
258
258
|
syncState,
|
@@ -261,8 +261,8 @@ describe('syncstate', () => {
|
|
261
261
|
})
|
262
262
|
expectAdvance(result)
|
263
263
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
264
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.
|
265
|
-
expect(result.newSyncState.localHead).toMatchObject(e1_0.
|
264
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum)
|
265
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0.seqNum)
|
266
266
|
expectEventArraysEqual(result.newEvents, [])
|
267
267
|
expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0])
|
268
268
|
})
|
@@ -270,8 +270,8 @@ describe('syncstate', () => {
|
|
270
270
|
it('should ignore client events (incoming is subset of pending case 2)', () => {
|
271
271
|
const syncState = new SyncState.SyncState({
|
272
272
|
pending: [e0_1, e1_0, e2_0],
|
273
|
-
upstreamHead:
|
274
|
-
localHead: e1_0.
|
273
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
274
|
+
localHead: e1_0.seqNum,
|
275
275
|
})
|
276
276
|
const result = merge({
|
277
277
|
syncState,
|
@@ -280,8 +280,8 @@ describe('syncstate', () => {
|
|
280
280
|
})
|
281
281
|
expectAdvance(result)
|
282
282
|
expectEventArraysEqual(result.newSyncState.pending, [e2_0])
|
283
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.
|
284
|
-
expect(result.newSyncState.localHead).toMatchObject(e2_0.
|
283
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum)
|
284
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum)
|
285
285
|
expectEventArraysEqual(result.newEvents, [])
|
286
286
|
expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0])
|
287
287
|
})
|
@@ -289,8 +289,8 @@ describe('syncstate', () => {
|
|
289
289
|
it('should ignore client events (incoming goes beyond pending)', () => {
|
290
290
|
const syncState = new SyncState.SyncState({
|
291
291
|
pending: [e0_1, e1_0, e1_1],
|
292
|
-
upstreamHead:
|
293
|
-
localHead: e1_1.
|
292
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
293
|
+
localHead: e1_1.seqNum,
|
294
294
|
})
|
295
295
|
const result = merge({
|
296
296
|
syncState,
|
@@ -300,8 +300,8 @@ describe('syncstate', () => {
|
|
300
300
|
|
301
301
|
expectAdvance(result)
|
302
302
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
303
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.
|
304
|
-
expect(result.newSyncState.localHead).toMatchObject(e2_0.
|
303
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum)
|
304
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum)
|
305
305
|
expect(result.newEvents).toStrictEqual([e2_0])
|
306
306
|
expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0, e1_1])
|
307
307
|
})
|
@@ -309,8 +309,8 @@ describe('syncstate', () => {
|
|
309
309
|
it('should fail if incoming event is ≤ local head', () => {
|
310
310
|
const syncState = new SyncState.SyncState({
|
311
311
|
pending: [],
|
312
|
-
upstreamHead: e2_0.
|
313
|
-
localHead: e2_0.
|
312
|
+
upstreamHead: e2_0.seqNum,
|
313
|
+
localHead: e2_0.seqNum,
|
314
314
|
})
|
315
315
|
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
|
316
316
|
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
@@ -321,99 +321,99 @@ describe('syncstate', () => {
|
|
321
321
|
it('should rebase single client event to end', () => {
|
322
322
|
const syncState = new SyncState.SyncState({
|
323
323
|
pending: [e1_0],
|
324
|
-
upstreamHead:
|
325
|
-
localHead: e1_0.
|
324
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
325
|
+
localHead: e1_0.seqNum,
|
326
326
|
})
|
327
327
|
const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1] }) })
|
328
328
|
|
329
|
-
const e1_0_e1_2 = e1_0.rebase_(e1_1.
|
329
|
+
const e1_0_e1_2 = e1_0.rebase_(e1_1.seqNum)
|
330
330
|
|
331
331
|
expectRebase(result)
|
332
332
|
expectEventArraysEqual(result.newSyncState.pending, [e1_0_e1_2])
|
333
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.
|
334
|
-
expect(result.newSyncState.localHead).toMatchObject(e1_0_e1_2.
|
333
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.seqNum)
|
334
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0_e1_2.seqNum)
|
335
335
|
expectEventArraysEqual(result.rollbackEvents, [e1_0])
|
336
336
|
expectEventArraysEqual(result.newEvents, [e1_1, e1_0_e1_2])
|
337
337
|
})
|
338
338
|
|
339
339
|
it('should rebase different event with same id', () => {
|
340
|
-
const e2_0_b = new TestEvent({ global: 1, client: 0 }, e1_0.
|
340
|
+
const e2_0_b = new TestEvent({ global: 1, client: 0 }, e1_0.seqNum, '1_0_b', false)
|
341
341
|
const syncState = new SyncState.SyncState({
|
342
342
|
pending: [e2_0_b],
|
343
|
-
upstreamHead:
|
344
|
-
localHead: e2_0_b.
|
343
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
344
|
+
localHead: e2_0_b.seqNum,
|
345
345
|
})
|
346
346
|
const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e2_0] }) })
|
347
|
-
const e2_0_e3_0 = e2_0_b.rebase_(e2_0.
|
347
|
+
const e2_0_e3_0 = e2_0_b.rebase_(e2_0.seqNum)
|
348
348
|
|
349
349
|
expectRebase(result)
|
350
350
|
expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0])
|
351
351
|
expectEventArraysEqual(result.newEvents, [e2_0, e2_0_e3_0])
|
352
352
|
expectEventArraysEqual(result.rollbackEvents, [e2_0_b])
|
353
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.
|
354
|
-
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.
|
353
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum)
|
354
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.seqNum)
|
355
355
|
})
|
356
356
|
|
357
357
|
it('should rebase single client event to end (more incoming events)', () => {
|
358
358
|
const syncState = new SyncState.SyncState({
|
359
359
|
pending: [e1_0],
|
360
|
-
upstreamHead:
|
361
|
-
localHead: e1_0.
|
360
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
361
|
+
localHead: e1_0.seqNum,
|
362
362
|
})
|
363
363
|
const result = merge({
|
364
364
|
syncState,
|
365
365
|
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
|
366
366
|
})
|
367
367
|
|
368
|
-
const e1_0_e3_0 = e1_0.rebase_(e2_0.
|
368
|
+
const e1_0_e3_0 = e1_0.rebase_(e2_0.seqNum)
|
369
369
|
|
370
370
|
expectRebase(result)
|
371
371
|
expectEventArraysEqual(result.newSyncState.pending, [e1_0_e3_0])
|
372
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.
|
373
|
-
expect(result.newSyncState.localHead).toMatchObject(e1_0_e3_0.
|
372
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum)
|
373
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0_e3_0.seqNum)
|
374
374
|
})
|
375
375
|
|
376
376
|
it('should only rebase divergent events when first event matches', () => {
|
377
377
|
const syncState = new SyncState.SyncState({
|
378
378
|
pending: [e1_0, e1_1],
|
379
|
-
upstreamHead:
|
380
|
-
localHead: e1_0.
|
379
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
380
|
+
localHead: e1_0.seqNum,
|
381
381
|
})
|
382
382
|
const result = merge({
|
383
383
|
syncState,
|
384
384
|
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_0, e1_2, e1_3, e2_0] }),
|
385
385
|
})
|
386
386
|
|
387
|
-
const e1_1_e2_1 = e1_1.rebase_(e2_0.
|
387
|
+
const e1_1_e2_1 = e1_1.rebase_(e2_0.seqNum)
|
388
388
|
|
389
389
|
expectRebase(result)
|
390
390
|
expectEventArraysEqual(result.newSyncState.pending, [e1_1_e2_1])
|
391
391
|
expectEventArraysEqual(result.rollbackEvents, [e1_1])
|
392
392
|
expectEventArraysEqual(result.newEvents, [e1_2, e1_3, e2_0, e1_1_e2_1])
|
393
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.
|
394
|
-
expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_1.
|
393
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum)
|
394
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_1.seqNum)
|
395
395
|
})
|
396
396
|
|
397
397
|
it('should rebase all client events when incoming chain starts differently', () => {
|
398
398
|
const syncState = new SyncState.SyncState({
|
399
399
|
pending: [e1_0, e1_1],
|
400
|
-
upstreamHead:
|
401
|
-
localHead: e1_1.
|
400
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
401
|
+
localHead: e1_1.seqNum,
|
402
402
|
})
|
403
403
|
const result = merge({
|
404
404
|
syncState,
|
405
405
|
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
|
406
406
|
})
|
407
407
|
|
408
|
-
const e1_0_e2_1 = e1_0.rebase_(e2_0.
|
409
|
-
const e1_1_e2_2 = e1_1.rebase_(e1_0_e2_1.
|
408
|
+
const e1_0_e2_1 = e1_0.rebase_(e2_0.seqNum)
|
409
|
+
const e1_1_e2_2 = e1_1.rebase_(e1_0_e2_1.seqNum)
|
410
410
|
|
411
411
|
expectRebase(result)
|
412
412
|
expectEventArraysEqual(result.newSyncState.pending, [e1_0_e2_1, e1_1_e2_2])
|
413
413
|
expectEventArraysEqual(result.newEvents, [e1_1, e1_2, e1_3, e2_0, e1_0_e2_1, e1_1_e2_2])
|
414
414
|
expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1])
|
415
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.
|
416
|
-
expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_2.
|
415
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum)
|
416
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_2.seqNum)
|
417
417
|
})
|
418
418
|
|
419
419
|
describe('local-push', () => {
|
@@ -421,8 +421,8 @@ describe('syncstate', () => {
|
|
421
421
|
it('should advance with new events', () => {
|
422
422
|
const syncState = new SyncState.SyncState({
|
423
423
|
pending: [e1_0],
|
424
|
-
upstreamHead:
|
425
|
-
localHead: e1_0.
|
424
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
425
|
+
localHead: e1_0.seqNum,
|
426
426
|
})
|
427
427
|
const result = merge({
|
428
428
|
syncState,
|
@@ -431,8 +431,8 @@ describe('syncstate', () => {
|
|
431
431
|
|
432
432
|
expectAdvance(result)
|
433
433
|
expectEventArraysEqual(result.newSyncState.pending, [e1_0, e1_1, e1_2, e1_3])
|
434
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
435
|
-
expect(result.newSyncState.localHead).toMatchObject(e1_3.
|
434
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.ROOT)
|
435
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_3.seqNum)
|
436
436
|
expectEventArraysEqual(result.newEvents, [e1_1, e1_2, e1_3])
|
437
437
|
expectEventArraysEqual(result.confirmedEvents, [])
|
438
438
|
})
|
@@ -442,8 +442,8 @@ describe('syncstate', () => {
|
|
442
442
|
it('should reject when new events are greater than pending events', () => {
|
443
443
|
const syncState = new SyncState.SyncState({
|
444
444
|
pending: [e1_0, e1_1],
|
445
|
-
upstreamHead:
|
446
|
-
localHead: e1_1.
|
445
|
+
upstreamHead: EventSequenceNumber.ROOT,
|
446
|
+
localHead: e1_1.seqNum,
|
447
447
|
})
|
448
448
|
const result = merge({
|
449
449
|
syncState,
|
@@ -451,7 +451,7 @@ describe('syncstate', () => {
|
|
451
451
|
})
|
452
452
|
|
453
453
|
expectReject(result)
|
454
|
-
expect(result.expectedMinimumId).toMatchObject(e1_2.
|
454
|
+
expect(result.expectedMinimumId).toMatchObject(e1_2.seqNum)
|
455
455
|
})
|
456
456
|
})
|
457
457
|
})
|
@@ -465,8 +465,8 @@ const expectEventArraysEqual = (
|
|
465
465
|
) => {
|
466
466
|
expect(actual.length).toBe(expected.length)
|
467
467
|
actual.forEach((event, i) => {
|
468
|
-
expect(event.
|
469
|
-
expect(event.
|
468
|
+
expect(event.seqNum).toStrictEqual(expected[i]!.seqNum)
|
469
|
+
expect(event.parentSeqNum).toStrictEqual(expected[i]!.parentSeqNum)
|
470
470
|
expect(event.name).toStrictEqual(expected[i]!.name)
|
471
471
|
expect(event.args).toStrictEqual(expected[i]!.args)
|
472
472
|
})
|