@helia/verified-fetch 4.0.1 → 4.0.3

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 (68) hide show
  1. package/dist/index.min.js +48 -48
  2. package/dist/index.min.js.map +4 -4
  3. package/dist/src/index.d.ts +4 -2
  4. package/dist/src/index.d.ts.map +1 -1
  5. package/dist/src/index.js.map +1 -1
  6. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.d.ts +3 -3
  7. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.d.ts.map +1 -1
  8. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.js +5 -5
  9. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.js.map +1 -1
  10. package/dist/src/plugins/plugin-handle-dag-pb.d.ts.map +1 -1
  11. package/dist/src/plugins/plugin-handle-dag-pb.js +35 -25
  12. package/dist/src/plugins/plugin-handle-dag-pb.js.map +1 -1
  13. package/dist/src/plugins/plugin-handle-ipns-record.d.ts +1 -1
  14. package/dist/src/plugins/plugin-handle-ipns-record.d.ts.map +1 -1
  15. package/dist/src/plugins/plugin-handle-ipns-record.js +2 -2
  16. package/dist/src/plugins/plugin-handle-ipns-record.js.map +1 -1
  17. package/dist/src/plugins/plugin-handle-raw.js +1 -1
  18. package/dist/src/plugins/plugin-handle-raw.js.map +1 -1
  19. package/dist/src/plugins/types.d.ts +1 -4
  20. package/dist/src/plugins/types.d.ts.map +1 -1
  21. package/dist/src/url-resolver.d.ts +4 -3
  22. package/dist/src/url-resolver.d.ts.map +1 -1
  23. package/dist/src/url-resolver.js +35 -47
  24. package/dist/src/url-resolver.js.map +1 -1
  25. package/dist/src/utils/dnslink-label.d.ts +26 -0
  26. package/dist/src/utils/dnslink-label.d.ts.map +1 -0
  27. package/dist/src/utils/dnslink-label.js +35 -0
  28. package/dist/src/utils/dnslink-label.js.map +1 -0
  29. package/dist/src/utils/get-content-type.d.ts +1 -1
  30. package/dist/src/utils/get-content-type.d.ts.map +1 -1
  31. package/dist/src/utils/get-content-type.js +2 -2
  32. package/dist/src/utils/get-content-type.js.map +1 -1
  33. package/dist/src/utils/get-stream-from-async-iterable.d.ts +1 -2
  34. package/dist/src/utils/get-stream-from-async-iterable.d.ts.map +1 -1
  35. package/dist/src/utils/get-stream-from-async-iterable.js +1 -3
  36. package/dist/src/utils/get-stream-from-async-iterable.js.map +1 -1
  37. package/dist/src/utils/handle-redirects.js +2 -2
  38. package/dist/src/utils/ipfs-path-to-url.d.ts +16 -0
  39. package/dist/src/utils/ipfs-path-to-url.d.ts.map +1 -0
  40. package/dist/src/utils/ipfs-path-to-url.js +45 -0
  41. package/dist/src/utils/ipfs-path-to-url.js.map +1 -0
  42. package/dist/src/utils/parse-url-string.d.ts +18 -5
  43. package/dist/src/utils/parse-url-string.d.ts.map +1 -1
  44. package/dist/src/utils/parse-url-string.js +126 -44
  45. package/dist/src/utils/parse-url-string.js.map +1 -1
  46. package/dist/src/utils/resource-to-cache-key.js +2 -2
  47. package/dist/src/utils/responses.d.ts.map +1 -1
  48. package/dist/src/utils/responses.js +4 -0
  49. package/dist/src/utils/responses.js.map +1 -1
  50. package/dist/src/utils/walk-path.js +1 -1
  51. package/dist/src/utils/walk-path.js.map +1 -1
  52. package/package.json +10 -10
  53. package/src/index.ts +4 -2
  54. package/src/plugins/plugin-handle-dag-cbor-html-preview.ts +8 -8
  55. package/src/plugins/plugin-handle-dag-pb.ts +42 -24
  56. package/src/plugins/plugin-handle-ipns-record.ts +2 -2
  57. package/src/plugins/plugin-handle-raw.ts +1 -1
  58. package/src/plugins/types.ts +1 -4
  59. package/src/url-resolver.ts +37 -56
  60. package/src/utils/dnslink-label.ts +38 -0
  61. package/src/utils/get-content-type.ts +3 -3
  62. package/src/utils/get-stream-from-async-iterable.ts +1 -4
  63. package/src/utils/handle-redirects.ts +2 -2
  64. package/src/utils/ipfs-path-to-url.ts +54 -0
  65. package/src/utils/parse-url-string.ts +166 -49
  66. package/src/utils/resource-to-cache-key.ts +2 -2
  67. package/src/utils/responses.ts +6 -0
  68. package/src/utils/walk-path.ts +1 -1
