From d8ef10d9b566716532f4b7a8e8a4e569e0974bea Mon Sep 17 00:00:00 2001 From: "Chris West (Faux)" Date: Sat, 5 Dec 2020 11:17:42 +0000 Subject: [PATCH] refactor: extract cancellableSleep --- packages/jest-circus/src/deadlineTimeout.ts | 41 +++++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/packages/jest-circus/src/deadlineTimeout.ts b/packages/jest-circus/src/deadlineTimeout.ts index 8b7b32d3a65e..c27e50a1932e 100644 --- a/packages/jest-circus/src/deadlineTimeout.ts +++ b/packages/jest-circus/src/deadlineTimeout.ts @@ -17,17 +17,12 @@ function isUs(line: string): boolean { } async function timeout(promise: Promise, ms: number): Promise { - let timeoutId: ReturnType | undefined; - let resolvePromise: { (value: boolean): void } | undefined; + const {promise: sleepCancelled, clear} = _cancellableSleep(ms); try { return await Promise.race([ promise, - (async (): Promise => { - const firedForReal = await new Promise(resolve => { - resolvePromise = resolve; - timeoutId = setTimeout(() => resolve(true), ms); - }); - if (!firedForReal) { + (async () => { + if (await sleepCancelled) { return undefined as never; } const here = new Error(`deadline exceeded (waited here for ${ms}ms)`); @@ -39,9 +34,31 @@ async function timeout(promise: Promise, ms: number): Promise { })(), ]); } finally { - if (timeoutId) { - clearTimeout(timeoutId); - } - resolvePromise?.(false); + clear(); } } + +const _cancellableSleep = (ms: number) => { + const state: { + resolvePromise: null | {(firedForReal: boolean): void}; + timeoutId: null | ReturnType; + } = { + resolvePromise: null, + timeoutId: null, + }; + + const promise = new Promise(resolve => { + state.resolvePromise = resolve; + state.timeoutId = setTimeout(() => resolve(false), ms); + }); + + return { + clear: () => { + state.resolvePromise?.(true); + if (state.timeoutId) { + clearTimeout(state.timeoutId); + } + }, + promise, + }; +};