UNPKG

@marblejs/middleware-multipart

Version:

A multipart/form-data middleware for Marble.js

36 lines (35 loc) 2.23 kB
"use strict"; 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;