mirror of
https://github.com/nodejs/node.git
synced 2024-12-01 16:10:02 +01:00
8a60be4f0f
- Instead of passing triggerFatalException through node.js, simply put it on `internalBinding('util')` which has to be loaded anyway. - Expose the implementation of `queueMicrotask` directly instead of through an unnecessary factory function. PR-URL: https://github.com/nodejs/node/pull/25189 Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
39 lines
1.0 KiB
JavaScript
39 lines
1.0 KiB
JavaScript
'use strict';
|
|
|
|
const { ERR_INVALID_ARG_TYPE } = require('internal/errors').codes;
|
|
const { AsyncResource } = require('async_hooks');
|
|
const { getDefaultTriggerAsyncId } = require('internal/async_hooks');
|
|
const {
|
|
enqueueMicrotask,
|
|
triggerFatalException
|
|
} = internalBinding('util');
|
|
|
|
function queueMicrotask(callback) {
|
|
if (typeof callback !== 'function') {
|
|
throw new ERR_INVALID_ARG_TYPE('callback', 'function', callback);
|
|
}
|
|
|
|
const asyncResource = new AsyncResource('Microtask', {
|
|
triggerAsyncId: getDefaultTriggerAsyncId(),
|
|
requireManualDestroy: true,
|
|
});
|
|
|
|
enqueueMicrotask(() => {
|
|
asyncResource.runInAsyncScope(() => {
|
|
try {
|
|
callback();
|
|
} catch (error) {
|
|
// TODO(devsnek) remove this if
|
|
// https://bugs.chromium.org/p/v8/issues/detail?id=8326
|
|
// is resolved such that V8 triggers the fatal exception
|
|
// handler for microtasks
|
|
triggerFatalException(error);
|
|
} finally {
|
|
asyncResource.emitDestroy();
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
module.exports = { queueMicrotask };
|