Handle client reconnects better
parent
2b96e0b039
commit
d20f0c161f
|
|
@ -1520,6 +1520,28 @@ export default class RoomClient
|
||||||
})
|
})
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
if (this._screenSharingProducer)
|
||||||
|
this._screenSharingProducer.close();
|
||||||
|
|
||||||
|
if (this._webcamProducer)
|
||||||
|
this._webcamProducer.close();
|
||||||
|
|
||||||
|
if (this._micProducer)
|
||||||
|
this._micProducer.close();
|
||||||
|
|
||||||
|
// Close mediasoup Transports.
|
||||||
|
if (this._sendTransport)
|
||||||
|
{
|
||||||
|
this._sendTransport.close();
|
||||||
|
this._sendTransport = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._recvTransport)
|
||||||
|
{
|
||||||
|
this._recvTransport.close();
|
||||||
|
this._recvTransport = null;
|
||||||
|
}
|
||||||
|
|
||||||
store.dispatch(roomActions.setRoomState('connecting'));
|
store.dispatch(roomActions.setRoomState('connecting'));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -1722,6 +1744,13 @@ export default class RoomClient
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case 'roomBack':
|
||||||
|
{
|
||||||
|
await this._joinRoom({ joinVideo });
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case 'lockRoom':
|
case 'lockRoom':
|
||||||
{
|
{
|
||||||
store.dispatch(
|
store.dispatch(
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ const EventEmitter = require('events').EventEmitter;
|
||||||
const axios = require('axios');
|
const axios = require('axios');
|
||||||
const Logger = require('./Logger');
|
const Logger = require('./Logger');
|
||||||
const Lobby = require('./Lobby');
|
const Lobby = require('./Lobby');
|
||||||
|
const { v4: uuidv4 } = require('uuid');
|
||||||
|
const jwt = require('jsonwebtoken');
|
||||||
const userRoles = require('../userRoles');
|
const userRoles = require('../userRoles');
|
||||||
const config = require('../config/config');
|
const config = require('../config/config');
|
||||||
|
|
||||||
|
|
@ -46,6 +48,8 @@ class Room extends EventEmitter
|
||||||
super();
|
super();
|
||||||
this.setMaxListeners(Infinity);
|
this.setMaxListeners(Infinity);
|
||||||
|
|
||||||
|
this._uuid = uuidv4();
|
||||||
|
|
||||||
// Room ID.
|
// Room ID.
|
||||||
this._roomId = roomId;
|
this._roomId = roomId;
|
||||||
|
|
||||||
|
|
@ -120,9 +124,26 @@ class Room extends EventEmitter
|
||||||
this.emit('close');
|
this.emit('close');
|
||||||
}
|
}
|
||||||
|
|
||||||
handlePeer(peer)
|
handlePeer({ peer, token })
|
||||||
{
|
{
|
||||||
logger.info('handlePeer() [peer:"%s", roles:"%s"]', peer.id, peer.roles);
|
logger.info('handlePeer() [peer:"%s", roles:"%s", token:"%s"]', peer.id, peer.roles, token);
|
||||||
|
|
||||||
|
let verifiedPeer = false;
|
||||||
|
|
||||||
|
if (token)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const decoded = jwt.verify(token, this._uuid);
|
||||||
|
|
||||||
|
if (decoded.id === peer.id)
|
||||||
|
verifiedPeer = true;
|
||||||
|
}
|
||||||
|
catch (err)
|
||||||
|
{
|
||||||
|
logger.warn('handlePeer() | invalid token');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Allow reconnections, remove old peer
|
// Allow reconnections, remove old peer
|
||||||
if (this._peers[peer.id])
|
if (this._peers[peer.id])
|
||||||
|
|
@ -134,8 +155,11 @@ class Room extends EventEmitter
|
||||||
this._peers[peer.id].close();
|
this._peers[peer.id].close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returning user
|
||||||
|
if (verifiedPeer)
|
||||||
|
this._peerJoining(peer, true);
|
||||||
// Always let ADMIN in, even if locked
|
// Always let ADMIN in, even if locked
|
||||||
if (peer.roles.includes(userRoles.ADMIN))
|
else if (peer.roles.includes(userRoles.ADMIN))
|
||||||
this._peerJoining(peer);
|
this._peerJoining(peer);
|
||||||
else if (this._locked)
|
else if (this._locked)
|
||||||
this._parkPeer(peer);
|
this._parkPeer(peer);
|
||||||
|
|
@ -332,7 +356,7 @@ class Room extends EventEmitter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async _peerJoining(peer)
|
async _peerJoining(peer, returning = false)
|
||||||
{
|
{
|
||||||
peer.socket.join(this._roomId);
|
peer.socket.join(this._roomId);
|
||||||
|
|
||||||
|
|
@ -343,45 +367,58 @@ class Room extends EventEmitter
|
||||||
|
|
||||||
this._handlePeer(peer);
|
this._handlePeer(peer);
|
||||||
|
|
||||||
let turnServers;
|
if (returning)
|
||||||
|
|
||||||
if ('turnAPIURI' in config)
|
|
||||||
{
|
{
|
||||||
try
|
this._notification(peer.socket, 'roomBack');
|
||||||
{
|
|
||||||
const { data } = await axios.get(
|
|
||||||
config.turnAPIURI,
|
|
||||||
{
|
|
||||||
params : {
|
|
||||||
'uri_schema' : 'turn',
|
|
||||||
'transport' : 'tcp',
|
|
||||||
'ip_ver' : 'ipv4',
|
|
||||||
'servercount' : '2',
|
|
||||||
'api_key' : config.turnAPIKey,
|
|
||||||
'ip' : peer.socket.request.connection.remoteAddress
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
turnServers = [ {
|
|
||||||
urls : data.uris,
|
|
||||||
username : data.username,
|
|
||||||
credential : data.password
|
|
||||||
} ];
|
|
||||||
}
|
|
||||||
catch (error)
|
|
||||||
{
|
|
||||||
if ('backupTurnServers' in config)
|
|
||||||
turnServers = config.backupTurnServers;
|
|
||||||
|
|
||||||
logger.error('_peerJoining() | error on REST turn [error:"%o"]', error);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if ('backupTurnServers' in config)
|
else
|
||||||
{
|
{
|
||||||
turnServers = config.backupTurnServers;
|
const token = jwt.sign({ id: peer.id }, this._uuid, { noTimestamp: true });
|
||||||
}
|
|
||||||
|
|
||||||
this._notification(peer.socket, 'roomReady', { turnServers });
|
peer.socket.handshake.session.token = token;
|
||||||
|
|
||||||
|
peer.socket.handshake.session.save();
|
||||||
|
|
||||||
|
let turnServers;
|
||||||
|
|
||||||
|
if ('turnAPIURI' in config)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const { data } = await axios.get(
|
||||||
|
config.turnAPIURI,
|
||||||
|
{
|
||||||
|
params : {
|
||||||
|
'uri_schema' : 'turn',
|
||||||
|
'transport' : 'tcp',
|
||||||
|
'ip_ver' : 'ipv4',
|
||||||
|
'servercount' : '2',
|
||||||
|
'api_key' : config.turnAPIKey,
|
||||||
|
'ip' : peer.socket.request.connection.remoteAddress
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
turnServers = [ {
|
||||||
|
urls : data.uris,
|
||||||
|
username : data.username,
|
||||||
|
credential : data.password
|
||||||
|
} ];
|
||||||
|
}
|
||||||
|
catch (error)
|
||||||
|
{
|
||||||
|
if ('backupTurnServers' in config)
|
||||||
|
turnServers = config.backupTurnServers;
|
||||||
|
|
||||||
|
logger.error('_peerJoining() | error on REST turn [error:"%o"]', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ('backupTurnServers' in config)
|
||||||
|
{
|
||||||
|
turnServers = config.backupTurnServers;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._notification(peer.socket, 'roomReady', { turnServers });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_handlePeer(peer)
|
_handlePeer(peer)
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@
|
||||||
"express-socket.io-session": "^1.3.5",
|
"express-socket.io-session": "^1.3.5",
|
||||||
"helmet": "^3.21.2",
|
"helmet": "^3.21.2",
|
||||||
"ims-lti": "^3.0.2",
|
"ims-lti": "^3.0.2",
|
||||||
|
"jsonwebtoken": "^8.5.1",
|
||||||
"mediasoup": "^3.5.5",
|
"mediasoup": "^3.5.5",
|
||||||
"openid-client": "^3.7.3",
|
"openid-client": "^3.7.3",
|
||||||
"passport": "^0.4.0",
|
"passport": "^0.4.0",
|
||||||
|
|
@ -32,6 +33,7 @@
|
||||||
"pidusage": "^2.0.17",
|
"pidusage": "^2.0.17",
|
||||||
"redis": "^2.8.0",
|
"redis": "^2.8.0",
|
||||||
"socket.io": "^2.3.0",
|
"socket.io": "^2.3.0",
|
||||||
"spdy": "^4.0.1"
|
"spdy": "^4.0.1",
|
||||||
|
"uuid": "^7.0.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -467,6 +467,8 @@ async function runWebSocketServer()
|
||||||
const room = await getOrCreateRoom({ roomId });
|
const room = await getOrCreateRoom({ roomId });
|
||||||
const peer = new Peer({ id: peerId, roomId, socket });
|
const peer = new Peer({ id: peerId, roomId, socket });
|
||||||
|
|
||||||
|
const { token } = socket.handshake.session;
|
||||||
|
|
||||||
peers.set(peerId, peer);
|
peers.set(peerId, peer);
|
||||||
|
|
||||||
peer.on('close', () => peers.delete(peerId));
|
peer.on('close', () => peers.delete(peerId));
|
||||||
|
|
@ -495,7 +497,7 @@ async function runWebSocketServer()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
room.handlePeer(peer);
|
room.handlePeer({ peer, token });
|
||||||
})
|
})
|
||||||
.catch((error) =>
|
.catch((error) =>
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue