@juzi/file-box 1.7.19 → 1.7.20

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 (46) hide show
  1. package/dist/cjs/src/file-box.d.ts.map +1 -1
  2. package/dist/cjs/src/file-box.js +2 -2
  3. package/dist/cjs/src/file-box.js.map +1 -1
  4. package/dist/cjs/src/file-box.spec.d.ts.map +1 -1
  5. package/dist/cjs/src/file-box.spec.js +26 -2
  6. package/dist/cjs/src/file-box.spec.js.map +1 -1
  7. package/dist/cjs/src/misc.d.ts.map +1 -1
  8. package/dist/cjs/src/misc.js +126 -27
  9. package/dist/cjs/src/misc.js.map +1 -1
  10. package/dist/cjs/src/misc.spec.js +101 -14
  11. package/dist/cjs/src/misc.spec.js.map +1 -1
  12. package/dist/cjs/src/version.js +1 -1
  13. package/dist/cjs/tests/chunk-download.spec.d.ts +3 -0
  14. package/dist/cjs/tests/chunk-download.spec.d.ts.map +1 -0
  15. package/dist/cjs/tests/chunk-download.spec.js +302 -0
  16. package/dist/cjs/tests/chunk-download.spec.js.map +1 -0
  17. package/dist/cjs/tests/misc-error-handling.spec.d.ts +3 -0
  18. package/dist/cjs/tests/misc-error-handling.spec.d.ts.map +1 -0
  19. package/dist/cjs/tests/misc-error-handling.spec.js +258 -0
  20. package/dist/cjs/tests/misc-error-handling.spec.js.map +1 -0
  21. package/dist/esm/src/file-box.d.ts.map +1 -1
  22. package/dist/esm/src/file-box.js +2 -2
  23. package/dist/esm/src/file-box.js.map +1 -1
  24. package/dist/esm/src/file-box.spec.d.ts.map +1 -1
  25. package/dist/esm/src/file-box.spec.js +27 -3
  26. package/dist/esm/src/file-box.spec.js.map +1 -1
  27. package/dist/esm/src/misc.d.ts.map +1 -1
  28. package/dist/esm/src/misc.js +127 -28
  29. package/dist/esm/src/misc.js.map +1 -1
  30. package/dist/esm/src/misc.spec.js +101 -14
  31. package/dist/esm/src/misc.spec.js.map +1 -1
  32. package/dist/esm/src/version.js +1 -1
  33. package/dist/esm/tests/chunk-download.spec.d.ts +3 -0
  34. package/dist/esm/tests/chunk-download.spec.d.ts.map +1 -0
  35. package/dist/esm/tests/chunk-download.spec.js +300 -0
  36. package/dist/esm/tests/chunk-download.spec.js.map +1 -0
  37. package/dist/esm/tests/misc-error-handling.spec.d.ts +3 -0
  38. package/dist/esm/tests/misc-error-handling.spec.d.ts.map +1 -0
  39. package/dist/esm/tests/misc-error-handling.spec.js +256 -0
  40. package/dist/esm/tests/misc-error-handling.spec.js.map +1 -0
  41. package/package.json +10 -3
  42. package/src/file-box.spec.ts +34 -7
  43. package/src/file-box.ts +5 -5
  44. package/src/misc.spec.ts +111 -17
  45. package/src/misc.ts +110 -31
  46. package/src/version.ts +1 -1
