o
    `۷i                     @   s   U d dl Z d dlZd dlmZmZmZ d dlmZ d dlm	Z	 zd dl
Z
W n ey0   dZ
Y nw zd dlZW n eyB   dZY nw e e	ZG dd dZi aeeeef df ed< G d	d dZd
d ZdS )    N)AnyDictTuple)cloudpickle)SERVE_LOGGER_NAMEc                   @   s$   e Zd ZdZdZdZdZdZdZdS )SerializationMethodz6Available serialization methods for RPC communication.r   picklemsgpackorjsonnoopN)	__name__
__module____qualname____doc__CLOUDPICKLEPICKLEMSGPACKORJSONNOOP r   r   V/home/ubuntu/vllm_env/lib/python3.10/site-packages/ray/serve/_private/serialization.pyr      s    r   RPCSerializer_serializer_cachec                   @   s  e Zd ZdZejejfdedefddZeejejfdededd fddZ	d	d
 Z
dd Zdedeeef fddZdeeef fddZdeeef fddZdeeef fddZdeeef fddZdedefddZdedefddZdedefddZdedefd d!Zd"S )#r   zISerializer for RPC communication with configurable serialization methods.request_methodresponse_methodc                 C   s(   |  | _|  | _|   |   d S N)lowerr   r   _validate_methods_setup_serializers)selfr   r   r   r   r   __init__&   s   

zRPCSerializer.__init__returnc                 C   s6   |  }|  }||f}|tvr| ||t|< t| S )a  Get a cached serializer instance to avoid per-request instantiation overhead.

        This method maintains a cache of serializer instances based on
        (request_method, response_method) pairs, significantly reducing overhead
        in high-throughput systems.
        )r   r   )clsr   r   
req_methodresp_method	cache_keyr   r   r   get_cached_serializer0   s   z#RPCSerializer.get_cached_serializerc                 C   s\   t jt jt jt jt jh}| j|vrtd| j d| | j|vr,td| j d| dS )z6Validate that the serialization methods are supported.z*Unsupported request serialization method: z. Valid options: z+Unsupported response serialization method: N)	r   r   r   r   r   r   r   
ValueErrorr   )r   valid_methodsr   r   r   r   F   s&   



zRPCSerializer._validate_methodsc                 C   s,   |  | j\| _| _|  | j\| _| _dS )z@Setup the serialization functions based on the selected methods.N)_get_serializer_funcsr   _request_dumps_request_loadsr   _response_dumps_response_loads)r   r   r   r   r   \   s   z RPCSerializer._setup_serializersmethodc                 C   sb   |t jkrtjtjfS |t jkr|  S |t jkr|  S |t j	kr&| 
 S |t jkr/|  S dS )z?Get dumps and loads functions for a given serialization method.N)r   r   r   dumpsloadsr   _get_pickle_funcsr   _get_msgpack_funcsr   _get_orjson_funcsr   _get_noop_funcs)r   r.   r   r   r   r)   e   s   




z#RPCSerializer._get_serializer_funcsc                 C   ,   dt dtfdd}dtdt fdd}||fS )z2Get no-op serialization functions for binary data.objr!   c                 S   $   t | tstdt| j d| S Nz%a bytes-like object is required, got z;. Use a different serialization method for non-binary data.
isinstancebytes	TypeErrortyper   r6   r   r   r   _noop_dumpsu   
   
z2RPCSerializer._get_noop_funcs.<locals>._noop_dumpsdatac                 S   r7   r8   r9   rA   r   r   r   _noop_loads}   r@   z2RPCSerializer._get_noop_funcs.<locals>._noop_loadsr   r;   )r   r?   rC   r   r   r   r4   r   s   zRPCSerializer._get_noop_funcsc                 C   r5   )z9Get pickle serialization functions with highest protocol.r6   r!   c                 S   s   t j| t jdS )N)protocol)r   r/   HIGHEST_PROTOCOLr>   r   r   r   _pickle_dumps   s   z6RPCSerializer._get_pickle_funcs.<locals>._pickle_dumpsrA   c                 S   
   t | S r   )r   r0   rB   r   r   r   _pickle_loads      
z6RPCSerializer._get_pickle_funcs.<locals>._pickle_loadsrD   )r   rG   rI   r   r   r   r1      s   zRPCSerializer._get_pickle_funcsc                 C   <   t du rtddtdtfdd}dtdtfdd	}||fS )
z$Get msgpack serialization functions.NzKormsgpack is not installed. Please install it with `pip install ormsgpack`.r6   r!   c                 S   rH   r   )	ormsgpackpackbr>   r   r   r   _msgpack_dumps   rJ   z8RPCSerializer._get_msgpack_funcs.<locals>._msgpack_dumpsrA   c                 S   rH   r   )rL   unpackbrB   r   r   r   _msgpack_loads   rJ   z8RPCSerializer._get_msgpack_funcs.<locals>._msgpack_loads)rL   ImportErrorr   r;   )r   rN   rP   r   r   r   r2      s   z RPCSerializer._get_msgpack_funcsc                 C   rK   )
z#Get orjson serialization functions.NzEorjson is not installed. Please install it with `pip install orjson`.r6   r!   c              
   S   s6   zt | W S  ty } ztd| dd }~ww )Nzorjson serialization failed: zw. Only JSON-serializable types are supported with orjson. Consider using 'cloudpickle' or 'pickle' for complex objects.)r
   r/   r<   )r6   er   r   r   _orjson_dumps   s   
z6RPCSerializer._get_orjson_funcs.<locals>._orjson_dumpsrA   c                 S   rH   r   )r
   r0   rB   r   r   r   _orjson_loads   rJ   z6RPCSerializer._get_orjson_funcs.<locals>._orjson_loads)r
   rQ   r   r;   )r   rS   rT   r   r   r   r3      s   
zRPCSerializer._get_orjson_funcsr6   c                 C   
   |  |S )z$Serialize a request object to bytes.)r*   r   r6   r   r   r   dumps_request      
zRPCSerializer.dumps_requestrA   c                 C   rU   )z&Deserialize bytes to a request object.)r+   r   rA   r   r   r   loads_request   rX   zRPCSerializer.loads_requestc                 C   rU   )z%Serialize a response object to bytes.)r,   rV   r   r   r   dumps_response   rX   zRPCSerializer.dumps_responsec                 C   rU   )z'Deserialize bytes to a response object.)r-   rY   r   r   r   loads_response   rX   zRPCSerializer.loads_responseN)r   r   r   r   r   r   strr    classmethodr&   r   r   r   r   r)   r4   r1   r2   r3   r;   rW   rZ   r[   r\   r   r   r   r   r   #   s<    

	c                   C   s   t   dS )zOClear the cached serializer instances. Useful for testing or memory management.N)r   clearr   r   r   r   clear_serializer_cache   s   r`   )loggingr   typingr   r   r   rayr   ray.serve._private.constantsr   r
   rQ   rL   	getLoggerloggerr   r   r]   __annotations__r   r`   r   r   r   r   <module>   s*   
 
 *