93 lines
2.8 KiB
TypeScript
93 lines
2.8 KiB
TypeScript
// @ts-expect-error
|
|
import { PostMessageTransportBackend, Transport } from '@jitsi/js-utils/transport';
|
|
|
|
import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from '../base/app/actionTypes';
|
|
import { CONFERENCE_JOINED } from '../base/conference/actionTypes';
|
|
import { PARTICIPANT_LEFT } from '../base/participants/actionTypes';
|
|
import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
|
|
|
|
import {
|
|
clearRequest, setReceiverTransport, setRemoteControlActive, stopController, stopReceiver
|
|
} from './actions';
|
|
import { REMOTE_CONTROL_MESSAGE_NAME } from './constants';
|
|
import { onRemoteControlAPIEvent } from './functions';
|
|
import './subscriber';
|
|
|
|
/**
|
|
* The redux middleware for the remote control feature.
|
|
*
|
|
* @param {Store} store - The redux store.
|
|
* @returns {Function}
|
|
*/
|
|
MiddlewareRegistry.register(store => next => async action => {
|
|
switch (action.type) {
|
|
case APP_WILL_MOUNT: {
|
|
const { dispatch } = store;
|
|
|
|
dispatch(setReceiverTransport(new Transport({
|
|
backend: new PostMessageTransportBackend({
|
|
postisOptions: { scope: 'jitsi-remote-control' }
|
|
})
|
|
})));
|
|
|
|
break;
|
|
}
|
|
case APP_WILL_UNMOUNT: {
|
|
const { getState, dispatch } = store;
|
|
const { transport } = getState()['features/remote-control'].receiver;
|
|
|
|
if (transport) {
|
|
transport.dispose();
|
|
dispatch(setReceiverTransport());
|
|
}
|
|
|
|
break;
|
|
}
|
|
case CONFERENCE_JOINED: {
|
|
const result = next(action);
|
|
const { getState } = store;
|
|
const { transport } = getState()['features/remote-control'].receiver;
|
|
|
|
if (transport) {
|
|
// We expect here that even if we receive the supported event earlier
|
|
// it will be cached and we'll receive it.
|
|
transport.on('event', (event: { name: string; type: string; }) => {
|
|
if (event.name === REMOTE_CONTROL_MESSAGE_NAME) {
|
|
onRemoteControlAPIEvent(event, store);
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
});
|
|
}
|
|
|
|
return result;
|
|
}
|
|
case PARTICIPANT_LEFT: {
|
|
const { getState, dispatch } = store;
|
|
const state = getState();
|
|
const { id } = action.participant;
|
|
const { receiver, controller } = state['features/remote-control'];
|
|
const { requestedParticipant, controlled } = controller;
|
|
|
|
if (id === controlled) {
|
|
dispatch(stopController());
|
|
}
|
|
|
|
if (id === requestedParticipant) {
|
|
dispatch(clearRequest());
|
|
dispatch(setRemoteControlActive(false));
|
|
}
|
|
|
|
if (receiver?.controller === id) {
|
|
dispatch(stopReceiver(false, true));
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
return next(action);
|
|
});
|