1212import uuid
1313from binascii import crc32
1414from collections .abc import Callable , Iterator , Mapping
15- from dataclasses import dataclass
15+ from dataclasses import dataclass , field
1616from io import BytesIO
1717from struct import pack , unpack
1818from types import MappingProxyType
@@ -147,6 +147,7 @@ def __post_init__(self):
147147 raise InvalidPayloadLength (payload_length )
148148
149149
150+ @dataclass (kw_only = True , eq = False )
150151class EventMessage :
151152 """A message that may be sent over an event stream.
152153
@@ -186,76 +187,31 @@ class EventMessage:
186187 message.
187188 """
188189
189- def __init__ (
190- self ,
191- * ,
192- headers : HEADERS_DICT | None = None ,
193- headers_bytes : bytes | None = None ,
194- payload : bytes = b"" ,
195- ) -> None :
196- """Initialize an EventMessage.
197-
198- :param headers: The headers present in the event message. If this parameter is
199- unspecified, the default value will be the decoded value of the
200- `headers_bytes` parameter.
201-
202- Sized integer values may be indicated for the purpose of serialization
203- using the `Byte`, `Short`, or `Long` types. int values of unspecified size
204- will be assumed to be 32-bit.
205-
206- :param headers_bytes: The serialized bytes of the headers present in the event
207- message.
208-
209- :param payload: The serialized bytes of the message payload.
210- """
211- self ._payload = payload
212- self ._headers_bytes = headers_bytes
213-
214- if len (payload ) > MAX_PAYLOAD_LENGTH :
215- raise InvalidPayloadLength (len (payload ))
216-
217- if headers_bytes is None :
218- if headers is None :
219- headers = {}
220- elif headers is None :
221- headers = EventHeaderDecoder (headers_bytes ).decode_headers ()
190+ headers : HEADERS_DICT = field (default_factory = dict )
191+ """The headers present in the event message.
222192
223- self ._headers = headers
224-
225- @property
226- def payload (self ) -> bytes :
227- """The serialized bytes of the message payload.
228-
229- These bytes may be in any format or media type. The `:content-type` header, if
230- present, indicates the media type.
231- """
232- return self ._payload
193+ Sized integer values may be indicated for the purpose of serialization
194+ using the `Byte`, `Short`, or `Long` types. int values of unspecified size
195+ will be assumed to be 32-bit.
196+ """
233197
234- @property
235- def headers (self ) -> HEADERS_DICT :
236- """The headers of the event message.
198+ payload : bytes = b""
199+ """The serialized bytes of the message payload."""
237200
238- Headers prefixed with `:` contain metadata by convention.
239- """
240- return self ._headers
201+ def __post_init__ (
202+ self ,
203+ ) -> None :
204+ if len (self .payload ) > MAX_PAYLOAD_LENGTH :
205+ raise InvalidPayloadLength (len (self .payload ))
241206
242207 def _get_headers_bytes (self ) -> bytes :
243- if self ._headers_bytes is None :
244- encoder = EventHeaderEncoder ()
245- encoder .encode_headers (self ._headers )
246- self ._headers_bytes = encoder .get_result ()
247-
248- return self ._headers_bytes
208+ encoder = EventHeaderEncoder ()
209+ encoder .encode_headers (self .headers )
210+ return encoder .get_result ()
249211
250212 def encode (self ) -> bytes :
251213 return _EventEncoder ().encode_bytes (
252- headers = self ._get_headers_bytes (), payload = self ._payload
253- )
254-
255- def __repr__ (self ) -> str :
256- return (
257- f"EventMessage(payload={ self ._payload !r} , headers={ self .headers !r} , "
258- f"headers_bytes={ self ._get_headers_bytes ()!r} )"
214+ headers = self ._get_headers_bytes (), payload = self .payload
259215 )
260216
261217 def __eq__ (self , other : object ) -> bool :
@@ -325,8 +281,9 @@ def decode(cls, source: BytesReader) -> Self | None:
325281
326282 _validate_checksum (prelude_crc_bytes + message_bytes , crc , prelude_crc )
327283
284+ headers_bytes = message_bytes [: prelude .headers_length ]
328285 message = EventMessage (
329- headers_bytes = message_bytes [: prelude . headers_length ] ,
286+ headers = EventHeaderDecoder ( headers_bytes ). decode_headers () ,
330287 payload = message_bytes [prelude .headers_length :],
331288 )
332289 return cls (prelude , message , crc )
@@ -369,8 +326,9 @@ async def decode_async(cls, source: AsyncByteStream) -> Self | None:
369326
370327 _validate_checksum (prelude_crc_bytes + message_bytes , crc , prelude_crc )
371328
329+ headers_bytes = message_bytes [: prelude .headers_length ]
372330 message = EventMessage (
373- headers_bytes = message_bytes [: prelude . headers_length ] ,
331+ headers = EventHeaderDecoder ( headers_bytes ). decode_headers () ,
374332 payload = message_bytes [prelude .headers_length :],
375333 )
376334 return cls (prelude , message , crc )
@@ -647,7 +605,7 @@ def unpack_int8(data: BytesLike):
647605 :returns: A tuple containing the (parsed integer value, bytes consumed)
648606 """
649607 value = unpack (_DecodeUtils .INT8_BYTE_FORMAT , data [:1 ])[0 ]
650- return value , 1
608+ return Byte ( value ) , 1
651609
652610 @staticmethod
653611 def unpack_int16 (data : BytesLike ) -> tuple [int , int ]:
@@ -657,7 +615,7 @@ def unpack_int16(data: BytesLike) -> tuple[int, int]:
657615 :returns: A tuple containing the (parsed integer value, bytes consumed)
658616 """
659617 value = unpack (_DecodeUtils .INT16_BYTE_FORMAT , data [:2 ])[0 ]
660- return value , 2
618+ return Short ( value ) , 2
661619
662620 @staticmethod
663621 def unpack_int32 (data : BytesLike ) -> tuple [int , int ]:
@@ -677,7 +635,7 @@ def unpack_int64(data: BytesLike) -> tuple[int, int]:
677635 :returns: A tuple containing the (parsed integer value, bytes consumed)
678636 """
679637 value = unpack (_DecodeUtils .INT64_BYTE_FORMAT , data [:8 ])[0 ]
680- return value , 8
638+ return Long ( value ) , 8
681639
682640 @staticmethod
683641 def unpack_byte_array (
0 commit comments