cojson 0.13.17 → 0.13.18
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 +9 -0
- package/dist/PeerState.d.ts +3 -0
- package/dist/PeerState.d.ts.map +1 -1
- package/dist/PeerState.js +9 -0
- 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} +314 -246
- 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 +139 -170
- 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/sync.d.ts +2 -2
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +86 -55
- package/dist/sync.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 +141 -0
- package/dist/tests/sync.auth.test.js.map +1 -0
- package/dist/tests/sync.load.test.js +4 -4
- 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 +24 -15
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +88 -61
- 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 +11 -0
- package/src/SyncStateManager.ts +2 -3
- package/src/coValue.ts +11 -8
- package/src/{coValueCore.ts → coValueCore/coValueCore.ts} +469 -413
- 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 +227 -273
- package/src/permissions.ts +18 -12
- package/src/priority.ts +1 -1
- package/src/sync.ts +96 -63
- 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 -68
- 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 +188 -0
- package/src/tests/sync.load.test.ts +4 -4
- 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 +120 -74
- 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,188 @@
|
|
|
1
|
+
import { assert, beforeEach, describe, expect, test } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { expectMap } from "../coValue";
|
|
4
|
+
import { expectAccount } from "../coValues/account";
|
|
5
|
+
import { WasmCrypto } from "../crypto/WasmCrypto";
|
|
6
|
+
import { LocalNode } from "../localNode";
|
|
7
|
+
import { toSimplifiedMessages } from "./messagesTestUtils";
|
|
8
|
+
import {
|
|
9
|
+
SyncMessagesLog,
|
|
10
|
+
getSyncServerConnectedPeer,
|
|
11
|
+
loadCoValueOrFail,
|
|
12
|
+
setupTestNode,
|
|
13
|
+
waitFor,
|
|
14
|
+
} from "./testUtils";
|
|
15
|
+
|
|
16
|
+
const Crypto = await WasmCrypto.create();
|
|
17
|
+
let jazzCloud = setupTestNode({ isSyncServer: true });
|
|
18
|
+
|
|
19
|
+
beforeEach(async () => {
|
|
20
|
+
SyncMessagesLog.clear();
|
|
21
|
+
jazzCloud = setupTestNode({ isSyncServer: true });
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
describe("LocalNode auth sync", () => {
|
|
25
|
+
test("create a new account", async () => {
|
|
26
|
+
const { peer } = getSyncServerConnectedPeer({
|
|
27
|
+
peerId: "new-account",
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const { accountID, node } = await LocalNode.withNewlyCreatedAccount({
|
|
31
|
+
creationProps: {
|
|
32
|
+
name: "new-account",
|
|
33
|
+
},
|
|
34
|
+
peersToLoadFrom: [peer],
|
|
35
|
+
crypto: Crypto,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const account = node.expectCurrentAccount("after login");
|
|
39
|
+
await account.core.waitForSync();
|
|
40
|
+
|
|
41
|
+
const profileID = account.get("profile")!;
|
|
42
|
+
|
|
43
|
+
const profileCoreOnSyncServer = jazzCloud.node.getCoValue(profileID);
|
|
44
|
+
|
|
45
|
+
expect(profileCoreOnSyncServer.isAvailable()).toBe(true);
|
|
46
|
+
|
|
47
|
+
assert(profileCoreOnSyncServer.isAvailable());
|
|
48
|
+
|
|
49
|
+
expect(
|
|
50
|
+
SyncMessagesLog.getMessages({
|
|
51
|
+
Account: account.core,
|
|
52
|
+
Profile: profileCoreOnSyncServer,
|
|
53
|
+
ProfileGroup: profileCoreOnSyncServer.getGroup().core,
|
|
54
|
+
}),
|
|
55
|
+
).toMatchInlineSnapshot(`
|
|
56
|
+
[
|
|
57
|
+
"client -> server | CONTENT Account header: true new: After: 0 New: 4",
|
|
58
|
+
"server -> client | KNOWN Account sessions: header/4",
|
|
59
|
+
"client -> server | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
60
|
+
"server -> client | KNOWN ProfileGroup sessions: header/5",
|
|
61
|
+
"client -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
62
|
+
"server -> client | KNOWN Profile sessions: header/1",
|
|
63
|
+
]
|
|
64
|
+
`);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("create a new account with a migration", async () => {
|
|
68
|
+
const { peer } = getSyncServerConnectedPeer({
|
|
69
|
+
peerId: "new-account",
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const { node } = await LocalNode.withNewlyCreatedAccount({
|
|
73
|
+
creationProps: {
|
|
74
|
+
name: "new-account",
|
|
75
|
+
},
|
|
76
|
+
peersToLoadFrom: [peer],
|
|
77
|
+
crypto: Crypto,
|
|
78
|
+
async migration(account) {
|
|
79
|
+
const root = account.createMap();
|
|
80
|
+
const profile = account.createMap();
|
|
81
|
+
|
|
82
|
+
root.set("hello", "world");
|
|
83
|
+
profile.set("name", "new-account");
|
|
84
|
+
|
|
85
|
+
account.set("root", root.id);
|
|
86
|
+
account.set("profile", profile.id);
|
|
87
|
+
|
|
88
|
+
await root.core.waitForSync();
|
|
89
|
+
await profile.core.waitForSync();
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
const account = node.expectCurrentAccount("after login");
|
|
94
|
+
await account.core.waitForSync();
|
|
95
|
+
|
|
96
|
+
const rootID = account.get("root")!;
|
|
97
|
+
const profileID = account.get("profile")!;
|
|
98
|
+
|
|
99
|
+
const rootCoreOnSyncServer = jazzCloud.node.getCoValue(rootID);
|
|
100
|
+
expect(rootCoreOnSyncServer.isAvailable()).toBe(true);
|
|
101
|
+
|
|
102
|
+
const profileCoreOnSyncServer = jazzCloud.node.getCoValue(profileID);
|
|
103
|
+
|
|
104
|
+
expect(profileCoreOnSyncServer.isAvailable()).toBe(true);
|
|
105
|
+
|
|
106
|
+
assert(profileCoreOnSyncServer.isAvailable());
|
|
107
|
+
assert(rootCoreOnSyncServer.isAvailable());
|
|
108
|
+
|
|
109
|
+
expect(
|
|
110
|
+
SyncMessagesLog.getMessages({
|
|
111
|
+
Account: account.core,
|
|
112
|
+
Root: rootCoreOnSyncServer,
|
|
113
|
+
Profile: profileCoreOnSyncServer,
|
|
114
|
+
ProfileGroup: profileCoreOnSyncServer.getGroup().core,
|
|
115
|
+
}),
|
|
116
|
+
).toMatchInlineSnapshot(`
|
|
117
|
+
[
|
|
118
|
+
"client -> server | CONTENT Account header: true new: After: 0 New: 5",
|
|
119
|
+
"server -> client | KNOWN Account sessions: header/5",
|
|
120
|
+
"client -> server | CONTENT Root header: true new: After: 0 New: 1",
|
|
121
|
+
"server -> client | KNOWN Root sessions: header/1",
|
|
122
|
+
"client -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
123
|
+
"server -> client | KNOWN Profile sessions: header/1",
|
|
124
|
+
]
|
|
125
|
+
`);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test("authenticate to an existing account", async () => {
|
|
129
|
+
const { peer: newAccountPeer } = getSyncServerConnectedPeer({
|
|
130
|
+
peerId: "new-account",
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
const { accountID, accountSecret } =
|
|
134
|
+
await LocalNode.withNewlyCreatedAccount({
|
|
135
|
+
creationProps: {
|
|
136
|
+
name: "new-account",
|
|
137
|
+
},
|
|
138
|
+
peersToLoadFrom: [newAccountPeer],
|
|
139
|
+
crypto: Crypto,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
const { peer: existingAccountPeer } = getSyncServerConnectedPeer({
|
|
143
|
+
peerId: "existing-account",
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
SyncMessagesLog.clear();
|
|
147
|
+
|
|
148
|
+
const node = await LocalNode.withLoadedAccount({
|
|
149
|
+
accountID,
|
|
150
|
+
accountSecret,
|
|
151
|
+
peersToLoadFrom: [existingAccountPeer],
|
|
152
|
+
sessionID: undefined,
|
|
153
|
+
crypto: Crypto,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
const account = node.expectCurrentAccount("after login");
|
|
157
|
+
const profile = node.getCoValue(account.get("profile")!);
|
|
158
|
+
|
|
159
|
+
assert(profile.isAvailable());
|
|
160
|
+
|
|
161
|
+
expect(account.id).toBe(accountID);
|
|
162
|
+
expect(node.agentSecret).toBe(accountSecret);
|
|
163
|
+
|
|
164
|
+
expect(
|
|
165
|
+
SyncMessagesLog.getMessages({
|
|
166
|
+
Account: account.core,
|
|
167
|
+
Profile: profile,
|
|
168
|
+
ProfileGroup: profile.getGroup().core,
|
|
169
|
+
}),
|
|
170
|
+
).toMatchInlineSnapshot(`
|
|
171
|
+
[
|
|
172
|
+
"client -> server | LOAD Account sessions: empty",
|
|
173
|
+
"server -> client | KNOWN Account sessions: header/4",
|
|
174
|
+
"client -> server | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
175
|
+
"server -> client | CONTENT Account header: true new: After: 0 New: 4",
|
|
176
|
+
"server -> client | KNOWN ProfileGroup sessions: header/5",
|
|
177
|
+
"client -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
178
|
+
"client -> server | KNOWN Account sessions: header/4",
|
|
179
|
+
"server -> client | KNOWN Profile sessions: header/1",
|
|
180
|
+
"client -> server | LOAD Profile sessions: empty",
|
|
181
|
+
"server -> client | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
182
|
+
"client -> server | KNOWN ProfileGroup sessions: header/5",
|
|
183
|
+
"server -> client | CONTENT Profile header: true new: After: 0 New: 1",
|
|
184
|
+
"client -> server | KNOWN Profile sessions: header/1",
|
|
185
|
+
]
|
|
186
|
+
`);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
@@ -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",
|
|
@@ -236,7 +236,7 @@ describe("loading coValues from server", () => {
|
|
|
236
236
|
await loadCoValueOrFail(client.node, map.id);
|
|
237
237
|
|
|
238
238
|
// Forcefully delete the coValue from the client (simulating some data loss)
|
|
239
|
-
client.node.
|
|
239
|
+
client.node.internalDeleteCoValue(map.id);
|
|
240
240
|
|
|
241
241
|
map.set("fromServer", "updated", "trusting");
|
|
242
242
|
|
|
@@ -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
|
});
|
|
@@ -39,9 +39,11 @@ describe("client with storage syncs with server", () => {
|
|
|
39
39
|
"client -> server | LOAD Map sessions: empty",
|
|
40
40
|
"server -> client | CONTENT Group header: true new: After: 0 New: 3",
|
|
41
41
|
"client -> server | KNOWN Group sessions: header/3",
|
|
42
|
+
"client -> storage | LOAD Group sessions: header/3",
|
|
42
43
|
"server -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
43
|
-
"
|
|
44
|
+
"storage -> client | KNOWN Group sessions: empty",
|
|
44
45
|
"client -> server | KNOWN Map sessions: header/1",
|
|
46
|
+
"client -> storage | CONTENT Group header: true new: After: 0 New: 3",
|
|
45
47
|
"storage -> client | KNOWN Group sessions: header/3",
|
|
46
48
|
"client -> storage | CONTENT Map header: true new: After: 0 New: 1",
|
|
47
49
|
"storage -> client | KNOWN Map sessions: header/1",
|
|
@@ -55,7 +57,8 @@ describe("client with storage syncs with server", () => {
|
|
|
55
57
|
client.connectToSyncServer();
|
|
56
58
|
const { storage } = client.addStoragePeer();
|
|
57
59
|
|
|
58
|
-
|
|
60
|
+
// biome-ignore lint/suspicious/noExplicitAny: Super ugly, might have unintended side effects
|
|
61
|
+
(storage as any).coValues = (jazzCloud.node as any).coValues;
|
|
59
62
|
|
|
60
63
|
const group = jazzCloud.node.createGroup();
|
|
61
64
|
const map = group.createMap();
|
|
@@ -74,15 +77,11 @@ describe("client with storage syncs with server", () => {
|
|
|
74
77
|
"client -> storage | LOAD Map sessions: empty",
|
|
75
78
|
"storage -> client | CONTENT Group header: true new: After: 0 New: 3",
|
|
76
79
|
"client -> storage | KNOWN Group sessions: header/3",
|
|
80
|
+
"client -> server | LOAD Group sessions: header/3",
|
|
77
81
|
"storage -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
78
|
-
"client -> server | CONTENT Group header: true new: After: 0 New: 3",
|
|
79
|
-
"client -> storage | KNOWN Map sessions: header/1",
|
|
80
82
|
"server -> client | KNOWN Group sessions: header/3",
|
|
83
|
+
"client -> storage | KNOWN Map sessions: header/1",
|
|
81
84
|
"client -> server | LOAD Map sessions: header/1",
|
|
82
|
-
"server -> client | CONTENT Group header: true new: After: 0 New: 3",
|
|
83
|
-
"client -> server | CONTENT Map header: true new: After: 0 New: 1",
|
|
84
|
-
"server -> client | KNOWN Map sessions: header/1",
|
|
85
|
-
"client -> server | KNOWN Group sessions: header/3",
|
|
86
85
|
"server -> client | KNOWN Map sessions: header/1",
|
|
87
86
|
]
|
|
88
87
|
`);
|
|
@@ -119,13 +118,17 @@ describe("client with storage syncs with server", () => {
|
|
|
119
118
|
"client -> server | LOAD Map sessions: empty",
|
|
120
119
|
"server -> client | CONTENT ParentGroup header: true new: After: 0 New: 6",
|
|
121
120
|
"client -> server | KNOWN ParentGroup sessions: header/6",
|
|
121
|
+
"client -> storage | LOAD ParentGroup sessions: header/6",
|
|
122
122
|
"server -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
123
|
-
"
|
|
123
|
+
"storage -> client | KNOWN ParentGroup sessions: empty",
|
|
124
124
|
"client -> server | KNOWN Group sessions: header/5",
|
|
125
|
+
"client -> storage | LOAD Group sessions: header/5",
|
|
125
126
|
"server -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
127
|
+
"storage -> client | KNOWN Group sessions: empty",
|
|
128
|
+
"client -> storage | CONTENT ParentGroup header: true new: After: 0 New: 6",
|
|
129
|
+
"client -> server | KNOWN Map sessions: header/1",
|
|
126
130
|
"storage -> client | KNOWN ParentGroup sessions: header/6",
|
|
127
131
|
"client -> storage | CONTENT Group header: true new: After: 0 New: 5",
|
|
128
|
-
"client -> server | KNOWN Map sessions: header/1",
|
|
129
132
|
"storage -> client | KNOWN Group sessions: header/5",
|
|
130
133
|
"client -> storage | CONTENT Map header: true new: After: 0 New: 1",
|
|
131
134
|
"storage -> client | KNOWN Map sessions: header/1",
|
|
@@ -169,10 +172,10 @@ describe("client with storage syncs with server", () => {
|
|
|
169
172
|
"client -> server | LOAD Map sessions: header/1",
|
|
170
173
|
"server -> client | CONTENT Map header: false new: After: 1 New: 1",
|
|
171
174
|
"client -> server | KNOWN Map sessions: header/2",
|
|
172
|
-
"server -> client | CONTENT Map header: false new: After: 1 New: 1",
|
|
173
175
|
"client -> storage | CONTENT Map header: false new: After: 1 New: 1",
|
|
174
|
-
"
|
|
176
|
+
"server -> client | CONTENT Map header: false new: After: 1 New: 1",
|
|
175
177
|
"storage -> client | KNOWN Map sessions: header/2",
|
|
178
|
+
"client -> server | KNOWN Map sessions: header/2",
|
|
176
179
|
]
|
|
177
180
|
`);
|
|
178
181
|
});
|
|
@@ -216,9 +219,13 @@ describe("client syncs with a server with storage", () => {
|
|
|
216
219
|
[
|
|
217
220
|
"client -> server | CONTENT Group header: true new: After: 0 New: 3",
|
|
218
221
|
"server -> client | KNOWN Group sessions: header/3",
|
|
222
|
+
"server -> storage | LOAD Group sessions: header/3",
|
|
219
223
|
"client -> server | CONTENT Map header: true new: After: 0 New: 1",
|
|
220
|
-
"
|
|
224
|
+
"storage -> server | KNOWN Group sessions: empty",
|
|
221
225
|
"server -> client | KNOWN Map sessions: header/1",
|
|
226
|
+
"server -> storage | LOAD Map sessions: header/1",
|
|
227
|
+
"storage -> server | KNOWN Map sessions: empty",
|
|
228
|
+
"server -> storage | CONTENT Group header: true new: After: 0 New: 3",
|
|
222
229
|
"storage -> server | KNOWN Group sessions: header/3",
|
|
223
230
|
"server -> storage | CONTENT Map header: true new: After: 0 New: 1",
|
|
224
231
|
"storage -> server | KNOWN Map sessions: header/1",
|