
    Ef6X                     H   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
e      Z G d d      Z G d deej>                        Z  G d d      Z! edd      Z" G d deejF                  e         Z$y)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                   @    e Zd ZU eed<   eed<   eed<   eed<   eed<   y)_FutureEventfuturekindkwargsmsgtimerN)__name__
__module____qualname__r   __annotations__strr	   r        -/usr/lib/python3/dist-packages/zmq/_future.pyr   r      s    N
IL	HJr$   r   c                   R    e Zd ZU dZdZeed<   ee   ed<   defdZ	defdZ
d	d
dZy)_AsynczMixin for common async logicN_current_loop_Futurereturnc                    | j                   <| j                         | _         | j                  | j                          | j                   S | j                         }|| j                   ur|| _         | j                  |       |S )zGet event loop

        Notice if event loop has changed,
        and register init_io_state on activation of a new event loop
        )r(   _default_loop_init_io_state)selfcurrent_loops     r%   	_get_loopz_Async._get_loop6   sy     %!%!3!3!5D 2 23%%%))+t111!-D-r$   c                     t        d      )Nz!Must be implemented in a subclassNotImplementedError)r.   s    r%   r,   z_Async._default_loopG   s    !"EFFr$   c                      y Nr#   r.   loops     r%   r-   z_Async._init_io_stateJ   s    r$   r5   )r*   N)r   r   r    __doc__r(   r   r!   r   r   r0   r,   r-   r#   r$   r%   r'   r'   0   s8    &M3&\3 "Gs Gr$   r'   c            
            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Z
dededdfdZddeeeeef         f fdZ xZS )_AsyncPollerz:Poller that returns a Future on poll, instead of blocking._AsyncSocket_socket_class_READ_WRITEraw_socketsr7   socketevtfr*   Nc                     t               )z"Schedule callback for a raw socketr2   )r.   r7   r@   rA   rB   s        r%   _watch_raw_socketz_AsyncPoller._watch_raw_socketV       !##r$   socketsc                     t               )z$Unschedule callback for a raw socketr2   )r.   r7   rF   s      r%   _unwatch_raw_socketsz!_AsyncPoller._unwatch_raw_socketsZ   rE   r$   c                 P     j                         |dk(  r#	 t         	  d      }j                  |       S  j                          j                         g fd}j                   fd        j                  D ]
  \  }}t        |t        j                        rt        | j                        s j                  j                  |      }|t        j                  z  r|j                  d       |t        j                   z  s|j#                  d       j%                  |       d}|t        j                  z  r| j&                  z  }|t        j                   z  r| j(                  z  } j+                  |||         fd}j                  |       |6|dkD  r1fd}	j-                  d	|z  |	      fd
}
j                  |
       fd}j                  |       S # t        $ r}j                  |       Y d}~S d}~ww xY w)z Return a Future for a poll eventr   Nc                  J    j                         sj                  d        y y r5   done
