| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -637,6 +637,21 @@ logical processors available to the current Node.js instance. | |||
| 637 | 637 | console.log(`This process is running on ${navigator.hardwareConcurrency} logical processors`); | |
| 638 | 638 | ``` | |
| 639 | 639 | ||
| 640 | + ### `navigator.platform` | ||
| 641 | + | ||
| 642 | + <!-- YAML | ||
| 643 | + added: REPLACEME | ||
| 644 | + --> | ||
| 645 | + | ||
| 646 | + * {string} | ||
| 647 | + | ||
| 648 | + The `navigator.platform` read-only property returns a string identifying the | ||
| 649 | + platform on which the Node.js instance is running. | ||
| 650 | + | ||
| 651 | + ```js | ||
| 652 | + console.log(`This process is running on ${navigator.platform}`); | ||
| 653 | + ``` | ||
| 654 | + | ||
| 640 | 655 | ### `navigator.userAgent` | |
| 641 | 656 | ||
| 642 | 657 | <!-- YAML | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -4,6 +4,7 @@ const { | |||
| 4 | 4 | ObjectDefineProperties, | |
| 5 | 5 | StringPrototypeIndexOf, | |
| 6 | 6 | StringPrototypeSlice, | |
| 7 | + StringPrototypeToUpperCase, | ||
| 7 | 8 | Symbol, | |
| 8 | 9 | } = primordials; | |
| 9 | 10 | ||
@@ -22,10 +23,57 @@ const { | |||
| 22 | 23 | const kInitialize = Symbol('kInitialize'); | |
| 23 | 24 | const nodeVersion = process.version; | |
| 24 | 25 | ||
| 26 | + /** | ||
| 27 | + * @param {object} process | ||
| 28 | + * @param {string} process.platform | ||
| 29 | + * @param {string} process.arch | ||
| 30 | + * @returns {string} | ||
| 31 | + */ | ||
| 32 | + function getNavigatorPlatform(process) { | ||
| 33 | + if (process.platform === 'darwin') { | ||
| 34 | + // On macOS, modern browsers return 'MacIntel' even if running on Apple Silicon. | ||
| 35 | + return 'MacIntel'; | ||
| 36 | + } else if (process.platform === 'win32') { | ||
| 37 | + // On Windows, modern browsers return 'Win32' even if running on a 64-bit version of Windows. | ||
| 38 | + // https://developer.mozilla.org/en-US/docs/Web/API/Navigator/platform#usage_notes | ||
| 39 | + return 'Win32'; | ||
| 40 | + } else if (process.platform === 'linux') { | ||
| 41 | + if (process.arch === 'ia32') { | ||
| 42 | + return 'Linux i686'; | ||
| 43 | + } else if (process.arch === 'x64') { | ||
| 44 | + return 'Linux x86_64'; | ||
| 45 | + } | ||
| 46 | + return `Linux ${process.arch}`; | ||
| 47 | + } else if (process.platform === 'freebsd') { | ||
| 48 | + if (process.arch === 'ia32') { | ||
| 49 | + return 'FreeBSD i386'; | ||
| 50 | + } else if (process.arch === 'x64') { | ||
| 51 | + return 'FreeBSD amd64'; | ||
| 52 | + } | ||
| 53 | + return `FreeBSD ${process.arch}`; | ||
| 54 | + } else if (process.platform === 'openbsd') { | ||
| 55 | + if (process.arch === 'ia32') { | ||
| 56 | + return 'OpenBSD i386'; | ||
| 57 | + } else if (process.arch === 'x64') { | ||
| 58 | + return 'OpenBSD amd64'; | ||
| 59 | + } | ||
| 60 | + return `OpenBSD ${process.arch}`; | ||
| 61 | + } else if (process.platform === 'sunos') { | ||
| 62 | + if (process.arch === 'ia32') { | ||
| 63 | + return 'SunOS i86pc'; | ||
| 64 | + } | ||
| 65 | + return `SunOS ${process.arch}`; | ||
| 66 | + } else if (process.platform === 'aix') { | ||
| 67 | + return 'AIX'; | ||
| 68 | + } | ||
| 69 | + return `${StringPrototypeToUpperCase(process.platform[0])}${StringPrototypeSlice(process.platform, 1)} ${process.arch}`; | ||
| 70 | + } | ||
| 71 | + | ||
| 25 | 72 | class Navigator { | |
| 26 | 73 | // Private properties are used to avoid brand validations. | |
| 27 | 74 | #availableParallelism; | |
| 28 | 75 | #userAgent = `Node.js/${StringPrototypeSlice(nodeVersion, 1, StringPrototypeIndexOf(nodeVersion, '.'))}`; | |
| 76 | + #platform = getNavigatorPlatform(process); | ||
| 29 | 77 | ||
| 30 | 78 | constructor() { | |
| 31 | 79 | if (arguments[0] === kInitialize) { | |
@@ -48,14 +96,23 @@ class Navigator { | |||
| 48 | 96 | get userAgent() { | |
| 49 | 97 | return this.#userAgent; | |
| 50 | 98 | } | |
| 99 | + | ||
| 100 | + /** | ||
| 101 | + * @return {string} | ||
| 102 | + */ | ||
| 103 | + get platform() { | ||
| 104 | + return this.#platform; | ||
| 105 | + } | ||
| 51 | 106 | } | |
| 52 | 107 | ||
| 53 | 108 | ObjectDefineProperties(Navigator.prototype, { | |
| 54 | 109 | hardwareConcurrency: kEnumerableProperty, | |
| 55 | 110 | userAgent: kEnumerableProperty, | |
| 111 | + platform: kEnumerableProperty, | ||
| 56 | 112 | }); | |
| 57 | 113 | ||
| 58 | 114 | module.exports = { | |
| 115 | + getNavigatorPlatform, | ||
| 59 | 116 | navigator: new Navigator(kInitialize), | |
| 60 | 117 | Navigator, | |
| 61 | 118 | }; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,7 +1,10 @@ | |||
| 1 | 1 | 'use strict'; | |
| 2 | 2 | ||
| 3 | + // Flags: --expose-internals | ||
| 4 | + | ||
| 3 | 5 | require('../common'); | |
| 4 | 6 | const assert = require('assert'); | |
| 7 | + const { getNavigatorPlatform } = require('internal/navigator'); | ||
| 5 | 8 | ||
| 6 | 9 | const is = { | |
| 7 | 10 | number: (value, key) => { | |
@@ -15,3 +18,59 @@ is.number(navigator.hardwareConcurrency, 'hardwareConcurrency'); | |||
| 15 | 18 | assert.ok(navigator.hardwareConcurrency > 0); | |
| 16 | 19 | assert.strictEqual(typeof navigator.userAgent, 'string'); | |
| 17 | 20 | assert.match(navigator.userAgent, /^Node\.js\/\d+$/); | |
| 21 | + | ||
| 22 | + assert.strictEqual(typeof navigator.platform, 'string'); | ||
| 23 | + if (process.platform === 'darwin') { | ||
| 24 | + assert.strictEqual(navigator.platform, 'MacIntel'); | ||
| 25 | + } else if (process.platform === 'win32') { | ||
| 26 | + assert.strictEqual(navigator.platform, 'Win32'); | ||
| 27 | + } else if (process.platform === 'linux' && process.arch === 'ia32') { | ||
| 28 | + assert.strictEqual(navigator.platform, 'Linux i686'); | ||
| 29 | + } else if (process.platform === 'linux' && process.arch === 'x64') { | ||
| 30 | + assert.strictEqual(navigator.platform, 'Linux x86_64'); | ||
| 31 | + } else if (process.platform === 'freebsd') { | ||
| 32 | + if (process.arch === 'ia32') { | ||
| 33 | + assert.strictEqual(navigator.platform, 'FreeBSD i386'); | ||
| 34 | + } else if (process.arch === 'x64') { | ||
| 35 | + assert.strictEqual(navigator.platform, 'FreeBSD amd64'); | ||
| 36 | + } else { | ||
| 37 | + assert.strictEqual(navigator.platform, `FreeBSD ${process.arch}`); | ||
| 38 | + } | ||
| 39 | + } else if (process.platform === 'openbsd') { | ||
| 40 | + if (process.arch === 'ia32') { | ||
| 41 | + assert.strictEqual(navigator.platform, 'OpenBSD i386'); | ||
| 42 | + } else if (process.arch === 'x64') { | ||
| 43 | + assert.strictEqual(navigator.platform, 'OpenBSD amd64'); | ||
| 44 | + } else { | ||
| 45 | + assert.strictEqual(navigator.platform, `OpenBSD ${process.arch}`); | ||
| 46 | + } | ||
| 47 | + } else if (process.platform === 'sunos') { | ||
| 48 | + if (process.arch === 'ia32') { | ||
| 49 | + assert.strictEqual(navigator.platform, 'SunOS i86pc'); | ||
| 50 | + } else { | ||
| 51 | + assert.strictEqual(navigator.platform, `SunOS ${process.arch}`); | ||
| 52 | + } | ||
| 53 | + } else if (process.platform === 'aix') { | ||
| 54 | + assert.strictEqual(navigator.platform, 'AIX'); | ||
| 55 | + } else { | ||
| 56 | + assert.strictEqual(navigator.platform, `${process.platform[0].toUpperCase()}${process.platform.slice(1)} ${process.arch}`); | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'darwin' }), 'MacIntel'); | ||
| 60 | + assert.strictEqual(getNavigatorPlatform({ arch: 'arm64', platform: 'darwin' }), 'MacIntel'); | ||
| 61 | + assert.strictEqual(getNavigatorPlatform({ arch: 'ia32', platform: 'linux' }), 'Linux i686'); | ||
| 62 | + assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'linux' }), 'Linux x86_64'); | ||
| 63 | + assert.strictEqual(getNavigatorPlatform({ arch: 'arm64', platform: 'linux' }), 'Linux arm64'); | ||
| 64 | + assert.strictEqual(getNavigatorPlatform({ arch: 'ia32', platform: 'win32' }), 'Win32'); | ||
| 65 | + assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'win32' }), 'Win32'); | ||
| 66 | + assert.strictEqual(getNavigatorPlatform({ arch: 'arm64', platform: 'win32' }), 'Win32'); | ||
| 67 | + assert.strictEqual(getNavigatorPlatform({ arch: 'ia32', platform: 'freebsd' }), 'FreeBSD i386'); | ||
| 68 | + assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'freebsd' }), 'FreeBSD amd64'); | ||
| 69 | + assert.strictEqual(getNavigatorPlatform({ arch: 'arm64', platform: 'freebsd' }), 'FreeBSD arm64'); | ||
| 70 | + assert.strictEqual(getNavigatorPlatform({ arch: 'ia32', platform: 'openbsd' }), 'OpenBSD i386'); | ||
| 71 | + assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'openbsd' }), 'OpenBSD amd64'); | ||
| 72 | + assert.strictEqual(getNavigatorPlatform({ arch: 'arm64', platform: 'openbsd' }), 'OpenBSD arm64'); | ||
| 73 | + assert.strictEqual(getNavigatorPlatform({ arch: 'ia32', platform: 'sunos' }), 'SunOS i86pc'); | ||
| 74 | + assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'sunos' }), 'SunOS x64'); | ||
| 75 | + assert.strictEqual(getNavigatorPlatform({ arch: 'ppc', platform: 'aix' }), 'AIX'); | ||
| 76 | + assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'reactos' }), 'Reactos x64'); | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments