From 7ece34bac2bca8978896d2bf941ac626cc821cfa Mon Sep 17 00:00:00 2001 From: Yuki Hattori Date: Sun, 22 Sep 2024 18:54:45 +0900 Subject: [PATCH] Fix duplicated check for WSL --- src/browser/browser.ts | 7 +++- src/browser/browsers/chrome-cdp.ts | 4 +- src/browser/browsers/chrome.ts | 4 +- src/browser/browsers/firefox.ts | 4 +- src/utils/wsl.ts | 59 ++++++++++++++++++------------ 5 files changed, 46 insertions(+), 32 deletions(-) diff --git a/src/browser/browser.ts b/src/browser/browser.ts index 036f8188..a06b03df 100644 --- a/src/browser/browser.ts +++ b/src/browser/browser.ts @@ -7,8 +7,11 @@ export interface BrowserOptions { } export abstract class Browser { - abstract kind: BrowserKind - abstract protocol: BrowserProtocol + static readonly kind: BrowserKind + static readonly protocol: BrowserProtocol + + // --- + purpose: BrowserPurpose constructor(opts: BrowserOptions) { diff --git a/src/browser/browsers/chrome-cdp.ts b/src/browser/browsers/chrome-cdp.ts index 95d5440c..80946ebf 100644 --- a/src/browser/browsers/chrome-cdp.ts +++ b/src/browser/browsers/chrome-cdp.ts @@ -1,6 +1,6 @@ import { Browser } from '../browser' export class ChromeCdpBrowser extends Browser { - kind = 'chrome' as const - protocol = 'cdp' as const + static readonly kind = 'chrome' as const + static readonly protocol = 'cdp' as const } diff --git a/src/browser/browsers/chrome.ts b/src/browser/browsers/chrome.ts index b274b92a..2f17f438 100644 --- a/src/browser/browsers/chrome.ts +++ b/src/browser/browsers/chrome.ts @@ -1,6 +1,6 @@ import { Browser } from '../browser' export class ChromeBrowser extends Browser { - kind = 'chrome' as const - protocol = 'webdriver-bidi' as const + static readonly kind = 'chrome' as const + static readonly protocol = 'webdriver-bidi' as const } diff --git a/src/browser/browsers/firefox.ts b/src/browser/browsers/firefox.ts index bc2424ff..cfc33517 100644 --- a/src/browser/browsers/firefox.ts +++ b/src/browser/browsers/firefox.ts @@ -1,6 +1,6 @@ import { Browser } from '../browser' export class FirefoxBrowser extends Browser { - kind = 'firefox' as const - protocol = 'webdriver-bidi' as const + static readonly kind = 'firefox' as const + static readonly protocol = 'webdriver-bidi' as const } diff --git a/src/utils/wsl.ts b/src/utils/wsl.ts index 2737f3e8..88cb720c 100644 --- a/src/utils/wsl.ts +++ b/src/utils/wsl.ts @@ -1,7 +1,8 @@ import { execFile, spawnSync } from 'node:child_process' -import { readFileSync } from 'node:fs' +import fs from 'node:fs' +import { debug } from './debug' -let isWsl: number | undefined +let isWsl: number | Promise | undefined export const resolveWSLPathToHost = async (path: string): Promise => await new Promise((res, rej) => { @@ -30,31 +31,41 @@ export const resolveWindowsEnvSync = (key: string): string | undefined => { return ret.startsWith(`${key}=`) ? ret.slice(key.length + 1) : undefined } +const wsl2VerMatcher = /microsoft-standard-wsl2/i + export const isWSL = async (): Promise => { if (isWsl === undefined) { - if ((await import('is-wsl')).default) { - // Detect whether WSL version is 2 - // https://github.com/microsoft/WSL/issues/4555#issuecomment-700213318 - const isWSL2 = (() => { - if (process.env.WSL_DISTRO_NAME && process.env.WSL_INTEROP) return true - - try { - const verStr = readFileSync('/proc/version', 'utf8').toLowerCase() - if (verStr.includes('microsoft-standard-wsl2')) return true - - const gccMatched = verStr.match(/gcc[^,]+?(\d+)\.\d+\.\d+/) - if (gccMatched && Number.parseInt(gccMatched[1], 10) >= 8) return true - } catch { - // no ops - } - })() - - isWsl = isWSL2 ? 2 : 1 - } else { - isWsl = 0 - } + isWsl = (async () => { + if ((await import('is-wsl')).default) { + // Detect whether WSL version is 2 + // https://github.com/microsoft/WSL/issues/4555#issuecomment-700213318 + const isWSL2 = await (async () => { + if (process.env.WSL_DISTRO_NAME && process.env.WSL_INTEROP) + return true + + try { + const verStr = await fs.promises.readFile('/proc/version', 'utf8') + if (wsl2VerMatcher.test(verStr)) return true + + const gccMatched = verStr.match(/gcc[^,]+?(\d+)\.\d+\.\d+/) + if (gccMatched && Number.parseInt(gccMatched[1], 10) >= 8) + return true + } catch { + // no ops + } + })() + + const wslVersion = isWSL2 ? 2 : 1 + debug('Detected WSL version: %s', wslVersion) + + return wslVersion + } else { + return 0 + } + })().then((correctedIsWsl) => (isWsl = correctedIsWsl)) } - return isWsl + + return await isWsl } export const isChromeInWSLHost = async (chromePath: string | undefined) =>