def catchup_subscriber(self, connection_id): """Send an event list with all events that are in the given subscriptions from all blocks since that latest block in the current chain that is in the given last known block ids. Raises: PossibleForkDetectedError A possible fork was detected while building the event list NoKnownBlockError None of the last known blocks were in the current chain KeyError Unknown connection_id """ with self._subscribers_cv: subscriber = self._subscribers[connection_id] last_known_block_id = subscriber.get_last_known_block_id() subscriptions = subscriber.subscriptions if last_known_block_id is not None: LOGGER.debug('Catching up Subscriber %s from %s', connection_id, last_known_block_id) # Send catchup events one block at a time for block_id in self.get_catchup_block_ids(last_known_block_id): events = self.get_events_for_block_id(block_id, subscriptions) event_list = EventList(events=events) self._send(connection_id, event_list.SerializeToString())
def broadcast_events(self, events): LOGGER.debug("Broadcasting events: %s", events) if self._subscribers: for connection_id, subscriber in self._subscribers.items(): if subscriber.is_listening(): subscriber_events = [event for event in events if subscriber.is_subscribed(event)] event_list = EventList(events=subscriber_events) self._send(connection_id, event_list.SerializeToString())
def broadcast_events(self, events): LOGGER.debug("Broadcasting events: %s", events) with self._subscribers_cv: # Copy the subscribers subscribers = { conn: sub.copy() for conn, sub in self._subscribers.items() } if subscribers: for connection_id, subscriber in subscribers.items(): if subscriber.is_listening(): subscriber_events = [event for event in events if subscriber.is_subscribed(event)] event_list = EventList(events=subscriber_events) self._send(connection_id, event_list.SerializeToString())