@helia/ipns 9.0.0 → 9.1.0-3eb6f3a7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/src/ipns.js CHANGED
@@ -1,52 +1,46 @@
1
- import { generateKeyPair } from '@libp2p/crypto/keys';
2
- import { NotFoundError, NotStartedError, isPeerId, isPublicKey } from '@libp2p/interface';
3
- import { Queue, repeatingTask } from '@libp2p/utils';
4
- import { createIPNSRecord, marshalIPNSRecord, multihashToIPNSRoutingKey, unmarshalIPNSRecord } from 'ipns';
5
- import { ipnsSelector } from 'ipns/selector';
6
- import { ipnsValidator } from 'ipns/validator';
7
- import { base36 } from 'multiformats/bases/base36';
8
- import { base58btc } from 'multiformats/bases/base58';
9
1
  import { CID } from 'multiformats/cid';
10
- import * as Digest from 'multiformats/hashes/digest';
11
- import { CustomProgressEvent } from 'progress-events';
12
- import { DEFAULT_LIFETIME_MS, DEFAULT_REPUBLISH_CONCURRENCY, DEFAULT_REPUBLISH_INTERVAL_MS, DEFAULT_TTL_NS } from "./constants.js";
13
- import { InvalidValueError, RecordsFailedValidationError, UnsupportedMultibasePrefixError, UnsupportedMultihashCodecError } from './errors.js';
2
+ import { IPNSPublisher } from "./ipns/publisher.js";
3
+ import { IPNSRepublisher } from "./ipns/republisher.js";
4
+ import { IPNSResolver } from "./ipns/resolver.js";
14
5
  import { localStore } from './local-store.js';
15
6
  import { helia } from './routing/helia.js';
16
7
  import { localStoreRouting } from "./routing/local-store.js";
17
- import { isCodec, IDENTITY_CODEC, SHA2_256_CODEC, shouldRepublish, isLibp2pCID } from './utils.js';
18
- const bases = {
19
- [base36.prefix]: base36,
20
- [base58btc.prefix]: base58btc
21
- };
22
8
  export class IPNS {
23
9
  routers;
10
+ publisher;
11
+ republisher;
12
+ resolver;
24
13
  localStore;
25
- republishTask;
26
- log;
27
- keychain;
28
- started = false;
29
- republishConcurrency;
14
+ started;
30
15
  constructor(components, init = {}) {
31
- this.log = components.logger.forComponent('helia:ipns');
32
16
  this.localStore = localStore(components.datastore, components.logger.forComponent('helia:ipns:local-store'));
33
- this.keychain = components.libp2p.services.keychain;
34
- this.republishConcurrency = init.republishConcurrency || DEFAULT_REPUBLISH_CONCURRENCY;
35
17
  this.started = components.libp2p.status === 'started';
36
18
  this.routers = [
37
19
  localStoreRouting(this.localStore),
38
20
  helia(components.routing),
39
21
  ...(init.routers ?? [])
40
22
  ];
23
+ this.publisher = new IPNSPublisher(components, {
24
+ ...init,
25
+ routers: this.routers,
26
+ localStore: this.localStore
27
+ });
28
+ this.republisher = new IPNSRepublisher(components, {
29
+ ...init,
30
+ routers: this.routers,
31
+ localStore: this.localStore
32
+ });
33
+ this.resolver = new IPNSResolver(components, {
34
+ ...init,
35
+ routers: this.routers,
36
+ localStore: this.localStore
37
+ });
41
38
  // start republishing on Helia start
42
39
  components.events.addEventListener('start', this.start.bind(this));
43
40
  // stop republishing on Helia stop
44
41
  components.events.addEventListener('stop', this.stop.bind(this));
45
- this.republishTask = repeatingTask(this.#republish.bind(this), init.republishInterval ?? DEFAULT_REPUBLISH_INTERVAL_MS, {
46
- runImmediately: true
47
- });
48
42
  if (this.started) {
49
- this.republishTask.start();
43
+ this.republisher.start();
50
44
  }
51
45
  }
52
46
  start() {
@@ -54,286 +48,23 @@ export class IPNS {
54
48
  return;
55
49
  }
56
50
  this.started = true;
57
- this.republishTask.start();
51
+ this.republisher.start();
58
52
  }
59
53
  stop() {
60
54
  if (!this.started) {
61
55
  return;
62
56
  }
63
57
  this.started = false;
64
- this.republishTask.stop();
65
- }
66
- #throwIfStopped() {
67
- if (!this.started) {
68
- throw new NotStartedError('Helia is stopped, cannot perform IPNS operations');
69
- }
58
+ this.republisher.stop();
70
59
  }
