
    qiL                         d Z ddlZddlZddlmZ ddlmZ ddlmc m	c m
Z ddlmZmZmZmZmZmZmZmZ ddlmZ ej.                   G d d             Z G d	 d
e      Zy)z)Protobuf frame serialization for Pipecat.    N)Optional)logger)FrameInputAudioRawFrameInputTransportMessageFrameOutputAudioRawFrameOutputTransportMessageFrame!OutputTransportMessageUrgentFrame	TextFrameTranscriptionFrame)FrameSerializerc                       e Zd ZU dZeed<   y)MessageFramezData class for converting transport messages into Protobuf format.

    Parameters:
        data: JSON-encoded message data for transport.
    dataN)__name__
__module____qualname____doc__str__annotations__     N/opt/pipecat/venv/lib/python3.12/site-packages/pipecat/serializers/protobuf.pyr   r      s     Ir   r   c                   X   e Zd ZdZedededediZej                         D  ci c]  \  }}||
 c}}} Z
edededediZej                         D  ci c]  \  }}||
 c}}} Zddeej                      ffdZd	ed
eez  dz  fdZdeez  d
edz  fdZxZS c c}}} w c c}}} w )ProtobufFrameSerializera#  Serializer for converting Pipecat frames to/from Protocol Buffer format.

    Provides efficient binary serialization for frame transport over network
    connections. Supports text, audio, transcription, and message frames with
    automatic conversion between transport message types.
    textaudiotranscriptionmessageNparamsc                 $    t         |   |       y)zoInitialize the Protobuf frame serializer.

        Args:
            params: Configuration parameters.
        N)super__init__)selfr    	__class__s     r   r#   z ProtobufFrameSerializer.__init__@   s     	 r   framereturnc                 r  K   t        |t        t        f      r;| j                  |      ryt	        t        j                  |j                              }t        j                         }t        |      | j                  vr#t        j                  dt        |       d       y| j                  t        |         }t        ||      }t        j                   |      D ]I  }t        ||j"                        }|st%        ||j"                        s3t'        ||j"                  |       K |j)                         S w)zSerialize a frame to Protocol Buffer binary format.

        Args:
            frame: The frame to serialize.

        Returns:
            Serialized frame as bytes, or None if frame type is not serializable.
        N)r   zFrame type z is not serializable)
isinstancer	   r
   should_ignore_framer   jsondumpsr   frame_protosr   typeSERIALIZABLE_TYPESr   warninggetattrdataclassesfieldsnamehasattrsetattrSerializeToString)r$   r&   proto_frameproto_optional_name
proto_attrfieldvalues          r   	serializez!ProtobufFrameSerializer.serializeH   s     e9;\]^''. ZZ.E #((*;d555NN[e5IJK #55d5kB[*=>
 ''. 	7EE5::.EUZZ8
EJJ6	7
 ,,..s   C4D77D7)D7r   c                 f  K   t         j                  j                  |      }|j                  d      }|| j                  vrt        j                  d       y| j                  |   }t        ||      }i }|j                  j                  |   j                  j                  D ]%  }t        ||j                        ||j                  <   ' t        |dd      }t        |dd      }	t        |dd      }
d|v r|d= d|v r|d= d|v r|d= |t        k(  r>	 t        j                  |d         }t!        |      }t        j"                  d	|        n |di |}|rt'        |d|       |	rt'        |d|	       |
rt'        |d|
       |S # t$        $ r"}t        j                  d
|        Y d}~yd}~ww xY ww)zDeserialize Protocol Buffer binary data to a frame.

        Args:
            data: Binary protobuf data to deserialize.

        Returns:
            Deserialized frame instance, or None if deserialization fails.
        r&   z#Unable to deserialize a valid frameNidr4   ptsr   )r   z+ProtobufFrameSerializer: Transport message z!Error parsing MessageFrame data: r   )r-   r   
FromString
WhichOneofDESERIALIZABLE_FIELDSr   errorr1   
DESCRIPTORfields_by_namemessage_typer3   r4   r   r+   loadsr   debug	Exceptionr6   )r$   r   protowhich
class_nameargs	args_dictr;   r?   r4   r@   msginstancees                 r   deserializez#ProtobufFrameSerializer.deserializeh   s     ""--d3  )222LL>?//6
ue$	%%44U;HHOO 	>E$+D%**$=Iejj!	> T4&tVT*dE4(9$Y&!I%  %jj6!235cBJ8*UV ".I.H HdB'Hfd+HeS)  @DEs0   DF1<F 8F1	F.F)$F1)F..F1)N)r   r   r   r   r   r   r   r   r/   itemsSERIALIZABLE_FIELDSr   DESERIALIZABLE_TYPESrC   r   r   InputParamsr#   r   r   bytesr=   rS   __classcell__).0kvr%   s   000@r   r   r   (   s     	6WOi	 -?,D,D,FGGDAq1a4G 	6GOi	 /C.H.H.JKKdaQTK!x(C(CD !/U /sU{T/A /@5cEk 5edl 5e H Ls   BB%r   )r   r2   r+   typingr   logurur   #pipecat.frames.protobufs.frames_pb2frames	protobufs
frames_pb2r-   pipecat.frames.framesr   r   r   r   r	   r
   r   r   #pipecat.serializers.base_serializerr   	dataclassr   r   r   r   r   <module>rf      s^    0     : :	 	 	 @   uo ur   