cojson 0.13.18 → 0.13.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 (49) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +9 -0
  3. package/dist/PeerState.d.ts +1 -1
  4. package/dist/PeerState.d.ts.map +1 -1
  5. package/dist/PeerState.js +7 -36
  6. package/dist/PeerState.js.map +1 -1
  7. package/dist/coValueCore/coValueCore.d.ts +1 -1
  8. package/dist/coValueCore/coValueCore.d.ts.map +1 -1
  9. package/dist/coValueCore/coValueCore.js +11 -7
  10. package/dist/coValueCore/coValueCore.js.map +1 -1
  11. package/dist/localNode.d.ts.map +1 -1
  12. package/dist/localNode.js +10 -5
  13. package/dist/localNode.js.map +1 -1
  14. package/dist/streamUtils.d.ts +5 -5
  15. package/dist/streamUtils.d.ts.map +1 -1
  16. package/dist/streamUtils.js +5 -20
  17. package/dist/streamUtils.js.map +1 -1
  18. package/dist/sync.d.ts +6 -4
  19. package/dist/sync.d.ts.map +1 -1
  20. package/dist/sync.js +35 -19
  21. package/dist/sync.js.map +1 -1
  22. package/dist/tests/PeerState.test.js +0 -31
  23. package/dist/tests/PeerState.test.js.map +1 -1
  24. package/dist/tests/SyncStateManager.test.js +41 -6
  25. package/dist/tests/SyncStateManager.test.js.map +1 -1
  26. package/dist/tests/account.test.js +16 -0
  27. package/dist/tests/account.test.js.map +1 -1
  28. package/dist/tests/group.test.js.map +1 -1
  29. package/dist/tests/sync.auth.test.js +64 -15
  30. package/dist/tests/sync.auth.test.js.map +1 -1
  31. package/dist/tests/sync.load.test.js +2 -2
  32. package/dist/tests/sync.load.test.js.map +1 -1
  33. package/dist/tests/testUtils.d.ts +11 -2
  34. package/dist/tests/testUtils.d.ts.map +1 -1
  35. package/dist/tests/testUtils.js +27 -30
  36. package/dist/tests/testUtils.js.map +1 -1
  37. package/package.json +1 -1
  38. package/src/PeerState.ts +8 -40
  39. package/src/coValueCore/coValueCore.ts +14 -14
  40. package/src/localNode.ts +13 -6
  41. package/src/streamUtils.ts +7 -34
  42. package/src/sync.ts +51 -22
  43. package/src/tests/PeerState.test.ts +0 -37
  44. package/src/tests/SyncStateManager.test.ts +56 -6
  45. package/src/tests/account.test.ts +24 -0
  46. package/src/tests/group.test.ts +0 -1
  47. package/src/tests/sync.auth.test.ts +79 -21
  48. package/src/tests/sync.load.test.ts +3 -2
  49. package/src/tests/testUtils.ts +35 -34
@@ -1,16 +1,11 @@
1
1
  import { assert, beforeEach, describe, expect, test } from "vitest";
2
2
 
3
- import { expectMap } from "../coValue";
4
- import { expectAccount } from "../coValues/account";
5
3
  import { WasmCrypto } from "../crypto/WasmCrypto";
6
4
  import { LocalNode } from "../localNode";
7
- import { toSimplifiedMessages } from "./messagesTestUtils";
8
5
  import {
9
6
  SyncMessagesLog,
10
7
  getSyncServerConnectedPeer,
11
- loadCoValueOrFail,
12
8
  setupTestNode,
13
- waitFor,
14
9
  } from "./testUtils";
15
10
 
16
11
  const Crypto = await WasmCrypto.create();
@@ -27,7 +22,7 @@ describe("LocalNode auth sync", () => {
27
22
  peerId: "new-account",
28
23
  });
29
24
 
