@sema-agent/core
Version:
Stateless, task-oriented AI agent core
39 lines (38 loc) • 1.41 kB
JavaScript
export function composeCallSignal(runSignal, callSignal) {
return callSignal !== undefined ? AbortSignal.any([runSignal, callSignal]) : runSignal;
}
export function raceSettlementAgainstSignal(p, signal) {
const settled = p.then((value) => ({ tag: "value", value }), (error) => ({ tag: "threw", error }));
if (signal.aborted)
return Promise.resolve({ tag: "aborted" });
return new Promise((resolve) => {
let done = false;
const finish = (r) => {
if (done)
return;
done = true;
signal.removeEventListener("abort", onAbortEvent);
resolve(r);
};
const onAbortEvent = () => finish({ tag: "aborted" });
signal.addEventListener("abort", onAbortEvent, { once: true });
void settled.then(finish);
});
}
export function raceAbort(p, signal, onAbort) {
if (signal.aborted)
return Promise.resolve(onAbort());
return new Promise((resolve) => {
let settled = false;
const finish = (v) => {
if (settled)
return;
settled = true;
signal.removeEventListener("abort", onAbortEvent);
resolve(v);
};
const onAbortEvent = () => finish(onAbort());
signal.addEventListener("abort", onAbortEvent, { once: true });
p.then(finish, () => finish(onAbort()));
});
}