@helia/ipns 2.0.2 → 3.0.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 (60) hide show
  1. package/README.md +110 -0
  2. package/dist/index.min.js +26 -15
  3. package/dist/src/dns-resolvers/default.d.ts +3 -0
  4. package/dist/src/dns-resolvers/default.d.ts.map +1 -0
  5. package/dist/src/dns-resolvers/default.js +8 -0
  6. package/dist/src/dns-resolvers/default.js.map +1 -0
  7. package/dist/src/dns-resolvers/dns-json-over-https.d.ts +18 -0
  8. package/dist/src/dns-resolvers/dns-json-over-https.d.ts.map +1 -0
  9. package/dist/src/dns-resolvers/dns-json-over-https.js +72 -0
  10. package/dist/src/dns-resolvers/dns-json-over-https.js.map +1 -0
  11. package/dist/src/dns-resolvers/dns-over-https.d.ts +16 -0
  12. package/dist/src/dns-resolvers/dns-over-https.d.ts.map +1 -0
  13. package/dist/src/dns-resolvers/dns-over-https.js +123 -0
  14. package/dist/src/dns-resolvers/dns-over-https.js.map +1 -0
  15. package/dist/src/dns-resolvers/index.d.ts +3 -0
  16. package/dist/src/dns-resolvers/index.d.ts.map +1 -0
  17. package/dist/src/dns-resolvers/index.js +3 -0
  18. package/dist/src/dns-resolvers/index.js.map +1 -0
  19. package/dist/src/dns-resolvers/resolver.browser.d.ts +4 -0
  20. package/dist/src/dns-resolvers/resolver.browser.d.ts.map +1 -0
  21. package/dist/src/dns-resolvers/resolver.browser.js +39 -0
  22. package/dist/src/dns-resolvers/resolver.browser.js.map +1 -0
  23. package/dist/src/dns-resolvers/resolver.d.ts +4 -0
  24. package/dist/src/dns-resolvers/resolver.d.ts.map +1 -0
  25. package/dist/src/dns-resolvers/resolver.js +21 -0
  26. package/dist/src/dns-resolvers/resolver.js.map +1 -0
  27. package/dist/src/index.d.ts +102 -9
  28. package/dist/src/index.d.ts.map +1 -1
  29. package/dist/src/index.js +82 -12
  30. package/dist/src/index.js.map +1 -1
  31. package/dist/src/routing/dht.js.map +1 -1
  32. package/dist/src/routing/local-store.js +3 -3
  33. package/dist/src/routing/local-store.js.map +1 -1
  34. package/dist/src/routing/pubsub.js.map +1 -1
  35. package/dist/src/utils/dns.d.ts +35 -0
  36. package/dist/src/utils/dns.d.ts.map +1 -0
  37. package/dist/src/utils/dns.js +79 -0
  38. package/dist/src/utils/dns.js.map +1 -0
  39. package/dist/src/utils/tlru.js.map +1 -1
  40. package/dist/typedoc-urls.json +8 -0
  41. package/package.json +14 -5
  42. package/src/dns-resolvers/default.ts +9 -0
  43. package/src/dns-resolvers/dns-json-over-https.ts +90 -0
  44. package/src/dns-resolvers/dns-over-https.ts +146 -0
  45. package/src/dns-resolvers/index.ts +2 -0
  46. package/src/dns-resolvers/resolver.browser.ts +50 -0
  47. package/src/dns-resolvers/resolver.ts +25 -0
  48. package/src/index.ts +121 -13
  49. package/src/routing/local-store.ts +3 -3
  50. package/src/utils/dns.ts +126 -0
  51. package/dist/src/utils/resolve-dns-link.browser.d.ts +0 -6
  52. package/dist/src/utils/resolve-dns-link.browser.d.ts.map +0 -1
  53. package/dist/src/utils/resolve-dns-link.browser.js +0 -46
  54. package/dist/src/utils/resolve-dns-link.browser.js.map +0 -1
  55. package/dist/src/utils/resolve-dns-link.d.ts +0 -3
  56. package/dist/src/utils/resolve-dns-link.d.ts.map +0 -1
  57. package/dist/src/utils/resolve-dns-link.js +0 -54
  58. package/dist/src/utils/resolve-dns-link.js.map +0 -1
  59. package/src/utils/resolve-dns-link.browser.ts +0 -61
  60. package/src/utils/resolve-dns-link.ts +0 -65
