glisten
This is a Gleam wrapper around gen_tcp
loosely based on ThousandIsland.
It uses the gleam_otp
library to handle the supervisor and child processes.
The general structure is similar to ThousandIsland. There is a supervisor that
manages a pool of acceptors. Each acceptor will block on accept
until a
connection is opened. The acceptor will then spawn a handler process and
then block again on accept
.
The most obvious entrypoint is glisten/tcp.{handler, serve}
where serve
listens for TCP connections on a given port. It also takes a handler function
wrapper which you can provide functionality to, and the state which each TCP
connection process will hold. This takes the shape of:
type HandlerFunc(data) =
fn(BitString, LoopState(data)) -> actor.Next(LoopState(data))
Examples
Here is a basic echo server:
pub fn main() {
assert Ok(_) = serve(8080, tcp.handler(fn(msg, state) {
assert Ok(_) = tcp.send(state.socket, bit_builder.from_bit_string(msg))
actor.Continue(state)
}), Nil)
erlang.sleep_forever()
}
But you can also do whatever you want.
pub fn main() {
try listener = tcp.listen(8000, [ActiveMode(Passive)])
try socket = tcp.accept(listener)
try msg = tcp.receive(socket, 0)
io.println("got a msg")
io.debug(msg)
Ok(Nil)
}
See mist for HTTP support built on top of this library.