Skip to content

Instantly share code, notes, and snippets.

@ashneyderman
Created September 8, 2016 20:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ashneyderman/add6e80e9d71c5a5b36e886ce8449cee to your computer and use it in GitHub Desktop.
Save ashneyderman/add6e80e9d71c5a5b36e886ce8449cee to your computer and use it in GitHub Desktop.
defmodule SocketsPry do
def pes({Phoenix.Endpoint.Server, _, _, _}), do: true
def pes(_), do: false
def rls({{:ranch_listener_sup,_}, _, _, _}), do: true
def rls(_), do: false
def rcs({:ranch_conns_sup, _, _, _}), do: true
def rcs(_), do: false
def sockets(p) when is_pid(p) do
case p |> Process.info(:dictionary) do
{:dictionary, d} ->
case (d |> Enum.into(%{}) |> Map.get(:"$initial_call")) do
{Phoenix.Channel.Server, _, _} -> true
_ -> false
end
other -> false
end
end
def sockets(_), do: false
def f(ref, filter) do
ref |> Supervisor.which_children |> Enum.filter(filter) |> List.first |> elem(1)
end
def all do
MobileApi.Endpoint |> f(&pes/1)
|> f(&rls/1)
|> f(&rcs/1)
|> Supervisor.which_children |> Enum.flat_map(&( elem(&1, 1) |> Process.info(:links) |> elem(1) ))
|> Enum.filter(&sockets/1)
|> Enum.map(fn(pid) ->
%Phoenix.Socket{
assigns: assigns_map,
topic: topic,
transport_pid: transport_pid} = :sys.get_state(pid)
{transport_pid, pid, topic, assigns_map}
end)
end
def show_all do
all |> Enum.each(fn({tpid, cpid, topic, assigns_map}) ->
IO.puts "#{inspect tpid} : #{inspect cpid} : #{inspect topic} : #{inspect assigns_map, pretty: true}"
end)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment