o
    inX                     @   s   d 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	m
Z
mZmZmZmZmZmZmZmZmZmZmZ ddlZddlmZmZmZ ddlmZ G d	d
 d
eZG dd dZG dd deejZ G dd dZ!edddZ"G dd deej#e Z$dS )z%Future-returning APIs for coroutines.    N)Future)deque)chain)Any	AwaitableCallableDictList
NamedTupleOptionalTupleTypeTypeVarUnioncastoverload)EVENTSPOLLINPOLLOUT)Literalc                   @   s6   e Zd ZU eed< eed< eed< eed< eed< dS )_FutureEventfuturekindkwargsmsgtimerN)__name__
__module____qualname__r   __annotations__strr   r    r!   r!   F/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/zmq/_future.pyr      s   
 r   c                   @   sR   e Zd ZU dZdZeed< ee ed< defddZ	defdd	Z
ddd
dZdS )_AsynczMixin for common async logicN_current_loop_Futurereturnc                 C   sL   | j du r|  | _ | | j  | j S |  }|| j ur$|| _ | | |S )zGet event loop

        Notice if event loop has changed,
        and register init_io_state on activation of a new event loop
        N)r$   _default_loop_init_io_state)selfcurrent_loopr!   r!   r"   	_get_loop6   s   



z_Async._get_loopc                 C   s   t d)Nz!Must be implemented in a subclassNotImplementedErrorr)   r!   r!   r"   r'   G   s   z_Async._default_loopc                 C      d S Nr!   r)   loopr!   r!   r"   r(   J   s   z_Async._init_io_stater0   )r&   N)r   r   r   __doc__r$   r   r   r   r   r+   r'   r(   r!   r!   r!   r"   r#   0   s   
 r#   c                
       s   e Zd ZU dZed ed< eed< eed< ee ed< deded	ed
e	ddf
ddZ
dededdfddZddeeeeef   f fddZ  ZS )_AsyncPollerz:Poller that returns a Future on poll, instead of blocking._AsyncSocket_socket_class_READ_WRITEraw_socketsr2   socketevtfr&   Nc                 C      t  )z"Schedule callback for a raw socketr,   )r)   r2   r:   r;   r<   r!   r!   r"   _watch_raw_socketV      z_AsyncPoller._watch_raw_socketsocketsc                 G   r=   )z$Unschedule callback for a raw socketr,   )r)   r2   r@   r!   r!   r"   _unwatch_raw_socketsZ   r?   z!_AsyncPoller._unwatch_raw_socketsc              
      s     |dkr0zt d}W n ty( } z | W Y d}~ S d}~ww  |  S    g fdd}fdd jD ]R\}}t	|t
jr}t	|jsdj|}|t
j@ rp|jdd |t
j@ r||jdd qN| d}|t
j@ r|jO }|t
j@ r|jO }||| qN fd	d
}| |dur|dkrчfdd}	d| |	fdd}
 |
 fdd} |  S )z Return a Future for a poll eventr   Nc                           s d  d S d S r0   done
set_result)argswatcherr!   r"   wake_rawr      z#_AsyncPoller.poll.<locals>.wake_rawc                    s   j  gR  S r0   )rA   r<   )r2   r9   r)   r!   r"   <lambda>w   s    z#_AsyncPoller.poll.<locals>.<lambda>pollr   c              
      s     rd S  rz  W d S  ty   Y d S w  r)  d S z
ttd}W n t	yK } z| W Y d }~d S d }~ww 
| d S Nr   )rE   	cancelledcancelRuntimeError	exceptionset_exceptionsuperr4   rN   	ExceptionrF   )r<   resulte)	__class__r   r)   rI   r!   r"   on_poll_ready   s&   
z(_AsyncPoller.poll.<locals>.on_poll_readyc                      rC   r0   rD   r!   rH   r!   r"   trigger_timeout   rK   z*_AsyncPoller.poll.<locals>.trigger_timeoutMbP?c                    s$   t dr  d S   d S )NrR   )hasattrrR   remove_timeoutrL   )r2   timeout_handler!   r"   cancel_timeout   s   
z)_AsyncPoller.poll.<locals>.cancel_timeoutc                    s      s
   d S d S r0   )rE   rR   rL   rH   r!   r"   cancel_watcher   s   z)_AsyncPoller.poll.<locals>.cancel_watcher)r%   rV   rN   rW   rU   rF   r+   add_done_callbackr@   
