11defmodule Hound.SessionServer do
22 @ moduledoc false
33
4+ require Logger
5+
46 use GenServer
57 @ name __MODULE__
68
@@ -10,7 +12,7 @@ defmodule Hound.SessionServer do
1012
1113
1214 def session_for_pid ( pid , opts ) do
13- current_session_id ( pid ) ||
15+ { :ok , current_session_id ( pid ) } ||
1416 change_current_session_for_pid ( pid , :default , opts )
1517 end
1618
@@ -58,34 +60,53 @@ defmodule Hound.SessionServer do
5860 { :ok , state }
5961 end
6062
63+ def handle_call ( { :destroy_sessions , pid } , _from , state ) do
64+ destroy_sessions ( pid )
65+ { :reply , :ok , state }
66+ end
6167
6268 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
69+ { ref , sessions } = case :ets . lookup ( @ name , pid ) do
70+ [ { ^ pid , ref , _session_id , sessions } ] ->
71+ { ref , sessions }
72+ [ ] ->
73+ { Process . monitor ( pid ) , % { } }
74+ end
75+
76+
77+ case find_existing_session ( sessions , session_name ) do
78+ { :ok , { session_id , sessions } } ->
79+ Logger . debug ( "Found exsisting session #{ session_name } - #{ session_id } " )
80+
81+ add_session_to_table ( pid , ref , session_id , sessions )
82+
83+ { :reply , { :ok , session_id } , Map . put ( state , ref , pid ) }
84+
85+ :error ->
86+ { :ok , driver_info } = Hound . driver_info ( )
87+
88+ case create_session ( driver_info , opts ) do
89+ { :error , _ } = e -> { :reply , e , state }
8190
91+ { :ok , session_id } ->
92+ Logger . debug ( "Started new session #{ session_name } - #{ session_id } " )
93+
94+ sessions = Map . put ( sessions , session_name , session_id )
95+ add_session_to_table ( pid , ref , session_id , sessions )
96+
97+ { :reply , { :ok , session_id } , Map . put ( state , ref , pid ) }
98+ end
99+ end
100+ end
101+
102+ defp add_session_to_table ( pid , ref , session_id , sessions ) do
82103 :ets . insert ( @ name , { pid , ref , session_id , sessions } )
83- { :reply , session_id , Map . put ( state , ref , pid ) }
84104 end
85105
86- def handle_call ( { :destroy_sessions , pid } , _from , state ) do
87- destroy_sessions ( pid )
88- { :reply , :ok , state }
106+ defp find_existing_session ( sessions , session_name ) do
107+ with { :ok , session_id } <- Map . fetch ( sessions , session_name ) do
108+ { :ok , { session_id , sessions } }
109+ end
89110 end
90111
91112 def handle_info ( { :DOWN , ref , _ , _ , _ } , state ) do
@@ -96,10 +117,7 @@ defmodule Hound.SessionServer do
96117 end
97118
98119 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
120+ Hound.Session . create_session ( driver_info [ :browser ] , opts )
103121 end
104122
105123 defp destroy_sessions ( pid ) do
0 commit comments