MCPcopy Create free account
hub / github.com/deathkiller/jazz2-native / OnClientWsThread

Method OnClientWsThread

Sources/Jazz2/Multiplayer/NetworkManagerBase.cpp:1340–1416  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1338 }
1339
1340 void NetworkManagerBase::OnClientWsThread(void* param)
1341 {
1342 Thread::SetCurrentName("Multiplayer WebSocket client");
1343
1344 NetworkManagerBase* _this = static_cast<NetworkManagerBase*>(param);
1345 INetworkHandler* handler = _this->_handler;
1346
1347 bool wasConnected = false;
1348 ix::WebSocket* serverPeer = nullptr;
1349 Reason disconnectReason = Reason::ConnectionTimedOut;
1350 _this->_wsPingLastTime = 0;
1351
1352 while (_this->_state != NetworkState::None) {
1353 Thread::Sleep(ProcessingIntervalMs);
1354
1355 SmallVector<WsQueuedEvent, 0> pending;
1356 {
1357 std::unique_lock<Spinlock> lock(_this->_wsLock);
1358 std::swap(pending, _this->_wsPendingEvents);
1359 }
1360
1361 for (auto& ev : pending) {
1362 switch (ev.type) {
1363 case WsQueuedEvent::Type::Open: {
1364 wasConnected = true;
1365 serverPeer = ev.peer;
1366 disconnectReason = Reason::Unknown;
1367 _this->_state = NetworkState::Connected;
1368 _this->_wsPingLastTime = GetCurrentTimeMs();
1369 Peer connectedPeer = Peer::FromWebSocket(ev.peer);
1370 {
1371 std::unique_lock lock(_this->_lock);
1372 _this->_connectedPeers.push_back(connectedPeer);
1373 }
1374 ConnectionResult result = _this->OnPeerConnected(connectedPeer, ev.clientData);
1375 if (!result.IsSuccessful()) {
1376 ev.peer->close(ReasonToWsCloseCode(result.FailureReason), ReasonToString(result.FailureReason));
1377 }
1378 break;
1379 }
1380 case WsQueuedEvent::Type::Close: {
1381 disconnectReason = WsCloseCodeToReason(ev.closeCode, wasConnected);
1382 _this->_state = NetworkState::None;
1383 break;
1384 }
1385 case WsQueuedEvent::Type::Message: {
1386 if (ev.data.size() >= 1) {
1387 std::uint8_t pktType = (std::uint8_t)ev.data[0];
1388 if DEATH_UNLIKELY(pktType == (std::uint8_t)ServerPacketType::Pong && ev.data.size() >= 1 + 8) {
1389 // Intercept Pong: compute RTT from echoed timestamp
1390 std::uint64_t sentTime;
1391 std::memcpy(&sentTime, ev.data.data() + 1, 8);
1392 std::uint64_t rtt = GetCurrentTimeMs() - sentTime;
1393 _this->_wsRtt.store((std::uint32_t)rtt, std::memory_order_relaxed);
1394 } else {
1395 handler->OnPacketReceived(Peer::FromWebSocket(ev.peer), 0,
1396 pktType, arrayView((const std::uint8_t*)ev.data.data() + 1, ev.data.size() - 1));
1397 }

Callers

nothing calls this directly

Calls 14

ReasonToWsCloseCodeFunction · 0.85
WsCloseCodeToReasonFunction · 0.85
IsSuccessfulMethod · 0.80
DEATH_UNLIKELYFunction · 0.70
swapFunction · 0.50
arrayViewFunction · 0.50
push_backMethod · 0.45
OnPeerConnectedMethod · 0.45
closeMethod · 0.45
sizeMethod · 0.45
dataMethod · 0.45
OnPacketReceivedMethod · 0.45

Tested by

no test coverage detected