
    i!=                        S SK r S SKrS SKrS SKrS SKJr  S SKJrJrJ	r	J
r
  SSKJrJr  SSKJr    S SKJr  S\ R                   S	\ R                   S
\4S jr/ SQrSrSrSrSrSrSrSrSrSr Sr!Sr"Sr#Sr$Sr%Sr&\\\\\\\ \!\"\#\$\%4r' " S S5      r( " S S 5      r) " S! S"5      r*g! \ a.    \R*                  rS\ R                   S	\ R                   S
\4S jr Nf = f)#    N)Lock)CallableOptionalUnionAny   )WebSocketPayloadExceptionWebSocketProtocolException)validate_utf8)XorMaskerSimple
mask_value
data_valuereturnc                 :    [        U 5      R                  U5      nU$ N)r   process)r   r   mask_results      <C:\des-py\RoboSAPF\venv\Lib\site-packages\websocket\_abnf.py_maskr   %   s    ,Z8@@L    c                     [        U5      n[        R                  U[        5      n[        R                  XS-  -  U S US-   -   [        5      nX4-  R	                  U[        5      $ )N   )lenint
from_bytesnative_byteorderto_bytes)r   r   datalenint_data_valueint_mask_values        r   r   r   -   s`    j/
4DEQ,'*]w{*CCEU
 /99'CSTTr   )ABNFcontinuous_frameframe_bufferSTATUS_NORMALSTATUS_GOING_AWAYSTATUS_PROTOCOL_ERRORSTATUS_UNSUPPORTED_DATA_TYPESTATUS_STATUS_NOT_AVAILABLESTATUS_ABNORMAL_CLOSEDSTATUS_INVALID_PAYLOADSTATUS_POLICY_VIOLATIONSTATUS_MESSAGE_TOO_BIGSTATUS_INVALID_EXTENSIONSTATUS_UNEXPECTED_CONDITIONSTATUS_BAD_GATEWAYSTATUS_TLS_HANDSHAKE_ERRORi  i  i  i  i  i  i  i  i  i  i  i  i  i  i  c                      \ rS rSrSrSrSrSrSrSr	Sr
\\\\\	\
4r\S	\S
\S\S\	S\
S0rSrSrSrSSSS\SS4S\S\S\S\S\S\S\\\\4      SS4S jjrS(S\SS4S jjr\S\S\4S  j5       rS\4S! jr\S)S\\\4   S\S\SS 4S" jj5       rS\4S# jrS$\\\4   S\4S% jr\S$\\\4   S\\\4   S\4S& j5       rS'rg)*r!   j   zm
ABNF frame class.
See http://tools.ietf.org/html/rfc5234
and http://tools.ietf.org/html/rfc6455#section-5.2
r   r         	   
   conttextbinaryclosepingpong~   i   l             finrsv1rsv2rsv3opcoder   datar   Nc                     Xl         X l        X0l        X@l        XPl        X`l        Uc  SnXpl        [        R                  U l	        g)z7
Constructor for ABNF. Please check RFC for arguments.
Nr>   )
r?   r@   rA   rB   rC   r   rD   osurandomget_mask_key)selfr?   r@   rA   rB   rC   r   rD   s           r   __init__ABNF.__init__   s=     			$<D	JJr   skip_utf8_validationc                 |   U R                   (       d"  U R                  (       d  U R                  (       a  [        S5      eU R                  [
        R                  ;  a  [        SU R                  5      eU R                  [
        R                  :X  a  U R                  (       d  [        S5      eU R                  [
        R                  :X  a  [        U R                  5      nU(       d  gUS:X  d  US:  a  [        S5      eUS:  a/  U(       d(  [        U R                  SS 5      (       d  [        S5      e[        U R                  [        5      (       a  U R                  SS OU R                  SS R                  S	5      n[         R"                  " S
U5      S   nU R%                  U5      (       d  [        SU5      egg)z]
Validate the ABNF frame.

Parameters
----------
skip_utf8_validation: skip utf8 validation.
zrsv is not implemented, yetzInvalid opcode %rzInvalid ping frame.Nr   r=   zInvalid close frame.r3   utf-8!Hr   zInvalid close opcode %r)r@   rA   rB   r
   rC   r!   OPCODESOPCODE_PINGr?   OPCODE_CLOSEr   rD   r   
isinstancebytesencodestructunpack_is_valid_close_status)rI   rL   data_length
data_bytescodes        r   validateABNF.validate   sS    99		TYY,-JKK;;dll*,-@$++NN;;$***488,-BCC;;$+++dii.Ka;##501GHHa,%diim4401GHH dii// 		"1YYr]))'2 
 ==z215D..t4401JDQQ 5' ,r   r[   c                 L    U [         ;   =(       d    SU s=:*  =(       a    S:  $ s  $ )Ni  i  )VALID_CLOSE_STATUS)r[   s    r   rX   ABNF._is_valid_close_status   s&    ))Bdd.A.AT.AB.ABr   c                     [        U R                  [        5      (       a  U R                  O[        U R                  5      nSU R                   SU R
                   SU 3$ )Nzfin=z opcode=z data=)rS   rD   strreprr?   rC   )rI   	data_reprs     r   __str__ABNF.__str__   sF    !+DIIs!;!;DIIdii	dhhZx}F9+FFr   c           	          U[         R                  :X  a&  [        U [        5      (       a  U R	                  S5      n [        USSSUSU 5      $ )az  
Create frame to send text, binary and other data.

Parameters
----------
data: str
    data to send. This is string value(byte array).
    If opcode is OPCODE_TEXT and this value is unicode,
    data value is converted into unicode string, automatically.
opcode: int
    operation code. please see OPCODE_MAP.
fin: int
    fin flag. if set to 0, create continue fragmentation.
rN   r   r   )r!   OPCODE_TEXTrS   rb   rU   )rD   rC   r?   s      r   create_frameABNF.create_frame   sC      T%%%*T3*?*?;;w'DCAq&!T22r   c                    [        S U R                  U R                  U R                  U R                  4 5       5      (       a  [        S5      eU R                  [        R                  ;  a  [        S5      e[        U R                  5      nU[        R                  :  a  [        S5      e[        U R                  S-  U R                  S-  -  U R                  S-  -  U R                  S-  -  U R                  -  5      R                  S	5      nU[        R                  :  a.  U[        U R                  S-  U-  5      R                  S	5      -  nOU[        R                   :  aH  U[        U R                  S-  S
-  5      R                  S	5      -  nU["        R$                  " SU5      -  nOGU[        U R                  S-  S-  5      R                  S	5      -  nU["        R$                  " SU5      -  nU R                  (       dM  ['        U R                  [(        5      (       a   U R                  R                  S5      U l
        X R                  -   $ U R+                  S5      nX R-                  U5      -   $ )zB
Format this object to string(byte array) to send data to server.
c              3   *   #    U  H	  oS ;  v   M     g7f))r   r   N ).0xs     r   	<genexpr>ABNF.format.<locals>.<genexpr>   s     T(S1(Ss   z
not 0 or 1zInvalid OPCODEzdata is too long         r   latin-1r=   rO      !QrN   )anyr?   r@   rA   rB   
ValueErrorrC   r!   rP   r   rD   	LENGTH_63chrrU   LENGTH_7r   	LENGTH_16rV   packrS   rb   rH   _get_masked)rI   lengthframe_headermask_keys       r   formatABNF.format   s    T499dii(STTT\**;;dll*-..TYYT^^#/00HHMii1nii1n ii1n kk	
 &
 	 DMM!C1 4v =>EEiPPLdnn$C1 4t ;<CCINNLFKKf55LC1 4t ;<CCINNLFKKf55L$))S)) II,,W5	))++$$Q'..x888r   r   c                     [         R                  XR                  5      n[        U[        5      (       a  UR                  S5      nX-   $ )NrN   )r!   maskrD   rS   rb   rU   )rI   r   ss      r   r   ABNF._get_masked  s7    IIh		*h$$w/H|r   c                    Uc  Sn[        U [        5      (       a  U R                  S5      n [        U[        5      (       a  UR                  S5      n[        [        R                  " SU 5      [        R                  " SU5      5      $ )z
Mask or unmask data. Just do xor for each byte

Parameters
----------
mask_key: bytes or str
    4 byte mask.
data: bytes or str
    data to mask/unmask.
r>   ru   B)rS   rb   rU   r   array)r   rD   s     r   r   	ABNF.mask  sg     <Dh$$y1HdC  ;;y)DU[[h/S$1GHHr   )rD   r?   rH   r   rC   r@   rA   rB   )F)r   ) __name__
__module____qualname____firstlineno____doc__OPCODE_CONTrh   OPCODE_BINARYrR   rQ   OPCODE_PONGrP   
OPCODE_MAPr|   r}   rz   r   r   r   rb   rT   rJ   boolr\   staticmethodrX   re   ri   r   r   r   __static_attributes__rm   r   r   r!   r!   j   s    KKMLKK 	G 	VVxgVVJ HII !,.'' ' 	'
 ' ' ' uS%Z()' 
'0%RT %Rd %RN CS CT C CG G 35, 3c 3 3F 3 3(!9 !9FE#u*$5 %  IuS%Z( Ic5j0A Ie I Ir   r!   c                       \ rS rSrSrSrS\\/\4   S\SS4S jr	SS	 jr
S\4S
 jrSS jrS\\\4   4S jrS\4S jrSS jrS\4S jrSS jrS\4S jrS\S\4S jrSrg)r#   i1  rt   rs   recv_fnrL   r   Nc                 h    Xl         X l        / U l        U R                  5         [	        5       U l        g r   )recvrL   recv_bufferclearr   lock)rI   r   rL   s      r   rJ   frame_buffer.__init__5  s+     	$8! "$

F	r   c                 .    S U l         S U l        S U l        g r   )headerr   r   rI   s    r   r   frame_buffer.clear@  s    '+%)7;r   c                     U R                   S L $ r   )r   r   s    r   needs_headerframe_buffer.needs_headerE      {{d""r   c                     U R                  S5      nUS   nUS-	  S-  nUS-	  S-  nUS-	  S-  nUS-	  S-  nUS-  nUS   nUS-	  S-  n	US	-  n
X4XVXyU
4U l        g )
Nr3   r   rr   r   rs   rt   r      rv   )recv_strictr   )rI   r   b1r?   r@   rA   rB   rC   b2has_masklength_bitss              r   recv_headerframe_buffer.recv_headerH  s    !!!$AYAgkQw{Qw{Qw{cAY7Q;4i$fLr   c                 d    U R                   (       d  gU R                   [        R                     nU$ )NF)r   r#   _HEADER_MASK_INDEX)rI   
header_vals     r   r   frame_buffer.has_maskV  s&    {{++l&E&EF
r   c                     U R                   S L $ r   )r   r   s    r   needs_lengthframe_buffer.needs_length\  r   r   c                 `   U R                   c  [        S5      eU R                   [        R                     nUS-  nUS:X  a1  U R	                  S5      n[
        R                  " SU5      S   U l        g US:X  a1  U R	                  S5      n[
        R                  " SU5      S   U l        g X l        g )	NHeader not receivedrv   r=   r3   rO   r   r4   rw   )r   r
   r#   _HEADER_LENGTH_INDEXr   rV   rW   r   )rI   bitsr   vs       r   recv_lengthframe_buffer.recv_length_  s    ;;,-BCC{{<<<=Tk$  #A --a03DKD   #A --a03DK%Kr   c                     U R                   S L $ r   )r   r   s    r   
needs_maskframe_buffer.needs_maskm  s    $&&r   c                 j    U R                  5       (       a  U R                  S5      U l        g SU l        g )Nr   r>   )r   r   r   r   s    r   	recv_maskframe_buffer.recv_maskp  s$    15$**1-br   c           
         U R                      U R                  5       (       a  U R                  5         U R                  c  [	        S5      eU R                  u  pp4pVnU R                  5       (       a  U R                  5         U R                  nU R                  5       (       a  U R                  5         U R                  n	Uc  [	        S5      eU R                  U5      n
U(       a#  U	c  [	        S5      e[        R                  X5      n
U R                  5         [        XX4XVU
5      nUR                  U R                   5        S S S 5        U$ ! , (       d  f       W$ = f)Nr   zLength not receivedzMask not received)r   r   r   r   r
   r   r   r   r   r   r   r   r!   r   r   r\   rL   )rI   r?   r@   rA   rB   rC   r   _r   r   payloadframes               r   
recv_frameframe_buffer.recv_frames  s%   YY  ""  "{{"01FGG;?;;8SFa   ""  "[[F    J ~01FGG&&v.G%45HII))J8 JJLD'JENN4445? B C YB s   D3E


Ebufsizec                    [        U[        5      (       d  [        S5      eU[        S U R                   5       5      -
  nUS:  ac  U R                  [        SU5      5      n[        U[        5      (       a*  U R                  R                  U5        U[        U5      -  nOOUS:  a  Mc  SR                  U R                  5      nUS:X  a	  / U l        U$ XAS  /U l        US U $ )Nzbufsize must be an integerc              3   8   #    U  H  n[        U5      v   M     g 7fr   )r   )rn   bufs     r   rp   +frame_buffer.recv_strict.<locals>.<genexpr>  s      F5EcS5Es   r   i @  r   )rS   r   ry   sumr   r   minrT   appendr   join)rI   r   shortagebytes_unifieds        r   r   frame_buffer.recv_strict  s    '3''9::S FT5E5E FFFl YYs5(34F&%((  ''/CK'  l ((4++,q=!DN ' 12D8G$$r   )r   r   r   r   r   r   rL   )r   N)r   r   r   r   r   r   r   r   r   rJ   r   r   r   r   r   r   r   r   r   r!   r   rT   r   r   rm   r   r   r#   r#   1  s    	s
+	CG			<
#d #M%c	* #d #&'D 'I"D "H%3 %5 %r   r#   c                   |    \ rS rSrS\S\SS4S jrS\SS4S jrS\SS4S	 jrS\S\	\\
4   4S
 jrS\S\4S jrSrg)r"   i  fire_cont_framerL   r   Nc                 8    Xl         X l        S U l        S U l        g r   )r   rL   	cont_datarecving_frames)rI   r   rL   s      r   rJ   continuous_frame.__init__  s    .$8!.2-1r   r   c                    U R                   (       d)  UR                  [        R                  :X  a  [	        S5      eU R                   (       a:  UR                  [        R
                  [        R                  4;   a  [	        S5      eg g )NzIllegal frame)r   rC   r!   r   r
   rh   r   rI   r   s     r   r\   continuous_frame.validate  sg    ""u||t7G7G'G,_==5<<4
 $
 -_==	$
r   c                 T   U R                   (       a"  U R                   S==   UR                  -  ss'   O\UR                  [        R                  [        R
                  4;   a  UR                  U l        UR                  UR                  /U l         UR                  (       a  S U l        g g )Nr   )r   rD   rC   r!   rh   r   r   r?   r   s     r   addcontinuous_frame.add  sr    >>NN1+|| 0 0$2D2DEE&+ll##llEJJ7DN99"&D r   c                 @    UR                   =(       d    U R                  $ r   )r?   r   r   s     r   is_firecontinuous_frame.is_fire  s    yy0D000r   c                 p   U R                   nUc  [        S5      eS U l         US   Ul        U R                  (       df  Ubc  US   [        R
                  :X  aL  U R                  (       d;  [        UR                  5      (       d!  [        S[        UR                  5       35      eUc  [        S5      eUS   U4$ )NzNo continuation data availabler   r   zcannot decode: )
r   r
   rD   r   r!   rh   rL   r   r	   rc   )rI   r   rD   s      r   extractcontinuous_frame.extract  s    ~~<,-MNN!W
$$ Q4+++--!%**--+od5::>N=O,PQQ<,-MNNAw~r   )r   r   r   rL   )r   r   r   r   r   rJ   r!   r\   r   r   r   r   tupler   r   rm   r   r   r"   r"     sq    2 2D 2T 2>d >t >	' 	'$ 	'1T 1eD#I&6 1T e r   r"   )+r   rF   rV   sys	threadingr   typingr   r   r   r   _exceptionsr	   r
   _utilsr   wsaccel.xormaskr   rT   r   ImportError	byteorderr   __all__r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   STATUS_SERVICE_RESTARTSTATUS_TRY_AGAIN_LATERr/   r0   r_   r!   r#   r"   rm   r   r   <module>r      sL    	  
  1 1 N !&U
 0%++ 5;; 5 "(   # "      "    !     DI DIN@% @%F. .W  
U}}U%++ U5;; U5 U	
Us   %B' '1CC