cojson 0.18.5 → 0.18.7

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 (103) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +18 -0
  3. package/dist/coValueContentMessage.d.ts +2 -0
  4. package/dist/coValueContentMessage.d.ts.map +1 -1
  5. package/dist/coValueContentMessage.js +7 -0
  6. package/dist/coValueContentMessage.js.map +1 -1
  7. package/dist/coValueCore/SessionMap.d.ts +2 -2
  8. package/dist/coValueCore/SessionMap.d.ts.map +1 -1
  9. package/dist/coValueCore/SessionMap.js +2 -4
  10. package/dist/coValueCore/SessionMap.js.map +1 -1
  11. package/dist/coValueCore/branching.d.ts +35 -13
  12. package/dist/coValueCore/branching.d.ts.map +1 -1
  13. package/dist/coValueCore/branching.js +55 -37
  14. package/dist/coValueCore/branching.js.map +1 -1
  15. package/dist/coValueCore/coValueCore.d.ts +15 -7
  16. package/dist/coValueCore/coValueCore.d.ts.map +1 -1
  17. package/dist/coValueCore/coValueCore.js +126 -35
  18. package/dist/coValueCore/coValueCore.js.map +1 -1
  19. package/dist/coValueCore/verifiedState.d.ts +4 -2
  20. package/dist/coValueCore/verifiedState.d.ts.map +1 -1
  21. package/dist/coValueCore/verifiedState.js +6 -4
  22. package/dist/coValueCore/verifiedState.js.map +1 -1
  23. package/dist/coValues/coList.d.ts +8 -2
  24. package/dist/coValues/coList.d.ts.map +1 -1
  25. package/dist/coValues/coList.js +95 -58
  26. package/dist/coValues/coList.js.map +1 -1
  27. package/dist/coValues/coMap.d.ts +2 -2
  28. package/dist/coValues/coMap.d.ts.map +1 -1
  29. package/dist/coValues/coMap.js +8 -8
  30. package/dist/coValues/coMap.js.map +1 -1
  31. package/dist/coValues/group.d.ts.map +1 -1
  32. package/dist/coValues/group.js +14 -1
  33. package/dist/coValues/group.js.map +1 -1
  34. package/dist/config.d.ts +6 -0
  35. package/dist/config.d.ts.map +1 -1
  36. package/dist/config.js +8 -0
  37. package/dist/config.js.map +1 -1
  38. package/dist/crypto/PureJSCrypto.d.ts.map +1 -1
  39. package/dist/crypto/PureJSCrypto.js +14 -6
  40. package/dist/crypto/PureJSCrypto.js.map +1 -1
  41. package/dist/exports.d.ts +5 -4
  42. package/dist/exports.d.ts.map +1 -1
  43. package/dist/exports.js +3 -3
  44. package/dist/exports.js.map +1 -1
  45. package/dist/ids.d.ts +1 -0
  46. package/dist/ids.d.ts.map +1 -1
  47. package/dist/ids.js.map +1 -1
  48. package/dist/localNode.d.ts.map +1 -1
  49. package/dist/localNode.js +7 -2
  50. package/dist/localNode.js.map +1 -1
  51. package/dist/storage/storageAsync.d.ts.map +1 -1
  52. package/dist/storage/storageAsync.js +7 -4
  53. package/dist/storage/storageAsync.js.map +1 -1
  54. package/dist/storage/storageSync.d.ts.map +1 -1
  55. package/dist/storage/storageSync.js +7 -4
  56. package/dist/storage/storageSync.js.map +1 -1
  57. package/dist/sync.d.ts +1 -3
  58. package/dist/sync.d.ts.map +1 -1
  59. package/dist/sync.js +8 -18
  60. package/dist/sync.js.map +1 -1
  61. package/dist/tests/branching.test.js +166 -4
  62. package/dist/tests/branching.test.js.map +1 -1
  63. package/dist/tests/coList.test.js +367 -1
  64. package/dist/tests/coList.test.js.map +1 -1
  65. package/dist/tests/coValueCore.test.js +45 -1
  66. package/dist/tests/coValueCore.test.js.map +1 -1
  67. package/dist/tests/messagesTestUtils.d.ts +1 -1
  68. package/dist/tests/sync.content.test.d.ts +2 -0
  69. package/dist/tests/sync.content.test.d.ts.map +1 -0
  70. package/dist/tests/sync.content.test.js +120 -0
  71. package/dist/tests/sync.content.test.js.map +1 -0
  72. package/dist/tests/sync.load.test.js +4 -4
  73. package/dist/tests/sync.load.test.js.map +1 -1
  74. package/dist/tests/sync.storage.test.js +1 -1
  75. package/dist/tests/sync.storageAsync.test.js +6 -10
  76. package/dist/tests/sync.storageAsync.test.js.map +1 -1
  77. package/dist/tests/sync.upload.test.js +2 -2
  78. package/dist/tests/testUtils.d.ts +2 -2
  79. package/package.json +2 -2
  80. package/src/coValueContentMessage.ts +13 -0
  81. package/src/coValueCore/SessionMap.ts +2 -2
  82. package/src/coValueCore/branching.ts +105 -60
  83. package/src/coValueCore/coValueCore.ts +163 -41
  84. package/src/coValueCore/verifiedState.ts +8 -0
  85. package/src/coValues/coList.ts +129 -78
  86. package/src/coValues/coMap.ts +10 -12
  87. package/src/coValues/group.ts +14 -1
  88. package/src/config.ts +9 -0
  89. package/src/crypto/PureJSCrypto.ts +25 -13
  90. package/src/exports.ts +13 -2
  91. package/src/ids.ts +1 -0
  92. package/src/localNode.ts +8 -2
  93. package/src/storage/storageAsync.ts +8 -5
  94. package/src/storage/storageSync.ts +8 -4
  95. package/src/sync.ts +8 -32
  96. package/src/tests/branching.test.ts +255 -4
  97. package/src/tests/coList.test.ts +529 -1
  98. package/src/tests/coValueCore.test.ts +62 -2
  99. package/src/tests/sync.content.test.ts +153 -0
  100. package/src/tests/sync.load.test.ts +4 -4
  101. package/src/tests/sync.storage.test.ts +1 -1
  102. package/src/tests/sync.storageAsync.test.ts +9 -12
  103. package/src/tests/sync.upload.test.ts +2 -2
