class Websocket(object): def __init__(self, timeout=10): self.timeout = timeout accounts = Accounts() accounts.authenticate_asynchronous() cookie = accounts.c.resp.cookies['async_auth'] self.ws = WebsocketClient(cookie, self.timeout) def wait(self, message_filter=None, timeout=None): # message_filter = {'resource_type': ['drives']} # message_filter = {'resource_uri': ['/api/2.0/balance/']} events = [] if message_filter is not None: for key in message_filter: if isinstance(message_filter[key], basestring): message_filter[key] = [message_filter[key]] if timeout is None: timeout = self.timeout while timeout > 0: start_t = time.time() try: frame = self.ws.recv(timeout) except socket.timeout as e: raise WebsocketTimeoutError('Timeout reached when waiting for events') events.append(frame) if self.filter_frame(message_filter, frame): return events timeout = timeout - (time.time() - start_t) raise WebsocketTimeoutError('Timeout reached when waiting for events') def filter_frame(self, message_filter, frame): if not message_filter: return True for key in message_filter: if key in frame: for value in message_filter[key]: if frame[key] == value: return True return False def wait_obj_type(self, resource_type, cls, timeout=None): ret = self.wait({"resource_type": resource_type})[-1] return cls().get_from_url(ret['resource_uri']) def wait_obj_type(self, resource_type, cls, timeout=None): ret = self.wait({"resource_type": resource_type})[-1] return cls().get_from_url(ret['resource_uri'])
def __init__(self, timeout=10): self.timeout = timeout accounts = Accounts() accounts.authenticate_asynchronous() cookie = accounts.c.resp.cookies['async_auth'] self.ws = WebsocketClient(cookie, self.timeout)
class Websocket(object): def __init__(self, timeout=10): self.timeout = timeout accounts = Accounts() accounts.authenticate_asynchronous() cookie = accounts.c.resp.cookies['async_auth'] self.ws = WebsocketClient(cookie, self.timeout) def wait(self, message_filter=None, timeout=None): # message_filter = {'resource_type': ['drives']} # message_filter = {'resource_uri': ['/api/2.0/balance/']} events = [] if message_filter is not None: for key in message_filter: if isinstance(message_filter[key], basestring): message_filter[key] = [message_filter[key]] if timeout is None: timeout = self.timeout while timeout > 0: start_t = time.time() try: frame = self.ws.recv(timeout) except socket.timeout as e: raise WebsocketTimeoutError( 'Timeout reached when waiting for events') events.append(frame) if self.filter_frame(message_filter, frame): return events timeout = timeout - (time.time() - start_t) raise WebsocketTimeoutError('Timeout reached when waiting for events') def filter_frame(self, message_filter, frame): if not message_filter: return True for key in message_filter: if key in frame: for value in message_filter[key]: if frame[key] == value: return True return False def wait_obj_type(self, resource_type, cls, timeout=None): ret = self.wait({"resource_type": resource_type})[-1] return cls().get_from_url(ret['resource_uri']) def wait_obj_uri(self, resource_uri, cls, timeout=None): ret = self.wait({"resource_uri": resource_uri}) return cls().get_from_url(resource_uri) def wait_obj_wrapper(self, waiter, args, kwargs=None, timeout=None, extra_filter=lambda x: True): if timeout is None: timeout = self.timeout if kwargs is None: kwargs = {} while timeout > 0: start_t = time.time() kwargs['timeout'] = timeout frame = waiter(*args, **kwargs) if extra_filter(frame): return frame timeout = timeout - (time.time() - start_t) raise WebsocketTimeoutError('Timeout reached when waiting for events') def wait_for_status(self, uri, resource, status, timeout=30): return self.wait_obj_wrapper( self.wait_obj_uri, (uri, resource), timeout=timeout, extra_filter=lambda x: x['status'] == status)