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.

89 lines 3.13 kB
import { createProxyMiddleware } from 'http-proxy-middleware'; import { logger } from '../../../../../logs/index.js'; import { applyZodSchema } from '../schema-helper.js'; export 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') { 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 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 { logger.warn(`ExpressApiAdapter: Hook '${handler.name}' is not supported in Express. ` + `Supported hooks: onRequest, preHandler.`); } } registerProxy(config) { this.server.use(config.prefix, 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; } } //# sourceMappingURL=express.js.map