@@ -0,0 +1,153 @@
1
+ import { beforeEach, describe, expect, test } from "vitest";
2
+
3
+ import { SyncMessagesLog, TEST_NODE_CONFIG, setupTestNode } from "./testUtils";
4
+
5
+ // We want to simulate a real world communication that happens asynchronously
6
+ TEST_NODE_CONFIG.withAsyncPeers = true;
7
+
8
+ describe("handling content messages", () => {
9
+ beforeEach(async () => {
10
+ SyncMessagesLog.clear();
11
+ });
12
+
13
+ test("dependencies are included when syncing new content to clients", async () => {
14
+ /*
15
+ * Initial Setup:
16
+ * core <-- edge <-- client1
17
+ */
18
+ const core = setupTestNode();
19
+
20
+ const edge = setupTestNode();
21
+ edge.connectToSyncServer({
22
+ ourName: "edge",
23
+ syncServerName: "core",
24
+ syncServer: core.node,
25
+ });
26
+
27
+ const client1 = setupTestNode();
28
+ client1.connectToSyncServer({
29
+ ourName: "client1",
30
+ syncServerName: "edge",
31
+ syncServer: edge.node,
32
+ });
33
+
34
+ // Create a map with a dependency on the client.
35
+ // Everythig will sync all the way back to core.
36
+ const group = client1.node.createGroup();
37
+ const map = group.createMap();
38
+ map.set("hello", "world", "trusting");
39
+ await map.core.waitForSync();
40
+
41
+ /*
42
+ * Add another client:
43
+ *
44
+ * |-- client1
45
+ * core <-- edge <--|
46
+ * |-- client2
47
+ *
48
+ */
49
+ const client2 = setupTestNode();
50
+ const { peerStateOnServer: client2PeerStateOnEdge } =
51
+ client2.connectToSyncServer({
52
+ ourName: "client2",
53
+ syncServerName: "edge",
54
+ syncServer: edge.node,
55
+ });
56
+
57
+ client2PeerStateOnEdge.setOptimisticKnownState(map.core.id, {
58
+ id: map.core.id,
59
+ header: false,
60
+ sessions: {},
61
+ });
62
+
63
+ // Update the map on client1.
64
+ // This should sync the map AND its dependencies to the new client.
65
+ map.set("hello2", "world2", "trusting");
66
+ await map.core.waitForSync();
67
+
68
+ const syncMessages = SyncMessagesLog.getMessages({
69
+ Group: group.core,
70
+ Map: map.core,
71
+ });
72
+ expect(
73
+ syncMessages.some((msg) =>
74
+ msg.startsWith("edge -> client2 | CONTENT Map"),
75
+ ),
76
+ ).toBe(true);
77
+ expect(
78
+ syncMessages.some((msg) =>
79
+ msg.startsWith("edge -> client2 | CONTENT Group"),
80
+ ),
81
+ ).toBe(true);
82
+ });
83
+
84
+ test("dependencies are excluded when syncing new content to servers", async () => {
85
+ /*
86
+ * Initial Setup:
87
+ * core1 <-- edge <-- client
88
+ */
89
+ const core1 = setupTestNode();
90
+
91
+ const edge = setupTestNode();
92
+ edge.connectToSyncServer({
93
+ ourName: "edge",
94
+ syncServerName: "core1",
95
+ syncServer: core1.node,
96
+ });
97
+
98
+ const client = setupTestNode();
99
+ client.connectToSyncServer({
100
+ ourName: "client",
101
+ syncServerName: "edge",
102
+ syncServer: edge.node,
103
+ });
104
+
105
+ // Create a map with a dependency on the client.
106
+ // Everythig will sync all the way back to core1.
107
+ const group = client.node.createGroup();
108
+ const map = group.createMap();
109
+ map.set("hello", "world", "trusting");
110
+ await map.core.waitForSync();
111
+
112
+ /*
113
+ * Add another core:
114
+ *
115
+ * core1 <--
116
+ * |
117
+ * |-- edge <-- client
118
+ * |
119
+ * core2 <--
120
+ */
121
+ const core2 = setupTestNode();
122
+ const { peerState: core2PeerStateOnEdge } = edge.connectToSyncServer({
123
+ ourName: "edge",
124
+ syncServerName: "core2",
125
+ syncServer: core2.node,
126
+ skipReconciliation: true,
127
+ });
128
+
129
+ core2PeerStateOnEdge.setOptimisticKnownState(map.core.id, {
130
+ id: map.core.id,
131
+ header: false,
132
+ sessions: {},
133
+ });
134
+
135
+ // Update the map on the client.
136
+ // This should sync ONLY the map back to both cores.
137
+ map.set("hello2", "world2", "trusting");
138
+ await map.core.waitForSync();
139
+
140
+ const syncMessages = SyncMessagesLog.getMessages({
141
+ Group: group.core,
142
+ Map: map.core,
143
+ });
144
+ expect(
145
+ syncMessages.some((msg) => msg.startsWith("edge -> core2 | CONTENT Map")),
146
+ ).toBe(true);
147
+ expect(
148
+ syncMessages.some((msg) =>
149
+ msg.startsWith("edge -> core2 | CONTENT Group"),
150
+ ),
151
+ ).toBe(false);
152
+ });
153
+ });
@@ -171,10 +171,10 @@ describe("loading coValues from server", () => {
171
171
  [
172
172
  "client -> server | LOAD Branch sessions: empty",
173
173
  "server -> client | CONTENT Group header: true new: After: 0 New: 5",
174
- "server -> client | CONTENT Map header: true new: After: 0 New: 2",
174
+ "server -> client | CONTENT Map header: true new: After: 0 New: 3",
175
175
  "server -> client | CONTENT Branch header: true new: After: 0 New: 2",
176
176
  "client -> server | KNOWN Group sessions: header/5",
177
- "client -> server | KNOWN Map sessions: header/2",
177
+ "client -> server | KNOWN Map sessions: header/3",
178
178
  "client -> server | KNOWN Branch sessions: header/2",
179
179
  ]
180
180
  `);
@@ -507,9 +507,9 @@ describe("loading coValues from server", () => {
507
507
  connected: true,
508
508
  });
509
509
 
510
- await loadCoValueOrFail(client.node, largeMap.id);
510
+ const mapOnClient = await loadCoValueOrFail(client.node, largeMap.id);
511
511
 
512
- await largeMap.core.waitForSync();
512
+ await mapOnClient.core.waitForFullStreaming();
513
513
 
514
514
  expect(
515
515
  SyncMessagesLog.getMessages({
@@ -238,7 +238,7 @@ describe("client with storage syncs with server", () => {
238
238
  [
239
239
  "client -> storage | LOAD Branch sessions: empty",
240
240
  "storage -> client | CONTENT Group header: true new: After: 0 New: 3",
241
- "storage -> client | CONTENT Map header: true new: After: 0 New: 2",
241
+ "storage -> client | CONTENT Map header: true new: After: 0 New: 3",
242
242
  "storage -> client | CONTENT Branch header: true new: After: 0 New: 2",
243
243
  ]
244
244
  `);
@@ -14,12 +14,15 @@ import { getDbPath } from "./testStorage";
14
14
  // We want to simulate a real world communication that happens asynchronously
15
15
  TEST_NODE_CONFIG.withAsyncPeers = true;
16
16
 
17
+ beforeEach(async () => {
18
+ setMaxRecommendedTxSize(100 * 1024);
19
+ });
20
+
17
21
  describe("client with storage syncs with server", () => {
18
22
  let jazzCloud: ReturnType<typeof setupTestNode>;
19
23
 
20
24
  beforeEach(async () => {
21
25
  vi.resetAllMocks();
22
- setMaxRecommendedTxSize(100 * 1024);
23
26
  SyncMessagesLog.clear();
24
27
  jazzCloud = setupTestNode({
25
28
  isSyncServer: true,
@@ -434,6 +437,8 @@ describe("client syncs with a server with storage", () => {
434
437
  });
435
438
 
436
439
  test("large coValue streaming from cold server", async () => {
440
+ setMaxRecommendedTxSize(1000);
441
+
437
442
  const server = setupTestNode({
438
443
  isSyncServer: true,
439
444
  });
@@ -470,8 +475,6 @@ describe("client syncs with a server with storage", () => {
470
475
 
471
476
  await largeMap.core.waitForSync();
472
477
 
473
- SyncMessagesLog.clear();
474
-
475
478
  server.restart();
476
479
 
477
480
  server.addStorage({
@@ -491,9 +494,10 @@ describe("client syncs with a server with storage", () => {
491
494
  storage,
492
495
  });
493
496
 
494
- const mapOnClient2 = await loadCoValueOrFail(client.node, largeMap.id);
497
+ SyncMessagesLog.clear();
495
498
 
496
- await mapOnClient2.core.waitForSync();
499
+ const mapOnClient2 = await loadCoValueOrFail(client.node, largeMap.id);
500
+ await mapOnClient2.core.waitForFullStreaming();
497
501
 
498
502
  expect(
499
503
  SyncMessagesLog.getMessages({
@@ -516,13 +520,6 @@ describe("client syncs with a server with storage", () => {
516
520
  "storage -> client | CONTENT Map header: true new: After: 7 New: 1",
517
521
  "storage -> client | CONTENT Map header: true new: After: 8 New: 1",
518
522
  "storage -> client | CONTENT Map header: true new: After: 9 New: 1",
519
- "storage -> client | CONTENT Map header: true new: After: 10 New: 0",
520
- "server -> storage | LOAD Group sessions: empty",
521
- "storage -> server | CONTENT Group header: true new: After: 0 New: 5",
522
- "server -> client | KNOWN Group sessions: header/5",
523
- "server -> storage | LOAD Map sessions: empty",
524
- "storage -> server | CONTENT Map header: true new: After: 0 New: 1 expectContentUntil: header/10",
525
- "server -> client | KNOWN Map sessions: header/10",
526
523
  ]
527
524
  `);
528
525
  });
@@ -92,11 +92,11 @@ describe("client to server upload", () => {
92
92
  "server -> client | CONTENT Map header: true new: After: 0 New: 2",
93
93
  "client -> server | KNOWN Group sessions: header/5",
94
94
  "client -> server | KNOWN Map sessions: header/2",
95
- "client -> server | LOAD Branch sessions: empty",
96
- "server -> client | KNOWN Branch sessions: empty",
97
95
  "client -> server | CONTENT Branch header: true new: After: 0 New: 1",
96
+ "client -> server | CONTENT Map header: false new: After: 0 New: 1",
98
97
  "client -> server | CONTENT Branch header: false new: After: 1 New: 1",
99
98
  "server -> client | KNOWN Branch sessions: header/1",
99
+ "server -> client | KNOWN Map sessions: header/3",
100
100
  "server -> client | KNOWN Branch sessions: header/2",
101
101
  ]
102
102
  `);