cache dynamic turn credentials

This commit is contained in:
Michael Zanetti 2018-04-05 23:32:18 +02:00
parent b502a399e5
commit 9e603cb536
4 changed files with 25 additions and 5 deletions

View File

@ -217,6 +217,8 @@ void AWSConnector::onPairingsRetrieved(const QVariantMap &pairings)
m_setupInProgress = false; m_setupInProgress = false;
emit connected(); emit connected();
requestTURNCredentials();
} }
void AWSConnector::disconnectAWS() void AWSConnector::disconnectAWS()
@ -284,6 +286,10 @@ void AWSConnector::requestTURNCredentials()
emit turnCredentialsReceived(QVariantMap()); emit turnCredentialsReceived(QVariantMap());
return; return;
} }
if (!m_cachedTURNCredentials.first.isEmpty() && QDateTime::currentDateTime().secsTo(m_cachedTURNCredentials.second) > 0) {
emit turnCredentialsReceived(m_cachedTURNCredentials.first);
return;
}
qCDebug(dcAWS()) << "Requesting TURN credentials"; qCDebug(dcAWS()) << "Requesting TURN credentials";
QVariantMap params; QVariantMap params;
params.insert("id", QUuid::createUuid()); params.insert("id", QUuid::createUuid());
@ -344,6 +350,19 @@ void AWSConnector::onDisconnected()
} }
} }
void AWSConnector::onTurnCredentialsReceived(const QVariantMap &turnCredentials)
{
qCDebug(dcAWS()) << "Dynamic TURN credentials received";
m_cachedTURNCredentials.first = turnCredentials;
m_cachedTURNCredentials.second = QDateTime::currentDateTime().addSecs(turnCredentials.value("ttl").toInt());
emit turnCredentialsReceived(turnCredentials);
// refresh the cache
QTimer::singleShot((turnCredentials.value("ttl").toInt() - 10) * 1000, this, &AWSConnector::requestTURNCredentials);
qCDebug(dcAWS()) << "Refreshing TURN credentials in" << (turnCredentials.value("ttl").toInt() - 10) << "seconds.";
}
void AWSConnector::setName() void AWSConnector::setName()
{ {
QVariantMap params; QVariantMap params;
@ -513,8 +532,7 @@ ResponseCode AWSConnector::onSubscriptionReceivedCallback(util::String topic_nam
qCWarning(dcAWS()) << "Error retrieving TURN credentials:" << turnCreds.value("result").toMap().value("code").toInt() << turnCreds.value("result").toMap().value("message").toString(); qCWarning(dcAWS()) << "Error retrieving TURN credentials:" << turnCreds.value("result").toMap().value("code").toInt() << turnCreds.value("result").toMap().value("message").toString();
return ResponseCode::SUCCESS; return ResponseCode::SUCCESS;
} }
qCDebug(dcAWS()) << "Dynamic TURN credentials received"; connector->staticMetaObject.invokeMethod(connector, "onTurnCredentialsReceived", Qt::QueuedConnection, Q_ARG(QVariantMap, turnCreds.value("turnCredentials").toMap()));
emit connector->turnCredentialsReceived(turnCreds.value("turnCredentials").toMap());
} else { } else {
qCWarning(dcAWS()) << "Unhandled subscription received!" << topic << QString::fromStdString(payload); qCWarning(dcAWS()) << "Unhandled subscription received!" << topic << QString::fromStdString(payload);
} }

View File

@ -79,6 +79,7 @@ private slots:
void onPairingsRetrieved(const QVariantMap &pairings); void onPairingsRetrieved(const QVariantMap &pairings);
void setName(); void setName();
void onDisconnected(); void onDisconnected();
void onTurnCredentialsReceived(const QVariantMap &turnCredentials);
private: private:
class SubscriptionContext: public awsiotsdk::mqtt::SubscriptionHandlerContextData class SubscriptionContext: public awsiotsdk::mqtt::SubscriptionHandlerContextData
@ -132,6 +133,7 @@ private:
int m_reconnectCounter = 0; int m_reconnectCounter = 0;
QDateTime m_lastConnectionDrop; QDateTime m_lastConnectionDrop;
QStringList m_subscriptionCache; QStringList m_subscriptionCache;
QPair<QVariantMap, QDateTime> m_cachedTURNCredentials;
std::shared_ptr<awsiotsdk::mqtt::SubscriptionHandlerContextData> m_subscriptionContextData; std::shared_ptr<awsiotsdk::mqtt::SubscriptionHandlerContextData> m_subscriptionContextData;
std::shared_ptr<awsiotsdk::DisconnectCallbackContextData> m_disconnectContextData; std::shared_ptr<awsiotsdk::DisconnectCallbackContextData> m_disconnectContextData;

View File

@ -38,7 +38,7 @@ JanusConnector::JanusConnector(QObject *parent) : QObject(parent)
// When Janus crashes it will leave the socket in a very broken state which causes QLocalSocket to spin the CPU // When Janus crashes it will leave the socket in a very broken state which causes QLocalSocket to spin the CPU
// So let's use a rather short heartbeat to send ping messages and clean things up in case they are not acked. // So let's use a rather short heartbeat to send ping messages and clean things up in case they are not acked.
m_pingTimer.setInterval(1000); m_pingTimer.setInterval(5000);
connect(&m_pingTimer, &QTimer::timeout, this, &JanusConnector::heartbeat); connect(&m_pingTimer, &QTimer::timeout, this, &JanusConnector::heartbeat);
m_turnCredentialsServer = new QTcpServer(this); m_turnCredentialsServer = new QTcpServer(this);
@ -177,7 +177,7 @@ void JanusConnector::setTurnCredentials(const QVariantMap &turnCredentials)
while (!m_pendingTurnCredentialRequests.isEmpty()) { while (!m_pendingTurnCredentialRequests.isEmpty()) {
QJsonDocument jsonDoc = QJsonDocument::fromVariant(turnCredentials); QJsonDocument jsonDoc = QJsonDocument::fromVariant(turnCredentials);
QByteArray content = jsonDoc.toJson(QJsonDocument::Compact); QByteArray content = jsonDoc.toJson(QJsonDocument::Compact);
qCDebug(dcJanus()) << "Providing TURN credentials to Janus."; qCDebug(dcJanus()) << "Providing TURN credentials to Janus." << qUtf8Printable(jsonDoc.toJson(QJsonDocument::Indented));
QTcpSocket* socket = m_pendingTurnCredentialRequests.takeFirst(); QTcpSocket* socket = m_pendingTurnCredentialRequests.takeFirst();
QByteArray reply = QByteArray("HTTP/1.1 200 Ok\r\n"); QByteArray reply = QByteArray("HTTP/1.1 200 Ok\r\n");
reply.append("Content-Type: application/json\r\n"); reply.append("Content-Type: application/json\r\n");

View File

@ -1370,7 +1370,7 @@ void DeviceManager::onAutoDevicesAppeared(const DeviceClassId &deviceClassId, co
{ {
DeviceClass deviceClass = findDeviceClass(deviceClassId); DeviceClass deviceClass = findDeviceClass(deviceClassId);
if (!deviceClass.isValid()) { if (!deviceClass.isValid()) {
qCWarning(dcDeviceManager()) << "Auto device appeared for an unknown DeviceClass. Ignoring..."; qCWarning(dcDeviceManager()) << "Ignoring auto device appeared for an unknown DeviceClass" << deviceClassId;
return; return;
} }