@tripod311/currents 0.0.3 → 0.0.5

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 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,124 @@ 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
+ ------------------------------------------------------------------------
370
+
371
+ #### Why streaming?
372
+
373
+ This parser:
374
+
375
+ - never loads full files into memory
376
+ - processes request data chunk by chunk
377
+ - enforces strict limits to prevent OOM and slowloris attacks
378
+ - validates multipart boundaries safely across chunk splits
379
+
380
+ It is suitable for APIs that need controlled large-file handling without
381
+ relying on third-party multipart libraries.
@@ -1 +1 @@
1
- {"version":3,"file":"multipartBody.js","sourceRoot":"","sources":["../../src/body/multipartBody.ts"],"names":[],"mappings":"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"}
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,mBAqB1B"}
@@ -0,0 +1,327 @@
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);
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
+ }
318
+ catch (err) {
319
+ await parser.cleanup();
320
+ ctx.status(500).json({
321
+ error: true,
322
+ details: err.toString()
323
+ });
324
+ }
325
+ };
326
+ }
327
+ //# 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/cors.d.ts CHANGED
@@ -2,7 +2,7 @@ import { Context } from "./context.js";
2
2
  export interface CorsOptions {
3
3
  allowedOrigin: string | string[];
4
4
  allowedMethods?: string[];
5
- allowedHeaders?: string[];
5
+ allowedHeaders?: '*' | string[];
6
6
  credentials?: boolean;
7
7
  }
8
8
  export declare function Cors(options: CorsOptions): (ctx: Context) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,WAAW,WAAW;IAC3B,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,IAAI,CAAE,OAAO,EAAE,WAAW,IAC3B,KAAK,OAAO,mBAgC1B"}
1
+ {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,WAAW,WAAW;IAC3B,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,IAAI,CAAE,OAAO,EAAE,WAAW,IAC3B,KAAK,OAAO,mBAoC1B"}
package/dist/cors.js CHANGED
@@ -25,7 +25,12 @@ export function Cors(options) {
25
25
  ctx.responseHeader("Access-Control-Allow-Methods", options.allowedMethods.join(", "));
26
26
  }
27
27
  if (options.allowedHeaders) {
28
- ctx.responseHeader("Access-Control-Allow-Headers", options.allowedHeaders.join(", "));
28
+ if (options.allowedHeaders === '*') {
29
+ ctx.responseHeader("Access-Control-Allow-Headers", ctx.headers['access-control-request-headers'] || "Content-Type");
30
+ }
31
+ else {
32
+ ctx.responseHeader("Access-Control-Allow-Headers", options.allowedHeaders.join(", "));
33
+ }
29
34
  }
30
35
  ctx.status(204).end();
31
36
  }
package/dist/cors.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cors.js","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAStC,MAAM,UAAU,IAAI,CAAE,OAAoB;IACzC,OAAO,KAAK,EAAE,GAAY,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,IAAI,OAAO,CAAC,aAAa,KAAK,GAAG,EAAE,CAAC;YACnC,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,IAAI,OAAO,OAAO,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtD,OAAO,GAAG,OAAO,CAAC,aAAa,KAAK,MAAM,CAAC;QAC5C,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YACjD,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,GAAG,CAAC,cAAc,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC;QAE1D,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACzB,GAAG,CAAC,cAAc,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC5B,GAAG,CAAC,cAAc,CAAC,8BAA8B,EAAE,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvF,CAAC;YACD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC5B,GAAG,CAAC,cAAc,CAAC,8BAA8B,EAAE,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvF,CAAC;YACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACvB,CAAC;IACF,CAAC,CAAA;AACF,CAAC"}
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAStC,MAAM,UAAU,IAAI,CAAE,OAAoB;IACzC,OAAO,KAAK,EAAE,GAAY,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,IAAI,OAAO,CAAC,aAAa,KAAK,GAAG,EAAE,CAAC;YACnC,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,IAAI,OAAO,OAAO,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtD,OAAO,GAAG,OAAO,CAAC,aAAa,KAAK,MAAM,CAAC;QAC5C,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YACjD,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,GAAG,CAAC,cAAc,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC;QAE1D,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACzB,GAAG,CAAC,cAAc,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC5B,GAAG,CAAC,cAAc,CAAC,8BAA8B,EAAE,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvF,CAAC;YACD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC5B,IAAI,OAAO,CAAC,cAAc,KAAK,GAAG,EAAE,CAAC;oBACpC,GAAG,CAAC,cAAc,CAAC,8BAA8B,EAAE,GAAG,CAAC,OAAO,CAAC,gCAAgC,CAAC,IAAI,cAAc,CAAC,CAAC;gBACrH,CAAC;qBAAM,CAAC;oBACP,GAAG,CAAC,cAAc,CAAC,8BAA8B,EAAE,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvF,CAAC;YACF,CAAC;YACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACvB,CAAC;IACF,CAAC,CAAA;AACF,CAAC"}
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
- export type { CurrentsOptions, ErrorHandler, RawHttp1, RawHttp2, RawHttp, RouteHandler, RouteMatch, Route, CorsOptions, SecurityHeadersOptions };
19
- export { Currents, Context, Router, ServeStatic, ParseCookies, SetCookie, Cors, SecurityHeaders, BinaryBody, TextBody, JsonBody, FormBody, MultipartBody };
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
@@ -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;AAEnD,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;AAE3D,YAAY,EACX,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,UAAU,EACV,KAAK,EACL,WAAW,EACX,sBAAsB,EACtB,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,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
- export { Currents, Context, Router, ServeStatic, ParseCookies, SetCookie, Cors, SecurityHeaders, BinaryBody, TextBody, JsonBody, FormBody, MultipartBody };
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;AAuBnD,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,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tripod311/currents",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "Lightweight pipeline API constructor",
5
5
  "keywords": [
6
6
  "js",