async def process_message(self, message, wait=True):
        to_check = deque([self._waiters])
        ignored = True
        while len(to_check) > 0:
            context = to_check.popleft()
            waiters = context.get(OperationManager._LEAF, [])
            for waiter in waiters:
                if isinstance(waiter, asyncio.Future):
                    waiter.set_result(message)
                else:
                    try:
                        await _wait_or_launch(self._loop, waiter, message, wait)
                    except:
                        self._logger.warning("Error calling every_match callback, callback=%s, message=%s",
                                             waiter, message, exc_info=True)
                ignored = False
            for key in context:
                if key is OperationManager._LEAF:
                    continue
                message_val = _get_key(message, key)
                if message_val is _MISSING:
                    continue
                next_level = context[key]
                if message_val in next_level:
                    to_check.append(next_level[message_val])
        return not ignored