@@ -10,7 +10,7 @@ defmodule Hound.SessionServer do
1010
1111
1212 def session_for_pid ( pid , opts ) do
13- current_session_id ( pid ) ||
13+ { :ok , current_session_id ( pid ) } ||
1414 change_current_session_for_pid ( pid , :default , opts )
1515 end
1616
@@ -58,34 +58,49 @@ defmodule Hound.SessionServer do
5858 { :ok , state }
5959 end
6060
61+ def handle_call ( { :destroy_sessions , pid } , _from , state ) do
62+ destroy_sessions ( pid )
63+ { :reply , :ok , state }
64+ end
6165
6266 def handle_call ( { :change_session , pid , session_name , opts } , _from , state ) do
63- { :ok , driver_info } = Hound . driver_info
64-
65- { ref , sessions } =
66- case :ets . lookup ( @ name , pid ) do
67- [ { ^ pid , ref , _session_id , sessions } ] ->
68- { ref , sessions }
69- [ ] ->
70- { Process . monitor ( pid ) , % { } }
71- end
72-
73- { session_id , sessions } =
74- case Map . fetch ( sessions , session_name ) do
75- { :ok , session_id } ->
76- { session_id , sessions }
77- :error ->
78- session_id = create_session ( driver_info , opts )
79- { session_id , Map . put ( sessions , session_name , session_id ) }
80- end
67+ { ref , sessions } = case :ets . lookup ( @ name , pid ) do
68+ [ { ^ pid , ref , _session_id , sessions } ] ->
69+ { ref , sessions }
70+ [ ] ->
71+ { Process . monitor ( pid ) , % { } }
72+ end
73+
74+
75+ case find_existing_session ( sessions , session_name ) do
76+ { :ok , { session_id , sessions } } ->
77+ add_session_to_table ( pid , ref , session_id , sessions )
78+
79+ { :reply , { :ok , session_id } , Map . put ( state , ref , pid ) }
80+
81+ :error ->
82+ { :ok , driver_info } = Hound . driver_info ( )
83+
84+ case create_session ( driver_info , opts ) do
85+ { :error , _ } = e -> { :reply , e , state }
8186
87+ { :ok , session_id } ->
88+ sessions = Map . put ( sessions , session_name , session_id )
89+ add_session_to_table ( pid , ref , session_id , sessions )
90+
91+ { :reply , { :ok , session_id } , Map . put ( state , ref , pid ) }
92+ end
93+ end
94+ end
95+
96+ defp add_session_to_table ( pid , ref , session_id , sessions ) do
8297 :ets . insert ( @ name , { pid , ref , session_id , sessions } )
83- { :reply , session_id , Map . put ( state , ref , pid ) }
8498 end
8599
86- def handle_call ( { :destroy_sessions , pid } , _from , state ) do
87- destroy_sessions ( pid )
88- { :reply , :ok , state }
100+ defp find_existing_session ( sessions , session_name ) do
101+ with { :ok , session_id } <- Map . fetch ( sessions , session_name ) do
102+ { :ok , { session_id , sessions } }
103+ end
89104 end
90105
91106 def handle_info ( { :DOWN , ref , _ , _ , _ } , state ) do
@@ -96,10 +111,7 @@ defmodule Hound.SessionServer do
96111 end
97112
98113 defp create_session ( driver_info , opts ) do
99- case Hound.Session . create_session ( driver_info [ :browser ] , opts ) do
100- { :ok , session_id } -> session_id
101- { :error , reason } -> raise "could not create a new session: #{ reason } , check webdriver is running"
102- end
114+ Hound.Session . create_session ( driver_info [ :browser ] , opts )
103115 end
104116
105117 defp destroy_sessions ( pid ) do
0 commit comments