
    ∋d:                       d dl mZ d dlZd dlZd dlZd dlZ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 d dlmZmZ d dlmZ d d	lmZ d d
lmZmZmZmZ d dlZd dlmZmZ d dl m!Z!m"Z"m#Z#m$Z$m%Z% d dl&m'Z' d dl(m)Z)m*Z*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0  ej1        e2          Z3dZ4ej5        6                    ej7        8                    d                    Z9 G d de          Z: G d de!          Z; G d de!          Z< G d de<          Z= G d de%          Z> G d de>          Z? G d de#          Z@ G d  d!e@          ZA G d" d#e)          ZB G d$ d%e)          ZC eB            e'd&<    eC            e'd'<   dS )(    )annotationsN)Callable)SSLError)Any)web)HTTPClientErrorHTTPRequest)
HTTPServer)StreamClosedError)WebSocketClientConnectionWebSocketClosedErrorWebSocketHandlerwebsocket_connect)parse_host_portunparse_host_port)CommCommClosedError	ConnectorFatalCommClosedErrorListener)backends)BaseTCPBackend_expect_tls_contextconvert_stream_closed_error)ensure_concrete_hostfrom_framesget_tcp_server_address	to_framesl    d(	 z!distributed.comm.websockets.shardc                  d     e Zd Z	 	 	 	 dd fdZd Zd Zd	 Zd
 Z fdZe	dd            Z
 xZS )	WSHandlerNTdeserializeboolallow_offloadc                    || _         || _        || _        || _         |            | _         t                      j        ||fi | d S N)handlerr!   r#   requestlistenersuper__init__)	selfapplicationr'   r&   r!   r#   r(   kwargs	__class__s	           3lib/python3.11/site-packages/distributed/comm/ws.pyr*   zWSHandler.__init__9   sW     &* 

