Current section
Files
Jump to
Current section
Files
src/olive@client_registry.erl
-module(olive@client_registry).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-define(FILEPATH, "src/olive/client_registry.gleam").
-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) ->
Actor@1 = case begin
_pipe = gleam@otp@actor:new(gleam@set:new()),
_pipe@1 = gleam@otp@actor:on_message(
_pipe,
fun(State, Message) -> case Message of
{client_connected, Client} ->
olive@logging:debug(Logger, <<"Client connected"/utf8>>),
gleam@otp@actor:continue(
gleam@set:insert(State, Client)
);
{client_disconnected, Client@1} ->
olive@logging:debug(
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:debug(
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
),
gleam@otp@actor:start(_pipe@1)
end of
{ok, Actor} -> Actor;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"olive/client_registry"/utf8>>,
function => <<"start"/utf8>>,
line => 24,
value => _assert_fail,
start => 544,
'end' => 1437,
pattern_start => 555,
pattern_end => 564})
end,
Subject = erlang:element(3, Actor@1),
{client_registry, Subject}.
-file("src/olive/client_registry.gleam", 55).
-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", 60).
-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", 65).
-spec trigger(client_registry()) -> nil.
trigger(Registry) ->
{client_registry, Subject} = Registry,
gleam@otp@actor:send(Subject, trigger_clients).