fix(eventsub): retry if the WS session expired (#6093)
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user