UNPKG

filesrocket

Version:

Filesrocket is a Node.js package that takes care of the file management of any cloud storage service (Local, Cloudinary, Amazon S3)

101 lines 4.43 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.FileController = void 0; const busboy_1 = __importDefault(require("busboy")); const path_1 = __importDefault(require("path")); const errors_1 = require("../errors"); const base_controller_1 = require("./base.controller"); const utils_1 = require("../utils"); const counter_1 = require("../helpers/counter"); class FileController extends base_controller_1.BaseController { constructor(service) { super(service); this.service = service; } async create(req, params = {}) { return new Promise((resolve, reject) => { const contentType = req.headers['content-type']; if (!contentType || !contentType.includes('multipart')) { return resolve([]); } const bb = (0, busboy_1.default)({ ...params, headers: req.headers }); const counter = new counter_1.Counter(); const uploadedFiles = []; let isReadingFinished = false; req.body = Object.create(null); function done(err) { if (!err && counter.isZero && isReadingFinished) { req.unpipe(bb); bb.removeAllListeners(); return resolve(uploadedFiles); } if (err) { req.unpipe(bb); bb.removeAllListeners(); return reject(err); } } const saveFile = async (payload) => { if (typeof this.service.create !== 'function') { return reject(new errors_1.NotImplemented('Method has not been implemented')); } const file = await this.service.create(payload, params.query); uploadedFiles.push(file); counter.decrement(); done(); }; // Manage text fields bb.on('field', (fieldname, value, { nameTruncated, valueTruncated }) => { if (!fieldname) { return done(new errors_1.BadRequest('MISSING_FIELDNAME')); } if (nameTruncated) { return done(new errors_1.BandwidthLimitExceeded('FIELDNAME_LIMIT_EXCEEDED')); } if (valueTruncated) { return done(new errors_1.BandwidthLimitExceeded('VALUE_LIMIT_EXCEEDED')); } req.body = Object.assign(req.body, { [fieldname]: value }); }); // Manage files bb.on('file', async (fieldname, stream, { filename, encoding, mimeType }) => { if (!filename) return stream.resume(); const payload = { fieldname, name: (0, utils_1.generateRandomFilename)(filename), stream, encoding, mimetype: mimeType }; counter.increment(); const extnames = params.extnames || []; // Not required extension if (!extnames.length) { return saveFile(payload); } const { ext } = path_1.default.parse(filename); // Extension not allowed if (!extnames.includes(ext)) { counter.decrement(); return stream.resume(); } return saveFile(payload); }); bb.on('finish', () => { isReadingFinished = true; done(); }); bb.on('error', (err) => done(err)); bb.on('fieldsLimit', () => done(new errors_1.BandwidthLimitExceeded('FIELDS_LIMIT_EXCEEDED'))); bb.on('filesLimit', () => done(new errors_1.BandwidthLimitExceeded('FILES_LIMIT_EXCEEDED'))); bb.on('partsLimit', () => done(new errors_1.BandwidthLimitExceeded('PARTS_LIMIT_EXCEEDED'))); req.pipe(bb); }); } } exports.FileController = FileController; //# sourceMappingURL=file.controller.js.map