errgo-ts
Version:
A lightweight error handling library inspired by Go and Rust.
92 lines (91 loc) • 2.31 kB
JavaScript
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,
};