Skip to content
/ fleche Public

Zero-copy HTTP protocol for the web 🏎️ (JS + WebAssembly)

Notifications You must be signed in to change notification settings

hazae41/fleche

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Sep 1, 2024
b18b1ea Β· Sep 1, 2024
Jan 7, 2023
Feb 28, 2023
Feb 19, 2023
Sep 1, 2024
Mar 13, 2024
Nov 12, 2023
Jan 7, 2023
Jan 7, 2023
Nov 13, 2023
Sep 1, 2024
Sep 1, 2024
Jan 18, 2023
Nov 12, 2023

Repository files navigation

npm i @hazae41/fleche

Node Package πŸ“¦

Features

Goals

  • 100% TypeScript and ESM
  • Zero-copy reading and writing
  • Transport agnostic (TCP, TLS, Tor)
  • Supports backpressure

HTTP

  • HTTP 1.1
  • Native Gzip and Deflate compression
  • Compatible with code using fetch
  • Reusable underlying connection

WebSocket

  • Relies on the above HTTP
  • Powered by WebAssembly
  • Same API than native
  • Only 0.3ms slower than native
  • More HTTP 1.1 features
  • HTTP 2, HTTP 3 (QUIC)

Usage

import { Opaque, Writable } from "@hazae41/binary"
import { fetch } from "@hazae41/fleche"

function example(stream: ReadableWritablePair<Opaque, Writable>) {
  /**
   * Fetch using the underlying TCP or TLS stream
   */
  const res = await fetch("https://example.com", { stream })

  if (!res.ok)
    throw new Error(await res.text())

  return await res.json()
}
import { Opaque, Writable } from "@hazae41/binary"
import { WebSocket } from "@hazae41/fleche"

function example(stream: ReadableWritablePair<Opaque, Writable>) {
  const socket = new WebSocket("wss://example.com")

  /**
   * Pipe TCP or TLS input to WebSocket input
   */
  stream.readable
    .pipeTo(socket.inner.writable, { preventCancel: true })
    .catch(() => {})

  /**
   * Pipe WebSocket output to TCP or TLS output
   */
  socket.inner.readable
    .pipeTo(stream.writable, { preventClose: true, preventAbort: true })
    .catch(() => {})

  await new Promise((ok, err) => {
    socket.addEventListener("open", ok)
    socket.addEventListener("error", err)
  })

  socket.addEventListener("message", e => console.log(e.data))
  socket.send("Hello world")
}