"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ProxyAgent = exports.proxies = void 0; const http = __importStar(require("http")); const https = __importStar(require("https")); const lru_cache_1 = __importDefault(require("lru-cache")); const agent_base_1 = require("agent-base"); const debug_1 = __importDefault(require("debug")); const proxy_from_env_1 = require("proxy-from-env"); const pac_proxy_agent_1 = require("pac-proxy-agent"); const http_proxy_agent_1 = require("http-proxy-agent"); const https_proxy_agent_1 = require("https-proxy-agent"); const socks_proxy_agent_1 = require("socks-proxy-agent"); const debug = (0, debug_1.default)('proxy-agent'); const PROTOCOLS = [ ...http_proxy_agent_1.HttpProxyAgent.protocols, ...socks_proxy_agent_1.SocksProxyAgent.protocols, ...pac_proxy_agent_1.PacProxyAgent.protocols, ]; /** * Supported proxy types. */ exports.proxies = { http: [http_proxy_agent_1.HttpProxyAgent, https_proxy_agent_1.HttpsProxyAgent], https: [http_proxy_agent_1.HttpProxyAgent, https_proxy_agent_1.HttpsProxyAgent], socks: [socks_proxy_agent_1.SocksProxyAgent, socks_proxy_agent_1.SocksProxyAgent], socks4: [socks_proxy_agent_1.SocksProxyAgent, socks_proxy_agent_1.SocksProxyAgent], socks4a: [socks_proxy_agent_1.SocksProxyAgent, socks_proxy_agent_1.SocksProxyAgent], socks5: [socks_proxy_agent_1.SocksProxyAgent, socks_proxy_agent_1.SocksProxyAgent], socks5h: [socks_proxy_agent_1.SocksProxyAgent, socks_proxy_agent_1.SocksProxyAgent], 'pac+data': [pac_proxy_agent_1.PacProxyAgent, pac_proxy_agent_1.PacProxyAgent], 'pac+file': [pac_proxy_agent_1.PacProxyAgent, pac_proxy_agent_1.PacProxyAgent], 'pac+ftp': [pac_proxy_agent_1.PacProxyAgent, pac_proxy_agent_1.PacProxyAgent], 'pac+http': [pac_proxy_agent_1.PacProxyAgent, pac_proxy_agent_1.PacProxyAgent], 'pac+https': [pac_proxy_agent_1.PacProxyAgent, pac_proxy_agent_1.PacProxyAgent], }; function isValidProtocol(v) { return PROTOCOLS.includes(v); } /** * Uses the appropriate `Agent` subclass based off of the "proxy" * environment variables that are currently set. * * An LRU cache is used, to prevent unnecessary creation of proxy * `http.Agent` instances. */ class ProxyAgent extends agent_base_1.Agent { constructor(opts) { super(opts); /** * Cache for `Agent` instances. */ this.cache = new lru_cache_1.default({ max: 20 }); debug('Creating new ProxyAgent instance: %o', opts); this.connectOpts = opts; this.httpAgent = opts?.httpAgent || new http.Agent(opts); this.httpsAgent = opts?.httpsAgent || new https.Agent(opts); this.getProxyForUrl = opts?.getProxyForUrl || proxy_from_env_1.getProxyForUrl; } async connect(req, opts) { const { secureEndpoint } = opts; const isWebSocket = req.getHeader('upgrade') === 'websocket'; const protocol = secureEndpoint ? isWebSocket ? 'wss:' : 'https:' : isWebSocket ? 'ws:' : 'http:'; const host = req.getHeader('host'); const url = new URL(req.path, `${protocol}//${host}`).href; const proxy = this.getProxyForUrl(url); if (!proxy) { debug('Proxy not enabled for URL: %o', url); return secureEndpoint ? this.httpsAgent : this.httpAgent; } debug('Request URL: %o', url); debug('Proxy URL: %o', proxy); // attempt to get a cached `http.Agent` instance first const cacheKey = `${protocol}+${proxy}`; let agent = this.cache.get(cacheKey); if (!agent) { const proxyUrl = new URL(proxy); const proxyProto = proxyUrl.protocol.replace(':', ''); if (!isValidProtocol(proxyProto)) { throw new Error(`Unsupported protocol for proxy URL: ${proxy}`); } const ctor = exports.proxies[proxyProto][secureEndpoint || isWebSocket ? 1 : 0]; // @ts-expect-error meh… agent = new ctor(proxy, this.connectOpts); this.cache.set(cacheKey, agent); } else { debug('Cache hit for proxy URL: %o', proxy); } return agent; } destroy() { for (const agent of this.cache.values()) { agent.destroy(); } super.destroy(); } } exports.ProxyAgent = ProxyAgent; //# sourceMappingURL=index.js.map