123 size_t max_relays = 3;
127 size_t max_addresses = 4;
134 std::chrono::milliseconds round_timeout{6000};
140 std::chrono::milliseconds cooldown{60000};
144 size_t max_sessions = 32;
149 bool enable_relay =
true;
154 size_t relay_budget = 12;
155 std::chrono::milliseconds relay_window{1000};
161 bool skip_when_endpoint_dependent =
true;
164 DialProfile profile = DialProfile::punch();
167 std::chrono::milliseconds tick{250};
173 bool relay_on_failure =
true;
197 uint64_t
relayed() const noexcept {
return relayed_.load(); }
200 enum class Phase : uint8_t {
207 bool initiator =
false;
208 Phase phase = Phase::AwaitingPeerConnect;
210 std::vector<Address> peer_addresses;
211 std::chrono::steady_clock::time_point deadline{};
217 bool have_via =
false;
221 void handle(
const Peer& from, ByteView payload);
222 void handle_relay_request(
const Peer& from,
const PeerId& dst, ByteView inner);
223 void handle_relayed(
const Peer& via,
const PeerId& src, ByteView inner);
226 void handle_connect(
const Peer& via,
const PeerId& src,
bool opening,
227 std::vector<Address> addresses);
228 void handle_sync(
const PeerId& src);
234 size_t relay_to(
const PeerId& dst,
const Bytes& inner,
const PeerId* via);
235 bool send_connect(
const PeerId& target,
bool opening,
const PeerId* via);
236 void send_sync(
const PeerId& target,
const PeerId* via);
239 void fire_punch(
const PeerId& target,
const std::vector<Address>& addresses);
243 void service_sessions();
252 void escalate_to_relay(
const PeerId& target);
256 std::vector<PeerId> directly_connected()
const;
257 std::vector<Address> own_punch_addresses()
const;
258 bool relay_budget_ok(
const PeerId& from);
259 bool in_cooldown(
const PeerId& target)
const;
260 void begin_cooldown(
const PeerId& target);
263 PeerNetwork* network_ =
nullptr;
264 DialService* dialer_ =
nullptr;
265 ExternalAddressService* external_ =
nullptr;
266 ServiceRegistry* services_ =
nullptr;
270 std::atomic<RelayService*> relay_{
nullptr};
272 std::atomic<bool> running_{
false};
273 std::atomic<uint64_t> punches_started_{0};
274 std::atomic<uint64_t> relayed_{0};
276 mutable std::mutex mutex_;
277 std::condition_variable cv_;
279 std::unordered_map<PeerId, Session, PeerId::Hash> sessions_;
280 std::unordered_map<PeerId, std::chrono::steady_clock::time_point, PeerId::Hash> cooldown_;
283 std::chrono::steady_clock::time_point window_started{};
286 std::mutex relay_mutex_;
287 std::unordered_map<PeerId, RelayBudget, PeerId::Hash> relay_budget_;