o
    i                     @  s   U d dl mZ d dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
mZ d dlmZ e
d ZdZded< er9d dlZed	d
G dd de	e ZdddZedZdddZdS )    )annotationsN)	dataclass)TYPE_CHECKINGAnyGenericLiteralOptional)OutputT   OperationTokenTypeOPERATION_TOKEN_TYPE_WORKFLOWT)frozenc                   @  sb   e Zd ZU dZded< ded< dZded< 	ddddZedddZdddZ	edddZ
dS )WorkflowHandlea  A handle to a workflow that is backing a Nexus operation.

    .. warning::
        This API is experimental and unstable.

    Do not instantiate this directly. Use
    :py:func:`temporalio.nexus.WorkflowRunOperationContext.start_workflow` to create a
    handle.
    str	namespaceworkflow_idNzOptional[int]versionclienttemporalio.client.Clientresult_typeOptional[type[OutputT]]return.temporalio.client.WorkflowHandle[Any, OutputT]c                 C  s4   |j | j krtd|j  d| j  |j| j|dS )zECreate a :py:class:`temporalio.client.WorkflowHandle` from the token.zClient namespace z* does not match operation token namespace )r   )r   
ValueErrorget_workflow_handler   )selfr   r    r   ]/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/temporalio/nexus/_token.py_to_client_workflow_handle#   s   
z)WorkflowHandle._to_client_workflow_handleworkflow_handleWorkflowHandle[OutputT]c                 C  s   | |j j|jdS )aK  Create a :py:class:`WorkflowHandle` from a :py:class:`temporalio.client.WorkflowHandle`.

        This is a private method not intended to be used by users. It does not check
        that the supplied client.WorkflowHandle references a workflow that has been
        instrumented to supply the result of a Nexus operation.
        )r   r   )_clientr   id)clsr   r   r   r   #_unsafe_from_client_workflow_handle2   s   
z2WorkflowHandle._unsafe_from_client_workflow_handlec                 C  s$   t tjt| j| jddddS )z3Convert handle to a base64url-encoded token string.)tnswid),:)
separatorsutf-8)_base64url_encode_no_paddingjsondumpsr   r   r   encode)r   r   r   r   to_tokenA   s   zWorkflowHandle.to_tokentokenc           	   
   C  s*  |st dzt|}W n ty } zt d|d}~ww z
t|d}W n ty9 } zt d|d}~ww t|tsHt dt| |	d}|t
kr[t d| d	t
 |	d
}|durl|dkrlt d|	d}|rxt|ts|t d|	d}|du st|tst d| |||dS )zODecodes and validates a token from its base64url-encoded string representation.z&invalid workflow token: token is emptyz#failed to decode token as base64urlNr+   z,failed to unmarshal workflow operation tokenz+invalid workflow token: expected dict, got r%   zinvalid workflow token type: z, expected: vr   zGinvalid workflow token: 'v' field, if present, must be 0 or null/absentr'   zGinvalid workflow token: missing, empty, or non-string workflow ID (wid)r&   z<invalid workflow token: missing or non-string namespace (ns))r   r   r   )	TypeError_base64url_decode_no_padding	Exceptionr-   loadsdecode
isinstancedicttypegetr   r   )	r#   r1   decoded_byteserrworkflow_operation_token
token_typer   r   r   r   r   r   
from_tokenN   sV   






zWorkflowHandle.from_token)N)r   r   r   r   r   r   )r   r   r   r    )r   r   )r1   r   r   r    )__name__
__module____qualname____doc____annotations__r   r   classmethodr$   r0   r@   r   r   r   r   r      s   
 

r   databytesr   r   c                 C  s   t | ddS )Nr+   =)base64urlsafe_b64encoder7   rstrip)rG   r   r   r   r,      s   r,   z@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-sc                 C  s>   t | t  }rtd| dt|  d  }t| | S )Nz?invalid base64URL encoded string: contains invalid characters: rI      )set_base64_url_alphabetr   lenrJ   urlsafe_b64decode)rM   invalid_charspaddingr   r   r   r4      s   r4   )rG   rH   r   r   )rM   r   r   rH   )
__future__r   rJ   r-   dataclassesr   typingr   r   r   r   r   nexusrpcr	   r   r   rE   temporalio.client
temporalior   r,   rO   rP   r4   r   r   r   r   <module>   s"    
o