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())
Esempio n. 2
0
 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())
Esempio n. 3
0
    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())