diff options
-rw-r--r-- | doc/api/deprecations.md | 9 | ||||
-rw-r--r-- | lib/domain.js | 16 | ||||
-rw-r--r-- | test/addons/make-callback-domain-warning/binding.cc | 31 | ||||
-rw-r--r-- | test/addons/make-callback-domain-warning/binding.gyp | 9 | ||||
-rw-r--r-- | test/addons/make-callback-domain-warning/test.js | 35 |
5 files changed, 100 insertions, 0 deletions
diff --git a/doc/api/deprecations.md b/doc/api/deprecations.md index a5386f7bf0..1f5809624a 100644 --- a/doc/api/deprecations.md +++ b/doc/api/deprecations.md @@ -871,6 +871,15 @@ Type: Runtime `timers.unenroll()` is deprecated. Please use the publicly documented [`clearTimeout()`][] or [`clearInterval()`][] instead. +<a id="DEP0097"></a> +### DEP0097: MakeCallback with domain property + +Type: Runtime + +Users of `MakeCallback` that add the `domain` property to carry context, +should start using the `async_context` variant of `MakeCallback` or +`CallbackScope`, or the the high-level `AsyncResource` class. + [`--pending-deprecation`]: cli.html#cli_pending_deprecation [`Buffer.allocUnsafeSlow(size)`]: buffer.html#buffer_class_method_buffer_allocunsafeslow_size [`Buffer.from(array)`]: buffer.html#buffer_class_method_buffer_from_array diff --git a/lib/domain.js b/lib/domain.js index 08fbd207f1..be109c9ce0 100644 --- a/lib/domain.js +++ b/lib/domain.js @@ -94,13 +94,29 @@ process.setUncaughtExceptionCaptureCallback = function(fn) { throw err; }; + +let sendMakeCallbackDeprecation = false; +function emitMakeCallbackDeprecation() { + if (!sendMakeCallbackDeprecation) { + process.emitWarning( + 'Using a domain property in MakeCallback is deprecated. Use the ' + + 'async_context variant of MakeCallback or the AsyncResource class ' + + 'instead.', 'DeprecationWarning', 'DEP0097'); + sendMakeCallbackDeprecation = true; + } +} + function topLevelDomainCallback(cb, ...args) { const domain = this.domain; + if (exports.active && domain) + emitMakeCallbackDeprecation(); + if (domain) domain.enter(); const ret = Reflect.apply(cb, this, args); if (domain) domain.exit(); + return ret; } diff --git a/test/addons/make-callback-domain-warning/binding.cc b/test/addons/make-callback-domain-warning/binding.cc new file mode 100644 index 0000000000..c42166c745 --- /dev/null +++ b/test/addons/make-callback-domain-warning/binding.cc @@ -0,0 +1,31 @@ +#include "node.h" +#include "v8.h" + +#include <assert.h> + +using v8::Function; +using v8::FunctionCallbackInfo; +using v8::Isolate; +using v8::Local; +using v8::Object; +using v8::Value; + +namespace { + +void MakeCallback(const FunctionCallbackInfo<Value>& args) { + assert(args[0]->IsObject()); + assert(args[1]->IsFunction()); + Isolate* isolate = args.GetIsolate(); + Local<Object> recv = args[0].As<Object>(); + Local<Function> method = args[1].As<Function>(); + + node::MakeCallback(isolate, recv, method, 0, nullptr); +} + +void Initialize(Local<Object> exports) { + NODE_SET_METHOD(exports, "makeCallback", MakeCallback); +} + +} // namespace + +NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize) diff --git a/test/addons/make-callback-domain-warning/binding.gyp b/test/addons/make-callback-domain-warning/binding.gyp new file mode 100644 index 0000000000..7ede63d94a --- /dev/null +++ b/test/addons/make-callback-domain-warning/binding.gyp @@ -0,0 +1,9 @@ +{ + 'targets': [ + { + 'target_name': 'binding', + 'defines': [ 'V8_DEPRECATION_WARNINGS=1' ], + 'sources': [ 'binding.cc' ] + } + ] +} diff --git a/test/addons/make-callback-domain-warning/test.js b/test/addons/make-callback-domain-warning/test.js new file mode 100644 index 0000000000..2ea3c3f3d1 --- /dev/null +++ b/test/addons/make-callback-domain-warning/test.js @@ -0,0 +1,35 @@ +'use strict'; + +const common = require('../../common'); +const assert = require('assert'); +const domain = require('domain'); +const binding = require(`./build/${common.buildType}/binding`); + +function makeCallback(object, cb) { + binding.makeCallback(object, () => setImmediate(cb)); +} + +let latestWarning = null; +process.on('warning', function(warning) { + latestWarning = warning; +}); + +const d = domain.create(); + +// When domain is disabled, no warning will be emitted +makeCallback({ domain: d }, common.mustCall(function() { + assert.strictEqual(latestWarning, null); + + d.run(common.mustCall(function() { + // No warning will be emitted when no domain property is applied + makeCallback({}, common.mustCall(function() { + assert.strictEqual(latestWarning, null); + + // Warning is emitted when domain property is used and domain is enabled + makeCallback({ domain: d }, common.mustCall(function() { + assert.strictEqual(latestWarning.name, 'DeprecationWarning'); + assert.strictEqual(latestWarning.code, 'DEP0097'); + })); + })); + })); +})); |