@helia/utils 2.3.5-33e46813 → 2.3.5-50a7859b

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.
@@ -1,7 +1,145 @@
1
- import { start, stop } from '@libp2p/interface';
2
- import { InvalidConfigurationError } from "../errors.js";
3
- import { SessionStorage } from "./session-storage.js";
4
- import { Storage } from "./storage.js";
1
+ import { InvalidMultihashError, InvalidParametersError, setMaxListeners, start, stop } from '@libp2p/interface';
2
+ import { anySignal } from 'any-signal';
3
+ import { IdentityBlockstore } from 'blockstore-core/identity';
4
+ import filter from 'it-filter';
5
+ import forEach from 'it-foreach';
6
+ import { CustomProgressEvent } from 'progress-events';
7
+ import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
8
+ import { BlockNotFoundWhileOfflineError, InvalidConfigurationError, LoadBlockFailedError } from "../errors.js";
9
+ import { isPromise } from './is-promise.js';
10
+ const DEFAULT_MAX_IDENTITY_HASH_DIGEST_LENGTH = 128;
11
+ class Storage {
12
+ child;
13
+ getHasher;
14
+ log;
15
+ logger;
16
+ components;
17
+ /**
18
+ * Create a new BlockStorage
19
+ */
20
+ constructor(components, init = {}) {
21
+ this.log = components.logger.forComponent('helia:networked-storage');
22
+ this.logger = components.logger;
23
+ this.components = components;
24
+ this.child = new IdentityBlockstore(components.blockstore, {
25
+ maxDigestLength: init.maxIdentityHashDigestLength ?? DEFAULT_MAX_IDENTITY_HASH_DIGEST_LENGTH
26
+ });
27
+ this.getHasher = components.getHasher;
28
+ }
29
+ /**
30
+ * Put a block to the underlying datastore
31
+ */
32
+ async put(cid, block, options = {}) {
33
+ if (await this.child.has(cid, options)) {
34
+ options.onProgress?.(new CustomProgressEvent('blocks:put:duplicate', cid));
35
+ return cid;
36
+ }
37
+ options.onProgress?.(new CustomProgressEvent('blocks:put:providers:notify', cid));
38
+ await Promise.all(this.components.blockBrokers.map(async (broker) => broker.announce?.(cid, options)));
39
+ options.onProgress?.(new CustomProgressEvent('blocks:put:blockstore:put', cid));
40
+ return this.child.put(cid, block, options);
41
+ }
42
+ /**
43
+ * Put a multiple blocks to the underlying datastore
44
+ */
45
+ async *putMany(blocks, options = {}) {
46
+ const missingBlocks = filter(blocks, async ({ cid }) => {
47
+ const has = await this.child.has(cid, options);
48
+ if (has) {
49
+ options.onProgress?.(new CustomProgressEvent('blocks:put-many:duplicate', cid));
50
+ }
51
+ return !has;
52
+ });
53
+ const notifyEach = forEach(missingBlocks, async ({ cid }) => {
54
+ options.onProgress?.(new CustomProgressEvent('blocks:put-many:providers:notify', cid));
55
+ await Promise.all(this.components.blockBrokers.map(async (broker) => broker.announce?.(cid, options)));
56
+ });
57
+ options.onProgress?.(new CustomProgressEvent('blocks:put-many:blockstore:put-many'));
58
+ yield* this.child.putMany(notifyEach, options);
59
+ }
60
+ /**
61
+ * Get a block by cid
62
+ */
63
+ async *get(cid, options = {}) {
64
+ const has = await this.child.has(cid, options);
65
+ const offline = options.offline === true;
66
+ if (!has) {
67
+ if (offline) {
68
+ throw new BlockNotFoundWhileOfflineError('The block was present in the blockstore and the node is running offline so cannot fetch it');
69
+ }
70
+ const hasher = await this.getHasher(cid.multihash.code);
71
+ options?.signal?.throwIfAborted();
72
+ // we do not have the block locally, get it from a block provider
73
+ options.onProgress?.(new CustomProgressEvent('blocks:get:providers:get', cid));
74
+ const block = await raceBlockRetrievers(cid, this.components.blockBrokers, hasher, {
75
+ ...options,
76
+ log: this.log
77
+ });
78
+ options.onProgress?.(new CustomProgressEvent('blocks:get:blockstore:put', cid));
79
+ await this.child.put(cid, block, options);
80
+ // notify other block providers of the new block
81
+ options.onProgress?.(new CustomProgressEvent('blocks:get:providers:notify', cid));
82
+ await Promise.all(this.components.blockBrokers.map(async (broker) => broker.announce?.(cid, options)));
83
+ yield block;
84
+ return;
85
+ }
86
+ options.onProgress?.(new CustomProgressEvent('blocks:get:blockstore:get', cid));
87
+ yield* this.child.get(cid, options);
88
+ }
89
+ /**
90
+ * Get multiple blocks back from an (async) iterable of cids
91
+ */
92
+ async *getMany(cids, options = {}) {
93
+ options.onProgress?.(new CustomProgressEvent('blocks:get-many:blockstore:get-many'));
94
+ yield* this.child.getMany(forEach(cids, async (cid) => {
95
+ const has = await this.child.has(cid, options);
96
+ const offline = options.offline === true;
97
+ if (!has) {
98
+ if (offline) {
99
+ throw new BlockNotFoundWhileOfflineError('The block was present in the blockstore and the node is running offline so cannot fetch it');
100
+ }
101
+ const hasher = await this.getHasher(cid.multihash.code);
102
+ options?.signal?.throwIfAborted();
103
+ // we do not have the block locally, get it from a block provider
104
+ options.onProgress?.(new CustomProgressEvent('blocks:get-many:providers:get', cid));
105
+ const block = await raceBlockRetrievers(cid, this.components.blockBrokers, hasher, {
106
+ ...options,
107
+ log: this.log
108
+ });
109
+ options.onProgress?.(new CustomProgressEvent('blocks:get-many:blockstore:put', cid));
110
+ await this.child.put(cid, block, options);
111
+ // notify other block providers of the new block
112
+ options.onProgress?.(new CustomProgressEvent('blocks:get-many:providers:notify', cid));
113
+ await Promise.all(this.components.blockBrokers.map(async (broker) => broker.announce?.(cid, options)));
114
+ }
115
+ }));
116
+ }
117
+ /**
118
+ * Delete a block from the blockstore
119
+ */
120
+ async delete(cid, options = {}) {
121
+ options.onProgress?.(new CustomProgressEvent('blocks:delete:blockstore:delete', cid));
122
+ await this.child.delete(cid, options);
123
+ }
124
+ /**
125
+ * Delete multiple blocks from the blockstore
126
+ */
127
+ async *deleteMany(cids, options = {}) {
128
+ options.onProgress?.(new CustomProgressEvent('blocks:delete-many:blockstore:delete-many'));
129
+ yield* this.child.deleteMany((async function* () {
130
+ for await (const cid of cids) {
131
+ yield cid;
132
+ }
133
+ }()), options);
134
+ }
135
+ async has(cid, options = {}) {
136
+ return this.child.has(cid, options);
137
+ }
138
+ async *getAll(options = {}) {
139
+ options.onProgress?.(new CustomProgressEvent('blocks:get-all:blockstore:get-many'));
140
+ yield* this.child.getAll(options);
141
+ }
142
+ }
5
143
  /**
6
144
  * Networked storage wraps a regular blockstore - when getting blocks if the
7
145
  * blocks are not present, the configured BlockBrokers will be used to fetch them.
@@ -19,26 +157,23 @@ export class NetworkedStorage extends Storage {
19
157
  return this.started;
20
158
  }
21
159
  async start() {
22
- await start(this.child, ...this.blockBrokers);
160
+ await start(this.child, ...this.components.blockBrokers);
23
161
  this.started = true;
24
162
  }
25
163
  async stop() {
26
- await stop(this.child, ...this.blockBrokers);
164
+ await stop(this.child, ...this.components.blockBrokers);
27
165
  this.started = false;
28
166
  }
29
167
  unwrap() {
30
168
  return this.child;
31
169
  }
32
170
  createSession(root, options) {
33
- if (this.blockBrokers.length === 0) {
34
- throw new InvalidConfigurationError('No block brokers configured');
35
- }
36
- const blockBrokers = this.blockBrokers
37
- .map(broker => broker.createSession?.(options))
38
- .filter(broker => broker != null);
39
- if (blockBrokers.length === 0) {
40
- throw new InvalidConfigurationError(`No configured block brokers support sessions - tried ${this.blockBrokers.map(b => b.name).join(', ')}`);
41
- }
171
+ const blockBrokers = this.components.blockBrokers.map(broker => {
172
+ if (broker.createSession == null) {
173
+ return broker;
174
+ }
175
+ return broker.createSession(options);
176
+ });
42
177
  return new SessionStorage({
43
178
  blockstore: this.child,
44
179
  blockBrokers,
@@ -49,4 +184,226 @@ export class NetworkedStorage extends Storage {
49
184
  });
50
185
  }
51
186
  }
187
+ /**
188
+ * Storage subclass that can cancel any ongoing operation at any point.
189
+ */
190
+ class SessionStorage extends Storage {
191
+ closeController;
192
+ constructor(components, init) {
193
+ super(components);
194
+ // because brokers are allowed to continue searching for providers after the
195
+ // session has been created, we need a way to tell them that the user has
196
+ // finished using the session any in-flight requests should be cancelled
197
+ this.closeController = new AbortController();
198
+ setMaxListeners(Infinity, this.closeController.signal);
199
+ this.log = components.logger.forComponent(`helia:session-storage:${init.root}`);
200
+ }
201
+ close() {
202
+ this.closeController.abort();
203
+ }
204
+ /**
205
+ * Put a block to the underlying datastore
206
+ */
207
+ async put(cid, block, options = {}) {
208
+ const signal = anySignal([this.closeController.signal, options.signal]);
209
+ setMaxListeners(Infinity, signal);
210
+ try {
211
+ return await super.put(cid, block, {
212
+ ...options,
213
+ signal
214
+ });
215
+ }
216
+ finally {
217
+ signal.clear();
218
+ }
219
+ }
220
+ /**
221
+ * Put a multiple blocks to the underlying datastore
222
+ */
223
+ async *putMany(blocks, options = {}) {
224
+ const signal = anySignal([this.closeController.signal, options.signal]);
225
+ setMaxListeners(Infinity, signal);
226
+ try {
227
+ yield* super.putMany(blocks, {
228
+ ...options,
229
+ signal
230
+ });
231
+ }
232
+ finally {
233
+ signal.clear();
234
+ }
235
+ }
236
+ /**
237
+ * Get a block by cid
238
+ */
239
+ async *get(cid, options = {}) {
240
+ const signal = anySignal([this.closeController.signal, options.signal]);
241
+ setMaxListeners(Infinity, signal);
242
+ try {
243
+ yield* super.get(cid, {
244
+ ...options,
245
+ signal
246
+ });
247
+ }
248
+ finally {
249
+ signal.clear();
250
+ }
251
+ }
252
+ /**
253
+ * Get multiple blocks back from an (async) iterable of cids
254
+ */
255
+ async *getMany(cids, options = {}) {
256
+ const signal = anySignal([this.closeController.signal, options.signal]);
257
+ setMaxListeners(Infinity, signal);
258
+ try {
259
+ yield* super.getMany(cids, {
260
+ ...options,
261
+ signal
262
+ });
263
+ }
264
+ finally {
265
+ signal.clear();
266
+ }
267
+ }
268
+ /**
269
+ * Delete a block from the blockstore
270
+ */
271
+ async delete(cid, options = {}) {
272
+ const signal = anySignal([this.closeController.signal, options.signal]);
273
+ setMaxListeners(Infinity, signal);
274
+ try {
275
+ await super.delete(cid, {
276
+ ...options,
277
+ signal
278
+ });
279
+ }
280
+ finally {
281
+ signal.clear();
282
+ }
283
+ }
284
+ /**
285
+ * Delete multiple blocks from the blockstore
286
+ */
287
+ async *deleteMany(cids, options = {}) {
288
+ const signal = anySignal([this.closeController.signal, options.signal]);
289
+ setMaxListeners(Infinity, signal);
290
+ try {
291
+ yield* super.deleteMany(cids, {
292
+ ...options,
293
+ signal
294
+ });
295
+ }
296
+ finally {
297
+ signal.clear();
298
+ }
299
+ }
300
+ async has(cid, options = {}) {
301
+ const signal = anySignal([this.closeController.signal, options.signal]);
302
+ setMaxListeners(Infinity, signal);
303
+ try {
304
+ return await super.has(cid, {
305
+ ...options,
306
+ signal
307
+ });
308
+ }
309
+ finally {
310
+ signal.clear();
311
+ }
312
+ }
313
+ async *getAll(options = {}) {
314
+ const signal = anySignal([this.closeController.signal, options.signal]);
315
+ setMaxListeners(Infinity, signal);
316
+ try {
317
+ yield* super.getAll({
318
+ ...options,
319
+ signal
320
+ });
321
+ }
322
+ finally {
323
+ signal.clear();
324
+ }
325
+ }
326
+ }
327
+ function isRetrievingBlockBroker(broker) {
328
+ return typeof broker.retrieve === 'function';
329
+ }
330
+ export const getCidBlockVerifierFunction = (cid, hasher) => {
331
+ if (hasher == null) {
332
+ throw new InvalidParametersError(`No hasher configured for multihash code 0x${cid.multihash.code.toString(16)}, please configure one. You can look up which hash this is at https://github.com/multiformats/multicodec/blob/master/table.csv`);
333
+ }
334
+ return async (block) => {
335
+ // verify block
336
+ let hash;
337
+ const res = hasher.digest(block, {
338
+ // support truncated hashes where they are truncated
339
+ truncate: cid.multihash.digest.byteLength
340
+ });
341
+ if (isPromise(res)) {
342
+ hash = await res;
343
+ }
344
+ else {
345
+ hash = res;
346
+ }
347
+ if (!uint8ArrayEquals(hash.digest, cid.multihash.digest)) {
348
+ // if a hash mismatch occurs for a TrustlessGatewayBlockBroker, we should try another gateway
349
+ throw new InvalidMultihashError('Hash of downloaded block did not match multihash from passed CID');
350
+ }
351
+ };
352
+ };
353
+ /**
354
+ * Race block providers cancelling any pending requests once the block has been
355
+ * found.
356
+ */
357
+ async function raceBlockRetrievers(cid, blockBrokers, hasher, options) {
358
+ const validateFn = getCidBlockVerifierFunction(cid, hasher);
359
+ const controller = new AbortController();
360
+ const signal = anySignal([controller.signal, options.signal]);
361
+ setMaxListeners(Infinity, controller.signal, signal);
362
+ const retrievers = [];
363
+ for (const broker of blockBrokers) {
364
+ if (isRetrievingBlockBroker(broker)) {
365
+ retrievers.push(broker);
366
+ }
367
+ }
368
+ if (retrievers.length === 0) {
369
+ throw new InvalidConfigurationError(`No block brokers capable of retrieving blocks are configured, the CID ${cid} cannot be fetched from the network`);
370
+ }
371
+ try {
372
+ return await Promise.any(retrievers
373
+ .map(async (retriever) => {
374
+ try {
375
+ let blocksWereValidated = false;
376
+ const block = await retriever.retrieve(cid, {
377
+ ...options,
378
+ signal,
379
+ validateFn: async (block) => {
380
+ await validateFn(block);
381
+ options.signal?.throwIfAborted();
382
+ blocksWereValidated = true;
383
+ }
384
+ });
385
+ if (!blocksWereValidated) {
386
+ // the blockBroker either did not throw an error when attempting to validate the block
387
+ // or did not call the validateFn at all. We should validate the block ourselves
388
+ await validateFn(block);
389
+ options.signal?.throwIfAborted();
390
+ }
391
+ return block;
392
+ }
393
+ catch (err) {
394
+ options.log.error('could not retrieve verified block for %c - %e', cid, err);
395
+ throw err;
396
+ }
397
+ }));
398
+ }
399
+ catch (err) {
400
+ throw new LoadBlockFailedError(err.errors, `Failed to load block for ${cid}`);
401
+ }
402
+ finally {
403
+ // we have the block from the fastest block retriever, abort any still
404
+ // in-flight retrieve attempts
405
+ controller.abort();
406
+ signal.clear();
407
+ }
408
+ }
52
409
  //# sourceMappingURL=networked-storage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"networked-storage.js","sourceRoot":"","sources":["../../../src/utils/networked-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAatC;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,OAAoB;IAChD,OAAO,CAAS;IAExB;;OAEG;IACH,YAAa,UAAsC,EAAE,OAAoB,EAAE;QACzE,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QAEvB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;QAC7C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,aAAa,CAAE,IAAS,EAAE,OAA8B;QACtD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,yBAAyB,CAAC,6BAA6B,CAAC,CAAA;QACpE,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY;aACnC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,CAAC;aAC9C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,CAAA;QAEnC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,yBAAyB,CAAC,wDAAwD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC9I,CAAC;QAED,OAAO,IAAI,cAAc,CAAC;YACxB,UAAU,EAAE,IAAI,CAAC,KAAK;YACtB,YAAY;YACZ,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,EAAE;YACD,IAAI;SACL,CAAC,CAAA;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"networked-storage.js","sourceRoot":"","sources":["../../../src/utils/networked-storage.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@helia/utils",
