blob: 241d51e964b0fd8e13ab87ac89096eab18b2d00d [file] [log] [blame]
/*
* Copyright 2025 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef P2P_DTLS_DTLS_STUN_PIGGYBACK_CALLBACKS_H_
#define P2P_DTLS_DTLS_STUN_PIGGYBACK_CALLBACKS_H_
#include <cstdint>
#include <optional>
#include <utility>
#include <vector>
#include "absl/functional/any_invocable.h"
#include "absl/strings/string_view.h"
#include "api/array_view.h"
#include "api/transport/stun.h"
#include "rtc_base/checks.h"
namespace webrtc {
class DtlsStunPiggybackCallbacks {
public:
DtlsStunPiggybackCallbacks() : send_data_(nullptr), recv_data_(nullptr) {}
DtlsStunPiggybackCallbacks(
// Function invoked when sending a `request-type` (e.g.
// STUN_BINDING_REQUEST). Returns a pair of data that will be sent:
// - an optional DTLS_IN_STUN attribute
// - an optional std::vector<uint32_t> for the DTLS_IN_STUN_ACK attribute
absl::AnyInvocable<std::pair<std::optional<absl::string_view>,
std::optional<std::vector<uint32_t>>>(
/* request-type */ StunMessageType)>&& send_data,
// Function invoked when receiving a STUN_BINDING { REQUEST / RESPONSE }
// contains the optional ArrayView of the DTLS_IN_STUN attribute and the
// optional uint32_t vector DTLS_IN_STUN_ACK attribute.
absl::AnyInvocable<void(
std::optional<ArrayView<uint8_t>> /* recv_data */,
std::optional<std::vector<uint32_t>> /* recv_acks */)>&& recv_data)
: send_data_(std::move(send_data)), recv_data_(std::move(recv_data)) {
RTC_DCHECK(
// either all set
(send_data_ != nullptr && recv_data_ != nullptr) ||
// or all nullptr
(send_data_ == nullptr && recv_data_ == nullptr));
}
std::pair<std::optional<absl::string_view>,
std::optional<std::vector<uint32_t>>>
send_data(StunMessageType request_type) {
RTC_DCHECK(send_data_);
return send_data_(request_type);
}
void recv_data(std::optional<ArrayView<uint8_t>> data,
std::optional<std::vector<uint32_t>> acks) {
RTC_DCHECK(recv_data_);
return recv_data_(data, acks);
}
bool empty() const { return send_data_ == nullptr; }
void reset() {
send_data_ = nullptr;
recv_data_ = nullptr;
}
private:
absl::AnyInvocable<std::pair<std::optional<absl::string_view>,
std::optional<std::vector<uint32_t>>>(
/* request-type */ StunMessageType)>
send_data_;
absl::AnyInvocable<void(std::optional<ArrayView<uint8_t>> /* recv_data */,
std::optional<std::vector<uint32_t>> /* recv_acks */)>
recv_data_;
};
} // namespace webrtc
#endif // P2P_DTLS_DTLS_STUN_PIGGYBACK_CALLBACKS_H_