@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.
- package/dist/index.min.js +48 -48
- package/dist/index.min.js.map +4 -4
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.d.ts +3 -3
- package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.js +5 -5
- package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.js.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-pb.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-pb.js +35 -25
- package/dist/src/plugins/plugin-handle-dag-pb.js.map +1 -1
- package/dist/src/plugins/plugin-handle-ipns-record.d.ts +1 -1
- package/dist/src/plugins/plugin-handle-ipns-record.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-ipns-record.js +2 -2
- package/dist/src/plugins/plugin-handle-ipns-record.js.map +1 -1
- package/dist/src/plugins/plugin-handle-raw.js +1 -1
- package/dist/src/plugins/plugin-handle-raw.js.map +1 -1
- package/dist/src/plugins/types.d.ts +1 -4
- package/dist/src/plugins/types.d.ts.map +1 -1
- package/dist/src/url-resolver.d.ts +4 -3
- package/dist/src/url-resolver.d.ts.map +1 -1
- package/dist/src/url-resolver.js +35 -47
- package/dist/src/url-resolver.js.map +1 -1
- package/dist/src/utils/dnslink-label.d.ts +26 -0
- package/dist/src/utils/dnslink-label.d.ts.map +1 -0
- package/dist/src/utils/dnslink-label.js +35 -0
- package/dist/src/utils/dnslink-label.js.map +1 -0
- package/dist/src/utils/get-content-type.d.ts +1 -1
- package/dist/src/utils/get-content-type.d.ts.map +1 -1
- package/dist/src/utils/get-content-type.js +2 -2
- package/dist/src/utils/get-content-type.js.map +1 -1
- package/dist/src/utils/get-stream-from-async-iterable.d.ts +1 -2
- package/dist/src/utils/get-stream-from-async-iterable.d.ts.map +1 -1
- package/dist/src/utils/get-stream-from-async-iterable.js +1 -3
- package/dist/src/utils/get-stream-from-async-iterable.js.map +1 -1
- package/dist/src/utils/handle-redirects.js +2 -2
- package/dist/src/utils/ipfs-path-to-url.d.ts +16 -0
- package/dist/src/utils/ipfs-path-to-url.d.ts.map +1 -0
- package/dist/src/utils/ipfs-path-to-url.js +45 -0
- package/dist/src/utils/ipfs-path-to-url.js.map +1 -0
- package/dist/src/utils/parse-url-string.d.ts +18 -5
- package/dist/src/utils/parse-url-string.d.ts.map +1 -1
- package/dist/src/utils/parse-url-string.js +126 -44
- package/dist/src/utils/parse-url-string.js.map +1 -1
- package/dist/src/utils/resource-to-cache-key.js +2 -2
- package/dist/src/utils/responses.d.ts.map +1 -1
- package/dist/src/utils/responses.js +4 -0
- package/dist/src/utils/responses.js.map +1 -1
- package/dist/src/utils/walk-path.js +1 -1
- package/dist/src/utils/walk-path.js.map +1 -1
- package/package.json +10 -10
- package/src/index.ts +4 -2
- package/src/plugins/plugin-handle-dag-cbor-html-preview.ts +8 -8
- package/src/plugins/plugin-handle-dag-pb.ts +42 -24
- package/src/plugins/plugin-handle-ipns-record.ts +2 -2
- package/src/plugins/plugin-handle-raw.ts +1 -1
- package/src/plugins/types.ts +1 -4
- package/src/url-resolver.ts +37 -56
- package/src/utils/dnslink-label.ts +38 -0
- package/src/utils/get-content-type.ts +3 -3
- package/src/utils/get-stream-from-async-iterable.ts +1 -4
- package/src/utils/handle-redirects.ts +2 -2
- package/src/utils/ipfs-path-to-url.ts +54 -0
- package/src/utils/parse-url-string.ts +166 -49
- package/src/utils/resource-to-cache-key.ts +2 -2
- package/src/utils/responses.ts +6 -0
- package/src/utils/walk-path.ts +1 -1
|
@@ -1,63 +1,145 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const SUBDOMAIN_GATEWAY_REGEX = /^
|
|
5
|
-
function
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
41
|
-
*
|
|
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
|
|
51
|
-
|
|
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
|
-
*
|
|
55
|
-
* - Every standalone - is replaced with .
|
|
56
|
-
* - Every remaining -- is replaced with -
|
|
68
|
+
* Accepts the following url strings:
|
|
57
69
|
*
|
|
58
|
-
*
|
|
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
|
|
61
|
-
|
|
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,
|
|
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 {
|
|
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 } =
|
|
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;
|
|
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;
|
|
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.
|
|
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.
|
|
179
|
-
"@libp2p/kad-dht": "^16.
|
|
180
|
-
"@libp2p/peer-id": "^6.0.
|
|
181
|
-
"@libp2p/utils": "^7.0.
|
|
182
|
-
"@libp2p/webrtc": "^6.0.
|
|
183
|
-
"@libp2p/websockets": "^10.
|
|
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.
|
|
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.
|
|
208
|
-
"@libp2p/logger": "^6.
|
|
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)',
|
|
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
|
|
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
|
|
266
|
-
rows += `<div>${this.valueHTML(idx,
|
|
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 =
|
|
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
|
|
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,
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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, {
|
|
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,
|
|
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({
|
|
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,
|
|
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 ({
|
|
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
|
|
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
|
|
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
|
}
|
package/src/plugins/types.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ResolveURLResult,
|
|
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.
|