# 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`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer#security_requirements). Here is a simple usage example: ```javascript import epoxy from "./epoxy-module-bundled.js"; import ROOTS from "./pkg/certs-module.js"; // or // importScripts("epoxy-bundled.js"); // importScripts("certs.js"); const { EpoxyClient, EpoxyClientOptions } = await epoxy(); let options = new EpoxyClientOptions(); options.user_agent = navigator.userAgent; let client = await new EpoxyClient("wss://localhost:4000", ROOTS, options); 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 [default: ] -p, --port [default: 4000] -b, --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 ```