o
    _c                     @   s  d 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
 ddlmZ ddlZddlmZ ddlmZmZ eeZdejded	dfd
dZdeded	efddZded	efddZdededed	e	eef fddZde
e d	dfddZdddejej dZde	d	efddZ deded	efd d!Z!deded"eege"f d#e#d$ej$d	efd%d&Z%d'ed(ed	e&fd)d*Z'd+ed	e"fd,d-Z(dS ).zHelper functions.    N)Any	AwaitableCallableDictList)EventEmitter)
CDPSession)ElementHandleErrorTimeoutError_loggermsgreturnc                 C   s"   t jr
| | dS | | dS )zLog error messages.N)	pyppeteerDEBUGerrordebug)r   r    r   ;/usr/local/lib/python3.10/dist-packages/pyppeteer/helper.py
debugError   s   r   funargsc                 G   s*   d dd |D }d|  d| d}|S )z&Convert function and arguments to str.z, c                 S   s"   g | ]}t |d u rdn|qS )N	undefined)jsondumps).0argr   r   r   
<listcomp>   s    z$evaluationString.<locals>.<listcomp>(z)())join)r   r   _argsexprr   r   r   evaluationString   s
   
r"   exceptionDetailsc                 C   s   |  d}|r| dp| dS |  dd}|  dt }|rT| dD ].}t| ddd	 t| d
d d	 t| d }| dd}|d| d| d }q%|S )z5Get exception message from `exceptionDetails` object.	exceptiondescriptionvaluetext 
stackTraceZ
callFramesurl:Z
lineNumberZcolumnNumberfunctionNamez<anonymous>z
    at z (r   )getdictstr)r#   r$   messager)   Z	callframelocationr,   r   r   r   getExceptionMessage&   s$   
r2   emitter	eventNamehandlerc                 C   s   |  || | ||dS )z6Add handler to the emitter and return emitter/handler.r3   r4   r5   )onr6   r   r   r   addEventListener9   s   r8   	listenersc                 C   s:   | D ]}|d }|d }|d }| || q|   dS )zRemove listeners from emitter.r3   r4   r5   N)Zremove_listenerclear)r9   listenerr3   r4   r5   r   r   r   removeEventListeners@   s   r<   )-0NaNNInfinity	-InfinityremoteObjectc                 C   sn   |  dr	td|  d}|r2|dkrdS |dkrdS |dkr#tjS |d	kr+tj S td
||  dS )z!Serialize value of remote object.objectIdz+Cannot extract value when objectId is givenZunserializableValuer=   r   r>   Nr?   r@   z$Unsupported unserializable value: {}r&   )r-   r	   mathinfformat)rA   r&   r   r   r   valueFromRemoteObjectS   s    


rF   clientc              
   C   sj   | d}| j }|d |s|S z	| dd|iW S  ty4 } ztt| W Y d}~|S d}~ww )zRelease remote object.rB   NzRuntime.releaseObject)r-   _loopcreate_future
set_resultsend	Exceptionr   logger)rG   rA   rB   Zfut_noneer   r   r   releaseObjectg   s   


rO   	predicatetimeoutloopc                    s   |  dtddffdddtddffdddfd	d
}dtddf fdd}t| ||r=|| dfdd S )z+Wait for an event emitted from the emitter.targetr   Nc                         |  d S N)rJ   rS   promiser   r   resolveCallback      z%waitForEvent.<locals>.resolveCallbackr$   c                    rT   rU   )set_exception)r$   rW   r   r   rejectCallback   rZ   z$waitForEvent.<locals>.rejectCallbackc                      s&   t d I d H   td d S )Ni  z(Timeout exceeded while waiting for event)asynciosleepr
   r   )r\   rQ   r   r   timeoutTimer   s
   z"waitForEvent.<locals>.timeoutTimerc                    s   | sd S    |  d S rU   r   rV   )cleanuprP   rY   r   r   	_listener   s   zwaitForEvent.<locals>._listenerc                      s   t g r   d S d S rU   )r<   cancelr   )eventTimeoutr;   rQ   r   r   r`      s   
zwaitForEvent.<locals>.cleanup)r   N)rI   r   rL   r8   create_task)r3   r4   rP   rQ   rR   r_   ra   r   )r`   rc   r;   rP   rX   r\   rY   rQ   r   waitForEventz   s   re   objnamec                 C   sF   | | }t |tst| dt| |dk r!t| d| |S )z;Get and check the value of name in obj is positive integer.z must be integer: r   z must be positive integer: )
isinstanceint	TypeErrortype
ValueError)rf   rg   r&   r   r   r   get_positive_int   s   
rm   funcc                 C   s0   |   } | ds| drdS d| v rdS dS )z+Heuristically check function or expression.functionzasync Tz=>F)strip
startswith)rn   r   r   r   	is_jsfunc   s   rr   ))__doc__r]   r   loggingrC   typingr   r   r   r   r   Zpyeer   r   Zpyppeteer.connectionr   Zpyppeteer.errorsr	   r
   	getLogger__name__rM   Loggerr   r/   r"   r.   r2   r8   r<   rD   ZunserializableValueMaprF   rO   boolfloatAbstractEventLoopre   ri   rm   rr   r   r   r   r   <module>   sN   
	

	



#