@helia/verified-fetch 7.2.6 → 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;CA+BzD"}
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,12 +16,30 @@ 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));
22
+ let contentType = accept
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
+ }
21
40
  const headers = {
22
41
  'content-length': `${block.byteLength}`,
23
- 'content-type': accept.some(value => value.contentType.mediaType === MEDIA_TYPE_RAW) ? MEDIA_TYPE_RAW : MEDIA_TYPE_OCTET_STREAM,
42
+ 'content-type': contentType,
24
43
  'content-disposition': `${url.searchParams.get('download') === 'false' ? 'inline' : 'attachment'}; ${getContentDispositionFilename(url.searchParams.get('filename') ?? `${terminalElement.cid}.raw`)}`,
25
44
  'x-ipfs-roots': ipfsRoots.map(cid => cid.toV1()).join(','),
26
45
  'x-content-type-options': 'nosniff',
@@ -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,OAAO,GAAG;YACd,gBAAgB,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE;YACvC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,uBAAuB;YAC/H,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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"}
@@ -24,7 +24,7 @@ export const CONTENT_TYPE_OCTET_STREAM = {
24
24
  };
25
25
  export const CONTENT_TYPE_DAG_CBOR = {
26
26
  mediaType: MEDIA_TYPE_DAG_CBOR,
27
- codecs: [dagCborCode, CODEC_CBOR, dagJsonCode, jsonCode, dagPbCode, rawCode],
27
+ codecs: [dagCborCode, rawCode, dagPbCode],
28
28
  immutable: true,
29
29
  extension: '.cbor',
30
30
  etag: '.dag-cbor',
@@ -32,7 +32,7 @@ export const CONTENT_TYPE_DAG_CBOR = {
32
32
  };
33
33
  export const CONTENT_TYPE_CBOR = {
34
34
  mediaType: MEDIA_TYPE_CBOR,
35
- codecs: [CODEC_CBOR, dagCborCode, dagJsonCode, jsonCode, dagPbCode, rawCode],
35
+ codecs: [CODEC_CBOR, dagCborCode, rawCode, dagPbCode],
36
36
  immutable: true,
37
37
  extension: '.cbor',
38
38
  etag: '.cbor',
@@ -40,7 +40,7 @@ export const CONTENT_TYPE_CBOR = {
40
40
  };
41
41
  export const CONTENT_TYPE_DAG_JSON = {
42
42
  mediaType: MEDIA_TYPE_DAG_JSON,
43
- codecs: [dagJsonCode, jsonCode, dagCborCode, CODEC_CBOR, dagPbCode, rawCode],
43
+ codecs: [dagJsonCode, rawCode, dagPbCode],
44
44
  immutable: true,
45
45
  extension: '.json',
46
46
  etag: '.dag-json',
@@ -48,7 +48,7 @@ export const CONTENT_TYPE_DAG_JSON = {
48
48
  };
49
49
  export const CONTENT_TYPE_JSON = {
50
50
  mediaType: MEDIA_TYPE_JSON,
51
- codecs: [jsonCode, dagJsonCode, dagCborCode, CODEC_CBOR, dagPbCode, rawCode],
51
+ codecs: [jsonCode, dagJsonCode, rawCode, dagPbCode],
52
52
  immutable: true,
53
53
  extension: '.json',
54
54
  etag: '.json',
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.js","sourceRoot":"","sources":["../../../src/utils/content-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAI5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,+BAA+B,CAAA;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,kBAAkB,CAAA;AACjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,+BAA+B,CAAA;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,kBAAkB,CAAA;AACjD,MAAM,CAAC,MAAM,cAAc,GAAG,0BAA0B,CAAA;AACxD,MAAM,CAAC,MAAM,uBAAuB,GAAG,0BAA0B,CAAA;AACjE,MAAM,CAAC,MAAM,sBAAsB,GAAG,kCAAkC,CAAA;AACxE,MAAM,CAAC,MAAM,cAAc,GAAG,0BAA0B,CAAA;AACxD,MAAM,CAAC,MAAM,cAAc,GAAG,mBAAmB,CAAA;AACjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,6BAA6B,CAAA;AAE9D,MAAM,CAAC,MAAM,yBAAyB,GAAgB;IACpD,SAAS,EAAE,uBAAuB;IAClC,MAAM,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC;IAC5E,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,EAAE;IACR,WAAW,EAAE,YAAY;CAC1B,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAgB;IAChD,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC;IAC5E,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,OAAO;IAClB,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,YAAY;CAC1B,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAgB;IAC5C,SAAS,EAAE,eAAe;IAC1B,MAAM,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC;IAC5E,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,OAAO;IAClB,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,YAAY;CAC1B,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAgB;IAChD,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC;IAC5E,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,OAAO;IAClB,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,QAAQ;CACtB,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAgB;IAC5C,SAAS,EAAE,eAAe;IAC1B,MAAM,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC;IAC5E,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,OAAO;IAClB,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,QAAQ;CACtB,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAgB;IAC3C,SAAS,EAAE,cAAc;IACzB,MAAM,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC;IAC5E,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,YAAY;CAC1B,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAgB;IAC5C,SAAS,EAAE,sBAAsB;IACjC,MAAM,EAAE,EAAE;IACV,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,YAAY;CAC1B,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAgB;IAC3C,SAAS,EAAE,cAAc;IACzB,MAAM,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC;IAC5E,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,YAAY;CAC1B,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAgB;IAC3C,SAAS,EAAE,cAAc;IACzB,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,QAAQ;IACnB,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,YAAY;CAC1B,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,qBAAqB;IACrB,iBAAiB;IACjB,qBAAqB;IACrB,iBAAiB;IACjB,gBAAgB;IAChB,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAChB,yBAAyB;CAC1B,CAAA;AAED,MAAM,UAAU,cAAc,CAAE,SAAyB;IACvD,OAAO,aAAa;SACjB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAE,GAAS;IAC9C,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,OAAO,aAAa;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SACxC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,oEAAoE;QACpE,mBAAmB;QACnB,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEvC,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,CAAC,CAAA;QACX,CAAC;QAED,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,CAAA;QACV,CAAC;QAED,OAAO,CAAC,CAAA;IACV,CAAC,CAAC,CAAA;AACN,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAE,WAAmB,OAAO,EAAE,GAAS;IAC7E,IAAI,YAAY,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAA;IAE7C,IAAI,QAAQ,KAAK,OAAO,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,YAAY,GAAG;YACb,gBAAgB;YAChB,yBAAyB;SAC1B,CAAA;IACH,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IACtC,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC"}
1
+ {"version":3,"file":"content-types.js","sourceRoot":"","sources":["../../../src/utils/content-types.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.6",
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,38 @@ 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
 
30
+ let contentType = accept
31
+ .find(value => value.contentType.mediaType === MEDIA_TYPE_RAW || value.contentType.mediaType === MEDIA_TYPE_OCTET_STREAM)?.contentType.mediaType ?? MEDIA_TYPE_RAW
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
+
29
54
  const headers = {
30
55
  'content-length': `${block.byteLength}`,
31
- 'content-type': accept.some(value => value.contentType.mediaType === MEDIA_TYPE_RAW) ? MEDIA_TYPE_RAW : MEDIA_TYPE_OCTET_STREAM,
56
+ 'content-type': contentType,
32
57
  'content-disposition': `${url.searchParams.get('download') === 'false' ? 'inline' : 'attachment'}; ${
33
58
  getContentDispositionFilename(url.searchParams.get('filename') ?? `${terminalElement.cid}.raw`)
34
59
  }`,
@@ -29,7 +29,7 @@ export const CONTENT_TYPE_OCTET_STREAM: ContentType = {
29
29
 
30
30
  export const CONTENT_TYPE_DAG_CBOR: ContentType = {
31
31
  mediaType: MEDIA_TYPE_DAG_CBOR,
32
- codecs: [dagCborCode, CODEC_CBOR, dagJsonCode, jsonCode, dagPbCode, rawCode],
32
+ codecs: [dagCborCode, rawCode, dagPbCode],
33
33
  immutable: true,
34
34
  extension: '.cbor',
35
35
  etag: '.dag-cbor',
@@ -38,7 +38,7 @@ export const CONTENT_TYPE_DAG_CBOR: ContentType = {
38
38
 
39
39
  export const CONTENT_TYPE_CBOR: ContentType = {
40
40
  mediaType: MEDIA_TYPE_CBOR,
41
- codecs: [CODEC_CBOR, dagCborCode, dagJsonCode, jsonCode, dagPbCode, rawCode],
41
+ codecs: [CODEC_CBOR, dagCborCode, rawCode, dagPbCode],
42
42
  immutable: true,
43
43
  extension: '.cbor',
44
44
  etag: '.cbor',
@@ -47,7 +47,7 @@ export const CONTENT_TYPE_CBOR: ContentType = {
47
47
 
48
48
  export const CONTENT_TYPE_DAG_JSON: ContentType = {
49
49
  mediaType: MEDIA_TYPE_DAG_JSON,
50
- codecs: [dagJsonCode, jsonCode, dagCborCode, CODEC_CBOR, dagPbCode, rawCode],
50
+ codecs: [dagJsonCode, rawCode, dagPbCode],
51
51
  immutable: true,
52
52
  extension: '.json',
53
53
  etag: '.dag-json',
@@ -56,7 +56,7 @@ export const CONTENT_TYPE_DAG_JSON: ContentType = {
56
56
 
57
57
  export const CONTENT_TYPE_JSON: ContentType = {
58
58
  mediaType: MEDIA_TYPE_JSON,
59
- codecs: [jsonCode, dagJsonCode, dagCborCode, CODEC_CBOR, dagPbCode, rawCode],
59
+ codecs: [jsonCode, dagJsonCode, rawCode, dagPbCode],
60
60
  immutable: true,
61
61
  extension: '.json',
62
62
  etag: '.json',