o
    êi[                     @   s   d Z ddlZddlmZ ddlmZmZmZ ddlZddl	m
Z
 ddlmZmZmZmZmZmZ dd	lmZ d
ejddfddZG dd dZG dd deZG dd deZdS )z=HTTP client wrapper for managing requests and authentication.    N)JSONDecodeError)AnyDictOptional   )__version__)APIErrorAuthenticationErrorNotFoundErrorPermissionErrorRateLimitErrorServerError   )RequestOptionsresponsereturnc                 C   s   | j }z|  }|dp|dp| j}W n ty(   | jp%tj|}Y nw |dkr4t||| j|dkr?t	||| j|dkrJt
||| j|dkrUt||| j|dkr`t||| jt||| j)z1Raise appropriate exception based on status code.messagedetaili  i  i  i  i  )status_codejsongettextr   httpxcodesget_reason_phraser	   r   r
   r   r   r   )r   status
error_datar    r   Q/home/ubuntu/.local/lib/python3.10/site-packages/fishaudio/core/client_wrapper.py_raise_for_status   s$   r   c                   @   sz   e Zd ZdZddddee defddZ	dd	eeeef  d
eeef fddZdee	 deee
f d
dfddZdS )BaseClientWrapperz6Base wrapper with shared logic for sync/async clients.Nhttps://api.fish.audioapi_keybase_urlr#   r$   c                C   s(   |pt d| _| jstd|| _d S )NFISH_API_KEYzTAPI key must be provided either as argument or via FISH_API_KEY environment variable)osgetenvr#   
ValueErrorr$   )selfr#   r$   r   r   r   __init__2   s   
zBaseClientWrapper.__init__additional_headersr   c                 C   s*   d| j  dt d}|r|| |S )z6Build headers including authentication and user agent.zBearer zfish-audio/python/)Authorizationz
User-Agent)r#   r   update)r)   r+   headersr   r   r   get_headers?   s   

zBaseClientWrapper.get_headersrequest_optionskwargsc                 C   s   |   }|r|jr||j i ||di |d< |r*|jdur*t|j|d< |rF|jrH|di }t|t	rJ||j ||d< dS dS dS dS )zEPrepare request kwargs by merging headers, timeout, and query params.r.   Ntimeoutparams)
r/   r+   r-   r   r2   r   Timeoutadditional_query_params
isinstancedict)r)   r0   r1   r.   r3   r   r   r   _prepare_request_kwargsK   s   


z)BaseClientWrapper._prepare_request_kwargsN)__name__
__module____qualname____doc__r   strr*   r   r/   r   r   r8   r   r   r   r   r    /   s,    



r    c                          e Zd ZdZddddddee deded	eej f fd
dZ	dddededee
 dedejf
ddZedejfddZdddZdd Zdd Z  ZS )ClientWrapperzHWrapper for httpx.Client that handles authentication and error handling.Nr!         n@r#   r$   r2   httpx_clientr#   r$   r2   rC   c                   B   t  j||d |d ur|| _d S tj|t||  d| _d S Nr"   )r$   r2   r.   )superr*   _clientr   Clientr4   r/   r)   r#   r$   r2   rC   	__class__r   r   r*   d      
zClientWrapper.__init__r0   methodpathr0   r1   r   c                K   s4   |  || | jj||fi |}|jst| |S )a  
        Make an HTTP request with error handling.

        Args:
            method: HTTP method (GET, POST, etc.)
            path: API endpoint path
            request_options: Optional request-level overrides
            **kwargs: Additional arguments to pass to httpx.request

        Returns:
            httpx.Response object

        Raises:
            APIError: On non-2xx responses
        r8   rG   request
is_successr   r)   rN   rO   r0   r1   r   r   r   r   rQ   w   s
   zClientWrapper.requestc                 C      | j S )zBGet underlying httpx.Client for advanced usage (e.g., WebSockets).rG   r)   r   r   r   client      zClientWrapper.clientc                 C   s   | j   dS zClose the HTTP client.N)rG   closerV   r   r   r   rZ      s   zClientWrapper.closec                 C   s   | S r9   r   rV   r   r   r   	__enter__   s   zClientWrapper.__enter__c                 C   s   |    d S r9   rZ   r)   exc_typeexc_valexc_tbr   r   r   __exit__   s   zClientWrapper.__exit__r   N)r:   r;   r<   r=   r   r>   floatr   rH   r*   r   r   ResponserQ   propertyrW   rZ   r[   ra   __classcell__r   r   rJ   r   r@   a   @    
"
r@   c                       r?   )AsyncClientWrapperzMWrapper for httpx.AsyncClient that handles authentication and error handling.Nr!   rA   rB   r#   r$   r2   rC   c                   rD   rE   )rF   r*   rG   r   AsyncClientr4   r/   rI   rJ   r   r   r*      rL   zAsyncClientWrapper.__init__rM   rN   rO   r0   r1   r   c                   s<   |  || | jj||fi |I dH }|jst| |S )a  
        Make an async HTTP request with error handling.

        Args:
            method: HTTP method (GET, POST, etc.)
            path: API endpoint path
            request_options: Optional request-level overrides
            **kwargs: Additional arguments to pass to httpx.request

        Returns:
            httpx.Response object

        Raises:
            APIError: On non-2xx responses
        NrP   rS   r   r   r   rQ      s   zAsyncClientWrapper.requestc                 C   rT   )zGGet underlying httpx.AsyncClient for advanced usage (e.g., WebSockets).rU   rV   r   r   r   rW      rX   zAsyncClientWrapper.clientc                    s   | j  I dH  dS rY   )rG   acloserV   r   r   r   rZ      s   zAsyncClientWrapper.closec                    s   | S r9   r   rV   r   r   r   
__aenter__   s   zAsyncClientWrapper.__aenter__c                    s   |   I d H  d S r9   r\   r]   r   r   r   	__aexit__   s   zAsyncClientWrapper.__aexit__rb   )r:   r;   r<   r=   r   r>   rc   r   ri   r*   r   r   rd   rQ   re   rW   rZ   rk   rl   rf   r   r   rJ   r   rh      rg   rh   )r=   r&   r   r   typingr   r   r   r   _versionr   
exceptionsr   r	   r
   r   r   r   r0   r   rd   r   r    r@   rh   r   r   r   r   <module>   s     2H