Skip to content

hololinked.core.zmq.message.EventMessage

Bases: ResponseMessage

Event message class for handling events in the system.

Message indices:

Index 0 1 2 3
Desc address header payload preserialized payload
Source code in hololinked/hololinked/core/zmq/message.py
class EventMessage(ResponseMessage):
    """
    Event message class for handling events in the system.

    Message indices:

    | Index | 0       | 1      |   2     |          3            |
    |-------|---------|--------|---------|-----------------------|
    | Desc  | address | header | payload | preserialized payload |

    """

    # For header's JSON schema, visit [here](https://hololinked.readthedocs.io/en/latest/protocols/zmq/event-message-header.json).

    @classmethod
    def craft_from_arguments(
        cls,
        event_id: str,
        sender_id: str,
        message_type: str = EVENT,
        payload: SerializableData = SerializableNone,
        preserialized_payload: PreserializedData = PreserializedEmptyByte,
    ) -> "EventMessage":
        """
        create a plain message with a certain type, for example a handshake message.

        Parameters
        ----------
        event_id: str
            id of the event (used by ZMQ pub-sub)
        sender_id: str
            id of the sender (ZMQ socket identity)
        message_type: str
            message type to be sent (`EVENT` usually)
        payload: SerializableData
            event payload to send to the client
        preserialized_payload: PreserializedData
            pre-encoded data, generally used for large or custom data that is already serialized

        Returns
        -------
        EventMessage
            the crafted message
        """
        message = EventMessage([])
        message._header = EventHeader(
            messageType=message_type,
            messageID=str(uuid4()),
            eventID=event_id,
            senderID=sender_id,
            payloadContentType=payload.content_type,
            preencodedPayloadContentType=preserialized_payload.content_type,
        )
        message._body = [payload, preserialized_payload]
        message._bytes = [
            bytes(event_id, encoding="utf-8"),
            bytes(),
            Serializers.json.dumps(message._header.json()),
            payload.serialize(),
            preserialized_payload.value,
        ]
        return message

    @property
    def event_id(self) -> str:
        """unique ID of the event by which ZMQ pub-sub works"""
        return self.header["eventID"]

    def parse_header(self) -> None:
        """parse the header"""
        if isinstance(self._bytes[INDEX_HEADER], EventHeader):
            self._header = self._bytes[INDEX_HEADER]
        elif isinstance(self._bytes[INDEX_HEADER], byte_types):
            self._header = EventHeader(**Serializers.json.loads(self._bytes[INDEX_HEADER]))
        else:
            raise ValueError(f"header must be of type ResponseHeader or bytes, not {type(self._bytes[INDEX_HEADER])}")

    def __str__(self) -> str:
        return f"EventMessage(id={self.id}, type={self.type}, header={self.header})"

Functions

event_id

event_id() -> str

unique ID of the event by which ZMQ pub-sub works

Source code in hololinked/hololinked/core/zmq/message.py
@property
def event_id(self) -> str:
    """unique ID of the event by which ZMQ pub-sub works"""
    return self.header["eventID"]

craft_from_arguments classmethod

craft_from_arguments(event_id: str, sender_id: str, message_type: str = EVENT, payload: SerializableData = SerializableNone, preserialized_payload: PreserializedData = PreserializedEmptyByte) -> EventMessage

create a plain message with a certain type, for example a handshake message.

Parameters:

Name Type Description Default

event_id

str

id of the event (used by ZMQ pub-sub)

required

sender_id

str

id of the sender (ZMQ socket identity)

required

message_type

str

message type to be sent (EVENT usually)

EVENT

payload

SerializableData

event payload to send to the client

SerializableNone

preserialized_payload

PreserializedData

pre-encoded data, generally used for large or custom data that is already serialized

PreserializedEmptyByte

Returns:

Type Description
EventMessage

the crafted message

Source code in hololinked/hololinked/core/zmq/message.py
@classmethod
def craft_from_arguments(
    cls,
    event_id: str,
    sender_id: str,
    message_type: str = EVENT,
    payload: SerializableData = SerializableNone,
    preserialized_payload: PreserializedData = PreserializedEmptyByte,
) -> "EventMessage":
    """
    create a plain message with a certain type, for example a handshake message.

    Parameters
    ----------
    event_id: str
        id of the event (used by ZMQ pub-sub)
    sender_id: str
        id of the sender (ZMQ socket identity)
    message_type: str
        message type to be sent (`EVENT` usually)
    payload: SerializableData
        event payload to send to the client
    preserialized_payload: PreserializedData
        pre-encoded data, generally used for large or custom data that is already serialized

    Returns
    -------
    EventMessage
        the crafted message
    """
    message = EventMessage([])
    message._header = EventHeader(
        messageType=message_type,
        messageID=str(uuid4()),
        eventID=event_id,
        senderID=sender_id,
        payloadContentType=payload.content_type,
        preencodedPayloadContentType=preserialized_payload.content_type,
    )
    message._body = [payload, preserialized_payload]
    message._bytes = [
        bytes(event_id, encoding="utf-8"),
        bytes(),
        Serializers.json.dumps(message._header.json()),
        payload.serialize(),
        preserialized_payload.value,
    ]
    return message