diff --git a/nostr/message_pool.py b/nostr/message_pool.py index d364cf2..21895b9 100644 --- a/nostr/message_pool.py +++ b/nostr/message_pool.py @@ -24,11 +24,18 @@ class EndOfStoredEventsMessage: self.url = url +class AuthMessage: + def __init__(self, challenge: str, url: str) -> None: + self.challenge = challenge + self.url = url + + class MessagePool: def __init__(self) -> None: self.events: Queue[EventMessage] = Queue() self.notices: Queue[NoticeMessage] = Queue() self.eose_notices: Queue[EndOfStoredEventsMessage] = Queue() + self.auths: Queue[AuthMessage] = Queue() self._unique_events: set = set() self.lock: Lock = Lock() @@ -44,6 +51,9 @@ class MessagePool: def get_eose_notice(self): return self.eose_notices.get() + def get_auth(self): + return self.auth.get() + def has_events(self): return self.events.qsize() > 0 @@ -53,6 +63,9 @@ class MessagePool: def has_eose_notices(self): return self.eose_notices.qsize() > 0 + def has_auths(self): + return self.auths.qsize() > 0 + def _process_message(self, message: str, url: str): message_json = json.loads(message) message_type = message_json[0] @@ -75,3 +88,5 @@ class MessagePool: self.notices.put(NoticeMessage(message_json[1], url)) elif message_type == RelayMessageType.END_OF_STORED_EVENTS: self.eose_notices.put(EndOfStoredEventsMessage(message_json[1], url)) + elif message_type == RelayMessageType.AUTH: + self.auths.put(AuthMessage(message_json[1], url)) diff --git a/nostr/message_type.py b/nostr/message_type.py index 3f5206b..0ff30e8 100644 --- a/nostr/message_type.py +++ b/nostr/message_type.py @@ -2,14 +2,16 @@ class ClientMessageType: EVENT = "EVENT" REQUEST = "REQ" CLOSE = "CLOSE" + AUTH = "AUTH" class RelayMessageType: EVENT = "EVENT" NOTICE = "NOTICE" END_OF_STORED_EVENTS = "EOSE" + AUTH = "AUTH" @staticmethod def is_valid(type: str) -> bool: if type == RelayMessageType.EVENT or type == RelayMessageType.NOTICE or type == RelayMessageType.END_OF_STORED_EVENTS: return True - return False \ No newline at end of file + return False diff --git a/nostr/relay.py b/nostr/relay.py index ee78baa..670480c 100644 --- a/nostr/relay.py +++ b/nostr/relay.py @@ -100,7 +100,7 @@ class Relay: def close_subscription(self, id: str) -> None: with self.lock: - self.subscriptions.pop(id) + self.subscriptions.pop(id, None) def update_subscription(self, id: str, filters: Filters) -> None: with self.lock: diff --git a/nostr/relay_manager.py b/nostr/relay_manager.py index 5b92d8d..48df278 100644 --- a/nostr/relay_manager.py +++ b/nostr/relay_manager.py @@ -52,12 +52,13 @@ class RelayManager: for relay in self.relays.values(): relay.close() - def publish_message(self, message: str): + def publish_message(self, message: str, url:str=None): for relay in self.relays.values(): if relay.policy.should_write: - relay.publish(message) + if url is None or relay.url == url: + relay.publish(message) - def publish_event(self, event: Event): + def verify_event(self, event: Event): """Verifies that the Event is publishable before submitting it to relays""" if event.signature is None: raise RelayException(f"Could not publish {event.id}: must be signed") @@ -66,4 +67,12 @@ class RelayManager: raise RelayException( f"Could not publish {event.id}: failed to verify signature {event.signature}" ) + + def publish_event(self, event: Event): + self.verify_event(event) self.publish_message(event.to_message()) + + def publish_auth(self, event: Event, url: str): + self.verify_event(event) + self.publish_message(event.to_message(), url) +