@helia/verified-fetch 1.2.0 → 1.2.1
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 +3 -3
- package/dist/src/utils/byte-range-context.d.ts +0 -2
- package/dist/src/utils/byte-range-context.d.ts.map +1 -1
- package/dist/src/utils/byte-range-context.js +33 -31
- package/dist/src/utils/byte-range-context.js.map +1 -1
- package/dist/src/utils/request-headers.d.ts.map +1 -1
- package/dist/src/utils/request-headers.js +21 -9
- package/dist/src/utils/request-headers.js.map +1 -1
- package/dist/src/utils/response-headers.d.ts.map +1 -1
- package/dist/src/utils/response-headers.js +10 -2
- package/dist/src/utils/response-headers.js.map +1 -1
- package/package.json +1 -1
- package/src/utils/byte-range-context.ts +33 -35
- package/src/utils/request-headers.ts +22 -10
- package/src/utils/response-headers.ts +12 -2
|
@@ -19,8 +19,6 @@ export declare class ByteRangeContext {
|
|
|
19
19
|
setBody(body: SupportedBodyTypes): void;
|
|
20
20
|
getBody(): SupportedBodyTypes;
|
|
21
21
|
private getSlicedBody;
|
|
22
|
-
private get isSuffixLengthRequest();
|
|
23
|
-
private get isPrefixLengthRequest();
|
|
24
22
|
/**
|
|
25
23
|
* Sometimes, we need to set the fileSize explicitly because we can't calculate
|
|
26
24
|
* the size of the body (e.g. for unixfs content where we call .stat).
|
|
@@ -1 +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;
|
|
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;IA4BrC,OAAO,CAAC,aAAa;IAOrB;;;;;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;IAexB,OAAO,CAAC,cAAc;IAetB;;;OAGG;IACH,IAAW,mBAAmB,IAAK,OAAO,CAmCzC;IAED;;;;OAIG;IACH,IAAW,MAAM,IAAK,MAAM,CAE3B;IAED;;;;OAIG;IACH,IAAW,MAAM,IAAK,MAAM,GAAG,SAAS,CASvC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;;;;;;;;;OAUG;IAEH,IAAW,uBAAuB,IAAK,MAAM,CAW5C;CACF"}
|
|
@@ -101,26 +101,13 @@ export class ByteRangeContext {
|
|
|
101
101
|
this.log.error('returning unmodified body for valid range request');
|
|
102
102
|
return body;
|
|
103
103
|
}
|
|
104
|
+
// TODO: we should be able to use this.offset and this.length to slice the body
|
|
104
105
|
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
106
|
const offset = this.byteStart ?? 0;
|
|
114
107
|
const length = this.byteEnd == null ? undefined : this.byteEnd + 1;
|
|
115
108
|
this.log.trace('returning body with offset %o and length %o', offset, length);
|
|
116
109
|
return body.slice(offset, length);
|
|
117
110
|
}
|
|
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
111
|
/**
|
|
125
112
|
* Sometimes, we need to set the fileSize explicitly because we can't calculate
|
|
126
113
|
* the size of the body (e.g. for unixfs content where we call .stat).
|
|
@@ -141,7 +128,10 @@ export class ByteRangeContext {
|
|
|
141
128
|
if (this.byteStart < 0) {
|
|
142
129
|
return false;
|
|
143
130
|
}
|
|
144
|
-
if (this._fileSize != null && this.byteStart
|
|
131
|
+
if (this._fileSize != null && this.byteStart >= this._fileSize) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
if (this.byteEnd != null && this.byteStart > this.byteEnd) {
|
|
145
135
|
return false;
|
|
146
136
|
}
|
|
147
137
|
}
|
|
@@ -152,7 +142,10 @@ export class ByteRangeContext {
|
|
|
152
142
|
if (this.byteEnd < 0) {
|
|
153
143
|
return false;
|
|
154
144
|
}
|
|
155
|
-
if (this._fileSize != null && this.byteEnd
|
|
145
|
+
if (this._fileSize != null && this.byteEnd >= this._fileSize) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
if (this.byteStart != null && this.byteEnd < this.byteStart) {
|
|
156
149
|
return false;
|
|
157
150
|
}
|
|
158
151
|
}
|
|
@@ -193,6 +186,10 @@ export class ByteRangeContext {
|
|
|
193
186
|
return false;
|
|
194
187
|
}
|
|
195
188
|
}
|
|
189
|
+
if (this.byteEnd == null && this.byteStart == null && this.byteSize == null) {
|
|
190
|
+
this.log.trace('invalid range request, could not calculate byteStart, byteEnd, or byteSize');
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
196
193
|
return true;
|
|
197
194
|
}
|
|
198
195
|
/**
|
|
@@ -201,15 +198,6 @@ export class ByteRangeContext {
|
|
|
201
198
|
* 2. slicing the body
|
|
202
199
|
*/
|
|
203
200
|
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
201
|
return this.byteStart ?? 0;
|
|
214
202
|
}
|
|
215
203
|
/**
|
|
@@ -218,7 +206,13 @@ export class ByteRangeContext {
|
|
|
218
206
|
* 2. slicing the body
|
|
219
207
|
*/
|
|
220
208
|
get length() {
|
|
221
|
-
|
|
209
|
+
if (this.byteEnd != null && this.byteStart != null && this.byteStart === this.byteEnd) {
|
|
210
|
+
return 1;
|
|
211
|
+
}
|
|
212
|
+
if (this.byteEnd != null) {
|
|
213
|
+
return this.byteEnd + 1;
|
|
214
|
+
}
|
|
215
|
+
return this.byteSize != null ? this.byteSize - 1 : undefined;
|
|
222
216
|
}
|
|
223
217
|
/**
|
|
224
218
|
* Converts a range request header into helia/unixfs supported range options
|
|
@@ -242,11 +236,19 @@ export class ByteRangeContext {
|
|
|
242
236
|
this.log.trace('requestRangeStart and requestRangeEnd are null');
|
|
243
237
|
return;
|
|
244
238
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
239
|
+
try {
|
|
240
|
+
const { start, end, byteSize } = calculateByteRangeIndexes(this.requestRangeStart ?? undefined, this.requestRangeEnd ?? undefined, this._fileSize ?? undefined);
|
|
241
|
+
this.log.trace('set byteStart to %o, byteEnd to %o, byteSize to %o', start, end, byteSize);
|
|
242
|
+
this.byteStart = start;
|
|
243
|
+
this.byteEnd = end;
|
|
244
|
+
this.byteSize = byteSize;
|
|
245
|
+
}
|
|
246
|
+
catch (e) {
|
|
247
|
+
this.log.error('error setting offset details: %o', e);
|
|
248
|
+
this.byteStart = undefined;
|
|
249
|
+
this.byteEnd = undefined;
|
|
250
|
+
this.byteSize = undefined;
|
|
251
|
+
}
|
|
250
252
|
}
|
|
251
253
|
/**
|
|
252
254
|
* This function returns the value of the "content-range" header.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"byte-range-context.js","sourceRoot":"","sources":["../../../src/utils/byte-range-context.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"byte-range-context.js","sourceRoot":"","sources":["../../../src/utils/byte-range-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-headers.d.ts","sourceRoot":"","sources":["../../../src/utils/request-headers.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAE,OAAO,EAAE,WAAW,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB/F;AAED;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"request-headers.d.ts","sourceRoot":"","sources":["../../../src/utils/request-headers.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAE,OAAO,EAAE,WAAW,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB/F;AAED;;;;;GAKG;AAEH,wBAAgB,yBAAyB,CAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAoCrK"}
|
|
@@ -21,11 +21,21 @@ export function getHeader(headers, header) {
|
|
|
21
21
|
* 2. the start index of the range. // inclusive
|
|
22
22
|
* 3. the end index of the range. // inclusive
|
|
23
23
|
*/
|
|
24
|
+
// eslint-disable-next-line complexity
|
|
24
25
|
export function calculateByteRangeIndexes(start, end, fileSize) {
|
|
26
|
+
if ((start ?? 0) > (end ?? Infinity)) {
|
|
27
|
+
throw new Error('Invalid range: Range-start index is greater than range-end index.');
|
|
28
|
+
}
|
|
29
|
+
if (start != null && (end ?? 0) >= (fileSize ?? Infinity)) {
|
|
30
|
+
throw new Error('Invalid range: Range-end index is greater than or equal to the size of the file.');
|
|
31
|
+
}
|
|
32
|
+
if (start == null && (end ?? 0) > (fileSize ?? Infinity)) {
|
|
33
|
+
throw new Error('Invalid range: Range-end index is greater than the size of the file.');
|
|
34
|
+
}
|
|
35
|
+
if (start != null && start < 0) {
|
|
36
|
+
throw new Error('Invalid range: Range-start index cannot be negative.');
|
|
37
|
+
}
|
|
25
38
|
if (start != null && end != null) {
|
|
26
|
-
if (start > end) {
|
|
27
|
-
throw new Error('Invalid range');
|
|
28
|
-
}
|
|
29
39
|
return { byteSize: end - start + 1, start, end };
|
|
30
40
|
}
|
|
31
41
|
else if (start == null && end != null) {
|
|
@@ -33,18 +43,20 @@ export function calculateByteRangeIndexes(start, end, fileSize) {
|
|
|
33
43
|
if (fileSize == null) {
|
|
34
44
|
return { end };
|
|
35
45
|
}
|
|
36
|
-
|
|
37
|
-
|
|
46
|
+
if (end === fileSize) {
|
|
47
|
+
return { byteSize: fileSize, start: 0, end: fileSize - 1 };
|
|
48
|
+
}
|
|
49
|
+
return { byteSize: end, start: fileSize - end, end: fileSize - 1 };
|
|
38
50
|
}
|
|
39
51
|
else if (start != null && end == null) {
|
|
40
52
|
if (fileSize == null) {
|
|
53
|
+
// we only have the start index, and no fileSize, so we can't return a valid range.
|
|
41
54
|
return { start };
|
|
42
55
|
}
|
|
43
|
-
const
|
|
44
|
-
const
|
|
56
|
+
const end = fileSize - 1;
|
|
57
|
+
const byteSize = fileSize - start;
|
|
45
58
|
return { byteSize, start, end };
|
|
46
59
|
}
|
|
47
|
-
|
|
48
|
-
return { byteSize: fileSize };
|
|
60
|
+
return { byteSize: fileSize, start: 0, end: fileSize != null ? fileSize - 1 : 0 };
|
|
49
61
|
}
|
|
50
62
|
//# sourceMappingURL=request-headers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-headers.js","sourceRoot":"","sources":["../../../src/utils/request-headers.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAE,OAAgC,EAAE,MAAc;IACzE,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,OAAO,YAAY,OAAO,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,CAAA;IACzC,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;QACjF,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;IACpF,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAA;AACrB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAE,KAAyB,EAAE,GAAuB,EAAE,QAAiB;IAC9G,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"request-headers.js","sourceRoot":"","sources":["../../../src/utils/request-headers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-headers.d.ts","sourceRoot":"","sources":["../../../src/utils/response-headers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"response-headers.d.ts","sourceRoot":"","sources":["../../../src/utils/response-headers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,MAAM,CAmC7K"}
|
|
@@ -6,19 +6,27 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export function getContentRangeHeader({ byteStart, byteEnd, byteSize }) {
|
|
8
8
|
const total = byteSize ?? '*'; // if we don't know the total size, we should use *
|
|
9
|
+
if ((byteEnd ?? 0) >= (byteSize ?? Infinity)) {
|
|
10
|
+
throw new Error('Invalid range: Range-end index is greater than or equal to the size of the file.');
|
|
11
|
+
}
|
|
12
|
+
if ((byteStart ?? 0) >= (byteSize ?? Infinity)) {
|
|
13
|
+
throw new Error('Invalid range: Range-start index is greater than or equal to the size of the file.');
|
|
14
|
+
}
|
|
9
15
|
if (byteStart != null && byteEnd == null) {
|
|
10
16
|
// only byteStart in range
|
|
11
17
|
if (byteSize == null) {
|
|
12
18
|
return `bytes */${total}`;
|
|
13
19
|
}
|
|
14
|
-
return `bytes ${byteStart}-${byteSize}/${byteSize}`;
|
|
20
|
+
return `bytes ${byteStart}-${byteSize - 1}/${byteSize}`;
|
|
15
21
|
}
|
|
16
22
|
if (byteStart == null && byteEnd != null) {
|
|
17
23
|
// only byteEnd in range
|
|
18
24
|
if (byteSize == null) {
|
|
19
25
|
return `bytes */${total}`;
|
|
20
26
|
}
|
|
21
|
-
|
|
27
|
+
const end = byteSize - 1;
|
|
28
|
+
const start = end - byteEnd + 1;
|
|
29
|
+
return `bytes ${start}-${end}/${byteSize}`;
|
|
22
30
|
}
|
|
23
31
|
if (byteStart == null && byteEnd == null) {
|
|
24
32
|
// neither are provided, we can't return a valid range.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-headers.js","sourceRoot":"","sources":["../../../src/utils/response-headers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAgG;IACnK,MAAM,KAAK,GAAG,QAAQ,IAAI,GAAG,CAAA,CAAC,mDAAmD;IAEjF,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACzC,0BAA0B;QAC1B,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,WAAW,KAAK,EAAE,CAAA;QAC3B,CAAC;QACD,OAAO,SAAS,SAAS,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"response-headers.js","sourceRoot":"","sources":["../../../src/utils/response-headers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAgG;IACnK,MAAM,KAAK,GAAG,QAAQ,IAAI,GAAG,CAAA,CAAC,mDAAmD;IAEjF,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAA;IACrG,CAAC;IACD,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAA;IACvG,CAAC;IAED,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACzC,0BAA0B;QAC1B,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,WAAW,KAAK,EAAE,CAAA;QAC3B,CAAC;QACD,OAAO,SAAS,SAAS,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAA;IACzD,CAAC;IAED,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACzC,wBAAwB;QACxB,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,WAAW,KAAK,EAAE,CAAA;QAC3B,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,GAAG,CAAC,CAAA;QACxB,MAAM,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,CAAC,CAAA;QAE/B,OAAO,SAAS,KAAK,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC5C,CAAC;IAED,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACzC,uDAAuD;QACvD,OAAO,WAAW,KAAK,EAAE,CAAA;IAC3B,CAAC;IAED,OAAO,SAAS,SAAS,IAAI,OAAO,IAAI,KAAK,EAAE,CAAA;AACjD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@helia/verified-fetch",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.1",
|
|
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",
|
|
@@ -116,30 +116,14 @@ export class ByteRangeContext {
|
|
|
116
116
|
return body
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
+
// TODO: we should be able to use this.offset and this.length to slice the body
|
|
119
120
|
private getSlicedBody <T extends SliceableBody>(body: T): SliceableBody {
|
|
120
|
-
if (this.isPrefixLengthRequest) {
|
|
121
|
-
this.log.trace('sliced body with byteStart %o', this.byteStart)
|
|
122
|
-
return body.slice(this.offset) satisfies SliceableBody
|
|
123
|
-
}
|
|
124
|
-
if (this.isSuffixLengthRequest && this.length != null) {
|
|
125
|
-
this.log.trace('sliced body with length %o', -this.length)
|
|
126
|
-
return body.slice(-this.length) satisfies SliceableBody
|
|
127
|
-
}
|
|
128
121
|
const offset = this.byteStart ?? 0
|
|
129
122
|
const length = this.byteEnd == null ? undefined : this.byteEnd + 1
|
|
130
123
|
this.log.trace('returning body with offset %o and length %o', offset, length)
|
|
131
|
-
|
|
132
124
|
return body.slice(offset, length) satisfies SliceableBody
|
|
133
125
|
}
|
|
134
126
|
|
|
135
|
-
private get isSuffixLengthRequest (): boolean {
|
|
136
|
-
return this.requestRangeStart == null && this.requestRangeEnd != null
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
private get isPrefixLengthRequest (): boolean {
|
|
140
|
-
return this.requestRangeStart != null && this.requestRangeEnd == null
|
|
141
|
-
}
|
|
142
|
-
|
|
143
127
|
/**
|
|
144
128
|
* Sometimes, we need to set the fileSize explicitly because we can't calculate
|
|
145
129
|
* the size of the body (e.g. for unixfs content where we call .stat).
|
|
@@ -162,7 +146,10 @@ export class ByteRangeContext {
|
|
|
162
146
|
if (this.byteStart < 0) {
|
|
163
147
|
return false
|
|
164
148
|
}
|
|
165
|
-
if (this._fileSize != null && this.byteStart
|
|
149
|
+
if (this._fileSize != null && this.byteStart >= this._fileSize) {
|
|
150
|
+
return false
|
|
151
|
+
}
|
|
152
|
+
if (this.byteEnd != null && this.byteStart > this.byteEnd) {
|
|
166
153
|
return false
|
|
167
154
|
}
|
|
168
155
|
}
|
|
@@ -174,7 +161,10 @@ export class ByteRangeContext {
|
|
|
174
161
|
if (this.byteEnd < 0) {
|
|
175
162
|
return false
|
|
176
163
|
}
|
|
177
|
-
if (this._fileSize != null && this.byteEnd
|
|
164
|
+
if (this._fileSize != null && this.byteEnd >= this._fileSize) {
|
|
165
|
+
return false
|
|
166
|
+
}
|
|
167
|
+
if (this.byteStart != null && this.byteEnd < this.byteStart) {
|
|
178
168
|
return false
|
|
179
169
|
}
|
|
180
170
|
}
|
|
@@ -214,6 +204,10 @@ export class ByteRangeContext {
|
|
|
214
204
|
return false
|
|
215
205
|
}
|
|
216
206
|
}
|
|
207
|
+
if (this.byteEnd == null && this.byteStart == null && this.byteSize == null) {
|
|
208
|
+
this.log.trace('invalid range request, could not calculate byteStart, byteEnd, or byteSize')
|
|
209
|
+
return false
|
|
210
|
+
}
|
|
217
211
|
|
|
218
212
|
return true
|
|
219
213
|
}
|
|
@@ -224,16 +218,6 @@ export class ByteRangeContext {
|
|
|
224
218
|
* 2. slicing the body
|
|
225
219
|
*/
|
|
226
220
|
public get offset (): number {
|
|
227
|
-
if (this.byteStart === 0) {
|
|
228
|
-
return 0
|
|
229
|
-
}
|
|
230
|
-
if (this.isPrefixLengthRequest || this.isSuffixLengthRequest) {
|
|
231
|
-
if (this.byteStart != null) {
|
|
232
|
-
// we have to subtract by 1 because the offset is inclusive
|
|
233
|
-
return this.byteStart - 1
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
221
|
return this.byteStart ?? 0
|
|
238
222
|
}
|
|
239
223
|
|
|
@@ -243,7 +227,14 @@ export class ByteRangeContext {
|
|
|
243
227
|
* 2. slicing the body
|
|
244
228
|
*/
|
|
245
229
|
public get length (): number | undefined {
|
|
246
|
-
|
|
230
|
+
if (this.byteEnd != null && this.byteStart != null && this.byteStart === this.byteEnd) {
|
|
231
|
+
return 1
|
|
232
|
+
}
|
|
233
|
+
if (this.byteEnd != null) {
|
|
234
|
+
return this.byteEnd + 1
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return this.byteSize != null ? this.byteSize - 1 : undefined
|
|
247
238
|
}
|
|
248
239
|
|
|
249
240
|
/**
|
|
@@ -269,11 +260,18 @@ export class ByteRangeContext {
|
|
|
269
260
|
return
|
|
270
261
|
}
|
|
271
262
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
263
|
+
try {
|
|
264
|
+
const { start, end, byteSize } = calculateByteRangeIndexes(this.requestRangeStart ?? undefined, this.requestRangeEnd ?? undefined, this._fileSize ?? undefined)
|
|
265
|
+
this.log.trace('set byteStart to %o, byteEnd to %o, byteSize to %o', start, end, byteSize)
|
|
266
|
+
this.byteStart = start
|
|
267
|
+
this.byteEnd = end
|
|
268
|
+
this.byteSize = byteSize
|
|
269
|
+
} catch (e) {
|
|
270
|
+
this.log.error('error setting offset details: %o', e)
|
|
271
|
+
this.byteStart = undefined
|
|
272
|
+
this.byteEnd = undefined
|
|
273
|
+
this.byteSize = undefined
|
|
274
|
+
}
|
|
277
275
|
}
|
|
278
276
|
|
|
279
277
|
/**
|
|
@@ -23,29 +23,41 @@ export function getHeader (headers: HeadersInit | undefined, header: string): st
|
|
|
23
23
|
* 2. the start index of the range. // inclusive
|
|
24
24
|
* 3. the end index of the range. // inclusive
|
|
25
25
|
*/
|
|
26
|
+
// eslint-disable-next-line complexity
|
|
26
27
|
export function calculateByteRangeIndexes (start: number | undefined, end: number | undefined, fileSize?: number): { byteSize?: number, start?: number, end?: number } {
|
|
27
|
-
if (start
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
if ((start ?? 0) > (end ?? Infinity)) {
|
|
29
|
+
throw new Error('Invalid range: Range-start index is greater than range-end index.')
|
|
30
|
+
}
|
|
31
|
+
if (start != null && (end ?? 0) >= (fileSize ?? Infinity)) {
|
|
32
|
+
throw new Error('Invalid range: Range-end index is greater than or equal to the size of the file.')
|
|
33
|
+
}
|
|
34
|
+
if (start == null && (end ?? 0) > (fileSize ?? Infinity)) {
|
|
35
|
+
throw new Error('Invalid range: Range-end index is greater than the size of the file.')
|
|
36
|
+
}
|
|
37
|
+
if (start != null && start < 0) {
|
|
38
|
+
throw new Error('Invalid range: Range-start index cannot be negative.')
|
|
39
|
+
}
|
|
31
40
|
|
|
41
|
+
if (start != null && end != null) {
|
|
32
42
|
return { byteSize: end - start + 1, start, end }
|
|
33
43
|
} else if (start == null && end != null) {
|
|
34
44
|
// suffix byte range requested
|
|
35
45
|
if (fileSize == null) {
|
|
36
46
|
return { end }
|
|
37
47
|
}
|
|
38
|
-
|
|
39
|
-
|
|
48
|
+
if (end === fileSize) {
|
|
49
|
+
return { byteSize: fileSize, start: 0, end: fileSize - 1 }
|
|
50
|
+
}
|
|
51
|
+
return { byteSize: end, start: fileSize - end, end: fileSize - 1 }
|
|
40
52
|
} else if (start != null && end == null) {
|
|
41
53
|
if (fileSize == null) {
|
|
54
|
+
// we only have the start index, and no fileSize, so we can't return a valid range.
|
|
42
55
|
return { start }
|
|
43
56
|
}
|
|
44
|
-
const
|
|
45
|
-
const
|
|
57
|
+
const end = fileSize - 1
|
|
58
|
+
const byteSize = fileSize - start
|
|
46
59
|
return { byteSize, start, end }
|
|
47
60
|
}
|
|
48
61
|
|
|
49
|
-
|
|
50
|
-
return { byteSize: fileSize }
|
|
62
|
+
return { byteSize: fileSize, start: 0, end: fileSize != null ? fileSize - 1 : 0 }
|
|
51
63
|
}
|
|
@@ -7,12 +7,19 @@
|
|
|
7
7
|
export function getContentRangeHeader ({ byteStart, byteEnd, byteSize }: { byteStart: number | undefined, byteEnd: number | undefined, byteSize: number | undefined }): string {
|
|
8
8
|
const total = byteSize ?? '*' // if we don't know the total size, we should use *
|
|
9
9
|
|
|
10
|
+
if ((byteEnd ?? 0) >= (byteSize ?? Infinity)) {
|
|
11
|
+
throw new Error('Invalid range: Range-end index is greater than or equal to the size of the file.')
|
|
12
|
+
}
|
|
13
|
+
if ((byteStart ?? 0) >= (byteSize ?? Infinity)) {
|
|
14
|
+
throw new Error('Invalid range: Range-start index is greater than or equal to the size of the file.')
|
|
15
|
+
}
|
|
16
|
+
|
|
10
17
|
if (byteStart != null && byteEnd == null) {
|
|
11
18
|
// only byteStart in range
|
|
12
19
|
if (byteSize == null) {
|
|
13
20
|
return `bytes */${total}`
|
|
14
21
|
}
|
|
15
|
-
return `bytes ${byteStart}-${byteSize}/${byteSize}`
|
|
22
|
+
return `bytes ${byteStart}-${byteSize - 1}/${byteSize}`
|
|
16
23
|
}
|
|
17
24
|
|
|
18
25
|
if (byteStart == null && byteEnd != null) {
|
|
@@ -20,7 +27,10 @@ export function getContentRangeHeader ({ byteStart, byteEnd, byteSize }: { byteS
|
|
|
20
27
|
if (byteSize == null) {
|
|
21
28
|
return `bytes */${total}`
|
|
22
29
|
}
|
|
23
|
-
|
|
30
|
+
const end = byteSize - 1
|
|
31
|
+
const start = end - byteEnd + 1
|
|
32
|
+
|
|
33
|
+
return `bytes ${start}-${end}/${byteSize}`
|
|
24
34
|
}
|
|
25
35
|
|
|
26
36
|
if (byteStart == null && byteEnd == null) {
|