@juzi/file-box 1.7.19 → 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.
Files changed (64) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/src/config.d.ts +0 -1
  3. package/dist/cjs/src/config.d.ts.map +1 -1
  4. package/dist/cjs/src/config.js +1 -3
  5. package/dist/cjs/src/config.js.map +1 -1
  6. package/dist/cjs/src/file-box.d.ts.map +1 -1
  7. package/dist/cjs/src/file-box.js +2 -2
  8. package/dist/cjs/src/file-box.js.map +1 -1
  9. package/dist/cjs/src/file-box.spec.d.ts.map +1 -1
  10. package/dist/cjs/src/file-box.spec.js +26 -2
  11. package/dist/cjs/src/file-box.spec.js.map +1 -1
  12. package/dist/cjs/src/misc.d.ts.map +1 -1
  13. package/dist/cjs/src/misc.js +254 -50
  14. package/dist/cjs/src/misc.js.map +1 -1
  15. package/dist/cjs/src/misc.spec.js +105 -15
  16. package/dist/cjs/src/misc.spec.js.map +1 -1
  17. package/dist/cjs/src/version.d.ts.map +1 -1
  18. package/dist/cjs/src/version.js +1 -1
  19. package/dist/cjs/src/version.js.map +1 -1
  20. package/dist/cjs/tests/chunk-download.spec.d.ts +3 -0
  21. package/dist/cjs/tests/chunk-download.spec.d.ts.map +1 -0
  22. package/dist/cjs/tests/chunk-download.spec.js +318 -0
  23. package/dist/cjs/tests/chunk-download.spec.js.map +1 -0
  24. package/dist/cjs/tests/misc-error-handling.spec.d.ts +3 -0
  25. package/dist/cjs/tests/misc-error-handling.spec.d.ts.map +1 -0
  26. package/dist/cjs/tests/misc-error-handling.spec.js +352 -0
  27. package/dist/cjs/tests/misc-error-handling.spec.js.map +1 -0
  28. package/dist/cjs/tests/network-timeout.spec.js +15 -2
  29. package/dist/cjs/tests/network-timeout.spec.js.map +1 -1
  30. package/dist/esm/src/config.d.ts +0 -1
  31. package/dist/esm/src/config.d.ts.map +1 -1
  32. package/dist/esm/src/config.js +0 -2
  33. package/dist/esm/src/config.js.map +1 -1
  34. package/dist/esm/src/file-box.d.ts.map +1 -1
  35. package/dist/esm/src/file-box.js +2 -2
  36. package/dist/esm/src/file-box.js.map +1 -1
  37. package/dist/esm/src/file-box.spec.d.ts.map +1 -1
  38. package/dist/esm/src/file-box.spec.js +27 -3
  39. package/dist/esm/src/file-box.spec.js.map +1 -1
  40. package/dist/esm/src/misc.d.ts.map +1 -1
  41. package/dist/esm/src/misc.js +256 -52
  42. package/dist/esm/src/misc.js.map +1 -1
  43. package/dist/esm/src/misc.spec.js +105 -15
  44. package/dist/esm/src/misc.spec.js.map +1 -1
  45. package/dist/esm/src/version.d.ts.map +1 -1
  46. package/dist/esm/src/version.js +1 -1
  47. package/dist/esm/src/version.js.map +1 -1
  48. package/dist/esm/tests/chunk-download.spec.d.ts +3 -0
  49. package/dist/esm/tests/chunk-download.spec.d.ts.map +1 -0
  50. package/dist/esm/tests/chunk-download.spec.js +316 -0
  51. package/dist/esm/tests/chunk-download.spec.js.map +1 -0
  52. package/dist/esm/tests/misc-error-handling.spec.d.ts +3 -0
  53. package/dist/esm/tests/misc-error-handling.spec.d.ts.map +1 -0
  54. package/dist/esm/tests/misc-error-handling.spec.js +350 -0
  55. package/dist/esm/tests/misc-error-handling.spec.js.map +1 -0
  56. package/dist/esm/tests/network-timeout.spec.js +15 -2
  57. package/dist/esm/tests/network-timeout.spec.js.map +1 -1
  58. package/package.json +11 -4
  59. package/src/config.ts +0 -3
  60. package/src/file-box.spec.ts +34 -7
  61. package/src/file-box.ts +5 -5
  62. package/src/misc.spec.ts +120 -18
  63. package/src/misc.ts +242 -57
  64. package/src/version.ts +1 -1
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env -S node --no-warnings --loader ts-node/esm
2
2
  // tslint:disable:no-shadowed-variable
