@helia/ipns 8.2.4 → 9.0.0-4d51f16d
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 +11 -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 +131 -207
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +49 -416
- package/dist/src/index.js.map +1 -1
- package/dist/src/ipns/publisher.d.ts +29 -0
- package/dist/src/ipns/publisher.d.ts.map +1 -0
- package/dist/src/ipns/publisher.js +73 -0
- package/dist/src/ipns/publisher.js.map +1 -0
- package/dist/src/ipns/republisher.d.ts +30 -0
- package/dist/src/ipns/republisher.d.ts.map +1 -0
- package/dist/src/ipns/republisher.js +112 -0
- package/dist/src/ipns/republisher.js.map +1 -0
- package/dist/src/ipns/resolver.d.ts +26 -0
- package/dist/src/ipns/resolver.d.ts.map +1 -0
- package/dist/src/ipns/resolver.js +165 -0
- package/dist/src/ipns/resolver.js.map +1 -0
- package/dist/src/ipns.d.ts +20 -0
- package/dist/src/ipns.d.ts.map +1 -0
- package/dist/src/ipns.js +70 -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 +5 -3
- 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 +154 -548
- package/src/ipns/publisher.ts +97 -0
- package/src/ipns/republisher.ts +144 -0
- package/src/ipns/resolver.ts +217 -0
- package/src/ipns.ts +87 -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 +5 -4
- 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
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Record } from '@libp2p/kad-dht';
|
|
2
|
+
import { CustomProgressEvent } from 'progress-events';
|
|
3
|
+
import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
|
|
4
|
+
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
5
|
+
import { IPNSPublishMetadata } from './pb/metadata.js';
|
|
6
|
+
import { dhtRoutingKey, DHT_RECORD_PREFIX, ipnsMetadataKey } from './utils.js';
|
|
7
|
+
/**
|
|
8
|
+
* Read/write IPNS records to the datastore as DHT records.
|
|
9
|
+
*
|
|
10
|
+
* This lets us publish IPNS records offline then serve them to the network
|
|
11
|
+
* later in response to DHT queries.
|
|
12
|
+
*/
|
|
13
|
+
export function localStore(datastore, log) {
|
|
14
|
+
return {
|
|
15
|
+
async put(routingKey, marshalledRecord, options = {}) {
|
|
16
|
+
try {
|
|
17
|
+
const key = dhtRoutingKey(routingKey);
|
|
18
|
+
// don't overwrite existing, identical records as this will affect the
|
|
19
|
+
// TTL
|
|
20
|
+
try {
|
|
21
|
+
const existingBuf = await datastore.get(key);
|
|
22
|
+
const existingRecord = Record.deserialize(existingBuf);
|
|
23
|
+
if (uint8ArrayEquals(existingRecord.value, marshalledRecord)) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
if (err.name !== 'NotFoundError') {
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Marshal to libp2p record as the DHT does
|
|
33
|
+
const record = new Record(routingKey, marshalledRecord, new Date());
|
|
34
|
+
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:put'));
|
|
35
|
+
const batch = datastore.batch();
|
|
36
|
+
batch.put(key, record.serialize());
|
|
37
|
+
if (options.metadata != null) {
|
|
38
|
+
// derive the datastore key for the IPNS metadata from the same routing key
|
|
39
|
+
batch.put(ipnsMetadataKey(routingKey), IPNSPublishMetadata.encode(options.metadata));
|
|
40
|
+
}
|
|
41
|
+
await batch.commit(options);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:error', err));
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
async get(routingKey, options = {}) {
|
|
49
|
+
try {
|
|
50
|
+
const key = dhtRoutingKey(routingKey);
|
|
51
|
+
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:get'));
|
|
52
|
+
const buf = await datastore.get(key, options);
|
|
53
|
+
// Unmarshal libp2p record as the DHT does
|
|
54
|
+
const record = Record.deserialize(buf);
|
|
55
|
+
return {
|
|
56
|
+
record: record.value,
|
|
57
|
+
created: record.timeReceived
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:error', err));
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
async has(routingKey, options = {}) {
|
|
66
|
+
const key = dhtRoutingKey(routingKey);
|
|
67
|
+
return datastore.has(key, options);
|
|
68
|
+
},
|
|
69
|
+
async delete(routingKey, options) {
|
|
70
|
+
const key = dhtRoutingKey(routingKey);
|
|
71
|
+
const batch = datastore.batch();
|
|
72
|
+
batch.delete(key);
|
|
73
|
+
batch.delete(ipnsMetadataKey(routingKey));
|
|
74
|
+
await batch.commit(options);
|
|
75
|
+
},
|
|
76
|
+
async *list(options = {}) {
|
|
77
|
+
try {
|
|
78
|
+
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:list'));
|
|
79
|
+
// Query all records with the DHT_RECORD_PREFIX
|
|
80
|
+
for await (const { key, value } of datastore.query({
|
|
81
|
+
prefix: DHT_RECORD_PREFIX
|
|
82
|
+
}, options)) {
|
|
83
|
+
try {
|
|
84
|
+
// Deserialize the record
|
|
85
|
+
const libp2pRecord = Record.deserialize(value);
|
|
86
|
+
// Extract the routing key from the datastore key
|
|
87
|
+
const keyString = key.toString();
|
|
88
|
+
const routingKeyBase32 = keyString.substring(DHT_RECORD_PREFIX.length);
|
|
89
|
+
const routingKey = uint8ArrayFromString(routingKeyBase32, 'base32');
|
|
90
|
+
const metadataKey = ipnsMetadataKey(routingKey);
|
|
91
|
+
let metadata;
|
|
92
|
+
try {
|
|
93
|
+
const metadataBuf = await datastore.get(metadataKey, options);
|
|
94
|
+
metadata = IPNSPublishMetadata.decode(metadataBuf);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
log.error('Error deserializing metadata for %s - %e', routingKeyBase32, err);
|
|
98
|
+
}
|
|
99
|
+
yield {
|
|
100
|
+
routingKey,
|
|
101
|
+
metadata,
|
|
102
|
+
record: libp2pRecord.value,
|
|
103
|
+
created: libp2pRecord.timeReceived
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
// Skip invalid records
|
|
108
|
+
log.error('Error deserializing record - %e', err);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:error', err));
|
|
114
|
+
throw err;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=local-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-store.js","sourceRoot":"","sources":["../../src/local-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Codec, DecodeOptions } from 'protons-runtime';
|
|
2
|
+
import type { Uint8ArrayList } from 'uint8arraylist';
|
|
3
|
+
export interface IPNSPublishMetadata {
|
|
4
|
+
keyName: string;
|
|
5
|
+
lifetime: number;
|
|
6
|
+
}
|
|
7
|
+
export declare namespace IPNSPublishMetadata {
|
|
8
|
+
const codec: () => Codec<IPNSPublishMetadata>;
|
|
9
|
+
const encode: (obj: Partial<IPNSPublishMetadata>) => Uint8Array;
|
|
10
|
+
const decode: (buf: Uint8Array | Uint8ArrayList, opts?: DecodeOptions<IPNSPublishMetadata>) => IPNSPublishMetadata;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/pb/metadata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,yBAAiB,mBAAmB,CAAC;IAG5B,MAAM,KAAK,QAAO,KAAK,CAAC,mBAAmB,CAoDjD,CAAA;IAEM,MAAM,MAAM,GAAI,KAAK,OAAO,CAAC,mBAAmB,CAAC,KAAG,UAE1D,CAAA;IAEM,MAAM,MAAM,GAAI,KAAK,UAAU,GAAG,cAAc,EAAE,OAAO,aAAa,CAAC,mBAAmB,CAAC,KAAG,mBAEpG,CAAA;CACF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { decodeMessage, encodeMessage, message } from 'protons-runtime';
|
|
2
|
+
export var IPNSPublishMetadata;
|
|
3
|
+
(function (IPNSPublishMetadata) {
|
|
4
|
+
let _codec;
|
|
5
|
+
IPNSPublishMetadata.codec = () => {
|
|
6
|
+
if (_codec == null) {
|
|
7
|
+
_codec = message((obj, w, opts = {}) => {
|
|
8
|
+
if (opts.lengthDelimited !== false) {
|
|
9
|
+
w.fork();
|
|
10
|
+
}
|
|
11
|
+
if ((obj.keyName != null && obj.keyName !== '')) {
|
|
12
|
+
w.uint32(10);
|
|
13
|
+
w.string(obj.keyName);
|
|
14
|
+
}
|
|
15
|
+
if ((obj.lifetime != null && obj.lifetime !== 0)) {
|
|
16
|
+
w.uint32(16);
|
|
17
|
+
w.uint32(obj.lifetime);
|
|
18
|
+
}
|
|
19
|
+
if (opts.lengthDelimited !== false) {
|
|
20
|
+
w.ldelim();
|
|
21
|
+
}
|
|
22
|
+
}, (reader, length, opts = {}) => {
|
|
23
|
+
const obj = {
|
|
24
|
+
keyName: '',
|
|
25
|
+
lifetime: 0
|
|
26
|
+
};
|
|
27
|
+
const end = length == null ? reader.len : reader.pos + length;
|
|
28
|
+
while (reader.pos < end) {
|
|
29
|
+
const tag = reader.uint32();
|
|
30
|
+
switch (tag >>> 3) {
|
|
31
|
+
case 1: {
|
|
32
|
+
obj.keyName = reader.string();
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
case 2: {
|
|
36
|
+
obj.lifetime = reader.uint32();
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
default: {
|
|
40
|
+
reader.skipType(tag & 7);
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return obj;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return _codec;
|
|
49
|
+
};
|
|
50
|
+
IPNSPublishMetadata.encode = (obj) => {
|
|
51
|
+
return encodeMessage(obj, IPNSPublishMetadata.codec());
|
|
52
|
+
};
|
|
53
|
+
IPNSPublishMetadata.decode = (buf, opts) => {
|
|
54
|
+
return decodeMessage(buf, IPNSPublishMetadata.codec(), opts);
|
|
55
|
+
};
|
|
56
|
+
})(IPNSPublishMetadata || (IPNSPublishMetadata = {}));
|
|
57
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/pb/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AASvE,MAAM,KAAW,mBAAmB,CAgEnC;AAhED,WAAiB,mBAAmB;IAClC,IAAI,MAAkC,CAAA;IAEzB,yBAAK,GAAG,GAA+B,EAAE;QACpD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,MAAM,GAAG,OAAO,CAAsB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;gBAC1D,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;oBACnC,CAAC,CAAC,IAAI,EAAE,CAAA;gBACV,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,IAAI,GAAG,CAAC,OAAO,KAAK,EAAE,CAAC,EAAE,CAAC;oBAChD,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;oBACZ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBACvB,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;oBACjD,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;oBACZ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBACxB,CAAC;gBAED,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;oBACnC,CAAC,CAAC,MAAM,EAAE,CAAA;gBACZ,CAAC;YACH,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;gBAC/B,MAAM,GAAG,GAAQ;oBACf,OAAO,EAAE,EAAE;oBACX,QAAQ,EAAE,CAAC;iBACZ,CAAA;gBAED,MAAM,GAAG,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,MAAM,CAAA;gBAE7D,OAAO,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;oBACxB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;oBAE3B,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC;wBAClB,KAAK,CAAC,CAAC,CAAC,CAAC;4BACP,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;4BAC7B,MAAK;wBACP,CAAC;wBACD,KAAK,CAAC,CAAC,CAAC,CAAC;4BACP,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;4BAC9B,MAAK;wBACP,CAAC;wBACD,OAAO,CAAC,CAAC,CAAC;4BACR,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;4BACxB,MAAK;wBACP,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,OAAO,GAAG,CAAA;YACZ,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAEY,0BAAM,GAAG,CAAC,GAAiC,EAAc,EAAE;QACtE,OAAO,aAAa,CAAC,GAAG,EAAE,mBAAmB,CAAC,KAAK,EAAE,CAAC,CAAA;IACxD,CAAC,CAAA;IAEY,0BAAM,GAAG,CAAC,GAAgC,EAAE,IAAyC,EAAuB,EAAE;QACzH,OAAO,aAAa,CAAC,GAAG,EAAE,mBAAmB,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAA;IAC9D,CAAC,CAAA;AACH,CAAC,EAhEgB,mBAAmB,KAAnB,mBAAmB,QAgEnC"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { HeliaRoutingProgressEvents } from './helia.js';
|
|
2
|
-
import type { DatastoreProgressEvents } from '
|
|
2
|
+
import type { DatastoreProgressEvents } from '../index.js';
|
|
3
3
|
import type { PubSubProgressEvents } from './pubsub.js';
|
|
4
|
+
import type { IPNSPublishMetadata } from '../pb/metadata.ts';
|
|
4
5
|
import type { AbortOptions } from '@libp2p/interface';
|
|
5
6
|
import type { ProgressOptions } from 'progress-events';
|
|
6
7
|
export interface PutOptions extends AbortOptions, ProgressOptions {
|
|
8
|
+
metadata?: IPNSPublishMetadata;
|
|
7
9
|
}
|
|
8
10
|
export interface GetOptions extends AbortOptions, ProgressOptions {
|
|
9
11
|
/**
|
|
@@ -20,8 +22,8 @@ export interface IPNSRouting {
|
|
|
20
22
|
export type { DatastoreProgressEvents };
|
|
21
23
|
export type { HeliaRoutingProgressEvents };
|
|
22
24
|
export type { PubSubProgressEvents };
|
|
23
|
-
export type
|
|
25
|
+
export type IPNSRoutingProgressEvents = DatastoreProgressEvents | HeliaRoutingProgressEvents | PubSubProgressEvents;
|
|
24
26
|
export { helia } from './helia.js';
|
|
25
27
|
export { pubsub } from './pubsub.js';
|
|
26
|
-
export type { PubsubRoutingComponents } from './pubsub.js';
|
|
28
|
+
export type { PubsubRoutingComponents, PubSub, Message, PublishResult, PubSubEvents } from './pubsub.js';
|
|
27
29
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routing/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routing/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,WAAW,UAAW,SAAQ,YAAY,EAAE,eAAe;IAC/D,QAAQ,CAAC,EAAE,mBAAmB,CAAA;CAC/B;AAED,MAAM,WAAW,UAAW,SAAQ,YAAY,EAAE,eAAe;IAC/D;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7F,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;CACvE;AAED,YAAY,EAAE,uBAAuB,EAAE,CAAA;AACvC,YAAY,EAAE,0BAA0B,EAAE,CAAA;AAC1C,YAAY,EAAE,oBAAoB,EAAE,CAAA;AAEpC,MAAM,MAAM,yBAAyB,GACnC,uBAAuB,GACvB,0BAA0B,GAC1B,oBAAoB,CAAA;AAEtB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,YAAY,EAAE,uBAAuB,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routing/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routing/index.ts"],"names":[],"mappings":"AAkCA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -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"}
|