diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js index 02a9a008d806ef..538acb1e212633 100644 --- a/lib/internal/bootstrap/node.js +++ b/lib/internal/bootstrap/node.js @@ -306,6 +306,24 @@ function startup() { 'process.assert() is deprecated. Please use the `assert` module instead.', 'DEP0100'); + // TODO(joyeecheung): this property has not been well-maintained, should we + // deprecate it in favor of a better API? + const { isDebugBuild, hasOpenSSL } = internalBinding('config'); + Object.defineProperty(process, 'features', { + enumerable: true, + writable: false, + configurable: false, + value: { + debug: isDebugBuild, + uv: true, + ipv6: true, // TODO(bnoordhuis) ping libuv + tls_alpn: hasOpenSSL, + tls_sni: hasOpenSSL, + tls_ocsp: hasOpenSSL, + tls: hasOpenSSL + } + }); + const perf = internalBinding('performance'); const { NODE_PERFORMANCE_MILESTONE_BOOTSTRAP_COMPLETE, diff --git a/src/node.cc b/src/node.cc index f906b887fe8c04..e86fbb2459aa53 100644 --- a/src/node.cc +++ b/src/node.cc @@ -809,49 +809,6 @@ static void OnMessage(Local message, Local error) { } } -static Local GetFeatures(Environment* env) { - EscapableHandleScope scope(env->isolate()); - - Local obj = Object::New(env->isolate()); -#if defined(DEBUG) && DEBUG - Local debug = True(env->isolate()); -#else - Local debug = False(env->isolate()); -#endif // defined(DEBUG) && DEBUG - - obj->Set(env->context(), - FIXED_ONE_BYTE_STRING(env->isolate(), "debug"), - debug).FromJust(); - obj->Set(env->context(), - FIXED_ONE_BYTE_STRING(env->isolate(), "uv"), - True(env->isolate())).FromJust(); - // TODO(bnoordhuis) ping libuv - obj->Set(env->context(), - FIXED_ONE_BYTE_STRING(env->isolate(), "ipv6"), - True(env->isolate())).FromJust(); - -#ifdef HAVE_OPENSSL - Local have_openssl = True(env->isolate()); -#else - Local have_openssl = False(env->isolate()); -#endif - - obj->Set(env->context(), - FIXED_ONE_BYTE_STRING(env->isolate(), "tls_alpn"), - have_openssl).FromJust(); - obj->Set(env->context(), - FIXED_ONE_BYTE_STRING(env->isolate(), "tls_sni"), - have_openssl).FromJust(); - obj->Set(env->context(), - FIXED_ONE_BYTE_STRING(env->isolate(), "tls_ocsp"), - have_openssl).FromJust(); - obj->Set(env->context(), - FIXED_ONE_BYTE_STRING(env->isolate(), "tls"), - have_openssl).FromJust(); - - return scope.Escape(obj); -} - void SetupProcessObject(Environment* env, const std::vector& args, const std::vector& exec_args) { @@ -934,7 +891,6 @@ void SetupProcessObject(Environment* env, READONLY_PROPERTY(process, "pid", Integer::New(env->isolate(), uv_os_getpid())); - READONLY_PROPERTY(process, "features", GetFeatures(env)); CHECK(process->SetAccessor(env->context(), FIXED_ONE_BYTE_STRING(env->isolate(), "ppid"), diff --git a/src/node_config.cc b/src/node_config.cc index 1ba1fe9d277af5..9c94b334fbd426 100644 --- a/src/node_config.cc +++ b/src/node_config.cc @@ -26,6 +26,18 @@ static void Initialize(Local target, Environment* env = Environment::GetCurrent(context); Isolate* isolate = env->isolate(); +#if defined(DEBUG) && DEBUG + READONLY_TRUE_PROPERTY(target, "isDebugBuild"); +#else + READONLY_FALSE_PROPERTY(target, "isDebugBuild"); +#endif // defined(DEBUG) && DEBUG + +#if HAVE_OPENSSL + READONLY_TRUE_PROPERTY(target, "hasOpenSSL"); +#else + READONLY_FALSE_PROPERTY(target, "hasOpenSSL"); +#endif // HAVE_OPENSSL + #ifdef NODE_FIPS_MODE READONLY_TRUE_PROPERTY(target, "fipsMode"); // TODO(addaleax): Use options parser variable instead. diff --git a/src/util.h b/src/util.h index b1a135b46dc2a9..ffa5a308a7788f 100644 --- a/src/util.h +++ b/src/util.h @@ -555,8 +555,11 @@ inline v8::MaybeLocal ToV8Value(v8::Local context, .FromJust(); \ } while (0) +#define READONLY_FALSE_PROPERTY(obj, name) \ + READONLY_PROPERTY(obj, name, v8::False(isolate)) + #define READONLY_TRUE_PROPERTY(obj, name) \ - READONLY_PROPERTY(obj, name, True(isolate)) + READONLY_PROPERTY(obj, name, v8::True(isolate)) #define READONLY_STRING_PROPERTY(obj, name, str) \ READONLY_PROPERTY(obj, name, ToV8Value(context, str).ToLocalChecked()) diff --git a/test/parallel/test-process-features.js b/test/parallel/test-process-features.js new file mode 100644 index 00000000000000..7752cc53b2a1ca --- /dev/null +++ b/test/parallel/test-process-features.js @@ -0,0 +1,20 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); + +const keys = new Set(Object.keys(process.features)); + +assert.deepStrictEqual(keys, new Set([ + 'debug', + 'uv', + 'ipv6', + 'tls_alpn', + 'tls_sni', + 'tls_ocsp', + 'tls' +])); + +for (const key of keys) { + assert.strictEqual(typeof process.features[key], 'boolean'); +}