fix(transport): Code style issues and enableLegacyFormat param bug

Improves naming.
Fixing typos.
enableLegacyFormat param was working like disableLegacyFormat.
Improves the structure of transport/index.js
This commit is contained in:
hristoterezov 2017-04-28 15:24:20 -05:00
parent e9dc9c47a9
commit b49c1c6ba2
9 changed files with 141 additions and 60 deletions

View File

@ -1,5 +1,5 @@
import * as JitsiMeetConferenceEvents from '../../ConferenceEvents';
import { transport } from '../transport';
import { getJitsiMeetTransport } from '../transport';
import { API_ID } from './constants';
@ -18,6 +18,13 @@ let commands = {};
*/
let initialScreenSharingState = false;
/**
* The transport instance used for communication with external apps.
*
* @type {Transport}
*/
const transport = getJitsiMeetTransport();
/**
* Initializes supported commands.
*

View File

@ -3,4 +3,6 @@ declare var getConfigParamsFromUrl: Function;
/**
* JitsiMeetExternalAPI id - unique for a webpage.
*/
export const API_ID = getConfigParamsFromUrl().jitsi_meet_external_api_id;
export const API_ID
= typeof getConfigParamsFromUrl === 'function'
? getConfigParamsFromUrl().jitsi_meet_external_api_id : undefined;

View File

