@xapi-js/adaptor-express
Version:
Express.js adaptor for X-API.
30 lines (29 loc) • 1.55 kB
JavaScript
import { decodeRoot, decodeXapiWire, encodeRoot, encodeXapiWire, parse, write, xapiBodyToBytes, xapiContentType, xapiContentTypeMatches } from "@xapi-js/core";
//#region src/index.ts
function xapiExpress(operationOrHandler, operationHandlerOrOptions, adapterOptions) {
const operation = typeof operationOrHandler === "function" ? void 0 : operationOrHandler;
const handler = typeof operationOrHandler === "function" ? operationOrHandler : operationHandlerOrOptions;
const options = typeof operationOrHandler === "function" ? operationHandlerOrOptions : adapterOptions;
return createMiddleware(async (req, res, next) => {
const codec = operation?.codec ?? options?.codec;
const contentType = codec === void 0 ? "application/xml" : xapiContentType(codec);
if (!xapiContentTypeMatches(req.headers["content-type"], codec)) return next();
try {
const requestRoot = codec === void 0 ? parse(req.body) : decodeXapiWire(xapiBodyToBytes(req.body), codec);
const request = operation ? decodeRoot(operation.request, requestRoot) : requestRoot;
const response = await handler(request);
const responseRoot = operation ? encodeRoot(operation.response, response) : response;
const output = codec === void 0 ? write(responseRoot) : encodeXapiWire(responseRoot, codec);
res.setHeader("Content-Type", contentType);
res.write(output);
res.end();
} catch (error) {
next(error);
}
});
}
function createMiddleware(middleware) {
return async (req, res, next) => middleware(req, res, next);
}
//#endregion
export { xapiExpress };