@helia/verified-fetch 2.6.18 → 3.0.0

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.
Files changed (82) hide show
  1. package/README.md +5 -3
  2. package/dist/index.min.js +25 -25
  3. package/dist/index.min.js.map +3 -3
  4. package/dist/src/index.d.ts +5 -3
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +5 -3
  7. package/dist/src/index.js.map +1 -1
  8. package/dist/src/plugins/plugin-base.d.ts +8 -5
  9. package/dist/src/plugins/plugin-base.d.ts.map +1 -1
  10. package/dist/src/plugins/plugin-base.js +10 -11
  11. package/dist/src/plugins/plugin-base.js.map +1 -1
  12. package/dist/src/plugins/plugin-handle-byte-range-context.d.ts +1 -0
  13. package/dist/src/plugins/plugin-handle-byte-range-context.d.ts.map +1 -1
  14. package/dist/src/plugins/plugin-handle-byte-range-context.js +1 -0
  15. package/dist/src/plugins/plugin-handle-byte-range-context.js.map +1 -1
  16. package/dist/src/plugins/plugin-handle-car.d.ts +1 -0
  17. package/dist/src/plugins/plugin-handle-car.d.ts.map +1 -1
  18. package/dist/src/plugins/plugin-handle-car.js +1 -0
  19. package/dist/src/plugins/plugin-handle-car.js.map +1 -1
  20. package/dist/src/plugins/plugin-handle-dag-cbor.d.ts +1 -0
  21. package/dist/src/plugins/plugin-handle-dag-cbor.d.ts.map +1 -1
  22. package/dist/src/plugins/plugin-handle-dag-cbor.js +1 -0
  23. package/dist/src/plugins/plugin-handle-dag-cbor.js.map +1 -1
  24. package/dist/src/plugins/plugin-handle-dag-pb.d.ts +1 -0
  25. package/dist/src/plugins/plugin-handle-dag-pb.d.ts.map +1 -1
  26. package/dist/src/plugins/plugin-handle-dag-pb.js +8 -2
  27. package/dist/src/plugins/plugin-handle-dag-pb.js.map +1 -1
  28. package/dist/src/plugins/plugin-handle-dag-walk.d.ts +1 -0
  29. package/dist/src/plugins/plugin-handle-dag-walk.d.ts.map +1 -1
  30. package/dist/src/plugins/plugin-handle-dag-walk.js +3 -2
  31. package/dist/src/plugins/plugin-handle-dag-walk.js.map +1 -1
  32. package/dist/src/plugins/plugin-handle-dir-index-html.d.ts +1 -0
  33. package/dist/src/plugins/plugin-handle-dir-index-html.d.ts.map +1 -1
  34. package/dist/src/plugins/plugin-handle-dir-index-html.js +1 -0
  35. package/dist/src/plugins/plugin-handle-dir-index-html.js.map +1 -1
  36. package/dist/src/plugins/plugin-handle-ipns-record.d.ts +1 -0
  37. package/dist/src/plugins/plugin-handle-ipns-record.d.ts.map +1 -1
  38. package/dist/src/plugins/plugin-handle-ipns-record.js +1 -0
  39. package/dist/src/plugins/plugin-handle-ipns-record.js.map +1 -1
  40. package/dist/src/plugins/plugin-handle-json.d.ts +1 -0
  41. package/dist/src/plugins/plugin-handle-json.d.ts.map +1 -1
  42. package/dist/src/plugins/plugin-handle-json.js +1 -0
  43. package/dist/src/plugins/plugin-handle-json.js.map +1 -1
  44. package/dist/src/plugins/plugin-handle-raw.d.ts +1 -0
  45. package/dist/src/plugins/plugin-handle-raw.d.ts.map +1 -1
  46. package/dist/src/plugins/plugin-handle-raw.js +1 -0
  47. package/dist/src/plugins/plugin-handle-raw.js.map +1 -1
  48. package/dist/src/plugins/plugin-handle-tar.d.ts +1 -0
  49. package/dist/src/plugins/plugin-handle-tar.d.ts.map +1 -1
  50. package/dist/src/plugins/plugin-handle-tar.js +1 -0
  51. package/dist/src/plugins/plugin-handle-tar.js.map +1 -1
  52. package/dist/src/plugins/types.d.ts +1 -0
  53. package/dist/src/plugins/types.d.ts.map +1 -1
  54. package/dist/src/utils/get-stream-from-async-iterable.js +1 -1
  55. package/dist/src/utils/get-stream-from-async-iterable.js.map +1 -1
  56. package/dist/src/utils/parse-url-string.d.ts.map +1 -1
  57. package/dist/src/utils/parse-url-string.js +8 -2
  58. package/dist/src/utils/parse-url-string.js.map +1 -1
  59. package/dist/src/utils/walk-path.d.ts.map +1 -1
  60. package/dist/src/utils/walk-path.js +4 -1
  61. package/dist/src/utils/walk-path.js.map +1 -1
  62. package/dist/src/verified-fetch.d.ts.map +1 -1
  63. package/dist/src/verified-fetch.js +16 -11
  64. package/dist/src/verified-fetch.js.map +1 -1
  65. package/package.json +1 -1
  66. package/src/index.ts +5 -3
  67. package/src/plugins/plugin-base.ts +16 -12
  68. package/src/plugins/plugin-handle-byte-range-context.ts +2 -0
  69. package/src/plugins/plugin-handle-car.ts +2 -0
  70. package/src/plugins/plugin-handle-dag-cbor.ts +1 -0
  71. package/src/plugins/plugin-handle-dag-pb.ts +8 -2
  72. package/src/plugins/plugin-handle-dag-walk.ts +4 -2
  73. package/src/plugins/plugin-handle-dir-index-html.ts +1 -0
  74. package/src/plugins/plugin-handle-ipns-record.ts +1 -0
  75. package/src/plugins/plugin-handle-json.ts +1 -0
  76. package/src/plugins/plugin-handle-raw.ts +1 -0
  77. package/src/plugins/plugin-handle-tar.ts +1 -0
  78. package/src/plugins/types.ts +1 -0
  79. package/src/utils/get-stream-from-async-iterable.ts +1 -1
  80. package/src/utils/parse-url-string.ts +8 -2
  81. package/src/utils/walk-path.ts +5 -1
  82. package/src/verified-fetch.ts +16 -11
