From 473572ea2512cbe71e3423f8094657986352c32d Mon Sep 17 00:00:00 2001 From: James M Snell Date: Tue, 25 Apr 2017 14:48:32 -0700 Subject: [PATCH] os: refactor os structure, add Symbol.toPrimitive Refactor the structure of the os module to use more efficient module.exports = {} pattern. Add Symbol.toPrimitive support to os methods that return simple primitives. This is a minor tweak that makes using these slightly more friendly when doing things like: ```js var m = `${os.tmpdir}/foo` ``` PR-URL: https://github.com/nodejs/node/pull/12654 Reviewed-By: Daijiro Wachi Reviewed-By: Alexey Orlenko Reviewed-By: Anna Henningsen Reviewed-By: Benjamin Gruenbaum --- lib/os.js | 123 +++++++++++++++++++++++++-------------- test/parallel/test-os.js | 9 +++ 2 files changed, 88 insertions(+), 44 deletions(-) diff --git a/lib/os.js b/lib/os.js index 7de2e79c153e5b..4a99cab81e3e34 100644 --- a/lib/os.js +++ b/lib/os.js @@ -21,31 +21,50 @@ 'use strict'; -const binding = process.binding('os'); -const getCPUs = binding.getCPUs; -const getLoadAvg = binding.getLoadAvg; const pushValToArrayMax = process.binding('util').pushValToArrayMax; const constants = process.binding('constants').os; -const internalUtil = require('internal/util'); +const deprecate = require('internal/util').deprecate; const isWindows = process.platform === 'win32'; -exports.hostname = binding.getHostname; -exports.uptime = binding.getUptime; -exports.freemem = binding.getFreeMem; -exports.totalmem = binding.getTotalMem; -exports.type = binding.getOSType; -exports.release = binding.getOSRelease; -exports.networkInterfaces = binding.getInterfaceAddresses; -exports.homedir = binding.getHomeDirectory; -exports.userInfo = binding.getUserInfo; +const { + getCPUs, + getFreeMem, + getHomeDirectory, + getHostname, + getInterfaceAddresses, + getLoadAvg, + getOSRelease, + getOSType, + getTotalMem, + getUserInfo, + getUptime, + isBigEndian +} = process.binding('os'); + +getFreeMem[Symbol.toPrimitive] = () => getFreeMem(); +getHostname[Symbol.toPrimitive] = () => getHostname(); +getHomeDirectory[Symbol.toPrimitive] = () => getHomeDirectory(); +getOSRelease[Symbol.toPrimitive] = () => getOSRelease(); +getOSType[Symbol.toPrimitive] = () => getOSType(); +getTotalMem[Symbol.toPrimitive] = () => getTotalMem(); +getUptime[Symbol.toPrimitive] = () => getUptime(); + +const kEndianness = isBigEndian ? 'BE' : 'LE'; + +const tmpDirDeprecationMsg = + 'os.tmpDir() is deprecated. Use os.tmpdir() instead.'; + +const getNetworkInterfacesDepMsg = + 'os.getNetworkInterfaces is deprecated. Use os.networkInterfaces instead.'; const avgValues = new Float64Array(3); -exports.loadavg = function loadavg() { +const cpuValues = new Float64Array(6 * pushValToArrayMax); + +function loadavg() { getLoadAvg(avgValues); return [avgValues[0], avgValues[1], avgValues[2]]; -}; +} -const cpuValues = new Float64Array(6 * pushValToArrayMax); function addCPUInfo() { for (var i = 0, c = 0; i < arguments.length; ++i, c += 6) { this[this.length] = { @@ -61,25 +80,22 @@ function addCPUInfo() { }; } } -exports.cpus = function cpus() { - return getCPUs(addCPUInfo, cpuValues, []); -}; -Object.defineProperty(exports, 'constants', { - configurable: false, - enumerable: true, - value: constants -}); +function cpus() { + return getCPUs(addCPUInfo, cpuValues, []); +} -exports.arch = function() { +function arch() { return process.arch; -}; +} +arch[Symbol.toPrimitive] = () => process.arch; -exports.platform = function() { +function platform() { return process.platform; -}; +} +platform[Symbol.toPrimitive] = () => process.platform; -exports.tmpdir = function() { +function tmpdir() { var path; if (isWindows) { path = process.env.TEMP || @@ -97,22 +113,41 @@ exports.tmpdir = function() { } return path; -}; +} +tmpdir[Symbol.toPrimitive] = () => tmpdir(); -const tmpDirDeprecationMsg = - 'os.tmpDir() is deprecated. Use os.tmpdir() instead.'; -exports.tmpDir = internalUtil.deprecate(exports.tmpdir, - tmpDirDeprecationMsg, - 'DEP0022'); +function endianness() { + return kEndianness; +} +endianness[Symbol.toPrimitive] = () => kEndianness; -exports.getNetworkInterfaces = internalUtil.deprecate(function() { - return exports.networkInterfaces(); -}, 'os.getNetworkInterfaces is deprecated. ' + - 'Use os.networkInterfaces instead.', 'DEP0023'); +module.exports = exports = { + arch, + cpus, + EOL: isWindows ? '\r\n' : '\n', + endianness, + freemem: getFreeMem, + homedir: getHomeDirectory, + hostname: getHostname, + loadavg, + networkInterfaces: getInterfaceAddresses, + platform, + release: getOSRelease, + tmpdir, + totalmem: getTotalMem, + type: getOSType, + userInfo: getUserInfo, + uptime: getUptime, -exports.EOL = isWindows ? '\r\n' : '\n'; + // Deprecated APIs + getNetworkInterfaces: deprecate(getInterfaceAddresses, + getNetworkInterfacesDepMsg, + 'DEP0023'), + tmpDir: deprecate(tmpdir, tmpDirDeprecationMsg, 'DEP0022') +}; -if (binding.isBigEndian) - exports.endianness = function() { return 'BE'; }; -else - exports.endianness = function() { return 'LE'; }; +Object.defineProperty(module.exports, 'constants', { + configurable: false, + enumerable: true, + value: constants +}); diff --git a/test/parallel/test-os.js b/test/parallel/test-os.js index 1c92100818c6e6..6b76d7506d6031 100644 --- a/test/parallel/test-os.js +++ b/test/parallel/test-os.js @@ -191,3 +191,12 @@ is.string(pwd.username); assert.ok(pwd.homedir.includes(path.sep)); assert.strictEqual(pwd.username, pwdBuf.username.toString('utf8')); assert.strictEqual(pwd.homedir, pwdBuf.homedir.toString('utf8')); + +// Test that the Symbol.toPrimitive functions work correctly +[ + [`${os.hostname}`, os.hostname()], + [`${os.homedir}`, os.homedir()], + [`${os.release}`, os.release()], + [`${os.type}`, os.type()], + [`${os.endianness}`, os.endianness()] +].forEach((set) => assert.strictEqual(set[0], set[1]));