wallet-core/node_modules/promise/domains/rejection-tracking.js

113 lines
2.8 KiB
JavaScript
Raw Normal View History

2016-10-10 03:43:44 +02:00
'use strict';
var Promise = require('./core');
var DEFAULT_WHITELIST = [
ReferenceError,
TypeError,
RangeError
];
var enabled = false;
exports.disable = disable;
function disable() {
enabled = false;
2017-12-10 21:51:33 +01:00
Promise._47 = null;
Promise._71 = null;
2016-10-10 03:43:44 +02:00
}
exports.enable = enable;
function enable(options) {
options = options || {};
if (enabled) disable();
enabled = true;
var id = 0;
var displayId = 0;
var rejections = {};
2017-12-10 21:51:33 +01:00
Promise._47 = function (promise) {
2016-10-10 03:43:44 +02:00
if (
2017-12-10 21:51:33 +01:00
promise._83 === 2 && // IS REJECTED
rejections[promise._56]
2016-10-10 03:43:44 +02:00
) {
2017-12-10 21:51:33 +01:00
if (rejections[promise._56].logged) {
onHandled(promise._56);
2016-10-10 03:43:44 +02:00
} else {
2017-12-10 21:51:33 +01:00
clearTimeout(rejections[promise._56].timeout);
2016-10-10 03:43:44 +02:00
}
2017-12-10 21:51:33 +01:00
delete rejections[promise._56];
2016-10-10 03:43:44 +02:00
}
};
2017-12-10 21:51:33 +01:00
Promise._71 = function (promise, err) {
if (promise._75 === 0) { // not yet handled
promise._56 = id++;
rejections[promise._56] = {
2016-10-10 03:43:44 +02:00
displayId: null,
error: err,
timeout: setTimeout(
2017-12-10 21:51:33 +01:00
onUnhandled.bind(null, promise._56),
2016-10-10 03:43:44 +02:00
// For reference errors and type errors, this almost always
// means the programmer made a mistake, so log them after just
// 100ms
// otherwise, wait 2 seconds to see if they get handled
matchWhitelist(err, DEFAULT_WHITELIST)
? 100
: 2000
),
logged: false
};
}
};
function onUnhandled(id) {
if (
options.allRejections ||
matchWhitelist(
rejections[id].error,
options.whitelist || DEFAULT_WHITELIST
)
) {
rejections[id].displayId = displayId++;
if (options.onUnhandled) {
rejections[id].logged = true;
options.onUnhandled(
rejections[id].displayId,
rejections[id].error
);
} else {
rejections[id].logged = true;
logError(
rejections[id].displayId,
rejections[id].error
);
}
}
}
function onHandled(id) {
if (rejections[id].logged) {
if (options.onHandled) {
options.onHandled(rejections[id].displayId, rejections[id].error);
} else if (!rejections[id].onUnhandled) {
console.warn(
'Promise Rejection Handled (id: ' + rejections[id].displayId + '):'
);
console.warn(
' This means you can ignore any previous messages of the form "Possible Unhandled Promise Rejection" with id ' +
rejections[id].displayId + '.'
);
}
}
}
}
function logError(id, error) {
console.warn('Possible Unhandled Promise Rejection (id: ' + id + '):');
var errStr = (error && (error.stack || error)) + '';
errStr.split('\n').forEach(function (line) {
console.warn(' ' + line);
});
}
function matchWhitelist(error, list) {
return list.some(function (cls) {
return error instanceof cls;
});
}