) do
subscriber_registry = subscriber_registry_name(name)
callee_registry = callee_registry_name(name)
+ dependent_registry = dependent_registry_name(name)
session_data = %Sess{session_data | name: name, roles: [Peer | session_data.roles]}
children = [
{Registry,
[keys: :duplicate, name: subscriber_registry, partitions: System.schedulers_online()]},
{Registry, [keys: :unique, name: callee_registry, partitions: System.schedulers_online()]},
+ {Registry,
+ [keys: :unique, name: dependent_registry, partitions: System.schedulers_online()]},
{t,
name: name,
url: url,
def subscriber_registry_name(name), do: Module.concat([name, SubscriberRegistry])
@spec callee_registry_name(module()) :: module()
def callee_registry_name(name), do: Module.concat([name, CalleeRegistry])
+ @spec dependent_registry_name(module()) :: module()
+ def dependent_registry_name(name), do: Module.concat([name, DependentRegistry])
@spec subscribe(name :: module(), subscription :: Subscribe.t(), timeout :: integer()) ::
{:ok, integer()}
end
end
+ @spec add(name :: module(), pid :: module() | pid()) :: {:ok, pid()} | {:error, term()}
+ def add(name, pid) do
+ Registry.register(dependent_registry_name(name), pid, pid)
+ end
+
+ @spec remove(name :: module(), pid :: module() | pid()) :: :ok
+ def remove(name, pid) do
+ Registry.unregister(dependent_registry_name(name), pid)
+ end
+
@spec yield(name :: module(), yield :: Yield.t()) :: :ok
def yield(name, yield) do
cast(name, Callee.yield(yield))
sync(name, Callee.invocation_error(error))
end
- @spec publish(name :: module, event :: Publish.t()) :: :ok
+ @spec publish(name :: module(), event :: Publish.t()) :: :ok
def publish(name, event) do
cast(name, Publisher.publish(event))
end
@welcome,
%SL{data: %Sess{name: name}} = sl
) do
- sub = Client.subscriber_registry_name(name)
- reg = Client.callee_registry_name(name)
- subscribers = Registry.select(sub, [{{:_, :"$1", :_}, [], [:"$1"]}])
- callees = Registry.select(reg, [{{:_, :"$1", :_}, [], [:"$1"]}])
- pids = Enum.uniq(subscribers ++ callees)
+ deps = Registry.select(Client.dependent_registry_name(name), [{{:"$1", :_, :_}, [], [:"$1"]}])
- Enum.each(pids, fn pid ->
+ Enum.each(deps, fn pid ->
+ Logger.info("Send connected to: #{inspect(pid)}")
send(pid, {:connected, name})
end)