
    vKgi[              	         ^  S r SSKrSSKrSSKJrJr  SSKJr  SSKJ	r	J
r
JrJrJrJrJr  \(       a  SSKJr  \" S5       V ^ s/ sH  m \" U 4S	 j\" S5       5       5      PM     sn r " S
 S5      r " S S5      rSrSrSrSrSr\rSrSrSrSr Sr!Sr"Sr# " S S\5      r$ " S S\5      r%\%RL                  \%RN                  \%RP                  4r)Sr*Sr+Sr,Sr-Sr.S r/S!r0S!r1\Rd                  " S"S5      r3 " S# S$\45      r5 " S% S&\5      r6 " S' S(\5      r7 " S) S*\5      r8S+\S,\9S-\4S. jr: " S/ S05      r; " S1 S25      r< " S3 S45      r= " S5 S65      r>gs  sn f )7zY
wsproto/frame_protocol
~~~~~~~~~~~~~~~~~~~~~~

WebSocket frame protocol implementation.
    N)getincrementaldecoderIncrementalDecoder)IntEnum)	GeneratorList
NamedTupleOptionalTupleTYPE_CHECKINGUnion   )	Extension   c              3   *   >#    U H	  oT-  v   M     g 7fN ).0abs     V/var/www/highfloat_scraper/venv/lib/python3.13/site-packages/wsproto/frame_protocol.py	<genexpr>r      s     .:aE:s   c                   8    \ rS rSrS\SS4S jrS\S\4S jrSrg)	XorMaskerSimple   masking_keyreturnNc                     Xl         g r   _masking_key)selfr   s     r   __init__XorMaskerSimple.__init__   s    '    datac                    U(       a  [        U5      nS U R                   5       u  p4pVUS S S2   R                  U5      US S S2'   USS S2   R                  U5      USS S2'   USS S2   R                  U5      USS S2'   USS S2   R                  U5      USS S2'   [        U5      S-  nU R                  US  U R                  S U -   U l        [	        U5      $ U$ )Nc              3   2   #    U H  n[         U   v   M     g 7fr   )
_XOR_TABLE)r   ns     r   r   *XorMaskerSimple.process.<locals>.<genexpr>   s     C1BA*Q-1Bs      r         )	bytearrayr   	translatelenbytes)r    r$   
data_arrayr   r   cdkey_rotations           r   processXorMaskerSimple.process   s    "4JC1B1BCJA!(1o77:JssO)!$Q$/99!<Jqt!t)!$Q$/99!<Jqt!t)!$Q$/99!<Jqt!t t9q=L!!,-043D3D]l3SS  $$r#   r   )__name__
__module____qualname____firstlineno__r0   r!   r5   __static_attributes__r   r#   r   r   r      s(    (E (d (E e r#   r   c                   &    \ rS rSrS\S\4S jrSrg)XorMaskerNull-   r$   r   c                     U$ r   r   r    r$   s     r   r5   XorMaskerNull.process.   s    r#   r   N)r7   r8   r9   r:   r0   r5   r;   r   r#   r   r=   r=   -   s    E e r#   r=   ~      }   i  l       @             c                   >    \ rS rSrSrSrSrSrSrSr	Sr
S	\4S
 jrSrg)OpcodeH   z/
RFC 6455, Section 5.2 - Base Framing Protocol
r   r   r+      	   
   r   c                     [        U S-  5      $ )NrM   )boolr    s    r   	iscontrolOpcode.iscontrol_   s    D4K  r#   r   N)r7   r8   r9   r:   __doc__CONTINUATIONTEXTBINARYCLOSEPINGPONGrQ   rS   r;   r   r#   r   rK   rK   H   s=    
 L D F E D D!4 !r#   rK   c                   P    \ 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SrSrSrg)CloseReasonc   z0
RFC 6455, Section 7.4.1 - Defined Status Codes
  i  i  i  i  i  i  i  i  i  i  i  i  i  r   N)r7   r8   r9   r:   rU   NORMAL_CLOSURE