set_result)argswatchers    r%   wake_rawz#_AsyncPoller.poll.<locals>.wake_rawr   s    <<>""4( "r$   c                 *     j                   g S r5   )rH   )rB   r7   r?   r.   s    r%   <lambda>z#_AsyncPoller.poll.<locals>.<lambda>w   s    /d//C{C r$   pollr   c                    j                         ry j                         r	 j                          y j	                         r j                  j	                                y 	 t        t        #  d      }j                  |       y # t        $ r Y y w xY w# t        $ r}j                  |       Y d }~y d }~ww xY wNr   )rL   	cancelledcancelRuntimeError	exceptionset_exceptionsuperr:   rS   rM   	Exception)rB   resulte	__class__r   r.   rO   s      r%   on_poll_readyz(_AsyncPoller.poll.<locals>.on_poll_ready   s    {{}  "MMO   "$$W%6%6%89."<;A>F %%f- $  ! ,((++,s)   B &B 	BB	B>#B99B>c                  J     j                         s j                  d        y y r5   rK   )rO   s   r%   trigger_timeoutz*_AsyncPoller.poll.<locals>.trigger_timeout   s    ||~&&t, &r$   MbP?c                 b    t        d      rj                          y j                         y )NrX   )hasattrrX   remove_timeout)rB   r7   timeout_handles    r%   cancel_timeoutz)_AsyncPoller.poll.<locals>.cancel_timeout   s'    >84"))+''7r$   c                 H    j                         sj                          y y r5   )rL   rX   )rB   rO   s    r%   cancel_watcherz)_AsyncPoller.poll.<locals>.cancel_watcher   s    <<>  "r$   )r)   r\   rS   rM   r]   r[   r0   add_done_callbackrF   
isinstance_zmqSocketr<   from_socketr   _add_recv_eventr   _add_send_eventappendr=   r>   rD   
call_later)r.   timeoutr^   r_   rP   r@   maskrA   ra   rc   ri   rk   r   r7   r?   rh   rO   r`   s   `           @@@@@r%   rS   z_AsyncPoller.poll^   s   a<*a !!&)M~~ ,,. "$	) 	!!C	
 !LL 	DLFD&$++.!&$*<*<=!//;;FCF$++%**6'*B$,,&**6'*B""6*$++%4::%C$,,&4;;&C&&tVS(C!	D$	.( 	!!-07Q;- "__TG^_MN8 $$^4	! 	  0i  ($$Q'' M	(s   H   	H%	H  H%))r   r   r    r8   r   r!   intr
   r   r   rD   rH   r   r   rS   __classcell__r`   s   @r%   r:   r:   N   s    D''JKc$c $3 $S $X $RV $$ $ $ $Z)DsCx,A"B Z Zr$   r:   c                       e Zd Zed        Zy)_NoTimerc                       y r5   r#   r#   r$   r%   rX   z_NoTimer.cancel   s    r$   N)r   r   r    staticmethodrX   r#   r$   r%   r|   r|      s     r$   r|   Tr;   )boundc                   :    e Zd ZU dZdZdZded<   eZdZ		 	 	 	 d4de
d   ddf fdZed5dee   d	dd
edefd       Zd5de
e   ddf fdZej(                  j$                  j*                  e_         fdZej(                  j,                  j*                  e_        e	 d6dddededeee      fd       Ze	 d6dddeded   dedeee      fd       Ze	 d6dddeded   dedeeej<                        fd       Ze	 d7dedededeeee   eej<                     f      fd       Z	 d7dedededeeee   eej<                     f      fdZ	 d7dedededeeeej<                  f      fdZ 	 d7dedededee
ejB                        fdZ"	 	 	 d7dedededededee
ejB                        fdZ#d  Z$dejJ                  fdee   fd!Z&dee'   f fd"Z(d8d#e'ded$e'ded   f fd%Z)d& Z*d' Z+e,d(        Z-d9d)Z.d:d*Z/d+ Z0d, Z1d;d-Z2d5d.Z3d/ Z4d0 Z5d1 Z6d5d2Z7d3 Z8 xZ9S )<r;   Nr   z_zmq.Socket_shadow_sock_from_socketr*   c                    t        |t        j                        rd |}}|"t        |   |j
                         || _        n?t        |   ||fi | t        j                  j                  | j
                        | _        |3t        j                  | j                  j                   dt        d       t               | _        t               | _        d| _        | j                  j"                  | _        y )N)shadowz^(io_loop) argument is deprecated in pyzmq 22.2. The currently active loop will always be used.   )
stacklevelr   )rm   rn   ro   r\   __init__
underlyingr   r   warningswarnr`   r   DeprecationWarningr   _recv_futures_send_futures_stateFD_fd)r.   contextsocket_typeio_loopr   r   r`   s         r%   r   z_AsyncSocket.__init__   s     gt{{+%)7\G#GL$;$;< ,DGWk<V< $ 2 24?? CDMM>>**+ ,B B"	 #W"W$$''r$   clsr@   r   c                      | ||      S )z.Create an async socket from an existing Socket)r   r   r#   )r   r@   r   s      r%   rp   z_AsyncSocket.from_socket   s     88r$   lingerc                 p   | j                   s| j                  ~t        t        | j                  xs g | j
                  xs g             }|D ]8  }|j                  j                         r	 |j                  j                          : | j                          t        | 1  |       y # t        $ r Y gw xY w)N)r   )closedr   listr   r   r   r   rL   rX   rY   _clear_io_stater\   close)r.   r   
event_listeventr`   s       r%   r   z_AsyncSocket.close   s    {{txx3-1d((.B0B0B0HbI.J $ ||((*++-   "V$	 ( s   ,B))	B54B5c                 Z    t         |   |      }|t        k(  r| j                  |       |S r5   )r\   getr   _schedule_remaining_events)r.   keyr^   r`   s      r%   r   z_AsyncSocket.get  s+    S!&=++F3r$   F)trackflagsr   c                     y r5   r#   )r.   r   r   s      r%   recv_multipartz_AsyncSocket.recv_multipart
       	r$   copyTc                     y r5   r#   r.   r   r   r   s       r%   r   z_AsyncSocket.recv_multipart  r   r$   c                     y r5   r#   r   s       r%   r   z_AsyncSocket.recv_multipart  r   r$   c                      y r5   r#   r   s       r%   r   z_AsyncSocket.recv_multipart  r   r$   c                 >    | j                  dt        |||            S )zvReceive a complete multipart zmq message.

        Returns a Future whose result will be a multipart message.
        r   r   r   r   rq   dictr   s       r%   r   z_AsyncSocket.recv_multipart"  s%     ##dTG
 	
r$   c                 >    | j                  dt        |||            S )zReceive a single zmq frame.

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

        Recommend using recv_multipart instead.
        recvr   r   r   s       r%   r   z_AsyncSocket.recv-  s      ##FDu4u,UVVr$   	msg_partsc                 H    ||d<   ||d<   ||d<   | j                  d||      S )zqSend a complete multipart zmq message.

        Returns a Future that resolves when sending is complete.
        r   r   r   send_multipartr   r   )rr   )r.   r   r   r   r   r   s         r%   r   z_AsyncSocket.send_multipart8  s8      wvw##$4)F#SSr$   datar   c                     ||d<   ||d<   ||d<   |j                  t        |||             | j                  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   rr   )r.   r   r   r   r   r   s         r%   r   z_AsyncSocket.sendD  sL      wvwdT?@##FV#DDr$   c                     | j                         fd}j                  |       fd}j                  |       S )zDeserialize with Futuresc                 *   j                         ryj                         r j                  j                                yj                         }	  |      }j	                  |       y# t
        $ r}j                  |       Y d}~yd}~ww xY w)z+Chain result through serialization to recvdN)rL   rZ   r[   r^   rM   r]   )_bufloadedr_   rB   loadrecvds       r%   _chainz)_AsyncSocket._deserialize.<locals>._chain\  st    vvx  12lln)!#YF LL( ! 'OOA&&'s   A. .	B7BBc                 j    j                         ryj                         rj                          yy)z"Chain cancellation from f to recvdN)rL   rW   rX   )r   rB   r   s    r%   _chain_cancelz0_AsyncSocket._deserialize.<locals>._chain_cancelm  s&    zz|{{} r$   )r)   rl   )r.   r   r   r   r   rB   s    ``  @r%   _deserializez_AsyncSocket._deserializeX  s=    LLN	) 	'	 	
