58 lines
1.5 KiB
JavaScript
58 lines
1.5 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
function NextTickWrap() {}
|
||
|
|
||
|
module.exports = function patch() {
|
||
|
const hooks = this._hooks;
|
||
|
const state = this._state;
|
||
|
|
||
|
const oldNextTick = process.nextTick;
|
||
|
process.nextTick = function () {
|
||
|
if (!state.enabled) return oldNextTick.apply(process, arguments);
|
||
|
|
||
|
const args = new Array(arguments.length);
|
||
|
for (let i = 0; i < arguments.length; i++) {
|
||
|
args[i] = arguments[i];
|
||
|
}
|
||
|
const callback = args[0];
|
||
|
|
||
|
if (typeof callback !== 'function') {
|
||
|
throw new TypeError('callback is not a function');
|
||
|
}
|
||
|
|
||
|
const handle = new NextTickWrap();
|
||
|
const uid = --state.counter;
|
||
|
|
||
|
// call the init hook
|
||
|
hooks.init.call(handle, uid, 0, null, null);
|
||
|
|
||
|
// overwrite callback
|
||
|
args[0] = function () {
|
||
|
// call the pre hook
|
||
|
hooks.pre.call(handle, uid);
|
||
|
|
||
|
let didThrow = true;
|
||
|
try {
|
||
|
callback.apply(this, arguments);
|
||
|
didThrow = false;
|
||
|
} finally {
|
||
|
// If `callback` threw and there is an uncaughtException handler
|
||
|
// then call the `post` and `destroy` hook after the uncaughtException
|
||
|
// user handlers have been invoked.
|
||
|
if(didThrow && process.listenerCount('uncaughtException') > 0) {
|
||
|
process.once('uncaughtException', function () {
|
||
|
hooks.post.call(handle, uid, true);
|
||
|
hooks.destroy.call(null, uid);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// callback done successfully
|
||
|
hooks.post.call(handle, uid, false);
|
||
|
hooks.destroy.call(null, uid);
|
||
|
};
|
||
|
|
||
|
return oldNextTick.apply(process, args);
|
||
|
};
|
||
|
}
|