@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.
- package/README.md +5 -3
- package/dist/index.min.js +25 -25
- package/dist/index.min.js.map +3 -3
- package/dist/src/index.d.ts +5 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/plugins/plugin-base.d.ts +8 -5
- package/dist/src/plugins/plugin-base.d.ts.map +1 -1
- package/dist/src/plugins/plugin-base.js +10 -11
- package/dist/src/plugins/plugin-base.js.map +1 -1
- package/dist/src/plugins/plugin-handle-byte-range-context.d.ts +1 -0
- package/dist/src/plugins/plugin-handle-byte-range-context.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-byte-range-context.js +1 -0
- package/dist/src/plugins/plugin-handle-byte-range-context.js.map +1 -1
- package/dist/src/plugins/plugin-handle-car.d.ts +1 -0
- package/dist/src/plugins/plugin-handle-car.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-car.js +1 -0
- package/dist/src/plugins/plugin-handle-car.js.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-cbor.d.ts +1 -0
- package/dist/src/plugins/plugin-handle-dag-cbor.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-cbor.js +1 -0
- package/dist/src/plugins/plugin-handle-dag-cbor.js.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-pb.d.ts +1 -0
- package/dist/src/plugins/plugin-handle-dag-pb.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-pb.js +8 -2
- package/dist/src/plugins/plugin-handle-dag-pb.js.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-walk.d.ts +1 -0
- package/dist/src/plugins/plugin-handle-dag-walk.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-walk.js +3 -2
- package/dist/src/plugins/plugin-handle-dag-walk.js.map +1 -1
- package/dist/src/plugins/plugin-handle-dir-index-html.d.ts +1 -0
- package/dist/src/plugins/plugin-handle-dir-index-html.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-dir-index-html.js +1 -0
- package/dist/src/plugins/plugin-handle-dir-index-html.js.map +1 -1
- package/dist/src/plugins/plugin-handle-ipns-record.d.ts +1 -0
- package/dist/src/plugins/plugin-handle-ipns-record.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-ipns-record.js +1 -0
- package/dist/src/plugins/plugin-handle-ipns-record.js.map +1 -1
- package/dist/src/plugins/plugin-handle-json.d.ts +1 -0
- package/dist/src/plugins/plugin-handle-json.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-json.js +1 -0
- package/dist/src/plugins/plugin-handle-json.js.map +1 -1
- package/dist/src/plugins/plugin-handle-raw.d.ts +1 -0
- package/dist/src/plugins/plugin-handle-raw.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-raw.js +1 -0
- package/dist/src/plugins/plugin-handle-raw.js.map +1 -1
- package/dist/src/plugins/plugin-handle-tar.d.ts +1 -0
- package/dist/src/plugins/plugin-handle-tar.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-tar.js +1 -0
- package/dist/src/plugins/plugin-handle-tar.js.map +1 -1
- package/dist/src/plugins/types.d.ts +1 -0
- package/dist/src/plugins/types.d.ts.map +1 -1
- package/dist/src/utils/get-stream-from-async-iterable.js +1 -1
- package/dist/src/utils/get-stream-from-async-iterable.js.map +1 -1
- package/dist/src/utils/parse-url-string.d.ts.map +1 -1
- package/dist/src/utils/parse-url-string.js +8 -2
- package/dist/src/utils/parse-url-string.js.map +1 -1
- package/dist/src/utils/walk-path.d.ts.map +1 -1
- package/dist/src/utils/walk-path.js +4 -1
- package/dist/src/utils/walk-path.js.map +1 -1
- package/dist/src/verified-fetch.d.ts.map +1 -1
- package/dist/src/verified-fetch.js +16 -11
- package/dist/src/verified-fetch.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +5 -3
- package/src/plugins/plugin-base.ts +16 -12
- package/src/plugins/plugin-handle-byte-range-context.ts +2 -0
- package/src/plugins/plugin-handle-car.ts +2 -0
- package/src/plugins/plugin-handle-dag-cbor.ts +1 -0
- package/src/plugins/plugin-handle-dag-pb.ts +8 -2
- package/src/plugins/plugin-handle-dag-walk.ts +4 -2
- package/src/plugins/plugin-handle-dir-index-html.ts +1 -0
- package/src/plugins/plugin-handle-ipns-record.ts +1 -0
- package/src/plugins/plugin-handle-json.ts +1 -0
- package/src/plugins/plugin-handle-raw.ts +1 -0
- package/src/plugins/plugin-handle-tar.ts +1 -0
- package/src/plugins/types.ts +1 -0
- package/src/utils/get-stream-from-async-iterable.ts +1 -1
- package/src/utils/parse-url-string.ts +8 -2
- package/src/utils/walk-path.ts +5 -1
- package/src/verified-fetch.ts +16 -11
package/src/utils/walk-path.ts
CHANGED
|
@@ -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?.
|
|
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
|
}
|
package/src/verified-fetch.ts
CHANGED
|
@@ -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.
|
|
110
|
-
const customPluginMap = new Map(customPlugins.map(plugin => [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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
275
|
-
pluginsUsed.add(plugin.
|
|
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?.
|
|
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.
|
|
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?.
|
|
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))
|