fix: event uniqueness (see comment in code)

This commit is contained in:
Vlad Stan 2023-05-31 11:54:04 +03:00
parent 91078341c7
commit 629aa3a6c3

View file

@ -1,8 +1,9 @@
import json import json
from queue import Queue from queue import Queue
from threading import Lock from threading import Lock
from .message_type import RelayMessageType
from .event import Event from .event import Event
from .message_type import RelayMessageType
class EventMessage: class EventMessage:
@ -69,9 +70,18 @@ class MessagePool:
) )
with self.lock: with self.lock:
if not event.id in self._unique_events: if not event.id in self._unique_events:
self.events.put(EventMessage(event, subscription_id, url)) self._accept_event(EventMessage(event, subscription_id, url))
self._unique_events.add(event.id)
elif message_type == RelayMessageType.NOTICE: elif message_type == RelayMessageType.NOTICE:
self.notices.put(NoticeMessage(message_json[1], url)) self.notices.put(NoticeMessage(message_json[1], url))
elif message_type == RelayMessageType.END_OF_STORED_EVENTS: elif message_type == RelayMessageType.END_OF_STORED_EVENTS:
self.eose_notices.put(EndOfStoredEventsMessage(message_json[1], url)) self.eose_notices.put(EndOfStoredEventsMessage(message_json[1], url))
def _accept_event(self, event_message: EventMessage):
"""
Event uniqueness is considered per `subscription_id`.
The `subscription_id` is rewritten to be unique and it is the same accross relays.
The same event can come from different subscriptions (from the same client or from different ones).
Clients that have joined later should receive older events.
"""
self.events.put(event_message)
self._unique_events.add(f"{event_message.subscription_id}_{event_message.event.id}")