@ -1,8 +1,9 @@
import EventEmitter from 'events';
import PostMessageTransportBackend
from '../../transport/PostMessageTransportBackend';
import Transport from '../../transport/Transport';
import {
PostMessageTransportBackend,
Transport
} from '../../transport';
const logger = require('jitsi-meet-logger').getLogger(__filename);
@ -184,7 +185,7 @@ class JitsiMeetExternalAPI extends EventEmitter {
this._createIFrame(Math.max(height, MIN_HEIGHT),
Math.max(width, MIN_WIDTH));
this._transport = new Transport({
transport: new PostMessageTransportBackend({
backend: new PostMessageTransportBackend({
postisOptions: {
scope: `jitsi_meet_external_api_${id}`,
window: this.frame.contentWindow

View File

@ -7,13 +7,20 @@ import {
PERMISSIONS_ACTIONS,
REMOTE_CONTROL_EVENT_TYPE
} from "../../service/remotecontrol/Constants";
import { transport } from '../transport';
import { getJitsiMeetTransport } from '../transport';
import RemoteControlParticipant from "./RemoteControlParticipant";
const ConferenceEvents = JitsiMeetJS.events.conference;
const logger = require("jitsi-meet-logger").getLogger(__filename);
/**
* The transport instance used for communication with external apps.
*
* @type {Transport}
*/
const transport = getJitsiMeetTransport();
/**
* This class represents the receiver party for a remote controller session.
* It handles "remote-control-event" events and sends them to the

View File

@ -10,8 +10,8 @@ const DEFAULT_POSTIS_OPTIONS = {
};
/**
* The list of methods of incomming postis messages that we have to support for
* backward compatability for the users that are directly sending messages to
* The list of methods of incoming postis messages that we have to support for
* backward compatibility for the users that are directly sending messages to
* Jitsi Meet (without using external_api.js)
*
* @type {string[]}
@ -31,7 +31,7 @@ const LEGACY_INCOMING_METHODS = [
/**
* The list of methods of outgoing postis messages that we have to support for
* backward compatability for the users that are directly listening to the
* backward compatibility for the users that are directly listening to the
* postis messages send by Jitsi Meet(without using external_api.js).
*
* @type {string[]}
@ -70,10 +70,18 @@ export default class PostMessageTransportBackend {
...postisOptions
});
/**
* If true PostMessageTransportBackend will process and send data using
* the legacy format and in the same time the current format. Otherwise
* all data received that is using the legacy format will be ignored and
* no data with the legacy format will be sent.
*
* @type {boolean}
*/
this._enableLegacyFormat = enableLegacyFormat;
if (!this._enableLegacyFormat) {
// backward compatability
if (this._enableLegacyFormat) {
// backward compatibility
LEGACY_INCOMING_METHODS.forEach(method =>
this.postis.listen(
method,
@ -91,7 +99,7 @@ export default class PostMessageTransportBackend {
}
/**
* Handles incomming legacy postis data.
* Handles incoming legacy postis data.
*
* @param {string} method - The method property from postis data object.
* @param {Any} params - The params property from postis data object.
@ -142,7 +150,7 @@ export default class PostMessageTransportBackend {
params: data
});
if (!this._enableLegacyFormat) {
if (this._enableLegacyFormat) {
// For the legacy use case we don't need any new fields defined in
// Transport class. That's why we are passing only the original
// object passed by the consumer of the Transport class which is

View File

@ -5,45 +5,74 @@ import {
} from './constants';
/**
* Stores the currnet transport that have to be used.
* Stores the currnet transport backend that have to be used. Also implements
* request/response mechanism.
*/
export default class Transport {
/**
* Creates new instance.
*
* @param {Object} options - Optional parameters for configuration of the
* transport.
* transport backend.
*/
constructor({ transport } = {}) {
constructor({ backend } = {}) {
/**
* The request ID counter used for the id property of the request. This
* property is used to match the responses with the request.
*
* @type {number}
*/
this._requestID = 0;
/**
* Maps an IDs of the requests and handlers that will process the
* responses of those requests.
*
* @type {Map<number, Function>}
*/
this._responseHandlers = new Map();
/**
* Maps an event name and listener that have been added to the Transport
* instance.
*
* @type {Map<string, Function>}
*/
this._listeners = new Map();
/**
* A set with the events and requests that were received but not
* processed by any listener. They are later passed on every new
* listener until they are processed.
*
* @type {Set<Object>}
*/
this._unprocessedMessages = new Set();
/**
* Alias.
*/
this.addListener = this.on;
if (transport) {
this.setTransport(transport);
if (backend) {
this.setBackend(backend);
}
}
/**
* Disposes the current transport.
* Disposes the current transport backend.
*
* @returns {void}
*/
_disposeTransport() {
if (this._transport) {
this._transport.dispose();
this._transport = null;
_disposeBackend() {
if (this._backend) {
this._backend.dispose();
this._backend = null;
}
}
/**
* Handles incomming data from the transport.
* Handles incoming data from the transport backend.
*
* @param {Object} data - The data.
* @returns {void}
@ -56,13 +85,9 @@ export default class Transport {
handler(data);
this._responseHandlers.delete(data.id);
}
return;
}
if (data.type === MESSAGE_TYPE_REQUEST) {
} else if (data.type === MESSAGE_TYPE_REQUEST) {
this.emit('request', data.data, (result, error) => {
this._transport.send({
this._backend.send({
type: MESSAGE_TYPE_RESPONSE,
error,
id: data.id,
@ -83,7 +108,7 @@ export default class Transport {
this._responseHandlers.clear();
this._unprocessedMessages.clear();
this.removeAllListeners();
this._disposeTransport();
this._disposeBackend();
}
/**
@ -91,7 +116,8 @@ export default class Transport {
* the order they were registered, passing the supplied arguments to each.
*
* @param {string} eventName - The name of the event.
* @returns {boolean} True if the event had listeners, false otherwise.
* @returns {boolean} True if the event has been processed by any listener,
* false otherwise.
*/
emit(eventName, ...args) {
const listenersForEvent = this._listeners.get(eventName);
@ -141,7 +167,8 @@ export default class Transport {
/**
* Removes all listeners, or those of the specified eventName.
*
* @param {string} eventName - The name of the event.
* @param {string} [eventName] - The name of the event. If this parameter is
* not specified all listeners will be removed.
* @returns {Transport} References to the instance of Transport class, so
* that calls can be chained.
*/
@ -181,8 +208,8 @@ export default class Transport {
* @returns {void}
*/
sendEvent(data = {}) {
if (this._transport) {
this._transport.send({
if (this._backend) {
this._backend.send({
type: MESSAGE_TYPE_EVENT,
data
});
@ -196,8 +223,8 @@ export default class Transport {
* @returns {Promise}
*/
sendRequest(data) {
if (!this._transport) {
return Promise.reject(new Error('No transport defined!'));
if (!this._backend) {
return Promise.reject(new Error('No transport backend defined!'));
}
this._requestID++;
@ -215,7 +242,7 @@ export default class Transport {
}
});
this._transport.send({
this._backend.send({
type: MESSAGE_TYPE_REQUEST,
data,
id
@ -224,15 +251,15 @@ export default class Transport {
}
/**
* Changes the current transport.
* Changes the current backend transport.
*
* @param {Object} transport - The new transport that will be used.
* @param {Object} backend - The new transport backend that will be used.
* @returns {void}
*/
setTransport(transport) {
this._disposeTransport();
setBackend(backend) {
this._disposeBackend();
this._transport = transport;
this._transport.setReceiveCallback(this._onDataReceived.bind(this));
this._backend = backend;
this._backend.setReceiveCallback(this._onDataReceived.bind(this));
}
}

View File

@ -1,9 +1,16 @@
import { API_ID } from '../API';
// FIXME: change to '../API' when we update to webpack2. If we do this now all
// files from API modules will be included in external_api.js.
import { API_ID } from '../API/constants';
import { getJitsiMeetGlobalNS } from '../util/helpers';
import Transport from './Transport';
import PostMessageTransportBackend from './PostMessageTransportBackend';
export {
Transport,
PostMessageTransportBackend
};
/**
* Option for the default low level transport.
*
@ -15,19 +22,38 @@ if (typeof API_ID === 'number') {
postisOptions.scope = `jitsi_meet_external_api_${API_ID}`;
}
export const transport = new Transport({
transport: new PostMessageTransportBackend({
enableLegacyFormat: true,
postisOptions
})
});
/**
* The instance of Transport class that will be used by Jitsi Meet.
*
* @type {Transport}
*/
let transport;
/**
* Returns the instance of Transport class that will be used by Jitsi Meet.
*
* @returns {Transport}
*/
export function getJitsiMeetTransport() {
if (!transport) {
transport = new Transport({
backend: new PostMessageTransportBackend({
enableLegacyFormat: true,
postisOptions
})
});
}
return transport;
}
/**
* Sets the transport to passed transport.
*
* @param {Object} newTransport - The new transport.
* @param {Object} externalTransportBackend - The new transport.
* @returns {void}
*/
getJitsiMeetGlobalNS().useNewExternalTransport = function(newTransport) {
transport.setTransport(newTransport);
getJitsiMeetGlobalNS().setExternalTransportBackend = function(
externalTransportBackend) {
transport.setBackend(externalTransportBackend);
};

View File

@ -84,8 +84,11 @@ export function debounce(fn, wait = 0, options = {}) {
* we store everything that needs to be global (for some reason).
*/
export function getJitsiMeetGlobalNS() {
if(!window.JitsiMeetGlobalNS) {
window.JitsiMeetGlobalNS = { };
if(!window.JitsiMeetJS) {
window.JitsiMeetJS = { };
}
return window.JitsiMeetGlobalNS;
if(!window.JitsiMeetJS.app) {
window.JitsiMeetJS.app = { };
}
return window.JitsiMeetJS.app;
}

View File

@ -3,7 +3,7 @@
import React from 'react';
import ReactDOM from 'react-dom';
import { transport } from '../modules/transport';
import { getJitsiMeetTransport } from '../modules/transport';
import config from './config';
import { App } from './features/app';
@ -36,5 +36,5 @@ window.addEventListener('beforeunload', () => {
APP.logCollectorStarted = false;
}
APP.API.dispose();
transport.dispose();
getJitsiMeetTransport().dispose();
});