@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.
Files changed (45) hide show
  1. package/README.md +24 -1
  2. package/dist/index.min.js +8 -19
  3. package/dist/src/index.d.ts +29 -4
  4. package/dist/src/index.d.ts.map +1 -1
  5. package/dist/src/index.js +41 -5
  6. package/dist/src/index.js.map +1 -1
  7. package/dist/src/types.d.ts +1 -0
  8. package/dist/src/types.d.ts.map +1 -1
  9. package/dist/src/utils/byte-range-context.d.ts +82 -0
  10. package/dist/src/utils/byte-range-context.d.ts.map +1 -0
  11. package/dist/src/utils/byte-range-context.js +275 -0
  12. package/dist/src/utils/byte-range-context.js.map +1 -0
  13. package/dist/src/utils/get-stream-from-async-iterable.js +1 -1
  14. package/dist/src/utils/parse-resource.d.ts +2 -2
  15. package/dist/src/utils/parse-url-string.d.ts +2 -2
  16. package/dist/src/utils/parse-url-string.d.ts.map +1 -1
  17. package/dist/src/utils/parse-url-string.js +5 -5
  18. package/dist/src/utils/parse-url-string.js.map +1 -1
  19. package/dist/src/utils/request-headers.d.ts +13 -0
  20. package/dist/src/utils/request-headers.d.ts.map +1 -0
  21. package/dist/src/utils/request-headers.js +50 -0
  22. package/dist/src/utils/request-headers.js.map +1 -0
  23. package/dist/src/utils/response-headers.d.ts +12 -0
  24. package/dist/src/utils/response-headers.d.ts.map +1 -0
  25. package/dist/src/utils/response-headers.js +29 -0
  26. package/dist/src/utils/response-headers.js.map +1 -0
  27. package/dist/src/utils/responses.d.ts +21 -4
  28. package/dist/src/utils/responses.d.ts.map +1 -1
  29. package/dist/src/utils/responses.js +58 -0
  30. package/dist/src/utils/responses.js.map +1 -1
  31. package/dist/src/verified-fetch.d.ts +2 -1
  32. package/dist/src/verified-fetch.d.ts.map +1 -1
  33. package/dist/src/verified-fetch.js +61 -25
  34. package/dist/src/verified-fetch.js.map +1 -1
  35. package/package.json +4 -3
  36. package/src/index.ts +49 -8
  37. package/src/types.ts +2 -0
  38. package/src/utils/byte-range-context.ts +303 -0
  39. package/src/utils/get-stream-from-async-iterable.ts +1 -1
  40. package/src/utils/parse-resource.ts +2 -2
  41. package/src/utils/parse-url-string.ts +7 -7
  42. package/src/utils/request-headers.ts +51 -0
  43. package/src/utils/response-headers.ts +32 -0
  44. package/src/utils/responses.ts +82 -4
  45. package/src/verified-fetch.ts +68 -29
@@ -148,7 +148,7 @@
148
148
  *
149
149
  * ```typescript
150
150
  * import { createVerifiedFetch } from '@helia/verified-fetch'
151
- * import { dnsJsonOverHttps, dnsOverHttps } from '@helia/ipns/dns-resolvers'
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 { DNSResolver, IPNSRoutingEvents, ResolveDnsLinkProgressEvents, ResolveProgressEvents } from '@helia/ipns';
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 | ResolveProgressEvents | ResolveDnsLinkProgressEvents | IPNSRoutingEvents;
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`.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
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 '@helia/ipns/dns-resolvers'
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 }, { dnsResolvers, ...options });
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsjBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,aAAa,IAAI,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAqGzE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAE,IAAsC,EAAE,OAAoC;IACrH,IAAI,YAAuC,CAAA;IAC3C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,YAAY,GAAG,IAAI,EAAE,YAAY,CAAA;QACjC,IAAI,GAAG,MAAM,eAAe,CAAC;YAC3B,YAAY,EAAE;gBACZ,gBAAgB,CAAC;oBACf,QAAQ,EAAE,IAAI,EAAE,QAAQ;iBACzB,CAAC;aACH;YACD,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;SAC/G,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,qBAAqB,GAAG,IAAI,kBAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;IACnG,KAAK,UAAU,aAAa,CAAE,QAAkB,EAAE,OAA2B;QAC3E,OAAO,qBAAqB,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACvD,CAAC;IACD,aAAa,CAAC,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IAC3E,aAAa,CAAC,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IAE7E,OAAO,aAAa,CAAA;AACtB,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE9C,SAAS,OAAO,CAAE,GAAQ;IACxB,0EAA0E;IAC1E,OAAO,GAAG,EAAE,UAAU,IAAI,IAAI;QAC5B,GAAG,EAAE,SAAS,IAAI,IAAI;QACtB,GAAG,EAAE,EAAE,IAAI,IAAI;QACf,GAAG,EAAE,IAAI,IAAI,IAAI;QACjB,GAAG,EAAE,KAAK,IAAI,IAAI,CAAA;AACtB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
1
  export type RequestFormatShorthand = 'raw' | 'car' | 'tar' | 'ipns-record' | 'dag-json' | 'dag-cbor' | 'json' | 'cbor';
2
+ export type SupportedBodyTypes = string | ArrayBuffer | Blob | ReadableStream<Uint8Array> | null;
2
3
  //# sourceMappingURL=types.d.ts.map
@@ -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('No content found for path', path);
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, ResolveDnsLinkProgressEvents, ResolveProgressEvents } from '@helia/ipns';
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 | ResolveDnsLinkProgressEvents> {
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, IPNSRoutingEvents, ResolveDnsLinkProgressEvents, ResolveProgressEvents } from '@helia/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<ResolveProgressEvents | IPNSRoutingEvents | ResolveDnsLinkProgressEvents> {
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,iBAAiB,EAAE,4BAA4B,EAAE,qBAAqB,EAAiB,MAAM,aAAa,CAAA;AAC9H,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,qBAAqB,GAAG,iBAAiB,GAAG,4BAA4B,CAAC;CAEvI;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"}
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"}