From: tobtoht Date: Wed, 23 Feb 2022 23:42:06 +0000 (+0100) Subject: Websocket: add fallback X-Git-Url: https://git.nutra.tk/v1?a=commitdiff_plain;h=c10a6a38297f251055790ccb784867304487aedc;p=gamesguru%2Ffeather.git Websocket: add fallback --- diff --git a/src/constants.h b/src/constants.h index 73d9edff..9b2794b1 100644 --- a/src/constants.h +++ b/src/constants.h @@ -27,7 +27,10 @@ namespace constants const int donationBoundary = 25; // websocket constants - const QUrl websocketUrl = QUrl(QStringLiteral("ws://7e6egbawekbkxzkv4244pqeqgoo4axko2imgjbedwnn6s5yb6b7oliqd.onion/ws")); + const QVector websocketUrls = { + QUrl(QStringLiteral("ws://7e6egbawekbkxzkv4244pqeqgoo4axko2imgjbedwnn6s5yb6b7oliqd.onion/ws")), + QUrl(QStringLiteral("ws://an5ecwgzyujqe7jverkp42d22zhvjes2mrhvol6tpqcgfkzwseqrafqd.onion/ws")) + }; // website constants const QString websiteUrl = "https://featherwallet.org"; diff --git a/src/utils/WebsocketClient.cpp b/src/utils/WebsocketClient.cpp index 7168d81e..ff915e3f 100644 --- a/src/utils/WebsocketClient.cpp +++ b/src/utils/WebsocketClient.cpp @@ -9,6 +9,7 @@ WebsocketClient::WebsocketClient(QObject *parent) : QObject(parent) { + connect(&webSocket, &QWebSocket::stateChanged, this, &WebsocketClient::onStateChanged); connect(&webSocket, &QWebSocket::connected, this, &WebsocketClient::onConnected); connect(&webSocket, &QWebSocket::disconnected, this, &WebsocketClient::onDisconnected); connect(&webSocket, QOverload::of(&QWebSocket::error), this, &WebsocketClient::onError); @@ -23,6 +24,11 @@ WebsocketClient::WebsocketClient(QObject *parent) }); m_pingTimer.setInterval(30 * 1000); m_pingTimer.start(); + + connect(&m_connectionTimeout, &QTimer::timeout, this, &WebsocketClient::onConnectionTimeout); + + m_websocketUrlIndex = QRandomGenerator::global()->bounded(constants::websocketUrls.length()); + this->nextWebsocketUrl(); } void WebsocketClient::sendMsg(const QByteArray &data) { @@ -48,9 +54,19 @@ void WebsocketClient::onConnected() { void WebsocketClient::onDisconnected() { qDebug() << "WebSocket disconnected"; + this->nextWebsocketUrl(); QTimer::singleShot(1000, [this]{this->start();}); } +void WebsocketClient::onStateChanged(QAbstractSocket::SocketState state) { + if (state == QAbstractSocket::ConnectingState) { + m_connectionTimeout.start(m_timeout*1000); + } + else if (state == QAbstractSocket::ConnectedState) { + m_connectionTimeout.stop(); + } +} + void WebsocketClient::onError(QAbstractSocket::SocketError error) { qCritical() << "WebSocket error: " << error; auto state = webSocket.state(); @@ -59,8 +75,19 @@ void WebsocketClient::onError(QAbstractSocket::SocketError error) { } } +void WebsocketClient::nextWebsocketUrl() { + m_url = constants::websocketUrls[m_websocketUrlIndex]; + m_websocketUrlIndex = (m_websocketUrlIndex+1)%constants::websocketUrls.length(); +} + +void WebsocketClient::onConnectionTimeout() { + qWarning() << "Websocket connection timeout"; + m_timeout = std::min(m_timeout + 5, 60); + this->onDisconnected(); +} + void WebsocketClient::onbinaryMessageReceived(const QByteArray &message) { - qDebug() << "WebSocket received:" << message; +// qDebug() << "WebSocket received:" << message; if (!Utils::validateJSON(message)) { qCritical() << "Could not interpret WebSocket message as JSON"; diff --git a/src/utils/WebsocketClient.h b/src/utils/WebsocketClient.h index ae97da57..d2479a34 100644 --- a/src/utils/WebsocketClient.h +++ b/src/utils/WebsocketClient.h @@ -27,12 +27,18 @@ signals: private slots: void onConnected(); void onDisconnected(); + void onStateChanged(QAbstractSocket::SocketState state); void onbinaryMessageReceived(const QByteArray &message); void onError(QAbstractSocket::SocketError error); + void nextWebsocketUrl(); + void onConnectionTimeout(); private: - QUrl m_url = constants::websocketUrl; + QUrl m_url; QTimer m_pingTimer; + QTimer m_connectionTimeout; + int m_timeout = 10; + int m_websocketUrlIndex = 0; }; #endif //FEATHER_WEBSOCKETCLIENT_H