mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-07 22:21:23 +00:00
refactor: unify monitor abort lifecycle handling
This commit is contained in:
29
src/infra/abort-signal.test.ts
Normal file
29
src/infra/abort-signal.test.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { waitForAbortSignal } from "./abort-signal.js";
|
||||
|
||||
describe("waitForAbortSignal", () => {
|
||||
it("resolves immediately when signal is missing", async () => {
|
||||
await expect(waitForAbortSignal(undefined)).resolves.toBeUndefined();
|
||||
});
|
||||
|
||||
it("resolves immediately when signal is already aborted", async () => {
|
||||
const abort = new AbortController();
|
||||
abort.abort();
|
||||
await expect(waitForAbortSignal(abort.signal)).resolves.toBeUndefined();
|
||||
});
|
||||
|
||||
it("waits until abort fires", async () => {
|
||||
const abort = new AbortController();
|
||||
let resolved = false;
|
||||
|
||||
const task = waitForAbortSignal(abort.signal).then(() => {
|
||||
resolved = true;
|
||||
});
|
||||
await Promise.resolve();
|
||||
expect(resolved).toBe(false);
|
||||
|
||||
abort.abort();
|
||||
await task;
|
||||
expect(resolved).toBe(true);
|
||||
});
|
||||
});
|
||||
12
src/infra/abort-signal.ts
Normal file
12
src/infra/abort-signal.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
export async function waitForAbortSignal(signal?: AbortSignal): Promise<void> {
|
||||
if (!signal || signal.aborted) {
|
||||
return;
|
||||
}
|
||||
await new Promise<void>((resolve) => {
|
||||
const onAbort = () => {
|
||||
signal.removeEventListener("abort", onAbort);
|
||||
resolve();
|
||||
};
|
||||
signal.addEventListener("abort", onAbort, { once: true });
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user