Packages
glisten
0.1.0
9.0.1
9.0.0
9.0.0-rc1
8.0.3
8.0.2
8.0.1
8.0.0
8.0.0-rc1
7.0.1
7.0.0
6.0.0
5.0.0
4.0.0
3.0.0
2.0.0
1.0.0
0.11.0
0.10.2
0.10.1
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.0
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.1
0.5.0
0.4.0
0.3.2
0.3.1
0.3.0
0.2.2
0.2.1
0.2.0
0.1.3
0.1.2
0.1.1
0.1.0
a shiny Gleam TCP/TLS server
Current section
Files
Jump to
Current section
Files
README.md
# glisten
This is a gleam wrapper around `gen_tcp` loosely based on [ThousandIsland](https://github.com/mtrudel/thousand_island).
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 handler function loops on messages received from the socket. You can define
a handler with a function of the following type:
```gleam
fn(HandlerMessage, Socket) -> actor.Next(Socket)
```
This gives you access to the socket if you want to `send` to it in response. I
think right now I don't have this set up where you can send to the socket
unprovoked? So that seems like something I'll need to change... imminently.
## Examples
Just some basic handler examples that do also exist in this repo, but probably
won't once it's actually in better shape.
#### HTTP Hello World
```gleam
pub fn ok(_msg: HandlerMessage, sock: Socket) -> actor.Next(Socket) {
assert Ok(resp) =
"hello, world!"
|> bit_string.from_string
|> http_response(200, _)
|> bit_string.to_string
resp
|> charlist.from_string
|> send(sock, _)
actor.Stop(process.Normal)
}
```
#### Full HTTP echo handler
```gleam
pub fn handler(req: Request(BitString)) -> Response(BitString) {
response.new(200)
|> response.set_body(req.body)
}
pub fn main() {
assert Ok(socket) = tcp.do_listen_tcp(8000, [])
try _ = tcp.start_acceptor_pool(socket, make_handler(handler), 10)
Ok(erlang.sleep_forever())
}
```
## Notes
This is still very rough. There are no tests, and as noted above you can't just
send where you implement it.
In some [not-very-scientific benchmarking](https://gist.github.com/rawhat/11ab57ef8dde4170304adc01c8c05a99), it seemed to do roughly as well as
ThousandIsland. I am just using that as a reference point, certainly not trying
to draw any comparisons any time soon!