{"version":3,"sources":["../../../../src/lib/A-ServerProxy/A-ServerProxy.component.ts"],"names":[],"mappings":"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","file":"A-ServerProxy.component.mjs","sourcesContent":["import { A_Component, A_Concept, A_Feature, A_Inject } from \"@adaas/a-concept\";\nimport { A_HttpServerFeatures } from \"@adaas/a-server/server/A-HttpServer.constants\";\nimport { A_ProxyConfig } from \"./A-ServerProxy.context\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\nimport { A_Logger, A_LOGGER_COLORS } from \"@adaas/a-utils/a-logger\";\nimport { A_Polyfill } from \"@adaas/a-utils/a-polyfill\";\n\n\nexport class A_ServerProxy extends A_Component {\n\n\n    @A_Concept.Load()\n    async load(\n        @A_Inject(A_Logger) logger: A_Logger,\n        @A_Inject(A_ProxyConfig) config: A_ProxyConfig\n    ) {\n        logger.info(\n            'green',\n            `Proxy routes configured:`,\n            ...config.configs.map(c => `${c.route.toString()} -> ${c.protocol}//${c.hostname}:${c.port}`)\n        );\n    }\n\n\n\n    @A_Feature.Extend({\n        name: A_HttpServerFeatures.onRequest,\n        before:/.*/\n    })\n    async onRequest(\n        @A_Inject(A_Request) req: A_Request,\n        @A_Inject(A_Response) res: A_Response,\n        @A_Inject(A_ProxyConfig) proxyConfig: A_ProxyConfig,\n        @A_Inject(A_Logger) logger: A_Logger,\n        @A_Inject(A_Polyfill) polyfill: A_Polyfill,\n        @A_Inject(A_Feature) feature: A_Feature\n    ) {\n        return new Promise<void>(async (resolve, reject) => {\n            const { method, url } = req;\n\n            const route = new A_ServerRoute(url, method);\n            const config = proxyConfig.config(route.toString());\n\n            if (!config) {\n                return resolve(); // nothing to proxy\n            }\n\n            logger.log(\n                \"yellow\",\n                `Proxying request ${method} ${url} to ${config.hostname}`,\n                config\n            );\n\n            const client = await (config.protocol === \"https:\"\n                ? polyfill.https()\n                : polyfill.http());\n\n            const proxyReq = client.request(\n                {\n                    method: config.route.method,\n                    hostname: config.hostname,\n                    port: config.port,\n                    headers: config.headers,\n                    path: route.path,\n                },\n                (proxyRes) => {\n                    if (!res.headersSent) {\n                        res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);\n                    }\n                    proxyRes.on(\"end\", () => {\n\n                        logger.log(\"green\", `Proxy request to ${config?.hostname} completed`);\n\n                        resolve();\n                    });\n\n                    proxyRes.pipe(res.original);\n                }\n            );\n\n            proxyReq.on(\"error\", (err) => reject(err));\n\n            req.pipe(proxyReq);\n\n            feature.interrupt();\n        });\n    }\n\n}"]}