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