with-defer
Version:
Run a function with an injected go-like defer helper
47 lines (43 loc) • 1.13 kB
JavaScript
var __defProp = Object.defineProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, {get: all[name], enumerable: true});
};
// src/index.ts
__markAsModule(exports);
__export(exports, {
AggregateError: () => AggregateError,
runWithDefer: () => runWithDefer
});
// src/error.ts
var AggregateError = class extends Error {
constructor(errors, message = "") {
super(message);
this.message = message;
this.name = "AggregateError";
this.errors = [...errors];
}
};
// src/cleanup.ts
async function runWithDefer(func) {
const onCleanup = [];
const defer = (deferredFn) => {
onCleanup.unshift(deferredFn);
};
try {
return await func(defer);
} finally {
let errors = [];
for (const onCleanupFn of onCleanup) {
try {
await onCleanupFn();
} catch (err) {
errors.push(err);
}
}
if (errors.length) {
throw new AggregateError(errors, "One or more exceptions caught while executing deferred clean-up functions");
}
}
}