What is pac-resolver?
The pac-resolver package is a module for Node.js that allows you to parse and execute PAC (Proxy Auto-Configuration) files to determine the appropriate proxy for a given URL. PAC files are written in JavaScript and are used to specify whether web browsers should direct traffic through a proxy server or connect directly.
What are pac-resolver's main functionalities?
Executing PAC Scripts
This feature allows you to execute a PAC script to determine the proxy for a given URL. The code sample demonstrates how to create a simple PAC function that always returns 'DIRECT', meaning no proxy is used.
const pac = require('pac-resolver');
const FindProxyForURL = pac('function FindProxyForURL(url, host) { return 'DIRECT'; }');
FindProxyForURL('http://example.com').then(console.log); // 'DIRECT'
Asynchronous PAC Script Execution
This feature allows for asynchronous execution of PAC scripts using async/await syntax. The code sample demonstrates how to define a PAC function that specifies a proxy server and then asynchronously retrieves the proxy for a URL.
const pac = require('pac-resolver');
const FindProxyForURL = pac('function FindProxyForURL(url, host) { return 'PROXY proxy.example.com:8080'; }');
(async () => {
const proxy = await FindProxyForURL('http://example.com');
console.log(proxy); // 'PROXY proxy.example.com:8080'
})();
Other packages similar to pac-resolver
proxy-agent
The proxy-agent package is similar to pac-resolver in that it provides a way to determine the correct proxy settings for HTTP requests. It supports multiple proxy protocols and can be used with PAC files. Unlike pac-resolver, which focuses solely on PAC file resolution, proxy-agent integrates with Node.js's http module to automatically apply proxy settings to HTTP requests.
proxy-from-env
The proxy-from-env package is designed to read proxy settings from environment variables. It provides a simple interface for determining the proxy for a given URL based on standard environment variables like HTTP_PROXY, HTTPS_PROXY, and NO_PROXY. While it does not execute PAC files, it serves a similar purpose in managing proxy configurations for applications.
pac-resolver
Generates an asynchronous resolver function from a PAC file
This module accepts a JavaScript String of code, which is meant to be a
PAC proxy file, and returns a generated asynchronous
FindProxyForURL()
function.
Example
Given the PAC proxy file named proxy.pac
:
function FindProxyForURL(url, host) {
if (isInNet(myIpAddress(), "10.1.10.0", "255.255.255.0")) {
return "PROXY 1.2.3.4:8080";
} else {
return "DIRECT";
}
}
You can consume this PAC file with pac-resolver
like so:
import { readFileSync } from 'fs';
import { createPacResolver } from 'pac-resolver';
const FindProxyForURL = createPacResolver(readFileSync('proxy.pac'));
const res = await FindProxyForURL('http://foo.com/');
console.log(res);
API
pac(qjs: QuickJSWASMModule, pacFileContents: string | Buffer, options?: PacResolverOptions) → Function
Returns an asynchronous FindProxyForURL()
function based off of the given JS
string pacFileContents
PAC proxy file. An optional options
object may be
passed in which respects the following options:
filename
- String - the filename to use in error stack traces. Defaults to proxy.pac
.sandbox
- Object - a map of functions to include in the sandbox of the
JavaScript environment where the JS code will be executed. i.e. if you wanted to
include the common alert
function you could pass alert: console.log
. For
async functions, you must set the async = true
property on the function
instance, and the JS code will be able to invoke the function as if it were
synchronous.
The qjs
parameter is a QuickJS module instance as returned from getQuickJS()
from the quickjs-emscripten
module.
License
(The MIT License)
Copyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.