Current section
Files
Jump to
Current section
Files
lib/pubsub_phoenix_adapter.ex
defmodule Poolder.PubSub.PhoenixAdapter do
@moduledoc """
Phoenix.PubSub adapter for Poolder.PubSub.
Allows Poolder.PubSub to be used as a Phoenix PubSub backend.
## Usage
Add to your Phoenix application's config:
config :my_app, MyApp.Endpoint,
pubsub_server: MyApp.PubSub
config :my_app, MyApp.PubSub,
adapter: Poolder.PubSub.PhoenixAdapter,
name: MyApp.PubSub
Or in your supervision tree:
children = [
{Phoenix.PubSub, adapter: Poolder.PubSub.PhoenixAdapter, name: MyApp.PubSub}
]
You can now use Phoenix.PubSub functions as usual:
Phoenix.PubSub.subscribe(MyApp.PubSub, "room:lobby")
Phoenix.PubSub.broadcast(MyApp.PubSub, "room:lobby", {:msg, "hello"})
"""
def child_spec(opts) do
server = Keyword.fetch!(opts, :name)
%{
id: server,
start: {Poolder.PubSub, :start_link, [server, opts]}
}
end
def subscribe(server, topic, opts) do
pid = Keyword.get(opts, :pid, self())
Poolder.PubSub.subscribe(server, topic, pid)
end
def unsubscribe(server, topic, opts) do
pid = Keyword.get(opts, :pid, self())
Poolder.PubSub.unsubscribe(server, topic, pid)
end
def broadcast(server, topic, message) do
Poolder.PubSub.broadcast(server, topic, message)
end
def broadcast_from(server, from, topic, message) do
# Poolder.PubSub does not track sender, so just broadcast
Poolder.PubSub.broadcast_from(server, from, topic, message)
end
def link(_server), do: :ok
def node_name(_server), do: node()
def direct_broadcast(server, _node, topic, message) do
Poolder.PubSub.broadcast(server, topic, message)
end
end