/* global $, config, JitsiMeetJS */ import 'jquery'; import { setConfigFromURLParams } from '../../react/features/base/config/functions'; import { parseURLParams } from '../../react/features/base/util/parseURLParams'; import { parseURIString } from '../../react/features/base/util/uri'; import { validateLastNLimits, limitLastN } from '../../react/features/base/lastn/functions'; setConfigFromURLParams(config, {}, {}, window.location); const params = parseURLParams(window.location, false, 'hash'); const { isHuman = false } = params; const { localVideo = config.startWithVideoMuted !== true, remoteVideo = isHuman, remoteAudio = isHuman, autoPlayVideo = config.testing.noAutoPlayVideo !== true, } = params; let { localAudio = config.startWithAudioMuted !== true, } = params; const { room: roomName } = parseURIString(window.location.toString()); let connection = null; let room = null; let numParticipants = 1; let localTracks = []; const remoteTracks = {}; let maxFrameHeight = 0; window.APP = { conference: { getStats() { return room.connectionQuality.getStats(); }, getConnectionState() { return room && room.getConnectionState(); }, muteAudio(mute) { localAudio = mute; for (let i = 0; i < localTracks.length; i++) { if (localTracks[i].getType() === 'audio') { if (mute) { localTracks[i].mute(); } else { localTracks[i].unmute(); // if track was not added we need to add it to the peerconnection if (!room.getLocalAudioTrack()) { room.replaceTrack(null, localTracks[i]); } } } } } }, get room() { return room; }, get connection() { return connection; }, get numParticipants() { return numParticipants; }, get localTracks() { return localTracks; }, get remoteTracks() { return remoteTracks; }, get params() { return { roomName, localAudio, localVideo, remoteVideo, remoteAudio, autoPlayVideo }; } }; /** * Simple emulation of jitsi-meet's screen layout behavior */ function updateMaxFrameHeight() { let newMaxFrameHeight; if (numParticipants <= 2) { newMaxFrameHeight = 720; } else if (numParticipants <= 4) { newMaxFrameHeight = 360; } else { newMaxFrameHeight = 180; } if (room && maxFrameHeight !== newMaxFrameHeight) { maxFrameHeight = newMaxFrameHeight; room.setReceiverVideoConstraint(maxFrameHeight); } } /** * Simple emulation of jitsi-meet's lastN behavior */ function updateLastN() { let lastN = typeof config.channelLastN === 'undefined' ? -1 : config.channelLastN; const limitedLastN = limitLastN(numParticipants, validateLastNLimits(config.lastNLimits)); if (limitedLastN !== undefined) { lastN = lastN === -1 ? limitedLastN : Math.min(limitedLastN, lastN); } if (lastN === room.getLastN()) { return; } room.setLastN(lastN); } /** * */ function setNumberOfParticipants() { $('#participants').text(numParticipants); /* jitsi-meet's current Tile View behavior. */ const ids = room.getParticipants().map(participant => participant.getId()); room.selectParticipants(ids); updateMaxFrameHeight(); updateLastN(); } /** * Handles local tracks. * @param tracks Array with JitsiTrack objects */ function onLocalTracks(tracks = []) { localTracks = tracks; for (let i = 0; i < localTracks.length; i++) { if (localTracks[i].getType() === 'video') { $('body').append(`