@@ -1,4 +1,5 @@
1
1
  import { DoesNotExistError } from '@helia/unixfs/errors'
2
+ import { AbortError } from '@libp2p/interface'
2
3
  import { walkPath as exporterWalk } from 'ipfs-unixfs-exporter'
3
4
  import { badGatewayResponse, notFoundResponse } from './responses.js'
4
5
  import type { PluginContext } from '../plugins/types.js'
@@ -53,7 +54,10 @@ export async function handlePathWalking ({ cid, path, resource, options, blockst
53
54
  try {
54
55
  return await walkPath(blockstore, `${cid.toString()}/${path}`, options)
55
56
  } catch (err: any) {
56
- options?.signal?.throwIfAborted()
57
+ if (options?.signal?.aborted) {
58
+ throw new AbortError(options?.signal?.reason)
59
+ }
60
+
57
61
  if (['ERR_NO_PROP', 'ERR_NO_TERMINAL_ELEMENT', 'ERR_NOT_FOUND'].includes(err.code)) {
58
62
  return notFoundResponse(resource)
59
63
  }
@@ -1,4 +1,5 @@
1
1
  import { ipns as heliaIpns } from '@helia/ipns'
2
+ import { AbortError } from '@libp2p/interface'
2
3
  import { prefixLogger } from '@libp2p/logger'
3
4
  import { CustomProgressEvent } from 'progress-events'
4
5
  import QuickLRU from 'quick-lru'
@@ -106,13 +107,13 @@ export class VerifiedFetch {
106
107
 
107
108
  if (customPlugins.length > 0) {
108
109
  // allow custom plugins to replace default plugins
109
- const defaultPluginMap = new Map(defaultPlugins.map(plugin => [plugin.constructor.name, plugin]))
110
- const customPluginMap = new Map(customPlugins.map(plugin => [plugin.constructor.name, plugin]))
110
+ const defaultPluginMap = new Map(defaultPlugins.map(plugin => [plugin.id, plugin]))
111
+ const customPluginMap = new Map(customPlugins.map(plugin => [plugin.id, plugin]))
111
112
 
112
- this.plugins = defaultPlugins.map(plugin => customPluginMap.get(plugin.constructor.name) ?? plugin)
113
+ this.plugins = defaultPlugins.map(plugin => customPluginMap.get(plugin.id) ?? plugin)
113
114
 
114
115
  // Add any remaining custom plugins that don't replace a default plugin
115
- this.plugins.push(...customPlugins.filter(plugin => !defaultPluginMap.has(plugin.constructor.name)))
116
+ this.plugins.push(...customPlugins.filter(plugin => !defaultPluginMap.has(plugin.id)))
116
117
  } else {
117
118
  this.plugins = defaultPlugins
118
119
  }
@@ -251,7 +252,7 @@ export class VerifiedFetch {
251
252
  passCount++
252
253
 
253
254
  // gather plugins that say they can handle the *current* context, but haven't been used yet
254
- const readyPlugins = this.plugins.filter(p => !pluginsUsed.has(p.constructor.name)).filter(p => p.canHandle(context))
255
+ const readyPlugins = this.plugins.filter(p => !pluginsUsed.has(p.id)).filter(p => p.canHandle(context))
255
256
  if (readyPlugins.length === 0) {
256
257
  this.log.trace('No plugins can handle the current context.. checking by CID code')
257
258
  const plugins = this.plugins.filter(p => p.codes.includes(context.cid.code))
@@ -263,7 +264,7 @@ export class VerifiedFetch {
263
264
  }
264
265
  }
265
266
 
266
- this.log.trace('Plugins ready to handle request: ', readyPlugins.map(p => p.constructor.name).join(', '))
267
+ this.log.trace('Plugins ready to handle request: ', readyPlugins.map(p => p.id).join(', '))
267
268
 
268
269
  // track if any plugin changed the context or returned a response
269
270
  let contextChanged = false
@@ -271,8 +272,8 @@ export class VerifiedFetch {
271
272
 
272
273
  for (const plugin of readyPlugins) {
273
274
  try {
274
- this.log.trace('Invoking plugin:', plugin.constructor.name)
275
- pluginsUsed.add(plugin.constructor.name)
275
+ this.log.trace('Invoking plugin:', plugin.id)
276
+ pluginsUsed.add(plugin.id)
276
277
 
277
278
  const maybeResponse = await plugin.handle(context)
278
279
  if (maybeResponse != null) {
@@ -282,7 +283,9 @@ export class VerifiedFetch {
282
283
  break
283
284
  }
284
285
  } catch (err: any) {
285
- context.options?.signal?.throwIfAborted()
286
+ if (context.options?.signal?.aborted) {
287
+ throw new AbortError(context.options?.signal?.reason)
288
+ }
286
289
  this.log.error('Error in plugin:', plugin.constructor.name, err)
287
290
  // if fatal, short-circuit the pipeline
288
291
  if (err.name === 'PluginFatalError') {
@@ -299,7 +302,7 @@ export class VerifiedFetch {
299
302
  }
300
303
 
301
304
  if (finalResponse != null) {
302
- this.log.trace('Plugin produced final response:', plugin.constructor.name)
305
+ this.log.trace('Plugin produced final response:', plugin.id)
303
306
  break
304
307
  }
305
308
  }
@@ -341,7 +344,9 @@ export class VerifiedFetch {
341
344
  parsedResult = await this.handleServerTiming('parse-resource', '', async () => parseResource(resource, { ipns: this.ipns, logger: this.helia.logger }, { withServerTiming, ...options }), withServerTiming)
342
345
  this.serverTimingHeaders.push(...parsedResult.serverTimings.map(({ header }) => header))
343
346
  } catch (err: any) {
344
- options?.signal?.throwIfAborted()
347
+ if (options?.signal?.aborted) {
348
+ throw new AbortError(options?.signal?.reason)
349
+ }
345
350
  this.log.error('error parsing resource %s', resource, err)
346
351
 
347
352
  return this.handleFinalResponse(badRequestResponse(resource.toString(), err))