@@ -0,0 +1,3 @@
1
+ import type { DNSResolver } from '../index.js';
2
+ export declare function defaultResolver(): DNSResolver;
3
+ //# sourceMappingURL=default.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../../src/dns-resolvers/default.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAyB,MAAM,aAAa,CAAA;AAErE,wBAAgB,eAAe,IAAK,WAAW,CAI9C"}
@@ -0,0 +1,8 @@
1
+ import { MAX_RECURSIVE_DEPTH, recursiveResolveDnslink } from '../utils/dns.js';
2
+ import resolve from './resolver.js';
3
+ export function defaultResolver() {
4
+ return async (domain, options = {}) => {
5
+ return recursiveResolveDnslink(domain, MAX_RECURSIVE_DEPTH, resolve, options);
6
+ };
7
+ }
8
+ //# sourceMappingURL=default.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.js","sourceRoot":"","sources":["../../../src/dns-resolvers/default.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAC9E,OAAO,OAAO,MAAM,eAAe,CAAA;AAGnC,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,EAAE,MAAc,EAAE,UAAiC,EAAE,EAAmB,EAAE;QACpF,OAAO,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC/E,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { DNSResolver } from '../index.js';
2
+ /**
3
+ * Uses the RFC 8427 'application/dns-json' content-type to resolve DNS queries.
4
+ *
5
+ * Supports and server that uses the same schema as Google's DNS over HTTPS
6
+ * resolver.
7
+ *
8
+ * This resolver needs fewer dependencies than the regular DNS-over-HTTPS
9
+ * resolver so can result in a smaller bundle size and consequently is preferred
10
+ * for browser use.
11
+ *
12
+ * @see https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests/dns-json/
13
+ * @see https://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers
14
+ * @see https://dnsprivacy.org/public_resolvers/
15
+ * @see https://datatracker.ietf.org/doc/html/rfc8427
16
+ */
17
+ export declare function dnsJsonOverHttps(url: string): DNSResolver;
18
+ //# sourceMappingURL=dns-json-over-https.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns-json-over-https.d.ts","sourceRoot":"","sources":["../../../src/dns-resolvers/dns-json-over-https.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAyB,WAAW,EAAE,MAAM,aAAa,CAAA;AAOrE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CA6D1D"}
@@ -0,0 +1,72 @@
1
+ /* eslint-env browser */
2
+ import PQueue from 'p-queue';
3
+ import { CustomProgressEvent } from 'progress-events';
4
+ import { MAX_RECURSIVE_DEPTH, recursiveResolveDnslink, ipfsPathAndAnswer } from '../utils/dns.js';
5
+ import { TLRU } from '../utils/tlru.js';
6
+ // Avoid sending multiple queries for the same hostname by caching results
7
+ const cache = new TLRU(1000);
8
+ // This TTL will be used if the remote service does not return one
9
+ const ttl = 60 * 1000;
10
+ /**
11
+ * Uses the RFC 8427 'application/dns-json' content-type to resolve DNS queries.
12
+ *
13
+ * Supports and server that uses the same schema as Google's DNS over HTTPS
14
+ * resolver.
15
+ *
16
+ * This resolver needs fewer dependencies than the regular DNS-over-HTTPS
17
+ * resolver so can result in a smaller bundle size and consequently is preferred
18
+ * for browser use.
19
+ *
20
+ * @see https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests/dns-json/
21
+ * @see https://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers
22
+ * @see https://dnsprivacy.org/public_resolvers/
23
+ * @see https://datatracker.ietf.org/doc/html/rfc8427
24
+ */
25
+ export function dnsJsonOverHttps(url) {
26
+ // browsers limit concurrent connections per host,
27
+ // we don't want preload calls to exhaust the limit (~6)
28
+ const httpQueue = new PQueue({ concurrency: 4 });
29
+ const resolve = async (fqdn, options = {}) => {
30
+ const searchParams = new URLSearchParams();
31
+ searchParams.set('name', fqdn);
32
+ searchParams.set('type', 'TXT');
33
+ const query = searchParams.toString();
34
+ // try cache first
35
+ if (options.nocache !== true && cache.has(query)) {
36
+ const response = cache.get(query);
37
+ if (response != null) {
38
+ options.onProgress?.(new CustomProgressEvent('dnslink:cache', { detail: response }));
39
+ return response;
40
+ }
41
+ }
42
+ options.onProgress?.(new CustomProgressEvent('dnslink:query', { detail: fqdn }));
43
+ // query DNS-JSON over HTTPS server
44
+ const response = await httpQueue.add(async () => {
45
+ const res = await fetch(`${url}?${searchParams}`, {
46
+ headers: {
47
+ accept: 'application/dns-json'
48
+ },
49
+ signal: options.signal
50
+ });
51
+ if (res.status !== 200) {
52
+ throw new Error(`Unexpected HTTP status: ${res.status} - ${res.statusText}`);
53
+ }
54
+ const query = new URL(res.url).search.slice(1);
55
+ const json = await res.json();
56
+ options.onProgress?.(new CustomProgressEvent('dnslink:answer', { detail: json }));
57
+ const { ipfsPath, answer } = ipfsPathAndAnswer(fqdn, json);
58
+ cache.set(query, ipfsPath, answer.TTL ?? ttl);
59
+ return ipfsPath;
60
+ }, {
61
+ signal: options.signal
62
+ });
63
+ if (response == null) {
64
+ throw new Error('No DNS response received');
65
+ }
66
+ return response;
67
+ };
68
+ return async (domain, options = {}) => {
69
+ return recursiveResolveDnslink(domain, MAX_RECURSIVE_DEPTH, resolve, options);
70
+ };
71
+ }
72
+ //# sourceMappingURL=dns-json-over-https.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns-json-over-https.js","sourceRoot":"","sources":["../../../src/dns-resolvers/dns-json-over-https.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { DNSResolver } from '../index.js';
2
+ /**
3
+ * Uses the RFC 1035 'application/dns-message' content-type to resolve DNS
4
+ * queries.
5
+ *
6
+ * This resolver needs more dependencies than the non-standard
7
+ * DNS-JSON-over-HTTPS resolver so can result in a larger bundle size and
8
+ * consequently is not preferred for browser use.
9
+ *
10
+ * @see https://datatracker.ietf.org/doc/html/rfc1035
11
+ * @see https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests/dns-wireformat/
12
+ * @see https://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers
13
+ * @see https://dnsprivacy.org/public_resolvers/
14
+ */
15
+ export declare function dnsOverHttps(url: string): DNSResolver;
16
+ //# sourceMappingURL=dns-over-https.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns-over-https.d.ts","sourceRoot":"","sources":["../../../src/dns-resolvers/dns-over-https.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAyB,WAAW,EAAE,MAAM,aAAa,CAAA;AAOrE;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CAwEtD"}
@@ -0,0 +1,123 @@
1
+ /* eslint-env browser */
2
+ import { Buffer } from 'buffer';
3
+ import dnsPacket, {} from 'dns-packet';
4
+ import { base64url } from 'multiformats/bases/base64';
5
+ import PQueue from 'p-queue';
6
+ import { CustomProgressEvent } from 'progress-events';
7
+ import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
8
+ import { MAX_RECURSIVE_DEPTH, recursiveResolveDnslink, ipfsPathAndAnswer } from '../utils/dns.js';
9
+ import { TLRU } from '../utils/tlru.js';
10
+ // Avoid sending multiple queries for the same hostname by caching results
11
+ const cache = new TLRU(1000);
12
+ // This TTL will be used if the remote service does not return one
13
+ const ttl = 60 * 1000;
14
+ /**
15
+ * Uses the RFC 1035 'application/dns-message' content-type to resolve DNS
16
+ * queries.
17
+ *
18
+ * This resolver needs more dependencies than the non-standard
19
+ * DNS-JSON-over-HTTPS resolver so can result in a larger bundle size and
20
+ * consequently is not preferred for browser use.
21
+ *
22
+ * @see https://datatracker.ietf.org/doc/html/rfc1035
23
+ * @see https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests/dns-wireformat/
24
+ * @see https://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers
25
+ * @see https://dnsprivacy.org/public_resolvers/
26
+ */
27
+ export function dnsOverHttps(url) {
28
+ // browsers limit concurrent connections per host,
29
+ // we don't want preload calls to exhaust the limit (~6)
30
+ const httpQueue = new PQueue({ concurrency: 4 });
31
+ const resolve = async (fqdn, options = {}) => {
32
+ const dnsQuery = dnsPacket.encode({
33
+ type: 'query',
34
+ id: 0,
35
+ flags: dnsPacket.RECURSION_DESIRED,
36
+ questions: [{
37
+ type: 'TXT',
38
+ name: fqdn
39
+ }]
40
+ });
41
+ const searchParams = new URLSearchParams();
42
+ searchParams.set('dns', base64url.encode(dnsQuery).substring(1));
43
+ const query = searchParams.toString();
44
+ // try cache first
45
+ if (options.nocache !== true && cache.has(query)) {
46
+ const response = cache.get(query);
47
+ if (response != null) {
48
+ options.onProgress?.(new CustomProgressEvent('dnslink:cache', { detail: response }));
49
+ return response;
50
+ }
51
+ }
52
+ options.onProgress?.(new CustomProgressEvent('dnslink:query', { detail: fqdn }));
53
+ // query DNS over HTTPS server
54
+ const response = await httpQueue.add(async () => {
55
+ const res = await fetch(`${url}?${searchParams}`, {
56
+ headers: {
57
+ accept: 'application/dns-message'
58
+ },
59
+ signal: options.signal
60
+ });
61
+ if (res.status !== 200) {
62
+ throw new Error(`Unexpected HTTP status: ${res.status} - ${res.statusText}`);
63
+ }
64
+ const query = new URL(res.url).search.slice(1);
65
+ const buf = await res.arrayBuffer();
66
+ // map to expected response format
67
+ const json = toDNSResponse(dnsPacket.decode(Buffer.from(buf)));
68
+ options.onProgress?.(new CustomProgressEvent('dnslink:answer', { detail: json }));
69
+ const { ipfsPath, answer } = ipfsPathAndAnswer(fqdn, json);
70
+ cache.set(query, ipfsPath, answer.TTL ?? ttl);
71
+ return ipfsPath;
72
+ }, {
73
+ signal: options.signal
74
+ });
75
+ if (response == null) {
76
+ throw new Error('No DNS response received');
77
+ }
78
+ return response;
79
+ };
80
+ return async (domain, options = {}) => {
81
+ return recursiveResolveDnslink(domain, MAX_RECURSIVE_DEPTH, resolve, options);
82
+ };
83
+ }
84
+ function toDNSResponse(response) {
85
+ const txtType = 16;
86
+ return {
87
+ Status: 0,
88
+ TC: response.flag_tc ?? false,
89
+ RD: response.flag_rd ?? false,
90
+ RA: response.flag_ra ?? false,
91
+ AD: response.flag_ad ?? false,
92
+ CD: response.flag_cd ?? false,
93
+ Question: response.questions?.map(q => ({
94
+ name: q.name,
95
+ type: txtType
96
+ })) ?? [],
97
+ Answer: response.answers?.map(a => {
98
+ if (a.type !== 'TXT' || a.data.length < 1) {
99
+ return {
100
+ name: a.name,
101
+ type: txtType,
102
+ TTL: 0,
103
+ data: 'invalid'
104
+ };
105
+ }
106
+ if (!Buffer.isBuffer(a.data[0])) {
107
+ return {
108
+ name: a.name,
109
+ type: txtType,
110
+ TTL: a.ttl ?? ttl,
111
+ data: String(a.data[0])
112
+ };
113
+ }
114
+ return {
115
+ name: a.name,
116
+ type: txtType,
117
+ TTL: a.ttl ?? ttl,
118
+ data: uint8ArrayToString(a.data[0])
119
+ };
120
+ }) ?? []
121
+ };
122
+ }
123
+ //# sourceMappingURL=dns-over-https.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns-over-https.js","sourceRoot":"","sources":["../../../src/dns-resolvers/dns-over-https.ts"],"names":[],"mappings":"AAAA,wBAAwB;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,SAAS,EAAE,EAAsB,MAAM,YAAY,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EAAoB,mBAAmB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAGvC,0EAA0E;AAC1E,MAAM,KAAK,GAAG,IAAI,IAAI,CAAS,IAAI,CAAC,CAAA;AACpC,kEAAkE;AAClE,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAA;AAErB;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAAE,GAAW;IACvC,kDAAkD;IAClD,wDAAwD;IACxD,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAA;IAEhD,MAAM,OAAO,GAAG,KAAK,EAAE,IAAY,EAAE,UAAiC,EAAE,EAAmB,EAAE;QAC3F,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC;YAChC,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,CAAC;YACL,KAAK,EAAE,SAAS,CAAC,iBAAiB;YAClC,SAAS,EAAE,CAAC;oBACV,IAAI,EAAE,KAAK;oBACX,IAAI,EAAE,IAAI;iBACX,CAAC;SACH,CAAC,CAAA;QAEF,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAA;QAC1C,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;QAEhE,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAA;QAErC,kBAAkB;QAClB,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YAEjC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrB,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAS,eAAe,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;gBAC5F,OAAO,QAAQ,CAAA;YACjB,CAAC;QACH,CAAC;QAED,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAS,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAExF,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAC9C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,IAAI,YAAY,EAAE,EAAE;gBAChD,OAAO,EAAE;oBACP,MAAM,EAAE,yBAAyB;iBAClC;gBACD,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAA;YAEF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,MAAM,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;YAC9E,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAC9C,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAA;YACnC,kCAAkC;YAClC,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAE9D,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAc,gBAAgB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YAE9F,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YAE1D,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAA;YAE7C,OAAO,QAAQ,CAAA;QACjB,CAAC,EAAE;YACD,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAA;QAEF,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAC7C,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC,CAAA;IAED,OAAO,KAAK,EAAE,MAAc,EAAE,UAAiC,EAAE,EAAE,EAAE;QACnE,OAAO,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC/E,CAAC,CAAA;AACH,CAAC;AAED,SAAS,aAAa,CAAE,QAAuB;IAC7C,MAAM,OAAO,GAAG,EAAE,CAAA;IAElB,OAAO;QACL,MAAM,EAAE,CAAC;QACT,EAAE,EAAE,QAAQ,CAAC,OAAO,IAAI,KAAK;QAC7B,EAAE,EAAE,QAAQ,CAAC,OAAO,IAAI,KAAK;QAC7B,EAAE,EAAE,QAAQ,CAAC,OAAO,IAAI,KAAK;QAC7B,EAAE,EAAE,QAAQ,CAAC,OAAO,IAAI,KAAK;QAC7B,EAAE,EAAE,QAAQ,CAAC,OAAO,IAAI,KAAK;QAC7B,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,OAAO;SACd,CAAC,CAAC,IAAI,EAAE;QACT,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE;YAChC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,OAAO;oBACL,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,IAAI,EAAE,OAAO;oBACb,GAAG,EAAE,CAAC;oBACN,IAAI,EAAE,SAAS;iBAChB,CAAA;YACH,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChC,OAAO;oBACL,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,IAAI,EAAE,OAAO;oBACb,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG;oBACjB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBACxB,CAAA;YACH,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,OAAO;gBACb,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG;gBACjB,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACpC,CAAA;QACH,CAAC,CAAC,IAAI,EAAE;KACT,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { dnsOverHttps } from './dns-over-https.js';
2
+ export { dnsJsonOverHttps } from './dns-json-over-https.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dns-resolvers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { dnsOverHttps } from './dns-over-https.js';
2
+ export { dnsJsonOverHttps } from './dns-json-over-https.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dns-resolvers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { DNSResolver } from '../index.js';
2
+ declare const resolve: DNSResolver;
3
+ export default resolve;
4
+ //# sourceMappingURL=resolver.browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.browser.d.ts","sourceRoot":"","sources":["../../../src/dns-resolvers/resolver.browser.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAW9C,QAAA,MAAM,OAAO,EAAE,WA+Bd,CAAA;AAED,eAAe,OAAO,CAAA"}
@@ -0,0 +1,39 @@
1
+ import Resolver from 'dns-over-http-resolver';
2
+ import PQueue from 'p-queue';
3
+ import { CustomProgressEvent } from 'progress-events';
4
+ import { resolveFn } from '../utils/dns.js';
5
+ import { TLRU } from '../utils/tlru.js';
6
+ const cache = new TLRU(1000);
7
+ // We know browsers themselves cache DNS records for at least 1 minute,
8
+ // which acts a provisional default ttl: https://stackoverflow.com/a/36917902/11518426
9
+ const ttl = 60 * 1000;
10
+ // browsers limit concurrent connections per host,
11
+ // we don't want to exhaust the limit (~6)
12
+ const httpQueue = new PQueue({ concurrency: 4 });
13
+ const resolve = async function resolve(domain, options = {}) {
14
+ const resolver = new Resolver({ maxCache: 0 });
15
+ // try cache first
16
+ if (options.nocache !== true && cache.has(domain)) {
17
+ const response = cache.get(domain);
18
+ if (response != null) {
19
+ options?.onProgress?.(new CustomProgressEvent('dnslink:cache', { detail: response }));
20
+ return response;
21
+ }
22
+ }
23
+ options.onProgress?.(new CustomProgressEvent('dnslink:query', { detail: domain }));
24
+ // Add the query to the queue
25
+ const response = await httpQueue.add(async () => {
26
+ const dnslinkRecord = await resolveFn(resolver, domain);
27
+ options.onProgress?.(new CustomProgressEvent('dnslink:answer', { detail: dnslinkRecord }));
28
+ cache.set(domain, dnslinkRecord, ttl);
29
+ return dnslinkRecord;
30
+ }, {
31
+ signal: options?.signal
32
+ });
33
+ if (response == null) {
34
+ throw new Error('No DNS response received');
35
+ }
36
+ return response;
37
+ };
38
+ export default resolve;
39
+ //# sourceMappingURL=resolver.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.browser.js","sourceRoot":"","sources":["../../../src/dns-resolvers/resolver.browser.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,wBAAwB,CAAA;AAC7C,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,SAAS,EAAoB,MAAM,iBAAiB,CAAA;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAGvC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAS,IAAI,CAAC,CAAA;AACpC,uEAAuE;AACvE,sFAAsF;AACtF,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAA;AAErB,kDAAkD;AAClD,0CAA0C;AAC1C,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAA;AAEhD,MAAM,OAAO,GAAgB,KAAK,UAAU,OAAO,CAAE,MAAM,EAAE,OAAO,GAAG,EAAE;IACvE,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;IAC9C,kBAAkB;IAClB,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAElC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,EAAE,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAS,eAAe,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;YAC7F,OAAO,QAAQ,CAAA;QACjB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAS,eAAe,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAE1F,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;QAC9C,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAEvD,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAc,gBAAgB,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;QACvG,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,CAAA;QAErC,OAAO,aAAa,CAAA;IACtB,CAAC,EAAE;QACD,MAAM,EAAE,OAAO,EAAE,MAAM;KACxB,CAAC,CAAA;IAEF,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IAC7C,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,eAAe,OAAO,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { DNSResolver } from '../index.js';
2
+ declare const resolve: DNSResolver;
3
+ export default resolve;
4
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/dns-resolvers/resolver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,QAAA,MAAM,OAAO,EAAE,WAiBd,CAAA;AAED,eAAe,OAAO,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { Resolver } from 'dns/promises';
2
+ import { CustomProgressEvent } from 'progress-events';
3
+ import { resolveFn } from '../utils/dns.js';
4
+ const resolve = async function resolve(domain, options = {}) {
5
+ const resolver = new Resolver();
6
+ const listener = () => {
7
+ resolver.cancel();
8
+ };
9
+ options.signal?.addEventListener('abort', listener);
10
+ try {
11
+ options.onProgress?.(new CustomProgressEvent('dnslink:query', { detail: domain }));
12
+ const dnslinkRecord = await resolveFn(resolver, domain);
13
+ options.onProgress?.(new CustomProgressEvent('dnslink:answer', { detail: dnslinkRecord }));
14
+ return dnslinkRecord;
15
+ }
16
+ finally {
17
+ options.signal?.removeEventListener('abort', listener);
18
+ }
19
+ };
20
+ export default resolve;
21
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/dns-resolvers/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,SAAS,EAAoB,MAAM,iBAAiB,CAAA;AAG7D,MAAM,OAAO,GAAgB,KAAK,UAAU,OAAO,CAAE,MAAM,EAAE,OAAO,GAAG,EAAE;IACvE,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC/B,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,QAAQ,CAAC,MAAM,EAAE,CAAA;IACnB,CAAC,CAAA;IAED,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAEnD,IAAI,CAAC;QACH,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAS,eAAe,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;QAC1F,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAEvD,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAc,gBAAgB,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;QACvG,OAAO,aAAa,CAAA;IACtB,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACxD,CAAC;AACH,CAAC,CAAA;AAED,eAAe,OAAO,CAAA"}
@@ -5,16 +5,20 @@
5
5
  *
