
    'jS                         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	m
Z
mZmZmZ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mZmZmZmZmZmZm Z   G d d          Z! G d d          Z"dS )    N)Logger)Lock)OptionalCallableUnionListTupleDict)urlparse)uuid4)SlackClientNotConnectedErrorSlackClientConfigurationError   )FrameHeader)_parse_handshake_response_validate_sec_websocket_accept_generate_sec_websocket_key_to_readable_opcode_receive_messages_build_data_frame_for_sending_parse_text_payload _establish_new_socket_connectionc                        e Zd ZU eed<   d ZdS )ConnectionState
terminatedc                     d| _         d S )NF)r   selfs    i/usr/local/lib/hermes-agent/venv/lib/python3.11/site-packages/slack_sdk/socket_mode/builtin/connection.py__init__zConnectionState.__init__   s        N)__name__
__module____qualname__bool__annotations__r     r!   r   r   r      s3                   r!   r   c                       e Zd ZU eed<   eed<   ee         ed<   eeeef                  ed<   eed<   eed<   ee	         ed<   eed<   ee
j                 ed	<   eeegd
f                  ed<   eeegd
f                  ed<   eeeee         gd
f                  ed<   	 	 	 	 	 	 	 	 	 	 	 	 	 d'dededee         deeeef                  de	de	dededededeeegd
f                  deeegd
f                  deeeee         gd
f                  dedee
j                 fdZd(dZd(dZdefdZd(dZd)d eeef         dd
fd!Zd)d eeef         dd
fd"Zd edd
fd#Zd(d$Zd%edd
fd&Zd
S )*
Connectionurlloggerproxyproxy_headerstrace_enabledping_pong_trace_enabledlast_ping_pong_time
session_idsockNon_message_listeneron_error_listeneron_close_listener         FSocket Modeping_intervalreceive_timeoutreceive_buffer_sizeall_message_trace_enabledconnection_type_namessl_contextc                    || _         || _        || _        || _        || _        || _        || _        | j        dk     rt          d          t          t                                | _
        || _        |	| _        |
| _        d | _        d| _        d | _        t#                      | _        t#                      | _        || _        || _        || _        || _        || _        d S )N   z'Too small receive_buffer_size detected.r   )r*   r+   r,   r-   r:   r;   r<   r   strr   r1   r.   r=   r/   r0   #consecutive_check_state_error_countr2   r   sock_receive_locksock_send_lockr3   r4   r5   r>   r?   )r   r*   r+   r,   r-   r:   r;   r<   r.   r=   r/   r3   r4   r5   r>   r?   s                   r   r    zConnection.__init__3   s    $ 
**.#6 #b((/0YZZZegg,,*)B&'>$#' 340	!%"ff#6 !2!2$8!&r!   returnc                 z   	 t          | j                                                  }|j        }|j        p|j        dk    rdnd}| j        r)| j                            d| d| d| j	         d           t          | j	        ||| j        | j        | j        | j        | j        | j        | j        
  
        }	 |j         d	|j         }t%                      }d
| d|j         d| d}d                    d |                    d          D                       }| j        r,| j                            | j         d| j	         d|            | j        5  |                    |                    d                     d d d            n# 1 swxY w Y   t1          |          \  }	}
}| j        r,| j                            | j         d| j	         d|            |	dk    rht3          ||
          s t5          d| j         d| j	         d          || _        |                     | j	         dt;          j                                n-d|	 d| d| j	         d}| j                            |           d S d S # t>          j         $ r}d }|j!        rEtE          |j!                  dk    r-tG          |j!        d         tH                    r|j!        d         }|Md| d| j	         d| d}| j        r| j        %                    |           n| j                             |            d }~ww xY w# tL          $ r}d| j	         d| d}| j        r| j        %                    |           n| j                             |           | j'        | '                    |           | (                                 Y d }~d S d }~ww xY w)Nwssi  P   z)Connecting to the address for handshake: :z (session id: ))
r1   server_hostnameserver_portr+   rE   r;   r,   r-   r.   r?   ?zGET z$ HTTP/1.1
                    Host: zw
                    Upgrade: websocket
                    Connection: Upgrade
                    Sec-WebSocket-Key: z@
                    Sec-WebSocket-Version: 13

                z
