
    -eK                        U d Z ddlmZ ddlZ ej        e          Zddl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 e	rddlmZ dd	lmZ d
Zeeef         Zded<    G d d          ZdS )zn Assemble WebSocket wire message fragments into complete Bokeh Server
message objects that can be processed.

    )annotationsN)TYPE_CHECKINGAnyCallableUnioncast   )ValidationError)BufferHeaderMessage)	TypeAlias)Protocol)Receiverr   Fragmentc                      e Zd ZU dZded<   ded<   ded<   ded	<   ded
<   ddZddZd dZd dZd dZ	d dZ
d dZd!dZd"dZd#dZdS )$r   a   Receive wire message fragments and assemble complete Bokeh server
    message objects.

    On ``MessageError`` or ``ValidationError``, the receiver will reset its
    state and attempt to consume a new message.

    The *fragment* received can be either bytes or unicode, depending on
    the transport's semantics (WebSocket allows both).

    .. code-block:: python

        [
            # these are required
            b'{header}',        # serialized header dict
            b'{metadata}',      # serialized metadata dict
            b'{content},        # serialized content dict

            # these are optional, and come in pairs; header contains num_buffers
            b'{buf_header}',    # serialized buffer header dict
            b'array'            # raw buffer payload data
            ...
        ]

    The ``header`` fragment will have the form:

    .. code-block:: python

        header = {
            # these are required
            'msgid'       : <str> # a unique id for the message
            'msgtype'     : <str> # a message type, e.g. 'ACK', 'PATCH-DOC', etc

            # these are optional
            'num_buffers' : <int> # the number of additional buffers, if any
        }

    The ``metadata`` fragment may contain any arbitrary information. It is not
    processed by Bokeh for any purpose, but may be useful for external
    monitoring or instrumentation tools.

    The ``content`` fragment is defined by the specific message type.

    zCallable[[Fragment], None]_current_consumerzlist[Fragment]
_fragmentsMessage[Any] | None_messagezBufferHeader | None_buf_header_partialprotocolr   returnNonec                V    || _         | j        | _        d| _        d| _        d| _        dS )z Configure a Receiver with a specific Bokeh protocol.

        Args:
            protocol (Protocol) :
                A Bokeh protocol object to use to assemble collected message
                fragments.
        N)	_protocol_HEADERr   r   r   r   )selfr   s     7lib/python3.11/site-packages/bokeh/protocol/receiver.py__init__zReceiver.__init__p   s1     "!%    fragmentr   c                >   K   |                      |           | j        S )a    Consume individual protocol message fragments.

        Args:
            fragment (``JSON``) :
                A message fragment to assemble. When a complete message is
                assembled, the receiver state will reset to begin consuming a
                new message.

        )r   r   r   r"   s     r   consumezReceiver.consume~   s$       	x(((}r!   c                p    d | _         d | _        |                     |          g| _        | j        | _        d S N)r   r   _assume_textr   	_METADATAr   r$   s     r   r   zReceiver._HEADER   s8    ,,X667!%r!   c                |    |                      |          }| j                            |           | j        | _        d S r'   )r(   r   append_CONTENTr   )r   r"   metadatas      r   r)   zReceiver._METADATA   s;    $$X..x(((!%r!   c                                          |          } j                            |            fd j        d d         D             \  }}} j                            |||           _                                          d S )Nc              3  B   K   | ]}                     |          V  d S r'   )r(   ).0xr   s     r   	<genexpr>z$Receiver._CONTENT.<locals>.<genexpr>   s1      3f3fQD4E4Ea4H4H3f3f3f3f3f3fr!      )r(   r   r+   r   assembler   _check_complete)r   r"   contentheader_jsonmetadata_jsoncontent_jsons   `     r   r,   zReceiver._CONTENT   s    ##H--w'''3f3f3f3fRVRabdcdbdRe3f3f3f0]L//]LYYr!   c                    t          j        |                     |                    }t          |          dhk    rt	          d|          || _        | j        | _        d S )NidzMalformed buffer header )jsonloadsr(   setr
   r   _BUFFER_PAYLOADr   )r   r"   headers      r   _BUFFER_HEADERzReceiver._BUFFER_HEADER   sb    D--h7788v;;D(""!"GV"G"GHHH!!%!5r!   c                ,   |                      |          }| j        t          d          t          | j        d                   }t	          t
          t                   | j                                      ||           | 	                                 d S )Nz=Consuming a buffer payload, but current buffer header is Noner;   )r;   )
_assume_binaryr   r
   r   r   r   r   r   assemble_bufferr5   )r   r"   payloadr@   s       r   r?   zReceiver._BUFFER_PAYLOAD   s    %%h//#!"abbb!1$!7888WS\4=))99&'JJJr!   c                x    | j         r&| j         j        r| j         | _        | j        | _        d S | j        | _        d S r'   )r   completer   r   r   rA   )r   s    r   r5   zReceiver._check_complete   sB    = 	9T]3 	9 MDM%)\D"""%)%8D"""r!   strc                h    t          |t                    st          d| j        j                   |S )Nz8expected text fragment but received binary fragment for )
isinstancerH   r
   r   __name__r$   s     r   r(   zReceiver._assume_text   s8    (C(( 	@!"~]a]s]|"~"~r!   bytesc                h    t          |t                    st          d| j        j                   |S )Nz8expected binary fragment but received text fragment for )rJ   rL   r
   r   rK   r$   s     r   rC   zReceiver._assume_binary   s8    (E** 	@!"~]a]s]|"~"~r!   N)r   r   r   r   )r"   r   r   r   )r"   r   r   r   )r   r   )r"   r   r   rH   )r"   r   r   rL   )rK   
__module____qualname____doc____annotations__r    r%   r   r)   r,   rA   r?   r5   r(   rC    r!   r   r   r   =   s'        * *X 2111!!!!$$$$!!!!          0 0 0 0/ / / /
   6 6 6 6   9 9 9 9   
     r!   r   )rP   
__future__r   logging	getLoggerrK   logr<   typingr   r   r   r   r   
exceptionsr
   messager   r   typing_extensionsr    r   __all__rH   rL   r   rQ   r   rR   r!   r   <module>r]      sK     # " " " " " g!!               ( ' ' ' ' ' * * * * * * * * ++++++ CJ' ' ' ' 'B B B B B B B B B Br!   