Packages

A gleam dev proxy to enable live reload and smoother DX

Current section

Files

Jump to
olive src olive@client_registry.erl
Raw

src/olive@client_registry.erl

-module(olive@client_registry).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([start/1, add/2, remove/2, trigger/1]).
-export_type([client_message/0, client_registry/0, message/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(
" The `client_registry` module holds a list of connected clients (browsers)\n"
" and allows to trigger those clients by sending them a `Reload` message.\n"
).
-type client_message() :: reload.
-opaque client_registry() :: {client_registry,
gleam@erlang@process:subject(message())}.
-type message() :: {client_connected,
gleam@erlang@process:subject(client_message())} |
{client_disconnected, gleam@erlang@process:subject(client_message())} |
trigger_clients.
-file("src/olive/client_registry.gleam", 23).
-spec start(olive@logging:logger()) -> client_registry().
start(Logger) ->
_assert_subject = gleam@otp@actor:start(
gleam@set:new(),
fun(Message, State) -> case Message of
{client_connected, Client} ->
olive@logging:notice(Logger, <<"Client connected"/utf8>>),
gleam@otp@actor:continue(gleam@set:insert(State, Client));
{client_disconnected, Client@1} ->
olive@logging:notice(Logger, <<"Client disconnected"/utf8>>),
gleam@otp@actor:continue(gleam@set:delete(State, Client@1));
trigger_clients ->
case gleam@set:is_empty(State) of
true ->
gleam@otp@actor:continue(State);
false ->
olive@logging:notice(
Logger,
<<"Triggering clients to reload"/utf8>>
),
gleam@set:each(
State,
fun(Client@2) ->
gleam@erlang@process:send(Client@2, reload)
end
),
gleam@otp@actor:continue(State)
end
end end
),
{ok, Subject} = case _assert_subject of
{ok, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail,
module => <<"olive/client_registry"/utf8>>,
function => <<"start"/utf8>>,
line => 24})
end,
{client_registry, Subject}.
-file("src/olive/client_registry.gleam", 53).
-spec add(client_registry(), gleam@erlang@process:subject(client_message())) -> nil.
add(Registry, Client) ->
{client_registry, Subject} = Registry,
gleam@otp@actor:send(Subject, {client_connected, Client}).
-file("src/olive/client_registry.gleam", 58).
-spec remove(client_registry(), gleam@erlang@process:subject(client_message())) -> nil.
remove(Registry, Client) ->
{client_registry, Subject} = Registry,
gleam@otp@actor:send(Subject, {client_disconnected, Client}).
-file("src/olive/client_registry.gleam", 63).
-spec trigger(client_registry()) -> nil.
trigger(Registry) ->
{client_registry, Subject} = Registry,
gleam@otp@actor:send(Subject, trigger_clients).