diff --git a/src/api/callback.cc b/src/api/callback.cc index 1fb85c5883f120..f7e7ddedfae377 100644 --- a/src/api/callback.cc +++ b/src/api/callback.cc @@ -139,6 +139,7 @@ void InternalCallbackScope::Close() { } MaybeLocal InternalMakeCallback(Environment* env, + Local resource, Local recv, const Local callback, int argc, @@ -150,7 +151,7 @@ MaybeLocal InternalMakeCallback(Environment* env, CHECK(!argv[i].IsEmpty()); #endif - InternalCallbackScope scope(env, recv, asyncContext); + InternalCallbackScope scope(env, resource, asyncContext); if (scope.Failed()) { return MaybeLocal(); } @@ -224,7 +225,7 @@ MaybeLocal MakeCallback(Isolate* isolate, CHECK_NOT_NULL(env); Context::Scope context_scope(env->context()); MaybeLocal ret = - InternalMakeCallback(env, recv, callback, argc, argv, asyncContext); + InternalMakeCallback(env, recv, recv, callback, argc, argv, asyncContext); if (ret.IsEmpty() && env->async_callback_scope_depth() == 0) { // This is only for legacy compatibility and we may want to look into // removing/adjusting it. diff --git a/src/async_wrap.cc b/src/async_wrap.cc index 3824269a2b48c2..521626b1d77221 100644 --- a/src/async_wrap.cc +++ b/src/async_wrap.cc @@ -749,7 +749,7 @@ MaybeLocal AsyncWrap::MakeCallback(const Local cb, ProviderType provider = provider_type(); async_context context { get_async_id(), get_trigger_async_id() }; MaybeLocal ret = InternalMakeCallback( - env(), object(), cb, argc, argv, context); + env(), GetResource(), object(), cb, argc, argv, context); // This is a static call with cached values because the `this` object may // no longer be alive at this point. diff --git a/src/node_internals.h b/src/node_internals.h index d5fe5f8a15b041..78dccb07636359 100644 --- a/src/node_internals.h +++ b/src/node_internals.h @@ -201,6 +201,7 @@ static v8::MaybeLocal New(Environment* env, v8::MaybeLocal InternalMakeCallback( Environment* env, + v8::Local resource, v8::Local recv, const v8::Local callback, int argc, diff --git a/test/async-hooks/test-async-exec-resource-http-32060.js b/test/async-hooks/test-async-exec-resource-http-32060.js new file mode 100644 index 00000000000000..0ff68aa1070e19 --- /dev/null +++ b/test/async-hooks/test-async-exec-resource-http-32060.js @@ -0,0 +1,37 @@ +'use strict'; +require('../common'); +const assert = require('assert'); +const { + executionAsyncResource, + executionAsyncId, + createHook, +} = require('async_hooks'); +const http = require('http'); + +const hooked = {}; +createHook({ + init(asyncId, type, triggerAsyncId, resource) { + hooked[asyncId] = resource; + } +}).enable(); + +const server = http.createServer((req, res) => { + res.write('hello'); + setTimeout(() => { + res.end(' world!'); + }, 1000); +}); + +server.listen(0, () => { + assert.strictEqual(executionAsyncResource(), hooked[executionAsyncId()]); + http.get({ port: server.address().port }, (res) => { + assert.strictEqual(executionAsyncResource(), hooked[executionAsyncId()]); + res.on('data', () => { + assert.strictEqual(executionAsyncResource(), hooked[executionAsyncId()]); + }); + res.on('end', () => { + assert.strictEqual(executionAsyncResource(), hooked[executionAsyncId()]); + server.close(); + }); + }); +});