11defmodule Phoenix.PubSub.PG2 do
22 @ moduledoc """
3- Phoenix PubSub adapter based on `:pg2`.
3+ Phoenix PubSub adapter based on `:pg`/`: pg2`.
44
55 It runs on Distributed Erlang and is the default adapter.
66 """
@@ -15,7 +15,7 @@ defmodule Phoenix.PubSub.PG2 do
1515
1616 @ impl true
1717 def broadcast ( adapter_name , topic , message , dispatcher ) do
18- case :pg2 . get_members ( pg2_namespace ( adapter_name ) ) do
18+ case pg_members ( adapter_name ) do
1919 { :error , { :no_such_group , _ } } ->
2020 { :error , :no_such_group }
2121
@@ -51,12 +51,11 @@ defmodule Phoenix.PubSub.PG2 do
5151
5252 @ impl true
5353 def init ( { name , adapter_name } ) do
54- pg2_group = pg2_namespace ( adapter_name )
55- :ok = :pg2 . create ( pg2_group )
56- :ok = :pg2 . join ( pg2_group , self ( ) )
54+ :ok = pg_join ( adapter_name )
5755 { :ok , name }
5856 end
5957
58+ @ impl true
6059 def handle_info ( { :forward_to_local , topic , message , dispatcher } , pubsub ) do
6160 Phoenix.PubSub . local_broadcast ( pubsub , topic , message , dispatcher )
6261 { :noreply , pubsub }
@@ -67,5 +66,26 @@ defmodule Phoenix.PubSub.PG2 do
6766 { :noreply , pubsub }
6867 end
6968
70- defp pg2_namespace ( server_name ) , do: { :phx , server_name }
69+ if Code . ensure_loaded? ( :pg ) do
70+ defp pg_members ( adapter_name ) do
71+ :pg . get_members ( Phoenix.PubSub , adapter_name )
72+ end
73+
74+ defp pg_join ( adapter_name ) do
75+ :ok = :pg . join ( Phoenix.PubSub , adapter_name , self ( ) )
76+ end
77+ else
78+ defp pg_members ( adapter_name ) do
79+ :pg2 . get_members ( pg2_namespace ( adapter_name ) )
80+ end
81+
82+ defp pg_join ( adapter_name ) do
83+ namespace = pg2_namespace ( adapter_name )
84+ :ok = :pg2 . create ( namespace )
85+ :ok = :pg2 . join ( namespace , self ( ) )
86+ :ok
87+ end
88+
89+ defp pg2_namespace ( adapter_name ) , do: { :phx , adapter_name }
90+ end
7191end
0 commit comments