#ifndef RTC_WS_TRANSPORT_H
#define RTC_WS_TRANSPORT_H
#include "include.hpp"
#include "transport.hpp"
#if RTC_ENABLE_WEBSOCKET
namespace rtc {
class TcpTransport;
class TlsTransport;
class WsTransport : public Transport {
public:
struct Configuration {
string host;
string path = "/";
std::vector<string> protocols;
};
WsTransport(std::shared_ptr<Transport> lower, Configuration config,
message_callback recvCallback, state_callback stateCallback);
~WsTransport();
void start() override;
bool stop() override;
bool send(message_ptr message) override;
void incoming(message_ptr message) override;
void close();
private:
enum Opcode : uint8_t {
CONTINUATION = 0,
TEXT_FRAME = 1,
BINARY_FRAME = 2,
CLOSE = 8,
PING = 9,
PONG = 10,
};
struct Frame {
Opcode opcode = BINARY_FRAME;
byte *payload = nullptr;
size_t length = 0;
bool fin = true;
bool mask = true;
};
bool sendHttpRequest();
size_t readHttpResponse(const byte *buffer, size_t size);
size_t readFrame(byte *buffer, size_t size, Frame &frame);
void recvFrame(const Frame &frame);
bool sendFrame(const Frame &frame);
const Configuration mConfig;
binary mBuffer;
binary mPartial;
Opcode mPartialOpcode;
};
}
#endif
#endif