@waku/core 0.0.1 → 0.0.3

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 (134) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/bundle/{index-691c0be6.js → index-a67d7136.js} +1 -1
  3. package/bundle/{index-0a4bdddc.js → index-f7e049ad.js} +1 -1
  4. package/bundle/index.js +24853 -3555
  5. package/bundle/lib/peer_discovery_static_list.js +18 -4
  6. package/bundle/lib/predefined_bootstrap_nodes.js +1 -1
  7. package/bundle/lib/wait_for_remote_peer.js +2 -3
  8. package/bundle/lib/waku_message/topic_only_message.js +2 -3
  9. package/bundle/lib/waku_message/version_0.js +317 -4
  10. package/bundle/{message-e2db79d7.js → message-049c8b67.js} +861 -2
  11. package/bundle/{topic_only_message-34f36fa6.js → topic_only_message-5ad3a869.js} +1 -1
  12. package/dist/index.d.ts +0 -3
  13. package/dist/index.js +0 -3
  14. package/dist/index.js.map +1 -1
  15. package/dist/lib/waku_filter/index.d.ts +2 -2
  16. package/dist/lib/waku_filter/index.js.map +1 -1
  17. package/dist/lib/waku_message/version_0.d.ts +3 -2
  18. package/dist/lib/waku_message/version_0.js +2 -1
  19. package/dist/lib/waku_message/version_0.js.map +1 -1
  20. package/dist/lib/waku_relay/index.d.ts +4 -3
  21. package/dist/lib/waku_relay/index.js.map +1 -1
  22. package/dist/lib/waku_store/index.d.ts +4 -4
  23. package/package.json +4 -123
  24. package/src/index.ts +0 -10
  25. package/src/lib/waku_filter/index.ts +4 -3
  26. package/src/lib/waku_message/version_0.ts +5 -3
  27. package/src/lib/waku_relay/index.ts +4 -3
  28. package/src/lib/waku_store/index.ts +5 -5
  29. package/bundle/crypto-8551d579.js +0 -2585
  30. package/bundle/crypto-b00764b7.js +0 -1772
  31. package/bundle/enr-564d4a51.js +0 -20785
  32. package/bundle/enr-9fc5eed8.js +0 -20786
  33. package/bundle/enr-f6e82a53.js +0 -20785
  34. package/bundle/events-fcbda4dc.js +0 -76
  35. package/bundle/index-02d21809.js +0 -20
  36. package/bundle/index-2ae915be.js +0 -1854
  37. package/bundle/index-a013a259.js +0 -20
  38. package/bundle/index-ba42b4fc.js +0 -862
  39. package/bundle/lib/enr.js +0 -8
  40. package/bundle/lib/peer_discovery_dns.js +0 -5018
  41. package/bundle/lib/utils.js +0 -1
  42. package/bundle/lib/waku_message/version_1.js +0 -463
  43. package/bundle/multiaddr_to_peer_info-c406b1e1.js +0 -19
  44. package/bundle/multiaddr_to_peer_info-fd1de516.js +0 -19
  45. package/bundle/utils-9a3221f2.js +0 -815
  46. package/bundle/version_0-e6fe440c.js +0 -317
  47. package/dist/lib/crypto.d.ts +0 -34
  48. package/dist/lib/crypto.js +0 -79
  49. package/dist/lib/crypto.js.map +0 -1
  50. package/dist/lib/enr/constants.d.ts +0 -4
  51. package/dist/lib/enr/constants.js +0 -8
  52. package/dist/lib/enr/constants.js.map +0 -1
  53. package/dist/lib/enr/enr.d.ts +0 -90
  54. package/dist/lib/enr/enr.js +0 -432
  55. package/dist/lib/enr/enr.js.map +0 -1
  56. package/dist/lib/enr/index.d.ts +0 -5
  57. package/dist/lib/enr/index.js +0 -6
  58. package/dist/lib/enr/index.js.map +0 -1
  59. package/dist/lib/enr/keypair/index.d.ts +0 -8
  60. package/dist/lib/enr/keypair/index.js +0 -53
  61. package/dist/lib/enr/keypair/index.js.map +0 -1
  62. package/dist/lib/enr/keypair/secp256k1.d.ts +0 -13
  63. package/dist/lib/enr/keypair/secp256k1.js +0 -57
  64. package/dist/lib/enr/keypair/secp256k1.js.map +0 -1
  65. package/dist/lib/enr/keypair/types.d.ts +0 -13
  66. package/dist/lib/enr/keypair/types.js +0 -7
  67. package/dist/lib/enr/keypair/types.js.map +0 -1
  68. package/dist/lib/enr/multiaddr_from_fields.d.ts +0 -2
  69. package/dist/lib/enr/multiaddr_from_fields.js +0 -8
  70. package/dist/lib/enr/multiaddr_from_fields.js.map +0 -1
  71. package/dist/lib/enr/multiaddrs_codec.d.ts +0 -3
  72. package/dist/lib/enr/multiaddrs_codec.js +0 -32
  73. package/dist/lib/enr/multiaddrs_codec.js.map +0 -1
  74. package/dist/lib/enr/types.d.ts +0 -8
  75. package/dist/lib/enr/types.js +0 -3
  76. package/dist/lib/enr/types.js.map +0 -1
  77. package/dist/lib/enr/v4.d.ts +0 -3
  78. package/dist/lib/enr/v4.js +0 -14
  79. package/dist/lib/enr/v4.js.map +0 -1
  80. package/dist/lib/enr/waku2_codec.d.ts +0 -8
  81. package/dist/lib/enr/waku2_codec.js +0 -36
  82. package/dist/lib/enr/waku2_codec.js.map +0 -1
  83. package/dist/lib/peer_discovery_dns/dns.d.ts +0 -48
  84. package/dist/lib/peer_discovery_dns/dns.js +0 -158
  85. package/dist/lib/peer_discovery_dns/dns.js.map +0 -1
  86. package/dist/lib/peer_discovery_dns/dns_over_https.d.ts +0 -32
  87. package/dist/lib/peer_discovery_dns/dns_over_https.js +0 -87
  88. package/dist/lib/peer_discovery_dns/dns_over_https.js.map +0 -1
  89. package/dist/lib/peer_discovery_dns/enrtree.d.ts +0 -33
  90. package/dist/lib/peer_discovery_dns/enrtree.js +0 -76
  91. package/dist/lib/peer_discovery_dns/enrtree.js.map +0 -1
  92. package/dist/lib/peer_discovery_dns/fetch_nodes.d.ts +0 -14
  93. package/dist/lib/peer_discovery_dns/fetch_nodes.js +0 -133
  94. package/dist/lib/peer_discovery_dns/fetch_nodes.js.map +0 -1
  95. package/dist/lib/peer_discovery_dns/index.d.ts +0 -30
  96. package/dist/lib/peer_discovery_dns/index.js +0 -54
  97. package/dist/lib/peer_discovery_dns/index.js.map +0 -1
  98. package/dist/lib/utils.d.ts +0 -22
  99. package/dist/lib/utils.js +0 -40
  100. package/dist/lib/utils.js.map +0 -1
  101. package/dist/lib/waku_message/constants.d.ts +0 -12
  102. package/dist/lib/waku_message/constants.js +0 -10
  103. package/dist/lib/waku_message/constants.js.map +0 -1
  104. package/dist/lib/waku_message/ecies.d.ts +0 -17
  105. package/dist/lib/waku_message/ecies.js +0 -126
  106. package/dist/lib/waku_message/ecies.js.map +0 -1
  107. package/dist/lib/waku_message/symmetric.d.ts +0 -3
  108. package/dist/lib/waku_message/symmetric.js +0 -18
  109. package/dist/lib/waku_message/symmetric.js.map +0 -1
  110. package/dist/lib/waku_message/version_1.d.ts +0 -93
  111. package/dist/lib/waku_message/version_1.js +0 -325
  112. package/dist/lib/waku_message/version_1.js.map +0 -1
  113. package/src/lib/crypto.ts +0 -100
  114. package/src/lib/enr/constants.ts +0 -10
  115. package/src/lib/enr/enr.ts +0 -516
  116. package/src/lib/enr/index.ts +0 -5
  117. package/src/lib/enr/keypair/index.ts +0 -76
  118. package/src/lib/enr/keypair/secp256k1.ts +0 -69
  119. package/src/lib/enr/keypair/types.ts +0 -14
  120. package/src/lib/enr/multiaddr_from_fields.ts +0 -18
  121. package/src/lib/enr/multiaddrs_codec.ts +0 -50
  122. package/src/lib/enr/types.ts +0 -11
  123. package/src/lib/enr/v4.ts +0 -22
  124. package/src/lib/enr/waku2_codec.ts +0 -39
  125. package/src/lib/peer_discovery_dns/dns.ts +0 -223
  126. package/src/lib/peer_discovery_dns/dns_over_https.ts +0 -98
  127. package/src/lib/peer_discovery_dns/enrtree.ts +0 -123
  128. package/src/lib/peer_discovery_dns/fetch_nodes.ts +0 -180
  129. package/src/lib/peer_discovery_dns/index.ts +0 -84
  130. package/src/lib/utils.ts +0 -50
  131. package/src/lib/waku_message/constants.ts +0 -10
  132. package/src/lib/waku_message/ecies.ts +0 -194
  133. package/src/lib/waku_message/symmetric.ts +0 -33
  134. package/src/lib/waku_message/version_1.ts +0 -457
