"""Tunnel dispatcher — route messages through tunnels.""" from typing import Callable from i2p_data.tunnel import TunnelId class TunnelDispatcher: """Routes I2NP messages through registered tunnels.""" def __init__(self): self._inbound: dict[int, dict] = {} self._outbound: dict[int, dict] = {} def inbound_count(self) -> int: return len(self._inbound) def outbound_count(self) -> int: return len(self._outbound) def register_inbound(self, tunnel_id: TunnelId, gateway: bytes, handler: Callable | None = None): self._inbound[int(tunnel_id)] = {"gateway": gateway, "handler": handler} def register_outbound(self, tunnel_id: TunnelId, gateway: bytes, handler: Callable | None = None): self._outbound[int(tunnel_id)] = {"gateway": gateway, "handler": handler} def unregister_inbound(self, tunnel_id: TunnelId): self._inbound.pop(int(tunnel_id), None) def unregister_outbound(self, tunnel_id: TunnelId): self._outbound.pop(int(tunnel_id), None) def lookup_inbound(self, tunnel_id: TunnelId) -> dict | None: return self._inbound.get(int(tunnel_id)) def lookup_outbound(self, tunnel_id: TunnelId) -> dict | None: return self._outbound.get(int(tunnel_id)) def dispatch_inbound(self, tunnel_id: TunnelId, data: bytes): info = self._inbound.get(int(tunnel_id)) if info and info.get("handler"): info["handler"](data) def dispatch_outbound(self, tunnel_id: TunnelId, data: bytes): info = self._outbound.get(int(tunnel_id)) if info and info.get("handler"): info["handler"](data)