M*r$   c                 l     j                   r#t        j                  t        j                         j	                         }|j                   |       t        t        |j                  |            } j                          fd}|j                         r
 ||       S |j                  |       S )zSpoll the socket for events

        returns a Future for the poll results.
        c                 ^   j                         ry | j                         r	 j                          y | j	                         r j                  | j	                                y t        | j                               }j                  |j                  d             y # t        $ r Y y w xY wrV   )
rL   rW   rX   rY   rZ   r[   r   r^   rM   r   )rB   evtsr   r.   s     r%   unwrap_resultz(_AsyncSocket.poll.<locals>.unwrap_result  s    {{}{{}MMO {{}$$Q[[]3AHHJ'!!$((4"34 $ s   B   	B,+B,)r   rn   ZMQErrorENOTSUP_poller_classregisterr   r   rS   r)   rL   rl   )r.   ru   r   prB   r   r   s   `     @r%   rS   z_AsyncSocket.pollx  s     ;;---- 	

4)	5  668!  .r$   c                 "    t        |   |i |S r5   )r\   recv_string)r.   rN   r   r`   s      r%   r   z_AsyncSocket.recv_string  s    w"D3F33r$   sencodingc                 (    t         |   |||      S )N)r   r   )r\   send_string)r.   r   r   r   r`   s       r%   r   z_AsyncSocket.send_string  s    w"1EH"EEr$   c                 2    fd}| j                  ||      S )z'Add a timeout for a send or recv Futurec                  n     j                         ry  j                  t        j                                y r5   )rL   r[   rn   AgainrT   s   r%   future_timeoutz1_AsyncSocket._add_timeout.<locals>.future_timeout  s%    {{}   .r$   )_call_later)r.   r   ru   r   s    `  r%   _add_timeoutz_AsyncSocket._add_timeout  s    	/ 88r$   c                 B    | j                         j                  ||      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.
        )r0   rt   )r.   delaycallbacks      r%   r   z_AsyncSocket._call_later  s     ~~**5(;;r$   c                 t    t        |      D ]  \  }}|j                  | u s n y|j                  ||          y)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   s       r%   _remove_finished_futurez$_AsyncSocket._remove_finished_future  sE     &j1 	LE5||v%	  	*U+,r$   c           	           |xs  j                         }|j                  d      rU|j                  dd      t        j                  z  r2t         j                  |      }	  |d	i |}|j                  |       |S t        }t        t        d      r0 j                  j                  }	|	dk\  r j                  ||	dz        } j                  j                  t!        |||d|             |j#                   fd        j                  j                  t$              t&        z  r j)                           j                  r j+                  t&               |S # t        $ r}|j                  |       Y d}~|S d}~ww xY w)
