@helia/verified-fetch 4.0.0 → 4.0.2

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 (126) hide show
  1. package/README.md +7 -49
  2. package/dist/index.min.js +56 -51
  3. package/dist/index.min.js.map +4 -4
  4. package/dist/src/index.d.ts +12 -52
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +8 -50
  7. package/dist/src/index.js.map +1 -1
  8. package/dist/src/plugins/index.d.ts +0 -1
  9. package/dist/src/plugins/index.d.ts.map +1 -1
  10. package/dist/src/plugins/index.js +0 -1
  11. package/dist/src/plugins/index.js.map +1 -1
  12. package/dist/src/plugins/plugin-base.d.ts.map +1 -1
  13. package/dist/src/plugins/plugin-base.js +3 -2
  14. package/dist/src/plugins/plugin-base.js.map +1 -1
  15. package/dist/src/plugins/plugin-handle-car.d.ts.map +1 -1
  16. package/dist/src/plugins/plugin-handle-car.js +0 -1
  17. package/dist/src/plugins/plugin-handle-car.js.map +1 -1
  18. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.d.ts +3 -3
  19. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.d.ts.map +1 -1
  20. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.js +5 -6
  21. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.js.map +1 -1
  22. package/dist/src/plugins/plugin-handle-dag-cbor.d.ts.map +1 -1
  23. package/dist/src/plugins/plugin-handle-dag-cbor.js +0 -1
  24. package/dist/src/plugins/plugin-handle-dag-cbor.js.map +1 -1
  25. package/dist/src/plugins/plugin-handle-dag-pb.d.ts.map +1 -1
  26. package/dist/src/plugins/plugin-handle-dag-pb.js +34 -39
  27. package/dist/src/plugins/plugin-handle-dag-pb.js.map +1 -1
  28. package/dist/src/plugins/plugin-handle-dag-walk.d.ts +8 -4
  29. package/dist/src/plugins/plugin-handle-dag-walk.d.ts.map +1 -1
  30. package/dist/src/plugins/plugin-handle-dag-walk.js +8 -5
  31. package/dist/src/plugins/plugin-handle-dag-walk.js.map +1 -1
  32. package/dist/src/plugins/plugin-handle-ipns-record.d.ts +1 -1
  33. package/dist/src/plugins/plugin-handle-ipns-record.d.ts.map +1 -1
  34. package/dist/src/plugins/plugin-handle-ipns-record.js +4 -6
  35. package/dist/src/plugins/plugin-handle-ipns-record.js.map +1 -1
  36. package/dist/src/plugins/plugin-handle-json.d.ts.map +1 -1
  37. package/dist/src/plugins/plugin-handle-json.js +0 -1
  38. package/dist/src/plugins/plugin-handle-json.js.map +1 -1
  39. package/dist/src/plugins/plugin-handle-raw.d.ts.map +1 -1
  40. package/dist/src/plugins/plugin-handle-raw.js +4 -8
  41. package/dist/src/plugins/plugin-handle-raw.js.map +1 -1
  42. package/dist/src/plugins/plugin-handle-tar.d.ts.map +1 -1
  43. package/dist/src/plugins/plugin-handle-tar.js +0 -1
  44. package/dist/src/plugins/plugin-handle-tar.js.map +1 -1
  45. package/dist/src/plugins/types.d.ts +6 -11
  46. package/dist/src/plugins/types.d.ts.map +1 -1
  47. package/dist/src/url-resolver.d.ts +4 -3
  48. package/dist/src/url-resolver.d.ts.map +1 -1
  49. package/dist/src/url-resolver.js +35 -47
  50. package/dist/src/url-resolver.js.map +1 -1
  51. package/dist/src/utils/byte-range-context.d.ts +2 -2
  52. package/dist/src/utils/byte-range-context.d.ts.map +1 -1
  53. package/dist/src/utils/byte-range-context.js +1 -1
  54. package/dist/src/utils/byte-range-context.js.map +1 -1
  55. package/dist/src/utils/content-type-parser.d.ts.map +1 -1
  56. package/dist/src/utils/content-type-parser.js +0 -10
  57. package/dist/src/utils/content-type-parser.js.map +1 -1
  58. package/dist/src/utils/dnslink-label.d.ts +26 -0
  59. package/dist/src/utils/dnslink-label.d.ts.map +1 -0
  60. package/dist/src/utils/dnslink-label.js +35 -0
  61. package/dist/src/utils/dnslink-label.js.map +1 -0
  62. package/dist/src/utils/error-to-object.d.ts +6 -0
  63. package/dist/src/utils/error-to-object.d.ts.map +1 -0
  64. package/dist/src/utils/error-to-object.js +20 -0
  65. package/dist/src/utils/error-to-object.js.map +1 -0
  66. package/dist/src/utils/get-content-type.d.ts +1 -1
  67. package/dist/src/utils/get-content-type.d.ts.map +1 -1
  68. package/dist/src/utils/get-content-type.js +1 -1
  69. package/dist/src/utils/get-content-type.js.map +1 -1
  70. package/dist/src/utils/get-stream-from-async-iterable.d.ts +1 -2
  71. package/dist/src/utils/get-stream-from-async-iterable.d.ts.map +1 -1
  72. package/dist/src/utils/get-stream-from-async-iterable.js +1 -3
  73. package/dist/src/utils/get-stream-from-async-iterable.js.map +1 -1
  74. package/dist/src/utils/handle-redirects.js +2 -2
  75. package/dist/src/utils/ipfs-path-to-url.d.ts +16 -0
  76. package/dist/src/utils/ipfs-path-to-url.d.ts.map +1 -0
  77. package/dist/src/utils/ipfs-path-to-url.js +45 -0
  78. package/dist/src/utils/ipfs-path-to-url.js.map +1 -0
  79. package/dist/src/utils/parse-url-string.d.ts +18 -5
  80. package/dist/src/utils/parse-url-string.d.ts.map +1 -1
  81. package/dist/src/utils/parse-url-string.js +126 -44
  82. package/dist/src/utils/parse-url-string.js.map +1 -1
  83. package/dist/src/utils/resource-to-cache-key.js +2 -2
  84. package/dist/src/utils/responses.d.ts +2 -1
  85. package/dist/src/utils/responses.d.ts.map +1 -1
  86. package/dist/src/utils/responses.js +16 -1
  87. package/dist/src/utils/responses.js.map +1 -1
  88. package/dist/src/utils/walk-path.js +1 -1
  89. package/dist/src/utils/walk-path.js.map +1 -1
  90. package/dist/src/verified-fetch.d.ts.map +1 -1
  91. package/dist/src/verified-fetch.js +36 -28
  92. package/dist/src/verified-fetch.js.map +1 -1
  93. package/dist/typedoc-urls.json +0 -2
  94. package/package.json +10 -10
  95. package/src/index.ts +12 -52
  96. package/src/plugins/index.ts +0 -1
  97. package/src/plugins/plugin-base.ts +3 -2
  98. package/src/plugins/plugin-handle-car.ts +0 -2
  99. package/src/plugins/plugin-handle-dag-cbor-html-preview.ts +10 -9
  100. package/src/plugins/plugin-handle-dag-cbor.ts +3 -1
  101. package/src/plugins/plugin-handle-dag-pb.ts +49 -37
  102. package/src/plugins/plugin-handle-dag-walk.ts +10 -5
  103. package/src/plugins/plugin-handle-ipns-record.ts +6 -6
  104. package/src/plugins/plugin-handle-json.ts +1 -1
  105. package/src/plugins/plugin-handle-raw.ts +7 -8
  106. package/src/plugins/plugin-handle-tar.ts +2 -1
  107. package/src/plugins/types.ts +7 -12
  108. package/src/url-resolver.ts +37 -56
  109. package/src/utils/byte-range-context.ts +3 -3
  110. package/src/utils/content-type-parser.ts +5 -11
  111. package/src/utils/dnslink-label.ts +38 -0
  112. package/src/utils/error-to-object.ts +22 -0
  113. package/src/utils/get-content-type.ts +2 -2
  114. package/src/utils/get-stream-from-async-iterable.ts +1 -4
  115. package/src/utils/handle-redirects.ts +2 -2
  116. package/src/utils/ipfs-path-to-url.ts +54 -0
  117. package/src/utils/parse-url-string.ts +166 -49
  118. package/src/utils/resource-to-cache-key.ts +2 -2
  119. package/src/utils/responses.ts +21 -1
  120. package/src/utils/walk-path.ts +1 -1
  121. package/src/verified-fetch.ts +46 -28
  122. package/dist/src/plugins/errors.d.ts +0 -25
  123. package/dist/src/plugins/errors.d.ts.map +0 -1
  124. package/dist/src/plugins/errors.js +0 -33
  125. package/dist/src/plugins/errors.js.map +0 -1
  126. package/src/plugins/errors.ts +0 -37
