A system for managing http transports in a project such as Ultraviolet.
Find a file
2024-07-09 13:45:18 -05:00
lib add back node imports 2024-07-07 17:21:37 -05:00
src remove broadcastchannel for workerPath, let the client pass in a messageport, use snapshot for more stuff 2024-07-09 10:28:44 -07:00
.gitignore fetch working 2024-07-07 01:11:13 -07:00
LICENSE Create LICENSE 2024-07-08 20:54:18 -07:00
package.json update package name 2024-07-08 13:20:38 -05:00
pnpm-lock.yaml clean up settransport 2024-07-07 14:54:55 -07:00
README.md add a synchronous example 2024-07-09 13:45:18 -05:00
rollup.config.js remove broadcastchannel for workerPath, let the client pass in a messageport, use snapshot for more stuff 2024-07-09 10:28:44 -07:00
tsconfig.json clean up settransport 2024-07-07 14:54:55 -07:00

Bare-Mux

A system for managing http transports in a project such as Ultraviolet.

Written to make the job of creating new standards for transporting http data seamless.

Implements the TompHTTP Bare client interface in a modular way.

Specifically, this is what allows proxies such as Nebula to switch HTTP transports seamlessly.

A transport is a module that implements the BareTransport interface.

export interface BareTransport {
  init: () => Promise<void>;
  ready: boolean;
  connect: (
    url: URL,
    origin: string,
    protocols: string[],
    requestHeaders: BareHeaders,
    onopen: (protocol: string) => void,
    onmessage: (data: Blob | ArrayBuffer | string) => void,
    onclose: (code: number, reason: string) => void,
    onerror: (error: string) => void,
  ) => [( (data: Blob | ArrayBuffer | string) => void, (code: number, reason: string) => void )] => void;

  request: (
    remote: URL,
    method: string,
    body: BodyInit | null,
    headers: BareHeaders,
    signal: AbortSignal | undefined
  ) => Promise<TransferrableResponse>;

  meta: () => BareMeta
}

Examples of transports include EpoxyTransport, CurlTransport, and Bare-Client.

Here is an example of using bare-mux:

/// As an end-user
import { BareMuxConnection } from "@mercuryworkshop/bare-mux";
const conn = new BareMuxConnection("/bare-mux/worker.js");

// Set Bare-Client transport
// If your transport is an ES module and exports the class as the default export
await conn.setTransport("/bare-mux/transport-module.js", ["arg1", "ws://localhost:4000"]);

/// As a proxy developer
import { BareClient } from "@mercuryworkshop/bare-mux";
const client = new BareClient();
// Fetch
const resp = await client.fetch("https://example.com");
// Create websocket
const ws = client.createWebSocket("wss://echo.websocket.events");

WebWorker support

Due to limitations in browsers, there is no way for bare-mux to get a connection to the bare-mux SharedWorker while inside a WebWorker. Proxies that use bare-mux must manually pass in a MessagePort to the SharedWorker to be able to use BareClient in a WebWorker.

const connection = new BareMuxConnection();
const port = await connection.getInnerPort();
// ... transfer it to worker ...
const client = new BareClient(port);
// doing this synchronously
const connection = new Ultraviolet.BareMuxConnection();
let port;
connection.getInnerPort().then((MessagePort) => {
    port = MessagePort;
});
// ... transfer it to worker ...
this.bareClient = new BareClient(port)