cojson 0.13.16 → 0.13.17

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 (59) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +7 -0
  3. package/dist/coValue.d.ts +2 -0
  4. package/dist/coValue.d.ts.map +1 -1
  5. package/dist/coValue.js +1 -0
  6. package/dist/coValue.js.map +1 -1
  7. package/dist/coValueCore.d.ts +1 -0
  8. package/dist/coValueCore.d.ts.map +1 -1
  9. package/dist/coValueCore.js.map +1 -1
  10. package/dist/coValueState.d.ts.map +1 -1
  11. package/dist/coValueState.js +58 -96
  12. package/dist/coValueState.js.map +1 -1
  13. package/dist/coValues/coList.d.ts +7 -3
  14. package/dist/coValues/coList.d.ts.map +1 -1
  15. package/dist/coValues/coList.js +35 -12
  16. package/dist/coValues/coList.js.map +1 -1
  17. package/dist/coValues/coMap.d.ts +1 -0
  18. package/dist/coValues/coMap.d.ts.map +1 -1
  19. package/dist/coValues/coMap.js +2 -0
  20. package/dist/coValues/coMap.js.map +1 -1
  21. package/dist/coValues/coPlainText.d.ts.map +1 -1
  22. package/dist/coValues/coPlainText.js +1 -1
  23. package/dist/coValues/coPlainText.js.map +1 -1
  24. package/dist/coValues/coStream.d.ts +2 -1
  25. package/dist/coValues/coStream.d.ts.map +1 -1
  26. package/dist/coValues/coStream.js +2 -0
  27. package/dist/coValues/coStream.js.map +1 -1
  28. package/dist/coreToCoValue.d.ts +2 -1
  29. package/dist/coreToCoValue.d.ts.map +1 -1
  30. package/dist/localNode.d.ts.map +1 -1
  31. package/dist/localNode.js +21 -14
  32. package/dist/localNode.js.map +1 -1
  33. package/dist/tests/coList.test.js +119 -2
  34. package/dist/tests/coList.test.js.map +1 -1
  35. package/dist/tests/coMap.test.js +32 -2
  36. package/dist/tests/coMap.test.js.map +1 -1
  37. package/dist/tests/coStream.test.js +28 -2
  38. package/dist/tests/coStream.test.js.map +1 -1
  39. package/dist/tests/coValueState.test.js +10 -143
  40. package/dist/tests/coValueState.test.js.map +1 -1
  41. package/dist/tests/sync.load.test.js +59 -1
  42. package/dist/tests/sync.load.test.js.map +1 -1
  43. package/dist/tests/sync.mesh.test.js +48 -1
  44. package/dist/tests/sync.mesh.test.js.map +1 -1
  45. package/package.json +1 -1
  46. package/src/coValue.ts +3 -0
  47. package/src/coValueCore.ts +1 -0
  48. package/src/coValueState.ts +67 -122
  49. package/src/coValues/coList.ts +51 -23
  50. package/src/coValues/coMap.ts +4 -0
  51. package/src/coValues/coPlainText.ts +1 -2
  52. package/src/coValues/coStream.ts +3 -1
  53. package/src/localNode.ts +29 -18
  54. package/src/tests/coList.test.ts +184 -2
  55. package/src/tests/coMap.test.ts +54 -2
  56. package/src/tests/coStream.test.ts +56 -2
  57. package/src/tests/coValueState.test.ts +9 -207
  58. package/src/tests/sync.load.test.ts +78 -1
  59. package/src/tests/sync.mesh.test.ts +67 -0
@@ -45,6 +45,53 @@ describe("loading coValues from server", () => {
45
45
  `);
46
46
  });
47
47
 
48
+ test("unavailable coValue retry", async () => {
49
+ const client = setupTestNode();
50
+ const client2 = setupTestNode();
51
+
52
+ client2.connectToSyncServer({
53
+ ourName: "client2",
54
+ });
55
+
56
+ const group = client.node.createGroup();
57
+ const map = group.createMap();
58
+ map.set("hello", "world", "trusting");
59
+
60
+ const promise = loadCoValueOrFail(client2.node, map.id);
61
+
62
+ await new Promise((resolve) => setTimeout(resolve, 1));
63
+
64
+ client.connectToSyncServer();
65
+
66
+ const mapOnClient2 = await promise;
67
+
68
+ expect(mapOnClient2.get("hello")).toEqual("world");
69
+
70
+ expect(
71
+ SyncMessagesLog.getMessages({
72
+ Group: group.core,
73
+ Map: map.core,
74
+ }),
75
+ ).toMatchInlineSnapshot(`
76
+ [
77
+ "client2 -> server | LOAD Map sessions: empty",
78
+ "server -> client2 | KNOWN Map sessions: empty",
79
+ "client -> server | LOAD Group sessions: header/3",
80
+ "client -> server | LOAD Map sessions: header/1",
81
+ "server -> client | KNOWN Group sessions: empty",
82
+ "client -> server | CONTENT Group header: true new: After: 0 New: 3",
83
+ "server -> client | KNOWN Map sessions: empty",
84
+ "client -> server | CONTENT Map header: true new: After: 0 New: 1",
85
+ "server -> client | KNOWN Group sessions: header/3",
86
+ "server -> client | KNOWN Map sessions: header/1",
87
+ "server -> client2 | CONTENT Group header: true new: After: 0 New: 3",
88
+ "client2 -> server | KNOWN Group sessions: header/3",
89
+ "server -> client2 | CONTENT Map header: true new: After: 0 New: 1",
90
+ "client2 -> server | KNOWN Map sessions: header/1",
91
+ ]
92
+ `);
93
+ });
94
+
48
95
  test("coValue with parent groups loading", async () => {
49
96
  const client = setupTestNode({
50
97
  connected: true,
@@ -327,5 +374,35 @@ describe("loading coValues from server", () => {
327
374
  `);
328
375
  });
