diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 23b5715..418359e 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -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" } } } diff --git a/package.json b/package.json index 146aa42..8d5c2bf 100644 --- a/package.json +++ b/package.json @@ -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" } } diff --git a/src/client/index.js b/src/client/index.js index 157d4d6..4d05bf6 100644 --- a/src/client/index.js +++ b/src/client/index.js @@ -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)=>{ diff --git a/src/client/response.js b/src/client/response.js index 03c1b67..3fe9962 100644 --- a/src/client/response.js +++ b/src/client/response.js @@ -1,7 +1,7 @@ 'use strict'; -var assert = require('chai').assert; -var _ = require('lodash'); +const assert = require('chai').assert; +const _ = require('lodash'); /** * @class diff --git a/src/errors.js b/src/errors.js index f14f106..e7dff7c 100644 --- a/src/errors.js +++ b/src/errors.js @@ -1,7 +1,7 @@ 'use strict'; -var assert = require('chai').assert; -var _ = require('lodash'); +const assert = require('chai').assert; +const _ = require('lodash'); /** * @class diff --git a/src/mock/janus-server.js b/src/mock/janus-server.js index 8cbbd7e..e69f660 100644 --- a/src/mock/janus-server.js +++ b/src/mock/janus-server.js @@ -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); diff --git a/src/mock/websocket.js b/src/mock/websocket.js index 3bf3847..bdd8ef9 100644 --- a/src/mock/websocket.js +++ b/src/mock/websocket.js @@ -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); } diff --git a/src/plugins/handle.js b/src/plugins/handle.js index c94aa7d..5b3ed9c 100644 --- a/src/plugins/handle.js +++ b/src/plugins/handle.js @@ -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 { diff --git a/src/plugins/plugin.js b/src/plugins/plugin.js index 721f5b0..0e7ce51 100644 --- a/src/plugins/plugin.js +++ b/src/plugins/plugin.js @@ -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); diff --git a/src/plugins/videoroom/handle.js b/src/plugins/videoroom/handle.js index b16f7e6..f2564b2 100644 --- a/src/plugins/videoroom/handle.js +++ b/src/plugins/videoroom/handle.js @@ -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, { diff --git a/src/plugins/videoroom/index.js b/src/plugins/videoroom/index.js index 2863b2e..77ceb15 100644 --- a/src/plugins/videoroom/index.js +++ b/src/plugins/videoroom/index.js @@ -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)=>{ diff --git a/src/plugins/videoroom/listener.js b/src/plugins/videoroom/listener.js index d0d949e..4f0c02b 100644 --- a/src/plugins/videoroom/listener.js +++ b/src/plugins/videoroom/listener.js @@ -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 diff --git a/src/plugins/videoroom/publisher.js b/src/plugins/videoroom/publisher.js index eaf399c..04c06e3 100644 --- a/src/plugins/videoroom/publisher.js +++ b/src/plugins/videoroom/publisher.js @@ -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 diff --git a/src/session.js b/src/session.js index 5467ebd..e685a0b 100644 --- a/src/session.js +++ b/src/session.js @@ -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); diff --git a/src/transaction.js b/src/transaction.js index 64f7ce5..42eb7ed 100644 --- a/src/transaction.js +++ b/src/transaction.js @@ -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', diff --git a/t/Dockerfile b/t/Dockerfile index 72e358e..6363792 100644 --- a/t/Dockerfile +++ b/t/Dockerfile @@ -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/ diff --git a/test/plugin-handle-spec.js b/test/plugin-handle-spec.js index 8f9347e..685c8e3 100644 --- a/test/plugin-handle-spec.js +++ b/test/plugin-handle-spec.js @@ -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);