123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- /* 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';
-
- setConfigFromURLParams(config, {}, {}, window.location);
-
- const params = parseURLParams(window.location, false, 'hash');
- const { isHuman = false } = params;
- const {
- localAudio = config.startWithAudioMuted !== true,
- localVideo = config.startWithVideoMuted !== true,
- remoteVideo = isHuman,
- remoteAudio = isHuman,
- autoPlayVideo = config.testing.noAutoPlayVideo !== 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();
- }
- },
-
- 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);
- }
- }
-
- /**
- *
- */
- function setNumberOfParticipants() {
- $('#participants').text(numParticipants);
- updateMaxFrameHeight();
- }
-
- /**
- * 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(`<video ${autoPlayVideo ? 'autoplay="1" ' : ''}id='localVideo${i}' />`);
- localTracks[i].attach($(`#localVideo${i}`)[0]);
- } else {
- if (!localAudio) {
- localTracks[i].mute();
- }
-
- $('body').append(
- `<audio autoplay='1' muted='true' id='localAudio${i}' />`);
- localTracks[i].attach($(`#localAudio${i}`)[0]);
- }
- room.addTrack(localTracks[i]);
- }
- }
-
- /**
- * Handles remote tracks
- * @param track JitsiTrack object
- */
- function onRemoteTrack(track) {
- if (track.isLocal()
- || (track.getType() === 'video' && !remoteVideo) || (track.getType() === 'audio' && !remoteAudio)) {
- return;
- }
- const participant = track.getParticipantId();
-
- if (!remoteTracks[participant]) {
- remoteTracks[participant] = [];
- }
- const idx = remoteTracks[participant].push(track);
- const id = participant + track.getType() + idx;
-
- if (track.getType() === 'video') {
- $('body').append(`<video autoplay='1' id='${id}' />`);
- } else {
- $('body').append(`<audio autoplay='1' id='${id}' />`);
- }
- track.attach($(`#${id}`)[0]);
- }
-
- /**
- * That function is executed when the conference is joined
- */
- function onConferenceJoined() {
- console.log('Conference joined');
- }
-
- /**
- *
- * @param id
- */
- function onUserLeft(id) {
- numParticipants--;
- setNumberOfParticipants();
- if (!remoteTracks[id]) {
- return;
- }
- const tracks = remoteTracks[id];
-
- for (let i = 0; i < tracks.length; i++) {
- const container = $(`#${id}${tracks[i].getType()}${i + 1}`)[0];
-
- if (container) {
- tracks[i].detach(container);
- container.parentElement.removeChild(container);
- }
- }
- }
-
- /**
- * That function is called when connection is established successfully
- */
- function onConnectionSuccess() {
- room = connection.initJitsiConference(roomName.toLowerCase(), config);
- room.on(JitsiMeetJS.events.conference.TRACK_ADDED, onRemoteTrack);
- room.on(JitsiMeetJS.events.conference.CONFERENCE_JOINED, onConferenceJoined);
- room.on(JitsiMeetJS.events.conference.USER_JOINED, id => {
- numParticipants++;
- setNumberOfParticipants();
- remoteTracks[id] = [];
- });
- room.on(JitsiMeetJS.events.conference.USER_LEFT, onUserLeft);
-
- const devices = [];
-
- if (localVideo) {
- devices.push('video');
- }
- devices.push('audio');
-
- if (devices.length > 0) {
- JitsiMeetJS.createLocalTracks({ devices })
- .then(onLocalTracks)
- .then(() => {
- room.join();
- })
- .catch(error => {
- throw error;
- });
- } else {
- room.join();
- }
-
- updateMaxFrameHeight();
- }
-
- /**
- * This function is called when the connection fail.
- */
- function onConnectionFailed() {
- console.error('Connection Failed!');
- }
-
- /**
- * This function is called when we disconnect.
- */
- function disconnect() {
- console.log('disconnect!');
- connection.removeEventListener(
- JitsiMeetJS.events.connection.CONNECTION_ESTABLISHED,
- onConnectionSuccess);
- connection.removeEventListener(
- JitsiMeetJS.events.connection.CONNECTION_FAILED,
- onConnectionFailed);
- connection.removeEventListener(
- JitsiMeetJS.events.connection.CONNECTION_DISCONNECTED,
- disconnect);
- }
-
- /**
- *
- */
- function unload() {
- for (let i = 0; i < localTracks.length; i++) {
- localTracks[i].dispose();
- }
- room.leave();
- connection.disconnect();
- }
-
- $(window).bind('beforeunload', unload);
- $(window).bind('unload', unload);
-
- JitsiMeetJS.setLogLevel(JitsiMeetJS.logLevels.ERROR);
-
- JitsiMeetJS.init(config);
-
- config.serviceUrl = config.bosh = `${config.websocket || config.bosh}?room=${roomName.toLowerCase()}`;
-
- connection = new JitsiMeetJS.JitsiConnection(null, null, config);
- connection.addEventListener(JitsiMeetJS.events.connection.CONNECTION_ESTABLISHED, onConnectionSuccess);
- connection.addEventListener(JitsiMeetJS.events.connection.CONNECTION_FAILED, onConnectionFailed);
- connection.addEventListener(JitsiMeetJS.events.connection.CONNECTION_DISCONNECTED, disconnect);
- connection.connect();
|