
    ZdnX                     `   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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                   B    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        +lib/python3.11/site-packages/zmq/_future.pyr   r      s=         NNN
IIILLL	HHHJJJJJr$   r   c                   Z    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dS )_AsynczMixin for common async logicN_current_loop_Futurereturnc                     | j         :|                                 | _         |                     | 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
        )r(   _default_loop_init_io_state)selfcurrent_loops     r%   	_get_loopz_Async._get_loop6   s     %!%!3!3!5!5D 233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FFr$   c                     d S 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   s         &&M3&\3    "Gs G G G 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                                                       |dk    rf	 t                                          d          }                    |           n,# t          $ r}                    |           Y d}~nd}~ww xY wS                                                                    g fd}                     fd            j        D ]\  }}t          |t          j                  r|t          | j                  s j                            |          }|t          j        z  r|                    d           |t          j        z  r|                    d                               |           d}|t          j        z  r
| j        z  }|t          j        z  r
| j        z  }                     |||            fd}                    |           |?|dk    r9fd}	                    d	|z  |	          fd
}
                    |
           fd}                    |           S )z Return a Future for a poll eventr   Nc                  ^                                     s                    d            d S d S r5   done
set_result)argswatchers    r%   wake_rawz#_AsyncPoller.poll.<locals>.wake_rawr   s7    <<>> )""4((((() )r$   c                       j         gR  S r5   )rH   )rB   r7   r?   r.   s    r%   <lambda>z#_AsyncPoller.poll.<locals>.<lambda>w   s    /d/C{CCC r$   pollr   c                                                     rd S                                 r(	                                  n# t          $ r Y nw xY wd S                                 r)                                                               d S 	 t          t                                        d          }	                    |           d S # t          $ r }                    |           Y d }~d S d }~ww xY wNr   )rM   	cancelledcancelRuntimeError	exceptionset_exceptionsuperr:   rT   rN   	Exception)rB   resulte	__class__r   r.   rP   s      r%   on_poll_readyz(_AsyncPoller.poll.<locals>.on_poll_ready   s&   {{}}   "" MMOOOO#   D   "" .$$W%6%6%8%899999."<66;;A>>F %%f----- ! , , ,((+++++++++,s)   A 
AA(C 
C;C66C;c                  ^                                      s                     d            d S d S r5   rL   )rP   s   r%   trigger_timeoutz*_AsyncPoller.poll.<locals>.trigger_timeout   s7    ||~~ -&&t,,,,,- -r$   MbP?c                 ~    t          d          r                                 d S                                d S )NrY   )hasattrrY   remove_timeout)rB   r7   timeout_handles    r%   cancel_timeoutz)_AsyncPoller.poll.<locals>.cancel_timeout   sG    >844 8"))+++++''77777r$   c                 \                                     s                                 d S d S r5   )rM   rY   )rB   rP   s    r%   cancel_watcherz)_AsyncPoller.poll.<locals>.cancel_watcher   s3    <<>> !     ! !r$   )r)   r]   rT   rN   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`   rQ   r@   maskrA   rb   rd   rj   rl   r   r7   r?   ri   rP   ra   s   `           @@@@@r%   rT   z_AsyncPoller.poll^   s   a<<*a !!&))))  ( ( ($$Q''''''''( M~~ ,,.. "$	) 	) 	) 	) 	) 	!!CCCCCC	
 	
 	
 !L 	D 	DLFD&$+.. D!&$*<== D!/;;FCCF$+% C**6'*BBB$,& C**6'*BBB""6***$+% &4:%C$,& '4;&C&&tVS(CCCC	. 	. 	. 	. 	. 	. 	. 	.( 	!!-0007Q;;- - - - - "__TG^_MMN8 8 8 8 8 8 $$^444	! 	! 	! 	! 	! 	  000s   !A 
B$A>>B)rI   )r   r   r    r8   r   r!   intr
   r   r   rD   rH   r   r   rT   __classcell__ra   s   @r%   r:   r:   N   s        DD''''JJJKKKc$c $3 $S $X $RV $ $ $ $$ $ $ $ $ $ $Z Z)DsCx,A"B Z Z Z Z Z Z Z Z Z Zr$   r:   c                   $    e Zd Zed             ZdS )_NoTimerc                      d S r5   r#   r#   r$   r%   rY   z_NoTimer.cancel   s    r$   N)r   r   r    staticmethodrY   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		 	 	 	 d6de
d         ddf fdZed7d	ee         d
ddedefd            Zd7de
e         ddf fdZej        j        j        e_         fdZej        j        j        e_        e	 d8dddededeee                  fd            Ze	 d8dddeded         dedeee                  fd            Ze	 d8dddeded         dedeeej                          fd            Ze	 d9dedededeeee         eej                 f                  fd            Z	 d9dedededeeee         eej                 f                  fdZ	 d9dedededeeeej        f                  fdZ 	 d9dedededee
ej!                          fdZ"	 	 	 d9dedededededee
ej!                          fd Z#d! Z$dej%        fdee         fd"Z&dee'         f fd#Z(d:d%e'ded&e'ded         f fd'Z)d( Z*d) Z+e,d*             Z-d;d+Z.d<d,Z/d- Z0d. Z1d=d/Z2d7d0Z3d1 Z4d2 Z5d3 Z6d7d4Z7d5 Z8 xZ9S )>r;   Nr   z_zmq.Socket_shadow_sockrI   _from_socketr*   c                     t          |t          j                  rd |}}|/t                                          |j                   || _        nD t                      j        ||fi | t          j                            | j                  | _        |)t          j	        | j
        j         dt          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   )rn   ro   rp   r]   __init__
underlyingr   r   warningswarnra   r   DeprecationWarningr   _recv_futures_send_futures_stateFD_fd)r.   contextsocket_typeio_loopr   r   ra   s         r%   r   z_AsyncSocket.__init__   s     gt{++ 	4%)7\G#GGL$;<<< ,DEGGWk<<V<<< $ 2 24? C CDM>* B B B"	    #WW"WW$'r$   clsr@   r   c                      | ||          S )z.Create an async socket from an existing Socket)r   r   r#   )r   r@   r   s      r%   rq   z_AsyncSocket.from_socket   s     s8888r$   lingerc                 x   | j         s| j        t          t          | j        pg | j        pg                     }|D ]F}|j                                        s+	 |j                                         6# t          $ r Y Bw xY wG| 
                                 t                                          |           d S )N)r   )closedr   listr   r   r   r   rM   rY   rZ   _clear_io_stater]   close)r.   r   
event_listeventra   s       r%   r   z_AsyncSocket.close   s    { 	#tx3-1d(.B0B0HbII. .J $  |((** ++----'      """V$$$$$s   A33
B ?B c                     t                                          |          }|t          k    r|                     |           |S r5   )r]   getr   _schedule_remaining_events)r.   keyr_   ra   s      r%   r   z_AsyncSocket.get  s:    S!!&==++F333r$   F)trackflagsr   c                    d S r5   r#   )r.   r   r   s      r%   recv_multipartz_AsyncSocket.recv_multipart	  	     	r$   copyTc                    d S r5   r#   r.   r   r   r   s       r%   r   z_AsyncSocket.recv_multipart  r   r$   c                    d S r5   r#   r   s       r%   r   z_AsyncSocket.recv_multipart  r   r$   c                     d S r5   r#   r   s       r%   r   z_AsyncSocket.recv_multipart  r   r$   c                 N    |                      dt          |||                    S )zvReceive a complete multipart zmq message.

        Returns a Future whose result will be a multipart message.
        r   r   r   r   rr   dictr   s       r%   r   z_AsyncSocket.recv_multipart!  s0     ##dTGGG
 
 	
r$   c                 N    |                      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,U,UVVVr$   	msg_partsc                 P    ||d<   ||d<   ||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   )rs   )r.   r   r   r   r   r   s         r%   r   z_AsyncSocket.send_multipart7  s;      wvw##$4)F#SSSr$   datar   c                     ||d<   ||d<   ||d<   |                     t          |||                     |                     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   rs   )r.   r   r   r   r   r   s         r%   r   z_AsyncSocket.sendC  s[      wvwdT???@@@##FV#DDDr$   c                     |                                  fd}                    |           fd}                    |           S )zDeserialize with Futuresc                 r                                    rdS                                 r)                                                               dS                                 }	  |          }                    |           dS # t
          $ r }                    |           Y d}~dS d}~ww xY w)z+Chain result through serialization to recvdN)rM   r[   r\   r_   rN   r^   )_bufloadedr`   rB   loadrecvds       r%   _chainz)_AsyncSocket._deserialize.<locals>._chain[  s    vvxx    	) 1 122222llnn)!T#YYF LL((((( ! ' ' 'OOA&&&&&&&&&'s   *B 
