Maps proxy protocols to http.Agent implementations
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Proxy Agent provides an HTTP Agent implementation that automatically uses proxy servers based on environment variables. It maps various proxy protocols (HTTP, HTTPS, SOCKS4/5, PAC) to their corresponding proxy agent implementations, using an LRU cache for efficient agent reuse.
npm install proxy-agentimport { ProxyAgent, proxies } from "proxy-agent";
import type { ProxyAgentOptions } from "proxy-agent";For CommonJS:
const { ProxyAgent, proxies } = require("proxy-agent");import * as https from 'https';
import { ProxyAgent } from 'proxy-agent';
// The correct proxy Agent implementation to use will be determined
// via the http_proxy / https_proxy / no_proxy / etc. env vars
const agent = new ProxyAgent();
// The rest works just like any other normal HTTP request
https.get('https://jsonip.com', { agent }, (res) => {
console.log(res.statusCode, res.headers);
res.pipe(process.stdout);
});Proxy Agent is built around several key components:
proxy-from-env module to determine proxy configuration from standard environment variablesMain HTTP Agent implementation that extends the Agent class from agent-base. Automatically detects and uses proxy servers based on environment variables.
/**
* 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 {
constructor(opts?: ProxyAgentOptions);
/** Cache for Agent instances */
cache: LRUCache<string, Agent>;
/** Stored connection options */
connectOpts?: ProxyAgentOptions;
/** Default HTTP agent for non-proxy requests */
httpAgent: http.Agent;
/** Default HTTPS agent for non-proxy requests */
httpsAgent: http.Agent;
/** Function to determine proxy for given URL */
getProxyForUrl: GetProxyForUrlCallback;
/**
* Main connection method that selects appropriate agent based on proxy configuration
* @param req - The HTTP request
* @param opts - Connection options from agent-base
* @returns Promise resolving to the appropriate agent for the request
*/
connect(req: http.ClientRequest, opts: AgentConnectOpts): Promise<http.Agent>;
/**
* Destroys all cached agents and cleans up resources
*/
destroy(): void;
}Usage Examples:
import { ProxyAgent } from 'proxy-agent';
// Basic usage with environment variables
const agent = new ProxyAgent();
// With custom options
const agent = new ProxyAgent({
keepAlive: true,
timeout: 5000,
rejectUnauthorized: false
});
// With custom proxy resolution
const agent = new ProxyAgent({
getProxyForUrl: (url, req) => {
// Custom logic to determine proxy
return 'http://my-proxy.com:8080';
}
});
// Access the cache
console.log(`Current cache size: ${agent.cache.size}`);
// Cleanup when done
agent.destroy();Configuration options for creating a ProxyAgent instance.
interface ProxyAgentOptions extends
HttpProxyAgentOptions<''>,
HttpsProxyAgentOptions<''>,
SocksProxyAgentOptions,
PacProxyAgentOptions<''> {
/**
* Default http.Agent instance to use when no proxy is
* configured for a request. Defaults to a new http.Agent()
* instance with the proxy agent options passed in.
*/
httpAgent?: http.Agent;
/**
* Default https.Agent instance to use when no proxy is
* configured for a request. Defaults to a new https.Agent()
* instance with the proxy agent options passed in.
*/
httpsAgent?: http.Agent;
/**
* A callback for dynamic provision of proxy for url.
* Defaults to standard proxy environment variables,
* see https://www.npmjs.com/package/proxy-from-env for details
*/
getProxyForUrl?: GetProxyForUrlCallback;
}Function type for custom proxy URL resolution.
/**
* Function type for custom proxy URL resolution
* @param url - The target URL being requested
* @param req - The HTTP client request object
* @returns Proxy URL string, or empty string for no proxy, or Promise resolving to same
*/
interface GetProxyForUrlCallback {
(url: string, req: http.ClientRequest): string | Promise<string>;
}Exported constant that maps proxy protocols to their corresponding agent constructors. This is primarily for advanced usage or integration purposes.
/**
* Exported constant mapping proxy protocols to agent constructors
* [0] = constructor for HTTP requests
* [1] = constructor for HTTPS/WebSocket requests
*/
export const proxies: {
[P in ValidProtocol]: [
() => Promise<AgentConstructor>,
() => Promise<AgentConstructor>
];
};
type ValidProtocol =
| 'http' // HTTP proxy: http://proxy-server.com:3128
| 'https' // HTTPS proxy: https://proxy-server.com:3129
| 'socks' // SOCKS5 proxy: socks://username:password@proxy.com:9050
| 'socks4' // SOCKS4 proxy: socks4://proxy.com:9050
| 'socks4a' // SOCKS4A proxy: socks4a://proxy.com:9050
| 'socks5' // SOCKS5 proxy: socks5://username:password@proxy.com:9050
| 'socks5h' // SOCKS5 with hostname resolution: socks5h://proxy.com:9050
| 'pac+data' // PAC with data URL: pac+data:application/x-ns-proxy-autoconfig;base64,...
| 'pac+file' // PAC with file URL: pac+file:///path/to/proxy.pac
| 'pac+ftp' // PAC with FTP URL: pac+ftp://server/proxy.pac
| 'pac+http' // PAC with HTTP URL: pac+http://server/proxy.pac
| 'pac+https'; // PAC with HTTPS URL: pac+https://server/proxy.pacThe package automatically respects standard proxy environment variables:
Example configuration:
export HTTP_PROXY=http://proxy.company.com:8080
export HTTPS_PROXY=https://secure-proxy.company.com:8443
export NO_PROXY=localhost,127.0.0.1,.company.com// Re-exported from dependencies for convenience
import type { Agent, AgentConnectOpts } from 'agent-base';
import type { PacProxyAgentOptions } from 'pac-proxy-agent';
import type { HttpProxyAgentOptions } from 'http-proxy-agent';
import type { HttpsProxyAgentOptions } from 'https-proxy-agent';
import type { SocksProxyAgentOptions } from 'socks-proxy-agent';
/**
* Constructor type for proxy agent implementations
*/
interface AgentConstructor {
new (proxy: string, proxyAgentOptions?: ProxyAgentOptions): Agent;
}The ProxyAgent will throw errors in the following cases:
Unsupported Protocol: When an unsupported proxy protocol is encountered
// Throws: "Unsupported protocol for proxy URL: ftp://proxy.com"Invalid Proxy URL: When the proxy URL cannot be parsed
Connection Failures: Standard HTTP/HTTPS connection errors from underlying agents
Common error handling pattern:
import { ProxyAgent } from 'proxy-agent';
import * as https from 'https';
const agent = new ProxyAgent();
const request = https.get('https://api.example.com', { agent }, (res) => {
// Handle response
});
request.on('error', (err) => {
if (err.message.includes('Unsupported protocol')) {
console.error('Invalid proxy configuration:', err.message);
} else {
console.error('Request failed:', err.message);
}
});