UNPKG

errgo-ts

Version:

A lightweight error handling library inspired by Go and Rust.

92 lines (91 loc) 2.31 kB
import { coerceError } from "./coerce-error.js"; function executeDefers(queue) { for (let i = 0; i < queue.length; i++) { try { queue[i](); } catch (e) { console.warn("Error thrown by deferred callback:", e); } } } export function safe(fn) { const deferQueue = []; try { const res = fn((fn) => deferQueue.push(fn)); if (res instanceof Promise) { return res.then((v) => { executeDefers(deferQueue); return { val: v }; }, (e) => { executeDefers(deferQueue); return { err: coerceError(e) }; }); } else { executeDefers(deferQueue); return { val: res }; } } catch (e) { executeDefers(deferQueue); return { err: coerceError(e) }; } } export function throwing(fn) { const deferQueue = []; try { const res = fn((fn) => deferQueue.push(fn)); if (res instanceof Promise) { return res.then((v) => { executeDefers(deferQueue); return v; }, (e) => { executeDefers(deferQueue); throw coerceError(e); }); } else { executeDefers(deferQueue); return res; } } catch (e) { executeDefers(deferQueue); throw coerceError(e); } } export function handled(onError, fn) { const deferQueue = []; try { const res = fn((fn) => deferQueue.push(fn)); if (res instanceof Promise) { return res.then((_) => { executeDefers(deferQueue); }, (e) => { executeDefers(deferQueue); onError(coerceError(e)); }); } else { executeDefers(deferQueue); } } catch (e) { executeDefers(deferQueue); onError(coerceError(e)); } } /** * Execute functions with deferred actions. * * Available execution modes: * - `safe` - wraps errors in a `Result` type * - `throwing` - re-throws errors from the scope * - `handled` - passes errors to a provided callback function */ export default { safe, throwing, handled, };