@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 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":"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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,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
- 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.4",
3
+ "version": "0.0.6",
4
4
  "description": "Lightweight pipeline API constructor",
5
5
  "keywords": [
6
6
  "js",