From 2e89380fe95e564d95e0ccb40246e70e9169c3b7 Mon Sep 17 00:00:00 2001 From: Hans-Peter Herzog Date: Thu, 6 Apr 2017 10:02:28 +0200 Subject: [PATCH] TT#14250 Handle can destroy itself by calling dispose Change-Id: Id055b847e8835047aed9ab1e3ff298a3307b3db6 --- package.json | 2 +- src/constants.js | 1 + src/plugins/handle.js | 70 ++++++++++++++++++++++++++++---- src/plugins/plugin.js | 5 ++- src/plugins/videoroom/handle.js | 2 +- src/plugins/videoroom/index.js | 6 +-- test/videoroom-listener-spec.js | 4 +- test/videoroom-publisher-spec.js | 4 +- 8 files changed, 77 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 1849e27..225780a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "janus-videoroom-client", - "version": "3.1.0", + "version": "3.2.0", "main": "src/janus.js", "scripts": { "test": "mocha -R spec --full-trace test/*-spec.js" diff --git a/src/constants.js b/src/constants.js index eba00e6..94d6a8e 100644 --- a/src/constants.js +++ b/src/constants.js @@ -2,6 +2,7 @@ module.exports.JanusEvents = { webrtcup: 'webrtcup', media: 'media', + slowlink: 'slowlink', hangup: 'hangup', timeout: 'timeout', event: 'event' diff --git a/src/plugins/handle.js b/src/plugins/handle.js index 7389a92..54ccad2 100644 --- a/src/plugins/handle.js +++ b/src/plugins/handle.js @@ -1,21 +1,29 @@ 'use strict'; var _ = require('lodash'); +var Promise = require('bluebird'); var EventEmitter = require('events').EventEmitter; var JanusEvents = require('../constants').JanusEvents; +var logger = require('debug-logger')('janus:handle'); var PluginError = require('../errors').PluginError; var PluginResponse = require('../client/response').PluginResponse; -var logger = require('debug-logger')('janus:handle'); + +const ConnectionState = { + connected: 'connected', + disconnected: 'disconnected' +}; /** * @class */ class PluginHandle { - constructor(id, session) { - this.id = id; - this.session = session; + constructor(options) { + this.id = options.id; + this.plugin = options.plugin; this.emitter = new EventEmitter(); + this.connectionState = ConnectionState.disconnected; + this.disposed = false; } getId() { @@ -23,7 +31,19 @@ class PluginHandle { } getSession() { - return this.session; + return this.getPlugin().getSession(); + } + + getPlugin() { + return this.plugin; + } + + isConnected() { + return this.connectionState; + } + + isDisposed() { + return this.disposed; } detach() { @@ -33,8 +53,18 @@ class PluginHandle { } hangup() { - return this.request({ - janus: 'hangup' + return new Promise((resolve, reject)=>{ + if(this.isConnected()) { + this.request({ + janus: 'hangup' + }).then((result)=>{ + resolve(result); + }).catch((err)=>{ + reject(err); + }); + } else { + reject(new Error('Handle not connected')); + } }); } @@ -57,14 +87,19 @@ class PluginHandle { event(event) { switch(event.janus) { case JanusEvents.webrtcup: + this.connectionState = ConnectionState.connected; this.emitter.emit(JanusEvents.webrtcup, event); break; case JanusEvents.media: this.emitter.emit(JanusEvents.media, event); break; case JanusEvents.hangup: + this.connectionState = ConnectionState.disconnected; this.emitter.emit(JanusEvents.hangup, event); break; + case JanusEvents.slowlink: + this.emitter.emit(JanusEvents.slowlink, event); + break; case JanusEvents.event: this.emitter.emit(JanusEvents.event, event); break; @@ -86,13 +121,17 @@ class PluginHandle { this.emitter.addListener(JanusEvents.hangup, listener); } + onSlowlink(listener) { + this.emitter.addListener(JanusEvents.slowlink, listener); + } + onEvent(listener) { this.emitter.addListener(JanusEvents.event, listener); } request(obj, options) { obj.handle_id = this.getId(); - return this.session.request(obj, options); + return this.getPlugin().getSession().request(obj, options); } requestMessage(body, options) { @@ -119,6 +158,21 @@ class PluginHandle { }); }); } + + dispose() { + return new Promise((resolve, reject)=>{ + if(!this.isDisposed()) { + this.disposed = true; + this.getPlugin().destroyHandle(this).then(()=>{ + resolve(); + }).catch((err)=>{ + reject(err); + }); + } else { + reject(new Error('Already disposed')); + } + }); + } } module.exports.PluginHandle = PluginHandle; diff --git a/src/plugins/plugin.js b/src/plugins/plugin.js index 1505551..721f5b0 100644 --- a/src/plugins/plugin.js +++ b/src/plugins/plugin.js @@ -1,5 +1,6 @@ 'use strict'; +var _ = require('lodash'); var Promise = require('bluebird'); class Plugin { @@ -46,7 +47,7 @@ class Plugin { createHandle() { return new Promise((resolve, reject)=>{ - this.session.createPluginHandle(this.getFullName()).then((handleId)=>{ + this.getSession().createPluginHandle(this.getFullName()).then((handleId)=>{ resolve(handleId); }).catch((err)=>{ reject(err); @@ -71,7 +72,7 @@ class Plugin { }); } else { this.removeHandle(id); - resolve(); + reject(new Error('Invalid handle id ' + id)); } }); } diff --git a/src/plugins/videoroom/handle.js b/src/plugins/videoroom/handle.js index 248a2bd..2f0421c 100644 --- a/src/plugins/videoroom/handle.js +++ b/src/plugins/videoroom/handle.js @@ -18,7 +18,7 @@ var ParticipantType = { class VideoRoomHandle extends PluginHandle { constructor(options) { - super(options.id, options.session); + super(options); } create(options) { diff --git a/src/plugins/videoroom/index.js b/src/plugins/videoroom/index.js index 82d43a9..0f7abc0 100644 --- a/src/plugins/videoroom/index.js +++ b/src/plugins/videoroom/index.js @@ -50,7 +50,7 @@ class VideoRoomPlugin extends Plugin { this.createHandle().then((id)=>{ this.addHandle(new VideoRoomHandle({ id: id, - session: this.getSession() + plugin: this })); resolve(this.getHandle(id)); }).catch((err)=>{ @@ -64,7 +64,7 @@ class VideoRoomPlugin extends Plugin { this.createHandle().then((id)=>{ this.addHandle(new VideoRoomPublisher({ id: id, - session: this.getSession(), + plugin: this, room: room })); resolve(this.getHandle(id)); @@ -79,7 +79,7 @@ class VideoRoomPlugin extends Plugin { this.createHandle().then((id)=>{ this.addHandle(new VideoRoomListener({ id: id, - session: this.getSession(), + plugin: this, room: room, feed: feed })); diff --git a/test/videoroom-listener-spec.js b/test/videoroom-listener-spec.js index 1b1a255..f181d8c 100644 --- a/test/videoroom-listener-spec.js +++ b/test/videoroom-listener-spec.js @@ -8,7 +8,9 @@ describe('VideoRoomListener', function(){ var publisher = new VideoRoomListener({ room: 123, feed: 456, - session: {} + plugin: { + getSession() {} + } }); }); }); diff --git a/test/videoroom-publisher-spec.js b/test/videoroom-publisher-spec.js index f5ab8fd..8870f63 100644 --- a/test/videoroom-publisher-spec.js +++ b/test/videoroom-publisher-spec.js @@ -7,7 +7,9 @@ describe('VideoRoomPublisher', function(){ it('should create a new VideoRoomPublisher', function(){ var publisher = new VideoRoomPublisher({ room: 123, - session: {} + plugin: { + getSession() {} + } }); }); });