Current section
Files
Jump to
Current section
Files
src/internal/websockets.gleam
import gleam/erlang/process
import gleam/http/request.{type Request}
import gleam/io
import gleam/option.{type Option}
import gleam/otp/actor
import stratus
pub type Msg {
Close
Message(String)
}
// TODO: Add parser to parse out metadata from irc message
// TODO: Add ability to pass closure to handle messages
pub fn create_websockets_builder(
req: Request(String),
initializer: fn() -> #(a, Option(process.Selector(Msg))),
) -> Result(process.Subject(stratus.InternalMessage(Msg)), actor.StartError) {
let builder =
stratus.websocket(
request: req,
init: initializer,
loop: fn(msg, state, conn) {
case msg {
stratus.Text(msg) -> {
io.println("Received message " <> msg)
// let assert Ok(_resp) = stratus.send_text_message(conn, "hello, world!")
// io.debug(#("Sent message response", resp))
actor.continue(state)
}
stratus.User(Message(msg)) -> {
io.debug(#("Sent message", msg))
let assert Ok(_resp) = stratus.send_text_message(conn, msg)
// io.debug(#("Sent message response", resp))
actor.continue(state)
}
stratus.Binary(_msg) -> {
io.debug("Received binary message")
actor.continue(state)
}
stratus.User(Close) -> {
io.debug("Close message sent")
let assert Ok(_) = stratus.close(conn)
actor.Stop(process.Normal)
}
}
},
)
|> stratus.on_close(fn(_state) { io.println("Closing Connection!") })
// Create a subject from the builder we can send and receive messages to/from
stratus.initialize(builder)
}