def __init__(self): self._queue = list() self._inflight_ids = list() self._inflight = dict() self._ids_gen = PacketIdGenerator(self._inflight)
def __init__(self, redis, uid): self.redis = redis self.uid = uid self._queue = RedisList(redis, "%s:outgoing_queue" % uid) self._inflight = RedisPacketsDict(redis, "%s:outgoing_inflight" % uid) self._inflight_ids = RedisIntList(redis, '%s:outgoing_ids' % uid) self._sent_ids = RedisIntSet(redis, "%s:outgoing_sent_ids" % uid) self._confirmed_ids = RedisIntSet(redis, "%s:outgoing_conf_ids" % uid) self._ids_gen = PacketIdGenerator(self._inflight)
class InMemoryOutgoingPublishes(OutgoingPublishesBase): def __init__(self): self._queue = list() self._inflight_ids = list() self._inflight = dict() self._ids_gen = PacketIdGenerator(self._inflight) def insert(self, msg): self._queue.append(msg) def get_next(self): if len(self._queue) > 0: msg = self._queue.pop(0) msg.id = self._ids_gen.next() entry = { 'id': msg.id, 'msg': msg, } self._inflight_ids.append(msg.id) self._inflight[msg.id] = entry return msg.copy() else: return None @property def inflight_len(self): return len(self._inflight_ids) def is_inflight(self, packet_id): return packet_id in self._inflight_ids def get_all_inflight(self): for packet_id in self._inflight_ids: entry = self._inflight.get(packet_id) if entry is not None: yield entry['msg'].copy() def get_inflight(self, packet_id): if packet_id in self._inflight_ids: entry = self._inflight.get(packet_id) if entry is not None: return entry['msg'].copy() else: raise KeyError('Unknown packet id') def set_sent(self, packet_id): p = self._inflight.get(packet_id) if p is not None: p['sent'] = True else: raise KeyError('Unknown packet id') def is_sent(self, packet_id): p = self._inflight.get(packet_id) if p is not None: return 'sent' in p else: raise KeyError('Unknown packet id') def set_pubconf(self, packet_id): p = self._inflight.get(packet_id) if p is not None: p['conf'] = True else: raise KeyError('Unknown packet id') def is_pubconf(self, packet_id): p = self._inflight.get(packet_id) if p is not None: return 'conf' in p else: raise KeyError('Unknown packet id') def remove(self, packet_id): if packet_id in self._inflight: del self._inflight[packet_id] if packet_id in self._inflight_ids: self._inflight_ids.remove(packet_id)
class RedisOutgoingPublishes(OutgoingPublishesBase): def __init__(self, redis, uid): self.redis = redis self.uid = uid self._queue = RedisList(redis, "%s:outgoing_queue" % uid) self._inflight = RedisPacketsDict(redis, "%s:outgoing_inflight" % uid) self._inflight_ids = RedisIntList(redis, '%s:outgoing_ids' % uid) self._sent_ids = RedisIntSet(redis, "%s:outgoing_sent_ids" % uid) self._confirmed_ids = RedisIntSet(redis, "%s:outgoing_conf_ids" % uid) self._ids_gen = PacketIdGenerator(self._inflight) def insert(self, msg): msg.id = 0 # sets a dummy id just to make it encode, # the actual id is set on `get_next` method. self._queue.append(msg.raw_data) def get_next(self): """ Gets the next packet to be published. Should be used to start a new flow. """ # todo: do in a transaction if len(self._queue) > 0: raw_data = self._queue.pop() msg = MQTTMessageFactory.make(raw_data) msg.id = self._ids_gen.next() self._inflight_ids.append(msg.id) self._inflight[msg.id] = msg.raw_data return msg else: return None @property def inflight_len(self): return len(self._inflight) def is_inflight(self, packet_id): return packet_id in self._inflight def get_all_inflight(self): for packet_id in self._inflight_ids: raw = self._inflight.get(packet_id) if raw is not None: yield MQTTMessageFactory.make(raw) def get_inflight(self, packet_id): if packet_id in self._inflight: raw = self._inflight.get(packet_id) if raw is not None: return MQTTMessageFactory.make(raw) else: raise KeyError('Unknown packet id') def set_sent(self, packet_id): if packet_id in self._inflight: self._sent_ids.add(packet_id) else: raise KeyError('Unknown packet id') def is_sent(self, packet_id): if packet_id in self._inflight: return packet_id in self._sent_ids else: raise KeyError('Unknown packet id') def set_pubconf(self, packet_id): if packet_id in self._inflight: self._confirmed_ids.add(packet_id) else: raise KeyError('Unknown packet id') def is_pubconf(self, packet_id): if packet_id in self._inflight: return packet_id in self._confirmed_ids else: raise KeyError('Unknown packet id') def remove(self, packet_id): # todo: do in a transaction if packet_id in self._inflight: self._inflight_ids.remove(packet_id) self._sent_ids.remove(packet_id) self._confirmed_ids.remove(packet_id) del self._inflight[packet_id] def remove_all(self): self.redis.delete( '%s:outgoing_queue' % self.uid, '%s:outgoing_inflight' % self.uid, '%s:outgoing_ids' % self.uid, '%s:outgoing_sent_ids' % self.uid, "%s:outgoing_conf_ids" % self.uid, )