Remove callstats (#14076)

* ref: Remove precall test.
* ref: Remove callstats.
* Remove the dependency on react-native-callstats.
pull/14115/head
bgrozev 2 years ago committed by GitHub
parent 701ae5b2b1
commit 6ab25f7bc0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 15
      conference.js
  2. 46
      config.js
  3. 42
      package-lock.json
  4. 1
      package.json
  5. 1
      react-native-sdk/package.json
  6. 2
      react/features/base/conference/functions.ts
  7. 1
      react/features/base/conference/reducer.ts
  8. 22
      react/features/base/config/configType.ts
  9. 4
      react/features/base/config/configWhitelist.ts
  10. 2
      react/features/base/config/functions.native.ts
  11. 1
      react/features/base/jwt/constants.ts
  12. 53
      react/features/base/logging/JitsiMeetLogStorage.ts
  13. 2
      react/features/base/logging/actionTypes.ts
  14. 3
      react/features/base/logging/actions.ts
  15. 2
      react/features/base/logging/middleware.ts
  16. 3
      react/features/base/logging/reducer.ts
  17. 5
      react/features/base/premeeting/components/web/ConnectionStatus.tsx
  18. 128
      react/features/base/premeeting/functions.ts
  19. 7
      react/features/feedback/actions.web.ts
  20. 2
      react/features/feedback/components/FeedbackButton.web.ts
  21. 7
      react/features/mobile/polyfills/browser.js
  22. 3
      react/features/overlay/components/web/AbstractPageReloadOverlay.tsx
  23. 5
      react/features/prejoin/actionTypes.ts
  24. 33
      react/features/prejoin/actions.web.ts
  25. 4
      react/features/prejoin/components/web/PrejoinApp.tsx
  26. 12
      react/features/prejoin/reducer.ts

@ -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.
*

@ -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',
// },

42
package-lock.json generated

@ -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",

@ -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",

@ -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",

@ -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;

@ -73,7 +73,6 @@ export interface IJitsiConference {
getSsrcByTrack: Function;
grantOwner: Function;
isAVModerationSupported: Function;
isCallstatsEnabled: Function;
isE2EEEnabled: Function;
isE2EESupported: Function;
isEndConferenceSupported: Function;

@ -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;

@ -55,10 +55,6 @@ export default [
* @type string
*/
'callHandle',
'callStatsConfIDNamespace',
'callStatsConfigParams',
'callStatsID',
'callStatsSecret',
/**
* The UUID of the CallKit call representing the conference/meeting

@ -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 };
}

@ -4,7 +4,6 @@
export const MEET_FEATURES = {
BRANDING: 'branding',
CALENDAR: 'calendar',
CALLSTATS: 'callstats',
FLIP: 'flip',
INBOUND_CALL: 'inbound-call',
LIVESTREAMING: 'livestreaming',

@ -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<string | any>) {
// 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<string|any>} logEntries - The log entries to send to the rtcstats server.
* @returns {void}
*/
storeLogsCallstats(logEntries: Array<string | any>) {
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);
}
}
}

@ -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,

@ -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.

@ -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

@ -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
}
};

@ -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,

@ -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: []

@ -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,

@ -50,7 +50,7 @@ const mapStateToProps = (state: IReduxState) => {
return {
_conference: conference,
visible: conference?.isCallstatsEnabled() || shouldSendJaaSFeedbackMetadata(state)
visible: shouldSendJaaSFeedbackMetadata(state)
};
};

@ -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

@ -152,9 +152,6 @@ export default class AbstractPageReloadOverlay<P extends IProps>
* @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({

@ -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.
*/

@ -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.
*

@ -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<Props> {
batch(() => {
dispatch?.(initPrejoin(tracks, errors));
store && dispatch?.(makePrecallTest(getConferenceOptions(store.getState())));
});
}

@ -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<IPrejoinState>(
};
}
case SET_PRECALL_TEST_RESULTS:
return {
...state,
precallTestResults: action.value
};
case SET_PREJOIN_PAGE_VISIBILITY:
return {
...state,

Loading…
Cancel
Save