
    #hL                        d dl mZ d dlmZ d dlmZmZ d dlZddlm	Z	 ddlm
Z
mZmZ  G d	 d
ee      Z ed       G d d             Z ed       G d d             Zdej"                  dee   fdZdeeef   dee   fdZedddedeeef   dee   defd       Zedddddedededee   deeef   dee   deeeef      defd        Ze	 d#d!edeeef   deeeef      defd"       Zy)$    )	dataclass)Enum)DictOptionalN   )	constants   )get_sessionhf_raise_for_statusvalidate_hf_hub_argsc                       e Zd ZdZdZy)XetTokenTypereadwriteN)__name__
__module____qualname__READWRITE     W/var/www/html/sandstorm/venv/lib/python3.12/site-packages/huggingface_hub/utils/_xet.pyr   r      s    DEr   r   T)frozenc                   "    e Zd ZU eed<   eed<   y)XetFileData	file_hashrefresh_routeN)r   r   r   str__annotations__r   r   r   r   r      s    Nr   r   c                   ,    e Zd ZU eed<   eed<   eed<   y)XetConnectionInfoaccess_tokenexpiration_unix_epochendpointN)r   r   r   r   r   intr   r   r   r!   r!      s    Mr   r!   responsereturnc                 0   | y	 | j                   t        j                     }t        j                  | j                  v r!| j                  t        j                     d   }n| j                   t        j
                     }t        ||      S # t        $ r Y yw xY w)aa  
    Parse XET file metadata from an HTTP response.

    This function extracts XET file metadata from the HTTP headers or HTTP links
    of a given response object. If the required metadata is not found, it returns `None`.

    Args:
        response (`requests.Response`):
            The HTTP response object containing headers dict and links dict to extract the XET metadata from.
    Returns:
        `Optional[XetFileData]`:
            An instance of `XetFileData` containing the file hash and refresh route if the metadata
            is found. Returns `None` if the required metadata is missing.
    Nurl)r   r   )headersr   HUGGINGFACE_HEADER_X_XET_HASH$HUGGINGFACE_HEADER_LINK_XET_AUTH_KEYlinks&HUGGINGFACE_HEADER_X_XET_REFRESH_ROUTEKeyErrorr   )r&   r   r   s      r   !parse_xet_file_data_from_responser0      s     $$Y%L%LM	99X^^K$NN9+Y+YZ[`aM$,,Y-]-]^M #   s   A7B	 		BBr*   c                     	 | t         j                     }| t         j                     }t        | t         j                           }t        |||      S # t
        t        t        f$ r Y yw xY w)a  
    Parse XET connection info from the HTTP headers or return None if not found.
    Args:
        headers (`Dict`):
           HTTP headers to extract the XET metadata from.
    Returns:
        `XetConnectionInfo` or `None`:
            The information needed to connect to the XET storage service.
            Returns `None` if the headers do not contain the XET connection info.
    N)r$   r"   r#   )	r   !HUGGINGFACE_HEADER_X_XET_ENDPOINT%HUGGINGFACE_HEADER_X_XET_ACCESS_TOKENr%   #HUGGINGFACE_HEADER_X_XET_EXPIRATIONr/   
ValueError	TypeErrorr!   )r*   r$   r"   r#   s       r   &parse_xet_connection_info_from_headersr7   >   sp    9FFGyNNO #GI,Y,Y$Z [ !3  j), s   AA A)(A))r$   	file_datar$   c                     | j                   t        d      ||nt        j                  }| j                   }|j	                  d      r| | }t        ||      S )a  
    Utilizes the information in the parsed metadata to request the Hub xet connection information.
    This includes the access token, expiration, and XET service URL.
    Args:
        file_data: (`XetFileData`):
            The file data needed to refresh the xet connection information.
        headers (`Dict[str, str]`):
            Headers to use for the request, including authorization headers and user agent.
        endpoint (`str`, `optional`):
            The endpoint to use for the request. Defaults to the Hub endpoint.
    Returns:
        `XetConnectionInfo`:
            The connection information needed to make the request to the xet storage service.
    Raises:
        [`~utils.HfHubHTTPError`]
            If the Hub API returned an error.
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If the Hub API response is improperly formatted.
    z>The provided xet metadata does not contain a refresh endpoint./)r   r5   r   ENDPOINT
startswith#_fetch_xet_connection_info_with_url)r8   r*   r$   r)   s       r   refresh_xet_connection_infor>   W   sb    4 &YZZ#/xY5G5GH 
!
!C
~~c
3% .sG<<r   )revisionr$   params
token_typerepo_id	repo_typer?   r@   c           	      x    ||nt         j                  }| d| d| d| j                   d| 	}t        |||      S )a  
    Uses the repo info to request a xet access token from Hub.
    Args:
        token_type (`XetTokenType`):
            Type of the token to request: `"read"` or `"write"`.
        repo_id (`str`):
            A namespace (user or an organization) and a repo name separated by a `/`.
        repo_type (`str`):
            Type of the repo to upload to: `"model"`, `"dataset"` or `"space"`.
        revision (`str`, `optional`):
            The revision of the repo to get the token for.
        headers (`Dict[str, str]`):
            Headers to use for the request, including authorization headers and user agent.
        endpoint (`str`, `optional`):
            The endpoint to use for the request. Defaults to the Hub endpoint.
        params (`Dict[str, str]`, `optional`):
            Additional parameters to pass with the request.
    Returns:
        `XetConnectionInfo`:
            The connection information needed to make the request to the xet storage service.
    Raises:
        [`~utils.HfHubHTTPError`]
            If the Hub API returned an error.
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If the Hub API response is improperly formatted.
    z/api/zs/z/xet-z-token/)r   r;   valuer=   )rA   rB   rC   r?   r*   r$   r@   r)   s           r   (fetch_xet_connection_info_from_repo_inforF   ~   sP    J $/xY5G5GHJeI;b	z7G7G6HPXz
ZC.sGVDDr   r)   c                     t               j                  || |      }t        |       t        |j                        }|t        d      |S )aS  
    Requests the xet connection info from the supplied URL. This includes the
    access token, expiration time, and endpoint to use for the xet storage service.
    Args:
        url: (`str`):
            The access token endpoint URL.
        headers (`Dict[str, str]`):
            Headers to use for the request, including authorization headers and user agent.
        params (`Dict[str, str]`, `optional`):
            Additional parameters to pass with the request.
    Returns:
        `XetConnectionInfo`:
            The connection information needed to make the request to the xet storage service.
    Raises:
        [`~utils.HfHubHTTPError`]
            If the Hub API returned an error.
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If the Hub API response is improperly formatted.
    )r*   r)   r@   z6Xet headers have not been correctly set by the server.)r
   getr   r7   r*   r5   )r)   r*   r@   respmetadatas        r   r=   r=      sJ    2 =W#fED5dllCHQRROr   )N)dataclassesr   enumr   typingr   r   requests r   r
   r   r   r   r   r   r!   Responser0   r7   r>   rF   r=   r   r   r   <module>rQ      s   !  !   D D3 
 $  
 $  0A0A h{F[ BDcN xPaGb 2 
 #	#=#= #s(^#= sm	#=
 #= #=L  #"'+&E&E &E 	&E
 sm&E #s(^&E sm&E T#s(^$&E &E &ER  (,	#s(^ T#s(^$ 	 r   