71
60
  async publish(keyName, value, options = {}) {
72
- this.#throwIfStopped();
73
- try {
74
- const privKey = await this.#loadOrCreateKey(keyName);
75
- let sequenceNumber = 1n;
76
- const routingKey = multihashToIPNSRoutingKey(privKey.publicKey.toMultihash());
77
- if (await this.localStore.has(routingKey, options)) {
78
- // if we have published under this key before, increment the sequence number
79
- const { record } = await this.localStore.get(routingKey, options);
80
- const existingRecord = unmarshalIPNSRecord(record);
81
- sequenceNumber = existingRecord.sequence + 1n;
82
- }
83
- if (isPeerId(value)) {
84
- value = value.toCID();
85
- }
86
- // convert ttl from milliseconds to nanoseconds as createIPNSRecord expects
87
- const ttlNs = options.ttl != null ? BigInt(options.ttl) * 1000000n : DEFAULT_TTL_NS;
88
- const lifetime = options.lifetime ?? DEFAULT_LIFETIME_MS;
89
- const record = await createIPNSRecord(privKey, value, sequenceNumber, lifetime, { ...options, ttlNs });
90
- const marshaledRecord = marshalIPNSRecord(record);
91
- if (options.offline === true) {
92
- // only store record locally
93
- await this.localStore.put(routingKey, marshaledRecord, { ...options, metadata: { keyName, lifetime } });
94
- }
95
- else {
96
- // publish record to routing (including the local store)
97
- await Promise.all(this.routers.map(async (r) => {
98
- await r.put(routingKey, marshaledRecord, { ...options, metadata: { keyName, lifetime } });
99
- }));
100
- }
101
- return {
102
- record,
103
- publicKey: privKey.publicKey
104
- };
105
- }
106
- catch (err) {
107
- options.onProgress?.(new CustomProgressEvent('ipns:publish:error', err));
108
- throw err;
109
- }
61
+ return this.publisher.publish(keyName, value, options);
110
62
  }
111
63
  async resolve(key, options = {}) {
112
- this.#throwIfStopped();
113
- const digest = isPublicKey(key) || isPeerId(key) ? key.toMultihash() : isLibp2pCID(key) ? key.multihash : key;
114
- const routingKey = multihashToIPNSRoutingKey(digest);
115
- const record = await this.#findIpnsRecord(routingKey, options);
116
- return {
117
- ...(await this.#resolve(record.value, options)),
118
- record
119
- };
120
- }
121
- async #loadOrCreateKey(keyName) {
122
- try {
123
- return await this.keychain.exportKey(keyName);
124
- }
125
- catch (err) {
126
- // If no named key found in keychain, generate and import
127
- const privKey = await generateKeyPair('Ed25519');
128
- await this.keychain.importKey(keyName, privKey);
129
- return privKey;
130
- }
131
- }
132
- async #republish(options = {}) {
133
- if (!this.started) {
134
- return;
135
- }
136
- this.log('starting ipns republish records loop');
137
- const queue = new Queue({
138
- concurrency: this.republishConcurrency
139
- });
140
- try {
141
- const recordsToRepublish = [];
142
- // Find all records using the localStore.list method
143
- for await (const { routingKey, record, metadata, created } of this.localStore.list(options)) {
144
- if (metadata == null) {
145
- // Skip if no metadata is found from before we started
146
- // storing metadata or for records republished without a key
147
- this.log(`no metadata found for record ${routingKey.toString()}, skipping`);
148
- continue;
149
- }
150
- let ipnsRecord;
151
- try {
152
- ipnsRecord = unmarshalIPNSRecord(record);
153
- }
154
- catch (err) {
155
- this.log.error('error unmarshaling record - %e', err);
156
- continue;
157
- }
158
- // Only republish records that are within the DHT or record expiry threshold
159
- if (!shouldRepublish(ipnsRecord, created)) {
160
- this.log.trace(`skipping record ${routingKey.toString()}within republish threshold`);
161
- continue;
162
- }
163
- const sequenceNumber = ipnsRecord.sequence + 1n;
164
- const ttlNs = ipnsRecord.ttl ?? DEFAULT_TTL_NS;
165
- let privKey;
166
- try {
167
- privKey = await this.keychain.exportKey(metadata.keyName);
168
- }
169
- catch (err) {
170
- this.log.error(`missing key ${metadata.keyName}, skipping republishing record`, err);
171
- continue;
172
- }
173
- try {
174
- const updatedRecord = await createIPNSRecord(privKey, ipnsRecord.value, sequenceNumber, metadata.lifetime, { ...options, ttlNs });
175
- recordsToRepublish.push({ routingKey, record: updatedRecord });
176
- }
177
- catch (err) {
178
- this.log.error(`error creating updated IPNS record for ${routingKey.toString()}`, err);
179
- continue;
180
- }
181
- }
182
- this.log(`found ${recordsToRepublish.length} records to republish`);
183
- // Republish each record
184
- for (const { routingKey, record } of recordsToRepublish) {
185
- // Add job to queue to republish the record to all routers
186
- queue.add(async () => {
187
- try {
188
- const marshaledRecord = marshalIPNSRecord(record);
189
- await Promise.all(this.routers.map(r => r.put(routingKey, marshaledRecord, options)));
190
- }
191
- catch (err) {
192
- this.log.error('error republishing record - %e', err);
193
- }
194
- }, options);
195
- }
196
- }
197
- catch (err) {
198
- this.log.error('error during republish - %e', err);
199
- }
200
- await queue.onIdle(options); // Wait for all jobs to complete
64
+ return this.resolver.resolve(key, options);
201
65
  }
