"""Floodfill router tracking for efficient NetDB lookups. Floodfill routers are peers that participate in the Kademlia-like distributed hash table, storing and serving NetDB entries. This manager tracks known floodfill routers so lookup and store operations can target them directly. Ported from net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade. """ from __future__ import annotations import random from typing import Optional class FloodfillManager: """Tracks floodfill routers for efficient NetDB lookups.""" def __init__(self) -> None: self._floodfills: dict[bytes, dict] = {} def add_floodfill(self, peer_hash: bytes, info: dict) -> None: """Register a peer as a floodfill router.""" self._floodfills[peer_hash] = info def remove_floodfill(self, peer_hash: bytes) -> None: """Remove a peer from the floodfill set.""" self._floodfills.pop(peer_hash, None) def select_floodfill(self, exclude: Optional[set[bytes]] = None) -> Optional[bytes]: """Select a random floodfill router, optionally excluding some peers. Returns None if no eligible floodfill is available. """ exclude = exclude or set() candidates = [h for h in self._floodfills if h not in exclude] if not candidates: return None return random.choice(candidates) def is_floodfill(self, peer_hash: bytes) -> bool: """Check whether a peer is a known floodfill router.""" return peer_hash in self._floodfills def get_all(self) -> list[bytes]: """Return a list of all known floodfill peer hashes.""" return list(self._floodfills.keys()) @property def count(self) -> int: """Number of known floodfill routers.""" return len(self._floodfills)