epoxy-tls/client
2025-01-29 13:25:20 -08:00
..
.cargo add a minimal build 2024-07-03 11:04:02 -07:00
src rename to transportread/transportwrite/transportreadext/transportext 2025-01-29 13:25:20 -08:00
.npmignore readme improvements 2024-12-21 18:33:17 -08:00
build.sh wisp-mux... SEVEN!! 2025-01-29 13:21:23 -08:00
Cargo.toml wisp-mux... SEVEN!! 2025-01-29 13:21:23 -08:00
demo.js bump 2024-12-11 22:39:02 -08:00
index.html remove worker, add some more flags to shave off some size 2024-07-25 23:03:19 -07:00
LICENSE change license to AGPL 2024-07-03 21:54:35 -07:00
package.json bump ver 2024-12-19 14:07:31 -08:00
publish.sh use h2-wasm 2024-10-21 17:38:50 -07:00
README.md readme improvements 2024-12-21 18:33:17 -08:00

epoxy-client

Fetch and WebSocket implementation for the browser written in Rust that uses the Wisp protocol.

Building

Important

Rust nightly with the wasm32-unknown-unknown target and rust-std component is required.

The build script needs some dependencies:

  • wasm-bindgen: installable through cargo
  • wasm-opt: get from WebAssembly/binaryen
  • jq: install from your distro's repos
  • git: install from your distro's repos
bash build.sh

The WASM binary and JS bindings will be placed in pkg.

Usage

Examples are available in demo.js.

import init, { EpoxyClient, EpoxyClientOptions, EpoxyHandlers } from "@mercuryworkshop/epoxy-tls/epoxy";

// you can also pass in the wasm after fetching it. see the typescript types for all options
await init({ module_or_path: "path/to/epoxy.wasm" });

// or you can import "@mercuryworkshop/epoxy-tls" or "@mercuryworkshop/epoxy-tls/epoxy-bundled"
// those versions have the wasm bundled into the JS as base64 so you don't need to pass anything to init()
//
// there is also a minimal version with only HTTP/1 fetch and TLS/TCP/UDP streams if you want a smaller
// bundle size. those can be imported via "@mercuryworkshop/epoxy-tls/minimal" and "minimal-bundled"

const options = new EpoxyClientOptions();
options.user_agent = navigator.userAgent;
options.wisp_v2 = true;
options.udp_extension_required = true;

// use your own selfhosted wisp server, this is the demo one with throttling
const client = new EpoxyClient("wss://wisp.mercurywork.shop", options);

const res = await client.fetch("https://example.com");
console.log(res.headers, res.rawHeaders);
console.log(await res.text());

// not available in the minimal version 
let handlers = new EpoxyHandlers(
    () => console.log("opened"),
    () => console.log("closed"),
    err => console.error(err),
    msg => console.log(`got "${msg}"`)
);
let ws = await client.connect_websocket(
    handlers,
    "wss://echo.websocket.events",
    ["protocol1"],
    { "x-header": "abc" },
);

await ws.send("data");