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.
Files changed (166) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +9 -0
  3. package/dist/PeerState.d.ts +3 -0
  4. package/dist/PeerState.d.ts.map +1 -1
  5. package/dist/PeerState.js +9 -0
  6. package/dist/PeerState.js.map +1 -1
  7. package/dist/SyncStateManager.d.ts.map +1 -1
  8. package/dist/SyncStateManager.js +2 -3
  9. package/dist/SyncStateManager.js.map +1 -1
  10. package/dist/coValue.d.ts +4 -4
  11. package/dist/coValue.d.ts.map +1 -1
  12. package/dist/coValue.js +4 -4
  13. package/dist/coValue.js.map +1 -1
  14. package/dist/coValueCore/coValueCore.d.ts +143 -0
  15. package/dist/coValueCore/coValueCore.d.ts.map +1 -0
  16. package/dist/{coValueCore.js → coValueCore/coValueCore.js} +314 -246
  17. package/dist/coValueCore/coValueCore.js.map +1 -0
  18. package/dist/coValueCore/verifiedState.d.ts +65 -0
  19. package/dist/coValueCore/verifiedState.d.ts.map +1 -0
  20. package/dist/coValueCore/verifiedState.js +210 -0
  21. package/dist/coValueCore/verifiedState.js.map +1 -0
  22. package/dist/coValues/account.d.ts +8 -10
  23. package/dist/coValues/account.d.ts.map +1 -1
  24. package/dist/coValues/account.js +12 -13
  25. package/dist/coValues/account.js.map +1 -1
  26. package/dist/coValues/coList.d.ts +3 -3
  27. package/dist/coValues/coList.d.ts.map +1 -1
  28. package/dist/coValues/coList.js +6 -3
  29. package/dist/coValues/coList.js.map +1 -1
  30. package/dist/coValues/coMap.d.ts +3 -3
  31. package/dist/coValues/coMap.d.ts.map +1 -1
  32. package/dist/coValues/coMap.js +3 -3
  33. package/dist/coValues/coMap.js.map +1 -1
  34. package/dist/coValues/coPlainText.d.ts +2 -2
  35. package/dist/coValues/coPlainText.d.ts.map +1 -1
  36. package/dist/coValues/coPlainText.js +4 -4
  37. package/dist/coValues/coPlainText.js.map +1 -1
  38. package/dist/coValues/coStream.d.ts +3 -3
  39. package/dist/coValues/coStream.d.ts.map +1 -1
  40. package/dist/coValues/coStream.js +3 -3
  41. package/dist/coValues/coStream.js.map +1 -1
  42. package/dist/coValues/group.d.ts +7 -2
  43. package/dist/coValues/group.d.ts.map +1 -1
  44. package/dist/coValues/group.js +29 -26
  45. package/dist/coValues/group.js.map +1 -1
  46. package/dist/coreToCoValue.d.ts +2 -2
  47. package/dist/coreToCoValue.d.ts.map +1 -1
  48. package/dist/coreToCoValue.js +10 -14
  49. package/dist/coreToCoValue.js.map +1 -1
  50. package/dist/exports.d.ts +6 -5
  51. package/dist/exports.d.ts.map +1 -1
  52. package/dist/exports.js +3 -4
  53. package/dist/exports.js.map +1 -1
  54. package/dist/localNode.d.ts +30 -24
  55. package/dist/localNode.d.ts.map +1 -1
  56. package/dist/localNode.js +139 -170
  57. package/dist/localNode.js.map +1 -1
  58. package/dist/permissions.d.ts +2 -1
  59. package/dist/permissions.d.ts.map +1 -1
  60. package/dist/permissions.js +15 -11
  61. package/dist/permissions.js.map +1 -1
  62. package/dist/priority.d.ts +1 -1
  63. package/dist/priority.d.ts.map +1 -1
  64. package/dist/sync.d.ts +2 -2
  65. package/dist/sync.d.ts.map +1 -1
  66. package/dist/sync.js +86 -55
  67. package/dist/sync.js.map +1 -1
  68. package/dist/tests/coList.test.js +19 -16
  69. package/dist/tests/coList.test.js.map +1 -1
  70. package/dist/tests/coMap.test.js +12 -13
  71. package/dist/tests/coMap.test.js.map +1 -1
  72. package/dist/tests/coPlainText.test.js +9 -10
  73. package/dist/tests/coPlainText.test.js.map +1 -1
  74. package/dist/tests/coStream.test.js +22 -17
  75. package/dist/tests/coStream.test.js.map +1 -1
  76. package/dist/tests/coValueCore.test.js +22 -28
  77. package/dist/tests/coValueCore.test.js.map +1 -1
  78. package/dist/tests/coValueCoreLoadingState.test.d.ts +2 -0
  79. package/dist/tests/coValueCoreLoadingState.test.d.ts.map +1 -0
  80. package/dist/tests/{coValueState.test.js → coValueCoreLoadingState.test.js} +62 -46
  81. package/dist/tests/coValueCoreLoadingState.test.js.map +1 -0
  82. package/dist/tests/group.test.js +42 -43
  83. package/dist/tests/group.test.js.map +1 -1
  84. package/dist/tests/messagesTestUtils.d.ts +2 -2
  85. package/dist/tests/messagesTestUtils.d.ts.map +1 -1
  86. package/dist/tests/messagesTestUtils.js +1 -1
  87. package/dist/tests/messagesTestUtils.js.map +1 -1
  88. package/dist/tests/permissions.test.js +224 -292
  89. package/dist/tests/permissions.test.js.map +1 -1
  90. package/dist/tests/priority.test.js +13 -14
  91. package/dist/tests/priority.test.js.map +1 -1
  92. package/dist/tests/sync.auth.test.d.ts +2 -0
  93. package/dist/tests/sync.auth.test.d.ts.map +1 -0
  94. package/dist/tests/sync.auth.test.js +141 -0
  95. package/dist/tests/sync.auth.test.js.map +1 -0
  96. package/dist/tests/sync.load.test.js +4 -4
  97. package/dist/tests/sync.load.test.js.map +1 -1
  98. package/dist/tests/sync.mesh.test.js +25 -12
  99. package/dist/tests/sync.mesh.test.js.map +1 -1
  100. package/dist/tests/sync.peerReconciliation.test.js +19 -19
  101. package/dist/tests/sync.peerReconciliation.test.js.map +1 -1
  102. package/dist/tests/sync.storage.test.js +20 -13
  103. package/dist/tests/sync.storage.test.js.map +1 -1
  104. package/dist/tests/sync.test.js +32 -39
  105. package/dist/tests/sync.test.js.map +1 -1
  106. package/dist/tests/sync.upload.test.js +126 -37
  107. package/dist/tests/sync.upload.test.js.map +1 -1
  108. package/dist/tests/testUtils.d.ts +24 -15
  109. package/dist/tests/testUtils.d.ts.map +1 -1
  110. package/dist/tests/testUtils.js +88 -61
  111. package/dist/tests/testUtils.js.map +1 -1
  112. package/dist/typeUtils/expectGroup.js +1 -1
  113. package/dist/typeUtils/expectGroup.js.map +1 -1
  114. package/package.json +1 -1
  115. package/src/PeerState.ts +11 -0
  116. package/src/SyncStateManager.ts +2 -3
  117. package/src/coValue.ts +11 -8
  118. package/src/{coValueCore.ts → coValueCore/coValueCore.ts} +469 -413
  119. package/src/coValueCore/verifiedState.ts +376 -0
  120. package/src/coValues/account.ts +20 -25
  121. package/src/coValues/coList.ts +12 -6
  122. package/src/coValues/coMap.ts +9 -6
  123. package/src/coValues/coPlainText.ts +9 -6
  124. package/src/coValues/coStream.ts +9 -6
  125. package/src/coValues/group.ts +50 -28
  126. package/src/coreToCoValue.ts +14 -15
  127. package/src/exports.ts +9 -7
  128. package/src/localNode.ts +227 -273
  129. package/src/permissions.ts +18 -12
  130. package/src/priority.ts +1 -1
  131. package/src/sync.ts +96 -63
  132. package/src/tests/coList.test.ts +21 -15
  133. package/src/tests/coMap.test.ts +12 -13
  134. package/src/tests/coPlainText.test.ts +12 -9
  135. package/src/tests/coStream.test.ts +25 -16
  136. package/src/tests/coValueCore.test.ts +30 -27
  137. package/src/tests/{coValueState.test.ts → coValueCoreLoadingState.test.ts} +67 -57
  138. package/src/tests/group.test.ts +44 -68
  139. package/src/tests/messagesTestUtils.ts +3 -8
  140. package/src/tests/permissions.test.ts +283 -449
  141. package/src/tests/priority.test.ts +17 -13
  142. package/src/tests/sync.auth.test.ts +188 -0
  143. package/src/tests/sync.load.test.ts +4 -4
  144. package/src/tests/sync.mesh.test.ts +25 -12
  145. package/src/tests/sync.peerReconciliation.test.ts +25 -25
  146. package/src/tests/sync.storage.test.ts +20 -13
  147. package/src/tests/sync.test.ts +43 -43
  148. package/src/tests/sync.upload.test.ts +157 -37
  149. package/src/tests/testUtils.ts +120 -74
  150. package/src/typeUtils/expectGroup.ts +1 -1
  151. package/dist/CoValuesStore.d.ts +0 -14
  152. package/dist/CoValuesStore.d.ts.map +0 -1
  153. package/dist/CoValuesStore.js +0 -32
  154. package/dist/CoValuesStore.js.map +0 -1
  155. package/dist/coValueCore.d.ts +0 -142
  156. package/dist/coValueCore.d.ts.map +0 -1
  157. package/dist/coValueCore.js.map +0 -1
  158. package/dist/coValueState.d.ts +0 -34
  159. package/dist/coValueState.d.ts.map +0 -1
  160. package/dist/coValueState.js +0 -190
  161. package/dist/coValueState.js.map +0 -1
  162. package/dist/tests/coValueState.test.d.ts +0 -2
  163. package/dist/tests/coValueState.test.d.ts.map +0 -1
  164. package/dist/tests/coValueState.test.js.map +0 -1
  165. package/src/CoValuesStore.ts +0 -41
  166. 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 { CoValueState } from "../coValueState";
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
- describe("CoValueState", () => {
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 = new CoValueState(mockCoValueId);
26
+ const state = CoValueCore.fromID(mockCoValueId, mockNode);
33
27
 
34
28
  expect(state.id).toBe(mockCoValueId);
35
- expect(state.highLevelState).toBe("unknown");
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 = new CoValueState(mockCoValueId);
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.highLevelState).toBe("loading");
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 mockCoValue = createMockCoValueCore(mockCoValueId);
61
- const state = new CoValueState(mockCoValueId);
62
- state.internalMarkMagicallyAvailable(mockCoValue);
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.highLevelState).toBe("available");
66
- expect(state.core).toBe(mockCoValue);
67
- await expect(state.getCoValue()).resolves.toEqual(mockCoValue);
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 mockCoValue = createMockCoValueCore(mockCoValueId);
77
- const state = new CoValueState(mockCoValueId);
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.getCoValue();
90
+ const stateValuePromise = state.waitForAvailableOrUnavailable();
95
91
 
