12
12
import uuid
13
13
from binascii import crc32
14
14
from collections .abc import Callable , Iterator , Mapping
15
- from dataclasses import dataclass
15
+ from dataclasses import dataclass , field
16
16
from io import BytesIO
17
17
from struct import pack , unpack
18
18
from types import MappingProxyType
@@ -147,6 +147,7 @@ def __post_init__(self):
147
147
raise InvalidPayloadLength (payload_length )
148
148
149
149
150
+ @dataclass (kw_only = True , eq = False )
150
151
class EventMessage :
151
152
"""A message that may be sent over an event stream.
152
153
@@ -186,76 +187,31 @@ class EventMessage:
186
187
message.
187
188
"""
188
189
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.
222
192
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
+ """
233
197
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."""
237
200
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 ))
241
206
242
207
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 ()
249
211
250
212
def encode (self ) -> bytes :
251
213
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
259
215
)
260
216
261
217
def __eq__ (self , other : object ) -> bool :
@@ -325,8 +281,9 @@ def decode(cls, source: BytesReader) -> Self | None:
325
281
326
282
_validate_checksum (prelude_crc_bytes + message_bytes , crc , prelude_crc )
327
283
284
+ headers_bytes = message_bytes [: prelude .headers_length ]
328
285
message = EventMessage (
329
- headers_bytes = message_bytes [: prelude . headers_length ] ,
286
+ headers = EventHeaderDecoder ( headers_bytes ). decode_headers () ,
330
287
payload = message_bytes [prelude .headers_length :],
331
288
)
332
289
return cls (prelude , message , crc )
@@ -369,8 +326,9 @@ async def decode_async(cls, source: AsyncByteStream) -> Self | None:
369
326
370
327
_validate_checksum (prelude_crc_bytes + message_bytes , crc , prelude_crc )
371
328
329
+ headers_bytes = message_bytes [: prelude .headers_length ]
372
330
message = EventMessage (
373
- headers_bytes = message_bytes [: prelude . headers_length ] ,
331
+ headers = EventHeaderDecoder ( headers_bytes ). decode_headers () ,
374
332
payload = message_bytes [prelude .headers_length :],
375
333
)
376
334
return cls (prelude , message , crc )
@@ -647,7 +605,7 @@ def unpack_int8(data: BytesLike):
647
605
:returns: A tuple containing the (parsed integer value, bytes consumed)
648
606
"""
649
607
value = unpack (_DecodeUtils .INT8_BYTE_FORMAT , data [:1 ])[0 ]
650
- return value , 1
608
+ return Byte ( value ) , 1
651
609
652
610
@staticmethod
653
611
def unpack_int16 (data : BytesLike ) -> tuple [int , int ]:
@@ -657,7 +615,7 @@ def unpack_int16(data: BytesLike) -> tuple[int, int]:
657
615
:returns: A tuple containing the (parsed integer value, bytes consumed)
658
616
"""
659
617
value = unpack (_DecodeUtils .INT16_BYTE_FORMAT , data [:2 ])[0 ]
660
- return value , 2
618
+ return Short ( value ) , 2
661
619
662
620
@staticmethod
663
621
def unpack_int32 (data : BytesLike ) -> tuple [int , int ]:
@@ -677,7 +635,7 @@ def unpack_int64(data: BytesLike) -> tuple[int, int]:
677
635
:returns: A tuple containing the (parsed integer value, bytes consumed)
678
636
"""
679
637
value = unpack (_DecodeUtils .INT64_BYTE_FORMAT , data [:8 ])[0 ]
680
- return value , 8
638
+ return Long ( value ) , 8
681
639
682
640
@staticmethod
683
641
def unpack_byte_array (
0 commit comments