Source code for edri.switch.sender

"""Switch -> Connector sender. The mailbox owns all unacknowledged frames."""
from logging import getLogger
from threading import Thread
from uuid import UUID

from edri.protocol.channel import SecureChannel
from edri.protocol.delivery import encode_delivery
from edri.protocol.frame import ZERO_TARGET, FrameType
from edri.switch.connection import Connection


[docs] class Sender(Thread): def __init__(self, connection: Connection, router_id: UUID) -> None: super().__init__(daemon=True, name=f"switch-sender-{router_id}") self.connection = connection self.router_id = router_id self.logger = getLogger(f"{__name__}.{router_id}")
[docs] def run(self) -> None: channel = self.connection.channel if channel is None: return sent: set[UUID] = set() while not self.connection.stop.is_set(): delivery = self.connection.mailbox.next_unsent(sent, self.connection.stop) if delivery is None: return try: channel.send(FrameType.EVENT, ZERO_TARGET, encode_delivery(delivery)) except Exception: self.logger.warning("Delivery %s failed; retained for reconnect", delivery.id, exc_info=True) self.connection.disconnect() return