Packages
grizzly
0.6.0
9.1.4
9.1.2
9.1.1
9.1.0
9.0.0
8.15.3
8.15.2
8.15.1
8.15.0
8.14.0
8.13.0
8.12.0
8.11.3
8.11.2
8.11.1
8.11.0
8.10.0
8.9.0
8.8.1
8.8.0
8.7.1
8.7.0
8.6.12
8.6.11
8.6.10
8.6.9
8.6.8
8.6.7
retired
8.6.6
8.6.5
8.6.4
8.6.3
8.6.2
8.6.1
8.6.0
8.5.3
8.5.2
8.5.1
8.5.0
8.4.0
8.3.0
8.2.3
8.2.2
8.2.1
8.2.0
8.1.0
8.0.1
8.0.0
7.4.3
7.4.2
7.4.1
7.4.0
7.3.0
7.2.0
7.1.4
7.1.3
7.1.2
7.1.1
7.1.0
7.0.4
7.0.3
7.0.2
7.0.1
7.0.0
6.8.8
6.8.7
6.8.6
6.8.5
6.8.4
6.8.3
6.8.2
6.8.1
6.8.0
6.7.1
6.7.0
6.6.1
6.6.0
6.5.1
6.5.0
6.4.0
6.3.0
6.2.0
6.1.1
6.1.0
6.0.1
6.0.0
5.4.1
5.4.0
5.3.0
5.2.8
5.2.7
5.2.6
5.2.5
5.2.4
5.2.3
5.2.2
5.2.1
5.2.0
5.1.2
5.1.1
5.1.0
5.0.2
5.0.1
5.0.0
4.0.1
4.0.0
3.0.0
2.1.0
2.0.0
1.0.1
1.0.0
0.22.7
0.22.6
0.22.5
0.22.4
0.22.3
0.22.2
0.22.1
0.22.0
0.21.1
0.21.0
0.20.2
0.20.1
0.20.0
0.19.1
0.19.0
0.18.3
0.18.2
0.18.1
0.18.0
0.17.7
0.17.6
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.2
0.16.1
0.16.0
0.15.11
0.15.10
0.15.9
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.3
0.12.2
0.12.1
0.12.0
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.0
0.9.0-rc.4
0.9.0-rc.3
0.9.0-rc.2
0.9.0-rc.1
0.9.0-rc.0
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.4.3
0.4.2
Elixir Z-Wave library
Current section
Files
Jump to
Current section
Files
lib/grizzly/notifications.ex
defmodule Grizzly.Notifications do
@moduledoc """
A pubsub module for sending and receiving notifications to
and from Grizzly.
"""
require Logger
@registry_name Registry.Grizzly
@typedoc """
The topics that are allowed for Grizzly notifications
"""
@type topic ::
:controller_connected
| :connection_established
| :unsolicited_message
| :node_added
| :node_removed
| :node_updated
def child_spec(_) do
%{
id: __MODULE__,
start: {__MODULE__, :start_link, []},
type: :worker,
restart: :permanent,
shutdown: 500
}
end
def start_link() do
_ = Logger.info("[GRIZZLY] Starting registry #{@registry_name}")
Registry.start_link(keys: :duplicate, name: @registry_name)
end
@doc """
Subscribe to a list of topics
"""
@spec subscribe_all([topic]) :: :ok
def subscribe_all(topics) do
Enum.each(topics, &subscribe/1)
end
@doc """
Subscribe to a topic to receive messages
"""
@spec subscribe(topic) :: :ok | {:error, :already_subscribed}
def subscribe(topic) do
case Registry.register(@registry_name, topic, []) do
{:ok, _} -> :ok
{:error, _} -> {:error, :already_subscribed}
end
end
@doc """
Unsubscribe from a topic
"""
@spec unsubscribe(topic) :: :ok
def unsubscribe(topic) do
Registry.unregister(@registry_name, topic)
end
@doc """
Broadcast a `topic` to the processes that are subscribed
"""
@spec broadcast(topic) :: :ok
def broadcast(topic) do
Registry.dispatch(@registry_name, topic, fn listeners ->
for {pid, _} <- listeners, do: send(pid, topic)
end)
end
@doc """
Broadcast a `topic` and some `data` with the topic. This will send
the subscriber a tuple in the shape of `{topic, data}`
"""
@spec broadcast(topic, data :: any) :: :ok
def broadcast(topic, data) do
_ = Logger.debug("[GRIZZLY] BROADCASTING #{inspect(topic)} :: #{inspect(data)}")
Registry.dispatch(@registry_name, topic, fn listeners ->
for {pid, _} <- listeners, do: send(pid, {topic, data})
end)
end
end