GOING_AWAYPROTOCOL_ERRORUNSUPPORTED_DATANO_STATUS_RCVDABNORMAL_CLOSUREINVALID_FRAME_PAYLOAD_DATAPOLICY_VIOLATIONMESSAGE_TOO_BIGMANDATORY_EXTINTERNAL_ERRORSERVICE_RESTARTTRY_AGAIN_LATERTLS_HANDSHAKE_FAILEDr;   r   r#   r   r]   r]   c   sn     N J N  N  "& 
 O M
 N O O  r#   r]   r_   i  i  i  i  i  z!Ic                   R   ^  \ rS rSr\R
                  4S\S\SS4U 4S jjjrSrU =r	$ )ParseFailed   msgcoder   Nc                 0   > [         TU ]  U5        X l        g r   )superr!   rr   )r    rq   rr   	__class__s      r   r!   ParseFailed.__init__   s     		r#   )rr   )
r7   r8   r9   r:   r]   rb   strr!   r;   __classcell__)ru   s   @r   ro   ro      s.    ,7,F,F)	 r#   ro   c                   4    \ rS rSr% \\S'   \\S'   \\S'   Srg)RsvBits   rsv1rsv2rsv3r   N)r7   r8   r9   r:   rQ   __annotations__r;   r   r#   r   rz   rz      s    
J
J
Jr#   rz   c                   N    \ rS rSr% \\S'   \\S'   \\S'   \\S'   \	\
   \S'   Srg)	Header   finrsvopcodepayload_lenr   r   N)r7   r8   r9   r:   rQ   r   rz   rK   intr	   r0   r;   r   r#   r   r   r      s!    	I	LN% r#   r   c                   T    \ rS rSr% \\S'   \\\\	\
\4   4   \S'   \\S'   \\S'   Srg)Frame   r   payloadframe_finishedmessage_finishedr   N)r7   r8   r9   r:   rK   r   r   r0   rw   r
   r   rQ   r;   r   r#   r   r   r      s-    N5#uS#X.//r#   r   r$   nbytesr   c                 p    [        U 5      U::  a  U $ U S U n U R                  SSS9R                  S5      n U $ )Nutf-8ignore)errors)r/   decodeencode)r$   r   s     r   _truncate_utf8r      sD    
4yF =D ;;wx;077@DKr#   c                       \ rS rSrSS\\   SS4S jjrS\SS4S jrS\S\4S	 jr	S\S\\   4S
 jr
