diff --git a/openvidu-browser/src/OpenVidu/Session.ts b/openvidu-browser/src/OpenVidu/Session.ts index d31c4cff..be678ba5 100644 --- a/openvidu-browser/src/OpenVidu/Session.ts +++ b/openvidu-browser/src/OpenVidu/Session.ts @@ -1323,12 +1323,12 @@ export class Session extends EventDispatcher { reject(error); } else { - // Configure JSNLogs - OpenViduLogger.configureJSNLog(this.openvidu, this.sessionId, response.id, token); - // Process join room response this.processJoinRoomResponse(response); + // Configure JSNLogs + OpenViduLogger.configureJSNLog(this.openvidu, token); + // Initialize local Connection object with values returned by openvidu-server this.connection = new Connection(this, response); diff --git a/openvidu-browser/src/OpenViduInternal/Logger/OpenViduLogger.ts b/openvidu-browser/src/OpenViduInternal/Logger/OpenViduLogger.ts index d384c7f9..5f25c024 100644 --- a/openvidu-browser/src/OpenViduInternal/Logger/OpenViduLogger.ts +++ b/openvidu-browser/src/OpenViduInternal/Logger/OpenViduLogger.ts @@ -12,29 +12,36 @@ export class OpenViduLogger { private MAX_MSECONDS_BATCH_MESSAGES: number = 5000; private logger: Console = window.console; - private loggingSessionId: string; private LOG_FNS = [this.logger.log, this.logger.debug, this.logger.info, this.logger.warn, this.logger.error]; private currentAppender: any; private isProdMode = false; private isJSNLogSetup = false; + // This two variables are used to restart JSNLog + // on different sessions and different userIds + private loggingSessionId: string | undefined; + private loggingFinalUserId: string | undefined; + private constructor() {} - static configureJSNLog(openVidu: OpenVidu, sessionId: string, connectionId: string, token: string) { + static configureJSNLog(openVidu: OpenVidu, token: string) { // If instance is created is OpenVidu Pro if (this.instance && openVidu.webrtcStatsInterval > -1 // If logs are enabled && openVidu.sendBrowserLogs === OpenViduLoggerConfiguration.debug - // If diferent session or first session - && sessionId !== this.instance.loggingSessionId) { + // Only reconfigure it if session or finalUserId has changed + && this.instance.canConfigureJSNLog(openVidu, this.instance)) { try { // isJSNLogSetup will not be true until completed setup this.instance.isJSNLogSetup = false; this.instance.info("Configuring JSNLogs."); + const finalUserId = openVidu.finalUserId; + const sessionId = openVidu.session.sessionId; + const beforeSendCallback = (xhr) => { // If 401 or 403 or 404 modify ready and status so JSNLog don't retry to send logs // https://github.com/mperdeck/jsnlog.js/blob/v2.30.0/jsnlog.ts#L805-L818 @@ -48,16 +55,16 @@ export class OpenViduLogger { } // Headers to identify and authenticate logs - xhr.setRequestHeader('Authorization', "Basic " + btoa(`${connectionId}%/%${sessionId}` + ":" + token)); + xhr.setRequestHeader('Authorization', "Basic " + btoa(`${finalUserId}%/%${sessionId}` + ":" + token)); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest') // Additional headers for OpenVidu - xhr.setRequestHeader('OV-Connection-Id', connectionId); + xhr.setRequestHeader('OV-Final-User-Id', finalUserId); xhr.setRequestHeader('OV-Session-Id', sessionId); xhr.setRequestHeader('OV-Token', token); } // Creation of the appender. - this.instance.currentAppender = JL.createAjaxAppender("appender-" + connectionId); + this.instance.currentAppender = JL.createAjaxAppender(`appender-${finalUserId}-${sessionId}`); this.instance.currentAppender.setOptions({ beforeSend: beforeSendCallback, maxBatchSize: 1000, @@ -70,7 +77,7 @@ export class OpenViduLogger { const getCircularReplacer = () => { const seen = new WeakSet(); return (key, value) => { - if (typeof value === "object" && value !== null) { + if (typeof value === "object" && value != null) { if (seen.has(value)) { return; } @@ -93,11 +100,15 @@ export class OpenViduLogger { this.instance.isJSNLogSetup = true; this.instance.loggingSessionId = sessionId; + this.instance.loggingFinalUserId = finalUserId; this.instance.info("JSNLog configured."); } catch (e) { console.error("Error configuring JSNLog: "); console.error(e); this.instance.isJSNLogSetup = false; + this.instance.loggingSessionId = undefined; + this.instance.loggingFinalUserId = undefined; + this.instance.currentAppender = undefined; } } } @@ -166,4 +177,8 @@ export class OpenViduLogger { return this.isJSNLogSetup; } + private canConfigureJSNLog(openVidu: OpenVidu, logger: OpenViduLogger): boolean { + return openVidu.session.sessionId != logger.loggingSessionId || openVidu.finalUserId != logger.loggingFinalUserId + } + } diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/TokenRegister.java b/openvidu-server/src/main/java/io/openvidu/server/core/TokenRegister.java index ad2164b5..1aaf94df 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/TokenRegister.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/TokenRegister.java @@ -50,11 +50,11 @@ public class TokenRegister { * O(1) * Check if the current token string was registered in an active session * @param token Token string to check if it is registered - * @param connectionId Id of the connection to check + * @param finalUserId userId of browser to check * @param sessionId Id of session to check * @return true if token was registered. false otherwise */ - public boolean isTokenRegistered(String token, String connectionId, String sessionId) { + public boolean isTokenRegistered(String token, String finalUserId, String sessionId) { if (!this.tokensRegistered.containsKey(token)) { // False because token is not registered return false; @@ -77,23 +77,9 @@ public class TokenRegister { // In this final state, if connectionId is equal to participant public id and session Id is the same, // the token is registered correctly in the specific connectionId and sessionId - return participantsByTokens.get(token).getParticipantPublicId().equals(connectionId) + return participantsByTokens.get(token).getFinalUserId().equals(finalUserId) && participantsByTokens.get(token).getSessionId().equals(sessionId); } - /** - * O(1) - * Get registered token from token string - * @param tokenKey string key which represents the token - * @return - */ - public Token getRegisteredToken(String tokenKey) { - Token token = this.tokensRegistered.get(tokenKey); - if (token != null) { - return token; - } - return null; - } - }