expediate 1.0.3 → 1.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/LICENSE +16 -16
- package/README.md +417 -30
- package/dist/apis.d.ts +138 -21
- package/dist/apis.d.ts.map +1 -1
- package/dist/apis.js +172 -79
- package/dist/apis.js.map +1 -1
- package/dist/cjs/apis.js +327 -0
- package/dist/cjs/git.js +293 -0
- package/dist/cjs/index.js +2583 -0
- package/dist/cjs/jwt-auth.js +532 -0
- package/dist/cjs/middleware.js +511 -0
- package/dist/cjs/mimetypes.json +1 -0
- package/dist/cjs/misc.js +787 -0
- package/dist/cjs/openapi.js +485 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/router.js +898 -0
- package/dist/cjs/static.js +669 -0
- package/dist/git.d.ts +71 -8
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +127 -72
- package/dist/git.js.map +1 -1
- package/dist/index.d.ts +17 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -24
- package/dist/index.js.map +1 -1
- package/dist/jwt-auth.d.ts +147 -57
- package/dist/jwt-auth.d.ts.map +1 -1
- package/dist/jwt-auth.js +445 -205
- package/dist/jwt-auth.js.map +1 -1
- package/dist/middleware.d.ts +476 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +647 -0
- package/dist/middleware.js.map +1 -0
- package/dist/mimetypes.json +1 -1
- package/dist/misc.d.ts +153 -12
- package/dist/misc.d.ts.map +1 -1
- package/dist/misc.js +325 -97
- package/dist/misc.js.map +1 -1
- package/dist/openapi.d.ts +290 -0
- package/dist/openapi.d.ts.map +1 -0
- package/dist/openapi.js +481 -0
- package/dist/openapi.js.map +1 -0
- package/dist/router.d.ts +407 -45
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +665 -137
- package/dist/router.js.map +1 -1
- package/dist/static.d.ts +1 -1
- package/dist/static.d.ts.map +1 -1
- package/dist/static.js +93 -86
- package/dist/static.js.map +1 -1
- package/package.json +21 -4
- package/.npmignore +0 -16
package/dist/misc.js
CHANGED
|
@@ -19,15 +19,8 @@
|
|
|
19
19
|
* DEALINGS IN THE SOFTWARE.
|
|
20
20
|
*/
|
|
21
21
|
'use strict';
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.json = json;
|
|
27
|
-
exports.formData = formData;
|
|
28
|
-
exports.parseBody = parseBody;
|
|
29
|
-
exports.logger = logger;
|
|
30
|
-
const zlib_1 = __importDefault(require("zlib"));
|
|
22
|
+
import { Readable } from 'stream';
|
|
23
|
+
import zlib from 'zlib';
|
|
31
24
|
// ---------------------------------------------------------------------------
|
|
32
25
|
// Decompression algorithm registry
|
|
33
26
|
// ---------------------------------------------------------------------------
|
|
@@ -36,8 +29,8 @@ const zlib_1 = __importDefault(require("zlib"));
|
|
|
36
29
|
* decompression function. Only `gzip` and `deflate` are supported.
|
|
37
30
|
*/
|
|
38
31
|
const DECOMPRESS_ALGO = {
|
|
39
|
-
gzip:
|
|
40
|
-
deflate:
|
|
32
|
+
gzip: zlib.gunzip,
|
|
33
|
+
deflate: zlib.inflate,
|
|
41
34
|
};
|
|
42
35
|
// ---------------------------------------------------------------------------
|
|
43
36
|
// Internal utilities
|
|
@@ -109,10 +102,7 @@ function splitBuffer(buffer, delimiter) {
|
|
|
109
102
|
* (e.g. `'text/plain; charset=iso-8859-1'`).
|
|
110
103
|
* @returns A Node.js-compatible encoding name (e.g. `'utf8'`, `'iso-8859-1'`).
|
|
111
104
|
*/
|
|
112
|
-
function extractCharset(contentType) {
|
|
113
|
-
// BUG FIX: the original regex `'s+$` was a literal quote followed by `s+$`
|
|
114
|
-
// instead of `\s+$`. The trim therefore left leading/trailing whitespace on
|
|
115
|
-
// every parameter, breaking charset detection. Corrected to `\s+$`.
|
|
105
|
+
export function extractCharset(contentType) {
|
|
116
106
|
const param = contentType
|
|
117
107
|
.split(';')
|
|
118
108
|
.map((s) => s.replace(/^\s+|\s+$/g, ''))
|
|
@@ -134,7 +124,7 @@ function extractCharset(contentType) {
|
|
|
134
124
|
*
|
|
135
125
|
* Callers that need to pass control to the next middleware when there is no
|
|
136
126
|
* body should rely on the `next()` call that this function makes when
|
|
137
|
-
* `Content-Length` is `0` or absent
|
|
127
|
+
* `Content-Length` is `0` or absent and `Transfer-Encoding` is not `chunked`.
|
|
138
128
|
*
|
|
139
129
|
* @param req - The incoming request.
|
|
140
130
|
* @param res - The outgoing response.
|
|
@@ -146,15 +136,16 @@ function extractCharset(contentType) {
|
|
|
146
136
|
* @param callback - Invoked with `(contentType, body)` on success.
|
|
147
137
|
*/
|
|
148
138
|
function readBody(req, res, opts, mimetype, next, callback) {
|
|
149
|
-
// BUG FIX: HTTP/1.1 header names are always lowercased by Node.js.
|
|
150
|
-
// The original code used mixed-case keys ('Content-Length', 'Content-Encoding',
|
|
151
|
-
// 'Content-Type') which always evaluated to undefined.
|
|
152
139
|
const length = parseInt(req.headers['content-length'] ?? '0', 10);
|
|
153
|
-
//
|
|
154
|
-
|
|
140
|
+
// Detect chunked transfer encoding — no Content-Length is present in this case.
|
|
141
|
+
const isChunked = req.headers['transfer-encoding']
|
|
142
|
+
?.split(',').map((v) => v.trim()).some((v) => v.toLowerCase() === 'chunked') ?? false;
|
|
143
|
+
// No body declared and not chunked — skip to next middleware.
|
|
144
|
+
if (!isChunked && (!length || length === 0))
|
|
155
145
|
return next();
|
|
156
146
|
const maxLength = readSize(opts.limit) || 102_400;
|
|
157
|
-
|
|
147
|
+
// For requests with a known Content-Length we can reject upfront.
|
|
148
|
+
if (!isChunked && length > maxLength)
|
|
158
149
|
return void res.status(413).send('Content Too Large');
|
|
159
150
|
// Compression handling.
|
|
160
151
|
const encoding = req.headers['content-encoding'];
|
|
@@ -171,10 +162,6 @@ function readBody(req, res, opts, mimetype, next, callback) {
|
|
|
171
162
|
req.on('data', (chunk) => {
|
|
172
163
|
if (data === null)
|
|
173
164
|
return; // already aborted
|
|
174
|
-
// BUG FIX: the size check must happen AFTER concatenating the new chunk,
|
|
175
|
-
// not before. Checking before allowed a stream of (maxLength-1)-byte chunks
|
|
176
|
-
// to bypass the limit entirely.
|
|
177
|
-
// BUG FIX: the original code referenced `chink` (typo) instead of `chunk`.
|
|
178
165
|
const next_ = Buffer.concat([data, chunk]);
|
|
179
166
|
if (next_.length > maxLength) {
|
|
180
167
|
data = null;
|
|
@@ -195,6 +182,56 @@ function readBody(req, res, opts, mimetype, next, callback) {
|
|
|
195
182
|
});
|
|
196
183
|
});
|
|
197
184
|
}
|
|
185
|
+
// TODO
|
|
186
|
+
export function readReqBody(req, opts, mimetype) {
|
|
187
|
+
return new Promise((resolve, reject) => {
|
|
188
|
+
const length = parseInt(req.headers['content-length'] ?? '0', 10);
|
|
189
|
+
// Detect chunked transfer encoding — no Content-Length is present in this case.
|
|
190
|
+
const isChunked = req.headers['transfer-encoding']
|
|
191
|
+
?.split(',').map((v) => v.trim()).some((v) => v.toLowerCase() === 'chunked') ?? false;
|
|
192
|
+
// No body declared and not chunked — resolve with null.
|
|
193
|
+
if (!isChunked && (!length || length === 0))
|
|
194
|
+
return resolve(null);
|
|
195
|
+
const maxLength = readSize(opts.limit) || 102_400;
|
|
196
|
+
// For requests with a known Content-Length we can reject upfront.
|
|
197
|
+
if (!isChunked && length > maxLength)
|
|
198
|
+
return reject({ status: 413, message: 'Content Too Large' });
|
|
199
|
+
// Compression handling.
|
|
200
|
+
const encoding = req.headers['content-encoding'];
|
|
201
|
+
if (encoding && (opts.inflate === false || !DECOMPRESS_ALGO[encoding]))
|
|
202
|
+
return reject({ status: 415, message: 'Unsupported Media Type: Wrong Content-Encoding' });
|
|
203
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
204
|
+
const decompress = (encoding ? DECOMPRESS_ALGO[encoding] : undefined) ?? ((d, c) => c(null, d));
|
|
205
|
+
// Content-Type validation.
|
|
206
|
+
const contentType = req.headers['content-type'] ?? '';
|
|
207
|
+
if (mimetype && contentType.split(';')[0].trim() !== mimetype)
|
|
208
|
+
return reject({ status: 415, message: 'Unsupported Media Type: Wrong Content-Type' });
|
|
209
|
+
// Stream collection.
|
|
210
|
+
let data = Buffer.alloc(0);
|
|
211
|
+
req.on('data', (chunk) => {
|
|
212
|
+
if (data === null)
|
|
213
|
+
return; // already aborted
|
|
214
|
+
const next_ = Buffer.concat([data, chunk]);
|
|
215
|
+
if (next_.length > maxLength) {
|
|
216
|
+
data = null;
|
|
217
|
+
reject({ status: 413, message: 'Content Too Large' });
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
data = next_;
|
|
221
|
+
});
|
|
222
|
+
req.on('end', () => {
|
|
223
|
+
if (data === null)
|
|
224
|
+
return; // aborted during streaming
|
|
225
|
+
// zlib types require NonSharedBuffer; Buffer satisfies this at runtime.
|
|
226
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
227
|
+
decompress(data, (err, decompressed) => {
|
|
228
|
+
if (err)
|
|
229
|
+
return reject({ status: 500, message: err.message });
|
|
230
|
+
resolve({ mimetype: contentType ?? '', content: decompressed });
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
}
|
|
198
235
|
// ---------------------------------------------------------------------------
|
|
199
236
|
// Body parsers
|
|
200
237
|
// ---------------------------------------------------------------------------
|
|
@@ -238,20 +275,26 @@ function readBodyAsPlainText(req, res, next, contentType, data) {
|
|
|
238
275
|
function readBodyAsJson(req, res, next, opts, contentType, data) {
|
|
239
276
|
const charset = extractCharset(contentType);
|
|
240
277
|
try {
|
|
241
|
-
|
|
278
|
+
const parsed = JSON.parse(data.toString(charset), opts.reviver ?? undefined);
|
|
279
|
+
// FIX-10: strict mode — reject bare primitives (strings, numbers, booleans)
|
|
280
|
+
// at the top level; only objects and arrays are accepted.
|
|
281
|
+
if (opts.strict && (typeof parsed !== 'object' || parsed === null)) {
|
|
282
|
+
return void res.status(400).send('Bad Request: JSON body must be an object or array');
|
|
283
|
+
}
|
|
284
|
+
req.body = parsed;
|
|
242
285
|
next();
|
|
243
286
|
}
|
|
244
287
|
catch (ex) {
|
|
245
|
-
|
|
288
|
+
// Invalid JSON is a client error (400), not a server error.
|
|
289
|
+
res.status(400).send('Bad Request: ' + ex.message);
|
|
246
290
|
}
|
|
247
291
|
}
|
|
248
292
|
/**
|
|
249
|
-
* Parse a
|
|
250
|
-
*
|
|
251
|
-
* an array of {@link FormPart} objects to `req.body`.
|
|
293
|
+
* Parse a raw `multipart/form-data` body buffer into an array of
|
|
294
|
+
* {@link FormPart} objects.
|
|
252
295
|
*
|
|
253
|
-
*
|
|
254
|
-
*
|
|
296
|
+
* This is the shared parsing kernel used by both the {@link formData}
|
|
297
|
+
* middleware and the `req.formData()` extension method on the request object.
|
|
255
298
|
*
|
|
256
299
|
* **Multipart wire format recap:**
|
|
257
300
|
* ```
|
|
@@ -266,68 +309,118 @@ function readBodyAsJson(req, res, next, opts, contentType, data) {
|
|
|
266
309
|
* The boundary string in `Content-Type` does **not** include the leading `--`;
|
|
267
310
|
* actual part delimiters on the wire are `\r\n--boundary`.
|
|
268
311
|
*
|
|
269
|
-
* @param req - The incoming request (mutated: `req.body` is set).
|
|
270
|
-
* @param res - The outgoing response.
|
|
271
|
-
* @param next - Called on successful parsing.
|
|
272
312
|
* @param contentType - The raw `Content-Type` header value (must include
|
|
273
313
|
* `boundary=<value>`).
|
|
274
|
-
* @param data - The raw body buffer.
|
|
314
|
+
* @param data - The fully-collected raw body buffer.
|
|
315
|
+
* @returns An array of parsed {@link FormPart} objects.
|
|
316
|
+
* @throws `{ status: 400, message }` when the `boundary` parameter is absent.
|
|
275
317
|
*/
|
|
276
|
-
function
|
|
277
|
-
// BUG FIX: the original regex used `'s+$` (literal quote) instead of `\s+$`.
|
|
318
|
+
export function parseMultipartBody(contentType, data) {
|
|
278
319
|
const boundary = contentType
|
|
279
320
|
.split(';')
|
|
280
321
|
.map((s) => s.replace(/^\s+|\s+$/g, ''))
|
|
281
322
|
.find((s) => s.startsWith('boundary='))
|
|
282
323
|
?.substring('boundary='.length);
|
|
283
324
|
if (!boundary)
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
325
|
+
throw { status: 400, message: 'Bad Request: missing multipart boundary' };
|
|
326
|
+
// Wire-level delimiter: each part (after the preamble) is preceded by
|
|
327
|
+
// \r\n--boundary. We split on this sequence so every resulting slice is
|
|
328
|
+
// the raw content of one part (headers + blank line + body), without any
|
|
329
|
+
// leading delimiter bytes.
|
|
330
|
+
const delimiter = Buffer.from(`\r\n--${boundary}`);
|
|
331
|
+
// Prepend \r\n so the very first part is also cleanly split.
|
|
332
|
+
const normalized = Buffer.concat([Buffer.from('\r\n'), data]);
|
|
333
|
+
const rawParts = splitBuffer(normalized, delimiter);
|
|
334
|
+
const parts = [];
|
|
335
|
+
for (const part of rawParts) {
|
|
336
|
+
// The closing delimiter ends with '--'; skip it.
|
|
337
|
+
if (part.toString('utf8', 0, 2) === '--')
|
|
338
|
+
continue;
|
|
339
|
+
// Each part begins with \r\n (from after the delimiter), then headers,
|
|
340
|
+
// then \r\n\r\n (blank line), then content.
|
|
341
|
+
// Skip the leading \r\n.
|
|
342
|
+
const partContent = part.slice(2);
|
|
343
|
+
const blankLine = Buffer.from('\r\n\r\n');
|
|
344
|
+
const blankIdx = partContent.indexOf(blankLine);
|
|
345
|
+
if (blankIdx === -1)
|
|
346
|
+
continue; // malformed part — skip
|
|
347
|
+
const headerSection = partContent.slice(0, blankIdx).toString('utf8');
|
|
348
|
+
const content = partContent.slice(blankIdx + blankLine.length);
|
|
349
|
+
const headers = {};
|
|
350
|
+
for (const line of headerSection.split('\r\n')) {
|
|
351
|
+
if (!line)
|
|
352
|
+
continue;
|
|
353
|
+
const colonIdx = line.indexOf(':');
|
|
354
|
+
if (colonIdx === -1)
|
|
302
355
|
continue;
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
356
|
+
const key = line.substring(0, colonIdx).replace(/^\s+|\s+$/g, '').toLowerCase();
|
|
357
|
+
const value = line.substring(colonIdx + 1).replace(/^\s+|\s+$/g, '');
|
|
358
|
+
headers[key] = value;
|
|
359
|
+
}
|
|
360
|
+
parts.push({ headers, content });
|
|
361
|
+
}
|
|
362
|
+
return parts;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Parse a collected body buffer as `multipart/form-data`, split it on the
|
|
366
|
+
* boundary declared in `contentType`, parse each part's headers, and assign
|
|
367
|
+
* an array of {@link FormPart} objects to `req.body`.
|
|
368
|
+
*
|
|
369
|
+
* On success, calls `next()`. On failure (missing boundary, malformed parts),
|
|
370
|
+
* sends the appropriate HTTP error.
|
|
371
|
+
*
|
|
372
|
+
* @param req - The incoming request (mutated: `req.body` is set).
|
|
373
|
+
* @param res - The outgoing response.
|
|
374
|
+
* @param next - Called on successful parsing.
|
|
375
|
+
* @param contentType - The raw `Content-Type` header value (must include
|
|
376
|
+
* `boundary=<value>`).
|
|
377
|
+
* @param data - The raw body buffer.
|
|
378
|
+
*/
|
|
379
|
+
function readBodyAsFormData(req, res, next, contentType, data) {
|
|
380
|
+
try {
|
|
381
|
+
req.body = parseMultipartBody(contentType, data);
|
|
382
|
+
next();
|
|
383
|
+
}
|
|
384
|
+
catch (ex) {
|
|
385
|
+
const status = ex.status ?? 500;
|
|
386
|
+
res.status(status).send(ex.message ?? String(ex));
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Parse a collected body buffer as `application/x-www-form-urlencoded` and
|
|
391
|
+
* assign the result to `req.body`.
|
|
392
|
+
*
|
|
393
|
+
* Repeated keys (e.g. `tags=a&tags=b`) produce an array value:
|
|
394
|
+
* `{ tags: ['a', 'b'] }`. Single-occurrence keys produce a plain string.
|
|
395
|
+
*
|
|
396
|
+
* @param req - The incoming request (mutated: `req.body` is set).
|
|
397
|
+
* @param res - The outgoing response.
|
|
398
|
+
* @param next - Called on successful parsing.
|
|
399
|
+
* @param contentType - The raw `Content-Type` header value.
|
|
400
|
+
* @param data - The raw body buffer.
|
|
401
|
+
*/
|
|
402
|
+
function readBodyAsFormEncoded(req, res, next, contentType, data) {
|
|
403
|
+
const charset = extractCharset(contentType);
|
|
404
|
+
try {
|
|
405
|
+
const params = new URLSearchParams(data.toString(charset));
|
|
406
|
+
const result = {};
|
|
407
|
+
for (const [key, value] of params.entries()) {
|
|
408
|
+
const existing = result[key];
|
|
409
|
+
if (existing === undefined) {
|
|
410
|
+
result[key] = value;
|
|
411
|
+
}
|
|
412
|
+
else if (Array.isArray(existing)) {
|
|
413
|
+
existing.push(value);
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
result[key] = [existing, value];
|
|
323
417
|
}
|
|
324
|
-
parts.push({ headers, content });
|
|
325
418
|
}
|
|
326
|
-
req.body =
|
|
419
|
+
req.body = result;
|
|
327
420
|
next();
|
|
328
421
|
}
|
|
329
422
|
catch (ex) {
|
|
330
|
-
res.status(
|
|
423
|
+
res.status(400).send('Bad Request: ' + ex.message);
|
|
331
424
|
}
|
|
332
425
|
}
|
|
333
426
|
/**
|
|
@@ -337,6 +430,7 @@ function readBodyAsFormData(req, res, next, contentType, data) {
|
|
|
337
430
|
const BODY_READERS = {
|
|
338
431
|
'multipart/form-data': (req, res, next, _opts, ct, data) => readBodyAsFormData(req, res, next, ct, data),
|
|
339
432
|
'application/json': (req, res, next, opts, ct, data) => readBodyAsJson(req, res, next, opts, ct, data),
|
|
433
|
+
'application/x-www-form-urlencoded': (req, res, next, _opts, ct, data) => readBodyAsFormEncoded(req, res, next, ct, data),
|
|
340
434
|
'text/plain': (req, res, next, _opts, ct, data) => readBodyAsPlainText(req, res, next, ct, data),
|
|
341
435
|
};
|
|
342
436
|
// ---------------------------------------------------------------------------
|
|
@@ -365,7 +459,7 @@ const BODY_READERS = {
|
|
|
365
459
|
* @param opts - Optional configuration (see {@link BodyOptions}).
|
|
366
460
|
* @returns An Express-compatible middleware function.
|
|
367
461
|
*/
|
|
368
|
-
function json(opts) {
|
|
462
|
+
export function json(opts) {
|
|
369
463
|
const resolved = {
|
|
370
464
|
inflate: true,
|
|
371
465
|
limit: '100kb',
|
|
@@ -402,7 +496,7 @@ function json(opts) {
|
|
|
402
496
|
* @param opts - Optional configuration (see {@link BodyOptions}).
|
|
403
497
|
* @returns An Express-compatible middleware function.
|
|
404
498
|
*/
|
|
405
|
-
function formData(opts) {
|
|
499
|
+
export function formData(opts) {
|
|
406
500
|
const resolved = {
|
|
407
501
|
inflate: true,
|
|
408
502
|
limit: '100kb',
|
|
@@ -416,23 +510,64 @@ function formData(opts) {
|
|
|
416
510
|
});
|
|
417
511
|
};
|
|
418
512
|
}
|
|
513
|
+
/**
|
|
514
|
+
* Middleware factory that parses an `application/x-www-form-urlencoded`
|
|
515
|
+
* request body and assigns the decoded fields to `req.body`.
|
|
516
|
+
*
|
|
517
|
+
* Repeated keys (e.g. `tags=a&tags=b`) produce an array value:
|
|
518
|
+
* `{ tags: ['a', 'b'] }`. Single-occurrence keys produce a plain string.
|
|
519
|
+
*
|
|
520
|
+
* Behaviour:
|
|
521
|
+
* - Requests without a body are passed through to `next()`.
|
|
522
|
+
* - Bodies larger than `opts.limit` receive **413 Content Too Large**.
|
|
523
|
+
* - Bodies whose `Content-Type` is not `application/x-www-form-urlencoded`
|
|
524
|
+
* receive **415 Unsupported Media Type**.
|
|
525
|
+
* - Parse errors receive **400 Bad Request**.
|
|
526
|
+
*
|
|
527
|
+
* @param opts - Optional configuration (see {@link BodyOptions}).
|
|
528
|
+
* @returns An Express-compatible middleware function.
|
|
529
|
+
*
|
|
530
|
+
* @example
|
|
531
|
+
* ```ts
|
|
532
|
+
* app.post('/form', formEncoded(), (req, res) => {
|
|
533
|
+
* const { username, tags } = req.body as any;
|
|
534
|
+
* res.json({ username, tags }); // tags may be string | string[]
|
|
535
|
+
* });
|
|
536
|
+
* ```
|
|
537
|
+
*/
|
|
538
|
+
export function formEncoded(opts) {
|
|
539
|
+
const resolved = {
|
|
540
|
+
inflate: true,
|
|
541
|
+
limit: '100kb',
|
|
542
|
+
reviver: null,
|
|
543
|
+
strict: true,
|
|
544
|
+
...opts,
|
|
545
|
+
};
|
|
546
|
+
return (req, res, next) => {
|
|
547
|
+
readBody(req, res, resolved, 'application/x-www-form-urlencoded', next, (contentType, body) => {
|
|
548
|
+
readBodyAsFormEncoded(req, res, next, contentType, body);
|
|
549
|
+
});
|
|
550
|
+
};
|
|
551
|
+
}
|
|
419
552
|
/**
|
|
420
553
|
* Middleware factory that auto-detects the `Content-Type` of the request body
|
|
421
554
|
* and parses it using the appropriate parser.
|
|
422
555
|
*
|
|
423
556
|
* Supported MIME types:
|
|
424
|
-
* - `application/json`
|
|
425
|
-
* - `multipart/form-data`
|
|
426
|
-
* - `
|
|
557
|
+
* - `application/json` → parsed as JSON; result is a JS value.
|
|
558
|
+
* - `multipart/form-data` → parsed as multipart; result is `FormPart[]`.
|
|
559
|
+
* - `application/x-www-form-urlencoded` → decoded as key/value pairs; result is
|
|
560
|
+
* `Record<string, string | string[]>`.
|
|
561
|
+
* - `text/plain` → decoded as text; result is a string.
|
|
427
562
|
*
|
|
428
563
|
* Requests with an unsupported MIME type receive **415 Unsupported Media Type**.
|
|
429
|
-
* All other error conditions behave identically to {@link json}
|
|
430
|
-
* {@link
|
|
564
|
+
* All other error conditions behave identically to {@link json}, {@link formData},
|
|
565
|
+
* and {@link formEncoded}.
|
|
431
566
|
*
|
|
432
567
|
* @param opts - Optional configuration (see {@link BodyOptions}).
|
|
433
568
|
* @returns An Express-compatible middleware function.
|
|
434
569
|
*/
|
|
435
|
-
function parseBody(opts) {
|
|
570
|
+
export function parseBody(opts) {
|
|
436
571
|
const resolved = {
|
|
437
572
|
inflate: true,
|
|
438
573
|
limit: '100kb',
|
|
@@ -449,6 +584,56 @@ function parseBody(opts) {
|
|
|
449
584
|
});
|
|
450
585
|
};
|
|
451
586
|
}
|
|
587
|
+
/**
|
|
588
|
+
* Async generator that yields each part of a `multipart/form-data` request
|
|
589
|
+
* body as a {@link FormPartStream} object.
|
|
590
|
+
*
|
|
591
|
+
* Unlike {@link formData} (which must be installed as middleware before a
|
|
592
|
+
* handler), `streamFormData` can be called directly inside any handler and
|
|
593
|
+
* returns an async iterable of parts:
|
|
594
|
+
*
|
|
595
|
+
* ```ts
|
|
596
|
+
* app.post('/upload', async (req, res) => {
|
|
597
|
+
* for await (const part of streamFormData(req)) {
|
|
598
|
+
* const name = part.headers['content-disposition'];
|
|
599
|
+
* const chunks: Buffer[] = [];
|
|
600
|
+
* for await (const chunk of part.stream) chunks.push(chunk);
|
|
601
|
+
* const content = Buffer.concat(chunks);
|
|
602
|
+
* // ... process content
|
|
603
|
+
* }
|
|
604
|
+
* res.send('ok');
|
|
605
|
+
* });
|
|
606
|
+
* ```
|
|
607
|
+
*
|
|
608
|
+
* **Note:** the full request body is buffered before parts are yielded,
|
|
609
|
+
* because the multipart boundary must span the entire body. For very large
|
|
610
|
+
* uploads, prefer streaming directly from the raw request.
|
|
611
|
+
*
|
|
612
|
+
* @param req - The incoming request (must be a `multipart/form-data` request).
|
|
613
|
+
* @param opts - Optional configuration — only `limit` and `inflate` are used.
|
|
614
|
+
* @throws `{ status: 400, message }` when the `boundary` parameter is absent.
|
|
615
|
+
* @throws `{ status: 413, message }` when the body exceeds the size limit.
|
|
616
|
+
*/
|
|
617
|
+
export async function* streamFormData(req, opts) {
|
|
618
|
+
const maxSize = (opts?.limit !== undefined ? readSize(opts.limit) : 0) || 102_400;
|
|
619
|
+
// Collect all chunks from the raw request stream.
|
|
620
|
+
const chunks = [];
|
|
621
|
+
let totalSize = 0;
|
|
622
|
+
for await (const chunk of req) {
|
|
623
|
+
totalSize += chunk.length;
|
|
624
|
+
if (totalSize > maxSize)
|
|
625
|
+
throw { status: 413, message: 'Content Too Large' };
|
|
626
|
+
chunks.push(chunk);
|
|
627
|
+
}
|
|
628
|
+
const body = Buffer.concat(chunks);
|
|
629
|
+
const contentType = req.headers['content-type'] ?? '';
|
|
630
|
+
const parts = parseMultipartBody(contentType, body);
|
|
631
|
+
for (const part of parts) {
|
|
632
|
+
// Expose each part's Buffer content as a Readable stream so callers can
|
|
633
|
+
// pipe, pipeline, or iterate it uniformly.
|
|
634
|
+
yield { headers: part.headers, stream: Readable.from(part.content) };
|
|
635
|
+
}
|
|
636
|
+
}
|
|
452
637
|
// ---------------------------------------------------------------------------
|
|
453
638
|
// Logger middleware
|
|
454
639
|
// ---------------------------------------------------------------------------
|
|
@@ -504,7 +689,7 @@ const ANSI_RESET = '\x1b[0m';
|
|
|
504
689
|
* }));
|
|
505
690
|
* ```
|
|
506
691
|
*/
|
|
507
|
-
function logger(opts) {
|
|
692
|
+
export function logger(opts) {
|
|
508
693
|
const options = opts ?? {};
|
|
509
694
|
const log = options.logger ?? console.log;
|
|
510
695
|
const formatter = new Intl.DateTimeFormat(options.locale ?? 'en-GB', options.dateFormat ?? {
|
|
@@ -518,9 +703,7 @@ function logger(opts) {
|
|
|
518
703
|
// even if later middleware mutates req.path (e.g. prefix stripping).
|
|
519
704
|
const timestamp = formatter.format(new Date());
|
|
520
705
|
const requestPath = req.path ?? req.url ?? '/';
|
|
521
|
-
const ip = req.
|
|
522
|
-
?? req.socket?.remoteAddress
|
|
523
|
-
?? '-';
|
|
706
|
+
const ip = req.ip ?? '';
|
|
524
707
|
const user = options.user?.(req) ?? '-';
|
|
525
708
|
const receivedAt = Date.now();
|
|
526
709
|
// Lost-request tracking.
|
|
@@ -532,18 +715,63 @@ function logger(opts) {
|
|
|
532
715
|
res.on('finish', () => {
|
|
533
716
|
if (tracker !== null)
|
|
534
717
|
clearTimeout(tracker);
|
|
718
|
+
const host = req.headers.host;
|
|
535
719
|
const elapsed = Date.now() - receivedAt;
|
|
536
|
-
// BUG FIX: Math.floor is more explicit and correct than parseInt for
|
|
537
|
-
// integer division. Both work, but parseInt(200/100) has a subtle
|
|
538
|
-
// coercion to string first. Math.floor is semantically clearer.
|
|
539
720
|
const statusClass = Math.floor(res.statusCode / 100);
|
|
540
721
|
const colour = STATUS_COLORS[statusClass] ?? STATUS_COLORS[0];
|
|
541
722
|
const statusStr = `${colour}${res.statusCode}${ANSI_RESET}`;
|
|
542
723
|
const contentLen = res.getHeader('content-length') ?? '-';
|
|
543
|
-
|
|
724
|
+
if (options.json === true)
|
|
725
|
+
log({
|
|
726
|
+
timestamp,
|
|
727
|
+
status: res.statusCode,
|
|
728
|
+
method: req.method,
|
|
729
|
+
path: requestPath,
|
|
730
|
+
ip,
|
|
731
|
+
user,
|
|
732
|
+
elapsed,
|
|
733
|
+
host,
|
|
734
|
+
length: contentLen,
|
|
735
|
+
});
|
|
736
|
+
else
|
|
737
|
+
log(`${timestamp} ${statusStr} ${req.method} ${requestPath} ${ip} <${user}> ${elapsed}ms (${contentLen})`);
|
|
544
738
|
});
|
|
545
739
|
next();
|
|
546
740
|
};
|
|
547
741
|
}
|
|
548
|
-
|
|
742
|
+
export function cors(opts) {
|
|
743
|
+
const options = {
|
|
744
|
+
origin: opts?.origin || '*',
|
|
745
|
+
allowHeaders: opts?.allowHeaders || 'Accept, Content-Type, Authorization',
|
|
746
|
+
allowMethods: opts?.allowMethods || 'GET,HEAD,PUT,PATCH,POST,DELETE',
|
|
747
|
+
allowCredentials: opts?.allowCredentials,
|
|
748
|
+
maxAge: opts?.maxAge,
|
|
749
|
+
vary: opts?.vary,
|
|
750
|
+
optionsStatus: opts?.optionsStatus || 204,
|
|
751
|
+
preflight: opts?.preflight,
|
|
752
|
+
};
|
|
753
|
+
return (req, res, next) => {
|
|
754
|
+
if (options.preflight && !options.preflight(req)) {
|
|
755
|
+
res.status(req.method == 'OPTIONS' ? 403 : 400).end();
|
|
756
|
+
return;
|
|
757
|
+
}
|
|
758
|
+
if (req.headers.origin) {
|
|
759
|
+
res.setHeader('Access-Control-Allow-Origin', options.origin);
|
|
760
|
+
if (options.vary !== undefined)
|
|
761
|
+
res.setHeader('Vary', options.vary);
|
|
762
|
+
}
|
|
763
|
+
if (req.method == 'OPTIONS') {
|
|
764
|
+
res.setHeader('Access-Control-Allow-Headers', options.allowHeaders);
|
|
765
|
+
res.setHeader('Access-Control-Allow-Methods', options.allowMethods);
|
|
766
|
+
if (options.allowCredentials !== undefined)
|
|
767
|
+
res.setHeader('Access-Control-Allow-Credentials', options.allowCredentials ? 'true' : 'false');
|
|
768
|
+
if (options.maxAge !== undefined)
|
|
769
|
+
res.setHeader('Access-Control-Max-Age', options.maxAge.toFixed(0));
|
|
770
|
+
res.status(options.optionsStatus).end();
|
|
771
|
+
return;
|
|
772
|
+
}
|
|
773
|
+
next();
|
|
774
|
+
};
|
|
775
|
+
}
|
|
776
|
+
export default { json, formData, formEncoded, parseBody, logger, cors, streamFormData };
|
|
549
777
|
//# sourceMappingURL=misc.js.map
|
package/dist/misc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"misc.js","sourceRoot":"","sources":["../src/misc.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"misc.js","sourceRoot":"","sources":["../src/misc.ts"],"names":[],"mappings":"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"}
|