a
    7ñ»j—_  ã                   @  sŒ  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZmZmZmZmZmZmZ d dlZd dlmZ ddlmZ d dlZd dlZd dlZd dlZd dlZd dlZd dl ZedƒZ!dZ"d	Z#d
e$d< dZ%d
e$d< eej&j'ej&j(f Z)e *d¡ +ej,¡ e *d¡Z-G dd„ de.ƒZ/G dd„ de0ƒZ1G dd„ dej2ƒZ3G dd„ de4ƒZ5G dd„ de5d�Z6G dd„ dƒZ7dS )é    )ÚannotationsN)ÚOptionalÚ	GeneratorÚUnionÚ	AwaitableÚCallableÚAnyÚTypeVar)ÚStateé   )Úcdp_utilÚTg{®Gázt?i   ÚintÚMAX_SIZEi  ÚPING_TIMEOUTÚasynciozuc.connectionc                   @  s   e Zd Zdd„ Zdd„ ZdS )ÚProtocolExceptionc                   s�   d | _ d | _|| _t|d tƒrF|d  dd ¡| _ |d  dd ¡| _nFt|d dƒrvd
‡ fdd„	‰ ˆ |d  ¡ ƒ| _ nd dd	„ |D ƒ¡| _ d S )Nr   ÚmessageÚcodeÚto_jsonc              	     sh   d}|   ¡ D ]V\}}d| }t|tƒrJ||› |› dˆ ||d ƒ› d�7 }q||› |› d|› d�7 }q|S )NÚ
ú	z: r   )ÚitemsÚ
isinstanceÚdict)ÚobjZ_dÚresÚkÚvÚspace©Ú	serialize© úSE:\soccer\ml_env\Lib\site-packages\seleniumbase/undetected/cdp_driver/connection.pyr!   1   s    
$z-ProtocolException.__init__.<locals>.serializez| c                 s  s   | ]}t |ƒV  qd S ©N)Ústr)Ú.0Úxr"   r"   r#   Ú	<genexpr><   ó    z-ProtocolException.__init__.<locals>.<genexpr>)r   )	r   r   Úargsr   r   ÚgetÚhasattrr   Újoin)Úselfr*   Úkwargsr"   r    r#   Ú__init__)   s    	zProtocolException.__init__c                 C  s"   | j r| j› d| j › d�S | j› S )Nz [code: ú])r   r   ©r.   r"   r"   r#   Ú__str__>   s    zProtocolException.__str__N)Ú__name__Ú
__module__Ú__qualname__r0   r3   r"   r"   r"   r#   r   (   s   r   c                   @  s   e Zd ZdS )Ú"SettingClassVarNotAllowedExceptionN)r4   r5   r6   r"   r"   r"   r#   r7   B   s   r7   c                      s‚   e Zd ZU dZded< dZded< dZded< dZded	< dd
œ‡ fdd„Ze	dd„ ƒZ
e	dd„ ƒZddœdd„Zdd„ Z‡  ZS )ÚTransactionNr   Ú__cdp_obj__r%   Úmethodr   Úparamsr   Úid)Úcdp_objc                   s@   t ƒ  ¡  || _d| _t| jƒ ¡ ^| _}|r6| ¡ }|| _dS )z!
        :param cdp_obj:
        N)	Úsuperr0   r9   Ú
connectionÚnextÚvaluesr:   Úpopr;   )r.   r=   r;   ©Ú	__class__r"   r#   r0   L   s    
zTransaction.__init__c                 C  s   t  | j| j| jdœ¡S )N)r:   r;   r<   )ÚjsonÚdumpsr:   r;   r<   r2   r"   r"   r#   r   X   s    ÿzTransaction.messagec                 C  s,   z|   ¡ rW dS W n ty&   Y dS 0 dS )NTF)Ú	exceptionÚBaseExceptionr2   r"   r"   r#   Úhas_exception^   s    
zTransaction.has_exception)Úresponsec              
   K  sp   d|v r|   t|d ƒ¡S z| j |d ¡ W n0 ty^ } z|  |j¡W  Y d}~S d}~0 0 td| ƒ‚dS )ze
        Parses the response message and marks the future complete.
        :param response:
        ÚerrorÚresultNz$Could not parse the cdp response:
