from typing import TYPE_CHECKING, Tuple from threading import Thread from queue import Queue from queue import Empty import blockdb if TYPE_CHECKING: from onionrblocks import Block from ..dandelion.phase import DandelionPhase from ..blockqueues import gossip_block_queues def store_blocks(dandelion_phase: 'DandelionPhase'): new_queue: "Queue[Block]" = Queue() def _watch_queue(block_queue: "Queue[Block]"): # Copy all incoming blocks into 1 queue which gets processed to db while not dandelion_phase.is_stem_phase() \ and dandelion_phase.remaining_time() > 1: try: new_queue.put( block_queue.get(timeout=dandelion_phase.remaining_time())) except Empty: pass for block_queue in gossip_block_queues: Thread(target=_watch_queue, args=[block_queue], daemon=True).start() while not dandelion_phase.is_stem_phase() \ and dandelion_phase.remaining_time() > 1: try: blockdb.add_block_to_db( new_queue.get(timeout=dandelion_phase.remaining_time() + 1) ) except Empty: pass