From 1ac9c3ad7243142b66a0af17ca998daccc5a65c0 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Sat, 28 Aug 2021 15:56:37 +0200 Subject: [PATCH] Added announce handler for faster initial link establishment. --- LXMF/LXMF.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/LXMF/LXMF.py b/LXMF/LXMF.py index 44e25af..cfe0d97 100644 --- a/LXMF/LXMF.py +++ b/LXMF/LXMF.py @@ -463,10 +463,28 @@ class LXMessage: return None +class LXMFDeliveryAnnounceHandler: + def __init__(self, lxmrouter): + self.aspect_filter = APP_NAME+".delivery" + self.lxmrouter = lxmrouter + + def received_announce(self, destination_hash, announced_identity, app_data): + for lxmessage in self.lxmrouter.pending_outbound: + if destination_hash == lxmessage.destination_hash: + if lxmessage.method == LXMessage.DIRECT: + lxmessage.next_delivery_attempt = time.time() + + while self.lxmrouter.processing_outbound: + time.sleep(0.1) + + self.lxmrouter.process_outbound() + + class LXMRouter: MAX_DELIVERY_ATTEMPTS = 3 PROCESSING_INTERVAL = 5 DELIVERY_RETRY_WAIT = 15 + PATH_REQUEST_WAIT = 5 LINK_MAX_INACTIVITY = 10*60 def __init__(self): @@ -483,6 +501,8 @@ class LXMRouter: self.lxmf_query_destination = RNS.Destination(None, RNS.Destination.IN, RNS.Destination.PLAIN, APP_NAME, "query") self.propagation_destination = RNS.Destination(self.identity, RNS.Destination.IN, RNS.Destination.SINGLE, APP_NAME, "propagation") + RNS.Transport.register_announce_handler(LXMFDeliveryAnnounceHandler(self)) + self.__delivery_callback = None job_thread = threading.Thread(target=self.jobloop) @@ -680,6 +700,7 @@ class LXMRouter: if not hasattr(lxmessage, "next_delivery_attempt") or time.time() > lxmessage.next_delivery_attempt: lxmessage.delivery_attempts += 1 lxmessage.next_delivery_attempt = time.time() + LXMRouter.DELIVERY_RETRY_WAIT + if lxmessage.delivery_attempts < LXMRouter.MAX_DELIVERY_ATTEMPTS: if RNS.Transport.has_path(lxmessage.get_destination().hash): RNS.log("Establishing link to "+RNS.prettyhexrep(lxmessage.get_destination().hash)+" for delivery attempt "+str(lxmessage.delivery_attempts)+" to "+RNS.prettyhexrep(lxmessage.get_destination().hash), RNS.LOG_DEBUG) @@ -689,6 +710,7 @@ class LXMRouter: else: RNS.log("No path known for delivery attempt "+str(lxmessage.delivery_attempts)+" to "+RNS.prettyhexrep(lxmessage.get_destination().hash)+". Requesting path...", RNS.LOG_DEBUG) RNS.Transport.request_path(lxmessage.get_destination().hash) + lxmessage.next_delivery_attempt = time.time() + LXMRouter.PATH_REQUEST_WAIT else: RNS.log("Max delivery attempts reached for direct "+str(lxmessage)+" to "+RNS.prettyhexrep(lxmessage.get_destination().hash), RNS.LOG_DEBUG) self.fail_message(lxmessage)