Skip to content

Proxy Auto-Configuration (PAC) file generator & loader, support proxy Node's `fetch` with PAC.

License

Notifications You must be signed in to change notification settings

Kaciras/pac-maker

Repository files navigation

pac-maker

npm package node-current Test

Proxy Auto Configuration (PAC) file generator & maintenance tool.

Features:

Usage

proxy.pac

The pre-generated PAC file proxy.pac can be used to bypass GFW.

By default, it dispatches requests of blocked hosts to SOCKS5 localhost:2080, you can change the value to your proxy server address.

Install

pac-maker requires NodeJS >= 16.

npm install pac-maker

Generate PAC files

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

CLI commands

generate

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.

analyze

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 is matches.json.

serve

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 the host parameter.

  • --port The port number that http server to listened on, default is 7568.

JavaScript API

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.

PACDispatcher

The undici dispatcher that dispatch requests based on rule described by the PAC.

It is designed to be used with the built-in fetch function. To proxy the requests with the http module, we recommend to use node-pac-proxy-agent.

import { readFileSync } from "fs";
import { PACDispatcher } from "pac-maker";

// Only needed if your Node < 18.1.0
// import { fetch } from "undici";

const pac = readFileSync("proxy.pac", "utf8");
const dispatcher = new PACDispatcher(pac);

const response = await fetch("https://example.com", { dispatcher });

buildPAC

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));

loadPAC

Load and execute a 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"));

parseProxies

Parse the return value of FindProxyForURL().

import { parseProxies } from "pac-maker";

console.log(parseProxies("HTTP localhost:80; DIRECT"));

output:

[
  { protocol: "HTTP", host: "localhost:80", port: 80, hostname: "localhost" },
  { protocol: "DIRECT", host: "", port: NaN, hostname: "" }
]

commands

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);

Run Tests

To run unit tests, you need to enable experimental vm modules.

NODE_OPTIONS=--experimental-vm-modules
pnpm test

About

Proxy Auto-Configuration (PAC) file generator & loader, support proxy Node's `fetch` with PAC.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published