diff --git a/src/common/FrameManager.ts b/src/common/FrameManager.ts index 2f2e011d45e99..8ab336bc26673 100644 --- a/src/common/FrameManager.ts +++ b/src/common/FrameManager.ts @@ -16,10 +16,8 @@ import {Protocol} from 'devtools-protocol'; import {assert} from '../util/assert.js'; -import { - createDeferredPromise, - DeferredPromise, -} from '../util/DeferredPromise.js'; +import {createDebuggableDeferredPromise} from '../util/DebuggableDeferredPromise.js'; +import {DeferredPromise} from '../util/DeferredPromise.js'; import {isErrorLike} from '../util/ErrorLike.js'; import {CDPSession} from './Connection.js'; import {EventEmitter} from './EventEmitter.js'; @@ -150,9 +148,9 @@ export class FrameManager extends EventEmitter { if (!this.#framesPendingTargetInit.has(targetId)) { this.#framesPendingTargetInit.set( targetId, - createDeferredPromise({ - message: `Waiting for target frame ${targetId} failed`, - }) + createDebuggableDeferredPromise( + `Waiting for target frame ${targetId} failed` + ) ); } const result = await Promise.all([ @@ -318,9 +316,9 @@ export class FrameManager extends EventEmitter { if (!this.#framesPendingAttachment.has(frameId)) { this.#framesPendingAttachment.set( frameId, - createDeferredPromise({ - message: `Waiting for frame ${frameId} to attach failed`, - }) + createDebuggableDeferredPromise( + `Waiting for frame ${frameId} to attach failed` + ) ); } frame.then(() => { diff --git a/src/common/NetworkManager.ts b/src/common/NetworkManager.ts index 2d0a757af58df..da1a0d19f18b3 100644 --- a/src/common/NetworkManager.ts +++ b/src/common/NetworkManager.ts @@ -23,10 +23,8 @@ import {HTTPRequest} from './HTTPRequest.js'; import {HTTPResponse} from './HTTPResponse.js'; import {FetchRequestId, NetworkEventManager} from './NetworkEventManager.js'; import {debugError, isString} from './util.js'; -import { - createDeferredPromise, - DeferredPromise, -} from '../util/DeferredPromise.js'; +import {DeferredPromise} from '../util/DeferredPromise.js'; +import {createDebuggableDeferredPromise} from '../util/DebuggableDeferredPromise.js'; /** * @public @@ -144,9 +142,9 @@ export class NetworkManager extends EventEmitter { if (this.#deferredInitPromise) { return this.#deferredInitPromise; } - this.#deferredInitPromise = createDeferredPromise({ - message: 'NetworkManager initialization timed out', - }); + this.#deferredInitPromise = createDebuggableDeferredPromise( + 'NetworkManager initialization timed out' + ); const init = Promise.all([ this.#ignoreHTTPSErrors ? this.#client.send('Security.setIgnoreCertificateErrors', { diff --git a/src/types.ts b/src/types.ts index 42978312e78d3..00bed28c5a298 100644 --- a/src/types.ts +++ b/src/types.ts @@ -68,6 +68,7 @@ export * from './node/util.js'; export * from './puppeteer.js'; export * from './revisions.js'; export * from './util/assert.js'; +export * from './util/DebuggableDeferredPromise.js'; export * from './util/DeferredPromise.js'; export * from './util/ErrorLike.js'; export * from './util/getPackageDirectory.js'; diff --git a/src/util/DebuggableDeferredPromise.ts b/src/util/DebuggableDeferredPromise.ts new file mode 100644 index 0000000000000..474743273c3ca --- /dev/null +++ b/src/util/DebuggableDeferredPromise.ts @@ -0,0 +1,20 @@ +import {DEFERRED_PROMISE_DEBUG_TIMEOUT} from '../environment.js'; +import {DeferredPromise, createDeferredPromise} from './DeferredPromise.js'; + +/** + * Creates and returns a deferred promise using DEFERRED_PROMISE_DEBUG_TIMEOUT + * if it's specified or a normal deferred promise otherwise. + * + * @internal + */ +export function createDebuggableDeferredPromise( + message: string +): DeferredPromise { + if (DEFERRED_PROMISE_DEBUG_TIMEOUT > 0) { + return createDeferredPromise({ + message, + timeout: DEFERRED_PROMISE_DEBUG_TIMEOUT, + }); + } + return createDeferredPromise(); +} diff --git a/src/util/DeferredPromise.ts b/src/util/DeferredPromise.ts index e2350c07c2c6d..2f21087ba8584 100644 --- a/src/util/DeferredPromise.ts +++ b/src/util/DeferredPromise.ts @@ -1,5 +1,4 @@ import {TimeoutError} from '../common/Errors.js'; -import {DEFERRED_PROMISE_DEBUG_TIMEOUT} from '../environment.js'; /** * @internal @@ -11,27 +10,26 @@ export interface DeferredPromise extends Promise { reject: (_: Error) => void; } -interface DeferredPromiseOptions { - message?: string; - timeout?: number; - isDebug?: boolean; +/** + * @internal + */ +export interface DeferredPromiseOptions { + message: string; + timeout: number; } /** - * Creates an returns a promise along with the resolve/reject functions. + * Creates and returns a promise along with the resolve/reject functions. * * If the promise has not been resolved/rejected within the `timeout` period, - * the promise gets rejected with a timeout error. + * the promise gets rejected with a timeout error. `timeout` has to be greater than 0 or + * it is ignored. * * @internal */ -export function createDeferredPromise({ - message, - timeout = 5000, -}: DeferredPromiseOptions = {}): DeferredPromise { - if (DEFERRED_PROMISE_DEBUG_TIMEOUT > 0 && !timeout) { - timeout = DEFERRED_PROMISE_DEBUG_TIMEOUT; - } +export function createDeferredPromise( + opts?: DeferredPromiseOptions +): DeferredPromise { let isResolved = false; let isRejected = false; let resolver = (_: T): void => {}; @@ -40,12 +38,13 @@ export function createDeferredPromise({ resolver = resolve; rejector = reject; }); - const timeoutId = message - ? setTimeout(() => { - isRejected = true; - rejector(new TimeoutError(message)); - }, timeout) - : undefined; + const timeoutId = + opts && opts.timeout > 0 + ? setTimeout(() => { + isRejected = true; + rejector(new TimeoutError(opts.message)); + }, opts.timeout) + : undefined; return Object.assign(taskPromise, { resolved: () => { return isResolved;