UNPKG

playwright-fluent

Version:
75 lines (74 loc) 3.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.waitForStabilityOf = void 0; const report_1 = require("../report"); const sleep_1 = require("../sleep"); const wait_until_1 = require("../wait-until"); function raw(input) { if (input === null) { return 'null'; } if (input === undefined) { return 'undefined'; } if (typeof input === 'boolean') { return `${input}`; } if (typeof input === 'number') { return `${input}`; } return input; } /** * Waits until the function getValue() returns the same result during 300 ms. * The waiting mechanism can be modified by setting options * * @export * @param {(() => Promise<string | boolean | number | null | undefined>)} getValue * @param {(string | (() => Promise<string>))} errorMessage * @param {WaitUntilOptions} [options=defaultWaitUntilOptions] * @returns {Promise<void>} */ async function waitForStabilityOf(getValue, errorMessage, options = wait_until_1.defaultWaitUntilOptions) { const waitOptions = { ...wait_until_1.defaultWaitUntilOptions, ...options, }; (0, report_1.report)('wait options:', waitOptions.verbose); (0, report_1.report)(JSON.stringify(waitOptions, null, 2), waitOptions.verbose); const timeout = waitOptions.timeoutInMilliseconds; const interval = waitOptions.stabilityInMilliseconds <= 0 ? 1 : waitOptions.stabilityInMilliseconds / 3; const nbIntervals = timeout <= 0 ? 1 : timeout / interval; const stabilityCounterMaxValue = waitOptions.stabilityInMilliseconds / interval; let stabilityCounterCurrentValue = 0; let previousResult = await getValue(); (0, report_1.report)(`value function has initially returned '${raw(previousResult)}'`, waitOptions.verbose); for (let index = 0; index < nbIntervals; index++) { await (0, sleep_1.sleep)(interval); const result = await getValue(); (0, report_1.report)(`value function returned '${raw(result)}' after waiting ${(index + 1) * interval} ms`, waitOptions.verbose); if (result === previousResult) { stabilityCounterCurrentValue += 1; } if (result !== previousResult) { previousResult = result; stabilityCounterCurrentValue = 0; } if (stabilityCounterCurrentValue >= stabilityCounterMaxValue) { (0, report_1.report)(`value function always returned '${raw(result)}' during ${stabilityCounterCurrentValue > 0 ? stabilityCounterCurrentValue * interval : interval} ms: no need to wait anymore.`, waitOptions.verbose); return; } } (0, report_1.report)(`value function could not converge to a stable result during ${waitOptions.timeoutInMilliseconds} ms.`, waitOptions.verbose); (0, report_1.report)(`timeout of ${waitOptions.timeoutInMilliseconds} ms as been reached`, waitOptions.verbose); if (!options.throwOnTimeout) { (0, report_1.report)('exiting waiting mechanism without throwing', waitOptions.verbose); return; } (0, report_1.report)('exiting waiting mechanism with throwing', waitOptions.verbose); if (typeof errorMessage === 'string') { throw new Error(errorMessage); } throw new Error(await errorMessage()); } exports.waitForStabilityOf = waitForStabilityOf;