§
    xÅj*  ã                  ó¾   — d dl mZ d dlZd dl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 ddlmZmZmZmZ ddlmZ d	gZ ej        d
¦  «        Z G d„ d	¦  «        ZdS )é    )ÚannotationsN)ÚAsyncIterator)ÚAnyÚCallableÚLiteralÚoverloadé   )ÚConcurrencyError)ÚBINARYÚCONTÚTEXTÚFrame)ÚDataÚ	Assemblerzutf-8c                  óð   — e Zd ZdZddd„ d„ fd&d„Zed'd„¦   «         Zed(d„¦   «         Zed)d*d„¦   «         Zd)d*d„Zed+d„¦   «         Zed,d„¦   «         Zed)d-d„¦   «         Zd)d-d„Zd.d"„Zd/d#„Z	d/d$„Z
d/d%„ZdS )0r   aË  
    Assemble messages from frames.

    :class:`Assembler` expects only data frames. The stream of frames must
    respect the protocol; if it doesn't, the behavior is undefined.

    Args:
        pause: Called when the buffer of frames goes above the high water mark;
            should pause reading from the network.
        resume: Called when the buffer of frames goes below the low water mark;
            should resume reading from the network.

    Nc                 ó   — d S ©N© r   ó    úIC:\Projects\Historical\venv\Lib\site-packages\websockets/trio/messages.pyú<lambda>zAssembler.<lambda>'   s   € ¨4€ r   c                 ó   — d S r   r   r   r   r   r   zAssembler.<lambda>(   s   € ¨D€ r   Úhighú
int | NoneÚlowÚpauseúCallable[[], Any]ÚresumeÚreturnÚNonec                óH  — |  |  t          j        t          j        ¦  «        \  | _        | _        |�|€|dz  }|€|�|dz  }|�,|�*|dk     rt          d¦  «        ‚||k     rt          d¦  «        ‚||c| _        | _        || _	        || _
        d| _        d| _        d| _        d S )Né   r   z%low must be positive or equal to zeroz)high must be greater than or equal to lowF)ÚtrioÚopen_memory_channelÚmathÚinfÚsend_framesÚrecv_framesÚ
ValueErrorr   r   r   r   ÚpausedÚget_in_progressÚclosed)Úselfr   r   r   r   s        r   Ú__init__zAssembler.__init__#   sÊ   € ð 	Ð7ØÐ:Ý-1Ô-EÅdÄhÑ-OÔ-OÑ*ˆÔ˜$Ô*ð Ð  Ø˜!‘)ˆCØˆ<˜C˜OØ˜‘7ˆDØÐ  Ø�QŠwˆwÝ Ð!HÑIÔIÐIØ�cŠzˆzÝ Ð!LÑMÔMÐMØ" CÐˆŒ	�4”8ØˆŒ
ØˆŒØˆŒð  %ˆÔð ˆŒˆˆr   ÚdecodeúLiteral[True]Ústrc              ƒ  ó
   K  — d S r   r   ©r-   r/   s     r   ÚgetzAssembler.getG   s   è è € Ø7:°sr   úLiteral[False]Úbytesc              ƒ  ó
   K  — d S r   r   r3   s     r   r4   zAssembler.getJ   s   è è € Ø:=¸#r   úbool | Noner   c              ƒ  ó
   K  — d S r   r   r3   s     r   r4   zAssembler.getM   s   è è € Ø=@¸Sr   c              ƒ  ó´  K  — | j         rt          d¦  «        ‚d| _         	 	 | j                             ¦   «         ƒ d{V —†}n"# t          j        $ r t          d¦  «        ‚w xY w|                      ¦   «          |j        t          u s|j        t          u sJ ‚|€|j        t          u }|g}|j        sß	 | j                             ¦   «         ƒ d{V —†}n~# t          j        $ rO | j        j        }|j        r
J d¦   «         ‚|j        r
J d¦   «         ‚|D ]}| j                             |¦  «         Œ‚ t          j        $ r t          d¦  «        ‚w xY w|                      ¦   «          |j        t$          u sJ ‚|                     |¦  «         |j        ¯ßd| _         n# d| _         w xY wd                     d	„ |D ¦   «         ¦  «        }|r|                     ¦   «         S |S )
a0  
        Read the next message.

        :meth:`get` returns a single :class:`str` or :class:`bytes`.

        If the message is fragmented, :meth:`get` waits until the last frame is
        received, then it reassembles the message and returns it. To receive
        messages frame by frame, use :meth:`get_iter` instead.

        Args:
            decode: :obj:`False` disables UTF-8 decoding of text frames and
                returns :class:`bytes`. :obj:`True` forces UTF-8 decoding of
                binary frames and returns :class:`str`.

        Raises:
            EOFError: If the stream of frames has ended.
            UnicodeDecodeError: If a text frame contains invalid UTF-8.
            ConcurrencyError: If two coroutines run :meth:`get` or
                :meth:`get_iter` concurrently.

        ú&get() or get_iter() is already runningTNústream of frames endedzno task should receivezqueue should be emptyFr   c              3  ó$   K  — | ]}|j         V — Œd S r   )Údata)Ú.0Úframes     r   ú	<genexpr>z Assembler.get.<locals>.<genexpr>‘   s$   è è € Ð7Ð7 u˜œ