@@ -0,0 +1,45 @@
1
+ import { InvalidParametersError } from '@libp2p/interface';
2
+ /**
3
+ * Turns an IPFS or IPNS path into a HTTP URL. Path gateway syntax is used to
4
+ * preserve any case sensitivity
5
+ *
6
+ * - `/ipfs/cid` -> `https://example.org/ipfs/cid`
7
+ * - `/ipns/name` -> `https://example.org/ipns/name`
8
+ */
9
+ export function ipfsPathToUrl(path) {
10
+ if (!path.startsWith('/ipfs/') && !path.startsWith('/ipns/')) {
11
+ throw new InvalidParametersError(`Path ${path} did not start with /ipfs/ or /ipns/`);
12
+ }
13
+ // trim fragment
14
+ const fragmentIndex = path.indexOf('#');
15
+ let fragment = '';
16
+ if (fragmentIndex > -1) {
17
+ fragment = path.substring(fragmentIndex);
18
+ path = path.substring(0, fragmentIndex);
19
+ }
20
+ // trim query
21
+ const queryIndex = path.indexOf('?');
22
+ let query = '';
23
+ if (queryIndex > -1) {
24
+ query = path.substring(queryIndex);
25
+ path = path.substring(0, queryIndex);
26
+ }
27
+ const type = path.substring(1, 5);
28
+ const rest = path.substring(6);
29
+ return `https://example.org/${type}/${rest}${query}${fragment}`;
30
+ }
31
+ /**
32
+ * Turns an IPFS or IPNS URL into a HTTP URL. Path gateway syntax is used to
33
+ * preserve and case sensitivity
34
+ *
35
+ * `ipfs://cid` -> `https://example.org/ipfs/cid`
36
+ */
37
+ export function ipfsUrlToUrl(url) {
38
+ if (!url.startsWith('ipfs://') && !url.startsWith('ipns://')) {
39
+ throw new InvalidParametersError(`URL ${url} did not start with ipfs:// or ipns://`);
40
+ }
41
+ const type = url.substring(0, 4);
42
+ const rest = url.substring(7);
43
+ return `https://example.org/${type}/${rest}`;
44
+ }
45
+ //# sourceMappingURL=ipfs-path-to-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipfs-path-to-url.js","sourceRoot":"","sources":["../../../src/utils/ipfs-path-to-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAE1D;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAE,IAAY;IACzC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,sBAAsB,CAAC,QAAQ,IAAI,sCAAsC,CAAC,CAAA;IACtF,CAAC;IAED,gBAAgB;IAChB,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACvC,IAAI,QAAQ,GAAG,EAAE,CAAA;IAEjB,IAAI,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC;QACvB,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;QACxC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;IACzC,CAAC;IAED,aAAa;IACb,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACpC,IAAI,KAAK,GAAG,EAAE,CAAA;IAEd,IAAI,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;QACpB,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAClC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;IACtC,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAE9B,OAAO,uBAAuB,IAAI,IAAI,IAAI,GAAG,KAAK,GAAG,QAAQ,EAAE,CAAA;AACjE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAE,GAAW;IACvC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,sBAAsB,CAAC,OAAO,GAAG,wCAAwC,CAAC,CAAA;IACtF,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAChC,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAE7B,OAAO,uBAAuB,IAAI,IAAI,IAAI,EAAE,CAAA;AAC9C,CAAC"}
@@ -1,9 +1,22 @@
1
- interface MatchUrlGroups {
1
+ export interface ParsedURL {
2
+ url: URL;
2
3
  protocol: 'ipfs' | 'ipns';
3
4
  cidOrPeerIdOrDnsLink: string;
4
- path?: string;
5
- query?: string;
5
+ path: string[];
6
+ query: Record<string, any>;
7
+ fragment: string;
6
8
  }
7
- export declare function matchURLString(urlString: string): MatchUrlGroups;
8
- export {};
9
+ /**
10
+ * Accepts the following url strings:
11
+ *
12
+ * - /ipfs/Qmfoo/path
13
+ * - /ipns/Qmfoo/path
14
+ * - ipfs://cid/path
15
+ * - ipns://name/path
16
+ * - http://cid.ipfs.example.com/path
17
+ * - http://name.ipns.example.com/path
18
+ * - http://example.com/ipfs/cid/path
19
+ * - http://example.com/ipns/name/path
20
+ */
21
+ export declare function parseURLString(urlString: string): ParsedURL;
9
22
  //# sourceMappingURL=parse-url-string.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-url-string.d.ts","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"AAKA,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAiBD,wBAAgB,cAAc,CAAE,SAAS,EAAE,MAAM,GAAG,cAAc,CAqBjE"}
1
+ {"version":3,"file":"parse-url-string.d.ts","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,GAAG,CAAC;IACT,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC1B,QAAQ,EAAE,MAAM,CAAA;CACjB;AAqED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CA8E5D"}
@@ -1,63 +1,145 @@
1
- const URL_REGEX = /^(?<protocol>ip[fn]s):\/\/(?<cidOrPeerIdOrDnsLink>[^/?]+)\/?(?<path>[^?]*)\??(?<query>.*)$/;
2
- const PATH_REGEX = /^\/(?<protocol>ip[fn]s)\/(?<cidOrPeerIdOrDnsLink>[^/?]+)\/?(?<path>[^?]*)\??(?<query>.*)$/;
3
- const PATH_GATEWAY_REGEX = /^https?:\/\/(.*[^/])\/(?<protocol>ip[fn]s)\/(?<cidOrPeerIdOrDnsLink>[^/?]+)\/?(?<path>[^?]*)\??(?<query>.*)$/;
4
- const SUBDOMAIN_GATEWAY_REGEX = /^https?:\/\/(?<cidOrPeerIdOrDnsLink>[^/?]+)\.(?<protocol>ip[fn]s)\.([^/?]+)\/?(?<path>[^?]*)\??(?<query>.*)$/;
5
- function matchUrlGroupsGuard(groups) {
1
+ import { InvalidParametersError } from '@libp2p/interface';
2
+ import { decodeDNSLinkLabel, isInlinedDnsLink } from "./dnslink-label.js";
3
+ import { ipfsPathToUrl, ipfsUrlToUrl } from "./ipfs-path-to-url.js";
4
+ const SUBDOMAIN_GATEWAY_REGEX = /^(?<cidOrPeerIdOrDnsLink>[^/?]+)\.(?<protocol>ip[fn]s)\.([^/?]+)$/;
5
+ function matchSubdomainGroupsGuard(groups) {
6
6
  const protocol = groups?.protocol;
7
- if (protocol == null) {
7
+ if (protocol !== 'ipfs' && protocol !== 'ipns') {
8
8
  return false;
9
9
  }
10
10
  const cidOrPeerIdOrDnsLink = groups?.cidOrPeerIdOrDnsLink;
11
11
  if (cidOrPeerIdOrDnsLink == null) {
12
12
  return false;
13
13
  }
14
- const path = groups?.path;
15
- const query = groups?.query;
16
- return ['ipns', 'ipfs'].includes(protocol) &&
17
- typeof cidOrPeerIdOrDnsLink === 'string' &&
18
- (path == null || typeof path === 'string') &&
19
- (query == null || typeof query === 'string');
14
+ return true;
20
15
  }
21
- // TODO: can this be replaced with `new URL`?
22
- export function matchURLString(urlString) {
23
- for (const pattern of [SUBDOMAIN_GATEWAY_REGEX, URL_REGEX, PATH_GATEWAY_REGEX, PATH_REGEX]) {
24
- const match = urlString.match(pattern);
25
- if (matchUrlGroupsGuard(match?.groups)) {
26
- const groups = match.groups;
27
- if (groups.path != null) {
28
- groups.path = decodeURIComponent(groups.path);
29
- }
30
- // decode inline dnslink domain if present
31
- if (pattern === SUBDOMAIN_GATEWAY_REGEX && groups.protocol === 'ipns' && isInlinedDnsLink(groups.cidOrPeerIdOrDnsLink)) {
32
- groups.cidOrPeerIdOrDnsLink = dnsLinkLabelDecoder(groups.cidOrPeerIdOrDnsLink);
33
- }
34
- return groups;
16
+ function toQuery(query) {
17
+ if (query == null) {
18
+ return {};
19
+ }
20
+ const output = {};
21
+ for (const [key, value] of query.entries()) {
22
+ output[key] = value;
23
+ if (value === 'true') {
24
+ output[key] = true;
25
+ }
26
+ if (value === 'false') {
27
+ output[key] = false;
35
28
  }
36
29
  }
37
- throw new TypeError(`Invalid URL: ${urlString}, please use ipfs://, ipns://, or gateway URLs only`);
30
+ return output;
31
+ }
32
+ function stripLeadingHash(pathname) {
33
+ return stripLeading(pathname, '#');
34
+ }
35
+ function stripLeading(str, char) {
36
+ while (str.startsWith(char)) {
37
+ str = str.substring(1);
38
+ }
39
+ return str;
38
40
  }
39
41
  /**
40
- * For DNSLink see https://specs.ipfs.tech/http-gateways/subdomain-gateway/#host-request-header
41
- * DNSLink names include . which means they must be inlined into a single DNS label to provide unique origin and work with wildcard TLS certificates.
42
- */
43
- // DNS label can have up to 63 characters, consisting of alphanumeric
44
- // characters or hyphens -, but it must not start or end with a hyphen.
45
- const dnsLabelRegex = /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/;
46
- /**
47
- * Checks if label looks like inlined DNSLink.
48
- * (https://specs.ipfs.tech/http-gateways/subdomain-gateway/#host-request-header)
42
+ * If the caller has passed a case-sensitive identifier (like a base58btc
43
+ * encoded CID or PeerId) in a case-insensitive location (like a subdomain),
44
+ * be nice and return the original identifier from the passed string
49
45
  */
50
- function isInlinedDnsLink(label) {
51
- return dnsLabelRegex.test(label) && label.includes('-') && !label.includes('.');
46
+ function findOriginalCidOrPeer(needle, haystack) {
47
+ const start = haystack.toLowerCase().indexOf(needle);
48
+ if (start === -1) {
49
+ return needle;
50
+ }
51
+ return haystack.substring(start, start + needle.length);
52
+ }
53
+ function toUrl(urlString) {
54
+ // turn IPFS/IPNS path into gateway URL string
55
+ if (urlString.startsWith('/ipfs/') || urlString.startsWith('/ipns/')) {
56
+ urlString = ipfsPathToUrl(urlString);
57
+ }
58
+ // turn IPFS/IPNS URL into gateway URL string
59
+ if (urlString.startsWith('ipfs://') || urlString.startsWith('ipns://')) {
60
+ urlString = ipfsUrlToUrl(urlString);
61
+ }
62
+ if (urlString.startsWith('http://') || urlString.startsWith('https://')) {
63
+ return new URL(urlString);
64
+ }
65
+ throw new InvalidParametersError(`Invalid URL: ${urlString}`);
52
66
  }
53
67
  /**
54
- * DNSLink label decoding
55
- * - Every standalone - is replaced with .
56
- * - Every remaining -- is replaced with -
68
+ * Accepts the following url strings:
57
69
  *
58
- * @example en-wikipedia--on--ipfs-org.ipns.example.net -> example.net/ipns/en.wikipedia-on-ipfs.org
70
+ * - /ipfs/Qmfoo/path
71
+ * - /ipns/Qmfoo/path
72
+ * - ipfs://cid/path
73
+ * - ipns://name/path
74
+ * - http://cid.ipfs.example.com/path
75
+ * - http://name.ipns.example.com/path
76
+ * - http://example.com/ipfs/cid/path
77
+ * - http://example.com/ipns/name/path
59
78
  */
60
- function dnsLinkLabelDecoder(linkLabel) {
61
- return linkLabel.replace(/--/g, '%').replace(/-/g, '.').replace(/%/g, '-');
79
+ export function parseURLString(urlString) {
80
+ // validate url
81
+ const url = toUrl(urlString);
82
+ // test for subdomain gateway URL
83
+ const subdomainMatch = url.hostname.match(SUBDOMAIN_GATEWAY_REGEX);
84
+ if (matchSubdomainGroupsGuard(subdomainMatch?.groups)) {
85
+ const groups = subdomainMatch.groups;
86
+ if (groups.protocol === 'ipns' && isInlinedDnsLink(groups.cidOrPeerIdOrDnsLink)) {
87
+ // decode inline dnslink domain if present
88
+ groups.cidOrPeerIdOrDnsLink = decodeDNSLinkLabel(groups.cidOrPeerIdOrDnsLink);
89
+ }
90
+ const cidOrPeerIdOrDnsLink = findOriginalCidOrPeer(groups.cidOrPeerIdOrDnsLink, urlString);
91
+ // parse url as not http(s):// - this is necessary because URL makes
92
+ // `.pathname` default to `/` for http URLs, even if no trailing slash was
93
+ // present in the string URL and we need to be able to round-trip the user's
94
+ // input while also maintaining a sane canonical URL for the resource. Phew.
95
+ const wat = new URL(`not-${urlString}`);
96
+ return {
97
+ url: new URL(`${groups.protocol}://${cidOrPeerIdOrDnsLink}${wat.pathname}${url.search}${url.hash}`),
98
+ protocol: groups.protocol,
99
+ cidOrPeerIdOrDnsLink,
100
+ path: url.pathname.split('/')
101
+ .filter(str => str !== '')
102
+ .map(str => decodeURIComponent(str)),
103
+ query: toQuery(url.searchParams),
104
+ fragment: stripLeadingHash(url.hash)
105
+ };
106
+ }
107
+ // test for IPFS path gateway URL
108
+ if (url.pathname.startsWith('/ipfs/')) {
109
+ const parts = url.pathname.substring(6).split('/');
110
+ const cid = parts.shift();
111
+ if (cid == null) {
112
+ throw new InvalidParametersError(`Path gateway URL ${urlString} had no CID`);
113
+ }
114
+ return {
115
+ url: new URL(`ipfs://${cid}${url.pathname.replace(`/ipfs/${cid}`, '')}${url.search}${url.hash}`),
116
+ protocol: 'ipfs',
117
+ cidOrPeerIdOrDnsLink: cid,
118
+ path: parts
119
+ .filter(str => str !== '')
120
+ .map(str => decodeURIComponent(str)),
121
+ query: toQuery(url.searchParams),
122
+ fragment: stripLeadingHash(url.hash)
123
+ };
124
+ }
125
+ // test for IPNS path gateway URL
126
+ if (url.pathname.startsWith('/ipns/')) {
127
+ const parts = url.pathname.substring(6).split('/');
128
+ const name = parts.shift();
129
+ if (name == null) {
130
+ throw new InvalidParametersError(`Path gateway URL ${urlString} had no name`);
131
+ }
132
+ return {
133
+ url: new URL(`ipns://${name}${url.pathname.replace(`/ipns/${name}`, '')}${url.search}${url.hash}`),
134
+ protocol: 'ipns',
135
+ cidOrPeerIdOrDnsLink: name,
136
+ path: parts
137
+ .filter(str => str !== '')
138
+ .map(str => decodeURIComponent(str)),
139
+ query: toQuery(url.searchParams),
140
+ fragment: stripLeadingHash(url.hash)
141
+ };
142
+ }
143
+ throw new TypeError(`Invalid URL: ${urlString}, please use ipfs://, ipns://, or gateway URLs only`);
62
144
  }
63
145
  //# sourceMappingURL=parse-url-string.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-url-string.js","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,4FAA4F,CAAA;AAC9G,MAAM,UAAU,GAAG,2FAA2F,CAAA;AAC9G,MAAM,kBAAkB,GAAG,8GAA8G,CAAA;AACzI,MAAM,uBAAuB,GAAG,8GAA8G,CAAA;AAS9I,SAAS,mBAAmB,CAAE,MAA6D;IACzF,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAA;IACjC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;IACtC,MAAM,oBAAoB,GAAG,MAAM,EAAE,oBAAoB,CAAA;IACzD,IAAI,oBAAoB,IAAI,IAAI,EAAE,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;IAClD,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,CAAA;IACzB,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAA;IAE3B,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxC,OAAO,oBAAoB,KAAK,QAAQ;QACxC,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC;QAC1C,CAAC,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAA;AAChD,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,cAAc,CAAE,SAAiB;IAC/C,KAAK,MAAM,OAAO,IAAI,CAAC,uBAAuB,EAAE,SAAS,EAAE,kBAAkB,EAAE,UAAU,CAAC,EAAE,CAAC;QAC3F,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAEtC,IAAI,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,KAAK,CAAC,MAA+B,CAAA;YAEpD,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAC/C,CAAC;YAED,0CAA0C;YAC1C,IAAI,OAAO,KAAK,uBAAuB,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBACvH,MAAM,CAAC,oBAAoB,GAAG,mBAAmB,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAA;YAChF,CAAC;YAED,OAAO,MAAM,CAAA;QACf,CAAC;IACH,CAAC;IAED,MAAM,IAAI,SAAS,CAAC,gBAAgB,SAAS,qDAAqD,CAAC,CAAA;AACrG,CAAC;AAED;;;GAGG;AAEH,qEAAqE;AACrE,uEAAuE;AACvE,MAAM,aAAa,GAAG,+CAA+C,CAAA;AAErE;;;GAGG;AACH,SAAS,gBAAgB,CAAE,KAAa;IACtC,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACjF,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAE,SAAiB;IAC7C,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;AAC5E,CAAC"}
1
+ {"version":3,"file":"parse-url-string.js","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { CID } from 'multiformats/cid';
2
- import { matchURLString } from './parse-url-string.js';
2
+ import { parseURLString } from './parse-url-string.js';
3
3
  /**
4
4
  * Takes a resource and returns a session cache key as an IPFS or IPNS path with
5
5
  * any trailing segments removed.
@@ -21,7 +21,7 @@ export function resourceToSessionCacheKey(url) {
21
21
  return `ipfs://${CID.parse(url.toString())}`;
22
22
  }
23
23
  catch { }
24
- const { protocol, cidOrPeerIdOrDnsLink } = matchURLString(url.toString());
24
+ const { protocol, cidOrPeerIdOrDnsLink } = parseURLString(url.toString());
25
25
  return `${protocol}://${cidOrPeerIdOrDnsLink}`;
26
26
  }
27
27
  //# sourceMappingURL=resource-to-cache-key.js.map
@@ -5,8 +5,9 @@ export interface ResponseOptions extends ResponseInit {
5
5
  redirected?: boolean;
6
6
  }
7
7
  export declare function okResponse(url: string, body?: SupportedBodyTypes, init?: ResponseOptions): Response;
8
+ export declare function internalServerErrorResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
8
9
  export declare function badGatewayResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
9
- export declare function notSupportedResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
10
+ export declare function notImplementedResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
10
11
  export declare function notAcceptableResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
11
12
  export declare function notFoundResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
12
13
  export declare function badRequestResponse(url: string, errors: Error | Error[], init?: ResponseInit): Response;
@@ -1 +1 @@
1
- {"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../../src/utils/responses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAuB/C,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,wBAAgB,UAAU,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,QAAQ,CAepG;AAED,wBAAgB,kBAAkB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAWzG;AAED,wBAAgB,oBAAoB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAY3G;AAED,wBAAgB,qBAAqB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAW5G;AAED,wBAAgB,gBAAgB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAWvG;AAMD,wBAAgB,kBAAkB,CAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CA+BvG;AAED,wBAAgB,wBAAwB,CAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAetG;AAED,UAAU,YAAY;IACpB,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,eAAe,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,QAAQ,CA8CjJ;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAWvG"}
1
+ {"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../../src/utils/responses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AA6B/C,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,wBAAgB,UAAU,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,QAAQ,CAepG;AAED,wBAAgB,2BAA2B,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAYlH;AAED,wBAAgB,kBAAkB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAWzG;AAED,wBAAgB,sBAAsB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAY7G;AAED,wBAAgB,qBAAqB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAW5G;AAED,wBAAgB,gBAAgB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAWvG;AAMD,wBAAgB,kBAAkB,CAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CA+BvG;AAED,wBAAgB,wBAAwB,CAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAetG;AAED,UAAU,YAAY;IACpB,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,eAAe,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,QAAQ,CA8CjJ;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAWvG"}
@@ -10,6 +10,10 @@ function setType(response, value) {
10
10
  setField(response, 'type', value);
11
11
  }
12
12
  function setUrl(response, value) {
13
+ const fragmentStart = value.indexOf('#');
14
+ if (fragmentStart > -1) {
15
+ value = value.substring(0, fragmentStart);
16
+ }
13
17
  setField(response, 'url', value);
14
18
  }
15
19
  function setRedirected(response) {
@@ -28,6 +32,17 @@ export function okResponse(url, body, init) {
28
32
  setUrl(response, url);
29
33
  return response;
30
34
  }
35
+ export function internalServerErrorResponse(url, body, init) {
36
+ const response = new Response(body, {
37
+ ...(init ?? {}),
38
+ status: 500,
39
+ statusText: 'Internal Server Error'
40
+ });
41
+ response.headers.set('X-Content-Type-Options', 'nosniff'); // see https://specs.ipfs.tech/http-gateways/path-gateway/#x-content-type-options-response-header
42
+ setType(response, 'basic');
43
+ setUrl(response, url);
44
+ return response;
45
+ }
31
46
  export function badGatewayResponse(url, body, init) {
32
47
  const response = new Response(body, {
33
48
  ...(init ?? {}),
@@ -38,7 +53,7 @@ export function badGatewayResponse(url, body, init) {
38
53
  setUrl(response, url);
39
54
  return response;
40
55
  }
41
- export function notSupportedResponse(url, body, init) {
56
+ export function notImplementedResponse(url, body, init) {
42
57
  const response = new Response(body, {
43
58
  ...(init ?? {}),
44
59
  status: 501,
@@ -1 +1 @@
1
- {"version":3,"file":"responses.js","sourceRoot":"","sources":["../../../src/utils/responses.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"responses.js","sourceRoot":"","sources":["../../../src/utils/responses.ts"],"names":[],"mappings":"AAIA,SAAS,QAAQ,CAAE,QAAkB,EAAE,IAAY,EAAE,KAAuB;IAC1E,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE;QACpC,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,KAAK;QACnB,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;QACb,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK;KACjB,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,OAAO,CAAE,QAAkB,EAAE,KAA+D;IACnG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;AACnC,CAAC;AAED,SAAS,MAAM,CAAE,QAAkB,EAAE,KAAa;IAChD,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAExC,IAAI,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC;QACvB,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;IAC3C,CAAC;IAED,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AAClC,CAAC;AAED,SAAS,aAAa,CAAE,QAAkB;IACxC,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;AACxC,CAAC;AAMD,MAAM,UAAU,UAAU,CAAE,GAAW,EAAE,IAAyB,EAAE,IAAsB;IACxF,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;QAClC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACf,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,IAAI;KACjB,CAAC,CAAA;IAEF,IAAI,IAAI,EAAE,UAAU,KAAK,IAAI,EAAE,CAAC;QAC9B,aAAa,CAAC,QAAQ,CAAC,CAAA;IACzB,CAAC;IAED,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC1B,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAErB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAE,GAAW,EAAE,IAAyB,EAAE,IAAmB;IACtG,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;QAClC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACf,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,uBAAuB;KACpC,CAAC,CAAA;IACF,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAA,CAAC,iGAAiG;IAE3J,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC1B,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAErB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAE,GAAW,EAAE,IAAyB,EAAE,IAAmB;IAC7F,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;QAClC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACf,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,aAAa;KAC1B,CAAC,CAAA;IAEF,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC1B,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAErB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAE,GAAW,EAAE,IAAyB,EAAE,IAAmB;IACjG,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;QAClC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACf,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,iBAAiB;KAC9B,CAAC,CAAA;IACF,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAA,CAAC,iGAAiG;IAE3J,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC1B,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAErB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAE,GAAW,EAAE,IAAyB,EAAE,IAAmB;IAChG,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;QAClC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACf,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,gBAAgB;KAC7B,CAAC,CAAA;IAEF,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC1B,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAErB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAE,GAAW,EAAE,IAAyB,EAAE,IAAmB;IAC3F,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;QAClC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACf,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,WAAW;KACxB,CAAC,CAAA;IAEF,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC1B,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAErB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAS,eAAe,CAAE,IAA+B;IACvD,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,KAAK,CAAC,CAAA;AACnE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAE,GAAW,EAAE,MAAuB,EAAE,IAAmB;IAC3F,mFAAmF;IACnF,IAAI,KAAyB,CAAA;IAC7B,IAAI,eAAsE,CAAA;IAC1E,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA;QACvC,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;IACnF,CAAC;SAAM,IAAI,MAAM,YAAY,KAAK,EAAE,CAAC;QACnC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;QACpB,eAAe,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAA;IAC5E,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAC9B,KAAK;QACL,MAAM,EAAE,eAAe;KACxB,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE;QACtC,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,aAAa;QACzB,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACf,OAAO,EAAE;YACP,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;YACxB,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAA;IAEF,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC1B,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAErB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAE,GAAW,EAAE,QAAgB,EAAE,IAAmB;IAC1F,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;QAClC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACf,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,mBAAmB;QAC/B,OAAO,EAAE;YACP,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;YACxB,QAAQ;SACT;KACF,CAAC,CAAA;IAEF,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC1B,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAErB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAOD,MAAM,UAAU,eAAe,CAAE,GAAW,EAAE,IAAwB,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAgB,EAAE,IAAsB;IACrI,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC;QACrC,OAAO,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IACpC,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,CAAC;QAC1C,OAAO,gBAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAC1C,CAAC;IAED,IAAI,QAAkB,CAAA;IACtB,IAAI,CAAC;QACH,2DAA2D;QAC3D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAE1C,0FAA0F;QAC1F,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,cAAc,EAAE,CAAA;QAE9D,IAAI,oBAAoB,IAAI,IAAI,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAA;QACnD,CAAC;aAAM,CAAC;YACN,IAAI,gBAAgB,CAAC,mBAAmB,EAAE,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAA;YACrD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAA;YACxE,CAAC;QACH,CAAC;QAED,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;YAC5B,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;YACf,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,iBAAiB;YAC7B,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,GAAG,EAAE,KAAK,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAA;QAChD,OAAO,gBAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAC1C,CAAC;IAED,IAAI,IAAI,EAAE,UAAU,KAAK,IAAI,EAAE,CAAC;QAC9B,aAAa,CAAC,QAAQ,CAAC,CAAA;IACzB,CAAC;IAED,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC1B,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAErB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAE,GAAW,EAAE,IAAyB,EAAE,IAAmB;IAC3F,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;QAClC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACf,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,iCAAiC;KAC9C,CAAC,CAAA;IAEF,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC1B,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAErB,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -29,7 +29,7 @@ export function isObjectNode(node) {
29
29
  */
30
30
  export async function handlePathWalking({ cid, path, resource, options, blockstore, log }) {
31
31
  try {
32
- return await walkPath(blockstore, `${cid.toString()}/${path}`, options);
32
+ return await walkPath(blockstore, `${cid}/${path.join('/')}`, options);
33
33
  }
34
34
  catch (err) {
35
35
  if (options?.signal?.aborted) {
@@ -1 +1 @@
1
- {"version":3,"file":"walk-path.js","sourceRoot":"","sources":["../../../src/utils/walk-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAmBrE,KAAK,UAAU,QAAQ,CAAE,UAA2B,EAAE,IAAY,EAAE,OAA2B;IAC7F,MAAM,SAAS,GAAU,EAAE,CAAA;IAC3B,IAAI,eAAwC,CAAA;IAE5C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACzB,eAAe,GAAG,KAAK,CAAA;IACzB,CAAC;IAED,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,iBAAiB,CAAC,2BAA2B,CAAC,CAAA;IAC1D,CAAC;IAED,OAAO;QACL,SAAS;QACT,eAAe;KAChB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAE,IAAiB;IAC7C,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAA;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAA2D;IACjJ,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,CAAA;IACzE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAC/C,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,yBAAyB,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnF,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QACnC,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,8BAA8B,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QACpD,OAAO,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"walk-path.js","sourceRoot":"","sources":["../../../src/utils/walk-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAmBrE,KAAK,UAAU,QAAQ,CAAE,UAA2B,EAAE,IAAY,EAAE,OAA2B;IAC7F,MAAM,SAAS,GAAU,EAAE,CAAA;IAC3B,IAAI,eAAwC,CAAA;IAE5C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACzB,eAAe,GAAG,KAAK,CAAA;IACzB,CAAC;IAED,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,iBAAiB,CAAC,2BAA2B,CAAC,CAAA;IAC1D,CAAC;IAED,OAAO;QACL,SAAS;QACT,eAAe;KAChB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAE,IAAiB;IAC7C,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAA;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAA2D;IACjJ,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,UAAU,EAAE,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IACxE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAC/C,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,yBAAyB,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnF,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QACnC,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,8BAA8B,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QACpD,OAAO,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"verified-fetch.d.ts","sourceRoot":"","sources":["../../src/verified-fetch.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAgC,0BAA0B,EAAoB,QAAQ,EAAkB,iBAAiB,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAIjL,OAAO,KAAK,EAAE,KAAK,EAAqB,MAAM,kBAAkB,CAAA;AA2BhE,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA+B;IACjE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqC;IACxE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;gBAEvC,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,0BAA+B;IAsDhE,OAAO,CAAC,aAAa;IAgBrB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA+F3B;;;OAGG;YACW,iBAAiB;IAgF/B;;;;;;OAMG;IACG,KAAK,CAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwEhF;;OAEG;IACG,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAI7B;;OAEG;IACG,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;CAG7B"}
1
+ {"version":3,"file":"verified-fetch.d.ts","sourceRoot":"","sources":["../../src/verified-fetch.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAgC,0BAA0B,EAAoB,QAAQ,EAAkB,iBAAiB,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAIjL,OAAO,KAAK,EAAE,KAAK,EAAqB,MAAM,kBAAkB,CAAA;AA2BhE,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA+B;IACjE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqC;IACxE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;gBAEvC,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,0BAA+B;IAoDhE,OAAO,CAAC,aAAa;IAgBrB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA2F3B;;;OAGG;YACW,iBAAiB;IAiG/B;;;;;;OAMG;IACG,KAAK,CAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC;IA+EhF;;OAEG;IACG,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAI7B;;OAEG;IACG,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -1,7 +1,6 @@
1
1
  import { dnsLink } from '@helia/dnslink';
2
2
  import { ipnsResolver } from '@helia/ipns';
3
3
  import { AbortError } from '@libp2p/interface';
4
- import { prefixLogger } from '@libp2p/logger';
5
4
  import { CustomProgressEvent } from 'progress-events';
6
5
  import QuickLRU from 'quick-lru';
7
6
  import { ByteRangeContextPlugin } from './plugins/plugin-handle-byte-range-context.js';
@@ -15,6 +14,7 @@ import { RawPlugin } from './plugins/plugin-handle-raw.js';
15
14
  import { TarPlugin } from './plugins/plugin-handle-tar.js';
16
15
  import { URLResolver } from "./url-resolver.js";
17
16
  import { contentTypeParser } from './utils/content-type-parser.js';
17
+ import { errorToObject } from "./utils/error-to-object.js";
18
18
  import { getContentDispositionFilename } from './utils/get-content-disposition-filename.js';
19
19
  import { getETag } from './utils/get-e-tag.js';
20
20
  import { getResolvedAcceptHeader } from './utils/get-resolved-accept-header.js';
@@ -22,7 +22,7 @@ import { getRedirectResponse } from './utils/handle-redirects.js';
22
22
  import { uriEncodeIPFSPath } from "./utils/ipfs-path-to-string.js";
23
23
  import { resourceToSessionCacheKey } from './utils/resource-to-cache-key.js';
24
24
  import { setCacheControlHeader } from './utils/response-headers.js';
25
- import { badRequestResponse, notAcceptableResponse, notSupportedResponse, badGatewayResponse } from './utils/responses.js';
25
+ import { badRequestResponse, notAcceptableResponse, internalServerErrorResponse, notImplementedResponse } from './utils/responses.js';
26
26
  import { selectOutputType } from './utils/select-output-type.js';
27
27
  import { ServerTiming } from './utils/server-timing.js';
28
28
  const SESSION_CACHE_MAX_SIZE = 100;
@@ -68,7 +68,7 @@ export class VerifiedFetch {
68
68
  this.withServerTiming = init?.withServerTiming ?? false;
69
69
  const pluginOptions = {
70
70
  ...init,
71
- logger: prefixLogger('helia:verified-fetch'),
71
+ logger: helia.logger.forComponent('verified-fetch'),
72
72
  getBlockstore: (cid, resource, useSession, options) => this.getBlockstore(cid, resource, useSession, options),
73
73
  helia,
74
74
  contentTypeParser: this.contentTypeParser,
@@ -97,7 +97,6 @@ export class VerifiedFetch {
97
97
  else {
98
98
  this.plugins = defaultPlugins;
99
99
  }
100
- this.log.trace('created VerifiedFetch instance');
101
100
  }
102
101
  getBlockstore(root, resource, useSession = true, options = {}) {
103
102
  const key = resourceToSessionCacheKey(resource);
@@ -132,30 +131,23 @@ export class VerifiedFetch {
132
131
  }
133
132
  // set Content-Disposition header
134
133
  let contentDisposition;
135
- this.log.trace('checking for content disposition');
136
134
  // force download if requested
137
135
  if (context?.query?.download === true) {
136
+ this.log.trace('download requested');
138
137
  contentDisposition = 'attachment';
139
138
  }
140
- else {
141
- this.log.trace('download not requested');
142
- }
143
139
  // override filename if requested
144
140
  if (context?.query?.filename != null) {
141
+ this.log.trace('specific filename requested');
145
142
  if (contentDisposition == null) {
146
143
  contentDisposition = 'inline';
147
144
  }
148
145
  contentDisposition = `${contentDisposition}; ${getContentDispositionFilename(context.query.filename)}`;
149
146
  }
150
- else {
151
- this.log.trace('no filename specified in query');
152
- }
153
147
  if (contentDisposition != null) {
148
+ this.log.trace('content disposition %s', contentDisposition);
154
149
  response.headers.set('Content-Disposition', contentDisposition);
155
150
  }
156
- else {
157
- this.log.trace('no content disposition specified');
158
- }
159
151
  if (context?.cid != null && response.headers.get('etag') == null) {
160
152
  response.headers.set('etag', getETag({
161
153
  cid: context.pathDetails?.terminalElement.cid ?? context.cid,
@@ -211,28 +203,30 @@ export class VerifiedFetch {
211
203
  while (passCount < maxPasses) {
212
204
  this.log(`starting pipeline pass #${passCount + 1}`);
213
205
  passCount++;
206
+ this.log.trace('checking which plugins can handle %c%s with accept %o', context.cid, context.path != null ? `/${context.path}` : '', context.accept);
214
207
  // gather plugins that say they can handle the *current* context, but haven't been used yet
215
208
  const readyPlugins = this.plugins.filter(p => !pluginsUsed.has(p.id)).filter(p => p.canHandle(context));
216
209
  if (readyPlugins.length === 0) {
217
- this.log.trace('no plugins can handle the current context.. checking by CID code');
210
+ this.log.trace('no plugins can handle the current context, checking by CID code');
218
211
  const plugins = this.plugins.filter(p => p.codes.includes(context.cid.code));
219
212
  if (plugins.length > 0) {
220
213
  readyPlugins.push(...plugins);
221
214
  }
222
215
  else {
223
- this.log.trace('no plugins found that can handle request by CID code; exiting pipeline.');
216
+ this.log.trace('no plugins found that can handle request by CID code; exiting pipeline');
224
217
  break;
225
218
  }
226
219
  }
227
- this.log.trace('plugins ready to handle request: ', readyPlugins.map(p => p.id).join(', '));
220
+ this.log.trace('plugins ready to handle request: %s', readyPlugins.map(p => p.id).join(', '));
228
221
  // track if any plugin changed the context or returned a response
229
222
  let contextChanged = false;
230
223
  let pluginHandled = false;
231
224
  for (const plugin of readyPlugins) {
232
225
  try {
233
- this.log.trace('invoking plugin:', plugin.id);
226
+ this.log('invoking plugin: %s', plugin.id);
234
227
  pluginsUsed.add(plugin.id);
235
228
  const maybeResponse = await plugin.handle(context);
229
+ this.log('plugin response %s %o', plugin.id, maybeResponse);
236
230
  if (maybeResponse != null) {
237
231
  // if a plugin returns a final Response, short-circuit
238
232
  finalResponse = maybeResponse;
@@ -244,12 +238,14 @@ export class VerifiedFetch {
244
238
  if (context.options?.signal?.aborted) {
245
239
  throw new AbortError(context.options?.signal?.reason);
246
240
  }
247
- this.log.error('error in plugin %s - %e', plugin.constructor.name, err);
248
- // if fatal, short-circuit the pipeline
249
- if (err.name === 'PluginFatalError') {
250
- // if plugin provides a custom error response, return it
251
- return err.response ?? badGatewayResponse(context.resource, 'Failed to fetch');
252
- }
241
+ this.log.error('error in plugin %s - %e', plugin.id, err);
242
+ return internalServerErrorResponse(context.resource, JSON.stringify({
243
+ error: errorToObject(err)
244
+ }), {
245
+ headers: {
246
+ 'content-type': 'application/json'
247
+ }
248
+ });
253
249
  }
254
250
  finally {
255
251
  // on each plugin call, check for changes in the context
@@ -272,7 +268,13 @@ export class VerifiedFetch {
272
268
  break;
273
269
  }
274
270
  }
275
- return finalResponse;
271
+ return finalResponse ?? notImplementedResponse(context.resource, JSON.stringify({
272
+ error: errorToObject(new Error('No verified fetch plugin could handle the request'))
273
+ }), {
274
+ headers: {
275
+ 'content-type': 'application/json'
276
+ }
277
+ });
276
278
  }
277
279
  /**
278
280
  * We're starting to get to the point where we need a queue or pipeline of
@@ -308,7 +310,7 @@ export class VerifiedFetch {
308
310
  options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:resolve', { cid: parsedResult.cid, path: parsedResult.path }));
309
311
  const acceptHeader = getResolvedAcceptHeader({ query: parsedResult.query, headers: options?.headers, logger: this.helia.logger });
310
312
  const accept = selectOutputType(parsedResult.cid, acceptHeader);
311
- this.log('output type %s', accept);
313
+ this.log('accept %o', accept);
312
314
  if (acceptHeader != null && accept == null) {
313
315
  this.log.error('could not fulfil request based on accept header');
314
316
  return this.handleFinalResponse(notAcceptableResponse(resource.toString()));
@@ -332,8 +334,14 @@ export class VerifiedFetch {
332
334
  };
333
335
  this.log.trace('finding handler for cid code "%s" and response content type "%s"', parsedResult.cid.code, responseContentType);
334
336
  const response = await this.runPluginPipeline(context);
335
- options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:end', { cid: parsedResult.cid, path: parsedResult.path }));
336
- return this.handleFinalResponse(response ?? notSupportedResponse(resource.toString()), context);
337
+ options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:end', {
338
+ cid: parsedResult.cid,
339
+ path: parsedResult.path
340
+ }));
341
+ if (response == null) {
342
+ this.log.error('no plugin could handle request for %s', resource);
343
+ }
344
+ return this.handleFinalResponse(response, context);
337
345
  }
338
346
  /**
339
347
  * Start the Helia instance