o
    >h#                     @   s   d dl Z d dlmZ ddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZ G dd deZG d	d
 d
eZG dd deZG dd deZdS )    N)async_to_sync   )AsyncConsumerSyncConsumer)aclose_old_connections)AcceptConnectionDenyConnectionInvalidChannelLayerErrorStopConsumerc                       |   e Zd ZdZdZdd Zdd Zdd Zd fd	d
	Zdd Z	dddZ
d fdd	Zd fdd	Zdd Zdd Z  ZS )WebsocketConsumerz
    Base WebSocket consumer. Provides a general encapsulation for the
    WebSocket handling model that other applications can build on.
    Nc                 O      | j d u r
g | _ d S d S Ngroupsselfargskwargs r   z/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/channels/generic/websocket.py__init__      

zWebsocketConsumer.__init__c                 C   s   z| j D ]}t| jj|| j qW n ty   tdw z|   W dS  ty3   | 	  Y dS  t
y@   |   Y dS w )?
        Called when a WebSocket connection is opened.
        1BACKEND is unconfigured or doesn't support groupsN)r   r   channel_layer	group_addchannel_nameAttributeErrorr	   connectr   acceptr   closer   messagegroupr   r   r   websocket_connect   s    
z#WebsocketConsumer.websocket_connectc                 C   s   |    d S r   r    r   r   r   r   r   -   s   zWebsocketConsumer.connectc                    s*   d|d}|rt ||d< t | dS z,
        Accepts an incoming socket
        zwebsocket.accept)typesubprotocolheadersNlistsupersendr   r*   r+   r#   	__class__r   r   r    0   s   
zWebsocketConsumer.acceptc                 C   s6   | ddur| j|d d dS | j|d d dS zk
        Called when a WebSocket frame is received. Decodes it and passes it
        to receive().
        textN)	text_databytes)
bytes_datagetreceiver   r#   r   r   r   websocket_receive:   s   z#WebsocketConsumer.websocket_receivec                 C      dS z8
        Called with a decoded WebSocket frame.
        Nr   r   r5   r7   r   r   r   r:   D      zWebsocketConsumer.receiveFc                    sV   |durt  d|d n|durt  d|d ntd|r)| | dS dS z7
        Sends a reply back down the WebSocket
        Nzwebsocket.send)r)   r4   )r)   r6   z,You must pass one of bytes_data or text_datar.   r/   
ValueErrorr!   r   r5   r7   r!   r1   r   r   r/   J   s   zWebsocketConsumer.sendc                    s<   ddi}|dur|dur||d< |r||d< t  | dS z:
        Closes the WebSocket from the server end
        r)   zwebsocket.closeNTcodereasonr.   r/   r   rF   rG   r#   r1   r   r   r!   W   s   zWebsocketConsumer.closec                 C   sP   z| j D ]}t| jj|| j qW n ty   tdw | |d  t )
        Called when a WebSocket connection is closed. Base level so you don't
        need to call super() all the time.
        r   rF   )	r   r   r   group_discardr   r   r	   
disconnectr
   r"   r   r   r   websocket_disconnectb   s   

z&WebsocketConsumer.websocket_disconnectc                 C   r=   z?
        Called when a WebSocket connection is closed.
        Nr   r   rF   r   r   r   rL   s   r@   zWebsocketConsumer.disconnectNNNNF__name__
__module____qualname____doc__r   r   r%   r   r    r<   r:   r/   r!   rM   rL   __classcell__r   r   r1   r   r      s    


r   c                       L   e Zd ZdZdddZdd Zd fdd		Zed
d Zedd Z	  Z
S )JsonWebsocketConsumerz
    Variant of WebsocketConsumer that automatically JSON-encodes and decodes
    messages as they come in and go out. Expects everything to be text; will
    error on binary data.
    Nc                 K   s(   |r| j | |fi | d S tdNz-No text section for incoming WebSocket frame!receive_jsondecode_jsonrC   r   r5   r7   r   r   r   r   r:      s   zJsonWebsocketConsumer.receivec                 K   r=   z3
        Called with decoded JSON content.
        Nr   r   contentr   r   r   r   r\      r@   z"JsonWebsocketConsumer.receive_jsonFc                    s   t  j| ||d dS )M
        Encode the given content as JSON and send it to the client.
        r5   r!   Nr.   r/   encode_jsonr   ra   r!   r1   r   r   	send_json   s   zJsonWebsocketConsumer.send_jsonc                 C   
   t |S r   jsonloadsclsr5   r   r   r   r]         
