o
    ߥi                     @   s   d dl Z d dlmZmZ d dlmZmZmZmZ ddl	m
Z
 ddlmZ G dd deZG d	d
 d
e jZG dd de
ZdddZG dd dZdS )    N)AsyncIteratorOptional)MessageReceiveScopeSend   )HTTPConnection)Responsec                   @   s6   e Zd Zd
dedee ddfddZdefdd	ZdS )WebSocketDisconnect  Ncodereasonreturnc                 C   s   || _ |pd| _d S )N r   r   selfr   r    r   H/home/ubuntu/.local/lib/python3.10/site-packages/baize/asgi/websocket.py__init__   s   zWebSocketDisconnect.__init__c                 C   s   d| j  d| j dS )NzWebSocketDisconnect(code=z	, reason=)r   r   r   r   r   __repr__   s   zWebSocketDisconnect.__repr__r   N)__name__
__module____qualname__intr   strr   r   r   r   r   r   r   
   s    r   c                   @   s$   e Zd Ze Ze Ze ZdS )WebSocketStateN)r   r   r   enumauto
CONNECTING	CONNECTEDDISCONNECTEDr   r   r   r   r       s    r    c                       s   e Zd Zdedededdf fddZdefdd	Zd
eddfddZ	d$de
e ddfddZd
eddfddZdefddZdefddZdee fddZdee fddZdeddfddZdeddfddZd%d ed!e
e ddfd"d#Z  ZS )&	WebSocketscopereceivesendr   Nc                    s4   |d dksJ t  ||| tj| _tj| _d S )Ntype	websocket)superr   r    r#   client_stateapplication_state)r   r'   r(   r)   	__class__r   r   r      s   zWebSocket.__init__c                    s   | j tjkr|  I dH }|d }|dksJ tj| _ |S | j tjkr?|  I dH }|d }|dv s5J |dkr=tj| _ |S td)zT
        Receive ASGI websocket messages, ensuring valid state transitions.
        Nr*   zwebsocket.connect>   websocket.receivewebsocket.disconnectr2   zBCannot call "receive" once a disconnect message has been received.)r-   r    r#   _receiver$   r%   RuntimeErrorr   messagemessage_typer   r   r   r(       s"   zWebSocket.receiver6   c                    s   | j tjkr(|d }|dv sJ |dkrtj| _ ntj| _ | |I dH  dS | j tjkrJ|d }|dv s8J |dkr@tj| _ | |I dH  dS td)zQ
        Send ASGI websocket messages, ensuring valid state transitions.
        r*   >   websocket.closewebsocket.acceptr8   N>   websocket.sendr8   z6Cannot call "send" once a close message has been sent.)r.   r    r#   r%   r$   _sendr4   r5   r   r   r   r)   6   s   
zWebSocket.sendsubprotocolc                    s6   | j tjkr|  I dH  | d|dI dH  dS )z.
        Accept websocket connection.
        Nr9   )r*   r<   )r-   r    r#   r(   r)   )r   r<   r   r   r   acceptK   s   zWebSocket.acceptc                 C   s$   |d dkrt |d |dd S )Nr*   r2   r   r   )r   getr   r6   r   r   r   _raise_on_disconnectT   s   zWebSocket._raise_on_disconnectc                    2   | j tjks	J |  I dH }| | |d S )z<
        Receive a WebSocket text frame and return.
        Ntextr.   r    r$   r(   r@   r?   r   r   r   receive_textX   
   
zWebSocket.receive_textc                    rA   )z>
        Receive a WebSocket binary frame and return.
        NbytesrC   r?   r   r   r   receive_bytesa   rE   zWebSocket.receive_bytesc                 C  ,   z
	 |   I dH V  q ty   Y dS w )z\
        Keep receiving text frames until the WebSocket connection is disconnected.
        TN)rD   r   r   r   r   r   	iter_textj      zWebSocket.iter_textc                 C  rH   )z^
        Keep receiving binary frames until the WebSocket connection is disconnected.
        TN)rG   r   r   r   r   r   
iter_bytest   rJ   zWebSocket.iter_bytesdatac                       |  d|dI dH  dS )z.
        Send a WebSocket text frame.
        r:   )r*   rB   Nr)   r   rL   r   r   r   	send_text~      zWebSocket.send_textc                    rM   )z0
        Send a WebSocket binary frame.
        r:   )r*   rF   NrN   rO   r   r   r   
send_bytes   rQ   zWebSocket.send_bytesr   r   r   c                    s.   | j tjkr| d||dI dH  dS dS )zN
        Close WebSocket connection. It can be called multiple times.
        r8   )r*   r   r   N)r.   r    r%   r)   r   r   r   r   close   s   zWebSocket.closeNr   )r   r   r   r   r   r   r   r   r(   r)   r   r   r=   r@   rD   rF   rG   r   rI   rK   rP   rR   r   rS   __classcell__r   r   r/   r   r&      s    			

$r&   zwebsocket.http.response.startzwebsocket.http.response.body)zhttp.response.startzhttp.response.bodyc                   @   s<   e Zd ZdZdeddfddZdeded	eddfd
dZ	dS )WebsocketDenialResponsez
    A response that will deny a WebSocket connection.

    https://asgi.readthedocs.io/en/latest/extensions.html#websocket-denial-response
    responser   Nc                 C   s
   || _ d S rT   )rW   )r   rW   r   r   r   r      s   
z WebsocketDenialResponse.__init__r'   r(   r)   c                    s   |d dksJ d| j d u sd|di vr#ddiI d H  d S dtdd ffd	d
}dtf fdd}|  |||I d H  d S )Nr*   r+   z2WebsocketDenialResponse requires a websocket scopezwebsocket.http.response
extensionsr8   msgr   c                    sB   | d t vrtd| d  t | d  | d<  | I d H  d S )Nr*   zUnsupported message type: )!WEBSOCKET_DENIAL_RESPONSE_MAPPING
ValueErrorrY   rN   r   r   ws_send   s
   z1WebsocketDenialResponse.__call__.<locals>.ws_sendc                     s*   	   I d H } | d dkrd| d< | S q)NTr*   r2   zhttp.disconnectr   r\   )r(   r   r   
ws_receive   s   z4WebsocketDenialResponse.__call__.<locals>.ws_receive)rW   r>   r   )r   r'   r(   r)   r]   r^   r   )r(   r)   r   __call__   s   z WebsocketDenialResponse.__call__)
r   r   r   __doc__r
   r   r   r   r   r_   r   r   r   r   rV      s    rV   )r!   typingr   r   baize.typingr   r   r   r   requestsr	   	responsesr
   	Exceptionr   Enumr    r&   rZ   rV   r   r   r   r   <module>   s    	z