.cargo | ||
.github/workflows | ||
client | ||
server | ||
simple-wisp-client | ||
wisp | ||
.envrc | ||
.gitignore | ||
Cargo.lock | ||
Cargo.toml | ||
flake.lock | ||
flake.nix | ||
README.md |
epoxy
Epoxy is an encrypted proxy for browser javascript. It allows you to make requests that bypass CORS without compromising security, by running SSL/TLS inside webassembly.
Using the client
Epoxy must be run from within a web worker and must be served with the security headers needed for SharedArrayBuffer
. Here is a simple usage example:
import epoxy from "./epoxy-module-bundled.js";
// or
// importScripts("epoxy-bundled.js");
const { EpoxyClient, certs } = await epoxy();
let client = await new EpoxyClient("wss://localhost:4000", navigator.userAgent, 10);
// You can view the certificates compiled in
console.log(certs())
// You can view and change the user agent and redirect limit
console.log(client.userAgent);
client.redirect_limit = 5;
let response = await client.fetch("https://httpbin.org/get");
console.log(await response.text());
See client/demo.js
for more examples.
Using the server
$ cargo r -r --bin epoxy-server -- --help
Implementation of the Wisp protocol in Rust, made for epoxy.
Usage: epoxy-server [OPTIONS]
Options:
--prefix <PREFIX> [default: ]
-p, --port <PORT> [default: 4000]
-b, --host <HOST> [default: 0.0.0.0]
-u, --unix-socket
-h, --help Print help
-V, --version Print version
You can listen on a unix socket by passing the --unix-socket
flag and the unix socket path in the --host
flag. Example:
cargo r -r -- -u -b "/home/user/epoxy-socket"
Building
Important
Rust nightly is required.
Server
cargo b -r --bin epoxy-server
The executable will be placed at target/release/epoxy-server
.
Client
Important
Building the client is only supported on Linux.
Make sure you have the wasm32-unknown-unknown
rust target, the rust-std
component, and the wasm-bindgen
, wasm-opt
, and base64
binaries installed.
In the client
directory:
bash build.sh
To host a local server with the required headers:
python3 serve.py