jiti-meet/react/features/videosipgw/middleware.js

181 lines
5.2 KiB
JavaScript
Raw Normal View History

/* @flow */
import Logger from 'jitsi-meet-logger';
import { CONFERENCE_WILL_JOIN } from '../base/conference';
import {
SIP_GW_AVAILABILITY_CHANGED,
SIP_GW_INVITE_ROOMS
} from './actionTypes';
import {
JitsiConferenceEvents,
JitsiSIPVideoGWStatus
} from '../base/lib-jitsi-meet';
import { MiddlewareRegistry } from '../base/redux';
import {
showErrorNotification,
showNotification,
showWarningNotification
} from '../notifications';
const logger = Logger.getLogger(__filename);
/**
* Middleware that captures conference video sip gw events and stores
* the global sip gw availability in redux or show appropriate notification
* for sip gw sessions.
* Captures invitation actions that create sip gw sessions or display
* appropriate error/warning notifications.
*
* @param {Store} store - The redux store.
* @returns {Function}
*/
MiddlewareRegistry.register(({ dispatch, getState }) => next => action => {
const result = next(action);
switch (action.type) {
case CONFERENCE_WILL_JOIN: {
const conference = getState()['features/base/conference'].joining;
conference.on(
JitsiConferenceEvents.VIDEO_SIP_GW_AVAILABILITY_CHANGED,
(...args) => dispatch(_availabilityChanged(...args)));
conference.on(
JitsiConferenceEvents.VIDEO_SIP_GW_SESSION_STATE_CHANGED,
event => {
const toDispatch = _sessionStateChanged(event);
// sessionStateChanged can decide there is nothing to dispatch
if (toDispatch) {
dispatch(toDispatch);
}
});
break;
}
feat(recording): frontend logic can support live streaming and recording (#2952) * feat(recording): frontend logic can support live streaming and recording Instead of either live streaming or recording, now both can live together. The changes to facilitate such include the following: - Killing the state storing in Recording.js. Instead state is stored in the lib and updated in redux for labels to display the necessary state updates. - Creating a new container, Labels, for recording labels. Previously labels were manually created and positioned. The container can create a reasonable number of labels and only the container itself needs to be positioned with CSS. The VideoQualityLabel has been shoved into the container as well because it moves along with the recording labels. - The action for updating recording state has been modified to enable updating an array of recording sessions to support having multiple sessions. - Confirmation dialogs for stopping and starting a file recording session have been created, as they previously were jquery modals opened by Recording.js. - Toolbox.web displays live streaming and recording buttons based on configuration instead of recording availability. - VideoQualityLabel and RecordingLabel have been simplified to remove any positioning logic, as the Labels container handles such. - Previous recording state update logic has been moved into the RecordingLabel component. Each RecordingLabel is in charge of displaying state for a recording session. The display UX has been left alone. - Sipgw availability is no longer broadcast so remove logic depending on its state. Some moving around of code was necessary to get around linting errors about the existing code being too deeply nested (even though I didn't touch it). * work around lib-jitsi-meet circular dependency issues * refactor labels to use html base * pass in translation keys to video quality label * add video quality classnames for torture tests * break up, rearrange recorder session update listener * add comment about disabling startup resize animation * rename session to sessionData * chore(deps): update to latest lib for recording changes
2018-05-16 14:00:16 +00:00
case SIP_GW_INVITE_ROOMS:
_inviteRooms(action.rooms, action.conference, dispatch);
break;
}
return result;
});
/**
* Signals that sip gw availability had changed.
*
* @param {string} status - The new status of the service.
* @returns {{
* type: SIP_GW_AVAILABILITY_CHANGED,
* status: string
* }}
* @private
*/
function _availabilityChanged(status: string) {
return {
type: SIP_GW_AVAILABILITY_CHANGED,
status
};
}
feat(recording): frontend logic can support live streaming and recording (#2952) * feat(recording): frontend logic can support live streaming and recording Instead of either live streaming or recording, now both can live together. The changes to facilitate such include the following: - Killing the state storing in Recording.js. Instead state is stored in the lib and updated in redux for labels to display the necessary state updates. - Creating a new container, Labels, for recording labels. Previously labels were manually created and positioned. The container can create a reasonable number of labels and only the container itself needs to be positioned with CSS. The VideoQualityLabel has been shoved into the container as well because it moves along with the recording labels. - The action for updating recording state has been modified to enable updating an array of recording sessions to support having multiple sessions. - Confirmation dialogs for stopping and starting a file recording session have been created, as they previously were jquery modals opened by Recording.js. - Toolbox.web displays live streaming and recording buttons based on configuration instead of recording availability. - VideoQualityLabel and RecordingLabel have been simplified to remove any positioning logic, as the Labels container handles such. - Previous recording state update logic has been moved into the RecordingLabel component. Each RecordingLabel is in charge of displaying state for a recording session. The display UX has been left alone. - Sipgw availability is no longer broadcast so remove logic depending on its state. Some moving around of code was necessary to get around linting errors about the existing code being too deeply nested (even though I didn't touch it). * work around lib-jitsi-meet circular dependency issues * refactor labels to use html base * pass in translation keys to video quality label * add video quality classnames for torture tests * break up, rearrange recorder session update listener * add comment about disabling startup resize animation * rename session to sessionData * chore(deps): update to latest lib for recording changes
2018-05-16 14:00:16 +00:00
/**
* Processes the action from the actionType {@code SIP_GW_INVITE_ROOMS} by
* inviting rooms into the conference or showing an error message.
*
* @param {Array} rooms - The conference rooms to invite.
* @param {Object} conference - The JitsiConference to invite the rooms to.
* @param {Function} dispatch - The redux dispatch function for emitting state
* changes (queuing error notifications).
* @private
* @returns {void}
*/
function _inviteRooms(rooms, conference, dispatch) {
for (const room of rooms) {
const { id: sipAddress, name: displayName } = room;
if (sipAddress && displayName) {
const newSession = conference
.createVideoSIPGWSession(sipAddress, displayName);
if (newSession instanceof Error) {
const e = newSession;
switch (e.message) {
case JitsiSIPVideoGWStatus.ERROR_NO_CONNECTION: {
dispatch(showErrorNotification({
descriptionKey: 'videoSIPGW.errorInvite',
titleKey: 'videoSIPGW.errorInviteTitle'
}));
return;
}
case JitsiSIPVideoGWStatus.ERROR_SESSION_EXISTS: {
dispatch(showWarningNotification({
titleKey: 'videoSIPGW.errorAlreadyInvited',
titleArguments: { displayName }
}));
return;
}
}
logger.error(
'Unknown error trying to create sip videogw session',
e);
return;
}
newSession.start();
} else {
logger.error(`No display name or sip number for ${
JSON.stringify(room)}`);
}
}
}
/**
* Signals that a session we created has a change in its status.
*
* @param {string} event - The event describing the session state change.
* @returns {{
* type: SHOW_NOTIFICATION
* }}|null
* @private
*/
function _sessionStateChanged(
event: Object) {
switch (event.newState) {
case JitsiSIPVideoGWStatus.STATE_PENDING: {
return showNotification({
titleKey: 'videoSIPGW.pending',
titleArguments: {
displayName: event.displayName
}
}, 2000);
}
case JitsiSIPVideoGWStatus.STATE_FAILED: {
return showErrorNotification({
titleKey: 'videoSIPGW.errorInviteFailedTitle',
titleArguments: {
displayName: event.displayName
},
descriptionKey: 'videoSIPGW.errorInviteFailed'
});
}
feat(recording): frontend logic can support live streaming and recording (#2952) * feat(recording): frontend logic can support live streaming and recording Instead of either live streaming or recording, now both can live together. The changes to facilitate such include the following: - Killing the state storing in Recording.js. Instead state is stored in the lib and updated in redux for labels to display the necessary state updates. - Creating a new container, Labels, for recording labels. Previously labels were manually created and positioned. The container can create a reasonable number of labels and only the container itself needs to be positioned with CSS. The VideoQualityLabel has been shoved into the container as well because it moves along with the recording labels. - The action for updating recording state has been modified to enable updating an array of recording sessions to support having multiple sessions. - Confirmation dialogs for stopping and starting a file recording session have been created, as they previously were jquery modals opened by Recording.js. - Toolbox.web displays live streaming and recording buttons based on configuration instead of recording availability. - VideoQualityLabel and RecordingLabel have been simplified to remove any positioning logic, as the Labels container handles such. - Previous recording state update logic has been moved into the RecordingLabel component. Each RecordingLabel is in charge of displaying state for a recording session. The display UX has been left alone. - Sipgw availability is no longer broadcast so remove logic depending on its state. Some moving around of code was necessary to get around linting errors about the existing code being too deeply nested (even though I didn't touch it). * work around lib-jitsi-meet circular dependency issues * refactor labels to use html base * pass in translation keys to video quality label * add video quality classnames for torture tests * break up, rearrange recorder session update listener * add comment about disabling startup resize animation * rename session to sessionData * chore(deps): update to latest lib for recording changes
2018-05-16 14:00:16 +00:00
case JitsiSIPVideoGWStatus.STATE_OFF: {
if (event.failureReason === JitsiSIPVideoGWStatus.STATUS_BUSY) {
return showErrorNotification({
descriptionKey: 'videoSIPGW.busy',
titleKey: 'videoSIPGW.busyTitle'
});
} else if (event.failureReason) {
logger.error(`Unknown sip videogw error ${event.newState} ${
event.failureReason}`);
}
}
}
// nothing to show
return null;
}