SS jrSS jrS\4S jrSrg)Buffer   Ninitial_bytesr   c                 b    [        5       U l        SU l        U(       a  U R                  U5        g g Nr   )r-   buffer
bytes_usedfeed)r    r   s     r   r!   Buffer.__init__   s&    kIIm$ r#   	new_bytesc                 .    U =R                   U-  sl         g r   )r   )r    r   s     r   r   Buffer.feed  s    y r#   r   c                     U(       d
  [        5       $ U R                  U R                  U R                  U-    nU =R                  [        U5      -  sl        U$ r   )r-   r   r   r/   )r    r   r$   s      r   consume_at_mostBuffer.consume_at_most  sA    ;{{4??T__v-EF3t9$r#   c                 r    [        U R                  5      U R                  -
  U:  a  g U R                  U5      $ r   )r/   r   r   r   )r    r   s     r   consume_exactlyBuffer.consume_exactly  s0    t{{doo-6##F++r#   c                 D    U R                   S U R                  2	 SU l        g r   r   r   rR   s    r   commitBuffer.commit  s    KK)$//)*r#   c                     SU l         g r   )r   rR   s    r   rollbackBuffer.rollback  s	    r#   c                 ,    [        U R                  5      $ r   )r/   r   rR   s    r   __len__Buffer.__len__  s    4;;r#   r   r   r   N)r7   r8   r9   r:   r	   r0   r!   r   r   r   r   r   r   r   r;   r   r#   r   r   r      sl    %huo % %!e ! !c e ,c ,huo ,
   r#   r   c                   0    \ rS rSrSS jrS\S\4S jrSrg)	MessageDecoderi!  r   Nc                      S U l         S U l        g r   )r   decoderrR   s    r   r!   MessageDecoder.__init__"  s    (,59r#   framec                    UR                   R                  5       (       a   eU R                   c:  UR                   [        R                  L a  [	        S5      eUR                   U l         O5UR                   [        R                  La  [	        SUR                   -  5      eUR                   [        R
                  L a  [        S5      " 5       U l        UR                  =(       a    UR                  nU R                  c  UR                  nON[        UR                  [        [        45      (       d   e U R                  R                  UR                  U5      n['        U R                   X1R                  U5      nU(       a  S U l         S U l        U$ ! [         a(  n[	        [!        U5      ["        R$                  5      eS nAff = f)Nzunexpected CONTINUATIONzexpected CONTINUATION, got %rr   )r   rS   rK   rV   ro   rW   r   r   r   r   r   
isinstancer0   r-   r   UnicodeDecodeErrorrw   r]   rf   r   )r    r   finishedr$   excs        r   process_frameMessageDecoder.process_frame&  sT   <<))++++;;||v222!";<<,,DK\\!4!44=LMM<<6;;&09;DL''BE,B,B<<==DemmeY-?@@@@T||**5==(C dkk4)=)=xHDKDL & T!#c(K,R,RSSTs   1&F 
G#F<<G)r   r   r   )r7   r8   r9   r:   r!   r   r   r;   r   r#   r   r   r   !  s    :5 U r#   r   c                       \ rS rSr SS\S\\S      SS4S jjrS\SS4S	 jr	S\\
   4S
 jrS\4S jrS\S\S\\   4S jrS\S\S\SS4S jrSrg)FrameDecoderiG  Nclient
