Proxy Auto Configuration (PAC) file generator & maintenance tool.
Features:
- Generate PAC files from various hostname sources.
- Load a PAC file and use it in node.
- Serve the PAC with http and watch for source change.
- Show what hosts in browser history will be proxied by the PAC.
Just use pre-generated PAC file: proxy.pac
pac-maker requires NodeJS >= 16, older versions are not tested.
npm install pac-maker
pac-maker loads config file from working directory, default is pac.config.js
, it can be specified by --config=<path>
.
config file should export a configuration object:
import { builtinList, gfwlist, ofArray } from "pac-maker";
export default {
path: "dist/proxy.pac",
direct: "DIRECT",
sources: {
"SOCKS5 localhost:2080": [
gfwlist(),
builtinList("default"),
builtinList("forbidden"),
ofArray(["google.com"]),
],
},
};
There are some built-in sources in pac-maker:
-
gfwlist
Fetch hostnames from gfwlist. -
hostnameFile
Read hostnames from a file, for hostname file example, see the list directory. -
builtinList
Read hostnames from a file in the list directory. -
ofArray
Just use an array of hostnames
Generate a PAC file:
node bin/pac-maker.js generate [--config=<path>] [--watch]
--watch
After the initial build, pac-maker will continue to watch for updates in any of the sources.
Find what hosts will be proxied by the PAC in browser history, support Chrome, Firefox, and Edge:
node bin/pac-maker.js analyze [--config=<path>] [--json=<path>]
--json
Save matched rules to this file, default ismatches.json
.
Serve the PAC file with http, and update when source have changes:
node bin/pac-maker.js serve [--config=<file>] [--host=<host>] [--port=<port>]
-
--host
By default, the server will accept connections from all addresses, It is possible to listen to just one selected interface using thehost
parameter. -
--port
The port number that http server to listened on, default is7568
.
pac-maker exports some useful functions that allows you to play with PAC inside your own JavaScript program.
This package is pure ESM, It cannot be require()
'd from CommonJS.
Create a PAC script from rules, use the built-in template template/default.js
.
The function takes two parameters, first is a rules object which key is
a proxy string
, and value is a hostname array. the second parameter will be returned from FindProxyForURL
if no hostname matched,
default is DIRECT
.
import { writeFileSync } from "fs";
import { buildPAC } from "pac-maker";
const rules = {
"HTTP 192.168.0.1:80": ["foo.com", "bar.com"],
"SOCKS5 localhost:1080": ["example.com"],
};
writeFileSync("proxy.pac", buildPAC(rules));
Load and execute PAC script, return an object includes all global variables defined in the PAC.
import { readFileSync } from "fs";
import { loadPAC } from "pac-maker";
const pac = loadPAC(readFileSync("proxy.pac", "utf8"));
console.log(pac.FindProxyForURL("", "example.com"));
All commands supported by pac-maker
can also be called in JavaScript code.
import { commands } from "pac-maker";
import config from "./pac.config.js";
commands.serve({ host: "localhost", port: 12345 }, config);
To run unit tests, you need enable experimental vm modules.
set NODE_OPTIONS=--experimental-vm-modules
pnpm test
NOTE: Some tests may fail with the error Provided module is not an instance of Module
, that is a bug in v8.