fix(eventsub): retry if the WS session expired (#6093)

This commit is contained in:
nerix
2025-03-17 15:12:22 +01:00
committed by GitHub
parent 8950236d64
commit 8c4363c92a
4 changed files with 32 additions and 7 deletions
+10 -1
View File
@@ -3271,7 +3271,16 @@ void Helix::createEventSubSubscription(
switch (*result.status())
{
case 400: {
failureCallback(Error::BadRequest, message);
if (message.startsWith(
"websocket transport session does not exist",
Qt::CaseInsensitive))
{
failureCallback(Error::NoSession, message);
}
else
{
failureCallback(Error::BadRequest, message);
}
}
break;
+1
View File
@@ -864,6 +864,7 @@ enum class HelixCreateEventSubSubscriptionError : std::uint8_t {
Forbidden,
Conflict,
Ratelimited,
NoSession,
// The error message is forwarded directly from the Twitch API
Forwarded,
+20 -5
View File
@@ -323,6 +323,8 @@ void Controller::subscribe(const SubscriptionRequest &request, bool isRetry)
},
[this, request](const auto &error, const auto &errorString) {
using Error = HelixCreateEventSubSubscriptionError;
bool retry = false;
switch (error)
{
case Error::BadRequest:
@@ -347,18 +349,31 @@ void Controller::subscribe(const SubscriptionRequest &request, bool isRetry)
qCDebug(LOG) << "Ratelimited" << errorString << request;
break;
case Error::NoSession:
qCDebug(LOG) << "Session expired, retrying"
<< errorString << request;
retry = true;
break;
case Error::Forwarded:
default:
qCWarning(LOG) << "Unhandled error, retrying "
"subscription"
<< errorString << request;
boost::asio::post(this->ioContext, [this, request] {
this->retrySubscription(request);
});
return;
retry = true;
break;
}
this->markRequestFailed(request);
if (retry)
{
boost::asio::post(this->ioContext, [this, request] {
this->retrySubscription(request);
});
}
else
{
this->markRequestFailed(request);
}
});
return;