B6B11B6c                                                      rdS                                 r                                 dS dS )z"Chain cancellation from f to recvdN)rM   rX   rY   )r   rB   r   s    r%   _chain_cancelz0_AsyncSocket._deserialize.<locals>._chain_cancell  sC    zz|| {{}}  r$   )r)   rm   )r.   r   r   r   r   rB   s    ``  @r%   _deserializez_AsyncSocket._deserializeW  s    LLNN	) 	) 	) 	) 	) 	) 	) 	'''	 	 	 	 	 	 	
M***r$   c                      j         rt          j        t          j                                                   }|                     |           t          t          |                    |                    } 	                                 fd}|
                                r ||           n|                    |           S )zSpoll the socket for events

        returns a Future for the poll results.
        c                                                     rd S |                                 r(	                                  n# t          $ r Y nw xY wd S |                                 r)                    |                                            d S t          |                                           }                    |	                    d                     d S rW   )
rM   rX   rY   rZ   r[   r\   r   r_   rN   r   )rB   evtsr   r.   s     r%   unwrap_resultz(_AsyncSocket.poll.<locals>.unwrap_result  s    {{}} {{}} MMOOOO#   D {{}} 5$$Q[[]]33333AHHJJ''!!$((4"3"344444s   A 
AA)r   ro   ZMQErrorENOTSUP_poller_classregisterr   r   rT   r)   rM   rm   )r.   rv   r   prB   r   r   s   `     @r%   rT   z_AsyncSocket.pollw  s     ; 	.----  	

4))	5 	5 	5 	5 	5 	5  6688 	/M!...r$   c                 6     t                      j        |i |S r5   )r]   recv_string)r.   rO   r   ra   s      r%   r   z_AsyncSocket.recv_string  s    "uww"D3F333r$   utf-8sencodingc                 L    t                                          |||          S )N)r   r   )r]   send_string)r.   r   r   r   ra   s       r%   r   z_AsyncSocket.send_string  s"    ww""1EH"EEEr$   c                 :    fd}|                      ||          S )z'Add a timeout for a send or recv Futurec                                                        rd S                      t          j                               d S r5   )rM   r\   ro   AgainrU   s   r%   future_timeoutz1_AsyncSocket._add_timeout.<locals>.future_timeout  s:    {{}}    .....r$   )_call_later)r.   r   rv   r   s    `  r%   _add_timeoutz_AsyncSocket._add_timeout  s4    	/ 	/ 	/ 	/ 	/ 888r$   c                 R    |                                                      ||          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   ru   )r.   delaycallbacks      r%   r   z_AsyncSocket._call_later  s$     ~~**5(;;;r$   c                     t          |          D ]\  }}|j        | u r n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   s       r%   _remove_finished_futurez$_AsyncSocket._remove_finished_future  s^     &j11 	 	LE5|v%% & F 	*U+,,,,,r$   c           	      6    |p                                  }|                    d          r|                    dd          t          j        z  rbt           j        |          }	  |d	i |}|                    |           n,# t          $ r}|	                    |           Y d}~nd}~ww xY w|S t          }t          t          d          r+ j        j        }	|	dk    r                     ||	dz            } j                            t!          |||d|                     |                     fd            j                            t$                    t&          z  r                                   j        r                     t&                     |S )
z4Add a recv event, returning the corresponding Futurer   r   r   NRCVTIMEOre   )r   r   c                 :                         | j                  S r5   )r   r   rB   r.   s    r%   rS   z._AsyncSocket._add_recv_event.<locals>.<lambda>      d221d6HII r$   r#   )r)   
startswithr   ro   DONTWAITgetattrr   rN   r^   r\   r|   rg   rcvtimeor   r   rt   r   rm   r   r   _handle_recv_add_io_state)
r.   r   r   r   rB   r   rr`   r   
timeout_mss
   `         r%   rr   z_AsyncSocket._add_recv_event  s   $dllnn??6"" 		vzz'1'='='M 		4,d33D DNN6NN Q  # # #""""""""# H4$$ 	@*3JQ))!Z$->?? 	!!,q$DPU"V"V"VWWW 	
IIII	
 	
 	
   ((61 	  	'v&&&s   &B 
B-B((B-c           	          |p                                  }|dv r j        s|                    dd          }|                                }|t          j        z  |d<   t           j        |          }d}		  ||fi |}
|                    |
           nj# t          j	        $ r1}|t          j        z  r|
                    |           nd}	Y d}~n/d}~wt          $ r}|
                    |           Y d}~nd}~ww xY w|	r j        r                                  |S t          }t          t          d          rC j                            t          j                  }|dk    r                     ||dz            } j                            t'          |||||	                     |                     fd
                                t,                     |S )z4Add a send event, returning the corresponding Future)r   r   r   r   TFNSNDTIMEOre   )r   r   r   c                 :                         | j                  S r5   )r   r   r   s    r%   rS   z._AsyncSocket._add_send_event.<locals>.<lambda>!  r   r$   )r)   r   r   r   ro   r   r   r   rN   r   r\   r^   r   r   r|   rg   r   r   rt   r   rm   r   r   )r.   r   r   r   r   rB   r   nowait_kwargsr   finish_earlyr   r`   r   r   s   `             r%   rs   z_AsyncSocket._add_send_event  s%   $dllnn ---d6H-JJw**E"KKMMM%*T]%:M'" 4,d33D  L D.... Q : ) ) )4=( )OOA&&&& $)L # # #""""""""#
   % 6335554$$ 	@*..t}==JQ))!Z$->?? 	!!DSFFF	
 	
 	
 	
