cojson 0.18.19 → 0.18.21
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/GarbageCollector.d.ts +2 -1
- package/dist/GarbageCollector.d.ts.map +1 -1
- package/dist/GarbageCollector.js +3 -2
- package/dist/GarbageCollector.js.map +1 -1
- package/dist/coValueCore/coValueCore.d.ts +28 -25
- package/dist/coValueCore/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore/coValueCore.js +128 -90
- package/dist/coValueCore/coValueCore.js.map +1 -1
- package/dist/coValueCore/utils.d.ts +6 -0
- package/dist/coValueCore/utils.d.ts.map +1 -1
- package/dist/coValueCore/utils.js +53 -25
- package/dist/coValueCore/utils.js.map +1 -1
- package/dist/localNode.d.ts +5 -4
- package/dist/localNode.d.ts.map +1 -1
- package/dist/localNode.js +31 -37
- package/dist/localNode.js.map +1 -1
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +56 -69
- package/dist/sync.js.map +1 -1
- package/dist/tests/GarbageCollector.test.js +14 -0
- package/dist/tests/GarbageCollector.test.js.map +1 -1
- package/dist/tests/SyncStateManager.test.js +1 -1
- package/dist/tests/coValueCore.dependencies.test.d.ts +2 -0
- package/dist/tests/coValueCore.dependencies.test.d.ts.map +1 -0
- package/dist/tests/coValueCore.dependencies.test.js +55 -0
- package/dist/tests/coValueCore.dependencies.test.js.map +1 -0
- package/dist/tests/coValueCore.test.js +2 -2
- package/dist/tests/coValueCore.test.js.map +1 -1
- package/dist/tests/coValueCoreLoadingState.test.js +43 -62
- package/dist/tests/coValueCoreLoadingState.test.js.map +1 -1
- package/dist/tests/permissions.test.js +117 -117
- package/dist/tests/permissions.test.js.map +1 -1
- package/dist/tests/sync.load.test.js +238 -9
- package/dist/tests/sync.load.test.js.map +1 -1
- package/dist/tests/sync.peerReconciliation.test.js +7 -6
- package/dist/tests/sync.peerReconciliation.test.js.map +1 -1
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +2 -1
- package/dist/tests/testUtils.js.map +1 -1
- package/package.json +2 -2
- package/src/GarbageCollector.ts +5 -2
- package/src/coValueCore/coValueCore.ts +172 -118
- package/src/coValueCore/utils.ts +85 -31
- package/src/localNode.ts +43 -48
- package/src/sync.ts +63 -89
- package/src/tests/GarbageCollector.test.ts +20 -0
- package/src/tests/SyncStateManager.test.ts +1 -1
- package/src/tests/coValueCore.dependencies.test.ts +90 -0
- package/src/tests/coValueCore.test.ts +2 -2
- package/src/tests/coValueCoreLoadingState.test.ts +50 -66
- package/src/tests/permissions.test.ts +120 -123
- package/src/tests/sync.load.test.ts +308 -9
- package/src/tests/sync.peerReconciliation.test.ts +7 -6
- package/src/tests/testUtils.ts +5 -3
|
@@ -5,7 +5,11 @@ import { CoValueHeader, VerifiedState } from "../coValueCore/verifiedState";
|
|
|
5
5
|
import { RawCoID } from "../ids";
|
|
6
6
|
import { LocalNode } from "../localNode";
|
|
7
7
|
import { Peer } from "../sync";
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
createTestMetricReader,
|
|
10
|
+
createTestNode,
|
|
11
|
+
tearDownTestMetricReader,
|
|
12
|
+
} from "./testUtils";
|
|
9
13
|
import { WasmCrypto } from "../crypto/WasmCrypto";
|
|
10
14
|
|
|
11
15
|
let metricReader: ReturnType<typeof createTestMetricReader>;
|
|
@@ -18,26 +22,28 @@ afterEach(() => {
|
|
|
18
22
|
tearDownTestMetricReader();
|
|
19
23
|
});
|
|
20
24
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
} as unknown as LocalNode;
|
|
25
|
+
function setup() {
|
|
26
|
+
const node = createTestNode();
|
|
24
27
|
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
} as CoValueHeader;
|
|
28
|
+
const header = {
|
|
29
|
+
type: "comap",
|
|
30
|
+
ruleset: { type: "ownedByGroup", group: "co_ztest123" },
|
|
31
|
+
meta: null,
|
|
32
|
+
...node.crypto.createdNowUnique(),
|
|
33
|
+
} as CoValueHeader;
|
|
31
34
|
|
|
32
|
-
const
|
|
35
|
+
const id = idforHeader(header, node.crypto);
|
|
33
36
|
|
|
34
|
-
|
|
35
|
-
|
|
37
|
+
const state = CoValueCore.fromID(id, node);
|
|
38
|
+
|
|
39
|
+
return { node, state, id, header };
|
|
40
|
+
}
|
|
36
41
|
|
|
42
|
+
describe("CoValueCore loading state", () => {
|
|
37
43
|
test("should create unknown state", async () => {
|
|
38
|
-
const state =
|
|
44
|
+
const { state, id } = setup();
|
|
39
45
|
|
|
40
|
-
expect(state.id).toBe(
|
|
46
|
+
expect(state.id).toBe(id);
|
|
41
47
|
expect(state.loadingState).toBe("unknown");
|
|
42
48
|
expect(
|
|
43
49
|
await metricReader.getMetricValue("jazz.covalues.loaded", {
|
|
@@ -47,13 +53,13 @@ describe("CoValueCore loading state", () => {
|
|
|
47
53
|
});
|
|
48
54
|
|
|
49
55
|
test("should create loading state", async () => {
|
|
50
|
-
const state =
|
|
56
|
+
const { state, id } = setup();
|
|
51
57
|
state.loadFromPeers([
|
|
52
58
|
createMockPeerState({ id: "peer1", role: "server" }),
|
|
53
59
|
createMockPeerState({ id: "peer2", role: "server" }),
|
|
54
60
|
]);
|
|
55
61
|
|
|
56
|
-
expect(state.id).toBe(
|
|
62
|
+
expect(state.id).toBe(id);
|
|
57
63
|
expect(state.loadingState).toBe("loading");
|
|
58
64
|
expect(
|
|
59
65
|
await metricReader.getMetricValue("jazz.covalues.loaded", {
|
|
@@ -63,15 +69,16 @@ describe("CoValueCore loading state", () => {
|
|
|
63
69
|
});
|
|
64
70
|
|
|
65
71
|
test("should create available state", async () => {
|
|
66
|
-
const
|
|
67
|
-
const state = CoValueCore.fromID(mockCoValueId, mockNode);
|
|
68
|
-
state.internalMarkMagicallyAvailable(mockVerified);
|
|
72
|
+
const { state, id, header } = setup();
|
|
69
73
|
|
|
70
|
-
|
|
74
|
+
const previousState = state.loadingState;
|
|
75
|
+
state.provideHeader(header);
|
|
76
|
+
state.markFoundInPeer("peer1", previousState);
|
|
77
|
+
|
|
78
|
+
expect(state.id).toBe(id);
|
|
71
79
|
expect(state.loadingState).toBe("available");
|
|
72
|
-
expect(state.verified).toBe(mockVerified);
|
|
73
80
|
await expect(state.waitForAvailableOrUnavailable()).resolves.toMatchObject({
|
|
74
|
-
verified:
|
|
81
|
+
verified: expect.any(Object),
|
|
75
82
|
});
|
|
76
83
|
expect(
|
|
77
84
|
await metricReader.getMetricValue("jazz.covalues.loaded", {
|
|
@@ -81,8 +88,7 @@ describe("CoValueCore loading state", () => {
|
|
|
81
88
|
});
|
|
82
89
|
|
|
83
90
|
test("should handle found action", async () => {
|
|
84
|
-
const
|
|
85
|
-
const state = CoValueCore.fromID(mockCoValueId, mockNode);
|
|
91
|
+
const { state, header } = setup();
|
|
86
92
|
state.loadFromPeers([
|
|
87
93
|
createMockPeerState({ id: "peer1", role: "server" }),
|
|
88
94
|
createMockPeerState({ id: "peer2", role: "server" }),
|
|
@@ -100,14 +106,12 @@ describe("CoValueCore loading state", () => {
|
|
|
100
106
|
).toBe(1);
|
|
101
107
|
|
|
102
108
|
const stateValuePromise = state.waitForAvailableOrUnavailable();
|
|
109
|
+
const previousState = state.loadingState;
|
|
103
110
|
|
|
104
|
-
state.
|
|
111
|
+
state.provideHeader(header);
|
|
112
|
+
state.markFoundInPeer("peer1", previousState);
|
|
105
113
|
|
|
106
|
-
|
|
107
|
-
expect(result).toMatchObject({ verified: mockVerified });
|
|
108
|
-
await expect(stateValuePromise).resolves.toMatchObject({
|
|
109
|
-
verified: mockVerified,
|
|
110
|
-
});
|
|
114
|
+
await stateValuePromise;
|
|
111
115
|
|
|
112
116
|
expect(
|
|
113
117
|
await metricReader.getMetricValue("jazz.covalues.loaded", {
|
|
@@ -122,6 +126,7 @@ describe("CoValueCore loading state", () => {
|
|
|
122
126
|
});
|
|
123
127
|
|
|
124
128
|
test("should skip errored coValues when loading from peers", async () => {
|
|
129
|
+
const { state } = setup();
|
|
125
130
|
vi.useFakeTimers();
|
|
126
131
|
|
|
127
132
|
const peer1 = createMockPeerState(
|
|
@@ -145,7 +150,6 @@ describe("CoValueCore loading state", () => {
|
|
|
145
150
|
|
|
146
151
|
const mockPeers = [peer1, peer2] as unknown as PeerState[];
|
|
147
152
|
|
|
148
|
-
const state = CoValueCore.fromID(mockCoValueId, mockNode);
|
|
149
153
|
const loadPromise = state.loadFromPeers(mockPeers);
|
|
150
154
|
|
|
151
155
|
await vi.runAllTimersAsync();
|
|
@@ -162,6 +166,7 @@ describe("CoValueCore loading state", () => {
|
|
|
162
166
|
});
|
|
163
167
|
|
|
164
168
|
test("should have a coValue as value property when becomes available after that have been marked as unavailable", async () => {
|
|
169
|
+
const { state, header } = setup();
|
|
165
170
|
vi.useFakeTimers();
|
|
166
171
|
|
|
167
172
|
const peer1 = createMockPeerState(
|
|
@@ -176,14 +181,13 @@ describe("CoValueCore loading state", () => {
|
|
|
176
181
|
|
|
177
182
|
const mockPeers = [peer1] as unknown as PeerState[];
|
|
178
183
|
|
|
179
|
-
const state = CoValueCore.fromID(mockCoValueId, mockNode);
|
|
180
184
|
const loadPromise = state.loadFromPeers(mockPeers);
|
|
181
185
|
|
|
182
186
|
await vi.runAllTimersAsync();
|
|
183
187
|
|
|
184
|
-
state.
|
|
185
|
-
|
|
186
|
-
);
|
|
188
|
+
const previousState = state.loadingState;
|
|
189
|
+
state.provideHeader(header);
|
|
190
|
+
state.markFoundInPeer("peer1", previousState);
|
|
187
191
|
|
|
188
192
|
await loadPromise;
|
|
189
193
|
|
|
@@ -199,7 +203,7 @@ describe("CoValueCore loading state", () => {
|
|
|
199
203
|
test("should start sending the known state to peers when available", async () => {
|
|
200
204
|
vi.useFakeTimers();
|
|
201
205
|
|
|
202
|
-
const
|
|
206
|
+
const { state, header } = setup();
|
|
203
207
|
|
|
204
208
|
const peer1 = createMockPeerState(
|
|
205
209
|
{
|
|
@@ -207,7 +211,9 @@ describe("CoValueCore loading state", () => {
|
|
|
207
211
|
role: "server",
|
|
208
212
|
},
|
|
209
213
|
async () => {
|
|
210
|
-
state.
|
|
214
|
+
const previousState = state.loadingState;
|
|
215
|
+
state.provideHeader(header);
|
|
216
|
+
state.markFoundInPeer("peer1", previousState);
|
|
211
217
|
},
|
|
212
218
|
);
|
|
213
219
|
const peer2 = createMockPeerState(
|
|
@@ -220,7 +226,6 @@ describe("CoValueCore loading state", () => {
|
|
|
220
226
|
},
|
|
221
227
|
);
|
|
222
228
|
|
|
223
|
-
const state = CoValueCore.fromID(mockCoValueId, mockNode);
|
|
224
229
|
const loadPromise = state.loadFromPeers([peer1, peer2]);
|
|
225
230
|
|
|
226
231
|
await vi.runAllTimersAsync();
|
|
@@ -230,12 +235,9 @@ describe("CoValueCore loading state", () => {
|
|
|
230
235
|
expect(peer2.pushOutgoingMessage).toHaveBeenCalledTimes(1);
|
|
231
236
|
expect(peer2.pushOutgoingMessage).toHaveBeenCalledWith({
|
|
232
237
|
action: "load",
|
|
233
|
-
...
|
|
238
|
+
...state.knownState(),
|
|
234
239
|
});
|
|
235
240
|
expect(state.loadingState).toBe("available");
|
|
236
|
-
await expect(state.waitForAvailableOrUnavailable()).resolves.toMatchObject({
|
|
237
|
-
verified: mockVerified,
|
|
238
|
-
});
|
|
239
241
|
|
|
240
242
|
vi.useRealTimers();
|
|
241
243
|
});
|
|
@@ -243,7 +245,7 @@ describe("CoValueCore loading state", () => {
|
|
|
243
245
|
test("should skip closed peers", async () => {
|
|
244
246
|
vi.useFakeTimers();
|
|
245
247
|
|
|
246
|
-
const
|
|
248
|
+
const { state, header } = setup();
|
|
247
249
|
|
|
248
250
|
const peer1 = createMockPeerState(
|
|
249
251
|
{
|
|
@@ -260,13 +262,14 @@ describe("CoValueCore loading state", () => {
|
|
|
260
262
|
role: "server",
|
|
261
263
|
},
|
|
262
264
|
async () => {
|
|
263
|
-
state.
|
|
265
|
+
const previousState = state.loadingState;
|
|
266
|
+
state.provideHeader(header);
|
|
267
|
+
state.markFoundInPeer("peer2", previousState);
|
|
264
268
|
},
|
|
265
269
|
);
|
|
266
270
|
|
|
267
271
|
peer1.closed = true;
|
|
268
272
|
|
|
269
|
-
const state = CoValueCore.fromID(mockCoValueId, mockNode);
|
|
270
273
|
const loadPromise = state.loadFromPeers([peer1, peer2]);
|
|
271
274
|
|
|
272
275
|
await vi.runAllTimersAsync();
|
|
@@ -276,9 +279,6 @@ describe("CoValueCore loading state", () => {
|
|
|
276
279
|
expect(peer2.pushOutgoingMessage).toHaveBeenCalledTimes(1);
|
|
277
280
|
|
|
278
281
|
expect(state.loadingState).toBe("available");
|
|
279
|
-
await expect(state.waitForAvailableOrUnavailable()).resolves.toMatchObject({
|
|
280
|
-
verified: mockVerified,
|
|
281
|
-
});
|
|
282
282
|
|
|
283
283
|
vi.useRealTimers();
|
|
284
284
|
});
|
|
@@ -294,7 +294,7 @@ describe("CoValueCore loading state", () => {
|
|
|
294
294
|
async () => {},
|
|
295
295
|
);
|
|
296
296
|
|
|
297
|
-
const state =
|
|
297
|
+
const { state } = setup();
|
|
298
298
|
const loadPromise = state.loadFromPeers([peer1]);
|
|
299
299
|
|
|
300
300
|
await vi.runAllTimersAsync();
|
|
@@ -331,19 +331,3 @@ function createMockPeerState(
|
|
|
331
331
|
|
|
332
332
|
return peerState;
|
|
333
333
|
}
|
|
334
|
-
|
|
335
|
-
function createMockCoValueVerified(mockCoValueId: string) {
|
|
336
|
-
// Setting the knownState as part of the prototype to simplify
|
|
337
|
-
// the equality checks
|
|
338
|
-
const mockCoValueVerified = Object.create({
|
|
339
|
-
id: mockCoValueId,
|
|
340
|
-
knownState: vi.fn().mockReturnValue({
|
|
341
|
-
id: mockCoValueId,
|
|
342
|
-
header: true,
|
|
343
|
-
sessions: {},
|
|
344
|
-
}),
|
|
345
|
-
clone: vi.fn().mockReturnThis(),
|
|
346
|
-
}) as unknown as VerifiedState;
|
|
347
|
-
|
|
348
|
-
return mockCoValueVerified as unknown as VerifiedState;
|
|
349
|
-
}
|