graphql
Version:
A Query Language and Runtime which can target any service.
55 lines • 1.63 kB
JavaScript
import { isPromise } from "../jsutils/isPromise.mjs";
const asyncDispose = Symbol.asyncDispose ?? Symbol.for('Symbol.asyncDispose');
export function withConcurrentAbruptClose(generator, beforeReturn, beforeThrow = beforeReturn) {
let completed = false;
let abruptCloseRequested = false;
const runAbruptCloseFn = (fn) => {
if (completed || abruptCloseRequested) {
return;
}
abruptCloseRequested = true;
return ignoreErrors(fn);
};
return {
[Symbol.asyncIterator]() {
return this;
},
next() {
const result = generator.next();
result
.then((iteration) => {
if (iteration.done) {
completed = true;
}
})
.catch(() => undefined);
return result;
},
async return() {
await runAbruptCloseFn(beforeReturn);
return generator.return();
},
async throw(error) {
await runAbruptCloseFn(() => beforeThrow(error));
return generator.throw(error);
},
async [asyncDispose]() {
await runAbruptCloseFn(beforeReturn);
if (typeof generator[asyncDispose] === 'function') {
await generator[asyncDispose]();
}
},
};
}
function ignoreErrors(fn) {
try {
const result = fn();
if (isPromise(result)) {
return result.catch(() => {
});
}
}
catch {
}
}
//# sourceMappingURL=withConcurrentAbruptClose.js.map