@tripod311/currents 0.0.4 → 0.0.6
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 +138 -2
- package/dist/body/multipartBody.js.map +1 -1
- package/dist/body/streamingMultipartBody.d.ts +23 -0
- package/dist/body/streamingMultipartBody.d.ts.map +1 -0
- package/dist/body/streamingMultipartBody.js +328 -0
- package/dist/body/streamingMultipartBody.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -166,7 +166,8 @@ import { BinaryBody, TextBody, JsonBody, FormBody, MultipartBody } from "@tripod
|
|
|
166
166
|
* **TextBody** → UTF-8 string body
|
|
167
167
|
* **JsonBody** → parses JSON
|
|
168
168
|
* **FormBody** → parses `application/x-www-form-urlencoded`
|
|
169
|
-
* **MultipartBody** → parses multipart bodies
|
|
169
|
+
* **MultipartBody** → parses multipart bodies (only for tests, stores request in memory, can cause OOM errors and vulnerable to attacks)
|
|
170
|
+
* **StreamingMultipartBody** → streaming multipart/form-data parser, for real cases
|
|
170
171
|
|
|
171
172
|
---
|
|
172
173
|
|
|
@@ -226,12 +227,14 @@ app.get('/*', [
|
|
|
226
227
|
Cors({
|
|
227
228
|
allowedOrigin: string | string[],
|
|
228
229
|
allowedMethods?: string[],
|
|
229
|
-
allowedHeaders?: string[],
|
|
230
|
+
allowedHeaders?: '*' | string[],
|
|
230
231
|
credentials?: boolean
|
|
231
232
|
})
|
|
232
233
|
])
|
|
233
234
|
```
|
|
234
235
|
|
|
236
|
+
Passing asterisk in allowedHeaders field will make cors reply with access-control-request-headers that browser requires.
|
|
237
|
+
|
|
235
238
|
---
|
|
236
239
|
|
|
237
240
|
### Security headers
|
|
@@ -255,3 +258,136 @@ app.get('/*', [
|
|
|
255
258
|
})
|
|
256
259
|
])
|
|
257
260
|
```
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
### Streaming Multipart
|
|
265
|
+
|
|
266
|
+
``` ts
|
|
267
|
+
import { StreamingMultipartBody } from "@tripod311/currents"
|
|
268
|
+
import type { StreamingMultipartResult, StreamingMultipartFile, StreamingMultipartOptions } from "@tripod311/currents"
|
|
269
|
+
|
|
270
|
+
app.post('/*', [
|
|
271
|
+
StreamingMultipartBody({
|
|
272
|
+
tmpDir: "/path/to/folder/for/temp/files",
|
|
273
|
+
maxRequestSize: 1024 * 1024 * 150, // 150 MB
|
|
274
|
+
maxFileSize: 1024 * 1024 * 100, // 100 MB
|
|
275
|
+
maxFieldSize: 1024 * 1024 * 10, // 10 MB
|
|
276
|
+
maxPartHeaderSize: 1024 * 16, // 16 KB
|
|
277
|
+
maxParts: 50,
|
|
278
|
+
maxFiles: 10,
|
|
279
|
+
requestTimeout: 1000 * 60 * 5, // 5 min
|
|
280
|
+
chunkTimeout: 1000 * 30 // 30 sec
|
|
281
|
+
})
|
|
282
|
+
])
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
This middleware provides a **streaming, production-safe
|
|
286
|
+
multipart/form-data parser** designed for handling large file uploads
|
|
287
|
+
(up to \~100--200 MB) without loading entire files into memory.
|
|
288
|
+
|
|
289
|
+
It uses:
|
|
290
|
+
|
|
291
|
+
- a streaming state machine
|
|
292
|
+
- strict size limits
|
|
293
|
+
- request and chunk timeouts
|
|
294
|
+
- disk-backed file storage
|
|
295
|
+
- DoS protection (limits on parts, headers, files, etc.)
|
|
296
|
+
|
|
297
|
+
The values shown above are example limits, but they are reasonable
|
|
298
|
+
defaults for real-world API usage and can safely be used as a starting
|
|
299
|
+
point.
|
|
300
|
+
|
|
301
|
+
------------------------------------------------------------------------
|
|
302
|
+
|
|
303
|
+
#### Result structure
|
|
304
|
+
|
|
305
|
+
After successful parsing, `ctx.body` will contain:
|
|
306
|
+
|
|
307
|
+
``` ts
|
|
308
|
+
export type StreamingMultipartResult =
|
|
309
|
+
Record<string, string | StreamingMultipartFile>;
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
Text fields are returned as strings.\
|
|
313
|
+
File fields are returned as `StreamingMultipartFile` instances:
|
|
314
|
+
|
|
315
|
+
``` ts
|
|
316
|
+
export class StreamingMultipartFile {
|
|
317
|
+
public tmpLink: string;
|
|
318
|
+
public originalFileName: string;
|
|
319
|
+
public mime: string;
|
|
320
|
+
|
|
321
|
+
constructor (tmpLink: string, originalFileName: string, mime: string) {
|
|
322
|
+
this.tmpLink = tmpLink;
|
|
323
|
+
this.originalFileName = originalFileName;
|
|
324
|
+
this.mime = mime;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
async move (newPath: string) {
|
|
328
|
+
await fs.promises.rename(this.tmpLink, newPath);
|
|
329
|
+
await this.clear();
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
async clear () {
|
|
333
|
+
await fs.promises.rm(this.tmpLink);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
##### Example
|
|
339
|
+
|
|
340
|
+
``` ts
|
|
341
|
+
app.post('/upload', async (ctx) => {
|
|
342
|
+
const body = ctx.body as StreamingMultipartResult;
|
|
343
|
+
|
|
344
|
+
const username = body.username as string;
|
|
345
|
+
const avatar = body.avatar as StreamingMultipartFile;
|
|
346
|
+
|
|
347
|
+
await avatar.move(`/permanent/storage/${avatar.originalFileName}`);
|
|
348
|
+
});
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
------------------------------------------------------------------------
|
|
352
|
+
|
|
353
|
+
#### ⚠ Temporary file lifecycle
|
|
354
|
+
|
|
355
|
+
Uploaded files are written to the temporary directory specified in
|
|
356
|
+
`tmpDir`.
|
|
357
|
+
|
|
358
|
+
You are responsible for either:
|
|
359
|
+
|
|
360
|
+
- moving the file to permanent storage using `move()`, or
|
|
361
|
+
- manually deleting it using `clear()`.
|
|
362
|
+
|
|
363
|
+
The middleware **only removes temporary files automatically in case of
|
|
364
|
+
an error** (e.g. size limit exceeded, timeout, malformed multipart).
|
|
365
|
+
|
|
366
|
+
If the request completes successfully, file cleanup is your
|
|
367
|
+
responsibility.
|
|
368
|
+
|
|
369
|
+
Simplest way to cleanup:
|
|
370
|
+
|
|
371
|
+
```ts
|
|
372
|
+
app.post('/upload', async (ctx) => {
|
|
373
|
+
const body = ctx.body as StreamingMultipartResult;
|
|
374
|
+
|
|
375
|
+
// Some actions with body
|
|
376
|
+
|
|
377
|
+
await ctx.locals.bodyCleanup();
|
|
378
|
+
});
|
|
379
|
+
````
|
|
380
|
+
|
|
381
|
+
------------------------------------------------------------------------
|
|
382
|
+
|
|
383
|
+
#### Why streaming?
|
|
384
|
+
|
|
385
|
+
This parser:
|
|
386
|
+
|
|
387
|
+
- never loads full files into memory
|
|
388
|
+
- processes request data chunk by chunk
|
|
389
|
+
- enforces strict limits to prevent OOM and slowloris attacks
|
|
390
|
+
- validates multipart boundaries safely across chunk splits
|
|
391
|
+
|
|
392
|
+
It is suitable for APIs that need controlled large-file handling without
|
|
393
|
+
relying on third-party multipart libraries.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multipartBody.js","sourceRoot":"","sources":["../../src/body/multipartBody.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,UAAU,MAAM,iBAAiB,CAAA;AAExC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAClD,MAAM,OAAO,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"multipartBody.js","sourceRoot":"","sources":["../../src/body/multipartBody.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Context } from "../context.js";
|
|
2
|
+
export interface StreamingMultipartOptions {
|
|
3
|
+
tmpDir: string;
|
|
4
|
+
maxRequestSize: number;
|
|
5
|
+
maxFileSize: number;
|
|
6
|
+
maxFieldSize: number;
|
|
7
|
+
maxPartHeaderSize: number;
|
|
8
|
+
maxParts: number;
|
|
9
|
+
maxFiles: number;
|
|
10
|
+
requestTimeout: number;
|
|
11
|
+
chunkTimeout: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class StreamingMultipartFile {
|
|
14
|
+
tmpLink: string;
|
|
15
|
+
originalFileName: string;
|
|
16
|
+
mime: string;
|
|
17
|
+
constructor(tmpLink: string, originalFileName: string, mime: string);
|
|
18
|
+
move(newPath: string): Promise<void>;
|
|
19
|
+
clear(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export type StreamingMultipartResult = Record<string, string | StreamingMultipartFile>;
|
|
22
|
+
export default function StreamingMultipartBody(options: StreamingMultipartOptions): (ctx: Context) => Promise<void>;
|
|
23
|
+
//# sourceMappingURL=streamingMultipartBody.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamingMultipartBody.d.ts","sourceRoot":"","sources":["../../src/body/streamingMultipartBody.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,MAAM,WAAW,yBAAyB;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,sBAAsB;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;gBAEP,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAM9D,IAAI,CAAE,OAAO,EAAE,MAAM;IAKrB,KAAK;CAGX;AAED,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,sBAAsB,CAAC,CAAC;AAwWvF,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAE,OAAO,EAAE,yBAAyB,IACnE,KAAK,OAAO,mBAsB1B"}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import crypto from "crypto";
|
|
2
|
+
import { Readable, Writable } from "stream";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import { Context } from "../context.js";
|
|
5
|
+
export class StreamingMultipartFile {
|
|
6
|
+
tmpLink;
|
|
7
|
+
originalFileName;
|
|
8
|
+
mime;
|
|
9
|
+
constructor(tmpLink, originalFileName, mime) {
|
|
10
|
+
this.tmpLink = tmpLink;
|
|
11
|
+
this.originalFileName = originalFileName;
|
|
12
|
+
this.mime = mime;
|
|
13
|
+
}
|
|
14
|
+
async move(newPath) {
|
|
15
|
+
await fs.promises.rename(this.tmpLink, newPath);
|
|
16
|
+
await this.clear();
|
|
17
|
+
}
|
|
18
|
+
async clear() {
|
|
19
|
+
await fs.promises.rm(this.tmpLink, { force: true });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
class Parser {
|
|
23
|
+
static HEADER_END = Buffer.from('\r\n\r\n');
|
|
24
|
+
options;
|
|
25
|
+
firstBoundary;
|
|
26
|
+
centerBoundary;
|
|
27
|
+
stream;
|
|
28
|
+
state = 'boundary';
|
|
29
|
+
readyPromise;
|
|
30
|
+
resolve;
|
|
31
|
+
reject;
|
|
32
|
+
processingBuffer = Buffer.alloc(0);
|
|
33
|
+
passedFirstBoundary = false;
|
|
34
|
+
fileStream = null;
|
|
35
|
+
partName = "";
|
|
36
|
+
tmpFileName = "";
|
|
37
|
+
originalFileName = "";
|
|
38
|
+
mime = "";
|
|
39
|
+
result = {};
|
|
40
|
+
partCounter = 0;
|
|
41
|
+
fileCounter = 0;
|
|
42
|
+
fileByteCounter = 0;
|
|
43
|
+
chunkTimeout;
|
|
44
|
+
requestTimeout;
|
|
45
|
+
constructor(options, boundary, stream) {
|
|
46
|
+
this.options = options;
|
|
47
|
+
this.firstBoundary = Buffer.from('--' + boundary);
|
|
48
|
+
this.centerBoundary = Buffer.from('\r\n--' + boundary);
|
|
49
|
+
this.stream = stream;
|
|
50
|
+
this.stream.on("data", this.processChunk.bind(this));
|
|
51
|
+
this.stream.on("end", this.finalize.bind(this));
|
|
52
|
+
this.stream.on("close", this.handleClose.bind(this));
|
|
53
|
+
this.readyPromise = new Promise((resolve, reject) => {
|
|
54
|
+
this.resolve = resolve;
|
|
55
|
+
this.reject = reject;
|
|
56
|
+
});
|
|
57
|
+
this.chunkTimeout = setTimeout(this.rejectChunk.bind(this), this.options.chunkTimeout);
|
|
58
|
+
this.requestTimeout = setTimeout(this.rejectRequest.bind(this), this.options.requestTimeout);
|
|
59
|
+
}
|
|
60
|
+
processChunk(chunk) {
|
|
61
|
+
this.resetChunk();
|
|
62
|
+
try {
|
|
63
|
+
switch (this.state) {
|
|
64
|
+
case "boundary":
|
|
65
|
+
this.processBoundary(chunk);
|
|
66
|
+
break;
|
|
67
|
+
case "header":
|
|
68
|
+
this.processHeader(chunk);
|
|
69
|
+
break;
|
|
70
|
+
case "body":
|
|
71
|
+
this.processBody(chunk);
|
|
72
|
+
break;
|
|
73
|
+
case "file":
|
|
74
|
+
this.processFile(chunk);
|
|
75
|
+
break;
|
|
76
|
+
case "end":
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
this.reject(err.toString());
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
processBoundary(chunk) {
|
|
85
|
+
const b = Buffer.concat([this.processingBuffer, chunk]);
|
|
86
|
+
const searchBoundary = this.passedFirstBoundary ? this.centerBoundary : this.firstBoundary;
|
|
87
|
+
const index = b.indexOf(searchBoundary);
|
|
88
|
+
if (index !== -1) {
|
|
89
|
+
this.state = 'header';
|
|
90
|
+
this.passedFirstBoundary = true;
|
|
91
|
+
this.processingBuffer = b.subarray(index + searchBoundary.length);
|
|
92
|
+
this.processHeader(Buffer.alloc(0));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const tail = searchBoundary.length + 4;
|
|
96
|
+
if (b.length > tail) {
|
|
97
|
+
this.processingBuffer = b.subarray(b.length - tail);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
this.processingBuffer = b;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
processHeader(chunk) {
|
|
105
|
+
const b = Buffer.concat([this.processingBuffer, chunk]);
|
|
106
|
+
const index = b.indexOf(Parser.HEADER_END);
|
|
107
|
+
if (b.subarray(0, 2).toString("utf-8").startsWith('--')) {
|
|
108
|
+
this.state = 'end';
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (index === -1) {
|
|
112
|
+
if (b.length >= this.options.maxPartHeaderSize) {
|
|
113
|
+
throw new Error("Part header exceeding maxPartHeaderSize");
|
|
114
|
+
}
|
|
115
|
+
this.processingBuffer = b;
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const headerPart = b.subarray(0, index);
|
|
119
|
+
this.processingBuffer = b.subarray(index + Parser.HEADER_END.length);
|
|
120
|
+
const headerStr = headerPart.toString('utf-8');
|
|
121
|
+
const lines = headerStr.split('\r\n');
|
|
122
|
+
let contentDisposition = null;
|
|
123
|
+
let contentType = null;
|
|
124
|
+
for (const line of lines) {
|
|
125
|
+
const idx = line.indexOf(':');
|
|
126
|
+
if (idx === -1)
|
|
127
|
+
continue;
|
|
128
|
+
const key = line.slice(0, idx).trim().toLowerCase();
|
|
129
|
+
const value = line.slice(idx + 1).trim();
|
|
130
|
+
if (key === "content-disposition") {
|
|
131
|
+
contentDisposition = value;
|
|
132
|
+
}
|
|
133
|
+
else if (key === "content-type") {
|
|
134
|
+
contentType = value;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (!contentDisposition) {
|
|
138
|
+
throw new Error("Missing Content-Disposition");
|
|
139
|
+
}
|
|
140
|
+
const dParts = contentDisposition.split(';');
|
|
141
|
+
if (dParts[0].toLowerCase() !== 'form-data') {
|
|
142
|
+
throw new Error('Invalid Content-Disposition type');
|
|
143
|
+
}
|
|
144
|
+
let name = undefined;
|
|
145
|
+
let filename = undefined;
|
|
146
|
+
for (const part of dParts) {
|
|
147
|
+
const eIndex = part.indexOf('=');
|
|
148
|
+
if (eIndex === -1)
|
|
149
|
+
continue;
|
|
150
|
+
const key = part.slice(0, eIndex).trim().toLowerCase();
|
|
151
|
+
let value = part.slice(eIndex + 1).trim();
|
|
152
|
+
if (value.startsWith('"') && value.endsWith('"')) {
|
|
153
|
+
value = value.slice(1, -1);
|
|
154
|
+
}
|
|
155
|
+
if (key === 'name') {
|
|
156
|
+
name = value;
|
|
157
|
+
}
|
|
158
|
+
else if (key === 'filename') {
|
|
159
|
+
filename = value;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (name === undefined)
|
|
163
|
+
throw new Error("Missing part name");
|
|
164
|
+
this.partName = name;
|
|
165
|
+
if (filename !== undefined) {
|
|
166
|
+
this.originalFileName = filename || "";
|
|
167
|
+
this.mime = contentType || "";
|
|
168
|
+
this.state = 'file';
|
|
169
|
+
this.processFile(Buffer.alloc(0));
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
this.state = 'body';
|
|
173
|
+
this.processBody(Buffer.alloc(0));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
processBody(chunk) {
|
|
177
|
+
const b = Buffer.concat([this.processingBuffer, chunk]);
|
|
178
|
+
const index = b.indexOf(this.centerBoundary);
|
|
179
|
+
if (index === -1) {
|
|
180
|
+
if (b.length >= this.options.maxFieldSize) {
|
|
181
|
+
throw new Error("Part exceeding maxFieldSize");
|
|
182
|
+
}
|
|
183
|
+
this.processingBuffer = b;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
const body = b.subarray(0, index).toString('utf-8');
|
|
187
|
+
this.processingBuffer = b.subarray(index + this.centerBoundary.length);
|
|
188
|
+
this.result[this.partName] = body;
|
|
189
|
+
this.state = 'header';
|
|
190
|
+
this.partCounter++;
|
|
191
|
+
if (this.partCounter > this.options.maxParts) {
|
|
192
|
+
throw new Error("MaxParts exceeded");
|
|
193
|
+
}
|
|
194
|
+
this.processHeader(Buffer.alloc(0));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
processFile(chunk) {
|
|
198
|
+
if (this.fileStream === null) {
|
|
199
|
+
this.tmpFileName = this.options.tmpDir + "/" + crypto.randomBytes(32).toString('hex');
|
|
200
|
+
this.fileStream = fs.createWriteStream(this.tmpFileName);
|
|
201
|
+
this.fileByteCounter = 0;
|
|
202
|
+
}
|
|
203
|
+
const b = Buffer.concat([this.processingBuffer, chunk]);
|
|
204
|
+
const index = b.indexOf(this.centerBoundary);
|
|
205
|
+
if (index === -1) {
|
|
206
|
+
const filePart = b.subarray(0, b.length - this.centerBoundary.length - 4);
|
|
207
|
+
this.fileByteCounter += filePart.length;
|
|
208
|
+
if (this.fileByteCounter >= this.options.maxFileSize)
|
|
209
|
+
throw new Error("File too large");
|
|
210
|
+
this.processingBuffer = b.subarray(b.length - this.centerBoundary.length - 4);
|
|
211
|
+
this.fileStream.write(filePart);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
const filePart = b.subarray(0, index);
|
|
215
|
+
this.fileByteCounter += filePart.length;
|
|
216
|
+
if (this.fileByteCounter >= this.options.maxFileSize)
|
|
217
|
+
throw new Error("File too large");
|
|
218
|
+
this.processingBuffer = b.subarray(index + this.centerBoundary.length);
|
|
219
|
+
this.fileStream.write(filePart);
|
|
220
|
+
this.fileStream.end();
|
|
221
|
+
this.result[this.partName] = new StreamingMultipartFile(this.tmpFileName, this.originalFileName, this.mime);
|
|
222
|
+
this.fileStream = null;
|
|
223
|
+
this.state = 'header';
|
|
224
|
+
this.partCounter++;
|
|
225
|
+
if (this.partCounter > this.options.maxParts) {
|
|
226
|
+
throw new Error("MaxParts exceeded");
|
|
227
|
+
}
|
|
228
|
+
this.fileCounter++;
|
|
229
|
+
if (this.fileCounter > this.options.maxFiles) {
|
|
230
|
+
throw new Error("MaxFiles exceeded");
|
|
231
|
+
}
|
|
232
|
+
this.processHeader(Buffer.alloc(0));
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
finalize() {
|
|
236
|
+
if (this.state !== 'end') {
|
|
237
|
+
this.reject("Stream closed early");
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
this.resolve();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
handleClose() {
|
|
244
|
+
if (this.state !== 'end') {
|
|
245
|
+
this.reject("Stream closed early");
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
resetChunk() {
|
|
249
|
+
clearTimeout(this.chunkTimeout);
|
|
250
|
+
this.chunkTimeout = setTimeout(this.rejectChunk.bind(this), this.options.chunkTimeout);
|
|
251
|
+
}
|
|
252
|
+
rejectChunk() {
|
|
253
|
+
this.reject("Request timed out");
|
|
254
|
+
}
|
|
255
|
+
rejectRequest() {
|
|
256
|
+
this.reject("Request timed out");
|
|
257
|
+
}
|
|
258
|
+
clearTimeouts() {
|
|
259
|
+
clearTimeout(this.chunkTimeout);
|
|
260
|
+
clearTimeout(this.requestTimeout);
|
|
261
|
+
}
|
|
262
|
+
async cleanup() {
|
|
263
|
+
if (this.fileStream !== null) {
|
|
264
|
+
this.fileStream.end();
|
|
265
|
+
await fs.promises.rm(this.tmpFileName);
|
|
266
|
+
}
|
|
267
|
+
for (const partname in this.result) {
|
|
268
|
+
if (typeof this.result[partname] !== "string") {
|
|
269
|
+
await this.result[partname].clear();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
function validateOptions(ctx, options) {
|
|
275
|
+
const contentType = ctx.headers["content-type"];
|
|
276
|
+
if (!contentType) {
|
|
277
|
+
throw new Error("Missing Content-Type");
|
|
278
|
+
}
|
|
279
|
+
if (!contentType.startsWith("multipart/form-data")) {
|
|
280
|
+
throw new Error("Invalid Content-Type");
|
|
281
|
+
}
|
|
282
|
+
const contentLength = ctx.headers["content-length"];
|
|
283
|
+
if (contentLength) {
|
|
284
|
+
const len = Number(contentLength);
|
|
285
|
+
if (!Number.isFinite(len) || len < 0) {
|
|
286
|
+
throw new Error("Invalid Content-Length");
|
|
287
|
+
}
|
|
288
|
+
if (len > options.maxRequestSize) {
|
|
289
|
+
throw new Error("Request too large");
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
function readBoundary(ctx) {
|
|
294
|
+
let ct = ctx.headers["content-type"].split(';');
|
|
295
|
+
let boundary = undefined;
|
|
296
|
+
for (let i = 0; i < ct.length; i++) {
|
|
297
|
+
let str = ct[i].trim();
|
|
298
|
+
if (str.match(/^boundary\=.*$/)) {
|
|
299
|
+
boundary = str.slice(str.indexOf('=') + 1);
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
if (boundary === undefined)
|
|
304
|
+
throw new Error("StreamingMultipartBody error: No boundary");
|
|
305
|
+
return boundary;
|
|
306
|
+
}
|
|
307
|
+
export default function StreamingMultipartBody(options) {
|
|
308
|
+
return async (ctx) => {
|
|
309
|
+
validateOptions(ctx, options);
|
|
310
|
+
const boundary = readBoundary(ctx);
|
|
311
|
+
const stream = ctx.raw.httpVersion === 1 ? ctx.raw.req : ctx.raw.stream;
|
|
312
|
+
const parser = new Parser(options, boundary, stream);
|
|
313
|
+
try {
|
|
314
|
+
await parser.readyPromise;
|
|
315
|
+
parser.clearTimeouts();
|
|
316
|
+
ctx.body = parser.result;
|
|
317
|
+
ctx.locals.bodyCleanup = parser.cleanup;
|
|
318
|
+
}
|
|
319
|
+
catch (err) {
|
|
320
|
+
await parser.cleanup();
|
|
321
|
+
ctx.status(500).json({
|
|
322
|
+
error: true,
|
|
323
|
+
details: err.toString()
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=streamingMultipartBody.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamingMultipartBody.js","sourceRoot":"","sources":["../../src/body/streamingMultipartBody.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,11 +10,13 @@ import TextBody from "./body/textBody.js";
|
|
|
10
10
|
import JsonBody from "./body/jsonBody.js";
|
|
11
11
|
import FormBody from "./body/formBody.js";
|
|
12
12
|
import MultipartBody from "./body/multipartBody.js";
|
|
13
|
+
import StreamingMultipartBody, { StreamingMultipartFile } from "./body/streamingMultipartBody.js";
|
|
13
14
|
import type { CurrentsOptions, ErrorHandler } from "./currents.js";
|
|
14
15
|
import type { RawHttp1, RawHttp2, RawHttp } from "./context.js";
|
|
15
16
|
import type { RouteHandler, RouteMatch, Route } from "./router.js";
|
|
16
17
|
import type { CorsOptions } from "./cors.js";
|
|
17
18
|
import type { SecurityHeadersOptions } from "./security.js";
|
|
18
|
-
|
|
19
|
-
export {
|
|
19
|
+
import type { StreamingMultipartOptions, StreamingMultipartResult } from "./body/streamingMultipartBody.js";
|
|
20
|
+
export type { CurrentsOptions, ErrorHandler, RawHttp1, RawHttp2, RawHttp, RouteHandler, RouteMatch, Route, CorsOptions, SecurityHeadersOptions, StreamingMultipartOptions, StreamingMultipartResult };
|
|
21
|
+
export { Currents, Context, Router, ServeStatic, ParseCookies, SetCookie, Cors, SecurityHeaders, BinaryBody, TextBody, JsonBody, FormBody, MultipartBody, StreamingMultipartBody, StreamingMultipartFile };
|
|
20
22
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,UAAU,MAAM,sBAAsB,CAAA;AAC7C,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,aAAa,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,UAAU,MAAM,sBAAsB,CAAA;AAC7C,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,aAAa,MAAM,yBAAyB,CAAA;AACnD,OAAO,sBAAsB,EAAE,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAEjG,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAGlE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAA;AAE3G,YAAY,EACX,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,UAAU,EACV,KAAK,EACL,WAAW,EACX,sBAAsB,EACtB,yBAAyB,EACzB,wBAAwB,EACxB,CAAA;AAED,OAAO,EACN,QAAQ,EACR,OAAO,EACP,MAAM,EACN,WAAW,EACX,YAAY,EACZ,SAAS,EACT,IAAI,EACJ,eAAe,EACf,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -10,5 +10,6 @@ import TextBody from "./body/textBody.js";
|
|
|
10
10
|
import JsonBody from "./body/jsonBody.js";
|
|
11
11
|
import FormBody from "./body/formBody.js";
|
|
12
12
|
import MultipartBody from "./body/multipartBody.js";
|
|
13
|
-
|
|
13
|
+
import StreamingMultipartBody, { StreamingMultipartFile } from "./body/streamingMultipartBody.js";
|
|
14
|
+
export { Currents, Context, Router, ServeStatic, ParseCookies, SetCookie, Cors, SecurityHeaders, BinaryBody, TextBody, JsonBody, FormBody, MultipartBody, StreamingMultipartBody, StreamingMultipartFile };
|
|
14
15
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,UAAU,MAAM,sBAAsB,CAAA;AAC7C,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,aAAa,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,UAAU,MAAM,sBAAsB,CAAA;AAC7C,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,aAAa,MAAM,yBAAyB,CAAA;AACnD,OAAO,sBAAsB,EAAE,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AA0BjG,OAAO,EACN,QAAQ,EACR,OAAO,EACP,MAAM,EACN,WAAW,EACX,YAAY,EACZ,SAAS,EACT,IAAI,EACJ,eAAe,EACf,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,CAAA"}
|