예제 #1
0
    def generate_events_with_long_polling(self, stream_position=None, stream_type=UserEventsStreamType.ALL):
        """
        Subscribe to events from the given stream position.

        :param stream_position:
            The location in the stream from which to start getting events. 0 is the beginning of time. 'now' will
            return no events and just current stream position.
        :type stream_position:
            `unicode`
        :param stream_type:
            (optional) Which type of events to return.
            Defaults to `UserEventsStreamType.ALL`.

            NOTE: Currently, the Box API requires this to be one of the user
            events stream types. The request will fail if an enterprise events
            stream type is passed.
        :type stream_type:
            :enum:`UserEventsStreamType`
        :returns:
            Events corresponding to changes on Box in realtime, as they come in.
        :rtype:
            `generator` of :class:`Event`
        """
        event_ids = LRUCache()
        stream_position = (
            stream_position if stream_position is not None else self.get_latest_stream_position(stream_type=stream_type)
        )
        while True:
            options = self.get_long_poll_options(stream_type=stream_type)
            while True:
                try:
                    long_poll_response = self.long_poll(options, stream_position)
                except Timeout:
                    break
                else:
                    message = long_poll_response.json()["message"]
                    if message == "new_change":
                        next_stream_position = stream_position
                        for event, next_stream_position in self._get_all_events_since(
                            stream_position, stream_type=stream_type
                        ):
                            try:
                                event_ids.get(event["event_id"])
                            except KeyError:
                                yield event
                                event_ids.set(event["event_id"])
                        stream_position = next_stream_position
                        break
                    elif message == "reconnect":
                        continue
                    else:
                        break
예제 #2
0
    def generate_events_with_long_polling(self, stream_position=None):
        """
        Subscribe to events from the given stream position.

        :param stream_position:
            The location in the stream from which to start getting events. 0 is the beginning of time. 'now' will
            return no events and just current stream position.
        :type stream_position:
            `unicode`
        :returns:
            Events corresponding to changes on Box in realtime, as they come in.
        :rtype:
            `generator` of :class:`Event`
        """
        event_ids = LRUCache()
        stream_position = stream_position if stream_position is not None else self.get_latest_stream_position()
        while True:
            options = self.get_long_poll_options()
            while True:
                try:
                    long_poll_response = self.long_poll(options, stream_position)
                except TimeoutError:
                    break
                else:
                    message = long_poll_response.json()['message']
                    if message == 'new_change':
                        next_stream_position = stream_position
                        for event, next_stream_position in self._get_all_events_since(stream_position):
                            try:
                                event_ids.get(event['event_id'])
                            except KeyError:
                                yield event
                                event_ids.set(event['event_id'])
                        stream_position = next_stream_position
                        break
                    elif message == 'reconnect':
                        continue
                    else:
                        break
예제 #3
0
    def generate_events_with_long_polling(self, stream_position=None, stream_type=UserEventsStreamType.ALL):
        """
        Subscribe to events from the given stream position.

        :param stream_position:
            The location in the stream from which to start getting events. 0 is the beginning of time. 'now' will
            return no events and just current stream position.
        :type stream_position:
            `unicode`
        :param stream_type:
            (optional) Which type of events to return.
            Defaults to `UserEventsStreamType.ALL`.

            NOTE: Currently, the Box API requires this to be one of the user
            events stream types. The request will fail if an enterprise events
            stream type is passed.
        :type stream_type:
            :enum:`UserEventsStreamType`
        :returns:
            Events corresponding to changes on Box in realtime, as they come in.
        :rtype:
            `generator` of :class:`Event`
        """
        event_ids = LRUCache()
        stream_position = stream_position if stream_position is not None else self.get_latest_stream_position(stream_type=stream_type)
        while True:
            options = self.get_long_poll_options(stream_type=stream_type)
            while True:
                try:
                    long_poll_response = self.long_poll(options, stream_position)
                except Timeout:
                    break
                else:
                    message = long_poll_response.json()['message']
                    if message == 'new_change':
                        next_stream_position = stream_position
                        for event, next_stream_position in self._get_all_events_since(stream_position, stream_type=stream_type):
                            try:
                                event_ids.get(event['event_id'])
                            except KeyError:
                                yield event
                                event_ids.set(event['event_id'])
                        stream_position = next_stream_position
                        break
                    elif message == 'reconnect':
                        continue
                    else:
                        break
예제 #4
0
    def generate_events_with_long_polling(self, stream_position=None):
        """
        Subscribe to events from the given stream position.

        :param stream_position:
            The location in the stream from which to start getting events. 0 is the beginning of time. 'now' will
            return no events and just current stream position.
        :type stream_position:
            `unicode`
        :returns:
            Events corresponding to changes on Box in realtime, as they come in.
        :rtype:
            `generator` of :class:`Event`
        """
        event_ids = LRUCache()
        stream_position = stream_position if stream_position is not None else self.get_latest_stream_position(
        )
        while True:
            options = self.get_long_poll_options()
            while True:
                try:
                    long_poll_response = self.long_poll(
                        options, stream_position)
                except Timeout:
                    break
                else:
                    message = long_poll_response.json()['message']
                    if message == 'new_change':
                        next_stream_position = stream_position
                        for event, next_stream_position in self._get_all_events_since(
                                stream_position):
                            try:
                                event_ids.get(event['event_id'])
                            except KeyError:
                                yield event
                                event_ids.set(event['event_id'])
                        stream_position = next_stream_position
                        break
                    elif message == 'reconnect':
                        continue
                    else:
                        break
예제 #5
0
def lru_cache():
    return LRUCache()