@helia/ipns 8.2.4 → 9.0.0-9c67dbd4
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 +31 -135
- package/dist/index.min.js +10 -11
- package/dist/index.min.js.map +4 -4
- package/dist/src/constants.d.ts +17 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +19 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/errors.d.ts +0 -4
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +0 -7
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +109 -201
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +34 -417
- package/dist/src/index.js.map +1 -1
- package/dist/src/ipns.d.ts +22 -0
- package/dist/src/ipns.d.ts.map +1 -0
- package/dist/src/ipns.js +339 -0
- package/dist/src/ipns.js.map +1 -0
- package/dist/src/local-store.d.ts +42 -0
- package/dist/src/local-store.d.ts.map +1 -0
- package/dist/src/local-store.js +119 -0
- package/dist/src/local-store.js.map +1 -0
- package/dist/src/pb/metadata.d.ts +12 -0
- package/dist/src/pb/metadata.d.ts.map +1 -0
- package/dist/src/pb/metadata.js +57 -0
- package/dist/src/pb/metadata.js.map +1 -0
- package/dist/src/routing/index.d.ts +4 -2
- 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.d.ts +4 -19
- package/dist/src/routing/local-store.d.ts.map +1 -1
- package/dist/src/routing/local-store.js +7 -62
- package/dist/src/routing/local-store.js.map +1 -1
- package/dist/src/routing/pubsub.d.ts +21 -1
- package/dist/src/routing/pubsub.d.ts.map +1 -1
- package/dist/src/routing/pubsub.js +2 -2
- package/dist/src/routing/pubsub.js.map +1 -1
- package/dist/src/utils.d.ts +24 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +56 -0
- package/dist/src/utils.js.map +1 -1
- package/package.json +21 -23
- package/src/constants.ts +24 -0
- package/src/errors.ts +0 -9
- package/src/index.ts +116 -545
- package/src/ipns.ts +400 -0
- package/src/local-store.ts +162 -0
- package/src/pb/metadata.proto +9 -0
- package/src/pb/metadata.ts +74 -0
- package/src/routing/index.ts +4 -3
- package/src/routing/local-store.ts +9 -87
- package/src/routing/pubsub.ts +28 -4
- package/src/utils.ts +70 -0
- package/dist/src/dnslink.d.ts +0 -9
- package/dist/src/dnslink.d.ts.map +0 -1
- package/dist/src/dnslink.js +0 -138
- package/dist/src/dnslink.js.map +0 -1
- package/dist/typedoc-urls.json +0 -48
- package/src/dnslink.ts +0 -163
|
@@ -1,22 +1,7 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import type { Datastore } from 'interface-datastore';
|
|
4
|
-
import type { ProgressEvent } from 'progress-events';
|
|
5
|
-
export type DatastoreProgressEvents = ProgressEvent<'ipns:routing:datastore:put'> | ProgressEvent<'ipns:routing:datastore:get'> | ProgressEvent<'ipns:routing:datastore:error', Error>;
|
|
6
|
-
export interface GetResult {
|
|
7
|
-
record: Uint8Array;
|
|
8
|
-
created: Date;
|
|
9
|
-
}
|
|
10
|
-
export interface LocalStore {
|
|
11
|
-
put(routingKey: Uint8Array, marshaledRecord: Uint8Array, options?: PutOptions): Promise<void>;
|
|
12
|
-
get(routingKey: Uint8Array, options?: GetOptions): Promise<GetResult>;
|
|
13
|
-
has(routingKey: Uint8Array, options?: AbortOptions): Promise<boolean>;
|
|
14
|
-
delete(routingKey: Uint8Array, options?: AbortOptions): Promise<void>;
|
|
15
|
-
}
|
|
1
|
+
import type { LocalStore } from '../local-store.ts';
|
|
2
|
+
import type { IPNSRouting } from './index.ts';
|
|
16
3
|
/**
|
|
17
|
-
* Returns an IPNSRouting implementation that reads/writes
|
|
18
|
-
* datastore as DHT records. This lets us publish IPNS records offline then
|
|
19
|
-
* serve them to the network later in response to DHT queries.
|
|
4
|
+
* Returns an IPNSRouting implementation that reads/writes to the local store
|
|
20
5
|
*/
|
|
21
|
-
export declare function localStore
|
|
6
|
+
export declare function localStoreRouting(localStore: LocalStore): IPNSRouting;
|
|
22
7
|
//# sourceMappingURL=local-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["../../../src/routing/local-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["../../../src/routing/local-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,YAAY,CAAA;AAErE;;GAEG;AACH,wBAAgB,iBAAiB,CAAE,UAAU,EAAE,UAAU,GAAG,WAAW,CAWtE"}
|
|
@@ -1,69 +1,14 @@
|
|
|
1
|
-
import { Record } from '@libp2p/kad-dht';
|
|
2
|
-
import { Key } from 'interface-datastore';
|
|
3
|
-
import { CustomProgressEvent } from 'progress-events';
|
|
4
|
-
import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
|
|
5
|
-
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
6
|
-
function dhtRoutingKey(key) {
|
|
7
|
-
return new Key('/dht/record/' + uint8ArrayToString(key, 'base32'), false);
|
|
8
|
-
}
|
|
9
1
|
/**
|
|
10
|
-
* Returns an IPNSRouting implementation that reads/writes
|
|
11
|
-
* datastore as DHT records. This lets us publish IPNS records offline then
|
|
12
|
-
* serve them to the network later in response to DHT queries.
|
|
2
|
+
* Returns an IPNSRouting implementation that reads/writes to the local store
|
|
13
3
|
*/
|
|
14
|
-
export function localStore
|
|
4
|
+
export function localStoreRouting(localStore) {
|
|
15
5
|
return {
|
|
16
|
-
async put(routingKey,
|
|
17
|
-
|
|
18
|
-
const key = dhtRoutingKey(routingKey);
|
|
19
|
-
// don't overwrite existing, identical records as this will affect the
|
|
20
|
-
// TTL
|
|
21
|
-
try {
|
|
22
|
-
const existingBuf = await datastore.get(key);
|
|
23
|
-
const existingRecord = Record.deserialize(existingBuf);
|
|
24
|
-
if (uint8ArrayEquals(existingRecord.value, marshalledRecord)) {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
catch (err) {
|
|
29
|
-
if (err.name !== 'NotFoundError') {
|
|
30
|
-
throw err;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
// Marshal to libp2p record as the DHT does
|
|
34
|
-
const record = new Record(routingKey, marshalledRecord, new Date());
|
|
35
|
-
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:put'));
|
|
36
|
-
await datastore.put(key, record.serialize(), options);
|
|
37
|
-
}
|
|
38
|
-
catch (err) {
|
|
39
|
-
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:error', err));
|
|
40
|
-
throw err;
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
async get(routingKey, options = {}) {
|
|
44
|
-
try {
|
|
45
|
-
const key = dhtRoutingKey(routingKey);
|
|
46
|
-
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:get'));
|
|
47
|
-
const buf = await datastore.get(key, options);
|
|
48
|
-
// Unmarshal libp2p record as the DHT does
|
|
49
|
-
const record = Record.deserialize(buf);
|
|
50
|
-
return {
|
|
51
|
-
record: record.value,
|
|
52
|
-
created: record.timeReceived
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
catch (err) {
|
|
56
|
-
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:error', err));
|
|
57
|
-
throw err;
|
|
58
|
-
}
|
|
59
|
-
},
|
|
60
|
-
async has(routingKey, options = {}) {
|
|
61
|
-
const key = dhtRoutingKey(routingKey);
|
|
62
|
-
return datastore.has(key, options);
|
|
6
|
+
async put(routingKey, marshaledRecord, options) {
|
|
7
|
+
await localStore.put(routingKey, marshaledRecord, options);
|
|
63
8
|
},
|
|
64
|
-
async
|
|
65
|
-
const
|
|
66
|
-
return
|
|
9
|
+
async get(routingKey, options) {
|
|
10
|
+
const { record } = await localStore.get(routingKey, options);
|
|
11
|
+
return record;
|
|
67
12
|
}
|
|
68
13
|
};
|
|
69
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-store.js","sourceRoot":"","sources":["../../../src/routing/local-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"local-store.js","sourceRoot":"","sources":["../../../src/routing/local-store.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAE,UAAsB;IACvD,OAAO;QACL,KAAK,CAAC,GAAG,CAAE,UAAsB,EAAE,eAA2B,EAAE,OAAoB;YAClF,MAAM,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,CAAC,CAAA;QAC5D,CAAC;QACD,KAAK,CAAC,GAAG,CAAE,UAAsB,EAAE,OAAoB;YACrD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;YAE5D,OAAO,MAAM,CAAA;QACf,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -1,9 +1,29 @@
|
|
|
1
1
|
import type { IPNSRouting } from './index.js';
|
|
2
|
-
import type { PeerId,
|
|
2
|
+
import type { PeerId, TypedEventTarget, ComponentLogger } from '@libp2p/interface';
|
|
3
3
|
import type { Datastore } from 'interface-datastore';
|
|
4
4
|
import type { ProgressEvent } from 'progress-events';
|
|
5
|
+
export interface Message {
|
|
6
|
+
type: 'signed' | 'unsigned';
|
|
7
|
+
from: PeerId;
|
|
8
|
+
topic: string;
|
|
9
|
+
data: Uint8Array;
|
|
10
|
+
}
|
|
11
|
+
export interface PubSubEvents {
|
|
12
|
+
message: CustomEvent<Message>;
|
|
13
|
+
}
|
|
14
|
+
export interface PublishResult {
|
|
15
|
+
recipients: PeerId[];
|
|
16
|
+
}
|
|
17
|
+
export interface PubSub extends TypedEventTarget<PubSubEvents> {
|
|
18
|
+
subscribe(topic: string): void;
|
|
19
|
+
unsubscribe(topic: string): void;
|
|
20
|
+
publish(topic: string, message: Uint8Array): Promise<PublishResult>;
|
|
21
|
+
getTopics(): string[];
|
|
22
|
+
getSubscribers(topic: string): PeerId[];
|
|
23
|
+
}
|
|
5
24
|
export interface PubsubRoutingComponents {
|
|
6
25
|
datastore: Datastore;
|
|
26
|
+
logger: ComponentLogger;
|
|
7
27
|
libp2p: {
|
|
8
28
|
peerId: PeerId;
|
|
9
29
|
services: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pubsub.d.ts","sourceRoot":"","sources":["../../../src/routing/pubsub.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAc,WAAW,EAAc,MAAM,YAAY,CAAA;AAErE,OAAO,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"pubsub.d.ts","sourceRoot":"","sources":["../../../src/routing/pubsub.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAc,WAAW,EAAc,MAAM,YAAY,CAAA;AAErE,OAAO,KAAK,EAAE,MAAM,EAAa,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAC7F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAIpD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,UAAU,CAAA;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,MAAO,SAAQ,gBAAgB,CAAC,YAAY,CAAC;IAC5D,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IACnE,SAAS,IAAI,MAAM,EAAE,CAAA;IACrB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CACxC;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,eAAe,CAAA;IACvB,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE;YACR,MAAM,EAAE,MAAM,CAAA;SACf,CAAA;KACF,CAAA;CACF;AAED,MAAM,MAAM,oBAAoB,GAC9B,aAAa,CAAC,qBAAqB,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC,GAC9E,aAAa,CAAC,uBAAuB,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GACzD,aAAa,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAA;AA+J3C;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAE,UAAU,EAAE,uBAAuB,GAAG,WAAW,CAExE"}
|
|
@@ -8,7 +8,7 @@ import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
|
|
|
8
8
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
9
9
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
10
10
|
import { InvalidTopicError } from '../errors.js';
|
|
11
|
-
import { localStore } from '
|
|
11
|
+
import { localStore } from '../local-store.js';
|
|
12
12
|
const log = logger('helia:ipns:routing:pubsub');
|
|
13
13
|
class PubSubRouting {
|
|
14
14
|
subscriptions;
|
|
@@ -17,7 +17,7 @@ class PubSubRouting {
|
|
|
17
17
|
pubsub;
|
|
18
18
|
constructor(components) {
|
|
19
19
|
this.subscriptions = [];
|
|
20
|
-
this.localStore = localStore(components.datastore);
|
|
20
|
+
this.localStore = localStore(components.datastore, components.logger.forComponent('helia:ipns:local-store'));
|
|
21
21
|
this.peerId = components.libp2p.peerId;
|
|
22
22
|
this.pubsub = components.libp2p.services.pubsub;
|
|
23
23
|
this.pubsub.addEventListener('message', (evt) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pubsub.js","sourceRoot":"","sources":["../../../src/routing/pubsub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,MAAM,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"pubsub.js","sourceRoot":"","sources":["../../../src/routing/pubsub.ts"],"names":[],"mappings":"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"}
|
package/dist/src/utils.d.ts
CHANGED
|
@@ -1,6 +1,30 @@
|
|
|
1
|
+
import { Key } from 'interface-datastore';
|
|
2
|
+
import type { IPNSRecord } from 'ipns';
|
|
3
|
+
import type { CID } from 'multiformats/cid';
|
|
1
4
|
import type { MultihashDigest } from 'multiformats/hashes/interface';
|
|
5
|
+
export declare const LIBP2P_KEY_CODEC = 114;
|
|
2
6
|
export declare const IDENTITY_CODEC = 0;
|
|
3
7
|
export declare const SHA2_256_CODEC = 18;
|
|
4
8
|
export declare const IPNS_STRING_PREFIX = "/ipns/";
|
|
5
9
|
export declare function isCodec<T extends number>(digest: MultihashDigest, codec: T): digest is MultihashDigest<T>;
|
|
10
|
+
export declare const DHT_RECORD_PREFIX = "/dht/record/";
|
|
11
|
+
export declare const IPNS_METADATA_PREFIX = "/ipns/metadata/";
|
|
12
|
+
export declare function dhtRoutingKey(key: Uint8Array): Key;
|
|
13
|
+
/**
|
|
14
|
+
* Calculate the datastore key for IPNS record metadata
|
|
15
|
+
*
|
|
16
|
+
* @param key - The DHT routing key for the IPNS record as defined in
|
|
17
|
+
* https://specs.ipfs.tech/ipns/ipns-record/#routing-record
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
*
|
|
21
|
+
* ```ts
|
|
22
|
+
* const key = multihashToIPNSRoutingKey(privKey.publicKey.toMultihash())
|
|
23
|
+
* const metadataKey = ipnsMetadataKey(key)
|
|
24
|
+
* ```
|
|
25
|
+
* @returns The local storage key for IPNS record metadata
|
|
26
|
+
*/
|
|
27
|
+
export declare function ipnsMetadataKey(key: Uint8Array): Key;
|
|
28
|
+
export declare function shouldRepublish(ipnsRecord: IPNSRecord, created: Date): boolean;
|
|
29
|
+
export declare function isLibp2pCID(obj?: any): obj is CID<unknown, 0x72, 0x00 | 0x12, 1>;
|
|
6
30
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/src/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AAGzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AACtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEpE,eAAO,MAAM,gBAAgB,MAAO,CAAA;AACpC,eAAO,MAAM,cAAc,IAAM,CAAA;AACjC,eAAO,MAAM,cAAc,KAAO,CAAA;AAElC,eAAO,MAAM,kBAAkB,WAAW,CAAA;AAE1C,wBAAgB,OAAO,CAAE,CAAC,SAAS,MAAM,EAAG,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,IAAI,eAAe,CAAC,CAAC,CAAC,CAE3G;AAED,eAAO,MAAM,iBAAiB,iBAAiB,CAAA;AAC/C,eAAO,MAAM,oBAAoB,oBAAoB,CAAA;AAErD,wBAAgB,aAAa,CAAE,GAAG,EAAE,UAAU,GAAG,GAAG,CAEnD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAE,GAAG,EAAE,UAAU,GAAG,GAAG,CAErD;AAED,wBAAgB,eAAe,CAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,CAgB/E;AAMD,wBAAgB,WAAW,CAAE,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,CAcjF"}
|
package/dist/src/utils.js
CHANGED
|
@@ -1,7 +1,63 @@
|
|
|
1
|
+
import { InvalidParametersError } from '@libp2p/interface';
|
|
2
|
+
import { Key } from 'interface-datastore';
|
|
3
|
+
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
4
|
+
import { DHT_EXPIRY_MS, REPUBLISH_THRESHOLD } from "./constants.js";
|
|
5
|
+
export const LIBP2P_KEY_CODEC = 0x72;
|
|
1
6
|
export const IDENTITY_CODEC = 0x0;
|
|
2
7
|
export const SHA2_256_CODEC = 0x12;
|
|
3
8
|
export const IPNS_STRING_PREFIX = '/ipns/';
|
|
4
9
|
export function isCodec(digest, codec) {
|
|
5
10
|
return digest.code === codec;
|
|
6
11
|
}
|
|
12
|
+
export const DHT_RECORD_PREFIX = '/dht/record/';
|
|
13
|
+
export const IPNS_METADATA_PREFIX = '/ipns/metadata/';
|
|
14
|
+
export function dhtRoutingKey(key) {
|
|
15
|
+
return new Key(DHT_RECORD_PREFIX + uint8ArrayToString(key, 'base32'), false);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Calculate the datastore key for IPNS record metadata
|
|
19
|
+
*
|
|
20
|
+
* @param key - The DHT routing key for the IPNS record as defined in
|
|
21
|
+
* https://specs.ipfs.tech/ipns/ipns-record/#routing-record
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
*
|
|
25
|
+
* ```ts
|
|
26
|
+
* const key = multihashToIPNSRoutingKey(privKey.publicKey.toMultihash())
|
|
27
|
+
* const metadataKey = ipnsMetadataKey(key)
|
|
28
|
+
* ```
|
|
29
|
+
* @returns The local storage key for IPNS record metadata
|
|
30
|
+
*/
|
|
31
|
+
export function ipnsMetadataKey(key) {
|
|
32
|
+
return new Key(IPNS_METADATA_PREFIX + uint8ArrayToString(key, 'base32'), false);
|
|
33
|
+
}
|
|
34
|
+
export function shouldRepublish(ipnsRecord, created) {
|
|
35
|
+
const now = Date.now();
|
|
36
|
+
const dhtExpiry = created.getTime() + DHT_EXPIRY_MS;
|
|
37
|
+
const recordExpiry = new Date(ipnsRecord.validity).getTime();
|
|
38
|
+
// If the DHT expiry is within the threshold, republish it
|
|
39
|
+
if (dhtExpiry - now < REPUBLISH_THRESHOLD) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
// If the record expiry (based on validity/lifetime) is within the threshold, republish it
|
|
43
|
+
if (recordExpiry - now < REPUBLISH_THRESHOLD) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
function isCID(obj) {
|
|
49
|
+
return obj?.asCID === obj;
|
|
50
|
+
}
|
|
51
|
+
export function isLibp2pCID(obj) {
|
|
52
|
+
if (!isCID(obj)) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
if (obj.code !== LIBP2P_KEY_CODEC) {
|
|
56
|
+
throw new InvalidParametersError(`CID codec ${obj.code} was not libp2p-key`);
|
|
57
|
+
}
|
|
58
|
+
if (obj.multihash.code !== IDENTITY_CODEC && obj.multihash.code !== SHA2_256_CODEC) {
|
|
59
|
+
throw new InvalidParametersError(`Multihash algorithm codec ${obj.multihash.code} was not Identity or SHA256 hash`);
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
7
63
|
//# sourceMappingURL=utils.js.map
|
package/dist/src/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AACzC,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAKnE,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAA;AACpC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAA;AAElC,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAA;AAE1C,MAAM,UAAU,OAAO,CAAqB,MAAuB,EAAE,KAAQ;IAC3E,OAAO,MAAM,CAAC,IAAI,KAAK,KAAK,CAAA;AAC9B,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAA;AAC/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAA;AAErD,MAAM,UAAU,aAAa,CAAE,GAAe;IAC5C,OAAO,IAAI,GAAG,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAA;AAC9E,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAAE,GAAe;IAC9C,OAAO,IAAI,GAAG,CAAC,oBAAoB,GAAG,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAA;AACjF,CAAC;AAED,MAAM,UAAU,eAAe,CAAE,UAAsB,EAAE,OAAa;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,aAAa,CAAA;IACnD,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAA;IAE5D,0DAA0D;IAC1D,IAAI,SAAS,GAAG,GAAG,GAAG,mBAAmB,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAA;IACb,CAAC;IAED,0FAA0F;IAC1F,IAAI,YAAY,GAAG,GAAG,GAAG,mBAAmB,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,KAAK,CAAE,GAAS;IACvB,OAAO,GAAG,EAAE,KAAK,KAAK,GAAG,CAAA;AAC3B,CAAC;AAED,MAAM,UAAU,WAAW,CAAE,GAAS;IACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAClC,MAAM,IAAI,sBAAsB,CAAC,aAAa,GAAG,CAAC,IAAI,qBAAqB,CAAC,CAAA;IAC9E,CAAC;IAED,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,cAAc,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACnF,MAAM,IAAI,sBAAsB,CAAC,6BAA6B,GAAG,CAAC,SAAS,CAAC,IAAI,kCAAkC,CAAC,CAAA;IACrH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@helia/ipns",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "9.0.0-9c67dbd4",
|
|
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/tree/main/packages/ipns#readme",
|
|
@@ -56,13 +56,6 @@
|
|
|
56
56
|
"import": "./dist/src/routing/index.js"
|
|
57
57
|
}
|
|
58
58
|
},
|
|
59
|
-
"eslintConfig": {
|
|
60
|
-
"extends": "ipfs",
|
|
61
|
-
"parserOptions": {
|
|
62
|
-
"project": true,
|
|
63
|
-
"sourceType": "module"
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
59
|
"scripts": {
|
|
67
60
|
"clean": "aegir clean",
|
|
68
61
|
"lint": "aegir lint",
|
|
@@ -70,6 +63,7 @@
|
|
|
70
63
|
"doc-check": "aegir doc-check",
|
|
71
64
|
"build": "aegir build",
|
|
72
65
|
"docs": "aegir docs",
|
|
66
|
+
"generate": "protons ./src/pb/metadata.proto",
|
|
73
67
|
"test": "aegir test",
|
|
74
68
|
"test:chrome": "aegir test -t browser --cov",
|
|
75
69
|
"test:chrome-webworker": "aegir test -t webworker",
|
|
@@ -79,25 +73,29 @@
|
|
|
79
73
|
"test:electron-main": "aegir test -t electron-main"
|
|
80
74
|
},
|
|
81
75
|
"dependencies": {
|
|
82
|
-
"@helia/interface": "
|
|
83
|
-
"@libp2p/
|
|
84
|
-
"@libp2p/
|
|
85
|
-
"@libp2p/
|
|
86
|
-
"@libp2p/
|
|
87
|
-
"@
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
"
|
|
76
|
+
"@helia/interface": "6.0.0-9c67dbd4",
|
|
77
|
+
"@libp2p/crypto": "^5.1.7",
|
|
78
|
+
"@libp2p/interface": "^3.0.2",
|
|
79
|
+
"@libp2p/kad-dht": "^16.0.5",
|
|
80
|
+
"@libp2p/keychain": "^6.0.5",
|
|
81
|
+
"@libp2p/logger": "^6.0.5",
|
|
82
|
+
"@libp2p/utils": "^7.0.5",
|
|
83
|
+
"interface-datastore": "^9.0.2",
|
|
84
|
+
"ipns": "^10.1.2",
|
|
85
|
+
"multiformats": "^13.4.1",
|
|
91
86
|
"progress-events": "^1.0.1",
|
|
87
|
+
"protons-runtime": "^5.5.0",
|
|
88
|
+
"uint8arraylist": "^2.4.8",
|
|
92
89
|
"uint8arrays": "^5.1.0"
|
|
93
90
|
},
|
|
94
91
|
"devDependencies": {
|
|
95
|
-
"@libp2p/crypto": "^5.
|
|
96
|
-
"@
|
|
97
|
-
"aegir": "^47.0.
|
|
98
|
-
"datastore-core": "^
|
|
99
|
-
"it-drain": "^3.0.
|
|
100
|
-
"
|
|
92
|
+
"@libp2p/crypto": "^5.1.12",
|
|
93
|
+
"@libp2p/peer-id": "^6.0.3",
|
|
94
|
+
"aegir": "^47.0.22",
|
|
95
|
+
"datastore-core": "^11.0.2",
|
|
96
|
+
"it-drain": "^3.0.10",
|
|
97
|
+
"protons": "^7.6.1",
|
|
98
|
+
"sinon": "^21.0.0",
|
|
101
99
|
"sinon-ts": "^2.0.0"
|
|
102
100
|
},
|
|
103
101
|
"browser": {
|
package/src/constants.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const MINUTE = 60 * 1000
|
|
2
|
+
const HOUR = 60 * MINUTE
|
|
3
|
+
|
|
4
|
+
export const DEFAULT_LIFETIME_MS = 48 * HOUR
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The default DHT record expiry
|
|
8
|
+
*/
|
|
9
|
+
export const DHT_EXPIRY_MS = 48 * HOUR
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* How often to run the republish loop
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_REPUBLISH_INTERVAL_MS = HOUR
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Republish IPNS records when the expiry of our provider records is within this
|
|
18
|
+
* threshold
|
|
19
|
+
*/
|
|
20
|
+
export const REPUBLISH_THRESHOLD = 24 * HOUR
|
|
21
|
+
|
|
22
|
+
export const DEFAULT_TTL_NS = BigInt(MINUTE) * 5_000_000n // 5 minutes
|
|
23
|
+
|
|
24
|
+
export const DEFAULT_REPUBLISH_CONCURRENCY = 5
|
package/src/errors.ts
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
export class DNSLinkNotFoundError extends Error {
|
|
2
|
-
static name = 'DNSLinkNotFoundError'
|
|
3
|
-
|
|
4
|
-
constructor (message = 'DNSLink not found') {
|
|
5
|
-
super(message)
|
|
6
|
-
this.name = 'DNSLinkNotFoundError'
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
|
|
10
1
|
export class RecordsFailedValidationError extends Error {
|
|
11
2
|
static name = 'RecordsFailedValidationError'
|
|
12
3
|
|