@helia/verified-fetch 7.2.7 → 7.2.8

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 +1 @@
1
- {"version":3,"file":"plugin-handle-raw.d.ts","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-raw.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD;;GAEG;AACH,qBAAa,SAAU,SAAQ,UAAU;IACvC,QAAQ,CAAC,EAAE,gBAAe;IAE1B,SAAS,CAAE,EAAE,MAAM,EAAE,EAAE,aAAa,GAAG,OAAO;IASxC,MAAM,CAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;CAkCzD"}
1
+ {"version":3,"file":"plugin-handle-raw.d.ts","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-raw.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD;;GAEG;AACH,qBAAa,SAAU,SAAQ,UAAU;IACvC,QAAQ,CAAC,EAAE,gBAAe;IAE1B,SAAS,CAAE,EAAE,MAAM,EAAE,EAAE,aAAa,GAAG,OAAO;IASxC,MAAM,CAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;CAuDzD"}
@@ -1,3 +1,4 @@
1
+ import { isPromise } from '@libp2p/utils';
1
2
  import toBuffer from 'it-to-buffer';
2
3
  import { MEDIA_TYPE_OCTET_STREAM, MEDIA_TYPE_RAW } from "../utils/content-types.js";
3
4
  import { getContentDispositionFilename } from "../utils/get-content-disposition-filename.js";
@@ -15,11 +16,27 @@ export class RawPlugin extends BasePlugin {
15
16
  return supportsAccept;
16
17
  }
