openvidu-browser: OpenVidu.life logic

pull/651/head
pabloFuente 2021-09-10 14:41:30 +02:00
parent 91d24ccd42
commit 8eae2e0eab
4 changed files with 43 additions and 3 deletions

View File

@ -109,6 +109,10 @@ export class OpenVidu {
* @hidden
*/
mediaServer: string;
/**
* @hidden
*/
life: number = -1;
/**
* @hidden
*/
@ -1029,15 +1033,43 @@ export class OpenVidu {
logger.warn('Websocket reconnected');
if (this.isRoomAvailable()) {
if (!!this.session.connection) {
// This RPC method allows checking if the WebSocket reconnected to a session where
// the user is still a participant, or the session evicted the user
this.sendRequest('connect', { sessionId: this.session.connection.rpcSessionId }, (error, response) => {
if (!!error) {
if (this.isMasterNodeCrashed()) {
logger.warn('Master Node has crashed!');
} else {
logger.error(error);
logger.warn('Websocket was able to reconnect to OpenVidu Server, but your Connection was already destroyed due to timeout. You are no longer a participant of the Session and your media streams have been destroyed');
this.session.onLostConnection("networkDisconnect");
this.jsonRpcClient.close(4101, "Reconnection fault");
const notifyNetworkDisconnection = (error) => {
logger.warn('Websocket was able to reconnect to OpenVidu Server, but your Connection was already destroyed due to timeout. You are no longer a participant of the Session and your media streams have been destroyed');
this.session.onLostConnection("networkDisconnect");
this.jsonRpcClient.close(4101, "Reconnection fault");
}
if (this.life === -1) {
notifyNetworkDisconnection(error);
} else {
// This RPC method is only required to find out the reason of the disconnection:
// whether the client lost its network connection or a Master Node crashed
this.sendRequest('sessionStatus', { sessionId: this.session.sessionId }, (error, response) => {
if (this.life === response.life) {
// If the life stored in the client matches the life stored in the server, it means that the client lost its network connection
notifyNetworkDisconnection(error);
} else {
// If the life stored in the client is below the life stored in the server, it means that the Master Node has crashed
logger.warn('Websocket was able to reconnect to OpenVidu Server, but your Master Node crashed.');
this.session.onLostConnection("nodeCrashed");
this.jsonRpcClient.close(4101, "Reconnection fault");
}
});
}
}
} else {
this.jsonRpcClient.resetPing();

View File

@ -1544,6 +1544,9 @@ export class Session extends EventDispatcher {
forceDisconnect: this.openvidu.role === 'MODERATOR'
};
logger.info("openvidu-server version: " + opts.version);
if (opts.life != null) {
this.openvidu.life = opts.life;
}
if (opts.version !== this.openvidu.libraryVersion) {
logger.warn('OpenVidu Server (' + opts.version +
') and OpenVidu Browser (' + this.openvidu.libraryVersion +

View File

@ -32,4 +32,5 @@ export interface LocalConnectionOptions {
turnCredential: string;
version: string;
mediaServer: string;
life: number;
}

View File

@ -136,6 +136,10 @@ function WebSocketWithReconnection(config) {
ws.close();
};
this.forceClose = () => {
ws.close();
};
this.reconnectWs = () => {
Logger.debug("reconnectWs");
reconnect(MAX_RETRIES, 1);