mirror of
https://github.com/MercuryWorkshop/epoxy-tls.git
synced 2025-05-12 14:00:01 -04:00
61 lines
2.1 KiB
Markdown
61 lines
2.1 KiB
Markdown
# 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](https://github.com/webassembly/binaryen)
|
|
- `jq`: install from your distro's repos
|
|
- `git`: install from your distro's repos
|
|
|
|
```bash
|
|
bash build.sh
|
|
```
|
|
The WASM binary and JS bindings will be placed in `pkg`.
|
|
|
|
## Usage
|
|
Examples are available in [`demo.js`](demo.js).
|
|
|
|
```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");
|
|
```
|