3
+ import { createServer } from 'http';
3
4
  import { test } from 'tstest';
4
5
  import { dataUrlToBase64, httpHeaderToFileName, httpHeadHeader, httpStream, streamToBuffer, } from './misc.js';
5
6
  test('dataUrl to base64', async (t) => {
@@ -16,11 +17,36 @@ test('dataUrl to base64', async (t) => {
16
17
  t.equal(base64, dataUrlToBase64(dataUrl), 'should get base64 from dataUrl');
17
18
  });
18
19
  test('httpHeadHeader', async (t) => {
19
- const URL = 'https://github.com/huan/file-box/archive/v0.6.tar.gz';
20
- const EXPECTED_HEADERS_KEY = 'content-disposition';
21
- const EXPECTED_HEADERS_VALUE = 'attachment; filename=file-box-0.6.tar.gz';
22
- const headers = await httpHeadHeader(URL);
23
- t.equal(headers[EXPECTED_HEADERS_KEY], EXPECTED_HEADERS_VALUE, 'should get the headers right');
20
+ /**
21
+ * 使用本地 server,避免依赖外网(CI/本地网络不稳定会导致 flaky)
22
+ * 同时覆盖:302 Location 为相对路径的跳转逻辑
23
+ */
24
+ const server = createServer((req, res) => {
25
+ if (req.url === '/redirect') {
26
+ res.writeHead(302, { Location: '/final' });
27
+ res.end();
28
+ return;
29
+ }
30
+ if (req.url === '/final') {
31
+ res.writeHead(200, {
32
+ 'Content-Disposition': 'attachment; filename=file-box-0.6.tar.gz',
33
+ 'Content-Length': '0',
34
+ });
35
+ res.end();
36
+ return;
37
+ }
38
+ res.writeHead(404);
39
+ res.end();
40
+ });
41
+ const host = await new Promise((resolve) => {
42
+ server.listen(0, '127.0.0.1', () => {
43
+ const addr = server.address();
44
+ resolve(`http://127.0.0.1:${addr.port}`);
45
+ });
46
+ });
47
+ t.teardown(() => { server.close(); });
48
+ const headers = await httpHeadHeader(`${host}/redirect`);
49
+ t.equal(headers['content-disposition'], 'attachment; filename=file-box-0.6.tar.gz', 'should get the headers right');
24
50
  });
25
51
  test('httpHeaderToFileName', async (t) => {
26
52
  const HEADERS_QUOTATION_MARK = {
@@ -36,23 +62,87 @@ test('httpHeaderToFileName', async (t) => {
36
62
  t.equal(filename, EXPECTED_FILE_NAME, 'should get filename with no quotation mark');
37
63
  });
38
64
  test('httpStream', async (t) => {
39
- const URL = 'https://httpbin.org/headers';
65
+ const server = createServer((req, res) => {
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);
81
+ });
82
+ const host = await new Promise((resolve) => {
83
+ server.listen(0, '127.0.0.1', () => {
84
+ const addr = server.address();
85
+ resolve(`http://127.0.0.1:${addr.port}`);
86
+ });
87
+ });
88
+ t.teardown(() => { server.close(); });
40
89
  const MOL_KEY = 'Mol';
41
90
  const MOL_VAL = '42';
42
91
  const headers = {};
43
92
  headers[MOL_KEY] = MOL_VAL;
44
- const res = await httpStream(URL, headers);
93
+ const res = await httpStream(`${host}/headers`, headers);
45
94
  const buffer = await streamToBuffer(res);
46
95
  const obj = JSON.parse(buffer.toString());
47
- t.equal(obj.headers[MOL_KEY], MOL_VAL, 'should send the header right');
96
+ // Node 会把 header name 规范成小写
97
+ t.equal(obj.headers[MOL_KEY.toLowerCase()], MOL_VAL, 'should send the header right');
48
98
  });
49
99
  test('httpStream in chunks', async (t) => {
50
- const URL = 'https://media.w3.org/2010/05/sintel/trailer.mp4';
51
- const res = await httpStream(URL);
52
- let length = 0;
53
- for await (const chunk of res) {
54
- length += chunk.length;
55
- }
56
- t.equal(length, 4372373, 'should get data in chunks right');
100
+ const FILE_SIZE = 1024 * 1024 + 123; // > 默认 chunk size 触发分片逻辑
101
+ const content = Buffer.alloc(FILE_SIZE, 'A');
102
+ const server = createServer((req, res) => {
103
+ // HEAD:让 httpStream 判断是否支持 range + content-length
104
+ if (req.method === 'HEAD') {
105
+ res.writeHead(200, {
106
+ 'Accept-Ranges': 'bytes',
107
+ 'Content-Length': String(FILE_SIZE),
108
+ });
109
+ res.end();
110
+ return;
111
+ }
112
+ const range = req.headers.range;
113
+ if (range) {
114
+ const m = String(range).match(/bytes=(\d+)-(\d*)/);
115
+ if (!m) {
116
+ res.writeHead(416);
117
+ res.end();
118
+ return;
119
+ }
120
+ const start = Number(m[1]);
121
+ const end = m[2] ? Number(m[2]) : FILE_SIZE - 1;
122
+ const chunk = content.subarray(start, end + 1);
123
+ res.writeHead(206, {
124
+ 'Accept-Ranges': 'bytes',
125
+ 'Content-Length': String(chunk.length),
126
+ 'Content-Range': `bytes ${start}-${end}/${FILE_SIZE}`,
127
+ });
128
+ res.end(chunk);
129
+ return;
130
+ }
131
+ res.writeHead(200, {
132
+ 'Accept-Ranges': 'bytes',
133
+ 'Content-Length': String(FILE_SIZE),
134
+ });
135
+ res.end(content);
136
+ });
137
+ const host = await new Promise((resolve) => {
138
+ server.listen(0, '127.0.0.1', () => {
139
+ const addr = server.address();
140
+ resolve(`http://127.0.0.1:${addr.port}`);
141
+ });
142
+ });
143
+ t.teardown(() => { server.close(); });
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');
57
147
  });
58
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,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,MAAM,GAAG,GAAG,sDAAsD,CAAA;IAElE,MAAM,oBAAoB,GAAK,qBAAqB,CAAA;IACpD,MAAM,sBAAsB,GAAG,0CAA0C,CAAA;IAEzE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAA;IAEzC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,sBAAsB,EAAE,8BAA8B,CAAC,CAAA;AAChG,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,GAAG,GAAG,6BAA6B,CAAA;IAEzC,MAAM,OAAO,GAAG,KAAK,CAAA;IACrB,MAAM,OAAO,GAAG,IAAI,CAAA;IAEpB,MAAM,OAAO,GAAG,EAA+B,CAAA;IAC/C,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;IAE1B,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAE1C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IACzC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,8BAA8B,CAAC,CAAA;AACxE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACvC,MAAM,GAAG,GAAG,iDAAiD,CAAA;IAC7D,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;IACjC,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,EAAE;QAC7B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAA;KACvB;IACD,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,iCAAiC,CAAC,CAAA;AAC7D,CAAC,CAAC,CAAA"}
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,MAAiB,CAAA"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,MAAgB,CAAA"}
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * This file was auto generated from scripts/generate-version.sh
3
3
  */
4
- export const VERSION = '1.7.19';
4
+ export const VERSION = '1.8.0';
5
5
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAW,QAAQ,CAAA"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAW,OAAO,CAAA"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env -S node --no-warnings --loader ts-node/esm
2
+ export {};
3
+ //# sourceMappingURL=chunk-download.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-download.spec.d.ts","sourceRoot":"","sources":["../../../tests/chunk-download.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,316 @@
1
+ #!/usr/bin/env -S node --no-warnings --loader ts-node/esm
2
+ import { createServer } from 'http';
3
+ import 'timers/promises';
4
+ import { test } from 'tstest';
5
+ import { httpStream, streamToBuffer } from '../src/misc.js';
6
+ test('should download file in chunks with range support', async (t) => {
7
+ const FILE_SIZE = 1024 * 1024; // 1MB
8
+ const fileContent = Buffer.alloc(FILE_SIZE, 'X');
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
+ }
20
+ const rangeHeader = req.headers.range;
21
+ if (rangeHeader) {
22
+ // Parse range header
23
+ const parts = rangeHeader.replace(/bytes=/, '').split('-');
24
+ const start = parseInt(parts[0], 10);
25
+ const end = parts[1] ? parseInt(parts[1], 10) : FILE_SIZE - 1;
26
+ const chunkSize = end - start + 1;
27
+ res.writeHead(206, {
28
+ 'Accept-Ranges': 'bytes',
29
+ 'Content-Length': chunkSize,
30
+ 'Content-Range': `bytes ${start}-${end}/${FILE_SIZE}`,
31
+ 'Content-Type': 'application/octet-stream',
32
+ });
33
+ res.end(fileContent.slice(start, end + 1));
34
+ }
35
+ else {
36
+ // No range, send full file
37
+ res.writeHead(200, {
38
+ 'Accept-Ranges': 'bytes',
39
+ 'Content-Length': FILE_SIZE,
40
+ 'Content-Type': 'application/octet-stream',
41
+ });
42
+ res.end(fileContent);
43
+ }
44
+ });
45
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
46
+ await new Promise((resolve) => {
47
+ server.listen(port, '127.0.0.1', () => resolve());
48
+ });
49
+ const url = `http://127.0.0.1:${port}/largefile`;
50
+ try {
51
+ const stream = await httpStream(url);
52
+ const buffer = await streamToBuffer(stream);
53
+ t.equal(buffer.length, FILE_SIZE, 'should download complete file');
54
+ t.ok(buffer.every(byte => byte === 88), 'should have correct content (all X)');
55
+ }
56
+ finally {
57
+ server.close();
58
+ }
59
+ });
60
+ test('should handle chunk download with retry on failure', async (t) => {
61
+ const FILE_SIZE = 600 * 1024; // 600KB
62
+ const fileContent = Buffer.alloc(FILE_SIZE, 'Y');
63
+ let requestCount = 0;
64
+ let failedOnce = false;
65
+ const server = createServer((req, res) => {
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
+ }
77
+ const rangeHeader = req.headers.range;
78
+ // Fail the first chunk request to test retry
79
+ if (rangeHeader && !failedOnce) {
80
+ failedOnce = true;
81
+ res.destroy(); // Simulate connection abort
82
+ return;
83
+ }
84
+ if (rangeHeader) {
85
+ const parts = rangeHeader.replace(/bytes=/, '').split('-');
86
+ const start = parseInt(parts[0], 10);
87
+ const end = parts[1] ? parseInt(parts[1], 10) : FILE_SIZE - 1;
88
+ const chunkSize = end - start + 1;
89
+ res.writeHead(206, {
90
+ 'Accept-Ranges': 'bytes',
91
+ 'Content-Length': chunkSize,
92
+ 'Content-Range': `bytes ${start}-${end}/${FILE_SIZE}`,
93
+ 'Content-Type': 'application/octet-stream',
94
+ });
95
+ res.end(fileContent.slice(start, end + 1));
96
+ }
97
+ else {
98
+ res.writeHead(200, {
99
+ 'Accept-Ranges': 'bytes',
100
+ 'Content-Length': FILE_SIZE,
101
+ 'Content-Type': 'application/octet-stream',
102
+ });
103
+ res.end(fileContent);
104
+ }
105
+ });
106
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
107
+ await new Promise((resolve) => {
108
+ server.listen(port, '127.0.0.1', () => resolve());
109
+ });
110
+ const url = `http://127.0.0.1:${port}/retry-file`;
111
+ try {
112
+ const stream = await httpStream(url);
113
+ const buffer = await streamToBuffer(stream);
114
+ t.equal(buffer.length, FILE_SIZE, 'should complete download despite retry');
115
+ t.ok(buffer.every(byte => byte === 89), 'should have correct content (all Y)');
116
+ t.ok(requestCount > 2, 'should have made retry requests');
117
+ }
118
+ finally {
119
+ server.close();
120
+ }
121
+ });
122
+ test('should handle server without range support', async (t) => {
123
+ const FILE_SIZE = 700 * 1024; // 700KB
124
+ const fileContent = Buffer.alloc(FILE_SIZE, 'Z');
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
+ }
135
+ // Server doesn't support ranges
136
+ res.writeHead(200, {
137
+ 'Content-Length': FILE_SIZE,
138
+ 'Content-Type': 'application/octet-stream',
139
+ // No Accept-Ranges header
140
+ });
141
+ res.end(fileContent);
142
+ });
143
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
144
+ await new Promise((resolve) => {
145
+ server.listen(port, '127.0.0.1', () => resolve());
146
+ });
147
+ const url = `http://127.0.0.1:${port}/no-range-file`;
148
+ try {
149
+ const stream = await httpStream(url);
150
+ const buffer = await streamToBuffer(stream);
151
+ t.equal(buffer.length, FILE_SIZE, 'should download via non-chunked method');
152
+ t.ok(buffer.every(byte => byte === 90), 'should have correct content (all Z)');
153
+ }
154
+ finally {
155
+ server.close();
156
+ }
157
+ });
158
+ test('should handle partial content with interrupted download', async (t) => {
159
+ const FILE_SIZE = 800 * 1024;
160
+ const fileContent = Buffer.alloc(FILE_SIZE, 'W');
161
+ let chunkRequestCount = 0;
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
+ }
173
+ const rangeHeader = req.headers.range;
174
+ if (rangeHeader) {
175
+ chunkRequestCount++;
176
+ const parts = rangeHeader.replace(/bytes=/, '').split('-');
177
+ const start = parseInt(parts[0], 10);
178
+ const end = parts[1] ? parseInt(parts[1], 10) : FILE_SIZE - 1;
179
+ const chunkSize = end - start + 1;
180
+ res.writeHead(206, {
181
+ 'Accept-Ranges': 'bytes',
182
+ 'Content-Length': chunkSize,
183
+ 'Content-Range': `bytes ${start}-${end}/${FILE_SIZE}`,
184
+ 'Content-Type': 'application/octet-stream',
185
+ });
186
+ // Send partial data then close for first chunk
187
+ if (chunkRequestCount === 1) {
188
+ const partial = fileContent.slice(start, start + Math.floor(chunkSize / 2));
189
+ res.write(partial);
190
+ setTimeout(() => res.destroy(), 50);
191
+ }
192
+ else {
193
+ res.end(fileContent.slice(start, end + 1));
194
+ }
195
+ }
196
+ else {
197
+ res.writeHead(200, {
198
+ 'Accept-Ranges': 'bytes',
199
+ 'Content-Length': FILE_SIZE,
200
+ });
201
+ res.end(fileContent);
202
+ }
203
+ });
204
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
205
+ await new Promise((resolve) => {
206
+ server.listen(port, '127.0.0.1', () => resolve());
207
+ });
208
+ const url = `http://127.0.0.1:${port}/interrupted-file`;
209
+ try {
210
+ const stream = await httpStream(url);
211
+ const buffer = await streamToBuffer(stream);
212
+ t.equal(buffer.length, FILE_SIZE, 'should recover from interruption');
213
+ t.ok(chunkRequestCount >= 2, 'should have retried after interruption');
214
+ }
215
+ finally {
216
+ server.close();
217
+ }
218
+ });
219
+ test('should handle Content-Range parsing errors gracefully', async (t) => {
220
+ const FILE_SIZE = 100 * 1024;
221
+ const fileContent = Buffer.alloc(FILE_SIZE, 'T');
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
+ }
233
+ const rangeHeader = req.headers.range;
234
+ if (rangeHeader) {
235
+ const parts = rangeHeader.replace(/bytes=/, '').split('-');
236
+ const start = parseInt(parts[0], 10);
237
+ const end = parts[1] ? parseInt(parts[1], 10) : FILE_SIZE - 1;
238
+ const chunkSize = end - start + 1;
239
+ res.writeHead(206, {
240
+ 'Accept-Ranges': 'bytes',
241
+ 'Content-Length': chunkSize,
242
+ // Invalid Content-Range format
243
+ 'Content-Range': 'invalid format',
244
+ });
245
+ res.end(fileContent.slice(start, end + 1));
246
+ }
247
+ else {
248
+ res.writeHead(200, {
249
+ 'Accept-Ranges': 'bytes',
250
+ 'Content-Length': FILE_SIZE,
251
+ });
252
+ res.end(fileContent);
253
+ }
254
+ });
255
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
256
+ await new Promise((resolve) => {
257
+ server.listen(port, '127.0.0.1', () => resolve());
258
+ });
259
+ const url = `http://127.0.0.1:${port}/invalid-range-file`;
260
+ try {
261
+ const stream = await httpStream(url);
262
+ const buffer = await streamToBuffer(stream);
263
+ // Should still work despite invalid Content-Range
264
+ t.equal(buffer.length, FILE_SIZE, 'should handle invalid Content-Range');
265
+ }
266
+ finally {
267
+ server.close();
268
+ }
269
+ });
270
+ test('should disable chunk download with NO_SLICE_DOWN env', async (t) => {
271
+ const FILE_SIZE = 900 * 1024;
272
+ const fileContent = Buffer.alloc(FILE_SIZE, 'N');
273
+ let rangeRequested = false;
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
+ }
284
+ if (req.headers.range) {
285
+ rangeRequested = true;
286
+ }
287
+ res.writeHead(200, {
288
+ 'Accept-Ranges': 'bytes',
289
+ 'Content-Length': FILE_SIZE,
290
+ });
291
+ res.end(fileContent);
292
+ });
293
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
294
+ await new Promise((resolve) => {
295
+ server.listen(port, '127.0.0.1', () => resolve());
296
+ });
297
+ const url = `http://127.0.0.1:${port}/no-slice-file`;
298
+ try {
299
+ const originalNoSlice = process.env['FILEBOX_NO_SLICE_DOWN'];
300
+ process.env['FILEBOX_NO_SLICE_DOWN'] = 'true';
301
+ const stream = await httpStream(url);
302
+ const buffer = await streamToBuffer(stream);
303
+ t.equal(buffer.length, FILE_SIZE, 'should download complete file');
304
+ t.notOk(rangeRequested, 'should not use range requests when disabled');
305
+ if (originalNoSlice) {
306
+ process.env['FILEBOX_NO_SLICE_DOWN'] = originalNoSlice;
307
+ }
308
+ else {
309
+ delete process.env['FILEBOX_NO_SLICE_DOWN'];
310
+ }
311
+ }
312
+ finally {
313
+ server.close();
314
+ }
315
+ });
316
+ //# sourceMappingURL=chunk-download.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-download.spec.js","sourceRoot":"","sources":["../../../tests/chunk-download.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env -S node --no-warnings --loader ts-node/esm
2
+ export {};
3
+ //# sourceMappingURL=misc-error-handling.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"misc-error-handling.spec.d.ts","sourceRoot":"","sources":["../../../tests/misc-error-handling.spec.ts"],"names":[],"mappings":""}