%s)Zset_exceptionr   r9   ÚsendÚStopIterationZ
set_resultÚvalue)r.   rJ   Úer"   r"   r#   Ú__call__g   s    "ÿzTransaction.__call__c              	   C  sP   |   ¡ r| jrdnd}|   ¡ r$d}nd}d| jj› d| j› d|› d|› d	�	}|S )
NFTÚfinishedÚpendingú<z

	method: z

	status: z
	success: ú>)ÚdonerI   rD   r4   r:   )r.   ÚsuccessÚstatusÚfmtr"   r"   r#   Ú__repr__y   s    ÿþýÿzTransaction.__repr__)r4   r5   r6   r9   Ú__annotations__r:   r;   r<   r0   Úpropertyr   rI   rQ   rZ   Ú__classcell__r"   r"   rC   r#   r8   F   s   


r8   c                      s   e Zd Z‡ fdd„Z‡  ZS )ÚCantTouchThisc                   s6   |dkrt ƒ  ||¡S td d¡|| j||f ƒ‚dS )ú:meta private:r[   r   )zPdon't set '%s' on the %s class directly, as those are shared with other objects.z use `my_object.%s = %s`  insteadN)r>   Ú__setattr__r7   r-   r4   )ÚclsÚattrrO   rC   r"   r#   r`   ‰   s    ÿùÿzCantTouchThis.__setattr__)r4   r5   r6   r`   r]   r"   r"   rC   r#   r^   ˆ   s   r^   c                      sT  e Zd ZU dZded< ded< ded< dJ‡ fdd	„	Zedd
œdd„ƒZejddœdd„ƒZedd„ ƒZ	dddœdd„Z
dd„ Zdd„ ZdKddœdd„Zdd „ ZdLddœd!d"„ZdMd#d$œd%d&„ZdNd#d'œd(d)„ZdOd#d#d#d+œd,d-„ZdPd.d/œd0d1„Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ ZdQd=d>d?œd@dA„ZdBdC„ ZdDdE„ ZdFdG„ ZdHdI„ Z‡  ZS )RÚ
ConnectionNÚboolÚattachedz"websockets.WebSocketClientProtocolÚ	websocketzcdp.target.TargetInfoÚ_targetc                   sn   t ƒ  ¡  || _t d¡| _|| _|| _d | _i | _	t
 t¡| _d | _g | _g | _d | _| jjf i |¤Ž d S )Nr   )r>   r0   rg   Ú	itertoolsÚcountÚ	__count__ÚbrowserÚwebsocket_urlrf   ÚmapperÚcollectionsÚdefaultdictÚlistÚhandlersZ	recv_taskÚenabled_domainsZ_last_resultÚlistenerÚ__dict__Úupdate)r.   rl   Útargetrk   r/   rC   r"   r#   r0   Ÿ   s    
zConnection.__init__)Úreturnc                 C  s   | j S r$   )rg   r2   r"   r"   r#   rv   ´   s    zConnection.target)rv   c                 C  s4   t |tjjƒs*tdtjjjt|ƒjf ƒ‚|| _d S )Nz(target must be set to a '%s' but got '%s)r   Úcdprv   Ú
TargetInfoÚ	TypeErrorr4   Útyperg   )r.   rv   r"   r"   r#   rv   ¸   s    ÿÿc                 C  s   | j s
dS | j jS )NT)rf   Úclosedr2   r"   r"   r#   r|   Á   s    zConnection.closedzUnion[type, types.ModuleType]zUnion[Callable, Awaitable])Úevent_type_or_domainÚhandlerc                 C  sx   t |tjƒrdt |¡D ]H\}}| ¡ r(q|d  ¡ s6qt |tƒsBqt |¡rNq| j|  	|¡ qdS | j|  	|¡ dS )a0  
        Add a handler for given event.
        If event_type_or_domain is a module instead of a type,
        it will find all available events and add the handler.
        If you want to receive event updates (eg. network traffic),
        you can add handlers for those events.
        Handlers can be regular callback functions
        or async coroutine functions (and also just lambdas).
        For example, if you want to check the network traffic:
        .. code-block::
            page.add_handler(
                cdp.network.RequestWillBeSent, lambda event: print(
                    'network event => %s' % event.request
                )
            )
        Next time there's network traffic, you'll see lots of console output.
        :param event_type_or_domain:
        :param handler:
        r   N)