z!JsonWebsocketConsumer.decode_jsonc                 C   rh   r   rj   dumpsrm   ra   r   r   r   re      rn   z!JsonWebsocketConsumer.encode_jsonrP   FrS   rT   rU   rV   r:   r\   rg   classmethodr]   re   rW   r   r   r1   r   rY   z       

rY   c                       r   )AsyncWebsocketConsumerz
    Base WebSocket consumer, async version. Provides a general encapsulation
    for the WebSocket handling model that other applications can build on.
    Nc                 O   r   r   r   r   r   r   r   r      r   zAsyncWebsocketConsumer.__init__c                    s   z| j D ]}| j|| jI dH  qW n ty   tdw z
|  I dH  W dS  ty;   |  I dH  Y dS  t	yK   | 
 I dH  Y dS w )r   Nr   )r   r   r   r   r   r	   r   r   r    r   r!   r"   r   r   r   r%      s"   
z(AsyncWebsocketConsumer.websocket_connectc                    s   |   I d H  d S r   r&   r'   r   r   r   r      s   zAsyncWebsocketConsumer.connectc                    s2   d|d}|rt ||d< t |I dH  dS r(   r,   r0   r1   r   r   r       s
   
zAsyncWebsocketConsumer.acceptc                    sD   | ddur| j|d dI dH  dS | j|d dI dH  dS r3   r8   r;   r   r   r   r<      s   z(AsyncWebsocketConsumer.websocket_receivec                       dS r>   r   r?   r   r   r   r:         zAsyncWebsocketConsumer.receiveFc                    sj   |durt  d|dI dH  n|dur#t  d|dI dH  ntd|r3| |I dH  dS dS rA   rB   rD   r1   r   r   r/      s   zAsyncWebsocketConsumer.sendc                    sD   ddi}|dur|dur||d< |r||d< t  |I dH  dS rE   rH   rI   r1   r   r   r!      s   zAsyncWebsocketConsumer.closec                    sf   z| j D ]}| j|| jI dH  qW n ty   tdw | |d I dH  t I dH  t )rJ   Nr   rF   )	r   r   rK   r   r   r	   rL   r   r
   r"   r   r   r   rM      s   
z+AsyncWebsocketConsumer.websocket_disconnectc                    rw   rN   r   rO   r   r   r   rL      rx   z!AsyncWebsocketConsumer.disconnectrP   rQ   rR   r   r   r1   r   rv      s    	

rv   c                       rX   )AsyncJsonWebsocketConsumerz
    Variant of AsyncWebsocketConsumer that automatically JSON-encodes and decodes
    messages as they come in and go out. Expects everything to be text; will
    error on binary data.
    Nc                    s6   |r| j | |I d H fi |I d H  d S tdrZ   r[   r^   r   r   r   r:     s   (z"AsyncJsonWebsocketConsumer.receivec                    rw   r_   r   r`   r   r   r   r\     rx   z'AsyncJsonWebsocketConsumer.receive_jsonFc                    s(   t  j| |I dH |dI dH  dS )rb   Nrc   rd   rf   r1   r   r   rg     s   &z$AsyncJsonWebsocketConsumer.send_jsonc                       t |S r   ri   rl   r   r   r   r]        
z&AsyncJsonWebsocketConsumer.decode_jsonc                    rz   r   ro   rq   r   r   r   re   "  r{   z&AsyncJsonWebsocketConsumer.encode_jsonrP   rr   rs   r   r   r1   r   ry     ru   ry   )rj   asgiref.syncr   consumerr   r   dbr   
exceptionsr   r   r	   r
   r   rY   rv   ry   r   r   r   r   <module>   s    k"i