26 lines
1.1 KiB
JavaScript
26 lines
1.1 KiB
JavaScript
|
|
// Browser.close runs Chromium's normal shutdown path and flushes profile data.
|
||
|
|
import { chromium } from '/opt/grokboy/playwright/node_modules/playwright/index.mjs';
|
||
|
|
import { readdir, readFile } from 'node:fs/promises';
|
||
|
|
import { setTimeout as delay } from 'node:timers/promises';
|
||
|
|
const deadline = setTimeout(() => process.exit(1), 8000);
|
||
|
|
try {
|
||
|
|
const browser = await chromium.connectOverCDP('http://127.0.0.1:9222', { timeout: 2000 });
|
||
|
|
const disconnected = new Promise(resolve => browser.once('disconnected', resolve));
|
||
|
|
const session = await browser.newBrowserCDPSession();
|
||
|
|
await session.send('Browser.close').catch(() => {});
|
||
|
|
await disconnected;
|
||
|
|
// DevTools disconnects before the browser's storage shutdown has finished.
|
||
|
|
for (;;) {
|
||
|
|
let running = false;
|
||
|
|
for (const pid of await readdir('/proc')) {
|
||
|
|
if (!/^\d+$/.test(pid)) continue;
|
||
|
|
const cmd = await readFile(`/proc/${pid}/cmdline`, 'utf8').catch(() => '');
|
||
|
|
const args = cmd.split('\0');
|
||
|
|
if (args[0]?.endsWith('/chromium') && !args.some(arg => arg.startsWith('--type='))) running = true;
|
||
|
|
}
|
||
|
|
if (!running) break;
|
||
|
|
await delay(50);
|
||
|
|
}
|
||
|
|
} catch {}
|
||
|
|
clearTimeout(deadline);
|