@helia/ipns 10.0.1-cee53d7d → 10.0.2-688bd9de
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 +3 -7
- package/dist/index.min.js +16 -5
- package/dist/index.min.js.map +4 -4
- package/dist/src/errors.d.ts +0 -8
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +0 -8
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +58 -20
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +11 -11
- package/dist/src/index.js.map +1 -1
- package/dist/src/ipns/publisher.d.ts.map +1 -1
- package/dist/src/ipns/publisher.js +27 -14
- package/dist/src/ipns/publisher.js.map +1 -1
- package/dist/src/ipns/republisher.d.ts.map +1 -1
- package/dist/src/ipns/republisher.js +22 -9
- package/dist/src/ipns/republisher.js.map +1 -1
- package/dist/src/ipns/resolver.d.ts.map +1 -1
- package/dist/src/ipns/resolver.js +39 -17
- package/dist/src/ipns/resolver.js.map +1 -1
- package/dist/src/ipns.d.ts.map +1 -1
- package/dist/src/ipns.js +8 -8
- package/dist/src/ipns.js.map +1 -1
- package/dist/src/local-store.d.ts +4 -4
- package/dist/src/local-store.d.ts.map +1 -1
- package/dist/src/local-store.js +2 -1
- package/dist/src/local-store.js.map +1 -1
- package/dist/src/pb/ipns.d.ts +29 -29
- package/dist/src/pb/ipns.d.ts.map +1 -1
- package/dist/src/pb/ipns.js +15 -15
- package/dist/src/records.d.ts +27 -142
- package/dist/src/records.d.ts.map +1 -1
- package/dist/src/records.js +39 -46
- package/dist/src/records.js.map +1 -1
- package/dist/src/routing/helia.d.ts +5 -5
- package/dist/src/routing/helia.d.ts.map +1 -1
- package/dist/src/routing/helia.js +3 -3
- package/dist/src/routing/helia.js.map +1 -1
- package/dist/src/routing/index.d.ts +7 -7
- package/dist/src/routing/index.d.ts.map +1 -1
- package/dist/src/routing/index.js +2 -2
- package/dist/src/routing/index.js.map +1 -1
- package/dist/src/routing/local-store.d.ts +1 -1
- package/dist/src/routing/local-store.d.ts.map +1 -1
- package/dist/src/routing/local-store.js +3 -3
- package/dist/src/routing/local-store.js.map +1 -1
- package/dist/src/routing/pubsub.d.ts +11 -11
- package/dist/src/routing/pubsub.d.ts.map +1 -1
- package/dist/src/routing/pubsub.js +11 -12
- package/dist/src/routing/pubsub.js.map +1 -1
- package/dist/src/selector.d.ts +2 -2
- package/dist/src/selector.d.ts.map +1 -1
- package/dist/src/selector.js +13 -9
- package/dist/src/selector.js.map +1 -1
- package/dist/src/utils.d.ts +9 -10
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +20 -128
- package/dist/src/utils.js.map +1 -1
- package/dist/src/validator.d.ts +9 -3
- package/dist/src/validator.d.ts.map +1 -1
- package/dist/src/validator.js +57 -14
- package/dist/src/validator.js.map +1 -1
- package/package.json +6 -31
- package/src/errors.ts +0 -10
- package/src/index.ts +75 -25
- package/src/ipns/publisher.ts +27 -14
- package/src/ipns/republisher.ts +31 -13
- package/src/ipns/resolver.ts +39 -21
- package/src/ipns.ts +8 -8
- package/src/local-store.ts +8 -7
- package/src/pb/ipns.proto +1 -1
- package/src/pb/ipns.ts +37 -37
- package/src/records.ts +57 -210
- package/src/routing/helia.ts +6 -6
- package/src/routing/index.ts +7 -7
- package/src/routing/local-store.ts +6 -6
- package/src/routing/pubsub.ts +24 -25
- package/src/selector.ts +14 -11
- package/src/utils.ts +25 -147
- package/src/validator.ts +73 -16
package/dist/src/errors.d.ts
CHANGED
|
@@ -2,14 +2,6 @@ export declare class RecordsFailedValidationError extends Error {
|
|
|
2
2
|
static name: string;
|
|
3
3
|
name: string;
|
|
4
4
|
}
|
|
5
|
-
export declare class UnsupportedMultibasePrefixError extends Error {
|
|
6
|
-
static name: string;
|
|
7
|
-
name: string;
|
|
8
|
-
}
|
|
9
|
-
export declare class UnsupportedMultihashCodecError extends Error {
|
|
10
|
-
static name: string;
|
|
11
|
-
name: string;
|
|
12
|
-
}
|
|
13
5
|
export declare class InvalidValueError extends Error {
|
|
14
6
|
static name: string;
|
|
15
7
|
name: string;
|
package/dist/src/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,MAAM,CAAC,IAAI,SAAiC;IAC5C,IAAI,SAAiC;CACtC;AAED,qBAAa
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,MAAM,CAAC,IAAI,SAAiC;IAC5C,IAAI,SAAiC;CACtC;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,CAAC,IAAI,SAAsB;IACjC,IAAI,SAAsB;CAC3B;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,CAAC,IAAI,SAAsB;IACjC,IAAI,SAAsB;CAC3B;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,CAAC,IAAI,SAAwB;IACnC,IAAI,SAAwB;CAC7B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,MAAM,CAAC,IAAI,SAA2B;IACtC,IAAI,SAA2B;CAChC;AAED,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,MAAM,CAAC,IAAI,SAA+B;IAC1C,IAAI,SAA+B;CACpC;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,MAAM,CAAC,IAAI,SAAuB;IAClC,IAAI,SAAuB;CAC5B;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,MAAM,CAAC,IAAI,SAA6B;IACxC,IAAI,SAA6B;CAClC;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,CAAC,IAAI,SAAwB;IACnC,IAAI,SAAwB;CAC7B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,MAAM,CAAC,IAAI,SAA2B;IACtC,IAAI,SAA2B;CAChC;AAED,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,MAAM,CAAC,IAAI,SAAkC;IAC7C,IAAI,SAAkC;CACvC"}
|
package/dist/src/errors.js
CHANGED
|
@@ -2,14 +2,6 @@ export class RecordsFailedValidationError extends Error {
|
|
|
2
2
|
static name = 'RecordsFailedValidationError';
|
|
3
3
|
name = 'RecordsFailedValidationError';
|
|
4
4
|
}
|
|
5
|
-
export class UnsupportedMultibasePrefixError extends Error {
|
|
6
|
-
static name = 'UnsupportedMultibasePrefixError';
|
|
7
|
-
name = 'UnsupportedMultibasePrefixError';
|
|
8
|
-
}
|
|
9
|
-
export class UnsupportedMultihashCodecError extends Error {
|
|
10
|
-
static name = 'UnsupportedMultihashCodecError';
|
|
11
|
-
name = 'UnsupportedMultihashCodecError';
|
|
12
|
-
}
|
|
13
5
|
export class InvalidValueError extends Error {
|
|
14
6
|
static name = 'InvalidValueError';
|
|
15
7
|
name = 'InvalidValueError';
|
package/dist/src/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD,MAAM,CAAC,IAAI,GAAG,8BAA8B,CAAA;IAC5C,IAAI,GAAG,8BAA8B,CAAA;;AAGvC,MAAM,OAAO
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD,MAAM,CAAC,IAAI,GAAG,8BAA8B,CAAA;IAC5C,IAAI,GAAG,8BAA8B,CAAA;;AAGvC,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,CAAC,IAAI,GAAG,mBAAmB,CAAA;IACjC,IAAI,GAAG,mBAAmB,CAAA;;AAG5B,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,CAAC,IAAI,GAAG,mBAAmB,CAAA;IACjC,IAAI,GAAG,mBAAmB,CAAA;;AAG5B,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,CAAC,IAAI,GAAG,qBAAqB,CAAA;IACnC,IAAI,GAAG,qBAAqB,CAAA;;AAG9B,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,MAAM,CAAC,IAAI,GAAG,wBAAwB,CAAA;IACtC,IAAI,GAAG,wBAAwB,CAAA;;AAGjC,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IACnD,MAAM,CAAC,IAAI,GAAG,4BAA4B,CAAA;IAC1C,IAAI,GAAG,4BAA4B,CAAA;;AAGrC,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,MAAM,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,IAAI,GAAG,oBAAoB,CAAA;;AAG7B,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,MAAM,CAAC,IAAI,GAAG,0BAA0B,CAAA;IACxC,IAAI,GAAG,0BAA0B,CAAA;;AAGnC,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,CAAC,IAAI,GAAG,qBAAqB,CAAA;IACnC,IAAI,GAAG,qBAAqB,CAAA;;AAG9B,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,MAAM,CAAC,IAAI,GAAG,wBAAwB,CAAA;IACtC,IAAI,GAAG,wBAAwB,CAAA;;AAGjC,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IACtD,MAAM,CAAC,IAAI,GAAG,+BAA+B,CAAA;IAC7C,IAAI,GAAG,+BAA+B,CAAA"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -37,7 +37,6 @@
|
|
|
37
37
|
* import { createHelia } from 'helia'
|
|
38
38
|
* import { ipns } from '@helia/ipns'
|
|
39
39
|
* import { unixfs } from '@helia/unixfs'
|
|
40
|
-
* import { generateKeyPair } from '@libp2p/crypto/keys'
|
|
41
40
|
*
|
|
42
41
|
* const helia = await createHelia()
|
|
43
42
|
* const name = ipns(helia)
|
|
@@ -66,7 +65,6 @@
|
|
|
66
65
|
* import { createHelia } from 'helia'
|
|
67
66
|
* import { ipns } from '@helia/ipns'
|
|
68
67
|
* import { unixfs } from '@helia/unixfs'
|
|
69
|
-
* import { generateKeyPair } from '@libp2p/crypto/keys'
|
|
70
68
|
*
|
|
71
69
|
* const helia = await createHelia()
|
|
72
70
|
* const name = ipns(helia)
|
|
@@ -105,15 +103,13 @@
|
|
|
105
103
|
* may fail to be published with "Insufficient peers" errors.
|
|
106
104
|
*
|
|
107
105
|
* ```TypeScript
|
|
108
|
-
* import { ipns } from '@helia/ipns'
|
|
109
|
-
* import { pubsub } from '@helia/ipns/routing'
|
|
106
|
+
* import { ipns, pubSubIPNSRouting } from '@helia/ipns'
|
|
110
107
|
* import { withLibp2p, libp2pDefaults } from '@helia/libp2p'
|
|
111
108
|
* import { unixfs } from '@helia/unixfs'
|
|
112
|
-
* import { generateKeyPair } from '@libp2p/crypto/keys'
|
|
113
109
|
* import { floodsub } from '@libp2p/floodsub'
|
|
114
110
|
* import { createHelia } from 'helia'
|
|
115
111
|
* import type { Helia } from '@helia/interface'
|
|
116
|
-
* import type { PubSub } from '@helia/ipns
|
|
112
|
+
* import type { PubSub } from '@helia/ipns'
|
|
117
113
|
* import type { DefaultLibp2pServices } from '@helia/libp2p'
|
|
118
114
|
* import type { FloodSub } from '@libp2p/floodsub'
|
|
119
115
|
* import type { Libp2p } from '@libp2p/interface'
|
|
@@ -125,7 +121,7 @@
|
|
|
125
121
|
*
|
|
126
122
|
* const name = ipns(helia, {
|
|
127
123
|
* routers: [
|
|
128
|
-
*
|
|
124
|
+
* pubSubIPNSRouting(helia)
|
|
129
125
|
* ]
|
|
130
126
|
* })
|
|
131
127
|
*
|
|
@@ -144,7 +140,7 @@
|
|
|
144
140
|
*/
|
|
145
141
|
import { CID } from 'multiformats/cid';
|
|
146
142
|
import type { IPNSResolverComponents } from './ipns/resolver.ts';
|
|
147
|
-
import type {
|
|
143
|
+
import type { IPNSEntry } from './pb/ipns.ts';
|
|
148
144
|
import type { IPNSRouting, IPNSRoutingProgressEvents } from './routing/index.ts';
|
|
149
145
|
import type { Routing, HeliaEvents, Keychain, PublicKey } from '@helia/interface';
|
|
150
146
|
import type { ComponentLogger, TypedEventEmitter } from '@libp2p/interface';
|
|
@@ -152,12 +148,18 @@ import type { AbortOptions } from 'abort-error';
|
|
|
152
148
|
import type { Datastore } from 'interface-datastore';
|
|
153
149
|
import type { MultihashDigest } from 'multiformats/hashes/interface';
|
|
154
150
|
import type { ProgressEvent, ProgressOptions } from 'progress-events';
|
|
155
|
-
export
|
|
156
|
-
export
|
|
151
|
+
export * from './routing/index.ts';
|
|
152
|
+
export * from './pb/ipns.ts';
|
|
153
|
+
export { multihashFromIPNSRoutingKey, multihashToIPNSRoutingKey } from './utils.ts';
|
|
154
|
+
export { createIPNSRecord } from './records.ts';
|
|
155
|
+
export type { CreateIPNSRecordOptions } from './records.ts';
|
|
156
|
+
export type PublishProgressEvents = ProgressEvent<'ipns:publish:start'> | ProgressEvent<'ipns:publish:success', IPNSEntry> | ProgressEvent<'ipns:publish:error', Error>;
|
|
157
|
+
export type ResolveProgressEvents = ProgressEvent<'ipns:resolve:start', unknown> | ProgressEvent<'ipns:resolve:success', IPNSEntry> | ProgressEvent<'ipns:resolve:error', Error>;
|
|
157
158
|
export type DatastoreProgressEvents = ProgressEvent<'ipns:routing:datastore:put'> | ProgressEvent<'ipns:routing:datastore:get'> | ProgressEvent<'ipns:routing:datastore:list'> | ProgressEvent<'ipns:routing:datastore:error', Error>;
|
|
158
159
|
export interface PublishOptions extends AbortOptions, ProgressOptions<PublishProgressEvents | IPNSRoutingProgressEvents> {
|
|
159
160
|
/**
|
|
160
|
-
* Time duration of the signature validity in ms
|
|
161
|
+
* Time duration of the signature validity in ms - after this many ms have
|
|
162
|
+
* expired the record will be invalidated.
|
|
161
163
|
*
|
|
162
164
|
* @default 172_800_000
|
|
163
165
|
*/
|
|
@@ -176,15 +178,42 @@ export interface PublishOptions extends AbortOptions, ProgressOptions<PublishPro
|
|
|
176
178
|
*/
|
|
177
179
|
v1Compatible?: boolean;
|
|
178
180
|
/**
|
|
179
|
-
* The TTL of the record in ms
|
|
181
|
+
* The TTL of the record in ms - after this many ms have expired, resolving
|
|
182
|
+
* the record will query the routing for an updated version.
|
|
183
|
+
*
|
|
184
|
+
* Before this many ms have expired any locally stored copy will be treated as
|
|
185
|
+
* the latest version and the routing will not be queried.
|
|
180
186
|
*
|
|
181
187
|
* @default 300_000
|
|
182
188
|
*/
|
|
183
189
|
ttl?: number;
|
|
190
|
+
/**
|
|
191
|
+
* Extensible data that will be added to the IPNS record data and signed to
|
|
192
|
+
* verify it's integrity.
|
|
193
|
+
*
|
|
194
|
+
* Note that this data will be encoded as DAG-CBOR so it must be valid.
|
|
195
|
+
*
|
|
196
|
+
* It is recommended that any custom fields set here are prefixed with `_` to
|
|
197
|
+
* avoid collision with any mandatory fields added to future versions of the
|
|
198
|
+
* IPNS specification.
|
|
199
|
+
*
|
|
200
|
+
* @see https://specs.ipfs.tech/ipns/ipns-record/#extensible-data-dag-cbor
|
|
201
|
+
*/
|
|
202
|
+
data?: Record<string, any>;
|
|
184
203
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
204
|
+
/**
|
|
205
|
+
* Extensible data from the record `data` field.
|
|
206
|
+
*
|
|
207
|
+
* The wire format of this data is DAG-CBOR.
|
|
208
|
+
*
|
|
209
|
+
* @see https://specs.ipfs.tech/ipns/ipns-record/#extensible-data-dag-cbor
|
|
210
|
+
*/
|
|
211
|
+
export interface IPNSRecordData extends Record<string, any> {
|
|
212
|
+
Value: Uint8Array<ArrayBuffer>;
|
|
213
|
+
Validity: Uint8Array<ArrayBuffer>;
|
|
214
|
+
ValidityType: IPNSEntry.ValidityType;
|
|
215
|
+
Sequence: bigint;
|
|
216
|
+
TTL: bigint;
|
|
188
217
|
}
|
|
189
218
|
export interface IPNSResolveOptions extends AbortOptions, ProgressOptions<ResolveProgressEvents | IPNSRoutingProgressEvents> {
|
|
190
219
|
/**
|
|
@@ -199,18 +228,29 @@ export interface IPNSResolveOptions extends AbortOptions, ProgressOptions<Resolv
|
|
|
199
228
|
* @default false
|
|
200
229
|
*/
|
|
201
230
|
nocache?: boolean;
|
|
231
|
+
/**
|
|
232
|
+
* If true, ensure the record fields and signature are valid. If false, just
|
|
233
|
+
* return the record.
|
|
234
|
+
*
|
|
235
|
+
* @default true
|
|
236
|
+
*/
|
|
237
|
+
validate?: boolean;
|
|
202
238
|
}
|
|
203
239
|
export interface IPNSResolveResult {
|
|
204
240
|
/**
|
|
205
241
|
* The resolved record
|
|
206
242
|
*/
|
|
207
|
-
record:
|
|
243
|
+
record: IPNSEntry;
|
|
244
|
+
/**
|
|
245
|
+
* The value contained within the IPNS record
|
|
246
|
+
*/
|
|
247
|
+
value: string;
|
|
208
248
|
}
|
|
209
249
|
export interface IPNSPublishResult {
|
|
210
250
|
/**
|
|
211
251
|
* The published record
|
|
212
252
|
*/
|
|
213
|
-
record:
|
|
253
|
+
record: IPNSEntry;
|
|
214
254
|
/**
|
|
215
255
|
* The IPNS name that can be used to resolve this record
|
|
216
256
|
*/
|
|
@@ -274,7 +314,7 @@ export interface IPNS {
|
|
|
274
314
|
*/
|
|
275
315
|
resolve(name: CID | PublicKey | MultihashDigest | string, options?: IPNSResolveOptions): AsyncGenerator<IPNSResolveResult>;
|
|
276
316
|
/**
|
|
277
|
-
* Stop republishing of an IPNS record
|
|
317
|
+
* Stop republishing of an IPNS record.
|
|
278
318
|
*
|
|
279
319
|
* This will delete the last signed IPNS record from the datastore.
|
|
280
320
|
*
|
|
@@ -283,8 +323,6 @@ export interface IPNS {
|
|
|
283
323
|
*/
|
|
284
324
|
unpublish(keyName: string, options?: AbortOptions): Promise<void>;
|
|
285
325
|
}
|
|
286
|
-
export type { IPNSRouting } from './routing/index.ts';
|
|
287
|
-
export type { IPNSRecord } from './records.ts';
|
|
288
326
|
export interface IPNSComponents {
|
|
289
327
|
datastore: Datastore;
|
|
290
328
|
routing: Routing;
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -37,7 +37,6 @@
|
|
|
37
37
|
* import { createHelia } from 'helia'
|
|
38
38
|
* import { ipns } from '@helia/ipns'
|
|
39
39
|
* import { unixfs } from '@helia/unixfs'
|
|
40
|
-
* import { generateKeyPair } from '@libp2p/crypto/keys'
|
|
41
40
|
*
|
|
42
41
|
* const helia = await createHelia()
|
|
43
42
|
* const name = ipns(helia)
|
|
@@ -66,7 +65,6 @@
|
|
|
66
65
|
* import { createHelia } from 'helia'
|
|
67
66
|
* import { ipns } from '@helia/ipns'
|
|
68
67
|
* import { unixfs } from '@helia/unixfs'
|
|
69
|
-
* import { generateKeyPair } from '@libp2p/crypto/keys'
|
|
70
68
|
*
|
|
71
69
|
* const helia = await createHelia()
|
|
72
70
|
* const name = ipns(helia)
|
|
@@ -105,15 +103,13 @@
|
|
|
105
103
|
* may fail to be published with "Insufficient peers" errors.
|
|
106
104
|
*
|
|
107
105
|
* ```TypeScript
|
|
108
|
-
* import { ipns } from '@helia/ipns'
|
|
109
|
-
* import { pubsub } from '@helia/ipns/routing'
|
|
106
|
+
* import { ipns, pubSubIPNSRouting } from '@helia/ipns'
|
|
110
107
|
* import { withLibp2p, libp2pDefaults } from '@helia/libp2p'
|
|
111
108
|
* import { unixfs } from '@helia/unixfs'
|
|
112
|
-
* import { generateKeyPair } from '@libp2p/crypto/keys'
|
|
113
109
|
* import { floodsub } from '@libp2p/floodsub'
|
|
114
110
|
* import { createHelia } from 'helia'
|
|
115
111
|
* import type { Helia } from '@helia/interface'
|
|
116
|
-
* import type { PubSub } from '@helia/ipns
|
|
112
|
+
* import type { PubSub } from '@helia/ipns'
|
|
117
113
|
* import type { DefaultLibp2pServices } from '@helia/libp2p'
|
|
118
114
|
* import type { FloodSub } from '@libp2p/floodsub'
|
|
119
115
|
* import type { Libp2p } from '@libp2p/interface'
|
|
@@ -125,7 +121,7 @@
|
|
|
125
121
|
*
|
|
126
122
|
* const name = ipns(helia, {
|
|
127
123
|
* routers: [
|
|
128
|
-
*
|
|
124
|
+
* pubSubIPNSRouting(helia)
|
|
129
125
|
* ]
|
|
130
126
|
* })
|
|
131
127
|
*
|
|
@@ -146,16 +142,20 @@ import { CID } from 'multiformats/cid';
|
|
|
146
142
|
import { IPNSResolver as IPNSResolverClass } from "./ipns/resolver.js";
|
|
147
143
|
import { IPNS as IPNSClass } from "./ipns.js";
|
|
148
144
|
import { localStore } from "./local-store.js";
|
|
149
|
-
import {
|
|
150
|
-
import {
|
|
145
|
+
import { heliaIPNSRouting } from "./routing/index.js";
|
|
146
|
+
import { localStoreIPNSRouting } from "./routing/local-store.js";
|
|
147
|
+
export * from "./routing/index.js";
|
|
148
|
+
export * from "./pb/ipns.js";
|
|
149
|
+
export { multihashFromIPNSRoutingKey, multihashToIPNSRoutingKey } from "./utils.js";
|
|
150
|
+
export { createIPNSRecord } from "./records.js";
|
|
151
151
|
export function ipns(components, options = {}) {
|
|
152
152
|
return new IPNSClass(components, options);
|
|
153
153
|
}
|
|
154
154
|
export function ipnsResolver(components, options = {}) {
|
|
155
155
|
const store = localStore(components.datastore, components.logger.forComponent('helia:ipns:local-store'));
|
|
156
156
|
const routers = [
|
|
157
|
-
|
|
158
|
-
|
|
157
|
+
localStoreIPNSRouting(store),
|
|
158
|
+
heliaIPNSRouting(components.routing),
|
|
159
159
|
...(options.routers ?? [])
|
|
160
160
|
];
|
|
161
161
|
return new IPNSResolverClass(components, {
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2IG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,YAAY,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAWhE,cAAc,oBAAoB,CAAA;AAClC,cAAc,cAAc,CAAA;AAE5B,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EAC1B,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,gBAAgB,EACjB,MAAM,cAAc,CAAA;AAoPrB,MAAM,UAAU,IAAI,CAAE,UAA0B,EAAE,UAAuB,EAAE;IACzE,OAAO,IAAI,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,YAAY,CAAE,UAAkC,EAAE,UAA+B,EAAE;IACjG,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC,CAAA;IACxG,MAAM,OAAO,GAAG;QACd,qBAAqB,CAAC,KAAK,CAAC;QAC5B,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC;QACpC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;KAC3B,CAAA;IAED,OAAO,IAAI,iBAAiB,CAAC,UAAU,EAAE;QACvC,OAAO;QACP,UAAU,EAAE,KAAK;KAClB,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../../src/ipns/publisher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../../src/ipns/publisher.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACpE,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,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,WAAW,EAAE,CAAA;CACvB;AAED,qBAAa,aAAa;;IACxB,SAAgB,OAAO,EAAE,WAAW,EAAE,CAAA;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEtB,UAAU,EAAE,uBAAuB,EAAE,IAAI,EAAE,iBAAiB;IAMnE,OAAO,CAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyElG,SAAS,CAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAMzE"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { base36 } from 'multiformats/bases/base36';
|
|
2
2
|
import { CustomProgressEvent } from 'progress-events';
|
|
3
|
-
import { DEFAULT_LIFETIME_MS
|
|
3
|
+
import { DEFAULT_LIFETIME_MS } from "../constants.js";
|
|
4
|
+
import { IPNSEntry } from "../pb/ipns.js";
|
|
4
5
|
import { createIPNSRecord } from "../records.js";
|
|
5
|
-
import {
|
|
6
|
+
import { decodeExtensibleData, multihashToIPNSRoutingKey } from "../utils.js";
|
|
6
7
|
export class IPNSPublisher {
|
|
7
8
|
routers;
|
|
8
9
|
localStore;
|
|
@@ -21,29 +22,41 @@ export class IPNSPublisher {
|
|
|
21
22
|
if (await this.localStore.has(routingKey, options)) {
|
|
22
23
|
// if we have published under this key before, increment the sequence number
|
|
23
24
|
const { record } = await this.localStore.get(routingKey, options);
|
|
24
|
-
const existingRecord =
|
|
25
|
-
|
|
25
|
+
const existingRecord = IPNSEntry.decode(record);
|
|
26
|
+
const data = decodeExtensibleData(existingRecord.data);
|
|
27
|
+
sequenceNumber = (data.Sequence ?? 0n) + 1n;
|
|
26
28
|
}
|
|
27
|
-
// convert ttl from milliseconds to nanoseconds as createIPNSRecord expects
|
|
28
|
-
const ttlNs = options.ttl != null ? BigInt(options.ttl) * 1000000n : DEFAULT_TTL_NS;
|
|
29
29
|
const lifetime = options.lifetime ?? DEFAULT_LIFETIME_MS;
|
|
30
|
-
const record = await createIPNSRecord(key, value, sequenceNumber, lifetime, {
|
|
31
|
-
|
|
30
|
+
const record = await createIPNSRecord(key, value, sequenceNumber, lifetime, {
|
|
31
|
+
...options,
|
|
32
|
+
// convert ttl from milliseconds to nanoseconds as createIPNSRecord expects
|
|
33
|
+
ttlNs: options.ttl != null ? BigInt(options.ttl) * 1000000n : undefined
|
|
34
|
+
});
|
|
35
|
+
const marshaledRecord = IPNSEntry.encode(record);
|
|
32
36
|
if (options.offline === true) {
|
|
33
37
|
// only store record locally
|
|
34
|
-
await this.localStore.put(routingKey, marshaledRecord, {
|
|
38
|
+
await this.localStore.put(routingKey, marshaledRecord, {
|
|
39
|
+
...options,
|
|
40
|
+
metadata: {
|
|
41
|
+
keyName,
|
|
42
|
+
lifetime
|
|
43
|
+
}
|
|
44
|
+
});
|
|
35
45
|
}
|
|
36
46
|
else {
|
|
37
47
|
// publish record to routing (including the local store)
|
|
38
48
|
await Promise.all(this.routers.map(async (r) => {
|
|
39
|
-
await r.put(routingKey, marshaledRecord, {
|
|
49
|
+
await r.put(routingKey, marshaledRecord, {
|
|
50
|
+
...options,
|
|
51
|
+
metadata: {
|
|
52
|
+
keyName,
|
|
53
|
+
lifetime
|
|
54
|
+
}
|
|
55
|
+
});
|
|
40
56
|
}));
|
|
41
57
|
}
|
|
42
58
|
return {
|
|
43
|
-
record
|
|
44
|
-
...record,
|
|
45
|
-
publicKey: key.publicKey
|
|
46
|
-
},
|
|
59
|
+
record,
|
|
47
60
|
name: `/ipns/${key.publicKey.toCID().toString(base36)}`,
|
|
48
61
|
publicKey: key.publicKey
|
|
49
62
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../../src/ipns/publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../../src/ipns/publisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAOA,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;CAgHd"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Queue, repeatingTask } from '@libp2p/utils';
|
|
2
|
+
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
2
3
|
import { DEFAULT_REPUBLISH_CONCURRENCY, DEFAULT_REPUBLISH_INTERVAL_MS, DEFAULT_TTL_NS } from "../constants.js";
|
|
4
|
+
import { IPNSEntry } from "../pb/ipns.js";
|
|
3
5
|
import { createIPNSRecord } from "../records.js";
|
|
4
|
-
import {
|
|
5
|
-
import { shouldRepublish } from "../utils.js";
|
|
6
|
+
import { decodeExtensibleData, shouldRepublish } from "../utils.js";
|
|
6
7
|
export class IPNSRepublisher {
|
|
7
8
|
routers;
|
|
8
9
|
localStore;
|
|
@@ -61,19 +62,31 @@ export class IPNSRepublisher {
|
|
|
61
62
|
}
|
|
62
63
|
let ipnsRecord;
|
|
63
64
|
try {
|
|
64
|
-
ipnsRecord =
|
|
65
|
+
ipnsRecord = IPNSEntry.decode(record);
|
|
65
66
|
}
|
|
66
67
|
catch (err) {
|
|
67
|
-
this.log.
|
|
68
|
+
this.log.trace('skipping invalid record %b because could not decode', routingKey);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (ipnsRecord.data == null) {
|
|
72
|
+
this.log.trace('skipping record %b because data was missing', routingKey);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
let data;
|
|
76
|
+
try {
|
|
77
|
+
data = decodeExtensibleData(ipnsRecord.data);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
this.log.trace('skipping record %b because could not decode data', routingKey);
|
|
68
81
|
continue;
|
|
69
82
|
}
|
|
70
83
|
// Only republish records that are within the DHT or record expiry threshold
|
|
71
|
-
if (!shouldRepublish(
|
|
84
|
+
if (!shouldRepublish(created, new Date(uint8ArrayToString(data.Validity)))) {
|
|
72
85
|
this.log.trace('skipping record %b within republish threshold', routingKey);
|
|
73
86
|
continue;
|
|
74
87
|
}
|
|
75
|
-
const sequenceNumber =
|
|
76
|
-
const ttlNs =
|
|
88
|
+
const sequenceNumber = data.Sequence + 1n;
|
|
89
|
+
const ttlNs = data.TTL ?? DEFAULT_TTL_NS;
|
|
77
90
|
let privKey;
|
|
78
91
|
try {
|
|
79
92
|
privKey = await this.keychain.exportKey(metadata.keyName);
|
|
@@ -83,7 +96,7 @@ export class IPNSRepublisher {
|
|
|
83
96
|
continue;
|
|
84
97
|
}
|
|
85
98
|
try {
|
|
86
|
-
const updatedRecord = await createIPNSRecord(privKey,
|
|
99
|
+
const updatedRecord = await createIPNSRecord(privKey, uint8ArrayToString(data.Value), sequenceNumber, metadata.lifetime, {
|
|
87
100
|
...options,
|
|
88
101
|
ttlNs
|
|
89
102
|
});
|
|
@@ -103,7 +116,7 @@ export class IPNSRepublisher {
|
|
|
103
116
|
// Add job to queue to republish the record to all routers
|
|
104
117
|
queue.add(async () => {
|
|
105
118
|
try {
|
|
106
|
-
const marshaledRecord =
|
|
119
|
+
const marshaledRecord = IPNSEntry.encode(record);
|
|
107
120
|
await Promise.all(this.routers.map(r => r.put(routingKey, marshaledRecord, options)));
|
|
108
121
|
}
|
|
109
122
|
catch (err) {
|
|
@@ -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,6BAA6B,EAAE,6BAA6B,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAC9G,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"republisher.js","sourceRoot":"","sources":["../../../src/ipns/republisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACxE,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,kBAAuB,GAAG,cAAc,CAAC,iBAAiB,CAAC;CAoJ5G"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { base36 } from 'multiformats/bases/base36';
|
|
1
2
|
import { DEFAULT_TTL_NS } from "../constants.js";
|
|
2
|
-
import { RecordNotFoundError, RecordsFailedValidationError } from "../errors.js";
|
|
3
|
+
import { InvalidValueError, RecordNotFoundError, RecordsFailedValidationError } from "../errors.js";
|
|
4
|
+
import { IPNSEntry } from "../pb/ipns.js";
|
|
3
5
|
import { ipnsSelector } from "../selector.js";
|
|
4
|
-
import { multihashToIPNSRoutingKey,
|
|
6
|
+
import { multihashToIPNSRoutingKey, normalizeKey, IPNS_STRING_PREFIX, ipnsRecordValueToString, decodeExtensibleData } from "../utils.js";
|
|
5
7
|
import { ipnsValidator } from "../validator.js";
|
|
6
8
|
export class IPNSResolver {
|
|
7
9
|
routers;
|
|
@@ -19,14 +21,26 @@ export class IPNSResolver {
|
|
|
19
21
|
while (true) {
|
|
20
22
|
const routingKey = multihashToIPNSRoutingKey(digest);
|
|
21
23
|
const record = await this.#findIpnsRecord(routingKey, options);
|
|
24
|
+
let value = '';
|
|
25
|
+
if (record.data != null) {
|
|
26
|
+
const data = decodeExtensibleData(record.data);
|
|
27
|
+
value = ipnsRecordValueToString(data.Value);
|
|
28
|
+
}
|
|
29
|
+
else if (record.value != null) {
|
|
30
|
+
value = ipnsRecordValueToString(record.value);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
throw new InvalidValueError(`Record for key ${base36.encode(digest.bytes)} contained no value`);
|
|
34
|
+
}
|
|
22
35
|
yield {
|
|
23
|
-
record
|
|
36
|
+
record,
|
|
37
|
+
value
|
|
24
38
|
};
|
|
25
|
-
if (!
|
|
39
|
+
if (!value.startsWith(IPNS_STRING_PREFIX)) {
|
|
26
40
|
// not a recursive record
|
|
27
41
|
break;
|
|
28
42
|
}
|
|
29
|
-
({ digest } = normalizeKey(
|
|
43
|
+
({ digest } = normalizeKey(value));
|
|
30
44
|
}
|
|
31
45
|
}
|
|
32
46
|
async #findIpnsRecord(routingKey, options = {}) {
|
|
@@ -39,15 +53,21 @@ export class IPNSResolver {
|
|
|
39
53
|
// check the local cache first
|
|
40
54
|
const { record: marshaledIPNSRecord, created } = await this.localStore.get(routingKey, options);
|
|
41
55
|
this.log('record retrieved from cache');
|
|
42
|
-
// unmarshal the record
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
56
|
+
// unmarshal and validate the record
|
|
57
|
+
let ipnsRecord;
|
|
58
|
+
if (options.validate === false) {
|
|
59
|
+
ipnsRecord = IPNSEntry.decode(marshaledIPNSRecord);
|
|
60
|
+
this.log('skipped validation of record');
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
ipnsRecord = await ipnsValidator(routingKey, marshaledIPNSRecord, this.keychain, options);
|
|
64
|
+
this.log('record was valid');
|
|
65
|
+
}
|
|
47
66
|
// check the TTL
|
|
67
|
+
const data = decodeExtensibleData(ipnsRecord.data);
|
|
48
68
|
// IPNS TTL is in nanoseconds, convert to milliseconds, default to one
|
|
49
69
|
// hour
|
|
50
|
-
const ttlMs = Number((
|
|
70
|
+
const ttlMs = Number((data.TTL ?? DEFAULT_TTL_NS) / 1000000n);
|
|
51
71
|
const ttlExpires = created.getTime() + ttlMs;
|
|
52
72
|
if (ttlExpires > Date.now()) {
|
|
53
73
|
// the TTL has not yet expired, return the cached record
|
|
@@ -94,11 +114,13 @@ export class IPNSResolver {
|
|
|
94
114
|
return;
|
|
95
115
|
}
|
|
96
116
|
try {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
117
|
+
let record;
|
|
118
|
+
if (options.validate === false) {
|
|
119
|
+
record = IPNSEntry.decode(marshaledIPNSRecord);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
record = await ipnsValidator(routingKey, marshaledIPNSRecord, this.keychain, options);
|
|
123
|
+
}
|
|
102
124
|
records.push(record);
|
|
103
125
|
}
|
|
104
126
|
catch (err) {
|
|
@@ -114,7 +136,7 @@ export class IPNSResolver {
|
|
|
114
136
|
throw new RecordNotFoundError('Could not find record for routing key');
|
|
115
137
|
}
|
|
116
138
|
const record = records[ipnsSelector(routingKey, records)];
|
|
117
|
-
await this.localStore.put(routingKey, record
|
|
139
|
+
await this.localStore.put(routingKey, IPNSEntry.encode(record), options);
|
|
118
140
|
return record;
|
|
119
141
|
}
|
|
120
142
|
}
|