diff --git a/conference.js b/conference.js index 6944424b3..c57cb7759 100644 --- a/conference.js +++ b/conference.js @@ -1360,10 +1360,15 @@ export default { room.on(ConferenceEvents.CONNECTION_RESTORED, () => { APP.UI.markVideoInterrupted(false); }); - room.on(ConferenceEvents.MESSAGE_RECEIVED, (id, text, ts) => { + room.on(ConferenceEvents.MESSAGE_RECEIVED, (id, body, ts) => { let nick = getDisplayName(id); - APP.API.notifyReceivedChatMessage(id, nick, text, ts); - APP.UI.addMessage(id, nick, text, ts); + APP.API.notifyReceivedChatMessage({ + id, + nick, + body, + ts + }); + APP.UI.addMessage(id, nick, body, ts); }); APP.UI.addListener(UIEvents.MESSAGE_CREATED, (message) => { APP.API.notifySendingChatMessage(message); diff --git a/modules/API/.eslintrc.js b/modules/API/.eslintrc.js new file mode 100644 index 000000000..28bcd9f77 --- /dev/null +++ b/modules/API/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + 'extends': '../../react/.eslintrc.js' +}; diff --git a/modules/API/API.js b/modules/API/API.js index b83a1f13a..371180b66 100644 --- a/modules/API/API.js +++ b/modules/API/API.js @@ -1,11 +1,5 @@ /* global APP, getConfigParamsFromUrl */ -/** - * Implements API class that communicates with external api class - * and provides interface to access Jitsi Meet features by external - * applications that embed Jitsi Meet - */ - import postisInit from 'postis'; import * as JitsiMeetConferenceEvents from '../../ConferenceEvents'; @@ -13,27 +7,27 @@ import * as JitsiMeetConferenceEvents from '../../ConferenceEvents'; /** * List of the available commands. * @type {{ - * displayName: inputDisplayNameHandler, - * toggleAudio: toggleAudio, - * toggleVideo: toggleVideo, - * toggleFilmStrip: toggleFilmStrip, - * toggleChat: toggleChat, - * toggleContactList: toggleContactList - * }} + * displayName: inputDisplayNameHandler, + * toggleAudio: toggleAudio, + * toggleVideo: toggleVideo, + * toggleFilmStrip: toggleFilmStrip, + * toggleChat: toggleChat, + * toggleContactList: toggleContactList + * }} */ let commands = {}; -let hashParams = getConfigParamsFromUrl(); +const hashParams = getConfigParamsFromUrl(); /** * JitsiMeetExternalAPI id - unique for a webpage. */ -let jitsi_meet_external_api_id = hashParams.jitsi_meet_external_api_id; +const jitsiMeetExternalApiId = hashParams.jitsi_meet_external_api_id; /** * Object that will execute sendMessage */ -let target = window.opener ? window.opener : window.parent; +const target = window.opener ? window.opener : window.parent; /** * Postis instance. Used to communicate with the external application. @@ -64,56 +58,64 @@ function toggleScreenSharing() { } } +/** + * Initializes supported commands. + * + * @returns {void} + */ function initCommands() { commands = { - "display-name": + 'display-name': APP.conference.changeLocalDisplayName.bind(APP.conference), - "toggle-audio": APP.conference.toggleAudioMuted.bind(APP.conference), - "toggle-video": APP.conference.toggleVideoMuted.bind(APP.conference), - "toggle-film-strip": APP.UI.toggleFilmstrip, - "toggle-chat": APP.UI.toggleChat, - "toggle-contact-list": APP.UI.toggleContactList, - "toggle-share-screen": toggleScreenSharing, - "video-hangup": () => APP.conference.hangup(), - "email": APP.conference.changeLocalEmail, - "avatar-url": APP.conference.changeLocalAvatarUrl, - "remote-control-event": event => - APP.remoteControl.onRemoteControlAPIEvent(event) + 'toggle-audio': APP.conference.toggleAudioMuted.bind(APP.conference), + 'toggle-video': APP.conference.toggleVideoMuted.bind(APP.conference), + 'toggle-film-strip': APP.UI.toggleFilmstrip, + 'toggle-chat': APP.UI.toggleChat, + 'toggle-contact-list': APP.UI.toggleContactList, + 'toggle-share-screen': toggleScreenSharing, + 'video-hangup': () => APP.conference.hangup(), + 'email': APP.conference.changeLocalEmail, + 'avatar-url': APP.conference.changeLocalAvatarUrl, + 'remote-control-event': + event => APP.remoteControl.onRemoteControlAPIEvent(event) }; - Object.keys(commands).forEach(function (key) { - postis.listen(key, args => commands[key](...args)); - }); + Object.keys(commands).forEach( + key => postis.listen(key, args => commands[key](...args))); } /** * Sends message to the external application. - * @param message {object} - * @param method {string} - * @param params {object} the object that will be sent as JSON string + * + * @param {Object} message - The message to be sent. + * @returns {void} */ function sendMessage(message) { - if(enabled) { + if (enabled) { postis.send(message); } } /** * Check whether the API should be enabled or not. + * * @returns {boolean} */ -function shouldBeEnabled () { - return (typeof jitsi_meet_external_api_id === "number"); +function shouldBeEnabled() { + return typeof jitsiMeetExternalApiId === 'number'; } /** * Sends event object to the external application that has been subscribed * for that event. - * @param name the name event - * @param object data associated with the event + * + * @param {string} name - The name event. + * @param {Object} object - Data associated with the event. + * @returns {void} */ -function triggerEvent (name, object) { - if(enabled) { - sendMessage({method: name, params: object}); +function triggerEvent(name, object) { + if (enabled) { + sendMessage({ method: name, + params: object }); } } @@ -130,24 +132,27 @@ function onScreenSharingEnable(enabled = false) { } } +/** + * Implements API class that communicates with external api class + * and provides interface to access Jitsi Meet features by external + * applications that embed Jitsi Meet + */ class API { - /** - * Constructs new instance - * @constructor - */ - constructor() { } - /** * Initializes the APIConnector. Setups message event listeners that will * receive information from external applications that embed Jitsi Meet. * It also sends a message to the external application that APIConnector * is initialized. - * @param options {object} - * @param forceEnable {boolean} if true the module will be enabled. + * + * @param {Object} options - Optional parameters. + * @param {boolean} options.forceEnable - If true the module will be + * enabled. + * @returns {void} */ - init (options = {}) { - if(!shouldBeEnabled() && !options.forceEnable) + init(options = {}) { + if (!shouldBeEnabled() && !options.forceEnable) { return; + } if(!enabled) { APP.conference.addListener( @@ -156,122 +161,150 @@ class API { enabled = true; } - if(!postis) { + if (!postis) { this._initPostis(); } } /** - * initializes postis library. + * Initializes postis library. + * + * @returns {void} + * * @private */ _initPostis() { - let postisOptions = { + const postisOptions = { window: target }; - if(typeof jitsi_meet_external_api_id === "number") + + if (typeof jitsiMeetExternalApiId === 'number') { postisOptions.scope - = "jitsi_meet_external_api_" + jitsi_meet_external_api_id; + = `jitsi_meet_external_api_${jitsiMeetExternalApiId}`; + } postis = postisInit(postisOptions); initCommands(); } /** * Notify external application (if API is enabled) that message was sent. - * @param {string} body message body + * + * @param {string} body - Message body. + * @returns {void} */ - notifySendingChatMessage (body) { - triggerEvent("outgoing-message", {"message": body}); + notifySendingChatMessage(body) { + triggerEvent('outgoing-message', { 'message': body }); } /** * Notify external application (if API is enabled) that * message was received. - * @param {string} id user id - * @param {string} nick user nickname - * @param {string} body message body - * @param {number} ts message creation timestamp + * + * @param {Object} options - Object with the message properties. + * @returns {void} */ - notifyReceivedChatMessage (id, nick, body, ts) { + notifyReceivedChatMessage(options = {}) { + const { id, nick, body, ts } = options; + if (APP.conference.isLocalId(id)) { return; } triggerEvent( - "incoming-message", - {"from": id, "nick": nick, "message": body, "stamp": ts} + 'incoming-message', + { 'from': id, + 'nick': nick, + 'message': body, + 'stamp': ts } ); } /** * Notify external application (if API is enabled) that * user joined the conference. - * @param {string} id user id + * + * @param {string} id - User id. + * @returns {void} */ - notifyUserJoined (id) { - triggerEvent("participant-joined", {id}); + notifyUserJoined(id) { + triggerEvent('participant-joined', { id }); } /** * Notify external application (if API is enabled) that * user left the conference. - * @param {string} id user id + * + * @param {string} id - User id. + * @returns {void} */ - notifyUserLeft (id) { - triggerEvent("participant-left", {id}); + notifyUserLeft(id) { + triggerEvent('participant-left', { id }); } /** * Notify external application (if API is enabled) that * user changed their nickname. - * @param {string} id user id - * @param {string} displayName user nickname + * + * @param {string} id - User id. + * @param {string} displayName - User nickname. + * @returns {void} */ - notifyDisplayNameChanged (id, displayName) { - triggerEvent("display-name-change", {id, displayname: displayName}); + notifyDisplayNameChanged(id, displayName) { + triggerEvent('display-name-change', { id, + displayname: displayName }); + } + + /** + * Notify external application (if API is enabled) that + * the conference has been joined. + * + * @param {string} room - The room name. + * @returns {void} + */ + notifyConferenceJoined(room) { + triggerEvent('video-conference-joined', { roomName: room }); } /** * Notify external application (if API is enabled) that * user changed their nickname. - * @param {string} id user id - * @param {string} displayName user nickname + * + * @param {string} room - User id. + * @param {string} displayName - User nickname. + * @returns {void} */ - notifyConferenceJoined (room) { - triggerEvent("video-conference-joined", {roomName: room}); - } - - /** - * Notify external application (if API is enabled) that - * user changed their nickname. - * @param {string} id user id - * @param {string} displayName user nickname - */ - notifyConferenceLeft (room) { - triggerEvent("video-conference-left", {roomName: room}); + notifyConferenceLeft(room) { + triggerEvent('video-conference-left', { roomName: room }); } /** * Notify external application (if API is enabled) that * we are ready to be closed. + * + * @returns {void} */ - notifyReadyToClose () { - triggerEvent("video-ready-to-close", {}); + notifyReadyToClose() { + triggerEvent('video-ready-to-close', {}); } /** * Sends remote control event. - * @param {RemoteControlEvent} event the remote control event. + * + * @param {RemoteControlEvent} event - The remote control event. + * @returns {void} */ sendRemoteControlEvent(event) { - sendMessage({method: "remote-control-event", params: event}); + sendMessage({ method: 'remote-control-event', + params: event }); } /** * Removes the listeners. + * + * @returns {void} */ - dispose () { - if(enabled) { + dispose() { + if (enabled) { postis.destroy(); APP.conference.removeListener( JitsiMeetConferenceEvents.DESKTOP_SHARING_ENABLED_CHANGED, diff --git a/modules/API/external/.eslintrc.js b/modules/API/external/.eslintrc.js deleted file mode 100644 index fa9de82aa..000000000 --- a/modules/API/external/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - 'extends': '../../../react/.eslintrc.js' -};