TT#48636 JanusClient: Create new major release 4.x.x

Resolves #4, Resolves #8

Co-authored-by: Cédric <cedbale@gmail.com>
Co-authored-by: Vivien Adnot <vivienadnot@amplement.com>

Squashed commit of the following:

commit 734ef40369afc56c91959f36c3ef09cc5bedfad9
Author: Cédric <cedbale@gmail.com>
Date:   Tue Nov 6 15:17:27 2018 +0100

    fix opaqueID (#3)

commit 72d22049039be12d63c4f53e13323ad717b53704
Author: Cédric <cedbale@gmail.com>
Date:   Mon Oct 29 09:57:25 2018 +0100

    apply new method (#2)

    * add opaqueId
    * fix missing defaultHandle on attach
    * remove attachHandle method from Client (SOC)

commit f8589519f3d3c1dc97c3e3d55e655efc83c3063a
Author: Vivien Adnot <vivienadnot@amplement.com>
Date:   Thu Oct 11 13:49:09 2018 +0200

    moved attach methods into VideoRoomPlugin

commit a2755b86961b518110f9ffb5bb37ad615f94c3b7
Author: Vivien Adnot <vivienadnot@amplement.com>
Date:   Wed Oct 10 15:12:52 2018 +0200

    claim sessions and reconnect handlers done

commit 036de030be030b927cac06e17b835ba7b6a9d284
Author: Cédric <cedricbale@amplement.com>
Date:   Thu Aug 9 13:52:45 2018 +0200

    [WARN] Subscriber is using the legacy 'listener' ptype

commit 5da0695248c2ab01182e0e948d417b112499bcb1
Author: Cédric <cedricbale@amplement.com>
Date:   Tue Aug 7 09:56:11 2018 +0200

    add trickles method to handle mutliple ICE per request

Change-Id: I6b7f33860f575d224940608f8fca541832905f23
changes/36/25536/4
Hans-Peter Herzog 7 years ago
parent dc823a04f6
commit ecd28bc616

232
npm-shrinkwrap.json generated

@ -1,11 +1,16 @@
{
"name": "janus-videoroom-client",
"version": "3.2.6",
"version": "4.0.0",
"dependencies": {
"assertion-error": {
"version": "1.0.2",
"from": "assertion-error@>=1.0.1 <2.0.0",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz"
"version": "1.1.0",
"from": "assertion-error@>=1.1.0 <2.0.0",
"resolved": "https://npm-registry.sipwise.com/assertion-error/-/assertion-error-1.1.0.tgz"
},
"async-limiter": {
"version": "1.0.0",
"from": "async-limiter@>=1.0.0 <1.1.0",
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz"
},
"balanced-match": {
"version": "1.0.0",
@ -13,32 +18,32 @@
"resolved": "https://npm-registry.sipwise.com/balanced-match/-/balanced-match-1.0.0.tgz",
"dev": true
},
"bluebird": {
"version": "3.4.1",
"from": "bluebird@3.4.1",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.1.tgz"
},
"brace-expansion": {
"version": "1.1.8",
"version": "1.1.11",
"from": "brace-expansion@>=1.1.7 <2.0.0",
"resolved": "https://npm-registry.sipwise.com/brace-expansion/-/brace-expansion-1.1.8.tgz",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"dev": true
},
"browser-stdout": {
"version": "1.3.0",
"from": "browser-stdout@1.3.0",
"resolved": "https://npm-registry.sipwise.com/browser-stdout/-/browser-stdout-1.3.0.tgz",
"version": "1.3.1",
"from": "browser-stdout@1.3.1",
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
"dev": true
},
"chai": {
"version": "3.5.0",
"from": "chai@3.5.0",
"resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz"
"version": "4.2.0",
"from": "chai@latest",
"resolved": "https://npm-registry.sipwise.com/chai/-/chai-4.2.0.tgz"
},
"check-error": {
"version": "1.0.2",
"from": "check-error@>=1.0.2 <2.0.0",
"resolved": "https://npm-registry.sipwise.com/check-error/-/check-error-1.0.2.tgz"
},
"commander": {
"version": "2.9.0",
"from": "commander@2.9.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
"version": "2.15.1",
"from": "commander@2.15.1",
"resolved": "https://npm-registry.sipwise.com/commander/-/commander-2.15.1.tgz",
"dev": true
},
"concat-map": {
@ -54,25 +59,18 @@
},
"debug-logger": {
"version": "0.4.1",
"from": "debug-logger@0.4.1",
"from": "debug-logger@latest",
"resolved": "https://registry.npmjs.org/debug-logger/-/debug-logger-0.4.1.tgz"
},
"deep-eql": {
"version": "0.1.3",
"from": "deep-eql@>=0.1.3 <0.2.0",
"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
"dependencies": {
"type-detect": {
"version": "0.1.1",
"from": "type-detect@0.1.1",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz"
}
}
"version": "3.0.1",
"from": "deep-eql@>=3.0.1 <4.0.0",
"resolved": "https://npm-registry.sipwise.com/deep-eql/-/deep-eql-3.0.1.tgz"
},
"diff": {
"version": "1.4.0",
"from": "diff@1.4.0",
"resolved": "https://npm-registry.sipwise.com/diff/-/diff-1.4.0.tgz",
"version": "3.5.0",
"from": "diff@3.5.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
"dev": true
},
"escape-string-regexp": {
@ -87,28 +85,33 @@
"resolved": "https://npm-registry.sipwise.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
"dev": true
},
"glob": {
"version": "7.0.5",
"from": "glob@7.0.5",
"resolved": "https://npm-registry.sipwise.com/glob/-/glob-7.0.5.tgz",
"dev": true
"get-func-name": {
"version": "2.0.0",
"from": "get-func-name@>=2.0.0 <3.0.0",
"resolved": "https://npm-registry.sipwise.com/get-func-name/-/get-func-name-2.0.0.tgz"
},
"graceful-readlink": {
"version": "1.0.1",
"from": "graceful-readlink@>=1.0.0",
"resolved": "https://npm-registry.sipwise.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
"glob": {
"version": "7.1.2",
"from": "glob@7.1.2",
"resolved": "https://npm-registry.sipwise.com/glob/-/glob-7.1.2.tgz",
"dev": true
},
"growl": {
"version": "1.9.2",
"from": "growl@1.9.2",
"resolved": "https://npm-registry.sipwise.com/growl/-/growl-1.9.2.tgz",
"version": "1.10.5",
"from": "growl@1.10.5",
"resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
"dev": true
},
"has-flag": {
"version": "1.0.0",
"from": "has-flag@>=1.0.0 <2.0.0",
"resolved": "https://npm-registry.sipwise.com/has-flag/-/has-flag-1.0.0.tgz",
"version": "3.0.0",
"from": "has-flag@>=3.0.0 <4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"dev": true
},
"he": {
"version": "1.1.1",
"from": "he@1.1.1",
"resolved": "https://npm-registry.sipwise.com/he/-/he-1.1.1.tgz",
"dev": true
},
"inflight": {
@ -123,74 +126,14 @@
"resolved": "https://npm-registry.sipwise.com/inherits/-/inherits-2.0.3.tgz",
"dev": true
},
"json3": {
"version": "3.3.2",
"from": "json3@3.3.2",
"resolved": "https://npm-registry.sipwise.com/json3/-/json3-3.3.2.tgz",
"dev": true
},
"lodash": {
"version": "4.14.1",
"from": "lodash@4.14.1",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.14.1.tgz"
},
"lodash._baseassign": {
"version": "3.2.0",
"from": "lodash._baseassign@>=3.0.0 <4.0.0",
"resolved": "https://npm-registry.sipwise.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
"dev": true
},
"lodash._basecopy": {
"version": "3.0.1",
"from": "lodash._basecopy@>=3.0.0 <4.0.0",
"resolved": "https://npm-registry.sipwise.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
"dev": true
},
"lodash._basecreate": {
"version": "3.0.3",
"from": "lodash._basecreate@>=3.0.0 <4.0.0",
"resolved": "https://npm-registry.sipwise.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
"dev": true
},
"lodash._getnative": {
"version": "3.9.1",
"from": "lodash._getnative@>=3.0.0 <4.0.0",
"resolved": "https://npm-registry.sipwise.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
"dev": true
},
"lodash._isiterateecall": {
"version": "3.0.9",
"from": "lodash._isiterateecall@>=3.0.0 <4.0.0",
"resolved": "https://npm-registry.sipwise.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
"dev": true
},
"lodash.create": {
"version": "3.1.1",
"from": "lodash.create@3.1.1",
"resolved": "https://npm-registry.sipwise.com/lodash.create/-/lodash.create-3.1.1.tgz",
"dev": true
},
"lodash.isarguments": {
"version": "3.1.0",
"from": "lodash.isarguments@>=3.0.0 <4.0.0",
"resolved": "https://npm-registry.sipwise.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
"dev": true
},
"lodash.isarray": {
"version": "3.0.4",
"from": "lodash.isarray@>=3.0.0 <4.0.0",
"resolved": "https://npm-registry.sipwise.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
"dev": true
},
"lodash.keys": {
"version": "3.1.2",
"from": "lodash.keys@>=3.0.0 <4.0.0",
"resolved": "https://npm-registry.sipwise.com/lodash.keys/-/lodash.keys-3.1.2.tgz",
"dev": true
"version": "4.17.11",
"from": "lodash@latest",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz"
},
"minimatch": {
"version": "3.0.4",
"from": "minimatch@>=3.0.2 <4.0.0",
"from": "minimatch@3.0.4",
"resolved": "https://npm-registry.sipwise.com/minimatch/-/minimatch-3.0.4.tgz",
"dev": true
},
@ -207,21 +150,15 @@
"dev": true
},
"mocha": {
"version": "3.0.1",
"from": "mocha@3.0.1",
"resolved": "https://npm-registry.sipwise.com/mocha/-/mocha-3.0.1.tgz",
"version": "5.2.0",
"from": "mocha@5.2.0",
"resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz",
"dev": true,
"dependencies": {
"debug": {
"version": "2.2.0",
"from": "debug@2.2.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
"dev": true
},
"ms": {
"version": "0.7.1",
"from": "ms@0.7.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
"version": "3.1.0",
"from": "debug@3.1.0",
"resolved": "https://npm-registry.sipwise.com/debug/-/debug-3.1.0.tgz",
"dev": true
}
}
@ -237,42 +174,37 @@
"resolved": "https://npm-registry.sipwise.com/once/-/once-1.4.0.tgz",
"dev": true
},
"options": {
"version": "0.0.6",
"from": "options@>=0.0.5",
"resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz"
},
"path-is-absolute": {
"version": "1.0.1",
"from": "path-is-absolute@>=1.0.0 <2.0.0",
"resolved": "https://npm-registry.sipwise.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"dev": true
},
"pathval": {
"version": "1.1.0",
"from": "pathval@>=1.1.0 <2.0.0",
"resolved": "https://npm-registry.sipwise.com/pathval/-/pathval-1.1.0.tgz"
},
"supports-color": {
"version": "3.1.2",
"from": "supports-color@3.1.2",
"resolved": "https://npm-registry.sipwise.com/supports-color/-/supports-color-3.1.2.tgz",
"version": "5.4.0",
"from": "supports-color@5.4.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
"dev": true
},
"type-detect": {
"version": "1.0.0",
"from": "type-detect@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz"
},
"ultron": {
"version": "1.0.2",
"from": "ultron@>=1.0.0 <1.1.0",
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz"
"version": "4.0.8",
"from": "type-detect@>=4.0.5 <5.0.0",
"resolved": "https://npm-registry.sipwise.com/type-detect/-/type-detect-4.0.8.tgz"
},
"uuid": {
"version": "2.0.2",
"from": "uuid@2.0.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.2.tgz"
"version": "3.3.2",
"from": "uuid@latest",
"resolved": "https://npm-registry.sipwise.com/uuid/-/uuid-3.3.2.tgz"
},
"validator": {
"version": "6.1.0",
"from": "validator@6.1.0",
"resolved": "https://registry.npmjs.org/validator/-/validator-6.1.0.tgz"
"version": "10.9.0",
"from": "validator@latest",
"resolved": "https://registry.npmjs.org/validator/-/validator-10.9.0.tgz"
},
"wrappy": {
"version": "1.0.2",
@ -281,9 +213,9 @@
"dev": true
},
"ws": {
"version": "1.1.1",
"from": "ws@1.1.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-1.1.1.tgz"
"version": "6.1.2",
"from": "ws@latest",
"resolved": "https://npm-registry.sipwise.com/ws/-/ws-6.1.2.tgz"
}
}
}

@ -1,6 +1,6 @@
{
"name": "janus-videoroom-client",
"version": "3.2.8",
"version": "4.0.0",
"main": "src/janus.js",
"scripts": {
"test": "mocha -R spec --full-trace test/*-spec.js"
@ -16,15 +16,14 @@
"url": "https://github.com/sipwise/janus-client.git"
},
"dependencies": {
"bluebird": "3.4.1",
"chai": "3.5.0",
"chai": "4.2.0",
"debug-logger": "0.4.1",
"lodash": "4.14.1",
"uuid": "2.0.2",
"validator": "6.1.0",
"ws": "1.1.1"
"lodash": "4.17.11",
"uuid": "3.3.2",
"validator": "10.9.0",
"ws": "6.1.2"
},
"devDependencies": {
"mocha": "3.0.1"
"mocha": "5.2.0"
}
}

@ -1,23 +1,22 @@
'use strict';
var _ = require('lodash');
var WebSocket = require('ws');
var EventEmitter = require('events').EventEmitter;
var Promise = require('bluebird');
var Transaction = require('../transaction').Transaction;
var logger = require('debug-logger')('janus:client');
var ClientResponse = require('./response').ClientResponse;
var Session = require('../session').Session;
var ResponseError = require('../errors').ResponseError;
var assert = require('chai').assert;
var JanusEvents = require('../constants').JanusEvents;
var ConnectionState = {
const _ = require('lodash');
const WebSocket = require('ws');
const EventEmitter = require('events').EventEmitter;
const Transaction = require('../transaction').Transaction;
const logger = require('debug-logger')('janus:client');
const ClientResponse = require('./response').ClientResponse;
const Session = require('../session').Session;
const ResponseError = require('../errors').ResponseError;
const assert = require('chai').assert;
const JanusEvents = require('../constants').JanusEvents;
const ConnectionState = {
connected: 'connected',
disconnected: 'disconnected'
};
var ClientEvent = {
const ClientEvent = {
connected: 'connected',
disconnected: 'disconnected',
object: 'object',
@ -26,13 +25,14 @@ var ClientEvent = {
event: 'event'
};
var WebSocketEvent = {
const WebSocketEvent = {
open: 'open',
message: 'message',
error: 'error',
close: 'close'
};
/**
* @class
*/
@ -109,8 +109,8 @@ class Client {
}
close(options) {
var connect = _.get(options, 'connect', false);
var closeHandler = ()=>{
let connect = _.get(options, 'connect', false);
let closeHandler = ()=>{
this.stopConnectionTimeout();
if(this.webSocket !== null) {
this.webSocket.removeAllListeners(WebSocketEvent.open);
@ -140,7 +140,7 @@ class Client {
message(message) {
this.startConnectionTimeout();
var parsedMessage = message;
let parsedMessage = message;
try {
if(_.isString(message)) {
parsedMessage = JSON.parse(message);
@ -183,9 +183,9 @@ class Client {
}
dispatchObject(obj) {
var transactionId = _.get(obj, 'transaction', null);
var transaction;
var response;
let transactionId = _.get(obj, 'transaction', null);
let transaction;
let response;
if(transactionId !== null && this.transactions[transactionId] instanceof Transaction) {
transaction = this.transactions[obj.transaction];
response = new ClientResponse(transaction.getRequest(), obj);
@ -198,7 +198,7 @@ class Client {
}
delegateEvent(event) {
var sessionId = _.get(event, 'session_id', null);
let sessionId = _.get(event, 'session_id', null);
if(sessionId !== null && this.hasSession(sessionId)) {
switch(event.janus) {
case JanusEvents.timeout:
@ -238,15 +238,15 @@ class Client {
if(this.apiSecret !== null) {
options.request.apisecret = this.apiSecret;
}
var transaction = new Transaction(options);
let transaction = new Transaction(options);
this.transactions[transaction.getId()] = transaction;
return transaction;
}
request(req, options) {
return new Promise((resolve, reject)=>{
var ack = _.get(options, 'ack', false);
var transaction = this.createTransaction({
let ack = _.get(options, 'ack', false);
let transaction = this.createTransaction({
request: req,
client: this,
ack: ack
@ -279,7 +279,7 @@ class Client {
return new Promise((resolve, reject)=>{
this.request({ janus: 'create' }).then((res)=>{
if(res.isSuccess()) {
var session = new Session(res.getResponse().data.id, this);
let session = new Session(res.getResponse().data.id, this);
this.addSession(session);
this.logger.info('Created session=%s',session.getId());
session.onKeepAlive((result)=>{
@ -303,9 +303,40 @@ class Client {
});
}
claimSession(sessionId) {
return new Promise((resolve, reject)=>{
this.request({
janus: 'claim',
session_id: sessionId
}).then((res)=>{
if(res.isSuccess()) {
let session = new Session(res.getResponse().session_id, this);
this.addSession(session);
this.logger.info('Claimed session=%s',session.getId());
session.onKeepAlive((result)=>{
if(result) {
this.logger.debug('KeepAlive session=%s', session.getId());
} else {
this.logger.warn('KeepAlive failed session=%s', session.getId());
}
});
session.onTimeout(()=>{
this.logger.info('Timeout session=%s',session.getId());
this.deleteSession(session.getId());
});
resolve(session);
} else {
reject(new ResponseError(res));
}
}).catch((err)=>{
reject(err);
});
});
}
destroySession(id) {
return new Promise((resolve, reject)=>{
this.request({
this.request({
janus: 'destroy',
session_id: id
}).then((res)=>{

@ -1,7 +1,7 @@
'use strict';
var assert = require('chai').assert;
var _ = require('lodash');
const assert = require('chai').assert;
const _ = require('lodash');
/**
* @class

@ -1,7 +1,7 @@
'use strict';
var assert = require('chai').assert;
var _ = require('lodash');
const assert = require('chai').assert;
const _ = require('lodash');
/**
* @class

@ -1,10 +1,10 @@
'use strict';
var _ = require('lodash');
var http = require('http');
var WebSocketServer = require('ws').Server;
var JanusResponse = require('../mock/janus-response');
var logger = require('debug-logger')('mock:janus-server');
const _ = require('lodash');
const http = require('http');
const WebSocketServer = require('ws').Server;
const JanusResponse = require('../mock/janus-response');
const logger = require('debug-logger')('mock:janus-server');
/**
* @class
@ -88,7 +88,7 @@ class JanusServer {
this.send(webSocket, JanusResponse.handle.trickle(object));
break;
case 'message':
var plugin = this.handlesById[object.handle_id];
let plugin = this.handlesById[object.handle_id];
switch(plugin) {
case 'janus.plugin.videoroom':
this.dispatchVideoRoom(webSocket, object);

@ -1,8 +1,8 @@
'use strict';
var _ = require('lodash');
var EventEmitter = require('events').EventEmitter;
var JanusResponse = require('../mock/janus-response');
const _ = require('lodash');
const EventEmitter = require('events').EventEmitter;
const JanusResponse = require('../mock/janus-response');
const Plugins = {
janus_plugin_videoroom: 'janus.plugin.videoroom'
@ -41,7 +41,7 @@ class WebSocketMock {
send(message, cb) {
console.log(message);
var parsedMessage = message;
let parsedMessage = message;
if(_.isString(message)) {
parsedMessage = JSON.parse(message);
}

@ -1,12 +1,11 @@
'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;
const _ = require('lodash');
const EventEmitter = require('events').EventEmitter;
const JanusEvents = require('../constants').JanusEvents;
const logger = require('debug-logger')('janus:handle');
const PluginError = require('../errors').PluginError;
const PluginResponse = require('../client/response').PluginResponse;
const ConnectionState = {
connected: 'connected',
@ -20,6 +19,7 @@ class PluginHandle {
constructor(options) {
this.id = options.id;
this.opaqueId = options.opaqueId;
this.plugin = options.plugin;
this.emitter = new EventEmitter();
this.connectionState = ConnectionState.disconnected;
@ -75,6 +75,13 @@ class PluginHandle {
});
}
trickles(candidates) {
return this.request({
janus: 'trickle',
candidates: candidates
});
}
trickleCompleted() {
return this.request({
janus: 'trickle',
@ -129,8 +136,8 @@ class PluginHandle {
requestMessage(body, options) {
return new Promise((resolve, reject)=>{
options = options || {};
var jsep = _.get(body, 'jsep', null);
var req = {
let jsep = _.get(body, 'jsep', null);
let req = {
janus: 'message',
body: body
};
@ -139,7 +146,7 @@ class PluginHandle {
delete body.jsep;
}
this.request(req, options).then((res)=>{
var pluginResponse = new PluginResponse(res.getRequest(), res.getResponse());
let pluginResponse = new PluginResponse(res.getRequest(), res.getResponse());
if(pluginResponse.isError()) {
reject(new PluginError(res, this));
} else {

@ -1,7 +1,6 @@
'use strict';
var _ = require('lodash');
var Promise = require('bluebird');
const _ = require('lodash');
class Plugin {
@ -45,9 +44,10 @@ class Plugin {
this.handles.delete(id);
}
createHandle() {
createHandle(options) {
return new Promise((resolve, reject)=>{
this.getSession().createPluginHandle(this.getFullName()).then((handleId)=>{
this.getSession().createPluginHandle(this.getFullName(), options)
.then((handleId)=>{
resolve(handleId);
}).catch((err)=>{
reject(err);

@ -1,14 +1,13 @@
'use strict';
var _ = require('lodash');
var assert = require('chai').assert;
var Promise = require('bluebird');
var PluginHandle = require('../handle').PluginHandle;
var logger = require('debug-logger')('janus:videoroom:handle');
const _ = require('lodash');
const assert = require('chai').assert;
const PluginHandle = require('../handle').PluginHandle;
const logger = require('debug-logger')('janus:videoroom:handle');
var ParticipantType = {
const ParticipantType = {
publisher: 'publisher',
listener: 'listener'
listener: 'subscriber'
};
/**
@ -23,7 +22,7 @@ class VideoRoomHandle extends PluginHandle {
create(options) {
return new Promise((resolve, reject)=>{
options = options || {};
var message = _.merge({
let message = _.merge({
request: 'create'
}, options);
this.requestMessage(message).then((res)=>{
@ -40,7 +39,7 @@ class VideoRoomHandle extends PluginHandle {
destroy(options) {
return new Promise((resolve, reject)=>{
assert.property(options, 'room');
var message = _.merge({
let message = _.merge({
request: 'destroy'
}, options);
this.requestMessage(message).then((res)=>{
@ -56,7 +55,7 @@ class VideoRoomHandle extends PluginHandle {
exists(options) {
return new Promise((resolve, reject)=>{
assert.property(options, 'room');
var message = _.merge({
let message = _.merge({
request: 'exists'
}, options);
this.requestMessage(message).then((res)=>{
@ -88,7 +87,7 @@ class VideoRoomHandle extends PluginHandle {
listParticipants(options) {
return new Promise((resolve, reject)=>{
assert.property(options, 'room');
var message = _.merge({
let message = _.merge({
request: 'listparticipants'
}, options);
this.requestMessage(message).then((res)=>{
@ -106,7 +105,7 @@ class VideoRoomHandle extends PluginHandle {
return new Promise((resolve, reject)=>{
assert.property(options, 'room');
assert.property(options, 'ptype');
var message = _.merge({
let message = _.merge({
request: 'join'
}, options);
this.requestMessage(message, {
@ -126,7 +125,7 @@ class VideoRoomHandle extends PluginHandle {
joinPublisher(options) {
return new Promise((resolve, reject)=>{
assert.property(options, 'room');
var joinOptions = _.merge({
let joinOptions = _.merge({
ptype: ParticipantType.publisher
}, options);
this.join(joinOptions, {
@ -143,7 +142,7 @@ class VideoRoomHandle extends PluginHandle {
return new Promise((resolve, reject)=>{
assert.property(options, 'room');
assert.property(options, 'feed');
var joinOptions = _.merge({
let joinOptions = _.merge({
ptype: ParticipantType.listener
}, options);
this.join(joinOptions, {
@ -160,7 +159,7 @@ class VideoRoomHandle extends PluginHandle {
return new Promise((resolve, reject)=>{
options.audio = _.get(options, 'audio', true);
options.video = _.get(options, 'video', true);
var message = _.merge({
let message = _.merge({
request: 'configure'
}, options);
this.requestMessage(message, {
@ -181,7 +180,7 @@ class VideoRoomHandle extends PluginHandle {
assert.property(options, 'jsep');
options.audio = _.get(options, 'audio', true);
options.video = _.get(options, 'video', true);
var message = _.merge({
let message = _.merge({
request: 'joinandconfigure',
ptype: 'publisher'
}, options);
@ -203,7 +202,7 @@ class VideoRoomHandle extends PluginHandle {
publish(options) {
return new Promise((resolve, reject)=>{
assert.property(options, 'jsep');
var message = _.merge({
let message = _.merge({
request: 'publish'
}, options);
this.requestMessage(message, {
@ -220,7 +219,7 @@ class VideoRoomHandle extends PluginHandle {
unpublish(options) {
return new Promise((resolve, reject)=>{
var message = _.merge({
let message = _.merge({
request: 'unpublish'
}, options);
this.requestMessage(message, {
@ -239,7 +238,7 @@ class VideoRoomHandle extends PluginHandle {
return new Promise((resolve, reject)=>{
assert.property(options, 'room');
assert.property(options, 'jsep');
var message = _.merge({
let message = _.merge({
request: 'start'
}, options);
this.requestMessage(message, {
@ -261,7 +260,7 @@ class VideoRoomHandle extends PluginHandle {
*/
pause(options) {
return new Promise((resolve, reject)=>{
var message = _.merge({
let message = _.merge({
request: 'pause'
}, options);
this.requestMessage(message, {
@ -278,7 +277,7 @@ class VideoRoomHandle extends PluginHandle {
switch(options) {
return new Promise((resolve, reject)=>{
var message = _.merge({
let message = _.merge({
request: 'switch'
}, options);
this.requestMessage(message, {
@ -300,7 +299,7 @@ class VideoRoomHandle extends PluginHandle {
*/
stop(options) {
return new Promise((resolve, reject)=>{
var message = _.merge({
let message = _.merge({
request: 'stop'
}, options);
this.requestMessage(message, {
@ -317,7 +316,7 @@ class VideoRoomHandle extends PluginHandle {
add(options) {
return new Promise((resolve, reject)=>{
var message = _.merge({
let message = _.merge({
request: 'add'
}, options);
this.requestMessage(message, {
@ -334,7 +333,7 @@ class VideoRoomHandle extends PluginHandle {
remove(options) {
return new Promise((resolve, reject)=>{
var message = _.merge({
let message = _.merge({
request: 'remove'
}, options);
this.requestMessage(message, {
@ -351,7 +350,7 @@ class VideoRoomHandle extends PluginHandle {
leave(options) {
return new Promise((resolve, reject)=>{
var message = _.merge({
let message = _.merge({
request: 'leave'
}, options);
this.requestMessage(message, {

@ -1,13 +1,13 @@
'use strict';
var _ = require('lodash');
var assert = require('chai').assert;
var Plugin = require('../plugin').Plugin;
var VideoRoomHandle = require('./handle').VideoRoomHandle;
var VideoRoomPublisher = require('./publisher').VideoRoomPublisher;
var VideoRoomListener = require('./listener').VideoRoomListener;
var AudioCodec = {
const _ = require('lodash');
const assert = require('chai').assert;
const Plugin = require('../plugin').Plugin;
const VideoRoomHandle = require('./handle').VideoRoomHandle;
const VideoRoomPublisher = require('./publisher').VideoRoomPublisher;
const VideoRoomListener = require('./listener').VideoRoomListener;
const AudioCodec = {
opus: 'opus',
isac32: 'isac32',
isac16: 'isac16',
@ -16,7 +16,7 @@ var AudioCodec = {
g722: 'g722'
};
var VideoCodec = {
const VideoCodec = {
vp8: 'vp8',
vp9: 'vp9',
h264: 'h264'
@ -32,10 +32,11 @@ class VideoRoomPlugin extends Plugin {
this.$defaultHandle = null;
}
defaultHandle() {
defaultHandle(options) {
return new Promise((resolve, reject)=>{
if(this.$defaultHandle === null) {
this.createVideoRoomHandle().then((handle)=>{
this.createVideoRoomHandle(options)
.then((handle)=>{
this.$defaultHandle = handle;
resolve(this.$defaultHandle);
}).catch((err)=>{
@ -47,9 +48,10 @@ class VideoRoomPlugin extends Plugin {
});
}
createVideoRoomHandle() {
createVideoRoomHandle(options) {
return new Promise((resolve, reject)=>{
this.createHandle().then((id)=>{
this.createHandle(options)
.then((id)=>{
this.addHandle(new VideoRoomHandle({
id: id,
plugin: this
@ -61,13 +63,28 @@ class VideoRoomPlugin extends Plugin {
});
}
createPublisherHandle(room) {
attachVideoRoomHandle(handleId, opaqueId) {
return new Promise((resolve)=>{
this.addHandle(new VideoRoomHandle({
id: handleId,
plugin: this,
opaqueId: opaqueId
}));
let defaultHandle = this.getHandle(handleId);
this.$defaultHandle = defaultHandle;
resolve(defaultHandle);
});
}
createPublisherHandle(room, opaqueId) {
let options = { opaqueId: opaqueId };
return new Promise((resolve, reject)=>{
this.createHandle().then((id)=>{
this.createHandle(options).then((id)=>{
this.addHandle(new VideoRoomPublisher({
id: id,
plugin: this,
room: room
room: room,
opaqueId: opaqueId
}));
resolve(this.getHandle(id));
}).catch((err)=>{
@ -76,14 +93,29 @@ class VideoRoomPlugin extends Plugin {
});
}
createListenerHandle(room, feed) {
attachPublisherHandle(handleId, room, opaqueId) {
return new Promise((resolve)=>{
this.addHandle(new VideoRoomPublisher({
id: handleId,
plugin: this,
room: room,
opaqueId: opaqueId
}));
resolve(this.getHandle(handleId));
});
}
createListenerHandle(room, feed, opaqueId) {
let options = { opaqueId: opaqueId };
return new Promise((resolve, reject)=>{
this.createHandle().then((id)=>{
this.createHandle(options)
.then((id)=>{
this.addHandle(new VideoRoomListener({
id: id,
plugin: this,
room: room,
feed: feed
feed: feed,
opaqueId: opaqueId
}));
resolve(this.getHandle(id));
}).catch((err)=>{
@ -92,11 +124,24 @@ class VideoRoomPlugin extends Plugin {
});
}
publishFeed(room, offer) {
attachListenerHandle(handleId, room, feed, opaqueId) {
return new Promise((resolve)=>{
this.addHandle(new VideoRoomListener({
id: handleId,
plugin: this,
room: room,
feed: feed,
opaqueId: opaqueId
}));
resolve(this.getHandle(handleId));
});
}
publishFeed(room, offer, opaqueId) {
return new Promise((resolve, reject)=>{
var handle = null;
let handle = null;
Promise.resolve().then(()=>{
return this.createPublisherHandle(room);
return this.createPublisherHandle(room, opaqueId);
}).then((createdHandle)=>{
handle = createdHandle;
return handle.createAnswer(offer);
@ -108,11 +153,11 @@ class VideoRoomPlugin extends Plugin {
});
}
listenFeed(room, feed) {
listenFeed(room, feed, opaqueId) {
return new Promise((resolve, reject)=>{
var handle = null;
let handle = null;
Promise.resolve().then(()=>{
return this.createListenerHandle(room, feed);
return this.createListenerHandle(room, feed, opaqueId);
}).then((createdHandle)=>{
handle = createdHandle;
return handle.createOffer();
@ -132,7 +177,7 @@ class VideoRoomPlugin extends Plugin {
getFeeds(room) {
return new Promise((resolve, reject)=>{
assert.isNumber(room, 'Missing room id');
var feeds = [];
let feeds = [];
Promise.resolve().then(()=>{
return this.defaultHandle();
}).then((handle)=>{

@ -1,8 +1,7 @@
'use strict';
var Promise = require('bluebird');
var logger = require('debug-logger')('janus:videoroom:listener');
var VideoRoomHandle = require('./handle').VideoRoomHandle;
const logger = require('debug-logger')('janus:videoroom:listener');
const VideoRoomHandle = require('./handle').VideoRoomHandle;
/**
* @class

@ -1,9 +1,8 @@
'use strict';
var _ = require('lodash');
var Promise = require('bluebird');
var logger = require('debug-logger')('janus:videoroom:publisher');
var VideoRoomHandle = require('./handle').VideoRoomHandle;
const _ = require('lodash');
const logger = require('debug-logger')('janus:videoroom:publisher');
const VideoRoomHandle = require('./handle').VideoRoomHandle;
/**
* @class

@ -1,12 +1,11 @@
'use strict';
var _ = require('lodash');
var Promise = require('bluebird');
var EventEmitter = require('events').EventEmitter;
var logger = require('debug-logger')('janus:session');
var VideoRoomPlugin = require('./plugins/videoroom').VideoRoomPlugin;
const _ = require('lodash');
const EventEmitter = require('events').EventEmitter;
const logger = require('debug-logger')('janus:session');
const VideoRoomPlugin = require('./plugins/videoroom').VideoRoomPlugin;
var State = {
const State = {
alive: 'alive',
dying: 'dying',
dead: 'dead'
@ -68,13 +67,15 @@ class Session {
return this.janus.request(obj, options);
}
createPluginHandle(plugin) {
createPluginHandle(plugin, options) {
let opaqueId = options ? options.opaqueId : undefined;
return new Promise((resolve, reject)=>{
this.request({
janus: 'attach',
plugin: plugin
plugin: plugin,
opaque_id: opaqueId
}).then((res)=>{
var handleId = _.get(res.getResponse(), 'data.id', null);
let handleId = _.get(res.getResponse(), 'data.id', null);
if(handleId !== null) {
logger.info('Created handle plugin=%s handle=%s', plugin, handleId);
resolve(handleId);

@ -1,14 +1,14 @@
'use strict';
var path = require('path');
var _ = require('lodash');
var createId = require('uuid');
var EventEmitter = require('events').EventEmitter;
var ResponseError = require('./errors').ResponseError;
var assert = require('chai').assert;
var ClientResponse = require('./client/response').ClientResponse;
var State = {
const path = require('path');
const _ = require('lodash');
const createId = require('uuid');
const EventEmitter = require('events').EventEmitter;
const ResponseError = require('./errors').ResponseError;
const assert = require('chai').assert;
const ClientResponse = require('./client/response').ClientResponse;
const State = {
new: 'new',
started: 'started',
sent: 'sent',
@ -16,7 +16,7 @@ var State = {
ended: 'ended'
};
var Event = {
const Event = {
response: 'response',
ack: 'ack',
end: 'end',

@ -5,7 +5,7 @@ FROM docker.mgm.sipwise.com/sipwise-stretch:latest
# is updated with the current date. It will force refresh of all
# of the base images and things like `apt-get update` won't be using
# old cached versions when the Dockerfile is built.
ENV REFRESHED_AT 2017-09-25
ENV REFRESHED_AT 2018-12-12
# files that get-code generates
COPY t/sources.list.d/builddeps.list /etc/apt/sources.list.d/

@ -160,8 +160,8 @@ describe('PluginHandle', function(){
assert.equal(res.response.getData().videoroom, 'attached');
assert.equal(res.response.getData().room, 123);
assert.isNumber(res.response.getData().id);
assert.deepProperty(res.response.getResponse(), 'jsep.type');
assert.deepProperty(res.response.getResponse(), 'jsep.sdp');
assert.nestedProperty(res.response.getResponse(), 'jsep.type');
assert.nestedProperty(res.response.getResponse(), 'jsep.sdp');
done();
}).catch((err)=>{
done(err);

Loading…
Cancel
Save