moleculer-web-uws
Version:
The `moleculer-web-uws` is a fast API gateway service for Moleculer based on µWebSockets.js server. Use it to publish your services over HTTP and WebSockets.
77 lines (62 loc) • 2.32 kB
JavaScript
const { getParts } = require('uWebSockets.js');
const { Readable } = require('stream');
function multipart(req, res, opts = {}) {
const fieldsLimit = Number(opts.fields || 0);
const filesLimit = Number(opts.files || 0);
const fileSizeLimit = Number(opts.fileSize || 0);
return new Promise((resolve, reject) => {
const contentType = req.headers['content-type'];
let buffer;
let fields = {};
let files = [];
let fileSizeLimitExceeded = false;
let filesLimitExceeded = false;
let fieldsLimitExceeded = false;
let numOfFiles = 0;
let numOfFields = 0;
res.onData((chunk, isLast) => {
const curBuf = Buffer.from(chunk);
buffer = buffer ? Buffer.concat([buffer, curBuf]) : isLast ? curBuf : Buffer.concat([curBuf]);
if (isLast) {
if (!buffer)
return reject(new Error('No multipart form data recieved!'));
const parts = getParts(buffer, contentType);
const partsLen = parts.length;
if (!parts)
return reject(new Error('Could not parse form data content. Maybe incorrect Content-Type!'));
for (let i = 0; i < partsLen; i++) {
let { name, data, type, filename } = parts[i];
if (filename) {
const fileSize = data.byteLength;
if (0 < fileSize && fileSize > fileSizeLimit)
fileSizeLimitExceeded = true;
data = Readable.from(Buffer.from(data));
files[numOfFiles] = { fieldname: name, data, type, filename, size: fileSize };
numOfFiles++;
} else {
try {
data = JSON.parse(Buffer.from(data).toString());
} catch(err) {
data = Buffer.from(data).toString();
}
fields[name] = data;
numOfFields++;
}
}
if (0 < filesLimit && filesLimit > numOfFiles)
filesLimitExceeded = true;
if (0 < fieldsLimit && fieldsLimit > numOfFields)
fieldsLimitExceeded = true;
return resolve({
fields,
files,
fileSizeLimitExceeded,
filesLimitExceeded,
fieldsLimitExceeded
})
}
})
});
}
module.exports = multipart;