6
6
  * @example
7
7
  *
8
+ * With {@link IPNSRouting} routers:
9
+ *
8
10
  * ```typescript
9
11
  * import { createHelia } from 'helia'
10
12
  * import { dht, pubsub } from '@helia/ipns/routing'
11
13
  * import { unixfs } from '@helia/unixfs'
12
14
  *
13
15
  * const helia = await createHelia()
14
- * const name = ipns(helia, [
15
- * dht(helia),
16
- * pubsub(helia)
17
- * ])
16
+ * const name = ipns(helia, {
17
+ * routers: [
18
+ * dht(helia),
19
+ * pubsub(helia)
20
+ * ]
21
+ * })
18
22
  *
19
23
  * // create a public key to publish as an IPNS name
20
24
  * const keyInfo = await helia.libp2p.keychain.createKey('my-key')
@@ -33,18 +37,82 @@
33
37
  *
34
38
  * @example
35
39
  *
40
+ * With default {@link DNSResolver} resolvers:
41
+ *
36
42
  * ```typescript
37
- * // resolve a CID from a TXT record in a DNS zone file, eg:
38
- * // > dig ipfs.io TXT
43
+ * import { createHelia } from 'helia'
44
+ * import { dht, pubsub } from '@helia/ipns/routing'
45
+ * import { unixfs } from '@helia/unixfs'
46
+ *
47
+ * const helia = await createHelia()
48
+ * const name = ipns(helia, {
49
+ * resolvers: [
50
+ * dnsOverHttps('https://private-dns-server.me/dns-query'),
51
+ * ]
52
+ * })
53
+ *
54
+ * const cid = name.resolveDns('some-domain-with-dnslink-entry.com')
55
+ * ```
56
+ *
57
+ * @example
58
+ *
59
+ * Calling `resolveDns` with the `@helia/ipns` instance:
60
+ *
61
+ * ```typescript
62
+ * // resolve a CID from a TXT record in a DNS zone file, using the default
63
+ * // resolver for the current platform eg:
64
+ * // > dig _dnslink.ipfs.io TXT
65
+ * // ;; ANSWER SECTION:
66
+ * // _dnslink.ipfs.io. 60 IN TXT "dnslink=/ipns/website.ipfs.io"
67
+ * // > dig _dnslink.website.ipfs.io TXT
39
68
  * // ;; ANSWER SECTION:
40
- * // ipfs.io. 435 IN TXT "dnslink=/ipfs/Qmfoo"
69
+ * // _dnslink.website.ipfs.io. 60 IN TXT "dnslink=/ipfs/QmWebsite"
41
70
  *
42
71
  * const cid = name.resolveDns('ipfs.io')
72
+ *
73
+ * console.info(cid)
74
+ * // QmWebsite
75
+ * ```
76
+ *
77
+ * @example
78
+ *
79
+ * This example uses the Mozilla provided RFC 1035 DNS over HTTPS service. This
80
+ * uses binary DNS records so requires extra dependencies to process the
81
+ * response which can increase browser bundle sizes.
82
+ *
83
+ * If this is a concern, use the DNS-JSON-Over-HTTPS resolver instead.
84
+ *
85
+ * ```typescript
86
+ * // use DNS-Over-HTTPS
87
+ * import { dnsOverHttps } from '@helia/ipns/dns-resolvers'
88
+ *
89
+ * const cid = name.resolveDns('ipfs.io', {
90
+ * resolvers: [
91
+ * dnsOverHttps('https://mozilla.cloudflare-dns.com/dns-query')
92
+ * ]
93
+ * })
94
+ * ```
95
+ *
96
+ * @example
97
+ *
98
+ * DNS-JSON-Over-HTTPS resolvers use the RFC 8427 `application/dns-json` and can
99
+ * result in a smaller browser bundle due to the response being plain JSON.
100
+ *
101
+ * ```typescript
102
+ * // use DNS-JSON-Over-HTTPS
103
+ * import { dnsJsonOverHttps } from '@helia/ipns/dns-resolvers'
104
+ *
105
+ * const cid = name.resolveDns('ipfs.io', {
106
+ * resolvers: [
107
+ * dnsJsonOverHttps('https://mozilla.cloudflare-dns.com/dns-query')
108
+ * ]
109
+ * })
43
110
  * ```
44
111
  */
45
112
  import { ipnsValidator } from 'ipns/validator';
46
113
  import { CID } from 'multiformats/cid';
47
114
  import type { IPNSRouting, IPNSRoutingEvents } from './routing/index.js';
115
+ import type { DNSResponse } from './utils/dns.js';
48
116
  import type { AbortOptions } from '@libp2p/interface';
49
117
  import type { PeerId } from '@libp2p/interface/peer-id';
50
118
  import type { Datastore } from 'interface-datastore';
@@ -56,6 +124,7 @@ export type RepublishProgressEvents = ProgressEvent<'ipns:republish:start', unkn
56
124
  record: IPNSRecord;
57
125
  err: Error;
58
126
  }>;
127
+ export type ResolveDnsLinkProgressEvents = ProgressEvent<'dnslink:cache', string> | ProgressEvent<'dnslink:query', string> | ProgressEvent<'dnslink:answer', DNSResponse>;
59
128
  export interface PublishOptions extends AbortOptions, ProgressOptions<PublishProgressEvents | IPNSRoutingEvents> {
60
129
  /**
61
130
  * Time duration of the record in ms (default: 24hrs)
@@ -77,11 +146,31 @@ export interface ResolveOptions extends AbortOptions, ProgressOptions<ResolvePro
77
146
  */
78
147
  offline?: boolean;
79
148
  }
80
- export interface ResolveDNSOptions extends ResolveOptions {
149
+ export interface ResolveDnsLinkOptions extends AbortOptions, ProgressOptions<ResolveDnsLinkProgressEvents> {
150
+ /**
151
+ * Do not use cached DNS entries (default: false)
152
+ */
153
+ nocache?: boolean;
154
+ }
155
+ export interface DNSResolver {
156
+ (domain: string, options?: ResolveDnsLinkOptions): Promise<string>;
157
+ }
158
+ export interface ResolveDNSOptions extends AbortOptions, ProgressOptions<ResolveProgressEvents | IPNSRoutingEvents | ResolveDnsLinkProgressEvents> {
159
+ /**
160
+ * Do not query the network for the IPNS record (default: false)
161
+ */
162
+ offline?: boolean;
81
163
  /**
82
164
  * Do not use cached DNS entries (default: false)
83
165
  */
84
166
  nocache?: boolean;
167
+ /**
168
+ * These resolvers will be used to resolve the dnslink entries, if unspecified node will
169
+ * fall back to the `dns` module and browsers fall back to querying google/cloudflare DoH
170
+ *
171
+ * @see https://github.com/ipfs/helia-ipns/pull/55#discussion_r1270096881
172
+ */
173
+ resolvers?: DNSResolver[];
85
174
  }
86
175
  export interface RepublishOptions extends AbortOptions, ProgressOptions<RepublishProgressEvents | IPNSRoutingEvents> {
87
176
  /**
@@ -114,7 +203,11 @@ export type { IPNSRouting } from './routing/index.js';
114
203
  export interface IPNSComponents {
115
204
  datastore: Datastore;
116
205
  }
117
- export declare function ipns(components: IPNSComponents, routers?: IPNSRouting[]): IPNS;
206
+ export interface IPNSOptions {
207
+ routers?: IPNSRouting[];
208
+ resolvers?: DNSResolver[];
209
+ }
210
+ export declare function ipns(components: IPNSComponents, { routers, resolvers }: IPNSOptions): IPNS;
118
211
  export { ipnsValidator };
119
212
  export { ipnsSelector } from 'ipns/selector';
120
213
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}