z4Add a recv event, returning the corresponding Futurer   r   r   NRCVTIMEOrd   )r   r   c                 <    j                  | j                        S r5   )r   r   rB   r.   s    r%   rR   z._AsyncSocket._add_recv_event.<locals>.<lambda>      d221d6H6HI r$   r#   )r)   
startswithr   rn   DONTWAITgetattrr   rM   r]   r[   r|   rf   rcvtimeor   r   rs   r   rl   r   r   _handle_recv_add_io_state)
r.   r   r   r   rB   r   rr_   r   
timeout_mss
   `         r%   rq   z_AsyncSocket._add_recv_event  sI   $dlln??6"vzz'1'='M4,,d3D N6N QH4$**33JQ))!Z$->? 	!!,q$DPU"VW 	
I	
   (61v&5  #"" H	#s   !E 	E=!E88E=c           	          |xs  j                         }|dv r j                  s|j                  dd      }|j                         }|t        j
                  z  |d<   t         j                  |      }d}		  ||fi |}
|j                  |
       |	r j                  r j                          |S t        }t        t        d      rC j                  j                  t        j                         }|dk\  r j#                  ||dz        } j                  j%                  t'        |||||	             |j)                   fd
        j+                  t,               |S # t        j                  $ r2}|t        j
                  z  r|j                  |       nd}	Y d}~d}~wt        $ r}|j                  |       Y d}~0d}~ww xY w)z4Add a send event, returning the corresponding Future)r   r   r   r   TFNSNDTIMEOrd   )r   r   r   c                 <    j                  | j                        S r5   )r   r   r   s    r%   rR   z._AsyncSocket._add_send_event.<locals>.<lambda>"  r   r$   )r)   r   r   r   rn   r   r   r   rM   r   r[   r]   r   r   r|   rf   r   r   rs   r   rl   r   r   )r.   r   r   r   r   rB   r   nowait_kwargsr   finish_earlyr   r_   r   r   s   `             r%   rr   z_AsyncSocket._add_send_event  s   $dlln --d6H6HJJw*E"KKMM%*T]]%:M'" 4,,d3D  L .. Q %%3354$**..t}}=JQ))!Z$->? 	!!DSF	
 	
I	
 	7#I :: )4==(OOA& $)L #""#s$   7	E G1'FG*GGc                    | j                   j                  t              t        z  syd}| j                  rA| j                  j                         \  }}}}}|j                         rd}nn| j                  rA| j                  s| j                  t               |yj                          dk(  r|j                  d       y|dk(  r| j                   j                  }n*|dk(  r| j                   j                  }nt        d|z        dxx   t        j                  z  cc<   	  |di |}|j                  |       y# t        $ r}|j!                  |       Y d}~yd}~ww xY w)zHandle recv eventsNrS   r   r   zUnhandled recv event type: %rr   r#   )r   r   r   r   r   popleftrL   _drop_io_staterX   rM   r   r   