202
66
  async unpublish(keyName, options) {
203
- const { publicKey } = await this.keychain.exportKey(keyName);
204
- const digest = publicKey.toMultihash();
205
- const routingKey = multihashToIPNSRoutingKey(digest);
206
- await this.localStore.delete(routingKey, options);
207
- }
208
- async #resolve(ipfsPath, options = {}) {
209
- const parts = ipfsPath.split('/');
210
- try {
211
- const scheme = parts[1];
212
- if (scheme === 'ipns') {
213
- const str = parts[2];
214
- const prefix = str.substring(0, 1);
215
- let buf;
216
- if (prefix === '1' || prefix === 'Q') {
217
- buf = base58btc.decode(`z${str}`);
218
- }
219
- else if (bases[prefix] != null) {
220
- buf = bases[prefix].decode(str);
221
- }
222
- else {
223
- throw new UnsupportedMultibasePrefixError(`Unsupported multibase prefix "${prefix}"`);
224
- }
225
- let digest;
226
- try {
227
- digest = Digest.decode(buf);
228
- }
229
- catch {
230
- digest = CID.decode(buf).multihash;
231
- }
232
- if (!isCodec(digest, IDENTITY_CODEC) && !isCodec(digest, SHA2_256_CODEC)) {
233
- throw new UnsupportedMultihashCodecError(`Unsupported multihash codec "${digest.code}"`);
234
- }
235
- const { cid } = await this.resolve(digest, options);
236
- const path = parts.slice(3).join('/');
237
- return {
238
- cid,
239
- path
240
- };
241
- }
242
- else if (scheme === 'ipfs') {
243
- const cid = CID.parse(parts[2]);
244
- const path = parts.slice(3).join('/');
245
- return {
246
- cid,
247
- path
248
- };
249
- }
250
- }
251
- catch (err) {
252
- this.log.error('error parsing ipfs path - %e', err);
253
- }
254
- this.log.error('invalid ipfs path %s', ipfsPath);
255
- throw new InvalidValueError('Invalid value');
256
- }
257
- async #findIpnsRecord(routingKey, options = {}) {
258
- const records = [];
259
- const cached = await this.localStore.has(routingKey, options);
260
- if (cached) {
261
- this.log('record is present in the cache');
262
- if (options.nocache !== true) {
263
- try {
264
- // check the local cache first
265
- const { record, created } = await this.localStore.get(routingKey, options);
266
- this.log('record retrieved from cache');
267
- // validate the record
268
- await ipnsValidator(routingKey, record);
269
- this.log('record was valid');
270
- // check the TTL
271
- const ipnsRecord = unmarshalIPNSRecord(record);
272
- // IPNS TTL is in nanoseconds, convert to milliseconds, default to one
273
- // hour
274
- const ttlMs = Number((ipnsRecord.ttl ?? DEFAULT_TTL_NS) / 1000000n);
275
- const ttlExpires = created.getTime() + ttlMs;
276
- if (ttlExpires > Date.now()) {
277
- // the TTL has not yet expired, return the cached record
278
- this.log('record TTL was valid');
279
- return ipnsRecord;
280
- }
281
- if (options.offline === true) {
282
- // the TTL has expired but we are skipping the routing search
283
- this.log('record TTL has been reached but we are resolving offline-only, returning record');
284
- return ipnsRecord;
285
- }
286
- this.log('record TTL has been reached, searching routing for updates');
287
- // add the local record to our list of resolved record, and also
288
- // search the routing for updates - the most up to date record will be
289
- // returned
290
- records.push(record);
291
- }
292
- catch (err) {
293
- this.log('cached record was invalid - %e', err);
294
- await this.localStore.delete(routingKey, options);
295
- }
296
- }
297
- else {
298
- this.log('ignoring local cache due to nocache=true option');
299
- }
300
- }
301
- if (options.offline === true) {
302
- throw new NotFoundError('Record was not present in the cache or has expired');
303
- }
304
- this.log('did not have record locally');
305
- let foundInvalid = 0;
306
- await Promise.all(this.routers.map(async (router) => {
307
- let record;
308
- try {
309
- record = await router.get(routingKey, {
310
- ...options,
311
- validate: false
312
- });
313
- }
314
- catch (err) {
315
- this.log.error('error finding IPNS record - %e', err);
316
- return;
317
- }
318
- try {
319
- await ipnsValidator(routingKey, record);
320
- records.push(record);
321
- }
322
- catch (err) {
323
- // we found a record, but the validator rejected it
324
- foundInvalid++;
325
- this.log.error('error finding IPNS record - %e', err);
326
- }
327
- }));
328
- if (records.length === 0) {
329
- if (foundInvalid > 0) {
330
- throw new RecordsFailedValidationError(`${foundInvalid > 1 ? `${foundInvalid} records` : 'Record'} found for routing key ${foundInvalid > 1 ? 'were' : 'was'} invalid`);
331
- }
332
- throw new NotFoundError('Could not find record for routing key');
333
- }
334
- const record = records[ipnsSelector(routingKey, records)];
335
- await this.localStore.put(routingKey, record, options);
336
- return unmarshalIPNSRecord(record);
67
+ return this.publisher.unpublish(keyName, options);
337
68
  }