96
- state.internalMarkMagicallyAvailable(mockCoValue);
92
+ state.internalMarkMagicallyAvailable(mockVerified);
97
93
 
98
- const result = await state.getCoValue();
99
- expect(result).toBe(mockCoValue);
100
- await expect(stateValuePromise).resolves.toBe(mockCoValue);
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 = new CoValueState(mockCoValueId);
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.highLevelState).toBe("unavailable");
148
- await expect(state.getCoValue()).resolves.toBe("unavailable");
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 = new CoValueState(mockCoValueId);
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(createMockCoValueCore(mockCoValueId));
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.highLevelState).toBe("available");
179
- await expect(state.getCoValue()).resolves.toEqual({ id: mockCoValueId });
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 mockCoValue = createMockCoValueCore(mockCoValueId);
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(mockCoValue, "peer1");
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 = new CoValueState(mockCoValueId);
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
- ...mockCoValue.knownState(),
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 mockCoValue = createMockCoValueCore(mockCoValueId);
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(mockCoValue, "peer2");
251
+ state.markAvailable({} as CoValueHeader, "peer2");
247
252
  },
248
253
  );
249
254
 
250
255
  peer1.closed = true;
251
256
 
252
- const state = new CoValueState(mockCoValueId);
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.highLevelState).toBe("available");
262
- await expect(state.getCoValue()).resolves.toEqual({ id: mockCoValueId });
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 = new CoValueState(mockCoValueId);
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.highLevelState).toBe("unavailable");
287
- await expect(state.getCoValue()).resolves.toEqual("unavailable");
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 createMockCoValueCore(mockCoValueId: string) {
323
+ function createMockCoValueVerified(mockCoValueId: string) {
315
324
  // Setting the knownState as part of the prototype to simplify
316
325
  // the equality checks
317
- const mockCoValue = Object.create({
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
- mockCoValue.id = mockCoValueId;
326
- return mockCoValue as unknown as CoValueCore;
336
+ return mockCoValueVerified as unknown as VerifiedState;
327
337
  }
@@ -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
- randomAnonymousAccountAndSessionID,
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 = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
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 = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
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 = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
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 = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
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.account);
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.account);
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.account);
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.account);
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.account);
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.account);
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.account);
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.coValuesStore.coValues.delete(map.id);
495
- expect(node2.node.coValuesStore.get(map.id)?.highLevelState).toBe(
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 = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
918
+ const node = nodeWithRandomAgentAndSessionID();
922
919
  const group = node.createGroup();
923
- const account = new LocalNode(
924
- ...randomAnonymousAccountAndSessionID(),
925
- Crypto,
926
- ).account;
920
+ const [agent2] = randomAgentAndSessionID();
927
921
 
928
- group.addMember(account, "writer");
929
- expect(group.roleOf(account.id as RawAccountID)).toEqual("writer");
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 = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
927
+ const node = nodeWithRandomAgentAndSessionID();
934
928
  const group = node.createGroup();
935
- const account = new LocalNode(
936
- ...randomAnonymousAccountAndSessionID(),
937
- Crypto,
938
- ).account;
929
+ const [agent2] = randomAgentAndSessionID();
939
930
 
940
- expect(group.roleOf(account.id as RawAccountID)).toEqual(undefined);
931
+ expect(group.roleOfInternal(agent2.id)).toEqual(undefined);
941
932
  });
