UNPKG

nstdlib-nightly

Version:

Node.js standard library converted to runtime-agnostic ES modules.

128 lines (114 loc) 3.34 kB
// Source: https://github.com/nodejs/node/blob/65eff1eb/lib/internal/navigator.js import { codes as __codes__ } from "nstdlib/lib/internal/errors"; import { kEnumerableProperty } from "nstdlib/lib/internal/util"; import { getAvailableParallelism } from "nstdlib/stub/binding/os"; import { platform, arch, version as nodeVersion, } from "nstdlib/lib/internal/process/per_thread"; import { language } from "nstdlib/stub/binding/config"; const { ERR_ILLEGAL_CONSTRUCTOR } = __codes__; const kInitialize = Symbol("kInitialize"); /** * @param {string} arch * @param {string} platform * @returns {string} */ function getNavigatorPlatform(arch, platform) { if (platform === "darwin") { // On macOS, modern browsers return 'MacIntel' even if running on Apple Silicon. return "MacIntel"; } else if (platform === "win32") { // On Windows, modern browsers return 'Win32' even if running on a 64-bit version of Windows. // https://developer.mozilla.org/en-US/docs/Web/API/Navigator/platform#usage_notes return "Win32"; } else if (platform === "linux") { if (arch === "ia32") { return "Linux i686"; } else if (arch === "x64") { return "Linux x86_64"; } return `Linux ${arch}`; } else if (platform === "freebsd") { if (arch === "ia32") { return "FreeBSD i386"; } else if (arch === "x64") { return "FreeBSD amd64"; } return `FreeBSD ${arch}`; } else if (platform === "openbsd") { if (arch === "ia32") { return "OpenBSD i386"; } else if (arch === "x64") { return "OpenBSD amd64"; } return `OpenBSD ${arch}`; } else if (platform === "sunos") { if (arch === "ia32") { return "SunOS i86pc"; } return `SunOS ${arch}`; } else if (platform === "aix") { return "AIX"; } return `${String.prototype.toUpperCase.call(platform[0])}${String.prototype.slice.call(platform, 1)} ${arch}`; } class Navigator { // Private properties are used to avoid brand validations. #availableParallelism; #userAgent; #platform; #languages; constructor() { if (arguments[0] === kInitialize) { return; } throw new ERR_ILLEGAL_CONSTRUCTOR(); } /** * @return {number} */ get hardwareConcurrency() { this.#availableParallelism ??= getAvailableParallelism(); return this.#availableParallelism; } /** * @return {string} */ get language() { return language; } /** * @return {Array<string>} */ get languages() { this.#languages ??= Object.freeze([this.language]); return this.#languages; } /** * @return {string} */ get userAgent() { this.#userAgent ??= `Node.js/${String.prototype.slice.call(nodeVersion, 1, String.prototype.indexOf.call(nodeVersion, "."))}`; return this.#userAgent; } /** * @return {string} */ get platform() { this.#platform ??= getNavigatorPlatform(arch, platform); return this.#platform; } } Object.defineProperties(Navigator.prototype, { hardwareConcurrency: kEnumerableProperty, language: kEnumerableProperty, languages: kEnumerableProperty, userAgent: kEnumerableProperty, platform: kEnumerableProperty, }); export { getNavigatorPlatform }; const _export_navigator_ = new Navigator(kInitialize); export { _export_navigator_ as navigator }; export { Navigator };