17
18
  async handle(context) {
18
- const { url, resource, accept, ipfsRoots, terminalElement, blockstore } = context;
19
+ const { url, resource, accept, ipfsRoots, terminalElement, blockstore, requestedMimeTypes } = context;
19
20
  this.log.trace('fetching %c%s', terminalElement.cid, url.pathname);
20
21
  const block = await toBuffer(blockstore.get(terminalElement.cid, context));
21
- const contentType = accept
22
+ let contentType = accept
22
23
  .find(value => value.contentType.mediaType === MEDIA_TYPE_RAW || value.contentType.mediaType === MEDIA_TYPE_OCTET_STREAM)?.contentType.mediaType ?? MEDIA_TYPE_RAW;
24
+ // path-gateway spec §3.2.4: sniff bytes unless the request explicitly carries raw or octet-stream
25
+ const userAcceptedRaw = requestedMimeTypes.some(value => value.mediaType === MEDIA_TYPE_RAW || value.mediaType === MEDIA_TYPE_OCTET_STREAM);
26
+ if (contentType === MEDIA_TYPE_RAW && !userAcceptedRaw && this.pluginOptions.contentTypeParser != null) {
27
+ const filename = url.searchParams.get('filename') ?? undefined;
28
+ try {
29
+ const parsed = this.pluginOptions.contentTypeParser(block, filename);
30
+ const sniffed = isPromise(parsed) ? await parsed : parsed;
31
+ if (sniffed != null) {
32
+ this.log.trace('sniffed content type %s for raw block %c', sniffed, terminalElement.cid);
33
+ contentType = sniffed;
34
+ }
35
+ }
36
+ catch (err) {
37
+ this.log.error('error parsing content type - %e', err);
38
+ }
39
+ }
23
40
  const headers = {
24
41
  'content-length': `${block.byteLength}`,
25
42
  'content-type': contentType,
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-handle-raw.js","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-raw.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AACnF,OAAO,EAAE,6BAA6B,EAAE,MAAM,8CAA8C,CAAA;AAC5F,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7C;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,UAAU;IAC9B,EAAE,GAAG,YAAY,CAAA;IAE1B,SAAS,CAAE,EAAE,MAAM,EAAiB;QAClC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,KAAK,cAAc;gBACnE,MAAM,CAAC,WAAW,CAAC,SAAS,KAAK,uBAAuB,CACzD,CAAA;QAEH,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAE,OAAsB;QAClC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;QAEjF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;QAClE,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;QAE1E,MAAM,WAAW,GAAG,MAAM;aACvB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,KAAK,cAAc,IAAI,KAAK,CAAC,WAAW,CAAC,SAAS,KAAK,uBAAuB,CAAC,EAAE,WAAW,CAAC,SAAS,IAAI,cAAc,CAAA;QAEpK,MAAM,OAAO,GAAG;YACd,gBAAgB,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE;YACvC,cAAc,EAAE,WAAW;YAC3B,qBAAqB,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,KAC9F,6BAA6B,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,eAAe,CAAC,GAAG,MAAM,CAChG,EAAE;YACF,cAAc,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAC1D,wBAAwB,EAAE,SAAS;YACnC,eAAe,EAAE,OAAO;SACzB,CAAA;QAED,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;YAC1B,OAAO,sBAAsB,CAAC,QAAQ,EAAE,KAAK,SAAU,CAAC,EAAE,MAAM,EAAE,MAAM;gBACtE,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;YAC/C,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE;gBAClC,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO;aACR,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE;YACjC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"plugin-handle-raw.js","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-raw.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@helia/verified-fetch",
3
- "version": "7.2.7",
3
+ "version": "7.2.8",
4
4
  "description": "A fetch-like API for obtaining verified & trustless IPFS content on the web",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "homepage": "https://github.com/ipfs/helia-verified-fetch/tree/main/packages/verified-fetch#readme",
@@ -1,3 +1,4 @@
1
+ import { isPromise } from '@libp2p/utils'
1
2
  import toBuffer from 'it-to-buffer'
2
3
  import { MEDIA_TYPE_OCTET_STREAM, MEDIA_TYPE_RAW } from '../utils/content-types.ts'
3
4
  import { getContentDispositionFilename } from '../utils/get-content-disposition-filename.ts'
@@ -21,14 +22,35 @@ export class RawPlugin extends BasePlugin {
21
22
  }
22
23
 
23
24
  async handle (context: PluginContext): Promise<Response> {
24
- const { url, resource, accept, ipfsRoots, terminalElement, blockstore } = context
25
+ const { url, resource, accept, ipfsRoots, terminalElement, blockstore, requestedMimeTypes } = context
25
26
 
26
27
  this.log.trace('fetching %c%s', terminalElement.cid, url.pathname)
27
28
  const block = await toBuffer(blockstore.get(terminalElement.cid, context))
28
29
 
29
- const contentType = accept
30
+ let contentType = accept
30
31
  .find(value => value.contentType.mediaType === MEDIA_TYPE_RAW || value.contentType.mediaType === MEDIA_TYPE_OCTET_STREAM)?.contentType.mediaType ?? MEDIA_TYPE_RAW
31
32
 
33
+ // path-gateway spec §3.2.4: sniff bytes unless the request explicitly carries raw or octet-stream
34
+ const userAcceptedRaw = requestedMimeTypes.some(value =>
35
+ value.mediaType === MEDIA_TYPE_RAW || value.mediaType === MEDIA_TYPE_OCTET_STREAM
36
+ )
37
+
38
+ if (contentType === MEDIA_TYPE_RAW && !userAcceptedRaw && this.pluginOptions.contentTypeParser != null) {
39
+ const filename = url.searchParams.get('filename') ?? undefined
40
+
41
+ try {
42
+ const parsed = this.pluginOptions.contentTypeParser(block, filename)
43
+ const sniffed = isPromise(parsed) ? await parsed : parsed
44
+
45
+ if (sniffed != null) {
46
+ this.log.trace('sniffed content type %s for raw block %c', sniffed, terminalElement.cid)
47
+ contentType = sniffed
48
+ }
49
+ } catch (err) {
50
+ this.log.error('error parsing content type - %e', err)
51
+ }
52
+ }
53
+
32
54
  const headers = {
33
55
  'content-length': `${block.byteLength}`,
34
56
  'content-type': contentType,