@@ -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
@@ -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,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"}
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) {
@@ -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":"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"}
@@ -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}/${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,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,CAAA;IAC9D,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@helia/verified-fetch",
3
- "version": "4.0.1",
3
+ "version": "4.0.3",
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",
@@ -175,12 +175,12 @@
175
175
  "@ipld/dag-cbor": "^9.2.3",
176
176
  "@ipld/dag-json": "^10.2.4",
177
177
  "@ipld/dag-pb": "^4.1.5",
178
- "@libp2p/interface": "^3.0.0",
179
- "@libp2p/kad-dht": "^16.0.0",
180
- "@libp2p/peer-id": "^6.0.0",
181
- "@libp2p/utils": "^7.0.5",
182
- "@libp2p/webrtc": "^6.0.0",
183
- "@libp2p/websockets": "^10.0.0",
178
+ "@libp2p/interface": "^3.1.0",
179
+ "@libp2p/kad-dht": "^16.1.0",
180
+ "@libp2p/peer-id": "^6.0.4",
181
+ "@libp2p/utils": "^7.0.7",
182
+ "@libp2p/webrtc": "^6.0.8",
183
+ "@libp2p/websockets": "^10.1.0",
184
184
  "@multiformats/dns": "^1.0.6",
185
185
  "cborg": "^4.2.11",
186
186
  "file-type": "^21.0.0",
@@ -193,7 +193,7 @@
193
193
  "it-tar": "^6.0.5",
194
194
  "it-to-browser-readablestream": "^2.0.11",
195
195
  "it-to-buffer": "^4.0.9",
196
- "libp2p": "^3.0.0",
196
+ "libp2p": "^3.1.0",
197
197
  "multiformats": "^13.3.6",
198
198
  "progress-events": "^1.0.1",
199
199
  "quick-lru": "^7.0.1"
@@ -204,8 +204,8 @@
204
204
  "@helia/http": "^3.0.5",
205
205
  "@helia/json": "^5.0.0",
206
206
  "@ipld/car": "^5.4.2",
207
- "@libp2p/crypto": "^5.1.3",
208
- "@libp2p/logger": "^6.0.0",
207
+ "@libp2p/crypto": "^5.1.13",
208
+ "@libp2p/logger": "^6.2.0",
209
209
  "@types/sinon": "^17.0.4",
210
210
  "aegir": "^47.0.24",
211
211
  "browser-readablestream-to-it": "^2.0.9",
package/src/index.ts CHANGED
@@ -856,7 +856,7 @@ export interface ResourceDetail {
856
856
 
857
857
  export interface CIDDetail {
858
858
  cid: CID
859
- path?: string
859
+ path?: string[]
860
860
  }
861
861
 
862
862
  export interface CIDDetailError extends CIDDetail {
@@ -1069,10 +1069,12 @@ export interface UrlQuery extends Record<string, string | unknown> {
1069
1069
  }
1070
1070
 
1071
1071
  export interface ResolveURLResult {
1072
+ url: URL
1072
1073
  cid: CID
1073
1074
  protocol: string
1074
1075
  ttl: number
1075
- path: string
1076
+ path: string[]
1077
+ fragment: string
1076
1078
  query: UrlQuery
1077
1079
  ipfsPath: string
1078
1080
  }
@@ -98,7 +98,7 @@ export class DagCborHtmlPreviewPlugin extends BasePlugin {
98
98
  })
99
99
  }
100
100
 
101
- getHtml ({ path, obj, cid }: { path?: string, obj: Record<string, any>, cid: CID }): string {
101
+ getHtml ({ path, obj, cid }: { path?: string[], obj: Record<string, any>, cid: CID }): string {
102
102
  const style = `
103
103
  :root {
104
104
  --sans-serif: "Plex", system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif;
@@ -221,7 +221,7 @@ export class DagCborHtmlPreviewPlugin extends BasePlugin {
221
221
  <main>
222
222
  <header>
223
223
  <div><strong>CID: </strong> <code class="nowrap">${cid}</code></div>
224
- <div><strong>Codec: </strong> ${this.valueHTML('dag-cbor (0x71)', null)}</div>
224
+ <div><strong>Codec: </strong> ${this.valueHTML('dag-cbor (0x71)', [])}</div>
225
225
  </header>
226
226
  <section class="container">
227
227
  <p>You can download this block as:</p>
@@ -242,7 +242,7 @@ export class DagCborHtmlPreviewPlugin extends BasePlugin {
242
242
  </html>`
243
243
  }
244
244
 
245
- valueHTML (value: any, link: string | null): string {
245
+ valueHTML (value: any, link: string[]): string {
246
246
  let valueString: string
247
247
  const isALinkObject = isLink(value)
248
248
  if (!isALinkObject && typeof value !== 'string') {
@@ -259,11 +259,11 @@ export class DagCborHtmlPreviewPlugin extends BasePlugin {
259
259
  return valueCodeBlock
260
260
  }
261
261
 
262
- private renderValue (key: string, value: any, currentPath: string): string {
262
+ private renderValue (key: string, value: any, currentPath: string[]): string {
263
263
  let rows = ''
264
264
  value.forEach((item: any, idx: number) => {
265
- const itemPath = currentPath ? `${currentPath}/${key}/${idx}` : `${key}/${idx}`
266
- rows += `<div>${this.valueHTML(idx, null)}</div>`
265
+ const itemPath = [...currentPath, key, idx.toString()]
266
+ rows += `<div>${this.valueHTML(idx, [])}</div>`
267
267
  if (isPrimitive(item)) {
268
268
  rows += `<div>${this.valueHTML(item, itemPath)}</div>`
269
269
  } else {
@@ -275,7 +275,7 @@ export class DagCborHtmlPreviewPlugin extends BasePlugin {
275
275
  return rows
276
276
  }
277
277
 
278
- renderRows (obj: Record<string, any>, currentPath: string = ''): string {
278
+ renderRows (obj: Record<string, any>, currentPath: string[] = []): string {
279
279
  let rows = ''
280
280
  for (const [key, value] of Object.entries(obj)) {
281
281
  if (Array.isArray(value)) {
@@ -284,7 +284,7 @@ export class DagCborHtmlPreviewPlugin extends BasePlugin {
284
284
  rows += this.renderValue(key, value, currentPath)
285
285
  rows += '</div>'
286
286
  } else {
287
- const valuePath = currentPath ? `${currentPath}/${key}` : key
287
+ const valuePath = [...currentPath, key]
288
288
  rows += `<div>${key}</div><div>${this.valueHTML(value, valuePath)}</div>`
289
289
  }
290
290
  }
@@ -40,23 +40,25 @@ export class DagPbPlugin extends BasePlugin {
40
40
  * @see https://specs.ipfs.tech/http-gateways/path-gateway/#use-in-directory-url-normalization
41
41
  */
42
42
  getRedirectUrl (context: PluginContext): string | null {
43
- const { resource, path } = context
44
- const redirectCheckNeeded = path === '' ? !resource.toString().endsWith('/') : !path.endsWith('/')
45
- if (redirectCheckNeeded) {
46
- try {
47
- const url = new URL(resource.toString())
48
- if (url.pathname.endsWith('/')) {
49
- // url already has a trailing slash
50
- return null
51
- }
52
- // make sure we append slash to end of the path
53
- url.pathname = `${url.pathname}/`
54
- return url.toString()
55
- } catch (err: any) {
56
- // resource is likely a CID
57
- return `${resource.toString()}/`
58
- }
43
+ const { resource, url, isDirectory } = context
44
+
45
+ let uri: URL
46
+
47
+ try {
48
+ // try the requested resource
49
+ uri = new URL(resource)
50
+ } catch {
51
+ // fall back to the canonical URL
52
+ uri = url
53
+ }
54
+
55
+ // directories must be requested with a trailing slash
56
+ if (isDirectory && !uri.pathname.endsWith('/')) {
57
+ // make sure we append slash to end of the path
58
+ uri.pathname += '/'
59
+ return uri.toString()
59
60
  }
61
+
60
62
  return null
61
63
  }
62
64
 
@@ -65,7 +67,8 @@ export class DagPbPlugin extends BasePlugin {
65
67
  const { contentTypeParser, helia, getBlockstore } = this.pluginOptions
66
68
  const log = this.log
67
69
  let resource = context.resource
68
- let path = context.path
70
+ const path = context.path
71
+ let filename = query?.filename
69
72
 
70
73
  let redirected = false
71
74
 
@@ -75,8 +78,9 @@ export class DagPbPlugin extends BasePlugin {
75
78
  let resolvedCID = terminalElement.cid
76
79
  const fs = unixfs({ ...helia, blockstore: getBlockstore(context.cid, context.resource, options?.session ?? true, options) })
77
80
 
81
+ context.isDirectory = terminalElement?.type === 'directory'
82
+
78
83
  if (terminalElement?.type === 'directory') {
79
- const dirCid = terminalElement.cid
80
84
  const redirectUrl = this.getRedirectUrl(context)
81
85
 
82
86
  if (redirectUrl != null) {
@@ -95,7 +99,9 @@ export class DagPbPlugin extends BasePlugin {
95
99
  redirected = true
96
100
  }
97
101
 
102
+ const dirCid = terminalElement.cid
98
103
  const rootFilePath = 'index.html'
104
+
99
105
  try {
100
106
  log.trace('found directory at %c/%s, looking for index.html', cid, path)
101
107
 
@@ -105,8 +111,10 @@ export class DagPbPlugin extends BasePlugin {
105
111
  }))
106
112
 
107
113
  log.trace('found root file at %c/%s with cid %c', dirCid, rootFilePath, entry.cid)
108
- path = rootFilePath
109
114
  resolvedCID = entry.cid
115
+
116
+ // use `index.html` as the file name to help with content types
117
+ filename = rootFilePath
110
118
  } catch (err: any) {
111
119
  if (options?.signal?.aborted) {
112
120
  throw new AbortError(options?.signal?.reason)
@@ -126,13 +134,17 @@ export class DagPbPlugin extends BasePlugin {
126
134
  // dir-index-html plugin or dir-index-json (future idea?) plugin should handle this
127
135
  return null
128
136
  } finally {
129
- options?.onProgress?.(new CustomProgressEvent<CIDDetail>('verified-fetch:request:end', { cid: dirCid, path: rootFilePath }))
137
+ options?.onProgress?.(new CustomProgressEvent<CIDDetail>('verified-fetch:request:end', { cid: dirCid, path: [rootFilePath] }))
130
138
  }
131
139
  }
132
140
 
133
141
  try {
134
142
  // attempt to get the exact file size, but timeout quickly.
135
- const stat = await fs.stat(resolvedCID, { extended: true, signal: AbortSignal.timeout(500) })
143
+ const stat = await fs.stat(resolvedCID, {
144
+ extended: true,
145
+ signal: AbortSignal.timeout(500)
146
+ })
147
+
136
148
  byteRangeContext.setFileSize(stat.size)
137
149
  } catch (err: any) {
138
150
  log.error('error getting exact file size for %c/%s - %e', cid, path, err)
@@ -157,13 +169,19 @@ export class DagPbPlugin extends BasePlugin {
157
169
  })
158
170
  log('got async iterator for %c/%s', cid, path)
159
171
 
160
- const streamAndFirstChunk = await context.serverTiming.time('stream-and-chunk', '', getStreamFromAsyncIterable(asyncIter, path, this.pluginOptions.logger, {
172
+ const streamAndFirstChunk = await context.serverTiming.time('stream-and-chunk', '', getStreamFromAsyncIterable(asyncIter, {
161
173
  onProgress: options?.onProgress,
162
174
  signal: options?.signal
163
175
  }))
164
176
  const stream = streamAndFirstChunk.stream
165
177
  firstChunk = streamAndFirstChunk.firstChunk
166
- contentType = await context.serverTiming.time('get-content-type', '', getContentType({ filename: query.filename, bytes: firstChunk, path, contentTypeParser, log }))
178
+ contentType = await context.serverTiming.time('get-content-type', '', getContentType({
179
+ path,
180
+ filename,
181
+ bytes: firstChunk,
182
+ contentTypeParser,
183
+ log
184
+ }))
167
185
 
168
186
  byteRangeContext.setBody(stream)
169
187
  }
@@ -207,7 +225,7 @@ export class DagPbPlugin extends BasePlugin {
207
225
  length: 8192
208
226
  })
209
227
 
210
- const { firstChunk } = await getStreamFromAsyncIterable(asyncIter, path ?? '', this.pluginOptions.logger, {
228
+ const { firstChunk } = await getStreamFromAsyncIterable(asyncIter, {
211
229
  onProgress: options?.onProgress,
212
230
  signal: options?.signal
213
231
  })
@@ -13,7 +13,7 @@ export class IpnsRecordPlugin extends BasePlugin {
13
13
  readonly id = 'ipns-record-plugin'
14
14
  readonly codes = []
15
15
 
16
- canHandle ({ resource, accept, query, path, byteRangeContext }: PluginContext): boolean {
16
+ canHandle ({ accept, query, byteRangeContext }: PluginContext): boolean {
17
17
  if (byteRangeContext == null) {
18
18
  return false
19
19
  }
@@ -26,7 +26,7 @@ export class IpnsRecordPlugin extends BasePlugin {
26
26
  const { ipnsResolver } = this.pluginOptions
27
27
  context.reqFormat = 'ipns-record'
28
28
 
29
- if (path !== '' || !(resource.startsWith('ipns://') || resource.includes('.ipns.') || resource.includes('/ipns/'))) {
29
+ if (path.length > 0 || !(resource.startsWith('ipns://') || resource.includes('.ipns.') || resource.includes('/ipns/'))) {
30
30
  this.log.error('invalid request for IPNS name "%s" and path "%s"', resource, path)
31
31
  return badRequestResponse(resource, new Error('Invalid IPNS name'))
32
32
  }
@@ -70,7 +70,7 @@ export class RawPlugin extends BasePlugin {
70
70
  log.trace('did not set content disposition, raw block will display inline')
71
71
  }
72
72
 
73
- if (path !== '' && cid.code === rawCode) {
73
+ if (path.length > 0 && cid.code === rawCode) {
74
74
  log.trace('404-ing raw codec request for %c/%s', cid, path)
75
75
  return notFoundResponse(resource)
76
76
  }
@@ -1,4 +1,4 @@
1
- import type { ResolveURLResult, UrlQuery, VerifiedFetchInit, ContentTypeParser, RequestFormatShorthand } from '../index.js'
1
+ import type { ResolveURLResult, VerifiedFetchInit, ContentTypeParser, RequestFormatShorthand } from '../index.js'
2
2
  import type { ByteRangeContext } from '../utils/byte-range-context.js'
3
3
  import type { AcceptHeader } from '../utils/select-output-type.ts'
4
4
  import type { ServerTiming } from '../utils/server-timing.ts'
@@ -31,8 +31,6 @@ export interface PluginOptions {
31
31
  * - Ephemeral: Typically discarded once fetch(...) completes.
32
32
  */
33
33
  export interface PluginContext extends ResolveURLResult {
34
- readonly cid: CID
35
- readonly path: string
36
34
  readonly resource: string
37
35
  readonly accept?: AcceptHeader
38
36
 
@@ -52,7 +50,6 @@ export interface PluginContext extends ResolveURLResult {
52
50
  directoryEntries?: UnixFSEntry[]
53
51
  reqFormat?: RequestFormatShorthand
54
52
  pathDetails?: PathWalkerResponse
55
- query: UrlQuery
56
53
 
57
54
  /**
58
55
  * ByteRangeContext contains information about the size of the content and range requests.