@helia/ipns 7.2.2 → 7.2.3-2f88fc8
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/README.md +86 -58
- package/dist/index.min.js +4 -5
- package/dist/src/dnslink.d.ts +1 -1
- package/dist/src/dnslink.d.ts.map +1 -1
- package/dist/src/dnslink.js +7 -6
- package/dist/src/dnslink.js.map +1 -1
- package/dist/src/errors.d.ts +25 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +43 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/index.d.ts +90 -61
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +131 -72
- package/dist/src/index.js.map +1 -1
- package/dist/src/routing/index.d.ts +4 -0
- package/dist/src/routing/index.d.ts.map +1 -1
- package/dist/src/routing/index.js.map +1 -1
- package/dist/src/routing/local-store.js +1 -1
- package/dist/src/routing/pubsub.d.ts.map +1 -1
- package/dist/src/routing/pubsub.js +6 -4
- package/dist/src/routing/pubsub.js.map +1 -1
- package/dist/src/utils.d.ts +5 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +6 -0
- package/dist/src/utils.js.map +1 -0
- package/package.json +12 -11
- package/src/dnslink.ts +8 -6
- package/src/errors.ts +53 -0
- package/src/index.ts +141 -78
- package/src/routing/index.ts +5 -0
- package/src/routing/local-store.ts +1 -1
- package/src/routing/pubsub.ts +9 -6
- package/src/utils.ts +8 -0
- package/dist/typedoc-urls.json +0 -42
package/dist/src/dnslink.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dnslink.d.ts","sourceRoot":"","sources":["../../src/dnslink.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dnslink.d.ts","sourceRoot":"","sources":["../../src/dnslink.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAIpD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AA0ID,wBAAsB,cAAc,CAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,aAAa,CAAC,CAExI"}
|
package/dist/src/dnslink.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {} from '@libp2p/interface';
|
|
2
2
|
import { peerIdFromString } from '@libp2p/peer-id';
|
|
3
3
|
import { RecordType } from '@multiformats/dns';
|
|
4
4
|
import { CID } from 'multiformats/cid';
|
|
5
|
+
import { DNSLinkNotFoundError } from './errors.js';
|
|
5
6
|
const MAX_RECURSIVE_DEPTH = 32;
|
|
6
7
|
async function recursiveResolveDnslink(domain, depth, dns, log, options = {}) {
|
|
7
8
|
if (depth === 0) {
|
|
@@ -15,7 +16,7 @@ async function recursiveResolveDnslink(domain, depth, dns, log, options = {}) {
|
|
|
15
16
|
]
|
|
16
17
|
});
|
|
17
18
|
// sort the TXT records to ensure deterministic processing
|
|
18
|
-
const txtRecords = txtRecordsResponse
|
|
19
|
+
const txtRecords = (txtRecordsResponse?.Answer ?? [])
|
|
19
20
|
.sort((a, b) => a.data.localeCompare(b.data));
|
|
20
21
|
log('found %d TXT records for %s', txtRecords.length, domain);
|
|
21
22
|
for (const answer of txtRecords) {
|
|
@@ -79,7 +80,7 @@ async function recursiveResolveDnslink(domain, depth, dns, log, options = {}) {
|
|
|
79
80
|
]
|
|
80
81
|
});
|
|
81
82
|
// sort the CNAME records to ensure deterministic processing
|
|
82
|
-
const cnameRecords = cnameRecordsResponse
|
|
83
|
+
const cnameRecords = (cnameRecordsResponse?.Answer ?? [])
|
|
83
84
|
.sort((a, b) => a.data.localeCompare(b.data));
|
|
84
85
|
log('found %d CNAME records for %s', cnameRecords.length, domain);
|
|
85
86
|
for (const cname of cnameRecords) {
|
|
@@ -90,7 +91,7 @@ async function recursiveResolveDnslink(domain, depth, dns, log, options = {}) {
|
|
|
90
91
|
log.error('domain %s cname %s had no DNSLink records', domain, cname.data, err);
|
|
91
92
|
}
|
|
92
93
|
}
|
|
93
|
-
throw new
|
|
94
|
+
throw new DNSLinkNotFoundError(`No DNSLink records found for domain: ${domain}`);
|
|
94
95
|
}
|
|
95
96
|
async function recursiveResolveDomain(domain, depth, dns, log, options = {}) {
|
|
96
97
|
if (depth === 0) {
|
|
@@ -107,7 +108,7 @@ async function recursiveResolveDomain(domain, depth, dns, log, options = {}) {
|
|
|
107
108
|
}
|
|
108
109
|
catch (err) {
|
|
109
110
|
// If the code is not ENOTFOUND or ERR_DNSLINK_NOT_FOUND or ENODATA then throw the error
|
|
110
|
-
if (err.code !== 'ENOTFOUND' && err.code !== '
|
|
111
|
+
if (err.code !== 'ENOTFOUND' && err.code !== 'ENODATA' && err.name !== 'DNSLinkNotFoundError' && err.name !== 'NotFoundError') {
|
|
111
112
|
throw err;
|
|
112
113
|
}
|
|
113
114
|
if (domain.startsWith('_dnslink.')) {
|
|
@@ -120,7 +121,7 @@ async function recursiveResolveDomain(domain, depth, dns, log, options = {}) {
|
|
|
120
121
|
domain = `_dnslink.${domain}`;
|
|
121
122
|
}
|
|
122
123
|
// If this throws then we propagate the error
|
|
123
|
-
return
|
|
124
|
+
return recursiveResolveDnslink(domain, depth, dns, log, options);
|
|
124
125
|
}
|
|
125
126
|
}
|
|
126
127
|
export async function resolveDNSLink(domain, dns, log, options = {}) {
|
package/dist/src/dnslink.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dnslink.js","sourceRoot":"","sources":["../../src/dnslink.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"dnslink.js","sourceRoot":"","sources":["../../src/dnslink.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare class DNSLinkNotFoundError extends Error {
|
|
2
|
+
static name: string;
|
|
3
|
+
constructor(message?: string);
|
|
4
|
+
}
|
|
5
|
+
export declare class RecordsFailedValidationError extends Error {
|
|
6
|
+
static name: string;
|
|
7
|
+
constructor(message?: string);
|
|
8
|
+
}
|
|
9
|
+
export declare class UnsupportedMultibasePrefixError extends Error {
|
|
10
|
+
static name: string;
|
|
11
|
+
constructor(message?: string);
|
|
12
|
+
}
|
|
13
|
+
export declare class UnsupportedMultihashCodecError extends Error {
|
|
14
|
+
static name: string;
|
|
15
|
+
constructor(message?: string);
|
|
16
|
+
}
|
|
17
|
+
export declare class InvalidValueError extends Error {
|
|
18
|
+
static name: string;
|
|
19
|
+
constructor(message?: string);
|
|
20
|
+
}
|
|
21
|
+
export declare class InvalidTopicError extends Error {
|
|
22
|
+
static name: string;
|
|
23
|
+
constructor(message?: string);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,MAAM,CAAC,IAAI,SAAyB;gBAEvB,OAAO,SAAsB;CAI3C;AAED,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,MAAM,CAAC,IAAI,SAAiC;gBAE/B,OAAO,SAA8B;CAInD;AAED,qBAAa,+BAAgC,SAAQ,KAAK;IACxD,MAAM,CAAC,IAAI,SAAoC;gBAElC,OAAO,SAAiC;CAItD;AAED,qBAAa,8BAA+B,SAAQ,KAAK;IACvD,MAAM,CAAC,IAAI,SAAmC;gBAEjC,OAAO,SAAgC;CAIrD;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,CAAC,IAAI,SAAsB;gBAEpB,OAAO,SAAkB;CAIvC;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,CAAC,IAAI,SAAsB;gBAEpB,OAAO,SAAkB;CAIvC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export class DNSLinkNotFoundError extends Error {
|
|
2
|
+
static name = 'DNSLinkNotFoundError';
|
|
3
|
+
constructor(message = 'DNSLink not found') {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'DNSLinkNotFoundError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class RecordsFailedValidationError extends Error {
|
|
9
|
+
static name = 'RecordsFailedValidationError';
|
|
10
|
+
constructor(message = 'Records failed validation') {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'RecordsFailedValidationError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export class UnsupportedMultibasePrefixError extends Error {
|
|
16
|
+
static name = 'UnsupportedMultibasePrefixError';
|
|
17
|
+
constructor(message = 'Unsupported multibase prefix') {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = 'UnsupportedMultibasePrefixError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class UnsupportedMultihashCodecError extends Error {
|
|
23
|
+
static name = 'UnsupportedMultihashCodecError';
|
|
24
|
+
constructor(message = 'Unsupported multihash codec') {
|
|
25
|
+
super(message);
|
|
26
|
+
this.name = 'UnsupportedMultihashCodecError';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class InvalidValueError extends Error {
|
|
30
|
+
static name = 'InvalidValueError';
|
|
31
|
+
constructor(message = 'Invalid value') {
|
|
32
|
+
super(message);
|
|
33
|
+
this.name = 'InvalidValueError';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class InvalidTopicError extends Error {
|
|
37
|
+
static name = 'InvalidTopicError';
|
|
38
|
+
constructor(message = 'Invalid topic') {
|
|
39
|
+
super(message);
|
|
40
|
+
this.name = 'InvalidTopicError';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,MAAM,CAAC,IAAI,GAAG,sBAAsB,CAAA;IAEpC,YAAa,OAAO,GAAG,mBAAmB;QACxC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;IACpC,CAAC;;AAGH,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD,MAAM,CAAC,IAAI,GAAG,8BAA8B,CAAA;IAE5C,YAAa,OAAO,GAAG,2BAA2B;QAChD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAA;IAC5C,CAAC;;AAGH,MAAM,OAAO,+BAAgC,SAAQ,KAAK;IACxD,MAAM,CAAC,IAAI,GAAG,iCAAiC,CAAA;IAE/C,YAAa,OAAO,GAAG,8BAA8B;QACnD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,iCAAiC,CAAA;IAC/C,CAAC;;AAGH,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACvD,MAAM,CAAC,IAAI,GAAG,gCAAgC,CAAA;IAE9C,YAAa,OAAO,GAAG,6BAA6B;QAClD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAA;IAC9C,CAAC;;AAGH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,CAAC,IAAI,GAAG,mBAAmB,CAAA;IAEjC,YAAa,OAAO,GAAG,eAAe;QACpC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAA;IACjC,CAAC;;AAGH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,CAAC,IAAI,GAAG,mBAAmB,CAAA;IAEjC,YAAa,OAAO,GAAG,eAAe;QACpC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAA;IACjC,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -11,23 +11,23 @@
|
|
|
11
11
|
* import { createHelia } from 'helia'
|
|
12
12
|
* import { ipns } from '@helia/ipns'
|
|
13
13
|
* import { unixfs } from '@helia/unixfs'
|
|
14
|
+
* import { generateKeyPair } from '@libp2p/crypto/keys'
|
|
14
15
|
*
|
|
15
16
|
* const helia = await createHelia()
|
|
16
17
|
* const name = ipns(helia)
|
|
17
18
|
*
|
|
18
|
-
* // create a
|
|
19
|
-
* const
|
|
20
|
-
* const peerId = await helia.libp2p.services.keychain.exportPeerId(keyInfo.name)
|
|
19
|
+
* // create a keypair to publish an IPNS name
|
|
20
|
+
* const privateKey = await generateKeyPair('Ed25519')
|
|
21
21
|
*
|
|
22
22
|
* // store some data to publish
|
|
23
23
|
* const fs = unixfs(helia)
|
|
24
|
-
* const cid = await fs.
|
|
24
|
+
* const cid = await fs.addBytes(Uint8Array.from([0, 1, 2, 3, 4]))
|
|
25
25
|
*
|
|
26
26
|
* // publish the name
|
|
27
|
-
* await name.publish(
|
|
27
|
+
* await name.publish(privateKey, cid)
|
|
28
28
|
*
|
|
29
29
|
* // resolve the name
|
|
30
|
-
* const result = name.resolve(
|
|
30
|
+
* const result = await name.resolve(privateKey.publicKey)
|
|
31
31
|
*
|
|
32
32
|
* console.info(result.cid, result.path)
|
|
33
33
|
* ```
|
|
@@ -41,30 +41,29 @@
|
|
|
41
41
|
* import { createHelia } from 'helia'
|
|
42
42
|
* import { ipns } from '@helia/ipns'
|
|
43
43
|
* import { unixfs } from '@helia/unixfs'
|
|
44
|
+
* import { generateKeyPair } from '@libp2p/crypto/keys'
|
|
44
45
|
*
|
|
45
46
|
* const helia = await createHelia()
|
|
46
47
|
* const name = ipns(helia)
|
|
47
48
|
*
|
|
48
|
-
* // create a
|
|
49
|
-
* const
|
|
50
|
-
* const peerId = await helia.libp2p.services.keychain.exportPeerId(keyInfo.name)
|
|
49
|
+
* // create a keypair to publish an IPNS name
|
|
50
|
+
* const privateKey = await generateKeyPair('Ed25519')
|
|
51
51
|
*
|
|
52
52
|
* // store some data to publish
|
|
53
53
|
* const fs = unixfs(helia)
|
|
54
|
-
* const cid = await fs.
|
|
54
|
+
* const cid = await fs.addBytes(Uint8Array.from([0, 1, 2, 3, 4]))
|
|
55
55
|
*
|
|
56
56
|
* // publish the name
|
|
57
|
-
* await name.publish(
|
|
57
|
+
* await name.publish(privateKey, cid)
|
|
58
58
|
*
|
|
59
|
-
* // create another
|
|
60
|
-
* const
|
|
61
|
-
* const recursivePeerId = await helia.libp2p.services.keychain.exportPeerId(recursiveKeyInfo.name)
|
|
59
|
+
* // create another keypair to re-publish the original record
|
|
60
|
+
* const recursivePrivateKey = await generateKeyPair('Ed25519')
|
|
62
61
|
*
|
|
63
62
|
* // publish the recursive name
|
|
64
|
-
* await name.publish(
|
|
63
|
+
* await name.publish(recursivePrivateKey, privateKey.publicKey)
|
|
65
64
|
*
|
|
66
65
|
* // resolve the name recursively - it resolves until a CID is found
|
|
67
|
-
* const result = name.resolve(
|
|
66
|
+
* const result = await name.resolve(recursivePrivateKey.publicKey)
|
|
68
67
|
* console.info(result.cid.toString() === cid.toString()) // true
|
|
69
68
|
* ```
|
|
70
69
|
*
|
|
@@ -76,27 +75,27 @@
|
|
|
76
75
|
* import { createHelia } from 'helia'
|
|
77
76
|
* import { ipns } from '@helia/ipns'
|
|
78
77
|
* import { unixfs } from '@helia/unixfs'
|
|
78
|
+
* import { generateKeyPair } from '@libp2p/crypto/keys'
|
|
79
79
|
*
|
|
80
80
|
* const helia = await createHelia()
|
|
81
81
|
* const name = ipns(helia)
|
|
82
82
|
*
|
|
83
|
-
* // create a
|
|
84
|
-
* const
|
|
85
|
-
* const peerId = await helia.libp2p.services.keychain.exportPeerId(keyInfo.name)
|
|
83
|
+
* // create a keypair to publish an IPNS name
|
|
84
|
+
* const privateKey = await generateKeyPair('Ed25519')
|
|
86
85
|
*
|
|
87
86
|
* // store some data to publish
|
|
88
87
|
* const fs = unixfs(helia)
|
|
89
|
-
* const fileCid = await fs.
|
|
88
|
+
* const fileCid = await fs.addBytes(Uint8Array.from([0, 1, 2, 3, 4]))
|
|
90
89
|
*
|
|
91
90
|
* // store the file in a directory
|
|
92
|
-
* const dirCid = await fs.
|
|
91
|
+
* const dirCid = await fs.addDirectory()
|
|
93
92
|
* const finalDirCid = await fs.cp(fileCid, dirCid, '/foo.txt')
|
|
94
93
|
*
|
|
95
94
|
* // publish the name
|
|
96
|
-
* await name.publish(
|
|
95
|
+
* await name.publish(privateKey, `/ipfs/${finalDirCid}/foo.txt`)
|
|
97
96
|
*
|
|
98
97
|
* // resolve the name
|
|
99
|
-
* const result = name.resolve(
|
|
98
|
+
* const result = await name.resolve(privateKey.publicKey)
|
|
100
99
|
*
|
|
101
100
|
* console.info(result.cid, result.path) // QmFoo.. 'foo.txt'
|
|
102
101
|
* ```
|
|
@@ -123,11 +122,14 @@
|
|
|
123
122
|
* import { pubsub } from '@helia/ipns/routing'
|
|
124
123
|
* import { unixfs } from '@helia/unixfs'
|
|
125
124
|
* import { gossipsub } from '@chainsafe/libp2p-gossipsub'
|
|
125
|
+
* import { generateKeyPair } from '@libp2p/crypto/keys'
|
|
126
|
+
* import type { Libp2p, PubSub } from '@libp2p/interface'
|
|
127
|
+
* import type { DefaultLibp2pServices } from 'helia'
|
|
126
128
|
*
|
|
127
129
|
* const libp2pOptions = libp2pDefaults()
|
|
128
130
|
* libp2pOptions.services.pubsub = gossipsub()
|
|
129
131
|
*
|
|
130
|
-
* const helia = await createHelia({
|
|
132
|
+
* const helia = await createHelia<Libp2p<DefaultLibp2pServices & { pubsub: PubSub }>>({
|
|
131
133
|
* libp2p: libp2pOptions
|
|
132
134
|
* })
|
|
133
135
|
* const name = ipns(helia, {
|
|
@@ -136,44 +138,50 @@
|
|
|
136
138
|
* ]
|
|
137
139
|
* })
|
|
138
140
|
*
|
|
139
|
-
* // create a
|
|
140
|
-
* const
|
|
141
|
-
* const peerId = await helia.libp2p.services.keychain.exportPeerId(keyInfo.name)
|
|
141
|
+
* // create a keypair to publish an IPNS name
|
|
142
|
+
* const privateKey = await generateKeyPair('Ed25519')
|
|
142
143
|
*
|
|
143
144
|
* // store some data to publish
|
|
144
145
|
* const fs = unixfs(helia)
|
|
145
|
-
* const cid = await fs.
|
|
146
|
+
* const cid = await fs.addBytes(Uint8Array.from([0, 1, 2, 3, 4]))
|
|
146
147
|
*
|
|
147
148
|
* // publish the name
|
|
148
|
-
* await name.publish(
|
|
149
|
+
* await name.publish(privateKey, cid)
|
|
149
150
|
*
|
|
150
151
|
* // resolve the name
|
|
151
|
-
* const
|
|
152
|
+
* const result = await name.resolve(privateKey.publicKey)
|
|
152
153
|
* ```
|
|
153
154
|
*
|
|
154
155
|
* @example Using custom DNS over HTTPS resolvers
|
|
155
156
|
*
|
|
156
|
-
*
|
|
157
|
+
* To use custom resolvers, configure Helia's `dns` option:
|
|
157
158
|
*
|
|
158
159
|
* ```TypeScript
|
|
159
160
|
* import { createHelia } from 'helia'
|
|
160
161
|
* import { ipns } from '@helia/ipns'
|
|
161
|
-
* import {
|
|
162
|
-
* import { dnsOverHttps } from '@
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* const
|
|
166
|
-
*
|
|
167
|
-
*
|
|
162
|
+
* import { dns } from '@multiformats/dns'
|
|
163
|
+
* import { dnsOverHttps } from '@multiformats/dns/resolvers'
|
|
164
|
+
* import { helia } from '@helia/ipns/routing'
|
|
165
|
+
*
|
|
166
|
+
* const node = await createHelia({
|
|
167
|
+
* dns: dns({
|
|
168
|
+
* resolvers: {
|
|
169
|
+
* '.': dnsOverHttps('https://private-dns-server.me/dns-query')
|
|
170
|
+
* }
|
|
171
|
+
* })
|
|
172
|
+
* })
|
|
173
|
+
* const name = ipns(node, {
|
|
174
|
+
* routers: [
|
|
175
|
+
* helia(node.routing)
|
|
168
176
|
* ]
|
|
169
177
|
* })
|
|
170
178
|
*
|
|
171
|
-
* const
|
|
179
|
+
* const result = name.resolveDNSLink('some-domain-with-dnslink-entry.com')
|
|
172
180
|
* ```
|
|
173
181
|
*
|
|
174
182
|
* @example Resolving a domain with a dnslink entry
|
|
175
183
|
*
|
|
176
|
-
* Calling `
|
|
184
|
+
* Calling `resolveDNSLink` with the `@helia/ipns` instance:
|
|
177
185
|
*
|
|
178
186
|
* ```TypeScript
|
|
179
187
|
* // resolve a CID from a TXT record in a DNS zone file, using the default
|
|
@@ -185,10 +193,16 @@
|
|
|
185
193
|
* // ;; ANSWER SECTION:
|
|
186
194
|
* // _dnslink.website.ipfs.io. 60 IN TXT "dnslink=/ipfs/QmWebsite"
|
|
187
195
|
*
|
|
188
|
-
*
|
|
196
|
+
* import { createHelia } from 'helia'
|
|
197
|
+
* import { ipns } from '@helia/ipns'
|
|
198
|
+
*
|
|
199
|
+
* const node = await createHelia()
|
|
200
|
+
* const name = ipns(node)
|
|
189
201
|
*
|
|
190
|
-
*
|
|
191
|
-
*
|
|
202
|
+
* const { answer } = await name.resolveDNSLink('ipfs.io')
|
|
203
|
+
*
|
|
204
|
+
* console.info(answer)
|
|
205
|
+
* // { data: '/ipfs/QmWebsite' }
|
|
192
206
|
* ```
|
|
193
207
|
*
|
|
194
208
|
* @example Using DNS-Over-HTTPS
|
|
@@ -200,14 +214,21 @@
|
|
|
200
214
|
* If this is a concern, use the DNS-JSON-Over-HTTPS resolver instead.
|
|
201
215
|
*
|
|
202
216
|
* ```TypeScript
|
|
203
|
-
*
|
|
204
|
-
* import {
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
*
|
|
217
|
+
* import { createHelia } from 'helia'
|
|
218
|
+
* import { ipns } from '@helia/ipns'
|
|
219
|
+
* import { dns } from '@multiformats/dns'
|
|
220
|
+
* import { dnsOverHttps } from '@multiformats/dns/resolvers'
|
|
221
|
+
*
|
|
222
|
+
* const node = await createHelia({
|
|
223
|
+
* dns: dns({
|
|
224
|
+
* resolvers: {
|
|
225
|
+
* '.': dnsOverHttps('https://mozilla.cloudflare-dns.com/dns-query')
|
|
226
|
+
* }
|
|
227
|
+
* })
|
|
210
228
|
* })
|
|
229
|
+
* const name = ipns(node)
|
|
230
|
+
*
|
|
231
|
+
* const result = await name.resolveDNSLink('ipfs.io')
|
|
211
232
|
* ```
|
|
212
233
|
*
|
|
213
234
|
* @example Using DNS-JSON-Over-HTTPS
|
|
@@ -216,24 +237,32 @@
|
|
|
216
237
|
* result in a smaller browser bundle due to the response being plain JSON.
|
|
217
238
|
*
|
|
218
239
|
* ```TypeScript
|
|
219
|
-
*
|
|
220
|
-
* import {
|
|
221
|
-
*
|
|
222
|
-
*
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
*
|
|
240
|
+
* import { createHelia } from 'helia'
|
|
241
|
+
* import { ipns } from '@helia/ipns'
|
|
242
|
+
* import { dns } from '@multiformats/dns'
|
|
243
|
+
* import { dnsJsonOverHttps } from '@multiformats/dns/resolvers'
|
|
244
|
+
*
|
|
245
|
+
* const node = await createHelia({
|
|
246
|
+
* dns: dns({
|
|
247
|
+
* resolvers: {
|
|
248
|
+
* '.': dnsJsonOverHttps('https://mozilla.cloudflare-dns.com/dns-query')
|
|
249
|
+
* }
|
|
250
|
+
* })
|
|
226
251
|
* })
|
|
252
|
+
* const name = ipns(node)
|
|
253
|
+
*
|
|
254
|
+
* const result = await name.resolveDNSLink('ipfs.io')
|
|
227
255
|
* ```
|
|
228
256
|
*/
|
|
257
|
+
import { type IPNSRecord } from 'ipns';
|
|
229
258
|
import { ipnsValidator } from 'ipns/validator';
|
|
230
259
|
import { CID } from 'multiformats/cid';
|
|
231
260
|
import type { IPNSRouting, IPNSRoutingEvents } from './routing/index.js';
|
|
232
261
|
import type { Routing } from '@helia/interface';
|
|
233
|
-
import type { AbortOptions, ComponentLogger,
|
|
262
|
+
import type { AbortOptions, ComponentLogger, PrivateKey, PublicKey } from '@libp2p/interface';
|
|
234
263
|
import type { Answer, DNS, ResolveDnsProgressEvents } from '@multiformats/dns';
|
|
235
264
|
import type { Datastore } from 'interface-datastore';
|
|
236
|
-
import type {
|
|
265
|
+
import type { MultihashDigest } from 'multiformats/hashes/interface';
|
|
237
266
|
import type { ProgressEvent, ProgressOptions } from 'progress-events';
|
|
238
267
|
export type PublishProgressEvents = ProgressEvent<'ipns:publish:start'> | ProgressEvent<'ipns:publish:success', IPNSRecord> | ProgressEvent<'ipns:publish:error', Error>;
|
|
239
268
|
export type ResolveProgressEvents = ProgressEvent<'ipns:resolve:start', unknown> | ProgressEvent<'ipns:resolve:success', IPNSRecord> | ProgressEvent<'ipns:resolve:error', Error>;
|
|
@@ -328,12 +357,12 @@ export interface IPNS {
|
|
|
328
357
|
*
|
|
329
358
|
* If the value is a PeerId, a recursive IPNS record will be created.
|
|
330
359
|
*/
|
|
331
|
-
publish(key:
|
|
360
|
+
publish(key: PrivateKey, value: CID | PublicKey | MultihashDigest<0x00 | 0x12> | string, options?: PublishOptions): Promise<IPNSRecord>;
|
|
332
361
|
/**
|
|
333
362
|
* Accepts a public key formatted as a libp2p PeerID and resolves the IPNS record
|
|
334
363
|
* corresponding to that public key until a value is found
|
|
335
364
|
*/
|
|
336
|
-
resolve(key:
|
|
365
|
+
resolve(key: PublicKey | MultihashDigest<0x00 | 0x12>, options?: ResolveOptions): Promise<IPNSResolveResult>;
|
|
337
366
|
/**
|
|
338
367
|
* Resolve a CID from a dns-link style IPNS record
|
|
339
368
|
*/
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|