Version
18.1.0, 14.19.1 (and most likely a lot others)
Platform
Tested on Microsoft Windows NT 10.0.22000.0 x64 but very likely platform independent.
Subsystem
async_hooks
What steps will reproduce the bug?
Use node::MakeCallback() with a receiver different to the AsyncResource.
See e.g. snappy 6.x which uses Nan::AsyncWorker.
In this setup the complete callback is not called with the AsyncResource as target and this results in setting the wrong object as current resource in MakeCallback.
Calling callbacks with undefined/null/global as target is not that uncommon.
The before/after callbacks are called with the correct asyncId but AsyncLocalStore relies on the current resource.
const { executionAsyncId, AsyncLocalStorage } = require("async_hooks")
const snappy = require("snappy")
const als = new AsyncLocalStorage()
als.run(15, () => {
snappy.compress("Hello World!", () => {
const cbId = executionAsyncId()
console.log(`compressed: ${cbId}, als: ${als.getStore()}`)
})
})
How often does it reproduce? Is there a required condition?
Always if MakeCallback is used with a receiver different then the AsyncResource object.
What is the expected behavior?
no context loss
What do you see instead?
context loss
Additional information
No response
Version
18.1.0, 14.19.1 (and most likely a lot others)
Platform
Tested on
Microsoft Windows NT 10.0.22000.0 x64but very likely platform independent.Subsystem
async_hooks
What steps will reproduce the bug?
Use
node::MakeCallback()with a receiver different to theAsyncResource.See e.g. snappy 6.x which uses
Nan::AsyncWorker.In this setup the complete callback is not called with the
AsyncResourceas target and this results in setting the wrong object as current resource inMakeCallback.Calling callbacks with undefined/null/global as target is not that uncommon.
The before/after callbacks are called with the correct asyncId but
AsyncLocalStorerelies on the current resource.How often does it reproduce? Is there a required condition?
Always if
MakeCallbackis used with a receiver different then theAsyncResourceobject.What is the expected behavior?
no context loss
What do you see instead?
context loss
Additional information
No response