This adds a trackPromises option that allows users to completely opt out of the promise hooks that are installed whenever an async hook is added. For those who do not need to track promises, this avoids the excessive hook invocation and the heavy overhead from it. This option was previously already implemented internally to skip the noise from promise hooks when debugging async operations via the V8 inspector. This patch just exposes it. PR-URL: https://github.com/nodejs/node/pull/61415 Refs: https://github.com/nodejs/node/pull/57148 Reviewed-By: Gerhard Stöbich <deb2001-github@yahoo.de>
62 lines
1.6 KiB
JavaScript
62 lines
1.6 KiB
JavaScript
'use strict';
|
|
|
|
let hook;
|
|
let config;
|
|
|
|
function lazyHookCreation() {
|
|
const inspector = internalBinding('inspector');
|
|
const { createHook } = require('async_hooks');
|
|
config = internalBinding('config');
|
|
|
|
hook = createHook({
|
|
init(asyncId, type, triggerAsyncId, resource) {
|
|
// It's difficult to tell which tasks will be recurring and which won't,
|
|
// therefore we mark all tasks as recurring. Based on the discussion
|
|
// in https://github.com/nodejs/node/pull/13870#discussion_r124515293,
|
|
// this should be fine as long as we call asyncTaskCanceled() too.
|
|
const recurring = true;
|
|
inspector.asyncTaskScheduled(type, asyncId, recurring);
|
|
},
|
|
|
|
before(asyncId) {
|
|
inspector.asyncTaskStarted(asyncId);
|
|
},
|
|
|
|
after(asyncId) {
|
|
inspector.asyncTaskFinished(asyncId);
|
|
},
|
|
|
|
destroy(asyncId) {
|
|
inspector.asyncTaskCanceled(asyncId);
|
|
},
|
|
trackPromises: false,
|
|
});
|
|
}
|
|
|
|
function enable() {
|
|
if (hook === undefined) lazyHookCreation();
|
|
if (config.bits < 64) {
|
|
// V8 Inspector stores task ids as (void*) pointers.
|
|
// async_hooks store ids as 64bit numbers.
|
|
// As a result, we cannot reliably translate async_hook ids to V8 async_task
|
|
// ids on 32bit platforms.
|
|
process.emitWarning(
|
|
'Warning: Async stack traces in debugger are not available ' +
|
|
`on ${config.bits}bit platforms. The feature is disabled.`,
|
|
{
|
|
code: 'INSPECTOR_ASYNC_STACK_TRACES_NOT_AVAILABLE',
|
|
});
|
|
} else {
|
|
hook.enable();
|
|
}
|
|
}
|
|
|
|
function disable() {
|
|
if (hook === undefined) lazyHookCreation();
|
|
hook.disable();
|
|
}
|
|
|
|
module.exports = {
|
|
enable,
|
|
disable,
|
|
};
|