@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
JavaScript
;
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