c                 6    g | ]}|                                 S r'   )lstrip).0lines     r   
<listcomp>z&Connection.connect.<locals>.<listcomp>   s     'V'V'V$'V'V'Vr!   
z  handshake request (session id: z):
utf-8z! handshake response (session id: e   z$Invalid response header detected in z7Received an unexpected response for handshake (status: z, response: z, session id: r   r   zError code: 	, error: z.Failed to establish a connection (session id: ))r   r*   striphostnameportschemer.   r+   debugr1   r   rE   r;   r,   r-   r?   pathqueryr   joinsplitr>   sendencoder   r   r   r2   pingtimewarningsocketerrorargslen
isinstanceint	exception	Exceptionr4   
disconnect)r   
parsed_urlrY   rZ   r2   r]   sec_websocket_keymessagereqstatusheaderstextecodeerror_messages                  r   connectzConnection.connectb   s   U	!$(.."2"233J&/H"V:3D3M3MCCSUD! !!uuu4uucgcruuu   2R? ( {#2 $ 4j"0"0 ,2 2 2D3$/>>J,<>>$?$A$A!4  %.  ):	   ";;'V'V'--PTBUBU'V'V'VWW% K%%4ppVZVeppknpp   ( 3 3IIcjj112223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 )B$(G(G%% K%%4rrW[Wfrrlprr   S==9:KWUU :@4C\ @ @-1_@ @ @  
 !%DIII@@49;;@@AAAA_$*_ _8<_ _LPO_ _ _  K''00000 BA < 
 
 
&*6 %c!&kkAoo*QVAY2L2Lo6!9D#$e4$e$et$e$eab$e$e$eM) 9--m<<<<))-888
  
	 
	 
	kT_kkghkkkM! 1%%m4444!!-000%1&&q)))OO
	s^   B4L+ 7BI6 )F<I6 FI6 FC"I6 6L(BL##L((L+ +
N:5A:N55N:c                    | j         ^| j        5  | j        5  | j                                          d | _         d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   | j                            d| j         d           d S )Nz,The connection has been closed (session id: rK   )r2   rE   rD   closer+   infor1   r   s    r   rn   zConnection.disconnect   s   9 $ % %+ % %IOO%%% $DI% % % % % % % % % % % % % % %% % % % % % % % % % % % % % % 	ZZZZ[[[[[s3   A!AAA	AA	AA"Ac                     | j         d uS N)r2   r   s    r   	is_activezConnection.is_active   s    y$$r!   c                 .    |                                   d S r~   )rn   r   s    r   r{   zConnection.close   s    r!    payloadc                    | j         rW| j        rPt          |t                    r|                    d          }| j                            d| j         d| d           t          |t          j
                  }| j        5  | j        | j                            |           n!| j        r| j                            d           d d d            d S # 1 swxY w Y   d S )NrU   z'Sending a ping data frame (session id: , payload: rK   zOSkipped sending a ping message as the underlying socket is no longer available.)r.   r/   rj   bytesdecoder+   r\   r1   r   r   OPCODE_PINGrE   r2   ra   r   r   datas      r   rc   zConnection.ping   >    	s$"> 	s'5)) 2!..11Kq4?qqgnqqqrrr,Wk6MNN  	y 	yy$	t$$$$/ yK%%&wxxx	y 	y 	y 	y 	y 	y 	y 	y 	y 	y 	y 	y 	y 	y 	y 	y 	y 	y    ACCCc                    | j         rW| j        rPt          |t                    r|                    d          }| j                            d| j         d| d           t          |t          j
                  }| j        5  | j        | j                            |           n!| j        r| j                            d           d d d            d S # 1 swxY w Y   d S )NrU   z'Sending a pong data frame (session id: r   rK   zOSkipped sending a pong message as the underlying socket is no longer available.)r.   r/   rj   r   r   r+   r\   r1   r   r   OPCODE_PONGrE   r2   ra   r   s      r   pongzConnection.pong   r   r   c           	         | j         rPt          |t                    r|                    d          }| j                            d| j         d| d           t          |t          j	                  }| j
        5  	 | j                            |           n-# t          $ r }t          d| j         d| d          d }~ww xY w	 d d d            d S # 1 swxY w Y   d S )NrU   z'Sending a text data frame (session id: r   rK   zLFailed to send a message as the connection is no longer active (session_id: rW   )r.   rj   r   r   r+   r\   r1   r   r   OPCODE_TEXTrE   r2   ra   rm   r   )r   r   r   rv   s       r   ra   zConnection.send   s]    	s'5)) 2!..11Kq4?qqgnqqqrrr,Wk6MNN  	 	
	t$$$$   
 3C$(OC C>?C C C   %	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s6   9C;BC
C  B;;C  CCCc                 @   	 | j         >	 |                     | j         dt          j                                nW# t          j        $ rE}| j                            d| j         d| d           |                                  Y d }~d S d }~ww xY w| j	        t          t          j                    | j	        z
            }| j        r2|| j        k    r'| d| j         d}| j                            |           || j        dz  k    }|r<| j                            d| j         d| d	           |                                  d S n#| j                            d
| j         d           d| _        d S # t          $ r}d| j         dt!          |          j         d| d}| j        r| j                            |           n| j                            |           | xj        dz  c_        | j        dk    r|                                  Y d }~d S Y d }~d S d }~ww xY w)NrJ   zFUnable to send a ping message. Closing the connection... (session id: z
, reason: rK   zb seconds have passed since this client last received a pong response from the server (session id:    z@The connection seems to be stale. Disconnecting... (session id: z, reason: disconnected for z
+ seconds)z0This connection is already closed. (session id: r   z/Failed to check the state of sock (session id: rW   z, message: r   r6   )r2   rc   r1   rd   sslSSLZeroReturnErrorr+   r|   rn   r0   rk   r.   r:   r\   rC   rm   typer"   rl   rg   )r   rv   disconnected_secondsrq   is_stalerx   s         r   check_statezConnection.check_state   s   .	"y$II@@49;;@@AAAA-   K$$I)-I IDEI I I   OO%%%FFFFF +7+.ty{{T=U/U+V+V() 3.BTEW.W.W3 ? ?,0O? ? ?  
 ))'2223d6H16LLH ((Z-1_Z Z9MZ Z Z  
 )))!!"jX\Xg"j"j"jkkk78D444 	" 	" 	"\ $\ \:>q'':J\ \WX\ \ \  ! 1%%m4444!!-0004494471<<!!!!!!!!! =<<<<<	"sE   E4 0< E4 B:BE4 BB5E4 +E4 4
H>BHHstatec           
         ddi}d}d}d}|j         sN	 |                                 r>t          | j        | j        | j        | j        | j                  }|D ]}|\  }}	| j        du rf|rt          |j
                  nd}
