@fairfox/polly 0.67.0 → 0.70.0
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/dist/src/client/index.js +17 -20
- package/dist/src/client/index.js.map +4 -4
- package/dist/src/mesh.js +85 -11
- package/dist/src/mesh.js.map +7 -6
- package/dist/src/peer.js +80 -6
- package/dist/src/peer.js.map +7 -6
- package/dist/src/polly-ui/markdown.js +3 -3
- package/dist/src/polly-ui/markdown.js.map +2 -2
- package/dist/src/shared/lib/crdt-specialised.d.ts +6 -0
- package/dist/src/shared/lib/crdt-state.d.ts +8 -1
- package/dist/src/shared/lib/mesh-diagnostics.d.ts +98 -0
- package/dist/src/shared/lib/mesh-network-adapter.d.ts +0 -4
- package/dist/tools/test/src/e2e-mesh/console-allowlist.d.ts +31 -0
- package/dist/tools/test/src/e2e-mesh/index.d.ts +27 -0
- package/dist/tools/test/src/e2e-mesh/index.js +1089 -0
- package/dist/tools/test/src/e2e-mesh/index.js.map +22 -0
- package/dist/tools/test/src/e2e-mesh/keys.d.ts +55 -0
- package/dist/tools/test/src/e2e-mesh/launch-peer.d.ts +70 -0
- package/dist/tools/test/src/e2e-mesh/mesh-assertions.d.ts +53 -0
- package/dist/tools/test/src/e2e-mesh/serve-consumer.d.ts +32 -0
- package/dist/tools/test/src/e2e-mesh/wait-for-convergence.d.ts +38 -0
- package/dist/tools/test/src/e2e-mesh/with-relay.d.ts +53 -0
- package/dist/tools/test/src/visual/index.js +24 -24
- package/dist/tools/test/src/visual/index.js.map +2 -2
- package/dist/tools/verify/src/cli.js +361 -22
- package/dist/tools/verify/src/cli.js.map +6 -6
- package/dist/tools/verify/src/config.d.ts +26 -1
- package/dist/tools/verify/src/config.js +9 -1
- package/dist/tools/verify/src/config.js.map +4 -4
- package/dist/tools/verify/src/primitives/index.d.ts +30 -0
- package/dist/tools/visualize/src/cli.js +43 -1
- package/dist/tools/visualize/src/cli.js.map +3 -3
- package/package.json +11 -8
- package/LICENSE +0 -21
- package/README.md +0 -362
package/dist/src/peer.js
CHANGED
|
@@ -169,7 +169,7 @@ var wasmUrl = new URL(wasmPath, import.meta.url).href;
|
|
|
169
169
|
await initializeWasm(wasmUrl);
|
|
170
170
|
|
|
171
171
|
// src/shared/lib/crdt-specialised.ts
|
|
172
|
-
import { Counter, updateText } from "@automerge/automerge-repo/slim";
|
|
172
|
+
import { Automerge, Counter, updateText } from "@automerge/automerge-repo/slim";
|
|
173
173
|
import { effect, signal } from "@preact/signals";
|
|
174
174
|
|
|
175
175
|
// src/shared/lib/migrate-primitive.ts
|
|
@@ -394,6 +394,14 @@ function createSpecialisedPrimitive(config) {
|
|
|
394
394
|
loaded,
|
|
395
395
|
get handle() {
|
|
396
396
|
return currentHandle;
|
|
397
|
+
},
|
|
398
|
+
get changeCount() {
|
|
399
|
+
if (!currentHandle)
|
|
400
|
+
return;
|
|
401
|
+
const doc = currentHandle.doc();
|
|
402
|
+
if (!doc)
|
|
403
|
+
return;
|
|
404
|
+
return Automerge.getAllChanges(doc).length;
|
|
397
405
|
}
|
|
398
406
|
};
|
|
399
407
|
}
|
|
@@ -463,6 +471,7 @@ function $crdtList(key, initialValue, options) {
|
|
|
463
471
|
});
|
|
464
472
|
}
|
|
465
473
|
// src/shared/lib/crdt-state.ts
|
|
474
|
+
import { Automerge as Automerge2 } from "@automerge/automerge-repo/slim";
|
|
466
475
|
import { effect as effect2, signal as signal2 } from "@preact/signals";
|
|
467
476
|
function $crdtState(options) {
|
|
468
477
|
if (migrationRegistry.isMarked(options.key, options.primitive)) {
|
|
@@ -596,6 +605,14 @@ function $crdtState(options) {
|
|
|
596
605
|
loaded,
|
|
597
606
|
get handle() {
|
|
598
607
|
return currentHandle;
|
|
608
|
+
},
|
|
609
|
+
get changeCount() {
|
|
610
|
+
if (!currentHandle)
|
|
611
|
+
return;
|
|
612
|
+
const doc = currentHandle.doc();
|
|
613
|
+
if (!doc)
|
|
614
|
+
return;
|
|
615
|
+
return Automerge2.getAllChanges(doc).length;
|
|
599
616
|
}
|
|
600
617
|
};
|
|
601
618
|
}
|
|
@@ -633,6 +650,30 @@ import {
|
|
|
633
650
|
NetworkAdapter
|
|
634
651
|
} from "@automerge/automerge-repo/slim";
|
|
635
652
|
|
|
653
|
+
// src/shared/lib/mesh-diagnostics.ts
|
|
654
|
+
var listeners = new Set;
|
|
655
|
+
function emitMeshDiagnostic(diagnostic) {
|
|
656
|
+
const event = { ...diagnostic, timestamp: Date.now() };
|
|
657
|
+
for (const listener of listeners) {
|
|
658
|
+
try {
|
|
659
|
+
listener(event);
|
|
660
|
+
} catch {}
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
function subscribeToMeshDiagnostics(listener) {
|
|
664
|
+
listeners.add(listener);
|
|
665
|
+
return () => {
|
|
666
|
+
listeners.delete(listener);
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
function recordMeshDiagnostics() {
|
|
670
|
+
const captured = [];
|
|
671
|
+
const stop = subscribeToMeshDiagnostics((event) => {
|
|
672
|
+
captured.push(event);
|
|
673
|
+
});
|
|
674
|
+
return { events: captured, stop };
|
|
675
|
+
}
|
|
676
|
+
|
|
636
677
|
// src/shared/lib/signing.ts
|
|
637
678
|
import nacl2 from "tweetnacl";
|
|
638
679
|
var PUBLIC_KEY_BYTES = 32;
|
|
@@ -794,21 +835,38 @@ class MeshNetworkAdapter extends NetworkAdapter {
|
|
|
794
835
|
let signed;
|
|
795
836
|
try {
|
|
796
837
|
signed = decodeSignedEnvelope(message.data);
|
|
797
|
-
} catch {
|
|
838
|
+
} catch (err) {
|
|
839
|
+
emitMeshDiagnostic({
|
|
840
|
+
kind: "drop:malformed-signed-envelope",
|
|
841
|
+
reason: err instanceof Error ? err.message : String(err)
|
|
842
|
+
});
|
|
798
843
|
return;
|
|
799
844
|
}
|
|
800
845
|
const keyring = this.keyringSource();
|
|
801
846
|
if (keyring.revokedPeers.has(signed.senderId)) {
|
|
847
|
+
emitMeshDiagnostic({
|
|
848
|
+
kind: "drop:revoked-peer",
|
|
849
|
+
senderId: signed.senderId
|
|
850
|
+
});
|
|
802
851
|
return;
|
|
803
852
|
}
|
|
804
853
|
const senderKey = keyring.knownPeers.get(signed.senderId);
|
|
805
854
|
if (!senderKey) {
|
|
855
|
+
emitMeshDiagnostic({
|
|
856
|
+
kind: "drop:unknown-peer",
|
|
857
|
+
senderId: signed.senderId
|
|
858
|
+
});
|
|
806
859
|
return;
|
|
807
860
|
}
|
|
808
861
|
let verifiedPayload;
|
|
809
862
|
try {
|
|
810
863
|
verifiedPayload = openEnvelope2(signed, senderKey);
|
|
811
|
-
} catch {
|
|
864
|
+
} catch (err) {
|
|
865
|
+
emitMeshDiagnostic({
|
|
866
|
+
kind: "drop:bad-signature",
|
|
867
|
+
senderId: signed.senderId,
|
|
868
|
+
reason: err instanceof Error ? err.message : String(err)
|
|
869
|
+
});
|
|
812
870
|
return;
|
|
813
871
|
}
|
|
814
872
|
if (!this.encryptionEnabled) {
|
|
@@ -817,17 +875,33 @@ class MeshNetworkAdapter extends NetworkAdapter {
|
|
|
817
875
|
let encrypted;
|
|
818
876
|
try {
|
|
819
877
|
encrypted = decodeEncryptedEnvelope(verifiedPayload);
|
|
820
|
-
} catch {
|
|
878
|
+
} catch (err) {
|
|
879
|
+
emitMeshDiagnostic({
|
|
880
|
+
kind: "drop:malformed-encrypted-envelope",
|
|
881
|
+
senderId: signed.senderId,
|
|
882
|
+
reason: err instanceof Error ? err.message : String(err)
|
|
883
|
+
});
|
|
821
884
|
return;
|
|
822
885
|
}
|
|
823
886
|
const docKey = keyring.documentKeys.get(encrypted.documentId);
|
|
824
887
|
if (!docKey) {
|
|
888
|
+
emitMeshDiagnostic({
|
|
889
|
+
kind: "drop:missing-doc-key",
|
|
890
|
+
senderId: signed.senderId,
|
|
891
|
+
documentId: encrypted.documentId
|
|
892
|
+
});
|
|
825
893
|
return;
|
|
826
894
|
}
|
|
827
895
|
let plaintext;
|
|
828
896
|
try {
|
|
829
897
|
plaintext = openEnvelope(encrypted, docKey);
|
|
830
|
-
} catch {
|
|
898
|
+
} catch (err) {
|
|
899
|
+
emitMeshDiagnostic({
|
|
900
|
+
kind: "drop:bad-decryption",
|
|
901
|
+
senderId: signed.senderId,
|
|
902
|
+
documentId: encrypted.documentId,
|
|
903
|
+
reason: err instanceof Error ? err.message : String(err)
|
|
904
|
+
});
|
|
831
905
|
return;
|
|
832
906
|
}
|
|
833
907
|
return deserialiseMessage(plaintext);
|
|
@@ -1066,4 +1140,4 @@ export {
|
|
|
1066
1140
|
$crdtCounter
|
|
1067
1141
|
};
|
|
1068
1142
|
|
|
1069
|
-
//# debugId=
|
|
1143
|
+
//# debugId=4F0B6642FFEB852864756E2164756E21
|