README.md

# Stratocumulus

Bindings for browser
[`WebSocket`](https://developer.mozilla.org/docs/Web/API/WebSocket/WebSocket)
client constructor. `stratocumulus` can be used anytime low-level bindings on
top of WebSockets are needed. `stratocumulus` has been carefully crafted to be
fully compatible with Gleam data while sticking close with JavaScript, to let
you leverage your JavaScript knowledge. `stratocumulus` does not try to hide the
JavaScript complexity, but rather to provide simple bindings and correct
interface to `WebSocket`.

## Compatibility

`stratocumulus` is compatible with every runtime implementing the standard
JavaScript `WebSocket` object. This means this package is compatible with any
browser, but also with Node (version 22 and higher), Bun or Deno!

## Installation

```sh
gleam add stratocumulus@1
```

## Basic Usage

Open your WebSocket, and subscribe to the different events. To simplify working
with the socket, the `"message"` event handler has been splitted in half: one
for textual content, the other for binary content. The latter will provide a
Gleam `BitArray` to help integrating in the Gleam ecosystem. In any case, the
original event will still be provided in the handler.

```gleam
import gleam/dynamic.{type Dynamic}
import stratocumulus as websocket

pub fn main() {
  let assert Ok(endpoint) = uri.parse("...")
  let assert Ok(ws) =
    websocket.new(endpoint)
    |> websocket.protocols(["soap"])
    |> websocket.on_open(fn (event: Dynamic) { Nil })
    |> websocket.on_close(fn (event: Dynamic) { Nil })
    |> websocket.on_error(fn (event: Dynamic) { Nil })
    |> websocket.on_text(fn (content: String, event) { io.println(content) })
    |> websocket.on_bytes(fn (content: BitArray, event) { echo content })
    |> websocket.open
  let assert Ok(_) = websocket.send(ws, "Hello world!")
  let assert Ok(_) = websocket.send_bytes(ws, <<"Hello world!">>)
  let assert Ok(_) = websocket.close(ws, code: 1000, reason: "normal")
}
```