Packages

A gleam dev proxy to enable live reload and smoother DX

Current section

Files

Jump to
olive src olive.gleam
Raw

src/olive.gleam

import gleam/erlang/process.{type Subject}
import olive/client_registry.{type ClientRegistry}
import olive/logging
import olive/proxy
import olive/server_run
import olive/watcher
/// Process is as follow:
/// - Start a client registry
/// - Start watcher, giving it a subject we will listen to.
/// - Every time watcher sends us a message:
/// - Reload server code
/// - Send reload message to clients
pub fn main() {
let clients = client_registry.start()
let subject = process.new_subject()
let assert Ok(_) = watcher.start(subject)
let _ = server_run.start_server()
let assert Ok(_) = proxy.start_http(clients)
listen_to_file_changes(subject, clients)
}
fn listen_to_file_changes(
subject: Subject(watcher.Message),
clients: ClientRegistry,
) {
let msg = process.receive_forever(subject)
case msg {
watcher.FilesChanged -> {
case server_run.reload_server_code() {
Ok(_) -> {
client_registry.trigger(clients)
}
Error(msg) -> {
logging.log_error("Error while reloading server code : " <> msg)
}
}
}
}
listen_to_file_changes(subject, clients)
}