express-msgpack
Version:
Transparent MessagePack middleware for Express
49 lines (48 loc) • 1.56 kB
JavaScript
import readBody from "raw-body";
export default (overrides = {}) => {
const optionsPromise = createOptions(overrides);
return async (req, res, next) => {
try {
const options = await optionsPromise;
const _json = res.json;
res.json = (body) => {
return res.format({
"application/json": () => _json.call(res, body),
[options.mimeType]: () => res.send(options.encoder(body)),
});
};
if (new RegExp(`^${options.mimeType}`, "i").test(req.header("Content-Type") ?? "")) {
return readBody(req, { length: req.header("Content-Length"), limit: options.limit }, bodyHandler(options, req, next));
}
next();
}
catch (err) {
next(err);
}
};
};
const bodyHandler = (options, req, next) => (err, body) => {
if (err) {
return next(err);
}
try {
req.body = options.decoder(body);
}
catch (err) {
return next(err);
}
req._body = true;
next();
};
const createOptions = async (overrides) => {
return {
decoder: overrides.decoder
?? await import("@msgpack/msgpack").then(({ decode }) => decode),
encoder: overrides.encoder
?? await import("@msgpack/msgpack").then(({ encode }) => (body) => Buffer.from(encode(body))),
limit: overrides.limit
?? "100kb",
mimeType: overrides.mimeType
?? "application/msgpack",
};
};