Skip to content

hazae41/fleche

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")
}