Ð7Ð7Ð7Ð7Ð7Ð7r   )r+   r
   r(   Úreceiver#   ÚEndOfChannelÚEOFErrorÚmaybe_resumeÚopcoder   r   ÚfinÚ	Cancelledr'   Ú_stateÚreceive_tasksr>   Úsend_nowaitr   ÚappendÚjoinr/   )r-   r/   r@   ÚframesÚstater>   s         r   r4   zAssembler.getP   sU  è è € ð, Ôð 	MÝ"Ð#KÑLÔLÐLØ#ˆÔð
!	)ð9Ø"Ô.×6Ò6Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8��øÝÔ$ð 9ð 9ð 9ÝÐ7Ñ8Ô8Ð8ð9øøøà×ÒÑÔÐØ”<¥4Ð'Ð'¨5¬<½6Ð+AÐ+AÐ+AÐAØˆ~Øœ­Ð-�Ø�WˆFð ”ið %ð=Ø"&Ô"2×":Ò":Ñ"<Ô"<Ð<Ð<Ð<Ð<Ð<Ð<�E�EøÝ”~ð 	ð 	ð 	ð !Ô,Ô3�EØ$Ô2ÐLÐLÐ4LÑLÔLÐ2Ø$œzÐBÐBÐ+BÑBÔB˜>Ø!'ð <ð <˜ØÔ(×4Ò4°UÑ;Ô;Ð;Ð;ØÝÔ(ð =ð =ð =Ý"Ð#;Ñ<Ô<Ð<ð=øøøà×!Ò!Ñ#Ô#Ð#Ø”|¥tÐ+Ð+Ð+Ð+Ø—’˜eÑ$Ô$Ð$ð# ”ið %ð( $)ˆDÔ Ð ø 5ˆDÔ Ð(Ð(Ð(Ð(ð �xŠxÐ7Ð7°Ð7Ñ7Ô7Ñ7Ô7ˆØð 	Ø—;’;‘=”=Ð àˆKs8   ¢A ÁF ÁA!Á!AF Â1C ÃF ÃA;EÅAF Æ	F úAsyncIterator[str]c                ó   — d S r   r   r3   s     r   Úget_iterzAssembler.get_iter—   s   € ØEHÀSr   úAsyncIterator[bytes]c                ó   — d S r   r   r3   s     r   rR   zAssembler.get_iterš   s   € ØHKÈr   úAsyncIterator[Data]c                ó   — d S r   r   r3   s     r   rR   zAssembler.get_iter�   s   € ØKNÈ3r   c               ó‚  K  — | j         rt          d¦  «        ‚d| _         	 | j                             ¦   «         ƒ d{V —†}n8# t          j        $ r	 d| _         ‚ t          j        $ r t          d¦  «        ‚w xY w|                      ¦   «          |j	        t          u s|j	        t          u sJ ‚|€|j	        t          u }|r2t          ¦   «         }|                     |j        |j        ¦  «        W V — nt!          |j        ¦  «        W V — |j        s«	 | j                             ¦   «         ƒ d{V —†}n"# t          j        $ r t          d¦  «        ‚w xY w|                      ¦   «          |j	        t"          u sJ ‚|r$|                     |j        |j        ¦  «        W V — nt!          |j        ¦  «        W V — |j        ¯«d| _         dS )a¸  
        Stream the next message.

        Iterating the return value of :meth:`get_iter` asynchronously yields a
        :class:`str` or :class:`bytes` for each frame in the message.

        The iterator must be fully consumed before calling :meth:`get_iter` or
        :meth:`get` again. Else, :exc:`ConcurrencyError` is raised.

        This method only makes sense for fragmented messages. If messages aren't
        fragmented, use :meth:`get` instead.

        Args:
            decode: :obj:`False` disables UTF-8 decoding of text frames and
                returns :class:`bytes`. :obj:`True` forces UTF-8 decoding of
                binary frames and returns :class:`str`.

        Raises:
            EOFError: If the stream of frames has ended.
            UnicodeDecodeError: If a text frame contains invalid UTF-8.
            ConcurrencyError: If two coroutines run :meth:`get` or
                :meth:`get_iter` concurrently.

        r;   TNFr<   )r+   r
   r(   rB   r#   rH   rC   rD   rE   rF   r   r   ÚUTF8Decoderr/   r>   rG   r6   r   )r-   r/   r@   Údecoders       r   rR   zAssembler.get_iter    s$  è è € ð2 Ôð 	MÝ"Ð#KÑLÔLÐLØ#ˆÔð	5ØÔ*×2Ò2Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4ˆEˆEøÝŒ~ð 	ð 	ð 	Ø#(ˆDÔ ØÝÔ ð 	5ð 	5ð 	5ÝÐ3Ñ4Ô4Ð4ð	5øøøà×ÒÑÔÐØŒ|�tÐ#Ð# u¤|µvÐ'=Ð'=Ð'=Ð=Øˆ>Ø”\¥TÐ)ˆFØð 	$Ý!‘m”mˆGØ—.’. ¤¨U¬YÑ7Ô7Ð7Ð7Ð7Ð7Ð7õ ˜œ
Ñ#Ô#Ð#Ð#Ð#Ð#ð ”)ð 	(ð
9Ø"Ô.×6Ò6Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8��øÝÔ$ð 9ð 9ð 9ÝÐ7Ñ8Ô8Ð8ð9øøøà×ÒÑÔÐØ”<¥4Ð'Ð'Ð'Ð'Øð (Ø—n’n U¤Z°´Ñ;Ô;Ð;Ð;Ð;Ð;Ð;õ ˜EœJÑ'Ô'Ð'Ð'Ð'Ð'ð ”)ð 	(ð"  %ˆÔÐÐs   ¡A Á5A6ÄD. Ä.Er@   r   c                óŽ   — | j         rt          d¦  «        ‚| j                             |¦  «         |                      ¦   «          dS )z
        Add ``frame`` to the next message.

        Raises:
            EOFError: If the stream of frames has ended.

        r<   N)r,   rD   r'   rK   Úmaybe_pause)r-   r@   s     r   ÚputzAssembler.putê   sL   € ð Œ;ð 	5ÝÐ3Ñ4Ô4Ð4àÔ×$Ò$ UÑ+Ô+Ð+Ø×ÒÑÔÐÐÐr   c                ó²   — | j         €dS t          | j        j        j        ¦  «        | j         k    r$| j        sd| _        |                      ¦   «          dS dS dS )z7Pause the writer if queue is above the high water mark.NT)r   Úlenr'   rI   r>   r*   r   ©r-   s    r   r[   zAssembler.maybe_pauseø   s^   € ð Œ9ÐØˆFõ ˆtÔÔ&Ô+Ñ,Ô,¨t¬yÒ8Ð8ÀÄÐ8ØˆDŒKØ�JŠJ‰LŒLˆLˆLˆLð 9Ð8Ð8Ð8r   c                ó²   — | j         €dS t          | j        j        j        ¦  «        | j         k    r$| j        rd| _        |                      ¦   «          dS dS dS )z7Resume the writer if queue is below the low water mark.NF)r   r^   r'   rI   r>   r*   r   r_   s    r   rE   zAssembler.maybe_resume  s^   € ð Œ8ÐØˆFõ ˆtÔÔ&Ô+Ñ,Ô,°´Ò8Ð8¸T¼[Ð8ØˆDŒKØ�KŠK‰MŒMˆMˆMˆMð 9Ð8Ð8Ð8r   c                óx   — | j         rdS d| _         | j                             ¦   «          d„ | _        d„ | _        dS )z½
        End the stream of frames.

        Calling :meth:`close` concurrently with :meth:`get`, :meth:`get_iter`,
        or :meth:`put` is safe. They will raise :exc:`EOFError`.

        NTc                 ó   — d S r   r   r   r   r   r   z!Assembler.close.<locals>.<lambda>"  s   € ˜T€ r   c                 ó   — d S r   r   r   r   r   r   z!Assembler.close.<locals>.<lambda>#  s   € ˜d€ r   )r,   r'   Úcloser   r   r_   s    r   rd   zAssembler.close  sI   € ð Œ;ð 	ØˆFàˆŒð 	Ô×ÒÑ Ô Ð ð "�\ˆŒ