r   ÚtypesÚ
ModuleTypeÚinspectZgetmembers_staticÚisupperr{   Ú	isbuiltinrq   Úappend)r.   r}   r~   Únamer   r"   r"   r#   Úadd_handlerÇ   s    

zConnection.add_handlerc              
   Ë  sÀ   | j r| j jtju rˆz(tj| jttd�I dH | _ t	| ƒ| _
W nJ tfy† } z0t d|¡ | j
rp| j
 ¡ I dH  ‚ W Y d}~n
d}~0 0 | j
r–| j
js®t	| ƒ| _
t d| j¡ |  ¡ I dH  dS )zX
        Opens the websocket connection. Shouldn't be called manually by users.
        )Zping_timeoutÚmax_sizeNz)Exception during opening of websocket: %su&   
âœ… Opened websocket connection to %s)rf   Ústater
   ÚCLOSEDÚ
websocketsÚconnectrl   r   r   ÚListenerrs   Ú	ExceptionÚloggerÚdebugÚcancelÚrunningÚ_register_handlers)r.   ÚkwrP   r"   r"   r#   Úaopení   s&    ý
ÿzConnection.aopenc                 Ã  s„   | j r€| j jtjur€z| j  ¡ I dH  W n  tyH   t d| j¡ Y n0 | j	rr| j	j
rr| j	 ¡ I dH  | j ¡  t d| j¡ dS )zY
        Closes the websocket connection. Shouldn't be called manually by users.
        Nu-   
â�Œ Error closing websocket connection to %su&   
â�Œ Closed websocket connection to %s)rf   rˆ   r
   r‰   Úcloser�   rŽ   r�   rl   rs   r‘   r�   rr   Úclearr2   r"   r"   r#   Úaclose  s    þ

ÿzConnection.acloseç      Ð?úUnion[int, float])Útc                 Ã  s"   |   ¡ I d H  t |¡I d H  d S r$   )Úupdate_targetr   Úsleep)r.   rš   r"   r"   r#   rœ     s    zConnection.sleepc                 C  s   t  |  |¡¡ dS )ab  
        Used in specific cases, mostly during cdp.fetch.RequestPaused events,
        in which the browser literally blocks.
        By using feed_cdp, you can issue a response without a blocking "await".
        Note: This method won't cause a response.
        Note: This is not an async method, just a regular method!
        :param cdp_obj:
        N)r   Zensure_futurerM   )r.   r=   r"   r"   r#   Úfeed_cdp  s    	zConnection.feed_cdpc              	   Ã  s2  |   ¡ I dH  t ¡ }| ¡ }t ¡ �ö tjdtdd� zŽt|t	t
fƒr²z tj| jj ¡ |d�I dH  W n$ tyŒ   | jj ¡ I dH  Y n0 | ¡ | |k rÄt d¡I dH  qŽn| jj ¡ I dH  W nF tjyú   t|t	t
fƒröY W d  ƒ dS Y n t�y   Y n0 W d  ƒ n1 �s$0    Y  dS )zÔ
        Waits until the event listener reports idle
        (no new events received in certain timespan).
        When `t` is provided, ensures waiting for `t` seconds, no matter what.
        :param t:
        NÚignoreú.*coroutine.*©ÚactionÚcategoryr   )Útimeoutçš™™™™™¹?)r›   r   Zget_running_loopÚtimeÚwarningsÚcatch_warningsÚfilterwarningsÚRuntimeWarningr   r   ÚfloatÚwait_forrs   ÚidleÚwaitÚRuntimeErrorrœ   ÚTimeoutErrorÚAttributeError)r.   rš   ÚloopÚ
