cojson 0.13.12 → 0.13.14

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 (64) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +12 -0
  3. package/dist/PeerState.d.ts +4 -6
  4. package/dist/PeerState.d.ts.map +1 -1
  5. package/dist/PeerState.js +30 -26
  6. package/dist/PeerState.js.map +1 -1
  7. package/dist/PriorityBasedMessageQueue.d.ts +2 -8
  8. package/dist/PriorityBasedMessageQueue.d.ts.map +1 -1
  9. package/dist/PriorityBasedMessageQueue.js +1 -17
  10. package/dist/PriorityBasedMessageQueue.js.map +1 -1
  11. package/dist/coValueCore.js +1 -1
  12. package/dist/coValueCore.js.map +1 -1
  13. package/dist/coValueState.d.ts.map +1 -1
  14. package/dist/coValueState.js +8 -19
  15. package/dist/coValueState.js.map +1 -1
  16. package/dist/localNode.d.ts.map +1 -1
  17. package/dist/localNode.js +2 -2
  18. package/dist/localNode.js.map +1 -1
  19. package/dist/streamUtils.d.ts.map +1 -1
  20. package/dist/streamUtils.js +1 -1
  21. package/dist/streamUtils.js.map +1 -1
  22. package/dist/sync.d.ts +11 -17
  23. package/dist/sync.d.ts.map +1 -1
  24. package/dist/sync.js +49 -91
  25. package/dist/sync.js.map +1 -1
  26. package/dist/tests/PeerState.test.js +27 -14
  27. package/dist/tests/PeerState.test.js.map +1 -1
  28. package/dist/tests/PriorityBasedMessageQueue.test.js +5 -33
  29. package/dist/tests/PriorityBasedMessageQueue.test.js.map +1 -1
  30. package/dist/tests/SyncStateManager.test.js +5 -9
  31. package/dist/tests/SyncStateManager.test.js.map +1 -1
  32. package/dist/tests/sync.load.test.js +21 -17
  33. package/dist/tests/sync.load.test.js.map +1 -1
  34. package/dist/tests/sync.mesh.test.js +46 -18
  35. package/dist/tests/sync.mesh.test.js.map +1 -1
  36. package/dist/tests/sync.peerReconciliation.test.js +13 -15
  37. package/dist/tests/sync.peerReconciliation.test.js.map +1 -1
  38. package/dist/tests/sync.storage.test.js +13 -9
  39. package/dist/tests/sync.storage.test.js.map +1 -1
  40. package/dist/tests/sync.test.js +16 -28
  41. package/dist/tests/sync.test.js.map +1 -1
  42. package/dist/tests/sync.upload.test.js +13 -13
  43. package/dist/tests/testUtils.d.ts +1 -0
  44. package/dist/tests/testUtils.d.ts.map +1 -1
  45. package/dist/tests/testUtils.js +1 -0
  46. package/dist/tests/testUtils.js.map +1 -1
  47. package/package.json +1 -1
  48. package/src/PeerState.ts +33 -37
  49. package/src/PriorityBasedMessageQueue.ts +2 -30
  50. package/src/coValueCore.ts +1 -1
  51. package/src/coValueState.ts +13 -21
  52. package/src/localNode.ts +4 -2
  53. package/src/streamUtils.ts +2 -2
  54. package/src/sync.ts +58 -103
  55. package/src/tests/PeerState.test.ts +28 -14
  56. package/src/tests/PriorityBasedMessageQueue.test.ts +5 -39
  57. package/src/tests/SyncStateManager.test.ts +4 -12
  58. package/src/tests/sync.load.test.ts +21 -17
  59. package/src/tests/sync.mesh.test.ts +46 -18
  60. package/src/tests/sync.peerReconciliation.test.ts +13 -25
  61. package/src/tests/sync.storage.test.ts +13 -9
  62. package/src/tests/sync.test.ts +16 -30
  63. package/src/tests/sync.upload.test.ts +13 -13
  64. package/src/tests/testUtils.ts +1 -0
@@ -2,11 +2,12 @@ import { describe, expect, test, vi } from "vitest";
2
2
  import { PeerState } from "../PeerState.js";
3
3
  import { CO_VALUE_PRIORITY } from "../priority.js";
4
4
  import { CoValueKnownState, Peer, SyncMessage } from "../sync.js";
5
+ import { waitFor } from "./testUtils.js";
5
6
 
6
7
  function setup() {
7
8
  const mockPeer: Peer = {
8
9
  id: "test-peer",
9
- role: "peer",
10
+ role: "client",
10
11
  priority: 1,
11
12
  crashOnClose: false,
12
13
  incoming: (async function* () {})(),
@@ -62,13 +63,19 @@ describe("PeerState", () => {
62
63
  });
63
64
  });
64
65
 
