UNPKG

kurento-client-core

Version:

JavaScript Client API for Kurento Media Server

911 lines (747 loc) 23 kB
/* Autogenerated with Kurento Idl */ /* * (C) Copyright 2013-2015 Kurento (https://kurento.openvidu.io/) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var inherits = require('inherits'); var kurentoClient = require('kurento-client'); var disguise = kurentoClient.disguise; var checkType = kurentoClient.checkType; var ChecktypeError = checkType.ChecktypeError; var Transaction = kurentoClient.TransactionsManager.Transaction; var promiseCallback = require('promisecallback'); var EventEmitter = require('events').EventEmitter; function noop(error, result) { if (error) console.trace(error); return result }; /** * @classdesc * Base interface used to manage capabilities common to all Kurento elements. * <h2>Properties</h2> * <ul> * <li> * <b>id</b>: unique identifier assigned to this <code>MediaObject</code> * at * instantiation time. {@link MediaPipeline} IDs are generated with a GUID * followed by suffix <code>_kurento.MediaPipeline</code>. * {@link MediaElement} IDs are also a GUID with suffix * <code>_kurento.{ElementType}</code> and prefixed by parent's ID. * <blockquote> * <dl> * <dt><i>MediaPipeline ID example</i></dt> * <dd> * <code> * 907cac3a-809a-4bbe-a93e-ae7e944c5cae_kurento.MediaPipeline * </code> * </dd> * <dt><i>MediaElement ID example</i></dt> * <dd> * <code> * 907cac3a-809a-4bbe-a93e-ae7e944c5cae_kurento.MediaPipeline/403da25a-805b-4cf1-8c55-f190588e6c9b_kurento.WebRtcEndpoint * </code> * </dd> * </dl> * </blockquote> * </li> * <li> * <b>name</b>: free text intended to provide a friendly name for this * <code>MediaObject</code>. Its default value is the same as the ID. * </li> * <li> * <b>tags</b>: key-value pairs intended for applications to associate * metadata * to this <code>MediaObject</code> instance. * </li> * </ul> * <br /> * <br /> * <h2>Events</h2> * <ul> * <li> * <strong>{@link ErrorEvent}</strong>: reports asynchronous error events. * It is recommended to * always subscribe a listener to this event, as regular error from the * pipeline will be notified through it, instead of through an exception * when * invoking a method. * </li> * </ul> * * @abstract * @extends external:EventEmitter * * @constructor module:core/abstracts.MediaObject * * @fires {@link module:core#event:Error Error} */ function MediaObject(){ MediaObject.super_.call(this); var self = this; // // Define object properties // /** * Unique identifier of this object * * @public * @readonly * @member {external:Number} id */ this.once('_id', function(error, id) { if(error) return Object.defineProperties(this, { '_createError': {value: error}, 'id': {value: null, enumerable: true} }); Object.defineProperty(this, 'id', { configurable: true, enumerable: true, value: id }); }) // // Subscribe and unsubscribe events on the server when adding and removing // event listeners on this MediaObject // var subscriptions = {}; this.on('removeListener', function(event, listener) { // Blacklisted events if(event[0] == '_' || event == 'release' || event == 'newListener') return; var count = EventEmitter.listenerCount(this, event); if(count) return; if (!subscriptions.hasOwnProperty(event)) return; var token = subscriptions[event]; var params = { object: this, subscription: token.value, sessionId: token.sessionId }; this.emit('_rpc', undefined, 'unsubscribe', params, function(error) { if(error) return self.emit('error', error); delete subscriptions[event]; }); }); this.on('newListener', function(event, listener) { // Blacklisted events if(event[0] == '_' || event == 'release') return; var constructor = this.constructor; if(constructor.events.indexOf(event) < 0) throw new SyntaxError(constructor.name+" doesn't accept events of type '"+event+"'") var count = EventEmitter.listenerCount(this, event); if(count) return; var params = { object: this, type: event }; this.emit('_rpc', undefined, 'subscribe', params, function(error, token) { if(error) return self.emit('error', error); subscriptions[event] = token; }); }); }; inherits(MediaObject, EventEmitter); // // Public properties // /** * Children of this <code>MediaObject</code>. * * @alias module:core/abstracts.MediaObject#getChildren * * @param {module:core/abstracts.MediaObject~getChildrenCallback} [callback] * * @return {external:Promise} */ MediaObject.prototype.getChildren = function(callback){ var transaction = (arguments[0] instanceof Transaction) ? Array.prototype.shift.apply(arguments) : undefined; var usePromise = false; if (callback == undefined) { usePromise = true; } if(!arguments.length) callback = undefined; callback = (callback || noop).bind(this) if (usePromise) { var self = this; var promise = new Promise(function(resolve, reject) { function callback2(error, values) { resolve(values) } self._invoke(transaction, 'getChildren', function(error, result) { if (error) return callback(error); self.emit('_describe', result, callback2); }) }); return promise; } else { return disguise(this._invoke(transaction, 'getChildren', function(error, result) { if (error) return callback(error); this.emit('_describe', result, callback); }), this) } }; /** * @callback module:core/abstracts.MediaObject~getChildrenCallback * @param {external:Error} error * @param {module:core/abstracts.MediaObject} result */ /** * <code>MediaObject</code> creation time in seconds since Epoch. * * @alias module:core/abstracts.MediaObject#getCreationTime * * @param {module:core/abstracts.MediaObject~getCreationTimeCallback} [callback] * * @return {external:Promise} */ MediaObject.prototype.getCreationTime = function(callback){ var transaction = (arguments[0] instanceof Transaction) ? Array.prototype.shift.apply(arguments) : undefined; var usePromise = false; if (callback == undefined) { usePromise = true; } if(!arguments.length) callback = undefined; callback = (callback || noop).bind(this) return disguise(this._invoke(transaction, 'getCreationTime', callback), this) }; /** * @callback module:core/abstracts.MediaObject~getCreationTimeCallback * @param {external:Error} error * @param {external:Integer} result */ /** * {@link MediaPipeline} to which this <code>MediaObject</code> belongs. It * returns itself when invoked for a pipeline object. * * @alias module:core/abstracts.MediaObject#getMediaPipeline * * @param {module:core/abstracts.MediaObject~getMediaPipelineCallback} [callback] * * @return {external:Promise} */ MediaObject.prototype.getMediaPipeline = function(callback){ var transaction = (arguments[0] instanceof Transaction) ? Array.prototype.shift.apply(arguments) : undefined; var usePromise = false; if (callback == undefined) { usePromise = true; } if(!arguments.length) callback = undefined; callback = (callback || noop).bind(this) if (usePromise) { var self = this; var promise = new Promise(function(resolve, reject) { function callback2(error, values) { resolve(values) } self._invoke(transaction, 'getMediaPipeline', function(error, result) { if (error) return callback(error); self.emit('_describe', result, callback2); }) }); return promise; } else { return disguise(this._invoke(transaction, 'getMediaPipeline', function(error, result) { if (error) return callback(error); this.emit('_describe', result, callback); }), this) } }; /** * @callback module:core/abstracts.MediaObject~getMediaPipelineCallback * @param {external:Error} error * @param {module:core.MediaPipeline} result */ /** * This <code>MediaObject</code>'s name. * <p> * This is just sugar to simplify developers' life debugging, it is not used * internally for indexing nor identifying the objects. By default, it's the * object's ID. * </p> * * @alias module:core/abstracts.MediaObject#getName * * @param {module:core/abstracts.MediaObject~getNameCallback} [callback] * * @return {external:Promise} */ MediaObject.prototype.getName = function(callback){ var transaction = (arguments[0] instanceof Transaction) ? Array.prototype.shift.apply(arguments) : undefined; var usePromise = false; if (callback == undefined) { usePromise = true; } if(!arguments.length) callback = undefined; callback = (callback || noop).bind(this) return disguise(this._invoke(transaction, 'getName', callback), this) }; /** * @callback module:core/abstracts.MediaObject~getNameCallback * @param {external:Error} error * @param {external:String} result */ /** * This <code>MediaObject</code>'s name. * <p> * This is just sugar to simplify developers' life debugging, it is not used * internally for indexing nor identifying the objects. By default, it's the * object's ID. * </p> * * @alias module:core/abstracts.MediaObject#setName * * @param {external:String} name * @param {module:core/abstracts.MediaObject~setNameCallback} [callback] * * @return {external:Promise} */ MediaObject.prototype.setName = function(name, callback){ var transaction = (arguments[0] instanceof Transaction) ? Array.prototype.shift.apply(arguments) : undefined; // // checkType('String', 'name', name, {required: true}); // var params = { name: name }; callback = (callback || noop).bind(this) return disguise(this._invoke(transaction, 'setName', params, callback), this) }; /** * @callback module:core/abstracts.MediaObject~setNameCallback * @param {external:Error} error */ /** * Parent of this <code>MediaObject</code>. * <p> * The parent of a {@link Hub} or a {@link MediaElement} is its * {@link MediaPipeline}. A {@link MediaPipeline} has no parent, so this * property will be null. * </p> * * @alias module:core/abstracts.MediaObject#getParent * * @param {module:core/abstracts.MediaObject~getParentCallback} [callback] * * @return {external:Promise} */ MediaObject.prototype.getParent = function(callback){ var transaction = (arguments[0] instanceof Transaction) ? Array.prototype.shift.apply(arguments) : undefined; var usePromise = false; if (callback == undefined) { usePromise = true; } if(!arguments.length) callback = undefined; callback = (callback || noop).bind(this) if (usePromise) { var self = this; var promise = new Promise(function(resolve, reject) { function callback2(error, values) { resolve(values) } self._invoke(transaction, 'getParent', function(error, result) { if (error) return callback(error); self.emit('_describe', result, callback2); }) }); return promise; } else { return disguise(this._invoke(transaction, 'getParent', function(error, result) { if (error) return callback(error); this.emit('_describe', result, callback); }), this) } }; /** * @callback module:core/abstracts.MediaObject~getParentCallback * @param {external:Error} error * @param {module:core/abstracts.MediaObject} result */ /** * Flag activating or deactivating sending the element's tags in fired events. * * @alias module:core/abstracts.MediaObject#getSendTagsInEvents * * @param {module:core/abstracts.MediaObject~getSendTagsInEventsCallback} [callback] * * @return {external:Promise} */ MediaObject.prototype.getSendTagsInEvents = function(callback){ var transaction = (arguments[0] instanceof Transaction) ? Array.prototype.shift.apply(arguments) : undefined; var usePromise = false; if (callback == undefined) { usePromise = true; } if(!arguments.length) callback = undefined; callback = (callback || noop).bind(this) return disguise(this._invoke(transaction, 'getSendTagsInEvents', callback), this) }; /** * @callback module:core/abstracts.MediaObject~getSendTagsInEventsCallback * @param {external:Error} error * @param {external:Boolean} result */ /** * Flag activating or deactivating sending the element's tags in fired events. * * @alias module:core/abstracts.MediaObject#setSendTagsInEvents * * @param {external:Boolean} sendTagsInEvents * @param {module:core/abstracts.MediaObject~setSendTagsInEventsCallback} [callback] * * @return {external:Promise} */ MediaObject.prototype.setSendTagsInEvents = function(sendTagsInEvents, callback){ var transaction = (arguments[0] instanceof Transaction) ? Array.prototype.shift.apply(arguments) : undefined; // // checkType('boolean', 'sendTagsInEvents', sendTagsInEvents, {required: true}); // var params = { sendTagsInEvents: sendTagsInEvents }; callback = (callback || noop).bind(this) return disguise(this._invoke(transaction, 'setSendTagsInEvents', params, callback), this) }; /** * @callback module:core/abstracts.MediaObject~setSendTagsInEventsCallback * @param {external:Error} error */ // // Public methods // /** * Adds a new tag to this <code>MediaObject</code>. * If the tag is already present, it changes the value. * * @alias module:core/abstracts.MediaObject.addTag * * @param {external:String} key * Tag name. * * @param {external:String} value * Value associated to this tag. * * @param {module:core/abstracts.MediaObject~addTagCallback} [callback] * * @return {external:Promise} */ MediaObject.prototype.addTag = function(key, value, callback){ var transaction = (arguments[0] instanceof Transaction) ? Array.prototype.shift.apply(arguments) : undefined; // // checkType('String', 'key', key, {required: true}); // // checkType('String', 'value', value, {required: true}); // var params = { key: key, value: value }; callback = (callback || noop).bind(this) return disguise(this._invoke(transaction, 'addTag', params, callback), this) }; /** * @callback module:core/abstracts.MediaObject~addTagCallback * @param {external:Error} error */ /** * Returns the value of given tag, or MEDIA_OBJECT_TAG_KEY_NOT_FOUND if tag is * not defined. * * @alias module:core/abstracts.MediaObject.getTag * * @param {external:String} key * Tag key. * * @param {module:core/abstracts.MediaObject~getTagCallback} [callback] * * @return {external:Promise} */ MediaObject.prototype.getTag = function(key, callback){ var transaction = (arguments[0] instanceof Transaction) ? Array.prototype.shift.apply(arguments) : undefined; // // checkType('String', 'key', key, {required: true}); // var params = { key: key }; callback = (callback || noop).bind(this) return disguise(this._invoke(transaction, 'getTag', params, callback), this) }; /** * @callback module:core/abstracts.MediaObject~getTagCallback * @param {external:Error} error * @param {external:String} result * The value associated to the given key. */ /** * Returns all tags attached to this <code>MediaObject</code>. * * @alias module:core/abstracts.MediaObject.getTags * * @param {module:core/abstracts.MediaObject~getTagsCallback} [callback] * * @return {external:Promise} */ MediaObject.prototype.getTags = function(callback){ var transaction = (arguments[0] instanceof Transaction) ? Array.prototype.shift.apply(arguments) : undefined; var usePromise = false; if (callback == undefined) { usePromise = true; } if(!arguments.length) callback = undefined; callback = (callback || noop).bind(this) return disguise(this._invoke(transaction, 'getTags', callback), this) }; /** * @callback module:core/abstracts.MediaObject~getTagsCallback * @param {external:Error} error * @param {module:core/complexTypes.Tag} result * An array containing all key-value pairs associated with this * <code>MediaObject</code>. */ /** * Removes an existing tag. * Exists silently with no error if tag is not defined. * * @alias module:core/abstracts.MediaObject.removeTag * * @param {external:String} key * Tag name to be removed * * @param {module:core/abstracts.MediaObject~removeTagCallback} [callback] * * @return {external:Promise} */ MediaObject.prototype.removeTag = function(key, callback){ var transaction = (arguments[0] instanceof Transaction) ? Array.prototype.shift.apply(arguments) : undefined; // // checkType('String', 'key', key, {required: true}); // var params = { key: key }; callback = (callback || noop).bind(this) return disguise(this._invoke(transaction, 'removeTag', params, callback), this) }; /** * @callback module:core/abstracts.MediaObject~removeTagCallback * @param {external:Error} error */ function throwRpcNotReady() { throw new SyntaxError('RPC result is not ready, use .then() method instead'); }; /** * Send a command to a media object * * @param {external:String} method - Command to be executed by the server * @param {module:core/abstract.MediaObject.constructorParams} [params] * @param {module:core/abstract.MediaObject~invokeCallback} callback * * @return {external:Promise} */ Object.defineProperty(MediaObject.prototype, '_invoke', { enumerable: true, value: function(transaction, method, params, callback){ var self = this; // Fix optional parameters if(params instanceof Function) { if(callback) throw new SyntaxError("Nothing can be defined after the callback"); callback = params; params = undefined; }; var promise; var error = this._createError; if(error) promise = Promise.reject(error) else { promise = new Promise(function(resolve, reject) { // Generate request parameters var params2 = { object: self, operation: method }; if(params) params2.operationParams = params; function callback(error, result) { if(error) return reject(error); var value = result.value; if(value === undefined) value = self resolve(value); } // Do request self.emit('_rpc', transaction, 'invoke', params2, callback); }); } return promiseCallback(promise, callback, this) } }) /** * @callback core/abstract.MediaObject~invokeCallback * @param {external:Error} error */ /** * Explicity release a {@link module:core/abstract.MediaObject MediaObject} from memory * * All its descendants will be also released and collected * * @param {module:core/abstract.MediaObject~releaseCallback} callback * * @return {external:Promise} */ MediaObject.prototype.release = function(callback){ var transaction = (arguments[0] instanceof Transaction) ? Array.prototype.shift.apply(arguments) : undefined; var usePromise = false; if (callback == undefined) { usePromise = true; } if(!arguments.length) callback = undefined; callback = (callback || noop).bind(this) var self = this; var promise; var error = this._createError; if(error) promise = Promise.reject(error) else promise = new Promise(function(resolve, reject) { var params = { object: self }; function callback(error) { if(error) return reject(error); // Object was sucessfully released on the server, // remove it from cache and all its events Object.keys(self._events).forEach(function(event) { if(event[0] == '_' || event == 'newListener' || event == 'removeListener' || event == 'release') return; self.removeAllListeners(event); }) self.emit('release'); resolve(); } self.emit('_rpc', transaction, 'release', params, callback); }); return disguise(promiseCallback(promise, callback), this) }; /** * @callback core/abstract.MediaObject~releaseCallback * @param {external:Error} error */ // Promise interface ("thenable") MediaObject.prototype.then = function(onFulfilled, onRejected){ if(this.id != null) var promise = Promise.resolve(disguise.unthenable(this)) else if(this.id === null) var promise = Promise.reject() else { var self = this var promise = new Promise(function(resolve, reject) { return self.once('_id', function(error, id) { if(error) return reject(error); resolve(disguise.unthenable(self)); }) }) } promise = promise.then(onFulfilled ? onFulfilled.bind(this) : function(result){return Promise.resolve(result)}, onRejected ? onRejected .bind(this) : function(error) {return Promise.reject(error)}); return disguise(promise, this); } MediaObject.prototype.catch = function(onRejected) { this.then(null, onRejected); } Object.defineProperty(MediaObject.prototype, 'commited', { get: function(){return this.id !== undefined;} }); /** * @alias module:core/abstracts.MediaObject.constructorParams */ MediaObject.constructorParams = { }; /** * @alias module:core/abstracts.MediaObject.events */ MediaObject.events = ['Error']; /** * Checker for {@link module:core/abstracts.MediaObject} * * @memberof module:core/abstracts * * @param {external:String} key * @param {module:core/abstracts.MediaObject} value */ function checkMediaObject(key, value) { if(!(value instanceof MediaObject)) throw ChecktypeError(key, MediaObject, value); }; module.exports = MediaObject; MediaObject.check = checkMediaObject;