cache dynamic turn credentials
This commit is contained in:
parent
b502a399e5
commit
9e603cb536
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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");
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user