From 9882f1c919db73229965e0b897861d1e400ea960 Mon Sep 17 00:00:00 2001 From: Justin Spahr-Summers Date: Thu, 14 Nov 2024 14:25:16 +0000 Subject: [PATCH] Add `abortAfterTimeout()` utility to make it easy to add timeouts --- src/shared/protocol.ts | 2 ++ src/utils.test.ts | 15 +++++++++++++++ src/utils.ts | 11 +++++++++++ 3 files changed, 28 insertions(+) create mode 100644 src/utils.test.ts create mode 100644 src/utils.ts diff --git a/src/shared/protocol.ts b/src/shared/protocol.ts index ab8421bf..8103695d 100644 --- a/src/shared/protocol.ts +++ b/src/shared/protocol.ts @@ -48,6 +48,8 @@ export type RequestOptions = { /** * Can be used to cancel an in-flight request. This will cause an AbortError to be raised from request(). + * + * Use abortAfterTimeout() to easily implement timeouts using this signal. */ signal?: AbortSignal; }; diff --git a/src/utils.test.ts b/src/utils.test.ts new file mode 100644 index 00000000..e4aa4e5f --- /dev/null +++ b/src/utils.test.ts @@ -0,0 +1,15 @@ +import { abortAfterTimeout } from "./utils.js"; + +describe("abortAfterTimeout", () => { + it("should abort after timeout", () => { + const signal = abortAfterTimeout(0); + expect(signal.aborted).toBe(false); + + return new Promise((resolve) => { + setTimeout(() => { + expect(signal.aborted).toBe(true); + resolve(true); + }, 0); + }); + }); +}); diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 00000000..11672ecd --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,11 @@ +/** + * Returns an AbortSignal that will enter aborted state after `timeoutMs` milliseconds. + */ +export function abortAfterTimeout(timeoutMs: number): AbortSignal { + const controller = new AbortController(); + setTimeout(() => { + controller.abort(); + }, timeoutMs); + + return controller.signal; +}