IIII	
 	
 	
 	7###s$   8	B C>&'CC>C99C>c                    | j                             t                    t          z  sdS d}| j        r>| j                                        \  }}}}}|                                rd}nn| j        >| j        s|                     t                     |dS |                                 |dk    r|	                    d           dS |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 |}|	                    |           dS # t          $ r }|                    |           Y d}~dS d}~ww xY w)zHandle recv eventsNrT   r   r   zUnhandled recv event type: %rr   r#   )r   r   r   r   r   popleftrM   _drop_io_staterY   rN   r   r   
ValueErrorro   r   r^   r\   )	r.   rB   r   r   r   r   r   r_   r`   s	            r%   r   z_AsyncSocket._handle_recv'  s    $$V,,v5 	F  	(,(:(B(B(D(D%AtVQvvxx    	 ! 	('''9F6>>LLF%%%$3DDV^^$)DD<tCDDDw4=(	!T^^F^^F LL       	 	 	OOA	s   D9 9
E#EE#c                    | j                             t                    t          z  sd S d }| j        r>| j                                        \  }}}}}|                                rd }nn| j        >| j        s|                     t                     |d S |                                 |dk    r|	                    d            d S |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 |}|	                    |           d S # t          $ r }|                    |           Y d }~d S d }~ww xY w)NrT   r   r   zUnhandled send event type: %rr   )r   r   r   r   r   r   rM   r   rY   rN   r   r   r   ro   r   r^   r\   )	r.   rB   r   r   r   r   r   r_   r`   s	            r%   _handle_sendz_AsyncSocket._handle_sendP  s    $$V,,w6 	F  	*.*<*D*D*F*F'AtVS%vvxx    	 ! 	)(((9F6>>LLF%%%$3DDV^^$)DD<tCDDDw4=(	!T#((((F LL       	 	 	OOA	s   	D: :
E$EE$c                    | j         j        rdS | j                             t                    }|t          j        z  r|                                  |t          j        z  r|                                  | 	                                 dS )z(Dispatch IO events to _handle_recv, etc.N)
r   r   r   r   ro   r   r   r   r   r   )r.   fdevents
zmq_eventss       r%   _handle_eventsz_AsyncSocket._handle_eventsy  s    # 	F&**622
# 	 $ 	 '')))))r$   c                     | j         dk    rdS || j                            t                    }|| j         z  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   r   r   r   r   r   )r.   r   s     r%   r   z'_AsyncSocket._schedule_remaining_events  si     ;!F>&**622FDK 	5Q 344444	5 	5r$   c                 r    | j         |k    r| j         |z  x}| _         |                     | j                    dS )zAdd io_state to poller.Nr   _update_handlerr.   states     r%   r   z_AsyncSocket._add_io_state  s>    ;%"&+"55EDKT[)))))r$   c                 n    | j         |z  r| j         | z  | _         |                     | j                    dS )z&Stop poller from watching an io_state.Nr  r  s     r%   r   z_AsyncSocket._drop_io_state  s=    ; 	1+%0DKT[)))))r$   c                 Z    |r|                                   |                                  dS )zOUpdate IOLoop handler with state.

        zmq FD is always read-only.
        N)r0   r   r  s     r%   r  z_AsyncSocket._update_handler  s4      	NN'')))))r$   c                     ||                                  }|                    | j        | j        | j                   |                     d| j                   dS )z#initialize the ioloop event handlerNr   )r0   add_handlerr   r   r=   r   r6   s     r%   r-   z_AsyncSocket._init_io_state  sU    <>>##D*D,?LLLD/00000r$   c                     | j         }| j         j        r| j        }| j        | j                            |           dS dS )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  sO    
 # 	B)--b11111 *)r$   )NrI   NNr5   )r   )r   TF)r   r   )NN)NNN)r   r   ):r   r   r    r   r   r   r!   r:   r   r   r   r   classmethodr   r   r   rq   rx   r   ro   rp   r8   r   r   boolr   r
   bytesr   r   Framer   r   MessageTrackerr   r   r   r   rT   r"   r   r   r   r   r~   r   rr   rs   r   r   r   r   r   r   r  r-   r   ry   rz   s   @r%   r;   r;      s         MMF M
