When switching public rooms disconnect from devices in old room (fixes #298)

This commit is contained in:
schlagmichdoch 2024-05-16 19:44:43 +02:00
parent 9b3571feac
commit be381ea438
3 changed files with 24 additions and 18 deletions

View file

@ -1502,9 +1502,12 @@ class PeersManager {
Events.on('peer-connected', e => this._onPeerConnected(e.detail.peerId)); Events.on('peer-connected', e => this._onPeerConnected(e.detail.peerId));
Events.on('peer-disconnected', e => this._onPeerDisconnected(e.detail)); Events.on('peer-disconnected', e => this._onPeerDisconnected(e.detail));
// ROOMS
Events.on('join-public-room', e => this._onJoinPublicRoom(e.detail.roomId));
// this device closes connection // this device closes connection
Events.on('room-secrets-deleted', e => this._onRoomSecretsDeleted(e.detail)); Events.on('room-secrets-deleted', e => this._onRoomSecretsDeleted(e.detail));
Events.on('leave-public-room', e => this._onLeavePublicRoom(e.detail)); Events.on('leave-public-room', _ => this._onLeavePublicRoom());
// peer closes connection // peer closes connection
Events.on('secret-room-deleted', e => this._onSecretRoomDeleted(e.detail)); Events.on('secret-room-deleted', e => this._onSecretRoomDeleted(e.detail));
@ -1682,6 +1685,9 @@ class PeersManager {
} }
_onJoinPublicRoom(roomId) { _onJoinPublicRoom(roomId) {
if (roomId !== this._device.publicRoomId) {
this._disconnectFromPublicRoom();
}
this._device.publicRoomId = roomId; this._device.publicRoomId = roomId;
} }

View file

@ -2046,8 +2046,8 @@ class PublicRoomDialog extends Dialog {
Events.on('keydown', e => this._onKeyDown(e)); Events.on('keydown', e => this._onKeyDown(e));
Events.on('public-room-created', e => this._onPublicRoomCreated(e.detail)); Events.on('public-room-created', e => this._onPublicRoomCreated(e.detail));
Events.on('peers', e => this._onPeers(e.detail)); Events.on('peers', e => this._onPeers(e.detail.peers, e.detail.roomId));
Events.on('peer-joined', e => this._onPeerJoined(e.detail.peer, e.detail.roomId)); Events.on('peer-joined', e => this._onPeerJoined(e.detail.roomId));
Events.on('public-room-id-invalid', e => this._onPublicRoomIdInvalid(e.detail)); Events.on('public-room-id-invalid', e => this._onPublicRoomIdInvalid(e.detail));
Events.on('public-room-left', _ => this._onPublicRoomLeft()); Events.on('public-room-left', _ => this._onPublicRoomLeft());
this.$el.addEventListener('paste', e => this._onPaste(e)); this.$el.addEventListener('paste', e => this._onPaste(e));
@ -2177,29 +2177,30 @@ class PublicRoomDialog extends Dialog {
} }
} }
_onPeers(message) { _onPeers(peers, roomId) {
message.peers.forEach(messagePeer => { // Do not evaluate if creating new room
this._evaluateJoinedPeer(messagePeer.id, message.roomId); if (this.roomId && !peers.length) return;
});
this._evaluateJoinedPeer(roomId);
} }
_onPeerJoined(peer, roomId) { _onPeerJoined(roomId) {
this._evaluateJoinedPeer(peer.id, roomId); this._evaluateJoinedPeer(roomId);
} }
_evaluateJoinedPeer(peerId, roomId) { _evaluateJoinedPeer(roomId) {
const isInitiatedRoomId = roomId === this.roomId; const peerJoinedThisRoom = roomId === this.roomId;
const isJoinedRoomId = roomId === this.roomIdJoin; const switchedToOtherRoom = roomId === this.roomIdJoin;
if (!peerId || !roomId || (!isInitiatedRoomId && !isJoinedRoomId)) return; if (!roomId || (!peerJoinedThisRoom && !switchedToOtherRoom)) return;
this.hide(); this.hide();
sessionStorage.setItem('public_room_id', roomId); sessionStorage.setItem('public_room_id', roomId);
if (isJoinedRoomId) { if (switchedToOtherRoom) {
this.roomIdJoin = null;
this.roomId = roomId; this.roomId = roomId;
this.roomIdJoin = false;
this._setKeyAndQrCode(); this._setKeyAndQrCode();
} }
} }
@ -2212,7 +2213,7 @@ class PublicRoomDialog extends Dialog {
} }
_leavePublicRoom() { _leavePublicRoom() {
Events.fire('leave-public-room', this.roomId); Events.fire('leave-public-room');
} }
_onPublicRoomLeft() { _onPublicRoomLeft() {

View file

@ -251,7 +251,6 @@ export default class PairDropWsServer {
return; return;
} }
this._leavePublicRoom(sender);
this._joinPublicRoom(sender, message.publicRoomId); this._joinPublicRoom(sender, message.publicRoomId);
} }
@ -312,7 +311,7 @@ export default class PairDropWsServer {
_joinPublicRoom(peer, publicRoomId) { _joinPublicRoom(peer, publicRoomId) {
// prevent joining of 2 public rooms simultaneously // prevent joining of 2 public rooms simultaneously
this._leavePublicRoom(peer); this._leavePublicRoom(peer, true);
this._joinRoom(peer, 'public-id', publicRoomId); this._joinRoom(peer, 'public-id', publicRoomId);