start_timer"   r"   r#   r­   *  s2    
ýÿzConnection.waitzOptional[str])Úlocalec                 Ã  s0   | j d|d�I dH  |  tj |¡¡I dH  dS )z:Sets the Language Locale code via set_user_agent_override.Ú )Ú
user_agentÚaccept_languageN)Úset_user_agentrM   rx   Ú	emulationZset_locale_override)r.   r³   r"   r"   r#   Ú
set_localeN  s    zConnection.set_locale)Útimezonec                 Ã  s   |   tj |¡¡I dH  dS )z,Sets the Timezone via set_timezone_override.N)rM   rx   r¸   Zset_timezone_override)r.   rº   r"   r"   r#   Úset_timezoneS  s    zConnection.set_timezoner´   ©rµ   r¶   Úplatformc                 Ã  s*   |sd}|   tjj|||d�¡I dH  dS )z0Sets the User Agent via set_user_agent_override.r´   r¼   N)rM   rx   ÚnetworkZset_user_agent_override)r.   rµ   r¶   r½   r"   r"   r#   r·   W  s    
ýzConnection.set_user_agentzOptional[tuple])Úgeolocationc                 Ã  sJ   |   tjjddidd�¡I dH  |   tjj|d |d dd	�¡I dH  dS )
z1Sets the User Agent via set_geolocation_override.r…   r¿   Zgranted)Z
permissionZsettingNr   r   éd   )ZlatitudeZ	longitudeZaccuracy)rM   rx   rk   Zset_permissionr¸   Zset_geolocation_override)r.   r¿   r"   r"   r#   Úset_geolocationf  s    
ÿ
ýzConnection.set_geolocationc                 C  s(   zt | j|ƒW S  ty"   ‚ Y n0 dS ©r_   N)Úgetattrrv   r°   )r.   Úitemr"   r"   r#   Ú__getattr__q  s    zConnection.__getattr__c                 Ã  s   | S )r_   r"   r2   r"   r"   r#   Ú
__aenter__x  s    zConnection.__aenter__c                 Ã  s"   |   ¡ I dH  |r|r||ƒ‚dS rÂ   )r—   )r.   Úexc_typeÚexc_valÚexc_tbr"   r"   r#   Ú	__aexit__|  s    zConnection.__aexit__c                 C  s   |   ¡  ¡ S )z”
        Updates targets and wait for event listener to report idle.
        Idle is reported when no new events are received for 1 second.
        )r­   Ú	__await__r2   r"   r"   r#   rË   ‚  s    zConnection.__await__c                 Ã  s(   | j tj | j¡dd�I d H }|| _d S )NT©Ú
_is_update)rM   rx   rv   Zget_target_infoZ	target_id)r.   Ztarget_infor"   r"   r#   r›   ‰  s    ÿzConnection.update_targetTz.Generator[dict[str, Any], dict[str, Any], Any]r   )r=   rw   c                 Ã  s®  |   ¡ I dH  | jr"| jjtju r&dS | jrd| j}|jrd|jjrN|  ¡ I dH  |jj	rd|  
¡ I dH  | jrr| jjs|t| ƒ| _�zt|ƒ}| |_| js t d¡| _t| jƒ|_| j |j|i¡ |sÐ|  ¡ I dH  | j |j¡I dH  t ¡ �† tjdtdd� z|I dH W W  d  ƒ W S  t�yb } z.| jd|j› d|j › �7  _|‚W Y d}~n
d}~0 0 W d  ƒ n1 �sz0    Y  W n" t!�y¨   |  "¡ I dH  Y n0 dS )a¦  
        Send a protocol command.
        The commands are made using any of the cdp.<domain>.<method>()'s
        and is used to send custom cdp commands as well.
        :param cdp_obj: The generator object created by a cdp method
        :param _is_update: Internal flag
            Prevents infinite loop by skipping the registeration of handlers
            when multiple calls to connection.send() are made.
        Nr   rž   rŸ   r    z	
