From 55ce1426d4a7ab84c5439abe42d5d8a137df7377 Mon Sep 17 00:00:00 2001 From: jeffthibault Date: Wed, 3 Aug 2022 15:45:39 -0400 Subject: [PATCH] add a lock to relay class --- nostr/relay.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/nostr/relay.py b/nostr/relay.py index 5be5c5b..a91b20e 100644 --- a/nostr/relay.py +++ b/nostr/relay.py @@ -1,4 +1,5 @@ import json +from threading import Lock from websocket import WebSocketApp from .event import Event from .filter import Filters @@ -28,6 +29,7 @@ class Relay: self.policy = policy self.message_pool = message_pool self.subscriptions = subscriptions + self.lock = Lock() self.ws = WebSocketApp( url, on_open=self._on_open, @@ -45,14 +47,17 @@ class Relay: self.ws.send(message) def add_subscription(self, id, filters: Filters): - self.subscriptions[id] = Subscription(id, filters) + with self.lock: + self.subscriptions[id] = Subscription(id, filters) def close_subscription(self, id: str) -> None: - self.subscriptions.pop(id) + with self.lock: + self.subscriptions.pop(id) def update_subscription(self, id: str, filters: Filters) -> None: - subscription = self.subscriptions[id] - subscription.filters = filters + with self.lock: + subscription = self.subscriptions[id] + subscription.filters = filters def to_json_object(self) -> dict: return { @@ -87,15 +92,19 @@ class Relay: return False subscription_id = message_json[1] - if subscription_id not in self.subscriptions: - return False + with self.lock: + if subscription_id not in self.subscriptions: + return False e = message_json[2] event = Event(e['pubkey'], e['content'], e['created_at'], e['kind'], e['tags'], e['id'], e['sig']) if not event.verify(): return False - if not self.subscriptions[subscription_id].filters.match(event): + with self.lock: + subscription = self.subscriptions[subscription_id] + + if not subscription.filters.match(event): return False return True