30
- const { accountID, node } = await LocalNode.withNewlyCreatedAccount({
25
+ const { node } = await LocalNode.withNewlyCreatedAccount({
31
26
  creationProps: {
32
27
  name: "new-account",
33
28
  },
@@ -128,6 +123,7 @@ describe("LocalNode auth sync", () => {
128
123
  test("authenticate to an existing account", async () => {
129
124
  const { peer: newAccountPeer } = getSyncServerConnectedPeer({
130
125
  peerId: "new-account",
126
+ ourName: "creation-node",
131
127
  });
132
128
 
133
129
  const { accountID, accountSecret } =
@@ -141,10 +137,9 @@ describe("LocalNode auth sync", () => {
141
137
 
142
138
  const { peer: existingAccountPeer } = getSyncServerConnectedPeer({
143
139
  peerId: "existing-account",
140
+ ourName: "auth-node",
144
141
  });
145
142
 
146
- SyncMessagesLog.clear();
147
-
148
143
  const node = await LocalNode.withLoadedAccount({
149
144
  accountID,
150
145
  accountSecret,
@@ -169,19 +164,82 @@ describe("LocalNode auth sync", () => {
169
164
  }),
170
165
  ).toMatchInlineSnapshot(`
171
166
  [
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",
167
+ "creation-node -> server | CONTENT Account header: true new: After: 0 New: 4",
168
+ "auth-node -> server | LOAD Account sessions: empty",
169
+ "server -> creation-node | KNOWN Account sessions: header/4",
170
+ "creation-node -> server | CONTENT ProfileGroup header: true new: After: 0 New: 5",
171
+ "server -> auth-node | CONTENT Account header: true new: After: 0 New: 4",
172
+ "server -> creation-node | KNOWN ProfileGroup sessions: header/5",
173
+ "creation-node -> server | CONTENT Profile header: true new: After: 0 New: 1",
174
+ "auth-node -> server | KNOWN Account sessions: header/4",
175
+ "server -> creation-node | KNOWN Profile sessions: header/1",
176
+ "auth-node -> server | LOAD Profile sessions: empty",
177
+ "server -> auth-node | CONTENT ProfileGroup header: true new: After: 0 New: 5",
178
+ "auth-node -> server | KNOWN ProfileGroup sessions: header/5",
179
+ "server -> auth-node | CONTENT Profile header: true new: After: 0 New: 1",
180
+ "auth-node -> server | KNOWN Profile sessions: header/1",
181
+ ]
182
+ `);
183
+ });
184
+
185
+ test("authenticate to an existing account after immediately close the creation node", async () => {
186
+ const { peer: newAccountPeer } = getSyncServerConnectedPeer({
187
+ peerId: "new-account",
188
+ ourName: "creation-node",
189
+ });
190
+
191
+ const {
192
+ accountID,
193
+ accountSecret,
194
+ node: creationNode,
195
+ } = await LocalNode.withNewlyCreatedAccount({
196
+ creationProps: {
197
+ name: "new-account",
198
+ },
199
+ peersToLoadFrom: [newAccountPeer],
200
+ crypto: Crypto,
201
+ });
202
+
203
+ creationNode.gracefulShutdown();
204
+
205
+ const { peer: existingAccountPeer } = getSyncServerConnectedPeer({
206
+ peerId: "existing-account",
207
+ ourName: "auth-node",
208
+ });
209
+
210
+ const node = await LocalNode.withLoadedAccount({
211
+ accountID,
212
+ accountSecret,
213
+ peersToLoadFrom: [existingAccountPeer],
214
+ sessionID: undefined,
215
+ crypto: Crypto,
216
+ });
217
+
218
+ const account = node.expectCurrentAccount("after login");
219
+ const profile = creationNode.getCoValue(account.get("profile")!);
220
+
221
+ assert(profile.isAvailable());
222
+
223
+ expect(account.id).toBe(accountID);
224
+ expect(node.agentSecret).toBe(accountSecret);
225
+
226
+ expect(
227
+ SyncMessagesLog.getMessages({
228
+ Account: account.core,
229
+ Profile: profile,
230
+ ProfileGroup: profile.getGroup().core,
231
+ }),
232
+ ).toMatchInlineSnapshot(`
233
+ [
234
+ "creation-node -> server | CONTENT Account header: true new: After: 0 New: 4",
235
+ "auth-node -> server | LOAD Account sessions: empty",
236
+ "server -> creation-node | KNOWN Account sessions: header/4",
237
+ "server -> auth-node | CONTENT Account header: true new: After: 0 New: 4",
238
+ "auth-node -> server | KNOWN Account sessions: header/4",
239
+ "auth-node -> server | LOAD Profile sessions: empty",
240
+ "server -> auth-node | KNOWN Profile sessions: empty",
241
+ "auth-node -> server | LOAD Profile sessions: empty",
242
+ "server -> auth-node | KNOWN Profile sessions: empty",
185
243
  ]
186
244
  `);
187
245
  });
@@ -197,8 +197,6 @@ describe("loading coValues from server", () => {
197
197
  await map.core.waitForSync();
198
198
  await mapOnClient.core.waitForSync();
199
199
 
200
- expect(mapOnClient.get("fromServer")).toEqual("updated");
201
- expect(mapOnClient.get("fromClient")).toEqual("updated");
202
200
  expect(
203
201
  SyncMessagesLog.getMessages({
204
202
  Group: group.core,
@@ -217,6 +215,9 @@ describe("loading coValues from server", () => {
217
215
  "client -> server | KNOWN Map sessions: header/3",
218
216
  ]
219
217
  `);
218
+
219
+ expect(mapOnClient.get("fromServer")).toEqual("updated");
220
+ expect(mapOnClient.get("fromClient")).toEqual("updated");
220
221
  });
221
222
 
222
223
  test("wrong optimistic known state should be corrected", async () => {
@@ -448,6 +448,31 @@ export function getSyncServerConnectedPeer(opts: {
448
448
  };
449
449
  }
450
450
 
451
+ export function createMockStoragePeer(opts: {
452
+ ourName?: string;
453
+ peerId: string;
454
+ }) {
455
+ const storage = createTestNode();
456
+
457
+ const { peer1, peer2 } = connectedPeersWithMessagesTracking({
458
+ peer1: { id: storage.getCurrentAgent().id, role: "storage" },
459
+ peer2: {
460
+ id: opts.peerId,
461
+ role: "client",
462
+ name: opts.ourName,
463
+ },
464
+ });
465
+
466
+ peer1.priority = 100;
467
+
468
+ storage.syncManager.addPeer(peer2);
469
+
470
+ return {
471
+ storage,
472
+ peer: peer1,
473
+ };
474
+ }
475
+
451
476
  export function setupTestNode(
452
477
  opts: {
453
478
  isSyncServer?: boolean;
@@ -485,26 +510,14 @@ export function setupTestNode(
485
510
  }
486
511
 
487
512
  function addStoragePeer(opts: { ourName?: string } = {}) {
488
- const storage = createTestNode();
489
-
490
- const { peer1, peer2 } = connectedPeersWithMessagesTracking({
491
- peer1: { id: storage.getCurrentAgent().id, role: "storage" },
492
- peer2: {
493
- id: node.getCurrentAgent().id,
494
- role: "client",
495
- name: opts.ourName,
496
- },
513
+ const { peer, storage } = createMockStoragePeer({
514
+ peerId: node.getCurrentAgent().id,
515
+ ourName: opts.ourName,
497
516
  });
498
517
 
499
- peer1.priority = 100;
500
-
501
- node.syncManager.addPeer(peer1);
502
- storage.syncManager.addPeer(peer2);
518
+ node.syncManager.addPeer(peer);
503
519
 
504
- return {
505
- storage,
506
- peer: node.syncManager.peers[peer1.id]!,
507
- };
520
+ return { peer, peerState: node.syncManager.peers[peer.id]!, storage };
508
521
  }
509
522
 
510
523
  if (opts.connected) {
@@ -575,26 +588,14 @@ export async function setupTestAccount(
575
588
  }
576
589
 
577
590
  function addStoragePeer(opts: { ourName?: string } = {}) {
578
- const storage = createTestNode();
579
-
580
- const { peer1, peer2 } = connectedPeersWithMessagesTracking({
581
- peer1: { id: storage.getCurrentAgent().id, role: "storage" },
582
- peer2: {
583
- id: ctx.node.getCurrentAgent().id,
584
- role: "client",
585
- name: opts.ourName,
586
- },
591
+ const { peer, storage } = createMockStoragePeer({
592
+ peerId: ctx.node.getCurrentAgent().id,
593
+ ourName: opts.ourName,
587
594
  });
588
595
 
589
- peer1.priority = 100;
590
-
591
- ctx.node.syncManager.addPeer(peer1);
592
- storage.syncManager.addPeer(peer2);
596
+ ctx.node.syncManager.addPeer(peer);
593
597
 
594
- return {
595
- storage,
596
- peer: ctx.node.syncManager.peers[peer1.id]!,
597
- };
598
+ return { peer, peerState: ctx.node.syncManager.peers[peer.id]!, storage };
598
599
  }
599
600
 
600
601
  if (opts.connected) {