TT#14250 Handle can destroy itself by calling dispose

Change-Id: Id055b847e8835047aed9ab1e3ff298a3307b3db6
changes/88/12588/1
Hans-Peter Herzog 10 years ago
parent f8c8c6fb3f
commit 2e89380fe9

@ -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"

@ -2,6 +2,7 @@
module.exports.JanusEvents = {
webrtcup: 'webrtcup',
media: 'media',
slowlink: 'slowlink',
hangup: 'hangup',
timeout: 'timeout',
event: 'event'

@ -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;

@ -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));
}
});
}

@ -18,7 +18,7 @@ var ParticipantType = {
class VideoRoomHandle extends PluginHandle {
constructor(options) {
super(options.id, options.session);
super(options);
}
create(options) {

@ -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
}));

@ -8,7 +8,9 @@ describe('VideoRoomListener', function(){
var publisher = new VideoRoomListener({
room: 123,
feed: 456,
session: {}
plugin: {
getSession() {}
}
});
});
});

@ -7,7 +7,9 @@ describe('VideoRoomPublisher', function(){
it('should create a new VideoRoomPublisher', function(){
var publisher = new VideoRoomPublisher({
room: 123,
session: {}
plugin: {
getSession() {}
}
});
});
});

Loading…
Cancel
Save