nstdlib-nightly
Version:
Node.js standard library converted to runtime-agnostic ES modules.
128 lines (114 loc) • 3.34 kB
JavaScript
// 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 };