UNPKG

@xapi-js/adaptor-express

Version:

Express.js adaptor for X-API.

30 lines (29 loc) 1.55 kB
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 };