2017-03-01 16:32:21 -08:00
|
|
|
'use strict';
|
|
|
|
|
|
2018-09-01 16:35:53 +05:30
|
|
|
const eventEmitter = require('./eventEmitter');
|
|
|
|
|
|
2017-03-01 16:32:21 -08:00
|
|
|
const log = require('./log.js');
|
2017-08-24 13:21:02 +05:30
|
|
|
const logLevels = require('./enums/logLevels.js');
|
2018-09-01 16:35:53 +05:30
|
|
|
const { getMainWindow, setIsAutoReload, getIsOnline } = require('./windowMgr');
|
2018-04-11 13:06:46 +00:00
|
|
|
const { getConfigField } = require('./config');
|
|
|
|
|
|
|
|
|
|
const maxMemory = 800;
|
2018-09-01 16:35:53 +05:30
|
|
|
const defaultInterval = 30 * 1000;
|
|
|
|
|
const memoryRefreshThreshold = 60 * 60 * 1000;
|
|
|
|
|
const cpuUsageThreshold = 5;
|
2018-05-08 16:14:33 +05:30
|
|
|
|
2018-05-10 13:10:41 +05:30
|
|
|
let isInMeeting = false;
|
2018-09-01 16:35:53 +05:30
|
|
|
let canReload = true;
|
|
|
|
|
let appMinimizedTimer;
|
|
|
|
|
let powerMonitorTimer;
|
|
|
|
|
let preloadMemory;
|
|
|
|
|
let preloadWindow;
|
2017-03-01 16:32:21 -08:00
|
|
|
|
|
|
|
|
// once a minute
|
|
|
|
|
setInterval(gatherMemory, 1000 * 60);
|
|
|
|
|
|
2017-08-24 16:18:32 +05:30
|
|
|
/**
|
|
|
|
|
* Gathers system memory and logs it to the remote system
|
|
|
|
|
*/
|
2017-03-01 16:32:21 -08:00
|
|
|
function gatherMemory() {
|
2017-08-24 13:21:02 +05:30
|
|
|
let memory = process.getProcessMemoryInfo();
|
|
|
|
|
let details =
|
2017-03-01 16:32:21 -08:00
|
|
|
'workingSetSize: ' + memory.workingSetSize +
|
|
|
|
|
' peakWorkingSetSize: ' + memory.peakWorkingSetSize +
|
|
|
|
|
' privatesBytes: ' + memory.privatesBytes +
|
|
|
|
|
' sharedBytes: ' + memory.sharedBytes;
|
|
|
|
|
log.send(logLevels.INFO, details);
|
|
|
|
|
}
|
2018-04-11 13:06:46 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Method that checks memory usage every minute
|
|
|
|
|
* and verify if the user in inactive if so it reloads the
|
|
|
|
|
* application to free up some memory consumption
|
|
|
|
|
*/
|
2018-09-01 16:35:53 +05:30
|
|
|
function optimizeMemory() {
|
|
|
|
|
|
|
|
|
|
if (!preloadMemory || !preloadMemory.memoryInfo || !preloadMemory.cpuUsage) {
|
|
|
|
|
log.send(logLevels.INFO, `Memory info not available`);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const memoryConsumed = (preloadMemory.memoryInfo && preloadMemory.memoryInfo.workingSetSize / 1024) || 0;
|
|
|
|
|
const cpuUsagePercentage = preloadMemory.cpuUsage.percentCPUUsage;
|
2018-09-06 14:52:04 +05:30
|
|
|
const activeNetworkRequest = preloadMemory.activeRequests === 0;
|
2018-04-11 13:06:46 +00:00
|
|
|
|
2018-06-05 16:03:28 +05:30
|
|
|
if (memoryConsumed > maxMemory
|
2018-09-01 16:35:53 +05:30
|
|
|
&& cpuUsagePercentage <= cpuUsageThreshold
|
2018-06-05 16:03:28 +05:30
|
|
|
&& !isInMeeting
|
2018-09-01 16:35:53 +05:30
|
|
|
&& getIsOnline()
|
|
|
|
|
&& canReload
|
2018-09-06 14:52:04 +05:30
|
|
|
&& activeNetworkRequest
|
2018-06-05 16:03:28 +05:30
|
|
|
) {
|
2018-04-11 13:06:46 +00:00
|
|
|
getConfigField('memoryRefresh')
|
|
|
|
|
.then((enabled) => {
|
|
|
|
|
if (enabled) {
|
|
|
|
|
const mainWindow = getMainWindow();
|
|
|
|
|
|
|
|
|
|
if (mainWindow && !mainWindow.isDestroyed()) {
|
|
|
|
|
setIsAutoReload(true);
|
2018-09-01 16:35:53 +05:30
|
|
|
log.send(logLevels.INFO, `Reloading the app to optimize memory usage as
|
|
|
|
|
memory consumption was ${memoryConsumed}
|
|
|
|
|
CPU usage percentage was ${preloadMemory.cpuUsage.percentCPUUsage}
|
|
|
|
|
user was in a meeting? ${isInMeeting}
|
2018-09-06 14:52:04 +05:30
|
|
|
pending network request on the client was ${preloadMemory.activeRequests}
|
2018-09-01 16:35:53 +05:30
|
|
|
is network online? ${getIsOnline()}`);
|
2018-05-04 16:08:09 +05:30
|
|
|
mainWindow.reload();
|
2018-09-01 16:35:53 +05:30
|
|
|
|
|
|
|
|
// do not refresh for another 1hrs
|
|
|
|
|
canReload = false;
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
canReload = true;
|
|
|
|
|
}, memoryRefreshThreshold);
|
2018-04-11 13:06:46 +00:00
|
|
|
}
|
2018-09-01 16:35:53 +05:30
|
|
|
} else {
|
|
|
|
|
log.send(logLevels.INFO, `Memory refresh not enabled by the user so Not Reloading the app`);
|
2018-04-11 13:06:46 +00:00
|
|
|
}
|
|
|
|
|
});
|
2018-09-01 16:35:53 +05:30
|
|
|
} else {
|
|
|
|
|
log.send(logLevels.INFO, `Not Reloading the app as
|
|
|
|
|
memory consumption was ${memoryConsumed}
|
|
|
|
|
CPU usage percentage was ${preloadMemory.cpuUsage.percentCPUUsage}
|
|
|
|
|
user was in a meeting? ${isInMeeting}
|
2018-09-06 14:52:04 +05:30
|
|
|
pending network request on the client was ${preloadMemory.activeRequests}
|
2018-09-01 16:35:53 +05:30
|
|
|
is network online? ${getIsOnline()}`);
|
2018-04-11 13:06:46 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-05-04 16:08:09 +05:30
|
|
|
/**
|
2018-05-10 13:10:41 +05:30
|
|
|
* Sets the current user meeting status
|
2018-06-05 16:22:42 +05:30
|
|
|
* @param meetingStatus - Whether user is in an active meeting
|
2018-05-04 16:08:09 +05:30
|
|
|
*/
|
2018-06-05 16:22:42 +05:30
|
|
|
function setIsInMeeting(meetingStatus) {
|
|
|
|
|
isInMeeting = meetingStatus;
|
2018-05-04 16:08:09 +05:30
|
|
|
}
|
|
|
|
|
|
2018-09-01 16:35:53 +05:30
|
|
|
/**
|
|
|
|
|
* Sets preload memory info and calls optimize memory func
|
|
|
|
|
*
|
2018-09-06 14:52:04 +05:30
|
|
|
* @param memoryInfo - memory consumption of the preload main script
|
|
|
|
|
* @param cpuUsage - CPU usage of the preload main script
|
|
|
|
|
* @param activeRequests - pending active network requests on the client
|
2018-09-01 16:35:53 +05:30
|
|
|
*/
|
2018-09-06 14:52:04 +05:30
|
|
|
function setPreloadMemoryInfo(memoryInfo, cpuUsage, activeRequests) {
|
2018-09-01 16:35:53 +05:30
|
|
|
log.send(logLevels.INFO, 'Memory info received from preload process now running optimize memory logic');
|
2018-09-06 14:52:04 +05:30
|
|
|
preloadMemory = { memoryInfo, cpuUsage, activeRequests };
|
2018-09-01 16:35:53 +05:30
|
|
|
optimizeMemory();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Called whenever the application is minimized
|
|
|
|
|
* and waits for 30s to optimize memory
|
|
|
|
|
*/
|
|
|
|
|
eventEmitter.on('appMinimized', () => {
|
|
|
|
|
appMinimizedTimer = setTimeout(() => {
|
|
|
|
|
const mainWindow = getMainWindow();
|
|
|
|
|
if (mainWindow && !mainWindow.isDestroyed() && mainWindow.isMinimized()) {
|
|
|
|
|
log.send(logLevels.INFO, 'Application is minimised for more than 30s so calling requestMemoryInfo');
|
|
|
|
|
requestMemoryInfo();
|
|
|
|
|
}
|
|
|
|
|
}, defaultInterval);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Called whenever the application is restored from minimized state
|
|
|
|
|
*
|
|
|
|
|
* Clears appMinimizedTimer if the app is restored within 30s
|
|
|
|
|
* from minimized state
|
|
|
|
|
*/
|
|
|
|
|
eventEmitter.on('appRestored', () => {
|
|
|
|
|
log.send(logLevels.INFO, 'Application was restored from minimized state');
|
2018-09-06 14:52:04 +05:30
|
|
|
setIsAutoReload(false);
|
2018-09-01 16:35:53 +05:30
|
|
|
if (appMinimizedTimer) {
|
|
|
|
|
clearTimeout(appMinimizedTimer);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Called whenever the system in locked
|
|
|
|
|
* and waits for 30s to optimize memory
|
|
|
|
|
*/
|
|
|
|
|
eventEmitter.on('sys-locked', () => {
|
|
|
|
|
log.send(logLevels.INFO, 'System screen was locked');
|
|
|
|
|
powerMonitorTimer = setTimeout(() => {
|
|
|
|
|
log.send(logLevels.INFO, 'System screen was locked for more than 30s so calling requestMemoryInfo');
|
|
|
|
|
requestMemoryInfo();
|
|
|
|
|
}, defaultInterval);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Called whenever the system in locked
|
|
|
|
|
*
|
|
|
|
|
* Clears powerMonitorTimer if the system is unlocked within 30s
|
|
|
|
|
* from locked state
|
|
|
|
|
*/
|
|
|
|
|
eventEmitter.on('sys-unlocked', () => {
|
|
|
|
|
log.send(logLevels.INFO, 'System screen was unlocked');
|
2018-09-06 14:52:04 +05:30
|
|
|
setIsAutoReload(false);
|
2018-09-01 16:35:53 +05:30
|
|
|
if (powerMonitorTimer) {
|
|
|
|
|
clearTimeout(powerMonitorTimer);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets the preload window
|
|
|
|
|
*
|
|
|
|
|
* @param win - preload window
|
|
|
|
|
*/
|
|
|
|
|
function setPreloadWindow(win) {
|
|
|
|
|
log.send(logLevels.INFO, 'Preload window registered');
|
|
|
|
|
preloadWindow = win;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Request memory info from the registered preload window
|
|
|
|
|
* which invokes the optimize memory func
|
|
|
|
|
*/
|
|
|
|
|
function requestMemoryInfo() {
|
|
|
|
|
if (preloadWindow) {
|
|
|
|
|
log.send(logLevels.INFO, 'Requesting memory information from the preload script');
|
|
|
|
|
preloadWindow.send('memory-info-request');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-04-11 13:06:46 +00:00
|
|
|
module.exports = {
|
2018-09-01 16:35:53 +05:30
|
|
|
setIsInMeeting,
|
|
|
|
|
setPreloadMemoryInfo,
|
|
|
|
|
setPreloadWindow,
|
2018-04-11 13:06:46 +00:00
|
|
|
};
|