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
JavaScript
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
;