Expand description
Peer Capability Negotiation
This module implements PeerCapabilityNegotiator, a production-grade system
for discovering, advertising, and negotiating compatible protocol capabilities
between peers during connection establishment.
§Overview
When two IPFRS nodes connect, they exchange NegotiationOffer messages describing
their supported capabilities (e.g. “bitswap/2.0.0”, “graphsync/1.1.0”). The
negotiator evaluates each offer against its local NegotiatorConfig and returns
a NegotiationResult indicating which capabilities were agreed upon or why the
negotiation was rejected.
§Policies
Three CapabilityPolicy variants control strictness:
RequireAll– Every required local capability must appear in the peer’s offer; any mismatch yields an immediateNegotiationResult::Rejected.RequireSubset(names)– Only the named subset of capabilities must match.BestEffort– Always producesNegotiationResult::Accepted; unmatched required capabilities are listed inrejected_optionalfor caller visibility.
§Example
use ipfrs_network::peer_capability_negotiator::{
CapabilityPolicy, CapabilityVersion, NegotiationOffer, NegotiatorConfig,
PeerCapabilityNegotiator, PeerCapability,
};
use std::collections::HashMap;
let local_cap = PeerCapability {
name: "bitswap".to_string(),
version: CapabilityVersion { major: 2, minor: 0, patch: 0 },
required: true,
metadata: HashMap::new(),
};
let config = NegotiatorConfig {
local_capabilities: vec![local_cap],
policy: CapabilityPolicy::RequireAll,
min_protocol_version: 1,
negotiation_timeout_ms: 5_000,
};
let mut negotiator = PeerCapabilityNegotiator::new(config, 128);
let offer = NegotiationOffer {
peer_id: "QmPeer".to_string(),
capabilities: vec![PeerCapability {
name: "bitswap".to_string(),
version: CapabilityVersion { major: 2, minor: 1, patch: 0 },
required: false,
metadata: HashMap::new(),
}],
protocol_version: 2,
timestamp: 1_000,
};
let result = negotiator.negotiate("QmPeer".to_string(), offer, 1_000, 1_050);
// "bitswap" v2.1.0 is compatible with required v2.0.0 → Accepted.
assert!(matches!(result, ipfrs_network::peer_capability_negotiator::NegotiationResult::Accepted { .. }));Structs§
- Capability
Version - Semantic version triple for a single capability.
- Negotiation
Offer - A capability advertisement sent by a remote peer at connection time.
- Negotiation
Record - A historical record of a completed negotiation with a specific peer.
- Negotiator
Config - Configuration for a
PeerCapabilityNegotiator. - Negotiator
Stats - Aggregate statistics for a
PeerCapabilityNegotiator. - Peer
Capability - A single named capability with version and optional metadata key-value pairs.
- Peer
Capability Negotiator - Production-grade peer capability negotiator.
Enums§
- Capability
Policy - Governs how strictly the negotiator validates a peer’s offer.
- Negotiation
Result - Outcome of a capability negotiation attempt.