Coverage for src / lexigram / contracts / queue / types.py: 100%
29 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-19 05:41 +0800
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-19 05:41 +0800
1# lexigram-contracts/src/lexigram/contracts/queue/types.py
2"""Queue value types."""
4from __future__ import annotations
6from dataclasses import dataclass, field
7from enum import StrEnum
8import time
9from typing import Any
10import uuid
13class DeliveryGuarantee(StrEnum):
14 """Message delivery guarantees supported by queue backends.
16 Attributes:
17 AT_MOST_ONCE: Message may be lost but is never duplicated.
18 AT_LEAST_ONCE: Message may be duplicated but is never lost.
19 EXACTLY_ONCE: Message is delivered exactly once (best effort).
20 """
22 AT_MOST_ONCE = "at_most_once"
23 AT_LEAST_ONCE = "at_least_once"
24 EXACTLY_ONCE = "exactly_once"
27@dataclass(frozen=True)
28class BusMessage:
29 """A message transported through the queue backend.
31 ``id`` defaults to a new UUID4. ``timestamp`` defaults to the current
32 wall-clock time. Both are set via field defaults so callers do not need
33 to supply them.
35 Attributes:
36 id: Unique message identifier.
37 topic: Destination topic or queue name.
38 payload: Arbitrary message body; must be serialisable by the backend.
39 headers: Opaque string key-value headers passed to the broker.
40 timestamp: Unix epoch timestamp when the message was created.
41 ttl: Time-to-live in seconds; ``None`` uses the backend default.
42 priority: Message priority (higher = more urgent); backend-dependent.
43 delivery_guarantee: Delivery semantics for this message.
44 retry_count: Number of times this message has been retried.
45 max_retries: Maximum retries before routing to DLQ.
46 """
48 id: str = field(default_factory=lambda: str(uuid.uuid4()))
49 topic: str = ""
50 payload: Any = None
51 headers: dict[str, str] = field(default_factory=dict)
52 timestamp: float = field(default_factory=time.time)
53 ttl: float | None = None
54 priority: int = 0
55 delivery_guarantee: DeliveryGuarantee = DeliveryGuarantee.AT_LEAST_ONCE
56 retry_count: int = 0
57 max_retries: int = 3
59 def is_expired(self) -> bool:
60 """Return ``True`` if the message TTL has elapsed."""
61 if self.ttl is None:
62 return False
63 return time.time() > self.timestamp + self.ttl
65 def should_retry(self) -> bool:
66 """Return ``True`` if the message may be retried."""
67 return self.retry_count < self.max_retries and not self.is_expired()
70__all__ = ["BusMessage", "DeliveryGuarantee"]