cojson 0.15.7 → 0.15.9
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 +12 -0
- package/dist/IncomingMessagesQueue.d.ts +27 -0
- package/dist/IncomingMessagesQueue.d.ts.map +1 -0
- package/dist/IncomingMessagesQueue.js +114 -0
- package/dist/IncomingMessagesQueue.js.map +1 -0
- package/dist/PeerState.d.ts +2 -10
- package/dist/PeerState.d.ts.map +1 -1
- package/dist/PeerState.js +9 -90
- package/dist/PeerState.js.map +1 -1
- package/dist/PriorityBasedMessageQueue.d.ts +2 -1
- package/dist/PriorityBasedMessageQueue.d.ts.map +1 -1
- package/dist/PriorityBasedMessageQueue.js +9 -6
- package/dist/PriorityBasedMessageQueue.js.map +1 -1
- package/dist/SyncStateManager.d.ts +1 -0
- package/dist/SyncStateManager.d.ts.map +1 -1
- package/dist/SyncStateManager.js +1 -1
- package/dist/SyncStateManager.js.map +1 -1
- package/dist/coValue.d.ts +1 -1
- package/dist/coValueCore/coValueCore.d.ts +9 -17
- package/dist/coValueCore/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore/coValueCore.js +75 -50
- package/dist/coValueCore/coValueCore.js.map +1 -1
- package/dist/coValueCore/verifiedState.d.ts +10 -3
- package/dist/coValueCore/verifiedState.d.ts.map +1 -1
- package/dist/coValueCore/verifiedState.js +73 -14
- package/dist/coValueCore/verifiedState.js.map +1 -1
- package/dist/coValues/coMap.d.ts +3 -3
- package/dist/coValues/coStream.d.ts +2 -2
- package/dist/coValues/group.d.ts +1 -1
- package/dist/coValues/group.d.ts.map +1 -1
- package/dist/coValues/group.js +2 -4
- package/dist/coValues/group.js.map +1 -1
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +23 -0
- package/dist/config.js.map +1 -0
- package/dist/crypto/WasmCrypto.d.ts.map +1 -1
- package/dist/crypto/WasmCrypto.js +2 -1
- package/dist/crypto/WasmCrypto.js.map +1 -1
- package/dist/exports.d.ts +18 -7
- package/dist/exports.d.ts.map +1 -1
- package/dist/exports.js +11 -8
- package/dist/exports.js.map +1 -1
- package/dist/localNode.d.ts +8 -2
- package/dist/localNode.d.ts.map +1 -1
- package/dist/localNode.js +19 -12
- package/dist/localNode.js.map +1 -1
- package/dist/storage/StoreQueue.d.ts +15 -0
- package/dist/storage/StoreQueue.d.ts.map +1 -0
- package/dist/storage/StoreQueue.js +35 -0
- package/dist/storage/StoreQueue.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +6 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/knownState.d.ts +18 -0
- package/dist/storage/knownState.d.ts.map +1 -0
- package/dist/storage/knownState.js +63 -0
- package/dist/storage/knownState.js.map +1 -0
- package/dist/storage/sqlite/client.d.ts +37 -0
- package/dist/storage/sqlite/client.d.ts.map +1 -0
- package/dist/storage/sqlite/client.js +89 -0
- package/dist/storage/sqlite/client.js.map +1 -0
- package/dist/storage/sqlite/index.d.ts +5 -0
- package/dist/storage/sqlite/index.d.ts.map +1 -0
- package/dist/storage/sqlite/index.js +13 -0
- package/dist/storage/sqlite/index.js.map +1 -0
- package/dist/storage/sqlite/sqliteMigrations.d.ts +3 -0
- package/dist/storage/sqlite/sqliteMigrations.d.ts.map +1 -0
- package/dist/storage/sqlite/sqliteMigrations.js +44 -0
- package/dist/storage/sqlite/sqliteMigrations.js.map +1 -0
- package/dist/storage/sqlite/types.d.ts +8 -0
- package/dist/storage/sqlite/types.d.ts.map +1 -0
- package/dist/storage/sqlite/types.js +2 -0
- package/dist/storage/sqlite/types.js.map +1 -0
- package/dist/storage/sqliteAsync/client.d.ts +37 -0
- package/dist/storage/sqliteAsync/client.d.ts.map +1 -0
- package/dist/storage/sqliteAsync/client.js +88 -0
- package/dist/storage/sqliteAsync/client.js.map +1 -0
- package/dist/storage/sqliteAsync/index.d.ts +6 -0
- package/dist/storage/sqliteAsync/index.d.ts.map +1 -0
- package/dist/storage/sqliteAsync/index.js +15 -0
- package/dist/storage/sqliteAsync/index.js.map +1 -0
- package/dist/storage/sqliteAsync/types.d.ts +9 -0
- package/dist/storage/sqliteAsync/types.d.ts.map +1 -0
- package/dist/storage/sqliteAsync/types.js +2 -0
- package/dist/storage/sqliteAsync/types.js.map +1 -0
- package/dist/storage/storageAsync.d.ts +22 -0
- package/dist/storage/storageAsync.d.ts.map +1 -0
- package/dist/storage/storageAsync.js +214 -0
- package/dist/storage/storageAsync.js.map +1 -0
- package/dist/storage/storageSync.d.ts +21 -0
- package/dist/storage/storageSync.d.ts.map +1 -0
- package/dist/storage/storageSync.js +206 -0
- package/dist/storage/storageSync.js.map +1 -0
- package/dist/storage/syncUtils.d.ts +13 -0
- package/dist/storage/syncUtils.d.ts.map +1 -0
- package/dist/storage/syncUtils.js +25 -0
- package/dist/storage/syncUtils.js.map +1 -0
- package/dist/storage/types.d.ts +82 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/streamUtils.d.ts +13 -9
- package/dist/streamUtils.d.ts.map +1 -1
- package/dist/streamUtils.js +46 -13
- package/dist/streamUtils.js.map +1 -1
- package/dist/sync.d.ts +22 -14
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +143 -125
- package/dist/sync.js.map +1 -1
- package/dist/tests/IncomingMessagesQueue.test.d.ts +2 -0
- package/dist/tests/IncomingMessagesQueue.test.d.ts.map +1 -0
- package/dist/tests/IncomingMessagesQueue.test.js +437 -0
- package/dist/tests/IncomingMessagesQueue.test.js.map +1 -0
- package/dist/tests/PeerState.test.js +6 -94
- package/dist/tests/PeerState.test.js.map +1 -1
- package/dist/tests/PriorityBasedMessageQueue.test.js +14 -14
- package/dist/tests/PriorityBasedMessageQueue.test.js.map +1 -1
- package/dist/tests/StoreQueue.test.d.ts +2 -0
- package/dist/tests/StoreQueue.test.d.ts.map +1 -0
- package/dist/tests/StoreQueue.test.js +208 -0
- package/dist/tests/StoreQueue.test.js.map +1 -0
- package/dist/tests/SyncStateManager.test.js +3 -1
- package/dist/tests/SyncStateManager.test.js.map +1 -1
- package/dist/tests/account.test.js +9 -9
- package/dist/tests/account.test.js.map +1 -1
- package/dist/tests/coStream.test.js +1 -1
- package/dist/tests/coStream.test.js.map +1 -1
- package/dist/tests/coValueCore.test.js +208 -1
- package/dist/tests/coValueCore.test.js.map +1 -1
- package/dist/tests/coValueCoreLoadingState.test.js +2 -2
- package/dist/tests/coValueCoreLoadingState.test.js.map +1 -1
- package/dist/tests/group.addMember.test.js.map +1 -1
- package/dist/tests/group.removeMember.test.js +1 -1
- package/dist/tests/group.removeMember.test.js.map +1 -1
- package/dist/tests/messagesTestUtils.js +1 -1
- package/dist/tests/messagesTestUtils.js.map +1 -1
- package/dist/tests/sync.auth.test.js +23 -15
- package/dist/tests/sync.auth.test.js.map +1 -1
- package/dist/tests/sync.invite.test.js +10 -16
- package/dist/tests/sync.invite.test.js.map +1 -1
- package/dist/tests/sync.load.test.js +52 -50
- package/dist/tests/sync.load.test.js.map +1 -1
- package/dist/tests/sync.mesh.test.js +173 -56
- package/dist/tests/sync.mesh.test.js.map +1 -1
- package/dist/tests/sync.peerReconciliation.test.js +42 -32
- package/dist/tests/sync.peerReconciliation.test.js.map +1 -1
- package/dist/tests/sync.storage.test.js +162 -62
- package/dist/tests/sync.storage.test.js.map +1 -1
- package/dist/tests/sync.storageAsync.test.d.ts +2 -0
- package/dist/tests/sync.storageAsync.test.d.ts.map +1 -0
- package/dist/tests/sync.storageAsync.test.js +361 -0
- package/dist/tests/sync.storageAsync.test.js.map +1 -0
- package/dist/tests/sync.test.js +16 -21
- package/dist/tests/sync.test.js.map +1 -1
- package/dist/tests/sync.upload.test.js +28 -25
- package/dist/tests/sync.upload.test.js.map +1 -1
- package/dist/tests/testStorage.d.ts +12 -0
- package/dist/tests/testStorage.d.ts.map +1 -0
- package/dist/tests/testStorage.js +151 -0
- package/dist/tests/testStorage.js.map +1 -0
- package/dist/tests/testUtils.d.ts +20 -15
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +79 -45
- package/dist/tests/testUtils.js.map +1 -1
- package/package.json +2 -2
- package/src/IncomingMessagesQueue.ts +142 -0
- package/src/PeerState.ts +11 -110
- package/src/PriorityBasedMessageQueue.ts +13 -5
- package/src/SyncStateManager.ts +1 -1
- package/src/coValueCore/coValueCore.ts +100 -66
- package/src/coValueCore/verifiedState.ts +91 -21
- package/src/coValues/group.ts +2 -4
- package/src/config.ts +26 -0
- package/src/crypto/WasmCrypto.ts +3 -1
- package/src/exports.ts +20 -27
- package/src/localNode.ts +27 -12
- package/src/storage/StoreQueue.ts +56 -0
- package/src/storage/index.ts +5 -0
- package/src/storage/knownState.ts +88 -0
- package/src/storage/sqlite/client.ts +180 -0
- package/src/storage/sqlite/index.ts +19 -0
- package/src/storage/sqlite/sqliteMigrations.ts +44 -0
- package/src/storage/sqlite/types.ts +7 -0
- package/src/storage/sqliteAsync/client.ts +179 -0
- package/src/storage/sqliteAsync/index.ts +25 -0
- package/src/storage/sqliteAsync/types.ts +8 -0
- package/src/storage/storageAsync.ts +367 -0
- package/src/storage/storageSync.ts +343 -0
- package/src/storage/syncUtils.ts +50 -0
- package/src/storage/types.ts +162 -0
- package/src/streamUtils.ts +61 -19
- package/src/sync.ts +191 -160
- package/src/tests/IncomingMessagesQueue.test.ts +626 -0
- package/src/tests/PeerState.test.ts +6 -118
- package/src/tests/PriorityBasedMessageQueue.test.ts +18 -14
- package/src/tests/StoreQueue.test.ts +283 -0
- package/src/tests/SyncStateManager.test.ts +4 -1
- package/src/tests/account.test.ts +11 -12
- package/src/tests/coStream.test.ts +1 -3
- package/src/tests/coValueCore.test.ts +270 -1
- package/src/tests/coValueCoreLoadingState.test.ts +2 -2
- package/src/tests/group.addMember.test.ts +1 -0
- package/src/tests/group.removeMember.test.ts +2 -8
- package/src/tests/messagesTestUtils.ts +2 -2
- package/src/tests/sync.auth.test.ts +24 -14
- package/src/tests/sync.invite.test.ts +11 -17
- package/src/tests/sync.load.test.ts +53 -49
- package/src/tests/sync.mesh.test.ts +198 -56
- package/src/tests/sync.peerReconciliation.test.ts +44 -34
- package/src/tests/sync.storage.test.ts +231 -64
- package/src/tests/sync.storageAsync.test.ts +486 -0
- package/src/tests/sync.test.ts +17 -23
- package/src/tests/sync.upload.test.ts +29 -24
- package/src/tests/testStorage.ts +216 -0
- package/src/tests/testUtils.ts +89 -54
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { encrypt } from "jazz-crypto-rs";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
assert,
|
|
4
|
+
afterEach,
|
|
5
|
+
beforeEach,
|
|
6
|
+
describe,
|
|
7
|
+
expect,
|
|
8
|
+
test,
|
|
9
|
+
vi,
|
|
10
|
+
} from "vitest";
|
|
3
11
|
import { bytesToBase64url } from "../base64url.js";
|
|
4
12
|
import { CoValueCore } from "../coValueCore/coValueCore.js";
|
|
5
13
|
import { Transaction } from "../coValueCore/verifiedState.js";
|
|
@@ -512,3 +520,264 @@ test("getValidTransactions should skip private transactions with invalid JSON",
|
|
|
512
520
|
expect(validTransactions.length).toBe(1);
|
|
513
521
|
expect(validTransactions[0]?.changes).toEqual([{ hello: "world" }]);
|
|
514
522
|
});
|
|
523
|
+
|
|
524
|
+
describe("markErrored and isErroredInPeer", () => {
|
|
525
|
+
test("markErrored should mark a peer as errored with the provided error", () => {
|
|
526
|
+
const [agent, sessionID] = randomAgentAndSessionID();
|
|
527
|
+
const node = new LocalNode(agent.agentSecret, sessionID, Crypto);
|
|
528
|
+
|
|
529
|
+
const coValue = node.createCoValue({
|
|
530
|
+
type: "costream",
|
|
531
|
+
ruleset: { type: "unsafeAllowAll" },
|
|
532
|
+
meta: null,
|
|
533
|
+
...Crypto.createdNowUnique(),
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
const peerId = "test-peer-1";
|
|
537
|
+
const testError = {
|
|
538
|
+
type: "InvalidSignature" as const,
|
|
539
|
+
id: coValue.id,
|
|
540
|
+
newSignature: "invalid-signature" as any,
|
|
541
|
+
sessionID: sessionID,
|
|
542
|
+
signerID: "test-signer" as any,
|
|
543
|
+
};
|
|
544
|
+
|
|
545
|
+
// Initially, the peer should not be errored
|
|
546
|
+
expect(coValue.isErroredInPeer(peerId)).toBe(false);
|
|
547
|
+
|
|
548
|
+
// Mark the peer as errored
|
|
549
|
+
coValue.markErrored(peerId, testError);
|
|
550
|
+
|
|
551
|
+
// Verify the peer is now marked as errored
|
|
552
|
+
expect(coValue.isErroredInPeer(peerId)).toBe(true);
|
|
553
|
+
|
|
554
|
+
// Verify the peer state contains the error
|
|
555
|
+
const peerState = coValue.getStateForPeer(peerId);
|
|
556
|
+
expect(peerState).toBeDefined();
|
|
557
|
+
expect(peerState?.type).toBe("errored");
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
test("markErrored should update loading state and notify listeners", () => {
|
|
561
|
+
const [agent, sessionID] = randomAgentAndSessionID();
|
|
562
|
+
const node = new LocalNode(agent.agentSecret, sessionID, Crypto);
|
|
563
|
+
|
|
564
|
+
const coValue = node.createCoValue({
|
|
565
|
+
type: "costream",
|
|
566
|
+
ruleset: { type: "unsafeAllowAll" },
|
|
567
|
+
meta: null,
|
|
568
|
+
...Crypto.createdNowUnique(),
|
|
569
|
+
});
|
|
570
|
+
|
|
571
|
+
const peerId = "test-peer-2";
|
|
572
|
+
const testError = {
|
|
573
|
+
type: "InvalidHash" as const,
|
|
574
|
+
id: coValue.id,
|
|
575
|
+
expectedNewHash: "expected-hash" as any,
|
|
576
|
+
givenExpectedNewHash: "given-hash" as any,
|
|
577
|
+
};
|
|
578
|
+
|
|
579
|
+
const listener = vi.fn();
|
|
580
|
+
coValue.subscribe(listener);
|
|
581
|
+
|
|
582
|
+
// Mark the peer as errored
|
|
583
|
+
coValue.markErrored(peerId, testError);
|
|
584
|
+
|
|
585
|
+
// Verify the listener was called
|
|
586
|
+
expect(listener).toHaveBeenCalled();
|
|
587
|
+
});
|
|
588
|
+
|
|
589
|
+
test("isErroredInPeer should return false for non-existent peers", () => {
|
|
590
|
+
const [agent, sessionID] = randomAgentAndSessionID();
|
|
591
|
+
const node = new LocalNode(agent.agentSecret, sessionID, Crypto);
|
|
592
|
+
|
|
593
|
+
const coValue = node.createCoValue({
|
|
594
|
+
type: "costream",
|
|
595
|
+
ruleset: { type: "unsafeAllowAll" },
|
|
596
|
+
meta: null,
|
|
597
|
+
...Crypto.createdNowUnique(),
|
|
598
|
+
});
|
|
599
|
+
|
|
600
|
+
const nonExistentPeerId = "non-existent-peer";
|
|
601
|
+
|
|
602
|
+
// Verify non-existent peer is not errored
|
|
603
|
+
expect(coValue.isErroredInPeer(nonExistentPeerId)).toBe(false);
|
|
604
|
+
});
|
|
605
|
+
|
|
606
|
+
test("isErroredInPeer should return false for peers with other states", () => {
|
|
607
|
+
const [agent, sessionID] = randomAgentAndSessionID();
|
|
608
|
+
const node = new LocalNode(agent.agentSecret, sessionID, Crypto);
|
|
609
|
+
|
|
610
|
+
const coValue = node.createCoValue({
|
|
611
|
+
type: "costream",
|
|
612
|
+
ruleset: { type: "unsafeAllowAll" },
|
|
613
|
+
meta: null,
|
|
614
|
+
...Crypto.createdNowUnique(),
|
|
615
|
+
});
|
|
616
|
+
|
|
617
|
+
const peerId = "test-peer-3";
|
|
618
|
+
|
|
619
|
+
// Mark peer as pending
|
|
620
|
+
coValue.markPending(peerId);
|
|
621
|
+
expect(coValue.isErroredInPeer(peerId)).toBe(false);
|
|
622
|
+
|
|
623
|
+
// Mark peer as unavailable
|
|
624
|
+
coValue.markNotFoundInPeer(peerId);
|
|
625
|
+
expect(coValue.isErroredInPeer(peerId)).toBe(false);
|
|
626
|
+
|
|
627
|
+
// Mark peer as available
|
|
628
|
+
coValue.provideHeader({} as any, peerId);
|
|
629
|
+
expect(coValue.isErroredInPeer(peerId)).toBe(false);
|
|
630
|
+
});
|
|
631
|
+
|
|
632
|
+
test("markErrored should work with multiple peers", () => {
|
|
633
|
+
const [agent, sessionID] = randomAgentAndSessionID();
|
|
634
|
+
const node = new LocalNode(agent.agentSecret, sessionID, Crypto);
|
|
635
|
+
|
|
636
|
+
const coValue = node.createCoValue({
|
|
637
|
+
type: "costream",
|
|
638
|
+
ruleset: { type: "unsafeAllowAll" },
|
|
639
|
+
meta: null,
|
|
640
|
+
...Crypto.createdNowUnique(),
|
|
641
|
+
});
|
|
642
|
+
|
|
643
|
+
const peer1Id = "peer-1";
|
|
644
|
+
const peer2Id = "peer-2";
|
|
645
|
+
const peer3Id = "peer-3";
|
|
646
|
+
|
|
647
|
+
const error1 = {
|
|
648
|
+
type: "InvalidSignature" as const,
|
|
649
|
+
id: coValue.id,
|
|
650
|
+
newSignature: "invalid-signature-1" as any,
|
|
651
|
+
sessionID: sessionID,
|
|
652
|
+
signerID: "test-signer-1" as any,
|
|
653
|
+
};
|
|
654
|
+
|
|
655
|
+
const error2 = {
|
|
656
|
+
type: "InvalidHash" as const,
|
|
657
|
+
id: coValue.id,
|
|
658
|
+
expectedNewHash: "expected-hash-2" as any,
|
|
659
|
+
givenExpectedNewHash: "given-hash-2" as any,
|
|
660
|
+
};
|
|
661
|
+
|
|
662
|
+
// Mark different peers as errored
|
|
663
|
+
coValue.markErrored(peer1Id, error1);
|
|
664
|
+
coValue.markErrored(peer2Id, error2);
|
|
665
|
+
|
|
666
|
+
// Verify each peer is correctly marked as errored
|
|
667
|
+
expect(coValue.isErroredInPeer(peer1Id)).toBe(true);
|
|
668
|
+
expect(coValue.isErroredInPeer(peer2Id)).toBe(true);
|
|
669
|
+
expect(coValue.isErroredInPeer(peer3Id)).toBe(false);
|
|
670
|
+
});
|
|
671
|
+
|
|
672
|
+
test("markErrored should override previous peer states", () => {
|
|
673
|
+
const [agent, sessionID] = randomAgentAndSessionID();
|
|
674
|
+
const node = new LocalNode(agent.agentSecret, sessionID, Crypto);
|
|
675
|
+
|
|
676
|
+
const coValue = node.createCoValue({
|
|
677
|
+
type: "costream",
|
|
678
|
+
ruleset: { type: "unsafeAllowAll" },
|
|
679
|
+
meta: null,
|
|
680
|
+
...Crypto.createdNowUnique(),
|
|
681
|
+
});
|
|
682
|
+
|
|
683
|
+
const peerId = "test-peer-4";
|
|
684
|
+
|
|
685
|
+
// Initially mark as pending
|
|
686
|
+
coValue.markPending(peerId);
|
|
687
|
+
expect(coValue.isErroredInPeer(peerId)).toBe(false);
|
|
688
|
+
|
|
689
|
+
// Then mark as errored
|
|
690
|
+
const testError = {
|
|
691
|
+
type: "TriedToAddTransactionsWithoutVerifiedState" as const,
|
|
692
|
+
id: coValue.id,
|
|
693
|
+
};
|
|
694
|
+
|
|
695
|
+
coValue.markErrored(peerId, testError);
|
|
696
|
+
|
|
697
|
+
// Verify the peer is now errored
|
|
698
|
+
expect(coValue.isErroredInPeer(peerId)).toBe(true);
|
|
699
|
+
|
|
700
|
+
const peerState = coValue.getStateForPeer(peerId);
|
|
701
|
+
expect(peerState?.type).toBe("errored");
|
|
702
|
+
});
|
|
703
|
+
|
|
704
|
+
test("markErrored should work with different error types", () => {
|
|
705
|
+
const [agent, sessionID] = randomAgentAndSessionID();
|
|
706
|
+
const node = new LocalNode(agent.agentSecret, sessionID, Crypto);
|
|
707
|
+
|
|
708
|
+
const coValue = node.createCoValue({
|
|
709
|
+
type: "costream",
|
|
710
|
+
ruleset: { type: "unsafeAllowAll" },
|
|
711
|
+
meta: null,
|
|
712
|
+
...Crypto.createdNowUnique(),
|
|
713
|
+
});
|
|
714
|
+
|
|
715
|
+
const peerId = "test-peer-5";
|
|
716
|
+
|
|
717
|
+
// Test with InvalidSignature error
|
|
718
|
+
const invalidSignatureError = {
|
|
719
|
+
type: "InvalidSignature" as const,
|
|
720
|
+
id: coValue.id,
|
|
721
|
+
newSignature: "invalid-sig" as any,
|
|
722
|
+
sessionID: sessionID,
|
|
723
|
+
signerID: "test-signer" as any,
|
|
724
|
+
};
|
|
725
|
+
|
|
726
|
+
coValue.markErrored(peerId, invalidSignatureError);
|
|
727
|
+
expect(coValue.isErroredInPeer(peerId)).toBe(true);
|
|
728
|
+
|
|
729
|
+
// Test with InvalidHash error
|
|
730
|
+
const invalidHashError = {
|
|
731
|
+
type: "InvalidHash" as const,
|
|
732
|
+
id: coValue.id,
|
|
733
|
+
expectedNewHash: "expected" as any,
|
|
734
|
+
givenExpectedNewHash: "given" as any,
|
|
735
|
+
};
|
|
736
|
+
|
|
737
|
+
coValue.markErrored(peerId, invalidHashError);
|
|
738
|
+
expect(coValue.isErroredInPeer(peerId)).toBe(true);
|
|
739
|
+
|
|
740
|
+
// Test with TriedToAddTransactionsWithoutVerifiedState error
|
|
741
|
+
const noVerifiedStateError = {
|
|
742
|
+
type: "TriedToAddTransactionsWithoutVerifiedState" as const,
|
|
743
|
+
id: coValue.id,
|
|
744
|
+
};
|
|
745
|
+
|
|
746
|
+
coValue.markErrored(peerId, noVerifiedStateError);
|
|
747
|
+
expect(coValue.isErroredInPeer(peerId)).toBe(true);
|
|
748
|
+
});
|
|
749
|
+
|
|
750
|
+
test("markErrored should trigger immediate notification", () => {
|
|
751
|
+
const [agent, sessionID] = randomAgentAndSessionID();
|
|
752
|
+
const node = new LocalNode(agent.agentSecret, sessionID, Crypto);
|
|
753
|
+
|
|
754
|
+
const coValue = node.createCoValue({
|
|
755
|
+
type: "costream",
|
|
756
|
+
ruleset: { type: "unsafeAllowAll" },
|
|
757
|
+
meta: null,
|
|
758
|
+
...Crypto.createdNowUnique(),
|
|
759
|
+
});
|
|
760
|
+
|
|
761
|
+
const peerId = "test-peer-6";
|
|
762
|
+
const testError = {
|
|
763
|
+
type: "InvalidSignature" as const,
|
|
764
|
+
id: coValue.id,
|
|
765
|
+
newSignature: "test-sig" as any,
|
|
766
|
+
sessionID: sessionID,
|
|
767
|
+
signerID: "test-signer" as any,
|
|
768
|
+
};
|
|
769
|
+
|
|
770
|
+
let notificationCount = 0;
|
|
771
|
+
const listener = () => {
|
|
772
|
+
notificationCount++;
|
|
773
|
+
};
|
|
774
|
+
|
|
775
|
+
coValue.subscribe(listener);
|
|
776
|
+
|
|
777
|
+
// Mark as errored
|
|
778
|
+
coValue.markErrored(peerId, testError);
|
|
779
|
+
|
|
780
|
+
// Verify immediate notification
|
|
781
|
+
expect(notificationCount).toBeGreaterThan(0);
|
|
782
|
+
});
|
|
783
|
+
});
|
|
@@ -192,7 +192,7 @@ describe("CoValueCore loading state", () => {
|
|
|
192
192
|
const peer1 = createMockPeerState(
|
|
193
193
|
{
|
|
194
194
|
id: "peer1",
|
|
195
|
-
role: "
|
|
195
|
+
role: "server",
|
|
196
196
|
},
|
|
197
197
|
async () => {
|
|
198
198
|
state.provideHeader({} as CoValueHeader, "peer1");
|
|
@@ -236,7 +236,7 @@ describe("CoValueCore loading state", () => {
|
|
|
236
236
|
const peer1 = createMockPeerState(
|
|
237
237
|
{
|
|
238
238
|
id: "peer1",
|
|
239
|
-
role: "
|
|
239
|
+
role: "server",
|
|
240
240
|
},
|
|
241
241
|
async () => {
|
|
242
242
|
return new Promise(() => {});
|
|
@@ -1,19 +1,13 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, test } from "vitest";
|
|
2
|
-
import { RawCoList } from "../coValues/coList.js";
|
|
3
|
-
import { RawCoMap } from "../coValues/coMap.js";
|
|
4
|
-
import { RawCoStream } from "../coValues/coStream.js";
|
|
5
|
-
import { RawBinaryCoStream } from "../coValues/coStream.js";
|
|
6
|
-
import { WasmCrypto } from "../crypto/WasmCrypto.js";
|
|
7
|
-
import { RawAccountID } from "../exports.js";
|
|
8
2
|
import {
|
|
9
3
|
SyncMessagesLog,
|
|
10
|
-
|
|
4
|
+
TEST_NODE_CONFIG,
|
|
11
5
|
loadCoValueOrFail,
|
|
12
6
|
setupTestAccount,
|
|
13
7
|
setupTestNode,
|
|
14
8
|
} from "./testUtils.js";
|
|
15
9
|
|
|
16
|
-
let jazzCloud
|
|
10
|
+
let jazzCloud: ReturnType<typeof setupTestNode>;
|
|
17
11
|
|
|
18
12
|
beforeEach(async () => {
|
|
19
13
|
SyncMessagesLog.clear();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CoValueCore, LocalNode } from "../exports";
|
|
2
2
|
import { CoValueKnownState, NewContentMessage, SyncMessage } from "../sync";
|
|
3
3
|
|
|
4
|
-
function simplifySessions(msg: CoValueKnownState) {
|
|
4
|
+
function simplifySessions(msg: Pick<CoValueKnownState, "sessions" | "header">) {
|
|
5
5
|
const count = Object.values(msg.sessions).reduce(
|
|
6
6
|
(acc, session) => acc + session,
|
|
7
7
|
0,
|
|
@@ -51,7 +51,7 @@ export function toSimplifiedMessages(
|
|
|
51
51
|
case "done":
|
|
52
52
|
return `${from} -> ${to} | DONE ${getCoValue(msg.id)}`;
|
|
53
53
|
case "content":
|
|
54
|
-
return `${from} -> ${to} | CONTENT ${getCoValue(msg.id)} header: ${Boolean(msg.header)} new: ${simplifyNewContent(msg.new)}`;
|
|
54
|
+
return `${from} -> ${to} | CONTENT ${getCoValue(msg.id)} header: ${Boolean(msg.header)} new: ${simplifyNewContent(msg.new)}${msg.expectContentUntil ? ` expectContentUntil: ${simplifySessions({ sessions: msg.expectContentUntil, header: true })}` : ""}`;
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
|
|
@@ -4,12 +4,16 @@ import { WasmCrypto } from "../crypto/WasmCrypto";
|
|
|
4
4
|
import { LocalNode } from "../localNode";
|
|
5
5
|
import {
|
|
6
6
|
SyncMessagesLog,
|
|
7
|
+
TEST_NODE_CONFIG,
|
|
7
8
|
getSyncServerConnectedPeer,
|
|
8
9
|
setupTestNode,
|
|
9
10
|
} from "./testUtils";
|
|
10
11
|
|
|
11
12
|
const Crypto = await WasmCrypto.create();
|
|
12
|
-
let jazzCloud
|
|
13
|
+
let jazzCloud: ReturnType<typeof setupTestNode>;
|
|
14
|
+
|
|
15
|
+
// We want to simulate a real world communication that happens asynchronously
|
|
16
|
+
TEST_NODE_CONFIG.withAsyncPeers = true;
|
|
13
17
|
|
|
14
18
|
beforeEach(async () => {
|
|
15
19
|
SyncMessagesLog.clear();
|
|
@@ -50,10 +54,10 @@ describe("LocalNode auth sync", () => {
|
|
|
50
54
|
).toMatchInlineSnapshot(`
|
|
51
55
|
[
|
|
52
56
|
"client -> server | CONTENT Account header: true new: After: 0 New: 4",
|
|
53
|
-
"server -> client | KNOWN Account sessions: header/4",
|
|
54
57
|
"client -> server | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
55
|
-
"server -> client | KNOWN ProfileGroup sessions: header/5",
|
|
56
58
|
"client -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
59
|
+
"server -> client | KNOWN Account sessions: header/4",
|
|
60
|
+
"server -> client | KNOWN ProfileGroup sessions: header/5",
|
|
57
61
|
"server -> client | KNOWN Profile sessions: header/1",
|
|
58
62
|
]
|
|
59
63
|
`);
|
|
@@ -111,10 +115,10 @@ describe("LocalNode auth sync", () => {
|
|
|
111
115
|
).toMatchInlineSnapshot(`
|
|
112
116
|
[
|
|
113
117
|
"client -> server | CONTENT Account header: true new: After: 0 New: 5",
|
|
114
|
-
"server -> client | KNOWN Account sessions: header/5",
|
|
115
118
|
"client -> server | CONTENT Root header: true new: After: 0 New: 1",
|
|
116
|
-
"server -> client | KNOWN Root sessions: header/1",
|
|
117
119
|
"client -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
120
|
+
"server -> client | KNOWN Account sessions: header/5",
|
|
121
|
+
"server -> client | KNOWN Root sessions: header/1",
|
|
118
122
|
"server -> client | KNOWN Profile sessions: header/1",
|
|
119
123
|
]
|
|
120
124
|
`);
|
|
@@ -165,18 +169,18 @@ describe("LocalNode auth sync", () => {
|
|
|
165
169
|
).toMatchInlineSnapshot(`
|
|
166
170
|
[
|
|
167
171
|
"creation-node -> server | CONTENT Account header: true new: After: 0 New: 4",
|
|
172
|
+
"creation-node -> server | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
173
|
+
"creation-node -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
168
174
|
"auth-node -> server | LOAD Account sessions: empty",
|
|
169
175
|
"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
176
|
"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
177
|
"server -> creation-node | KNOWN Profile sessions: header/1",
|
|
178
|
+
"server -> auth-node | CONTENT Account header: true new: After: 0 New: 4",
|
|
179
|
+
"auth-node -> server | KNOWN Account sessions: header/4",
|
|
176
180
|
"auth-node -> server | LOAD Profile sessions: empty",
|
|
177
181
|
"server -> auth-node | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
178
|
-
"auth-node -> server | KNOWN ProfileGroup sessions: header/5",
|
|
179
182
|
"server -> auth-node | CONTENT Profile header: true new: After: 0 New: 1",
|
|
183
|
+
"auth-node -> server | KNOWN ProfileGroup sessions: header/5",
|
|
180
184
|
"auth-node -> server | KNOWN Profile sessions: header/1",
|
|
181
185
|
]
|
|
182
186
|
`);
|
|
@@ -200,6 +204,7 @@ describe("LocalNode auth sync", () => {
|
|
|
200
204
|
crypto: Crypto,
|
|
201
205
|
});
|
|
202
206
|
|
|
207
|
+
await creationNode.syncManager.waitForAllCoValuesSync();
|
|
203
208
|
creationNode.gracefulShutdown();
|
|
204
209
|
|
|
205
210
|
const { peer: existingAccountPeer } = getSyncServerConnectedPeer({
|
|
@@ -232,14 +237,19 @@ describe("LocalNode auth sync", () => {
|
|
|
232
237
|
).toMatchInlineSnapshot(`
|
|
233
238
|
[
|
|
234
239
|
"creation-node -> server | CONTENT Account header: true new: After: 0 New: 4",
|
|
235
|
-
"
|
|
240
|
+
"creation-node -> server | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
241
|
+
"creation-node -> server | CONTENT Profile header: true new: After: 0 New: 1",
|
|
236
242
|
"server -> creation-node | KNOWN Account sessions: header/4",
|
|
243
|
+
"server -> creation-node | KNOWN ProfileGroup sessions: header/5",
|
|
244
|
+
"server -> creation-node | KNOWN Profile sessions: header/1",
|
|
245
|
+
"auth-node -> server | LOAD Account sessions: empty",
|
|
237
246
|
"server -> auth-node | CONTENT Account header: true new: After: 0 New: 4",
|
|
238
247
|
"auth-node -> server | KNOWN Account sessions: header/4",
|
|
239
248
|
"auth-node -> server | LOAD Profile sessions: empty",
|
|
240
|
-
"server -> auth-node |
|
|
241
|
-
"auth-node
|
|
242
|
-
"
|
|
249
|
+
"server -> auth-node | CONTENT ProfileGroup header: true new: After: 0 New: 5",
|
|
250
|
+
"server -> auth-node | CONTENT Profile header: true new: After: 0 New: 1",
|
|
251
|
+
"auth-node -> server | KNOWN ProfileGroup sessions: header/5",
|
|
252
|
+
"auth-node -> server | KNOWN Profile sessions: header/1",
|
|
243
253
|
]
|
|
244
254
|
`);
|
|
245
255
|
});
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, test } from "vitest";
|
|
2
2
|
|
|
3
|
-
import { expectList, expectMap } from "../coValue";
|
|
4
|
-
import { WasmCrypto } from "../crypto/WasmCrypto";
|
|
5
3
|
import {
|
|
6
4
|
SyncMessagesLog,
|
|
5
|
+
TEST_NODE_CONFIG,
|
|
7
6
|
loadCoValueOrFail,
|
|
8
7
|
setupTestNode,
|
|
9
|
-
waitFor,
|
|
10
8
|
} from "./testUtils";
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
// We want to simulate a real world communication that happens asynchronously
|
|
11
|
+
TEST_NODE_CONFIG.withAsyncPeers = true;
|
|
12
|
+
|
|
13
|
+
let jazzCloud: ReturnType<typeof setupTestNode>;
|
|
14
14
|
|
|
15
15
|
beforeEach(async () => {
|
|
16
16
|
SyncMessagesLog.clear();
|
|
@@ -53,13 +53,10 @@ describe("invitations sync", () => {
|
|
|
53
53
|
[
|
|
54
54
|
"invite-consumer -> server | LOAD Map sessions: empty",
|
|
55
55
|
"server -> invite-consumer | CONTENT Group header: true new: After: 0 New: 5",
|
|
56
|
-
"invite-consumer -> server | KNOWN Group sessions: header/5",
|
|
57
56
|
"server -> invite-consumer | CONTENT Map header: true new: After: 0 New: 1",
|
|
57
|
+
"invite-consumer -> server | KNOWN Group sessions: header/5",
|
|
58
58
|
"invite-consumer -> server | KNOWN Map sessions: header/1",
|
|
59
59
|
"invite-consumer -> server | CONTENT Group header: false new: After: 0 New: 2",
|
|
60
|
-
"server -> invite-consumer | KNOWN Group sessions: header/7",
|
|
61
|
-
"server -> invite-provider | CONTENT Group header: false new: After: 0 New: 2",
|
|
62
|
-
"invite-provider -> server | KNOWN Group sessions: header/7",
|
|
63
60
|
]
|
|
64
61
|
`);
|
|
65
62
|
});
|
|
@@ -103,15 +100,12 @@ describe("invitations sync", () => {
|
|
|
103
100
|
[
|
|
104
101
|
"invite-consumer -> server | LOAD Map sessions: empty",
|
|
105
102
|
"server -> invite-consumer | CONTENT ParentGroup header: true new: After: 0 New: 4",
|
|
106
|
-
"invite-consumer -> server | KNOWN ParentGroup sessions: header/4",
|
|
107
103
|
"server -> invite-consumer | CONTENT Group header: true new: After: 0 New: 7",
|
|
108
|
-
"invite-consumer -> server | KNOWN Group sessions: header/7",
|
|
109
104
|
"server -> invite-consumer | CONTENT Map header: true new: After: 0 New: 1",
|
|
105
|
+
"invite-consumer -> server | KNOWN ParentGroup sessions: header/4",
|
|
106
|
+
"invite-consumer -> server | KNOWN Group sessions: header/7",
|
|
110
107
|
"invite-consumer -> server | KNOWN Map sessions: header/1",
|
|
111
108
|
"invite-consumer -> server | CONTENT Group header: false new: After: 0 New: 2",
|
|
112
|
-
"server -> invite-consumer | KNOWN Group sessions: header/9",
|
|
113
|
-
"server -> invite-provider | CONTENT Group header: false new: After: 0 New: 2",
|
|
114
|
-
"invite-provider -> server | KNOWN Group sessions: header/9",
|
|
115
109
|
]
|
|
116
110
|
`);
|
|
117
111
|
});
|
|
@@ -157,13 +151,13 @@ describe("invitations sync", () => {
|
|
|
157
151
|
"server -> invite-consumer | CONTENT ParentGroup header: true new: After: 0 New: 6",
|
|
158
152
|
"invite-consumer -> server | KNOWN ParentGroup sessions: header/6",
|
|
159
153
|
"invite-consumer -> server | CONTENT ParentGroup header: false new: After: 0 New: 2",
|
|
154
|
+
"invite-consumer -> server | LOAD Map sessions: empty",
|
|
160
155
|
"server -> invite-consumer | KNOWN ParentGroup sessions: header/8",
|
|
161
156
|
"server -> invite-provider | CONTENT ParentGroup header: false new: After: 0 New: 2",
|
|
162
|
-
"invite-consumer -> server | LOAD Map sessions: empty",
|
|
163
|
-
"invite-provider -> server | KNOWN ParentGroup sessions: header/8",
|
|
164
157
|
"server -> invite-consumer | CONTENT Group header: true new: After: 0 New: 5",
|
|
165
|
-
"invite-consumer -> server | KNOWN Group sessions: header/5",
|
|
166
158
|
"server -> invite-consumer | CONTENT Map header: true new: After: 0 New: 1",
|
|
159
|
+
"invite-provider -> server | KNOWN ParentGroup sessions: header/8",
|
|
160
|
+
"invite-consumer -> server | KNOWN Group sessions: header/5",
|
|
167
161
|
"invite-consumer -> server | KNOWN Map sessions: header/1",
|
|
168
162
|
]
|
|
169
163
|
`);
|