#ifndef MS_RTC_WEBRTC_SERVER_HPP
#define MS_RTC_WEBRTC_SERVER_HPP
#include "Channel/ChannelRequest.hpp"
#include "RTC/IceCandidate.hpp"
#include "RTC/Shared.hpp"
#include "RTC/StunPacket.hpp"
#include "RTC/TcpConnection.hpp"
#include "RTC/TcpServer.hpp"
#include "RTC/TransportTuple.hpp"
#include "RTC/UdpSocket.hpp"
#include "RTC/WebRtcTransport.hpp"
#include <flatbuffers/flatbuffers.h>
#include <absl/container/flat_hash_map.h>
#include <absl/container/flat_hash_set.h>
#include <string>
#include <vector>
namespace RTC
{
class WebRtcServer : public RTC::UdpSocket::Listener,
public RTC::TcpServer::Listener,
public RTC::TcpConnection::Listener,
public RTC::WebRtcTransport::WebRtcTransportListener,
public Channel::ChannelSocket::RequestHandler
{
private:
struct UdpSocketOrTcpServer
{
UdpSocketOrTcpServer(RTC::UdpSocket* udpSocket, RTC::TcpServer* tcpServer, std::string& announcedIp)
: udpSocket(udpSocket), tcpServer(tcpServer), announcedIp(announcedIp)
{
}
RTC::UdpSocket* udpSocket;
RTC::TcpServer* tcpServer;
std::string announcedIp;
};
public:
WebRtcServer(
RTC::Shared* shared,
const std::string& id,
const flatbuffers::Vector<flatbuffers::Offset<FBS::Transport::ListenInfo>>* listenInfos);
~WebRtcServer();
public:
flatbuffers::Offset<FBS::WebRtcServer::DumpResponse> FillBuffer(
flatbuffers::FlatBufferBuilder& builder) const;
const std::vector<RTC::IceCandidate> GetIceCandidates(
bool enableUdp, bool enableTcp, bool preferUdp, bool preferTcp) const;
public:
void HandleRequest(Channel::ChannelRequest* request) override;
private:
std::string GetLocalIceUsernameFragmentFromReceivedStunPacket(RTC::StunPacket* packet) const;
void OnPacketReceived(RTC::TransportTuple* tuple, const uint8_t* data, size_t len);
void OnStunDataReceived(RTC::TransportTuple* tuple, const uint8_t* data, size_t len);
void OnNonStunDataReceived(RTC::TransportTuple* tuple, const uint8_t* data, size_t len);
public:
void OnWebRtcTransportCreated(RTC::WebRtcTransport* webRtcTransport) override;
void OnWebRtcTransportClosed(RTC::WebRtcTransport* webRtcTransport) override;
void OnWebRtcTransportLocalIceUsernameFragmentAdded(
RTC::WebRtcTransport* webRtcTransport, const std::string& usernameFragment) override;
void OnWebRtcTransportLocalIceUsernameFragmentRemoved(
RTC::WebRtcTransport* webRtcTransport, const std::string& usernameFragment) override;
void OnWebRtcTransportTransportTupleAdded(
RTC::WebRtcTransport* webRtcTransport, RTC::TransportTuple* tuple) override;
void OnWebRtcTransportTransportTupleRemoved(
RTC::WebRtcTransport* webRtcTransport, RTC::TransportTuple* tuple) override;
public:
void OnUdpSocketPacketReceived(
RTC::UdpSocket* socket, const uint8_t* data, size_t len, const struct sockaddr* remoteAddr) override;
public:
void OnRtcTcpConnectionClosed(RTC::TcpServer* tcpServer, RTC::TcpConnection* connection) override;
public:
void OnTcpConnectionPacketReceived(
RTC::TcpConnection* connection, const uint8_t* data, size_t len) override;
public:
const std::string id;
private:
RTC::Shared* shared{ nullptr };
std::vector<UdpSocketOrTcpServer> udpSocketOrTcpServers;
absl::flat_hash_set<RTC::WebRtcTransport*> webRtcTransports;
absl::flat_hash_map<std::string, RTC::WebRtcTransport*> mapLocalIceUsernameFragmentWebRtcTransport;
absl::flat_hash_map<uint64_t, RTC::WebRtcTransport*> mapTupleWebRtcTransport;
};
}
#endif