@@ -17,14 +17,14 @@ defmodule Hound.SessionServer do
1717
1818 def current_session_id ( pid ) do
1919 case :ets . lookup ( @ name , pid ) do
20- [ { ^ pid , _ref , session_id , _all_sessions } ] -> session_id
20+ [ { ^ pid , session_id , _all_sessions } ] -> session_id
2121 [ ] -> nil
2222 end
2323 end
2424
2525 def current_session_name ( pid ) do
2626 case :ets . lookup ( @ name , pid ) do
27- [ { ^ pid , _ref , session_id , all_sessions } ] ->
27+ [ { ^ pid , session_id , all_sessions } ] ->
2828 Enum . find_value all_sessions , fn
2929 { name , id } when id == session_id -> name
3030 _ -> nil
@@ -43,14 +43,14 @@ defmodule Hound.SessionServer do
4343
4444 def all_sessions_for_pid ( pid ) do
4545 case :ets . lookup ( @ name , pid ) do
46- [ { ^ pid , _ref , _session_id , all_sessions } ] -> all_sessions
46+ [ { ^ pid , _session_id , all_sessions } ] -> all_sessions
4747 [ ] -> % { }
4848 end
4949 end
5050
5151
5252 def all_sessions do
53- :ets . foldl ( fn { _pid , _ref , _session_id , sessions } , acc -> acc ++ Map . values ( sessions ) end , [ ] , @ name )
53+ :ets . foldl ( fn { _pid , _session_id , sessions } , acc -> acc ++ Map . values ( sessions ) end , [ ] , @ name )
5454 end
5555
5656
@@ -69,12 +69,11 @@ defmodule Hound.SessionServer do
6969 def handle_call ( { :change_session , pid , session_name , opts } , _from , state ) do
7070 { :ok , driver_info } = Hound . driver_info
7171
72- { ref , sessions } =
72+ sessions =
7373 case :ets . lookup ( @ name , pid ) do
74- [ { ^ pid , ref , _session_id , sessions } ] ->
75- { ref , sessions }
76- [ ] ->
77- { Process . monitor ( pid ) , % { } }
74+ [ { ^ pid , _session_id , sessions } ] ->
75+ sessions
76+ [ ] -> % { }
7877 end
7978
8079 { session_id , sessions } =
@@ -86,8 +85,8 @@ defmodule Hound.SessionServer do
8685 { session_id , Map . put ( sessions , session_name , session_id ) }
8786 end
8887
89- :ets . insert ( @ name , { pid , ref , session_id , sessions } )
90- { :reply , { :ok , session_id } , Map . put ( state , ref , pid ) }
88+ :ets . insert ( @ name , { pid , session_id , sessions } )
89+ { :reply , { :ok , session_id } , monitor_session ( pid , state ) }
9190 rescue
9291 error -> { :reply , { :error , error } , state }
9392 end
@@ -104,6 +103,15 @@ defmodule Hound.SessionServer do
104103 { :noreply , state }
105104 end
106105
106+ defp monitor_session ( pid , state ) do
107+ if state |> Map . values |> Enum . member? ( pid ) do
108+ state
109+ else
110+ ref = Process . monitor ( pid )
111+ Map . put ( state , ref , pid )
112+ end
113+ end
114+
107115 defp create_session ( driver_info , opts ) do
108116 case Hound.Session . create_session ( driver_info [ :browser ] , opts ) do
109117 { :ok , session_id } -> session_id
0 commit comments