o
    ç÷¡g„  ã                   @   s�   d dl Z zd dlZW n ey   dZY nw 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Zi Zdd„ Zd	d
„ ZG dd„ deƒZdS )é    N)Úuuid4)ÚIOLoop)Ú_ERRNO_CONNRESET)Úerrno_from_exceptioni €  c                 C   sT   | j d }| |¡}| j|v sJ ‚| | j¡ |s&| |¡ |s(| ¡  d S d S d S )Nr   )Úsrc_addrÚgetÚidÚpopÚclear)ÚworkerÚclientsÚipÚworkers© r   ú8/usr/local/lib/python3.10/dist-packages/webssh/worker.pyÚclear_worker   s   


ýr   c                 C   s,   | j rd S t d | j¡¡ | jdd� d S )NzRecycling worker {}zworker recycled©Úreason)ÚhandlerÚloggingÚwarningÚformatr   Úclose)r   r   r   r   Úrecycle_worker   s   r   c                   @   sR   e Zd Zdd„ Zdd„ Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dd„ Z
ddd„ZdS )ÚWorkerc                 C   sJ   || _ || _|| _|| _| ¡ | _|  ¡ | _g | _d | _	t
j| _d| _d S )NF)ÚloopÚsshÚchanÚdst_addrÚfilenoÚfdÚgen_idr   Údata_to_dstr   r   ÚREADÚmodeÚclosed)Úselfr   r   r   r   r   r   r   Ú__init__&   s   


zWorker.__init__c                 C   sB   |t j@ r	|  ¡  |t j@ r|  ¡  |t j@ r| jdd� d S d S )Nzerror event occurredr   )r   r#   Úon_readÚWRITEÚon_writeÚERRORr   )r&   r    Úeventsr   r   r   Ú__call__2   s   


ÿzWorker.__call__c                 C   s   t rt jdd�S tƒ jS )Né    )Únbytes)ÚsecretsÚtoken_urlsafer   Úhex)Úclsr   r   r   r!   :   s   zWorker.gen_idc                 C   s   | j s|| _ d S d S ©N)r   )r&   r   r   r   r   Úset_handler>   s   
ÿzWorker.set_handlerc                 C   sH   | j |kr| j | j|¡ || _ |tjkr"| j d| | jtj¡ d S d S )Ngš™™™™™¹?)r$   r   Úupdate_handlerr    r   r)   Ú
call_later)r&   r$   r   r   r   r6   B   s   

ÿzWorker.update_handlerc              
   C   s  t  d | j¡¡ z| j t¡}W n1 ttfyB } z#t  	|¡ | jj
s*t|ƒtv r7| jdd� W Y d }~d S W Y d }~d S d }~ww t  dj|g| j¢R Ž ¡ |sZ| jdd� d S t  dj|g| jj¢R Ž ¡ z| jj|dd� W d S  tjjy…   | jd	d� Y d S w )
Nzworker {} on readzchan error on readingr   z{!r} from {}:{}zchan closedú{!r} to {}:{}T)Úbinaryzwebsocket closed)r   Údebugr   r   r   ÚrecvÚBUF_SIZEÚOSErrorÚIOErrorÚerrorr%   r   r   r   r   r   r   Úwrite_messageÚtornadoÚ	websocketÚWebSocketClosedError)r&   ÚdataÚer   r   r   r(   I   s(   
ÿ€þÿzWorker.on_readc              
   C   s  t  d | j¡¡ | jsd S d | j¡}t  dj|g| j¢R Ž ¡ z| j |¡}W n8 t	t
fya } z*t  |¡ | jjsBt|ƒtv rI| jdd� n|  tj¡ W Y d }~d S W Y d }~d S d }~ww g | _||d … }|r{| j |¡ |  tj¡ d S |  tj¡ d S )Nzworker {} on writeÚ r8   zchan error on writingr   )r   r:   r   r   r"   Újoinr   r   Úsendr=   r>   r?   r%   r   r   r   r6   r   r)   Úappendr#   )r&   rD   ÚsentrE   r   r   r   r*   ]   s*   
þ€ýzWorker.on_writeNc                 C   s„   | j rd S d| _ t d | j|¡¡ | jr#| j | j¡ | jj	|d� | j
 	¡  | j 	¡  t dj| jŽ ¡ t| tƒ t t¡ d S )NTz!Closing worker {} with reason: {}r   zConnection to {}:{} lost)r%   r   Úinfor   r   r   r   Úremove_handlerr    r   r   r   r   r   r   r:   )r&   r   r   r   r   r   v   s   ÿ


zWorker.closer4   )Ú__name__Ú
__module__Ú__qualname__r'   r-   Úclassmethodr!   r5   r6   r(   r*   r   r   r   r   r   r   %   s    
r   )r   r0   ÚImportErrorÚtornado.websocketrA   Úuuidr   Útornado.ioloopr   Útornado.iostreamr   Útornado.utilr   r<   r   r   r   Úobjectr   r   r   r   r   Ú<module>   s     ÿ