From 6ab25f7bc0b86f55aaee716fb31b3c8c2ea3880c Mon Sep 17 00:00:00 2001 From: bgrozev Date: Tue, 28 Nov 2023 09:28:05 -0600 Subject: [PATCH] Remove callstats (#14076) * ref: Remove precall test. * ref: Remove callstats. * Remove the dependency on react-native-callstats. --- conference.js | 15 +- config.js | 46 +------ package-lock.json | 42 ------ package.json | 1 - react-native-sdk/package.json | 1 - react/features/base/conference/functions.ts | 2 - react/features/base/conference/reducer.ts | 1 - react/features/base/config/configType.ts | 22 --- react/features/base/config/configWhitelist.ts | 4 - .../features/base/config/functions.native.ts | 2 - react/features/base/jwt/constants.ts | 1 - .../base/logging/JitsiMeetLogStorage.ts | 53 +------- react/features/base/logging/actionTypes.ts | 2 +- react/features/base/logging/actions.ts | 3 +- react/features/base/logging/middleware.ts | 2 +- react/features/base/logging/reducer.ts | 3 +- .../components/web/ConnectionStatus.tsx | 5 +- react/features/base/premeeting/functions.ts | 128 +----------------- react/features/feedback/actions.web.ts | 7 +- .../feedback/components/FeedbackButton.web.ts | 2 +- react/features/mobile/polyfills/browser.js | 7 - .../web/AbstractPageReloadOverlay.tsx | 3 - react/features/prejoin/actionTypes.ts | 5 - react/features/prejoin/actions.web.ts | 33 ----- .../prejoin/components/web/PrejoinApp.tsx | 4 +- react/features/prejoin/reducer.ts | 12 -- 26 files changed, 18 insertions(+), 388 deletions(-) diff --git a/conference.js b/conference.js index b3f6bfa74b..627fc0bf03 100644 --- a/conference.js +++ b/conference.js @@ -154,7 +154,7 @@ import { import { isModerationNotificationDisplayed } from './react/features/notifications/functions'; import { mediaPermissionPromptVisibilityChanged } from './react/features/overlay/actions'; import { suspendDetected } from './react/features/power-monitor/actions'; -import { initPrejoin, makePrecallTest } from './react/features/prejoin/actions'; +import { initPrejoin } from './react/features/prejoin/actions'; import { isPrejoinPageVisible } from './react/features/prejoin/functions'; import { disableReceiver, stopReceiver } from './react/features/remote-control/actions'; import { setScreenAudioShareState } from './react/features/screen-share/actions.web'; @@ -718,8 +718,6 @@ export default { }; if (isPrejoinPageVisible(state)) { - APP.store.dispatch(makePrecallTest(this._getConferenceOptions())); - const { tryCreateLocalTracks, errors } = this.createInitialLocalTracks(initialOptions); const localTracks = await tryCreateLocalTracks; @@ -1039,17 +1037,6 @@ export default { .filter(p => !p.isHidden() || !(config.iAmRecorder && p.isHiddenFromRecorder())).length + 1; }, - /** - * Returns true if the callstats integration is enabled, otherwise returns - * false. - * - * @returns true if the callstats integration is enabled, otherwise returns - * false. - */ - isCallstatsEnabled() { - return room && room.isCallstatsEnabled(); - }, - /** * Get speaker stats that track total dominant speaker time. * diff --git a/config.js b/config.js index 486dfe7fec..bc408ce37d 100644 --- a/config.js +++ b/config.js @@ -97,11 +97,6 @@ var config = { // Disables the auto-play behavior of *all* newly created video element. // This is useful when the client runs on a host with limited resources. // noAutoPlayVideo: false, - - // Enable callstats only for a percentage of users. - // This takes a value between 0 and 100 which determines the probability for - // the callstats to be enabled. - // callStatsThreshold: 5, // enable callstats for 5% of the users. }, // Disables moderator indicators. @@ -943,38 +938,10 @@ var config = { // The interval at which PeerConnection.getStats() is called. Defaults to 10000 // pcStatsInterval: 10000, - // To enable sending statistics to callstats.io you must provide the - // Application ID and Secret. - // callStatsID: '', - // callStatsSecret: '', - // callStatsApplicationLogsDisabled: false, - - // The callstats initialize config params as described in the API: - // https://docs.callstats.io/docs/javascript#callstatsinitialize-with-app-secret - // callStatsConfigParams: { - // disableBeforeUnloadHandler: true, // disables callstats.js's window.onbeforeunload parameter. - // applicationVersion: "app_version", // Application version specified by the developer. - // disablePrecalltest: true, // disables the pre-call test, it is enabled by default. - // siteID: "siteID", // The name/ID of the site/campus from where the call/pre-call test is made. - // additionalIDs: { // additionalIDs object, contains application related IDs. - // customerID: "Customer Identifier. Example, walmart.", - // tenantID: "Tenant Identifier. Example, monster.", - // productName: "Product Name. Example, Jitsi.", - // meetingsName: "Meeting Name. Example, Jitsi loves callstats.", - // serverName: "Server/MiddleBox Name. Example, jvb-prod-us-east-mlkncws12.", - // pbxID: "PBX Identifier. Example, walmart.", - // pbxExtensionID: "PBX Extension Identifier. Example, 5625.", - // fqExtensionID: "Fully qualified Extension Identifier. Example, +71 (US) +5625.", - // sessionID: "Session Identifier. Example, session-12-34", - // }, - // collectLegacyStats: true, //enables the collection of legacy stats in chrome browser - // collectIP: true, //enables the collection localIP address - // }, - - // Enables sending participants' display names to callstats + // Enables sending participants' display names to stats // enableDisplayNameInStats: false, - // Enables sending participants' emails (if available) to callstats and other analytics + // Enables sending participants' emails (if available) to stats and other analytics // enableEmailInStats: false, // faceLandmarks: { @@ -997,7 +964,7 @@ var config = { // captureInterval: 1000, // }, - // Controls the percentage of automatic feedback shown to participants when callstats is enabled. + // Controls the percentage of automatic feedback shown to participants. // The default value is 100%. If set to 0, no automatic feedback will be requested // feedbackPercentage: 100, @@ -1005,7 +972,7 @@ var config = { // // If third party requests are disabled, no other server will be contacted. - // This means avatars will be locally generated and callstats integration + // This means avatars will be locally generated and external stats integration // will not function. // disableThirdPartyRequests: false, @@ -1556,8 +1523,6 @@ var config = { _peerConnStatusOutOfLastNTimeout _peerConnStatusRtcMuteTimeout avgRtpStatsN - callStatsConfIDNamespace - callStatsCustomScriptUrl desktopSharingSources disableAEC disableAGC @@ -1731,13 +1696,12 @@ var config = { // logging: { // // Default log level for the app and lib-jitsi-meet. // defaultLogLevel: 'trace', - // // Option to disable LogCollector (which stores the logs on CallStats). + // // Option to disable LogCollector. // //disableLogCollector: true, // // Individual loggers are customizable. // loggers: { // // The following are too verbose in their logging with the default level. // 'modules/RTC/TraceablePeerConnection.js': 'info', - // 'modules/statistics/CallStats.js': 'info', // 'modules/xmpp/strophe.util.js': 'log', // }, diff --git a/package-lock.json b/package-lock.json index ac0a690291..727ca5ecfa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -77,7 +77,6 @@ "react-native": "0.69.12", "react-native-background-timer": "2.4.1", "react-native-calendar-events": "2.2.0", - "react-native-callstats": "3.73.22", "react-native-default-preference": "1.4.4", "react-native-device-info": "10.9.0", "react-native-dialog": "https://github.com/jitsi/react-native-dialog/releases/download/v9.2.2-jitsi.1/react-native-dialog-9.2.2.tgz", @@ -7285,11 +7284,6 @@ "node": ">=0.10.0" } }, - "node_modules/base-64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", - "integrity": "sha1-eAqZyE59YAJgNhURxId2E78k9rs=" - }, "node_modules/base/node_modules/define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", @@ -12488,14 +12482,6 @@ "jss": "10.10.0" } }, - "node_modules/jssha": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jssha/-/jssha-3.2.0.tgz", - "integrity": "sha512-QuruyBENDWdN4tZwJbQq7/eAK85FqrI4oDbXjy5IBhYD+2pTJyBUWZe8ctWaCkrV0gy6AaelgOZZBMeswEa/6Q==", - "engines": { - "node": "*" - } - }, "node_modules/jsx-ast-utils": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", @@ -15610,15 +15596,6 @@ "react-native": ">=0.60.0" } }, - "node_modules/react-native-callstats": { - "version": "3.73.22", - "resolved": "https://registry.npmjs.org/react-native-callstats/-/react-native-callstats-3.73.22.tgz", - "integrity": "sha512-1l1n9XIca8VT7Vp/xaQY8grPDmgVp++nx0cYhelOWyn4TwBrWxIOPU1Ok4ODrNiYtnsh+/Dyqq+lSSwZksr7LA==", - "dependencies": { - "base-64": "0.1.0", - "jssha": "^3.2.0" - } - }, "node_modules/react-native-codegen": { "version": "0.69.2", "resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.69.2.tgz", @@ -25381,11 +25358,6 @@ } } }, - "base-64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", - "integrity": "sha1-eAqZyE59YAJgNhURxId2E78k9rs=" - }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -29282,11 +29254,6 @@ "jss": "10.10.0" } }, - "jssha": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jssha/-/jssha-3.2.0.tgz", - "integrity": "sha512-QuruyBENDWdN4tZwJbQq7/eAK85FqrI4oDbXjy5IBhYD+2pTJyBUWZe8ctWaCkrV0gy6AaelgOZZBMeswEa/6Q==" - }, "jsx-ast-utils": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", @@ -31658,15 +31625,6 @@ "resolved": "https://registry.npmjs.org/react-native-calendar-events/-/react-native-calendar-events-2.2.0.tgz", "integrity": "sha512-tNUbhT6Ief0JM4OQzQAaz1ri0+MCcAoHptBcEXCz2g7q3A05pg62PR2Dio4F9t2fCAD7Y2+QggdY1ycAsF3Tsg==" }, - "react-native-callstats": { - "version": "3.73.22", - "resolved": "https://registry.npmjs.org/react-native-callstats/-/react-native-callstats-3.73.22.tgz", - "integrity": "sha512-1l1n9XIca8VT7Vp/xaQY8grPDmgVp++nx0cYhelOWyn4TwBrWxIOPU1Ok4ODrNiYtnsh+/Dyqq+lSSwZksr7LA==", - "requires": { - "base-64": "0.1.0", - "jssha": "^3.2.0" - } - }, "react-native-codegen": { "version": "0.69.2", "resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.69.2.tgz", diff --git a/package.json b/package.json index ac49ca4443..347fb86cc1 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,6 @@ "react-native": "0.69.12", "react-native-background-timer": "2.4.1", "react-native-calendar-events": "2.2.0", - "react-native-callstats": "3.73.22", "react-native-default-preference": "1.4.4", "react-native-device-info": "10.9.0", "react-native-dialog": "https://github.com/jitsi/react-native-dialog/releases/download/v9.2.2-jitsi.1/react-native-dialog-9.2.2.tgz", diff --git a/react-native-sdk/package.json b/react-native-sdk/package.json index a7229fb03d..cf9a5b7005 100644 --- a/react-native-sdk/package.json +++ b/react-native-sdk/package.json @@ -38,7 +38,6 @@ "react-emoji-render": "1.2.4", "react-i18next": "10.11.4", "react-linkify": "1.0.0-alpha", - "react-native-callstats": "3.73.22", "react-native-dialog": "https://github.com/jitsi/react-native-dialog/releases/download/v9.2.2-jitsi.1/react-native-dialog-9.2.2.tgz", "react-native-svg-transformer": "1.1.0", "react-native-tab-view": "3.5.2", diff --git a/react/features/base/conference/functions.ts b/react/features/base/conference/functions.ts index ed5aa826b8..49802797e7 100644 --- a/react/features/base/conference/functions.ts +++ b/react/features/base/conference/functions.ts @@ -246,8 +246,6 @@ export function getConferenceOptions(stateful: IStateful) { delete config.analytics?.scriptURLs; delete config.analytics?.amplitudeAPPKey; delete config.analytics?.googleAnalyticsTrackingId; - delete options.callStatsID; - delete options.callStatsSecret; } return options; diff --git a/react/features/base/conference/reducer.ts b/react/features/base/conference/reducer.ts index df19505471..6cbdbf1ffc 100644 --- a/react/features/base/conference/reducer.ts +++ b/react/features/base/conference/reducer.ts @@ -73,7 +73,6 @@ export interface IJitsiConference { getSsrcByTrack: Function; grantOwner: Function; isAVModerationSupported: Function; - isCallstatsEnabled: Function; isE2EEEnabled: Function; isE2EESupported: Function; isEndConferenceSupported: Function; diff --git a/react/features/base/config/configType.ts b/react/features/base/config/configType.ts index dc8ef8cd8c..7b7986ae8b 100644 --- a/react/features/base/config/configType.ts +++ b/react/features/base/config/configType.ts @@ -231,27 +231,6 @@ export interface IConfig { callDisplayName?: string; callFlowsEnabled?: boolean; callHandle?: string; - callStatsConfigParams?: { - additionalIDs?: { - customerID?: string; - fqExtensionID?: string; - meetingsName?: string; - pbxExtensionID?: string; - pbxID?: string; - productName?: string; - serverName?: string; - sessionID?: string; - tenantID?: string; - }; - applicationVersion?: string; - collectIP?: boolean; - collectLegacyStats?: boolean; - disableBeforeUnloadHandler?: boolean; - disablePrecalltest?: boolean; - siteID?: string; - }; - callStatsID?: string; - callStatsSecret?: string; callUUID?: string; cameraFacingMode?: string; channelLastN?: number; @@ -581,7 +560,6 @@ export interface IConfig { subject?: string; testing?: { assumeBandwidth?: boolean; - callStatsThreshold?: number; disableE2EE?: boolean; mobileXmppWsThreshold?: number; noAutoPlayVideo?: boolean; diff --git a/react/features/base/config/configWhitelist.ts b/react/features/base/config/configWhitelist.ts index 19935dc053..bc2c2fb2f8 100644 --- a/react/features/base/config/configWhitelist.ts +++ b/react/features/base/config/configWhitelist.ts @@ -55,10 +55,6 @@ export default [ * @type string */ 'callHandle', - 'callStatsConfIDNamespace', - 'callStatsConfigParams', - 'callStatsID', - 'callStatsSecret', /** * The UUID of the CallKit call representing the conference/meeting diff --git a/react/features/base/config/functions.native.ts b/react/features/base/config/functions.native.ts index 4e4d8e968f..b737c23ff8 100644 --- a/react/features/base/config/functions.native.ts +++ b/react/features/base/config/functions.native.ts @@ -28,8 +28,6 @@ export function _cleanupConfig(config: IConfig) { delete config.analytics?.rtcstatsUseLegacy; delete config.analytics?.obfuscateRoomName; delete config.analytics?.watchRTCEnabled; - delete config.callStatsID; - delete config.callStatsSecret; delete config.watchRTCConfigParams; config.giphy = { enabled: false }; } diff --git a/react/features/base/jwt/constants.ts b/react/features/base/jwt/constants.ts index 4c3e6fb775..12b4123997 100644 --- a/react/features/base/jwt/constants.ts +++ b/react/features/base/jwt/constants.ts @@ -4,7 +4,6 @@ export const MEET_FEATURES = { BRANDING: 'branding', CALENDAR: 'calendar', - CALLSTATS: 'callstats', FLIP: 'flip', INBOUND_CALL: 'inbound-call', LIVESTREAMING: 'livestreaming', diff --git a/react/features/base/logging/JitsiMeetLogStorage.ts b/react/features/base/logging/JitsiMeetLogStorage.ts index ad016128ba..373c8bdcd9 100644 --- a/react/features/base/logging/JitsiMeetLogStorage.ts +++ b/react/features/base/logging/JitsiMeetLogStorage.ts @@ -1,11 +1,9 @@ import { IStore } from '../../app/types'; import RTCStats from '../../rtcstats/RTCStats'; import { isRTCStatsEnabled } from '../../rtcstats/functions'; -import { getCurrentConference } from '../conference/functions'; /** - * Implements log storage interface from the @jitsi/logger lib. Captured - * logs are sent to CallStats. + * Implements log storage interface from the @jitsi/logger lib. */ export default class JitsiMeetLogStorage { counter: number; @@ -33,8 +31,7 @@ export default class JitsiMeetLogStorage { } /** - * The JitsiMeetLogStorage is ready when the CallStats are started and - * before refactoring the code it was after the conference has been joined. + * The JitsiMeetLogStorage is ready when the conference has been joined. * A conference is considered joined when the 'conference' field is defined * in the base/conference state. * @@ -73,54 +70,8 @@ export default class JitsiMeetLogStorage { */ storeLogs(logEntries: Array) { - // XXX the config.callStatsApplicationLogsDisabled controls whether or not the logs will be sent to callstats. - // this is done in LJM - this.storeLogsCallstats(logEntries); - if (this.canStoreLogsRtcstats()) { RTCStats.sendLogs(logEntries); } } - - /** - * Store the console logs in callstats (if callstats is enabled). - * - * @param {Array} logEntries - The log entries to send to the rtcstats server. - * @returns {void} - */ - storeLogsCallstats(logEntries: Array) { - const conference = getCurrentConference(this.getState()); - - if (!conference?.isCallstatsEnabled()) { - // Discard the logs if CallStats is not enabled. - return; - } - - let logMessage = `{"log${this.counter}":"\n`; - - for (let i = 0, len = logEntries.length; i < len; i++) { - const logEntry = logEntries[i]; - - if (logEntry.timestamp) { - logMessage += `${logEntry.timestamp} `; - } - if (logEntry.count > 1) { - logMessage += `(${logEntry.count}) `; - } - logMessage += `${logEntry.text}\n`; - } - logMessage += '"}'; - - this.counter += 1; - - // Try catch was used, because there are many variables - // on the way that could be uninitialized if the storeLogs - // attempt would be made very early (which is unlikely) - try { - conference.sendApplicationLog(logMessage); - } catch (error) { - // NOTE console is intentional here - console.error(`Failed to store the logs, msg length: ${logMessage.length} error:`, error); - } - } } diff --git a/react/features/base/logging/actionTypes.ts b/react/features/base/logging/actionTypes.ts index a644df9591..e53a28563b 100644 --- a/react/features/base/logging/actionTypes.ts +++ b/react/features/base/logging/actionTypes.ts @@ -1,6 +1,6 @@ /** * The type of redux action which stores the log collector that will be - * submitting the logs to CallStats. + * submitting the logs to a service * * { * type: SET_LOG_COLLECTOR, diff --git a/react/features/base/logging/actions.ts b/react/features/base/logging/actions.ts index 5cb32ee9be..24498492a1 100644 --- a/react/features/base/logging/actions.ts +++ b/react/features/base/logging/actions.ts @@ -1,8 +1,7 @@ import { SET_LOGGING_CONFIG, SET_LOG_COLLECTOR } from './actionTypes'; /** - * Stores a {@code Logger.LogCollector} instance which will be uploading logs - * to CallStats. + * Stores a {@code Logger.LogCollector} instance which will be uploading logs. * * @param {Logger.LogCollector} logCollector - The log collector instance to be * stored in the Redux state of base/logging feature. diff --git a/react/features/base/logging/middleware.ts b/react/features/base/logging/middleware.ts index af8a20ed12..40807a8019 100644 --- a/react/features/base/logging/middleware.ts +++ b/react/features/base/logging/middleware.ts @@ -106,7 +106,7 @@ function _conferenceJoined({ getState }: IStore, next: Function, action: AnyActi logCollector.flush(); // This event listener will flush the logs, before the statistics module - // (CallStats) is stopped. + // is stopped. // // NOTE The LogCollector is not stopped, because this event can be // triggered multiple times during single conference (whenever diff --git a/react/features/base/logging/reducer.ts b/react/features/base/logging/reducer.ts index 28d81f6644..b3c01b6ad5 100644 --- a/react/features/base/logging/reducer.ts +++ b/react/features/base/logging/reducer.ts @@ -10,14 +10,13 @@ const DEFAULT_LOGGING_CONFIG = { // default log level for the app and lib-jitsi-meet defaultLogLevel: 'trace' as LogLevel, - // Option to disable LogCollector (which stores the logs on CallStats) + // Option to disable LogCollector (which stores the logs) // disableLogCollector: true, loggers: { // The following are too verbose in their logging with the // {@link #defaultLogLevel}: 'modules/RTC/TraceablePeerConnection.js': 'info' as LogLevel, - 'modules/statistics/CallStats.js': 'info' as LogLevel, 'modules/xmpp/strophe.util.js': 'log' as LogLevel } }; diff --git a/react/features/base/premeeting/components/web/ConnectionStatus.tsx b/react/features/base/premeeting/components/web/ConnectionStatus.tsx index e8ee693d0c..43ec1af2d5 100644 --- a/react/features/base/premeeting/components/web/ConnectionStatus.tsx +++ b/react/features/base/premeeting/components/web/ConnectionStatus.tsx @@ -3,7 +3,6 @@ import { WithTranslation } from 'react-i18next'; import { connect } from 'react-redux'; import { makeStyles } from 'tss-react/mui'; -import { IReduxState } from '../../../../app/types'; import { translate } from '../../../i18n/functions'; import Icon from '../../../icons/components/Icon'; import { IconArrowDown, IconWifi1Bar, IconWifi2Bars, IconWifi3Bars } from '../../../icons/svg'; @@ -217,8 +216,8 @@ function ConnectionStatus({ connectionDetails, t, connectionType }: IProps) { * @param {Object} state - The redux state. * @returns {Object} */ -function mapStateToProps(state: IReduxState) { - const { connectionDetails, connectionType } = getConnectionData(state); +function mapStateToProps() { + const { connectionDetails, connectionType } = getConnectionData(); return { connectionDetails, diff --git a/react/features/base/premeeting/functions.ts b/react/features/base/premeeting/functions.ts index 613de0c85d..745ededd4d 100644 --- a/react/features/base/premeeting/functions.ts +++ b/react/features/base/premeeting/functions.ts @@ -1,14 +1,5 @@ -import { findIndex } from 'lodash'; - -import { IReduxState } from '../../app/types'; - import { CONNECTION_TYPE } from './constants'; -const LOSS_AUDIO_THRESHOLDS = [ 0.33, 0.05 ]; -const LOSS_VIDEO_THRESHOLDS = [ 0.33, 0.1, 0.05 ]; - -const THROUGHPUT_AUDIO_THRESHOLDS = [ 8, 20 ]; -const THROUGHPUT_VIDEO_THRESHOLDS = [ 60, 750 ]; /** * The avatar size to container size ration. @@ -79,132 +70,15 @@ export function calculateAvatarDimensions(height: number) { }; } -/** - * Returns the level based on a list of thresholds. - * - * @param {number[]} thresholds - The thresholds array. - * @param {number} value - The value against which the level is calculated. - * @param {boolean} descending - The order based on which the level is calculated. - * - * @returns {number} - */ -function _getLevel(thresholds: number[], value: number, descending = true) { - let predicate; - - if (descending) { - predicate = function(threshold: number) { - return value > threshold; - }; - } else { - predicate = function(threshold: number) { - return value < threshold; - }; - } - - const i = findIndex(thresholds, predicate); - - if (i === -1) { - return thresholds.length; - } - - return i; -} - -/** - * Returns the connection details from the test results. - * - * @param {number} testResults.fractionalLoss - Factional loss. - * @param {number} testResults.throughput - Throughput. - * - * @returns {{ - * connectionType: string, - * connectionDetails: string[] - * }} - */ -function _getConnectionDataFromTestResults({ fractionalLoss: l, throughput: t }: - { fractionalLoss: number; throughput: number; }) { - const loss = { - audioQuality: _getLevel(LOSS_AUDIO_THRESHOLDS, l), - videoQuality: _getLevel(LOSS_VIDEO_THRESHOLDS, l) - }; - const throughput = { - audioQuality: _getLevel(THROUGHPUT_AUDIO_THRESHOLDS, t, false), - videoQuality: _getLevel(THROUGHPUT_VIDEO_THRESHOLDS, t, false) - }; - let connectionType = CONNECTION_TYPE.NONE; - const connectionDetails = []; - - if (throughput.audioQuality === 0 || loss.audioQuality === 0) { - // Calls are impossible. - connectionType = CONNECTION_TYPE.POOR; - connectionDetails.push('prejoin.connectionDetails.veryPoorConnection'); - } else if ( - throughput.audioQuality === 2 - && throughput.videoQuality === 2 - && loss.audioQuality === 2 - && loss.videoQuality === 3 - ) { - // Ideal conditions for both audio and video. Show only one message. - connectionType = CONNECTION_TYPE.GOOD; - connectionDetails.push('prejoin.connectionDetails.goodQuality'); - } else { - connectionType = CONNECTION_TYPE.NON_OPTIMAL; - - if (throughput.audioQuality === 1) { - // Minimum requirements for a call are met. - connectionDetails.push('prejoin.connectionDetails.audioLowNoVideo'); - } else { - // There are two paragraphs: one saying something about audio and the other about video. - if (loss.audioQuality === 1) { - connectionDetails.push('prejoin.connectionDetails.audioClipping'); - } else { - connectionDetails.push('prejoin.connectionDetails.audioHighQuality'); - } - - if (throughput.videoQuality === 0 || loss.videoQuality === 0) { - connectionDetails.push('prejoin.connectionDetails.noVideo'); - } else if (throughput.videoQuality === 1) { - connectionDetails.push('prejoin.connectionDetails.videoLowQuality'); - } else if (loss.videoQuality === 1) { - connectionDetails.push('prejoin.connectionDetails.videoFreezing'); - } else if (loss.videoQuality === 2) { - connectionDetails.push('prejoin.connectionDetails.videoTearing'); - } else { - connectionDetails.push('prejoin.connectionDetails.videoHighQuality'); - } - } - connectionDetails.push('prejoin.connectionDetails.undetectable'); - } - - return { - connectionType, - connectionDetails - }; -} - /** * Selector for determining the connection type & details. * - * @param {Object} state - The state of the app. * @returns {{ * connectionType: string, * connectionDetails: string[] * }} */ -export function getConnectionData(state: IReduxState) { - const { precallTestResults } = state['features/prejoin']; - - if (precallTestResults) { - if (precallTestResults.mediaConnectivity) { - return _getConnectionDataFromTestResults(precallTestResults); - } - - return { - connectionType: CONNECTION_TYPE.POOR, - connectionDetails: [ 'prejoin.connectionDetails.noMediaConnectivity' ] - }; - } - +export function getConnectionData() { return { connectionType: CONNECTION_TYPE.NONE, connectionDetails: [] diff --git a/react/features/feedback/actions.web.ts b/react/features/feedback/actions.web.ts index 1887ce7123..a49fc885d4 100644 --- a/react/features/feedback/actions.web.ts +++ b/react/features/feedback/actions.web.ts @@ -71,8 +71,7 @@ export function maybeOpenFeedbackDialog(conference: IJitsiConference, title?: st showThankYou: true, wasDialogShown: false }); - } else if ( - (conference.isCallstatsEnabled() || shouldSendJaaSFeedbackMetadata(state)) + } else if (shouldSendJaaSFeedbackMetadata(state) && feedbackPercentage > Math.random() * 100) { return new Promise(resolve => { dispatch(openFeedbackDialog(conference, title, () => { @@ -168,10 +167,6 @@ export function submitFeedback( const state = getState(); const promises = []; - if (conference.isCallstatsEnabled()) { - promises.push(conference.sendFeedback(score, message)); - } - if (shouldSendJaaSFeedbackMetadata(state)) { promises.push(dispatch(sendJaasFeedbackMetadata(conference, { score, diff --git a/react/features/feedback/components/FeedbackButton.web.ts b/react/features/feedback/components/FeedbackButton.web.ts index 3db48d527d..56d9998cd6 100644 --- a/react/features/feedback/components/FeedbackButton.web.ts +++ b/react/features/feedback/components/FeedbackButton.web.ts @@ -50,7 +50,7 @@ const mapStateToProps = (state: IReduxState) => { return { _conference: conference, - visible: conference?.isCallstatsEnabled() || shouldSendJaaSFeedbackMetadata(state) + visible: shouldSendJaaSFeedbackMetadata(state) }; }; diff --git a/react/features/mobile/polyfills/browser.js b/react/features/mobile/polyfills/browser.js index 879765442f..206f57f990 100644 --- a/react/features/mobile/polyfills/browser.js +++ b/react/features/mobile/polyfills/browser.js @@ -288,13 +288,6 @@ function _visitNode(node, callback) { global.performance.now = performanceNow; global.PerformanceObserver = perf.PerformanceObserver; - // CallStats - // - // Required by: - // - lib-jitsi-meet - require('react-native-callstats/csio-polyfill'); - global.callstats = require('react-native-callstats/callstats'); - // Timers // // React Native's timers won't run while the app is in the background, this diff --git a/react/features/overlay/components/web/AbstractPageReloadOverlay.tsx b/react/features/overlay/components/web/AbstractPageReloadOverlay.tsx index 82fc74d547..c14b790bf0 100644 --- a/react/features/overlay/components/web/AbstractPageReloadOverlay.tsx +++ b/react/features/overlay/components/web/AbstractPageReloadOverlay.tsx @@ -152,9 +152,6 @@ export default class AbstractPageReloadOverlay

* @returns {void} */ componentDidMount() { - // FIXME (CallStats - issue) This event will not make it to CallStats - // because the log queue is not flushed before "fabric terminated" is - // sent to the backed. // FIXME: We should dispatch action for this. if (typeof APP !== 'undefined' && APP.conference?._room) { APP.conference._room.sendApplicationLog(JSON.stringify({ diff --git a/react/features/prejoin/actionTypes.ts b/react/features/prejoin/actionTypes.ts index 97c6e07642..0ade306e85 100644 --- a/react/features/prejoin/actionTypes.ts +++ b/react/features/prejoin/actionTypes.ts @@ -39,11 +39,6 @@ export const SET_DIALOUT_STATUS = 'SET_DIALOUT_STATUS'; */ export const SET_JOIN_BY_PHONE_DIALOG_VISIBLITY = 'SET_JOIN_BY_PHONE_DIALOG_VISIBLITY'; -/** - * Action type to set the precall test data. - */ -export const SET_PRECALL_TEST_RESULTS = 'SET_PRECALL_TEST_RESULTS'; - /** * Action type to disable the audio while on prejoin page. */ diff --git a/react/features/prejoin/actions.web.ts b/react/features/prejoin/actions.web.ts index 517ac67f21..21e1266bd0 100644 --- a/react/features/prejoin/actions.web.ts +++ b/react/features/prejoin/actions.web.ts @@ -30,7 +30,6 @@ import { SET_DIALOUT_NUMBER, SET_DIALOUT_STATUS, SET_JOIN_BY_PHONE_DIALOG_VISIBLITY, - SET_PRECALL_TEST_RESULTS, SET_PREJOIN_DEVICE_ERRORS, SET_PREJOIN_PAGE_VISIBILITY, SET_SKIP_PREJOIN_RELOAD @@ -313,25 +312,6 @@ export function joinConferenceWithoutAudio() { }; } -/** - * Initializes the 'precallTest' and executes one test, storing the results. - * - * @param {Object} conferenceOptions - The conference options. - * @returns {Function} - */ -export function makePrecallTest(conferenceOptions: Object) { - return async function(dispatch: IStore['dispatch']) { - try { - await JitsiMeetJS.precallTest.init(conferenceOptions); - const results = await JitsiMeetJS.precallTest.execute(); - - dispatch(setPrecallTestResults(results)); - } catch (error) { - logger.debug('Failed to execute pre call test - ', error); - } - }; -} - /** * Opens an external page with all the dial in numbers. * @@ -515,19 +495,6 @@ export function setJoinByPhoneDialogVisiblity(value: boolean) { }; } -/** - * Action used to set data from precall test. - * - * @param {Object} value - The precall test results. - * @returns {Object} - */ -export function setPrecallTestResults(value: Object) { - return { - type: SET_PRECALL_TEST_RESULTS, - value - }; -} - /** * Action used to set the initial errors after creating the tracks. * diff --git a/react/features/prejoin/components/web/PrejoinApp.tsx b/react/features/prejoin/components/web/PrejoinApp.tsx index 2c8400d524..7aaa5d592d 100644 --- a/react/features/prejoin/components/web/PrejoinApp.tsx +++ b/react/features/prejoin/components/web/PrejoinApp.tsx @@ -2,14 +2,13 @@ import React, { ComponentType } from 'react'; import { batch } from 'react-redux'; import BaseApp from '../../../base/app/components/BaseApp'; -import { getConferenceOptions } from '../../../base/conference/functions'; import { setConfig } from '../../../base/config/actions'; import { createPrejoinTracks } from '../../../base/tracks/functions.web'; import GlobalStyles from '../../../base/ui/components/GlobalStyles.web'; import JitsiThemeProvider from '../../../base/ui/components/JitsiThemeProvider.web'; import DialogContainer from '../../../base/ui/components/web/DialogContainer'; import { setupInitialDevices } from '../../../conference/actions.web'; -import { initPrejoin, makePrecallTest } from '../../actions.web'; +import { initPrejoin } from '../../actions.web'; import PrejoinThirdParty from './PrejoinThirdParty'; @@ -67,7 +66,6 @@ export default class PrejoinApp extends BaseApp { batch(() => { dispatch?.(initPrejoin(tracks, errors)); - store && dispatch?.(makePrecallTest(getConferenceOptions(store.getState()))); }); } diff --git a/react/features/prejoin/reducer.ts b/react/features/prejoin/reducer.ts index 6d61d0bb5e..3cccd91cf7 100644 --- a/react/features/prejoin/reducer.ts +++ b/react/features/prejoin/reducer.ts @@ -8,7 +8,6 @@ import { SET_DIALOUT_NUMBER, SET_DIALOUT_STATUS, SET_JOIN_BY_PHONE_DIALOG_VISIBLITY, - SET_PRECALL_TEST_RESULTS, SET_PREJOIN_DEVICE_ERRORS, SET_PREJOIN_PAGE_VISIBILITY, SET_SKIP_PREJOIN_RELOAD @@ -45,11 +44,6 @@ export interface IPrejoinState { dialOutStatus: string; joiningInProgress?: boolean; name: string; - precallTestResults?: { - fractionalLoss: number; - mediaConnectivity: boolean; - throughput: number; - }; rawError: string; showJoinByPhoneDialog: boolean; showPrejoin: boolean; @@ -81,12 +75,6 @@ ReducerRegistry.register( }; } - case SET_PRECALL_TEST_RESULTS: - return { - ...state, - precallTestResults: action.value - }; - case SET_PREJOIN_PAGE_VISIBILITY: return { ...state,