/* ██████ ██  ██ ███████ ███  ██ ████████  ██      ██  ██ ██      ████  ██    ██     ██  ██  ██ █████  ██ ██  ██  ██  ██  ██  ██ ██     ██  ██ ██  ██  ██████ ███████ ██ ███████ ██   ████  ██  */ /** * MiroTalk P2P - Client component * * @link GitHub: https://github.com/miroslavpejic85/mirotalk * @link Live demo: https://p2p.mirotalk.com or https://mirotalk.up.railway.app or https://mirotalk.herokuapp.com * @license For open source use: AGPLv3 * @license For commercial use or closed source, contact us at license.mirotalk@gmail.com or buy directly via CodeCanyon * @license CodeCanyon: https://codecanyon.net/item/mirotalk-p2p-webrtc-realtime-video-conferences/38376661 * @author Miroslav Pejic - miroslav.pejic.85@gmail.com * @version 1.0.1 * */ 'use strict'; // https://www.w3schools.com/js/js_strict.asp const isHttps = false; // must be the same on server.js const signalingServer = getSignalingServer(); const roomId = getRoomId(); const peerLoockupUrl = 'https://extreme-ip-lookup.com/json/?key=demo2'; // get your API Key at https://extreme-ip-lookup.com const avatarApiUrl = 'https://eu.ui-avatars.com/api'; const surveyURL = 'https://www.questionpro.com/t/AUs7VZq00L'; const welcomeImg = '../images/image-placeholder.png'; const shareUrlImg = '../images/image-placeholder.png'; const leaveRoomImg = '../images/leave-room.png'; const confirmImg = '../images/image-placeholder.png'; const fileSharingImg = '../images/share.png'; const roomLockedImg = '../images/locked.png'; const camOffImg = '../images/cam-off.png'; const audioOffImg = '../images/audio-off.png'; const deleteImg = '../images/delete.png'; const youtubeImg = '../images/youtube.png'; const messageImg = '../images/message.png'; const kickedOutImg = '../images/leave-room.png'; const audioGif = '../images/audio.gif'; const videoAudioShare = '../images/va-share.png'; const aboutImg = '../images/mirotalk-logo.png'; const imgFeedback = '../images/feedback.png'; const forbiddenImg = '../images/forbidden.png'; const avatarImg = '../images/mirotalk-logo.png'; const camMicOff = '../images/cam-mic-off.png'; // nice free icon: https://www.iconfinder.com const fileSharingInput = '*'; // allow all file extensions const isWebRTCSupported = DetectRTC.isWebRTCSupported; const isMobileDevice = DetectRTC.isMobileDevice; const myBrowserName = DetectRTC.browser.name; const wbImageInput = 'image/*'; const wbWidth = 1200; const wbHeight = 600; const chatInputEmoji = { '<3': '\u2764\uFE0F', ' (auto-detected) const buttons = { main: { showShareRoomBtn: true, showAudioBtn: true, showVideoBtn: true, showScreenBtn: true, showRecordStreamBtn: true, showChatRoomBtn: true, showCaptionRoomBtn: true, showMyHandBtn: true, showWhiteboardBtn: true, showFileShareBtn: true, showMySettingsBtn: true, showAboutBtn: true, // Please keep me always true, Thank you! }, chat: { showSaveMessageBtn: true, showMarkDownBtn: true, showFileShareBtn: true, showShareVideoAudioBtn: true, showParticipantsBtn: true, }, settings: { showTabRoomParticipants: true, showTabRoomSecurity: true, showMuteEveryoneBtn: true, showHideEveryoneBtn: true, showLockRoomBtn: true, showUnlockRoomBtn: true, }, remote: { audioBtnClickAllowed: true, videoBtnClickAllowed: true, showKickOutBtn: true, showSnapShotBtn: true, showFileShareBtn: true, showShareVideoAudioBtn: true, showPrivateMessageBtn: true, }, local: { showSnapShotBtn: true, }, }; const isRulesActive = true; // Presenter can do anything, guest is slightly moderate, if false no Rules for the room. const surveyActive = true; // when leaving the room give a feedback, if false will be redirected to newcall page const forceCamMaxResolutionAndFps = false; // This force the webCam to max resolution, up to 4k and 60fps (very high bandwidth are required) if false, you can set it from settings const userLimitsActive = false; // Limit users per room const usersCountLimit = 2; // Limit 2 users per room if userLimitsActive true const useAvatarApi = true; // if false the cam-Off avatar = avatarImg let notifyBySound = true; // turn on - off sound notifications let thisRoomPassword = null; let isRoomLocked = false; let isPresenter = false; // Who init the room (aka first peer joined) let needToEnableMyAudio = false; // On screen sharing end, check if need to enable my audio let initEnumerateDevicesFailed = false; // Check if user webcam and audio init is failed let myPeerId; // socket.id let peerInfo = {}; // Some peer info let userAgent; // User agent info let isTabletDevice = false; let isIPadDevice = false; let isVideoFullScreenSupported = true; // video cam - screen max frame rate let videoMaxFrameRate = 30; let screenMaxFrameRate = 30; let videoQualitySelectedIndex = 0; // default let leftChatAvatar; let rightChatAvatar; let chatMessagesId = 0; let callStartTime; let callElapsedTime; let recStartTime; let recElapsedTime; let mirotalkTheme = 'dark'; // dark - grey ... let mirotalkBtnsBar = 'vertical'; // vertical - horizontal let pinVideoPositionSelect; let swalBackground = 'rgba(0, 0, 0, 0.7)'; // black - #16171b - transparent ... let peerGeo; let myPeerName = getPeerName(); let isScreenEnabled = getScreenEnabled(); let isScreenSharingSupported = false; let isCamMirrored = false; let notify = getNotify(); let useAudio = true; let useVideo = true; let isEnumerateVideoDevices = false; let isEnumerateAudioDevices = false; let camera = 'user'; // user = front-facing camera on a smartphone. | environment = the back camera on a smartphone. let roomLocked = false; let myVideoChange = false; let myHandStatus = false; let myVideoStatus = false; let myAudioStatus = false; let myScreenStatus = false; let pitchDetectionStatus = false; let audioContext; let mediaStreamSource; let meter; let isScreenStreaming = false; let isChatRoomVisible = false; let isCaptionBoxVisible = false; let isChatEmojiVisible = false; let isChatMarkdownOn = false; let isButtonsVisible = false; let isButtonsBarOver = false; let isMySettingsVisible = false; let isVideoOnFullScreen = false; let isDocumentOnFullScreen = false; let isWhiteboardFs = false; let isVideoUrlPlayerOpen = false; let isVideoPinned = false; let pinnedVideoPlayerId = null; let isRecScreenStream = false; let isChatPasteTxt = false; let needToCreateOffer = false; // after session description answer let signalingSocket; // socket.io connection to our webserver let localMediaStream; // my microphone / webcam let remoteMediaStream; // peers microphone / webcam let recScreenStream; // recorded screen stream let remoteMediaControls = false; // enable - disable peers video player controls (default false) let peerConnection = null; // RTCPeerConnection let peerConnections = {}; // keep track of our peer connections, indexed by peer_id == socket.io id let chatDataChannels = {}; // keep track of our peer chat data channels let fileDataChannels = {}; // keep track of our peer file sharing data channels let peerMediaElements = {}; // keep track of our peer