g8888888    c                   K   |                      d           t          j                    | _        d| _        t          | | j        | j                  | _        t          j	        | 
                                           d S )NTF)r!   r#   )set_nodelayasyncioQueueqclosedWSHandlerCommr!   r#   commensure_futureon_openr+   s    r/   openzWSHandler.openJ   sr      !d.d>P
 
 
	
 	dllnn-----r0   c                   K   	 | j                             | j                   d {V  n*# t          $ r t                              d           Y nw xY w|                     | j                   d {V  d S )Nz,Connection closed before handshake completed)r(   on_connectionr8   r   loggerdebugr&   r;   s    r/   r:   zWSHandler.on_openU   s      	I---di8888888888 	I 	I 	ILLGHHHHH	Ill49%%%%%%%%%%%s   %* $AAc                J   K   | j                             |           d {V  d S r%   )r5   put)r+   msgs     r/   
on_messagezWSHandler.on_message\   s0      fjjoor0   c                R    d| _         | j                            t                     d S NT)r6   r5   
put_nowaitr   r;   s    r/   on_closezWSHandler.on_close_   s%    /*****r0   c                V    t                                                       d| _        d S rF   )r)   closer6   r+   r.   s    r/   rJ   zWSHandler.closec   s    r0   returnintc                B    | j                             dt                    S )Nwebsocket_max_message_size)settingsgetMAX_MESSAGE_SIZEr;   s    r/   max_message_sizezWSHandler.max_message_sizeg   s    }  !=?OPPPr0   )NTTN)r!   r"   r#   r"   )rL   rM   )__name__
__module____qualname__r*   r<   r:   rD   rH   rJ   propertyrS   __classcell__r.   s   @r/   r    r    8   s        
  "9 9 9 9 9 9 9"	. 	. 	.& & &  + + +     Q Q Q XQ Q Q Q Qr0   r    c                       e Zd Z	 	 dd fdZdd	Zdd
Zd Zedd            Zedd            Z	ed fd            Z
d Zd Z xZS )r7   Tr&   r    r!   r"   r#   c                h    || _         || _        t                                          |           d S )Nr!   )r&   r#   r)   r*   )r+   r&   r!   r#   r.   s       r/   r*   zWSHandlerComm.__init__m   s5     *[11111r0   Nc                x   K   	  j         j                                         d {V }n# t          $ r t	                      w xY w|t          u rt	                      t          j        d|          d         } fdt          |          D              d {V }t          | j	        | j
                   d {V S )NQr   c                \   K   g | ]&}j         j                                         d {V 'S r%   )r&   r5   rQ   .0_r+   s     r/   
<listcomp>z&WSHandlerComm.read.<locals>.<listcomp>   s?      HHH1++--------HHHr0   r!   deserializersr#   )r&   r5   rQ   RuntimeErrorr   structunpackranger   r!   r#   )r+   re   n_framesframess   `   r/   readzWSHandlerComm.readw   s     	$!\^//11111111HH 	$ 	$ 	$!###	$ &&!###}S(33A6HHHHHhHHHHHHHHH (',	
 
 
 
 
 
 
 
 
 	
s	   $* Ac           	     $  K   t          || j        ||| j        | j        d| j        t
                     d {V }t          j        dt          |                    }d}	 | j	        
                    |d           d {V  |D ][}t          |          t          urt          |          }| j	        
                    |d           d {V  |t          |          z  }\n.# t          $ r!}t          t          |                    d }~ww xY w|S N)sender	recipient)r#   serializerson_errorcontextframe_split_sizer^   r   T)binary)r   r#   
local_inforemote_infohandshake_optionsBIG_BYTES_SHARD_SIZErg   packlenr&   write_messagetypebytesr   r   str	r+   rC   rq   rr   rk   nnbytes_framesframees	            r/   writezWSHandlerComm.write   sj      ,#/!-  (
 2
 
 
 
 
 
 
 
 
 KS[[))	*,,,Qt,<<<<<<<<< , ,;;e++!%LLEl00t0DDDDDDDDDU+	,
 $ 	* 	* 	*!#a&&)))	* s   !B C" "
D,DDc                8    | j                                          d S r%   r&   rJ   r;   s    r/   abortzWSHandlerComm.abort   s    r0   rL   r   c                $    | j         j        j        S r%   )r&   r'   hostr;   s    r/   local_addresszWSHandlerComm.local_address   s    |#((r0   c                \    | j         j        j        }t          |t                    sJ |dz   S )Nz:0)r&   r'   	remote_ip
isinstancer   )r+   ips     r/   peer_addresszWSHandlerComm.peer_address   s/    \!+"c"""""Dyr0   c                f    	 t                      j        S # t          t          j        f$ r Y dS w xY wzOverride Comm.same_host, adding support for HTTP-only subdomains, which won't
        have a port and that may not be known to the DNS service
        Fr)   	same_host
ValueErrorsocketgaierrorrK   s    r/   r   zWSHandlerComm.same_host   >    
	77$$FO, 	 	 	55	    00c                    | j         j        p=| j         j         p0| j         j        j        j        o| j         j        j        j        j        S r%   )r&   r6   ws_connectionr'   
connectionstreamr;   s    r/   r6   zWSHandlerComm.closed   sH    L ><-->|#.5 >$/6=		
r0   c                <   K   | j                                          d S r%   r   r;   s    r/   rJ   zWSHandlerComm.close   s       r0   TT)r&   r    r!   r"   r#   r"   r%   NNrL   r   rL   r"   )rT   rU   rV   r*   rl   r   r   rW   r   r   r   r6   rJ   rX   rY   s   @r/   r7   r7   l   s	        !"	2 2 2 2 2 2 2
 
 
 
$   6   ) ) ) X)    X
      X
 
 
      r0   r7   c                       e Zd ZdZ	 	 dd fdZd	 ZddZddZd Zd Z	d Z
edd            Zedd            Zed fd            Zd Zed             Z xZS )WSws://Tsockr   r!   r"   r#   c                   d| _         t                                          |           || _        | j         | j        j        j         | _        | j         | j        j        j         | _        || _	        t          j        | |                                           | _        i | _        |                                  d S )NFr\   )_closedr)   r*   r   prefixparsednetloc_local_addr
_peer_addrr#   weakreffinalize_get_finalizer
_finalizer_extra_read_extra)r+   r   r!   r#   r.   s       r/   r*   zWS.__init__   s     [111	"kD49+;+BDD![C$)*:*ACC*!*41D1D1F1FGGr0   c                :    t          |           }| j        |fd}|S )Nc                v    | j         s1t                              d|           |                                  d S d S )Nz Closing dangling websocket in %s)
close_coder?   inforJ   )r   rs     r/   r   z#WS._get_finalizer.<locals>.finalize   s<    ? >BBB

 r0   )reprr   )r+   r   r   s      r/   r   zWS._get_finalizer   s/    JJ)q 	 	 	 	
 r0   Nc                   K   	  j                                          d {V }|"                                  t                      t	          j        d|          d         }n!# t          $ r}t          |          d }~ww xY w fdt          |          D              d {V }t          | j	        | j
                   d {V }|S )Nr^   r   c                R   K   g | ]!}j                                          d {V "S r%   )r   read_messager`   s     r/   rc   zWS.read.<locals>.<listcomp>   s=      LLLq//11111111LLLr0   rd   )r   r   r   r   rg   rh   r   ri   r   r!   r#   )r+   re   rj   r   rk   rC   s   `     r/   rl   zWS.read   s     	%!Y3355555555H

%'''}S(33A6HH# 	% 	% 	%!!$$$	% MLLLE(OOLLLLLLLLL(',	
 
 
 
 
 
 
 
 
 
s   AA$ $
B.A==Bc           	     
  K   t          || j        ||| j        | j        d| j        t
                     d {V }t          j        dt          |                    }d}	 | j	        
                    |d           d {V  |D ][}t          |          t          urt          |          }| j	        
                    |d           d {V  |t          |          z  }\n!# t          $ r}t          |          d }~ww xY w|S rn   )r   r#   rv   rw   rx   ry   rg   rz   r{   r   r|   r}   r~   r   r   r   s	            r/   r   zWS.write   sd      ,#/!-  (
 2
 
 
 
 
 
 
 
 
 KS[[))	%)))!D)999999999 , ,;;e++!%LLEi--eD-AAAAAAAAAU+	,
 $ 	% 	% 	%!!$$$	% s   !B C" "
D ,C;;D c                   K   | j         j        s2| j                                         | j                                          d| _        d S rF   r   r   r   detachrJ   r   r;   s    r/   rJ   zWS.close  sD      y# 	O""$$$IOOr0   c                    | j         j        s2| j                                         | j                                          d| _        d S rF   r   r;   s    r/   r   zWS.abort  s@    y# 	O""$$$IOOr0   c                8    | j          p| j         j        p| j        S r%   )r   r   r   r;   s    r/   r6   z	WS.closed   s    9}D	 4DDr0   rL   r   c                6    | j          | j        j        j         S r%   r   r   r   r   r;   s    r/   r   zWS.local_address#      +8ty/6888r0   c                6    | j          | j        j        j         S r%   r   r;   s    r/   r   zWS.peer_address'  r   r0   c                f    	 t                      j        S # t          t          j        f$ r Y dS w xY wr   r   rK   s    r/   r   zWS.same_host+  r   r   c                    d S r%    r;   s    r/   r   zWS._read_extra5  s    r0   c                    | j         S r%   )r   r;   s    r/   
extra_infozWS.extra_info8  s
    {r0   r   )r   r   r!   r"   r#   r"   r%   r   r   r   )rT   rU   rV   r   r*   r   rl   r   rJ   r   r6   rW   r   r   r   r   r   rX   rY   s   @r/   r   r      sJ       F
 !"	            *   6    E E E 9 9 9 X9 9 9 9 X9      X     X    r0   r   c                      e Zd ZdZd ZdS )WSSwss://c                L   t                               |            | j        j        j        }|v| j                            |                                |                                           | j        d         \  }}}t          
                    d| j        |||           d S d S )N)peercertcipherr   z7TLS connection with %r: protocol=%s, cipher=%s, bits=%d)r   r   r   r   r   r   updategetpeercertr   r?   r@   r   )r+   r   r   protobitss        r/   r   zWSS._read_extra@  s    
ty&K(8(8(:(:4;;==QQQ"&+h"7FE4LLI     r0   N)rT   rU   rV   r   r   r   r0   r/   r   r   =  s(        F    r0   r   c                      e Zd ZdZ	 	 dddZd Zedd            Zd Zd Z	d Z
edd            Zedd            ZdS )
WSListenerr   TFaddressr   r&   r   r!   r"   r#   connection_argsr   c                   |                     | j                  s| j         | }t          |d          \  | _        | _        || _        || _        || _        || _        d | _	        d| _
         | j        di || _        d S )Nr   )default_portTr   )
startswithr   r   r   portr&   r!   r#   r   bound_addressnew_comm_server_get_server_argsserver_args)r+   r   r&   r!   r#   r   s         r/   r*   zWSListener.__init__R  s     !!$+.. 	0/g//G,W1EEE&*.!#040CC?CCr0   c                    i S r%   r   r+   r   s     r/   r   zWSListener._get_server_argsf  s    	r0   rL   c                2    | j          | j         d| j         S )N:)r   r   r   r;   s    r/   r   zWSListener.addressi  s!    +4tw44444r0   c                  K   dt           | j        | j        | j        t	          j        |           dfg}	 | j        j        j        | _        | j        j	        | j	        k    rd| _
        t                              d| j	                    | j                            d          }| j        j        r|t!          d          |r/t#          j        d| j	         dt&                     || j        _        | j        j        j                            d	|           n*# t,          $ r t                              d
           Y nw xY w| j
        rJt/          t1          j        |          fi | j        | _        | j                            | j	                   d S d S # | j
        rIt/          t1          j        |          fi | j        | _        | j                            | j	                   w w xY w)N/)r&   r!   r#   r(   Fz Sharing the same server on port ssl_optionsz&No ssl context found for the Schedulerz:Dashboard and Scheduler are using the same server on port zU, defaulting to the Scheduler's ssl context. Your dashboard could become inaccessiblez.*z'No server available. Creating a new one)r    r&   r!   r#   r   ref__self__http_serverserverr   r   r?   r@   r   rQ   r   rf   warningswarnRuntimeWarninghttp_applicationadd_handlersAttributeErrorr
   r   Applicationlisten)r+   routesr   s      r/   startzWSListener.startm  s      #|#'#3%)%7 'D 1 1	 	
	.,/;DK{49,,',$K	KKLLL".22=AA;* Q{/B&'OPPP :MC379C C C '   /:DK+%6CCE6RRR 	D 	D 	DLLBCCCCC	D # .()@)@UUDDTUU""49-----. .t# .()@)@UUDDTUU""49----.s+   C!D F $D>;F =D>>F AG&c                8    | j                                          d S r%   )r   stopr;   s    r/   r   zWSListener.stop  s    r0   c                `    | j         t          | j                  | _         | j         dd         S )z@
        The listening address as a (host, port) tuple.
        N   )r   r   r   r;   s    r/   get_host_portzWSListener.get_host_port  s1     %!7!D!DD!"1"%%r0   c                H    | j         t          |                                  z   S r%   )r   r   r   r;   s    r/   listen_addresszWSListener.listen_address  s!    {.0B0B0D0DEEEr0   c                ~    |                                  \  }}t          |          }| j        t          ||          z   S r%   )r   r   r   r   )r+   r   r   s      r/   contact_addresszWSListener.contact_address  s<    ''))
d#D)){.tT::::r0   N)TF)
r   r   r&   r   r!   r"   r#   r"   r   r   r   )rT   rU   rV   r   r*   r   rW   r   r   r   r   r   r   r   r0   r/   r   r   O  s        F !#D D D D D(   5 5 5 X5$. $. $.L  & & & F F F XF ; ; ; X; ; ;r0   r   c                      e Zd ZdZd ZdS )WSSListenerr   c                (    t          |          }d|iS )Nr   )r   )r+   r   ctxs      r/   r   zWSSListener._get_server_args  s    !/22s##r0   N)rT   rU   rV   r   r   r   r0   r/   r  r    s(        F$ $ $ $ $r0   r  c                  $    e Zd ZdZeZddZd ZdS )WSConnectorr   Tc                   K    | j         di |}	 t          | j         | fi |}t          |t                     d {V }|j                                        r%|j        j        rt          |j        j                  ng# t          $ r}t          | |           Y d }~nHd }~wt          $ r}t          d          |d }~wt          $ r}t          d|  d|           |d }~ww xY w|                     ||          S )N)rS   zcTLS expects a `ssl_context` argument of type ssl.SSLContext (perhaps check your TLS configuration?)zin z: r\   r   )_get_connect_argsr	   r   r   rR   r   r6   errorr   r   r   r   r   r   
comm_class)	r+   r   r!   r   r-   r'   r   r   errs	            r/   connectzWSConnector.connect  s`     ''::/::	<!T[";'";";FFvFFG*7EUVVVVVVVVVD{!!## ;(9 ;'(9:::  	1 	1 	1'a00000000 	 	 	&I    	< 	< 	<!"3"3"3"3"344!;	<t===s0   A0B 
C&B!!C&.B>>C&C!!C&c                2    i |                     di           S )Nextra_conn_argsrQ   r   s     r/   r  zWSConnector._get_connect_args  s    =/%%&7<<==r0   N)T)rT   rU   rV   r   r   r	  r  r  r   r0   r/   r  r    sA        FJ> > > >$> > > > >r0   r  c                      e Zd ZdZeZd ZdS )WSSConnectorr   c                    d|                     d          i|                     di           }|                     d          r%i |                     di           d|d         i|d<   |S )Nr   ssl_contextr  server_hostnameheadersHostr  )r+   r   wss_argss      r/   r  zWSSConnector._get_connect_args  s    ?..}==
!!"3R88

 011 	#,,y"--#?+<=>#HY
 r0   N)rT   rU   rV   r   r   r	  r  r   r0   r/   r  r    s-        FJ    r0   r  c                      e Zd ZeZeZdS )	WSBackendN)rT   rU   rV   r  _connector_classr   _listener_classr   r0   r/   r  r    s        " OOOr0   r  c                      e Zd ZeZeZdS )
WSSBackendN)rT   rU   rV   r  r  r  r  r   r0   r/   r  r    s        #!OOOr0   r  wswss)D
__future__r   r3   loggingr   rg   r   r   collections.abcr   sslr   typingr   tornador   tornado.httpclientr   r	   tornado.httpserverr
   tornado.iostreamr   tornado.websocketr   r   r   r   daskdistributed.comm.addressingr   r   distributed.comm.corer   r   r   r   r   distributed.comm.registryr   distributed.comm.tcpr   r   r   distributed.comm.utilsr   r   r   r   	getLoggerrT   r?   rR   utilsparse_bytesconfigrQ   ry   r    r7   r   r   r   r  r  r  r  r  r   r0   r/   <module>r3     s)   " " " " " "       $ $ $ $ $ $                   ; ; ; ; ; ; ; ; ) ) ) ) ) ) . . . . . .             J J J J J J J J              / . . . . .         
            
	8	$	$! z--KOO788  
1Q 1Q 1Q 1Q 1Q  1Q 1Q 1QhX X X X XD X X Xvs s s s s s s sl    "   $X; X; X; X; X; X; X; X;v$ $ $ $ $* $ $ $> > > > >) > > >4    ;   &! ! ! ! ! ! ! !
" " " " " " " "
 *,,r0   