command:z
params:)#r”   rf   rˆ   r
   r‰   rk   ÚconfigZexpertÚ_prepare_expertZheadlessÚ_prepare_headlessrs   r‘   rŒ   r8   r?   rm   rh   ri   rj   r@   r<   ru   r’   rM   r   r¦   r§   r¨   r©   r   r:   r;   r�   r—   )r.   r=   rÍ   rk   ÚtxrP   r"   r"   r#   rM   �  sF    

ý>zConnection.sendc                 Ã  s@  | j  ¡ }| j ¡ D �]}d}t| j| ƒdkr>| j |¡ qt|tƒrTt |j	¡}|| j v rt||v r| 
|¡ qq|| j vr|tjtjfv r�qz4t d|¡ | j  |¡ | j| ¡ dd�I dH  W q t�y    tjddd� z| j  
|¡ W n( t�y   tjddd� Y Y qY n0 Y q0 q|D ]}| j  
|¡ �q(dS )	zx
        Ensure that for current (event) handlers, the corresponding
        domain is enabled in the protocol.
        Nr   zRegistered %sTrÌ   r´   ©Úexc_infozNOT GOOD)rr   Úcopyrq   ÚlenrB   r   r{   ÚutilZcdp_get_moduler5   Úremoverx   rv   ZstoragerŽ   r�   r„   rM   ÚenablerH   )r.   rr   Z
event_typeZ
domain_modZedr"   r"   r#   r’   Á  s8    




zConnection._register_handlersc                 Ã  s   d S r$   r"   r2   r"   r"   r#   rÐ   ê  s    zConnection._prepare_headlessc                 Ã  sh   t | dd ƒrd S | jrXd}d}|| }|  tj d| ¡¡I d H  |  tj ¡ ¡I d H  t| ddƒ d S )NZ_prep_expert_donez"Element.prototype._attachShadow = zElement.prototype.attachShadowzÎ
                    %s;
                    Element.prototype.attachShadow = function () {
                        return this._attachShadow( { mode: "open" } );
                    };
                    T)rÃ   Ú_ownerÚ_send_oneshotrx   ÚpageZ&add_script_to_evaluate_on_new_documentrØ   Úsetattr)r.   Zpart1Zpart2Úpartsr"   r"   r#   rÏ   í  s    ûÿÿ

zConnection._prepare_expertc                 Ã  s^   t |ƒ}| |_d|_| j |j|i¡ | j |j¡I d H  z|I d H W S  tyX   Y n0 d S )Néþÿÿÿ)	r8   r?   r<   rm   ru   rf   rM   r   r   )r.   r=   rÑ   r"   r"   r#   rÚ     s    zConnection._send_oneshot)NNN)r˜   )N)N)N)r´   NN)N)T)r4   r5   r6   re   r[   r0   r\   rv   Úsetterr|   r†   r”   r—   rœ   r�   r­   r¹   r»   r·   rÁ   rÅ   rÆ   rÊ   rË   r›   rM   r’   rÐ   rÏ   rÚ   r]   r"   r"   rC   r#   rc   š   sJ   
   ü
&$   ü	 ý2)rc   )Ú	metaclassc                   @  sf   e Zd Zddœdd„Zdd„ Zedd„ ƒZejd	d
œdd„ƒZdd„ Zedd„ ƒZ	dd„ Z
dd„ ZdS )rŒ   rc   )r?   c                 C  sP   || _ t ¡ | _d| _d | _ttdtjj	ƒ}|s4dnd| _
t ¡ | _|  ¡  d S )Niè  Úps1r¤   g      è?)r?   rn   ÚdequeÚhistoryZmax_historyÚtaskrÃ   ÚsysÚflagsÚinteractiveÚ_time_before_considered_idler   ÚEventr¬   Úrun)r.   r?   Úis_interactiver"   r"   r#   r0     s    

