Skip to content

Commit 66e2ffc

Browse files
committed
lib: add navigator.platform
1 parent 14af167 commit 66e2ffc

File tree

3 files changed

+132
-0
lines changed

3 files changed

+132
-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

+62
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
'use strict';
22

33
const {
4+
StringPrototypeToUpperCase,
5+
StringPrototypeSlice,
46
ObjectDefineProperties,
57
Symbol,
68
} = primordials;
@@ -20,10 +22,61 @@ const {
2022
const kInitialize = Symbol('kInitialize');
2123
const nodeVersion = process.version;
2224

25+
/**
26+
* @param {Object} process
27+
* @param {string} process.platform
28+
* @param {string} process.arch
29+
* @returns {string}
30+
*/
31+
function getNavigatorPlatform(process) {
32+
if (process.platform === 'darwin') {
33+
// On macOS, modern browsers return 'MacIntel' even if running on Apple Silicon.
34+
return 'MacIntel';
35+
} else if (process.platform === 'win32') {
36+
// On Windows, modern browsers return 'Win32' even if running on a 64-bit version of Windows.
37+
// https://developer.mozilla.org/en-US/docs/Web/API/Navigator/platform#usage_notes
38+
return 'Win32';
39+
} else if (process.platform === 'linux') {
40+
if (process.arch === 'ia32') {
41+
return 'Linux i686';
42+
} else if (process.arch === 'x64') {
43+
return 'Linux x86_64';
44+
} else {
45+
return `Linux ${process.arch}`;
46+
}
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+
} else {
53+
return `FreeBSD ${process.arch}`;
54+
}
55+
} else if (process.platform === 'openbsd') {
56+
if (process.arch === 'ia32') {
57+
return 'OpenBSD i386';
58+
} else if (process.arch === 'x64') {
59+
return 'OpenBSD amd64';
60+
} else {
61+
return `OpenBSD ${process.arch}`;
62+
}
63+
} else if (process.platform === 'sunos') {
64+
if (process.arch === 'ia32') {
65+
return 'SunOS i86pc';
66+
} else {
67+
return `SunOS ${process.arch}`;
68+
}
69+
} else {
70+
// For cases like freebsd, openbsd, sunos, aix etc.
71+
return `${StringPrototypeToUpperCase(process.platform[0])}${StringPrototypeSlice(process.platform, 1)} ${process.arch}`;
72+
}
73+
}
74+
2375
class Navigator {
2476
// Private properties are used to avoid brand validations.
2577
#availableParallelism;
2678
#userAgent = `Node.js/${nodeVersion.slice(1, nodeVersion.indexOf('.'))}`;
79+
#platform = getNavigatorPlatform(process);
2780

2881
constructor() {
2982
if (arguments[0] === kInitialize) {
@@ -46,14 +99,23 @@ class Navigator {
4699
get userAgent() {
47100
return this.#userAgent;
48101
}
102+
103+
/**
104+
* @return {string}
105+
*/
106+
get platform() {
107+
return this.#platform;
108+
}
49109
}
50110

51111
ObjectDefineProperties(Navigator.prototype, {
52112
hardwareConcurrency: kEnumerableProperty,
53113
userAgent: kEnumerableProperty,
114+
platform: kEnumerableProperty,
54115
});
55116

56117
module.exports = {
118+
getNavigatorPlatform,
57119
navigator: new Navigator(kInitialize),
58120
Navigator,
59121
};

test/parallel/test-navigator.js

+55
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,55 @@ 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 {
54+
assert.strictEqual(navigator.platform, `${process.platform[0].toUpperCase()}${process.platform.slice(1)} ${process.arch}`);
55+
}
56+
57+
assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'darwin' }), 'MacIntel');
58+
assert.strictEqual(getNavigatorPlatform({ arch: 'arm64', platform: 'darwin' }), 'MacIntel');
59+
assert.strictEqual(getNavigatorPlatform({ arch: 'ia32', platform: 'linux' }), 'Linux i686');
60+
assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'linux' }), 'Linux x86_64');
61+
assert.strictEqual(getNavigatorPlatform({ arch: 'arm64', platform: 'linux' }), 'Linux arm64');
62+
assert.strictEqual(getNavigatorPlatform({ arch: 'ia32', platform: 'win32' }), 'Win32');
63+
assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'win32' }), 'Win32');
64+
assert.strictEqual(getNavigatorPlatform({ arch: 'arm64', platform: 'win32' }), 'Win32');
65+
assert.strictEqual(getNavigatorPlatform({ arch: 'ia32', platform: 'freebsd' }), 'FreeBSD i386');
66+
assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'freebsd' }), 'FreeBSD amd64');
67+
assert.strictEqual(getNavigatorPlatform({ arch: 'arm64', platform: 'freebsd' }), 'FreeBSD arm64');
68+
assert.strictEqual(getNavigatorPlatform({ arch: 'ia32', platform: 'openbsd' }), 'OpenBSD i386');
69+
assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'openbsd' }), 'OpenBSD amd64');
70+
assert.strictEqual(getNavigatorPlatform({ arch: 'arm64', platform: 'openbsd' }), 'OpenBSD arm64');
71+
assert.strictEqual(getNavigatorPlatform({ arch: 'ia32', platform: 'sunos' }), 'SunOS i86pc');
72+
assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'sunos' }), 'SunOS x64');

0 commit comments

Comments
 (0)