mirror of
https://github.com/basicswap/basicswap.git
synced 2026-02-28 00:25:11 +01:00
216 lines
6.4 KiB
JavaScript
216 lines
6.4 KiB
JavaScript
const ErrorHandler = (function() {
|
|
const config = {
|
|
logErrors: true,
|
|
throwErrors: false,
|
|
errorCallbacks: []
|
|
};
|
|
|
|
function formatError(error, context) {
|
|
const timestamp = new Date().toISOString();
|
|
const contextStr = context ? ` [${context}]` : '';
|
|
|
|
if (error instanceof Error) {
|
|
return `${timestamp}${contextStr} ${error.name}: ${error.message}`;
|
|
}
|
|
|
|
return `${timestamp}${contextStr} ${String(error)}`;
|
|
}
|
|
|
|
function notifyCallbacks(error, context) {
|
|
config.errorCallbacks.forEach(callback => {
|
|
try {
|
|
callback(error, context);
|
|
} catch (e) {
|
|
console.error('[ErrorHandler] Error in callback:', e);
|
|
}
|
|
});
|
|
}
|
|
|
|
return {
|
|
configure: function(options = {}) {
|
|
Object.assign(config, options);
|
|
return this;
|
|
},
|
|
|
|
addCallback: function(callback) {
|
|
if (typeof callback === 'function') {
|
|
config.errorCallbacks.push(callback);
|
|
}
|
|
return this;
|
|
},
|
|
|
|
removeCallback: function(callback) {
|
|
const index = config.errorCallbacks.indexOf(callback);
|
|
if (index > -1) {
|
|
config.errorCallbacks.splice(index, 1);
|
|
}
|
|
return this;
|
|
},
|
|
|
|
safeExecute: function(fn, context = null, fallbackValue = null) {
|
|
try {
|
|
return fn();
|
|
} catch (error) {
|
|
if (config.logErrors) {
|
|
console.error(formatError(error, context));
|
|
}
|
|
|
|
notifyCallbacks(error, context);
|
|
|
|
if (config.throwErrors) {
|
|
throw error;
|
|
}
|
|
|
|
return fallbackValue;
|
|
}
|
|
},
|
|
|
|
safeExecuteAsync: async function(fn, context = null, fallbackValue = null) {
|
|
try {
|
|
return await fn();
|
|
} catch (error) {
|
|
if (config.logErrors) {
|
|
console.error(formatError(error, context));
|
|
}
|
|
|
|
notifyCallbacks(error, context);
|
|
|
|
if (config.throwErrors) {
|
|
throw error;
|
|
}
|
|
|
|
return fallbackValue;
|
|
}
|
|
},
|
|
|
|
wrap: function(fn, context = null, fallbackValue = null) {
|
|
return (...args) => {
|
|
try {
|
|
return fn(...args);
|
|
} catch (error) {
|
|
if (config.logErrors) {
|
|
console.error(formatError(error, context));
|
|
}
|
|
|
|
notifyCallbacks(error, context);
|
|
|
|
if (config.throwErrors) {
|
|
throw error;
|
|
}
|
|
|
|
return fallbackValue;
|
|
}
|
|
};
|
|
},
|
|
|
|
wrapAsync: function(fn, context = null, fallbackValue = null) {
|
|
return async (...args) => {
|
|
try {
|
|
return await fn(...args);
|
|
} catch (error) {
|
|
if (config.logErrors) {
|
|
console.error(formatError(error, context));
|
|
}
|
|
|
|
notifyCallbacks(error, context);
|
|
|
|
if (config.throwErrors) {
|
|
throw error;
|
|
}
|
|
|
|
return fallbackValue;
|
|
}
|
|
};
|
|
},
|
|
|
|
handleError: function(error, context = null, fallbackValue = null) {
|
|
if (config.logErrors) {
|
|
console.error(formatError(error, context));
|
|
}
|
|
|
|
notifyCallbacks(error, context);
|
|
|
|
if (config.throwErrors) {
|
|
throw error;
|
|
}
|
|
|
|
return fallbackValue;
|
|
},
|
|
|
|
try: function(fn, catchFn = null, finallyFn = null) {
|
|
try {
|
|
return fn();
|
|
} catch (error) {
|
|
if (config.logErrors) {
|
|
console.error(formatError(error, 'ErrorHandler.try'));
|
|
}
|
|
|
|
notifyCallbacks(error, 'ErrorHandler.try');
|
|
|
|
if (catchFn) {
|
|
return catchFn(error);
|
|
}
|
|
|
|
if (config.throwErrors) {
|
|
throw error;
|
|
}
|
|
|
|
return null;
|
|
} finally {
|
|
if (finallyFn) {
|
|
finallyFn();
|
|
}
|
|
}
|
|
},
|
|
|
|
tryAsync: async function(fn, catchFn = null, finallyFn = null) {
|
|
try {
|
|
return await fn();
|
|
} catch (error) {
|
|
if (config.logErrors) {
|
|
console.error(formatError(error, 'ErrorHandler.tryAsync'));
|
|
}
|
|
|
|
notifyCallbacks(error, 'ErrorHandler.tryAsync');
|
|
|
|
if (catchFn) {
|
|
return await catchFn(error);
|
|
}
|
|
|
|
if (config.throwErrors) {
|
|
throw error;
|
|
}
|
|
|
|
return null;
|
|
} finally {
|
|
if (finallyFn) {
|
|
await finallyFn();
|
|
}
|
|
}
|
|
},
|
|
|
|
createBoundary: function(context) {
|
|
return {
|
|
execute: (fn, fallbackValue = null) => {
|
|
return ErrorHandler.safeExecute(fn, context, fallbackValue);
|
|
},
|
|
executeAsync: (fn, fallbackValue = null) => {
|
|
return ErrorHandler.safeExecuteAsync(fn, context, fallbackValue);
|
|
},
|
|
wrap: (fn, fallbackValue = null) => {
|
|
return ErrorHandler.wrap(fn, context, fallbackValue);
|
|
},
|
|
wrapAsync: (fn, fallbackValue = null) => {
|
|
return ErrorHandler.wrapAsync(fn, context, fallbackValue);
|
|
}
|
|
};
|
|
}
|
|
};
|
|
})();
|
|
|
|
if (typeof window !== 'undefined') {
|
|
window.ErrorHandler = ErrorHandler;
|
|
}
|
|
|
|
console.log('ErrorHandler module loaded');
|