zListener.__init__c                 C  s   t  |  ¡ ¡| _d S r$   )r   Úcreate_taskÚlistener_looprä   r2   r"   r"   r#   rê     s    zListener.runc                 C  s   | j S r$   ©rè   r2   r"   r"   r#   Útime_before_considered_idle  s    z$Listener.time_before_considered_idler™   )Úsecondsc                 C  s
   || _ d S r$   rî   )r.   rð   r"   r"   r#   rï   !  s    c                 Ã  sD   | j r@| j  ¡ s@| j  ¡  z| j I d H  W n tjy>   Y n0 d S r$   )rä   Z	cancelledr�   r   ÚCancelledErrorr2   r"   r"   r#   r�   %  s    
zListener.cancelc                 C  s   | j s
dS | j  ¡ rdS dS )NFT)rä   rV   r2   r"   r"   r#   r‘   -  s
    
zListener.runningc                 Ã  s<  z t  | jj ¡ | j¡I d H }W n€ t jyX   | j ¡  t  	| jd ¡I d H  Y q Y nJ t
fy  } z0t d|¡ | j ¡  W Y d }~�q8W Y d }~n
d }~0 0 | js¶| j ¡  �q8| j ¡  t |¡}d|v �rL|d | jjv �r| jj |d ¡}t d||d ¡ |f i |¤Ž n0|d dk�r6| jj d¡}|r |f i |¤Ž q q ztj |¡}W n” t
�y® } z8tjdt|ƒj|j|f dd� W Y d }~q W Y d }~nLd }~0  t�yð } z*tjd	| dd� W Y d }~q W Y d }~n
d }~0 0 �zt|ƒ| jjv �r| jjt|ƒ }nW q t|ƒ�s,W q |D ]Î}z†t |¡�sNt  |¡�rŠzt  !||| jƒ¡ W n" t"�y†   t  !||ƒ¡ Y n0 n.z||| jƒ W n t"�y¶   ||ƒ Y n0 W n@ t
�yú } z&tj#d
||j$j|dd� ‚ W Y d }~n
d }~0 0 �q0W q  t j%�y   Y �q8Y q  t
�y2   ‚ Y q 0 q q d S )Né
   z9Connection listener exception while reading websocket:
%sr<   z!Got answer for %s (message_id:%d)rÞ   z-%s: %s during parsing of json from event : %sTrÒ   zKeyError: %sz+Exception in callback %s for event %s => %s)&r   r«   r?   rf   Úrecvrï   r¯   r¬   Úsetrœ   r�   rŽ   r�   r‘   r–   rE   Úloadsrm   rB   r+   rx   rÖ   Zparse_json_eventÚinfor{   r4   r*   ÚKeyErrorrq   rÕ   r�   ÚiscoroutinefunctionÚiscoroutinerì   rz   ÚwarningrD   rñ   )r.   ÚmsgrP   r   rÑ   ÚeventÚ	callbacksÚcallbackr"   r"   r#   rí   5  s¤    
þ
þ
$




ÿÿý "
ÿþ
ÿû 
zListener.listener_loopc                 C  sV   | j  ¡ rdnd}dt| jƒ› d�}d| j› d�}| jj› d|› d|› d|› d�}|S )Nz[idle]z[busy]z[cache size: r1   z
[running: ú rU   )r¬   Úis_setrÕ   rã   r‘   rD   r4   )r.   Zs_idleZs_cache_lengthZ	s_runningÚsr"   r"   r#   rZ   ‘  s
     zListener.__repr__N)r4   r5   r6   r0   rê   r\   rï   rß   r�   r‘   rí   rZ   r"   r"   r"   r#   rŒ     s   


\rŒ   )8Ú
__future__r   r   rn   r�   rh   rE   Úloggingrå   r   r¦   Útypingr   r   r   r   r   r   r	   rŠ   Zwebsockets.protocolr
   r´   r   rÖ   Zmycdprx   Zmycdp.networkZ
mycdp.pageZmycdp.storageZmycdp.runtimeZmycdp.targetZ
mycdp.utilr   ZGLOBAL_DELAYr   r[   r   rv   ry   ZTargetIDZ
TargetTypeÚ	getLoggerÚsetLevelÚCRITICALrŽ   r�   r   ÚPermissionErrorr7   ÚFuturer8   r{   r^   rc   rŒ   r"   r"   r"   r#   Ú<module>   sF   $	
B  w