C 04( (
 }-( 
( ( ( ( ( (: 9 9a 9- 9# 9QR 9 9 9 [9% %HSM %T % % % % % % K%-EM     +/)CK/4  (,	4;	   X
 DI  '.t}=A	4;	   X
 EJ  '.u~>B	4
#	$   X
 ?D $(8<	5ed4:&667	8   X @E	
 	
	
$(	
8<	
	5ed4:&667	8	
 	
 	
 	
 @E	W 	W	W$(	W8<	W	5
*+	,	W 	W 	W 	W HM
T 
T
T%(
T48
T	8D/0	1
T 
T 
T 
T E EE E 	E
 E E 
8D/0	1E E E E(  @  t{ $ $y~ $ $ $ $N4in 4 4 4 4 4 4F FS F FC FiX\o F F F F F F9 9 9< < < - - \-" " " "H6 6 6 6p'! '! '!R&! &! &!R
* 
* 
* 
*5 5 5 5 * * ** * *	* 	* 	*1 1 1 1	2 	2 	2 	2 	2 	2 	2r$   )%r8   r   asyncior   collectionsr   	itertoolsr   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   zmqro   r   r   r   zmq._typingr   r   r'   Pollerr:   r|   r   rp   r;   r#   r$   r%   <module>r     s.   + +
                                                      ' ' ' ' ' ' ' ' ' '          :   "       <j j j j j64; j j jZ        GC~&&&x2 x2 x2 x2 x264;v. x2 x2 x2 x2 x2r$   