Will override email, display name and avatar URL with the values provided in 'context.user' structure of the JWT token. Settings will no longer be used to retrieve local display name, email and avatar URL. Now those values will be obtained from the /features/base/participants Redux state. fix(jwt/middleware): use const for default name fix: wrong default display name on web ref(base/participants): remove getDisplayName functions ref(jwt): do not accept unknown user fields
153 lines
5.0 KiB
JavaScript
153 lines
5.0 KiB
JavaScript
import {
|
|
AVATAR_ID_COMMAND,
|
|
AVATAR_URL_COMMAND,
|
|
EMAIL_COMMAND
|
|
} from './constants';
|
|
import { JitsiTrackErrors } from '../lib-jitsi-meet';
|
|
import { getLocalParticipant } from '../participants';
|
|
import { toState } from '../redux';
|
|
|
|
/**
|
|
* Attach a set of local tracks to a conference.
|
|
*
|
|
* @param {JitsiConference} conference - Conference instance.
|
|
* @param {JitsiLocalTrack[]} localTracks - List of local media tracks.
|
|
* @protected
|
|
* @returns {Promise}
|
|
*/
|
|
export function _addLocalTracksToConference(conference, localTracks) {
|
|
const conferenceLocalTracks = conference.getLocalTracks();
|
|
const promises = [];
|
|
|
|
for (const track of localTracks) {
|
|
// XXX The library lib-jitsi-meet may be draconian, for example, when
|
|
// adding one and the same video track multiple times.
|
|
if (conferenceLocalTracks.indexOf(track) === -1) {
|
|
promises.push(
|
|
conference.addTrack(track).catch(err => {
|
|
_reportError(
|
|
'Failed to add local track to conference',
|
|
err);
|
|
}));
|
|
}
|
|
}
|
|
|
|
return Promise.all(promises);
|
|
}
|
|
|
|
/**
|
|
* Returns the current {@code JitsiConference} which is joining or joined and is
|
|
* not leaving. Please note the contrast with merely reading the
|
|
* {@code conference} state of the feature base/conference which is not joining
|
|
* but may be leaving already.
|
|
*
|
|
* @param {Function|Object} stateful - The redux store, state, or
|
|
* {@code getState} function.
|
|
* @returns {JitsiConference|undefined}
|
|
*/
|
|
export function getCurrentConference(stateful) {
|
|
const { conference, joining, leaving }
|
|
= toState(stateful)['features/base/conference'];
|
|
|
|
return (
|
|
conference
|
|
? conference === leaving ? undefined : conference
|
|
: joining);
|
|
}
|
|
|
|
/**
|
|
* Handle an error thrown by the backend (i.e. lib-jitsi-meet) while
|
|
* manipulating a conference participant (e.g. pin or select participant).
|
|
*
|
|
* @param {Error} err - The Error which was thrown by the backend while
|
|
* manipulating a conference participant and which is to be handled.
|
|
* @protected
|
|
* @returns {void}
|
|
*/
|
|
export function _handleParticipantError(err) {
|
|
// XXX DataChannels are initialized at some later point when the conference
|
|
// has multiple participants, but code that pins or selects a participant
|
|
// might be executed before. So here we're swallowing a particular error.
|
|
// TODO Lib-jitsi-meet should be fixed to not throw such an exception in
|
|
// these scenarios.
|
|
if (err.message !== 'Data channels support is disabled!') {
|
|
throw err;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Determines whether a specific string is a valid room name.
|
|
*
|
|
* @param {(string|undefined)} room - The name of the conference room to check
|
|
* for validity.
|
|
* @returns {boolean} If the specified room name is valid, then true; otherwise,
|
|
* false.
|
|
*/
|
|
export function isRoomValid(room) {
|
|
return typeof room === 'string' && room !== '';
|
|
}
|
|
|
|
/**
|
|
* Remove a set of local tracks from a conference.
|
|
*
|
|
* @param {JitsiConference} conference - Conference instance.
|
|
* @param {JitsiLocalTrack[]} localTracks - List of local media tracks.
|
|
* @protected
|
|
* @returns {Promise}
|
|
*/
|
|
export function _removeLocalTracksFromConference(conference, localTracks) {
|
|
return Promise.all(localTracks.map(track =>
|
|
conference.removeTrack(track)
|
|
.catch(err => {
|
|
// Local track might be already disposed by direct
|
|
// JitsiTrack#dispose() call. So we should ignore this error
|
|
// here.
|
|
if (err.name !== JitsiTrackErrors.TRACK_IS_DISPOSED) {
|
|
_reportError(
|
|
'Failed to remove local track from conference',
|
|
err);
|
|
}
|
|
})
|
|
));
|
|
}
|
|
|
|
/**
|
|
* Reports a specific Error with a specific error message. While the
|
|
* implementation merely logs the specified msg and err via the console at the
|
|
* time of this writing, the intention of the function is to abstract the
|
|
* reporting of errors and facilitate elaborating on it in the future.
|
|
*
|
|
* @param {string} msg - The error message to report.
|
|
* @param {Error} err - The Error to report.
|
|
* @private
|
|
* @returns {void}
|
|
*/
|
|
function _reportError(msg, err) {
|
|
// TODO This is a good point to call some global error handler when we have
|
|
// one.
|
|
console.error(msg, err);
|
|
}
|
|
|
|
/**
|
|
* Sets the data like avatar URL, email and display name for the local
|
|
* participant to the conference.
|
|
*
|
|
* @param {JitsiConference} conference - The JitsiConference instance.
|
|
* @param {Object} state - The whole Redux state.
|
|
* @returns {void}
|
|
*/
|
|
export function setLocalParticipantData(conference, state) {
|
|
const { avatarID, avatarURL, email, name } = getLocalParticipant(state);
|
|
|
|
avatarID && conference.sendCommand(AVATAR_ID_COMMAND, {
|
|
value: avatarID
|
|
});
|
|
avatarURL && conference.sendCommand(AVATAR_URL_COMMAND, {
|
|
value: avatarURL
|
|
});
|
|
email && conference.sendCommand(EMAIL_COMMAND, {
|
|
value: email
|
|
});
|
|
conference.setDisplayName(name);
|
|
}
|