Fixed timeout

This commit is contained in:
Torsten Schulz
2024-02-15 17:06:02 +01:00
parent bbf8412f7c
commit a580b51f1a
4 changed files with 24 additions and 13 deletions

View File

@@ -1012,14 +1012,18 @@ void App::showHistory(Wt::Json::Object broadcast) {
void App::connectionTimedOut() { void App::connectionTimedOut() {
showLogin(); showLogin();
loginTimer_->stop();
timeoutRemainingTimer_->stop();
menuContainer_->clear();
userListContainer_->clear();
triggerUpdate(); triggerUpdate();
} }
void App::addLoginTimeView() { void App::addLoginTimeView() {
auto loggedinTimeWidget = menuContainer_->addNew<Wt::WText>(); auto loggedinTimeWidget = menuContainer_->addNew<Wt::WText>();
loggedinTimeWidget->setStyleClass("menu-info-text"); loggedinTimeWidget->setStyleClass("menu-info-text");
auto loginTimer = root()->addChild(std::make_unique<Wt::WTimer>()); loginTimer_ = root()->addChild(std::make_unique<Wt::WTimer>());
loginTimer->setInterval(std::chrono::seconds(1)); loginTimer_->setInterval(std::chrono::seconds(1));
auto loggedInRefresh = [=, this]() { auto loggedInRefresh = [=, this]() {
auto currentLoginSeconds = currentlyLoggedInSeconds(); auto currentLoginSeconds = currentlyLoggedInSeconds();
int hours = currentLoginSeconds / 3600; int hours = currentLoginSeconds / 3600;
@@ -1030,16 +1034,16 @@ void App::addLoginTimeView() {
std::string elapsedTimeString = elapsedTimeStream.str(); std::string elapsedTimeString = elapsedTimeStream.str();
loggedinTimeWidget->setText(Wt::WString("In chat for {1}").arg(elapsedTimeString)); loggedinTimeWidget->setText(Wt::WString("In chat for {1}").arg(elapsedTimeString));
}; };
loginTimer->timeout().connect(loggedInRefresh); loginTimer_->timeout().connect(loggedInRefresh);
loggedInRefresh(); loggedInRefresh();
loginTimer->start(); loginTimer_->start();
} }
void App::addTimeoutView() { void App::addTimeoutView() {
auto timeoutRemainingWidget = menuContainer_->addNew<Wt::WText>(); auto timeoutRemainingWidget = menuContainer_->addNew<Wt::WText>();
timeoutRemainingWidget->setStyleClass("menu-info-text"); timeoutRemainingWidget->setStyleClass("menu-info-text");
auto timeoutRemainingTimer = root()->addChild(std::make_unique<Wt::WTimer>()); timeoutRemainingTimer_ = root()->addChild(std::make_unique<Wt::WTimer>());
timeoutRemainingTimer->setInterval(std::chrono::milliseconds(500)); timeoutRemainingTimer_->setInterval(std::chrono::milliseconds(500));
auto timeoutRemainingRefresh = [=, this]() { auto timeoutRemainingRefresh = [=, this]() {
auto remainingLoginSeconds = remainingSecondsToTimeout(); auto remainingLoginSeconds = remainingSecondsToTimeout();
int minutes = remainingLoginSeconds / 60; int minutes = remainingLoginSeconds / 60;
@@ -1050,9 +1054,9 @@ void App::addTimeoutView() {
std::string elapsedTimeString = remainingTimeStream.str(); std::string elapsedTimeString = remainingTimeStream.str();
timeoutRemainingWidget->setText(Wt::WString("Remaining time before logout is {1}").arg(elapsedTimeString)); timeoutRemainingWidget->setText(Wt::WString("Remaining time before logout is {1}").arg(elapsedTimeString));
}; };
timeoutRemainingTimer->timeout().connect(timeoutRemainingRefresh); timeoutRemainingTimer_->timeout().connect(timeoutRemainingRefresh);
timeoutRemainingRefresh(); timeoutRemainingRefresh();
timeoutRemainingTimer->start(); timeoutRemainingTimer_->start();
} }
void App::itemChanged(Wt::WCheckBox *item, Wt::WContainerWidget *dropDownContainer, Wt::WPushButton *openButton, std::unordered_set<std::string> *saveItems) { void App::itemChanged(Wt::WCheckBox *item, Wt::WContainerWidget *dropDownContainer, Wt::WPushButton *openButton, std::unordered_set<std::string> *saveItems) {

View File

@@ -90,6 +90,8 @@ private:
int messageCursorPosition_{-1}; int messageCursorPosition_{-1};
std::unique_ptr<Wt::WSound> messageReceived_; std::unique_ptr<Wt::WSound> messageReceived_;
Search searchFields; Search searchFields;
Wt::WTimer *loginTimer_;
Wt::WTimer *timeoutRemainingTimer_;
void setMetaTags(); void setMetaTags();
void initApp(); void initApp();
void reSetUser(); void reSetUser();

View File

@@ -143,17 +143,22 @@ void Broadcast::run() {
{"type", "timedout"}, {"type", "timedout"},
{"data", "dummy"} {"data", "dummy"}
}; };
std::vector<Client *> toDisconnect;
for (;;) { for (;;) {
std::this_thread::sleep_for(std::chrono::milliseconds(100)); std::this_thread::sleep_for(std::chrono::milliseconds(100));
for (auto clientToDisconnect: toDisconnect) {
disconnect(clientToDisconnect);
}
toDisconnect.clear();
if (stop_) { if (stop_) {
return; return;
} }
std::unique_lock<std::mutex> lock(mutex_); std::unique_lock<std::mutex> lock(mutex_);
for (auto &connection: connections_) { for (auto &connection: connections_) {
if (connection->client()->activitiesTimedOut()) { if (connection->client()->activitiesTimedOut()) {
disconnect(connection->client()); auto sessionId = connection->sessionId();
addMessageToSessionBroadcast(connection->sessionId(), timedoutBroadcast); toDisconnect.push_back(connection->client());
continue; addMessageToSessionBroadcast(sessionId, timedoutBroadcast);
} }
if (connection->getBroadcasts().size() == 0) { if (connection->getBroadcasts().size() == 0) {
continue; continue;
@@ -605,7 +610,7 @@ void Client::setActivity() {
} }
bool Client::activitiesTimedOut() { bool Client::activitiesTimedOut() {
auto timeDifference = Wt::WDateTime::currentDateTime().secsTo(lastActivity_); auto timeDifference = lastActivity_.secsTo(Wt::WDateTime::currentDateTime());
return timeDifference > timeoutSeconds; return timeDifference > timeoutSeconds;
} }

View File

@@ -40,7 +40,7 @@ protected:
void setLoggedIn(); void setLoggedIn();
void setLoggedOut(); void setLoggedOut();
private: private:
const int timeoutSeconds {1800}; const int timeoutSeconds {5};
Wt::WDateTime lastActivity_; Wt::WDateTime lastActivity_;
Wt::WDateTime loginTimeStamp_; Wt::WDateTime loginTimeStamp_;
}; };