
    ]j                         d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ dedefd	Z G d
 dej                        Z ej"                  e      Z G d d      Zy)    N)	CERT_NONE)Thread)sleep)WebSocketApp)WebDriverExceptionnamereturnc                 f    | j                  d      }|d   dj                  d |dd D              z   S )z=Convert snake_case field name to camelCase for BiDi protocol._r    c              3   <   K   | ]  }|j                           y wN)title).0ps     b/home/ubuntu/.local/lib/python3.12/site-packages/selenium/webdriver/remote/websocket_connection.py	<genexpr>z"_snake_to_camel.<locals>.<genexpr>"   s     ;Aaggi;s      N)splitjoin)r   partss     r   _snake_to_camelr      s3    JJsOE8bgg;qr;;;;    c                   (     e Zd ZdZd Z fdZ xZS )_BiDiEncodera  JSON encoder for BiDi dataclass instances.

    Converts snake_case field names to camelCase, strips ``None`` values,
    and flattens a ``properties`` field (e.g. ``PointerCommonProperties``)
    directly into its parent action dict as required by the BiDi spec.
    c                 l   t        j                  |      r!t        |t              s| j	                  |      S t        |t
              r|D cg c]  }| j                  |       c}S t        |t              r3|j                         D ci c]  \  }}|| j                  |       c}}S |S c c}w c c}}w )zKRecursively convert a value, handling nested dataclasses, lists, and dicts.)	dataclassesis_dataclass
isinstancetypedefaultlist_convertdictitems)selfvalueitemkvs        r   r#   z_BiDiEncoder._convert-   s    ##E*:eT3J<<&&eT"49:DDMM$'::eT"49KKMBDAqAt}}Q''BB ;Bs   B+	B0c                 N   t        j                  |      r t        |t              si }t        j                  |      D ]  }t        ||j                        }||j                  j                  d      s7t        |j                        }|dk(  rpt        j                  |      r[t        j                  |      D ]B  }t        ||j                        }|| j                  |      |t        |j                        <   D | j                  |      ||<    |S t        | 1  |      S )Nretain_none
properties)r   r   r   r    fieldsgetattrr   metadatagetr   r#   superr!   )	r&   oresultfr'   	camel_keypfpv	__class__s	           r   r!   z_BiDiEncoder.default7   s    ##A&z!T/BF ''* =166* =)F+AFF3	,1I1I%1P)007 Q$UBGG4>?C}}R?PF?277#;<Q
 )-e(<F9%=  Mwq!!r   )__name__
__module____qualname____doc__r#   r!   __classcell__)r9   s   @r   r   r   %   s    " "r   r   c                   P    e Zd ZdZd Zd Zd Zd ZeZd Z	d Z
d Zd	 Zd
 Zd Zy)WebSocketConnectioni'  c                     t        |t        t        f      r|dk  rt        d      t        |t        t        f      r|dk  rt        d      | _        | _        | _        i  _        d  _        d _	        t        j                          _        i  _        d _         j                           j!                   fd       y )Nr   z!timeout must be a positive numberz"interval must be a positive numberFc                       j                   S r   _startedr&   s   r   <lambda>z.WebSocketConnection.__init__.<locals>.<lambda>f   s     r   )r   intfloatr   urlresponse_wait_timeoutresponse_wait_interval	callbacks
