UNPKG

@naturalcycles/js-lib

Version:

Standard library for universal (browser + Node.js) javascript

43 lines (42 loc) 1.42 kB
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; };