diff --git a/labs/bbb-webrtc-sfu/lib/base/BaseManager.js b/labs/bbb-webrtc-sfu/lib/base/BaseManager.js index ee18a1e0e9043c586fb7a64d90c6b8ac39f73a7f..cae3a0346030aac83dbb8a521525580a2ecb5f13 100644 --- a/labs/bbb-webrtc-sfu/lib/base/BaseManager.js +++ b/labs/bbb-webrtc-sfu/lib/base/BaseManager.js @@ -143,6 +143,11 @@ module.exports = class BaseManager { } _handleError (logPrefix, connectionId, streamId, role, error) { + // Setting a default error in case it was unhandled + if (error == null) { + error = { code: 2200, reason: errors[2200] } + } + if (error && this._validateErrorMessage(error)) { return error; } diff --git a/labs/bbb-webrtc-sfu/lib/base/BaseProvider.js b/labs/bbb-webrtc-sfu/lib/base/BaseProvider.js index eb1897fefed436fc79e154c217fcdf5f44c78448..cf89a4c71f1521e087453be9f5d2c962d3d4f47a 100644 --- a/labs/bbb-webrtc-sfu/lib/base/BaseProvider.js +++ b/labs/bbb-webrtc-sfu/lib/base/BaseProvider.js @@ -33,6 +33,11 @@ module.exports = class BaseProvider extends EventEmitter { _handleError (logPrefix, error, role, streamId) { + // Setting a default error in case it was unhandled + if (error == null) { + error = { code: 2200, reason: errors[2200] } + } + if (this._validateErrorMessage(error)) { return error; } diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/adapters/kurento/kurento.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/adapters/kurento/kurento.js index d6e9a9eef9bd38da77c32f118170a78190e0b6af..d4ca0bf9708db30ba8b7949877c5bd6dfddf725f 100644 --- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/adapters/kurento/kurento.js +++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/adapters/kurento/kurento.js @@ -12,10 +12,11 @@ const KURENTO_WEBSOCKET_POOL_SIZE = config.get('kurento-websocket-pool-size'); let instance = null; module.exports = class MediaServer extends EventEmitter { - constructor(serverUri) { + constructor(serverUri, globalEmitter) { if (!instance){ super(); this._serverUri = serverUri; + this._globalEmitter = globalEmitter; this._mediaPipelines = {}; this._mediaElements = {}; this._mediaServers; @@ -36,6 +37,7 @@ module.exports = class MediaServer extends EventEmitter { let client = await this._getMediaServerClient(this._serverUri); this._mediaServers.push(client); } + this._globalEmitter.on(C.EVENT.ROOM_EMPTY, this._releasePipeline.bind(this)); Logger.info("[mcs-media] Retrieved", this._mediaServers.length, "media server clients"); this._status = C.STATUS.STARTING; this._monitorConnectionState(); @@ -170,6 +172,7 @@ module.exports = class MediaServer extends EventEmitter { if (error) { return reject(this._handleError(error)); } + Logger.debug("[mcs-media] Pipeline", pipeline.id, "released"); delete this._mediaPipelines[room]; return resolve() }); diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/constants/Constants.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/constants/Constants.js index 9afe27d9c7c6a1e4a530899a7396deb308720922..532fce7301653cc5a9dc7a64d3cbb312f33b69a2 100644 --- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/constants/Constants.js +++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/constants/Constants.js @@ -39,6 +39,7 @@ exports.EVENT.MEDIA_STATE.FLOW_IN = "MediaFlowInStateChange" exports.EVENT.MEDIA_STATE.ENDOFSTREAM = "EndOfStream" exports.EVENT.MEDIA_STATE.ICE = "OnIceCandidate" exports.EVENT.SERVER_STATE = "ServerState" +exports.EVENT.ROOM_EMPTY = "RoomEmpty" exports.EVENT.RECORDING = {}; exports.EVENT.RECORDING.STOPPED = 'Stopped'; diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MediaController.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MediaController.js index 6f890ed50fc586143629d01afd5a8b8dbf05b169..8a8328a06615130d901f052fd20509187fb2f9d7 100644 --- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MediaController.js +++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/media/MediaController.js @@ -45,7 +45,7 @@ module.exports = class MediaController { let session; const room = await this.createRoomMCS(roomId); const user = await this.createUserMCS(roomId, type, params); - room.setUser(user.id); + room.setUser(user); if (params.sdp) { session = user.addSdp(params.sdp); @@ -306,7 +306,7 @@ module.exports = class MediaController { Logger.info("[mcs-controller] Creating new room with ID", roomId); if (this._rooms[roomId] == null) { - this._rooms[roomId] = new Room(roomId); + this._rooms[roomId] = new Room(roomId, this.emitter); } return Promise.resolve(this._rooms[roomId]); diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/MediaSession.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/MediaSession.js index ca96a693932bb4594981cd11f8c6b138f1546bc3..2d8f37ad82f5228da5ea93914f67781ac5a3be27 100644 --- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/MediaSession.js +++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/MediaSession.js @@ -32,7 +32,7 @@ module.exports = class MediaSession { this._options = options; this._adapter = options.adapter? options.adapter : C.STRING.KURENTO; this._name = options.name? options.name : C.STRING.DEFAULT_NAME; - this._MediaServer = MediaSession.getAdapter(this._adapter); + this._MediaServer = MediaSession.getAdapter(this._adapter, emitter); this.eventQueue = []; } @@ -147,14 +147,14 @@ module.exports = class MediaSession { } } - static getAdapter (adapter) { + static getAdapter (adapter, emitter) { let obj = null; Logger.info("[mcs-media-session] Session is using the", adapter, "adapter"); switch (adapter) { case C.STRING.KURENTO: - obj = new Kurento(kurentoUrl); + obj = new Kurento(kurentoUrl, emitter); break; case C.STRING.FREESWITCH: obj = new Freeswitch(); diff --git a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/Room.js b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/Room.js index 935c6b37f6a8c15d943ce6b7284431802f6dcb21..ca8ae614a4f0ed983be97c0dcbae9bda83ae678d 100644 --- a/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/Room.js +++ b/labs/bbb-webrtc-sfu/lib/mcs-core/lib/model/Room.js @@ -5,11 +5,14 @@ 'use strict' +const C = require('../constants/Constants'); + module.exports = class Room { - constructor(id) { + constructor(id, emitter) { this._id = id; this._users = {}; this._mcuUsers = {}; + this.emitter = emitter; } getUser (id) { @@ -21,6 +24,11 @@ module.exports = class Room { } destroyUser(userId) { - this._users[userId] = null; + if (this._users[userId]) { + delete this._users[userId]; + if (Object.keys(this._users).length <= 0) { + this.emitter.emit(C.EVENT.ROOM_EMPTY, this._id); + } + } } }