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
|
@@ -1,17 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
assert,
|
|
3
|
-
afterEach,
|
|
4
|
-
beforeEach,
|
|
5
|
-
describe,
|
|
6
|
-
expect,
|
|
7
|
-
onTestFinished,
|
|
8
|
-
test,
|
|
9
|
-
vi,
|
|
10
|
-
} from "vitest";
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
|
11
2
|
import { PeerState } from "../PeerState";
|
|
12
|
-
import { CoValueCore } from "../coValueCore";
|
|
13
|
-
import {
|
|
3
|
+
import { CoValueCore } from "../coValueCore/coValueCore";
|
|
4
|
+
import { CoValueHeader, VerifiedState } from "../coValueCore/verifiedState";
|
|
14
5
|
import { RawCoID } from "../ids";
|
|
6
|
+
import { LocalNode } from "../localNode";
|
|
15
7
|
import { Peer } from "../sync";
|
|
16
8
|
import { createTestMetricReader, tearDownTestMetricReader } from "./testUtils";
|
|
17
9
|
|
|
@@ -25,14 +17,16 @@ afterEach(() => {
|
|
|
25
17
|
tearDownTestMetricReader();
|
|
26
18
|
});
|
|
27
19
|
|
|
28
|
-
|
|
20
|
+
const mockNode = {} as LocalNode;
|
|
21
|
+
|
|
22
|
+
describe("CoValueCore loading state", () => {
|
|
29
23
|
const mockCoValueId = "co_test123" as RawCoID;
|
|
30
24
|
|
|
31
25
|
test("should create unknown state", async () => {
|
|
32
|
-
const state =
|
|
26
|
+
const state = CoValueCore.fromID(mockCoValueId, mockNode);
|
|
33
27
|
|
|
34
28
|
expect(state.id).toBe(mockCoValueId);
|
|
35
|
-
expect(state.
|
|
29
|
+
expect(state.loadingState).toBe("unknown");
|
|
36
30
|
expect(
|
|
37
31
|
await metricReader.getMetricValue("jazz.covalues.loaded", {
|
|
38
32
|
state: "unknown",
|
|
@@ -41,14 +35,14 @@ describe("CoValueState", () => {
|
|
|
41
35
|
});
|
|
42
36
|
|
|
43
37
|
test("should create loading state", async () => {
|
|
44
|
-
const state =
|
|
38
|
+
const state = CoValueCore.fromID(mockCoValueId, mockNode);
|
|
45
39
|
state.loadFromPeers([
|
|
46
40
|
createMockPeerState({ id: "peer1", role: "server" }),
|
|
47
41
|
createMockPeerState({ id: "peer2", role: "server" }),
|
|
48
42
|
]);
|
|
49
43
|
|
|
50
44
|
expect(state.id).toBe(mockCoValueId);
|
|
51
|
-
expect(state.
|
|
45
|
+
expect(state.loadingState).toBe("loading");
|
|
52
46
|
expect(
|
|
53
47
|
await metricReader.getMetricValue("jazz.covalues.loaded", {
|
|
54
48
|
state: "loading",
|
|
@@ -57,14 +51,16 @@ describe("CoValueState", () => {
|
|
|
57
51
|
});
|
|
58
52
|
|
|
59
53
|
test("should create available state", async () => {
|
|
60
|
-
const
|
|
61
|
-
const state =
|
|
62
|
-
state.internalMarkMagicallyAvailable(
|
|
54
|
+
const mockVerified = createMockCoValueVerified(mockCoValueId);
|
|
55
|
+
const state = CoValueCore.fromID(mockCoValueId, mockNode);
|
|
56
|
+
state.internalMarkMagicallyAvailable(mockVerified);
|
|
63
57
|
|
|
64
58
|
expect(state.id).toBe(mockCoValueId);
|
|
65
|
-
expect(state.
|
|
66
|
-
expect(state.
|
|
67
|
-
await expect(state.
|
|
59
|
+
expect(state.loadingState).toBe("available");
|
|
60
|
+
expect(state.verified).toBe(mockVerified);
|
|
61
|
+
await expect(state.waitForAvailableOrUnavailable()).resolves.toMatchObject({
|
|
62
|
+
verified: mockVerified,
|
|
63
|
+
});
|
|
68
64
|
expect(
|
|
69
65
|
await metricReader.getMetricValue("jazz.covalues.loaded", {
|
|
70
66
|
state: "available",
|
|
@@ -73,8 +69,8 @@ describe("CoValueState", () => {
|
|
|
73
69
|
});
|
|
74
70
|
|
|
75
71
|
test("should handle found action", async () => {
|
|
76
|
-
const
|
|
77
|
-
const state =
|
|
72
|
+
const mockVerified = createMockCoValueVerified(mockCoValueId);
|
|
73
|
+
const state = CoValueCore.fromID(mockCoValueId, mockNode);
|
|
78
74
|
state.loadFromPeers([
|
|
79
75
|
createMockPeerState({ id: "peer1", role: "server" }),
|
|
80
76
|
createMockPeerState({ id: "peer2", role: "server" }),
|
|
@@ -91,13 +87,15 @@ describe("CoValueState", () => {
|
|
|
91
87
|
}),
|
|
92
88
|
).toBe(1);
|
|
93
89
|
|
|
94
|
-
const stateValuePromise = state.
|
|
90
|
+
const stateValuePromise = state.waitForAvailableOrUnavailable();
|
|
95
91
|
|
|
96
|
-
state.internalMarkMagicallyAvailable(
|
|
92
|
+
state.internalMarkMagicallyAvailable(mockVerified);
|
|
97
93
|
|
|
98
|
-
const result = await state.
|
|
99
|
-
expect(result).
|
|
100
|
-
await expect(stateValuePromise).resolves.
|
|
94
|
+
const result = await state.waitForAvailableOrUnavailable();
|
|
95
|
+
expect(result).toMatchObject({ verified: mockVerified });
|
|
96
|
+
await expect(stateValuePromise).resolves.toMatchObject({
|
|
97
|
+
verified: mockVerified,
|
|
98
|
+
});
|
|
101
99
|
|
|
102
100
|
expect(
|
|
103
101
|
await metricReader.getMetricValue("jazz.covalues.loaded", {
|
|
@@ -135,17 +133,18 @@ describe("CoValueState", () => {
|
|
|
135
133
|
|
|
136
134
|
const mockPeers = [peer1, peer2] as unknown as PeerState[];
|
|
137
135
|
|
|
138
|
-
const state =
|
|
136
|
+
const state = CoValueCore.fromID(mockCoValueId, mockNode);
|
|
139
137
|
const loadPromise = state.loadFromPeers(mockPeers);
|
|
140
138
|
|
|
141
139
|
await vi.runAllTimersAsync();
|
|
142
|
-
|
|
143
140
|
await loadPromise;
|
|
144
141
|
|
|
145
142
|
expect(peer1.pushOutgoingMessage).toHaveBeenCalledTimes(1);
|
|
146
143
|
expect(peer2.pushOutgoingMessage).toHaveBeenCalledTimes(1);
|
|
147
|
-
expect(state.
|
|
148
|
-
await expect(state.
|
|
144
|
+
expect(state.loadingState).toBe("unavailable");
|
|
145
|
+
await expect(state.waitForAvailableOrUnavailable()).resolves.toMatchObject({
|
|
146
|
+
verified: null,
|
|
147
|
+
});
|
|
149
148
|
|
|
150
149
|
vi.useRealTimers();
|
|
151
150
|
});
|
|
@@ -165,18 +164,22 @@ describe("CoValueState", () => {
|
|
|
165
164
|
|
|
166
165
|
const mockPeers = [peer1] as unknown as PeerState[];
|
|
167
166
|
|
|
168
|
-
const state =
|
|
167
|
+
const state = CoValueCore.fromID(mockCoValueId, mockNode);
|
|
169
168
|
const loadPromise = state.loadFromPeers(mockPeers);
|
|
170
169
|
|
|
171
170
|
await vi.runAllTimersAsync();
|
|
172
171
|
|
|
173
|
-
state.internalMarkMagicallyAvailable(
|
|
172
|
+
state.internalMarkMagicallyAvailable(
|
|
173
|
+
createMockCoValueVerified(mockCoValueId),
|
|
174
|
+
);
|
|
174
175
|
|
|
175
176
|
await loadPromise;
|
|
176
177
|
|
|
177
178
|
expect(peer1.pushOutgoingMessage).toHaveBeenCalledTimes(1);
|
|
178
|
-
expect(state.
|
|
179
|
-
await expect(state.
|
|
179
|
+
expect(state.loadingState).toBe("available");
|
|
180
|
+
await expect(state.waitForAvailableOrUnavailable()).resolves.toMatchObject({
|
|
181
|
+
_verified: expect.any(Object),
|
|
182
|
+
});
|
|
180
183
|
|
|
181
184
|
vi.useRealTimers();
|
|
182
185
|
});
|
|
@@ -184,7 +187,7 @@ describe("CoValueState", () => {
|
|
|
184
187
|
test("should start sending the known state to peers when available", async () => {
|
|
185
188
|
vi.useFakeTimers();
|
|
186
189
|
|
|
187
|
-
const
|
|
190
|
+
const mockVerified = createMockCoValueVerified(mockCoValueId);
|
|
188
191
|
|
|
189
192
|
const peer1 = createMockPeerState(
|
|
190
193
|
{
|
|
@@ -192,7 +195,7 @@ describe("CoValueState", () => {
|
|
|
192
195
|
role: "storage",
|
|
193
196
|
},
|
|
194
197
|
async () => {
|
|
195
|
-
state.markAvailable(
|
|
198
|
+
state.markAvailable({} as CoValueHeader, "peer1");
|
|
196
199
|
},
|
|
197
200
|
);
|
|
198
201
|
const peer2 = createMockPeerState(
|
|
@@ -205,7 +208,7 @@ describe("CoValueState", () => {
|
|
|
205
208
|
},
|
|
206
209
|
);
|
|
207
210
|
|
|
208
|
-
const state =
|
|
211
|
+
const state = CoValueCore.fromID(mockCoValueId, mockNode);
|
|
209
212
|
const loadPromise = state.loadFromPeers([peer1, peer2]);
|
|
210
213
|
|
|
211
214
|
await vi.runAllTimersAsync();
|
|
@@ -215,10 +218,12 @@ describe("CoValueState", () => {
|
|
|
215
218
|
expect(peer2.pushOutgoingMessage).toHaveBeenCalledTimes(1);
|
|
216
219
|
expect(peer2.pushOutgoingMessage).toHaveBeenCalledWith({
|
|
217
220
|
action: "load",
|
|
218
|
-
...
|
|
221
|
+
...mockVerified.knownState(),
|
|
222
|
+
});
|
|
223
|
+
expect(state.loadingState).toBe("available");
|
|
224
|
+
await expect(state.waitForAvailableOrUnavailable()).resolves.toMatchObject({
|
|
225
|
+
verified: mockVerified,
|
|
219
226
|
});
|
|
220
|
-
expect(state.highLevelState).toBe("available");
|
|
221
|
-
await expect(state.getCoValue()).resolves.toEqual({ id: mockCoValueId });
|
|
222
227
|
|
|
223
228
|
vi.useRealTimers();
|
|
224
229
|
});
|
|
@@ -226,7 +231,7 @@ describe("CoValueState", () => {
|
|
|
226
231
|
test("should skip closed peers", async () => {
|
|
227
232
|
vi.useFakeTimers();
|
|
228
233
|
|
|
229
|
-
const
|
|
234
|
+
const mockVerified = createMockCoValueVerified(mockCoValueId);
|
|
230
235
|
|
|
231
236
|
const peer1 = createMockPeerState(
|
|
232
237
|
{
|
|
@@ -243,13 +248,13 @@ describe("CoValueState", () => {
|
|
|
243
248
|
role: "server",
|
|
244
249
|
},
|
|
245
250
|
async () => {
|
|
246
|
-
state.markAvailable(
|
|
251
|
+
state.markAvailable({} as CoValueHeader, "peer2");
|
|
247
252
|
},
|
|
248
253
|
);
|
|
249
254
|
|
|
250
255
|
peer1.closed = true;
|
|
251
256
|
|
|
252
|
-
const state =
|
|
257
|
+
const state = CoValueCore.fromID(mockCoValueId, mockNode);
|
|
253
258
|
const loadPromise = state.loadFromPeers([peer1, peer2]);
|
|
254
259
|
|
|
255
260
|
await vi.runAllTimersAsync();
|
|
@@ -258,8 +263,10 @@ describe("CoValueState", () => {
|
|
|
258
263
|
expect(peer1.pushOutgoingMessage).toHaveBeenCalledTimes(0);
|
|
259
264
|
expect(peer2.pushOutgoingMessage).toHaveBeenCalledTimes(1);
|
|
260
265
|
|
|
261
|
-
expect(state.
|
|
262
|
-
await expect(state.
|
|
266
|
+
expect(state.loadingState).toBe("available");
|
|
267
|
+
await expect(state.waitForAvailableOrUnavailable()).resolves.toMatchObject({
|
|
268
|
+
verified: mockVerified,
|
|
269
|
+
});
|
|
263
270
|
|
|
264
271
|
vi.useRealTimers();
|
|
265
272
|
});
|
|
@@ -275,7 +282,7 @@ describe("CoValueState", () => {
|
|
|
275
282
|
async () => {},
|
|
276
283
|
);
|
|
277
284
|
|
|
278
|
-
const state =
|
|
285
|
+
const state = CoValueCore.fromID(mockCoValueId, mockNode);
|
|
279
286
|
const loadPromise = state.loadFromPeers([peer1]);
|
|
280
287
|
|
|
281
288
|
await vi.runAllTimersAsync();
|
|
@@ -283,8 +290,10 @@ describe("CoValueState", () => {
|
|
|
283
290
|
|
|
284
291
|
expect(peer1.pushOutgoingMessage).toHaveBeenCalledTimes(1);
|
|
285
292
|
|
|
286
|
-
expect(state.
|
|
287
|
-
await expect(state.
|
|
293
|
+
expect(state.loadingState).toBe("unavailable");
|
|
294
|
+
await expect(state.waitForAvailableOrUnavailable()).resolves.toMatchObject({
|
|
295
|
+
verified: null,
|
|
296
|
+
});
|
|
288
297
|
|
|
289
298
|
vi.useRealTimers();
|
|
290
299
|
});
|
|
@@ -311,17 +320,18 @@ function createMockPeerState(
|
|
|
311
320
|
return peerState;
|
|
312
321
|
}
|
|
313
322
|
|
|
314
|
-
function
|
|
323
|
+
function createMockCoValueVerified(mockCoValueId: string) {
|
|
315
324
|
// Setting the knownState as part of the prototype to simplify
|
|
316
325
|
// the equality checks
|
|
317
|
-
const
|
|
326
|
+
const mockCoValueVerified = Object.create({
|
|
327
|
+
id: mockCoValueId,
|
|
318
328
|
knownState: vi.fn().mockReturnValue({
|
|
319
329
|
id: mockCoValueId,
|
|
320
330
|
header: true,
|
|
321
331
|
sessions: {},
|
|
322
332
|
}),
|
|
323
|
-
|
|
333
|
+
clone: vi.fn().mockReturnThis(),
|
|
334
|
+
}) as unknown as VerifiedState;
|
|
324
335
|
|
|
325
|
-
|
|
326
|
-
return mockCoValue as unknown as CoValueCore;
|
|
336
|
+
return mockCoValueVerified as unknown as VerifiedState;
|
|
327
337
|
}
|
package/src/tests/group.test.ts
CHANGED
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
import { describe, expect, test } from "vitest";
|
|
2
|
-
import { CoValueState } from "../coValueState.js";
|
|
3
2
|
import { RawCoList } from "../coValues/coList.js";
|
|
4
3
|
import { RawCoMap } from "../coValues/coMap.js";
|
|
5
4
|
import { RawCoStream } from "../coValues/coStream.js";
|
|
6
5
|
import { RawBinaryCoStream } from "../coValues/coStream.js";
|
|
7
6
|
import { WasmCrypto } from "../crypto/WasmCrypto.js";
|
|
8
7
|
import { RawAccountID } from "../exports.js";
|
|
9
|
-
import { LocalNode } from "../localNode.js";
|
|
10
8
|
import {
|
|
11
9
|
createThreeConnectedNodes,
|
|
12
10
|
createTwoConnectedNodes,
|
|
13
11
|
loadCoValueOrFail,
|
|
14
|
-
|
|
12
|
+
nodeWithRandomAgentAndSessionID,
|
|
13
|
+
randomAgentAndSessionID,
|
|
15
14
|
waitFor,
|
|
16
15
|
} from "./testUtils.js";
|
|
17
16
|
|
|
18
17
|
const Crypto = await WasmCrypto.create();
|
|
19
18
|
|
|
20
19
|
test("Can create a RawCoMap in a group", () => {
|
|
21
|
-
const node =
|
|
20
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
22
21
|
|
|
23
22
|
const group = node.createGroup();
|
|
24
23
|
|
|
@@ -29,7 +28,7 @@ test("Can create a RawCoMap in a group", () => {
|
|
|
29
28
|
});
|
|
30
29
|
|
|
31
30
|
test("Can create a CoList in a group", () => {
|
|
32
|
-
const node =
|
|
31
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
33
32
|
|
|
34
33
|
const group = node.createGroup();
|
|
35
34
|
|
|
@@ -40,7 +39,7 @@ test("Can create a CoList in a group", () => {
|
|
|
40
39
|
});
|
|
41
40
|
|
|
42
41
|
test("Can create a CoStream in a group", () => {
|
|
43
|
-
const node =
|
|
42
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
44
43
|
|
|
45
44
|
const group = node.createGroup();
|
|
46
45
|
|
|
@@ -51,7 +50,7 @@ test("Can create a CoStream in a group", () => {
|
|
|
51
50
|
});
|
|
52
51
|
|
|
53
52
|
test("Can create a FileStream in a group", () => {
|
|
54
|
-
const node =
|
|
53
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
55
54
|
|
|
56
55
|
const group = node.createGroup();
|
|
57
56
|
|
|
@@ -100,7 +99,7 @@ test("Remove a member from a group where the admin role is inherited", async ()
|
|
|
100
99
|
|
|
101
100
|
// The node1 account removes the reader from the group
|
|
102
101
|
// The reader should be automatically kicked out of the child group
|
|
103
|
-
await group.removeMember(node3.node.
|
|
102
|
+
await group.removeMember(node3.node.expectCurrentAccount("node3"));
|
|
104
103
|
|
|
105
104
|
await group.core.waitForSync();
|
|
106
105
|
|
|
@@ -150,7 +149,7 @@ test("An admin should be able to rotate the readKey on child groups and keep acc
|
|
|
150
149
|
// The node1 account removes the reader from the group
|
|
151
150
|
// In this case we want to ensure that node1 is still able to read new coValues
|
|
152
151
|
// Even if some childs are not available when the readKey is rotated
|
|
153
|
-
await group.removeMember(node3.node.
|
|
152
|
+
await group.removeMember(node3.node.expectCurrentAccount("node3"));
|
|
154
153
|
await group.core.waitForSync();
|
|
155
154
|
|
|
156
155
|
const map = childGroup.createMap();
|
|
@@ -191,7 +190,7 @@ test("An admin should be able to rotate the readKey on child groups even if it w
|
|
|
191
190
|
// The node1 account removes the reader from the group
|
|
192
191
|
// In this case we want to ensure that node1 is still able to read new coValues
|
|
193
192
|
// Even if some childs are not available when the readKey is rotated
|
|
194
|
-
await group.removeMember(node3.node.
|
|
193
|
+
await group.removeMember(node3.node.expectCurrentAccount("node3"));
|
|
195
194
|
await group.core.waitForSync();
|
|
196
195
|
|
|
197
196
|
const map = childGroup.createMap();
|
|
@@ -234,7 +233,7 @@ test("An admin should be able to rotate the readKey on child groups even if it w
|
|
|
234
233
|
// The node1 account removes the reader from the group
|
|
235
234
|
// In this case we want to ensure that node1 is still able to read new coValues
|
|
236
235
|
// Even if some childs are not available when the readKey is rotated
|
|
237
|
-
await group.removeMember(node3.node.
|
|
236
|
+
await group.removeMember(node3.node.expectCurrentAccount("node3"));
|
|
238
237
|
await group.core.waitForSync();
|
|
239
238
|
|
|
240
239
|
const map = childGroup.createMap();
|
|
@@ -268,7 +267,7 @@ test("A user add after a key rotation should have access to the old transactions
|
|
|
268
267
|
|
|
269
268
|
await map.core.waitForSync();
|
|
270
269
|
|
|
271
|
-
await group.removeMember(node3.node.
|
|
270
|
+
await group.removeMember(node3.node.expectCurrentAccount("node3"));
|
|
272
271
|
group.addMember(
|
|
273
272
|
await loadCoValueOrFail(node1.node, node3.accountID),
|
|
274
273
|
"reader",
|
|
@@ -295,7 +294,7 @@ test("Invites should have access to the new keys", async () => {
|
|
|
295
294
|
|
|
296
295
|
const invite = group.createInvite("admin");
|
|
297
296
|
|
|
298
|
-
await group.removeMember(node3.node.
|
|
297
|
+
await group.removeMember(node3.node.expectCurrentAccount("node3"));
|
|
299
298
|
|
|
300
299
|
const map = group.createMap();
|
|
301
300
|
map.set("test", "Written from node1");
|
|
@@ -454,7 +453,7 @@ describe("writeOnly", () => {
|
|
|
454
453
|
|
|
455
454
|
await map.core.waitForSync();
|
|
456
455
|
|
|
457
|
-
await group.removeMember(node3.node.
|
|
456
|
+
await group.removeMember(node3.node.expectCurrentAccount("node3"));
|
|
458
457
|
|
|
459
458
|
await group.core.waitForSync();
|
|
460
459
|
|
|
@@ -491,10 +490,8 @@ describe("writeOnly", () => {
|
|
|
491
490
|
"writer",
|
|
492
491
|
);
|
|
493
492
|
|
|
494
|
-
node2.node.
|
|
495
|
-
expect(node2.node.
|
|
496
|
-
"unknown",
|
|
497
|
-
);
|
|
493
|
+
node2.node.internalDeleteCoValue(map.id);
|
|
494
|
+
expect(node2.node.getCoValue(map.id)?.loadingState).toBe("unknown");
|
|
498
495
|
|
|
499
496
|
const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
|
|
500
497
|
|
|
@@ -918,96 +915,75 @@ describe("extend with role mapping", () => {
|
|
|
918
915
|
|
|
919
916
|
describe("roleOf", () => {
|
|
920
917
|
test("returns direct role assignments", () => {
|
|
921
|
-
const node =
|
|
918
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
922
919
|
const group = node.createGroup();
|
|
923
|
-
const
|
|
924
|
-
...randomAnonymousAccountAndSessionID(),
|
|
925
|
-
Crypto,
|
|
926
|
-
).account;
|
|
920
|
+
const [agent2] = randomAgentAndSessionID();
|
|
927
921
|
|
|
928
|
-
group.addMember(
|
|
929
|
-
expect(group.
|
|
922
|
+
group.addMember(agent2, "writer");
|
|
923
|
+
expect(group.roleOfInternal(agent2.id)).toEqual("writer");
|
|
930
924
|
});
|
|
931
925
|
|
|
932
926
|
test("returns undefined for non-members", () => {
|
|
933
|
-
const node =
|
|
927
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
934
928
|
const group = node.createGroup();
|
|
935
|
-
const
|
|
936
|
-
...randomAnonymousAccountAndSessionID(),
|
|
937
|
-
Crypto,
|
|
938
|
-
).account;
|
|
929
|
+
const [agent2] = randomAgentAndSessionID();
|
|
939
930
|
|
|
940
|
-
expect(group.
|
|
931
|
+
expect(group.roleOfInternal(agent2.id)).toEqual(undefined);
|
|
941
932
|
});
|
|
942
933
|
|
|
943
934
|
test("revoked roles return undefined", () => {
|
|
944
|
-
const node =
|
|
935
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
945
936
|
const group = node.createGroup();
|
|
946
|
-
const
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
)
|
|
950
|
-
|
|
951
|
-
group.addMember(account, "writer");
|
|
952
|
-
group.removeMemberInternal(account);
|
|
953
|
-
expect(group.roleOf(account.id as RawAccountID)).toEqual(undefined);
|
|
937
|
+
const [agent2] = randomAgentAndSessionID();
|
|
938
|
+
|
|
939
|
+
group.addMember(agent2, "writer");
|
|
940
|
+
group.removeMemberInternal(agent2);
|
|
941
|
+
expect(group.roleOfInternal(agent2.id)).toEqual(undefined);
|
|
954
942
|
});
|
|
955
943
|
|
|
956
944
|
test("everyone role applies to all accounts", () => {
|
|
957
|
-
const node =
|
|
945
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
958
946
|
const group = node.createGroup();
|
|
959
|
-
const
|
|
960
|
-
...randomAnonymousAccountAndSessionID(),
|
|
961
|
-
Crypto,
|
|
962
|
-
).account;
|
|
947
|
+
const [agent2, sessionID2] = randomAgentAndSessionID();
|
|
963
948
|
|
|
964
949
|
group.addMemberInternal("everyone", "reader");
|
|
965
|
-
expect(group.
|
|
950
|
+
expect(group.roleOfInternal(agent2.id)).toEqual("reader");
|
|
966
951
|
});
|
|
967
952
|
|
|
968
953
|
test("account role overrides everyone role", () => {
|
|
969
|
-
const node =
|
|
954
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
970
955
|
const group = node.createGroup();
|
|
971
|
-
const
|
|
972
|
-
...randomAnonymousAccountAndSessionID(),
|
|
973
|
-
Crypto,
|
|
974
|
-
).account;
|
|
956
|
+
const [agent2, sessionID2] = randomAgentAndSessionID();
|
|
975
957
|
|
|
976
958
|
group.addMemberInternal("everyone", "writer");
|
|
977
|
-
group.addMember(
|
|
978
|
-
expect(group.
|
|
959
|
+
group.addMember(agent2, "reader");
|
|
960
|
+
expect(group.roleOfInternal(agent2.id)).toEqual("reader");
|
|
979
961
|
});
|
|
980
962
|
|
|
981
963
|
test("Revoking access on everyone role should not affect existing members", () => {
|
|
982
|
-
const node =
|
|
964
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
983
965
|
const group = node.createGroup();
|
|
984
|
-
const
|
|
985
|
-
...randomAnonymousAccountAndSessionID(),
|
|
986
|
-
Crypto,
|
|
987
|
-
).account;
|
|
966
|
+
const [agent2, sessionID2] = randomAgentAndSessionID();
|
|
988
967
|
|
|
989
968
|
group.addMemberInternal("everyone", "reader");
|
|
990
|
-
group.addMember(
|
|
969
|
+
group.addMember(agent2, "writer");
|
|
991
970
|
group.removeMemberInternal("everyone");
|
|
992
|
-
expect(group.
|
|
993
|
-
expect(group.
|
|
971
|
+
expect(group.roleOfInternal(agent2.id)).toEqual("writer");
|
|
972
|
+
expect(group.roleOfInternal("123" as RawAccountID)).toEqual(undefined);
|
|
994
973
|
});
|
|
995
974
|
|
|
996
975
|
test("Everyone role is inherited following the most permissive algorithm", () => {
|
|
997
|
-
const node =
|
|
976
|
+
const node = nodeWithRandomAgentAndSessionID();
|
|
998
977
|
const group = node.createGroup();
|
|
999
|
-
const
|
|
1000
|
-
...randomAnonymousAccountAndSessionID(),
|
|
1001
|
-
Crypto,
|
|
1002
|
-
).account;
|
|
978
|
+
const [agent2, sessionID2] = randomAgentAndSessionID();
|
|
1003
979
|
|
|
1004
980
|
const parentGroup = node.createGroup();
|
|
1005
981
|
parentGroup.addMemberInternal("everyone", "writer");
|
|
1006
982
|
|
|
1007
983
|
group.extend(parentGroup);
|
|
1008
|
-
group.addMember(
|
|
984
|
+
group.addMember(agent2, "reader");
|
|
1009
985
|
|
|
1010
|
-
expect(group.
|
|
986
|
+
expect(group.roleOfInternal(agent2.id)).toEqual("writer");
|
|
1011
987
|
});
|
|
1012
988
|
test("roleOf should prioritize explicit account role over everyone role in same group", async () => {
|
|
1013
989
|
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
import { CoValueCore, LocalNode
|
|
2
|
-
import {
|
|
3
|
-
CoValueKnownState,
|
|
4
|
-
NewContentMessage,
|
|
5
|
-
Peer,
|
|
6
|
-
SyncMessage,
|
|
7
|
-
} from "../sync";
|
|
1
|
+
import { CoValueCore, LocalNode } from "../exports";
|
|
2
|
+
import { CoValueKnownState, NewContentMessage, SyncMessage } from "../sync";
|
|
8
3
|
|
|
9
4
|
function simplifySessions(msg: CoValueKnownState) {
|
|
10
5
|
const count = Object.values(msg.sessions).reduce(
|
|
@@ -64,7 +59,7 @@ export function toSimplifiedMessages(
|
|
|
64
59
|
}
|
|
65
60
|
|
|
66
61
|
export function nodeRelatedKnownCoValues(node: LocalNode, name: string) {
|
|
67
|
-
const account = node.
|
|
62
|
+
const account = node.expectCurrentAccount("relatedKnownCoValues");
|
|
68
63
|
const profileID = account.get("profile");
|
|
69
64
|
const profile = profileID && node.expectCoValueLoaded(profileID);
|
|
70
65
|
return {
|