Skip to content

Commit 01c3fab

Browse files
committed
Resolve MockQueue.listen() on a pre-aborted signal
MockQueue.listen() only resolved from an "abort" event listener, so a signal already aborted before the call left the promise pending forever and could hang queue-listener teardown in tests. Return a resolved promise when the signal is already aborted, and register the listener with { once: true }. #806 (comment) Assisted-by: Claude Code:claude-opus-4-8
1 parent afdaa61 commit 01c3fab

2 files changed

Lines changed: 21 additions & 1 deletion

File tree

packages/fedify/src/federation/tasks/tasks.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,23 @@ test("startQueue() task worker", async (t) => {
497497
);
498498
});
499499

500+
test("MockQueue.listen() resolves on a pre-aborted signal", async () => {
501+
const queue = new MockQueue();
502+
const controller = new AbortController();
503+
controller.abort();
504+
let timer: ReturnType<typeof setTimeout> | undefined;
505+
const settled = await Promise.race([
506+
queue.listen(() => {}, { signal: controller.signal }).then(() =>
507+
"resolved"
508+
),
509+
new Promise<string>((resolve) => {
510+
timer = setTimeout(() => resolve("pending"), 50);
511+
}),
512+
]);
513+
clearTimeout(timer);
514+
strictEqual(settled, "resolved");
515+
});
516+
500517
test("processQueuedTask() task dispatch", async (t) => {
501518
await t.step("drops an unknown task with a warning", async () => {
502519
const queue = new MockQueue();

packages/fedify/src/testing/tasks.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,11 @@ export class MockQueue implements MessageQueue {
129129
options?: MessageQueueListenOptions,
130130
): Promise<void> {
131131
this.listenCount++;
132+
if (options?.signal?.aborted) return Promise.resolve();
132133
return new Promise((resolve) => {
133-
options?.signal?.addEventListener("abort", () => resolve());
134+
options?.signal?.addEventListener("abort", () => resolve(), {
135+
once: true,
136+
});
134137
});
135138
}
136139
}

0 commit comments

Comments
 (0)