@marblejs/middleware-multipart
Version:
A multipart/form-data middleware for Marble.js
36 lines (35 loc) • 2.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseMultipart = void 0;
const Busboy = require("@fastify/busboy");
const http_1 = require("@marblejs/http");
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const multipart_parser_field_1 = require("./multipart.parser.field");
const multipart_parser_file_1 = require("./multipart.parser.file");
const parseMultipart = (opts) => (req) => {
const busboy = new Busboy.Busboy({
headers: req.headers,
limits: {
fileSize: opts.maxFileSize,
files: opts.maxFileCount,
fields: opts.maxFieldCount,
fieldSize: opts.maxFieldSize,
},
});
const finish$ = (0, rxjs_1.fromEvent)(busboy, 'finish').pipe((0, operators_1.share)());
const parseFile$ = (0, multipart_parser_file_1.parseFile)(req)(opts)((0, rxjs_1.fromEvent)(busboy, 'file'), finish$);
const parseField$ = (0, multipart_parser_field_1.parseField)(req)((0, rxjs_1.fromEvent)(busboy, 'field'), finish$);
const filesLimit$ = (0, rxjs_1.fromEvent)(busboy, 'filesLimit').pipe((0, operators_1.takeUntil)(finish$), (0, operators_1.mergeMap)(() => (0, rxjs_1.throwError)(() => new http_1.HttpError(`Reached max files count limit [${opts.maxFileCount}]`, http_1.HttpStatus.PRECONDITION_FAILED, undefined, req))), (0, operators_1.defaultIfEmpty)(true));
const fieldsLimit$ = (0, rxjs_1.fromEvent)(busboy, 'fieldsLimit').pipe((0, operators_1.takeUntil)(finish$), (0, operators_1.mergeMap)(() => (0, rxjs_1.throwError)(() => new http_1.HttpError(`Reached max fields count limit [${opts.maxFieldCount}]`, http_1.HttpStatus.PRECONDITION_FAILED, undefined, req))), (0, operators_1.defaultIfEmpty)(true));
req.pipe(busboy);
return (0, rxjs_1.forkJoin)([
filesLimit$,
fieldsLimit$,
parseFile$,
parseField$,
]).pipe((0, operators_1.map)(() => req), (0, operators_1.catchError)((error) => (0, http_1.isHttpError)(error)
? (0, rxjs_1.throwError)(() => error)
: (0, rxjs_1.throwError)(() => new http_1.HttpError(error.message, http_1.HttpStatus.INTERNAL_SERVER_ERROR, undefined, req))));
};
exports.parseMultipart = parseMultipart;