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.
82 lines (63 loc) • 1.81 kB
JavaScript
;
const Readable = require('stream').Readable;
const parsers = {
json: (buffer) => {
buffer = buffer.toString();
try {
buffer = JSON.parse(buffer);
} catch (err) {}
return buffer;
},
urlencoded: (buffer) => {
const parsed = {};
let decoded = buffer.toString();
try {
decoded = decodeURIComponent(decoded);
} catch(err) {}
const pairs = decoded.split('&');
for (let i = 0, len = pairs.length; i < len; i++) {
let k = pairs[i].split('=');
parsed[k[0]] = k[1];
}
return parsed;
},
text: (buffer) => {
return buffer.toString();
},
stream: (buffer) => {
return Readable.from(buffer);
}
}
function bodyParser(parser, req, res) {
let fnParser;
let buffer;
const contentType = req.headers['content-type'];
if (parser === 'any') {
if (contentType) {
if (contentType.indexOf('json') !== -1)
fnParser = parsers['json'];
else if (contentType.indexOf('text') !== -1)
fnParser = parsers['text'];
else if (contentType.indexOf('urlencoded') !== -1)
fnParser = parsers['urlencoded'];
}
} else
fnParser = parsers[parser];
return new Promise((resolve, reject) => {
res.onData((chunk, isLast) => {
chunk = Buffer.from(chunk);
if (isLast) {
buffer = buffer ? Buffer.concat([buffer, chunk]) : chunk;
try {
resolve(fnParser ? fnParser(buffer) : buffer);
} catch (err) {
res.close();
reject(err);
}
} else
buffer = buffer ? Buffer.concat([buffer, chunk]) : Buffer.concat([chunk]);
});
res.onAborted(() => { reject(null) });
})
}
module.exports = bodyParser