B
    @\3                 @   sb   d Z ddlmZmZmZmZ ddlZeeZ	ddl
mZmZ ddlmZ dZG dd deZdS )	zn Provide a low-level wrapper for Tornado Websockets that adds locking
and smooths some compatibility issues.

    )absolute_importdivisionprint_functionunicode_literalsN)genlocks)WebSocketError) WebSocketClientConnectionWrapperc               @   s<   e Zd ZdZdd ZejdddZdd	d
ZdddZ	dS )r	   zE Used for compatibility across Tornado versions and to add write_lockc             C   s$   |d krt d|| _t | _d S )Nzsocket must not be None)
ValueError_socketr   ZLock
write_lock)selfZsocket r   5lib/python3.7/site-packages/bokeh/client/websocket.py__init__3   s    z)WebSocketClientConnectionWrapper.__init__FTc          	   #   s>    fdd}|r4j  V  |  W dQ R X n|  dS )zh Write a message to the websocket after obtaining the appropriate
        Bokeh Document lock.

        c                 s0   j jd krtdj  } t| d S )Nz(Connection to the server has been closed)r   Zprotocolr   write_messager   ZReturn)Zfuture)binarymessager   r   r   write_message_unlockedC   s    zNWebSocketClientConnectionWrapper.write_message.<locals>.write_message_unlockedN)r   acquire)r   r   r   lockedr   r   )r   r   r   r   r   =   s
    z.WebSocketClientConnectionWrapper.write_messageNc             C   s   | j ||S )z Close the websocket. )r   close)r   codereasonr   r   r   r   X   s    z&WebSocketClientConnectionWrapper.closec             C   s   | j |S )z@ Read a message from websocket and execute a callback.

        )r   read_message)r   callbackr   r   r   r   \   s    z-WebSocketClientConnectionWrapper.read_message)FT)NN)N)
__name__
__module____qualname____doc__r   r   	coroutiner   r   r   r   r   r   r   r	   0   s   

r	   )r   Z
__future__r   r   r   r   ZloggingZ	getLoggerr   logZtornador   r   Ztornado.websocketr   __all__objectr	   r   r   r   r   <module>
   s   
		