ValueErrorrn   r   r]   r[   )	r.   rB   r   r   r   r   r   r^   r_   s	            r%   r   z_AsyncSocket._handle_recv(  s;     $$V,v5  (,(:(:(B(B(D%AtVQvvx    !!'96>LL%%$$33DV^$$))D<tCDDw4==(	!^F^F LL   	OOA	s   $D> >	E"EE"c                    | j                   j                  t              t        z  sy d }| j                  rA| j                  j                         \  }}}}}|j                         rd }nn| j                  rA| j                  s| j                  t               |y j                          dk(  r|j                  d        y |dk(  r| j                   j                  }n*|dk(  r| j                   j                  }nt        d|z        dxx   t        j                  z  cc<   	  |fi |}|j                  |       y # t        $ r}|j!                  |       Y d }~y d }~ww xY w)NrS   r   r   zUnhandled send event type: %rr   )r   r   r   r   r   r   rL   r   rX   rM   r   r   r   rn   r   r]   r[   )	r.   rB   r   r   r   r   r   r^   r_   s	            r%   _handle_sendz_AsyncSocket._handle_sendQ  s?     $$V,w6  *.*<*<*D*D*F'AtVS%vvx    !!(96>LL%%$$33DV^$$))D<tCDDw4==(	!#((F LL   	OOA	s   $	D? ?	E#EE#c                     | j                   j                  t              }|t        j                  z  r| j                          |t        j                  z  r| j                          | j                          y)z(Dispatch IO events to _handle_recv, etc.N)	r   r   r   rn   r   r   r   r   r   )r.   fdevents
zmq_eventss       r%   _handle_eventsz_AsyncSocket._handle_eventsz  sT    &&**62
#$'')r$   c                     | j                   dk(  ry|| j                  j                  t              }|| j                   z  r| j	                  d| j
                         yy)zkSchedule a call to handle_events next loop iteration

        If there are still events to handle.
        r   N)r   r   r   r   r   r   )r.   r   s     r%   r   z'_AsyncSocket._schedule_remaining_events  sU     ;;!>&&**62FDKKQ 3 34  r$   c                     | j                   |k7  r| j                   |z  x}| _         | j                  | j                          y)zAdd io_state to poller.Nr   _update_handlerr.   states     r%   r   z_AsyncSocket._add_io_state  s5    ;;%"&++"55EDKT[[)r$   c                     | j                   |z  r| j                   | z  | _         | j                  | j                          y)z&Stop poller from watching an io_state.Nr  r  s     r%   r   z_AsyncSocket._drop_io_state  s2    ;;++%0DKT[[)r$   c                 H    |r| j                          | j                          y)zOUpdate IOLoop handler with state.

        zmq FD is always read-only.
        N)r0   r   r  s     r%   r  z_AsyncSocket._update_handler  s     NN'')r$   c                     || j                         }|j                  | j                  | j                  | j                         | j                  d| j                         y)z#initialize the ioloop event handlerNr   )r0   add_handlerr   r   r=   r   r6   s     r%   r-   z_AsyncSocket._init_io_state  sK    <>>#D**D,?,?LD//0r$   c                     | j                   }| j                   j                  r| j                  }| j                  | j                  j	                  |       yy)zNunregister the ioloop event handler

        called once during close
        N)r   r   r   r(   remove_handler)r.   r   s     r%   r   z_AsyncSocket._clear_io_state  sL    
 ##B)--b1 *r$   )Nrw   NNr5   )r   )r   TF)r   zutf-8)NN)NNN)r   r   ):r   r   r    r   r   r   r!   r:   r   r   r   r   classmethodr   r   r   rp   rx   r   rn   ro   r8   r   r   boolr   r
   bytesr   r   Framer   r   MessageTrackerr   r   r   r   rS   r"   r   r   r   r   r~   r   rq   rr   r   r   r   r   r   r   r  r-   r   ry   rz   s   @r%   r;   r;      s    MMF M
C 04(
 }-( 
(: 9a 9- 9# 9QR 9 9%HSM %T % KK%%--EM ++//))CK/4(,	4;	 
 DI'.t}=A	4;	 
 EJ'.u~>B	4

#	$ 
 ?D$(8<	5ed4::&667	8  @E	
	
$(	
8<	
	5ed4::&667	8	
 @E	W	W$(	W8<	W	5

*+	,	W HM
T
T%(
T48
T	8D//0	1
T EE E 	E
 E E 
8D//0	1E(@  t{{ $y~ $N4in 4FS F FC FiX\o F9< - -"H6p'!R&!R*5 **	*1	2r$   )%r8   r   asyncior   collectionsr   	itertoolsr   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   zmqrn   r   r   r   zmq._typingr   r   r'   Pollerr:   r|   r   ro   r;   r#   r$   r%   <module>r     s    +
          ' ' : " <j64;; jZ  C~&v264;;v. v2r$   