Current section

Files

Jump to
push_ex lib push_ex_web channels push_channel.ex
Raw

lib/push_ex_web/channels/push_channel.ex

defmodule PushExWeb.PushChannel do
@moduledoc false
use Phoenix.Channel
alias PushExWeb.PushTracker
alias PushEx.Instrumentation
intercept(["msg"])
def broadcast({:msg, channel}, item = %PushEx.Push{event: event}, opts \\ []) when is_bitstring(event) do
if PushTracker.listeners?(channel) do
endpoint_mod = Keyword.get(opts, :endpoint, PushEx.Config.endpoint())
endpoint_mod.broadcast!(channel, "msg", item)
{:ok, :broadcast}
else
{:ok, :no_listeners}
end
end
## Socket API
def join(channel, params, socket) do
PushEx.Config.socket_impl().channel_join(channel, params, socket)
|> case do
response = {:ok, _socket} ->
send(self(), :after_join)
response
response ->
response
end
end
def handle_out("msg", item = %PushEx.Push{data: data, event: event}, socket) do
push(socket, "msg", %{data: data, event: event})
Instrumentation.Push.delivered(item)
{:noreply, socket, :hibernate}
end
def handle_info(:after_join, socket) do
:ok = Instrumentation.Tracker.track_channel(socket)
{:ok, _} = PushTracker.track(socket)
{:noreply, socket}
end
end