@livestore/common 0.0.0-snapshot-2ef046b02334f52613d31dbe06af53487685edc0 → 0.0.0-snapshot-8115ad48d5a57244358c943ecc92bb0a30274b87
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/__tests__/fixture.d.ts +83 -221
- package/dist/__tests__/fixture.d.ts.map +1 -1
- package/dist/__tests__/fixture.js +33 -11
- package/dist/__tests__/fixture.js.map +1 -1
- package/dist/adapter-types.d.ts +34 -13
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +20 -2
- package/dist/adapter-types.js.map +1 -1
- package/dist/bounded-collections.d.ts +1 -1
- package/dist/bounded-collections.d.ts.map +1 -1
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +1 -0
- package/dist/debug-info.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +21 -21
- package/dist/devtools/devtools-messages-common.d.ts +6 -6
- package/dist/devtools/devtools-messages-leader.d.ts +45 -45
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +11 -11
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/index.d.ts +2 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -5
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +25 -12
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +146 -98
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/{apply-mutation.d.ts → apply-event.d.ts} +7 -7
- package/dist/leader-thread/apply-event.d.ts.map +1 -0
- package/dist/leader-thread/{apply-mutation.js → apply-event.js} +45 -45
- package/dist/leader-thread/apply-event.js.map +1 -0
- package/dist/leader-thread/eventlog.d.ts +27 -0
- package/dist/leader-thread/eventlog.d.ts.map +1 -0
- package/dist/leader-thread/eventlog.js +123 -0
- package/dist/leader-thread/eventlog.js.map +1 -0
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +21 -19
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +16 -4
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +23 -16
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/mod.d.ts +1 -1
- package/dist/leader-thread/mod.d.ts.map +1 -1
- package/dist/leader-thread/mod.js +1 -1
- package/dist/leader-thread/mod.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +6 -7
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/types.d.ts +14 -15
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/materializer-helper.d.ts +23 -0
- package/dist/materializer-helper.d.ts.map +1 -0
- package/dist/materializer-helper.js +70 -0
- package/dist/materializer-helper.js.map +1 -0
- package/dist/query-builder/api.d.ts +56 -51
- package/dist/query-builder/api.d.ts.map +1 -1
- package/dist/query-builder/api.js +3 -5
- package/dist/query-builder/api.js.map +1 -1
- package/dist/query-builder/astToSql.d.ts.map +1 -1
- package/dist/query-builder/astToSql.js +59 -37
- package/dist/query-builder/astToSql.js.map +1 -1
- package/dist/query-builder/impl.d.ts +2 -3
- package/dist/query-builder/impl.d.ts.map +1 -1
- package/dist/query-builder/impl.js +48 -46
- package/dist/query-builder/impl.js.map +1 -1
- package/dist/query-builder/impl.test.d.ts +86 -1
- package/dist/query-builder/impl.test.d.ts.map +1 -1
- package/dist/query-builder/impl.test.js +223 -36
- package/dist/query-builder/impl.test.js.map +1 -1
- package/dist/rehydrate-from-eventlog.d.ts +15 -0
- package/dist/rehydrate-from-eventlog.d.ts.map +1 -0
- package/dist/{rehydrate-from-mutationlog.js → rehydrate-from-eventlog.js} +26 -25
- package/dist/rehydrate-from-eventlog.js.map +1 -0
- package/dist/schema/EventDef.d.ts +136 -0
- package/dist/schema/EventDef.d.ts.map +1 -0
- package/dist/schema/EventDef.js +58 -0
- package/dist/schema/EventDef.js.map +1 -0
- package/dist/schema/EventId.d.ts +7 -2
- package/dist/schema/EventId.d.ts.map +1 -1
- package/dist/schema/EventId.js +18 -3
- package/dist/schema/EventId.js.map +1 -1
- package/dist/schema/{MutationEvent.d.ts → LiveStoreEvent.d.ts} +56 -56
- package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
- package/dist/schema/{MutationEvent.js → LiveStoreEvent.js} +25 -25
- package/dist/schema/LiveStoreEvent.js.map +1 -0
- package/dist/schema/client-document-def.d.ts +223 -0
- package/dist/schema/client-document-def.d.ts.map +1 -0
- package/dist/schema/client-document-def.js +170 -0
- package/dist/schema/client-document-def.js.map +1 -0
- package/dist/schema/client-document-def.test.d.ts +2 -0
- package/dist/schema/client-document-def.test.d.ts.map +1 -0
- package/dist/schema/client-document-def.test.js +201 -0
- package/dist/schema/client-document-def.test.js.map +1 -0
- package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -1
- package/dist/schema/events.d.ts +2 -0
- package/dist/schema/events.d.ts.map +1 -0
- package/dist/schema/events.js +2 -0
- package/dist/schema/events.js.map +1 -0
- package/dist/schema/mod.d.ts +4 -3
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +4 -3
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +26 -22
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +45 -43
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/sqlite-state.d.ts +12 -0
- package/dist/schema/sqlite-state.d.ts.map +1 -0
- package/dist/schema/sqlite-state.js +36 -0
- package/dist/schema/sqlite-state.js.map +1 -0
- package/dist/schema/system-tables.d.ts +67 -98
- package/dist/schema/system-tables.d.ts.map +1 -1
- package/dist/schema/system-tables.js +62 -48
- package/dist/schema/system-tables.js.map +1 -1
- package/dist/schema/table-def.d.ts +26 -96
- package/dist/schema/table-def.d.ts.map +1 -1
- package/dist/schema/table-def.js +14 -64
- package/dist/schema/table-def.js.map +1 -1
- package/dist/schema/view.d.ts +3 -0
- package/dist/schema/view.d.ts.map +1 -0
- package/dist/schema/view.js +3 -0
- package/dist/schema/view.js.map +1 -0
- package/dist/schema-management/common.d.ts +4 -4
- package/dist/schema-management/common.d.ts.map +1 -1
- 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/schema-management/validate-mutation-defs.d.ts +3 -3
- package/dist/schema-management/validate-mutation-defs.d.ts.map +1 -1
- package/dist/schema-management/validate-mutation-defs.js +17 -17
- package/dist/schema-management/validate-mutation-defs.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +7 -7
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +33 -30
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/next/facts.d.ts +19 -19
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +2 -2
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +3 -3
- 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/history-dag.js +1 -1
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +7 -7
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +5 -5
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +38 -33
- package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +71 -71
- package/dist/sync/next/test/compact-events.test.js.map +1 -1
- package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +25 -25
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
- package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +60 -25
- package/dist/sync/next/test/event-fixtures.js.map +1 -0
- package/dist/sync/next/test/mod.d.ts +1 -1
- package/dist/sync/next/test/mod.d.ts.map +1 -1
- package/dist/sync/next/test/mod.js +1 -1
- package/dist/sync/next/test/mod.js.map +1 -1
- package/dist/sync/sync.d.ts +3 -3
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/syncstate.d.ts +30 -30
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +73 -40
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +175 -184
- 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.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
- package/src/__tests__/fixture.ts +36 -15
- package/src/adapter-types.ts +33 -13
- package/src/debug-info.ts +1 -0
- package/src/devtools/devtools-messages-leader.ts +13 -13
- package/src/index.ts +2 -5
- package/src/leader-thread/LeaderSyncProcessor.ts +210 -138
- package/src/leader-thread/{apply-mutation.ts → apply-event.ts} +61 -61
- package/src/leader-thread/eventlog.ts +199 -0
- package/src/leader-thread/leader-worker-devtools.ts +22 -19
- package/src/leader-thread/make-leader-thread-layer.ts +51 -29
- package/src/leader-thread/mod.ts +1 -1
- package/src/leader-thread/recreate-db.ts +6 -8
- package/src/leader-thread/types.ts +15 -16
- package/src/materializer-helper.ts +110 -0
- package/src/query-builder/api.ts +77 -103
- package/src/query-builder/astToSql.ts +68 -39
- package/src/query-builder/impl.test.ts +239 -42
- package/src/query-builder/impl.ts +72 -56
- package/src/{rehydrate-from-mutationlog.ts → rehydrate-from-eventlog.ts} +35 -38
- package/src/schema/EventDef.ts +216 -0
- package/src/schema/EventId.ts +23 -4
- package/src/schema/{MutationEvent.ts → LiveStoreEvent.ts} +68 -69
- package/src/schema/client-document-def.test.ts +239 -0
- package/src/schema/client-document-def.ts +444 -0
- package/src/schema/db-schema/dsl/mod.ts +0 -1
- package/src/schema/events.ts +1 -0
- package/src/schema/mod.ts +4 -3
- package/src/schema/schema.ts +78 -68
- package/src/schema/sqlite-state.ts +62 -0
- package/src/schema/system-tables.ts +42 -53
- package/src/schema/table-def.ts +51 -209
- package/src/schema/view.ts +2 -0
- package/src/schema-management/common.ts +4 -4
- package/src/schema-management/migrations.ts +8 -9
- package/src/schema-management/validate-mutation-defs.ts +22 -24
- package/src/sync/ClientSessionSyncProcessor.ts +41 -36
- package/src/sync/next/facts.ts +31 -32
- package/src/sync/next/history-dag-common.ts +4 -4
- package/src/sync/next/history-dag.ts +1 -1
- package/src/sync/next/rebase-events.ts +13 -13
- package/src/sync/next/test/compact-events.calculator.test.ts +45 -45
- package/src/sync/next/test/compact-events.test.ts +73 -73
- package/src/sync/next/test/event-fixtures.ts +219 -0
- package/src/sync/next/test/mod.ts +1 -1
- package/src/sync/sync.ts +3 -3
- package/src/sync/syncstate.test.ts +180 -189
- package/src/sync/syncstate.ts +162 -100
- package/src/sync/validate-push-payload.ts +2 -2
- package/src/version.ts +1 -1
- package/tsconfig.json +1 -0
- package/dist/derived-mutations.d.ts +0 -109
- package/dist/derived-mutations.d.ts.map +0 -1
- package/dist/derived-mutations.js +0 -54
- package/dist/derived-mutations.js.map +0 -1
- package/dist/derived-mutations.test.d.ts +0 -2
- package/dist/derived-mutations.test.d.ts.map +0 -1
- package/dist/derived-mutations.test.js +0 -93
- package/dist/derived-mutations.test.js.map +0 -1
- package/dist/init-singleton-tables.d.ts +0 -4
- package/dist/init-singleton-tables.d.ts.map +0 -1
- package/dist/init-singleton-tables.js +0 -16
- package/dist/init-singleton-tables.js.map +0 -1
- package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
- package/dist/leader-thread/apply-mutation.js.map +0 -1
- package/dist/leader-thread/mutationlog.d.ts +0 -27
- package/dist/leader-thread/mutationlog.d.ts.map +0 -1
- package/dist/leader-thread/mutationlog.js +0 -124
- package/dist/leader-thread/mutationlog.js.map +0 -1
- package/dist/mutation.d.ts +0 -20
- package/dist/mutation.d.ts.map +0 -1
- package/dist/mutation.js +0 -68
- package/dist/mutation.js.map +0 -1
- package/dist/query-info.d.ts +0 -41
- package/dist/query-info.d.ts.map +0 -1
- package/dist/query-info.js +0 -7
- package/dist/query-info.js.map +0 -1
- package/dist/rehydrate-from-mutationlog.d.ts +0 -15
- package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
- package/dist/rehydrate-from-mutationlog.js.map +0 -1
- package/dist/schema/MutationEvent.d.ts.map +0 -1
- package/dist/schema/MutationEvent.js.map +0 -1
- package/dist/schema/mutations.d.ts +0 -115
- package/dist/schema/mutations.d.ts.map +0 -1
- package/dist/schema/mutations.js +0 -42
- package/dist/schema/mutations.js.map +0 -1
- package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
- package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
- package/src/derived-mutations.test.ts +0 -101
- package/src/derived-mutations.ts +0 -170
- package/src/init-singleton-tables.ts +0 -24
- package/src/leader-thread/mutationlog.ts +0 -202
- package/src/mutation.ts +0 -108
- package/src/query-info.ts +0 -83
- package/src/schema/mutations.ts +0 -193
- package/src/sync/next/test/mutation-fixtures.ts +0 -228
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import { describe, expect, it } from 'vitest'
|
|
3
3
|
|
|
4
4
|
import * as EventId from '../schema/EventId.js'
|
|
5
|
-
import * as
|
|
5
|
+
import * as LiveStoreEvent from '../schema/LiveStoreEvent.js'
|
|
6
6
|
import * as SyncState from './syncstate.js'
|
|
7
7
|
|
|
8
|
-
class TestEvent extends
|
|
8
|
+
class TestEvent extends LiveStoreEvent.EncodedWithMeta {
|
|
9
9
|
constructor(
|
|
10
10
|
id: EventId.EventId | typeof EventId.EventId.Encoded,
|
|
11
11
|
parentId: EventId.EventId,
|
|
@@ -15,7 +15,7 @@ class TestEvent extends MutationEvent.EncodedWithMeta {
|
|
|
15
15
|
super({
|
|
16
16
|
id: EventId.make(id),
|
|
17
17
|
parentId: EventId.make(parentId),
|
|
18
|
-
|
|
18
|
+
name: 'a',
|
|
19
19
|
args: payload,
|
|
20
20
|
clientId: 'static-local-id',
|
|
21
21
|
sessionId: 'static-session-id',
|
|
@@ -31,18 +31,17 @@ class TestEvent extends MutationEvent.EncodedWithMeta {
|
|
|
31
31
|
// toString = () => this.toJSON()
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
const
|
|
41
|
-
const e_2_0 = new TestEvent({ global: 2, client: 0 }, e_1_0.id, 'a', false)
|
|
34
|
+
const e0_1 = new TestEvent({ global: 0, client: 1 }, EventId.ROOT, 'a', true)
|
|
35
|
+
const e1_0 = new TestEvent({ global: 1, client: 0 }, EventId.ROOT, 'a', false)
|
|
36
|
+
const e1_1 = new TestEvent({ global: 1, client: 1 }, e1_0.id, 'a', true)
|
|
37
|
+
const e1_2 = new TestEvent({ global: 1, client: 2 }, e1_1.id, 'a', true)
|
|
38
|
+
const e1_3 = new TestEvent({ global: 1, client: 3 }, e1_2.id, 'a', true)
|
|
39
|
+
const e2_0 = new TestEvent({ global: 2, client: 0 }, e1_0.id, 'a', false)
|
|
40
|
+
const e2_1 = new TestEvent({ global: 2, client: 1 }, e2_0.id, 'a', true)
|
|
42
41
|
|
|
43
|
-
const isEqualEvent =
|
|
42
|
+
const isEqualEvent = LiveStoreEvent.isEqualEncoded
|
|
44
43
|
|
|
45
|
-
const isClientEvent = (event:
|
|
44
|
+
const isClientEvent = (event: LiveStoreEvent.EncodedWithMeta) => (event as TestEvent).isLocal
|
|
46
45
|
|
|
47
46
|
describe('syncstate', () => {
|
|
48
47
|
describe('merge', () => {
|
|
@@ -59,269 +58,261 @@ describe('syncstate', () => {
|
|
|
59
58
|
describe('upstream-rebase', () => {
|
|
60
59
|
it('should rollback until start', () => {
|
|
61
60
|
const syncState = new SyncState.SyncState({
|
|
62
|
-
pending: [
|
|
61
|
+
pending: [e2_0],
|
|
63
62
|
upstreamHead: EventId.ROOT,
|
|
64
|
-
localHead:
|
|
63
|
+
localHead: e2_0.id,
|
|
65
64
|
})
|
|
66
|
-
const
|
|
67
|
-
const
|
|
65
|
+
const e1_0_e2_0 = e1_0.rebase_(e2_0.id)
|
|
66
|
+
const e1_1_e2_1 = e1_1.rebase_(e1_0_e2_0.id)
|
|
68
67
|
const result = merge({
|
|
69
68
|
syncState,
|
|
70
69
|
payload: SyncState.PayloadUpstreamRebase.make({
|
|
71
|
-
rollbackEvents: [
|
|
72
|
-
newEvents: [
|
|
70
|
+
rollbackEvents: [e1_0, e1_1],
|
|
71
|
+
newEvents: [e1_0_e2_0, e1_1_e2_1],
|
|
73
72
|
}),
|
|
74
73
|
})
|
|
75
|
-
const
|
|
74
|
+
const e2_0_e3_0 = e2_0.rebase_(e1_0_e2_0.id)
|
|
76
75
|
expectRebase(result)
|
|
77
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
78
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
79
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
80
|
-
expectEventArraysEqual(result.newEvents, [
|
|
81
|
-
expectEventArraysEqual(result.rollbackEvents, [
|
|
76
|
+
expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0])
|
|
77
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_1.id)
|
|
78
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.id)
|
|
79
|
+
expectEventArraysEqual(result.newEvents, [e1_0_e2_0, e1_1_e2_1, e2_0_e3_0])
|
|
80
|
+
expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1, e2_0])
|
|
82
81
|
})
|
|
83
82
|
|
|
84
83
|
it('should rollback only to specified point', () => {
|
|
85
84
|
const syncState = new SyncState.SyncState({
|
|
86
|
-
pending: [
|
|
85
|
+
pending: [e2_0],
|
|
87
86
|
upstreamHead: EventId.ROOT,
|
|
88
|
-
localHead:
|
|
87
|
+
localHead: e2_0.id,
|
|
89
88
|
})
|
|
90
|
-
const
|
|
89
|
+
const e1_1_e2_0 = e1_1.rebase_(e1_0.id)
|
|
91
90
|
const result = merge({
|
|
92
91
|
syncState,
|
|
93
92
|
payload: SyncState.PayloadUpstreamRebase.make({
|
|
94
|
-
newEvents: [
|
|
95
|
-
rollbackEvents: [
|
|
93
|
+
newEvents: [e1_1_e2_0],
|
|
94
|
+
rollbackEvents: [e1_1],
|
|
96
95
|
}),
|
|
97
96
|
})
|
|
98
|
-
const
|
|
97
|
+
const e2_0_e3_0 = e2_0.rebase_(e1_1_e2_0.id)
|
|
99
98
|
expectRebase(result)
|
|
100
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
101
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
102
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
103
|
-
expectEventArraysEqual(result.newEvents, [
|
|
104
|
-
expectEventArraysEqual(result.rollbackEvents, [
|
|
99
|
+
expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0])
|
|
100
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_0.id)
|
|
101
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.id)
|
|
102
|
+
expectEventArraysEqual(result.newEvents, [e1_1_e2_0, e2_0_e3_0])
|
|
103
|
+
expectEventArraysEqual(result.rollbackEvents, [e1_1, e2_0])
|
|
105
104
|
})
|
|
106
105
|
|
|
107
106
|
it('should work for empty pending', () => {
|
|
108
107
|
const syncState = new SyncState.SyncState({
|
|
109
108
|
pending: [],
|
|
110
109
|
upstreamHead: EventId.ROOT,
|
|
111
|
-
localHead:
|
|
110
|
+
localHead: e1_0.id,
|
|
112
111
|
})
|
|
113
112
|
const result = merge({
|
|
114
113
|
syncState,
|
|
115
|
-
payload: SyncState.PayloadUpstreamRebase.make({ rollbackEvents: [
|
|
114
|
+
payload: SyncState.PayloadUpstreamRebase.make({ rollbackEvents: [e1_0], newEvents: [e2_0] }),
|
|
116
115
|
})
|
|
117
116
|
expectRebase(result)
|
|
118
117
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
|
119
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
120
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
121
|
-
expect(result.newEvents).toStrictEqual([
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
it('should work for empty incoming', () => {
|
|
125
|
-
const syncState = new SyncState.SyncState({
|
|
126
|
-
pending: [],
|
|
127
|
-
upstreamHead: EventId.ROOT,
|
|
128
|
-
localHead: e_0_0.id,
|
|
129
|
-
})
|
|
130
|
-
const result = merge({
|
|
131
|
-
syncState,
|
|
132
|
-
payload: SyncState.PayloadUpstreamRebase.make({ rollbackEvents: [e_0_0], newEvents: [] }),
|
|
133
|
-
})
|
|
134
|
-
expectRebase(result)
|
|
135
|
-
expectEventArraysEqual(result.newSyncState.pending, [])
|
|
136
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(EventId.ROOT)
|
|
137
|
-
expect(result.newSyncState.localHead).toMatchObject(EventId.ROOT)
|
|
138
|
-
expectEventArraysEqual(result.newEvents, [])
|
|
118
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id)
|
|
119
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.id)
|
|
120
|
+
expect(result.newEvents).toStrictEqual([e2_0])
|
|
139
121
|
})
|
|
140
122
|
})
|
|
141
123
|
|
|
142
124
|
describe('upstream-advance: advance', () => {
|
|
143
125
|
it('should throw error if newEvents are not sorted in ascending order by eventId (client)', () => {
|
|
144
126
|
const syncState = new SyncState.SyncState({
|
|
145
|
-
pending: [
|
|
127
|
+
pending: [e1_0],
|
|
146
128
|
upstreamHead: EventId.ROOT,
|
|
147
|
-
localHead:
|
|
129
|
+
localHead: e1_0.id,
|
|
148
130
|
})
|
|
149
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
131
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_0] } })
|
|
150
132
|
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
|
151
133
|
})
|
|
152
134
|
|
|
153
135
|
it('should throw error if newEvents are not sorted in ascending order by eventId (global)', () => {
|
|
154
136
|
const syncState = new SyncState.SyncState({
|
|
155
|
-
pending: [
|
|
137
|
+
pending: [e1_0],
|
|
156
138
|
upstreamHead: EventId.ROOT,
|
|
157
|
-
localHead:
|
|
139
|
+
localHead: e1_0.id,
|
|
158
140
|
})
|
|
159
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
141
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0, e1_0] } })
|
|
160
142
|
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
|
161
143
|
})
|
|
162
144
|
|
|
163
145
|
it('should throw error if incoming event is < expected upstream head', () => {
|
|
164
146
|
const syncState = new SyncState.SyncState({
|
|
165
147
|
pending: [],
|
|
166
|
-
upstreamHead:
|
|
167
|
-
localHead:
|
|
148
|
+
upstreamHead: e2_0.id,
|
|
149
|
+
localHead: e2_0.id,
|
|
168
150
|
})
|
|
169
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
151
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
|
|
170
152
|
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
|
171
153
|
})
|
|
172
154
|
|
|
173
155
|
it('should throw error if incoming event is = expected upstream head', () => {
|
|
174
156
|
const syncState = new SyncState.SyncState({
|
|
175
157
|
pending: [],
|
|
176
|
-
upstreamHead:
|
|
177
|
-
localHead:
|
|
178
|
-
})
|
|
179
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_1_0] } })
|
|
180
|
-
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
it('should throw if the parent id of the first incoming event is unknown', () => {
|
|
184
|
-
const syncState = new SyncState.SyncState({
|
|
185
|
-
pending: [],
|
|
186
|
-
upstreamHead: EventId.ROOT,
|
|
187
|
-
localHead: e_0_0.id,
|
|
158
|
+
upstreamHead: e2_0.id,
|
|
159
|
+
localHead: e2_0.id,
|
|
188
160
|
})
|
|
189
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
161
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0] } })
|
|
190
162
|
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
|
191
163
|
})
|
|
192
164
|
|
|
193
165
|
it('should confirm pending event when receiving matching event', () => {
|
|
194
166
|
const syncState = new SyncState.SyncState({
|
|
195
|
-
pending: [
|
|
167
|
+
pending: [e1_0],
|
|
196
168
|
upstreamHead: EventId.ROOT,
|
|
197
|
-
localHead:
|
|
169
|
+
localHead: e1_0.id,
|
|
198
170
|
})
|
|
199
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
171
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
|
|
200
172
|
|
|
201
173
|
expectAdvance(result)
|
|
202
174
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
|
203
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
204
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
175
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.id)
|
|
176
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0.id)
|
|
205
177
|
expectEventArraysEqual(result.newEvents, [])
|
|
206
|
-
expectEventArraysEqual(result.confirmedEvents, [
|
|
178
|
+
expectEventArraysEqual(result.confirmedEvents, [e1_0])
|
|
207
179
|
})
|
|
208
180
|
|
|
209
181
|
it('should confirm partial pending event when receiving matching event', () => {
|
|
210
182
|
const syncState = new SyncState.SyncState({
|
|
211
|
-
pending: [
|
|
183
|
+
pending: [e1_0, e2_0],
|
|
212
184
|
upstreamHead: EventId.ROOT,
|
|
213
|
-
localHead:
|
|
185
|
+
localHead: e2_0.id,
|
|
214
186
|
})
|
|
215
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
187
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
|
|
216
188
|
|
|
217
189
|
expectAdvance(result)
|
|
218
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
219
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
220
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
190
|
+
expectEventArraysEqual(result.newSyncState.pending, [e2_0])
|
|
191
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.id)
|
|
192
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.id)
|
|
221
193
|
expectEventArraysEqual(result.newEvents, [])
|
|
222
|
-
expectEventArraysEqual(result.confirmedEvents, [
|
|
194
|
+
expectEventArraysEqual(result.confirmedEvents, [e1_0])
|
|
223
195
|
})
|
|
224
196
|
|
|
225
197
|
it('should confirm pending event and add new event', () => {
|
|
226
198
|
const syncState = new SyncState.SyncState({
|
|
227
|
-
pending: [
|
|
199
|
+
pending: [e1_0],
|
|
228
200
|
upstreamHead: EventId.ROOT,
|
|
229
|
-
localHead:
|
|
201
|
+
localHead: e1_0.id,
|
|
230
202
|
})
|
|
231
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
203
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0, e1_1] } })
|
|
232
204
|
|
|
233
205
|
expectAdvance(result)
|
|
234
206
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
|
235
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
236
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
237
|
-
expect(result.newEvents).toStrictEqual([
|
|
238
|
-
expectEventArraysEqual(result.confirmedEvents, [
|
|
207
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.id)
|
|
208
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1.id)
|
|
209
|
+
expect(result.newEvents).toStrictEqual([e1_1])
|
|
210
|
+
expectEventArraysEqual(result.confirmedEvents, [e1_0])
|
|
239
211
|
})
|
|
240
212
|
|
|
241
213
|
it('should confirm pending event and add multiple new events', () => {
|
|
242
214
|
const syncState = new SyncState.SyncState({
|
|
243
|
-
pending: [
|
|
244
|
-
upstreamHead:
|
|
245
|
-
localHead:
|
|
215
|
+
pending: [e1_1],
|
|
216
|
+
upstreamHead: e1_0.id,
|
|
217
|
+
localHead: e1_1.id,
|
|
246
218
|
})
|
|
247
219
|
const result = merge({
|
|
248
220
|
syncState,
|
|
249
|
-
payload: { _tag: 'upstream-advance', newEvents: [
|
|
221
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_2, e1_3, e2_0, e2_1] },
|
|
250
222
|
})
|
|
251
223
|
|
|
252
224
|
expectAdvance(result)
|
|
253
225
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
|
254
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
255
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
256
|
-
expect(result.newEvents).toStrictEqual([
|
|
257
|
-
expectEventArraysEqual(result.confirmedEvents, [
|
|
226
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_1.id)
|
|
227
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_1.id)
|
|
228
|
+
expect(result.newEvents).toStrictEqual([e1_2, e1_3, e2_0, e2_1])
|
|
229
|
+
expectEventArraysEqual(result.confirmedEvents, [e1_1])
|
|
230
|
+
})
|
|
231
|
+
|
|
232
|
+
it('should confirm pending global event while keep pending client events', () => {
|
|
233
|
+
const syncState = new SyncState.SyncState({
|
|
234
|
+
pending: [e1_0, e1_1],
|
|
235
|
+
upstreamHead: EventId.ROOT,
|
|
236
|
+
localHead: e1_1.id,
|
|
237
|
+
})
|
|
238
|
+
const result = merge({
|
|
239
|
+
syncState,
|
|
240
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
|
|
241
|
+
})
|
|
242
|
+
|
|
243
|
+
expectAdvance(result)
|
|
244
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_1])
|
|
245
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.id)
|
|
246
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1.id)
|
|
247
|
+
expectEventArraysEqual(result.newEvents, [])
|
|
248
|
+
expectEventArraysEqual(result.confirmedEvents, [e1_0])
|
|
258
249
|
})
|
|
259
250
|
|
|
260
251
|
it('should ignore client events (incoming is subset of pending)', () => {
|
|
261
252
|
const syncState = new SyncState.SyncState({
|
|
262
|
-
pending: [
|
|
253
|
+
pending: [e0_1, e1_0],
|
|
263
254
|
upstreamHead: EventId.ROOT,
|
|
264
|
-
localHead:
|
|
255
|
+
localHead: e1_0.id,
|
|
265
256
|
})
|
|
266
257
|
const result = merge({
|
|
267
258
|
syncState,
|
|
268
|
-
payload: { _tag: 'upstream-advance', newEvents: [
|
|
259
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
|
|
269
260
|
ignoreClientEvents: true,
|
|
270
261
|
})
|
|
271
262
|
expectAdvance(result)
|
|
272
263
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
|
273
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
274
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
264
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.id)
|
|
265
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0.id)
|
|
275
266
|
expectEventArraysEqual(result.newEvents, [])
|
|
276
|
-
expectEventArraysEqual(result.confirmedEvents, [
|
|
267
|
+
expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0])
|
|
277
268
|
})
|
|
278
269
|
|
|
279
270
|
it('should ignore client events (incoming is subset of pending case 2)', () => {
|
|
280
271
|
const syncState = new SyncState.SyncState({
|
|
281
|
-
pending: [
|
|
272
|
+
pending: [e0_1, e1_0, e2_0],
|
|
282
273
|
upstreamHead: EventId.ROOT,
|
|
283
|
-
localHead:
|
|
274
|
+
localHead: e1_0.id,
|
|
284
275
|
})
|
|
285
276
|
const result = merge({
|
|
286
277
|
syncState,
|
|
287
|
-
payload: { _tag: 'upstream-advance', newEvents: [
|
|
278
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
|
|
288
279
|
ignoreClientEvents: true,
|
|
289
280
|
})
|
|
290
281
|
expectAdvance(result)
|
|
291
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
292
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
293
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
282
|
+
expectEventArraysEqual(result.newSyncState.pending, [e2_0])
|
|
283
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.id)
|
|
284
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.id)
|
|
294
285
|
expectEventArraysEqual(result.newEvents, [])
|
|
295
|
-
expectEventArraysEqual(result.confirmedEvents, [
|
|
286
|
+
expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0])
|
|
296
287
|
})
|
|
297
288
|
|
|
298
289
|
it('should ignore client events (incoming goes beyond pending)', () => {
|
|
299
290
|
const syncState = new SyncState.SyncState({
|
|
300
|
-
pending: [
|
|
291
|
+
pending: [e0_1, e1_0, e1_1],
|
|
301
292
|
upstreamHead: EventId.ROOT,
|
|
302
|
-
localHead:
|
|
293
|
+
localHead: e1_1.id,
|
|
303
294
|
})
|
|
304
295
|
const result = merge({
|
|
305
296
|
syncState,
|
|
306
|
-
payload: { _tag: 'upstream-advance', newEvents: [
|
|
297
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_0, e2_0] },
|
|
307
298
|
ignoreClientEvents: true,
|
|
308
299
|
})
|
|
309
300
|
|
|
310
301
|
expectAdvance(result)
|
|
311
302
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
|
312
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
313
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
314
|
-
expect(result.newEvents).toStrictEqual([
|
|
315
|
-
expectEventArraysEqual(result.confirmedEvents, [
|
|
303
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id)
|
|
304
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.id)
|
|
305
|
+
expect(result.newEvents).toStrictEqual([e2_0])
|
|
306
|
+
expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0, e1_1])
|
|
316
307
|
})
|
|
317
308
|
|
|
318
309
|
it('should fail if incoming event is ≤ local head', () => {
|
|
319
310
|
const syncState = new SyncState.SyncState({
|
|
320
311
|
pending: [],
|
|
321
|
-
upstreamHead:
|
|
322
|
-
localHead:
|
|
312
|
+
upstreamHead: e2_0.id,
|
|
313
|
+
localHead: e2_0.id,
|
|
323
314
|
})
|
|
324
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
315
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
|
|
325
316
|
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
|
326
317
|
})
|
|
327
318
|
})
|
|
@@ -329,120 +320,120 @@ describe('syncstate', () => {
|
|
|
329
320
|
describe('upstream-advance: rebase', () => {
|
|
330
321
|
it('should rebase single client event to end', () => {
|
|
331
322
|
const syncState = new SyncState.SyncState({
|
|
332
|
-
pending: [
|
|
323
|
+
pending: [e1_0],
|
|
333
324
|
upstreamHead: EventId.ROOT,
|
|
334
|
-
localHead:
|
|
325
|
+
localHead: e1_0.id,
|
|
335
326
|
})
|
|
336
|
-
const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [
|
|
327
|
+
const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1] }) })
|
|
337
328
|
|
|
338
|
-
const
|
|
329
|
+
const e1_0_e1_2 = e1_0.rebase_(e1_1.id)
|
|
339
330
|
|
|
340
331
|
expectRebase(result)
|
|
341
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
342
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
343
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
344
|
-
expectEventArraysEqual(result.rollbackEvents, [
|
|
345
|
-
expectEventArraysEqual(result.newEvents, [
|
|
332
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_0_e1_2])
|
|
333
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.id)
|
|
334
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0_e1_2.id)
|
|
335
|
+
expectEventArraysEqual(result.rollbackEvents, [e1_0])
|
|
336
|
+
expectEventArraysEqual(result.newEvents, [e1_1, e1_0_e1_2])
|
|
346
337
|
})
|
|
347
338
|
|
|
348
339
|
it('should rebase different event with same id', () => {
|
|
349
|
-
const
|
|
340
|
+
const e2_0_b = new TestEvent({ global: 1, client: 0 }, e1_0.id, '1_0_b', false)
|
|
350
341
|
const syncState = new SyncState.SyncState({
|
|
351
|
-
pending: [
|
|
342
|
+
pending: [e2_0_b],
|
|
352
343
|
upstreamHead: EventId.ROOT,
|
|
353
|
-
localHead:
|
|
344
|
+
localHead: e2_0_b.id,
|
|
354
345
|
})
|
|
355
|
-
const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [
|
|
356
|
-
const
|
|
346
|
+
const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e2_0] }) })
|
|
347
|
+
const e2_0_e3_0 = e2_0_b.rebase_(e2_0.id)
|
|
357
348
|
|
|
358
349
|
expectRebase(result)
|
|
359
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
360
|
-
expectEventArraysEqual(result.newEvents, [
|
|
361
|
-
expectEventArraysEqual(result.rollbackEvents, [
|
|
362
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
363
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
350
|
+
expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0])
|
|
351
|
+
expectEventArraysEqual(result.newEvents, [e2_0, e2_0_e3_0])
|
|
352
|
+
expectEventArraysEqual(result.rollbackEvents, [e2_0_b])
|
|
353
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id)
|
|
354
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.id)
|
|
364
355
|
})
|
|
365
356
|
|
|
366
357
|
it('should rebase single client event to end (more incoming events)', () => {
|
|
367
358
|
const syncState = new SyncState.SyncState({
|
|
368
|
-
pending: [
|
|
359
|
+
pending: [e1_0],
|
|
369
360
|
upstreamHead: EventId.ROOT,
|
|
370
|
-
localHead:
|
|
361
|
+
localHead: e1_0.id,
|
|
371
362
|
})
|
|
372
363
|
const result = merge({
|
|
373
364
|
syncState,
|
|
374
|
-
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [
|
|
365
|
+
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
|
|
375
366
|
})
|
|
376
367
|
|
|
377
|
-
const
|
|
368
|
+
const e1_0_e3_0 = e1_0.rebase_(e2_0.id)
|
|
378
369
|
|
|
379
370
|
expectRebase(result)
|
|
380
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
381
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
382
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
371
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_0_e3_0])
|
|
372
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id)
|
|
373
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0_e3_0.id)
|
|
383
374
|
})
|
|
384
375
|
|
|
385
376
|
it('should only rebase divergent events when first event matches', () => {
|
|
386
377
|
const syncState = new SyncState.SyncState({
|
|
387
|
-
pending: [
|
|
378
|
+
pending: [e1_0, e1_1],
|
|
388
379
|
upstreamHead: EventId.ROOT,
|
|
389
|
-
localHead:
|
|
380
|
+
localHead: e1_0.id,
|
|
390
381
|
})
|
|
391
382
|
const result = merge({
|
|
392
383
|
syncState,
|
|
393
|
-
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [
|
|
384
|
+
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_0, e1_2, e1_3, e2_0] }),
|
|
394
385
|
})
|
|
395
386
|
|
|
396
|
-
const
|
|
387
|
+
const e1_1_e2_1 = e1_1.rebase_(e2_0.id)
|
|
397
388
|
|
|
398
389
|
expectRebase(result)
|
|
399
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
400
|
-
expectEventArraysEqual(result.rollbackEvents, [
|
|
401
|
-
expectEventArraysEqual(result.newEvents, [
|
|
402
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
403
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
390
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_1_e2_1])
|
|
391
|
+
expectEventArraysEqual(result.rollbackEvents, [e1_1])
|
|
392
|
+
expectEventArraysEqual(result.newEvents, [e1_2, e1_3, e2_0, e1_1_e2_1])
|
|
393
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id)
|
|
394
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_1.id)
|
|
404
395
|
})
|
|
405
396
|
|
|
406
397
|
it('should rebase all client events when incoming chain starts differently', () => {
|
|
407
398
|
const syncState = new SyncState.SyncState({
|
|
408
|
-
pending: [
|
|
399
|
+
pending: [e1_0, e1_1],
|
|
409
400
|
upstreamHead: EventId.ROOT,
|
|
410
|
-
localHead:
|
|
401
|
+
localHead: e1_1.id,
|
|
411
402
|
})
|
|
412
403
|
const result = merge({
|
|
413
404
|
syncState,
|
|
414
|
-
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [
|
|
405
|
+
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
|
|
415
406
|
})
|
|
416
407
|
|
|
417
|
-
const
|
|
418
|
-
const
|
|
408
|
+
const e1_0_e2_1 = e1_0.rebase_(e2_0.id)
|
|
409
|
+
const e1_1_e2_2 = e1_1.rebase_(e1_0_e2_1.id)
|
|
419
410
|
|
|
420
411
|
expectRebase(result)
|
|
421
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
422
|
-
expectEventArraysEqual(result.newEvents, [
|
|
423
|
-
expectEventArraysEqual(result.rollbackEvents, [
|
|
424
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
425
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
412
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_0_e2_1, e1_1_e2_2])
|
|
413
|
+
expectEventArraysEqual(result.newEvents, [e1_1, e1_2, e1_3, e2_0, e1_0_e2_1, e1_1_e2_2])
|
|
414
|
+
expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1])
|
|
415
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id)
|
|
416
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_2.id)
|
|
426
417
|
})
|
|
427
418
|
|
|
428
419
|
describe('local-push', () => {
|
|
429
420
|
describe('advance', () => {
|
|
430
421
|
it('should advance with new events', () => {
|
|
431
422
|
const syncState = new SyncState.SyncState({
|
|
432
|
-
pending: [
|
|
423
|
+
pending: [e1_0],
|
|
433
424
|
upstreamHead: EventId.ROOT,
|
|
434
|
-
localHead:
|
|
425
|
+
localHead: e1_0.id,
|
|
435
426
|
})
|
|
436
427
|
const result = merge({
|
|
437
428
|
syncState,
|
|
438
|
-
payload: SyncState.PayloadLocalPush.make({ newEvents: [
|
|
429
|
+
payload: SyncState.PayloadLocalPush.make({ newEvents: [e1_1, e1_2, e1_3] }),
|
|
439
430
|
})
|
|
440
431
|
|
|
441
432
|
expectAdvance(result)
|
|
442
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
433
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_0, e1_1, e1_2, e1_3])
|
|
443
434
|
expect(result.newSyncState.upstreamHead).toMatchObject(EventId.ROOT)
|
|
444
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
445
|
-
expectEventArraysEqual(result.newEvents, [
|
|
435
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_3.id)
|
|
436
|
+
expectEventArraysEqual(result.newEvents, [e1_1, e1_2, e1_3])
|
|
446
437
|
expectEventArraysEqual(result.confirmedEvents, [])
|
|
447
438
|
})
|
|
448
439
|
})
|
|
@@ -450,17 +441,17 @@ describe('syncstate', () => {
|
|
|
450
441
|
describe('reject', () => {
|
|
451
442
|
it('should reject when new events are greater than pending events', () => {
|
|
452
443
|
const syncState = new SyncState.SyncState({
|
|
453
|
-
pending: [
|
|
444
|
+
pending: [e1_0, e1_1],
|
|
454
445
|
upstreamHead: EventId.ROOT,
|
|
455
|
-
localHead:
|
|
446
|
+
localHead: e1_1.id,
|
|
456
447
|
})
|
|
457
448
|
const result = merge({
|
|
458
449
|
syncState,
|
|
459
|
-
payload: SyncState.PayloadLocalPush.make({ newEvents: [
|
|
450
|
+
payload: SyncState.PayloadLocalPush.make({ newEvents: [e1_1, e1_2] }),
|
|
460
451
|
})
|
|
461
452
|
|
|
462
453
|
expectReject(result)
|
|
463
|
-
expect(result.expectedMinimumId).toMatchObject(
|
|
454
|
+
expect(result.expectedMinimumId).toMatchObject(e1_2.id)
|
|
464
455
|
})
|
|
465
456
|
})
|
|
466
457
|
})
|
|
@@ -469,14 +460,14 @@ describe('syncstate', () => {
|
|
|
469
460
|
})
|
|
470
461
|
|
|
471
462
|
const expectEventArraysEqual = (
|
|
472
|
-
actual: ReadonlyArray<
|
|
473
|
-
expected: ReadonlyArray<
|
|
463
|
+
actual: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>,
|
|
464
|
+
expected: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>,
|
|
474
465
|
) => {
|
|
475
466
|
expect(actual.length).toBe(expected.length)
|
|
476
467
|
actual.forEach((event, i) => {
|
|
477
468
|
expect(event.id).toStrictEqual(expected[i]!.id)
|
|
478
469
|
expect(event.parentId).toStrictEqual(expected[i]!.parentId)
|
|
479
|
-
expect(event.
|
|
470
|
+
expect(event.name).toStrictEqual(expected[i]!.name)
|
|
480
471
|
expect(event.args).toStrictEqual(expected[i]!.args)
|
|
481
472
|
})
|
|
482
473
|
}
|