11defmodule Hound.SessionServer do
22 @ moduledoc false
33
4+ require Logger
5+
46 use GenServer
57 @ name __MODULE__
68
@@ -10,13 +12,15 @@ defmodule Hound.SessionServer do
1012
1113
1214 def session_for_pid ( pid , opts ) do
13- current_session_id ( pid ) ||
15+ IO . inspect ( pid , label: "session_for_pid" )
16+ { :ok , current_session_id ( pid ) } ||
1417 change_current_session_for_pid ( pid , :default , opts )
1518 end
1619
1720
1821 def current_session_id ( pid ) do
19- case :ets . lookup ( @ name , pid ) do
22+ IO . inspect pid , label: "current_session_id"
23+ case :ets . lookup ( @ name , pid ) |> IO . inspect do
2024 [ { ^ pid , _ref , session_id , _all_sessions } ] -> session_id
2125 [ ] -> nil
2226 end
@@ -58,34 +62,53 @@ defmodule Hound.SessionServer do
5862 { :ok , state }
5963 end
6064
65+ def handle_call ( { :destroy_sessions , pid } , _from , state ) do
66+ destroy_sessions ( pid )
67+ { :reply , :ok , state }
68+ end
6169
6270 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
71+ { ref , sessions } = case :ets . lookup ( @ name , pid ) do
72+ [ { ^ pid , ref , _session_id , sessions } ] ->
73+ { ref , sessions }
74+ [ ] ->
75+ { Process . monitor ( pid ) , % { } }
76+ end
77+
78+
79+ case find_existing_session ( sessions , session_name ) do
80+ { :ok , { session_id , sessions } } ->
81+ Logger . debug ( "Found exsisting session #{ session_name } - #{ session_id } " )
82+
83+ add_session_to_table ( pid , ref , session_id , sessions )
84+
85+ { :reply , { :ok , session_id } , Map . put ( state , ref , pid ) }
86+
87+ :error ->
88+ { :ok , driver_info } = Hound . driver_info ( )
8189
90+ case create_session ( driver_info , opts ) do
91+ { :error , _ } = e -> { :reply , e , state }
92+
93+ { :ok , session_id } ->
94+ Logger . debug ( "Started new session #{ session_name } - #{ session_id } " )
95+
96+ sessions = Map . put ( sessions , session_name , session_id )
97+ add_session_to_table ( pid , ref , session_id , sessions )
98+
99+ { :reply , { :ok , session_id } , Map . put ( state , ref , pid ) }
100+ end
101+ end
102+ end
103+
104+ defp add_session_to_table ( pid , ref , session_id , sessions ) do
82105 :ets . insert ( @ name , { pid , ref , session_id , sessions } )
83- { :reply , session_id , Map . put ( state , ref , pid ) }
84106 end
85107
86- def handle_call ( { :destroy_sessions , pid } , _from , state ) do
87- destroy_sessions ( pid )
88- { :reply , :ok , state }
108+ defp find_existing_session ( sessions , session_name ) do
109+ with { :ok , session_id } <- Map . fetch ( sessions , session_name ) do
110+ { :ok , { session_id , sessions } }
111+ end
89112 end
90113
91114 def handle_info ( { :DOWN , ref , _ , _ , _ } , state ) do
@@ -96,10 +119,7 @@ defmodule Hound.SessionServer do
96119 end
97120
98121 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
122+ Hound.Session . create_session ( driver_info [ :browser ] , opts )
103123 end
104124
105125 defp destroy_sessions ( pid ) do
0 commit comments