idle: v2 - added sleep, utils, documenting, and more
This commit is contained in:
parent
c80200f13a
commit
a7d9331f60
@ -12,38 +12,88 @@ export default async (CDP, { browserType }) => {
|
|||||||
wake: warning,
|
wake: warning,
|
||||||
auto: warning
|
auto: warning
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
const killNonCrit = async () => {
|
const killNonCrit = async () => { // kill non-critical processes to save memory - crashes chromium internally but not fully
|
||||||
const procs = (await CDP.send('SystemInfo.getProcessInfo', {}, false)).processInfo;
|
const procs = (await CDP.send('SystemInfo.getProcessInfo', {}, false)).processInfo;
|
||||||
const nonCriticalProcs = procs.filter(x => x.type !== 'browser');
|
const nonCriticalProcs = procs.filter(x => x.type !== 'browser'); // browser = the actual main chromium binary
|
||||||
|
|
||||||
await killProcesses(nonCriticalProcs.map(x => x.id));
|
await killProcesses(nonCriticalProcs.map(x => x.id));
|
||||||
log(`killed ${nonCriticalProcs.length} processes`);
|
log(`killed ${nonCriticalProcs.length} processes`);
|
||||||
};
|
};
|
||||||
|
|
||||||
let hibernating = false;
|
const purgeMemory = async () => { // purge most memory we can
|
||||||
const hibernate = async () => {
|
await CDP.send('Memory.forciblyPurgeJavaScriptMemory');
|
||||||
|
await CDP.send('HeapProfiler.collectGarbage');
|
||||||
|
};
|
||||||
|
|
||||||
|
const getScreenshot = async () => { // get a screenshot a webm base64 data url
|
||||||
|
const { data } = await CDP.send(`Page.captureScreenshot`, {
|
||||||
|
format: 'webp'
|
||||||
|
});
|
||||||
|
|
||||||
|
return `data:image/webp;base64,${data}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const getLastUrl = async () => {
|
||||||
|
const history = await CDP.send('Page.getNavigationHistory');
|
||||||
|
return history.entries[history.currentIndex].url;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
let wakeUrl, hibernating = false;
|
||||||
|
const hibernate = async () => { // hibernate - crashing chromium internally to save max memory. users will see a crash/gone wrong page but we hopefully "reload" quick enough once visible again for not much notice.
|
||||||
|
if (hibernating) return;
|
||||||
|
if (process.platform !== 'win32') return sleep(); // sleep instead - full hibernation is windows only for now due to needing to do native things
|
||||||
|
|
||||||
hibernating = true;
|
hibernating = true;
|
||||||
|
|
||||||
const startTime = performance.now();
|
const startTime = performance.now();
|
||||||
|
|
||||||
|
wakeUrl = await getLastUrl();
|
||||||
|
|
||||||
|
purgeMemory();
|
||||||
await killNonCrit();
|
await killNonCrit();
|
||||||
// await killNonCrit();
|
purgeMemory();
|
||||||
|
|
||||||
log(`hibernated in ${(performance.now() - startTime).toFixed(2)}ms`);
|
log(`hibernated in ${(performance.now() - startTime).toFixed(2)}ms`);
|
||||||
};
|
};
|
||||||
|
|
||||||
const wake = async () => {
|
const sleep = async () => { // light hibernate - instead of killing chromium processes we just navigate to a screenshot of the current page.
|
||||||
|
if (hibernating) return;
|
||||||
|
hibernating = true;
|
||||||
|
|
||||||
const startTime = performance.now();
|
const startTime = performance.now();
|
||||||
|
|
||||||
await CDP.send('Page.reload');
|
wakeUrl = await getLastUrl();
|
||||||
|
|
||||||
|
purgeMemory();
|
||||||
|
|
||||||
|
await CDP.send(`Page.navigate`, {
|
||||||
|
url: lastScreenshot
|
||||||
|
});
|
||||||
|
|
||||||
|
purgeMemory();
|
||||||
|
|
||||||
|
log(`slept in ${(performance.now() - startTime).toFixed(2)}ms`);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const wake = async () => { // wake up from hibernation/sleep by navigating to the original page
|
||||||
|
if (!hibernating) return;
|
||||||
|
|
||||||
|
const startTime = performance.now();
|
||||||
|
|
||||||
|
await CDP.send('Page.navigate', {
|
||||||
|
url: wakeUrl
|
||||||
|
});
|
||||||
|
|
||||||
log(`began wake in ${(performance.now() - startTime).toFixed(2)}ms`);
|
log(`began wake in ${(performance.now() - startTime).toFixed(2)}ms`);
|
||||||
|
|
||||||
hibernating = false;
|
hibernating = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const { windowId } = await CDP.send('Browser.getWindowForTarget');
|
const { windowId } = await CDP.send('Browser.getWindowForTarget');
|
||||||
|
|
||||||
let autoEnabled = process.argv.includes('--force-auto-idle'), autoOptions = {
|
let autoEnabled = process.argv.includes('--force-auto-idle'), autoOptions = {
|
||||||
@ -79,12 +129,23 @@ export default async (CDP, { browserType }) => {
|
|||||||
log('stopped auto idle');
|
log('stopped auto idle');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let lastScreenshot, takingScreenshot = false;
|
||||||
|
const screenshotInterval = setInterval(async () => {
|
||||||
|
if (takingScreenshot) return;
|
||||||
|
|
||||||
|
takingScreenshot = true;
|
||||||
|
lastScreenshot = await getScreenshot();
|
||||||
|
takingScreenshot = false;
|
||||||
|
}, 10000);
|
||||||
|
|
||||||
|
getScreenshot().then(x => lastScreenshot = x);
|
||||||
|
|
||||||
log(`idle API active (window id: ${windowId})`);
|
log(`idle API active (window id: ${windowId})`);
|
||||||
if (autoEnabled) startAuto();
|
if (autoEnabled) startAuto();
|
||||||
|
|
||||||
return {
|
return {
|
||||||
hibernate,
|
hibernate,
|
||||||
sleep: () => {},
|
sleep,
|
||||||
wake,
|
wake,
|
||||||
|
|
||||||
auto: (enabled, options) => {
|
auto: (enabled, options) => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user