import {promisify} from 'node:util'; import {execFile} from 'node:child_process'; const execFileAsync = promisify(execFile); // Windows doesn't have browser IDs in the same way macOS/Linux does so we give fake // ones that look real and match the macOS/Linux versions for cross-platform apps. const windowsBrowserProgIds = { AppXq0fevzme2pys62n3e0fbqa7peapykr8v: {name: 'Edge', id: 'com.microsoft.edge.old'}, MSEdgeDHTML: {name: 'Edge', id: 'com.microsoft.edge'}, // On macOS, it's "com.microsoft.edgemac" MSEdgeHTM: {name: 'Edge', id: 'com.microsoft.edge'}, // Newer Edge/Win10 releases 'IE.HTTP': {name: 'Internet Explorer', id: 'com.microsoft.ie'}, FirefoxURL: {name: 'Firefox', id: 'org.mozilla.firefox'}, ChromeHTML: {name: 'Chrome', id: 'com.google.chrome'}, BraveHTML: {name: 'Brave', id: 'com.brave.Browser'}, BraveBHTML: {name: 'Brave Beta', id: 'com.brave.Browser.beta'}, BraveSSHTM: {name: 'Brave Nightly', id: 'com.brave.Browser.nightly'}, }; export class UnknownBrowserError extends Error {} export default async function defaultBrowser(_execFileAsync = execFileAsync) { const {stdout} = await _execFileAsync('reg', [ 'QUERY', ' HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice', '/v', 'ProgId', ]); const match = /ProgId\s*REG_SZ\s*(?\S+)/.exec(stdout); if (!match) { throw new UnknownBrowserError(`Cannot find Windows browser in stdout: ${JSON.stringify(stdout)}`); } const {id} = match.groups; const browser = windowsBrowserProgIds[id]; if (!browser) { throw new UnknownBrowserError(`Unknown browser ID: ${id}`); } return browser; }