@@ -0,0 +1,300 @@
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
+ const rangeHeader = req.headers.range;
11
+ if (rangeHeader) {
12
+ // Parse range header
13
+ const parts = rangeHeader.replace(/bytes=/, '').split('-');
14
+ const start = parseInt(parts[0], 10);
15
+ const end = parts[1] ? parseInt(parts[1], 10) : FILE_SIZE - 1;
16
+ const chunkSize = end - start + 1;
17
+ res.writeHead(206, {
18
+ 'Accept-Ranges': 'bytes',
19
+ 'Content-Length': chunkSize,
20
+ 'Content-Range': `bytes ${start}-${end}/${FILE_SIZE}`,
21
+ 'Content-Type': 'application/octet-stream',
22
+ });
23
+ res.end(fileContent.slice(start, end + 1));
24
+ }
25
+ else {
26
+ // No range, send full file
27
+ res.writeHead(200, {
28
+ 'Accept-Ranges': 'bytes',
29
+ 'Content-Length': FILE_SIZE,
30
+ 'Content-Type': 'application/octet-stream',
31
+ });
32
+ res.end(fileContent);
33
+ }
34
+ });
35
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
36
+ await new Promise((resolve) => {
37
+ server.listen(port, '127.0.0.1', () => resolve());
38
+ });
39
+ const url = `http://127.0.0.1:${port}/largefile`;
40
+ 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
+ const stream = await httpStream(url);
45
+ const buffer = await streamToBuffer(stream);
46
+ t.equal(buffer.length, FILE_SIZE, 'should download complete file');
47
+ 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
+ }
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
+ const rangeHeader = req.headers.range;
68
+ // Fail the first chunk request to test retry
69
+ if (rangeHeader && !failedOnce) {
70
+ failedOnce = true;
71
+ res.destroy(); // Simulate connection abort
72
+ return;
73
+ }
74
+ if (rangeHeader) {
75
+ const parts = rangeHeader.replace(/bytes=/, '').split('-');
76
+ const start = parseInt(parts[0], 10);
77
+ const end = parts[1] ? parseInt(parts[1], 10) : FILE_SIZE - 1;
78
+ const chunkSize = end - start + 1;
79
+ res.writeHead(206, {
80
+ 'Accept-Ranges': 'bytes',
81
+ 'Content-Length': chunkSize,
82
+ 'Content-Range': `bytes ${start}-${end}/${FILE_SIZE}`,
83
+ 'Content-Type': 'application/octet-stream',
84
+ });
85
+ res.end(fileContent.slice(start, end + 1));
86
+ }
87
+ else {
88
+ res.writeHead(200, {
89
+ 'Accept-Ranges': 'bytes',
90
+ 'Content-Length': FILE_SIZE,
91
+ 'Content-Type': 'application/octet-stream',
92
+ });
93
+ res.end(fileContent);
94
+ }
95
+ });
96
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
97
+ await new Promise((resolve) => {
98
+ server.listen(port, '127.0.0.1', () => resolve());
99
+ });
100
+ const url = `http://127.0.0.1:${port}/retry-file`;
101
+ try {
102
+ const originalChunkSize = process.env['FILEBOX_HTTP_CHUNK_SIZE'];
103
+ process.env['FILEBOX_HTTP_CHUNK_SIZE'] = String(300 * 1024); // 300KB chunks
104
+ const stream = await httpStream(url);
105
+ const buffer = await streamToBuffer(stream);
106
+ t.equal(buffer.length, FILE_SIZE, 'should complete download despite retry');
107
+ t.ok(buffer.every(byte => byte === 89), 'should have correct content (all Y)');
108
+ 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
+ }
116
+ finally {
117
+ server.close();
118
+ }
119
+ });
120
+ test('should handle server without range support', async (t) => {
121
+ const FILE_SIZE = 700 * 1024; // 700KB
122
+ const fileContent = Buffer.alloc(FILE_SIZE, 'Z');
123
+ const server = createServer((_req, res) => {
124
+ // Server doesn't support ranges
125
+ res.writeHead(200, {
126
+ 'Content-Length': FILE_SIZE,
127
+ 'Content-Type': 'application/octet-stream',
128
+ // No Accept-Ranges header
129
+ });
130
+ res.end(fileContent);
131
+ });
132
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
133
+ await new Promise((resolve) => {
134
+ server.listen(port, '127.0.0.1', () => resolve());
135
+ });
136
+ const url = `http://127.0.0.1:${port}/no-range-file`;
137
+ try {
138
+ const stream = await httpStream(url);
139
+ const buffer = await streamToBuffer(stream);
140
+ t.equal(buffer.length, FILE_SIZE, 'should download via non-chunked method');
141
+ t.ok(buffer.every(byte => byte === 90), 'should have correct content (all Z)');
142
+ }
143
+ finally {
144
+ server.close();
145
+ }
146
+ });
147
+ test('should handle partial content with interrupted download', async (t) => {
148
+ const FILE_SIZE = 800 * 1024;
149
+ const fileContent = Buffer.alloc(FILE_SIZE, 'W');
150
+ let chunkRequestCount = 0;
151
+ const server = createServer((req, res) => {
152
+ const rangeHeader = req.headers.range;
153
+ if (rangeHeader) {
154
+ chunkRequestCount++;
155
+ const parts = rangeHeader.replace(/bytes=/, '').split('-');
156
+ const start = parseInt(parts[0], 10);
157
+ const end = parts[1] ? parseInt(parts[1], 10) : FILE_SIZE - 1;
158
+ const chunkSize = end - start + 1;
159
+ res.writeHead(206, {
160
+ 'Accept-Ranges': 'bytes',
161
+ 'Content-Length': chunkSize,
162
+ 'Content-Range': `bytes ${start}-${end}/${FILE_SIZE}`,
163
+ 'Content-Type': 'application/octet-stream',
164
+ });
165
+ // Send partial data then close for first chunk
166
+ if (chunkRequestCount === 1) {
167
+ const partial = fileContent.slice(start, start + Math.floor(chunkSize / 2));
168
+ res.write(partial);
169
+ setTimeout(() => res.destroy(), 50);
170
+ }
171
+ else {
172
+ res.end(fileContent.slice(start, end + 1));
173
+ }
174
+ }
175
+ else {
176
+ res.writeHead(200, {
177
+ 'Accept-Ranges': 'bytes',
178
+ 'Content-Length': FILE_SIZE,
179
+ });
180
+ res.end(fileContent);
181
+ }
182
+ });
183
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
184
+ await new Promise((resolve) => {
185
+ server.listen(port, '127.0.0.1', () => resolve());
186
+ });
187
+ const url = `http://127.0.0.1:${port}/interrupted-file`;
188
+ try {
189
+ const originalChunkSize = process.env['FILEBOX_HTTP_CHUNK_SIZE'];
190
+ process.env['FILEBOX_HTTP_CHUNK_SIZE'] = String(400 * 1024);
191
+ const stream = await httpStream(url);
192
+ const buffer = await streamToBuffer(stream);
193
+ t.equal(buffer.length, FILE_SIZE, 'should recover from interruption');
194
+ 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
+ }
202
+ finally {
203
+ server.close();
204
+ }
205
+ });
206
+ test('should handle Content-Range parsing errors gracefully', async (t) => {
207
+ const FILE_SIZE = 100 * 1024;
208
+ const fileContent = Buffer.alloc(FILE_SIZE, 'T');
209
+ const server = createServer((req, res) => {
210
+ const rangeHeader = req.headers.range;
211
+ if (rangeHeader) {
212
+ const parts = rangeHeader.replace(/bytes=/, '').split('-');
213
+ const start = parseInt(parts[0], 10);
214
+ const end = parts[1] ? parseInt(parts[1], 10) : FILE_SIZE - 1;
215
+ const chunkSize = end - start + 1;
216
+ res.writeHead(206, {
217
+ 'Accept-Ranges': 'bytes',
218
+ 'Content-Length': chunkSize,
219
+ // Invalid Content-Range format
220
+ 'Content-Range': 'invalid format',
221
+ });
222
+ res.end(fileContent.slice(start, end + 1));
223
+ }
224
+ else {
225
+ res.writeHead(200, {
226
+ 'Accept-Ranges': 'bytes',
227
+ 'Content-Length': FILE_SIZE,
228
+ });
229
+ res.end(fileContent);
230
+ }
231
+ });
232
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
233
+ await new Promise((resolve) => {
234
+ server.listen(port, '127.0.0.1', () => resolve());
235
+ });
236
+ const url = `http://127.0.0.1:${port}/invalid-range-file`;
237
+ try {
238
+ const originalChunkSize = process.env['FILEBOX_HTTP_CHUNK_SIZE'];
239
+ process.env['FILEBOX_HTTP_CHUNK_SIZE'] = String(50 * 1024);
240
+ const stream = await httpStream(url);
241
+ const buffer = await streamToBuffer(stream);
242
+ // Should still work despite invalid Content-Range
243
+ 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
+ }
251
+ finally {
252
+ server.close();
253
+ }
254
+ });
255
+ test('should disable chunk download with NO_SLICE_DOWN env', async (t) => {
256
+ const FILE_SIZE = 900 * 1024;
257
+ const fileContent = Buffer.alloc(FILE_SIZE, 'N');
258
+ let rangeRequested = false;
259
+ const server = createServer((req, res) => {
260
+ if (req.headers.range) {
261
+ rangeRequested = true;
262
+ }
263
+ res.writeHead(200, {
264
+ 'Accept-Ranges': 'bytes',
265
+ 'Content-Length': FILE_SIZE,
266
+ });
267
+ res.end(fileContent);
268
+ });
269
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
270
+ await new Promise((resolve) => {
271
+ server.listen(port, '127.0.0.1', () => resolve());
272
+ });
273
+ const url = `http://127.0.0.1:${port}/no-slice-file`;
274
+ try {
275
+ const originalNoSlice = process.env['FILEBOX_NO_SLICE_DOWN'];
276
+ const originalChunkSize = process.env['FILEBOX_HTTP_CHUNK_SIZE'];
277
+ process.env['FILEBOX_NO_SLICE_DOWN'] = 'true';
278
+ process.env['FILEBOX_HTTP_CHUNK_SIZE'] = String(300 * 1024);
279
+ const stream = await httpStream(url);
280
+ const buffer = await streamToBuffer(stream);
281
+ t.equal(buffer.length, FILE_SIZE, 'should download complete file');
282
+ t.notOk(rangeRequested, 'should not use range requests when disabled');
283
+ if (originalNoSlice) {
284
+ process.env['FILEBOX_NO_SLICE_DOWN'] = originalNoSlice;
285
+ }
286
+ else {
287
+ delete process.env['FILEBOX_NO_SLICE_DOWN'];
288
+ }
289
+ if (originalChunkSize) {
290
+ process.env['FILEBOX_HTTP_CHUNK_SIZE'] = originalChunkSize;
291
+ }
292
+ else {
293
+ delete process.env['FILEBOX_HTTP_CHUNK_SIZE'];
294
+ }
295
+ }
296
+ finally {
297
+ server.close();
298
+ }
299
+ });
300
+ //# 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":""}
@@ -0,0 +1,256 @@
1
+ #!/usr/bin/env -S node --no-warnings --loader ts-node/esm
2
+ import { createServer } from 'http';
3
+ import { setTimeout as delay } from 'timers/promises';
4
+ import { test } from 'tstest';
5
+ import { httpStream, streamToBuffer } from '../src/misc.js';
6
+ import { FileBox } from '../src/mod.js';
7
+ test('should handle connection abort gracefully', async (t) => {
8
+ const server = createServer((_req, res) => {
9
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
10
+ res.write('Starting...');
11
+ // Simulate connection abort after short delay
12
+ setTimeout(() => {
13
+ res.destroy();
14
+ }, 100);
15
+ });
16
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
17
+ await new Promise((resolve) => {
18
+ server.listen(port, '127.0.0.1', () => resolve());
19
+ });
20
+ const url = `http://127.0.0.1:${port}/test`;
21
+ try {
22
+ // 连接可能在拿到 response 之前或之后中断:两种路径都应当最终 reject
23
+ await t.rejects(async () => {
24
+ const stream = await httpStream(url);
25
+ return await streamToBuffer(stream);
26
+ }, 'should reject on connection abort');
27
+ }
28
+ finally {
29
+ server.close();
30
+ }
31
+ });
32
+ test('should handle timeout correctly', async (t) => {
33
+ const LONG_DELAY = 70000; // Longer than HTTP_RESPONSE_TIMEOUT (60s)
34
+ const server = createServer((_req, res) => {
35
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
36
+ res.write('First chunk');
37
+ // Simulate very slow response
38
+ delay(LONG_DELAY)
39
+ .then(() => res.end('Second chunk'))
40
+ .catch(() => { });
41
+ });
42
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
43
+ await new Promise((resolve) => {
44
+ server.listen(port, '127.0.0.1', () => resolve());
45
+ });
46
+ const url = `http://127.0.0.1:${port}/slow`;
47
+ try {
48
+ const fileBox = FileBox.fromUrl(url);
49
+ const streamPromise = fileBox.toStream();
50
+ // The stream should timeout during creation/reading
51
+ await t.rejects(async () => {
52
+ const stream = await streamPromise;
53
+ return await streamToBuffer(stream);
54
+ }, 'should timeout on slow response');
55
+ }
56
+ finally {
57
+ server.close();
58
+ }
59
+ });
60
+ test('should handle successful large file download', async (t) => {
61
+ const CHUNK_SIZE = 1024;
62
+ const CHUNKS_COUNT = 100;
63
+ const TOTAL_SIZE = CHUNK_SIZE * CHUNKS_COUNT;
64
+ const server = createServer((_req, res) => {
65
+ res.writeHead(200, {
66
+ 'Content-Length': String(TOTAL_SIZE),
67
+ 'Content-Type': 'application/octet-stream',
68
+ });
69
+ let sent = 0;
70
+ const interval = setInterval(() => {
71
+ if (sent >= TOTAL_SIZE) {
72
+ clearInterval(interval);
73
+ res.end();
74
+ return;
75
+ }
76
+ const chunk = Buffer.alloc(Math.min(CHUNK_SIZE, TOTAL_SIZE - sent), 'A');
77
+ res.write(chunk);
78
+ sent += chunk.length;
79
+ }, 10);
80
+ });
81
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
82
+ await new Promise((resolve) => {
83
+ server.listen(port, '127.0.0.1', () => resolve());
84
+ });
85
+ const url = `http://127.0.0.1:${port}/largefile`;
86
+ try {
87
+ const stream = await httpStream(url);
88
+ const buffer = await streamToBuffer(stream);
89
+ t.equal(buffer.length, TOTAL_SIZE, 'should receive complete file');
90
+ t.ok(buffer.every(byte => byte === 65), 'should have correct content (all A)');
91
+ }
92
+ finally {
93
+ server.close();
94
+ }
95
+ });
96
+ test('should handle HTTP errors correctly', async (t) => {
97
+ const server = createServer((req, res) => {
98
+ if (req.url === '/404') {
99
+ res.writeHead(404);
100
+ res.end('Not Found');
101
+ }
102
+ else if (req.url === '/500') {
103
+ res.writeHead(500);
104
+ res.end('Internal Server Error');
105
+ }
106
+ });
107
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
108
+ await new Promise((resolve) => {
109
+ server.listen(port, '127.0.0.1', () => resolve());
110
+ });
111
+ try {
112
+ // Test 404
113
+ const url404 = `http://127.0.0.1:${port}/404`;
114
+ const stream404 = await httpStream(url404);
115
+ const buffer404 = await streamToBuffer(stream404);
116
+ t.ok(buffer404.length > 0, 'should handle 404 response');
117
+ // Test 500
118
+ const url500 = `http://127.0.0.1:${port}/500`;
119
+ const stream500 = await httpStream(url500);
120
+ const buffer500 = await streamToBuffer(stream500);
121
+ t.ok(buffer500.length > 0, 'should handle 500 response');
122
+ }
123
+ finally {
124
+ server.close();
125
+ }
126
+ });
127
+ test('should clear timeout after successful request', async (t) => {
128
+ const server = createServer((_req, res) => {
129
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
130
+ res.end('Success');
131
+ });
132
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
133
+ await new Promise((resolve) => {
134
+ server.listen(port, '127.0.0.1', () => resolve());
135
+ });
136
+ const url = `http://127.0.0.1:${port}/test`;
137
+ try {
138
+ const stream = await httpStream(url);
139
+ const buffer = await streamToBuffer(stream);
140
+ t.equal(buffer.toString(), 'Success', 'should complete successfully');
141
+ // Wait a bit to ensure no timeout fires
142
+ await delay(100);
143
+ t.pass('timeout was properly cleared, no error after completion');
144
+ }
145
+ finally {
146
+ server.close();
147
+ }
148
+ });
149
+ test('should handle redirects correctly', async (t) => {
150
+ const server = createServer((req, res) => {
151
+ if (req.url === '/redirect') {
152
+ res.writeHead(302, { Location: '/final' });
153
+ res.end();
154
+ }
155
+ else if (req.url === '/final') {
156
+ res.writeHead(200);
157
+ res.end('Final destination');
158
+ }
159
+ });
160
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
161
+ await new Promise((resolve) => {
162
+ server.listen(port, '127.0.0.1', () => resolve());
163
+ });
164
+ const url = `http://127.0.0.1:${port}/redirect`;
165
+ try {
166
+ const stream = await httpStream(url);
167
+ const buffer = await streamToBuffer(stream);
168
+ t.equal(buffer.toString(), 'Final destination', 'should follow redirect');
169
+ }
170
+ finally {
171
+ server.close();
172
+ }
173
+ });
174
+ test('should handle multiple concurrent requests', async (t) => {
175
+ const server = createServer((req, res) => {
176
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
177
+ res.end(`Response for ${req.url}`);
178
+ });
179
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
180
+ await new Promise((resolve) => {
181
+ server.listen(port, '127.0.0.1', () => resolve());
182
+ });
183
+ try {
184
+ const promises = Array.from({ length: 10 }, async (_, i) => {
185
+ const url = `http://127.0.0.1:${port}/test${i}`;
186
+ const stream = await httpStream(url);
187
+ const buffer = await streamToBuffer(stream);
188
+ return buffer.toString();
189
+ });
190
+ const results = await Promise.all(promises);
191
+ t.equal(results.length, 10, 'should handle all requests');
192
+ results.forEach((result, i) => {
193
+ t.equal(result, `Response for /test${i}`, `request ${i} should succeed`);
194
+ });
195
+ }
196
+ finally {
197
+ server.close();
198
+ }
199
+ });
200
+ test('should handle early stream destruction', async (t) => {
201
+ const server = createServer((_req, res) => {
202
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
203
+ res.write('Start');
204
+ // Send data slowly
205
+ let count = 0;
206
+ const interval = setInterval(() => {
207
+ if (count++ < 10) {
208
+ res.write('chunk');
209
+ }
210
+ else {
211
+ clearInterval(interval);
212
+ res.end();
213
+ }
214
+ }, 50);
215
+ res.on('close', () => {
216
+ clearInterval(interval);
217
+ });
218
+ });
219
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
220
+ await new Promise((resolve) => {
221
+ server.listen(port, '127.0.0.1', () => resolve());
222
+ });
223
+ const url = `http://127.0.0.1:${port}/test`;
224
+ try {
225
+ const stream = await httpStream(url);
226
+ // Destroy stream early
227
+ await delay(100);
228
+ stream.destroy();
229
+ // Wait a bit
230
+ await delay(200);
231
+ t.pass('stream destroyed without hanging');
232
+ }
233
+ finally {
234
+ server.close();
235
+ }
236
+ });
237
+ test('should handle empty response', async (t) => {
238
+ const server = createServer((_req, res) => {
239
+ res.writeHead(200, { 'Content-Length': '0' });
240
+ res.end();
241
+ });
242
+ const port = Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152;
243
+ await new Promise((resolve) => {
244
+ server.listen(port, '127.0.0.1', () => resolve());
245
+ });
246
+ const url = `http://127.0.0.1:${port}/empty`;
247
+ try {
248
+ const stream = await httpStream(url);
249
+ const buffer = await streamToBuffer(stream);
250
+ t.equal(buffer.length, 0, 'should handle empty response');
251
+ }
252
+ finally {
253
+ server.close();
254
+ }
255
+ });
256
+ //# sourceMappingURL=misc-error-handling.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"misc-error-handling.spec.js","sourceRoot":"","sources":["../../../tests/misc-error-handling.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juzi/file-box",
3
- "version": "1.7.19",
3
+ "version": "1.7.20",
4
4
  "description": "Pack a File into Box for easy move/transfer between servers no matter of where it is.(local path, remote url, or cloud storage)",
