// @flow import { JitsiRecordingConstants } from '../base/lib-jitsi-meet'; import { isEnabled as isDropboxEnabled } from '../dropbox'; import { RECORDING_STATUS_PRIORITIES, RECORDING_TYPES } from './constants'; /** * Searches in the passed in redux state for an active recording session of the * passed in mode. * * @param {Object} state - The redux state to search in. * @param {string} mode - Find an active recording session of the given mode. * @returns {Object|undefined} */ export function getActiveSession(state: Object, mode: string) { const { sessionDatas } = state['features/recording']; const { status: statusConstants } = JitsiRecordingConstants; return sessionDatas.find(sessionData => sessionData.mode === mode && (sessionData.status === statusConstants.ON || sessionData.status === statusConstants.PENDING)); } /** * Returns an estimated recording duration based on the size of the video file * in MB. The estimate is calculated under the assumption that 1 min of recorded * video needs 10MB of storage on average. * * @param {number} size - The size in MB of the recorded video. * @returns {number} - The estimated duration in minutes. */ export function getRecordingDurationEstimation(size: ?number) { return Math.floor((size || 0) / 10); } /** * Searches in the passed in redux state for a recording session that matches * the passed in recording session ID. * * @param {Object} state - The redux state to search in. * @param {string} id - The ID of the recording session to find. * @returns {Object|undefined} */ export function getSessionById(state: Object, id: string) { return state['features/recording'].sessionDatas.find( sessionData => sessionData.id === id); } /** * Fetches the recording link from the server. * * @param {string} url - The base url. * @param {string} recordingSessionId - The ID of the recording session to find. * @param {string} region - The meeting region. * @param {string} tenant - The meeting tenant. * @returns {Promise} */ export async function getRecordingLink(url: string, recordingSessionId: string, region: string, tenant: string) { const fullUrl = `${url}?recordingSessionId=${recordingSessionId}®ion=${region}&tenant=${tenant}`; const res = await fetch(fullUrl, { headers: { 'Content-Type': 'application/json' } }); const json = await res.json(); return res.ok ? json : Promise.reject(json); } /** * Selector used for determining if recording is saved on dropbox. * * @param {Object} state - The redux state to search in. * @returns {string} */ export function isSavingRecordingOnDropbox(state: Object) { return isDropboxEnabled(state) && state['features/recording'].selectedRecordingService === RECORDING_TYPES.DROPBOX; } /** * Returns the recording session status that is to be shown in a label. E.g. If * there is a session with the status OFF and one with PENDING, then the PENDING * one will be shown, because that is likely more important for the user to see. * * @param {Object} state - The redux state to search in. * @param {string} mode - The recording mode to get status for. * @returns {string|undefined} */ export function getSessionStatusToShow(state: Object, mode: string): ?string { const recordingSessions = state['features/recording'].sessionDatas; let status; if (Array.isArray(recordingSessions)) { for (const session of recordingSessions) { if (session.mode === mode && (!status || (RECORDING_STATUS_PRIORITIES.indexOf(session.status) > RECORDING_STATUS_PRIORITIES.indexOf(status)))) { status = session.status; } } } return status; } /** * Returns the resource id. * * @param {Object | string} recorder - A participant or it's resource. * @returns {string|undefined} */ export function getResourceId(recorder: string | Object) { if (recorder) { return typeof recorder === 'string' ? recorder : recorder.getId(); } }