338
69
  }
339
70
  //# sourceMappingURL=ipns.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ipns.js","sourceRoot":"","sources":["../../src/ipns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACzF,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAA;AAC1G,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,MAAM,MAAM,4BAA4B,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAClI,OAAO,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAA;AAC9I,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAWlG,MAAM,KAAK,GAA6C;IACtD,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM;IACvB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS;CAC9B,CAAA;AAED,MAAM,OAAO,IAAI;IACC,OAAO,CAAe;IACrB,UAAU,CAAY;IACtB,aAAa,CAAe;IAC5B,GAAG,CAAQ;IACX,QAAQ,CAAU;IAC3B,OAAO,GAAY,KAAK,CAAA;IACf,oBAAoB,CAAQ;IAE7C,YAAa,UAA0B,EAAE,OAAoB,EAAE;QAC7D,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;QACvD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC,CAAA;QAC5G,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAA;QACnD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,IAAI,6BAA6B,CAAA;QACtF,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAA;QAErD,IAAI,CAAC,OAAO,GAAG;YACb,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;YAClC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SACxB,CAAA;QAED,oCAAoC;QACpC,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAClE,kCAAkC;QAClC,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAEhE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,iBAAiB,IAAI,6BAA6B,EAAE;YACtH,cAAc,EAAE,IAAI;SACrB,CAAC,CAAA;QAEF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAA;QAC5B,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAA;IAC5B,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAA;IAC3B,CAAC;IAED,eAAe;QACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,eAAe,CAAC,kDAAkD,CAAC,CAAA;QAC/E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAE,OAAe,EAAE,KAAuE,EAAE,UAA0B,EAAE;QACnI,IAAI,CAAC,eAAe,EAAE,CAAA;QAEtB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;YACpD,IAAI,cAAc,GAAG,EAAE,CAAA;YACvB,MAAM,UAAU,GAAG,yBAAyB,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;YAE7E,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;gBACnD,4EAA4E;gBAC5E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;gBACjE,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAA;gBAClD,cAAc,GAAG,cAAc,CAAC,QAAQ,GAAG,EAAE,CAAA;YAC/C,CAAC;YAED,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpB,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;YACvB,CAAC;YAED,2EAA2E;YAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,QAAU,CAAC,CAAC,CAAC,cAAc,CAAA;YACrF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,mBAAmB,CAAA;YACxD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;YACtG,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;YAEjD,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC7B,4BAA4B;gBAC5B,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;YACzG,CAAC;iBAAM,CAAC;gBACN,wDAAwD;gBACxD,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE;oBAC3C,MAAM,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;gBAC3F,CAAC,CAAC,CAAC,CAAA;YACL,CAAC;YAED,OAAO;gBACL,MAAM;gBACN,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAA;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAQ,oBAAoB,EAAE,GAAG,CAAC,CAAC,CAAA;YAC/E,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAE,GAA2F,EAAE,UAA0B,EAAE;QACtI,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAA;QAC7G,MAAM,UAAU,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAA;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QAE9D,OAAO;YACL,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM;SACP,CAAA;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAE,OAAe;QACrC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAC/C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,yDAAyD;YACzD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAA;YAChD,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC/C,OAAO,OAAO,CAAA;QAChB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAE,UAAwB,EAAE;QAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;QAEhD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACtB,WAAW,EAAE,IAAI,CAAC,oBAAoB;SACvC,CAAC,CAAA;QAEF,IAAI,CAAC;YACH,MAAM,kBAAkB,GAA0D,EAAE,CAAA;YAEpF,oDAAoD;YACpD,IAAI,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5F,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;oBACrB,sDAAsD;oBACtD,4DAA4D;oBAC5D,IAAI,CAAC,GAAG,CAAC,gCAAgC,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;oBAC3E,SAAQ;gBACV,CAAC;gBACD,IAAI,UAAsB,CAAA;gBAC1B,IAAI,CAAC;oBACH,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAA;gBAC1C,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAA;oBACrD,SAAQ;gBACV,CAAC;gBAED,4EAA4E;gBAC5E,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC1C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,UAAU,CAAC,QAAQ,EAAE,4BAA4B,CAAC,CAAA;oBACpF,SAAQ;gBACV,CAAC;gBACD,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,GAAG,EAAE,CAAA;gBAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,IAAI,cAAc,CAAA;gBAC9C,IAAI,OAAmB,CAAA;gBAEvB,IAAI,CAAC;oBACH,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;gBAC3D,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,QAAQ,CAAC,OAAO,gCAAgC,EAAE,GAAG,CAAC,CAAA;oBACpF,SAAQ;gBACV,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;oBACjI,kBAAkB,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAA;gBAChE,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,0CAA0C,UAAU,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;oBACtF,SAAQ;gBACV,CAAC;YACH,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,SAAS,kBAAkB,CAAC,MAAM,uBAAuB,CAAC,CAAA;YAEnE,wBAAwB;YACxB,KAAK,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,kBAAkB,EAAE,CAAC;gBACxD,0DAA0D;gBAC1D,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;oBACnB,IAAI,CAAC;wBACH,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;wBACjD,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,CACnE,CAAA;oBACH,CAAC;oBAAC,OAAO,GAAQ,EAAE,CAAC;wBAClB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAA;oBACvD,CAAC;gBACH,CAAC,EAAE,OAAO,CAAC,CAAA;YACb,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAA;QACpD,CAAC;QAED,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA,CAAC,gCAAgC;IAC9D,CAAC;IAED,KAAK,CAAC,SAAS,CAAE,OAAe,EAAE,OAAsB;QACtD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAC5D,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,CAAA;QACtC,MAAM,UAAU,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAA;QACpD,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IACnD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAE,QAAgB,EAAE,UAA0B,EAAE;QAC5D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACjC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YAEvB,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;gBACpB,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAClC,IAAI,GAA2B,CAAA;gBAE/B,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;oBACrC,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC,CAAA;gBACnC,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;oBACjC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBACjC,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,+BAA+B,CAAC,iCAAiC,MAAM,GAAG,CAAC,CAAA;gBACvF,CAAC;gBAED,IAAI,MAA+B,CAAA;gBAEnC,IAAI,CAAC;oBACH,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAC7B,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAA;gBACpC,CAAC;gBAED,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC;oBACzE,MAAM,IAAI,8BAA8B,CAAC,gCAAgC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAA;gBAC1F,CAAC;gBAED,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBACnD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACrC,OAAO;oBACL,GAAG;oBACH,IAAI;iBACL,CAAA;YACH,CAAC;iBAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACrC,OAAO;oBACL,GAAG;oBACH,IAAI;iBACL,CAAA;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAA;QACrD,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAA;QAChD,MAAM,IAAI,iBAAiB,CAAC,eAAe,CAAC,CAAA;IAC9C,CAAC;IAED,KAAK,CAAC,eAAe,CAAE,UAAsB,EAAE,UAA0B,EAAE;QACzE,MAAM,OAAO,GAAiB,EAAE,CAAA;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QAE7D,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;YAE1C,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBACH,8BAA8B;oBAC9B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;oBAE1E,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;oBAEvC,sBAAsB;oBACtB,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;oBAEvC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;oBAE5B,gBAAgB;oBAChB,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAA;oBAE9C,sEAAsE;oBACtE,OAAO;oBACP,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,QAAU,CAAC,CAAA;oBACrE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,KAAK,CAAA;oBAE5C,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;wBAC5B,wDAAwD;wBACxD,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;wBAChC,OAAO,UAAU,CAAA;oBACnB,CAAC;oBAED,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;wBAC7B,6DAA6D;wBAC7D,IAAI,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAA;wBAC3F,OAAO,UAAU,CAAA;oBACnB,CAAC;oBAED,IAAI,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAA;oBAEtE,gEAAgE;oBAChE,sEAAsE;oBACtE,WAAW;oBACX,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBACtB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,GAAG,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAA;oBAC/C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;gBACnD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;YAC7D,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC7B,MAAM,IAAI,aAAa,CAAC,oDAAoD,CAAC,CAAA;QAC/E,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;QAEvC,IAAI,YAAY,GAAG,CAAC,CAAA;QAEpB,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAChC,IAAI,MAAkB,CAAA;YAEtB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE;oBACpC,GAAG,OAAO;oBACV,QAAQ,EAAE,KAAK;iBAChB,CAAC,CAAA;YACJ,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAA;gBAErD,OAAM;YACR,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;gBAEvC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACtB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,mDAAmD;gBACnD,YAAY,EAAE,CAAA;gBACd,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAA;YACvD,CAAC;QACH,CAAC,CAAC,CACH,CAAA;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,4BAA4B,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,UAAU,CAAC,CAAC,CAAC,QAAQ,0BAA0B,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAA;YACzK,CAAC;YAED,MAAM,IAAI,aAAa,CAAC,uCAAuC,CAAC,CAAA;QAClE,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAA;QAEzD,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QAEtD,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAA;IACpC,CAAC;CACF"}
