react-admin-kit
Version:
A react based UI components for admin system
166 lines (161 loc) • 6.76 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.setupGlobalErrorHandling = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
// 类型定义
// 扩展全局 Error 构造函数的类型定义
// 扩展的错误类
var ExtendedError = /*#__PURE__*/function (_Error) {
(0, _inherits2.default)(ExtendedError, _Error);
var _super = (0, _createSuper2.default)(ExtendedError);
function ExtendedError(message) {
var _this;
(0, _classCallCheck2.default)(this, ExtendedError);
_this = _super.call(this, message);
_this.name = _this.constructor.name;
if (Error.captureStackTrace) {
Error.captureStackTrace((0, _assertThisInitialized2.default)(_this), _this.constructor);
}
return _this;
}
return (0, _createClass2.default)(ExtendedError);
}( /*#__PURE__*/(0, _wrapNativeSuper2.default)(Error)); // 简化的警告配置,直接添加需要忽略的消息字符串即可
var IGNORED_WARNING_MESSAGES = ['`bordered` is deprecated', 'Warning: findDOMNode is deprecated', 'antd: Form.Item'];
// 默认配置
var DEFAULT_CONFIG = {
maxErrorsPerSecond: 10,
enableConsoleOverride: true,
ignoredWarnings: IGNORED_WARNING_MESSAGES
};
// 简化的警告过滤器
var WarningFilter = /*#__PURE__*/function () {
function WarningFilter() {
(0, _classCallCheck2.default)(this, WarningFilter);
}
(0, _createClass2.default)(WarningFilter, null, [{
key: "shouldIgnore",
value: function shouldIgnore(message) {
if (typeof message !== 'string') return false;
return IGNORED_WARNING_MESSAGES.some(function (warningMsg) {
return message.includes(warningMsg);
});
}
}]);
return WarningFilter;
}(); // 错误限流器
var ErrorThrottler = /*#__PURE__*/function () {
function ErrorThrottler(maxErrorsPerSecond) {
(0, _classCallCheck2.default)(this, ErrorThrottler);
(0, _defineProperty2.default)(this, "errorCount", 0);
(0, _defineProperty2.default)(this, "lastErrorTime", 0);
this.maxErrorsPerSecond = maxErrorsPerSecond;
}
(0, _createClass2.default)(ErrorThrottler, [{
key: "shouldThrottle",
value: function shouldThrottle() {
var now = Date.now();
if (now - this.lastErrorTime > 1000) {
this.errorCount = 0;
this.lastErrorTime = now;
}
if (this.errorCount >= this.maxErrorsPerSecond) {
return true;
}
this.errorCount++;
return false;
}
}]);
return ErrorThrottler;
}(); // 错误处理器
var ErrorHandler = /*#__PURE__*/function () {
function ErrorHandler(customHandler) {
var maxErrorsPerSecond = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10;
(0, _classCallCheck2.default)(this, ErrorHandler);
(0, _defineProperty2.default)(this, "isHandlingError", false);
(0, _defineProperty2.default)(this, "throttler", void 0);
(0, _defineProperty2.default)(this, "defaultHandler", function (error, errorInfo) {
console.error('Caught an error:', error, errorInfo);
});
this.customHandler = customHandler;
this.throttler = new ErrorThrottler(maxErrorsPerSecond);
}
(0, _createClass2.default)(ErrorHandler, [{
key: "handle",
value: function handle(error, errorInfo) {
if (this.throttler.shouldThrottle()) {
console.warn('Too many errors, throttling error handling');
return;
}
if (this.isHandlingError) {
console.warn('Error occurred while handling another error, skipping to prevent potential infinite loop');
return;
}
this.isHandlingError = true;
try {
if (this.customHandler) {
this.customHandler(error, errorInfo);
} else {
this.defaultHandler(error, errorInfo);
}
} catch (handlerError) {
console.error('Error occurred in error handler:', handlerError);
} finally {
this.isHandlingError = false;
}
}
}]);
return ErrorHandler;
}();
/**
* @description: 全局运行时异常处理
* @param {ErrorHandlerFunction} customErrorHandler
* @param {Partial<ErrorHandlingConfig>} config
*/
var setupGlobalErrorHandling = exports.setupGlobalErrorHandling = function setupGlobalErrorHandling(customErrorHandler) {
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var finalConfig = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, DEFAULT_CONFIG), config);
var errorHandler = new ErrorHandler(customErrorHandler, finalConfig.maxErrorsPerSecond);
// 设置 window.onerror 处理器
window.onerror = function (message, source, lineno, colno, error) {
errorHandler.handle(error || new Error(message), "window.onerror: ".concat(source, ":").concat(lineno, ":").concat(colno));
return true;
};
// 设置 unhandledrejection 事件处理器
window.addEventListener('unhandledrejection', function (event) {
errorHandler.handle(event.reason, 'unhandledPromiseRejection');
});
if (finalConfig.enableConsoleOverride) {
// 重写 console 方法
var originalConsoleError = console.error;
var originalConsoleWarn = console.warn;
console.warn = function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
if (WarningFilter.shouldIgnore(args[0])) return;
originalConsoleWarn.apply(console, args);
};
console.error = function () {
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
if (WarningFilter.shouldIgnore(args[0])) return;
errorHandler.handle(args[0] instanceof Error ? args[0] : new Error(args.join(' ')), 'console.error');
originalConsoleError.apply(console, args);
};
}
return {
ExtendedError: ExtendedError,
handleError: errorHandler.handle.bind(errorHandler)
};
};