U
    g)                     @   s\   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	 e
eZG dd dZdS )    N)	CERT_NONE)Thread)sleep)WebSocketAppc                   @   sl   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	e	Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )WebSocketConnection   g?i'  c                    sB   i  _ d  _| _d _i  _d _     fdd d S )Nr   Fc                      s    j S N_started selfr   R/tmp/pip-unpacked-wheel-3ysq0mf8/selenium/webdriver/remote/websocket_connection.py<lambda>,       z.WebSocketConnection.__init__.<locals>.<lambda>)	callbacks
session_idurl_id	_messagesr
   	_start_ws_wait_until)r   r   r   r   r   __init__"   s    zWebSocketConnection.__init__c                 C   s*   | j j| jd | j  d| _d | _d S )N)timeoutF)
_ws_threadjoin_response_wait_timeout_wscloser
   r   r   r   r   r   .   s    
zWebSocketConnection.closec                    s     j d7  _  |} j |d<  jr2 j|d< t|}td| d  j   j	|  
 fdd  j j }d|krt|d n|d } ||S d S )	N   idZ	sessionIdz-> c                      s    j  jkS r   )r   r   r   r   r   r   r   ?   r   z-WebSocketConnection.execute.<locals>.<lambda>errorresult)r   _serialize_commandr   jsondumpsloggerdebug_max_log_message_sizer   sendr   r   pop	Exception_deserialize_result)r   commandpayloaddataresponser"   r   r   r   execute4   s    



zWebSocketConnection.executec                    s@   j }|| jkrg | j|<  fdd}| j| | t|S )Nc                    s     |  d S r   )Z	from_json)paramscallbackeventr   r   	_callbackM   s    z3WebSocketConnection.add_callback.<locals>._callback)event_classr   appendr    )r   r5   r4   
event_namer6   r   r3   r   add_callbackH   s    

z WebSocketConnection.add_callbackc                 C   sF   |j }|| jkrB| j| D ]&}t||kr| j| |  d S qd S r   )r7   r   r    remove)r   r5   Zcallback_idr9   r4   r   r   r   remove_callbackU   s    
z#WebSocketConnection.remove_callbackc                 C   s   t |S r   )next)r   r-   r   r   r   r#   ]   s    z&WebSocketConnection._serialize_commandc              
   C   sH   z| |}tdW n, tk
rB } z|j W Y S d }~X Y nX d S )Nz<The command's generator function did not exit when expected!)r)   r+   StopIterationvalue)r   r"   r-   _exitr   r   r   r,   `   s
    
z'WebSocketConnection._deserialize_resultc                    sZ    fdd} fdd}dd } fdd}t  j|||d	 _t|d
 _ j  d S )Nc                    s
   d _ d S )NTr	   )wsr   r   r   on_openh   s    z.WebSocketConnection._start_ws.<locals>.on_openc                    s     | d S r   )_process_message)rB   messager   r   r   
on_messagek   s    z1WebSocketConnection._start_ws.<locals>.on_messagec                 S   s   t d|  |   d S )Nzerror: )r&   r'   r   )rB   r!   r   r   r   on_errorn   s    z/WebSocketConnection._start_ws.<locals>.on_errorc                      s4    j dr" jjdtidd n jjdd d S )Nzwss://	cert_reqsT)Zssloptsuppress_origin)rI   )r   
startswithr   Zrun_foreverr   r   r   r   r   
run_socketr   s    z1WebSocketConnection._start_ws.<locals>.run_socket)rC   rF   rG   )target)r   r   r   r   r   start)r   rC   rF   rG   rK   r   r   r   r   g   s    zWebSocketConnection._start_wsc                 C   sn   t |}td| d | j  d|kr:|| j|d < d|krj|d }| j|d g D ]}|| q\d S )Nz<- r    methodr2   )r$   loadsr&   r'   r(   r   r   get)r   rE   r2   r4   r   r   r   rD   |   s    
z$WebSocketConnection._process_messagec                 C   s8   | j }| j}|dkr4| }|r"|S ||8 }t| qd S )Nr   )r   _response_wait_intervalr   )r   	conditionr   intervalr"   r   r   r   r      s    zWebSocketConnection._wait_untilN)__name__
__module____qualname__r   rQ   r(   r   r   r1   r:   onr<   r#   r,   r   rD   r   r   r   r   r   r      s   r   )r$   loggingsslr   	threadingr   timer   Z	websocketr   	getLoggerrT   r&   r   r   r   r   r   <module>   s   