1
+ {"version":3,"file":"ipns.js","sourceRoot":"","sources":["../../src/ipns.ts"],"names":[],"mappings":"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"}
@@ -22,7 +22,7 @@ export interface IPNSRouting {
22
22
  export type { DatastoreProgressEvents };
23
23
  export type { HeliaRoutingProgressEvents };
24
24
  export type { PubSubProgressEvents };
25
- export type IPNSRoutingEvents = DatastoreProgressEvents | HeliaRoutingProgressEvents | PubSubProgressEvents;
25
+ export type IPNSRoutingProgressEvents = DatastoreProgressEvents | HeliaRoutingProgressEvents | PubSubProgressEvents;
26
26
  export { helia } from './helia.js';
27
27
  export { pubsub } from './pubsub.js';
28
28
  export type { PubsubRoutingComponents, PubSub, Message, PublishResult, PubSubEvents } from './pubsub.js';
@@ -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,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,iBAAiB,GAC3B,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
+ {"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@helia/ipns",
3
- "version": "9.0.0",
3
+ "version": "9.1.0-3eb6f3a7",
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",
@@ -73,7 +73,7 @@
73
73
  "test:electron-main": "aegir test -t electron-main"
74
74
  },
75
75
  "dependencies": {
76
- "@helia/interface": "^6.0.0",
76
+ "@helia/interface": "6.0.0-3eb6f3a7",
77
77
  "@libp2p/crypto": "^5.1.7",
78
78
  "@libp2p/interface": "^3.0.2",
79
79
  "@libp2p/kad-dht": "^16.0.5",
package/src/index.ts CHANGED
@@ -176,8 +176,13 @@
176
176
 
177
177
  import { ipnsValidator } from 'ipns/validator'
178
178
  import { CID } from 'multiformats/cid'
179
+ import { IPNSResolver as IPNSResolverClass } from './ipns/resolver.js'
179
180
  import { IPNS as IPNSClass } from './ipns.js'
180
- import type { IPNSRouting, IPNSRoutingEvents } from './routing/index.js'
181
+ import { localStore } from './local-store.ts'
182
+ import { helia } from './routing/index.js'
183
+ import { localStoreRouting } from './routing/local-store.ts'
184
+ import type { IPNSResolverComponents } from './ipns/resolver.js'
185
+ import type { IPNSRouting, IPNSRoutingProgressEvents } from './routing/index.js'
181
186
  import type { Routing, HeliaEvents } from '@helia/interface'
182
187
  import type { AbortOptions, ComponentLogger, Libp2p, PeerId, PublicKey, TypedEventEmitter } from '@libp2p/interface'
183
188
  import type { Keychain } from '@libp2p/keychain'
@@ -202,7 +207,7 @@ export type DatastoreProgressEvents =
202
207
  ProgressEvent<'ipns:routing:datastore:list'> |
203
208
  ProgressEvent<'ipns:routing:datastore:error', Error>
204
209
 
205
- export interface PublishOptions extends AbortOptions, ProgressOptions<PublishProgressEvents | IPNSRoutingEvents> {
210
+ export interface PublishOptions extends AbortOptions, ProgressOptions<PublishProgressEvents | IPNSRoutingProgressEvents> {
206
211
  /**
207
212
  * Time duration of the signature validity in ms (default: 48hrs)
208
213
  */
@@ -230,7 +235,7 @@ export interface IPNSRecordMetadata {
230
235
  lifetime: number
231
236
  }
232
237
 
233
- export interface ResolveOptions extends AbortOptions, ProgressOptions<ResolveProgressEvents | IPNSRoutingEvents> {
238
+ export interface ResolveOptions extends AbortOptions, ProgressOptions<ResolveProgressEvents | IPNSRoutingProgressEvents> {
234
239
  /**
235
240
  * Do not query the network for the IPNS record
236
241
  *
@@ -254,10 +259,8 @@ export interface ResolveResult {
254
259
 
255
260
  /**
256
261
  * Any path component that was part of the resolved record
257
- *
258
- * @default ""
259
262
  */
260
- path: string
263
+ path?: string
261
264
  }
262
265
 
263
266
  export interface IPNSResolveResult extends ResolveResult {
@@ -279,6 +282,17 @@ export interface IPNSPublishResult {
279
282
  publicKey: PublicKey
280
283
  }
281
284
 
285
+ export interface IPNSResolver {
286
+ /**
287
+ * Accepts a libp2p public key, a CID with the libp2p-key codec and either the
288
+ * identity hash (for Ed25519 and secp256k1 public keys) or a SHA256 hash (for
289
+ * RSA public keys), or the multihash of a libp2p-key encoded CID, or a
290
+ * Ed25519, secp256k1 or RSA PeerId and recursively resolves the IPNS record
291
+ * corresponding to that key until a value is found.
292
+ */
293
+ resolve(key: CID<unknown, 0x72, 0x00 | 0x12, 1> | PublicKey | MultihashDigest<0x00 | 0x12> | PeerId, options?: ResolveOptions): Promise<IPNSResolveResult>
294
+ }
295
+
282
296
  export interface IPNS {
283
297
  /**
284
298
  * Configured routing subsystems used to publish/resolve IPNS names
@@ -370,9 +384,30 @@ export interface IPNSOptions {
370
384
  republishConcurrency?: number
371
385
  }
372
386
 
387
+ export interface IPNSResolverOptions {
388
+ /**
389
+ * Different routing systems for IPNS publishing/resolving
390
+ */
391
+ routers?: IPNSRouting[]
392
+ }
393
+
373
394
  export function ipns (components: IPNSComponents, options: IPNSOptions = {}): IPNS {
374
395
  return new IPNSClass(components, options)
375
396
  }
376
397
 
377
- export { ipnsValidator, type IPNSRoutingEvents }
398
+ export function ipnsResolver (components: IPNSResolverComponents, options: IPNSResolverOptions = {}): IPNSResolver {
399
+ const store = localStore(components.datastore, components.logger.forComponent('helia:ipns:local-store'))
400
+ const routers = [
401
+ localStoreRouting(store),
402
+ helia(components.routing),
403
+ ...(options.routers ?? [])
404
+ ]
405
+
406
+ return new IPNSResolverClass(components, {
407
+ routers,
408
+ localStore: store
409
+ })
410
+ }
411
+
412
+ export { ipnsValidator, type IPNSRoutingProgressEvents }
378
413
  export { ipnsSelector } from 'ipns/selector'
@@ -0,0 +1,97 @@
1
+ import { generateKeyPair } from '@libp2p/crypto/keys'
2
+ import { isPeerId } from '@libp2p/interface'
3
+ import { createIPNSRecord, marshalIPNSRecord, multihashToIPNSRoutingKey, unmarshalIPNSRecord } from 'ipns'
4
+ import { CID } from 'multiformats/cid'
5
+ import { CustomProgressEvent } from 'progress-events'
6
+ import { DEFAULT_LIFETIME_MS, DEFAULT_TTL_NS } from '../constants.ts'
7
+ import type { IPNSPublishResult, PublishOptions } from '../index.js'
8
+ import type { LocalStore } from '../local-store.js'
9
+ import type { IPNSRouting } from '../routing/index.js'
10
+ import type { AbortOptions, ComponentLogger, Libp2p, PeerId, PrivateKey, PublicKey } from '@libp2p/interface'
11
+ import type { Keychain } from '@libp2p/keychain'
12
+ import type { Datastore } from 'interface-datastore'
13
+ import type { MultihashDigest } from 'multiformats/hashes/interface'
14
+
15
+ export interface IPNSPublisherComponents {
16
+ datastore: Datastore
17
+ logger: ComponentLogger
18
+ libp2p: Libp2p<{ keychain: Keychain }>
19
+ }
20
+
21
+ export interface IPNSPublisherInit {
22
+ localStore: LocalStore
23
+ routers: IPNSRouting[]
24
+ }
25
+
26
+ export class IPNSPublisher {
27
+ public readonly routers: IPNSRouting[]
28
+ private readonly localStore: LocalStore
29
+ private readonly keychain: Keychain
30
+
31
+ constructor (components: IPNSPublisherComponents, init: IPNSPublisherInit) {
32
+ this.keychain = components.libp2p.services.keychain
33
+ this.localStore = init.localStore
34
+ this.routers = init.routers
35
+ }
36
+
37
+ async publish (keyName: string, value: CID | PublicKey | MultihashDigest<0x00 | 0x12> | PeerId | string, options: PublishOptions = {}): Promise<IPNSPublishResult> {
38
+ try {
39
+ const privKey = await this.#loadOrCreateKey(keyName)
40
+ let sequenceNumber = 1n
41
+ const routingKey = multihashToIPNSRoutingKey(privKey.publicKey.toMultihash())
42
+
43
+ if (await this.localStore.has(routingKey, options)) {
44
+ // if we have published under this key before, increment the sequence number
45
+ const { record } = await this.localStore.get(routingKey, options)
46
+ const existingRecord = unmarshalIPNSRecord(record)
47
+ sequenceNumber = existingRecord.sequence + 1n
48
+ }
49
+
50
+ if (isPeerId(value)) {
51
+ value = value.toCID()
52
+ }
53
+
54
+ // convert ttl from milliseconds to nanoseconds as createIPNSRecord expects
55
+ const ttlNs = options.ttl != null ? BigInt(options.ttl) * 1_000_000n : DEFAULT_TTL_NS
56
+ const lifetime = options.lifetime ?? DEFAULT_LIFETIME_MS
57
+ const record = await createIPNSRecord(privKey, value, sequenceNumber, lifetime, { ...options, ttlNs })
58
+ const marshaledRecord = marshalIPNSRecord(record)
59
+
60
+ if (options.offline === true) {
61
+ // only store record locally
62
+ await this.localStore.put(routingKey, marshaledRecord, { ...options, metadata: { keyName, lifetime } })
63
+ } else {
64
+ // publish record to routing (including the local store)
65
+ await Promise.all(this.routers.map(async r => {
66
+ await r.put(routingKey, marshaledRecord, { ...options, metadata: { keyName, lifetime } })
67
+ }))
68
+ }
69
+
70
+ return {
71
+ record,
72
+ publicKey: privKey.publicKey
73
+ }
74
+ } catch (err: any) {
75
+ options.onProgress?.(new CustomProgressEvent<Error>('ipns:publish:error', err))
76
+ throw err
77
+ }
78
+ }
79
+
80
+ async #loadOrCreateKey (keyName: string): Promise<PrivateKey> {
81
+ try {
82
+ return await this.keychain.exportKey(keyName)
83
+ } catch (err: any) {
84
+ // If no named key found in keychain, generate and import
85
+ const privKey = await generateKeyPair('Ed25519')
86
+ await this.keychain.importKey(keyName, privKey)
87
+ return privKey
88
+ }
89
+ }
90
+
91
+ async unpublish (keyName: string, options?: AbortOptions): Promise<void> {
92
+ const { publicKey } = await this.keychain.exportKey(keyName)
93
+ const digest = publicKey.toMultihash()
94
+ const routingKey = multihashToIPNSRoutingKey(digest)
95
+ await this.localStore.delete(routingKey, options)
96
+ }
97
+ }