329
376
 
330
- test.todo("should mark the coValue as unavailable if the peer is closed");
377
+ test("should mark the coValue as unavailable if the peer is closed", async () => {
378
+ const client = setupTestNode();
379
+ const { peerState } = client.connectToSyncServer();
380
+
381
+ const group = jazzCloud.node.createGroup();
382
+ group.addMember("everyone", "writer");
383
+
384
+ const map = group.createMap({
385
+ test: "value",
386
+ });
387
+
388
+ const promise = client.node.load(map.id);
389
+
390
+ // Close the peer connection
391
+ peerState.gracefulShutdown();
392
+
393
+ expect(await promise).toEqual("unavailable");
394
+
395
+ expect(
396
+ SyncMessagesLog.getMessages({
397
+ Group: group.core,
398
+ Map: map.core,
399
+ }),
400
+ ).toMatchInlineSnapshot(`
401
+ [
402
+ "client -> server | LOAD Map sessions: empty",
403
+ "server -> client | CONTENT Group header: true new: After: 0 New: 5",
404
+ "server -> client | CONTENT Map header: true new: After: 0 New: 1",
405
+ ]
406
+ `);
407
+ });
331
408
  });
@@ -3,6 +3,7 @@ import { beforeEach, describe, expect, test, vi } from "vitest";
3
3
  import { expectMap } from "../coValue";
4
4
  import {
5
5
  SyncMessagesLog,
6
+ blockMessageTypeOnOutgoingPeer,
6
7
  loadCoValueOrFail,
7
8
  setupTestNode,
8
9
  waitFor,
@@ -322,4 +323,70 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
322
323
  ]
323
324
  `);
324
325
  });
326
+
327
+ test("load returns the coValue as soon as one of the peers return the content", async () => {
328
+ const client = setupTestNode();
329
+ const coreServer = setupTestNode({
330
+ isSyncServer: true,
331
+ });
332
+
333
+ const { peerOnServer } = client.connectToSyncServer({
334
+ syncServerName: "core",
335
+ });
336
+
337
+ const storage = setupTestNode();
338
+
339
+ const { peer: storagePeer } = client.connectToSyncServer({
340
+ syncServerName: "storage",
341
+ syncServer: storage.node,
342
+ });
343
+
344
+ storagePeer.priority = 100;
345
+
346
+ const group = coreServer.node.createGroup();
347
+ const map = group.createMap();
348
+
349
+ map.set("hello", "world", "trusting");
350
+
351
+ const { peerState } = storage.connectToSyncServer({
352
+ ourName: "storage-of-client",
353
+ syncServerName: "core",
354
+ });
355
+
356
+ await loadCoValueOrFail(storage.node, map.id);
357
+
358
+ peerState.gracefulShutdown();
359
+
360
+ SyncMessagesLog.clear();
361
+
362
+ await new Promise((resolve) => setTimeout(resolve, 100));
363
+
364
+ map.set("hello", "updated", "trusting");
365
+
366
+ // Block the content message from the core peer to simulate the delay on response
367
+ blockMessageTypeOnOutgoingPeer(peerOnServer, "content");
368
+
369
+ const mapOnClient = await loadCoValueOrFail(client.node, map.id);
370
+
371
+ expect(
372
+ SyncMessagesLog.getMessages({
373
+ Group: group.core,
374
+ Map: map.core,
375
+ }),
376
+ ).toMatchInlineSnapshot(`
377
+ [
378
+ "client -> storage | LOAD Map sessions: empty",
379
+ "storage -> client | CONTENT Group header: true new: After: 0 New: 3",
380
+ "client -> storage | KNOWN Group sessions: header/3",
381
+ "storage -> client | CONTENT Map header: true new: After: 0 New: 1",
382
+ "client -> core | CONTENT Group header: true new: After: 0 New: 3",
383
+ "client -> storage | KNOWN Map sessions: header/1",
384
+ "core -> client | KNOWN Group sessions: header/3",
385
+ "client -> core | LOAD Map sessions: header/1",
386
+ "client -> core | CONTENT Map header: true new: After: 0 New: 1",
387
+ ]
388
+ `);
389
+
390
+ expect(mapOnClient.get("hello")).toEqual("world");
391
+ });
325
392
  });