| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | // @flow
import {
    JitsiConferenceErrors,
    isFatalJitsiConferenceError,
    isFatalJitsiConnectionError
} from '../base/lib-jitsi-meet';
import { StateListenerRegistry } from '../base/redux';
import { setFatalError } from './actions';
declare var APP: Object;
/**
 * List of errors that are not fatal (or handled differently) so then the overlays won't kick in.
 */
const NON_OVERLAY_ERRORS = [
    JitsiConferenceErrors.CONFERENCE_ACCESS_DENIED,
    JitsiConferenceErrors.CONFERENCE_DESTROYED,
    JitsiConferenceErrors.CONNECTION_ERROR
];
const ERROR_TYPES = {
    CONFIG: 'CONFIG',
    CONNECTION: 'CONNECTION',
    CONFERENCE: 'CONFERENCE'
};
/**
 * Gets the error type and whether it's fatal or not.
 *
 * @param {Function} getState - The redux function for fetching the current state.
 * @param {Object|string} error - The error to process.
 * @returns {void}
 */
const getErrorExtraInfo = (getState, error) => {
    const state = getState();
    const { error: conferenceError } = state['features/base/conference'];
    const { error: configError } = state['features/base/config'];
    const { error: connectionError } = state['features/base/connection'];
    if (error === conferenceError) {
        return {
            type: ERROR_TYPES.CONFERENCE,
            isFatal: isFatalJitsiConferenceError(error.name || error)
        };
    }
    if (error === configError) {
        return {
            type: ERROR_TYPES.CONFIG,
            isFatal: true
        };
    }
    if (error === connectionError) {
        return {
            type: ERROR_TYPES.CONNECTION,
            isFatal: isFatalJitsiConnectionError(error.name || error)
        };
    }
};
/**
 * State listener which emits the {@code fatalErrorOccurred} action which works
 * as a catch all for critical errors which have not been claimed by any other
 * feature for error recovery (the recoverable flag is not set).
 */
StateListenerRegistry.register(
    /* selector */ state => {
        const { error: conferenceError } = state['features/base/conference'];
        const { error: configError } = state['features/base/config'];
        const { error: connectionError } = state['features/base/connection'];
        return configError || connectionError || conferenceError;
    },
    /* listener */ (error, { dispatch, getState }) => {
        if (!error) {
            return;
        }
        if (typeof APP !== 'undefined') {
            const parsedError = typeof error === 'string' ? { name: error } : error;
            APP.API.notifyError({
                ...parsedError,
                ...getErrorExtraInfo(getState, error)
            });
        }
        if (NON_OVERLAY_ERRORS.indexOf(error.name) === -1 && typeof error.recoverable === 'undefined') {
            dispatch(setFatalError(error));
        }
    }
);
 |