@naturalcycles/js-lib
Version:
Standard library for universal (browser + Node.js) javascript
47 lines (46 loc) • 1.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports._TryCatch = void 0;
exports._tryCatch = _tryCatch;
const index_1 = require("../index");
/**
* 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
*/
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 ${(0, index_1._since)(started)}`);
}
return r;
}
catch (err) {
if (logError) {
logger.warn(`tryCatch.${fname} error in ${(0, index_1._since)(started)}:`, err);
}
if (onError) {
try {
return await onError((0, index_1._anyToError)(err));
}
catch { }
}
// returns undefined, but doesn't rethrow
}
};
}
// eslint-disable-next-line @typescript-eslint/naming-convention
const _TryCatch = (opt = {}) => (_target, _key, descriptor) => {
const originalFn = descriptor.value;
descriptor.value = _tryCatch(originalFn, opt);
return descriptor;
};
exports._TryCatch = _TryCatch;