Ø"�lˆŒˆˆr   )
r   r   r   r   r   r   r   r   r   r    )r/   r0   r   r1   )r/   r5   r   r6   r   )r/   r8   r   r   )r/   r0   r   rP   )r/   r5   r   rS   )r/   r8   r   rU   )r@   r   r   r    )r   r    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r.   r   r4   rR   r\   r[   rE   rd   r   r   r   r   r      sf  € € € € € ðð ð   ØØ#/ <Ø$0 Lð"ð "ð "ð "ð "ðH Ø:Ð:Ð:ñ „XØ:àØ=Ð=Ð=ñ „XØ=àØ@Ð@Ð@Ð@ñ „XØ@ðEð Eð Eð Eð EðN ØHÐHÐHñ „XØHàØKÐKÐKñ „XØKàØNÐNÐNÐNñ „XØNðH%ð H%ð H%ð H%ð H%ðTð ð ð ð
ð 
ð 
ð 
ð
ð 
ð 
ð 
ð#ð #ð #ð #ð #ð #r   )Ú
__future__r   Úcodecsr%   Úcollections.abcr   Útypingr   r   r   r   r#   Ú
exceptionsr
   rN   r   r   r   r   r   Ú__all__ÚgetincrementaldecoderrX   r   r   r   r   ú<module>rp      s  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø )Ð )Ð )Ð )Ð )Ð )Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à €€€à )Ð )Ð )Ð )Ð )Ð )Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ð Ð ð ˆ-€à*ˆfÔ*¨7Ñ3Ô3€ðO#ð O#ð O#ð O#ð O#ñ O#ô O#ð O#ð O#ð O#r   