942
933
 
943
934
  test("revoked roles return undefined", () => {
944
- const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
935
+ const node = nodeWithRandomAgentAndSessionID();
945
936
  const group = node.createGroup();
946
- const account = new LocalNode(
947
- ...randomAnonymousAccountAndSessionID(),
948
- Crypto,
949
- ).account;
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 = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
945
+ const node = nodeWithRandomAgentAndSessionID();
958
946
  const group = node.createGroup();
959
- const account = new LocalNode(
960
- ...randomAnonymousAccountAndSessionID(),
961
- Crypto,
962
- ).account;
947
+ const [agent2, sessionID2] = randomAgentAndSessionID();
963
948
 
964
949
  group.addMemberInternal("everyone", "reader");
965
- expect(group.roleOf(account.id as RawAccountID)).toEqual("reader");
950
+ expect(group.roleOfInternal(agent2.id)).toEqual("reader");
966
951
  });
967
952
 
968
953
  test("account role overrides everyone role", () => {
969
- const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
954
+ const node = nodeWithRandomAgentAndSessionID();
970
955
  const group = node.createGroup();
971
- const account = new LocalNode(
972
- ...randomAnonymousAccountAndSessionID(),
973
- Crypto,
974
- ).account;
956
+ const [agent2, sessionID2] = randomAgentAndSessionID();
975
957
 
976
958
  group.addMemberInternal("everyone", "writer");
977
- group.addMember(account, "reader");
978
- expect(group.roleOf(account.id as RawAccountID)).toEqual("reader");
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 = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
964
+ const node = nodeWithRandomAgentAndSessionID();
983
965
  const group = node.createGroup();
984
- const account = new LocalNode(
985
- ...randomAnonymousAccountAndSessionID(),
986
- Crypto,
987
- ).account;
966
+ const [agent2, sessionID2] = randomAgentAndSessionID();
988
967
 
989
968
  group.addMemberInternal("everyone", "reader");
990
- group.addMember(account, "writer");
969
+ group.addMember(agent2, "writer");
991
970
  group.removeMemberInternal("everyone");
992
- expect(group.roleOf(account.id as RawAccountID)).toEqual("writer");
993
- expect(group.roleOf("123" as RawAccountID)).toEqual(undefined);
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 = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
976
+ const node = nodeWithRandomAgentAndSessionID();
998
977
  const group = node.createGroup();
999
- const account = new LocalNode(
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(account, "reader");
984
+ group.addMember(agent2, "reader");
1009
985
 
1010
- expect(group.roleOf(account.id as RawAccountID)).toEqual("writer");
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, RawControlledAccount } from "../exports";
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.account as RawControlledAccount;
62
+ const account = node.expectCurrentAccount("relatedKnownCoValues");
68
63
  const profileID = account.get("profile");
69
64
  const profile = profileID && node.expectCoValueLoaded(profileID);
70
65
  return {