feat(visitors): Retries as a visitor when max occupants reached.

This commit is contained in:
damencho
2025-09-18 11:19:49 -05:00
parent 54dcd5458b
commit c4ed416f97
2 changed files with 36 additions and 8 deletions

View File

@@ -26,7 +26,7 @@ import { AudioMixerEffect } from '../../stream-effects/audio-mixer/AudioMixerEff
import { iAmVisitor } from '../../visitors/functions'; import { iAmVisitor } from '../../visitors/functions';
import { overwriteConfig } from '../config/actions'; import { overwriteConfig } from '../config/actions';
import { CONNECTION_ESTABLISHED, CONNECTION_FAILED, CONNECTION_WILL_CONNECT } from '../connection/actionTypes'; import { CONNECTION_ESTABLISHED, CONNECTION_FAILED, CONNECTION_WILL_CONNECT } from '../connection/actionTypes';
import { connectionDisconnected, disconnect } from '../connection/actions'; import { connect, connectionDisconnected, disconnect, setPreferVisitor } from '../connection/actions';
import { validateJwt } from '../jwt/functions'; import { validateJwt } from '../jwt/functions';
import { JitsiConferenceErrors, JitsiConferenceEvents, JitsiConnectionErrors } from '../lib-jitsi-meet'; import { JitsiConferenceErrors, JitsiConferenceEvents, JitsiConnectionErrors } from '../lib-jitsi-meet';
import { MEDIA_TYPE } from '../media/constants'; import { MEDIA_TYPE } from '../media/constants';
@@ -78,6 +78,11 @@ import { IConferenceMetadata } from './reducer';
*/ */
let beforeUnloadHandler: ((e?: any) => void) | undefined; let beforeUnloadHandler: ((e?: any) => void) | undefined;
/**
* A simple flag to avoid retrying more than once to join as a visitor when hitting max occupants reached.
*/
let retryAsVisitorOnMaxError = true;
/** /**
* Implements the middleware of the feature base/conference. * Implements the middleware of the feature base/conference.
* *
@@ -202,11 +207,20 @@ function _conferenceFailed({ dispatch, getState }: IStore, next: Function, actio
break; break;
} }
case JitsiConferenceErrors.CONFERENCE_MAX_USERS: { case JitsiConferenceErrors.CONFERENCE_MAX_USERS: {
dispatch(showErrorNotification({ let retryAsVisitor = false;
hideErrorSupportLink: true,
descriptionKey: 'dialog.maxUsersLimitReached', if (error.params?.length && error.params[0]?.visitorsSupported) {
titleKey: 'dialog.maxUsersLimitReachedTitle' // visitors are supported, so let's try joining that way
})); retryAsVisitor = true;
}
if (!retryAsVisitor) {
dispatch(showErrorNotification({
hideErrorSupportLink: true,
descriptionKey: 'dialog.maxUsersLimitReached',
titleKey: 'dialog.maxUsersLimitReachedTitle'
}));
}
// In case of max users(it can be from a visitor node), let's restore // In case of max users(it can be from a visitor node), let's restore
// oldConfig if any as we will be back to the main prosody. // oldConfig if any as we will be back to the main prosody.
@@ -220,6 +234,18 @@ function _conferenceFailed({ dispatch, getState }: IStore, next: Function, actio
.then(() => dispatch(disconnect())); .then(() => dispatch(disconnect()));
} }
if (retryAsVisitor && !newConfig && retryAsVisitorOnMaxError) {
retryAsVisitorOnMaxError = false;
logger.info('On max user reached will retry joining as a visitor');
dispatch(disconnect(true)).then(() => {
dispatch(setPreferVisitor(true));
return dispatch(connect());
});
}
break; break;
} }
case JitsiConferenceErrors.NOT_ALLOWED_ERROR: { case JitsiConferenceErrors.NOT_ALLOWED_ERROR: {
@@ -300,6 +326,8 @@ function _conferenceJoined({ dispatch, getState }: IStore, next: Function, actio
requireDisplayName requireDisplayName
} = getState()['features/base/config']; } = getState()['features/base/config'];
retryAsVisitorOnMaxError = true;
dispatch(removeLobbyChatParticipant(true)); dispatch(removeLobbyChatParticipant(true));
pendingSubjectChange && dispatch(setSubject(pendingSubjectChange)); pendingSubjectChange && dispatch(setSubject(pendingSubjectChange));

View File

@@ -43,7 +43,7 @@ local function check_for_max_occupants(event)
-- If there is no whitelist, just check the count. -- If there is no whitelist, just check the count.
if not whitelist and count >= slots then if not whitelist and count >= slots then
module:log("info", "Attempt to enter a maxed out MUC"); module:log("info", "Attempt to enter a maxed out room: %s", room.jid);
origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
return true; return true;
end end
@@ -60,7 +60,7 @@ local function check_for_max_occupants(event)
-- If the room is full (<0 slots left), error out. -- If the room is full (<0 slots left), error out.
if slots <= 0 then if slots <= 0 then
module:log("info", "Attempt to enter a maxed out MUC"); module:log("info", "Attempt to enter a maxed out room:%s", room.jid);
origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
return true; return true;
end end