t          |	| j                  }|                    |          }|d}n|dz  }||i}| j        s||j
        |j
        t          j        k    r6|dz  }||z  dk    r(| j                            d| d	| j         d
           d}|j
        t          j        k    r6|dz  }||z  dk    r(| j                            d| d| j         d
           d}|d uo:|j
        d uo1|j
        t          j        k    p|j
        t          j        k    o| j         }|s/|dk     r)| j                            d| j         d|
 d| d
           |||j
        t          j        k    r|                     |	           |j
        t          j        k    r|	                    d          }|                    d          }t-          |          dk    rj|d         |d         }}| j        |k    rO	 t/          |          | _        ,# t2          $ r+}| j                            d| d|            Y d }~\d }~ww xY wf|j
        t          j        k    r3| j        *|	                    d          }|                     |           |j
        t          j        k    r| j        |t-          |	          dk    rSt=          j        d|	d d                   \  }|	dd                              d          }|                     ||           n|                     dd           |                                   d|_         c|rt          |j
                  nd}
|	}|j
        t          j!        k    rO	 |	|	                    d          nd}n4# t2          $ r'}| j        "                    d|            Y d }~nd }~ww xY wd| j         d|
 d| d
}| j        #                    |           ntI          j%        d           n# tL          j'        $ r tI          j%        d           Y ntP          $ r0}|j)        dk    r"|j         r| j                            d           ng| j*        | *                    |           nJd| j         d| d
}| j        r| j        +                    |           n| j        ,                    |           |                                 rw	 |                                   na# t2          $ rT}d| j         d| d
}| j        r| j        +                    |           n| j        ,                    |           Y d }~nd }~ww xY wd|_         Y d }~nd }~wt2          $ rq}| j*        | *                    |           nJd | j         d| d
}| j        r| j        +                    |           n| j        ,                    |           Y d }~nd }~ww xY w|j         Nd|_         d S )!Nr   r   i  )r2   rD   r+   r<   r=   T-r   z	Received z ping data frame (session id: rK   z pong data frame (session id: r6   z'Received a new data frame (session id: z
, opcode: r   rU   rJ      z*Failed to parse a pong message  (message: rW   z!Hi  r   z#Failed to convert the data to text z0Received an unsupported data frame (session id: g?g{Gz?	   z_The reason why you got [Errno 9] Bad file descriptor here is the socket is no longer available.z1Got an OSError while receiving data (session id: z"Failed to disconnect (session id: z3Got an exception while receiving data (session id: )-r   r   r   r2   rD   r+   r<   r=   r.   r   opcoder   getr/   r   r   r\   r1   r   r   r   r`   ri   floatr0   rm   r   r3   OPCODE_CLOSEr5   structunpackrn   OPCODE_BINARYr|   re   rd   sleeprf   timeoutOSErrorerrnor4   rl   rg   )r   r   repeated_messages
ping_count
pong_countping_pong_log_summary_sizereceived_messagesrq   headerr   r   r   countping_pong_to_skipstr_messageelementsr1   	ping_timerv   ru   rw   reasonrx   disconnection_errors                           r   run_until_completionzConnection.run_until_completion)  sB   &N

%)"" T	9S9>>## i$Sd!Y*.*@#{,0,D262PT T T% $5 _9 _9'.
  -55PV*_*=fm*L*L*L\_F+>tT[+Q+QG3D3H3H3Q3QE$}() %
18%0@-#'#? 7FDV[a[h[t#)=K4K#K#K$.!OJ'14N'NRS'S'S(,(9(9-O8R -O -O<@O-O -O -O)* )* )* 67
#)=K4K#K#K$.!OJ'14N'NRS'S'S(,(9(9-O8R -O -O<@O-O -O -O)* )* )* 67
 !'d 2 !E$*M$=!E%+]k6M%M%yQWQ^bmbyQy!E )-(D$D	 . $5 " !% 1 1%m48O%m %mOU%m %mbi%m %m %m!" !" !"
 ">$
 "=K,CCC IIdOOOO#]k.EEE*.++g*>*>K'2'8'8'='=H"8}}118@Xa[I
#'?j#@#@%*CHCSCS(@(@+4 %* %* %*(,(9(9,u\g,u,urs,u,u)* )* )* )* )* )* )* )*%* $]k.EEE#7C'+{{7';'; $ 8 8 > > >#]k.FFF#5A#&t99>>.4mD$rr(.K.KGT-1!""X__W-E-EF$($:$:4$H$H$H$H$($:$:4$D$D$D OO---/3E,, LR%Z%8%G%G%GWZF9=G%}0III!`FJFVdkk'.B.B.B\^GG'0 !` !` !`$(K$4$45^[\5^5^$_$_$_$_$_$_$_$_!`!i04!i !iKQ!i !i^e!i !i !i $ !K//8888_9B JsOOO> ! ! !
4        7a<<E$4<K%%|    -9..q1111(}_c_n(}(}yz(}(}(}- = K11-@@@@ K--m<<< >>## 
=	=))))$ = = =tDOtt^qttt &  - = K11-@@@@ K--m<<<= $(  9 9 9)5**1----${]a]l${${wx${${${M) 9--m<<<<))-8889Y " T	9l  s   IQ= .JQ= 
J9 J4.Q= 4J99D1Q= +PQ= 
P6P1,Q= 1P66AQ= =#Y#
Y-B(WU+*W+
W	5A
W?WW		
WY%A'YY)NNr6   r7   r8   FFFNNNr9   N)rF   N)r   )r"   r#   r$   rB   r&   r   r   r
   r%   r   r   	SSLSocketr   rm   rk   
SSLContextr    ry   rn   r   r{   r   r   rc   r   ra   r   r   r   r'   r!   r   r)   r)   "   sI        	HHHNNNC=DcN++++!!!!!%(((OOO
3=
!!!!!(C5$;"78888)d): ;<<<<#x})=t)C DEEEE  $26 !"#'#*/(-?CCGLP$104!-' -'-' -' }	-'
  S#X/-' -' -' !-' -' $(-' "&-' &hud{&;<-' $Hi[$->$?@-' $Hc8C=-A4-G$HI-' "-'  cn-!-' -' -' -'^V V V Vp	\ 	\ 	\ 	\%4 % % % %   y yE#u*- yt y y y yy yE#u*- yt y y y yC D    &/" /" /" /"b[ / [ d [  [  [  [  [  [ r!   r)   )#rf   r   r   rd   loggingr   	threadingr   typingr   r   r   r   r	   r
   urllib.parser   uuidr   slack_sdk.errorsr   r   frame_headerr   	internalsr   r   r   r   r   r   r   r   r   r)   r'   r!   r   <module>r      s    



               ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ! ! ! ! ! !       X X X X X X X X % % % % % %	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	               b  b  b  b  b  b  b  b  b  b r!   