cojson 0.18.18 → 0.18.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.
Files changed (56) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +18 -0
  3. package/dist/GarbageCollector.d.ts +2 -1
  4. package/dist/GarbageCollector.d.ts.map +1 -1
  5. package/dist/GarbageCollector.js +3 -2
  6. package/dist/GarbageCollector.js.map +1 -1
  7. package/dist/coValueCore/coValueCore.d.ts +28 -25
  8. package/dist/coValueCore/coValueCore.d.ts.map +1 -1
  9. package/dist/coValueCore/coValueCore.js +128 -90
  10. package/dist/coValueCore/coValueCore.js.map +1 -1
  11. package/dist/coValueCore/utils.d.ts +6 -0
  12. package/dist/coValueCore/utils.d.ts.map +1 -1
  13. package/dist/coValueCore/utils.js +53 -25
  14. package/dist/coValueCore/utils.js.map +1 -1
  15. package/dist/localNode.d.ts +5 -4
  16. package/dist/localNode.d.ts.map +1 -1
  17. package/dist/localNode.js +31 -37
  18. package/dist/localNode.js.map +1 -1
  19. package/dist/sync.d.ts.map +1 -1
  20. package/dist/sync.js +56 -69
  21. package/dist/sync.js.map +1 -1
  22. package/dist/tests/GarbageCollector.test.js +14 -0
  23. package/dist/tests/GarbageCollector.test.js.map +1 -1
  24. package/dist/tests/SyncStateManager.test.js +1 -1
  25. package/dist/tests/coValueCore.dependencies.test.d.ts +2 -0
  26. package/dist/tests/coValueCore.dependencies.test.d.ts.map +1 -0
  27. package/dist/tests/coValueCore.dependencies.test.js +55 -0
  28. package/dist/tests/coValueCore.dependencies.test.js.map +1 -0
  29. package/dist/tests/coValueCore.test.js +2 -2
  30. package/dist/tests/coValueCore.test.js.map +1 -1
  31. package/dist/tests/coValueCoreLoadingState.test.js +43 -62
  32. package/dist/tests/coValueCoreLoadingState.test.js.map +1 -1
  33. package/dist/tests/permissions.test.js +117 -117
  34. package/dist/tests/permissions.test.js.map +1 -1
  35. package/dist/tests/sync.load.test.js +238 -9
  36. package/dist/tests/sync.load.test.js.map +1 -1
  37. package/dist/tests/sync.peerReconciliation.test.js +7 -6
  38. package/dist/tests/sync.peerReconciliation.test.js.map +1 -1
  39. package/dist/tests/testUtils.d.ts.map +1 -1
  40. package/dist/tests/testUtils.js +2 -1
  41. package/dist/tests/testUtils.js.map +1 -1
  42. package/package.json +2 -2
  43. package/src/GarbageCollector.ts +5 -2
  44. package/src/coValueCore/coValueCore.ts +172 -118
  45. package/src/coValueCore/utils.ts +85 -31
  46. package/src/localNode.ts +43 -48
  47. package/src/sync.ts +63 -89
  48. package/src/tests/GarbageCollector.test.ts +20 -0
  49. package/src/tests/SyncStateManager.test.ts +1 -1
  50. package/src/tests/coValueCore.dependencies.test.ts +90 -0
  51. package/src/tests/coValueCore.test.ts +2 -2
  52. package/src/tests/coValueCoreLoadingState.test.ts +50 -66
  53. package/src/tests/permissions.test.ts +120 -123
  54. package/src/tests/sync.load.test.ts +308 -9
  55. package/src/tests/sync.peerReconciliation.test.ts +7 -6
  56. 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 { createTestMetricReader, tearDownTestMetricReader } from "./testUtils";
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
- const mockNode = {
22
- crypto: await WasmCrypto.create(),
23
- } as unknown as LocalNode;
25
+ function setup() {
26
+ const node = createTestNode();
24
27
 
25
- const testCoValueHeader = {
26
- type: "comap",
27
- ruleset: { type: "ownedByGroup", group: "co_ztest123" },
28
- meta: null,
29
- uniqueness: null,
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 testCoValueId = idforHeader(testCoValueHeader, mockNode.crypto);
35
+ const id = idforHeader(header, node.crypto);
33
36
 
34
- describe("CoValueCore loading state", () => {
35
- const mockCoValueId = testCoValueId;
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 = CoValueCore.fromID(mockCoValueId, mockNode);
44
+ const { state, id } = setup();
39
45
 
40
- expect(state.id).toBe(mockCoValueId);
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 = CoValueCore.fromID(mockCoValueId, mockNode);
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(mockCoValueId);
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 mockVerified = createMockCoValueVerified(mockCoValueId);
67
- const state = CoValueCore.fromID(mockCoValueId, mockNode);
68
- state.internalMarkMagicallyAvailable(mockVerified);
72
+ const { state, id, header } = setup();
69
73
 
70
- expect(state.id).toBe(mockCoValueId);
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: mockVerified,
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 mockVerified = createMockCoValueVerified(mockCoValueId);
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.internalMarkMagicallyAvailable(mockVerified);
111
+ state.provideHeader(header);
112
+ state.markFoundInPeer("peer1", previousState);
105
113
 
106
- const result = await state.waitForAvailableOrUnavailable();
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.internalMarkMagicallyAvailable(
185
- createMockCoValueVerified(mockCoValueId),
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 mockVerified = createMockCoValueVerified(mockCoValueId);
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.provideHeader(testCoValueHeader, "peer1");
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
- ...mockVerified.knownState(),
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 mockVerified = createMockCoValueVerified(mockCoValueId);
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.provideHeader(testCoValueHeader, "peer2");
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 = CoValueCore.fromID(mockCoValueId, mockNode);
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
- }