3
- "version": "2.3.5-33e46813",
3
+ "version": "2.3.5-50a7859b",
4
4
  "description": "Shared code that implements the Helia API",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "homepage": "https://github.com/ipfs/helia/tree/main/packages/utils#readme",
@@ -47,12 +47,13 @@
47
47
  "test:electron-main": "aegir test -t electron-main"
48
48
  },
49
49
  "dependencies": {
50
- "@helia/interface": "6.0.3-33e46813",
50
+ "@helia/interface": "6.0.3-50a7859b",
51
51
  "@ipld/dag-cbor": "^9.2.5",
52
52
  "@ipld/dag-json": "^10.2.5",
53
53
  "@ipld/dag-pb": "^4.1.5",
54
54
  "@libp2p/interface": "^3.1.0",
55
55
  "@libp2p/keychain": "^6.0.5",
56
+ "@libp2p/logger": "^6.0.5",
56
57
  "@libp2p/utils": "^7.0.5",
57
58
  "@multiformats/dns": "^1.0.9",
58
59
  "@multiformats/multiaddr": "^13.0.1",
@@ -77,7 +78,6 @@
77
78
  },
78
79
  "devDependencies": {
79
80
  "@libp2p/crypto": "^5.1.12",
80
- "@libp2p/logger": "^6.0.5",
81
81
  "@libp2p/peer-id": "^6.0.3",
82
82
  "@types/sinon": "^21.0.0",
83
83
  "aegir": "^47.0.22",
@@ -30,10 +30,9 @@ interface Request {
30
30
  }
31
31
 
32
32
  export abstract class AbstractSession<Provider, RetrieveBlockProgressEvents extends ProgressEvent> extends TypedEventEmitter<BlockstoreSessionEvents<Provider>> implements BlockBroker<RetrieveBlockProgressEvents> {
33
- public abstract name: string
34
33
  private initialPeerSearchComplete?: Promise<void>
35
34
  private readonly requests: Map<string, Request>
36
- private readonly logName: string
35
+ private readonly name: string
37
36
  protected log: Logger
38
37
  protected logger: ComponentLogger
39
38
  private readonly minProviders: number
@@ -46,9 +45,9 @@ export abstract class AbstractSession<Provider, RetrieveBlockProgressEvents exte
46
45
  super()
47
46
 
48
47
  setMaxListeners(Infinity, this)
49
- this.logName = init.name
48
+ this.name = init.name
50
49
  this.logger = components.logger
51
- this.log = components.logger.forComponent(this.logName)
50
+ this.log = components.logger.forComponent(this.name)
52
51
  this.requests = new Map()
53
52
  this.minProviders = init.minProviders ?? DEFAULT_SESSION_MIN_PROVIDERS
54
53
  this.maxProviders = init.maxProviders ?? DEFAULT_SESSION_MAX_PROVIDERS
@@ -80,7 +79,7 @@ export abstract class AbstractSession<Provider, RetrieveBlockProgressEvents exte
80
79
 
81
80
  if (this.initialPeerSearchComplete == null) {
82
81
  first = true
83
- this.log = this.logger.forComponent(`${this.logName}:${cid}`)
82
+ this.log = this.logger.forComponent(`${this.name}:${cid}`)
84
83
  this.initialPeerSearchComplete = this.findProviders(cid, this.minProviders, options)
85
84
  }
86
85
 
@@ -250,21 +249,6 @@ export abstract class AbstractSession<Provider, RetrieveBlockProgressEvents exte
250
249
  return false
251
250
  }
252
251
 
253
- async addPeer (peer: PeerId | Multiaddr | Multiaddr[], options?: AbortOptions): Promise<void> {
254
- const provider = await this.convertToProvider(peer, options)
255
-
256
- if (provider == null || this.hasProvider(provider)) {
257
- return
258
- }
259
-
260
- this.providers.push(provider)
261
-
262
- // let the new peer join current queries
263
- this.safeDispatchEvent('provider', {
264
- detail: provider
265
- })
266
- }
267
-
268
252
  private async findProviders (cid: CID, count: number, options: AbortOptions): Promise<void> {
269
253
  const deferred: DeferredPromise<void> = pDefer()
270
254
  let found = 0
package/src/index.ts CHANGED
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  import { contentRoutingSymbol, peerRoutingSymbol, start, stop, TypedEventEmitter } from '@libp2p/interface'
9
+ import { defaultLogger } from '@libp2p/logger'
9
10
  import { dns } from '@multiformats/dns'
10
11
  import drain from 'it-drain'
11
12
  import { CustomProgressEvent } from 'progress-events'
@@ -207,7 +208,7 @@ export class Helia<T extends Libp2p> implements HeliaInterface<T> {
207
208
  private readonly log: Logger
208
209
 
209
210
  constructor (init: Omit<HeliaInit, 'start' | 'libp2p'> & { libp2p: T }) {
210
- this.logger = init.logger ?? init.libp2p.logger
211
+ this.logger = init.logger ?? defaultLogger()
211
212
  this.log = this.logger.forComponent('helia')
212
213
  this.getHasher = getHasher(init.hashers, init.loadHasher)
213
214
  this.getCodec = getCodec(init.codecs, init.loadCodec)
@@ -258,16 +259,16 @@ export class Helia<T extends Libp2p> implements HeliaInterface<T> {
258
259
  providerLookupConcurrency: init.providerLookupConcurrency
259
260
  })
260
261
 
261
- components.blockBrokers = init.blockBrokers.map((fn) => {
262
- return fn(components)
263
- })
264
-
265
262
  const networkedStorage = new NetworkedStorage(components, init)
266
263
  this.pins = new PinsImpl(init.datastore, networkedStorage, this.getCodec)
267
264
  this.blockstore = new BlockStorage(networkedStorage, this.pins, {
268
265
  holdGcLock: init.holdGcLock ?? true
269
266
  })
270
267
  this.datastore = init.datastore
268
+
269
+ components.blockBrokers = init.blockBrokers.map((fn) => {
270
+ return fn(components)
271
+ })
271
272
  }
272
273
 
273
274
  async start (): Promise<void> {