@@ -1,32 +0,0 @@
1
- import { multiaddr } from "@multiformats/multiaddr";
2
- import { MULTIADDR_LENGTH_SIZE } from "./constants.js";
3
- export function decodeMultiaddrs(bytes) {
4
- const multiaddrs = [];
5
- let index = 0;
6
- while (index < bytes.length) {
7
- const sizeDataView = new DataView(bytes.buffer, index, MULTIADDR_LENGTH_SIZE);
8
- const size = sizeDataView.getUint16(0);
9
- index += MULTIADDR_LENGTH_SIZE;
10
- const multiaddrBytes = bytes.slice(index, index + size);
11
- index += size;
12
- multiaddrs.push(multiaddr(multiaddrBytes));
13
- }
14
- return multiaddrs;
15
- }
16
- export function encodeMultiaddrs(multiaddrs) {
17
- const totalLength = multiaddrs.reduce((acc, ma) => acc + MULTIADDR_LENGTH_SIZE + ma.bytes.length, 0);
18
- const bytes = new Uint8Array(totalLength);
19
- const dataView = new DataView(bytes.buffer);
20
- let index = 0;
21
- multiaddrs.forEach((multiaddr) => {
22
- if (multiaddr.getPeerId())
23
- throw new Error("`multiaddr` field MUST not contain peer id");
24
- // Prepend the size of the next entry
25
- dataView.setUint16(index, multiaddr.bytes.length);
26
- index += MULTIADDR_LENGTH_SIZE;
27
- bytes.set(multiaddr.bytes, index);
28
- index += multiaddr.bytes.length;
29
- });
30
- return bytes;
31
- }
32
- //# sourceMappingURL=multiaddrs_codec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"multiaddrs_codec.js","sourceRoot":"","sources":["../../../src/lib/enr/multiaddrs_codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,UAAU,gBAAgB,CAAC,KAAiB;IAChD,MAAM,UAAU,GAAG,EAAE,CAAC;IAEtB,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE;QAC3B,MAAM,YAAY,GAAG,IAAI,QAAQ,CAC/B,KAAK,CAAC,MAAM,EACZ,KAAK,EACL,qBAAqB,CACtB,CAAC;QACF,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACvC,KAAK,IAAI,qBAAqB,CAAC;QAE/B,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC;QACxD,KAAK,IAAI,IAAI,CAAC;QAEd,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;KAC5C;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAuB;IACtD,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CACnC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,qBAAqB,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAC1D,CAAC,CACF,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAC/B,IAAI,SAAS,CAAC,SAAS,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAEhE,qCAAqC;QACrC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClD,KAAK,IAAI,qBAAqB,CAAC;QAE/B,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAClC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * We represent NodeId as a hex string, since node equality is used very heavily
3
- * and it is convenient to index data by NodeId
4
- */
5
- export declare type NodeId = string;
6
- export declare type SequenceNumber = bigint;
7
- export declare type ENRKey = string;
8
- export declare type ENRValue = Uint8Array;
@@ -1,3 +0,0 @@
1
- // Custom and aliased types for ENRs
2
- export {};
3
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/enr/types.ts"],"names":[],"mappings":"AAAA,oCAAoC"}
@@ -1,3 +0,0 @@
1
- import { NodeId } from "./types";
2
- export declare function sign(privKey: Uint8Array, msg: Uint8Array): Promise<Uint8Array>;
3
- export declare function nodeId(pubKey: Uint8Array): NodeId;
@@ -1,14 +0,0 @@
1
- import * as secp from "@noble/secp256k1";
2
- import { keccak256 } from "../crypto.js";
3
- import { bytesToHex } from "../utils.js";
4
- export async function sign(privKey, msg) {
5
- return secp.sign(keccak256(msg), privKey, {
6
- der: false,
7
- });
8
- }
9
- export function nodeId(pubKey) {
10
- const publicKey = secp.Point.fromHex(pubKey);
11
- const uncompressedPubkey = publicKey.toRawBytes(false);
12
- return bytesToHex(keccak256(uncompressedPubkey.slice(1)));
13
- }
14
- //# sourceMappingURL=v4.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"v4.js","sourceRoot":"","sources":["../../../src/lib/enr/v4.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAmB,EACnB,GAAe;IAEf,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE;QACxC,GAAG,EAAE,KAAK;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,MAAkB;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,kBAAkB,GAAG,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAEvD,OAAO,UAAU,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC"}
@@ -1,8 +0,0 @@
1
- export interface Waku2 {
2
- relay: boolean;
3
- store: boolean;
4
- filter: boolean;
5
- lightPush: boolean;
6
- }
7
- export declare function encodeWaku2(protocols: Waku2): number;
8
- export declare function decodeWaku2(byte: number): Waku2;
@@ -1,36 +0,0 @@
1
- export function encodeWaku2(protocols) {
2
- let byte = 0;
3
- if (protocols.lightPush)
4
- byte += 1;
5
- byte = byte << 1;
6
- if (protocols.filter)
7
- byte += 1;
8
- byte = byte << 1;
9
- if (protocols.store)
10
- byte += 1;
11
- byte = byte << 1;
12
- if (protocols.relay)
13
- byte += 1;
14
- return byte;
15
- }
16
- export function decodeWaku2(byte) {
17
- const waku2 = {
18
- relay: false,
19
- store: false,
20
- filter: false,
21
- lightPush: false,
22
- };
23
- if (byte % 2)
24
- waku2.relay = true;
25
- byte = byte >> 1;
26
- if (byte % 2)
27
- waku2.store = true;
28
- byte = byte >> 1;
29
- if (byte % 2)
30
- waku2.filter = true;
31
- byte = byte >> 1;
32
- if (byte % 2)
33
- waku2.lightPush = true;
34
- return waku2;
35
- }
36
- //# sourceMappingURL=waku2_codec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"waku2_codec.js","sourceRoot":"","sources":["../../../src/lib/enr/waku2_codec.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,WAAW,CAAC,SAAgB;IAC1C,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,IAAI,SAAS,CAAC,SAAS;QAAE,IAAI,IAAI,CAAC,CAAC;IACnC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;IACjB,IAAI,SAAS,CAAC,MAAM;QAAE,IAAI,IAAI,CAAC,CAAC;IAChC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;IACjB,IAAI,SAAS,CAAC,KAAK;QAAE,IAAI,IAAI,CAAC,CAAC;IAC/B,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;IACjB,IAAI,SAAS,CAAC,KAAK;QAAE,IAAI,IAAI,CAAC,CAAC;IAE/B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,KAAK,GAAG;QACZ,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,KAAK;KACjB,CAAC;IAEF,IAAI,IAAI,GAAG,CAAC;QAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;IACjC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;IACjB,IAAI,IAAI,GAAG,CAAC;QAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;IACjC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;IACjB,IAAI,IAAI,GAAG,CAAC;QAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;IAClC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;IACjB,IAAI,IAAI,GAAG,CAAC;QAAE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;IAErC,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,48 +0,0 @@
1
- import { ENR } from "../enr";
2
- export declare type SearchContext = {
3
- domain: string;
4
- publicKey: string;
5
- visits: {
6
- [key: string]: boolean;
7
- };
8
- };
9
- export interface DnsClient {
10
- resolveTXT: (domain: string) => Promise<string[]>;
11
- }
12
- export interface NodeCapabilityCount {
13
- relay: number;
14
- store: number;
15
- filter: number;
16
- lightPush: number;
17
- }
18
- export declare class DnsNodeDiscovery {
19
- private readonly dns;
20
- private readonly _DNSTreeCache;
21
- private readonly _errorTolerance;
22
- static dnsOverHttp(dnsClient?: DnsClient): DnsNodeDiscovery;
23
- /**
24
- * Returns a list of verified peers listed in an EIP-1459 DNS tree. Method may
25
- * return fewer peers than requested if [[wantedNodeCapabilityCount]] requires
26
- * larger quantity of peers than available or the number of errors/duplicate
27
- * peers encountered by randomized search exceeds the sum of the fields of
28
- * [[wantedNodeCapabilityCount]] plus the [[_errorTolerance]] factor.
29
- */
30
- getPeers(enrTreeUrls: string[], wantedNodeCapabilityCount: Partial<NodeCapabilityCount>): Promise<ENR[]>;
31
- constructor(dns: DnsClient);
32
- /**
33
- * {@docInherit getPeers}
34
- */
35
- getNextPeer(enrTreeUrls: string[], wantedNodeCapabilityCount: Partial<NodeCapabilityCount>): AsyncGenerator<ENR>;
36
- /**
37
- * Runs a recursive, randomized descent of the DNS tree to retrieve a single
38
- * ENR record as an ENR. Returns null if parsing or DNS resolution fails.
39
- */
40
- private _search;
41
- /**
42
- * Retrieves the TXT record stored at a location from either
43
- * this DNS tree cache or via DNS query.
44
- *
45
- * @throws if the TXT Record contains non-UTF-8 values.
46
- */
47
- private _getTXTRecord;
48
- }
@@ -1,158 +0,0 @@
1
- import debug from "debug";
2
- import { ENR } from "../enr/index.js";
3
- import { DnsOverHttps } from "./dns_over_https.js";
4
- import { ENRTree } from "./enrtree.js";
5
- import { fetchNodesUntilCapabilitiesFulfilled, yieldNodesUntilCapabilitiesFulfilled, } from "./fetch_nodes.js";
6
- const log = debug("waku:discovery:dns");
7
- export class DnsNodeDiscovery {
8
- constructor(dns) {
9
- this._errorTolerance = 10;
10
- this._DNSTreeCache = {};
11
- this.dns = dns;
12
- }
13
- static dnsOverHttp(dnsClient) {
14
- if (!dnsClient) {
15
- dnsClient = new DnsOverHttps();
16
- }
17
- return new DnsNodeDiscovery(dnsClient);
18
- }
19
- /**
20
- * Returns a list of verified peers listed in an EIP-1459 DNS tree. Method may
21
- * return fewer peers than requested if [[wantedNodeCapabilityCount]] requires
22
- * larger quantity of peers than available or the number of errors/duplicate
23
- * peers encountered by randomized search exceeds the sum of the fields of
24
- * [[wantedNodeCapabilityCount]] plus the [[_errorTolerance]] factor.
25
- */
26
- async getPeers(enrTreeUrls, wantedNodeCapabilityCount) {
27
- const networkIndex = Math.floor(Math.random() * enrTreeUrls.length);
28
- const { publicKey, domain } = ENRTree.parseTree(enrTreeUrls[networkIndex]);
29
- const context = {
30
- domain,
31
- publicKey,
32
- visits: {},
33
- };
34
- const peers = await fetchNodesUntilCapabilitiesFulfilled(wantedNodeCapabilityCount, this._errorTolerance, () => this._search(domain, context));
35
- log("retrieved peers: ", peers.map((peer) => {
36
- return {
37
- id: peer.peerId?.toString(),
38
- multiaddrs: peer.multiaddrs?.map((ma) => ma.toString()),
39
- };
40
- }));
41
- return peers;
42
- }
43
- /**
44
- * {@docInherit getPeers}
45
- */
46
- async *getNextPeer(enrTreeUrls, wantedNodeCapabilityCount) {
47
- const networkIndex = Math.floor(Math.random() * enrTreeUrls.length);
48
- const { publicKey, domain } = ENRTree.parseTree(enrTreeUrls[networkIndex]);
49
- const context = {
50
- domain,
51
- publicKey,
52
- visits: {},
53
- };
54
- for await (const peer of yieldNodesUntilCapabilitiesFulfilled(wantedNodeCapabilityCount, this._errorTolerance, () => this._search(domain, context))) {
55
- yield peer;
56
- }
57
- }
58
- /**
59
- * Runs a recursive, randomized descent of the DNS tree to retrieve a single
60
- * ENR record as an ENR. Returns null if parsing or DNS resolution fails.
61
- */
62
- async _search(subdomain, context) {
63
- try {
64
- const entry = await this._getTXTRecord(subdomain, context);
65
- context.visits[subdomain] = true;
66
- let next;
67
- let branches;
68
- const entryType = getEntryType(entry);
69
- try {
70
- switch (entryType) {
71
- case ENRTree.ROOT_PREFIX:
72
- next = ENRTree.parseAndVerifyRoot(entry, context.publicKey);
73
- return await this._search(next, context);
74
- case ENRTree.BRANCH_PREFIX:
75
- branches = ENRTree.parseBranch(entry);
76
- next = selectRandomPath(branches, context);
77
- return await this._search(next, context);
78
- case ENRTree.RECORD_PREFIX:
79
- return ENR.decodeTxt(entry);
80
- default:
81
- return null;
82
- }
83
- }
84
- catch (error) {
85
- log(`Failed to search DNS tree ${entryType} at subdomain ${subdomain}: ${error}`);
86
- return null;
87
- }
88
- }
89
- catch (error) {
90
- log(`Failed to retrieve TXT record at subdomain ${subdomain}: ${error}`);
91
- return null;
92
- }
93
- }
94
- /**
95
- * Retrieves the TXT record stored at a location from either
96
- * this DNS tree cache or via DNS query.
97
- *
98
- * @throws if the TXT Record contains non-UTF-8 values.
99
- */
100
- async _getTXTRecord(subdomain, context) {
101
- if (this._DNSTreeCache[subdomain]) {
102
- return this._DNSTreeCache[subdomain];
103
- }
104
- // Location is either the top level tree entry host or a subdomain of it.
105
- const location = subdomain !== context.domain
106
- ? `${subdomain}.${context.domain}`
107
- : context.domain;
108
- const response = await this.dns.resolveTXT(location);
109
- if (!response.length)
110
- throw new Error("Received empty result array while fetching TXT record");
111
- if (!response[0].length)
112
- throw new Error("Received empty TXT record");
113
- // Branch entries can be an array of strings of comma delimited subdomains, with
114
- // some subdomain strings split across the array elements
115
- const result = response.join("");
116
- this._DNSTreeCache[subdomain] = result;
117
- return result;
118
- }
119
- }
120
- function getEntryType(entry) {
121
- if (entry.startsWith(ENRTree.ROOT_PREFIX))
122
- return ENRTree.ROOT_PREFIX;
123
- if (entry.startsWith(ENRTree.BRANCH_PREFIX))
124
- return ENRTree.BRANCH_PREFIX;
125
- if (entry.startsWith(ENRTree.RECORD_PREFIX))
126
- return ENRTree.RECORD_PREFIX;
127
- return "";
128
- }
129
- /**
130
- * Returns a randomly selected subdomain string from the list provided by a branch
131
- * entry record.
132
- *
133
- * The client must track subdomains which are already resolved to avoid
134
- * going into an infinite loop b/c branch entries can contain
135
- * circular references. It’s in the client’s best interest to traverse the
136
- * tree in random order.
137
- */
138
- function selectRandomPath(branches, context) {
139
- // Identify domains already visited in this traversal of the DNS tree.
140
- // Then filter against them to prevent cycles.
141
- const circularRefs = {};
142
- for (const [idx, subdomain] of branches.entries()) {
143
- if (context.visits[subdomain]) {
144
- circularRefs[idx] = true;
145
- }
146
- }
147
- // If all possible paths are circular...
148
- if (Object.keys(circularRefs).length === branches.length) {
149
- throw new Error("Unresolvable circular path detected");
150
- }
151
- // Randomly select a viable path
152
- let index;
153
- do {
154
- index = Math.floor(Math.random() * branches.length);
155
- } while (circularRefs[index]);
156
- return branches[index];
157
- }
158
- //# sourceMappingURL=dns.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dns.js","sourceRoot":"","sources":["../../../src/lib/peer_discovery_dns/dns.ts"],"names":[],"mappings":"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"}
@@ -1,32 +0,0 @@
1
- import { Endpoint } from "dns-query";
2
- import { DnsClient } from "./dns";
3
- export declare class DnsOverHttps implements DnsClient {
4
- private endpoints;
5
- private retries;
6
- /**
7
- * Default endpoints to use for DNS queries.
8
- * Taken from https://github.com/martinheidegger/dns-query as static data
9
- * to avoid dynamic queries.
10
- *
11
- * To dynamically retrieve other endpoints, use https://github.com/martinheidegger/dns-query#well-known-endpoints
12
- */
13
- static DefaultEndpoints: Endpoint[];
14
- /**
15
- * Create new Dns-Over-Http DNS client.
16
- *
17
- * @param endpoints The endpoints for Dns-Over-Https queries;
18
- * Defaults to [[DnsOverHttps.DefaultEndpoints]].
19
- * @param retries Retries if a given endpoint fails.
20
- *
21
- * @throws {code: string} If DNS query fails.
22
- */
23
- constructor(endpoints?: Endpoint[], retries?: number);
24
- /**
25
- * Resolves a TXT record
26
- *
27
- * @param domain The domain name
28
- *
29
- * @throws if the query fails
30
- */
31
- resolveTXT(domain: string): Promise<string[]>;
32
- }
@@ -1,87 +0,0 @@
1
- import debug from "debug";
2
- import { query, toEndpoint } from "dns-query";
3
- import { bytesToUtf8 } from "../utils.js";
4
- const log = debug("waku:dns-over-https");
5
- export class DnsOverHttps {
6
- /**
7
- * Create new Dns-Over-Http DNS client.
8
- *
9
- * @param endpoints The endpoints for Dns-Over-Https queries;
10
- * Defaults to [[DnsOverHttps.DefaultEndpoints]].
11
- * @param retries Retries if a given endpoint fails.
12
- *
13
- * @throws {code: string} If DNS query fails.
14
- */
15
- constructor(endpoints = DnsOverHttps.DefaultEndpoints, retries = 3) {
16
- this.endpoints = endpoints;
17
- this.retries = retries;
18
- }
19
- /**
20
- * Resolves a TXT record
21
- *
22
- * @param domain The domain name
23
- *
24
- * @throws if the query fails
25
- */
26
- async resolveTXT(domain) {
27
- let answers;
28
- try {
29
- const res = await query({
30
- question: { type: "TXT", name: domain },
31
- }, {
32
- endpoints: this.endpoints,
33
- retries: this.retries,
34
- });
35
- answers = res.answers;
36
- }
37
- catch (error) {
38
- log("query failed: ", error);
39
- throw new Error("DNS query failed");
40
- }
41
- if (!answers)
42
- throw new Error(`Could not resolve ${domain}`);
43
- const data = answers.map((a) => a.data);
44
- const result = [];
45
- data.forEach((d) => {
46
- if (typeof d === "string") {
47
- result.push(d);
48
- }
49
- else if (Array.isArray(d)) {
50
- d.forEach((sd) => {
51
- if (typeof sd === "string") {
52
- result.push(sd);
53
- }
54
- else {
55
- result.push(bytesToUtf8(sd));
56
- }
57
- });
58
- }
59
- else {
60
- result.push(bytesToUtf8(d));
61
- }
62
- });
63
- return result;
64
- }
65
- }
66
- /**
67
- * Default endpoints to use for DNS queries.
68
- * Taken from https://github.com/martinheidegger/dns-query as static data
69
- * to avoid dynamic queries.
70
- *
71
- * To dynamically retrieve other endpoints, use https://github.com/martinheidegger/dns-query#well-known-endpoints
72
- */
73
- DnsOverHttps.DefaultEndpoints = [
74
- toEndpoint({
75
- name: "cisco-doh",
76
- protocol: "https:",
77
- host: "doh.opendns.com",
78
- ipv4: "146.112.41.2",
79
- }),
80
- toEndpoint({
81
- name: "cloudflare",
82
- protocol: "https:",
83
- host: "dns.cloudflare.com",
84
- ipv4: "1.0.0.1",
85
- }),
86
- ];
87
- //# sourceMappingURL=dns_over_https.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dns_over_https.js","sourceRoot":"","sources":["../../../src/lib/peer_discovery_dns/dns_over_https.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAY,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAIvC,MAAM,GAAG,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAEzC,MAAM,OAAO,YAAY;IAuBvB;;;;;;;;OAQG;IACH,YACU,YAAwB,YAAY,CAAC,gBAAgB,EACrD,UAAkB,CAAC;QADnB,cAAS,GAAT,SAAS,CAA4C;QACrD,YAAO,GAAP,OAAO,CAAY;IAC1B,CAAC;IAEJ;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,IAAI,OAAO,CAAC;QACZ,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB;gBACE,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE;aACxC,EACD;gBACE,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CACF,CAAC;YACF,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;SACvB;QAAC,OAAO,KAAK,EAAE;YACd,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;SACrC;QAED,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC;QAE7D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAED,CAAC;QAEtC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACjB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBACzB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAChB;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAC3B,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;oBACf,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE;wBAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;qBACjB;yBAAM;wBACL,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;qBAC9B;gBACH,CAAC,CAAC,CAAC;aACJ;iBAAM;gBACL,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;aAC7B;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;;AAtFD;;;;;;GAMG;AACI,6BAAgB,GAAe;IACpC,UAAU,CAAC;QACT,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,cAAc;KACrB,CAAC;IACF,UAAU,CAAC;QACT,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,SAAS;KAChB,CAAC;CACH,CAAC"}
@@ -1,33 +0,0 @@
1
- export declare type ENRRootValues = {
2
- eRoot: string;
3
- lRoot: string;
4
- seq: number;
5
- signature: string;
6
- };
7
- export declare type ENRTreeValues = {
8
- publicKey: string;
9
- domain: string;
10
- };
11
- export declare class ENRTree {
12
- static readonly RECORD_PREFIX = "enr:";
13
- static readonly TREE_PREFIX = "enrtree:";
14
- static readonly BRANCH_PREFIX = "enrtree-branch:";
15
- static readonly ROOT_PREFIX = "enrtree-root:";
16
- /**
17
- * Extracts the branch subdomain referenced by a DNS tree root string after verifying
18
- * the root record signature with its base32 compressed public key.
19
- */
20
- static parseAndVerifyRoot(root: string, publicKey: string): string;
21
- static parseRootValues(txt: string): ENRRootValues;
22
- /**
23
- * Returns the public key and top level domain of an ENR tree entry.
24
- * The domain is the starting point for traversing a set of linked DNS TXT records
25
- * and the public key is used to verify the root entry record
26
- */
27
- static parseTree(tree: string): ENRTreeValues;
28
- /**
29
- * Returns subdomains listed in an ENR branch entry. These in turn lead to
30
- * either further branch entries or ENR records.
31
- */
32
- static parseBranch(branch: string): string[];
33
- }
@@ -1,76 +0,0 @@
1
- import base32 from "hi-base32";
2
- import { fromString } from "uint8arrays/from-string";
3
- import { keccak256, verifySignature } from "../crypto.js";
4
- import { ENR } from "../enr/index.js";
5
- import { utf8ToBytes } from "../utils.js";
6
- export class ENRTree {
7
- /**
8
- * Extracts the branch subdomain referenced by a DNS tree root string after verifying
9
- * the root record signature with its base32 compressed public key.
10
- */
11
- static parseAndVerifyRoot(root, publicKey) {
12
- if (!root.startsWith(this.ROOT_PREFIX))
13
- throw new Error(`ENRTree root entry must start with '${this.ROOT_PREFIX}'`);
14
- const rootValues = ENRTree.parseRootValues(root);
15
- const decodedPublicKey = base32.decode.asBytes(publicKey);
16
- // The signature is a 65-byte secp256k1 over the keccak256 hash
17
- // of the record content, excluding the `sig=` part, encoded as URL-safe base64 string
18
- // (Trailing recovery bit must be trimmed to pass `ecdsaVerify` method)
19
- const signedComponent = root.split(" sig")[0];
20
- const signedComponentBuffer = utf8ToBytes(signedComponent);
21
- const signatureBuffer = fromString(rootValues.signature, "base64url").slice(0, 64);
22
- const isVerified = verifySignature(signatureBuffer, keccak256(signedComponentBuffer), new Uint8Array(decodedPublicKey));
23
- if (!isVerified)
24
- throw new Error("Unable to verify ENRTree root signature");
25
- return rootValues.eRoot;
26
- }
27
- static parseRootValues(txt) {
28
- const matches = txt.match(/^enrtree-root:v1 e=([^ ]+) l=([^ ]+) seq=(\d+) sig=([^ ]+)$/);
29
- if (!Array.isArray(matches))
30
- throw new Error("Could not parse ENRTree root entry");
31
- matches.shift(); // The first entry is the full match
32
- const [eRoot, lRoot, seq, signature] = matches;
33
- if (!eRoot)
34
- throw new Error("Could not parse 'e' value from ENRTree root entry");
35
- if (!lRoot)
36
- throw new Error("Could not parse 'l' value from ENRTree root entry");
37
- if (!seq)
38
- throw new Error("Could not parse 'seq' value from ENRTree root entry");
39
- if (!signature)
40
- throw new Error("Could not parse 'sig' value from ENRTree root entry");
41
- return { eRoot, lRoot, seq: Number(seq), signature };
42
- }
43
- /**
44
- * Returns the public key and top level domain of an ENR tree entry.
45
- * The domain is the starting point for traversing a set of linked DNS TXT records
46
- * and the public key is used to verify the root entry record
47
- */
48
- static parseTree(tree) {
49
- if (!tree.startsWith(this.TREE_PREFIX))
50
- throw new Error(`ENRTree tree entry must start with '${this.TREE_PREFIX}'`);
51
- const matches = tree.match(/^enrtree:\/\/([^@]+)@(.+)$/);
52
- if (!Array.isArray(matches))
53
- throw new Error("Could not parse ENRTree tree entry");
54
- matches.shift(); // The first entry is the full match
55
- const [publicKey, domain] = matches;
56
- if (!publicKey)
57
- throw new Error("Could not parse public key from ENRTree tree entry");
58
- if (!domain)
59
- throw new Error("Could not parse domain from ENRTree tree entry");
60
- return { publicKey, domain };
61
- }
62
- /**
63
- * Returns subdomains listed in an ENR branch entry. These in turn lead to
64
- * either further branch entries or ENR records.
65
- */
66
- static parseBranch(branch) {
67
- if (!branch.startsWith(this.BRANCH_PREFIX))
68
- throw new Error(`ENRTree branch entry must start with '${this.BRANCH_PREFIX}'`);
69
- return branch.split(this.BRANCH_PREFIX)[1].split(",");
70
- }
71
- }
72
- ENRTree.RECORD_PREFIX = ENR.RECORD_PREFIX;
73
- ENRTree.TREE_PREFIX = "enrtree:";
74
- ENRTree.BRANCH_PREFIX = "enrtree-branch:";
75
- ENRTree.ROOT_PREFIX = "enrtree-root:";
76
- //# sourceMappingURL=enrtree.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enrtree.js","sourceRoot":"","sources":["../../../src/lib/peer_discovery_dns/enrtree.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import { ENR } from "../enr";
2
- import { NodeCapabilityCount } from "./dns";
3
- /**
4
- * Fetch nodes using passed [[getNode]] until all wanted capabilities are
5
- * fulfilled or the number of [[getNode]] call exceeds the sum of
6
- * [[wantedNodeCapabilityCount]] plus [[errorTolerance]].
7
- */
8
- export declare function fetchNodesUntilCapabilitiesFulfilled(wantedNodeCapabilityCount: Partial<NodeCapabilityCount>, errorTolerance: number, getNode: () => Promise<ENR | null>): Promise<ENR[]>;
9
- /**
10
- * Fetch nodes using passed [[getNode]] until all wanted capabilities are
11
- * fulfilled or the number of [[getNode]] call exceeds the sum of
12
- * [[wantedNodeCapabilityCount]] plus [[errorTolerance]].
13
- */
14
- export declare function yieldNodesUntilCapabilitiesFulfilled(wantedNodeCapabilityCount: Partial<NodeCapabilityCount>, errorTolerance: number, getNode: () => Promise<ENR | null>): AsyncGenerator<ENR>;