Skip to content

Commit

Permalink
refactor: extract cancellableSleep
Browse files Browse the repository at this point in the history
  • Loading branch information
FauxFaux committed Dec 5, 2020
1 parent 015ee4a commit d8ef10d
Showing 1 changed file with 29 additions and 12 deletions.
41 changes: 29 additions & 12 deletions packages/jest-circus/src/deadlineTimeout.ts
Expand Up @@ -17,17 +17,12 @@ function isUs(line: string): boolean {
}

async function timeout<T>(promise: Promise<T>, ms: number): Promise<T> {
let timeoutId: ReturnType<typeof setTimeout> | undefined;
let resolvePromise: { (value: boolean): void } | undefined;
const {promise: sleepCancelled, clear} = _cancellableSleep(ms);
try {
return await Promise.race([
promise,
(async (): Promise<never> => {
const firedForReal = await new Promise<boolean>(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)`);
Expand All @@ -39,9 +34,31 @@ async function timeout<T>(promise: Promise<T>, ms: number): Promise<T> {
})(),
]);
} finally {
if (timeoutId) {
clearTimeout(timeoutId);
}
resolvePromise?.(false);
clear();
}
}

const _cancellableSleep = (ms: number) => {
const state: {
resolvePromise: null | {(firedForReal: boolean): void};
timeoutId: null | ReturnType<typeof setTimeout>;
} = {
resolvePromise: null,
timeoutId: null,
};

const promise = new Promise<boolean>(resolve => {
state.resolvePromise = resolve;
state.timeoutId = setTimeout(() => resolve(false), ms);
});

return {
clear: () => {
state.resolvePromise?.(true);
if (state.timeoutId) {
clearTimeout(state.timeoutId);
}
},
promise,
};
};

0 comments on commit d8ef10d

Please sign in to comment.