@helia/verified-fetch 1.1.2 → 1.2.0
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/README.md +24 -1
- package/dist/index.min.js +8 -19
- package/dist/src/index.d.ts +29 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +41 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/types.d.ts +1 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/byte-range-context.d.ts +82 -0
- package/dist/src/utils/byte-range-context.d.ts.map +1 -0
- package/dist/src/utils/byte-range-context.js +275 -0
- package/dist/src/utils/byte-range-context.js.map +1 -0
- package/dist/src/utils/get-stream-from-async-iterable.js +1 -1
- package/dist/src/utils/parse-resource.d.ts +2 -2
- package/dist/src/utils/parse-url-string.d.ts +2 -2
- package/dist/src/utils/parse-url-string.d.ts.map +1 -1
- package/dist/src/utils/parse-url-string.js +5 -5
- package/dist/src/utils/parse-url-string.js.map +1 -1
- package/dist/src/utils/request-headers.d.ts +13 -0
- package/dist/src/utils/request-headers.d.ts.map +1 -0
- package/dist/src/utils/request-headers.js +50 -0
- package/dist/src/utils/request-headers.js.map +1 -0
- package/dist/src/utils/response-headers.d.ts +12 -0
- package/dist/src/utils/response-headers.d.ts.map +1 -0
- package/dist/src/utils/response-headers.js +29 -0
- package/dist/src/utils/response-headers.js.map +1 -0
- package/dist/src/utils/responses.d.ts +21 -4
- package/dist/src/utils/responses.d.ts.map +1 -1
- package/dist/src/utils/responses.js +58 -0
- package/dist/src/utils/responses.js.map +1 -1
- package/dist/src/verified-fetch.d.ts +2 -1
- package/dist/src/verified-fetch.d.ts.map +1 -1
- package/dist/src/verified-fetch.js +61 -25
- package/dist/src/verified-fetch.js.map +1 -1
- package/package.json +4 -3
- package/src/index.ts +49 -8
- package/src/types.ts +2 -0
- package/src/utils/byte-range-context.ts +303 -0
- package/src/utils/get-stream-from-async-iterable.ts +1 -1
- package/src/utils/parse-resource.ts +2 -2
- package/src/utils/parse-url-string.ts +7 -7
- package/src/utils/request-headers.ts +51 -0
- package/src/utils/response-headers.ts +32 -0
- package/src/utils/responses.ts +82 -4
- package/src/verified-fetch.ts +68 -29
package/dist/src/index.d.ts
CHANGED
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
*
|
|
149
149
|
* ```typescript
|
|
150
150
|
* import { createVerifiedFetch } from '@helia/verified-fetch'
|
|
151
|
-
* import { dnsJsonOverHttps, dnsOverHttps } from '@
|
|
151
|
+
* import { dnsJsonOverHttps, dnsOverHttps } from '@multiformats/dns/resolvers'
|
|
152
152
|
*
|
|
153
153
|
* const fetch = await createVerifiedFetch({
|
|
154
154
|
* gateways: ['https://trustless-gateway.link'],
|
|
@@ -160,6 +160,29 @@
|
|
|
160
160
|
* })
|
|
161
161
|
* ```
|
|
162
162
|
*
|
|
163
|
+
* @example Customizing DNS per-TLD resolvers
|
|
164
|
+
*
|
|
165
|
+
* DNS resolvers can be configured to only service DNS queries for specific
|
|
166
|
+
* TLDs:
|
|
167
|
+
*
|
|
168
|
+
* ```typescript
|
|
169
|
+
* import { createVerifiedFetch } from '@helia/verified-fetch'
|
|
170
|
+
* import { dnsJsonOverHttps, dnsOverHttps } from '@multiformats/dns/resolvers'
|
|
171
|
+
*
|
|
172
|
+
* const fetch = await createVerifiedFetch({
|
|
173
|
+
* gateways: ['https://trustless-gateway.link'],
|
|
174
|
+
* routers: ['http://delegated-ipfs.dev'],
|
|
175
|
+
* dnsResolvers: {
|
|
176
|
+
* // this resolver will only be used for `.com` domains (note - this could
|
|
177
|
+
* // also be an array of resolvers)
|
|
178
|
+
* 'com.': dnsJsonOverHttps('https://my-dns-resolver.example.com/dns-json'),
|
|
179
|
+
* // this resolver will be used for everything else (note - this could
|
|
180
|
+
* // also be an array of resolvers)
|
|
181
|
+
* '.': dnsOverHttps('https://my-dns-resolver.example.com/dns-query')
|
|
182
|
+
* }
|
|
183
|
+
* })
|
|
184
|
+
* ```
|
|
185
|
+
*
|
|
163
186
|
* ### IPLD codec handling
|
|
164
187
|
*
|
|
165
188
|
* IPFS supports several data formats (typically referred to as codecs) which are included in the CID. `@helia/verified-fetch` attempts to abstract away some of the details for easier consumption.
|
|
@@ -566,8 +589,10 @@
|
|
|
566
589
|
* 4. `AbortError` - If the content request is aborted due to user aborting provided AbortSignal.
|
|
567
590
|
*/
|
|
568
591
|
import type { Helia } from '@helia/interface';
|
|
569
|
-
import type {
|
|
592
|
+
import type { ResolveDNSLinkProgressEvents } from '@helia/ipns';
|
|
570
593
|
import type { GetEvents } from '@helia/unixfs';
|
|
594
|
+
import type { DNSResolvers } from '@multiformats/dns';
|
|
595
|
+
import type { DNSResolver } from '@multiformats/dns/resolvers';
|
|
571
596
|
import type { CID } from 'multiformats/cid';
|
|
572
597
|
import type { ProgressEvent, ProgressOptions } from 'progress-events';
|
|
573
598
|
/**
|
|
@@ -606,7 +631,7 @@ export interface CreateVerifiedFetchInit {
|
|
|
606
631
|
*
|
|
607
632
|
* @default [dnsJsonOverHttps('https://mozilla.cloudflare-dns.com/dns-query'),dnsJsonOverHttps('https://dns.google/resolve')]
|
|
608
633
|
*/
|
|
609
|
-
dnsResolvers?: DNSResolver[];
|
|
634
|
+
dnsResolvers?: DNSResolver[] | DNSResolvers;
|
|
610
635
|
}
|
|
611
636
|
export interface CreateVerifiedFetchOptions {
|
|
612
637
|
/**
|
|
@@ -632,7 +657,7 @@ export interface ContentTypeParser {
|
|
|
632
657
|
*/
|
|
633
658
|
(bytes: Uint8Array, fileName?: string): Promise<string | undefined> | string | undefined;
|
|
634
659
|
}
|
|
635
|
-
export type BubbledProgressEvents = GetEvents |
|
|
660
|
+
export type BubbledProgressEvents = GetEvents | ResolveDNSLinkProgressEvents;
|
|
636
661
|
export type VerifiedFetchProgressEvents = ProgressEvent<'verified-fetch:request:start', CIDDetail> | ProgressEvent<'verified-fetch:request:info', string> | ProgressEvent<'verified-fetch:request:progress:chunk', CIDDetail> | ProgressEvent<'verified-fetch:request:end', CIDDetail> | ProgressEvent<'verified-fetch:request:error', CIDDetailError>;
|
|
637
662
|
/**
|
|
638
663
|
* Options for the `fetch` function returned by `createVerifiedFetch`.
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
*
|
|
149
149
|
* ```typescript
|
|
150
150
|
* import { createVerifiedFetch } from '@helia/verified-fetch'
|
|
151
|
-
* import { dnsJsonOverHttps, dnsOverHttps } from '@
|
|
151
|
+
* import { dnsJsonOverHttps, dnsOverHttps } from '@multiformats/dns/resolvers'
|
|
152
152
|
*
|
|
153
153
|
* const fetch = await createVerifiedFetch({
|
|
154
154
|
* gateways: ['https://trustless-gateway.link'],
|
|
@@ -160,6 +160,29 @@
|
|
|
160
160
|
* })
|
|
161
161
|
* ```
|
|
162
162
|
*
|
|
163
|
+
* @example Customizing DNS per-TLD resolvers
|
|
164
|
+
*
|
|
165
|
+
* DNS resolvers can be configured to only service DNS queries for specific
|
|
166
|
+
* TLDs:
|
|
167
|
+
*
|
|
168
|
+
* ```typescript
|
|
169
|
+
* import { createVerifiedFetch } from '@helia/verified-fetch'
|
|
170
|
+
* import { dnsJsonOverHttps, dnsOverHttps } from '@multiformats/dns/resolvers'
|
|
171
|
+
*
|
|
172
|
+
* const fetch = await createVerifiedFetch({
|
|
173
|
+
* gateways: ['https://trustless-gateway.link'],
|
|
174
|
+
* routers: ['http://delegated-ipfs.dev'],
|
|
175
|
+
* dnsResolvers: {
|
|
176
|
+
* // this resolver will only be used for `.com` domains (note - this could
|
|
177
|
+
* // also be an array of resolvers)
|
|
178
|
+
* 'com.': dnsJsonOverHttps('https://my-dns-resolver.example.com/dns-json'),
|
|
179
|
+
* // this resolver will be used for everything else (note - this could
|
|
180
|
+
* // also be an array of resolvers)
|
|
181
|
+
* '.': dnsOverHttps('https://my-dns-resolver.example.com/dns-query')
|
|
182
|
+
* }
|
|
183
|
+
* })
|
|
184
|
+
* ```
|
|
185
|
+
*
|
|
163
186
|
* ### IPLD codec handling
|
|
164
187
|
*
|
|
165
188
|
* IPFS supports several data formats (typically referred to as codecs) which are included in the CID. `@helia/verified-fetch` attempts to abstract away some of the details for easier consumption.
|
|
@@ -568,24 +591,24 @@
|
|
|
568
591
|
import { trustlessGateway } from '@helia/block-brokers';
|
|
569
592
|
import { createHeliaHTTP } from '@helia/http';
|
|
570
593
|
import { delegatedHTTPRouting } from '@helia/routers';
|
|
594
|
+
import { dns } from '@multiformats/dns';
|
|
571
595
|
import { VerifiedFetch as VerifiedFetchClass } from './verified-fetch.js';
|
|
572
596
|
/**
|
|
573
597
|
* Create and return a Helia node
|
|
574
598
|
*/
|
|
575
599
|
export async function createVerifiedFetch(init, options) {
|
|
576
|
-
let dnsResolvers;
|
|
577
600
|
if (!isHelia(init)) {
|
|
578
|
-
dnsResolvers = init?.dnsResolvers;
|
|
579
601
|
init = await createHeliaHTTP({
|
|
580
602
|
blockBrokers: [
|
|
581
603
|
trustlessGateway({
|
|
582
604
|
gateways: init?.gateways
|
|
583
605
|
})
|
|
584
606
|
],
|
|
585
|
-
routers: (init?.routers ?? ['https://delegated-ipfs.dev']).map((routerUrl) => delegatedHTTPRouting(routerUrl))
|
|
607
|
+
routers: (init?.routers ?? ['https://delegated-ipfs.dev']).map((routerUrl) => delegatedHTTPRouting(routerUrl)),
|
|
608
|
+
dns: createDns(init?.dnsResolvers)
|
|
586
609
|
});
|
|
587
610
|
}
|
|
588
|
-
const verifiedFetchInstance = new VerifiedFetchClass({ helia: init },
|
|
611
|
+
const verifiedFetchInstance = new VerifiedFetchClass({ helia: init }, options);
|
|
589
612
|
async function verifiedFetch(resource, options) {
|
|
590
613
|
return verifiedFetchInstance.fetch(resource, options);
|
|
591
614
|
}
|
|
@@ -602,4 +625,17 @@ function isHelia(obj) {
|
|
|
602
625
|
obj?.stop != null &&
|
|
603
626
|
obj?.start != null;
|
|
604
627
|
}
|
|
628
|
+
function createDns(resolvers) {
|
|
629
|
+
if (resolvers == null) {
|
|
630
|
+
return;
|
|
631
|
+
}
|
|
632
|
+
if (Array.isArray(resolvers)) {
|
|
633
|
+
return dns({
|
|
634
|
+
resolvers: {
|
|
635
|
+
'.': resolvers
|
|
636
|
+
}
|
|
637
|
+
});
|
|
638
|
+
}
|
|
639
|
+
return dns({ resolvers });
|
|
640
|
+
}
|
|
605
641
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/types.d.ts
CHANGED
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAA"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAA;AAEtH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,WAAW,GAAG,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI,CAAA"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { SupportedBodyTypes } from '../types.js';
|
|
2
|
+
import type { ComponentLogger } from '@libp2p/interface';
|
|
3
|
+
export declare class ByteRangeContext {
|
|
4
|
+
private readonly headers?;
|
|
5
|
+
readonly isRangeRequest: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* This property is purposefully only set in `set fileSize` and should not be set directly.
|
|
8
|
+
*/
|
|
9
|
+
private _fileSize;
|
|
10
|
+
private _body;
|
|
11
|
+
private readonly rangeRequestHeader;
|
|
12
|
+
private readonly log;
|
|
13
|
+
private readonly requestRangeStart;
|
|
14
|
+
private readonly requestRangeEnd;
|
|
15
|
+
private byteStart;
|
|
16
|
+
private byteEnd;
|
|
17
|
+
private byteSize;
|
|
18
|
+
constructor(logger: ComponentLogger, headers?: HeadersInit | undefined);
|
|
19
|
+
setBody(body: SupportedBodyTypes): void;
|
|
20
|
+
getBody(): SupportedBodyTypes;
|
|
21
|
+
private getSlicedBody;
|
|
22
|
+
private get isSuffixLengthRequest();
|
|
23
|
+
private get isPrefixLengthRequest();
|
|
24
|
+
/**
|
|
25
|
+
* Sometimes, we need to set the fileSize explicitly because we can't calculate
|
|
26
|
+
* the size of the body (e.g. for unixfs content where we call .stat).
|
|
27
|
+
*
|
|
28
|
+
* This fileSize should otherwise only be called from `setBody`.
|
|
29
|
+
*/
|
|
30
|
+
setFileSize(size: number | bigint | null): void;
|
|
31
|
+
getFileSize(): number | null | undefined;
|
|
32
|
+
private isValidByteStart;
|
|
33
|
+
private isValidByteEnd;
|
|
34
|
+
/**
|
|
35
|
+
* We may get the values required to determine if this is a valid range request at different times
|
|
36
|
+
* so we need to calculate it when asked.
|
|
37
|
+
*/
|
|
38
|
+
get isValidRangeRequest(): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Given all the information we have, this function returns the offset that will be used when:
|
|
41
|
+
* 1. calling unixfs.cat
|
|
42
|
+
* 2. slicing the body
|
|
43
|
+
*/
|
|
44
|
+
get offset(): number;
|
|
45
|
+
/**
|
|
46
|
+
* Given all the information we have, this function returns the length that will be used when:
|
|
47
|
+
* 1. calling unixfs.cat
|
|
48
|
+
* 2. slicing the body
|
|
49
|
+
*/
|
|
50
|
+
get length(): number | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Converts a range request header into helia/unixfs supported range options
|
|
53
|
+
* Note that the gateway specification says we "MAY" support multiple ranges (https://specs.ipfs.tech/http-gateways/path-gateway/#range-request-header) but we don't
|
|
54
|
+
*
|
|
55
|
+
* Also note that @helia/unixfs and ipfs-unixfs-exporter expect length and offset to be numbers, the range header is a string, and the size of the resource is likely a bigint.
|
|
56
|
+
*
|
|
57
|
+
* SUPPORTED:
|
|
58
|
+
* Range: bytes=<range-start>-<range-end>
|
|
59
|
+
* Range: bytes=<range-start>-
|
|
60
|
+
* Range: bytes=-<suffix-length> // must pass size so we can calculate the offset. suffix-length is the number of bytes from the end of the file.
|
|
61
|
+
*
|
|
62
|
+
* NOT SUPPORTED:
|
|
63
|
+
* Range: bytes=<range-start>-<range-end>, <range-start>-<range-end>
|
|
64
|
+
* Range: bytes=<range-start>-<range-end>, <range-start>-<range-end>, <range-start>-<range-end>
|
|
65
|
+
*
|
|
66
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range#directives
|
|
67
|
+
*/
|
|
68
|
+
private setOffsetDetails;
|
|
69
|
+
/**
|
|
70
|
+
* This function returns the value of the "content-range" header.
|
|
71
|
+
*
|
|
72
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Range
|
|
73
|
+
*
|
|
74
|
+
* Returns a string representing the following content ranges:
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* - Content-Range: <unit> <byteStart>-<byteEnd>/<byteSize>
|
|
78
|
+
* - Content-Range: <unit> <byteStart>-<byteEnd>/*
|
|
79
|
+
*/
|
|
80
|
+
get contentRangeHeaderValue(): string;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=byte-range-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"byte-range-context.d.ts","sourceRoot":"","sources":["../../../src/utils/byte-range-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAuChE,qBAAa,gBAAgB;IAgBW,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAf/D,SAAgB,cAAc,EAAE,OAAO,CAAA;IAEvC;;OAEG;IACH,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IACvD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAe;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAe;IAC/C,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,QAAQ,CAAoB;gBAEvB,MAAM,EAAE,eAAe,EAAmB,OAAO,CAAC,yBAAa;IAyBrE,OAAO,CAAE,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAQxC,OAAO,IAAK,kBAAkB;IA2BrC,OAAO,CAAC,aAAa;IAgBrB,OAAO,KAAK,qBAAqB,GAEhC;IAED,OAAO,KAAK,qBAAqB,GAEhC;IAED;;;;;OAKG;IACI,WAAW,CAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI;IAOhD,WAAW,IAAK,MAAM,GAAG,IAAI,GAAG,SAAS;IAIhD,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,cAAc;IAYtB;;;OAGG;IACH,IAAW,mBAAmB,IAAK,OAAO,CA+BzC;IAED;;;;OAIG;IACH,IAAW,MAAM,IAAK,MAAM,CAY3B;IAED;;;;OAIG;IACH,IAAW,MAAM,IAAK,MAAM,GAAG,SAAS,CAEvC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;;;;;;;;;OAUG;IAEH,IAAW,uBAAuB,IAAK,MAAM,CAW5C;CACF"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { calculateByteRangeIndexes, getHeader } from './request-headers.js';
|
|
2
|
+
import { getContentRangeHeader } from './response-headers.js';
|
|
3
|
+
/**
|
|
4
|
+
* Gets the body size of a given body if it's possible to calculate it synchronously.
|
|
5
|
+
*/
|
|
6
|
+
function getBodySizeSync(body) {
|
|
7
|
+
if (typeof body === 'string') {
|
|
8
|
+
return body.length;
|
|
9
|
+
}
|
|
10
|
+
if (body instanceof ArrayBuffer || body instanceof Uint8Array) {
|
|
11
|
+
return body.byteLength;
|
|
12
|
+
}
|
|
13
|
+
if (body instanceof Blob) {
|
|
14
|
+
return body.size;
|
|
15
|
+
}
|
|
16
|
+
if (body instanceof ReadableStream) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
function getByteRangeFromHeader(rangeHeader) {
|
|
22
|
+
/**
|
|
23
|
+
* Range: bytes=<start>-<end> | bytes=<start2>- | bytes=-<end2>
|
|
24
|
+
*/
|
|
25
|
+
const match = rangeHeader.match(/^bytes=(?<start>\d+)?-(?<end>\d+)?$/);
|
|
26
|
+
if (match?.groups == null) {
|
|
27
|
+
throw new Error('Invalid range request');
|
|
28
|
+
}
|
|
29
|
+
const { start, end } = match.groups;
|
|
30
|
+
return { start, end };
|
|
31
|
+
}
|
|
32
|
+
export class ByteRangeContext {
|
|
33
|
+
headers;
|
|
34
|
+
isRangeRequest;
|
|
35
|
+
/**
|
|
36
|
+
* This property is purposefully only set in `set fileSize` and should not be set directly.
|
|
37
|
+
*/
|
|
38
|
+
_fileSize;
|
|
39
|
+
_body = null;
|
|
40
|
+
rangeRequestHeader;
|
|
41
|
+
log;
|
|
42
|
+
requestRangeStart;
|
|
43
|
+
requestRangeEnd;
|
|
44
|
+
byteStart;
|
|
45
|
+
byteEnd;
|
|
46
|
+
byteSize;
|
|
47
|
+
constructor(logger, headers) {
|
|
48
|
+
this.headers = headers;
|
|
49
|
+
this.log = logger.forComponent('helia:verified-fetch:byte-range-context');
|
|
50
|
+
this.rangeRequestHeader = getHeader(this.headers, 'Range');
|
|
51
|
+
if (this.rangeRequestHeader != null) {
|
|
52
|
+
this.isRangeRequest = true;
|
|
53
|
+
this.log.trace('range request detected');
|
|
54
|
+
try {
|
|
55
|
+
const { start, end } = getByteRangeFromHeader(this.rangeRequestHeader);
|
|
56
|
+
this.requestRangeStart = start != null ? parseInt(start) : null;
|
|
57
|
+
this.requestRangeEnd = end != null ? parseInt(end) : null;
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
this.log.error('error parsing range request header: %o', e);
|
|
61
|
+
this.requestRangeStart = null;
|
|
62
|
+
this.requestRangeEnd = null;
|
|
63
|
+
}
|
|
64
|
+
this.setOffsetDetails();
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
this.log.trace('no range request detected');
|
|
68
|
+
this.isRangeRequest = false;
|
|
69
|
+
this.requestRangeStart = null;
|
|
70
|
+
this.requestRangeEnd = null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
setBody(body) {
|
|
74
|
+
this._body = body;
|
|
75
|
+
// if fileSize was already set, don't recalculate it
|
|
76
|
+
this.setFileSize(this._fileSize ?? getBodySizeSync(body));
|
|
77
|
+
this.log.trace('set request body with fileSize %o', this._fileSize);
|
|
78
|
+
}
|
|
79
|
+
getBody() {
|
|
80
|
+
const body = this._body;
|
|
81
|
+
if (body == null) {
|
|
82
|
+
this.log.trace('body is null');
|
|
83
|
+
return body;
|
|
84
|
+
}
|
|
85
|
+
if (!this.isRangeRequest || !this.isValidRangeRequest) {
|
|
86
|
+
this.log.trace('returning body unmodified for non-range, or invalid range, request');
|
|
87
|
+
return body;
|
|
88
|
+
}
|
|
89
|
+
const byteStart = this.byteStart;
|
|
90
|
+
const byteEnd = this.byteEnd;
|
|
91
|
+
const byteSize = this.byteSize;
|
|
92
|
+
if (byteStart != null || byteEnd != null) {
|
|
93
|
+
this.log.trace('returning body with byteStart=%o, byteEnd=%o, byteSize=%o', byteStart, byteEnd, byteSize);
|
|
94
|
+
if (body instanceof ReadableStream) {
|
|
95
|
+
// stream should already be spliced by `unixfs.cat`
|
|
96
|
+
return body;
|
|
97
|
+
}
|
|
98
|
+
return this.getSlicedBody(body);
|
|
99
|
+
}
|
|
100
|
+
// we should not reach this point, but return body untouched.
|
|
101
|
+
this.log.error('returning unmodified body for valid range request');
|
|
102
|
+
return body;
|
|
103
|
+
}
|
|
104
|
+
getSlicedBody(body) {
|
|
105
|
+
if (this.isPrefixLengthRequest) {
|
|
106
|
+
this.log.trace('sliced body with byteStart %o', this.byteStart);
|
|
107
|
+
return body.slice(this.offset);
|
|
108
|
+
}
|
|
109
|
+
if (this.isSuffixLengthRequest && this.length != null) {
|
|
110
|
+
this.log.trace('sliced body with length %o', -this.length);
|
|
111
|
+
return body.slice(-this.length);
|
|
112
|
+
}
|
|
113
|
+
const offset = this.byteStart ?? 0;
|
|
114
|
+
const length = this.byteEnd == null ? undefined : this.byteEnd + 1;
|
|
115
|
+
this.log.trace('returning body with offset %o and length %o', offset, length);
|
|
116
|
+
return body.slice(offset, length);
|
|
117
|
+
}
|
|
118
|
+
get isSuffixLengthRequest() {
|
|
119
|
+
return this.requestRangeStart == null && this.requestRangeEnd != null;
|
|
120
|
+
}
|
|
121
|
+
get isPrefixLengthRequest() {
|
|
122
|
+
return this.requestRangeStart != null && this.requestRangeEnd == null;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Sometimes, we need to set the fileSize explicitly because we can't calculate
|
|
126
|
+
* the size of the body (e.g. for unixfs content where we call .stat).
|
|
127
|
+
*
|
|
128
|
+
* This fileSize should otherwise only be called from `setBody`.
|
|
129
|
+
*/
|
|
130
|
+
setFileSize(size) {
|
|
131
|
+
this._fileSize = size != null ? Number(size) : null;
|
|
132
|
+
this.log.trace('set _fileSize to %o', this._fileSize);
|
|
133
|
+
// when fileSize changes, we need to recalculate the offset details
|
|
134
|
+
this.setOffsetDetails();
|
|
135
|
+
}
|
|
136
|
+
getFileSize() {
|
|
137
|
+
return this._fileSize;
|
|
138
|
+
}
|
|
139
|
+
isValidByteStart() {
|
|
140
|
+
if (this.byteStart != null) {
|
|
141
|
+
if (this.byteStart < 0) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
if (this._fileSize != null && this.byteStart > this._fileSize) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
isValidByteEnd() {
|
|
151
|
+
if (this.byteEnd != null) {
|
|
152
|
+
if (this.byteEnd < 0) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
if (this._fileSize != null && this.byteEnd > this._fileSize) {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* We may get the values required to determine if this is a valid range request at different times
|
|
163
|
+
* so we need to calculate it when asked.
|
|
164
|
+
*/
|
|
165
|
+
get isValidRangeRequest() {
|
|
166
|
+
if (!this.isRangeRequest) {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
if (this.requestRangeStart == null && this.requestRangeEnd == null) {
|
|
170
|
+
this.log.trace('invalid range request, range request values not provided');
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
if (!this.isValidByteStart()) {
|
|
174
|
+
this.log.trace('invalid range request, byteStart is less than 0 or greater than fileSize');
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
if (!this.isValidByteEnd()) {
|
|
178
|
+
this.log.trace('invalid range request, byteEnd is less than 0 or greater than fileSize');
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
if (this.requestRangeEnd != null && this.requestRangeStart != null) {
|
|
182
|
+
// we may not have enough info.. base check on requested bytes
|
|
183
|
+
if (this.requestRangeStart > this.requestRangeEnd) {
|
|
184
|
+
this.log.trace('invalid range request, start is greater than end');
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
else if (this.requestRangeStart < 0) {
|
|
188
|
+
this.log.trace('invalid range request, start is less than 0');
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
else if (this.requestRangeEnd < 0) {
|
|
192
|
+
this.log.trace('invalid range request, end is less than 0');
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Given all the information we have, this function returns the offset that will be used when:
|
|
200
|
+
* 1. calling unixfs.cat
|
|
201
|
+
* 2. slicing the body
|
|
202
|
+
*/
|
|
203
|
+
get offset() {
|
|
204
|
+
if (this.byteStart === 0) {
|
|
205
|
+
return 0;
|
|
206
|
+
}
|
|
207
|
+
if (this.isPrefixLengthRequest || this.isSuffixLengthRequest) {
|
|
208
|
+
if (this.byteStart != null) {
|
|
209
|
+
// we have to subtract by 1 because the offset is inclusive
|
|
210
|
+
return this.byteStart - 1;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return this.byteStart ?? 0;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Given all the information we have, this function returns the length that will be used when:
|
|
217
|
+
* 1. calling unixfs.cat
|
|
218
|
+
* 2. slicing the body
|
|
219
|
+
*/
|
|
220
|
+
get length() {
|
|
221
|
+
return this.byteSize ?? undefined;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Converts a range request header into helia/unixfs supported range options
|
|
225
|
+
* Note that the gateway specification says we "MAY" support multiple ranges (https://specs.ipfs.tech/http-gateways/path-gateway/#range-request-header) but we don't
|
|
226
|
+
*
|
|
227
|
+
* Also note that @helia/unixfs and ipfs-unixfs-exporter expect length and offset to be numbers, the range header is a string, and the size of the resource is likely a bigint.
|
|
228
|
+
*
|
|
229
|
+
* SUPPORTED:
|
|
230
|
+
* Range: bytes=<range-start>-<range-end>
|
|
231
|
+
* Range: bytes=<range-start>-
|
|
232
|
+
* Range: bytes=-<suffix-length> // must pass size so we can calculate the offset. suffix-length is the number of bytes from the end of the file.
|
|
233
|
+
*
|
|
234
|
+
* NOT SUPPORTED:
|
|
235
|
+
* Range: bytes=<range-start>-<range-end>, <range-start>-<range-end>
|
|
236
|
+
* Range: bytes=<range-start>-<range-end>, <range-start>-<range-end>, <range-start>-<range-end>
|
|
237
|
+
*
|
|
238
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range#directives
|
|
239
|
+
*/
|
|
240
|
+
setOffsetDetails() {
|
|
241
|
+
if (this.requestRangeStart == null && this.requestRangeEnd == null) {
|
|
242
|
+
this.log.trace('requestRangeStart and requestRangeEnd are null');
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
const { start, end, byteSize } = calculateByteRangeIndexes(this.requestRangeStart ?? undefined, this.requestRangeEnd ?? undefined, this._fileSize ?? undefined);
|
|
246
|
+
this.log.trace('set byteStart to %o, byteEnd to %o, byteSize to %o', start, end, byteSize);
|
|
247
|
+
this.byteStart = start;
|
|
248
|
+
this.byteEnd = end;
|
|
249
|
+
this.byteSize = byteSize;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* This function returns the value of the "content-range" header.
|
|
253
|
+
*
|
|
254
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Range
|
|
255
|
+
*
|
|
256
|
+
* Returns a string representing the following content ranges:
|
|
257
|
+
*
|
|
258
|
+
* @example
|
|
259
|
+
* - Content-Range: <unit> <byteStart>-<byteEnd>/<byteSize>
|
|
260
|
+
* - Content-Range: <unit> <byteStart>-<byteEnd>/*
|
|
261
|
+
*/
|
|
262
|
+
// - Content-Range: <unit> */<byteSize> // this is purposefully not in jsdoc block
|
|
263
|
+
get contentRangeHeaderValue() {
|
|
264
|
+
if (!this.isValidRangeRequest) {
|
|
265
|
+
this.log.error('cannot get contentRangeHeaderValue for invalid range request');
|
|
266
|
+
throw new Error('Invalid range request');
|
|
267
|
+
}
|
|
268
|
+
return getContentRangeHeader({
|
|
269
|
+
byteStart: this.byteStart,
|
|
270
|
+
byteEnd: this.byteEnd,
|
|
271
|
+
byteSize: this._fileSize ?? undefined
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=byte-range-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"byte-range-context.js","sourceRoot":"","sources":["../../../src/utils/byte-range-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ export async function getStreamFromAsyncIterable(iterator, path, logger, options
|
|
|
7
7
|
const reader = iterator[Symbol.asyncIterator]();
|
|
8
8
|
const { value: firstChunk, done } = await reader.next();
|
|
9
9
|
if (done === true) {
|
|
10
|
-
log.error('
|
|
10
|
+
log.error('no content found for path', path);
|
|
11
11
|
throw new Error('No content found');
|
|
12
12
|
}
|
|
13
13
|
const stream = new ReadableStream({
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { ParsedUrlStringResults } from './parse-url-string.js';
|
|
2
2
|
import type { Resource } from '../index.js';
|
|
3
|
-
import type { IPNS, IPNSRoutingEvents,
|
|
3
|
+
import type { IPNS, IPNSRoutingEvents, ResolveDNSLinkProgressEvents, ResolveProgressEvents } from '@helia/ipns';
|
|
4
4
|
import type { ComponentLogger } from '@libp2p/interface';
|
|
5
5
|
import type { ProgressOptions } from 'progress-events';
|
|
6
6
|
export interface ParseResourceComponents {
|
|
7
7
|
ipns: IPNS;
|
|
8
8
|
logger: ComponentLogger;
|
|
9
9
|
}
|
|
10
|
-
export interface ParseResourceOptions extends ProgressOptions<ResolveProgressEvents | IPNSRoutingEvents |
|
|
10
|
+
export interface ParseResourceOptions extends ProgressOptions<ResolveProgressEvents | IPNSRoutingEvents | ResolveDNSLinkProgressEvents> {
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
13
|
* Handles the different use cases for the `resource` argument.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CID } from 'multiformats/cid';
|
|
2
2
|
import type { RequestFormatShorthand } from '../types.js';
|
|
3
|
-
import type { IPNS,
|
|
3
|
+
import type { IPNS, ResolveDNSLinkProgressEvents } from '@helia/ipns';
|
|
4
4
|
import type { ComponentLogger } from '@libp2p/interface';
|
|
5
5
|
import type { ProgressOptions } from 'progress-events';
|
|
6
6
|
export interface ParseUrlStringInput {
|
|
@@ -8,7 +8,7 @@ export interface ParseUrlStringInput {
|
|
|
8
8
|
ipns: IPNS;
|
|
9
9
|
logger: ComponentLogger;
|
|
10
10
|
}
|
|
11
|
-
export interface ParseUrlStringOptions extends ProgressOptions<
|
|
11
|
+
export interface ParseUrlStringOptions extends ProgressOptions<ResolveDNSLinkProgressEvents> {
|
|
12
12
|
}
|
|
13
13
|
export interface ParsedUrlQuery extends Record<string, string | unknown> {
|
|
14
14
|
format?: RequestFormatShorthand;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-url-string.d.ts","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAEtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"parse-url-string.d.ts","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAEtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,4BAA4B,EAAiB,MAAM,aAAa,CAAA;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAItD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,eAAe,CAAA;CACxB;AACD,MAAM,WAAW,qBAAsB,SAAQ,eAAe,CAAC,4BAA4B,CAAC;CAE3F;AAED,MAAM,WAAW,cAAe,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACtE,MAAM,CAAC,EAAE,sBAAsB,CAAA;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,GAAG,CAAA;IACR,KAAK,EAAE,cAAc,CAAA;CACtB;AA+CD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAkGxJ"}
|