@helia/ipns 1.0.1 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +18 -18
- package/dist/src/index.d.ts +14 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +15 -8
- package/dist/src/index.js.map +1 -1
- package/dist/src/routing/dht.d.ts +4 -4
- package/dist/src/routing/dht.d.ts.map +1 -1
- package/dist/src/routing/dht.js +3 -41
- package/dist/src/routing/dht.js.map +1 -1
- package/dist/typedoc-urls.json +1 -0
- package/package.json +4 -2
- package/src/index.ts +33 -13
- package/src/routing/dht.ts +6 -48
package/dist/src/index.d.ts
CHANGED
|
@@ -77,19 +77,29 @@ export type RepublishProgressEvents = ProgressEvent<'ipns:republish:start', unkn
|
|
|
77
77
|
}>;
|
|
78
78
|
export interface PublishOptions extends AbortOptions, ProgressOptions<PublishProgressEvents | IPNSRoutingEvents> {
|
|
79
79
|
/**
|
|
80
|
-
* Time duration of the record in ms
|
|
80
|
+
* Time duration of the record in ms (default: 24hrs)
|
|
81
81
|
*/
|
|
82
82
|
lifetime?: number;
|
|
83
|
+
/**
|
|
84
|
+
* Only publish to a local datastore (default: false)
|
|
85
|
+
*/
|
|
86
|
+
offline?: boolean;
|
|
83
87
|
}
|
|
84
88
|
export interface ResolveOptions extends AbortOptions, ProgressOptions<ResolveProgressEvents | IPNSRoutingEvents> {
|
|
85
89
|
/**
|
|
86
|
-
*
|
|
90
|
+
* Do not query the network for the IPNS record (default: false)
|
|
91
|
+
*/
|
|
92
|
+
offline?: boolean;
|
|
93
|
+
}
|
|
94
|
+
export interface ResolveDNSOptions extends ResolveOptions {
|
|
95
|
+
/**
|
|
96
|
+
* Do not use cached DNS entries (default: false)
|
|
87
97
|
*/
|
|
88
98
|
nocache?: boolean;
|
|
89
99
|
}
|
|
90
100
|
export interface RepublishOptions extends AbortOptions, ProgressOptions<RepublishProgressEvents | IPNSRoutingEvents> {
|
|
91
101
|
/**
|
|
92
|
-
* The republish interval in ms (default:
|
|
102
|
+
* The republish interval in ms (default: 23hrs)
|
|
93
103
|
*/
|
|
94
104
|
interval?: number;
|
|
95
105
|
}
|
|
@@ -108,7 +118,7 @@ export interface IPNS {
|
|
|
108
118
|
/**
|
|
109
119
|
* Resolve a CID from a dns-link style IPNS record
|
|
110
120
|
*/
|
|
111
|
-
resolveDns: (domain: string, options?:
|
|
121
|
+
resolveDns: (domain: string, options?: ResolveDNSOptions) => Promise<CID>;
|
|
112
122
|
/**
|
|
113
123
|
* Periodically republish all IPNS records found in the datastore
|
|
114
124
|
*/
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAY,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAE5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAItC,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAIrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAWpD,MAAM,MAAM,qBAAqB,GAC/B,aAAa,CAAC,oBAAoB,CAAC,GACnC,aAAa,CAAC,sBAAsB,EAAE,SAAS,CAAC,GAChD,aAAa,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;AAE5C,MAAM,MAAM,qBAAqB,GAC/B,aAAa,CAAC,oBAAoB,EAAE,OAAO,CAAC,GAC5C,aAAa,CAAC,sBAAsB,EAAE,SAAS,CAAC,GAChD,aAAa,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;AAE5C,MAAM,MAAM,uBAAuB,GACjC,aAAa,CAAC,sBAAsB,EAAE,OAAO,CAAC,GAC9C,aAAa,CAAC,wBAAwB,EAAE,SAAS,CAAC,GAClD,aAAa,CAAC,sBAAsB,EAAE;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,KAAK,CAAA;CAAE,CAAC,CAAA;AAE1E,MAAM,WAAW,cAAe,SAAQ,YAAY,EAAE,eAAe,CAAC,qBAAqB,GAAG,iBAAiB,CAAC;IAC9G;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY,EAAE,eAAe,CAAC,qBAAqB,GAAG,iBAAiB,CAAC;IAC9G;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,gBAAiB,SAAQ,YAAY,EAAE,eAAe,CAAC,uBAAuB,GAAG,iBAAiB,CAAC;IAClH;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,IAAI;IACnB;;;;OAIG;IACH,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,SAAS,CAAC,CAAA;IAE3F;;;OAGG;IACH,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;IAEhE;;OAEG;IACH,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -111,8 +111,10 @@ class DefaultIPNS {
|
|
|
111
111
|
const record = await create(key, bytes, sequenceNumber, options.lifetime ?? DEFAULT_LIFETIME_MS);
|
|
112
112
|
const marshaledRecord = marshal(record);
|
|
113
113
|
await this.localStore.put(routingKey, marshaledRecord, options);
|
|
114
|
-
|
|
115
|
-
|
|
114
|
+
if (options.offline !== true) {
|
|
115
|
+
// publish record to routing
|
|
116
|
+
await Promise.all(this.routers.map(async (r) => { await r.put(routingKey, marshaledRecord, options); }));
|
|
117
|
+
}
|
|
116
118
|
return record;
|
|
117
119
|
}
|
|
118
120
|
catch (err) {
|
|
@@ -124,11 +126,11 @@ class DefaultIPNS {
|
|
|
124
126
|
const routingKey = peerIdToRoutingKey(key);
|
|
125
127
|
const record = await __classPrivateFieldGet(this, _DefaultIPNS_instances, "m", _DefaultIPNS_findIpnsRecord).call(this, routingKey, options);
|
|
126
128
|
const str = uint8ArrayToString(record.value);
|
|
127
|
-
return await __classPrivateFieldGet(this, _DefaultIPNS_instances, "m", _DefaultIPNS_resolve).call(this, str);
|
|
129
|
+
return await __classPrivateFieldGet(this, _DefaultIPNS_instances, "m", _DefaultIPNS_resolve).call(this, str, options);
|
|
128
130
|
}
|
|
129
131
|
async resolveDns(domain, options = {}) {
|
|
130
132
|
const dnslink = await resolveDnslink(domain, options);
|
|
131
|
-
return await __classPrivateFieldGet(this, _DefaultIPNS_instances, "m", _DefaultIPNS_resolve).call(this, dnslink);
|
|
133
|
+
return await __classPrivateFieldGet(this, _DefaultIPNS_instances, "m", _DefaultIPNS_resolve).call(this, dnslink, options);
|
|
132
134
|
}
|
|
133
135
|
republish(options = {}) {
|
|
134
136
|
if (this.timeout != null) {
|
|
@@ -159,12 +161,12 @@ class DefaultIPNS {
|
|
|
159
161
|
}, options.interval ?? DEFAULT_REPUBLISH_INTERVAL_MS);
|
|
160
162
|
}
|
|
161
163
|
}
|
|
162
|
-
_DefaultIPNS_instances = new WeakSet(), _DefaultIPNS_resolve = async function _DefaultIPNS_resolve(ipfsPath) {
|
|
164
|
+
_DefaultIPNS_instances = new WeakSet(), _DefaultIPNS_resolve = async function _DefaultIPNS_resolve(ipfsPath, options = {}) {
|
|
163
165
|
const parts = ipfsPath.split('/');
|
|
164
166
|
if (parts.length === 3) {
|
|
165
167
|
const scheme = parts[1];
|
|
166
168
|
if (scheme === 'ipns') {
|
|
167
|
-
return await this.resolve(peerIdFromString(parts[2]));
|
|
169
|
+
return await this.resolve(peerIdFromString(parts[2]), options);
|
|
168
170
|
}
|
|
169
171
|
else if (scheme === 'ipfs') {
|
|
170
172
|
return CID.parse(parts[2]);
|
|
@@ -172,11 +174,16 @@ _DefaultIPNS_instances = new WeakSet(), _DefaultIPNS_resolve = async function _D
|
|
|
172
174
|
}
|
|
173
175
|
log.error('invalid ipfs path %s', ipfsPath);
|
|
174
176
|
throw new Error('Invalid value');
|
|
175
|
-
}, _DefaultIPNS_findIpnsRecord = async function _DefaultIPNS_findIpnsRecord(routingKey, options) {
|
|
176
|
-
|
|
177
|
+
}, _DefaultIPNS_findIpnsRecord = async function _DefaultIPNS_findIpnsRecord(routingKey, options = {}) {
|
|
178
|
+
let routers = [
|
|
177
179
|
this.localStore,
|
|
178
180
|
...this.routers
|
|
179
181
|
];
|
|
182
|
+
if (options.offline === true) {
|
|
183
|
+
routers = [
|
|
184
|
+
this.localStore
|
|
185
|
+
];
|
|
186
|
+
}
|
|
180
187
|
const unmarshaledRecord = await Promise.any(routers.map(async (router) => {
|
|
181
188
|
const unmarshaledRecord = await router.get(routingKey, options);
|
|
182
189
|
await ipnsValidator(routingKey, unmarshaledRecord);
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;;;;;;;AAGH,OAAO,EAAE,QAAQ,EAAU,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAGrE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAE5E,OAAO,EAAE,UAAU,EAAc,MAAM,0BAA0B,CAAA;AAEjE,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAA;AAEhC,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAA;AACxB,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,CAAA;AAExB,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAA;AACrC,MAAM,6BAA6B,GAAG,EAAE,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { IPNSRouting } from '../index.js';
|
|
2
|
-
import type { DHT, QueryEvent } from '@libp2p/interface-dht';
|
|
3
2
|
import type { GetOptions, PutOptions } from './index.js';
|
|
4
3
|
import { ProgressEvent } from 'progress-events';
|
|
4
|
+
import type { ContentRouting } from '@libp2p/interface-content-routing';
|
|
5
5
|
export interface DHTRoutingComponents {
|
|
6
6
|
libp2p: {
|
|
7
|
-
|
|
7
|
+
contentRouting: ContentRouting;
|
|
8
8
|
};
|
|
9
9
|
}
|
|
10
|
-
export type DHTProgressEvents = ProgressEvent<'ipns:routing:dht:
|
|
10
|
+
export type DHTProgressEvents = ProgressEvent<'ipns:routing:dht:error', Error>;
|
|
11
11
|
export declare class DHTRouting implements IPNSRouting {
|
|
12
|
-
private readonly
|
|
12
|
+
private readonly contentRouting;
|
|
13
13
|
constructor(components: DHTRoutingComponents);
|
|
14
14
|
put(routingKey: Uint8Array, marshaledRecord: Uint8Array, options?: PutOptions): Promise<void>;
|
|
15
15
|
get(routingKey: Uint8Array, options?: GetOptions): Promise<Uint8Array>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dht.d.ts","sourceRoot":"","sources":["../../../src/routing/dht.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dht.d.ts","sourceRoot":"","sources":["../../../src/routing/dht.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,EAAuB,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AAEvE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE;QACN,cAAc,EAAE,cAAc,CAAA;KAC/B,CAAA;CACF;AAED,MAAM,MAAM,iBAAiB,GAC3B,aAAa,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAA;AAEhD,qBAAa,UAAW,YAAW,WAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;gBAElC,UAAU,EAAE,oBAAoB;IAIvC,GAAG,CAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlG,GAAG,CAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,UAAU,CAAC;CASlF;AAED,wBAAgB,GAAG,CAAE,UAAU,EAAE,oBAAoB,GAAG,WAAW,CAElE"}
|
package/dist/src/routing/dht.js
CHANGED
|
@@ -1,37 +1,19 @@
|
|
|
1
|
-
import { logger } from '@libp2p/logger';
|
|
2
1
|
import { CustomProgressEvent } from 'progress-events';
|
|
3
|
-
const log = logger('helia:ipns:routing:dht');
|
|
4
2
|
export class DHTRouting {
|
|
5
3
|
constructor(components) {
|
|
6
|
-
this.
|
|
4
|
+
this.contentRouting = components.libp2p.contentRouting;
|
|
7
5
|
}
|
|
8
6
|
async put(routingKey, marshaledRecord, options = {}) {
|
|
9
|
-
let putValue = false;
|
|
10
7
|
try {
|
|
11
|
-
|
|
12
|
-
logEvent('DHT put event', event);
|
|
13
|
-
options.onProgress?.(new CustomProgressEvent('ipns:routing:dht:query', event));
|
|
14
|
-
if (event.name === 'PEER_RESPONSE' && event.messageName === 'PUT_VALUE') {
|
|
15
|
-
putValue = true;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
8
|
+
await this.contentRouting.put(routingKey, marshaledRecord, options);
|
|
18
9
|
}
|
|
19
10
|
catch (err) {
|
|
20
11
|
options.onProgress?.(new CustomProgressEvent('ipns:routing:dht:error', err));
|
|
21
12
|
}
|
|
22
|
-
if (!putValue) {
|
|
23
|
-
throw new Error('Could not put value to DHT');
|
|
24
|
-
}
|
|
25
13
|
}
|
|
26
14
|
async get(routingKey, options = {}) {
|
|
27
15
|
try {
|
|
28
|
-
|
|
29
|
-
logEvent('DHT get event', event);
|
|
30
|
-
options.onProgress?.(new CustomProgressEvent('ipns:routing:dht:query', event));
|
|
31
|
-
if (event.name === 'VALUE') {
|
|
32
|
-
return event.value;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
16
|
+
return await this.contentRouting.get(routingKey, options);
|
|
35
17
|
}
|
|
36
18
|
catch (err) {
|
|
37
19
|
options.onProgress?.(new CustomProgressEvent('ipns:routing:dht:error', err));
|
|
@@ -39,26 +21,6 @@ export class DHTRouting {
|
|
|
39
21
|
throw new Error('Not found');
|
|
40
22
|
}
|
|
41
23
|
}
|
|
42
|
-
function logEvent(prefix, event) {
|
|
43
|
-
if (event.name === 'SENDING_QUERY') {
|
|
44
|
-
log(prefix, event.name, event.messageName, '->', event.to.toString());
|
|
45
|
-
}
|
|
46
|
-
else if (event.name === 'PEER_RESPONSE') {
|
|
47
|
-
log(prefix, event.name, event.messageName, '<-', event.from.toString());
|
|
48
|
-
}
|
|
49
|
-
else if (event.name === 'FINAL_PEER') {
|
|
50
|
-
log(prefix, event.name, event.peer.id.toString());
|
|
51
|
-
}
|
|
52
|
-
else if (event.name === 'QUERY_ERROR') {
|
|
53
|
-
log(prefix, event.name, event.error.message);
|
|
54
|
-
}
|
|
55
|
-
else if (event.name === 'PROVIDER') {
|
|
56
|
-
log(prefix, event.name, event.providers.map(p => p.id.toString()).join(', '));
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
log(prefix, event.name);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
24
|
export function dht(components) {
|
|
63
25
|
return new DHTRouting(components);
|
|
64
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dht.js","sourceRoot":"","sources":["../../../src/routing/dht.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dht.js","sourceRoot":"","sources":["../../../src/routing/dht.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAiB,MAAM,iBAAiB,CAAA;AAYpE,MAAM,OAAO,UAAU;IAGrB,YAAa,UAAgC;QAC3C,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,cAAc,CAAA;IACxD,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,UAAsB,EAAE,eAA2B,EAAE,UAAsB,EAAE;QACtF,IAAI;YACF,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,CAAC,CAAA;SACpE;QAAC,OAAO,GAAQ,EAAE;YACjB,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAQ,wBAAwB,EAAE,GAAG,CAAC,CAAC,CAAA;SACpF;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,UAAsB,EAAE,UAAsB,EAAE;QACzD,IAAI;YACF,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;SAC1D;QAAC,OAAO,GAAQ,EAAE;YACjB,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAQ,wBAAwB,EAAE,GAAG,CAAC,CAAC,CAAA;SACpF;QAED,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAA;IAC9B,CAAC;CACF;AAED,MAAM,UAAU,GAAG,CAAE,UAAgC;IACnD,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,CAAA;AACnC,CAAC"}
|
package/dist/typedoc-urls.json
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
"IPNSComponents": "https://ipfs.github.io/helia-ipns/interfaces/index.IPNSComponents.html",
|
|
4
4
|
"PublishOptions": "https://ipfs.github.io/helia-ipns/interfaces/index.PublishOptions.html",
|
|
5
5
|
"RepublishOptions": "https://ipfs.github.io/helia-ipns/interfaces/index.RepublishOptions.html",
|
|
6
|
+
"ResolveDNSOptions": "https://ipfs.github.io/helia-ipns/interfaces/index.ResolveDNSOptions.html",
|
|
6
7
|
"ResolveOptions": "https://ipfs.github.io/helia-ipns/interfaces/index.ResolveOptions.html",
|
|
7
8
|
"PublishProgressEvents": "https://ipfs.github.io/helia-ipns/types/index.PublishProgressEvents.html",
|
|
8
9
|
"RepublishProgressEvents": "https://ipfs.github.io/helia-ipns/types/index.RepublishProgressEvents.html",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@helia/ipns",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "An implementation of IPNS for Helia",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"homepage": "https://github.com/ipfs/helia-ipns/tree/master/packages/ipns#readme",
|
|
@@ -159,6 +159,7 @@
|
|
|
159
159
|
"release": "aegir release"
|
|
160
160
|
},
|
|
161
161
|
"dependencies": {
|
|
162
|
+
"@libp2p/interface-content-routing": "^2.1.0",
|
|
162
163
|
"@libp2p/interface-dht": "^2.0.1",
|
|
163
164
|
"@libp2p/interface-peer-id": "^2.0.1",
|
|
164
165
|
"@libp2p/interface-pubsub": "^3.0.6",
|
|
@@ -179,7 +180,8 @@
|
|
|
179
180
|
"@libp2p/peer-id-factory": "^2.0.1",
|
|
180
181
|
"aegir": "^38.1.0",
|
|
181
182
|
"datastore-core": "^9.0.3",
|
|
182
|
-
"sinon": "^15.0.1"
|
|
183
|
+
"sinon": "^15.0.1",
|
|
184
|
+
"sinon-ts": "^1.0.0"
|
|
183
185
|
},
|
|
184
186
|
"browser": {
|
|
185
187
|
"./dist/src/utils/resolve-dns-link.js": "./dist/src/utils/resolve-dns-link.browser.js"
|
package/src/index.ts
CHANGED
|
@@ -104,21 +104,33 @@ export type RepublishProgressEvents =
|
|
|
104
104
|
|
|
105
105
|
export interface PublishOptions extends AbortOptions, ProgressOptions<PublishProgressEvents | IPNSRoutingEvents> {
|
|
106
106
|
/**
|
|
107
|
-
* Time duration of the record in ms
|
|
107
|
+
* Time duration of the record in ms (default: 24hrs)
|
|
108
108
|
*/
|
|
109
109
|
lifetime?: number
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Only publish to a local datastore (default: false)
|
|
113
|
+
*/
|
|
114
|
+
offline?: boolean
|
|
110
115
|
}
|
|
111
116
|
|
|
112
117
|
export interface ResolveOptions extends AbortOptions, ProgressOptions<ResolveProgressEvents | IPNSRoutingEvents> {
|
|
113
118
|
/**
|
|
114
|
-
*
|
|
119
|
+
* Do not query the network for the IPNS record (default: false)
|
|
120
|
+
*/
|
|
121
|
+
offline?: boolean
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface ResolveDNSOptions extends ResolveOptions {
|
|
125
|
+
/**
|
|
126
|
+
* Do not use cached DNS entries (default: false)
|
|
115
127
|
*/
|
|
116
128
|
nocache?: boolean
|
|
117
129
|
}
|
|
118
130
|
|
|
119
131
|
export interface RepublishOptions extends AbortOptions, ProgressOptions<RepublishProgressEvents | IPNSRoutingEvents> {
|
|
120
132
|
/**
|
|
121
|
-
* The republish interval in ms (default:
|
|
133
|
+
* The republish interval in ms (default: 23hrs)
|
|
122
134
|
*/
|
|
123
135
|
interval?: number
|
|
124
136
|
}
|
|
@@ -140,7 +152,7 @@ export interface IPNS {
|
|
|
140
152
|
/**
|
|
141
153
|
* Resolve a CID from a dns-link style IPNS record
|
|
142
154
|
*/
|
|
143
|
-
resolveDns: (domain: string, options?:
|
|
155
|
+
resolveDns: (domain: string, options?: ResolveDNSOptions) => Promise<CID>
|
|
144
156
|
|
|
145
157
|
/**
|
|
146
158
|
* Periodically republish all IPNS records found in the datastore
|
|
@@ -192,8 +204,10 @@ class DefaultIPNS implements IPNS {
|
|
|
192
204
|
|
|
193
205
|
await this.localStore.put(routingKey, marshaledRecord, options)
|
|
194
206
|
|
|
195
|
-
|
|
196
|
-
|
|
207
|
+
if (options.offline !== true) {
|
|
208
|
+
// publish record to routing
|
|
209
|
+
await Promise.all(this.routers.map(async r => { await r.put(routingKey, marshaledRecord, options) }))
|
|
210
|
+
}
|
|
197
211
|
|
|
198
212
|
return record
|
|
199
213
|
} catch (err: any) {
|
|
@@ -207,13 +221,13 @@ class DefaultIPNS implements IPNS {
|
|
|
207
221
|
const record = await this.#findIpnsRecord(routingKey, options)
|
|
208
222
|
const str = uint8ArrayToString(record.value)
|
|
209
223
|
|
|
210
|
-
return await this.#resolve(str)
|
|
224
|
+
return await this.#resolve(str, options)
|
|
211
225
|
}
|
|
212
226
|
|
|
213
|
-
async resolveDns (domain: string, options:
|
|
227
|
+
async resolveDns (domain: string, options: ResolveDNSOptions = {}): Promise<CID> {
|
|
214
228
|
const dnslink = await resolveDnslink(domain, options)
|
|
215
229
|
|
|
216
|
-
return await this.#resolve(dnslink)
|
|
230
|
+
return await this.#resolve(dnslink, options)
|
|
217
231
|
}
|
|
218
232
|
|
|
219
233
|
republish (options: RepublishOptions = {}): void {
|
|
@@ -252,14 +266,14 @@ class DefaultIPNS implements IPNS {
|
|
|
252
266
|
}, options.interval ?? DEFAULT_REPUBLISH_INTERVAL_MS)
|
|
253
267
|
}
|
|
254
268
|
|
|
255
|
-
async #resolve (ipfsPath: string): Promise<CID> {
|
|
269
|
+
async #resolve (ipfsPath: string, options: ResolveOptions = {}): Promise<CID> {
|
|
256
270
|
const parts = ipfsPath.split('/')
|
|
257
271
|
|
|
258
272
|
if (parts.length === 3) {
|
|
259
273
|
const scheme = parts[1]
|
|
260
274
|
|
|
261
275
|
if (scheme === 'ipns') {
|
|
262
|
-
return await this.resolve(peerIdFromString(parts[2]))
|
|
276
|
+
return await this.resolve(peerIdFromString(parts[2]), options)
|
|
263
277
|
} else if (scheme === 'ipfs') {
|
|
264
278
|
return CID.parse(parts[2])
|
|
265
279
|
}
|
|
@@ -269,12 +283,18 @@ class DefaultIPNS implements IPNS {
|
|
|
269
283
|
throw new Error('Invalid value')
|
|
270
284
|
}
|
|
271
285
|
|
|
272
|
-
async #findIpnsRecord (routingKey: Uint8Array, options:
|
|
273
|
-
|
|
286
|
+
async #findIpnsRecord (routingKey: Uint8Array, options: ResolveOptions = {}): Promise<IPNSEntry> {
|
|
287
|
+
let routers = [
|
|
274
288
|
this.localStore,
|
|
275
289
|
...this.routers
|
|
276
290
|
]
|
|
277
291
|
|
|
292
|
+
if (options.offline === true) {
|
|
293
|
+
routers = [
|
|
294
|
+
this.localStore
|
|
295
|
+
]
|
|
296
|
+
}
|
|
297
|
+
|
|
278
298
|
const unmarshaledRecord = await Promise.any(
|
|
279
299
|
routers.map(async (router) => {
|
|
280
300
|
const unmarshaledRecord = await router.get(routingKey, options)
|
package/src/routing/dht.ts
CHANGED
|
@@ -1,61 +1,35 @@
|
|
|
1
|
-
import { logger } from '@libp2p/logger'
|
|
2
1
|
import type { IPNSRouting } from '../index.js'
|
|
3
|
-
import type { DHT, QueryEvent } from '@libp2p/interface-dht'
|
|
4
2
|
import type { GetOptions, PutOptions } from './index.js'
|
|
5
3
|
import { CustomProgressEvent, ProgressEvent } from 'progress-events'
|
|
6
|
-
|
|
7
|
-
const log = logger('helia:ipns:routing:dht')
|
|
4
|
+
import type { ContentRouting } from '@libp2p/interface-content-routing'
|
|
8
5
|
|
|
9
6
|
export interface DHTRoutingComponents {
|
|
10
7
|
libp2p: {
|
|
11
|
-
|
|
8
|
+
contentRouting: ContentRouting
|
|
12
9
|
}
|
|
13
10
|
}
|
|
14
11
|
|
|
15
12
|
export type DHTProgressEvents =
|
|
16
|
-
ProgressEvent<'ipns:routing:dht:query', QueryEvent> |
|
|
17
13
|
ProgressEvent<'ipns:routing:dht:error', Error>
|
|
18
14
|
|
|
19
15
|
export class DHTRouting implements IPNSRouting {
|
|
20
|
-
private readonly
|
|
16
|
+
private readonly contentRouting: ContentRouting
|
|
21
17
|
|
|
22
18
|
constructor (components: DHTRoutingComponents) {
|
|
23
|
-
this.
|
|
19
|
+
this.contentRouting = components.libp2p.contentRouting
|
|
24
20
|
}
|
|
25
21
|
|
|
26
22
|
async put (routingKey: Uint8Array, marshaledRecord: Uint8Array, options: PutOptions = {}): Promise<void> {
|
|
27
|
-
let putValue = false
|
|
28
|
-
|
|
29
23
|
try {
|
|
30
|
-
|
|
31
|
-
logEvent('DHT put event', event)
|
|
32
|
-
|
|
33
|
-
options.onProgress?.(new CustomProgressEvent<QueryEvent>('ipns:routing:dht:query', event))
|
|
34
|
-
|
|
35
|
-
if (event.name === 'PEER_RESPONSE' && event.messageName === 'PUT_VALUE') {
|
|
36
|
-
putValue = true
|
|
37
|
-
}
|
|
38
|
-
}
|
|
24
|
+
await this.contentRouting.put(routingKey, marshaledRecord, options)
|
|
39
25
|
} catch (err: any) {
|
|
40
26
|
options.onProgress?.(new CustomProgressEvent<Error>('ipns:routing:dht:error', err))
|
|
41
27
|
}
|
|
42
|
-
|
|
43
|
-
if (!putValue) {
|
|
44
|
-
throw new Error('Could not put value to DHT')
|
|
45
|
-
}
|
|
46
28
|
}
|
|
47
29
|
|
|
48
30
|
async get (routingKey: Uint8Array, options: GetOptions = {}): Promise<Uint8Array> {
|
|
49
31
|
try {
|
|
50
|
-
|
|
51
|
-
logEvent('DHT get event', event)
|
|
52
|
-
|
|
53
|
-
options.onProgress?.(new CustomProgressEvent<QueryEvent>('ipns:routing:dht:query', event))
|
|
54
|
-
|
|
55
|
-
if (event.name === 'VALUE') {
|
|
56
|
-
return event.value
|
|
57
|
-
}
|
|
58
|
-
}
|
|
32
|
+
return await this.contentRouting.get(routingKey, options)
|
|
59
33
|
} catch (err: any) {
|
|
60
34
|
options.onProgress?.(new CustomProgressEvent<Error>('ipns:routing:dht:error', err))
|
|
61
35
|
}
|
|
@@ -64,22 +38,6 @@ export class DHTRouting implements IPNSRouting {
|
|
|
64
38
|
}
|
|
65
39
|
}
|
|
66
40
|
|
|
67
|
-
function logEvent (prefix: string, event: QueryEvent): void {
|
|
68
|
-
if (event.name === 'SENDING_QUERY') {
|
|
69
|
-
log(prefix, event.name, event.messageName, '->', event.to.toString())
|
|
70
|
-
} else if (event.name === 'PEER_RESPONSE') {
|
|
71
|
-
log(prefix, event.name, event.messageName, '<-', event.from.toString())
|
|
72
|
-
} else if (event.name === 'FINAL_PEER') {
|
|
73
|
-
log(prefix, event.name, event.peer.id.toString())
|
|
74
|
-
} else if (event.name === 'QUERY_ERROR') {
|
|
75
|
-
log(prefix, event.name, event.error.message)
|
|
76
|
-
} else if (event.name === 'PROVIDER') {
|
|
77
|
-
log(prefix, event.name, event.providers.map(p => p.id.toString()).join(', '))
|
|
78
|
-
} else {
|
|
79
|
-
log(prefix, event.name)
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
41
|
export function dht (components: DHTRoutingComponents): IPNSRouting {
|
|
84
42
|
return new DHTRouting(components)
|
|
85
43
|
}
|