B
    @\                 @   sf   d Z ddlmZmZmZmZ ddlZeeZ	ddl
Z
ddlmZ ddlmZ dZG dd	 d	eZdS )
zn Assemble WebSocket wire message fragments into complete Bokeh Server
message objects that can be processed.

    )absolute_importdivisionprint_functionunicode_literalsN)gen   )ValidationError)Receiverc               @   sf   e Zd ZdZdd Zej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.

    c             C   s   || _ | j| _d| _d| _dS )z Configure a Receiver with a specific Bokeh protocol version.

        Args:
            protocol (Protocol) :
                A Bokeh protocol object to use to assemble collected message
                fragments.
        N)	_protocol_HEADER_current_consumer_message_buf_header)selfZprotocol r   6lib/python3.7/site-packages/bokeh/protocol/receiver.py__init__^   s    zReceiver.__init__c             C   s   |  | t| jd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.

        N)r   r   ZReturnr   )r   fragmentr   r   r   consumek   s    
zReceiver.consumec             C   s*   |  | d | _d | _|g| _| j| _d S )N)_assume_textr   _partial
_fragments	_METADATAr   )r   r   r   r   r   r   y   s
    
zReceiver._HEADERc             C   s"   |  | | j| | j| _d S )N)r   r   append_CONTENTr   )r   r   r   r   r   r      s    
zReceiver._METADATAc             C   sH   |  | | j| | jd d \}}}| j|||| _|   d S )N   )r   r   r   r
   Zassembler   _check_complete)r   r   Zheader_jsonZmetadata_jsonZcontent_jsonr   r   r   r      s
    
zReceiver._CONTENTc             C   s   |  | || _| j| _d S )N)r   r   _BUFFER_PAYLOADr   )r   r   r   r   r   _BUFFER_HEADER   s    
zReceiver._BUFFER_HEADERc             C   s&   |  | | j| j| |   d S )N)_assume_binaryr   Zassemble_bufferr   r   )r   r   r   r   r   r      s    
zReceiver._BUFFER_PAYLOADc             C   s&   | j jr| j | _| j| _n| j| _d S )N)r   Zcompleter   r   r   r   )r   r   r   r   r      s    
zReceiver._check_completec             C   s    t |tjstd| jj d S )Nz:expected text fragment but received binary fragment for %s)
isinstancesixZ	text_typer   r   __name__)r   r   r   r   r   r      s    zReceiver._assume_textc             C   s    t |tjstd| jj d S )Nz:expected binary fragment but received text fragment for %s)r    r!   Zbinary_typer   r   r"   )r   r   r   r   r   r      s    zReceiver._assume_binaryN)r"   
__module____qualname____doc__r   r   	coroutiner   r   r   r   r   r   r   r   r   r   r   r   r   r	   1   s   +
r	   )r%   Z
__future__r   r   r   r   ZloggingZ	getLoggerr"   logr!   Ztornador   
exceptionsr   __all__objectr	   r   r   r   r   <module>
   s   
	