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
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
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
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