o
    i                     @   s  d dl Z d dlZd dlmZ d dlZd dlm  mZ ddl	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ zd dlmZ W n e yp   d dlmZ Y nw ej!e"eeeef Z#G dd de
Z$G dd de
Z%dS )    N)JSONDecodeError   )EventEmitterMixin	EventType)construct_type   )SpeakV1Clear)SpeakV1Cleared)SpeakV1Close)SpeakV1Flush)SpeakV1Flushed)SpeakV1Metadata)SpeakV1Text)SpeakV1Warning)WebSocketClientProtocolc                       s   e Zd Zdef fddZdd Zdd Zded	d
fddZdde	j
e d	d
fddZdde	j
e d	d
fddZdde	j
e d	d
fddZd	efddZde	jd	d
fddZde	jd	d
fddZ  ZS )AsyncV1SocketClient	websocketc                      t    || _d S Nsuper__init__
_websocketselfr   	__class__ S/home/ubuntu/.local/lib/python3.10/site-packages/deepgram/speak/v1/socket_client.pyr         

zAsyncV1SocketClient.__init__c                 C  sB   | j 2 z3 d H W }t|tr|V  qttt|dV  q6 d S Ntype_object_r   
isinstancebytesr   V1SocketClientResponsejsonloadsr   messager   r   r   	__aiter__!   s   
zAsyncV1SocketClient.__aiter__c              
      s   |  tjdI dH  zaz*| j2 z#3 dH W }t|tr|}nt|}tt	|d}|  tj
|I dH  q6 W n tyR } z|  tj|I dH  W Y d}~nd}~ww W |  tjdI dH  dS W |  tjdI dH  dS |  tjdI dH  w aH  
        Start listening for messages on the websocket connection.

        Emits events in the following order:
        - EventType.OPEN when connection is established
        - EventType.MESSAGE for each message received
        - EventType.ERROR if an error occurs
        - EventType.CLOSE when connection is closed
        Nr!   )_emit_asyncr   OPENr   r%   r&   r(   r)   r   r'   MESSAGE	ExceptionERRORCLOSEr   raw_messageparsed	json_dataexcr   r   r   start_listening(   s$   


 
.z#AsyncV1SocketClient.start_listeningr+   returnNc                    s   |  |I dH  dS zp
        Send a message to the websocket connection.
        The message will be sent as a SpeakV1Text.
        N_send_modelr*   r   r   r   	send_text@   s   zAsyncV1SocketClient.send_textc                        |  |p	tddI dH  dS zq
        Send a message to the websocket connection.
        The message will be sent as a SpeakV1Flush.
        FlushtypeNr=   r   r*   r   r   r   
send_flushG      zAsyncV1SocketClient.send_flushc                    r?   zq
        Send a message to the websocket connection.
        The message will be sent as a SpeakV1Clear.
        ClearrB   Nr=   r   r*   r   r   r   
send_clearN   rF   zAsyncV1SocketClient.send_clearc                    r?   zq
        Send a message to the websocket connection.
        The message will be sent as a SpeakV1Close.
        CloserB   Nr=   r
   r*   r   r   r   
send_closeU   rF   zAsyncV1SocketClient.send_closec                    s6   | j  I dH }t|tr|S t|}tt|dS )B
        Receive a message from the websocket connection.
        Nr!   r   recvr%   r&   r(   r)   r   r'   r   datar7   r   r   r   rQ   \   s   

zAsyncV1SocketClient.recvrS   c                    s,   t |trt|}| j|I dH  dS z=
        Send a message to the websocket connection.
        Nr%   dictr(   dumpsr   sendr   rS   r   r   r   _sendf   s   

zAsyncV1SocketClient._sendc                    s   |  | I dH  dS zD
        Send a Pydantic model to the websocket connection.
        NrZ   rV   rY   r   r   r   r=   n   s   zAsyncV1SocketClient._send_modelr   )__name__
__module____qualname__r   r   r,   r9   r   r>   typingOptionalr   rE   r   rJ   r
   rN   r'   rQ   AnyrZ   r=   __classcell__r   r   r   r   r      s    
r   c                       s   e Zd Zdejf fddZdd Zdd Zded	d
fddZ	dde
je d	d
fddZdde
je d	d
fddZdde
je d	d
fddZd	efddZde
jd	d
fddZde
jd	d
fddZ  ZS )V1SocketClientr   c                   r   r   r   r   r   r   r   r   v   r   zV1SocketClient.__init__c                 c   s8    | j D ]}t|tr|V  qttt|dV  qd S r    r$   r*   r   r   r   __iter__z   s   

zV1SocketClient.__iter__c              
   C   s   |  tjd zPz"| jD ]}t|tr|}nt|}tt	|d}|  tj
| qW n tyC } z|  tj| W Y d}~nd}~ww W |  tjd dS W |  tjd dS |  tjd w r-   )_emitr   r/   r   r%   r&   r(   r)   r   r'   r0   r1   r2   r3   r4   r   r   r   r9      s"   




"zV1SocketClient.start_listeningr+   r:   Nc                 C   s   |  | dS r;   r<   r*   r   r   r   r>      s   zV1SocketClient.send_textc                 C      |  |ptdd dS r@   rD   r*   r   r   r   rE         zV1SocketClient.send_flushc                 C   rg   rG   rI   r*   r   r   r   rJ      rh   zV1SocketClient.send_clearc                 C   rg   rK   rM   r*   r   r   r   rN      rh   zV1SocketClient.send_closec                 C   s.   | j  }t|tr|S t|}tt|dS )rO   r!   rP   rR   r   r   r   rQ      s
   


zV1SocketClient.recvrS   c                 C   s$   t |tr
t|}| j| dS rT   rU   rY   r   r   r   rZ      s   

zV1SocketClient._sendc                 C   s   |  |  dS r[   r\   rY   r   r   r   r=      s   zV1SocketClient._send_modelr   )r]   r^   r_   websockets_sync_connection
Connectionr   re   r9   r   r>   r`   ra   r   rE   r   rJ   r
   rN   r'   rQ   rb   rZ   r=   rc   r   r   r   r   rd   u   s    
rd   )&r(   r`   json.decoderr   
websocketswebsockets.sync.connectionsync
connectionri   core.eventsr   r   core.unchecked_base_modelr   types.speak_v1clearr   types.speak_v1clearedr	   types.speak_v1closer
   types.speak_v1flushr   types.speak_v1flushedr   types.speak_v1metadatar   types.speak_v1textr   types.speak_v1warningr   websockets.legacy.clientr   ImportErrorUnionr&   r'   r   rd   r   r   r   r   <module>   s.   Y