@@ -37,7 +37,11 @@ class WebSocketConnection
3737
3838 def initialize ( url :)
3939 @callback_threads = ThreadGroup . new
40- @mtx = Mutex . new
40+
41+ @callbacks_mtx = Mutex . new
42+ @messages_mtx = Mutex . new
43+ @closing_mtx = Mutex . new
44+
4145 @closing = false
4246 @session_id = nil
4347 @url = url
@@ -47,7 +51,7 @@ def initialize(url:)
4751 end
4852
4953 def close
50- @mtx . synchronize do
54+ @closing_mtx . synchronize do
5155 return if @closing
5256
5357 @closing = true
@@ -64,8 +68,8 @@ def close
6468 @socket_thread &.join ( 0.5 )
6569 @callback_threads . list . each do |thread |
6670 thread . join ( 0.5 )
67- rescue StandardError
68- nil
71+ rescue StandardError => e
72+ WebDriver . logger . debug "Failed to join thread during close: #{ e . class } : #{ e . message } " , id : :ws
6973 end
7074 end
7175
@@ -74,18 +78,22 @@ def callbacks
7478 end
7579
7680 def add_callback ( event , &block )
77- @mtx . synchronize do
81+ @callbacks_mtx . synchronize do
7882 callbacks [ event ] << block
7983 block . object_id
8084 end
8185 end
8286
8387 def remove_callback ( event , id )
84- removed = @mtx . synchronize { callbacks [ event ] . reject! { |cb | cb . object_id == id } }
85- return if removed || @closing
88+ @callbacks_mtx . synchronize do
89+ return if @closing
90+
91+ callbacks_for_event = callbacks [ event ]
92+ return if callbacks_for_event . reject! { |cb | cb . object_id == id }
8693
87- ids = @mtx . synchronize { callbacks [ event ] &.map ( &:object_id ) }
88- raise Error ::WebDriverError , "Callback with ID #{ id } does not exist for event #{ event } : #{ ids } "
94+ ids = callbacks [ event ] &.map ( &:object_id )
95+ raise Error ::WebDriverError , "Callback with ID #{ id } does not exist for event #{ event } : #{ ids } "
96+ end
8997 end
9098
9199 def send_cmd ( **payload )
@@ -102,7 +110,7 @@ def send_cmd(**payload)
102110 end
103111
104112 wait . until do
105- @mtx . synchronize { messages . delete ( id ) }
113+ @messages_mtx . synchronize { messages . delete ( id ) }
106114 end
107115 end
108116
@@ -133,7 +141,7 @@ def attach_socket_listener
133141 next unless message [ 'method' ]
134142
135143 params = message [ 'params' ]
136- @mtx . synchronize { callbacks [ message [ 'method' ] ] . dup } . each do |callback |
144+ @messages_mtx . synchronize { callbacks [ message [ 'method' ] ] . dup } . each do |callback |
137145 @callback_threads . add ( callback_thread ( params , &callback ) )
138146 end
139147 end
@@ -154,7 +162,7 @@ def process_frame(frame)
154162 return { } if message . empty?
155163
156164 msg = JSON . parse ( message )
157- @mtx . synchronize { messages [ msg [ 'id' ] ] = msg if msg . key? ( 'id' ) }
165+ @messages_mtx . synchronize { messages [ msg [ 'id' ] ] = msg if msg . key? ( 'id' ) }
158166
159167 WebDriver . logger . debug "WebSocket <- #{ msg } " [ ...MAX_LOG_MESSAGE_SIZE ] , id : :ws
160168 msg
0 commit comments