@helia/ipns 9.2.1-ae98a4f4 → 9.2.1-ed6c3b79
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 +21 -57
- package/dist/index.min.js +5 -16
- package/dist/index.min.js.map +4 -4
- package/dist/src/errors.d.ts +33 -5
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +33 -20
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +62 -99
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +21 -60
- package/dist/src/index.js.map +1 -1
- package/dist/src/ipns/publisher.d.ts +5 -9
- package/dist/src/ipns/publisher.d.ts.map +1 -1
- package/dist/src/ipns/publisher.js +30 -22
- package/dist/src/ipns/publisher.js.map +1 -1
- package/dist/src/ipns/republisher.d.ts +3 -5
- package/dist/src/ipns/republisher.d.ts.map +1 -1
- package/dist/src/ipns/republisher.js +18 -9
- package/dist/src/ipns/republisher.js.map +1 -1
- package/dist/src/ipns/resolver.d.ts +6 -5
- package/dist/src/ipns/resolver.d.ts.map +1 -1
- package/dist/src/ipns/resolver.js +32 -78
- package/dist/src/ipns/resolver.js.map +1 -1
- package/dist/src/ipns.d.ts +6 -4
- package/dist/src/ipns.d.ts.map +1 -1
- package/dist/src/ipns.js +33 -4
- package/dist/src/ipns.js.map +1 -1
- package/dist/src/pb/ipns.d.ts +62 -0
- package/dist/src/pb/ipns.d.ts.map +1 -0
- package/dist/src/pb/ipns.js +203 -0
- package/dist/src/pb/ipns.js.map +1 -0
- package/dist/src/pb/metadata.d.ts +1 -1
- package/dist/src/pb/metadata.d.ts.map +1 -1
- package/dist/src/records.d.ts +155 -0
- package/dist/src/records.d.ts.map +1 -0
- package/dist/src/records.js +88 -0
- package/dist/src/records.js.map +1 -0
- package/dist/src/routing/pubsub.d.ts +3 -0
- package/dist/src/routing/pubsub.d.ts.map +1 -1
- package/dist/src/routing/pubsub.js +15 -10
- package/dist/src/routing/pubsub.js.map +1 -1
- package/dist/src/selector.d.ts +14 -0
- package/dist/src/selector.d.ts.map +1 -0
- package/dist/src/selector.js +47 -0
- package/dist/src/selector.js.map +1 -0
- package/dist/src/utils.d.ts +29 -2
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +308 -0
- package/dist/src/utils.js.map +1 -1
- package/dist/src/validator.d.ts +18 -0
- package/dist/src/validator.d.ts.map +1 -0
- package/dist/src/validator.js +58 -0
- package/dist/src/validator.js.map +1 -0
- package/package.json +24 -23
- package/src/errors.ts +40 -25
- package/src/index.ts +63 -100
- package/src/ipns/publisher.ts +34 -29
- package/src/ipns/republisher.ts +24 -13
- package/src/ipns/resolver.ts +40 -88
- package/src/ipns.ts +44 -7
- package/src/pb/ipns.proto +39 -0
- package/src/pb/ipns.ts +280 -0
- package/src/pb/metadata.ts +1 -1
- package/src/records.ts +273 -0
- package/src/routing/pubsub.ts +17 -10
- package/src/selector.ts +55 -0
- package/src/utils.ts +371 -2
- package/src/validator.ts +67 -0
|
@@ -1,36 +1,33 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { isPeerId } from '@libp2p/interface';
|
|
3
|
-
import { createIPNSRecord, marshalIPNSRecord, multihashToIPNSRoutingKey, unmarshalIPNSRecord } from 'ipns';
|
|
4
|
-
import { CID } from 'multiformats/cid';
|
|
1
|
+
import { base36 } from 'multiformats/bases/base36';
|
|
5
2
|
import { CustomProgressEvent } from 'progress-events';
|
|
6
3
|
import { DEFAULT_LIFETIME_MS, DEFAULT_TTL_NS } from "../constants.js";
|
|
4
|
+
import { createIPNSRecord } from "../records.js";
|
|
5
|
+
import { marshalIPNSRecord, multihashToIPNSRoutingKey, unmarshalIPNSRecord } from "../utils.js";
|
|
7
6
|
export class IPNSPublisher {
|
|
8
7
|
routers;
|
|
9
8
|
localStore;
|
|
10
9
|
keychain;
|
|
11
10
|
constructor(components, init) {
|
|
12
|
-
this.keychain = components.
|
|
11
|
+
this.keychain = components.keychain;
|
|
13
12
|
this.localStore = init.localStore;
|
|
14
13
|
this.routers = init.routers;
|
|
15
14
|
}
|
|
16
15
|
async publish(keyName, value, options = {}) {
|
|
17
16
|
try {
|
|
18
|
-
const
|
|
17
|
+
const key = await this.#loadOrCreateKey(keyName, options);
|
|
18
|
+
const digest = key.publicKey.toMultihash();
|
|
19
|
+
const routingKey = multihashToIPNSRoutingKey(digest);
|
|
19
20
|
let sequenceNumber = 1n;
|
|
20
|
-
const routingKey = multihashToIPNSRoutingKey(privKey.publicKey.toMultihash());
|
|
21
21
|
if (await this.localStore.has(routingKey, options)) {
|
|
22
22
|
// if we have published under this key before, increment the sequence number
|
|
23
23
|
const { record } = await this.localStore.get(routingKey, options);
|
|
24
|
-
const existingRecord = unmarshalIPNSRecord(record);
|
|
24
|
+
const existingRecord = await unmarshalIPNSRecord(routingKey, record, this.keychain, options);
|
|
25
25
|
sequenceNumber = existingRecord.sequence + 1n;
|
|
26
26
|
}
|
|
27
|
-
if (isPeerId(value)) {
|
|
28
|
-
value = value.toCID();
|
|
29
|
-
}
|
|
30
27
|
// convert ttl from milliseconds to nanoseconds as createIPNSRecord expects
|
|
31
28
|
const ttlNs = options.ttl != null ? BigInt(options.ttl) * 1000000n : DEFAULT_TTL_NS;
|
|
32
29
|
const lifetime = options.lifetime ?? DEFAULT_LIFETIME_MS;
|
|
33
|
-
const record = await createIPNSRecord(
|
|
30
|
+
const record = await createIPNSRecord(key, value, sequenceNumber, lifetime, { ...options, ttlNs });
|
|
34
31
|
const marshaledRecord = marshalIPNSRecord(record);
|
|
35
32
|
if (options.offline === true) {
|
|
36
33
|
// only store record locally
|
|
@@ -43,8 +40,12 @@ export class IPNSPublisher {
|
|
|
43
40
|
}));
|
|
44
41
|
}
|
|
45
42
|
return {
|
|
46
|
-
record
|
|
47
|
-
|
|
43
|
+
record: {
|
|
44
|
+
...record,
|
|
45
|
+
publicKey: key.publicKey
|
|
46
|
+
},
|
|
47
|
+
name: `/ipns/${key.publicKey.toCID().toString(base36)}`,
|
|
48
|
+
publicKey: key.publicKey
|
|
48
49
|
};
|
|
49
50
|
}
|
|
50
51
|
catch (err) {
|
|
@@ -52,20 +53,27 @@ export class IPNSPublisher {
|
|
|
52
53
|
throw err;
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Create the private key if it is not in the keychain already, defaulting to
|
|
58
|
+
* Ed25519 keys
|
|
59
|
+
*/
|
|
60
|
+
async #loadOrCreateKey(keyName, options) {
|
|
56
61
|
try {
|
|
57
|
-
return await this.keychain.exportKey(keyName);
|
|
62
|
+
return await this.keychain.exportKey(keyName, options);
|
|
58
63
|
}
|
|
59
64
|
catch (err) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
if (err.name === 'NotFoundError') {
|
|
66
|
+
// create a new key
|
|
67
|
+
return this.keychain.generateKey(keyName, options);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
64
72
|
}
|
|
65
73
|
}
|
|
66
74
|
async unpublish(keyName, options) {
|
|
67
|
-
const
|
|
68
|
-
const digest = publicKey.toMultihash();
|
|
75
|
+
const key = await this.keychain.exportKey(keyName, options);
|
|
76
|
+
const digest = key.publicKey.toMultihash();
|
|
69
77
|
const routingKey = multihashToIPNSRoutingKey(digest);
|
|
70
78
|
await this.localStore.delete(routingKey, options);
|
|
71
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../../src/ipns/publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../../src/ipns/publisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import type { LocalStore } from '../local-store.ts';
|
|
2
2
|
import type { IPNSRouting } from '../routing/index.ts';
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
3
|
+
import type { Keychain } from '@helia/interface';
|
|
4
|
+
import type { ComponentLogger } from '@libp2p/interface';
|
|
5
5
|
export interface IPNSRepublisherComponents {
|
|
6
6
|
logger: ComponentLogger;
|
|
7
|
-
|
|
8
|
-
keychain: Keychain;
|
|
9
|
-
}>;
|
|
7
|
+
keychain: Keychain;
|
|
10
8
|
}
|
|
11
9
|
export interface IPNSRepublisherInit {
|
|
12
10
|
republishConcurrency?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"republisher.d.ts","sourceRoot":"","sources":["../../../src/ipns/republisher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"republisher.d.ts","sourceRoot":"","sources":["../../../src/ipns/republisher.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,kBAAkB,CAAA;AAC5D,OAAO,KAAK,EAAgB,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAG9E,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,OAAO,EAAE,WAAW,EAAE,CAAA;IACtB,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,qBAAa,eAAe;;IAC1B,SAAgB,OAAO,EAAE,WAAW,EAAE,CAAA;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAQ;gBAEhC,UAAU,EAAE,yBAAyB,EAAE,IAAI,EAAE,mBAAmB;IAiB7E,KAAK,IAAK,IAAI;IASd,IAAI,IAAK,IAAI;CA+Fd"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Queue, repeatingTask } from '@libp2p/utils';
|
|
2
|
-
import { createIPNSRecord, marshalIPNSRecord, unmarshalIPNSRecord } from 'ipns';
|
|
3
2
|
import { DEFAULT_REPUBLISH_CONCURRENCY, DEFAULT_REPUBLISH_INTERVAL_MS, DEFAULT_TTL_NS } from "../constants.js";
|
|
3
|
+
import { createIPNSRecord } from "../records.js";
|
|
4
|
+
import { marshalIPNSRecord, unmarshalIPNSRecord } from "../utils.js";
|
|
4
5
|
import { shouldRepublish } from "../utils.js";
|
|
5
6
|
export class IPNSRepublisher {
|
|
6
7
|
routers;
|
|
@@ -13,9 +14,9 @@ export class IPNSRepublisher {
|
|
|
13
14
|
constructor(components, init) {
|
|
14
15
|
this.log = components.logger.forComponent('helia:ipns');
|
|
15
16
|
this.localStore = init.localStore;
|
|
16
|
-
this.keychain = components.
|
|
17
|
+
this.keychain = components.keychain;
|
|
17
18
|
this.republishConcurrency = init.republishConcurrency || DEFAULT_REPUBLISH_CONCURRENCY;
|
|
18
|
-
this.started =
|
|
19
|
+
this.started = false;
|
|
19
20
|
this.routers = init.routers ?? [];
|
|
20
21
|
this.republishTask = repeatingTask(this.#republish.bind(this), init.republishInterval ?? DEFAULT_REPUBLISH_INTERVAL_MS, {
|
|
21
22
|
runImmediately: true
|
|
@@ -48,17 +49,19 @@ export class IPNSRepublisher {
|
|
|
48
49
|
});
|
|
49
50
|
try {
|
|
50
51
|
const recordsToRepublish = [];
|
|
52
|
+
let listed = 0;
|
|
51
53
|
// Find all records using the localStore.list method
|
|
52
54
|
for await (const { routingKey, record, metadata, created } of this.localStore.list(options)) {
|
|
55
|
+
listed++;
|
|
53
56
|
if (metadata == null) {
|
|
54
57
|
// Skip if no metadata is found from before we started
|
|
55
58
|
// storing metadata or for records republished without a key
|
|
56
|
-
this.log(
|
|
59
|
+
this.log('no metadata found for record %b, skipping', routingKey);
|
|
57
60
|
continue;
|
|
58
61
|
}
|
|
59
62
|
let ipnsRecord;
|
|
60
63
|
try {
|
|
61
|
-
ipnsRecord = unmarshalIPNSRecord(record);
|
|
64
|
+
ipnsRecord = await unmarshalIPNSRecord(routingKey, record, this.keychain, options);
|
|
62
65
|
}
|
|
63
66
|
catch (err) {
|
|
64
67
|
this.log.error('error unmarshaling record - %e', err);
|
|
@@ -66,7 +69,7 @@ export class IPNSRepublisher {
|
|
|
66
69
|
}
|
|
67
70
|
// Only republish records that are within the DHT or record expiry threshold
|
|
68
71
|
if (!shouldRepublish(ipnsRecord, created)) {
|
|
69
|
-
this.log.trace(
|
|
72
|
+
this.log.trace('skipping record %b within republish threshold', routingKey);
|
|
70
73
|
continue;
|
|
71
74
|
}
|
|
72
75
|
const sequenceNumber = ipnsRecord.sequence + 1n;
|
|
@@ -80,15 +83,21 @@ export class IPNSRepublisher {
|
|
|
80
83
|
continue;
|
|
81
84
|
}
|
|
82
85
|
try {
|
|
83
|
-
const updatedRecord = await createIPNSRecord(privKey, ipnsRecord.value, sequenceNumber, metadata.lifetime, {
|
|
84
|
-
|
|
86
|
+
const updatedRecord = await createIPNSRecord(privKey, ipnsRecord.value, sequenceNumber, metadata.lifetime, {
|
|
87
|
+
...options,
|
|
88
|
+
ttlNs
|
|
89
|
+
});
|
|
90
|
+
recordsToRepublish.push({
|
|
91
|
+
routingKey,
|
|
92
|
+
record: updatedRecord
|
|
93
|
+
});
|
|
85
94
|
}
|
|
86
95
|
catch (err) {
|
|
87
96
|
this.log.error('error creating updated IPNS record for %s - %e', routingKey, err);
|
|
88
97
|
continue;
|
|
89
98
|
}
|
|
90
99
|
}
|
|
91
|
-
this.log(`found ${recordsToRepublish.length} records to republish`);
|
|
100
|
+
this.log(`found ${recordsToRepublish.length}/${listed} records to republish`);
|
|
92
101
|
// Republish each record
|
|
93
102
|
for (const { routingKey, record } of recordsToRepublish) {
|
|
94
103
|
// Add job to queue to republish the record to all routers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"republisher.js","sourceRoot":"","sources":["../../../src/ipns/republisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"republisher.js","sourceRoot":"","sources":["../../../src/ipns/republisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { IPNSResolveResult, ResolveOptions } from '../index.ts';
|
|
1
|
+
import type { ResolveOptions, ResolveResult } from '../index.ts';
|
|
3
2
|
import type { LocalStore } from '../local-store.ts';
|
|
4
3
|
import type { IPNSRouting } from '../routing/index.ts';
|
|
5
|
-
import type { Routing } from '@helia/interface';
|
|
6
|
-
import type { ComponentLogger
|
|
4
|
+
import type { Routing, Keychain } from '@helia/interface';
|
|
5
|
+
import type { ComponentLogger } from '@libp2p/interface';
|
|
7
6
|
import type { Datastore } from 'interface-datastore';
|
|
8
7
|
import type { MultihashDigest } from 'multiformats/hashes/interface';
|
|
9
8
|
export interface IPNSResolverComponents {
|
|
10
9
|
datastore: Datastore;
|
|
11
10
|
routing: Routing;
|
|
12
11
|
logger: ComponentLogger;
|
|
12
|
+
keychain: Keychain;
|
|
13
13
|
}
|
|
14
14
|
export interface IPNResolverInit {
|
|
15
15
|
localStore: LocalStore;
|
|
@@ -20,7 +20,8 @@ export declare class IPNSResolver {
|
|
|
20
20
|
readonly routers: IPNSRouting[];
|
|
21
21
|
private readonly localStore;
|
|
22
22
|
private readonly log;
|
|
23
|
+
private keychain;
|
|
23
24
|
constructor(components: IPNSResolverComponents, init: IPNResolverInit);
|
|
24
|
-
resolve(key:
|
|
25
|
+
resolve(key: MultihashDigest, options?: ResolveOptions): AsyncGenerator<ResolveResult>;
|
|
25
26
|
}
|
|
26
27
|
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/ipns/resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/ipns/resolver.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAc,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEpE,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,WAAW,EAAE,CAAA;CACvB;AAED,qBAAa,YAAY;;IACvB,SAAgB,OAAO,EAAE,WAAW,EAAE,CAAA;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAU;gBAEb,UAAU,EAAE,sBAAsB,EAAE,IAAI,EAAE,eAAe;IAO9D,OAAO,CAAE,GAAG,EAAE,eAAe,EAAE,OAAO,GAAE,cAAmB,GAAG,cAAc,CAAC,aAAa,CAAC;CAoIpG"}
|
|
@@ -1,84 +1,33 @@
|
|
|
1
|
-
import { isPeerId, isPublicKey } from '@libp2p/interface';
|
|
2
|
-
import { multihashToIPNSRoutingKey, unmarshalIPNSRecord } from 'ipns';
|
|
3
|
-
import { ipnsSelector } from 'ipns/selector';
|
|
4
|
-
import { ipnsValidator } from 'ipns/validator';
|
|
5
|
-
import { base36 } from 'multiformats/bases/base36';
|
|
6
|
-
import { base58btc } from 'multiformats/bases/base58';
|
|
7
|
-
import { CID } from 'multiformats/cid';
|
|
8
|
-
import * as Digest from 'multiformats/hashes/digest';
|
|
9
1
|
import { DEFAULT_TTL_NS } from "../constants.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
[base58btc.prefix]: base58btc
|
|
15
|
-
};
|
|
2
|
+
import { RecordNotFoundError, RecordsFailedValidationError } from "../errors.js";
|
|
3
|
+
import { ipnsSelector } from "../selector.js";
|
|
4
|
+
import { multihashToIPNSRoutingKey, unmarshalIPNSRecord, normalizeKey, IPNS_STRING_PREFIX } from "../utils.js";
|
|
5
|
+
import { ipnsValidator } from "../validator.js";
|
|
16
6
|
export class IPNSResolver {
|
|
17
7
|
routers;
|
|
18
8
|
localStore;
|
|
19
9
|
log;
|
|
10
|
+
keychain;
|
|
20
11
|
constructor(components, init) {
|
|
21
12
|
this.log = components.logger.forComponent('helia:ipns');
|
|
22
13
|
this.localStore = init.localStore;
|
|
23
14
|
this.routers = init.routers;
|
|
15
|
+
this.keychain = components.keychain;
|
|
24
16
|
}
|
|
25
|
-
async resolve(key, options = {}) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
try {
|
|
37
|
-
const scheme = parts[1];
|
|
38
|
-
if (scheme === 'ipns') {
|
|
39
|
-
const str = parts[2];
|
|
40
|
-
const prefix = str.substring(0, 1);
|
|
41
|
-
let buf;
|
|
42
|
-
if (prefix === '1' || prefix === 'Q') {
|
|
43
|
-
buf = base58btc.decode(`z${str}`);
|
|
44
|
-
}
|
|
45
|
-
else if (bases[prefix] != null) {
|
|
46
|
-
buf = bases[prefix].decode(str);
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
throw new UnsupportedMultibasePrefixError(`Unsupported multibase prefix "${prefix}"`);
|
|
50
|
-
}
|
|
51
|
-
let digest;
|
|
52
|
-
try {
|
|
53
|
-
digest = Digest.decode(buf);
|
|
54
|
-
}
|
|
55
|
-
catch {
|
|
56
|
-
digest = CID.decode(buf).multihash;
|
|
57
|
-
}
|
|
58
|
-
if (!isCodec(digest, IDENTITY_CODEC) && !isCodec(digest, SHA2_256_CODEC)) {
|
|
59
|
-
throw new UnsupportedMultihashCodecError(`Unsupported multihash codec "${digest.code}"`);
|
|
60
|
-
}
|
|
61
|
-
const { cid } = await this.resolve(digest, options);
|
|
62
|
-
const path = parts.slice(3).join('/');
|
|
63
|
-
return {
|
|
64
|
-
cid,
|
|
65
|
-
path: path === '' ? undefined : path
|
|
66
|
-
};
|
|
17
|
+
async *resolve(key, options = {}) {
|
|
18
|
+
let { digest } = normalizeKey(key);
|
|
19
|
+
while (true) {
|
|
20
|
+
const routingKey = multihashToIPNSRoutingKey(digest);
|
|
21
|
+
const record = await this.#findIpnsRecord(routingKey, options);
|
|
22
|
+
yield {
|
|
23
|
+
record
|
|
24
|
+
};
|
|
25
|
+
if (!record.value.startsWith(IPNS_STRING_PREFIX)) {
|
|
26
|
+
// not a recursive record
|
|
27
|
+
break;
|
|
67
28
|
}
|
|
68
|
-
|
|
69
|
-
const cid = CID.parse(parts[2]);
|
|
70
|
-
const path = parts.slice(3).join('/');
|
|
71
|
-
return {
|
|
72
|
-
cid,
|
|
73
|
-
path: path === '' ? undefined : path
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
catch (err) {
|
|
78
|
-
this.log.error('error parsing ipfs path - %e', err);
|
|
29
|
+
({ digest } = normalizeKey(record.value));
|
|
79
30
|
}
|
|
80
|
-
this.log.error('invalid ipfs path %s', ipfsPath);
|
|
81
|
-
throw new InvalidValueError('Invalid value');
|
|
82
31
|
}
|
|
83
32
|
async #findIpnsRecord(routingKey, options = {}) {
|
|
84
33
|
const records = [];
|
|
@@ -88,13 +37,14 @@ export class IPNSResolver {
|
|
|
88
37
|
if (options.nocache !== true) {
|
|
89
38
|
try {
|
|
90
39
|
// check the local cache first
|
|
91
|
-
const { record, created } = await this.localStore.get(routingKey, options);
|
|
40
|
+
const { record: marshaledIPNSRecord, created } = await this.localStore.get(routingKey, options);
|
|
92
41
|
this.log('record retrieved from cache');
|
|
42
|
+
// unmarshal the record
|
|
43
|
+
const ipnsRecord = await unmarshalIPNSRecord(routingKey, marshaledIPNSRecord, this.keychain, options);
|
|
93
44
|
// validate the record
|
|
94
|
-
await ipnsValidator(
|
|
45
|
+
await ipnsValidator(ipnsRecord, options);
|
|
95
46
|
this.log('record was valid');
|
|
96
47
|
// check the TTL
|
|
97
|
-
const ipnsRecord = unmarshalIPNSRecord(record);
|
|
98
48
|
// IPNS TTL is in nanoseconds, convert to milliseconds, default to one
|
|
99
49
|
// hour
|
|
100
50
|
const ttlMs = Number((ipnsRecord.ttl ?? DEFAULT_TTL_NS) / 1000000n);
|
|
@@ -113,7 +63,7 @@ export class IPNSResolver {
|
|
|
113
63
|
// add the local record to our list of resolved record, and also
|
|
114
64
|
// search the routing for updates - the most up to date record will be
|
|
115
65
|
// returned
|
|
116
|
-
records.push(
|
|
66
|
+
records.push(ipnsRecord);
|
|
117
67
|
}
|
|
118
68
|
catch (err) {
|
|
119
69
|
this.log('cached record was invalid - %e', err);
|
|
@@ -131,9 +81,9 @@ export class IPNSResolver {
|
|
|
131
81
|
let foundInvalid = 0;
|
|
132
82
|
const errors = [];
|
|
133
83
|
await Promise.all(this.routers.map(async (router) => {
|
|
134
|
-
let
|
|
84
|
+
let marshaledIPNSRecord;
|
|
135
85
|
try {
|
|
136
|
-
|
|
86
|
+
marshaledIPNSRecord = await router.get(routingKey, {
|
|
137
87
|
...options,
|
|
138
88
|
validate: false
|
|
139
89
|
});
|
|
@@ -144,7 +94,11 @@ export class IPNSResolver {
|
|
|
144
94
|
return;
|
|
145
95
|
}
|
|
146
96
|
try {
|
|
147
|
-
|
|
97
|
+
// unmarshal ensures that (1) SignatureV2 and Data are present, (2) that ValidityType
|
|
98
|
+
// and Validity are of valid types and have a value, (3) that CBOR data matches protobuf
|
|
99
|
+
// if it's a V1+V2 record
|
|
100
|
+
const record = await unmarshalIPNSRecord(routingKey, marshaledIPNSRecord, this.keychain, options);
|
|
101
|
+
await ipnsValidator(record, options);
|
|
148
102
|
records.push(record);
|
|
149
103
|
}
|
|
150
104
|
catch (err) {
|
|
@@ -160,8 +114,8 @@ export class IPNSResolver {
|
|
|
160
114
|
throw new RecordNotFoundError('Could not find record for routing key');
|
|
161
115
|
}
|
|
162
116
|
const record = records[ipnsSelector(routingKey, records)];
|
|
163
|
-
await this.localStore.put(routingKey, record, options);
|
|
164
|
-
return
|
|
117
|
+
await this.localStore.put(routingKey, record.bytes, options);
|
|
118
|
+
return record;
|
|
165
119
|
}
|
|
166
120
|
}
|
|
167
121
|
//# sourceMappingURL=resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/ipns/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/ipns/resolver.ts"],"names":[],"mappings":"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"}
|
package/dist/src/ipns.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { CID } from 'multiformats/cid';
|
|
2
|
-
import type { IPNSComponents, IPNS as IPNSInterface, IPNSOptions,
|
|
2
|
+
import type { IPNSComponents, IPNS as IPNSInterface, IPNSOptions, PublishResult, PublishOptions, ResolveOptions, ResolveResult } from './index.ts';
|
|
3
3
|
import type { IPNSRouting } from './routing/index.ts';
|
|
4
|
-
import type {
|
|
4
|
+
import type { PublicKey } from '@helia/interface';
|
|
5
|
+
import type { AbortOptions, Startable } from '@libp2p/interface';
|
|
5
6
|
import type { MultihashDigest } from 'multiformats/hashes/interface';
|
|
6
7
|
export declare class IPNS implements IPNSInterface, Startable {
|
|
7
8
|
readonly routers: IPNSRouting[];
|
|
@@ -9,12 +10,13 @@ export declare class IPNS implements IPNSInterface, Startable {
|
|
|
9
10
|
private readonly republisher;
|
|
10
11
|
private readonly resolver;
|
|
11
12
|
private readonly localStore;
|
|
13
|
+
private readonly components;
|
|
12
14
|
private started;
|
|
13
15
|
constructor(components: IPNSComponents, init?: IPNSOptions);
|
|
14
16
|
start(): void;
|
|
15
17
|
stop(): void;
|
|
16
|
-
publish(keyName: string, value:
|
|
17
|
-
resolve(key: CID<unknown, 0x72
|
|
18
|
+
publish(keyName: string, value: PublicKey | CID | MultihashDigest | string, options?: PublishOptions): Promise<PublishResult>;
|
|
19
|
+
resolve(key: PublicKey | CID<unknown, 0x72> | MultihashDigest | string, options?: ResolveOptions): AsyncGenerator<ResolveResult>;
|
|
18
20
|
unpublish(keyName: string, options?: AbortOptions): Promise<void>;
|
|
19
21
|
}
|
|
20
22
|
//# sourceMappingURL=ipns.d.ts.map
|
package/dist/src/ipns.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipns.d.ts","sourceRoot":"","sources":["../../src/ipns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"ipns.d.ts","sourceRoot":"","sources":["../../src/ipns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAUtC,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,IAAI,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAElJ,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAU,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEpE,qBAAa,IAAK,YAAW,aAAa,EAAE,SAAS;IACnD,SAAgB,OAAO,EAAE,WAAW,EAAE,CAAA;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,OAAO,CAAS;gBAEX,UAAU,EAAE,cAAc,EAAE,IAAI,GAAE,WAAgB;IAyD/D,KAAK,IAAK,IAAI;IASd,IAAI,IAAK,IAAI;IASP,OAAO,CAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,GAAG,GAAG,eAAe,GAAG,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IAIhI,OAAO,CAAE,GAAG,EAAE,SAAS,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,eAAe,GAAG,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,cAAc,CAAC,aAAa,CAAC;IAMvI,SAAS,CAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzE"}
|
package/dist/src/ipns.js
CHANGED
|
@@ -5,16 +5,21 @@ import { IPNSResolver } from "./ipns/resolver.js";
|
|
|
5
5
|
import { localStore } from "./local-store.js";
|
|
6
6
|
import { helia } from "./routing/helia.js";
|
|
7
7
|
import { localStoreRouting } from "./routing/local-store.js";
|
|
8
|
+
import { ipnsSelector } from "./selector.js";
|
|
9
|
+
import { normalizeKey, normalizeValue, unmarshalIPNSRecord } from "./utils.js";
|
|
10
|
+
import { ipnsValidator } from "./validator.js";
|
|
8
11
|
export class IPNS {
|
|
9
12
|
routers;
|
|
10
13
|
publisher;
|
|
11
14
|
republisher;
|
|
12
15
|
resolver;
|
|
13
16
|
localStore;
|
|
17
|
+
components;
|
|
14
18
|
started;
|
|
15
19
|
constructor(components, init = {}) {
|
|
16
20
|
this.localStore = localStore(components.datastore, components.logger.forComponent('helia:ipns:local-store'));
|
|
17
|
-
this.
|
|
21
|
+
this.components = components;
|
|
22
|
+
this.started = false;
|
|
18
23
|
this.routers = [
|
|
19
24
|
localStoreRouting(this.localStore),
|
|
20
25
|
helia(components.routing),
|
|
@@ -42,6 +47,23 @@ export class IPNS {
|
|
|
42
47
|
if (this.started) {
|
|
43
48
|
this.republisher.start();
|
|
44
49
|
}
|
|
50
|
+
for (const component of Object.values(this.components)) {
|
|
51
|
+
if (isLibp2p(component)) {
|
|
52
|
+
for (const service of Object.values(component.services)) {
|
|
53
|
+
if (isKadDHT(service)) {
|
|
54
|
+
// @ ts-expect-error https://github.com/libp2p/js-libp2p/pull/3506
|
|
55
|
+
service.selectors.ipns = async (key, values) => {
|
|
56
|
+
const records = await Promise.all(values.map(buf => unmarshalIPNSRecord(key, buf, this.components.keychain)));
|
|
57
|
+
return ipnsSelector(key, records);
|
|
58
|
+
};
|
|
59
|
+
service.validators.ipns = async (key, value) => {
|
|
60
|
+
const record = await unmarshalIPNSRecord(key, value, this.components.keychain);
|
|
61
|
+
await ipnsValidator(record);
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
45
67
|
}
|
|
46
68
|
start() {
|
|
47
69
|
if (this.started) {
|
|
@@ -58,13 +80,20 @@ export class IPNS {
|
|
|
58
80
|
this.republisher.stop();
|
|
59
81
|
}
|
|
60
82
|
async publish(keyName, value, options = {}) {
|
|
61
|
-
return this.publisher.publish(keyName, value, options);
|
|
83
|
+
return this.publisher.publish(keyName, normalizeValue(value), options);
|
|
62
84
|
}
|
|
63
|
-
async resolve(key, options = {}) {
|
|
64
|
-
|
|
85
|
+
async *resolve(key, options = {}) {
|
|
86
|
+
const { digest } = normalizeKey(key);
|
|
87
|
+
yield* this.resolver.resolve(digest, options);
|
|
65
88
|
}
|
|
66
89
|
async unpublish(keyName, options) {
|
|
67
90
|
return this.publisher.unpublish(keyName, options);
|
|
68
91
|
}
|
|
69
92
|
}
|
|
93
|
+
function isLibp2p(obj) {
|
|
94
|
+
return obj?.services != null;
|
|
95
|
+
}
|
|
96
|
+
function isKadDHT(obj) {
|
|
97
|
+
return obj?.validators != null && obj?.selectors != null;
|
|
98
|
+
}
|
|
70
99
|
//# sourceMappingURL=ipns.js.map
|
package/dist/src/ipns.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipns.js","sourceRoot":"","sources":["../../src/ipns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"ipns.js","sourceRoot":"","sources":["../../src/ipns.ts"],"names":[],"mappings":"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"}
|