From 19d6e32229e90f10441d24483d7b4ec7439a1fc5 Mon Sep 17 00:00:00 2001
From: Pedro Beschorner Marin <pedrobmarin@gmail.com>
Date: Fri, 23 Apr 2021 18:37:52 -0300
Subject: [PATCH] chore(connection status): log status change at the server

Includes a log at Meteor's addConnectionStatus method to log danger,
critical and recoveries triggers on user's connection status change.
---
 .../server/methods/addConnectionStatus.js     | 43 +++++++++++++++++--
 .../components/connection-status/service.js   | 26 +++++------
 2 files changed, 53 insertions(+), 16 deletions(-)

diff --git a/bigbluebutton-html5/imports/api/connection-status/server/methods/addConnectionStatus.js b/bigbluebutton-html5/imports/api/connection-status/server/methods/addConnectionStatus.js
index 9e58b49f7f..8f3763cf80 100644
--- a/bigbluebutton-html5/imports/api/connection-status/server/methods/addConnectionStatus.js
+++ b/bigbluebutton-html5/imports/api/connection-status/server/methods/addConnectionStatus.js
@@ -1,14 +1,51 @@
 import { check } from 'meteor/check';
+import Logger from '/imports/startup/server/logger';
 import updateConnectionStatus from '/imports/api/connection-status/server/modifiers/updateConnectionStatus';
 import { extractCredentials } from '/imports/api/common/server/helpers';
 
-export default function addConnectionStatus(level) {
-  check(level, String);
+const logConnectionStatus = (meetingId, userId, status, type, value) => {
+  switch (status) {
+    case 'normal':
+      Logger.info(`Connection status updated: meetingId=${meetingId} userId=${userId} type=${type}`);
+      break;
+    case 'warning':
+      // Skip
+      break;
+    case 'danger':
+    case 'critical':
+      switch (type) {
+        case 'audio':
+          const {
+            jitter,
+            loss,
+          } = value;
+          Logger.info(`Connection status updated: meetingId=${meetingId} userId=${userId} jitter=${jitter} loss=${loss}`);
+          break;
+        case 'socket':
+          const { rtt } = value;
+          Logger.info(`Connection status updated: meetingId=${meetingId} userId=${userId} rtt=${rtt}`);
+          break;
+        default:
+      }
+      break;
+    default:
+  }
+};
+
+export default function addConnectionStatus(status, type, value) {
+  check(status, String);
+  check(type, String);
+  check(value, Object);
 
   const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
   check(meetingId, String);
   check(requesterUserId, String);
 
-  updateConnectionStatus(meetingId, requesterUserId, level);
+  logConnectionStatus(meetingId, requesterUserId, status, type, value);
+
+  // Avoid storing recoveries
+  if (status !== 'normal') {
+    updateConnectionStatus(meetingId, requesterUserId, status);
+  }
 }
diff --git a/bigbluebutton-html5/imports/ui/components/connection-status/service.js b/bigbluebutton-html5/imports/ui/components/connection-status/service.js
index 4345a61adf..7f76175205 100644
--- a/bigbluebutton-html5/imports/ui/components/connection-status/service.js
+++ b/bigbluebutton-html5/imports/ui/components/connection-status/service.js
@@ -50,17 +50,17 @@ const getStats = () => {
   return STATS.level[stats];
 };
 
-const setStats = (level = -1) => {
+const setStats = (level = -1, type = 'recovery', value = {}) => {
   if (stats !== level) {
     stats = level;
     statsDep.changed();
-    addConnectionStatus(level);
+    addConnectionStatus(level, type, value);
   }
 };
 
-const handleStats = (level) => {
+const handleStats = (level, type, value) => {
   if (level > stats) {
-    setStats(level);
+    setStats(level, type, value);
   }
 };
 
@@ -71,9 +71,9 @@ const handleAudioStatsEvent = (event) => {
     let active = false;
     // From higher to lower
     for (let i = STATS.level.length - 1; i >= 0; i--) {
-      if (loss > STATS.loss[i] || jitter > STATS.jitter[i]) {
+      if (loss >= STATS.loss[i] || jitter >= STATS.jitter[i]) {
         active = true;
-        handleStats(i);
+        handleStats(i, 'audio', { loss, jitter });
         break;
       }
     }
@@ -89,9 +89,9 @@ const handleSocketStatsEvent = (event) => {
     let active = false;
     // From higher to lower
     for (let i = STATS.level.length - 1; i >= 0; i--) {
-      if (rtt > STATS.rtt[i]) {
+      if (rtt >= STATS.rtt[i]) {
         active = true;
-        handleStats(i);
+        handleStats(i, 'socket', { rtt });
         break;
       }
     }
@@ -108,9 +108,11 @@ const startStatsTimeout = () => {
   }, STATS.timeout);
 };
 
-const addConnectionStatus = (level) => {
-  if (level !== -1) makeCall('addConnectionStatus', STATS.level[level]);
-};
+const addConnectionStatus = (level, type, value) => {
+  const status = level !== -1 ? STATS.level[level] : 'normal';
+
+  makeCall('addConnectionStatus', status, type, value);
+}
 
 const fetchRoundTripTime = () => {
   const t0 = Date.now();
@@ -323,11 +325,9 @@ const notification = (level, intl) => {
 };
 
 export default {
-  addConnectionStatus,
   getConnectionStatus,
   getStats,
   getHelp,
-  getLevel,
   isEnabled,
   notification,
   startRoundTripTime,
-- 
GitLab