From 15e591bab37fdde13013ff9d0a27fffd8be39de8 Mon Sep 17 00:00:00 2001 From: Hans-Peter Herzog Date: Wed, 2 Nov 2016 16:13:58 +0100 Subject: [PATCH] TT#2723 Added PluginResponse and PluginError Change-Id: I468201359e9ab2f8ad9e30d98f4258d836a9904b --- src/client/response.js | 23 ++++++++ src/errors.js | 12 ++-- src/mock/janus-response.js | 48 +++++++++++++++- src/mock/janus-server.js | 3 + src/plugins/plugin-handle.js | 14 ++++- src/plugins/videoroom/index.js | 24 +++++++- test/plugin-handle-spec.js | 22 ++++++- test/response-spec.js | 101 +++++++++++++++++++++++++++++++++ 8 files changed, 231 insertions(+), 16 deletions(-) create mode 100644 test/response-spec.js diff --git a/src/client/response.js b/src/client/response.js index 32221ef..269ea27 100644 --- a/src/client/response.js +++ b/src/client/response.js @@ -1,5 +1,6 @@ 'use strict'; +var assert = require('chai').assert; var _ = require('lodash'); /** @@ -37,4 +38,26 @@ class ClientResponse { } } +class PluginResponse extends ClientResponse { + + constructor(req, res) { + super(req, res); + assert(_.has(res, 'plugindata.plugin'), 'Missing property plugindata.plugin'); + assert(_.has(res, 'plugindata.data'), 'Missing property plugindata.data'); + } + + isError() { + return _.get(this.response, 'plugindata.data.error_code', null) !== null; + } + + getName() { + return _.get(this.response, 'plugindata.plugin', null); + } + + getData() { + return _.get(this.response, 'plugindata.data', null); + } +} + module.exports.ClientResponse = ClientResponse; +module.exports.PluginResponse = PluginResponse; diff --git a/src/errors.js b/src/errors.js index 7dbb49b..d9057dc 100644 --- a/src/errors.js +++ b/src/errors.js @@ -1,5 +1,6 @@ 'use strict'; +var assert = require('chai').assert; var _ = require('lodash'); /** @@ -33,15 +34,16 @@ class ResponseError extends Error { */ class PluginError extends ResponseError { - constructor(req, res, plugin) { - super(req, res); + constructor(res, handle) { + super(res); + assert(_.has(res.getResponse())) this.message = _.get(res, 'plugindata.data.error', null); this.code = _.get(res, 'plugindata.data.error_code', null); - this.plugin = plugin; + this.handle = handle; } - getPlugin() { - return this.plugin; + getHandle() { + return this.handle; } } diff --git a/src/mock/janus-response.js b/src/mock/janus-response.js index c694665..aa88c94 100644 --- a/src/mock/janus-response.js +++ b/src/mock/janus-response.js @@ -1,6 +1,21 @@ module.exports = { + error: { + general: { + unauthorized: function unauthorized(req) { + return { + janus: 'error', + transaction: req.transaction, + error: { + code: 403, + reason: 'Unauthorized request (wrong or missing secret/token)' + } + }; + } + } + }, + general: { info: function info(req) { return { @@ -142,6 +157,20 @@ module.exports = { }, videoRoomHandle: { + error: { + destroy: function destroy(req) { + return { janus: 'success', + session_id: req.session_id, + sender: req.handle_id, + transaction: req.transaction, + plugindata: + { plugin: 'janus.plugin.videoroom', + data: + { videoroom: 'event', + error_code: 426, + error: 'No such room (' + req.body.room + ')' } } }; + } + }, create: function create(req) { return { janus: 'success', session_id: req.session_id, @@ -158,10 +187,25 @@ module.exports = { transaction: req.transaction, plugindata: { plugin: 'janus.plugin.videoroom', - data: { videoroom: 'created', room: 2146929290 } } } + data: { videoroom: 'destroyed', room: 2146929290 } } } + }, + exists: function exists(req) { + return { + janus: 'success', + session_id: req.session_id, + sender: req.handle_id, + transaction: req.transaction, + plugindata: { + plugin: 'janus.plugin.videoroom', + data: { + videoroom: 'success', room: 2146929290, exists: 'true' + } + } + } }, list: function list(req) { - return { janus: 'success', + return { + janus: 'success', session_id: req.session_id, sender: req.handle_id, transaction: req.transaction, diff --git a/src/mock/janus-server.js b/src/mock/janus-server.js index 83cfd01..be498de 100644 --- a/src/mock/janus-server.js +++ b/src/mock/janus-server.js @@ -111,6 +111,9 @@ class JanusServer { case 'list': this.send(webSocket, JanusResponse.videoRoomHandle.list(object)); break; + case 'exists': + this.send(webSocket, JanusResponse.videoRoomHandle.exists(object)); + break; } } diff --git a/src/plugins/plugin-handle.js b/src/plugins/plugin-handle.js index 8a91701..298d483 100644 --- a/src/plugins/plugin-handle.js +++ b/src/plugins/plugin-handle.js @@ -3,6 +3,8 @@ var _ = require('lodash'); var EventEmitter = require('events').EventEmitter; var JanusEvents = require('../constants').JanusEvents; +var PluginError = require('../errors').PluginError; +var PluginResponse = require('../client/response').PluginResponse; /** * @class @@ -106,11 +108,17 @@ class PluginHandle { requestMessage(body, options) { return new Promise((resolve, reject)=>{ - this.request({ + var req = { janus: 'message', body: body - }, options).then((res)=>{ - resolve(res); + }; + this.request(req, options).then((res)=>{ + var pluginResponse = new PluginResponse(res.getRequest(), res.getResponse()); + if(pluginResponse.isError()) { + reject(new PluginError(res, this)); + } else { + resolve(pluginResponse); + } }).catch((err)=>{ reject(err); }); diff --git a/src/plugins/videoroom/index.js b/src/plugins/videoroom/index.js index 98f32d6..c3bf07d 100644 --- a/src/plugins/videoroom/index.js +++ b/src/plugins/videoroom/index.js @@ -1,5 +1,6 @@ 'use strict'; +var assert = require('chai').assert; var _ = require('lodash'); var Promise = require('bluebird'); var PluginHandle = require('../plugin-handle').PluginHandle; @@ -26,8 +27,9 @@ class VideoRoomHandle extends PluginHandle { this.requestMessage({ request: 'create' }).then((res)=>{ + assert.isNumber(res.getData().room, 'Missing room id in response'); resolve(new VideoRoom({ - room: _.get(res.getResponse(), 'plugindata.data.room', null) + room: res.getData().room }, this)); }).catch((err)=>{ reject(err); @@ -37,9 +39,10 @@ class VideoRoomHandle extends PluginHandle { destroy(room) { return new Promise((resolve, reject)=>{ + assert.isNotNaN(parseInt(room)); this.requestMessage({ request: 'destroy', - room: room + room: parseInt(room) }).then(()=>{ resolve(); }).catch((err)=>{ @@ -48,12 +51,26 @@ class VideoRoomHandle extends PluginHandle { }); } + exists(room) { + return new Promise((resolve, reject)=>{ + assert.isNotNaN(parseInt(room)); + this.requestMessage({ + request: 'exists', + room: parseInt(room) + }).then((res)=>{ + resolve(res.getData().exists); + }).catch((err)=>{ + reject(err); + }); + }); + } + list() { return new Promise((resolve, reject)=>{ this.requestMessage({ request: 'list' }).then((res)=>{ - resolve(_.get(res.getResponse(), 'plugindata.data.list', [])); + resolve(res.getData().list || []); }).catch((err)=>{ reject(err); }); @@ -62,6 +79,7 @@ class VideoRoomHandle extends PluginHandle { joinPublisher(room) { return new Promise((resolve, reject)=>{ + assert.isNotNaN(parseInt(room)); var transaction = this.transactMessage({ request: 'join', ptype: 'publisher', diff --git a/test/plugin-handle-spec.js b/test/plugin-handle-spec.js index 68c10c7..130d22b 100644 --- a/test/plugin-handle-spec.js +++ b/test/plugin-handle-spec.js @@ -87,11 +87,27 @@ describe('PluginHandle', function(){ }); it('should destroy a room', function(done) { - done(); + handle.destroy(123).then(()=>{ + done(); + }).catch((err)=>{ + done(err); + }); }); - it('should check whether a room exists or not', function(done) { - done(); + it('should fail while destroying a none existing room', function(done) { + handle.destroy(123).then(()=>{ + done(); + }).catch((err)=>{ + done(err); + }); + }); + + it('should check whether a room exists', function(done) { + handle.exists(123).then(()=>{ + done(); + }).catch((err)=>{ + done(err); + }); }); it('should list all rooms', function(done) { diff --git a/test/response-spec.js b/test/response-spec.js new file mode 100644 index 0000000..80ef63c --- /dev/null +++ b/test/response-spec.js @@ -0,0 +1,101 @@ +'use strict'; + +var assert = require('chai').assert; +var ClientResponse = require('../src/client/response').ClientResponse; +var PluginResponse = require('../src/client/response').PluginResponse; +var JanusResponse = require('../src/mock/janus-response'); + +describe('Response', function(){ + + describe('ClientResponse', function(){ + + it('should return request and response', function(done){ + var createSessionReq = { + janus: 'create', + transaction: '1234567890' + }; + var createSessionRes = JanusResponse.session.create(createSessionReq); + var clientResponse = new ClientResponse(createSessionReq, createSessionRes); + assert.deepEqual(clientResponse.getRequest(), createSessionReq); + assert.deepEqual(clientResponse.getResponse(), createSessionRes); + done(); + }); + + it('should check whether the response is a success response', function(done){ + var createSessionReq = { + janus: 'create', + transaction: '1234567890' + }; + var createSessionRes = JanusResponse.session.create(createSessionReq); + var clientResponse = new ClientResponse(createSessionReq, createSessionRes); + assert.equal(clientResponse.getType(), 'success'); + assert.isTrue(clientResponse.isSuccess()); + assert.isFalse(clientResponse.isAck()); + assert.isFalse(clientResponse.isError()); + done(); + }); + + it('should check whether the response is a ack response', function(done){ + var keepAliveReq = { + janus: 'keepalive', + transaction: '1234567890' + }; + var keepAliveRes = JanusResponse.session.keepAlive(keepAliveReq); + var clientResponse = new ClientResponse(keepAliveReq, keepAliveRes); + assert.equal(clientResponse.getType(), 'ack'); + assert.isFalse(clientResponse.isSuccess()); + assert.isTrue(clientResponse.isAck()); + assert.isFalse(clientResponse.isError()); + done(); + }); + + it('should check whether the response is a error response', function(done){ + var createSessionReq = { + janus: 'create', + transaction: '1234567890' + }; + var errRes = JanusResponse.error.general.unauthorized(createSessionReq); + var clientResponse = new ClientResponse(createSessionReq, errRes); + assert.equal(clientResponse.getType(), 'error'); + assert.isFalse(clientResponse.isSuccess()); + assert.isFalse(clientResponse.isAck()); + assert.isTrue(clientResponse.isError()); + done(); + }); + }); + + describe('PluginResponse', function(){ + + it('should return plugin name and data', function(){ + var createRoomReq = { + janus: 'message', + body: { + request: 'create' + }, + handle_id: 123, + session_id: 456, + transaction: 'abc' + }; + var createRoomRes = JanusResponse.videoRoomHandle.create(createRoomReq); + var pluginResponse = new PluginResponse(createRoomReq, createRoomRes); + assert.equal(pluginResponse.getName(), createRoomRes.plugindata.plugin); + assert.deepEqual(pluginResponse.getData(), createRoomRes.plugindata.data); + }); + + it('should return error code and message', function(){ + var destroyRoomReq = { + janus: 'message', + body: { + request: 'destroy', + room: 123 + }, + handle_id: 456, + session_id: 789, + transaction: 'abc' + }; + var destroyRoomRes = JanusResponse.videoRoomHandle.error.destroy(destroyRoomReq); + var pluginResponse = new PluginResponse(destroyRoomReq, destroyRoomRes); + assert.isTrue(pluginResponse.isError()); + }); + }); +});