UNPKG

onibrowser

Version:
100 lines (91 loc) 2.74 kB
import {exec} from 'child_process'; import path from 'path'; import os from 'os'; import fs from 'fs'; import isDocker from 'is-docker'; import {launch as ChromeLauncher} from './custom-launcher/dist/chrome-launcher.js'; import {sleep} from '../common.js'; const RESTART_MS = 1000; const zombies = new Map(); let chromeNumber = 0; let chrome_started = false; const deathHandlers = new Map(); const launcher_api = { async newZombie({port, username} = {}) { const udd = path.resolve(os.homedir(), 'chrome-browser'); const upd = path.resolve(udd, 'Default'); if ( ! fs.existsSync( udd ) ) { fs.mkdirSync(udd, {recursive:true}); } if ( chrome_started ) { console.log(`Ignoring launch request as chrome already started.`); } const DEFAULT_FLAGS = [ '--mute-audio', '--window-size=1280,800', '--profiling-flush=1', '--enable-aggressive-domstorage-flushing', '--restore-last-session', '--disk-cache-size=2750000000', `--profile-directory="${upd}"` ]; chromeNumber += 1; console.log(`Chrome Number: ${chromeNumber}, Executing chrome-launcher`); const CHROME_FLAGS = Array.from(DEFAULT_FLAGS); if (!process.env.DEBUG_SKATEBOARD) { CHROME_FLAGS.push('--headless'); } else { CHROME_FLAGS.push('--no-sandbox'); } if (isDocker()) { CHROME_FLAGS.push('--remote-debugging-address=0.0.0.0'); } const CHROME_OPTS = { port, ignoreDefaultFlags: true, handleSIGINT: false, userDataDir: path.resolve(os.homedir(), 'chrome-browser'), logLevel: 'verbose', chromeFlags: CHROME_FLAGS }; console.log(CHROME_OPTS, CHROME_FLAGS); const zomb = await ChromeLauncher(CHROME_OPTS); chrome_started = true; zombies.set(port,zomb); const retVal = { port }; process.on('SIGHUP', undoChrome); process.on('SIGUSR1', undoChrome); process.on('SIGTERM', undoChrome); process.on('SIGINT', undoChrome); process.on('beforeExit', undoChrome); return retVal; async function undoChrome() { console.log("Undo chrome called"); if ( ! chrome_started ) return; chrome_started = false; try { await zomb.kill(); process.exit(0); } catch(e) { console.warn("Error on kill chrome on exit", e); process.exit(1); } } }, onDeath(port, func) { let handlers = deathHandlers.get(port); if ( ! handlers ) { handlers = []; deathHandlers.set(port,handlers); } handlers.push(func); }, kill(port) { const zombie = zombies.get(port); console.log(`Requesting zombie kill.`); zombie && zombie.kill(); } }; export default launcher_api;