@juzi/file-box 1.7.20 → 1.8.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 +2 -2
- package/dist/cjs/src/config.d.ts +0 -1
- package/dist/cjs/src/config.d.ts.map +1 -1
- package/dist/cjs/src/config.js +1 -3
- package/dist/cjs/src/config.js.map +1 -1
- package/dist/cjs/src/misc.d.ts.map +1 -1
- package/dist/cjs/src/misc.js +143 -38
- package/dist/cjs/src/misc.js.map +1 -1
- package/dist/cjs/src/misc.spec.js +20 -17
- package/dist/cjs/src/misc.spec.js.map +1 -1
- package/dist/cjs/src/version.d.ts.map +1 -1
- package/dist/cjs/src/version.js +1 -1
- package/dist/cjs/src/version.js.map +1 -1
- package/dist/cjs/tests/chunk-download.spec.js +59 -43
- package/dist/cjs/tests/chunk-download.spec.js.map +1 -1
- package/dist/cjs/tests/misc-error-handling.spec.js +98 -4
- package/dist/cjs/tests/misc-error-handling.spec.js.map +1 -1
- package/dist/cjs/tests/network-timeout.spec.js +15 -2
- package/dist/cjs/tests/network-timeout.spec.js.map +1 -1
- package/dist/esm/src/config.d.ts +0 -1
- package/dist/esm/src/config.d.ts.map +1 -1
- package/dist/esm/src/config.js +0 -2
- package/dist/esm/src/config.js.map +1 -1
- package/dist/esm/src/misc.d.ts.map +1 -1
- package/dist/esm/src/misc.js +145 -40
- package/dist/esm/src/misc.js.map +1 -1
- package/dist/esm/src/misc.spec.js +20 -17
- package/dist/esm/src/misc.spec.js.map +1 -1
- package/dist/esm/src/version.d.ts.map +1 -1
- package/dist/esm/src/version.js +1 -1
- package/dist/esm/src/version.js.map +1 -1
- package/dist/esm/tests/chunk-download.spec.js +59 -43
- package/dist/esm/tests/chunk-download.spec.js.map +1 -1
- package/dist/esm/tests/misc-error-handling.spec.js +98 -4
- package/dist/esm/tests/misc-error-handling.spec.js.map +1 -1
- package/dist/esm/tests/network-timeout.spec.js +15 -2
- package/dist/esm/tests/network-timeout.spec.js.map +1 -1
- package/package.json +2 -2
- package/src/config.ts +0 -3
- package/src/misc.spec.ts +22 -14
- package/src/misc.ts +145 -39
- package/src/version.ts +1 -1
package/dist/esm/src/misc.js
CHANGED
|
@@ -2,14 +2,16 @@ import assert from 'assert';
|
|
|
2
2
|
import { randomUUID } from 'crypto';
|
|
3
3
|
import { once } from 'events';
|
|
4
4
|
import { createReadStream, createWriteStream } from 'fs';
|
|
5
|
-
import { rm } from 'fs/promises';
|
|
5
|
+
import { rm, stat } from 'fs/promises';
|
|
6
6
|
import http from 'http';
|
|
7
7
|
import https from 'https';
|
|
8
8
|
import { HttpsProxyAgent } from 'https-proxy-agent';
|
|
9
9
|
import { tmpdir } from 'os';
|
|
10
10
|
import { join } from 'path';
|
|
11
|
+
import { Transform } from 'stream';
|
|
12
|
+
import { pipeline } from 'stream/promises';
|
|
11
13
|
import { URL } from 'url';
|
|
12
|
-
import {
|
|
14
|
+
import { HTTP_REQUEST_TIMEOUT, HTTP_RESPONSE_TIMEOUT, } from './config.js';
|
|
13
15
|
const protocolMap = {
|
|
14
16
|
'http:': { agent: http.globalAgent, request: http.request },
|
|
15
17
|
'https:': { agent: https.globalAgent, request: https.request },
|
|
@@ -82,9 +84,10 @@ export async function httpStream(url, headers = {}, proxyUrl) {
|
|
|
82
84
|
const fileSize = Number(headHeaders['content-length']);
|
|
83
85
|
// 运行时读取 env:方便测试/调用方动态调整
|
|
84
86
|
const noSliceDown = process.env['FILEBOX_NO_SLICE_DOWN'] === 'true';
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
87
|
+
// 检查服务器是否支持 range 请求
|
|
88
|
+
const supportsRange = headHeaders['accept-ranges'] === 'bytes';
|
|
89
|
+
if (!unsupportedRangeDomains.has(hostname) && !noSliceDown && supportsRange && fileSize > 0) {
|
|
90
|
+
return await downloadFileInChunks(url, options, proxyUrl);
|
|
88
91
|
}
|
|
89
92
|
else {
|
|
90
93
|
return await fetch(url, options, proxyUrl);
|
|
@@ -185,7 +188,31 @@ async function fetch(url, options, proxyUrl) {
|
|
|
185
188
|
});
|
|
186
189
|
return res;
|
|
187
190
|
}
|
|
188
|
-
|
|
191
|
+
function createSkipTransform(skipBytes) {
|
|
192
|
+
let skipped = 0;
|
|
193
|
+
return new Transform({
|
|
194
|
+
transform(chunk, _encoding, callback) {
|
|
195
|
+
if (skipped < skipBytes) {
|
|
196
|
+
const remaining = skipBytes - skipped;
|
|
197
|
+
if (chunk.length <= remaining) {
|
|
198
|
+
// 整个 chunk 都需要跳过
|
|
199
|
+
skipped += chunk.length;
|
|
200
|
+
callback();
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
// 跳过部分 chunk
|
|
205
|
+
skipped = skipBytes;
|
|
206
|
+
callback(null, chunk.subarray(remaining));
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// 已经跳过足够的字节,直接传递
|
|
211
|
+
callback(null, chunk);
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
async function downloadFileInChunks(url, options, proxyUrl) {
|
|
189
216
|
const tmpFile = join(tmpdir(), `filebox-${randomUUID()}`);
|
|
190
217
|
const writeStream = createWriteStream(tmpFile);
|
|
191
218
|
const writeAbortController = new AbortController();
|
|
@@ -199,66 +226,144 @@ async function downloadFileInChunks(url, options, fileSize, chunkSize = HTTP_CHU
|
|
|
199
226
|
headers: {},
|
|
200
227
|
...options,
|
|
201
228
|
};
|
|
202
|
-
|
|
229
|
+
// 预期文件大小(初始为 null,从首次 206 响应中获取)
|
|
230
|
+
let expectedTotal = null;
|
|
203
231
|
let start = 0;
|
|
204
|
-
let end = 0;
|
|
205
232
|
let downSize = 0;
|
|
206
233
|
let retries = 3;
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
234
|
+
// 标识是否需要回退到非分片下载
|
|
235
|
+
let shouldFallback = false;
|
|
236
|
+
do {
|
|
237
|
+
// 每次循环前检查文件实际大小,作为真实的下载进度
|
|
238
|
+
// 这样在重试时可以从实际写入的位置继续,避免数据重复
|
|
239
|
+
try {
|
|
240
|
+
const fileStats = await stat(tmpFile);
|
|
241
|
+
const actualSize = fileStats.size;
|
|
242
|
+
if (actualSize > downSize) {
|
|
243
|
+
// 文件实际大小比记录的大,说明之前有部分写入
|
|
244
|
+
downSize = actualSize;
|
|
245
|
+
start = actualSize;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
// 文件不存在或无法访问,使用当前的 downSize
|
|
250
|
+
}
|
|
251
|
+
const range = `bytes=${start}-`;
|
|
210
252
|
const requestOptions = Object.assign({}, requestBaseOptions);
|
|
211
253
|
assert(requestOptions.headers, 'Errors that should not happen: Invalid headers');
|
|
212
254
|
requestOptions.headers['Range'] = range;
|
|
255
|
+
// 每次请求创建独立的 AbortController 来管理当前请求的生命周期
|
|
256
|
+
const requestAbortController = new AbortController();
|
|
257
|
+
requestOptions.signal = requestAbortController.signal;
|
|
213
258
|
try {
|
|
214
259
|
const res = await fetch(url, requestOptions, proxyUrl);
|
|
215
260
|
if (res.statusCode === 416) {
|
|
216
|
-
unsupportedRangeDomains.add(new URL(url).hostname);
|
|
217
261
|
// 某些云服务商对分片下载的支持可能不规范,需要保留一个回退的方式
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
await once(writeStream, 'close', { signal });
|
|
221
|
-
}
|
|
222
|
-
catch { }
|
|
223
|
-
await rm(tmpFile, { force: true });
|
|
224
|
-
return await fetch(url, requestBaseOptions, proxyUrl);
|
|
262
|
+
shouldFallback = true;
|
|
263
|
+
break;
|
|
225
264
|
}
|
|
226
265
|
assert(allowStatusCode.includes(res.statusCode ?? 0), `Request failed with status code ${res.statusCode}`);
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
266
|
+
const contentLength = Number(res.headers['content-length']);
|
|
267
|
+
assert(contentLength > 0, 'Server returned 0 bytes of data');
|
|
268
|
+
// 206: 部分内容,继续分片下载
|
|
269
|
+
// 200: 完整内容,服务器不支持 range 或返回全部数据
|
|
270
|
+
if (res.statusCode === 206) {
|
|
271
|
+
// 206 响应必须包含有效的 Content-Range 头(RFC 7233)
|
|
272
|
+
const contentRange = res.headers['content-range'];
|
|
273
|
+
if (!contentRange) {
|
|
274
|
+
// Content-Range 缺失,服务器不规范,回退到非分片下载
|
|
275
|
+
shouldFallback = true;
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
let end;
|
|
279
|
+
let total;
|
|
280
|
+
let actualStart;
|
|
281
|
+
try {
|
|
282
|
+
const parsed = parseContentRange(contentRange);
|
|
283
|
+
actualStart = parsed.start;
|
|
284
|
+
end = parsed.end;
|
|
285
|
+
total = parsed.total;
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
// Content-Range 格式错误,服务器不规范,回退到非分片下载
|
|
289
|
+
shouldFallback = true;
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
if (expectedTotal === null) {
|
|
293
|
+
// 首次获得文件总大小
|
|
231
294
|
// 某些云服务商(如腾讯云)在 head 方法中返回的 size 是原图大小,但下载时返回的是压缩后的图片,会比原图小。
|
|
232
|
-
// 这种在首次下载时虽然请求了原图大小的范围,可能比缩略图大,但会一次性返回完整的原图,而不是报错 416,通过修正
|
|
233
|
-
|
|
295
|
+
// 这种在首次下载时虽然请求了原图大小的范围,可能比缩略图大,但会一次性返回完整的原图,而不是报错 416,通过修正 expectedTotal 跳出循环即可。
|
|
296
|
+
expectedTotal = total;
|
|
234
297
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
if (
|
|
241
|
-
|
|
242
|
-
|
|
298
|
+
else if (total !== expectedTotal) {
|
|
299
|
+
// 服务器返回的文件总大小出现了变化
|
|
300
|
+
throw new Error(`File size mismatch: expected ${expectedTotal}, but server returned ${total}`);
|
|
301
|
+
}
|
|
302
|
+
// 验证服务器返回的范围是否与请求匹配
|
|
303
|
+
if (actualStart !== start) {
|
|
304
|
+
if (actualStart > start) {
|
|
305
|
+
// 服务器跳过了部分数据,这是严重错误
|
|
306
|
+
throw new Error(`Range mismatch: requested start=${start}, but server returned start=${actualStart} (gap detected)`);
|
|
243
307
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
308
|
+
else {
|
|
309
|
+
// actualStart < start: 服务器返回了重叠数据,需要跳过前面的字节
|
|
310
|
+
const skipBytes = start - actualStart;
|
|
311
|
+
const skipTransform = createSkipTransform(skipBytes);
|
|
312
|
+
await pipeline(res, skipTransform, writeStream, { end: false, signal });
|
|
313
|
+
// 更新进度时使用我们请求的范围,而不是服务器返回的范围
|
|
314
|
+
downSize += end - actualStart + 1 - skipBytes;
|
|
315
|
+
start = downSize;
|
|
316
|
+
retries = 3; // 成功后重置重试次数
|
|
317
|
+
continue;
|
|
247
318
|
}
|
|
248
319
|
}
|
|
320
|
+
// 使用 pipeline,但不关闭 writeStream(继续下载下一个分片)
|
|
321
|
+
await pipeline(res, writeStream, { end: false, signal });
|
|
322
|
+
// pipeline 成功后才更新下载进度
|
|
323
|
+
// end 是最后一个字节的索引,下次从 end+1 开始
|
|
324
|
+
downSize += end - start + 1;
|
|
325
|
+
start = downSize;
|
|
249
326
|
}
|
|
250
|
-
|
|
327
|
+
else {
|
|
328
|
+
// 200: 服务器返回完整文件,不支持 range
|
|
329
|
+
if (start > 0) {
|
|
330
|
+
// 中途收到 200,服务器停止支持 range,标记并回退到普通下载
|
|
331
|
+
shouldFallback = true;
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
// 首次请求返回 200,正常处理
|
|
335
|
+
await pipeline(res, writeStream, { signal });
|
|
336
|
+
downSize = contentLength;
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
// 成功后重置重试次数
|
|
340
|
+
retries = 3;
|
|
251
341
|
}
|
|
252
342
|
catch (error) {
|
|
253
343
|
const err = error instanceof Error ? error : new Error(String(error));
|
|
254
344
|
if (--retries <= 0) {
|
|
255
345
|
writeStream.destroy();
|
|
256
|
-
|
|
346
|
+
await rm(tmpFile, { force: true });
|
|
257
347
|
throw new Error(`Download file with chunk failed! ${err.message}`, { cause: err });
|
|
258
348
|
}
|
|
349
|
+
// 失败后等待一小段时间再重试
|
|
350
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
351
|
+
}
|
|
352
|
+
finally {
|
|
353
|
+
// 确保请求被清理(成功时也需要 abort 以释放资源)
|
|
354
|
+
requestAbortController.abort();
|
|
259
355
|
}
|
|
260
|
-
|
|
261
|
-
|
|
356
|
+
} while (expectedTotal === null || downSize < expectedTotal);
|
|
357
|
+
// 统一处理回退到非分片下载的情况
|
|
358
|
+
if (shouldFallback) {
|
|
359
|
+
unsupportedRangeDomains.add(new URL(url).hostname);
|
|
360
|
+
writeStream.destroy();
|
|
361
|
+
try {
|
|
362
|
+
await once(writeStream, 'close', { signal });
|
|
363
|
+
}
|
|
364
|
+
catch { }
|
|
365
|
+
await rm(tmpFile, { force: true });
|
|
366
|
+
return await fetch(url, requestBaseOptions, proxyUrl);
|
|
262
367
|
}
|
|
263
368
|
writeStream.end();
|
|
264
369
|
try {
|
package/dist/esm/src/misc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"misc.js","sourceRoot":"","sources":["../../../src/misc.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"misc.js","sourceRoot":"","sources":["../../../src/misc.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,8 +63,21 @@ test('httpHeaderToFileName', async (t) => {
|
|
|
63
63
|
});
|
|
64
64
|
test('httpStream', async (t) => {
|
|
65
65
|
const server = createServer((req, res) => {
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
const content = JSON.stringify({ headers: req.headers });
|
|
67
|
+
// Handle HEAD requests
|
|
68
|
+
if (req.method === 'HEAD') {
|
|
69
|
+
res.writeHead(200, {
|
|
70
|
+
'Content-Length': String(content.length),
|
|
71
|
+
'Content-Type': 'application/json',
|
|
72
|
+
});
|
|
73
|
+
res.end();
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
res.writeHead(200, {
|
|
77
|
+
'Content-Length': String(content.length),
|
|
78
|
+
'Content-Type': 'application/json',
|
|
79
|
+
});
|
|
80
|
+
res.end(content);
|
|
68
81
|
});
|
|
69
82
|
const host = await new Promise((resolve) => {
|
|
70
83
|
server.listen(0, '127.0.0.1', () => {
|
|
@@ -98,14 +111,14 @@ test('httpStream in chunks', async (t) => {
|
|
|
98
111
|
}
|
|
99
112
|
const range = req.headers.range;
|
|
100
113
|
if (range) {
|
|
101
|
-
const m = String(range).match(/bytes=(\d+)-(\d
|
|
114
|
+
const m = String(range).match(/bytes=(\d+)-(\d*)/);
|
|
102
115
|
if (!m) {
|
|
103
116
|
res.writeHead(416);
|
|
104
117
|
res.end();
|
|
105
118
|
return;
|
|
106
119
|
}
|
|
107
120
|
const start = Number(m[1]);
|
|
108
|
-
const end = Number(m[2]);
|
|
121
|
+
const end = m[2] ? Number(m[2]) : FILE_SIZE - 1;
|
|
109
122
|
const chunk = content.subarray(start, end + 1);
|
|
110
123
|
res.writeHead(206, {
|
|
111
124
|
'Accept-Ranges': 'bytes',
|
|
@@ -128,18 +141,8 @@ test('httpStream in chunks', async (t) => {
|
|
|
128
141
|
});
|
|
129
142
|
});
|
|
130
143
|
t.teardown(() => { server.close(); });
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const res = await httpStream(`${host}/file`);
|
|
135
|
-
const buffer = await streamToBuffer(res);
|
|
136
|
-
t.equal(buffer.length, FILE_SIZE, 'should get data in chunks right');
|
|
137
|
-
}
|
|
138
|
-
finally {
|
|
139
|
-
if (originalChunkSize)
|
|
140
|
-
process.env['FILEBOX_HTTP_CHUNK_SIZE'] = originalChunkSize;
|
|
141
|
-
else
|
|
142
|
-
delete process.env['FILEBOX_HTTP_CHUNK_SIZE'];
|
|
143
|
-
}
|
|
144
|
+
const res = await httpStream(`${host}/file`);
|
|
145
|
+
const buffer = await streamToBuffer(res);
|
|
146
|
+
t.equal(buffer.length, FILE_SIZE, 'should get data in chunks right');
|
|
144
147
|
});
|
|
145
148
|
//# sourceMappingURL=misc.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"misc.spec.js","sourceRoot":"","sources":["../../../src/misc.spec.ts"],"names":[],"mappings":";AAEA,sCAAsC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AAEnC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,UAAU,EACV,cAAc,GACf,MAAM,WAAW,CAAA;AAElB,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAClC,MAAM,MAAM,GAAG;QACb,0EAA0E;QAC1E,0EAA0E;QAC1E,0EAA0E;QAC1E,0EAA0E;KAC3E,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACV,MAAM,OAAO,GAAG;QACd,wBAAwB;QACxB,MAAM;KACP,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEV,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,gCAAgC,CAAC,CAAA;AAC7E,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC/B;;;OAGG;IACH,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,IAAI,GAAG,CAAC,GAAG,KAAK,WAAW,EAAE;YAC3B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAA;YAC1C,GAAG,CAAC,GAAG,EAAE,CAAA;YACT,OAAM;SACP;QACD,IAAI,GAAG,CAAC,GAAG,KAAK,QAAQ,EAAE;YACxB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjB,qBAAqB,EAAE,0CAA0C;gBACjE,gBAAgB,EAAE,GAAG;aACtB,CAAC,CAAA;YACF,GAAG,CAAC,GAAG,EAAE,CAAA;YACT,OAAM;SACP;QACD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QAClB,GAAG,CAAC,GAAG,EAAE,CAAA;IACX,CAAC,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAiB,CAAA;YAC5C,OAAO,CAAC,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA;IAEpC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,IAAI,WAAW,CAAC,CAAA;IACxD,CAAC,CAAC,KAAK,CACL,OAAO,CAAC,qBAAqB,CAAC,EAC9B,0CAA0C,EAC1C,8BAA8B,CAC/B,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACrC,MAAM,sBAAsB,GAAQ;QAClC,qBAAqB,EAAE,sCAAsC;KAC9D,CAAA;IACD,MAAM,yBAAyB,GAAQ;QACrC,qBAAqB,EAAE,oCAAoC;KAC5D,CAAA;IACD,MAAM,kBAAkB,GAAG,eAAe,CAAA;IAE1C,IAAI,QAAQ,GAAG,oBAAoB,CAAC,sBAAsB,CAAC,CAAA;IAC3D,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,kBAAkB,EAAE,yCAAyC,CAAC,CAAA;IAEhF,QAAQ,GAAG,oBAAoB,CAAC,yBAAyB,CAAC,CAAA;IAC1D,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,kBAAkB,EAAE,4CAA4C,CAAC,CAAA;AACrF,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,YAAY,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"misc.spec.js","sourceRoot":"","sources":["../../../src/misc.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,MAAgB,CAAA"}
|
package/dist/esm/src/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAW,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAW,OAAO,CAAA"}
|
|
@@ -7,6 +7,16 @@ test('should download file in chunks with range support', async (t) => {
|
|
|
7
7
|
const FILE_SIZE = 1024 * 1024; // 1MB
|
|
8
8
|
const fileContent = Buffer.alloc(FILE_SIZE, 'X');
|
|
9
9
|
const server = createServer((req, res) => {
|
|
10
|
+
// Handle HEAD requests
|
|
11
|
+
if (req.method === 'HEAD') {
|
|
12
|
+
res.writeHead(200, {
|
|
13
|
+
'Accept-Ranges': 'bytes',
|
|
14
|
+
'Content-Length': FILE_SIZE,
|
|
15
|
+
'Content-Type': 'application/octet-stream',
|
|
16
|
+
});
|
|
17
|
+
res.end();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
10
20
|
const rangeHeader = req.headers.range;
|
|
11
21
|
if (rangeHeader) {
|
|
12
22
|
// Parse range header
|
|
@@ -38,20 +48,10 @@ test('should download file in chunks with range support', async (t) => {
|
|
|
38
48
|
});
|
|
39
49
|
const url = `http://127.0.0.1:${port}/largefile`;
|
|
40
50
|
try {
|
|
41
|
-
// Set environment to enable chunk download
|
|
42
|
-
const originalChunkSize = process.env['FILEBOX_HTTP_CHUNK_SIZE'];
|
|
43
|
-
process.env['FILEBOX_HTTP_CHUNK_SIZE'] = String(512 * 1024); // 512KB chunks
|
|
44
51
|
const stream = await httpStream(url);
|
|
45
52
|
const buffer = await streamToBuffer(stream);
|
|
46
53
|
t.equal(buffer.length, FILE_SIZE, 'should download complete file');
|
|
47
54
|
t.ok(buffer.every(byte => byte === 88), 'should have correct content (all X)');
|
|
48
|
-
// Restore environment
|
|
49
|
-
if (originalChunkSize) {
|
|
50
|
-
process.env['FILEBOX_HTTP_CHUNK_SIZE'] = originalChunkSize;
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
delete process.env['FILEBOX_HTTP_CHUNK_SIZE'];
|
|
54
|
-
}
|
|
55
55
|
}
|
|
56
56
|
finally {
|
|
57
57
|
server.close();
|
|
@@ -64,6 +64,16 @@ test('should handle chunk download with retry on failure', async (t) => {
|
|
|
64
64
|
let failedOnce = false;
|
|
65
65
|
const server = createServer((req, res) => {
|
|
66
66
|
requestCount++;
|
|
67
|
+
// Handle HEAD requests
|
|
68
|
+
if (req.method === 'HEAD') {
|
|
69
|
+
res.writeHead(200, {
|
|
70
|
+
'Accept-Ranges': 'bytes',
|
|
71
|
+
'Content-Length': FILE_SIZE,
|
|
72
|
+
'Content-Type': 'application/octet-stream',
|
|
73
|
+
});
|
|
74
|
+
res.end();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
67
77
|
const rangeHeader = req.headers.range;
|
|
68
78
|
// Fail the first chunk request to test retry
|
|
69
79
|
if (rangeHeader && !failedOnce) {
|
|
@@ -99,19 +109,11 @@ test('should handle chunk download with retry on failure', async (t) => {
|
|
|
99
109
|
});
|
|
100
110
|
const url = `http://127.0.0.1:${port}/retry-file`;
|
|
101
111
|
try {
|
|
102
|
-
const originalChunkSize = process.env['FILEBOX_HTTP_CHUNK_SIZE'];
|
|
103
|
-
process.env['FILEBOX_HTTP_CHUNK_SIZE'] = String(300 * 1024); // 300KB chunks
|
|
104
112
|
const stream = await httpStream(url);
|
|
105
113
|
const buffer = await streamToBuffer(stream);
|
|
106
114
|
t.equal(buffer.length, FILE_SIZE, 'should complete download despite retry');
|
|
107
115
|
t.ok(buffer.every(byte => byte === 89), 'should have correct content (all Y)');
|
|
108
116
|
t.ok(requestCount > 2, 'should have made retry requests');
|
|
109
|
-
if (originalChunkSize) {
|
|
110
|
-
process.env['FILEBOX_HTTP_CHUNK_SIZE'] = originalChunkSize;
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
delete process.env['FILEBOX_HTTP_CHUNK_SIZE'];
|
|
114
|
-
}
|
|
115
117
|
}
|
|
116
118
|
finally {
|
|
117
119
|
server.close();
|
|
@@ -120,7 +122,16 @@ test('should handle chunk download with retry on failure', async (t) => {
|
|
|
120
122
|
test('should handle server without range support', async (t) => {
|
|
121
123
|
const FILE_SIZE = 700 * 1024; // 700KB
|
|
122
124
|
const fileContent = Buffer.alloc(FILE_SIZE, 'Z');
|
|
123
|
-
const server = createServer((
|
|
125
|
+
const server = createServer((req, res) => {
|
|
126
|
+
// Handle HEAD requests
|
|
127
|
+
if (req.method === 'HEAD') {
|
|
128
|
+
res.writeHead(200, {
|
|
129
|
+
'Content-Length': FILE_SIZE,
|
|
130
|
+
'Content-Type': 'application/octet-stream',
|
|
131
|
+
});
|
|
132
|
+
res.end();
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
124
135
|
// Server doesn't support ranges
|
|
125
136
|
res.writeHead(200, {
|
|
126
137
|
'Content-Length': FILE_SIZE,
|
|
@@ -149,6 +160,16 @@ test('should handle partial content with interrupted download', async (t) => {
|
|
|
149
160
|
const fileContent = Buffer.alloc(FILE_SIZE, 'W');
|
|
150
161
|
let chunkRequestCount = 0;
|
|
151
162
|
const server = createServer((req, res) => {
|
|
163
|
+
// Handle HEAD requests
|
|
164
|
+
if (req.method === 'HEAD') {
|
|
165
|
+
res.writeHead(200, {
|
|
166
|
+
'Accept-Ranges': 'bytes',
|
|
167
|
+
'Content-Length': FILE_SIZE,
|
|
168
|
+
'Content-Type': 'application/octet-stream',
|
|
169
|
+
});
|
|
170
|
+
res.end();
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
152
173
|
const rangeHeader = req.headers.range;
|
|
153
174
|
if (rangeHeader) {
|
|
154
175
|
chunkRequestCount++;
|
|
@@ -186,18 +207,10 @@ test('should handle partial content with interrupted download', async (t) => {
|
|
|
186
207
|
});
|
|
187
208
|
const url = `http://127.0.0.1:${port}/interrupted-file`;
|
|
188
209
|
try {
|
|
189
|
-
const originalChunkSize = process.env['FILEBOX_HTTP_CHUNK_SIZE'];
|
|
190
|
-
process.env['FILEBOX_HTTP_CHUNK_SIZE'] = String(400 * 1024);
|
|
191
210
|
const stream = await httpStream(url);
|
|
192
211
|
const buffer = await streamToBuffer(stream);
|
|
193
212
|
t.equal(buffer.length, FILE_SIZE, 'should recover from interruption');
|
|
194
213
|
t.ok(chunkRequestCount >= 2, 'should have retried after interruption');
|
|
195
|
-
if (originalChunkSize) {
|
|
196
|
-
process.env['FILEBOX_HTTP_CHUNK_SIZE'] = originalChunkSize;
|
|
197
|
-
}
|
|
198
|
-
else {
|
|
199
|
-
delete process.env['FILEBOX_HTTP_CHUNK_SIZE'];
|
|
200
|
-
}
|
|
201
214
|
}
|
|
202
215
|
finally {
|
|
203
216
|
server.close();
|
|
@@ -207,6 +220,16 @@ test('should handle Content-Range parsing errors gracefully', async (t) => {
|
|
|
207
220
|
const FILE_SIZE = 100 * 1024;
|
|
208
221
|
const fileContent = Buffer.alloc(FILE_SIZE, 'T');
|
|
209
222
|
const server = createServer((req, res) => {
|
|
223
|
+
// Handle HEAD requests
|
|
224
|
+
if (req.method === 'HEAD') {
|
|
225
|
+
res.writeHead(200, {
|
|
226
|
+
'Accept-Ranges': 'bytes',
|
|
227
|
+
'Content-Length': FILE_SIZE,
|
|
228
|
+
'Content-Type': 'application/octet-stream',
|
|
229
|
+
});
|
|
230
|
+
res.end();
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
210
233
|
const rangeHeader = req.headers.range;
|
|
211
234
|
if (rangeHeader) {
|
|
212
235
|
const parts = rangeHeader.replace(/bytes=/, '').split('-');
|
|
@@ -235,18 +258,10 @@ test('should handle Content-Range parsing errors gracefully', async (t) => {
|
|
|
235
258
|
});
|
|
236
259
|
const url = `http://127.0.0.1:${port}/invalid-range-file`;
|
|
237
260
|
try {
|
|
238
|
-
const originalChunkSize = process.env['FILEBOX_HTTP_CHUNK_SIZE'];
|
|
239
|
-
process.env['FILEBOX_HTTP_CHUNK_SIZE'] = String(50 * 1024);
|
|
240
261
|
const stream = await httpStream(url);
|
|
241
262
|
const buffer = await streamToBuffer(stream);
|
|
242
263
|
// Should still work despite invalid Content-Range
|
|
243
264
|
t.equal(buffer.length, FILE_SIZE, 'should handle invalid Content-Range');
|
|
244
|
-
if (originalChunkSize) {
|
|
245
|
-
process.env['FILEBOX_HTTP_CHUNK_SIZE'] = originalChunkSize;
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
delete process.env['FILEBOX_HTTP_CHUNK_SIZE'];
|
|
249
|
-
}
|
|
250
265
|
}
|
|
251
266
|
finally {
|
|
252
267
|
server.close();
|
|
@@ -257,6 +272,15 @@ test('should disable chunk download with NO_SLICE_DOWN env', async (t) => {
|
|
|
257
272
|
const fileContent = Buffer.alloc(FILE_SIZE, 'N');
|
|
258
273
|
let rangeRequested = false;
|
|
259
274
|
const server = createServer((req, res) => {
|
|
275
|
+
// Handle HEAD requests
|
|
276
|
+
if (req.method === 'HEAD') {
|
|
277
|
+
res.writeHead(200, {
|
|
278
|
+
'Accept-Ranges': 'bytes',
|
|
279
|
+
'Content-Length': FILE_SIZE,
|
|
280
|
+
});
|
|
281
|
+
res.end();
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
260
284
|
if (req.headers.range) {
|
|
261
285
|
rangeRequested = true;
|
|
262
286
|
}
|
|
@@ -273,9 +297,7 @@ test('should disable chunk download with NO_SLICE_DOWN env', async (t) => {
|
|
|
273
297
|
const url = `http://127.0.0.1:${port}/no-slice-file`;
|
|
274
298
|
try {
|
|
275
299
|
const originalNoSlice = process.env['FILEBOX_NO_SLICE_DOWN'];
|
|
276
|
-
const originalChunkSize = process.env['FILEBOX_HTTP_CHUNK_SIZE'];
|
|
277
300
|
process.env['FILEBOX_NO_SLICE_DOWN'] = 'true';
|
|
278
|
-
process.env['FILEBOX_HTTP_CHUNK_SIZE'] = String(300 * 1024);
|
|
279
301
|
const stream = await httpStream(url);
|
|
280
302
|
const buffer = await streamToBuffer(stream);
|
|
281
303
|
t.equal(buffer.length, FILE_SIZE, 'should download complete file');
|
|
@@ -286,12 +308,6 @@ test('should disable chunk download with NO_SLICE_DOWN env', async (t) => {
|
|
|
286
308
|
else {
|
|
287
309
|
delete process.env['FILEBOX_NO_SLICE_DOWN'];
|
|
288
310
|
}
|
|
289
|
-
if (originalChunkSize) {
|
|
290
|
-
process.env['FILEBOX_HTTP_CHUNK_SIZE'] = originalChunkSize;
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
293
|
-
delete process.env['FILEBOX_HTTP_CHUNK_SIZE'];
|
|
294
|
-
}
|
|
295
311
|
}
|
|
296
312
|
finally {
|
|
297
313
|
server.close();
|