extensionsr   r   c                     Xl         U=(       d    / U l        [        5       U l        S U l        S U l        S U l        SU l        SU l        g r   )	r   r   r   r   headereffective_opcodemaskerpayload_requiredpayload_consumed)r    r   r   s      r   r!   FrameDecoder.__init__H  sD     $*h(,26CG ! !r#   r$   c                 :    U R                   R                  U5        g r   )r   r   r@   s     r   receive_bytesFrameDecoder.receive_bytesV  s    r#   c                    U R                   (       d  U R                  5       (       d  g U R                   c   eU R                  c   eU R                  c   e[	        U R
                  5      U R                  :  a  g U R                   R                  U R                  -
  nU R
                  R                  U5      nU(       d  U R                   R                  S:  a  g U R
                  R                  5         U =R                  [	        U5      -  sl        U R                  U R                   R                  :H  nU R                  R                  U5      nU R                   H7  nUR                  X5      n[        U[        5      (       a  [!        SU5      eUnM9     U(       ap  [#        5       nU R                   HR  nUR%                  X R                   R&                  5      n[        U[        5      (       a  [!        SU5      eUc  MN  Xg-  nMT     X&-  n[)        U R                  X#U R                   R&                  5      nU(       a  S U l         S U l        S U l        U$ [*        R,                  U l        U$ )Nr   error in extension)r   parse_headerr   r   r/   r   r   r   r   r   r   r5   r   frame_inbound_payload_datar   r]   ro   r-   frame_inbound_completer   r   rK   rV   )	r    payload_remainingr   r   	extensionpayload_finalresultr   s	            r   process_bufferFrameDecoder.process_bufferY  s   {{$$&&{{&&&{{&&&$$000t{{d333 KK33d6K6KK++--.?@4;;22Q6W-((DKK,C,CC++%%g.I ;;DJH(K00!"6AAG	 ) KE!__	"99$Pfk22%&:FCC%OE - Gd++WPDK$(D!DK  %+$7$7D!r#   c                    U R                   R                  S5      nUc  U R                   R                  5         g[        US   [        -  5      n[        [        US   [        -  5      [        US   [        -  5      [        US   [        -  5      5      nUS   [        -  n [        U5      nUR                  5       (       a  U(       d  [        S5      e[        US   [        -  5      nUS   [        -  nU R!                  XF5      nUc  U R                   R                  5         gU R#                  XCU5        U(       a  U R$                  (       a  [        S5      eU(       d  U R$                  (       d  [        S	5      eU(       aJ  U R                   R                  S
5      nUc  U R                   R                  5         g['        U5      U l        O[+        5       U l        U R                   R-                  5         [/        X#XGS 5      U l        U R0                  R2                  U l        U R0                  R2                  R                  5       (       a  Xpl        OSU l        SU l        g! [         a    [        SUS 35      ef = f)Nr+   Fr   zInvalid opcode z#xz)Invalid attempt to fragment control framer   z'client received unexpected masked framez)server received unexpected unmasked framer*   T)r   r   r   rQ   FIN_MASKrz   	RSV1_MASK	RSV2_MASK	RSV3_MASKOPCODE_MASKrK   
ValueErrorro   rS   	MASK_MASKPAYLOAD_LEN_MASKparse_extended_payload_lengthextension_processingr   r   r   r=   r   r   r   r   r   r   r   )	r    r$   r   r   r   has_maskpayload_len_shortr   r   s	            r   r   FrameDecoder.parse_header  s   {{**1-<KK  "47X%&a9$%a9$%a9$%

 a;&	=F^F cIJJQ)+, G&6688SKK  "!!&{;GHHIJJ++55a8K"$$&)+6DK'/DKSvDA $ 2 2;;''))$/!$%D! !I  	=r{;<<	=s   "I" "I<r   r   c                    UR                  5       (       a  U[        :  a  [        S5      eU[        :X  aP  U R                  R                  S5      nUc  g [        R                  " SU5      u  nU[        ::  a  [        S5      e U$ U[        :X  ab  U R                  R                  S5      nUc  g [        R                  " SU5      u  nU[        ::  a  [        S5      eUS-	  (       a  [        S	5      eU$ )
Nz$Control frame with payload len > 125r+   !Hz6Payload length used 2 bytes when 1 would have sufficedrM   !Qz6Payload length used 8 bytes when 2 would have sufficed?   z'8-byte payload length with non-zero MSB)
rS   MAX_PAYLOAD_NORMALro   PAYLOAD_LENGTH_TWO_BYTEr   r   structunpackPAYLOAD_LENGTH_EIGHT_BYTEMAX_PAYLOAD_TWO_BYTE)r    r   r   r$   s       r   r   *FrameDecoder.parse_extended_payload_length  s     +0B"BDEE11;;..q1D|#]]46N[00!L  1$  55;;..q1D|#]]46N[22!L  b  ""KLLr#   r   c                 8   / SQnU R                    HW  nUR                  XX#5      n[        U[        5      (       a  [	        SU5      e[        U5       H  u  pxU(       d  M  SXG'   M     MY     [        XB5       H   u  pU
(       d  M  U	(       a  M  [	        S5      e   g )N)FFFr   TzReserved bit set unexpectedly)r   frame_inbound_headerr   r]   ro   	enumeratezip)r    r   r   r   rsv_usedr   r   bitusedexpectedfounds              r   r   !FrameDecoder.extension_processing  s     )I33D#SF&+..!"6??&v.	4$(HM /	 )  #81OHuXX!"ABB  2r#   )r   r   r   r   r   r   r   r   r   )r7   r8   r9   r:   rQ   r	   r   r!   r0   r   r   r   r   rK   r   r   rz   r   r;   r   r#   r   r   r   G  s    FJ""(0k1B(C"	"% D 0 0d3d 3j+.	#<CC#*C9<C	Cr#   r   c            	       B   \ rS rSrS\S\S   SS4S jrS\S\4S	 jrS\	\
\   SS4   4S
 jrS\SS4S jrS\	\SS4   4S jrSS\
\   S\
\   S\4S jjrSS\S\4S jjrSS\S\4S jjr SS\\\\4   S\S\4S jjrS\S\S\S\4S jr SS\S\S\S\4S jjrSrg)FrameProtocoli  r   r   r   r   Nc                    Xl         U Vs/ sH  o3R                  5       (       d  M  UPM     snU l        [        U R                   U R                  5      U l        [        5       U l        U R                  5       U l        S U l	        g s  snf r   )
r   enabledr   r   _frame_decoderr   _message_decoder_parse_more_gen_parse_more_outbound_opcode)r    r   r   exts       r   r!   FrameProtocol.__init__  sf    *4F*33*F +4;;H . 0//126 Gs
   BBr   c                    UR                   n[        U[        [        45      (       d   eU(       d  [        R
                  S4nO[        U5      S:X  a  [        S5      e[        R                  " SUS S 5      u  nU[        :  d
  U[        :  a  [        S5      e [	        U5      nU[        ;   a  [        S5      e[        U[        5      (       d  U[        ::  a  [        S5      e USS  R                  S	5      nX44n['        UR(                  X!R*                  UR,                  5      $ ! [         a     Nf = f! [          a+  n[        S
[#        U5      -   [        R$                  5      eS nAff = f)N r   zCLOSE with 1 byte payloadr   r+   zCLOSE with invalid codez#remote CLOSE with local-only reasonz CLOSE with unknown reserved coder   zError decoding CLOSE reason: )r   r   r0   r-   r]   rd   r/   ro   r   r   MIN_CLOSE_REASONMAX_CLOSE_REASONr   LOCAL_ONLY_CLOSE_REASONSMAX_PROTOCOL_CLOSE_REASONr   r   rw   rf   r   r   r   r   )r    r   r$   rr   reasonr   s         r   _process_closeFrameProtocol._process_close  sS   }}$	 23333  ..3DY!^9::mmD$r(3GT&&$1A*A!";<<"4( //!"GHHdK00T=V5V!"DEEab1 >DU\\4)=)=u?U?UVV   & !3c#h>:: s*   D' %D7 '
D43D47
E,&E''E,c              #     #    U R                    Vs/ sH  oR                  5       (       d  M  UPM     snU l         SnU(       d  U R                  R                  5       nUbl  UR                  R                  5       (       d  U R                  R                  U5      nO1UR                  [        R                  :X  a  U R                  U5      nSnUv   U(       d  M  g g s  snf 7f)NFT)r   r  r  r   r   rS   r  r   rK   rY   r  )r    r  closedr   s       r   r  FrameProtocol._parse_more_gen  s      +///K/3[[]3/K''668E ||--// 11??FE\\V\\1 //6E!FK & Ls   C CCB%C C r$   c                 :    U R                   R                  U5        g r   )r  r   r@   s     r   r   FrameProtocol.receive_bytes0  s    ))$/r#   c              #   D   #    U R                    H  nUc    g Uv   M     g 7fr   )r  )r    events     r   received_framesFrameProtocol.received_frames3  s"     %%E}	 &s    rr   r  c                 z   [        5       nU[        R                  L a  S nUc  U(       a  [        S5      eU[        ;   a  [        R
                  nUbK  U[        [        R                  " SU5      5      -  nUb%  U[        UR                  S5      [        S-
  5      -  nU R                  [        R                  U5      $ )Nz&cannot specify a reason without a coder   r   r+   )r-   r]   rd   	TypeErrorr  r`   r   packr   r   r   _serialize_framerK   rY   )r    rr   r  r   s       r   closeFrameProtocol.close:  s    +;---D<FDEE++--DyT4!899G!>MM'*,>,B  $$V\\7;;r#   r   c                 B    U R                  [        R                  U5      $ r   )r  rK   rZ   r    r   s     r   pingFrameProtocol.pingK      $$V[['::r#   c                 B    U R                  [        R                  U5      $ r   )r  rK   r[   r"  s     r   pongFrameProtocol.pongN  r%  r#   r   c                    [        U[        [        [        45      (       a  [        R
                  nOB[        U[        5      (       a"  [        R                  nUR                  S5      nO[        S5      eU R                  c  X0l
        O*U R                  ULa  [        S5      e[        R                  nU(       a  S U l
        U R                  X1U5      $ )Nr   zMust provide bytes or textz!Data type mismatch inside message)r   r0   r-   
memoryviewrK   rX   rw   rW   r   r   r  r  rV   r  )r    r   r   r   s       r   	send_dataFrameProtocol.send_dataQ  s     gy*=>>]]F%%[[FnnW-G9::  ($*!""&0?@@((F$(D!$$Vc::r#   r   r   c                     [        U5      S-  n[        UR                  5      S-  [        UR                  5      S-  -   [        UR                  5      S-  -   n[        U5      nXE-  U-  $ )N         r*   )r   r|   r}   r~   )r    r   r   r   fin_bitsrsv_bitsopcode_bitss          r   _make_fin_rsv_opcode"FrameProtocol._make_fin_rsv_opcodeh  s]    s8q=MQ&3sxx=A+=>#chh-STBTU&k"[00r#   c                    [        SSS5      n[        U R                  5       H  nUR                  XXBU5      u  pBM     U R	                  X4U5      n[        U5      nSnU[        ::  a  Un	S n
OU[        ::  a	  [        n	Un
O
[        n	Un
SnU R                  (       a  U	S-  n	[        Xi/5      nU
bn  UR                  5       (       a  [        S5      eU(       a$  U[        [        R                  " SU
5      5      -  nO#U[        [        R                  " SU
5      5      -  nU R                  (       a7  [         R"                  " S5      n[%        U5      nX-   UR'                  U5      -   $ X-   $ )NFTrE   z"payload too long for control framer   r   r*   )rz   reversedr   frame_outboundr4  r/   r   r   r   r   r   r-   rS   r   r   r  osurandomr   r5   )r    r   r   r   r   r   fin_rsv_opcodepayload_lengthquad_payloadfirst_payloadsecond_payloadr   r   r   s                 r   r  FrameProtocol._serialize_frameo  sK    eUE*!$//2I$33D#PSTLC 3 223VDW//*M!N333M+N5M+NL;;V#MN:;%!! !EFF)FKKn$EFF)FKKn$EFF;; **Q-K$[1F'&..*AAAr#   )r  r  r  r  r   r   )NN)r#   )r#   T)r7   r8   r9   r:   rQ   r   r!   r   r  r   r	   r  r0   r   r  r   rw   r  r#  r'  r   r-   r+  rz   rK   r4  r  r;   r   r#   r   r   r     sJ   	7t 	7k1B 	7t 	7WE We WB8E?D$+F!G *0% 0D 05$+<!= <(3- < <QV <";E ;E ;;E ;E ; HL;UIs23;@D;	;.1 17 1F 1s 1 AE2 2 ',2 9=2 	2  2 r#   r   )?rU   r9  r   codecsr   r   enumr   typingr   r   r   r	   r
   r   r   r   r   ranger0   r'   r   r=   r   r   r   r   MAX_PAYLOAD_EIGHT_BYTEMAX_FRAME_PAYLOADr   r   r   r   r   r   r   rK   r]   rd   re   rm   r  r  MIN_PROTOCOL_CLOSE_REASONr  MIN_LIBRARY_CLOSE_REASONMAX_LIBRARY_CLOSE_REASONMIN_PRIVATE_CLOSE_REASONMAX_PRIVATE_CLOSE_REASONr  r  	NULL_MASK	Exceptionro   rz   r   r   r   r   r   r   r   r   )r   s   pr   <module>rN     s   
  <  U U U% 9>c
C
1e.5:..
C
 0       " *  	  			!W !6T ' T r   $$             KKa 	) j !Z !J     !  ! H# #LdC dCNs  s y Ds   !E