65
- const message1 = peerState.pushOutgoingMessage({
66
+ peerState.pushOutgoingMessage({
66
67
  action: "content",
67
68
  id: "co_z1",
68
69
  new: {},
69
70
  priority: CO_VALUE_PRIORITY.HIGH,
70
71
  });
71
- const message2 = peerState.pushOutgoingMessage({
72
+ peerState.pushOutgoingMessage({
73
+ action: "content",
74
+ id: "co_z1",
75
+ new: {},
76
+ priority: CO_VALUE_PRIORITY.HIGH,
77
+ });
78
+ peerState.pushOutgoingMessage({
72
79
  action: "content",
73
80
  id: "co_z1",
74
81
  new: {},
@@ -77,14 +84,21 @@ describe("PeerState", () => {
77
84
 
78
85
  peerState.gracefulShutdown();
79
86
 
80
- await Promise.allSettled([message1, message2]);
87
+ await waitFor(() => {
88
+ expect(peerState.isProcessing()).toBe(false);
89
+ });
81
90
 
82
- await expect(message1).resolves.toBe(undefined);
83
- await expect(message2).resolves.toBe(undefined);
91
+ expect(mockPeer.outgoing.push).toHaveBeenCalledTimes(1);
84
92
  });
85
93
 
86
94
  test("should schedule outgoing messages based on their priority", async () => {
87
- const { peerState } = setup();
95
+ const { peerState, mockPeer } = setup();
96
+
97
+ mockPeer.outgoing.push = vi.fn().mockImplementation((message) => {
98
+ return new Promise<void>((resolve) => {
99
+ setTimeout(resolve, 0);
100
+ });
101
+ });
88
102
 
89
103
  const loadMessage: SyncMessage = {
90
104
  action: "load",
@@ -111,14 +125,14 @@ describe("PeerState", () => {
111
125
  priority: CO_VALUE_PRIORITY.LOW,
112
126
  };
113
127
 
114
- const promises = [
115
- peerState.pushOutgoingMessage(contentMessageLow),
116
- peerState.pushOutgoingMessage(contentMessageMid),
117
- peerState.pushOutgoingMessage(contentMessageHigh),
118
- peerState.pushOutgoingMessage(loadMessage),
119
- ];
128
+ peerState.pushOutgoingMessage(contentMessageLow);
129
+ peerState.pushOutgoingMessage(contentMessageMid);
130
+ peerState.pushOutgoingMessage(contentMessageHigh);
131
+ peerState.pushOutgoingMessage(loadMessage);
120
132
 
121
- await Promise.all(promises);
133
+ await waitFor(() => {
134
+ expect(peerState.isProcessing()).toBe(false);
135
+ });
122
136
 
123
137
  // The first message is pushed directly, the other three are queued because are waiting
124
138
  // for the first push to be completed.
@@ -157,8 +157,7 @@ describe("PriorityBasedMessageQueue", () => {
157
157
  sessions: {},
158
158
  };
159
159
  void queue.push(message);
160
- const pulledEntry = queue.pull();
161
- expect(pulledEntry?.msg).toEqual(message);
160
+ expect(queue.pull()).toEqual(message);
162
161
  });
163
162
 
164
163
  test("should push message with specified priority", async () => {
@@ -170,8 +169,7 @@ describe("PriorityBasedMessageQueue", () => {
170
169
  priority: CO_VALUE_PRIORITY.HIGH,
171
170
  };
172
171
  void queue.push(message);
173
- const pulledEntry = queue.pull();
174
- expect(pulledEntry?.msg).toEqual(message);
172
+ expect(queue.pull()).toEqual(message);
175
173
  });
176
174
 
177
175
  test("should pull messages in priority order", async () => {
@@ -199,45 +197,13 @@ describe("PriorityBasedMessageQueue", () => {
199
197
  void queue.push(mediumPriorityMsg);
200
198
  void queue.push(highPriorityMsg);
201
199
 
202
- expect(queue.pull()?.msg).toEqual(highPriorityMsg);
203
- expect(queue.pull()?.msg).toEqual(mediumPriorityMsg);
204
- expect(queue.pull()?.msg).toEqual(lowPriorityMsg);
200
+ expect(queue.pull()).toEqual(highPriorityMsg);
201
+ expect(queue.pull()).toEqual(mediumPriorityMsg);
202
+ expect(queue.pull()).toEqual(lowPriorityMsg);
205
203
  });
206
204
 
207
205
  test("should return undefined when pulling from empty queue", () => {
208
206
  const { queue } = setup();
209
207
  expect(queue.pull()).toBeUndefined();
210
208
  });
211
-
212
- test("should resolve promise when message is pulled", async () => {
213
- const { queue } = setup();
214
- const message: SyncMessage = {
215
- action: "load",
216
- id: "co_ztest-id",
217
- header: false,
218
- sessions: {},
219
- };
220
- const pushPromise = queue.push(message);
221
-
222
- const pulledEntry = queue.pull();
223
- pulledEntry?.resolve();
224
-
225
- await expect(pushPromise).resolves.toBeUndefined();
226
- });
227
-
228
- test("should reject promise when message is rejected", async () => {
229
- const { queue } = setup();
230
- const message: SyncMessage = {
231
- action: "load",
232
- id: "co_ztest-id",
233
- header: false,
234
- sessions: {},
235
- };
236
- const pushPromise = queue.push(message);
237
-
238
- const pulledEntry = queue.pull();
239
- pulledEntry?.reject(new Error("Test error"));
240
-
241
- await expect(pushPromise).rejects.toThrow("Test error");
242
- });
243
209
  });
@@ -7,8 +7,6 @@ import { connectedPeers } from "../streamUtils.js";
7
7
  import { emptyKnownState } from "../sync.js";
8
8
  import {
9
9
  SyncMessagesLog,
10
- blockMessageTypeOnOutgoingPeer,
11
- createTestNode,
12
10
  loadCoValueOrFail,
13
11
  setupTestNode,
14
12
  waitFor,
@@ -37,7 +35,7 @@ describe("SyncStateManager", () => {
37
35
  const updateSpy: GlobalSyncStateListenerCallback = vi.fn();
38
36
  const unsubscribe = subscriptionManager.subscribeToUpdates(updateSpy);
39
37
 
40
- await client.node.syncManager.actuallySyncCoValue(map.core);
38
+ await client.node.syncManager.syncCoValue(map.core);
41
39
 
42
40
  expect(updateSpy).toHaveBeenCalledWith(
43
41
  peerState.id,
@@ -97,7 +95,7 @@ describe("SyncStateManager", () => {
97
95
  unsubscribe2();
98
96
  });
99
97
 
100
- await client.node.syncManager.actuallySyncCoValue(map.core);
98
+ await client.node.syncManager.syncCoValue(map.core);
101
99
 
102
100
  expect(updateToJazzCloudSpy).toHaveBeenCalledWith(
103
101
  emptyKnownState(map.core.id),
@@ -132,7 +130,7 @@ describe("SyncStateManager", () => {
132
130
  const map = group.createMap();
133
131
  map.set("key1", "value1", "trusting");
134
132
 
135
- await client.node.syncManager.actuallySyncCoValue(map.core);
133
+ await client.node.syncManager.syncCoValue(map.core);
136
134
 
137
135
  const subscriptionManager = client.node.syncManager.syncState;
138
136
 
@@ -173,7 +171,7 @@ describe("SyncStateManager", () => {
173
171
  unsubscribe1();
174
172
  unsubscribe2();
175
173
 
176
- await client.node.syncManager.actuallySyncCoValue(map.core);
174
+ await client.node.syncManager.syncCoValue(map.core);
177
175
 
178
176
  anyUpdateSpy.mockClear();
179
177
 
@@ -217,9 +215,6 @@ describe("SyncStateManager", () => {
217
215
 
218
216
  const mapOnServer = await loadCoValueOrFail(serverNode, map.id);
219
217
 
220
- // Block the content messages so the client won't fully sync immediately
221
- const outgoing = blockMessageTypeOnOutgoingPeer(peerOnServer, "content");
222
-
223
218
  mapOnServer.set("key2", "value2", "trusting");
224
219
 
225
220
  expect(
@@ -236,9 +231,6 @@ describe("SyncStateManager", () => {
236
231
  ),
237
232
  ).toEqual({ uploaded: false });
238
233
 
239
- await outgoing.sendBlockedMessages();
240
- outgoing.unblock();
241
-
242
234
  await mapOnServer.core.waitForSync();
243
235
 
244
236
  expect(
@@ -74,8 +74,8 @@ describe("loading coValues from server", () => {
74
74
  "server -> client | CONTENT ParentGroup header: true new: After: 0 New: 6",
75
75
  "client -> server | KNOWN ParentGroup sessions: header/6",
76
76
  "server -> client | CONTENT Group header: true new: After: 0 New: 5",
77
- "server -> client | CONTENT Map header: true new: After: 0 New: 1",
78
77
  "client -> server | KNOWN Group sessions: header/5",
78
+ "server -> client | CONTENT Map header: true new: After: 0 New: 1",
79
79
  "client -> server | KNOWN Map sessions: header/1",
80
80
  ]
81
81
  `);
@@ -118,6 +118,8 @@ describe("loading coValues from server", () => {
118
118
  "client -> server | LOAD Map sessions: header/1",
119
119
  "server -> client | CONTENT Map header: false new: After: 1 New: 1",
120
120
  "client -> server | KNOWN Map sessions: header/2",
121
+ "server -> client | CONTENT Map header: false new: After: 1 New: 1",
122
+ "client -> server | KNOWN Map sessions: header/2",
121
123
  ]
122
124
  `);
123
125
  });
@@ -161,9 +163,11 @@ describe("loading coValues from server", () => {
161
163
  "server -> client | KNOWN Group sessions: header/5",
162
164
  "client -> server | LOAD Map sessions: header/2",
163
165
  "server -> client | CONTENT Map header: false new: After: 1 New: 1",
164
- "client -> server | KNOWN Map sessions: header/3",
165
166
  "client -> server | CONTENT Map header: false new: After: 0 New: 1",
167
+ "server -> client | CONTENT Map header: false new: After: 1 New: 1",
168
+ "client -> server | KNOWN Map sessions: header/3",
166
169
  "server -> client | KNOWN Map sessions: header/3",
170
+ "client -> server | KNOWN Map sessions: header/3",
167
171
  ]
168
172
  `);
169
173
  });
@@ -288,36 +292,36 @@ describe("loading coValues from server", () => {
288
292
  "server -> client | CONTENT Group header: true new: After: 0 New: 5",
289
293
  "client -> server | KNOWN Group sessions: header/5",
290
294
  "server -> client | CONTENT Map header: true new: ",
291
- "server -> client | CONTENT Map header: false new: After: 0 New: 73",
292
295
  "client -> server | KNOWN Map sessions: header/0",
293
- "server -> client | CONTENT Map header: false new: After: 73 New: 73",
294
- "server -> client | CONTENT Map header: false new: After: 146 New: 73",
296
+ "server -> client | CONTENT Map header: false new: After: 0 New: 73",
295
297
  "client -> server | KNOWN Map sessions: header/73",
296
- "server -> client | CONTENT Map header: false new: After: 219 New: 73",
297
- "server -> client | CONTENT Map header: false new: After: 292 New: 73",
298
+ "server -> client | CONTENT Map header: false new: After: 73 New: 73",
298
299
  "client -> server | KNOWN Map sessions: header/146",
299
- "server -> client | CONTENT Map header: false new: After: 365 New: 73",
300
- "server -> client | CONTENT Map header: false new: After: 438 New: 73",
300
+ "server -> client | CONTENT Map header: false new: After: 146 New: 73",
301
301
  "client -> server | KNOWN Map sessions: header/219",
302
- "server -> client | CONTENT Map header: false new: After: 511 New: 73",
303
- "server -> client | CONTENT Map header: false new: After: 584 New: 73",
302
+ "server -> client | CONTENT Map header: false new: After: 219 New: 73",
304
303
  "client -> server | KNOWN Map sessions: header/292",
305
- "server -> client | CONTENT Map header: false new: After: 657 New: 73",
306
- "server -> client | CONTENT Map header: false new: After: 730 New: 73",
304
+ "server -> client | CONTENT Map header: false new: After: 292 New: 73",
307
305
  "client -> server | KNOWN Map sessions: header/365",
308
- "server -> client | CONTENT Map header: false new: After: 803 New: 73",
309
- "server -> client | CONTENT Map header: false new: After: 876 New: 73",
306
+ "server -> client | CONTENT Map header: false new: After: 365 New: 73",
310
307
  "client -> server | KNOWN Map sessions: header/438",
311
- "server -> client | CONTENT Map header: false new: After: 949 New: 73",
312
- "server -> client | CONTENT Map header: false new: After: 1022 New: 2",
308
+ "server -> client | CONTENT Map header: false new: After: 438 New: 73",
313
309
  "client -> server | KNOWN Map sessions: header/511",
310
+ "server -> client | CONTENT Map header: false new: After: 511 New: 73",
314
311
  "client -> server | KNOWN Map sessions: header/584",
312
+ "server -> client | CONTENT Map header: false new: After: 584 New: 73",
315
313
  "client -> server | KNOWN Map sessions: header/657",
314
+ "server -> client | CONTENT Map header: false new: After: 657 New: 73",
316
315
  "client -> server | KNOWN Map sessions: header/730",
316
+ "server -> client | CONTENT Map header: false new: After: 730 New: 73",
317
317
  "client -> server | KNOWN Map sessions: header/803",
318
+ "server -> client | CONTENT Map header: false new: After: 803 New: 73",
318
319
  "client -> server | KNOWN Map sessions: header/876",
320
+ "server -> client | CONTENT Map header: false new: After: 876 New: 73",
319
321
  "client -> server | KNOWN Map sessions: header/949",
322
+ "server -> client | CONTENT Map header: false new: After: 949 New: 73",
320
323
  "client -> server | KNOWN Map sessions: header/1022",
324
+ "server -> client | CONTENT Map header: false new: After: 1022 New: 2",
321
325
  "client -> server | KNOWN Map sessions: header/1024",
322
326
  ]
323
327
  `);
@@ -66,10 +66,10 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
66
66
  [
67
67
  "edge-france -> core | CONTENT Group header: true new: After: 0 New: 3",
68
68
  "core -> edge-france | KNOWN Group sessions: header/3",
69
- "core -> storage | CONTENT Group header: true new: After: 0 New: 3",
70
69
  "edge-france -> core | CONTENT Map header: true new: After: 0 New: 1",
71
- "storage -> core | KNOWN Group sessions: header/3",
70
+ "core -> storage | CONTENT Group header: true new: After: 0 New: 3",
72
71
  "core -> edge-france | KNOWN Map sessions: header/1",
72
+ "storage -> core | KNOWN Group sessions: header/3",
73
73
  "core -> storage | CONTENT Map header: true new: After: 0 New: 1",
74
74
  "storage -> core | KNOWN Map sessions: header/1",
75
75
  "client -> edge-italy | LOAD Map sessions: empty",
@@ -77,17 +77,16 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
77
77
  "core -> edge-italy | CONTENT Group header: true new: After: 0 New: 3",
78
78
  "edge-italy -> core | KNOWN Group sessions: header/3",
79
79
  "core -> edge-italy | CONTENT Map header: true new: After: 0 New: 1",
80
+ "edge-italy -> core | KNOWN Map sessions: header/1",
80
81
  "edge-italy -> client | CONTENT Group header: true new: After: 0 New: 3",
81
82
  "client -> edge-italy | KNOWN Group sessions: header/3",
82
- "edge-italy -> core | KNOWN Map sessions: header/1",
83
83
  "edge-italy -> client | CONTENT Map header: true new: After: 0 New: 1",
84
84
  "client -> edge-italy | KNOWN Map sessions: header/1",
85
85
  ]
86
86
  `);
87
87
  });
88
88
 
89
- // FIXME: Expected parent group to be loaded: CoValue co_zEKiodKQprnfsi2qfDtsHGCGDSo not yet loaded
90
- test.skip("coValue created on a different edge with parent groups loading", async () => {
89
+ test("coValue created on a different edge with parent groups loading", async () => {
91
90
  const client = setupTestNode();
92
91
 
93
92
  client.connectToSyncServer({
@@ -96,7 +95,7 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
96
95
  });
97
96
 
98
97
  const group = mesh.edgeFrance.node.createGroup();
99
- const parentGroup = mesh.edgeItaly.node.createGroup();
98
+ const parentGroup = mesh.edgeFrance.node.createGroup();
100
99
  parentGroup.addMember("everyone", "reader");
101
100
 
102
101
  group.extend(parentGroup);
@@ -115,7 +114,36 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
115
114
  Group: group.core,
116
115
  Map: map.core,
117
116
  }),
118
- ).toMatchInlineSnapshot();
117
+ ).toMatchInlineSnapshot(`
118
+ [
119
+ "edge-france -> core | CONTENT ParentGroup header: true new: After: 0 New: 6",
120
+ "core -> edge-france | KNOWN ParentGroup sessions: header/6",
121
+ "edge-france -> core | CONTENT Group header: true new: After: 0 New: 5",
122
+ "core -> storage | CONTENT ParentGroup header: true new: After: 0 New: 6",
123
+ "core -> edge-france | KNOWN Group sessions: header/5",
124
+ "edge-france -> core | CONTENT Map header: true new: After: 0 New: 1",
125
+ "storage -> core | KNOWN ParentGroup sessions: header/6",
126
+ "core -> storage | CONTENT Group header: true new: After: 0 New: 5",
127
+ "core -> edge-france | KNOWN Map sessions: header/1",
128
+ "storage -> core | KNOWN Group sessions: header/5",
129
+ "core -> storage | CONTENT Map header: true new: After: 0 New: 1",
130
+ "storage -> core | KNOWN Map sessions: header/1",
131
+ "client -> edge-italy | LOAD Map sessions: empty",
132
+ "edge-italy -> core | LOAD Map sessions: empty",
133
+ "core -> edge-italy | CONTENT ParentGroup header: true new: After: 0 New: 6",
134
+ "edge-italy -> core | KNOWN ParentGroup sessions: header/6",
135
+ "core -> edge-italy | CONTENT Group header: true new: After: 0 New: 5",
136
+ "edge-italy -> core | KNOWN Group sessions: header/5",
137
+ "core -> edge-italy | CONTENT Map header: true new: After: 0 New: 1",
138
+ "edge-italy -> core | KNOWN Map sessions: header/1",
139
+ "edge-italy -> client | CONTENT ParentGroup header: true new: After: 0 New: 6",
140
+ "client -> edge-italy | KNOWN ParentGroup sessions: header/6",
141
+ "edge-italy -> client | CONTENT Group header: true new: After: 0 New: 5",
142
+ "client -> edge-italy | KNOWN Group sessions: header/5",
143
+ "edge-italy -> client | CONTENT Map header: true new: After: 0 New: 1",
144
+ "client -> edge-italy | KNOWN Map sessions: header/1",
145
+ ]
146
+ `);
119
147
  });
120
148
 
121
149
  test("updating a coValue coming from a different edge", async () => {
@@ -155,8 +183,8 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
155
183
  "edge-italy -> core | CONTENT Map header: false new: After: 0 New: 1",
156
184
  "core -> edge-italy | KNOWN Map sessions: header/2",
157
185
  "core -> storage | CONTENT Map header: false new: After: 0 New: 1",
158
- "storage -> core | KNOWN Map sessions: header/2",
159
186
  "core -> edge-france | CONTENT Map header: false new: After: 0 New: 1",
187
+ "storage -> core | KNOWN Map sessions: header/2",
160
188
  "edge-france -> core | KNOWN Map sessions: header/2",
161
189
  ]
162
190
  `);
@@ -210,29 +238,29 @@ describe("multiple clients syncing with the a cloud-like server mesh", () => {
210
238
  "edge-italy -> core | CONTENT Group header: true new: After: 0 New: 5",
211
239
  "edge-italy -> client | CONTENT Group header: true new: After: 0 New: 5",
212
240
  "core -> edge-italy | KNOWN Group sessions: header/5",
213
- "client -> edge-italy | KNOWN Group sessions: header/5",
214
- "core -> storage | CONTENT Group header: true new: After: 0 New: 5",
215
241
  "edge-italy -> core | CONTENT Map header: true new: After: 0 New: 1",
242
+ "client -> edge-italy | KNOWN Group sessions: header/5",
216
243
  "edge-italy -> client | CONTENT Map header: true new: After: 0 New: 1",
217
- "storage -> core | KNOWN Group sessions: header/5",
244
+ "core -> storage | CONTENT Group header: true new: After: 0 New: 5",
218
245
  "core -> edge-italy | KNOWN Map sessions: header/1",
219
- "core -> storage | CONTENT Map header: true new: After: 0 New: 1",
220
246
  "client -> edge-italy | KNOWN Map sessions: header/1",
247
+ "storage -> core | KNOWN Group sessions: header/5",
248
+ "core -> storage | CONTENT Map header: true new: After: 0 New: 1",
221
249
  "storage -> core | KNOWN Map sessions: header/1",
222
250
  "client -> edge-italy | CONTENT Map header: false new: After: 0 New: 1",
223
251
  "core -> storage | CONTENT Map header: false new: After: 0 New: 1",
252
+ "core -> edge-italy | CONTENT Map header: false new: After: 0 New: 1",
224
253
  "edge-italy -> client | KNOWN CORRECTION Map sessions: empty",
225
254
  "storage -> core | KNOWN Map sessions: header/2",
226
- "core -> edge-italy | CONTENT Map header: false new: After: 0 New: 1",
227
- "client -> edge-italy | CONTENT Map header: true new: After: 0 New: 1 | After: 0 New: 1",
228
255
  "edge-italy -> core | KNOWN CORRECTION Map sessions: empty",
229
- "edge-italy -> client | KNOWN Map sessions: header/2",
256
+ "client -> edge-italy | CONTENT Map header: true new: After: 0 New: 1 | After: 0 New: 1",
230
257
  "core -> edge-italy | CONTENT Map header: true new: After: 0 New: 1 | After: 0 New: 1",
231
- "edge-italy -> core | CONTENT Map header: false new: After: 0 New: 1",
232
- "edge-italy -> client | CONTENT Map header: false new: After: 0 New: 1",
233
- "core -> edge-italy | KNOWN Map sessions: header/3",
258
+ "edge-italy -> client | KNOWN Map sessions: header/2",
234
259
  "edge-italy -> core | KNOWN Map sessions: header/3",
260
+ "edge-italy -> client | CONTENT Map header: false new: After: 0 New: 1",
261
+ "edge-italy -> core | CONTENT Map header: false new: After: 0 New: 1",
235
262
  "client -> edge-italy | KNOWN Map sessions: header/3",
263
+ "core -> edge-italy | KNOWN Map sessions: header/3",
236
264
  "core -> storage | CONTENT Map header: false new: After: 0 New: 1",
237
265
  "storage -> core | KNOWN Map sessions: header/3",
238
266
  ]
@@ -1,18 +1,7 @@
1
1
  import { assert, beforeEach, describe, expect, test } from "vitest";
2
2
  import { expectMap } from "../coValue";
3
3
  import { WasmCrypto } from "../crypto/WasmCrypto";
4
- import { CoValueCore, RawCoMap } from "../exports";
5
- import { LocalNode } from "../localNode";
6
- import { toSimplifiedMessages } from "./messagesTestUtils";
7
- import {
8
- SyncMessagesLog,
9
- createTestNode,
10
- randomAnonymousAccountAndSessionID,
11
- setupTestNode,
12
- waitFor,
13
- } from "./testUtils";
14
-
15
- const Crypto = await WasmCrypto.create();
4
+ import { SyncMessagesLog, setupTestNode, waitFor } from "./testUtils";
16
5
 
17
6
  let jazzCloud = setupTestNode({ isSyncServer: true });
18
7
 
@@ -32,8 +21,6 @@ describe("peer reconciliation", () => {
32
21
 
33
22
  client.connectToSyncServer();
34
23
 
35
- await new Promise((resolve) => setTimeout(resolve, 100));
36
-
37
24
  await map.core.waitForSync();
38
25
 
39
26
  expect(
@@ -44,12 +31,12 @@ describe("peer reconciliation", () => {
44
31
  ).toMatchInlineSnapshot(`
45
32
  [
46
33
  "client -> server | LOAD Group sessions: header/3",
47
- "server -> client | KNOWN Group sessions: empty",
48
34
  "client -> server | LOAD Map sessions: header/1",
49
- "server -> client | KNOWN Map sessions: empty",
35
+ "server -> client | KNOWN Group sessions: empty",
50
36
  "client -> server | CONTENT Group header: true new: After: 0 New: 3",
51
- "server -> client | KNOWN Group sessions: header/3",
37
+ "server -> client | KNOWN Map sessions: empty",
52
38
  "client -> server | CONTENT Map header: true new: After: 0 New: 1",
39
+ "server -> client | KNOWN Group sessions: header/3",
53
40
  "server -> client | KNOWN Map sessions: header/1",
54
41
  ]
55
42
  `);
@@ -93,10 +80,10 @@ describe("peer reconciliation", () => {
93
80
  ).toMatchInlineSnapshot(`
94
81
  [
95
82
  "client -> server | LOAD Group sessions: header/3",
96
- "server -> client | KNOWN Group sessions: header/3",
97
83
  "client -> server | LOAD Map sessions: header/2",
98
- "server -> client | KNOWN Map sessions: header/1",
84
+ "server -> client | KNOWN Group sessions: header/3",
99
85
  "client -> server | CONTENT Map header: false new: After: 1 New: 1",
86
+ "server -> client | KNOWN Map sessions: header/1",
100
87
  "server -> client | KNOWN Map sessions: header/2",
101
88
  ]
102
89
  `);
@@ -148,10 +135,11 @@ describe("peer reconciliation", () => {
148
135
  ).toMatchInlineSnapshot(`
149
136
  [
150
137
  "client -> server | LOAD Group sessions: header/3",
151
- "server -> client | KNOWN Group sessions: header/3",
138
+ "client -> server | LOAD Group sessions: header/3",
152
139
  "client -> server | LOAD Map sessions: header/2",
153
- "server -> client | KNOWN Map sessions: header/1",
140
+ "server -> client | KNOWN Group sessions: header/3",
154
141
  "client -> server | CONTENT Map header: false new: After: 1 New: 1",
142
+ "server -> client | KNOWN Map sessions: header/1",
155
143
  "server -> client | KNOWN Map sessions: header/2",
156
144
  ]
157
145
  `);
@@ -191,16 +179,16 @@ describe("peer reconciliation", () => {
191
179
  ).toMatchInlineSnapshot(`
192
180
  [
193
181
  "client -> server | LOAD Group sessions: header/3",
194
- "server -> client | KNOWN Group sessions: empty",
195
182
  "client -> server | LOAD Map sessions: header/2",
196
- "server -> client | KNOWN Map sessions: empty",
183
+ "server -> client | KNOWN Group sessions: empty",
197
184
  "client -> server | CONTENT Group header: true new: After: 0 New: 3",
198
- "server -> client | KNOWN Group sessions: header/3",
185
+ "server -> client | KNOWN Map sessions: empty",
199
186
  "client -> server | CONTENT Map header: true new: After: 0 New: 2",
187
+ "server -> client | KNOWN Group sessions: header/3",
200
188
  "server -> client | KNOWN Map sessions: header/2",
201
189
  "client -> server | LOAD Group sessions: header/3",
202
- "server -> client | KNOWN Group sessions: header/3",
203
190
  "client -> server | LOAD Map sessions: header/2",
191
+ "server -> client | KNOWN Group sessions: header/3",
204
192
  "server -> client | KNOWN Map sessions: header/2",
205
193
  ]
206
194
  `);
@@ -39,11 +39,11 @@ describe("client with storage syncs with server", () => {
39
39
  "client -> server | LOAD Map sessions: empty",
40
40
  "server -> client | CONTENT Group header: true new: After: 0 New: 3",
41
41
  "client -> server | KNOWN Group sessions: header/3",
42
- "client -> storage | CONTENT Group header: true new: After: 0 New: 3",
43
42
  "server -> client | CONTENT Map header: true new: After: 0 New: 1",
43
+ "client -> storage | CONTENT Group header: true new: After: 0 New: 3",
44
+ "client -> server | KNOWN Map sessions: header/1",
44
45
  "storage -> client | KNOWN Group sessions: header/3",
45
46
  "client -> storage | CONTENT Map header: true new: After: 0 New: 1",
46
- "client -> server | KNOWN Map sessions: header/1",
47
47
  "storage -> client | KNOWN Map sessions: header/1",
48
48
  ]
49
49
  `);
@@ -76,10 +76,12 @@ describe("client with storage syncs with server", () => {
76
76
  "client -> storage | KNOWN Group sessions: header/3",
77
77
  "storage -> client | CONTENT Map header: true new: After: 0 New: 1",
78
78
  "client -> server | CONTENT Group header: true new: After: 0 New: 3",
79
+ "client -> storage | KNOWN Map sessions: header/1",
79
80
  "server -> client | KNOWN Group sessions: header/3",
80
81
  "client -> server | LOAD Map sessions: header/1",
81
- "client -> storage | KNOWN Map sessions: header/1",
82
82
  "server -> client | CONTENT Group header: true new: After: 0 New: 3",
83
+ "client -> server | CONTENT Map header: true new: After: 0 New: 1",
84
+ "server -> client | KNOWN Map sessions: header/1",
83
85
  "client -> server | KNOWN Group sessions: header/3",
84
86
  "server -> client | KNOWN Map sessions: header/1",
85
87
  ]
@@ -117,16 +119,16 @@ describe("client with storage syncs with server", () => {
117
119
  "client -> server | LOAD Map sessions: empty",
118
120
  "server -> client | CONTENT ParentGroup header: true new: After: 0 New: 6",
119
121
  "client -> server | KNOWN ParentGroup sessions: header/6",
120
- "client -> storage | CONTENT ParentGroup header: true new: After: 0 New: 6",
121
122
  "server -> client | CONTENT Group header: true new: After: 0 New: 5",
122
- "storage -> client | KNOWN ParentGroup sessions: header/6",
123
+ "client -> storage | CONTENT ParentGroup header: true new: After: 0 New: 6",
124
+ "client -> server | KNOWN Group sessions: header/5",
123
125
  "server -> client | CONTENT Map header: true new: After: 0 New: 1",
126
+ "storage -> client | KNOWN ParentGroup sessions: header/6",
124
127
  "client -> storage | CONTENT Group header: true new: After: 0 New: 5",
128
+ "client -> server | KNOWN Map sessions: header/1",
125
129
  "storage -> client | KNOWN Group sessions: header/5",
126
- "client -> server | KNOWN Group sessions: header/5",
127
130
  "client -> storage | CONTENT Map header: true new: After: 0 New: 1",
128
131
  "storage -> client | KNOWN Map sessions: header/1",
129
- "client -> server | KNOWN Map sessions: header/1",
130
132
  ]
131
133
  `);
132
134
  });
@@ -167,7 +169,9 @@ describe("client with storage syncs with server", () => {
167
169
  "client -> server | LOAD Map sessions: header/1",
168
170
  "server -> client | CONTENT Map header: false new: After: 1 New: 1",
169
171
  "client -> server | KNOWN Map sessions: header/2",
172
+ "server -> client | CONTENT Map header: false new: After: 1 New: 1",
170
173
  "client -> storage | CONTENT Map header: false new: After: 1 New: 1",
174
+ "client -> server | KNOWN Map sessions: header/2",
171
175
  "storage -> client | KNOWN Map sessions: header/2",
172
176
  ]
173
177
  `);
@@ -212,10 +216,10 @@ describe("client syncs with a server with storage", () => {
212
216
  [
213
217
  "client -> server | CONTENT Group header: true new: After: 0 New: 3",
214
218
  "server -> client | KNOWN Group sessions: header/3",
215
- "server -> storage | CONTENT Group header: true new: After: 0 New: 3",
216
219
  "client -> server | CONTENT Map header: true new: After: 0 New: 1",
217
- "storage -> server | KNOWN Group sessions: header/3",
220
+ "server -> storage | CONTENT Group header: true new: After: 0 New: 3",
218
221
  "server -> client | KNOWN Map sessions: header/1",
222
+ "storage -> server | KNOWN Group sessions: header/3",
219
223
  "server -> storage | CONTENT Map header: true new: After: 0 New: 1",
220
224
  "storage -> server | KNOWN Map sessions: header/1",
221
225
  ]