o
    ci                  	   @   s   d Z ddl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 er<dd	lmZ ddlZG d
d de	jZG dd dejZ	ddededddefddZdddddedddefddZdS )a  Implements the client side of the client/server pickling protocol.

These picklers are aware of the server internals and can find the
references held for the client within the server.

More discussion about the client/server pickling protocol can be found in:

  ray/util/client/client_pickler.py

ServerPickler dumps ray objects from the server into the appropriate stubs.
ClientUnpickler loads stubs from the client and finds their associated handle
in the server instance.
    N)Any)TYPE_CHECKING)disable_client_hook)
PickleStub)ClientReferenceActor)ClientReferenceFunction)RayletServicerc                       s.   e Zd Zdeddf fddZdd Z  ZS )ServerPickler	client_idserverr   c                    s"   t  j|i | || _|| _d S N)super__init__r
   r   )selfr
   r   argskwargs	__class__ Y/home/ubuntu/.local/lib/python3.10/site-packages/ray/util/client/server/server_pickler.pyr   !   s   
zServerPickler.__init__c                 C   s   t |tjr&| }|| jj| j vr|| jj| j |< td| j|d d dS t |tjj	r^|j
 }|| jjvr>|| jj|< || jj| j vrQ| jj| j | td| j|j
 d d dS d S )NObject)typer
   ref_idnamebaseline_optionsActor)
isinstanceray	ObjectRefbinaryr   object_refsr
   r   actorActorHandle	_actor_id
actor_refsactor_ownersadd)r   objobj_idactor_idr   r   r   persistent_id&   s2   
zServerPickler.persistent_id)__name__
__module____qualname__strr   r*   __classcell__r   r   r   r   r	       s    r	   c                       s$   e Zd Z fddZdd Z  ZS )ClientUnpicklerc                    s   t  j|i | || _d S r   )r   r   r   )r   r   r   r   r   r   r   r   F   s   
zClientUnpickler.__init__c                 C   s   t |tsJ |jdkrtS |jdkr| jj|j |j S |jdkr)| jj|j S |jdkr5t	|j|jS |jdkrE| j
|j|j|jS |jdkrQt|j|jS |jdkra| j|j|j|jS |jdkrs| jj|j }t||jS td	)
NRayr   r   RemoteFuncSelfReference
RemoteFuncRemoteActorSelfReferenceRemoteActorRemoteMethodzUncovered client data type)r   r   r   r   r   r    r
   r   r$   r   lookup_or_register_funcr   r   lookup_or_register_actorgetattrr   NotImplementedError)r   pidr!   r   r   r   persistent_loadJ   s.   







zClientUnpickler.persistent_load)r+   r,   r-   r   r<   r/   r   r   r   r   r0   E   s    r0   r'   r
   server_instancer   returnc                 C   sN   t  }t||||d}||  | W  d    S 1 s w   Y  d S )N)protocol)ioBytesIOr	   dumpgetvalue)r'   r
   r=   r?   filespr   r   r   dumps_from_servere   s
   

$rF   TASCIIstrict)fix_importsencodingerrorsdatac                C   sZ   t    t| trtdt| }t||||d W  d    S 1 s&w   Y  d S )Nz%Can't load pickle from unicode string)rI   rJ   )r   r   r.   	TypeErrorr@   rA   r0   load)rL   r=   rI   rJ   rK   rD   r   r   r   loads_from_clientn   s   

$rO   r   )__doc__r@   r   typingr   r   ray._private.client_mode_hookr   ray.cloudpicklecloudpickleray.util.client.client_picklerr   #ray.util.client.server.server_stubsr   r   ray.util.client.server.serverr   pickleCloudPicklerr	   	Unpicklerr0   r.   bytesrF   rO   r   r   r   r   <module>   sF    %!
