cojson 0.13.17 → 0.13.20
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +18 -0
- package/dist/PeerState.d.ts +4 -1
- package/dist/PeerState.d.ts.map +1 -1
- package/dist/PeerState.js +16 -36
- package/dist/PeerState.js.map +1 -1
- package/dist/SyncStateManager.d.ts.map +1 -1
- package/dist/SyncStateManager.js +2 -3
- package/dist/SyncStateManager.js.map +1 -1
- package/dist/coValue.d.ts +4 -4
- package/dist/coValue.d.ts.map +1 -1
- package/dist/coValue.js +4 -4
- package/dist/coValue.js.map +1 -1
- package/dist/coValueCore/coValueCore.d.ts +143 -0
- package/dist/coValueCore/coValueCore.d.ts.map +1 -0
- package/dist/{coValueCore.js → coValueCore/coValueCore.js} +325 -253
- package/dist/coValueCore/coValueCore.js.map +1 -0
- package/dist/coValueCore/verifiedState.d.ts +65 -0
- package/dist/coValueCore/verifiedState.d.ts.map +1 -0
- package/dist/coValueCore/verifiedState.js +210 -0
- package/dist/coValueCore/verifiedState.js.map +1 -0
- package/dist/coValues/account.d.ts +8 -10
- package/dist/coValues/account.d.ts.map +1 -1
- package/dist/coValues/account.js +12 -13
- package/dist/coValues/account.js.map +1 -1
- package/dist/coValues/coList.d.ts +3 -3
- package/dist/coValues/coList.d.ts.map +1 -1
- package/dist/coValues/coList.js +6 -3
- package/dist/coValues/coList.js.map +1 -1
- package/dist/coValues/coMap.d.ts +3 -3
- package/dist/coValues/coMap.d.ts.map +1 -1
- package/dist/coValues/coMap.js +3 -3
- package/dist/coValues/coMap.js.map +1 -1
- package/dist/coValues/coPlainText.d.ts +2 -2
- package/dist/coValues/coPlainText.d.ts.map +1 -1
- package/dist/coValues/coPlainText.js +4 -4
- package/dist/coValues/coPlainText.js.map +1 -1
- package/dist/coValues/coStream.d.ts +3 -3
- package/dist/coValues/coStream.d.ts.map +1 -1
- package/dist/coValues/coStream.js +3 -3
- package/dist/coValues/coStream.js.map +1 -1
- package/dist/coValues/group.d.ts +7 -2
- package/dist/coValues/group.d.ts.map +1 -1
- package/dist/coValues/group.js +29 -26
- package/dist/coValues/group.js.map +1 -1
- package/dist/coreToCoValue.d.ts +2 -2
- package/dist/coreToCoValue.d.ts.map +1 -1
- package/dist/coreToCoValue.js +10 -14
- package/dist/coreToCoValue.js.map +1 -1
- package/dist/exports.d.ts +6 -5
- package/dist/exports.d.ts.map +1 -1
- package/dist/exports.js +3 -4
- package/dist/exports.js.map +1 -1
- package/dist/localNode.d.ts +30 -24
- package/dist/localNode.d.ts.map +1 -1
- package/dist/localNode.js +147 -173
- package/dist/localNode.js.map +1 -1
- package/dist/permissions.d.ts +2 -1
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +15 -11
- package/dist/permissions.js.map +1 -1
- package/dist/priority.d.ts +1 -1
- package/dist/priority.d.ts.map +1 -1
- package/dist/streamUtils.d.ts +5 -5
- package/dist/streamUtils.d.ts.map +1 -1
- package/dist/streamUtils.js +5 -20
- package/dist/streamUtils.js.map +1 -1
- package/dist/sync.d.ts +8 -6
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +121 -74
- package/dist/sync.js.map +1 -1
- package/dist/tests/PeerState.test.js +0 -31
- package/dist/tests/PeerState.test.js.map +1 -1
- package/dist/tests/SyncStateManager.test.js +41 -6
- package/dist/tests/SyncStateManager.test.js.map +1 -1
- package/dist/tests/account.test.js +16 -0
- package/dist/tests/account.test.js.map +1 -1
- package/dist/tests/coList.test.js +19 -16
- package/dist/tests/coList.test.js.map +1 -1
- package/dist/tests/coMap.test.js +12 -13
- package/dist/tests/coMap.test.js.map +1 -1
- package/dist/tests/coPlainText.test.js +9 -10
- package/dist/tests/coPlainText.test.js.map +1 -1
- package/dist/tests/coStream.test.js +22 -17
- package/dist/tests/coStream.test.js.map +1 -1
- package/dist/tests/coValueCore.test.js +22 -28
- package/dist/tests/coValueCore.test.js.map +1 -1
- package/dist/tests/coValueCoreLoadingState.test.d.ts +2 -0
- package/dist/tests/coValueCoreLoadingState.test.d.ts.map +1 -0
- package/dist/tests/{coValueState.test.js → coValueCoreLoadingState.test.js} +62 -46
- package/dist/tests/coValueCoreLoadingState.test.js.map +1 -0
- package/dist/tests/group.test.js +42 -43
- package/dist/tests/group.test.js.map +1 -1
- package/dist/tests/messagesTestUtils.d.ts +2 -2
- package/dist/tests/messagesTestUtils.d.ts.map +1 -1
- package/dist/tests/messagesTestUtils.js +1 -1
- package/dist/tests/messagesTestUtils.js.map +1 -1
- package/dist/tests/permissions.test.js +224 -292
- package/dist/tests/permissions.test.js.map +1 -1
- package/dist/tests/priority.test.js +13 -14
- package/dist/tests/priority.test.js.map +1 -1
- package/dist/tests/sync.auth.test.d.ts +2 -0
- package/dist/tests/sync.auth.test.d.ts.map +1 -0
- package/dist/tests/sync.auth.test.js +190 -0
- package/dist/tests/sync.auth.test.js.map +1 -0
- package/dist/tests/sync.load.test.js +6 -6
- package/dist/tests/sync.load.test.js.map +1 -1
- package/dist/tests/sync.mesh.test.js +25 -12
- package/dist/tests/sync.mesh.test.js.map +1 -1
- package/dist/tests/sync.peerReconciliation.test.js +19 -19
- package/dist/tests/sync.peerReconciliation.test.js.map +1 -1
- package/dist/tests/sync.storage.test.js +20 -13
- package/dist/tests/sync.storage.test.js.map +1 -1
- package/dist/tests/sync.test.js +32 -39
- package/dist/tests/sync.test.js.map +1 -1
- package/dist/tests/sync.upload.test.js +126 -37
- package/dist/tests/sync.upload.test.js.map +1 -1
- package/dist/tests/testUtils.d.ts +35 -17
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +103 -79
- package/dist/tests/testUtils.js.map +1 -1
- package/dist/typeUtils/expectGroup.js +1 -1
- package/dist/typeUtils/expectGroup.js.map +1 -1
- package/package.json +1 -1
- package/src/PeerState.ts +19 -40
- package/src/SyncStateManager.ts +2 -3
- package/src/coValue.ts +11 -8
- package/src/{coValueCore.ts → coValueCore/coValueCore.ts} +478 -422
- package/src/coValueCore/verifiedState.ts +376 -0
- package/src/coValues/account.ts +20 -25
- package/src/coValues/coList.ts +12 -6
- package/src/coValues/coMap.ts +9 -6
- package/src/coValues/coPlainText.ts +9 -6
- package/src/coValues/coStream.ts +9 -6
- package/src/coValues/group.ts +50 -28
- package/src/coreToCoValue.ts +14 -15
- package/src/exports.ts +9 -7
- package/src/localNode.ts +236 -275
- package/src/permissions.ts +18 -12
- package/src/priority.ts +1 -1
- package/src/streamUtils.ts +7 -34
- package/src/sync.ts +146 -84
- package/src/tests/PeerState.test.ts +0 -37
- package/src/tests/SyncStateManager.test.ts +56 -6
- package/src/tests/account.test.ts +24 -0
- package/src/tests/coList.test.ts +21 -15
- package/src/tests/coMap.test.ts +12 -13
- package/src/tests/coPlainText.test.ts +12 -9
- package/src/tests/coStream.test.ts +25 -16
- package/src/tests/coValueCore.test.ts +30 -27
- package/src/tests/{coValueState.test.ts → coValueCoreLoadingState.test.ts} +67 -57
- package/src/tests/group.test.ts +44 -69
- package/src/tests/messagesTestUtils.ts +3 -8
- package/src/tests/permissions.test.ts +283 -449
- package/src/tests/priority.test.ts +17 -13
- package/src/tests/sync.auth.test.ts +246 -0
- package/src/tests/sync.load.test.ts +7 -6
- package/src/tests/sync.mesh.test.ts +25 -12
- package/src/tests/sync.peerReconciliation.test.ts +25 -25
- package/src/tests/sync.storage.test.ts +20 -13
- package/src/tests/sync.test.ts +43 -43
- package/src/tests/sync.upload.test.ts +157 -37
- package/src/tests/testUtils.ts +143 -96
- package/src/typeUtils/expectGroup.ts +1 -1
- package/dist/CoValuesStore.d.ts +0 -14
- package/dist/CoValuesStore.d.ts.map +0 -1
- package/dist/CoValuesStore.js +0 -32
- package/dist/CoValuesStore.js.map +0 -1
- package/dist/coValueCore.d.ts +0 -142
- package/dist/coValueCore.d.ts.map +0 -1
- package/dist/coValueCore.js.map +0 -1
- package/dist/coValueState.d.ts +0 -34
- package/dist/coValueState.d.ts.map +0 -1
- package/dist/coValueState.js +0 -190
- package/dist/coValueState.js.map +0 -1
- package/dist/tests/coValueState.test.d.ts +0 -2
- package/dist/tests/coValueState.test.d.ts.map +0 -1
- package/dist/tests/coValueState.test.js.map +0 -1
- package/src/CoValuesStore.ts +0 -41
- package/src/coValueState.ts +0 -245
|
@@ -2,7 +2,11 @@ import { describe, expect, test } from "vitest";
|
|
|
2
2
|
import { WasmCrypto } from "../crypto/WasmCrypto.js";
|
|
3
3
|
import { LocalNode } from "../localNode.js";
|
|
4
4
|
import { CO_VALUE_PRIORITY, getPriorityFromHeader } from "../priority.js";
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
createAccountInNode,
|
|
7
|
+
nodeWithRandomAgentAndSessionID,
|
|
8
|
+
randomAgentAndSessionID,
|
|
9
|
+
} from "./testUtils.js";
|
|
6
10
|
|
|
7
11
|
const Crypto = await WasmCrypto.create();
|
|
8
12
|
|
|
@@ -14,7 +18,7 @@ describe("getPriorityFromHeader", () => {
|
|
|
14
18
|
});
|
|
15
19
|
|
|
16
20
|
test("returns MEDIUM priority for costream type", () => {
|
|
17
|
-
const node =
|
|
21
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
18
22
|
const costream = node.createCoValue({
|
|
19
23
|
type: "costream",
|
|
20
24
|
ruleset: { type: "unsafeAllowAll" },
|
|
@@ -22,13 +26,13 @@ describe("getPriorityFromHeader", () => {
|
|
|
22
26
|
...Crypto.createdNowUnique(),
|
|
23
27
|
});
|
|
24
28
|
|
|
25
|
-
expect(getPriorityFromHeader(costream.header)).toEqual(
|
|
29
|
+
expect(getPriorityFromHeader(costream.verified.header)).toEqual(
|
|
26
30
|
CO_VALUE_PRIORITY.MEDIUM,
|
|
27
31
|
);
|
|
28
32
|
});
|
|
29
33
|
|
|
30
34
|
test("returns LOW priority for binary costream type", () => {
|
|
31
|
-
const node =
|
|
35
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
32
36
|
const costream = node.createCoValue({
|
|
33
37
|
type: "costream",
|
|
34
38
|
ruleset: { type: "unsafeAllowAll" },
|
|
@@ -36,32 +40,32 @@ describe("getPriorityFromHeader", () => {
|
|
|
36
40
|
...Crypto.createdNowUnique(),
|
|
37
41
|
});
|
|
38
42
|
|
|
39
|
-
expect(getPriorityFromHeader(costream.header)).toEqual(
|
|
43
|
+
expect(getPriorityFromHeader(costream.verified.header)).toEqual(
|
|
40
44
|
CO_VALUE_PRIORITY.LOW,
|
|
41
45
|
);
|
|
42
46
|
});
|
|
43
47
|
|
|
44
48
|
test("returns HIGH priority for account type", async () => {
|
|
45
|
-
const node =
|
|
49
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
46
50
|
|
|
47
|
-
const account =
|
|
51
|
+
const account = createAccountInNode(node);
|
|
48
52
|
|
|
49
|
-
expect(getPriorityFromHeader(account.core.header)).toEqual(
|
|
53
|
+
expect(getPriorityFromHeader(account.account.core.verified.header)).toEqual(
|
|
50
54
|
CO_VALUE_PRIORITY.HIGH,
|
|
51
55
|
);
|
|
52
56
|
});
|
|
53
57
|
|
|
54
58
|
test("returns HIGH priority for group type", () => {
|
|
55
|
-
const node =
|
|
59
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
56
60
|
const group = node.createGroup();
|
|
57
61
|
|
|
58
|
-
expect(getPriorityFromHeader(group.core.header)).toEqual(
|
|
62
|
+
expect(getPriorityFromHeader(group.core.verified.header)).toEqual(
|
|
59
63
|
CO_VALUE_PRIORITY.HIGH,
|
|
60
64
|
);
|
|
61
65
|
});
|
|
62
66
|
|
|
63
67
|
test("returns MEDIUM priority for other types", () => {
|
|
64
|
-
const node =
|
|
68
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
65
69
|
|
|
66
70
|
const comap = node.createCoValue({
|
|
67
71
|
type: "comap",
|
|
@@ -77,10 +81,10 @@ describe("getPriorityFromHeader", () => {
|
|
|
77
81
|
...Crypto.createdNowUnique(),
|
|
78
82
|
});
|
|
79
83
|
|
|
80
|
-
expect(getPriorityFromHeader(comap.header)).toEqual(
|
|
84
|
+
expect(getPriorityFromHeader(comap.verified.header)).toEqual(
|
|
81
85
|
CO_VALUE_PRIORITY.MEDIUM,
|
|
82
86
|
);
|
|
83
|
-
expect(getPriorityFromHeader(colist.header)).toEqual(
|
|
87
|
+
expect(getPriorityFromHeader(colist.verified.header)).toEqual(
|
|
84
88
|
CO_VALUE_PRIORITY.MEDIUM,
|
|
85
89
|
);
|
|
86
90
|
});
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { assert, beforeEach, describe, expect, test } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { WasmCrypto } from "../crypto/WasmCrypto";
|
|
4
|
+
import { LocalNode } from "../localNode";
|
|
5
|
+
import {
|
|
6
|
+
SyncMessagesLog,
|
|
7
|
+
getSyncServerConnectedPeer,
|
|
8
|
+
setupTestNode,
|
|
9
|
+
} from "./testUtils";
|
|
10
|
+
|
|
11
|
+
const Crypto = await WasmCrypto.create();
|
|
12
|
+
let jazzCloud = setupTestNode({ isSyncServer: true });
|
|
13
|
+
|
|
14
|
+
beforeEach(async () => {
|
|
15
|
+
SyncMessagesLog.clear();
|
|
16
|
+
jazzCloud = setupTestNode({ isSyncServer: true });
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
describe("LocalNode auth sync", () => {
|
|
20
|
+
test("create a new account", async () => {
|
|
21
|
+
const { peer } = getSyncServerConnectedPeer({
|
|
22
|
+
peerId: "new-account",
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const { node } = await LocalNode.withNewlyCreatedAccount({
|
|
26
|
+
creationProps: {
|
|
27
|
+
name: "new-account",
|
|
28
|
+
},
|
|
29
|
+
peersToLoadFrom: [peer],
|
|
30
|
+
crypto: Crypto,
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const account = node.expectCurrentAccount("after login");
|
|
34
|
+
await account.core.waitForSync();
|
|
35
|
+
|
|
36
|
+
const profileID = account.get("profile")!;
|
|
37
|
+
|
|
38
|
+
const profileCoreOnSyncServer = jazzCloud.node.getCoValue(profileID);
|
|
39
|
+
|
|
40
|
+
expect(profileCoreOnSyncServer.isAvailable()).toBe(true);
|
|
41
|
+
|
|
42
|
+
assert(profileCoreOnSyncServer.isAvailable());
|
|
43
|
+
|
|
44
|
+
expect(
|
|
45
|
+
SyncMessagesLog.getMessages({
|
|
46
|
+
Account: account.core,
|
|
47
|
+
Profile: profileCoreOnSyncServer,
|
|
48
|
+
ProfileGroup: profileCoreOnSyncServer.getGroup().core,
|
|
49
|
+
}),
|
|
50
|
+
).toMatchInlineSnapshot(`
|
|
51
|
+
[
|
|
52
|
+
"client -> server | CONTENT Account header: true new: After: 0 New: 4",
|
|
53
|
+
"server -> client | KNOWN Account sessions: header/4",
|
|
54
|
+
"client -> server | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
55
|
+
"server -> client | KNOWN ProfileGroup sessions: header/5",
|
|
56
|
+
"client -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
57
|
+
"server -> client | KNOWN Profile sessions: header/1",
|
|
58
|
+
]
|
|
59
|
+
`);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test("create a new account with a migration", async () => {
|
|
63
|
+
const { peer } = getSyncServerConnectedPeer({
|
|
64
|
+
peerId: "new-account",
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const { node } = await LocalNode.withNewlyCreatedAccount({
|
|
68
|
+
creationProps: {
|
|
69
|
+
name: "new-account",
|
|
70
|
+
},
|
|
71
|
+
peersToLoadFrom: [peer],
|
|
72
|
+
crypto: Crypto,
|
|
73
|
+
async migration(account) {
|
|
74
|
+
const root = account.createMap();
|
|
75
|
+
const profile = account.createMap();
|
|
76
|
+
|
|
77
|
+
root.set("hello", "world");
|
|
78
|
+
profile.set("name", "new-account");
|
|
79
|
+
|
|
80
|
+
account.set("root", root.id);
|
|
81
|
+
account.set("profile", profile.id);
|
|
82
|
+
|
|
83
|
+
await root.core.waitForSync();
|
|
84
|
+
await profile.core.waitForSync();
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
const account = node.expectCurrentAccount("after login");
|
|
89
|
+
await account.core.waitForSync();
|
|
90
|
+
|
|
91
|
+
const rootID = account.get("root")!;
|
|
92
|
+
const profileID = account.get("profile")!;
|
|
93
|
+
|
|
94
|
+
const rootCoreOnSyncServer = jazzCloud.node.getCoValue(rootID);
|
|
95
|
+
expect(rootCoreOnSyncServer.isAvailable()).toBe(true);
|
|
96
|
+
|
|
97
|
+
const profileCoreOnSyncServer = jazzCloud.node.getCoValue(profileID);
|
|
98
|
+
|
|
99
|
+
expect(profileCoreOnSyncServer.isAvailable()).toBe(true);
|
|
100
|
+
|
|
101
|
+
assert(profileCoreOnSyncServer.isAvailable());
|
|
102
|
+
assert(rootCoreOnSyncServer.isAvailable());
|
|
103
|
+
|
|
104
|
+
expect(
|
|
105
|
+
SyncMessagesLog.getMessages({
|
|
106
|
+
Account: account.core,
|
|
107
|
+
Root: rootCoreOnSyncServer,
|
|
108
|
+
Profile: profileCoreOnSyncServer,
|
|
109
|
+
ProfileGroup: profileCoreOnSyncServer.getGroup().core,
|
|
110
|
+
}),
|
|
111
|
+
).toMatchInlineSnapshot(`
|
|
112
|
+
[
|
|
113
|
+
"client -> server | CONTENT Account header: true new: After: 0 New: 5",
|
|
114
|
+
"server -> client | KNOWN Account sessions: header/5",
|
|
115
|
+
"client -> server | CONTENT Root header: true new: After: 0 New: 1",
|
|
116
|
+
"server -> client | KNOWN Root sessions: header/1",
|
|
117
|
+
"client -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
118
|
+
"server -> client | KNOWN Profile sessions: header/1",
|
|
119
|
+
]
|
|
120
|
+
`);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test("authenticate to an existing account", async () => {
|
|
124
|
+
const { peer: newAccountPeer } = getSyncServerConnectedPeer({
|
|
125
|
+
peerId: "new-account",
|
|
126
|
+
ourName: "creation-node",
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
const { accountID, accountSecret } =
|
|
130
|
+
await LocalNode.withNewlyCreatedAccount({
|
|
131
|
+
creationProps: {
|
|
132
|
+
name: "new-account",
|
|
133
|
+
},
|
|
134
|
+
peersToLoadFrom: [newAccountPeer],
|
|
135
|
+
crypto: Crypto,
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const { peer: existingAccountPeer } = getSyncServerConnectedPeer({
|
|
139
|
+
peerId: "existing-account",
|
|
140
|
+
ourName: "auth-node",
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
const node = await LocalNode.withLoadedAccount({
|
|
144
|
+
accountID,
|
|
145
|
+
accountSecret,
|
|
146
|
+
peersToLoadFrom: [existingAccountPeer],
|
|
147
|
+
sessionID: undefined,
|
|
148
|
+
crypto: Crypto,
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
const account = node.expectCurrentAccount("after login");
|
|
152
|
+
const profile = node.getCoValue(account.get("profile")!);
|
|
153
|
+
|
|
154
|
+
assert(profile.isAvailable());
|
|
155
|
+
|
|
156
|
+
expect(account.id).toBe(accountID);
|
|
157
|
+
expect(node.agentSecret).toBe(accountSecret);
|
|
158
|
+
|
|
159
|
+
expect(
|
|
160
|
+
SyncMessagesLog.getMessages({
|
|
161
|
+
Account: account.core,
|
|
162
|
+
Profile: profile,
|
|
163
|
+
ProfileGroup: profile.getGroup().core,
|
|
164
|
+
}),
|
|
165
|
+
).toMatchInlineSnapshot(`
|
|
166
|
+
[
|
|
167
|
+
"creation-node -> server | CONTENT Account header: true new: After: 0 New: 4",
|
|
168
|
+
"auth-node -> server | LOAD Account sessions: empty",
|
|
169
|
+
"server -> creation-node | KNOWN Account sessions: header/4",
|
|
170
|
+
"creation-node -> server | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
171
|
+
"server -> auth-node | CONTENT Account header: true new: After: 0 New: 4",
|
|
172
|
+
"server -> creation-node | KNOWN ProfileGroup sessions: header/5",
|
|
173
|
+
"creation-node -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
174
|
+
"auth-node -> server | KNOWN Account sessions: header/4",
|
|
175
|
+
"server -> creation-node | KNOWN Profile sessions: header/1",
|
|
176
|
+
"auth-node -> server | LOAD Profile sessions: empty",
|
|
177
|
+
"server -> auth-node | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
178
|
+
"auth-node -> server | KNOWN ProfileGroup sessions: header/5",
|
|
179
|
+
"server -> auth-node | CONTENT Profile header: true new: After: 0 New: 1",
|
|
180
|
+
"auth-node -> server | KNOWN Profile sessions: header/1",
|
|
181
|
+
]
|
|
182
|
+
`);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test("authenticate to an existing account after immediately close the creation node", async () => {
|
|
186
|
+
const { peer: newAccountPeer } = getSyncServerConnectedPeer({
|
|
187
|
+
peerId: "new-account",
|
|
188
|
+
ourName: "creation-node",
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
const {
|
|
192
|
+
accountID,
|
|
193
|
+
accountSecret,
|
|
194
|
+
node: creationNode,
|
|
195
|
+
} = await LocalNode.withNewlyCreatedAccount({
|
|
196
|
+
creationProps: {
|
|
197
|
+
name: "new-account",
|
|
198
|
+
},
|
|
199
|
+
peersToLoadFrom: [newAccountPeer],
|
|
200
|
+
crypto: Crypto,
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
creationNode.gracefulShutdown();
|
|
204
|
+
|
|
205
|
+
const { peer: existingAccountPeer } = getSyncServerConnectedPeer({
|
|
206
|
+
peerId: "existing-account",
|
|
207
|
+
ourName: "auth-node",
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
const node = await LocalNode.withLoadedAccount({
|
|
211
|
+
accountID,
|
|
212
|
+
accountSecret,
|
|
213
|
+
peersToLoadFrom: [existingAccountPeer],
|
|
214
|
+
sessionID: undefined,
|
|
215
|
+
crypto: Crypto,
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
const account = node.expectCurrentAccount("after login");
|
|
219
|
+
const profile = creationNode.getCoValue(account.get("profile")!);
|
|
220
|
+
|
|
221
|
+
assert(profile.isAvailable());
|
|
222
|
+
|
|
223
|
+
expect(account.id).toBe(accountID);
|
|
224
|
+
expect(node.agentSecret).toBe(accountSecret);
|
|
225
|
+
|
|
226
|
+
expect(
|
|
227
|
+
SyncMessagesLog.getMessages({
|
|
228
|
+
Account: account.core,
|
|
229
|
+
Profile: profile,
|
|
230
|
+
ProfileGroup: profile.getGroup().core,
|
|
231
|
+
}),
|
|
232
|
+
).toMatchInlineSnapshot(`
|
|
233
|
+
[
|
|
234
|
+
"creation-node -> server | CONTENT Account header: true new: After: 0 New: 4",
|
|
235
|
+
"auth-node -> server | LOAD Account sessions: empty",
|
|
236
|
+
"server -> creation-node | KNOWN Account sessions: header/4",
|
|
237
|
+
"server -> auth-node | CONTENT Account header: true new: After: 0 New: 4",
|
|
238
|
+
"auth-node -> server | KNOWN Account sessions: header/4",
|
|
239
|
+
"auth-node -> server | LOAD Profile sessions: empty",
|
|
240
|
+
"server -> auth-node | KNOWN Profile sessions: empty",
|
|
241
|
+
"auth-node -> server | LOAD Profile sessions: empty",
|
|
242
|
+
"server -> auth-node | KNOWN Profile sessions: empty",
|
|
243
|
+
]
|
|
244
|
+
`);
|
|
245
|
+
});
|
|
246
|
+
});
|
|
@@ -77,12 +77,12 @@ describe("loading coValues from server", () => {
|
|
|
77
77
|
"client2 -> server | LOAD Map sessions: empty",
|
|
78
78
|
"server -> client2 | KNOWN Map sessions: empty",
|
|
79
79
|
"client -> server | LOAD Group sessions: header/3",
|
|
80
|
-
"client -> server | LOAD Map sessions: header/1",
|
|
81
80
|
"server -> client | KNOWN Group sessions: empty",
|
|
82
|
-
"client -> server |
|
|
81
|
+
"client -> server | LOAD Map sessions: header/1",
|
|
83
82
|
"server -> client | KNOWN Map sessions: empty",
|
|
84
|
-
"client -> server | CONTENT
|
|
83
|
+
"client -> server | CONTENT Group header: true new: After: 0 New: 3",
|
|
85
84
|
"server -> client | KNOWN Group sessions: header/3",
|
|
85
|
+
"client -> server | CONTENT Map header: true new: After: 0 New: 1",
|
|
86
86
|
"server -> client | KNOWN Map sessions: header/1",
|
|
87
87
|
"server -> client2 | CONTENT Group header: true new: After: 0 New: 3",
|
|
88
88
|
"client2 -> server | KNOWN Group sessions: header/3",
|
|
@@ -197,8 +197,6 @@ describe("loading coValues from server", () => {
|
|
|
197
197
|
await map.core.waitForSync();
|
|
198
198
|
await mapOnClient.core.waitForSync();
|
|
199
199
|
|
|
200
|
-
expect(mapOnClient.get("fromServer")).toEqual("updated");
|
|
201
|
-
expect(mapOnClient.get("fromClient")).toEqual("updated");
|
|
202
200
|
expect(
|
|
203
201
|
SyncMessagesLog.getMessages({
|
|
204
202
|
Group: group.core,
|
|
@@ -217,6 +215,9 @@ describe("loading coValues from server", () => {
|
|
|
217
215
|
"client -> server | KNOWN Map sessions: header/3",
|
|
218
216
|
]
|
|
219
217
|
`);
|
|
218
|
+
|
|
219
|
+
expect(mapOnClient.get("fromServer")).toEqual("updated");
|
|
220
|
+
expect(mapOnClient.get("fromClient")).toEqual("updated");
|
|
220
221
|
});
|
|
221
222
|
|
|
222
223
|
test("wrong optimistic known state should be corrected", async () => {
|
|
@@ -236,7 +237,7 @@ describe("loading coValues from server", () => {
|
|
|
236
237
|
await loadCoValueOrFail(client.node, map.id);
|
|
237
238
|
|
|
238
239
|
// Forcefully delete the coValue from the client (simulating some data loss)
|
|
239
|
-
client.node.
|
|
240
|
+
client.node.internalDeleteCoValue(map.id);
|
|
240
241
|
|
|
241
242
|
map.set("fromServer", "updated", "trusting");
|
|
242
243
|
|
|
@@ -67,9 +67,13 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
|
|
67
67
|
[
|
|
68
68
|
"edge-france -> core | CONTENT Group header: true new: After: 0 New: 3",
|
|
69
69
|
"core -> edge-france | KNOWN Group sessions: header/3",
|
|
70
|
+
"core -> storage | LOAD Group sessions: header/3",
|
|
70
71
|
"edge-france -> core | CONTENT Map header: true new: After: 0 New: 1",
|
|
71
|
-
"
|
|
72
|
+
"storage -> core | KNOWN Group sessions: empty",
|
|
72
73
|
"core -> edge-france | KNOWN Map sessions: header/1",
|
|
74
|
+
"core -> storage | LOAD Map sessions: header/1",
|
|
75
|
+
"storage -> core | KNOWN Map sessions: empty",
|
|
76
|
+
"core -> storage | CONTENT Group header: true new: After: 0 New: 3",
|
|
73
77
|
"storage -> core | KNOWN Group sessions: header/3",
|
|
74
78
|
"core -> storage | CONTENT Map header: true new: After: 0 New: 1",
|
|
75
79
|
"storage -> core | KNOWN Map sessions: header/1",
|
|
@@ -119,13 +123,19 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
|
|
119
123
|
[
|
|
120
124
|
"edge-france -> core | CONTENT ParentGroup header: true new: After: 0 New: 6",
|
|
121
125
|
"core -> edge-france | KNOWN ParentGroup sessions: header/6",
|
|
126
|
+
"core -> storage | LOAD ParentGroup sessions: header/6",
|
|
122
127
|
"edge-france -> core | CONTENT Group header: true new: After: 0 New: 5",
|
|
123
|
-
"
|
|
128
|
+
"storage -> core | KNOWN ParentGroup sessions: empty",
|
|
124
129
|
"core -> edge-france | KNOWN Group sessions: header/5",
|
|
130
|
+
"core -> storage | LOAD Group sessions: header/5",
|
|
125
131
|
"edge-france -> core | CONTENT Map header: true new: After: 0 New: 1",
|
|
132
|
+
"storage -> core | KNOWN Group sessions: empty",
|
|
133
|
+
"core -> storage | CONTENT ParentGroup header: true new: After: 0 New: 6",
|
|
134
|
+
"core -> edge-france | KNOWN Map sessions: header/1",
|
|
126
135
|
"storage -> core | KNOWN ParentGroup sessions: header/6",
|
|
136
|
+
"core -> storage | LOAD Map sessions: header/1",
|
|
137
|
+
"storage -> core | KNOWN Map sessions: empty",
|
|
127
138
|
"core -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
128
|
-
"core -> edge-france | KNOWN Map sessions: header/1",
|
|
129
139
|
"storage -> core | KNOWN Group sessions: header/5",
|
|
130
140
|
"core -> storage | CONTENT Map header: true new: After: 0 New: 1",
|
|
131
141
|
"storage -> core | KNOWN Map sessions: header/1",
|
|
@@ -215,7 +225,7 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
|
|
215
225
|
);
|
|
216
226
|
|
|
217
227
|
// Forcefully delete the coValue from the edge (simulating some data loss)
|
|
218
|
-
mesh.edgeItaly.node.
|
|
228
|
+
mesh.edgeItaly.node.internalDeleteCoValue(map.id);
|
|
219
229
|
|
|
220
230
|
mapOnClient.set("fromClient", "updated", "trusting");
|
|
221
231
|
mapOnCoreServer.set("fromServer", "updated", "trusting");
|
|
@@ -239,12 +249,16 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
|
|
239
249
|
"edge-italy -> core | CONTENT Group header: true new: After: 0 New: 5",
|
|
240
250
|
"edge-italy -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
241
251
|
"core -> edge-italy | KNOWN Group sessions: header/5",
|
|
252
|
+
"core -> storage | LOAD Group sessions: header/5",
|
|
242
253
|
"edge-italy -> core | CONTENT Map header: true new: After: 0 New: 1",
|
|
243
254
|
"client -> edge-italy | KNOWN Group sessions: header/5",
|
|
244
255
|
"edge-italy -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
245
|
-
"
|
|
246
|
-
"core -> edge-italy | KNOWN Map sessions: header/
|
|
256
|
+
"storage -> core | KNOWN Group sessions: empty",
|
|
257
|
+
"core -> edge-italy | KNOWN Map sessions: header/3",
|
|
258
|
+
"core -> storage | LOAD Map sessions: header/3",
|
|
247
259
|
"client -> edge-italy | KNOWN Map sessions: header/1",
|
|
260
|
+
"storage -> core | KNOWN Map sessions: empty",
|
|
261
|
+
"core -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
248
262
|
"storage -> core | KNOWN Group sessions: header/5",
|
|
249
263
|
"core -> storage | CONTENT Map header: true new: After: 0 New: 1",
|
|
250
264
|
"storage -> core | KNOWN Map sessions: header/1",
|
|
@@ -257,12 +271,12 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
|
|
257
271
|
"client -> edge-italy | CONTENT Map header: true new: After: 0 New: 1 | After: 0 New: 1",
|
|
258
272
|
"core -> edge-italy | CONTENT Map header: true new: After: 0 New: 1 | After: 0 New: 1",
|
|
259
273
|
"edge-italy -> client | KNOWN Map sessions: header/2",
|
|
260
|
-
"edge-italy -> core | KNOWN Map sessions: header/3",
|
|
261
|
-
"edge-italy -> client | CONTENT Map header: false new: After: 0 New: 1",
|
|
262
274
|
"edge-italy -> core | CONTENT Map header: false new: After: 0 New: 1",
|
|
263
|
-
"
|
|
275
|
+
"edge-italy -> client | CONTENT Map header: false new: After: 0 New: 1",
|
|
264
276
|
"core -> edge-italy | KNOWN Map sessions: header/3",
|
|
265
277
|
"core -> storage | CONTENT Map header: false new: After: 0 New: 1",
|
|
278
|
+
"edge-italy -> core | KNOWN Map sessions: header/3",
|
|
279
|
+
"client -> edge-italy | KNOWN Map sessions: header/3",
|
|
266
280
|
"storage -> core | KNOWN Map sessions: header/3",
|
|
267
281
|
]
|
|
268
282
|
`);
|
|
@@ -378,12 +392,11 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
|
|
|
378
392
|
"client -> storage | LOAD Map sessions: empty",
|
|
379
393
|
"storage -> client | CONTENT Group header: true new: After: 0 New: 3",
|
|
380
394
|
"client -> storage | KNOWN Group sessions: header/3",
|
|
395
|
+
"client -> core | LOAD Group sessions: header/3",
|
|
381
396
|
"storage -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
382
|
-
"client -> core | CONTENT Group header: true new: After: 0 New: 3",
|
|
383
|
-
"client -> storage | KNOWN Map sessions: header/1",
|
|
384
397
|
"core -> client | KNOWN Group sessions: header/3",
|
|
398
|
+
"client -> storage | KNOWN Map sessions: header/1",
|
|
385
399
|
"client -> core | LOAD Map sessions: header/1",
|
|
386
|
-
"client -> core | CONTENT Map header: true new: After: 0 New: 1",
|
|
387
400
|
]
|
|
388
401
|
`);
|
|
389
402
|
|
|
@@ -31,12 +31,12 @@ describe("peer reconciliation", () => {
|
|
|
31
31
|
).toMatchInlineSnapshot(`
|
|
32
32
|
[
|
|
33
33
|
"client -> server | LOAD Group sessions: header/3",
|
|
34
|
-
"client -> server | LOAD Map sessions: header/1",
|
|
35
34
|
"server -> client | KNOWN Group sessions: empty",
|
|
36
|
-
"client -> server |
|
|
35
|
+
"client -> server | LOAD Map sessions: header/1",
|
|
37
36
|
"server -> client | KNOWN Map sessions: empty",
|
|
38
|
-
"client -> server | CONTENT
|
|
37
|
+
"client -> server | CONTENT Group header: true new: After: 0 New: 3",
|
|
39
38
|
"server -> client | KNOWN Group sessions: header/3",
|
|
39
|
+
"client -> server | CONTENT Map header: true new: After: 0 New: 1",
|
|
40
40
|
"server -> client | KNOWN Map sessions: header/1",
|
|
41
41
|
]
|
|
42
42
|
`);
|
|
@@ -64,13 +64,13 @@ describe("peer reconciliation", () => {
|
|
|
64
64
|
|
|
65
65
|
await map.core.waitForSync();
|
|
66
66
|
|
|
67
|
-
const mapOnSyncServer = jazzCloud.node.
|
|
67
|
+
const mapOnSyncServer = jazzCloud.node.getCoValue(map.id);
|
|
68
68
|
|
|
69
69
|
assert(mapOnSyncServer.isAvailable());
|
|
70
70
|
|
|
71
|
-
expect(
|
|
72
|
-
|
|
73
|
-
)
|
|
71
|
+
expect(expectMap(mapOnSyncServer.getCurrentContent()).get("hello")).toEqual(
|
|
72
|
+
"updated",
|
|
73
|
+
);
|
|
74
74
|
|
|
75
75
|
expect(
|
|
76
76
|
SyncMessagesLog.getMessages({
|
|
@@ -80,10 +80,10 @@ describe("peer reconciliation", () => {
|
|
|
80
80
|
).toMatchInlineSnapshot(`
|
|
81
81
|
[
|
|
82
82
|
"client -> server | LOAD Group sessions: header/3",
|
|
83
|
-
"client -> server | LOAD Map sessions: header/2",
|
|
84
83
|
"server -> client | KNOWN Group sessions: header/3",
|
|
85
|
-
"client -> server |
|
|
84
|
+
"client -> server | LOAD Map sessions: header/2",
|
|
86
85
|
"server -> client | KNOWN Map sessions: header/1",
|
|
86
|
+
"client -> server | CONTENT Map header: false new: After: 1 New: 1",
|
|
87
87
|
"server -> client | KNOWN Map sessions: header/2",
|
|
88
88
|
]
|
|
89
89
|
`);
|
|
@@ -111,13 +111,13 @@ describe("peer reconciliation", () => {
|
|
|
111
111
|
|
|
112
112
|
await map.core.waitForSync();
|
|
113
113
|
|
|
114
|
-
const mapOnSyncServer = jazzCloud.node.
|
|
114
|
+
const mapOnSyncServer = jazzCloud.node.getCoValue(map.id);
|
|
115
115
|
|
|
116
116
|
assert(mapOnSyncServer.isAvailable());
|
|
117
117
|
|
|
118
|
-
expect(
|
|
119
|
-
|
|
120
|
-
)
|
|
118
|
+
expect(expectMap(mapOnSyncServer.getCurrentContent()).get("hello")).toEqual(
|
|
119
|
+
"updated",
|
|
120
|
+
);
|
|
121
121
|
|
|
122
122
|
expect(peer.outgoing).toMatchObject({
|
|
123
123
|
closed: true,
|
|
@@ -136,10 +136,10 @@ describe("peer reconciliation", () => {
|
|
|
136
136
|
[
|
|
137
137
|
"client -> server | LOAD Group sessions: header/3",
|
|
138
138
|
"client -> server | LOAD Group sessions: header/3",
|
|
139
|
-
"client -> server | LOAD Map sessions: header/2",
|
|
140
139
|
"server -> client | KNOWN Group sessions: header/3",
|
|
141
|
-
"client -> server |
|
|
140
|
+
"client -> server | LOAD Map sessions: header/2",
|
|
142
141
|
"server -> client | KNOWN Map sessions: header/1",
|
|
142
|
+
"client -> server | CONTENT Map header: false new: After: 1 New: 1",
|
|
143
143
|
"server -> client | KNOWN Map sessions: header/2",
|
|
144
144
|
]
|
|
145
145
|
`);
|
|
@@ -166,9 +166,9 @@ describe("peer reconciliation", () => {
|
|
|
166
166
|
client.connectToSyncServer();
|
|
167
167
|
|
|
168
168
|
await waitFor(() => {
|
|
169
|
-
const mapOnSyncServer = jazzCloud.node.
|
|
169
|
+
const mapOnSyncServer = jazzCloud.node.getCoValue(map.id);
|
|
170
170
|
|
|
171
|
-
expect(mapOnSyncServer.
|
|
171
|
+
expect(mapOnSyncServer.loadingState).toBe("available");
|
|
172
172
|
});
|
|
173
173
|
|
|
174
174
|
expect(
|
|
@@ -179,16 +179,16 @@ describe("peer reconciliation", () => {
|
|
|
179
179
|
).toMatchInlineSnapshot(`
|
|
180
180
|
[
|
|
181
181
|
"client -> server | LOAD Group sessions: header/3",
|
|
182
|
-
"client -> server | LOAD Map sessions: header/2",
|
|
183
182
|
"server -> client | KNOWN Group sessions: empty",
|
|
184
|
-
"client -> server |
|
|
183
|
+
"client -> server | LOAD Map sessions: header/2",
|
|
185
184
|
"server -> client | KNOWN Map sessions: empty",
|
|
186
|
-
"client -> server | CONTENT
|
|
185
|
+
"client -> server | CONTENT Group header: true new: After: 0 New: 3",
|
|
187
186
|
"server -> client | KNOWN Group sessions: header/3",
|
|
187
|
+
"client -> server | CONTENT Map header: true new: After: 0 New: 2",
|
|
188
188
|
"server -> client | KNOWN Map sessions: header/2",
|
|
189
189
|
"client -> server | LOAD Group sessions: header/3",
|
|
190
|
-
"client -> server | LOAD Map sessions: header/2",
|
|
191
190
|
"server -> client | KNOWN Group sessions: header/3",
|
|
191
|
+
"client -> server | LOAD Map sessions: header/2",
|
|
192
192
|
"server -> client | KNOWN Map sessions: header/2",
|
|
193
193
|
]
|
|
194
194
|
`);
|
|
@@ -210,7 +210,7 @@ describe("peer reconciliation", () => {
|
|
|
210
210
|
|
|
211
211
|
SyncMessagesLog.clear();
|
|
212
212
|
client.connectToSyncServer();
|
|
213
|
-
const mapOnSyncServer = jazzCloud.node.
|
|
213
|
+
const mapOnSyncServer = jazzCloud.node.getCoValue(map.id);
|
|
214
214
|
|
|
215
215
|
await waitFor(() => {
|
|
216
216
|
expect(mapOnSyncServer.isAvailable()).toBe(true);
|
|
@@ -232,8 +232,8 @@ describe("peer reconciliation", () => {
|
|
|
232
232
|
]
|
|
233
233
|
`);
|
|
234
234
|
|
|
235
|
-
expect(
|
|
236
|
-
|
|
237
|
-
)
|
|
235
|
+
expect(expectMap(mapOnSyncServer.getCurrentContent()).get("hello")).toEqual(
|
|
236
|
+
"updated",
|
|
237
|
+
);
|
|
238
238
|
});
|
|
239
239
|
});
|