session_id_id	threadingLock_id_lock	_messagesrD   	_start_ws_wait_until)r&   rI   timeoutintervals   `   r   __init__zWebSocketConnection.__init__T   s    'C<0GaK$%HII(S%L1Wq[$%IJJ%,"&.#!(./r   c                     | j                   j                  | j                         | j                  j	                          d| _        d | _        y )N)rU   F)
_ws_threadr   rJ   _wscloserD   rE   s    r   r[   zWebSocketConnection.closeh   s9    T%?%?@r   c                      j                   5   xj                  dz  c_         j                  d d d         j                  |      }|d<    j                  r j                  |d<   t	        j
                  |t              }t        j                  d| d  j                           j                  j                  |        j                   fd        j                  vrt        d        j                  j                        }d|v r)|d   }d	|v r| d
|d	    }t        |      t        |      |d   } j!                  ||      S # 1 sw Y   &xY w)Nr   id	sessionId)clsz-> c                        j                   v S r   )rR   )
current_idr&   s   r   rF   z-WebSocketConnection.execute.<locals>.<lambda>{   s    t~~!= r   z/Timed out waiting for response to BiDi command errormessagez: r4   )rQ   rN   _serialize_commandrM   jsondumpsr   loggerdebug_max_log_message_sizerZ   sendrT   rR   r   pop_deserialize_result)	r&   commandpayloaddataresponserb   	error_msgr4   ra   s	   `       @r   executezWebSocketConnection.executen   sL   ]] 	"HHMHJ	" ))'2"??#'??GK zz'|4s4&\">D$>$>?@d=>T^^+$'VWaVb%cdd>>%%j1hW%EH$$gR(;'<=	(33(//h'F++FG<<5	" 	"s   "EEc                     j                   }|| j                  vrg | j                  |<   fd}| j                  |   j                  |       t        |      S )Nc                 4     j                  |              y r   )	from_json)paramscallbackevents    r   	_callbackz3WebSocketConnection.add_callback.<locals>._callback   s    U__V,-r   )event_classrL   appendr]   )r&   rx   rw   
event_namery   s    ``  r   add_callbackz WebSocketConnection.add_callback   sP    &&
T^^+)+DNN:&	. 	z")))4)}r   c                     |j                   }|| j                  v rC| j                  |   D ]0  }t        |      |k(  s| j                  |   j                  |        y  y y r   )rz   rL   r]   remove)r&   rx   callback_idr|   rw   s        r   remove_callbackz#WebSocketConnection.remove_callback   s\    &&
' NN:6 h<;.NN:.55h? (r   c                     t        |      S r   )next)r&   rm   s     r   rd   z&WebSocketConnection._serialize_command   s    G}r   c                     	 |j                  |      }t        d      # t        $ r}|j                  cY d }~S d }~ww xY w)Nz<The command's generator function did not exit when expected!)rj   r   StopIterationr'   )r&   r4   rm   r   exits        r   rl   z'WebSocketConnection._deserialize_result   s;    	V$A$%cdd 	::	s    	=8==c                       fd} fd}d } fd}t         j                  |||       _        t        |d       _         j                  j                          y )Nc                     d_         y )NTrC   )wsr&   s    r   on_openz.WebSocketConnection._start_ws.<locals>.on_open   s
     DMr   c                 (    j                  |       y r   )_process_message)r   rc   r&   s     r   
on_messagez1WebSocketConnection._start_ws.<locals>.on_message   s    !!'*r   c                 T    t         j                  d|        | j                          y )Nzerror: )rg   rh   r[   )r   rb   s     r   on_errorz/WebSocketConnection._start_ws.<locals>.on_error   s    LL75'*+HHJr   c                       j                   j                  d      r$ j                  j                  dt        id       y  j                  j                  d       y )Nzwss://	cert_reqsT)ssloptsuppress_origin)r   )rI   
startswithrZ   run_foreverr   rE   s   r   
run_socketz1WebSocketConnection._start_ws.<locals>.run_socket   sG    xx""8,$$[),DVZ$[$$T$:r   )r   r   r   T)targetdaemon)r   rI   rZ   r   rY   start)r&   r   r   r   r   s   `    r   rS   zWebSocketConnection._start_ws   sN    	!	+		;  'j[cd 
4@r   c                 :   t        j                  |      }t        j                  d| d | j                          d|v r|| j
                  |d   <   d|v rG|d   }| j                  j                  |d   g       D ]  }t        ||fd      j                          ! y y )Nz<- r]   methodrv   T)r   argsr   )
re   loadsrg   rh   ri   rR   rL   r1   r   r   )r&   rc   rv   rw   s       r   r   z$WebSocketConnection._process_message   s    **W%s7)_%At'A'ABC7?,3DNN74=)wX&F NN..wx/@"E MhfYtDJJLM r   c                     | j                   }| j                  }|dkD  r" |       }|r|S ||z  }t        |       |dkD  r!y y )Nr   )rJ   rK   r   )r&   	conditionrU   rV   r4   s        r   rT   zWebSocketConnection._wait_until   sH    ,,..k[F8#h kr   N)r:   r;   r<   ri   rW   r[   rr   r}   onr   rd   rl   rS   r   rT    r   r   r@   r@   Q   sB     0(=:	 
B *
M
 r   r@   )r   re   loggingrO   sslr   r   timer   	websocketr   selenium.commonr   strr   JSONEncoderr   	getLoggerr:   rg   r@   r   r   r   <module>r      sh   $        " .<# <# <&"4## &"R 
		8	$D  D r   