@helia/verified-fetch 7.0.1 → 7.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 +28 -28
- package/dist/index.min.js.map +3 -3
- package/dist/src/constants.d.ts +1 -0
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +1 -0
- package/dist/src/constants.js.map +1 -1
- package/dist/src/url-resolver.d.ts.map +1 -1
- package/dist/src/url-resolver.js +40 -12
- package/dist/src/url-resolver.js.map +1 -1
- package/package.json +1 -1
- package/src/constants.ts +1 -0
- package/src/url-resolver.ts +46 -14
package/dist/src/constants.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare const CODEC_IDENTITY = 0;
|
|
2
2
|
export declare const CODEC_CBOR = 81;
|
|
3
|
+
export declare const CODEC_LIBP2P_KEY = 114;
|
|
3
4
|
export declare const SESSION_CACHE_MAX_SIZE = 100;
|
|
4
5
|
export declare const SESSION_CACHE_TTL_MS: number;
|
|
5
6
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,IAAO,CAAA;AAClC,eAAO,MAAM,UAAU,KAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,IAAO,CAAA;AAClC,eAAO,MAAM,UAAU,KAAO,CAAA;AAC9B,eAAO,MAAM,gBAAgB,MAAO,CAAA;AAEpC,eAAO,MAAM,sBAAsB,MAAM,CAAA;AACzC,eAAO,MAAM,oBAAoB,QAAY,CAAA"}
|
package/dist/src/constants.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAA;AAClC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAA;AAClC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAA;AAC9B,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAA;AAEpC,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAA;AACzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-resolver.d.ts","sourceRoot":"","sources":["../../src/url-resolver.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAKtC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAC1G,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,OAAO,KAAK,EAAE,KAAK,EAAsC,MAAM,OAAO,CAAA;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,sBAAsB,CAAA;AASlE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,GAAG,EAAE,CAAA;IAChB,eAAe,EAAE,SAAS,CAAA;IAC1B,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,OAAO,CAAA;CACpB;AAcD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,KAAK,CAAA;IACZ,YAAY,EAAE,YAAY,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,qBAAa,WAAY,YAAW,oBAAoB;IACtD,OAAO,CAAC,GAAG,CAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqC;gBAE3D,UAAU,EAAE,qBAAqB,EAAE,IAAI,GAAE,eAAoB;IAapE,OAAO,CAAE,GAAG,EAAE,GAAG,EAAE,YAAY,GAAE,YAAiC,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,GAAG,QAAQ,CAAC;YAgBlI,aAAa;YAmCb,cAAc;
|
|
1
|
+
{"version":3,"file":"url-resolver.d.ts","sourceRoot":"","sources":["../../src/url-resolver.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAKtC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAC1G,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,OAAO,KAAK,EAAE,KAAK,EAAsC,MAAM,OAAO,CAAA;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,sBAAsB,CAAA;AASlE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,GAAG,EAAE,CAAA;IAChB,eAAe,EAAE,SAAS,CAAA;IAC1B,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,OAAO,CAAA;CACpB;AAcD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,KAAK,CAAA;IACZ,YAAY,EAAE,YAAY,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,qBAAa,WAAY,YAAW,oBAAoB;IACtD,OAAO,CAAC,GAAG,CAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqC;gBAE3D,UAAU,EAAE,qBAAqB,EAAE,IAAI,GAAE,eAAoB;IAapE,OAAO,CAAE,GAAG,EAAE,GAAG,EAAE,YAAY,GAAE,YAAiC,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,GAAG,QAAQ,CAAC;YAgBlI,aAAa;YAmCb,cAAc;YAoCd,eAAe;YAoBf,eAAe;YA8Bf,QAAQ;CAgFvB"}
|
package/dist/src/url-resolver.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { DoesNotExistError } from '@helia/unixfs/errors';
|
|
2
|
-
import { peerIdFromString } from '@libp2p/peer-id';
|
|
2
|
+
import { peerIdFromCID, peerIdFromString } from '@libp2p/peer-id';
|
|
3
3
|
import { exporter, InvalidParametersError, walkPath } from 'ipfs-unixfs-exporter';
|
|
4
4
|
import toBuffer from 'it-to-buffer';
|
|
5
5
|
import { CID } from 'multiformats/cid';
|
|
6
6
|
import QuickLRU from 'quick-lru';
|
|
7
7
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
8
|
-
import { SESSION_CACHE_MAX_SIZE, SESSION_CACHE_TTL_MS } from "./constants.js";
|
|
8
|
+
import { CODEC_LIBP2P_KEY, SESSION_CACHE_MAX_SIZE, SESSION_CACHE_TTL_MS } from "./constants.js";
|
|
9
9
|
import { applyRedirects } from "./utils/apply-redirect.js";
|
|
10
10
|
import { ServerTiming } from "./utils/server-timing.js";
|
|
11
11
|
// 1 year in seconds for ipfs content
|
|
@@ -81,24 +81,22 @@ export class URLResolver {
|
|
|
81
81
|
if (result == null) {
|
|
82
82
|
throw new TypeError(`Invalid resource. Cannot resolve DNSLink from domain: ${url.hostname}`);
|
|
83
83
|
}
|
|
84
|
-
if (result.path != null && (url.pathname !== '' && url.pathname !== '/')) {
|
|
85
|
-
// path conflict?
|
|
86
|
-
}
|
|
87
84
|
let resolveResult;
|
|
85
|
+
const path = normalizePath(`${result.path}/${url.pathname}`);
|
|
88
86
|
if (result.namespace === 'ipns') {
|
|
89
87
|
// dnslink resolved to IPNS name
|
|
90
|
-
const ipnsUrl = new URL(`ipns://${result.peerId
|
|
88
|
+
const ipnsUrl = new URL(`ipns://${result.peerId}${path}`);
|
|
91
89
|
resolveResult = await this.resolveIPNSName(ipnsUrl, serverTiming, options);
|
|
92
90
|
}
|
|
93
91
|
else if (result.namespace === 'ipfs') {
|
|
94
92
|
// dnslink resolved to CID
|
|
95
|
-
const ipfsUrl = new URL(`ipfs://${result.cid}
|
|
93
|
+
const ipfsUrl = new URL(`ipfs://${result.cid}${path}`);
|
|
96
94
|
resolveResult = await this.resolveIPFSPath(ipfsUrl, serverTiming, options);
|
|
97
95
|
}
|
|
98
96
|
else {
|
|
99
97
|
// @ts-expect-error @helia/dnslink follows recursive DNSLink records so
|
|
100
98
|
// result namespace should only be ipns or ipfs
|
|
101
|
-
throw new TypeError(`Invalid resource. Unexpected DNSLink namespace ${result.namespace} from domain: ${
|
|
99
|
+
throw new TypeError(`Invalid resource. Unexpected DNSLink namespace ${result.namespace} from domain: ${url.hostname}`);
|
|
102
100
|
}
|
|
103
101
|
if (resolveResult instanceof Response) {
|
|
104
102
|
return resolveResult;
|
|
@@ -112,10 +110,8 @@ export class URLResolver {
|
|
|
112
110
|
async resolveIPNSName(url, serverTiming, options) {
|
|
113
111
|
const peerId = peerIdFromString(url.hostname);
|
|
114
112
|
const result = await serverTiming.time('ipns.resolve', `Resolve IPNS name ${peerId}`, this.components.ipnsResolver.resolve(peerId, options));
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
const ipfsUrl = new URL(`ipfs://${result.cid}/${url.pathname}`);
|
|
113
|
+
const path = normalizePath(`${result.path ?? ''}/${url.pathname}`);
|
|
114
|
+
const ipfsUrl = new URL(`ipfs://${result.cid}${path}`);
|
|
119
115
|
const ipfsResult = await this.resolveIPFSPath(ipfsUrl, serverTiming, options);
|
|
120
116
|
if (ipfsResult instanceof Response) {
|
|
121
117
|
return ipfsResult;
|
|
@@ -132,6 +128,18 @@ export class URLResolver {
|
|
|
132
128
|
if (walkPathResult instanceof Response) {
|
|
133
129
|
return walkPathResult;
|
|
134
130
|
}
|
|
131
|
+
if (walkPathResult.terminalElement.cid.code === CODEC_LIBP2P_KEY) {
|
|
132
|
+
// special case, peer id encoded as libp2p key CID - interpret as IPNS
|
|
133
|
+
const ipnsUrl = new URL(`ipns://${peerIdFromCID(walkPathResult.terminalElement.cid)}`);
|
|
134
|
+
const ipnsResult = await this.resolveIPNSName(ipnsUrl, serverTiming, options);
|
|
135
|
+
if (ipnsResult instanceof Response) {
|
|
136
|
+
return ipnsResult;
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
...ipnsResult,
|
|
140
|
+
url
|
|
141
|
+
};
|
|
142
|
+
}
|
|
135
143
|
return {
|
|
136
144
|
...walkPathResult,
|
|
137
145
|
url,
|
|
@@ -215,4 +223,24 @@ export class URLResolver {
|
|
|
215
223
|
function toIPFSPath(url) {
|
|
216
224
|
return `/ipfs/${url.hostname}${decodeURI(url.pathname)}`;
|
|
217
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* E.g.
|
|
228
|
+
*
|
|
229
|
+
* `''` -> `''`
|
|
230
|
+
* `'/'` -> `''`
|
|
231
|
+
* `'///'` -> `''`
|
|
232
|
+
* `'/foo/bar/'` -> `'/foo/bar'`
|
|
233
|
+
* `'foo/bar'` -> `'/foo/bar'`
|
|
234
|
+
* etc
|
|
235
|
+
*/
|
|
236
|
+
function normalizePath(path) {
|
|
237
|
+
path = path.split('/')
|
|
238
|
+
.map(s => s.trim())
|
|
239
|
+
.filter(Boolean)
|
|
240
|
+
.join('/');
|
|
241
|
+
if (path !== '') {
|
|
242
|
+
return `/${path}`;
|
|
243
|
+
}
|
|
244
|
+
return '';
|
|
245
|
+
}
|
|
218
246
|
//# sourceMappingURL=url-resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-resolver.js","sourceRoot":"","sources":["../../src/url-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"url-resolver.js","sourceRoot":"","sources":["../../src/url-resolver.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@helia/verified-fetch",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.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",
|
package/src/constants.ts
CHANGED
package/src/url-resolver.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { DoesNotExistError } from '@helia/unixfs/errors'
|
|
2
|
-
import { peerIdFromString } from '@libp2p/peer-id'
|
|
2
|
+
import { peerIdFromCID, peerIdFromString } from '@libp2p/peer-id'
|
|
3
3
|
import { exporter, InvalidParametersError, walkPath } from 'ipfs-unixfs-exporter'
|
|
4
4
|
import toBuffer from 'it-to-buffer'
|
|
5
5
|
import { CID } from 'multiformats/cid'
|
|
6
6
|
import QuickLRU from 'quick-lru'
|
|
7
7
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
|
|
8
|
-
import { SESSION_CACHE_MAX_SIZE, SESSION_CACHE_TTL_MS } from './constants.ts'
|
|
8
|
+
import { CODEC_LIBP2P_KEY, SESSION_CACHE_MAX_SIZE, SESSION_CACHE_TTL_MS } from './constants.ts'
|
|
9
9
|
import { applyRedirects } from './utils/apply-redirect.ts'
|
|
10
10
|
import { ServerTiming } from './utils/server-timing.ts'
|
|
11
11
|
import type { ResolveURLOptions, ResolveURLResult, URLResolver as URLResolverInterface } from './index.ts'
|
|
@@ -130,24 +130,21 @@ export class URLResolver implements URLResolverInterface {
|
|
|
130
130
|
throw new TypeError(`Invalid resource. Cannot resolve DNSLink from domain: ${url.hostname}`)
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
if (result.path != null && (url.pathname !== '' && url.pathname !== '/')) {
|
|
134
|
-
// path conflict?
|
|
135
|
-
}
|
|
136
|
-
|
|
137
133
|
let resolveResult: ResolveURLResult | Response
|
|
134
|
+
const path = normalizePath(`${result.path}/${url.pathname}`)
|
|
138
135
|
|
|
139
136
|
if (result.namespace === 'ipns') {
|
|
140
137
|
// dnslink resolved to IPNS name
|
|
141
|
-
const ipnsUrl = new URL(`ipns://${result.peerId
|
|
138
|
+
const ipnsUrl = new URL(`ipns://${result.peerId}${path}`)
|
|
142
139
|
resolveResult = await this.resolveIPNSName(ipnsUrl, serverTiming, options)
|
|
143
140
|
} else if (result.namespace === 'ipfs') {
|
|
144
141
|
// dnslink resolved to CID
|
|
145
|
-
const ipfsUrl = new URL(`ipfs://${result.cid}
|
|
142
|
+
const ipfsUrl = new URL(`ipfs://${result.cid}${path}`)
|
|
146
143
|
resolveResult = await this.resolveIPFSPath(ipfsUrl, serverTiming, options)
|
|
147
144
|
} else {
|
|
148
145
|
// @ts-expect-error @helia/dnslink follows recursive DNSLink records so
|
|
149
146
|
// result namespace should only be ipns or ipfs
|
|
150
|
-
throw new TypeError(`Invalid resource. Unexpected DNSLink namespace ${result.namespace} from domain: ${
|
|
147
|
+
throw new TypeError(`Invalid resource. Unexpected DNSLink namespace ${result.namespace} from domain: ${url.hostname}`)
|
|
151
148
|
}
|
|
152
149
|
|
|
153
150
|
if (resolveResult instanceof Response) {
|
|
@@ -164,12 +161,9 @@ export class URLResolver implements URLResolverInterface {
|
|
|
164
161
|
private async resolveIPNSName (url: URL, serverTiming: ServerTiming, options?: ResolveURLOptions): Promise<ResolveURLResult | Response> {
|
|
165
162
|
const peerId = peerIdFromString(url.hostname)
|
|
166
163
|
const result = await serverTiming.time('ipns.resolve', `Resolve IPNS name ${peerId}`, this.components.ipnsResolver.resolve(peerId, options))
|
|
164
|
+
const path = normalizePath(`${result.path ?? ''}/${url.pathname}`)
|
|
167
165
|
|
|
168
|
-
|
|
169
|
-
// path conflict?
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
const ipfsUrl = new URL(`ipfs://${result.cid}/${url.pathname}`)
|
|
166
|
+
const ipfsUrl = new URL(`ipfs://${result.cid}${path}`)
|
|
173
167
|
const ipfsResult = await this.resolveIPFSPath(ipfsUrl, serverTiming, options)
|
|
174
168
|
|
|
175
169
|
if (ipfsResult instanceof Response) {
|
|
@@ -191,6 +185,21 @@ export class URLResolver implements URLResolverInterface {
|
|
|
191
185
|
return walkPathResult
|
|
192
186
|
}
|
|
193
187
|
|
|
188
|
+
if (walkPathResult.terminalElement.cid.code === CODEC_LIBP2P_KEY) {
|
|
189
|
+
// special case, peer id encoded as libp2p key CID - interpret as IPNS
|
|
190
|
+
const ipnsUrl = new URL(`ipns://${peerIdFromCID(walkPathResult.terminalElement.cid)}`)
|
|
191
|
+
const ipnsResult = await this.resolveIPNSName(ipnsUrl, serverTiming, options)
|
|
192
|
+
|
|
193
|
+
if (ipnsResult instanceof Response) {
|
|
194
|
+
return ipnsResult
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return {
|
|
198
|
+
...ipnsResult,
|
|
199
|
+
url
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
194
203
|
return {
|
|
195
204
|
...walkPathResult,
|
|
196
205
|
url,
|
|
@@ -284,3 +293,26 @@ export class URLResolver implements URLResolverInterface {
|
|
|
284
293
|
function toIPFSPath (url: URL): string {
|
|
285
294
|
return `/ipfs/${url.hostname}${decodeURI(url.pathname)}`
|
|
286
295
|
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* E.g.
|
|
299
|
+
*
|
|
300
|
+
* `''` -> `''`
|
|
301
|
+
* `'/'` -> `''`
|
|
302
|
+
* `'///'` -> `''`
|
|
303
|
+
* `'/foo/bar/'` -> `'/foo/bar'`
|
|
304
|
+
* `'foo/bar'` -> `'/foo/bar'`
|
|
305
|
+
* etc
|
|
306
|
+
*/
|
|
307
|
+
function normalizePath (path: string): string {
|
|
308
|
+
path = path.split('/')
|
|
309
|
+
.map(s => s.trim())
|
|
310
|
+
.filter(Boolean)
|
|
311
|
+
.join('/')
|
|
312
|
+
|
|
313
|
+
if (path !== '') {
|
|
314
|
+
return `/${path}`
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return ''
|
|
318
|
+
}
|