Files
discord-decomp/sources/lib/VideoHealthManager.tsx
2026-07-28 01:06:53 +03:00

323 lines
16 KiB
TypeScript

/* Metro module 12407; source: lib/VideoHealthManager.tsx; dependencies: [6, 7, 661, 3, 12408, 4303, 672, 4140, 2] */
import ClassCallCheck from '../by-id/module-00006-ClassCallCheck.js'; /* Metro dependency 6 */
import CreateClass from '../by-id/module-00007-CreateClass.js'; /* Metro dependency 7 */
import * as FileImportTrackerModule from '../by-id/module-00002-FileImportTracker.js'; /* Metro dependency 2 */
import * as ConstantsModule from '../Constants.tsx'; /* Metro dependency 661 */
function _fun94656(global, require, importDefault, importAll, module, exports, dependencyMap) { // fn#94656, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12593:6, offset: 0x0212289e, size: 204 bytes, params: 8, frame: 19
const env0_0 = require;
const Object = global.Object;
Object.defineProperty(exports, '__esModule', {value: true});
const value = _fun94657();
object = {'featureEnabled': null, 'windowLength': 5, 'allowedPoorFpsRatio': 1, 'fpsThreshold': 5,
'backoffTimeSec': 15};
object.featureEnabled = (require(4140) /* metro dependency 4140: PlatformUtils */).isMobile;
value.defaultConfig = object;
(FileImportTrackerModule).fileFinishedImporting('lib/VideoHealthManager.tsx');
exports.VideoHealthManager = value;
function _fun94657() { // fn#94657, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12593:145, offset: 0x0212296a, size: 346 bytes, params: 1, frame: 15
return CreateClass(VideoHealthManager, [{key: 'calculateFps', value: value_94659}, {key: 'updateFps',
value: value_94660}, {key: 'startReenableBackoffTimer', value: value_94662}, {key: 'queueReenable',
value: function(a0) {
this.enableQueue.push(a0);
this.tryReenableQueue();
}}, {key: 'tryReenableQueue', value: function() {
var property;
var value;
reducibleJoin7: while (true) {
if (this.disabled) {
break reducibleJoin7;
}
if (this.probingUserId != null) {
if (this.probingUserId in this.perUserFpsWindow) {
break reducibleJoin7;
}
}
property = this.enableQueue;
value = property.shift();
if (value == null) {
break reducibleJoin7;
}
if (this.reenableVideo(value)) {
break reducibleJoin7;
}
reducibleLoop5: while (true) {
if (value == null) {
break reducibleJoin7;
}
if (this.reenableVideo(value)) {
break reducibleJoin7;
}
continue reducibleLoop5;
}
}
}}, {key: 'reenableVideo', value: value_94666}, {key: 'elapsedSeconds', value: function(a0, a1) {
return (a0 - a1) / 1000;
}}, {key: 'stateCleanupBeforeEnable', value: function(a0) {
this.logger.info('VideoHealthManager::stateCleanupBeforeEnable');
this.perUserFpsWindow[a0] = [];
this.prevFramesCodec[a0] = -1;
this.streamDisabledUsers.delete(a0);
}}, {key: 'getCurrentVideoToggleState', value: function(a0) {
return this.currentVideoAutoToggleState[a0];
}}, {key: 'createUser', value: value_94670}, {key: 'deleteUser', value: value_94671}, {key: 'disable',
value: function() {
var propertyName;
this.disabled = true;
for (propertyName in this.perUserFpsWindow) {
this.deleteUser(propertyName);
}
}}]);
function VideoHealthManager(a0, a1, a2, a3) { // fn#94658, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12593:166, offset: 0x02122ac4, size: 330 bytes, params: 5, frame: 26
let value = environment.__proto__;
env1_3(this, VideoHealthManager);
value = importDefault(3) /* metro dependency 3: Logger */;
value = new value('VideoHealthManager');
this.logger = value;
this.disabled = false;
this.perUserFpsWindow = {};
this.prevFramesCodec = {};
this.prevTimestamp = {};
const Set = global.Set;
this.streamDisabledUsers = new Set();
this.retryBackoffCache = {};
this.timeoutIdCache = {};
this.currentVideoAutoToggleState = {};
this.enableQueue = [];
this.windowLength = a0;
this.fpsThreshold = a2;
const Math = global.Math;
this.fpsWindowBorderlineCount = Math.ceil(a0 * a1);
this.backoffTimeSec = a3;
let logger = this.logger;
logger.enableNativeLogger(true);
logger = this.logger;
logger.info('constructor with windowLength = ' + this.windowLength + ',\n fpsWindowBorderlineCount = ' + this.fpsWindowBorderlineCount + ',\n fpsThreshold = ' + this.fpsThreshold + ',\n backoffTimeSec = ' + a3);
}
function value_94660(a0, a1, a2) { // fn#94660, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12593:1338, offset: 0x02122d01, size: 538 bytes, params: 4, frame: 19
var environment;
var perUserFpsWindow;
var property;
var length;
var windowLength;
var currentVideoAutoToggleState;
var AUTO_ENABLED;
var DISABLED;
if (!this.disabled) {
var streamDisabledUsers = this.streamDisabledUsers;
if (streamDisabledUsers.has(a0)) {
return undefined;
}
var value = this.calculateFps(a0, a1, a2);
if (value < 0) {
return undefined;
}
var Number = global.Number;
if (Number.isFinite(value)) {
perUserFpsWindow = this.perUserFpsWindow;
property = perUserFpsWindow[a0];
property.push(value);
perUserFpsWindow = this.perUserFpsWindow;
length = perUserFpsWindow[a0].length;
windowLength = this.windowLength;
if (length < windowLength) {
return undefined;
}
perUserFpsWindow = this.perUserFpsWindow;
length = perUserFpsWindow[a0].length;
windowLength = this.windowLength;
if (length > windowLength) {
this.perUserFpsWindow[a0].shift();
}
perUserFpsWindow = this.perUserFpsWindow;
property = perUserFpsWindow[a0];
length = property.filter(_fun94661).length;
if (length >= this.fpsWindowBorderlineCount) {
this.logger.info('' + a0 + ': detected poor network quality, turning off video');
this.streamDisabledUsers.add(a0);
currentVideoAutoToggleState = this.currentVideoAutoToggleState;
value = environment.__proto__;
DISABLED = VideoToggleState.DISABLED;
currentVideoAutoToggleState[a0] = DISABLED;
value = importDefault(12408) /* metro dependency 12408: dispatchAutoDisableVideo */;
DISABLED = VideoToggleState.DISABLED;
value(a0, DISABLED);
this.startReenableBackoffTimer(a0);
} else {
currentVideoAutoToggleState = this.currentVideoAutoToggleState;
property = currentVideoAutoToggleState[a0];
value = environment.__proto__;
if (property === VideoToggleState.AUTO_PROBING) {
currentVideoAutoToggleState = this.currentVideoAutoToggleState;
AUTO_ENABLED = VideoToggleState.AUTO_ENABLED;
currentVideoAutoToggleState[a0] = AUTO_ENABLED;
this.logger.info('acceptable conditions reached, will reset and send a AUTO_ENABLED for user ' + a0);
value = importDefault(12408) /* metro dependency 12408: dispatchAutoDisableVideo */;
AUTO_ENABLED = VideoToggleState.AUTO_ENABLED;
value(a0, AUTO_ENABLED);
}
}
if (this.probingUserId === a0) {
this.probingUserId = undefined;
this.tryReenableQueue();
}
return undefined;
}
}
function _fun94661(a0) { // fn#94661, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12593:1683, offset: 0x02122f1b, size: 22 bytes, params: 2, frame: 2
return a0 < env0_0.fpsThreshold;
}
}
function value_94662(a0) { // fn#94662, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12593:2309, offset: 0x02122f31, size: 361 bytes, params: 2, frame: 21
var environment;
var r7;
var logger;
var retryBackoffCache;
var property;
var lastBackoffTime;
var expBackoffFactor;
var value;
var elapsedSeconds;
var value2;
var moduleValue;
var object;
const env0_1 = a0;
if (!this.disabled) {
logger = this.logger;
logger.info('startReenableBackoffTimer for user ' + a0);
retryBackoffCache = this.retryBackoffCache;
property = retryBackoffCache[a0];
lastBackoffTime = property.lastBackoffTime;
expBackoffFactor = property.expBackoffFactor;
value = 1;
if (lastBackoffTime === null) {
r7 = value;
} else if (expBackoffFactor > 16) {
r7 = value;
} else {
elapsedSeconds = this.elapsedSeconds;
value2 = environment.__proto__;
moduleValue = require(4303) /* metro dependency 4303: TimeUtils */;
r7 = Reflect.apply(elapsedSeconds, this, [moduleValue.now(),
lastBackoffTime]) > 600 ? value : expBackoffFactor * 2;
}
retryBackoffCache = this.retryBackoffCache;
object = {};
value = environment.__proto__;
object.lastBackoffTime = (require(4303) /* metro dependency 4303: TimeUtils */).now();
object.expBackoffFactor = r7;
retryBackoffCache[a0] = object;
value = r7 * this.backoffTimeSec * (importDefault(672) /* metro dependency 672: Durations */).Millis.SECOND;
logger = this.logger;
logger.info('starting backoff timer with time = ' + value + ' milliseconds');
this.timeoutIdCache[a0] = global.setTimeout(_fun94663, value);
}
function _fun94663() { // fn#94663, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12593:2774, offset: 0x0212309a, size: 28 bytes, params: 1, frame: 11
env0_0.queueReenable(env0_1);
}
}
function value_94666(a0) { // fn#94666, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12593:3130, offset: 0x0212313c, size: 176 bytes, params: 2, frame: 22
var r0;
var logger;
var info;
var currentVideoAutoToggleState;
var AUTO_PROBING;
let value = a0 in this.perUserFpsWindow;
if (value) {
logger = this.logger;
info = logger.info;
value = environment.__proto__;
Reflect.apply(info, logger,
['reenableVideo called for user ' + a0 + ' - time = ' + (require(4303) /* metro dependency 4303: TimeUtils */).now()]);
this.stateCleanupBeforeEnable(a0);
currentVideoAutoToggleState = this.currentVideoAutoToggleState;
AUTO_PROBING = VideoToggleState.AUTO_PROBING;
currentVideoAutoToggleState[a0] = AUTO_PROBING;
this.probingUserId = a0;
value = importDefault(12408) /* metro dependency 12408: dispatchAutoDisableVideo */;
AUTO_PROBING = VideoToggleState.AUTO_PROBING;
value(a0, AUTO_PROBING);
value = true;
r0 = value;
} else {
r0 = value;
}
return r0;
}
function value_94670(a0) { // fn#94670, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12593:3784, offset: 0x02123263, size: 141 bytes, params: 2, frame: 14
var currentVideoAutoToggleState;
var value;
this.logger.info('VideoHealthManager::createUser ' + a0);
if (!(a0 in this.perUserFpsWindow)) {
this.perUserFpsWindow[a0] = [];
this.prevFramesCodec[a0] = -1;
currentVideoAutoToggleState = this.currentVideoAutoToggleState;
value = environment.__proto__;
currentVideoAutoToggleState[a0] = VideoToggleState.NONE;
this.retryBackoffCache[a0] = {'lastBackoffTime': null, 'expBackoffFactor': 1};
}
}
}
}
function value_94659(a0, a1, a2) { // fn#94659, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12593:889, offset: 0x02122c0e, size: 243 bytes, params: 4, frame: 16
if (this.prevFramesCodec[a0] === -1) {
this.prevFramesCodec[a0] = a1;
this.prevTimestamp[a0] = a2;
this.perUserFpsWindow[a0] = [];
return global.NaN;
}
if (a1 < this.prevFramesCodec[a0]) {
this.prevFramesCodec[a0] = a1;
this.prevTimestamp[a0] = a2;
this.perUserFpsWindow[a0] = [];
return global.NaN;
}
if (a2 < this.prevTimestamp[a0]) {
this.prevFramesCodec[a0] = a1;
this.prevTimestamp[a0] = a2;
this.perUserFpsWindow[a0] = [];
return global.NaN;
}
if (a2 > this.prevTimestamp[a0] + 1000 * this.windowLength) {
this.prevFramesCodec[a0] = a1;
this.prevTimestamp[a0] = a2;
this.perUserFpsWindow[a0] = [];
return global.NaN;
}
if (a2 < this.prevTimestamp[a0] + 900) {
return global.NaN;
}
let value = this.elapsedSeconds(a2, this.prevTimestamp[a0]);
this.prevTimestamp[a0] = a2;
value = (a1 - this.prevFramesCodec[a0]) / value;
this.prevFramesCodec[a0] = a1;
return value;
}
function value_94671(a0) { // fn#94671, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:12593:4074, offset: 0x021232f0, size: 166 bytes, params: 2, frame: 15
this.logger.info('VideoHealthManager::deleteUser ' + a0);
delete this.perUserFpsWindow[a0];
delete this.prevFramesCodec[a0];
delete this.retryBackoffCache[a0];
delete this.currentVideoAutoToggleState[a0];
this.streamDisabledUsers.delete(a0);
if (a0 === this.probingUserId) {
this.probingUserId = undefined;
this.tryReenableQueue();
}
global.clearTimeout(this.timeoutIdCache[a0]);
delete this.timeoutIdCache[a0];
}
global.__d(_fun94656, 12407, [6, 7, 661, 3, 12408, 4303, 672, 4140,
2]) /* metro module 12407, dependencies: [6, 7, 661, 3, 12408, 4303, 672, 4140, 2] */;