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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +9 -0
- package/dist/PeerState.d.ts +1 -1
- package/dist/PeerState.d.ts.map +1 -1
- package/dist/PeerState.js +7 -36
- package/dist/PeerState.js.map +1 -1
- package/dist/coValueCore/coValueCore.d.ts +1 -1
- package/dist/coValueCore/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore/coValueCore.js +11 -7
- package/dist/coValueCore/coValueCore.js.map +1 -1
- package/dist/localNode.d.ts.map +1 -1
- package/dist/localNode.js +10 -5
- package/dist/localNode.js.map +1 -1
- package/dist/streamUtils.d.ts +5 -5
- package/dist/streamUtils.d.ts.map +1 -1
- package/dist/streamUtils.js +5 -20
- package/dist/streamUtils.js.map +1 -1
- package/dist/sync.d.ts +6 -4
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +35 -19
- package/dist/sync.js.map +1 -1
- package/dist/tests/PeerState.test.js +0 -31
- package/dist/tests/PeerState.test.js.map +1 -1
- package/dist/tests/SyncStateManager.test.js +41 -6
- package/dist/tests/SyncStateManager.test.js.map +1 -1
- package/dist/tests/account.test.js +16 -0
- package/dist/tests/account.test.js.map +1 -1
- package/dist/tests/group.test.js.map +1 -1
- package/dist/tests/sync.auth.test.js +64 -15
- package/dist/tests/sync.auth.test.js.map +1 -1
- package/dist/tests/sync.load.test.js +2 -2
- package/dist/tests/sync.load.test.js.map +1 -1
- package/dist/tests/testUtils.d.ts +11 -2
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +27 -30
- package/dist/tests/testUtils.js.map +1 -1
- package/package.json +1 -1
- package/src/PeerState.ts +8 -40
- package/src/coValueCore/coValueCore.ts +14 -14
- package/src/localNode.ts +13 -6
- package/src/streamUtils.ts +7 -34
- package/src/sync.ts +51 -22
- package/src/tests/PeerState.test.ts +0 -37
- package/src/tests/SyncStateManager.test.ts +56 -6
- package/src/tests/account.test.ts +24 -0
- package/src/tests/group.test.ts +0 -1
- package/src/tests/sync.auth.test.ts +79 -21
- package/src/tests/sync.load.test.ts +3 -2
- 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 {
|
|
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
|
-
"
|
|
173
|
-
"
|
|
174
|
-
"
|
|
175
|
-
"
|
|
176
|
-
"server ->
|
|
177
|
-
"
|
|
178
|
-
"
|
|
179
|
-
"
|
|
180
|
-
"
|
|
181
|
-
"
|
|
182
|
-
"
|
|
183
|
-
"
|
|
184
|
-
"
|
|
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 () => {
|
package/src/tests/testUtils.ts
CHANGED
|
@@ -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 =
|
|
489
|
-
|
|
490
|
-
|
|
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
|
-
|
|
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 =
|
|
579
|
-
|
|
580
|
-
|
|
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
|
-
|
|
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) {
|