Better ping/pong support

This commit is contained in:
Benjamin Sergeant
2018-10-25 12:01:47 -07:00
parent 45f92115f9
commit eae2f7d113
10 changed files with 276 additions and 10 deletions

View File

@ -177,8 +177,28 @@ namespace ix {
// 3. Dispatch the incoming messages
_ws.dispatch(
[this](const std::string& msg)
[this](const std::string& msg,
WebSocketTransport::MessageKind messageKind)
{
WebSocketMessageType webSocketMessageType;
switch (messageKind)
{
case WebSocketTransport::MSG:
{
webSocketMessageType = WebSocket_MessageType_Message;
} break;
case WebSocketTransport::PING:
{
webSocketMessageType = WebSocket_MessageType_Ping;
} break;
case WebSocketTransport::PONG:
{
webSocketMessageType = WebSocket_MessageType_Pong;
} break;
}
_onMessageCallback(WebSocket_MessageType_Message, msg, WebSocketErrorInfo());
WebSocket::invokeTrafficTrackerCallback(msg.size(), true);
@ -210,6 +230,20 @@ namespace ix {
}
bool WebSocket::send(const std::string& text)
{
return sendMessage(text, false);
}
bool WebSocket::ping(const std::string& text)
{
// Standard limit ping message size
constexpr size_t pingMaxPayloadSize = 125;
if (text.size() > pingMaxPayloadSize) return false;
return sendMessage(text, true);
}
bool WebSocket::sendMessage(const std::string& text, bool ping)
{
if (!isConnected()) return false;
@ -223,7 +257,15 @@ namespace ix {
// incoming messages are arriving / there's data to be received.
//
std::lock_guard<std::mutex> lock(_writeMutex);
_ws.sendBinary(text);
if (ping)
{
_ws.sendPing(text);
}
else
{
_ws.sendBinary(text);
}
WebSocket::invokeTrafficTrackerCallback(text.size(), false);