isinstance_zmqSocketr6   from_socketr   _add_recv_eventr   _add_send_eventappendr7   r8   r>   
call_later)r)   timeoutrX   rY   rJ   r:   maskr;   r[   r\   ra   rb   rZ   )r   r2   r9   r)   r`   rI   r"   rN   ^   sX   










z_AsyncPoller.poll)rB   )r   r   r   r3   r   r   intr	   r   r   r>   rA   r   r   rN   __classcell__r!   r!   rn   r"   r4   N   s   
 ,r4   c                   @   s   e Zd Zedd ZdS )_NoTimerc                   C   r/   r0   r!   r!   r!   r!   r"   rR      s   z_NoTimer.cancelN)r   r   r   staticmethodrR   r!   r!   r!   r"   rq      s    rq   Tr5   )boundc                       s  e Zd ZU dZdZdZded< eZdZ					dPde
d ddf fdd	ZedQd
ee dddedefddZdQde
e ddf fddZejjje_ fddZejjje_e	dRdddededeee  fddZe	dRdddeded dedeee  fddZe	dRdddeded dedeeej  fddZe	dSdedededeeee eej f  fddZ	dSdedededeeee eej f  fddZ	dSdedededeeeejf  fd d!Z 	dSd"edededee
ej!  fd#d$Z"			dSd%edededed&edee
ej!  fd'd(Z#d)d* Z$dej%fdee fd+d,Z&dee' f fd-d.Z(dTd0e'ded1e'ded f fd2d3Z)d4d5 Z*d6d7 Z+e,d8d9 Z-dUd:d;Z.dVd<d=Z/d>d? Z0d@dA Z1dWdBdCZ2dQdDdEZ3dFdG Z4dHdI Z5dJdK Z6dQdLdMZ7dNdO Z8  Z9S )Xr5   Nr   z_zmq.Socket_shadow_sockrB   _from_socketr&   c                    s   t |tjrd |}}|d urt j|jd || _nt j||fi | tj| j| _|d ur?tj	| j
j dtdd t | _t | _d| _| jj| _d S )N)shadowz^(io_loop) argument is deprecated in pyzmq 22.2. The currently active loop will always be used.   )
stacklevelr   )rd   re   rf   rV   __init__
underlyingru   rw   warningswarnrZ   r   DeprecationWarningr   _recv_futures_send_futures_stateFD_fd)r)   contextsocket_typeio_looprv   r   rn   r!   r"   rz      s"   
z_AsyncSocket.__init__clsr:   r   c                 C   s   | ||dS )z.Create an async socket from an existing Socket)rv   r   r!   )r   r:   r   r!   r!   r"   rg      s   z_AsyncSocket.from_socketlingerc              	      sz   | j s4| jd ur4tt| jpg | jpg }|D ]}|j s/z|j  W q t	y.   Y qw q| 
  t j|d d S )N)r   )closedr   listr   r   r   r   rE   rR   rS   _clear_io_staterV   close)r)   r   
event_listeventrn   r!   r"   r      s   
z_AsyncSocket.closec                    s"   t  |}|tkr| | |S r0   )rV   getr   _schedule_remaining_events)r)   keyrX   rn   r!   r"   r     s   
z_AsyncSocket.getF)trackflagsr   c                C   r/   r0   r!   )r)   r   r   r!   r!   r"   recv_multipart	     z_AsyncSocket.recv_multipartcopyTc                C   r/   r0   r!   r)   r   r   r   r!   r!   r"   r     r   c                C   r/   r0   r!   r   r!   r!   r"   r     r   c                 C   r/   r0   r!   r   r!   r!   r"   r     r   c                 C      |  dt|||dS )zvReceive a complete multipart zmq message.

        Returns a Future whose result will be a multipart message.
        r   r   r   r   rh   dictr   r!   r!   r"   r   !  s   c                 C   r   )zReceive a single zmq frame.

        Returns a Future, whose result will be the received frame.

        Recommend using recv_multipart instead.
        recvr   r   r   r!   r!   r"   r   ,  s   	z_AsyncSocket.recv	msg_partsc                 K   s(   ||d< ||d< ||d< | j d||dS )zqSend a complete multipart zmq message.

        Returns a Future that resolves when sending is complete.
        r   r   r   send_multipartr   r   )ri   )r)   r   r   r   r   r   r!   r!   r"   r   7  s   z_AsyncSocket.send_multipartdatar   c                 K   s<   ||d< ||d< ||d< | t|||d | jd||dS )zSend a single zmq frame.

        Returns a Future that resolves when sending is complete.

        Recommend using send_multipart instead.
        r   r   r   r   sendr   )updater   ri   )r)   r   r   r   r   r   r!   r!   r"   r   C  s
   z_AsyncSocket.sendc                    s>   |     fdd}|  fdd} |  S )zDeserialize with Futuresc              
      sz      rdS  r   dS  }z|}W n ty5 } z | W Y d}~dS d}~ww  | dS )z+Chain result through serialization to recvdN)rE   rT   rU   rX   rW   rF   )_bufloadedrY   r<   loadrecvdr!   r"   _chain[  s   z)_AsyncSocket._deserialize.<locals>._chainc                    s$     rdS   r  dS dS )z"Chain cancellation from f to recvdN)rE   rQ   rR   )r   )r<   r   r!   r"   _chain_cancell  s
   z0_AsyncSocket._deserialize.<locals>._chain_cancel)r%   rc   )r)   r   r   r   r   r!   r   r"   _deserializeW  s   

z_AsyncSocket._deserializec                    sn   j r	ttj }|| tt||}	   fdd}|
 r0||  S ||  S )zSpoll the socket for events

        returns a Future for the poll results.
        c                    st      rd S |  rz   W d S  ty   Y d S w |  r) |   d S t|  } |	d d S rP   )
rE   rQ   rR   rS   rT   rU   r   rX   rF   r   )r<   evtsr   r)   r!   r"   unwrap_result  s   
z(_AsyncSocket.poll.<locals>.unwrap_result)r   re   ZMQErrorENOTSUP_poller_classregisterr   r   rN   r%   rE   rc   )r)   rl   r   pr<   r   r!   r   r"   rN   w  s   
z_AsyncSocket.pollc                    s   t  j|i |S r0   )rV   recv_string)r)   rG   r   rn   r!   r"   r        z_AsyncSocket.recv_stringutf-8sencodingc                    s   t  j|||dS )N)r   r   )rV   send_string)r)   r   r   r   rn   r!   r"   r     r   z_AsyncSocket.send_stringc                    s    fdd}|  ||S )z'Add a timeout for a send or recv Futurec                      s      rd S  t  d S r0   )rE   rU   re   Againr!   rO   r!   r"   future_timeout  s   z1_AsyncSocket._add_timeout.<locals>.future_timeout)_call_later)r)   r   rl   r   r!   rO   r"   _add_timeout  s   z_AsyncSocket._add_timeoutc                 C   s   |   ||S )zSchedule a function to be called later

        Override for different IOLoop implementations

        Tornado and asyncio happen to both have ioloop.call_later
        with the same signature.
        )r+   rk   )r)   delaycallbackr!   r!   r"   r     s   z_AsyncSocket._call_laterc                 C   s6   t |D ]\}}|j| u r nqdS |||  dS )zMake sure that futures are removed from the event list when they resolve

        Avoids delaying cleanup until the next send/recv event,
        which may never come.
        N)	enumerater   remove)r   r   f_idxr   r!   r!   r"   _remove_finished_future  s   
z$_AsyncSocket._remove_finished_futurec           
   
      s  |p   }|drC|ddtj@ rCt j|}z	|d
i |}W n ty; } z|| W Y d}~|S d}~ww |	| |S t
}ttdrZ jj}	|	dkrZ ||	d } jt|||d|d | fdd	  jtt@ r|    jr t |S )z4Add a recv event, returning the corresponding Futurer   r   r   NRCVTIMEOr]   )r   r   c                         |  jS r0   )r   r   rL   r.   r!   r"   rM         z._AsyncSocket._add_recv_event.<locals>.<lambda>r!   )r%   
startswithr   re   DONTWAITgetattrru   rW   rU   rF   rq   r^   rcvtimeor   r   rj   r   rc   r   r   _handle_recv_add_io_state)
r)   r   r   r   r<   r   rrY   r   
timeout_msr!   r.   r"   rh     s4   



z_AsyncSocket._add_recv_eventc              
      s\  |p   }|dv rw jsw|dd}| }|tjB |d< t j|}d}	z
||fi |}
W n6 tjyP } z|tj@ rD|	| nd}	W Y d}~n d}~w t
yf } z|	| W Y d}~n
d}~ww ||
 |	rw jru   |S t}ttdr jtj}|dkr ||d } jt|||||d	 | fd
d  t |S )z4Add a send event, returning the corresponding Future)r   r   r   r   TFNSNDTIMEOr]   )r   r   r   c                    r   r0   )r   r   rL   r.   r!   r"   rM   !  r   z._AsyncSocket._add_send_event.<locals>.<lambda>)r%   r   r   r   re   r   r   ru   r   rU   rW   rF   r   r   rq   r^   r   r   rj   r   rc   r   r   )r)   r   r   r   r   r<   r   nowait_kwargsr   finish_earlyr   rY   r   r   r!   r.   r"   ri     sH   




z_AsyncSocket._add_send_eventc           	   
   C   s  | j tt@ s
dS d}| jr$| j \}}}}}| r d}nn| js| js,| t |du r2dS |  |dkrA|	d dS |dkrJ| j j
}n|dkrS| j j}ntd| |d  tjO  < z	|di |}W n ty } z|| W Y d}~dS d}~ww |	| dS )zHandle recv eventsNrN   r   r   zUnhandled recv event type: %rr   r!   )ru   r   r   r   r   popleftrE   _drop_io_staterR   rF   r   r   
ValueErrorre   r   rW   rU   )	r)   r<   r   r   r   r   r   rX   rY   r!   r!   r"   r   '  s<   



z_AsyncSocket._handle_recvc           	   
   C   s  | j tt@ s
d S d }| jr$| j \}}}}}| r d }nn| js| js,| t |d u r2d S |  |dkrA|	d  d S |dkrJ| j j
}n|dkrS| j j}ntd| |d  tjO  < z
||fi |}W n ty } z|| W Y d }~d S d }~ww |	| d S )NrN   r   r   zUnhandled send event type: %rr   )ru   r   r   r   r   r   rE   r   rR   rF   r   r   r   re   r   rW   rU   )	r)   r<   r   r   r   r   r   rX   rY   r!   r!   r"   _handle_sendP  s<   



z_AsyncSocket._handle_sendc                 C   sH   | j jrdS | j t}|tj@ r|   |tj@ r|   | 	  dS )z(Dispatch IO events to _handle_recv, etc.N)
ru   r   r   r   re   r   r   r   r   r   )r)   fdevents
zmq_eventsr!   r!   r"   _handle_eventsy  s   

z_AsyncSocket._handle_eventsc                 C   sB   | j dkrdS |du r| jt}|| j @ r| d| j dS dS )zkSchedule a call to handle_events next loop iteration

        If there are still events to handle.
        r   N)r   ru   r   r   r   r   )r)   r   r!   r!   r"   r     s   

z'_AsyncSocket._schedule_remaining_eventsc                 C   s*   | j |kr| j |B  }| _ | | j  dS )zAdd io_state to poller.Nr   _update_handlerr)   stater!   r!   r"   r     s   
z_AsyncSocket._add_io_statec                 C   s(   | j |@ r| j | @ | _ | | j  dS )z&Stop poller from watching an io_state.Nr   r   r!   r!   r"   r     s   
z_AsyncSocket._drop_io_statec                 C   s   |r|    |   dS )zOUpdate IOLoop handler with state.

        zmq FD is always read-only.
        N)r+   r   r   r!   r!   r"   r     s   z_AsyncSocket._update_handlerc                 C   s6   |du r|   }|| j| j| j | d| j dS )z#initialize the ioloop event handlerNr   )r+   add_handlerru   r   r7   r   r1   r!   r!   r"   r(     s   z_AsyncSocket._init_io_statec                 C   s2   | j }| j jr
| j}| jdur| j| dS dS )zNunregister the ioloop event handler

        called once during close
        N)ru   r   r   r$   remove_handler)r)   r   r!   r!   r"   r     s   
z_AsyncSocket._clear_io_state)NrB   NNr0   )r   )r   TF)r   r   )NN)NNN)r   r   ):r   r   r   r   r   r   r   r4   r   r   r   rz   classmethodr   rs   r   rg   ro   r   re   rf   r3   r   r   boolr   r	   bytesr   r   Framer   r   MessageTrackerr   r   r   r   rN   r    r   r   r   r   rr   r   rh   ri   r   r   r   r   r   r   r   r(   r   rp   r!   r!   rn   r"   r5      s  
 "





 '$



$8)
)

)%r3   r|   asyncior   collectionsr   	itertoolsr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   zmqre   r   r   r   zmq._typingr   r   r#   Pollerr4   rq   rs   rf   r5   r!   r!   r!   r"   <module>   s    <m