UNPKG

@sentzunhat/zacatl

Version:

A modular, high-performance TypeScript microservice framework for Node.js, featuring layered architecture, dependency injection, and robust validation for building scalable APIs and distributed systems.

93 lines 3.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ExpressApiAdapter = void 0; const http_proxy_middleware_1 = require("http-proxy-middleware"); const logs_1 = require("../../../../../logs/index.js"); const schema_helper_1 = require("../schema-helper"); class ExpressApiAdapter { server; constructor(server) { this.server = server; } registerRoute(handler) { const method = handler.method.toLowerCase(); const url = handler.url; const register = this.server[method]; if (typeof register !== 'function') { logs_1.logger.warn(`ExpressApiAdapter: HTTP method '${handler.method}' is not supported by Express. ` + `Handler '${handler.constructor.name}' for '${url}' was not registered.`); return; } register.call(this.server, url, async (req, res, next) => { try { await (0, schema_helper_1.applyZodSchema)(handler.schema, req); const replyAdapter = { sent: false, code: (statusCode) => { res.status(statusCode); return replyAdapter; }, send: (payload) => { if (res.headersSent !== true) { replyAdapter.sent = true; res.json(payload); } return replyAdapter; }, header: (key, value) => { res.setHeader(key, value); return replyAdapter; }, }; await handler.execute(req, replyAdapter); if (res.headersSent !== true) { res.status(204).end(); } } catch (err) { next(err); } }); } registerHook(handler) { if (handler.name === 'onRequest' || handler.name === 'preHandler') { this.server.use(async (req, res, next) => { try { const execute = handler.execute; await execute(req, res); next(); } catch (err) { next(err); } }); } else { logs_1.logger.warn(`ExpressApiAdapter: Hook '${handler.name}' is not supported in Express. ` + `Supported hooks: onRequest, preHandler.`); } } registerProxy(config) { this.server.use(config.prefix, (0, http_proxy_middleware_1.createProxyMiddleware)({ target: config.upstream, changeOrigin: true, ...(config.rewritePrefix != null ? { pathRewrite: { [`^${config.prefix}`]: config.rewritePrefix } } : {}), })); } async listen(port) { return new Promise((resolve, reject) => { this.server .listen(port, '0.0.0.0', () => { resolve(); }) .on('error', reject); }); } getRawServer() { return this.server; } } exports.ExpressApiAdapter = ExpressApiAdapter; //# sourceMappingURL=express.js.map