コード例 #1
0
ファイル: in_memory.py プロジェクト: philostert/mqtt-extended
    def __init__(self):
        self._queue = list()

        self._inflight_ids = list()
        self._inflight = dict()

        self._ids_gen = PacketIdGenerator(self._inflight)
コード例 #2
0
    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)
コード例 #3
0
ファイル: redis.py プロジェクト: philostert/mqtt-extended
    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)
コード例 #4
0
ファイル: in_memory.py プロジェクト: philostert/mqtt-extended
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)
コード例 #5
0
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,
        )
コード例 #6
0
ファイル: redis.py プロジェクト: philostert/mqtt-extended
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,
            )