@naturalcycles/js-lib
Version:
Standard library for universal (browser + Node.js) javascript
43 lines (42 loc) • 1.42 kB
JavaScript
import { _since } from '../datetime/time.util.js';
import { _anyToError } from './error.util.js';
/**
* Decorates a function with "try/catch", so it'll never reject/throw.
* Only applies to async functions (or, turns sync function into async).
*
* Allows to pass onError callback.
*
* @experimental
*/
export function _tryCatch(fn, opt = {}) {
const { onError, logError = true, logSuccess = false, logger = console } = opt;
const fname = fn.name || 'anonymous';
return async function (...args) {
const started = Date.now();
try {
const r = await fn.apply(this, args);
if (logSuccess) {
logger.log(`tryCatch.${fname} succeeded in ${_since(started)}`);
}
return r;
}
catch (err) {
if (logError) {
logger.warn(`tryCatch.${fname} error in ${_since(started)}:`, err);
}
if (onError) {
try {
return await onError(_anyToError(err));
}
catch { }
}
// returns undefined, but doesn't rethrow
}
};
}
// eslint-disable-next-line @typescript-eslint/naming-convention
export const _TryCatch = (opt = {}) => (_target, _key, descriptor) => {
const originalFn = descriptor.value;
descriptor.value = _tryCatch(originalFn, opt);
return descriptor;
};