package dream-livereload
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=f9650347225b2e42b2e45419f4b98435c432c0a295b25fd7e1a7dc219024f8de
sha512=ab19e04bd6f941b769f75fc10114f3f1948cb55ed65e6f4ab8ddbf51987b18594cbb5ad4af24eeb3eb24f735e967d9e0a07112f5b7e53c2fc976cb3e5b5cdee7
Description
Live reloading for Dream applications
Published: 10 Apr 2022
README
Dream Live Reload
Live reloading for Dream applications.
Usage
Add the Dream_livereload
middleware and route to your Dream application:
let () =
Dream.run
@@ Dream.logger
@@ Dream_livereload.inject_script () (* <-- *)
@@ Dream.router [
Dream.get "/" (fun _ -> Dream.html "Hello World!");
Dream_livereload.route (); (* <-- *)
]
@@ Dream.not_found
and dream-livereload
to dune
:
(executable
(name my_app)
(libraries dream dream-livereload))
This does two things:
The middleware injects a script into the HTML documents sent by your application (HTTP responses with the
Content-Type: text/html
). The script opens a WebSocket connection to the server. When the connection is lost, the script tries to re-connect for 10 seconds, and upon a successfull re-connection, refreshes the current page.The route is the HTTP endpoint used for the WebSocket connection. It does nothing but hold open the WebSocket connection.
This allows automating part of your workflow: when you rebuild your project and start a new instance of your server, the client will automatically detect it and refresh the page.
To automate your workflow completely, you can use a script to automatically rebuild and restart your server on filesystem changes:
#!/usr/bin/env bash
source_dirs="lib bin"
args=${*:-"bin/server.exe"}
cmd="dune exec ${args}"
function sigint_handler() {
kill "$(jobs -pr)"
exit 1
}
trap sigint_handler SIGINT
while true; do
dune build
$cmd &
fswatch -r -1 $source_dirs
printf "\nRestarting server.exe due to filesystem change\n"
kill "$(jobs -pr)"
done
This will watch the directories bin/
and lib/
and restart the server at bin/server.exe
on any changes.