@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
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/* eslint-disable prefer-arrow/prefer-arrow-functions */
|
|
2
2
|
import { describe, expect, it } from 'vitest';
|
|
3
3
|
import * as EventId from '../schema/EventId.js';
|
|
4
|
-
import * as
|
|
4
|
+
import * as LiveStoreEvent from '../schema/LiveStoreEvent.js';
|
|
5
5
|
import * as SyncState from './syncstate.js';
|
|
6
|
-
class TestEvent extends
|
|
6
|
+
class TestEvent extends LiveStoreEvent.EncodedWithMeta {
|
|
7
7
|
payload;
|
|
8
8
|
isLocal;
|
|
9
9
|
constructor(id, parentId, payload, isLocal) {
|
|
10
10
|
super({
|
|
11
11
|
id: EventId.make(id),
|
|
12
12
|
parentId: EventId.make(parentId),
|
|
13
|
-
|
|
13
|
+
name: 'a',
|
|
14
14
|
args: payload,
|
|
15
15
|
clientId: 'static-local-id',
|
|
16
16
|
sessionId: 'static-session-id',
|
|
@@ -22,15 +22,14 @@ class TestEvent extends MutationEvent.EncodedWithMeta {
|
|
|
22
22
|
return this.rebase(parentId, this.isLocal);
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
const isEqualEvent = MutationEvent.isEqualEncoded;
|
|
25
|
+
const e0_1 = new TestEvent({ global: 0, client: 1 }, EventId.ROOT, 'a', true);
|
|
26
|
+
const e1_0 = new TestEvent({ global: 1, client: 0 }, EventId.ROOT, 'a', false);
|
|
27
|
+
const e1_1 = new TestEvent({ global: 1, client: 1 }, e1_0.id, 'a', true);
|
|
28
|
+
const e1_2 = new TestEvent({ global: 1, client: 2 }, e1_1.id, 'a', true);
|
|
29
|
+
const e1_3 = new TestEvent({ global: 1, client: 3 }, e1_2.id, 'a', true);
|
|
30
|
+
const e2_0 = new TestEvent({ global: 2, client: 0 }, e1_0.id, 'a', false);
|
|
31
|
+
const e2_1 = new TestEvent({ global: 2, client: 1 }, e2_0.id, 'a', true);
|
|
32
|
+
const isEqualEvent = LiveStoreEvent.isEqualEncoded;
|
|
34
33
|
const isClientEvent = (event) => event.isLocal;
|
|
35
34
|
describe('syncstate', () => {
|
|
36
35
|
describe('merge', () => {
|
|
@@ -38,369 +37,361 @@ describe('syncstate', () => {
|
|
|
38
37
|
describe('upstream-rebase', () => {
|
|
39
38
|
it('should rollback until start', () => {
|
|
40
39
|
const syncState = new SyncState.SyncState({
|
|
41
|
-
pending: [
|
|
40
|
+
pending: [e2_0],
|
|
42
41
|
upstreamHead: EventId.ROOT,
|
|
43
|
-
localHead:
|
|
42
|
+
localHead: e2_0.id,
|
|
44
43
|
});
|
|
45
|
-
const
|
|
46
|
-
const
|
|
44
|
+
const e1_0_e2_0 = e1_0.rebase_(e2_0.id);
|
|
45
|
+
const e1_1_e2_1 = e1_1.rebase_(e1_0_e2_0.id);
|
|
47
46
|
const result = merge({
|
|
48
47
|
syncState,
|
|
49
48
|
payload: SyncState.PayloadUpstreamRebase.make({
|
|
50
|
-
rollbackEvents: [
|
|
51
|
-
newEvents: [
|
|
49
|
+
rollbackEvents: [e1_0, e1_1],
|
|
50
|
+
newEvents: [e1_0_e2_0, e1_1_e2_1],
|
|
52
51
|
}),
|
|
53
52
|
});
|
|
54
|
-
const
|
|
53
|
+
const e2_0_e3_0 = e2_0.rebase_(e1_0_e2_0.id);
|
|
55
54
|
expectRebase(result);
|
|
56
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
57
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
58
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
59
|
-
expectEventArraysEqual(result.newEvents, [
|
|
60
|
-
expectEventArraysEqual(result.rollbackEvents, [
|
|
55
|
+
expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0]);
|
|
56
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_1.id);
|
|
57
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.id);
|
|
58
|
+
expectEventArraysEqual(result.newEvents, [e1_0_e2_0, e1_1_e2_1, e2_0_e3_0]);
|
|
59
|
+
expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1, e2_0]);
|
|
61
60
|
});
|
|
62
61
|
it('should rollback only to specified point', () => {
|
|
63
62
|
const syncState = new SyncState.SyncState({
|
|
64
|
-
pending: [
|
|
63
|
+
pending: [e2_0],
|
|
65
64
|
upstreamHead: EventId.ROOT,
|
|
66
|
-
localHead:
|
|
65
|
+
localHead: e2_0.id,
|
|
67
66
|
});
|
|
68
|
-
const
|
|
67
|
+
const e1_1_e2_0 = e1_1.rebase_(e1_0.id);
|
|
69
68
|
const result = merge({
|
|
70
69
|
syncState,
|
|
71
70
|
payload: SyncState.PayloadUpstreamRebase.make({
|
|
72
|
-
newEvents: [
|
|
73
|
-
rollbackEvents: [
|
|
71
|
+
newEvents: [e1_1_e2_0],
|
|
72
|
+
rollbackEvents: [e1_1],
|
|
74
73
|
}),
|
|
75
74
|
});
|
|
76
|
-
const
|
|
75
|
+
const e2_0_e3_0 = e2_0.rebase_(e1_1_e2_0.id);
|
|
77
76
|
expectRebase(result);
|
|
78
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
79
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
80
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
81
|
-
expectEventArraysEqual(result.newEvents, [
|
|
82
|
-
expectEventArraysEqual(result.rollbackEvents, [
|
|
77
|
+
expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0]);
|
|
78
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_0.id);
|
|
79
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.id);
|
|
80
|
+
expectEventArraysEqual(result.newEvents, [e1_1_e2_0, e2_0_e3_0]);
|
|
81
|
+
expectEventArraysEqual(result.rollbackEvents, [e1_1, e2_0]);
|
|
83
82
|
});
|
|
84
83
|
it('should work for empty pending', () => {
|
|
85
84
|
const syncState = new SyncState.SyncState({
|
|
86
85
|
pending: [],
|
|
87
86
|
upstreamHead: EventId.ROOT,
|
|
88
|
-
localHead:
|
|
87
|
+
localHead: e1_0.id,
|
|
89
88
|
});
|
|
90
89
|
const result = merge({
|
|
91
90
|
syncState,
|
|
92
|
-
payload: SyncState.PayloadUpstreamRebase.make({ rollbackEvents: [
|
|
91
|
+
payload: SyncState.PayloadUpstreamRebase.make({ rollbackEvents: [e1_0], newEvents: [e2_0] }),
|
|
93
92
|
});
|
|
94
93
|
expectRebase(result);
|
|
95
94
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
|
96
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
97
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
98
|
-
expect(result.newEvents).toStrictEqual([
|
|
99
|
-
});
|
|
100
|
-
it('should work for empty incoming', () => {
|
|
101
|
-
const syncState = new SyncState.SyncState({
|
|
102
|
-
pending: [],
|
|
103
|
-
upstreamHead: EventId.ROOT,
|
|
104
|
-
localHead: e_0_0.id,
|
|
105
|
-
});
|
|
106
|
-
const result = merge({
|
|
107
|
-
syncState,
|
|
108
|
-
payload: SyncState.PayloadUpstreamRebase.make({ rollbackEvents: [e_0_0], newEvents: [] }),
|
|
109
|
-
});
|
|
110
|
-
expectRebase(result);
|
|
111
|
-
expectEventArraysEqual(result.newSyncState.pending, []);
|
|
112
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(EventId.ROOT);
|
|
113
|
-
expect(result.newSyncState.localHead).toMatchObject(EventId.ROOT);
|
|
114
|
-
expectEventArraysEqual(result.newEvents, []);
|
|
95
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id);
|
|
96
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.id);
|
|
97
|
+
expect(result.newEvents).toStrictEqual([e2_0]);
|
|
115
98
|
});
|
|
116
99
|
});
|
|
117
100
|
describe('upstream-advance: advance', () => {
|
|
118
101
|
it('should throw error if newEvents are not sorted in ascending order by eventId (client)', () => {
|
|
119
102
|
const syncState = new SyncState.SyncState({
|
|
120
|
-
pending: [
|
|
103
|
+
pending: [e1_0],
|
|
121
104
|
upstreamHead: EventId.ROOT,
|
|
122
|
-
localHead:
|
|
105
|
+
localHead: e1_0.id,
|
|
123
106
|
});
|
|
124
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
107
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_0] } });
|
|
125
108
|
expect(result).toMatchObject({ _tag: 'unexpected-error' });
|
|
126
109
|
});
|
|
127
110
|
it('should throw error if newEvents are not sorted in ascending order by eventId (global)', () => {
|
|
128
111
|
const syncState = new SyncState.SyncState({
|
|
129
|
-
pending: [
|
|
112
|
+
pending: [e1_0],
|
|
130
113
|
upstreamHead: EventId.ROOT,
|
|
131
|
-
localHead:
|
|
114
|
+
localHead: e1_0.id,
|
|
132
115
|
});
|
|
133
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
116
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0, e1_0] } });
|
|
134
117
|
expect(result).toMatchObject({ _tag: 'unexpected-error' });
|
|
135
118
|
});
|
|
136
119
|
it('should throw error if incoming event is < expected upstream head', () => {
|
|
137
120
|
const syncState = new SyncState.SyncState({
|
|
138
121
|
pending: [],
|
|
139
|
-
upstreamHead:
|
|
140
|
-
localHead:
|
|
122
|
+
upstreamHead: e2_0.id,
|
|
123
|
+
localHead: e2_0.id,
|
|
141
124
|
});
|
|
142
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
125
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
|
|
143
126
|
expect(result).toMatchObject({ _tag: 'unexpected-error' });
|
|
144
127
|
});
|
|
145
128
|
it('should throw error if incoming event is = expected upstream head', () => {
|
|
146
129
|
const syncState = new SyncState.SyncState({
|
|
147
130
|
pending: [],
|
|
148
|
-
upstreamHead:
|
|
149
|
-
localHead:
|
|
150
|
-
});
|
|
151
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e_1_0] } });
|
|
152
|
-
expect(result).toMatchObject({ _tag: 'unexpected-error' });
|
|
153
|
-
});
|
|
154
|
-
it('should throw if the parent id of the first incoming event is unknown', () => {
|
|
155
|
-
const syncState = new SyncState.SyncState({
|
|
156
|
-
pending: [],
|
|
157
|
-
upstreamHead: EventId.ROOT,
|
|
158
|
-
localHead: e_0_0.id,
|
|
131
|
+
upstreamHead: e2_0.id,
|
|
132
|
+
localHead: e2_0.id,
|
|
159
133
|
});
|
|
160
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
134
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0] } });
|
|
161
135
|
expect(result).toMatchObject({ _tag: 'unexpected-error' });
|
|
162
136
|
});
|
|
163
137
|
it('should confirm pending event when receiving matching event', () => {
|
|
164
138
|
const syncState = new SyncState.SyncState({
|
|
165
|
-
pending: [
|
|
139
|
+
pending: [e1_0],
|
|
166
140
|
upstreamHead: EventId.ROOT,
|
|
167
|
-
localHead:
|
|
141
|
+
localHead: e1_0.id,
|
|
168
142
|
});
|
|
169
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
143
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
|
|
170
144
|
expectAdvance(result);
|
|
171
145
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
|
172
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
173
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
146
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.id);
|
|
147
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0.id);
|
|
174
148
|
expectEventArraysEqual(result.newEvents, []);
|
|
175
|
-
expectEventArraysEqual(result.confirmedEvents, [
|
|
149
|
+
expectEventArraysEqual(result.confirmedEvents, [e1_0]);
|
|
176
150
|
});
|
|
177
151
|
it('should confirm partial pending event when receiving matching event', () => {
|
|
178
152
|
const syncState = new SyncState.SyncState({
|
|
179
|
-
pending: [
|
|
153
|
+
pending: [e1_0, e2_0],
|
|
180
154
|
upstreamHead: EventId.ROOT,
|
|
181
|
-
localHead:
|
|
155
|
+
localHead: e2_0.id,
|
|
182
156
|
});
|
|
183
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
157
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
|
|
184
158
|
expectAdvance(result);
|
|
185
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
186
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
187
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
159
|
+
expectEventArraysEqual(result.newSyncState.pending, [e2_0]);
|
|
160
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.id);
|
|
161
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.id);
|
|
188
162
|
expectEventArraysEqual(result.newEvents, []);
|
|
189
|
-
expectEventArraysEqual(result.confirmedEvents, [
|
|
163
|
+
expectEventArraysEqual(result.confirmedEvents, [e1_0]);
|
|
190
164
|
});
|
|
191
165
|
it('should confirm pending event and add new event', () => {
|
|
192
166
|
const syncState = new SyncState.SyncState({
|
|
193
|
-
pending: [
|
|
167
|
+
pending: [e1_0],
|
|
194
168
|
upstreamHead: EventId.ROOT,
|
|
195
|
-
localHead:
|
|
169
|
+
localHead: e1_0.id,
|
|
196
170
|
});
|
|
197
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
171
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0, e1_1] } });
|
|
198
172
|
expectAdvance(result);
|
|
199
173
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
|
200
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
201
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
202
|
-
expect(result.newEvents).toStrictEqual([
|
|
203
|
-
expectEventArraysEqual(result.confirmedEvents, [
|
|
174
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.id);
|
|
175
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1.id);
|
|
176
|
+
expect(result.newEvents).toStrictEqual([e1_1]);
|
|
177
|
+
expectEventArraysEqual(result.confirmedEvents, [e1_0]);
|
|
204
178
|
});
|
|
205
179
|
it('should confirm pending event and add multiple new events', () => {
|
|
206
180
|
const syncState = new SyncState.SyncState({
|
|
207
|
-
pending: [
|
|
208
|
-
upstreamHead:
|
|
209
|
-
localHead:
|
|
181
|
+
pending: [e1_1],
|
|
182
|
+
upstreamHead: e1_0.id,
|
|
183
|
+
localHead: e1_1.id,
|
|
210
184
|
});
|
|
211
185
|
const result = merge({
|
|
212
186
|
syncState,
|
|
213
|
-
payload: { _tag: 'upstream-advance', newEvents: [
|
|
187
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_2, e1_3, e2_0, e2_1] },
|
|
214
188
|
});
|
|
215
189
|
expectAdvance(result);
|
|
216
190
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
|
217
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
218
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
219
|
-
expect(result.newEvents).toStrictEqual([
|
|
220
|
-
expectEventArraysEqual(result.confirmedEvents, [
|
|
191
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_1.id);
|
|
192
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_1.id);
|
|
193
|
+
expect(result.newEvents).toStrictEqual([e1_2, e1_3, e2_0, e2_1]);
|
|
194
|
+
expectEventArraysEqual(result.confirmedEvents, [e1_1]);
|
|
195
|
+
});
|
|
196
|
+
it('should confirm pending global event while keep pending client events', () => {
|
|
197
|
+
const syncState = new SyncState.SyncState({
|
|
198
|
+
pending: [e1_0, e1_1],
|
|
199
|
+
upstreamHead: EventId.ROOT,
|
|
200
|
+
localHead: e1_1.id,
|
|
201
|
+
});
|
|
202
|
+
const result = merge({
|
|
203
|
+
syncState,
|
|
204
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
|
|
205
|
+
});
|
|
206
|
+
expectAdvance(result);
|
|
207
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_1]);
|
|
208
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.id);
|
|
209
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1.id);
|
|
210
|
+
expectEventArraysEqual(result.newEvents, []);
|
|
211
|
+
expectEventArraysEqual(result.confirmedEvents, [e1_0]);
|
|
221
212
|
});
|
|
222
213
|
it('should ignore client events (incoming is subset of pending)', () => {
|
|
223
214
|
const syncState = new SyncState.SyncState({
|
|
224
|
-
pending: [
|
|
215
|
+
pending: [e0_1, e1_0],
|
|
225
216
|
upstreamHead: EventId.ROOT,
|
|
226
|
-
localHead:
|
|
217
|
+
localHead: e1_0.id,
|
|
227
218
|
});
|
|
228
219
|
const result = merge({
|
|
229
220
|
syncState,
|
|
230
|
-
payload: { _tag: 'upstream-advance', newEvents: [
|
|
221
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
|
|
231
222
|
ignoreClientEvents: true,
|
|
232
223
|
});
|
|
233
224
|
expectAdvance(result);
|
|
234
225
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
|
235
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
236
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
226
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.id);
|
|
227
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0.id);
|
|
237
228
|
expectEventArraysEqual(result.newEvents, []);
|
|
238
|
-
expectEventArraysEqual(result.confirmedEvents, [
|
|
229
|
+
expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0]);
|
|
239
230
|
});
|
|
240
231
|
it('should ignore client events (incoming is subset of pending case 2)', () => {
|
|
241
232
|
const syncState = new SyncState.SyncState({
|
|
242
|
-
pending: [
|
|
233
|
+
pending: [e0_1, e1_0, e2_0],
|
|
243
234
|
upstreamHead: EventId.ROOT,
|
|
244
|
-
localHead:
|
|
235
|
+
localHead: e1_0.id,
|
|
245
236
|
});
|
|
246
237
|
const result = merge({
|
|
247
238
|
syncState,
|
|
248
|
-
payload: { _tag: 'upstream-advance', newEvents: [
|
|
239
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
|
|
249
240
|
ignoreClientEvents: true,
|
|
250
241
|
});
|
|
251
242
|
expectAdvance(result);
|
|
252
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
253
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
254
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
243
|
+
expectEventArraysEqual(result.newSyncState.pending, [e2_0]);
|
|
244
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.id);
|
|
245
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.id);
|
|
255
246
|
expectEventArraysEqual(result.newEvents, []);
|
|
256
|
-
expectEventArraysEqual(result.confirmedEvents, [
|
|
247
|
+
expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0]);
|
|
257
248
|
});
|
|
258
249
|
it('should ignore client events (incoming goes beyond pending)', () => {
|
|
259
250
|
const syncState = new SyncState.SyncState({
|
|
260
|
-
pending: [
|
|
251
|
+
pending: [e0_1, e1_0, e1_1],
|
|
261
252
|
upstreamHead: EventId.ROOT,
|
|
262
|
-
localHead:
|
|
253
|
+
localHead: e1_1.id,
|
|
263
254
|
});
|
|
264
255
|
const result = merge({
|
|
265
256
|
syncState,
|
|
266
|
-
payload: { _tag: 'upstream-advance', newEvents: [
|
|
257
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_0, e2_0] },
|
|
267
258
|
ignoreClientEvents: true,
|
|
268
259
|
});
|
|
269
260
|
expectAdvance(result);
|
|
270
261
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
|
271
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
272
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
273
|
-
expect(result.newEvents).toStrictEqual([
|
|
274
|
-
expectEventArraysEqual(result.confirmedEvents, [
|
|
262
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id);
|
|
263
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.id);
|
|
264
|
+
expect(result.newEvents).toStrictEqual([e2_0]);
|
|
265
|
+
expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0, e1_1]);
|
|
275
266
|
});
|
|
276
267
|
it('should fail if incoming event is ≤ local head', () => {
|
|
277
268
|
const syncState = new SyncState.SyncState({
|
|
278
269
|
pending: [],
|
|
279
|
-
upstreamHead:
|
|
280
|
-
localHead:
|
|
270
|
+
upstreamHead: e2_0.id,
|
|
271
|
+
localHead: e2_0.id,
|
|
281
272
|
});
|
|
282
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [
|
|
273
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
|
|
283
274
|
expect(result).toMatchObject({ _tag: 'unexpected-error' });
|
|
284
275
|
});
|
|
285
276
|
});
|
|
286
277
|
describe('upstream-advance: rebase', () => {
|
|
287
278
|
it('should rebase single client event to end', () => {
|
|
288
279
|
const syncState = new SyncState.SyncState({
|
|
289
|
-
pending: [
|
|
280
|
+
pending: [e1_0],
|
|
290
281
|
upstreamHead: EventId.ROOT,
|
|
291
|
-
localHead:
|
|
282
|
+
localHead: e1_0.id,
|
|
292
283
|
});
|
|
293
|
-
const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [
|
|
294
|
-
const
|
|
284
|
+
const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1] }) });
|
|
285
|
+
const e1_0_e1_2 = e1_0.rebase_(e1_1.id);
|
|
295
286
|
expectRebase(result);
|
|
296
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
297
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
298
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
299
|
-
expectEventArraysEqual(result.rollbackEvents, [
|
|
300
|
-
expectEventArraysEqual(result.newEvents, [
|
|
287
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_0_e1_2]);
|
|
288
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.id);
|
|
289
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0_e1_2.id);
|
|
290
|
+
expectEventArraysEqual(result.rollbackEvents, [e1_0]);
|
|
291
|
+
expectEventArraysEqual(result.newEvents, [e1_1, e1_0_e1_2]);
|
|
301
292
|
});
|
|
302
293
|
it('should rebase different event with same id', () => {
|
|
303
|
-
const
|
|
294
|
+
const e2_0_b = new TestEvent({ global: 1, client: 0 }, e1_0.id, '1_0_b', false);
|
|
304
295
|
const syncState = new SyncState.SyncState({
|
|
305
|
-
pending: [
|
|
296
|
+
pending: [e2_0_b],
|
|
306
297
|
upstreamHead: EventId.ROOT,
|
|
307
|
-
localHead:
|
|
298
|
+
localHead: e2_0_b.id,
|
|
308
299
|
});
|
|
309
|
-
const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [
|
|
310
|
-
const
|
|
300
|
+
const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e2_0] }) });
|
|
301
|
+
const e2_0_e3_0 = e2_0_b.rebase_(e2_0.id);
|
|
311
302
|
expectRebase(result);
|
|
312
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
313
|
-
expectEventArraysEqual(result.newEvents, [
|
|
314
|
-
expectEventArraysEqual(result.rollbackEvents, [
|
|
315
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
316
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
303
|
+
expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0]);
|
|
304
|
+
expectEventArraysEqual(result.newEvents, [e2_0, e2_0_e3_0]);
|
|
305
|
+
expectEventArraysEqual(result.rollbackEvents, [e2_0_b]);
|
|
306
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id);
|
|
307
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.id);
|
|
317
308
|
});
|
|
318
309
|
it('should rebase single client event to end (more incoming events)', () => {
|
|
319
310
|
const syncState = new SyncState.SyncState({
|
|
320
|
-
pending: [
|
|
311
|
+
pending: [e1_0],
|
|
321
312
|
upstreamHead: EventId.ROOT,
|
|
322
|
-
localHead:
|
|
313
|
+
localHead: e1_0.id,
|
|
323
314
|
});
|
|
324
315
|
const result = merge({
|
|
325
316
|
syncState,
|
|
326
|
-
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [
|
|
317
|
+
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
|
|
327
318
|
});
|
|
328
|
-
const
|
|
319
|
+
const e1_0_e3_0 = e1_0.rebase_(e2_0.id);
|
|
329
320
|
expectRebase(result);
|
|
330
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
331
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
332
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
321
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_0_e3_0]);
|
|
322
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id);
|
|
323
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0_e3_0.id);
|
|
333
324
|
});
|
|
334
325
|
it('should only rebase divergent events when first event matches', () => {
|
|
335
326
|
const syncState = new SyncState.SyncState({
|
|
336
|
-
pending: [
|
|
327
|
+
pending: [e1_0, e1_1],
|
|
337
328
|
upstreamHead: EventId.ROOT,
|
|
338
|
-
localHead:
|
|
329
|
+
localHead: e1_0.id,
|
|
339
330
|
});
|
|
340
331
|
const result = merge({
|
|
341
332
|
syncState,
|
|
342
|
-
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [
|
|
333
|
+
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_0, e1_2, e1_3, e2_0] }),
|
|
343
334
|
});
|
|
344
|
-
const
|
|
335
|
+
const e1_1_e2_1 = e1_1.rebase_(e2_0.id);
|
|
345
336
|
expectRebase(result);
|
|
346
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
347
|
-
expectEventArraysEqual(result.rollbackEvents, [
|
|
348
|
-
expectEventArraysEqual(result.newEvents, [
|
|
349
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
350
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
337
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_1_e2_1]);
|
|
338
|
+
expectEventArraysEqual(result.rollbackEvents, [e1_1]);
|
|
339
|
+
expectEventArraysEqual(result.newEvents, [e1_2, e1_3, e2_0, e1_1_e2_1]);
|
|
340
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id);
|
|
341
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_1.id);
|
|
351
342
|
});
|
|
352
343
|
it('should rebase all client events when incoming chain starts differently', () => {
|
|
353
344
|
const syncState = new SyncState.SyncState({
|
|
354
|
-
pending: [
|
|
345
|
+
pending: [e1_0, e1_1],
|
|
355
346
|
upstreamHead: EventId.ROOT,
|
|
356
|
-
localHead:
|
|
347
|
+
localHead: e1_1.id,
|
|
357
348
|
});
|
|
358
349
|
const result = merge({
|
|
359
350
|
syncState,
|
|
360
|
-
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [
|
|
351
|
+
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
|
|
361
352
|
});
|
|
362
|
-
const
|
|
363
|
-
const
|
|
353
|
+
const e1_0_e2_1 = e1_0.rebase_(e2_0.id);
|
|
354
|
+
const e1_1_e2_2 = e1_1.rebase_(e1_0_e2_1.id);
|
|
364
355
|
expectRebase(result);
|
|
365
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
366
|
-
expectEventArraysEqual(result.newEvents, [
|
|
367
|
-
expectEventArraysEqual(result.rollbackEvents, [
|
|
368
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(
|
|
369
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
356
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_0_e2_1, e1_1_e2_2]);
|
|
357
|
+
expectEventArraysEqual(result.newEvents, [e1_1, e1_2, e1_3, e2_0, e1_0_e2_1, e1_1_e2_2]);
|
|
358
|
+
expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1]);
|
|
359
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id);
|
|
360
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_2.id);
|
|
370
361
|
});
|
|
371
362
|
describe('local-push', () => {
|
|
372
363
|
describe('advance', () => {
|
|
373
364
|
it('should advance with new events', () => {
|
|
374
365
|
const syncState = new SyncState.SyncState({
|
|
375
|
-
pending: [
|
|
366
|
+
pending: [e1_0],
|
|
376
367
|
upstreamHead: EventId.ROOT,
|
|
377
|
-
localHead:
|
|
368
|
+
localHead: e1_0.id,
|
|
378
369
|
});
|
|
379
370
|
const result = merge({
|
|
380
371
|
syncState,
|
|
381
|
-
payload: SyncState.PayloadLocalPush.make({ newEvents: [
|
|
372
|
+
payload: SyncState.PayloadLocalPush.make({ newEvents: [e1_1, e1_2, e1_3] }),
|
|
382
373
|
});
|
|
383
374
|
expectAdvance(result);
|
|
384
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
|
375
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_0, e1_1, e1_2, e1_3]);
|
|
385
376
|
expect(result.newSyncState.upstreamHead).toMatchObject(EventId.ROOT);
|
|
386
|
-
expect(result.newSyncState.localHead).toMatchObject(
|
|
387
|
-
expectEventArraysEqual(result.newEvents, [
|
|
377
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_3.id);
|
|
378
|
+
expectEventArraysEqual(result.newEvents, [e1_1, e1_2, e1_3]);
|
|
388
379
|
expectEventArraysEqual(result.confirmedEvents, []);
|
|
389
380
|
});
|
|
390
381
|
});
|
|
391
382
|
describe('reject', () => {
|
|
392
383
|
it('should reject when new events are greater than pending events', () => {
|
|
393
384
|
const syncState = new SyncState.SyncState({
|
|
394
|
-
pending: [
|
|
385
|
+
pending: [e1_0, e1_1],
|
|
395
386
|
upstreamHead: EventId.ROOT,
|
|
396
|
-
localHead:
|
|
387
|
+
localHead: e1_1.id,
|
|
397
388
|
});
|
|
398
389
|
const result = merge({
|
|
399
390
|
syncState,
|
|
400
|
-
payload: SyncState.PayloadLocalPush.make({ newEvents: [
|
|
391
|
+
payload: SyncState.PayloadLocalPush.make({ newEvents: [e1_1, e1_2] }),
|
|
401
392
|
});
|
|
402
393
|
expectReject(result);
|
|
403
|
-
expect(result.expectedMinimumId).toMatchObject(
|
|
394
|
+
expect(result.expectedMinimumId).toMatchObject(e1_2.id);
|
|
404
395
|
});
|
|
405
396
|
});
|
|
406
397
|
});
|
|
@@ -412,7 +403,7 @@ const expectEventArraysEqual = (actual, expected) => {
|
|
|
412
403
|
actual.forEach((event, i) => {
|
|
413
404
|
expect(event.id).toStrictEqual(expected[i].id);
|
|
414
405
|
expect(event.parentId).toStrictEqual(expected[i].parentId);
|
|
415
|
-
expect(event.
|
|
406
|
+
expect(event.name).toStrictEqual(expected[i].name);
|
|
416
407
|
expect(event.args).toStrictEqual(expected[i].args);
|
|
417
408
|
});
|
|
418
409
|
};
|