Bug 1092954: oust all users from a room when it's deleted. r=Standard8

This commit is contained in:
Mike de Boer 2014-12-08 17:45:32 +01:00
Родитель cd42d11736
Коммит 7ca61b12b0
3 изменённых файлов: 69 добавлений и 5 удалений

Просмотреть файл

@ -346,6 +346,7 @@ let LoopRoomsInternal = {
.then(response => {
this.rooms.delete(roomToken);
eventEmitter.emit("delete", room);
eventEmitter.emit("delete:" + room.roomToken, room);
callback(null, room);
}, error => callback(error)).catch(error => callback(error));
},

Просмотреть файл

@ -211,6 +211,8 @@ loop.store.ActiveRoomStore = (function() {
this._mozLoop.rooms.on("update:" + actionData.roomToken,
this._handleRoomUpdate.bind(this));
this._mozLoop.rooms.on("delete:" + actionData.roomToken,
this._handleRoomDelete.bind(this));
},
/**
@ -230,6 +232,8 @@ loop.store.ActiveRoomStore = (function() {
this._mozLoop.rooms.on("update:" + actionData.roomToken,
this._handleRoomUpdate.bind(this));
this._mozLoop.rooms.on("delete:" + actionData.roomToken,
this._handleRoomDelete.bind(this));
},
/**
@ -259,6 +263,18 @@ loop.store.ActiveRoomStore = (function() {
}));
},
/**
* Handles the deletion of a room, notified by the mozLoop rooms API.
*
* @param {String} eventName The name of the event
* @param {Object} roomData The roomData of the deleted room
*/
_handleRoomDelete: function(eventName, roomData) {
this._sdkDriver.forceDisconnectAll(function() {
window.close();
});
},
/**
* Handles the action to join to a room.
*/
@ -391,7 +407,9 @@ loop.store.ActiveRoomStore = (function() {
this._leaveRoom(ROOM_STATES.CLOSING);
// If we're closing the window, we can stop listening to updates.
this._mozLoop.rooms.off("update:" + this.getStoreState().roomToken);
var roomToken = this.getStoreState().roomToken;
this._mozLoop.rooms.off("update:" + roomToken);
this._mozLoop.rooms.off("delete:" + roomToken);
},
/**

Просмотреть файл

@ -25,6 +25,8 @@ loop.OTSdkDriver = (function() {
this.dispatcher = options.dispatcher;
this.sdk = options.sdk;
this.connections = {};
this.dispatcher.register(this, [
"setupStreamElements",
"setMute"
@ -115,6 +117,38 @@ loop.OTSdkDriver = (function() {
delete this._publisherReady;
delete this._publishedLocalStream;
delete this._subscribedRemoteStream;
this.connections = {};
},
/**
* Oust all users from an ongoing session. This is typically done when a room
* owner deletes the room.
*
* @param {Function} callback Function to be invoked once all connections are
* ousted
*/
forceDisconnectAll: function(callback) {
if (!this._sessionConnected) {
callback();
return;
}
var connectionNames = Object.keys(this.connections);
if (connectionNames.length === 0) {
callback();
return;
}
var disconnectCount = 0;
connectionNames.forEach(function(id) {
var connection = this.connections[id];
this.session.forceDisconnect(connection, function() {
// When all connections have disconnected, call the callback, since
// we're done.
if (++disconnectCount === connectionNames.length) {
callback();
}
});
}, this);
},
/**
@ -139,10 +173,14 @@ loop.OTSdkDriver = (function() {
/**
* Handles the connection event for a peer's connection being dropped.
*
* @param {SessionDisconnectEvent} event The event details
* https://tokbox.com/opentok/libraries/client/js/reference/SessionDisconnectEvent.html
* @param {ConnectionEvent} event The event details
* https://tokbox.com/opentok/libraries/client/js/reference/ConnectionEvent.html
*/
_onConnectionDestroyed: function(event) {
var connection = event.connection;
if (connection && (connection.id in this.connections)) {
delete this.connections[connection.id];
}
this.dispatcher.dispatch(new sharedActions.RemotePeerDisconnected({
peerHungup: event.reason === "clientDisconnected"
}));
@ -164,11 +202,18 @@ loop.OTSdkDriver = (function() {
}
},
/**
* Handles the connection event for a newly connecting peer.
*
* @param {ConnectionEvent} event The event details
* https://tokbox.com/opentok/libraries/client/js/reference/ConnectionEvent.html
*/
_onConnectionCreated: function(event) {
if (this.session.connection.id === event.connection.id) {
var connection = event.connection;
if (this.session.connection.id === connection.id) {
return;
}
this.connections[connection.id] = connection;
this.dispatcher.dispatch(new sharedActions.RemotePeerConnected());
},