/** * Manages browserstack-local instance, making sure there is only one per * instance set up for all browser launchers. */ import { BrowserLauncher } from '@web/test-runner-core'; import browserstack from 'browserstack-local'; import { nanoid } from 'nanoid'; import { promisify } from 'util'; const launchers = new Set(); let connection: browserstack.Local | undefined = undefined; export const localId = `web-test-runner-${nanoid()}`; async function setupLocalConnection(password: string, options: Partial = {}) { process.on('SIGINT', closeLocalConnection); process.on('SIGTERM', closeLocalConnection); process.on('beforeExit', closeLocalConnection); process.on('exit', closeLocalConnection); connection = new browserstack.Local(); console.log('[Browserstack] Setting up Browserstack Local proxy...'); await promisify(connection.start).bind(connection)({ key: password, force: true, localIdentifier: localId, ...options, }); } function closeLocalConnection() { if (connection && (connection as any).pid != null) { process.kill((connection as any).pid); connection = undefined; } } export async function registerBrowserstackLocal( launcher: BrowserLauncher, password: string, options: Partial = {}, ) { launchers.add(launcher); if (!connection) { await setupLocalConnection(password, options); } } export function unregisterBrowserstackLocal(launcher: BrowserLauncher) { launchers.delete(launcher); if (connection && launchers.size === 0) { closeLocalConnection(); } }