Skip to content

Commit 49ad916

Browse files
Uzlopaktargos
authored andcommitted
lib: add navigator.platform
PR-URL: #50385 Reviewed-By: Geoffrey Booth <webadmin@geoffreybooth.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent f8edbf0 commit 49ad916

File tree

3 files changed

+131
-0
lines changed

3 files changed

+131
-0
lines changed

doc/api/globals.md

+15
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,21 @@ logical processors available to the current Node.js instance.
637637
console.log(`This process is running on ${navigator.hardwareConcurrency} logical processors`);
638638
```
639639

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+
640655
### `navigator.userAgent`
641656

642657
<!-- YAML

lib/internal/navigator.js

+57
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const {
44
ObjectDefineProperties,
55
StringPrototypeIndexOf,
66
StringPrototypeSlice,
7+
StringPrototypeToUpperCase,
78
Symbol,
89
} = primordials;
910

@@ -22,10 +23,57 @@ const {
2223
const kInitialize = Symbol('kInitialize');
2324
const nodeVersion = process.version;
2425

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+
2572
class Navigator {
2673
// Private properties are used to avoid brand validations.
2774
#availableParallelism;
2875
#userAgent = `Node.js/${StringPrototypeSlice(nodeVersion, 1, StringPrototypeIndexOf(nodeVersion, '.'))}`;
76+
#platform = getNavigatorPlatform(process);
2977

3078
constructor() {
3179
if (arguments[0] === kInitialize) {
@@ -48,14 +96,23 @@ class Navigator {
4896
get userAgent() {
4997
return this.#userAgent;
5098
}
99+
100+
/**
101+
* @return {string}
102+
*/
103+
get platform() {
104+
return this.#platform;
105+
}
51106
}
52107

53108
ObjectDefineProperties(Navigator.prototype, {
54109
hardwareConcurrency: kEnumerableProperty,
55110
userAgent: kEnumerableProperty,
111+
platform: kEnumerableProperty,
56112
});
57113

58114
module.exports = {
115+
getNavigatorPlatform,
59116
navigator: new Navigator(kInitialize),
60117
Navigator,
61118
};

test/parallel/test-navigator.js

+59
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
'use strict';
22

3+
// Flags: --expose-internals
4+
35
require('../common');
46
const assert = require('assert');
7+
const { getNavigatorPlatform } = require('internal/navigator');
58

69
const is = {
710
number: (value, key) => {
@@ -15,3 +18,59 @@ is.number(navigator.hardwareConcurrency, 'hardwareConcurrency');
1518
assert.ok(navigator.hardwareConcurrency > 0);
1619
assert.strictEqual(typeof navigator.userAgent, 'string');
1720
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');

0 commit comments

Comments
 (0)