@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.
Files changed (35) hide show
  1. package/dist/src/client/index.js +17 -20
  2. package/dist/src/client/index.js.map +4 -4
  3. package/dist/src/mesh.js +85 -11
  4. package/dist/src/mesh.js.map +7 -6
  5. package/dist/src/peer.js +80 -6
  6. package/dist/src/peer.js.map +7 -6
  7. package/dist/src/polly-ui/markdown.js +3 -3
  8. package/dist/src/polly-ui/markdown.js.map +2 -2
  9. package/dist/src/shared/lib/crdt-specialised.d.ts +6 -0
  10. package/dist/src/shared/lib/crdt-state.d.ts +8 -1
  11. package/dist/src/shared/lib/mesh-diagnostics.d.ts +98 -0
  12. package/dist/src/shared/lib/mesh-network-adapter.d.ts +0 -4
  13. package/dist/tools/test/src/e2e-mesh/console-allowlist.d.ts +31 -0
  14. package/dist/tools/test/src/e2e-mesh/index.d.ts +27 -0
  15. package/dist/tools/test/src/e2e-mesh/index.js +1089 -0
  16. package/dist/tools/test/src/e2e-mesh/index.js.map +22 -0
  17. package/dist/tools/test/src/e2e-mesh/keys.d.ts +55 -0
  18. package/dist/tools/test/src/e2e-mesh/launch-peer.d.ts +70 -0
  19. package/dist/tools/test/src/e2e-mesh/mesh-assertions.d.ts +53 -0
  20. package/dist/tools/test/src/e2e-mesh/serve-consumer.d.ts +32 -0
  21. package/dist/tools/test/src/e2e-mesh/wait-for-convergence.d.ts +38 -0
  22. package/dist/tools/test/src/e2e-mesh/with-relay.d.ts +53 -0
  23. package/dist/tools/test/src/visual/index.js +24 -24
  24. package/dist/tools/test/src/visual/index.js.map +2 -2
  25. package/dist/tools/verify/src/cli.js +361 -22
  26. package/dist/tools/verify/src/cli.js.map +6 -6
  27. package/dist/tools/verify/src/config.d.ts +26 -1
  28. package/dist/tools/verify/src/config.js +9 -1
  29. package/dist/tools/verify/src/config.js.map +4 -4
  30. package/dist/tools/verify/src/primitives/index.d.ts +30 -0
  31. package/dist/tools/visualize/src/cli.js +43 -1
  32. package/dist/tools/visualize/src/cli.js.map +3 -3
  33. package/package.json +11 -8
  34. package/LICENSE +0 -21
  35. 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=A27B5BBEA3C27BC064756E2164756E21
1143
+ //# debugId=4F0B6642FFEB852864756E2164756E21