diff --git a/libp2p/relay/circuit_v2/config.py b/libp2p/relay/circuit_v2/config.py index 70046c6a..8eafbe91 100644 --- a/libp2p/relay/circuit_v2/config.py +++ b/libp2p/relay/circuit_v2/config.py @@ -46,18 +46,8 @@ MAX_AUTO_RELAY_ATTEMPTS = 3 RESERVATION_REFRESH_THRESHOLD = 0.8 # Refresh at 80% of TTL MAX_CONCURRENT_RESERVATIONS = 2 -# Shared timeout constants (used across modules) -STREAM_READ_TIMEOUT = 15 # seconds -STREAM_WRITE_TIMEOUT = 15 # seconds -STREAM_CLOSE_TIMEOUT = 10 # seconds -DIAL_TIMEOUT = 10 # seconds - -# NAT reachability timeout -REACHABILITY_TIMEOUT = 10 # seconds - -# Relay roles enum ----------------------------------------------------------- - +# Relay roles enum class RelayRole(Flag): """ Bit-flag enum that captures the three possible relay capabilities. @@ -72,6 +62,7 @@ class RelayRole(Flag): CLIENT = auto() # Dial through existing relays ("client") +@dataclass class RelayConfig: """Configuration for Circuit Relay v2.""" diff --git a/libp2p/relay/circuit_v2/dcutr.py b/libp2p/relay/circuit_v2/dcutr.py index a67ddd5e..2cece5d2 100644 --- a/libp2p/relay/circuit_v2/dcutr.py +++ b/libp2p/relay/circuit_v2/dcutr.py @@ -39,12 +39,6 @@ from libp2p.tools.async_service import ( Service, ) -from .config import ( - DIAL_TIMEOUT, - STREAM_READ_TIMEOUT, - STREAM_WRITE_TIMEOUT, -) - logger = logging.getLogger(__name__) # Protocol ID for DCUtR @@ -53,6 +47,11 @@ PROTOCOL_ID = TProtocol("/libp2p/dcutr") # Maximum message size for DCUtR (4KiB as per spec) MAX_MESSAGE_SIZE = 4 * 1024 +# Timeouts +STREAM_READ_TIMEOUT = 30 # seconds +STREAM_WRITE_TIMEOUT = 30 # seconds +DIAL_TIMEOUT = 10 # seconds + # Maximum number of hole punch attempts per peer MAX_HOLE_PUNCH_ATTEMPTS = 5 diff --git a/libp2p/relay/circuit_v2/discovery.py b/libp2p/relay/circuit_v2/discovery.py index 798eaa3e..45775647 100644 --- a/libp2p/relay/circuit_v2/discovery.py +++ b/libp2p/relay/circuit_v2/discovery.py @@ -31,9 +31,6 @@ from libp2p.tools.async_service import ( Service, ) -from .config import ( - DEFAULT_DISCOVERY_INTERVAL as CFG_DISCOVERY_INTERVAL, -) from .pb.circuit_pb2 import ( HopMessage, ) @@ -46,9 +43,9 @@ from .protocol_buffer import ( logger = logging.getLogger("libp2p.relay.circuit_v2.discovery") -# Constants (single-source-of-truth) -DEFAULT_DISCOVERY_INTERVAL = CFG_DISCOVERY_INTERVAL -MAX_RELAYS_TO_TRACK = 10 # Still discovery-specific +# Constants +MAX_RELAYS_TO_TRACK = 10 +DEFAULT_DISCOVERY_INTERVAL = 60 # seconds STREAM_TIMEOUT = 10 # seconds PEER_PROTOCOL_TIMEOUT = 5 # seconds diff --git a/libp2p/relay/circuit_v2/protocol.py b/libp2p/relay/circuit_v2/protocol.py index ae852a1f..3c378897 100644 --- a/libp2p/relay/circuit_v2/protocol.py +++ b/libp2p/relay/circuit_v2/protocol.py @@ -43,9 +43,6 @@ from .config import ( DEFAULT_MAX_CIRCUIT_CONNS, DEFAULT_MAX_CIRCUIT_DURATION, DEFAULT_MAX_RESERVATIONS, - STREAM_CLOSE_TIMEOUT, - STREAM_READ_TIMEOUT, - STREAM_WRITE_TIMEOUT, ) from .pb.circuit_pb2 import ( HopMessage, @@ -75,7 +72,7 @@ class Pipe(Enum): DST_TO_SRC = auto() -# Default limits for relay resources (single source of truth) +# Default limits for relay resources DEFAULT_RELAY_LIMITS = RelayLimits( duration=DEFAULT_MAX_CIRCUIT_DURATION, data=DEFAULT_MAX_CIRCUIT_BYTES, @@ -83,6 +80,10 @@ DEFAULT_RELAY_LIMITS = RelayLimits( max_reservations=DEFAULT_MAX_RESERVATIONS, ) +# Stream operation timeouts +STREAM_READ_TIMEOUT = 15 # seconds +STREAM_WRITE_TIMEOUT = 15 # seconds +STREAM_CLOSE_TIMEOUT = 10 # seconds MAX_READ_RETRIES = 5 # Maximum number of read retries diff --git a/libp2p/relay/circuit_v2/resources.py b/libp2p/relay/circuit_v2/resources.py index bd5d5fe0..d621990d 100644 --- a/libp2p/relay/circuit_v2/resources.py +++ b/libp2p/relay/circuit_v2/resources.py @@ -97,7 +97,7 @@ class Reservation: """Check if the reservation has expired.""" return time.time() > self.expires_at - # Expose a friendly status enum -------------------------------------- + # Expose a friendly status enum @property def status(self) -> ReservationStatus: