Ë
    cQbjà  ã                   óÒ   — 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     úa/var/www/html/venv/lib/python3.12/site-packages/selenium/webdriver/remote/websocket_connection.pyú	<genexpr>z"_snake_to_camel.<locals>.<genexpr>"   s   è ø€ Ò;¨A˜aŸg™gŸiÑ;ùs   ‚é   N)ÚsplitÚjoin)r   Úpartss     r   Ú_snake_to_camelr      s3   € à�J‰J�s‹O€EØ�‰8�b—g‘gÑ;°°q°r°Ô;Ó;Ñ;Ð;ó    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Ô*´:¸eÄTÔ3JØ—<‘< Ó&Ð&Ü�eœTÔ"Ø49Ö:¨D�D—M‘M $Õ'Ò:Ð:Ü�eœTÔ"Ø49·K±K³M×B©D¨A¨q�A�t—}‘} QÓ'Ñ'ÓBÐBØˆùò ;ùãBs   ÁB+Â	B0c                 óN  •— t        j                  |«      �r t        |t        «      sði }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Ü ×'Ñ'¨Ó*ò =�Ü  1§6¡6Ó*�ð �=¨¯©¯©¸Ô)FØÜ+¨A¯F©FÓ3�	à Ò,´×1IÑ1IÈ%Ô1PÜ)×0Ñ0°Ó7ò Q˜Ü$ U¨B¯G©GÓ4˜Ø™>Ø?C¿}¹}ÈRÓ?P˜F¤?°2·7±7Ó#;Ò<ñQð
 )-¯©°eÓ(<�F˜9Ò%ð=ð  ˆ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¬ <Ô0°G¸a²KÜ$Ð%HÓIÐIÜ˜(¤S¬% LÔ1°W¸q²[Ü$Ð%IÓJÐJàˆŒØ%,ˆÔ"Ø&.ˆÔ#àˆŒØˆŒØˆŒÜ!Ÿ™Ó(ˆŒØˆŒØˆŒà�‰ÔØ×ÑÓ.Õ/r   c                 ó.  — | j                   �	 | j                   j                  «        | j
                  �&| j
                  j                  | j                  ¬«       d| _        d | _         y # t        $ r"}t        j	                  d|› �«       Y d }~Œgd }~ww xY w)Nz*Error while closing websocket connection: )rU   F)	Ú_wsÚcloseÚ	ExceptionÚloggerÚdebugÚ
_ws_threadr   rJ   rD   )r&   Úes     r   rZ   zWebSocketConnection.closeh   s‚   € ð �8‰8ÐðOØ—‘—‘Ô ð �?‰?Ð&Ø�O‰O× Ñ ¨×)CÑ)CÐ ÔDØˆŒØˆ�øô ò OÜ—‘ÐIÈ!ÈÐM×NÑNûðOús   ŽA) Á)	BÁ2BÂB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   r\   r]   Ú_max_log_message_sizerY   ÚsendrT   rR   r   ÚpopÚ_deserialize_result)	r&   ÚcommandÚpayloadÚdataÚresponserf   Ú	error_msgr4   re   s	   `       @r   ÚexecutezWebSocketConnection.executev   sL  ù€ Ø�]‰]ñ 	"Ø�HŠH˜‰M�HØŸ™ˆJ÷	"ð ×)Ñ)¨'Ó2ˆØ"ˆ�‰Ø�?Š?Ø#'§?¡?ˆG�KÑ ä�z‰z˜'¤|Ô4ˆÜ�‰�s˜4˜&�\Ð"> D×$>Ñ$>Ð?Ô@Ø�‰�‰�dÔà×ÑÔ=Ô>Ø˜TŸ^™^Ñ+Ü$Ð'VÐWaÐVbÐ%cÓdÐdØ—>‘>×%Ñ% jÓ1ˆà�hÑØ˜WÑ%ˆEØ˜HÑ$Ø$˜g R¨°Ñ(;Ð'<Ð=�	Ü(¨Ó3Ð3ä(¨Ó/Ð/à˜hÑ'ˆFØ×+Ñ+¨F°GÓ<Ð<÷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   Úappendra   )r&   rz   ry   Ú
event_namer{   s    ``  r   Úadd_callbackz WebSocketConnection.add_callback“   sP   ù€ Ø×&Ñ&ˆ
Ø˜TŸ^™^Ñ+Ø)+ˆD�N‰N˜:Ñ&õ	.ð 	�‰�zÑ"×)Ñ)¨)Ô4Ü�)‹}Ðr   c                 ó¾   — |j                   }|| j                  v rC| j                  |   D ]0  }t        |«      |k(  sŒ| j                  |   j                  |«        y  y y r   )r|   rL   ra   Úremove)r&   rz   Úcallback_idr~   ry   s        r   Úremove_callbackz#WebSocketConnection.remove_callback    s\   € Ø×&Ñ&ˆ
Ø˜Ÿ™Ñ'Ø ŸN™N¨:Ñ6ò �Ü�h“< ;Ó.Ø—N‘N :Ñ.×5Ñ5°hÔ?Ùñð (r   c                 ó   — t        |«      S r   )Únext)r&   ro   s     r   rh   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!)rl   r   ÚStopIterationr'   )r&   r4   ro   r   Úexits        r   rn   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
   ø€ Ø ˆD�Mr   c                 ó(   •— ‰j                  |«       y r   )Ú_process_message)r‹   rg   r&   s     €r   Ú
on_messagez1WebSocketConnection._start_ws.<locals>.on_message¶   s   ø€ Ø×!Ñ! 'Õ*r   c                 óT   — t         j                  d|› �«       | j                  «        y )Nzerror: )r\   r]   rZ   )r‹   rf   s     r   Úon_errorz/WebSocketConnection._start_ws.<locals>.on_error¹   s   € Ü�L‰L˜7 5 'Ð*Ô+Ø�H‰H�Jr   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   Ú
startswithrY   Úrun_foreverr   rE   s   €r   Ú
run_socketz1WebSocketConnection._start_ws.<locals>.run_socket½   sG   ø€ Ø�x‰x×"Ñ" 8Ô,Ø—‘×$Ñ$¨[¼)Ð,DÐVZÐ$Õ[à—‘×$Ñ$°TÐ$Õ:r   )rŒ   r�   r‘   T)ÚtargetÚdaemon)r   rI   rY   r   r^   Ú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<- ra   Úmethodrx   T)r™   Úargsrš   )
ri   Úloadsr\   r]   rk   rR   rL   r1   r   r›   )r&   rg   rx   ry   s       r   rŽ   z$WebSocketConnection._process_messageÇ   sž   € Ü—*‘*˜WÓ%ˆÜ�‰�s˜7˜)�_Ð%A t×'AÑ'AÐBÔCà�7‰?Ø,3ˆD�N‰N˜7 4™=Ñ)à�wÑØ˜XÑ&ˆFØ ŸN™N×.Ñ.¨w°xÑ/@À"ÓEò M�Ü˜h¨f¨Y¸tÔ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<   rk   rW   rZ   rt   r   Úonrƒ   rh   rn   rS   rŽ   rT   © r   r   r@   r@   Q   sB   „ Ø Ðò0ò(ò=ò:	ð 
€Bòòòò ò*
Mó
 r   r@   )r   ri   ÚloggingrO   Ússlr   r   Útimer   Ú	websocketr   Úselenium.commonr   Ústrr   ÚJSONEncoderr   Ú	getLoggerr:   r\   r@   r£   r   r   ú<module>r¬      sh   ðó$ Û Û Û Ý Ý Ý å "å .ð<˜#ð < #ó <ô&"�4×#Ñ#ô &"ðR 
ˆ×	Ñ	˜8Ó	$€÷L ò L r   