5
5
  "type": "module",
6
6
  "exports": {
@@ -28,7 +28,7 @@
28
28
  },
29
29
  "repository": {
30
30
  "type": "git",
31
- "url": "git+https://github.com/huan/file-box.git"
31
+ "url": "git+https://github.com/juzibot/file-box.git"
32
32
  },
33
33
  "keywords": [
34
34
  "file",
@@ -55,7 +55,8 @@
55
55
  "@types/node": "^18.18.7",
56
56
  "@types/qrcode": "^1.4.1",
57
57
  "@types/uuid": "^8.3.3",
58
- "@typescript-eslint/eslint-plugin": "^7.11.0",
58
+ "@typescript-eslint/eslint-plugin": "5.62.0",
59
+ "@typescript-eslint/parser": "5.62.0",
59
60
  "eslint-plugin-n": "^16.2.0",
60
61
  "gts": "^3.1.0",
61
62
  "pkg-jq": "^0.2.11",
@@ -74,6 +75,12 @@
74
75
  "qrcode": "^1.5.0",
75
76
  "uuid": "^8.3.2"
76
77
  },
78
+ "overrides": {
79
+ "@typescript-eslint/eslint-plugin": "5.62.0",
80
+ "@typescript-eslint/parser": "5.62.0",
81
+ "@typescript-eslint/utils": "5.62.0",
82
+ "@typescript-eslint/type-utils": "5.62.0"
83
+ },
77
84
  "files": [
78
85
  "dist",
79
86
  "src"