o
    i;                     @  s  d dl mZ d dlZd dlmZ d dl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ZddlmZ ddlmZ ddlmZ ddlmZ eG dd dZeG dd dZG dd dZG dd dZedZedZd#d!d"ZdS )$    )annotationsN)	dataclass)Any)Callable)cast)Dict)Optional)TypeVar)Union   )proto)_error_from_proto)IdAlloc   )LibsqlErrorc                   @     e Zd ZU ded< ded< dS )_ResponseStatestrtypeasyncio.Future[proto.Response]futureN__name__
__module____qualname____annotations__ r   r   L/home/ubuntu/.local/lib/python3.10/site-packages/libsql_client/hrana/conn.pyr         
 r   c                   @  r   )_StreamStateint	stream_idOptional[BaseException]closedNr   r   r   r   r   r      r   r   c                   @  s  e Zd ZU ded< ded< ded< ded< ded	< d
ed< ded< ded< ded< ded< ded< ded< 	dSdTddZdUd!d"ZdVd$d%ZdWd'd(ZdXd*d+ZdXd,d-Z	dYd/d0Z
dYd1d2ZdZd5d6Zd[d9d:Zd\d>d?Zd]dAdBZd^dDdEZd_dHdIZdUdJdKZd`dNdOZdadQdRZdS )b	HranaConn-asyncio.Task[aiohttp.ClientWebSocketResponse]_connect_taskzOptional[asyncio.Task[None]]_receive_task
_send_taskz)Optional[aiohttp.ClientWebSocketResponse]_socketzasyncio.Queue[str]_send_msg_queuebool_recvd_hellozasyncio.Event_finished_handshakezDict[int, _ResponseState]_response_mapr   _request_id_alloc_stream_id_alloc_sql_id_allocr"   	exceptionNsessionaiohttp.ClientSessionurlr   
auth_tokenOptional[str]c                 C  s   t | ||| _| j| j d | _d | _d | _t 	 | _
d| _t  | _i | _t | _t | _t | _d | _| d|d d S )NFhello)r   jwt)asynciocreate_task_do_connectr&   add_done_callback_done_connectr'   r(   r)   Queuer*   r,   Eventr-   r.   r   r/   r0   r1   r2   _send)selfr3   r5   r6   r   r   r   __init__3   s   

zHranaConn.__init__returnNonec                   s"   | j  I d H  | jr| jd S N)r-   waitr2   rB   r   r   r   wait_connectedI   s
   zHranaConn.wait_connectedaiohttp.ClientWebSocketResponsec                   s   |j |dgdddI d H S )Nhrana2FT)	protocols	autocloseautoping)
ws_connect)rB   r3   r5   r   r   r   r<   N   s   zHranaConn._do_connecttaskc                 C  s   |  r
tdd}n| }|d ur| | | jd urd S | }t| |}t| |}|	| j
 |	| j || _|| _|| _d S )NzThe connect task was cancelledCLIENT_CLOSED)	cancelledr   r2   _set_exceptionresultr:   r;   _do_receive_do_sendr=   _done_receive
_done_sendr)   r'   r(   )rB   rP   esocketreceive_task	send_taskr   r   r   r>   X   s   


zHranaConn._done_connectrZ   c                   sJ  	 |  I d H }|jtjjkr-z| |j W n ty,   |jdd	 dI d H   w |jtjj
krE|jdd	 dI d H  tdd|jtjjkrV||jI d H  nN|jtjjkr^nF|jtjjkr}ttj|j}tt|j}td	| d
|d|jtjjkrn|jtjjkrtdd|jtjjkr|jtd|jdq)NTi  zCould not handle message)codemessagei  zOnly text messages are acceptedz#Received a binary WebSocket messageHRANA_PROTO_ERRORzWebSocket was closed with code z: HRANA_WEBSOCKET_ERRORzWebSocket was closedz&Received unexpected WebSocket message )receiver   aiohttp	WSMsgTypeTEXT_receivedata	ExceptioncloseencodeBINARYr   PINGpongPONGCLOSEr   WSCloseCoder   extraCLOSINGCLOSEDERROR)rB   rZ   msgr]   reasonr   r   r   rU   q   sR   

zHranaConn._do_receivec                   s&   	 | j  I d H }||I d H  qrF   )r*   getsend_str)rB   rZ   msg_strr   r   r   rV      s
   zHranaConn._do_sendasyncio.Task[None]c                 C  sJ   |  r
tdd}n| }|d ur#| jd ur| j  | | d S d S )NzThe receive task was cancelledrQ   )rR   r   r2   r(   cancelrS   rB   rP   rY   r   r   r   rW      s   

zHranaConn._done_receivec                 C  sJ   |  r
tdd}n| }|d ur| | | jd ur#| j  d S d S )NzThe send task was cancelledrQ   )rR   r   r2   rS   r'   rz   r{   r   r   r   rX      s   

zHranaConn._done_sendrt   proto.ClientMsgc                 C  s$   | j d u sJ | jt| d S rF   )r2   r*   
put_nowaitjsondumps)rB   rt   r   r   r   rA      s   zHranaConn._sendrY   BaseExceptionc                 C  s~   | j d urd S || _ | j  | j| j| jfD ]
}|d ur!|  q| j D ]\}}|j	
| | j| q'| j  d S rF   )r2   r-   setr&   r'   r(   rz   r.   itemsr   set_exceptionr/   freeclear)rB   rY   rP   
request_idresponse_stater   r   r   rS      s   

zHranaConn._set_exceptionrequestproto.Requestr   c                 C  sZ   t   }| jd ur|| j |S | j }t|d || j|< | 	d||d |S )Nr   r   )r   r   r   )
r:   get_running_loopcreate_futurer2   r   r/   allocr   r.   rA   )rB   r   r   r   r   r   r   send_request   s   

zHranaConn.send_requesttextc              
   C  s  | j d urd S zt|}W n ty  } ztdd|d }~ww |d dv rE| jr/tddd| _| j  |d dkrCt|d d S | jsMtd	d|d d
krt	|d }| j
|d }|d u ritdd| j| z|j|d d kr~tdd|j|d  W d S  ty } z|j|  d }~ww |d dkrt	|d }| j
|d }|d u rtdd| j| |jt|d  d S tdd)Nz Server message is not valid JSONr_   r   )hello_okhello_errorz$Received a duplicated error responseTr   errorz2Received a non-hello message before hello responseresponse_okr   zReceived unexpected OK responseresponsez$Received unexpected type of responseresponse_errorz"Received unexpected error responsez Received unexpected message type)r2   r~   loads
ValueErrorr   r,   r-   r   r   r    r.   popr/   r   r   r   
set_resultrg   r   )rB   r   rt   rY   r   r   r   r   r   re      sp   


zHranaConn._receiveHranaStreamc                   sH    j  }t|d d	 fdd} d|d}|| t S )
Nfutr   rD   rE   c                   s8   |   r
td}n|  }|d ur | d S d S )NzStream opening was cancelled)rR   r:   CancelledErrorr2   _close_streamr   rY   rB   stream_stater   r   	open_done     z(HranaConn.open_stream.<locals>.open_doneopen_streamr   r!   r   r   rD   rE   )r0   r   r   r   r=   r   )rB   r!   r   open_futr   r   r   r     s   

	

zHranaConn.open_streamr   r   c                   sN   j d us
 jd urd S |_ d	 fdd} djd}|| d S )
Nr   r   rD   rE   c                   s&    j j |  s|   d S d S rF   )r0   r   r!   rR   r2   r   r   r   r   
close_done.  s   z+HranaConn._close_stream.<locals>.close_doneclose_streamr   r   )r#   r2   r   r!   r=   )rB   r   rY   r   	close_futr   r   r   r   )  s   zHranaConn._close_streamc                   s4   |  tdd | jd ur| j I d H  d S d S )NzClient was manually closedrQ   )rS   r   r)   rh   rH   r   r   r   rh   ;  s
   
zHranaConn.closesqlr    c                   s:    j  d	 fdd} d|d}|| S )
Nr   r   rD   rE   c                   s8   |   r
td}n|  }|d ur j d S d S )Nzstore_sql was cancelled)rR   r:   r   r2   r1   r   r   rB   sql_idr   r   store_sql_doneC  r   z+HranaConn.store_sql.<locals>.store_sql_done	store_sql)r   r   r   r   )r1   r   r   r=   )rB   r   r   store_sql_futr   r   r   r   @  s   
	
zHranaConn.store_sqlr   c                   s<    j d urd S d	 fdd} dd}|| d S )
Nr   r   rD   rE   c                   s$    j  |  s|   d S d S rF   )r1   r   rR   r2   r   r   r   r   close_sql_doneZ  s   z+HranaConn.close_sql.<locals>.close_sql_done	close_sql)r   r   r   )r2   r   r=   )rB   r   r   close_sql_futr   r   r   r   V  s   
zHranaConn.close_sqlrF   )r3   r4   r5   r   r6   r7   rD   rE   )r3   r4   r5   r   rD   rJ   )rP   r%   rD   rE   )rZ   rJ   rD   rE   )rP   ry   rD   rE   )rt   r|   rD   rE   )rY   r   rD   rE   )r   r   rD   r   )r   r   rD   rE   rD   r   )r   r   rY   r   rD   rE   )r   r   rD   r    )r   r    rD   rE   )r   r   r   r   rC   rI   r<   r>   rU   rV   rW   rX   rA   rS   r   re   r   r   rh   r   r   r   r   r   r   r$   "   s>   
 





)






;


r$   c                   @  sr   e Zd ZU ded< ded< d'ddZd(ddZd)ddZd*ddZd+ddZe	d,ddZ
d-ddZd.d$d%Zd&S )/r   r$   _connr   _stateconnstatec                 C  s   || _ || _d S rF   )r   r   )rB   r   r   r   r   r   rC   l  s   
zHranaStream.__init__stmt
proto.StmtrD    asyncio.Future[proto.StmtResult]c                 C  L   | j jd urtdd| j jd| j j|d}| j|}dd	d
}t||S )NStream was closedSTREAM_CLOSEDexecute)r   r!   r   r   proto.ResponserD   proto.StmtResultc                 S     t tj| d S NrT   )r   r   ExecuteRespr   r   r   r   
get_result}     z'HranaStream.execute.<locals>.get_result)r   r   rD   r   r   r#   r   r!   r   r   _map_futurerB   r   r   response_futr   r   r   r   r   p     

zHranaStream.executeUnion[str, int]asyncio.Future[None]c                 C  sh   | j jd urtdd| j jt|trd| j j|d}nd| j j|d}| j|}dd
d}t||S )Nr   r   sequence)r   r!   r   )r   r!   r   r   r   rD   rE   c                 S  s   d S rF   r   r   r   r   r   r        z(HranaStream.sequence.<locals>.get_result)r   r   rD   rE   )	r   r#   r   
isinstancer   r!   r   r   r   r   r   r   r   r     s$   


zHranaStream.sequencebatchproto.Batch!asyncio.Future[proto.BatchResult]c                 C  r   )Nr   r   r   )r   r!   r   r   r   rD   proto.BatchResultc                 S  r   r   )r   r   	BatchRespr   r   r   r   r     r   z%HranaStream.batch.<locals>.get_result)r   r   rD   r   r   )rB   r   r   r   r   r   r   r   r     r   zHranaStream.batchrE   c                 C  s   t dd}| j| j| d S )NzStream was manually closedr   )r   r   r   r   )rB   rY   r   r   r   rh     s   
zHranaStream.closer+   c                 C  s   | j jd uS rF   )r   r#   rH   r   r   r   r#     s   zHranaStream.closedc                 C  s   | S rF   r   rH   r   r   r   	__enter__  r   zHranaStream.__enter__	_exc_typer   
_exc_value
_tracebackc                 C  s   |    d S rF   )rh   )rB   r   r   r   r   r   r   __exit__  s   zHranaStream.__exit__N)r   r$   r   r   )r   r   rD   r   )r   r   rD   r   )r   r   rD   r   r   )rD   r+   r   )r   r   r   r   r   r   rD   rE   )r   r   r   r   rC   r   r   r   rh   propertyr#   r   r   r   r   r   r   r   h  s   
 





r   TRr   asyncio.Future[T]fCallable[[T], R]rD   asyncio.Future[R]c                   s*   t   d fdd}| | S )Nr   r   rD   rE   c                   sH   |   r
  d S |  }|d u r |   d S | d S rF   )rR   rz   r2   r   rT   r   r   r   retr   r   done  s   z_map_future.<locals>.done)r   r   rD   rE   )r:   r   r   r=   )r   r   r   r   r   r   r     s   

r   )r   r   r   r   rD   r   )
__future__r   r:   dataclassesr   r~   typingr   r   r   r   r   r	   r
   rb    r   convertr   id_allocr   clientr   r   r   r$   r   r   r   r   r   r   r   r   <module>   s6      HV