-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 => <>, 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).