playwright-pom-materials
Version:
Playwright POM materials
121 lines (120 loc) • 7.18 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.retryAttempts = exports.retryUntilTimeout = exports.retryBase = exports.retry = exports.defaultRetryUntilTimeoutOptions = void 0;
const config_1 = require("./config");
const sleep_1 = require("./sleep");
const RetryErrorProcessor_1 = require("./RetryErrorProcessor");
const retryOptions_1 = require("./retryOptions");
const retryOptionsDefault_1 = require("./retryOptionsDefault");
const mergeOptions_1 = require("./mergeOptions");
exports.defaultRetryUntilTimeoutOptions = new retryOptionsDefault_1.RetryUntilTimeoutOptionsDefault(() => 2 * 60 * config_1.config.timeoutUnit, () => 10 * config_1.config.timeoutUnit, {
intervalFunc: sleep_1.sleep,
throwOn: ['timeout'],
errorFunc: (0, RetryErrorProcessor_1.newRetryErrorProcessor)(() => new Error('Timeout Error')),
});
/**
* 引数 fn が true を返すまで処理を繰り返す関数。
*
* オプションに maxAttempts を指定する場合の振る舞いは retryAttempts と同じ。
* オプションに maxAttempts を指定されない場合の振る舞いは retryUntilTimeout と同じ。
*/
const retry = (fn, options) => (0, exports.retryBase)(fn, exports.defaultRetryUntilTimeoutOptions.asObject(), options);
exports.retry = retry;
const retryBase = (fn, defaultOptions, options) => __awaiter(void 0, void 0, void 0, function* () {
if ((0, retryOptions_1.isRetryAttemptOptions)(options)) {
yield (0, exports.retryAttempts)(fn, options);
}
else {
yield (0, exports.retryUntilTimeout)(fn, (0, mergeOptions_1.mergeOptions)(defaultOptions, options));
}
});
exports.retryBase = retryBase;
/**
* 引数 fn が true を返すまで処理を繰り返す関数。
* 繰り返し処理を行う最大時間をオプションの timeout で指定可能。
*
* 例外が起きたらすぐに throw する場合は options.throwOn に 'catch' を追加する。
* timeoutを過ぎた際に例外を throw する場合は options.throwOn に 'timeout' を追加する。
* 例外が起きてもリトライし、timeoutを過ぎても例外を throw しない場合は options.throwOn に [] を指定する。
*
* @param { {(): Promise<boolean>} } fn 実行に成功したら true を返す(Promiseを返す)関数
* @param [options]
* @param {number} [options.timeout] タイムアウトをミリ秒で指定。デフォルトは 2 * 60 * config.timeoutUnit
* @param {number} [options.interval] fnを実行するまでの間隔。ミリ秒で指定。デフォルトは 10 * config.timeoutUnit
* @param { {(number): Promise<void>} } [options.intervalFunc] fnを実行するまでの間隔を指定する関数。デフォルトは sleep
* @param { ('catch'|'timeout')[] } [options.throwOn] 例外が起きた場合にthrowするタイミング。デフォルトは ['timeout']
* @param { {(errors: unknown[]): Promise<void>} } [options.errorFunc] 例外が起きた場合に呼び出される関数。デフォルトでは、最後のエラー あるいは 'Timeout Error' というErrorをthrowする
*/
const retryUntilTimeout = (fn, options) => __awaiter(void 0, void 0, void 0, function* () {
const { timeout, interval, throwOn, errorFunc, intervalFunc } = (0, mergeOptions_1.mergeOptions)(exports.defaultRetryUntilTimeoutOptions.asObject(), options);
const t0 = Date.now();
const errors = [];
while (Date.now() - t0 < timeout) {
try {
const x = yield fn();
if (x)
return;
}
catch (err) {
errors.push(err);
if (throwOn.includes('catch'))
yield errorFunc(errors);
console.debug('retry function ignored an error: ', err);
}
yield intervalFunc(interval);
}
if (throwOn.includes('timeout'))
yield errorFunc(errors);
});
exports.retryUntilTimeout = retryUntilTimeout;
/**
* 引数 fn が true を返すまで処理を繰り返す関数。
* 繰り返しの上限をオプションの maxAttempts で指定可能。
*
* 例外が起きたらすぐに throw する場合は options.throwOn に 'catch' を追加する。
* maxAttemptsを超えた際に例外を throw する場合は options.throwOn に 'exceeded' を追加する。
* 例外が起きてもリトライし、maxAttemptsを超えても例外を throw しない場合は options.throwOn に [] を指定する。
*
* @param { {(): Promise<boolean>} } fn 実行に成功したら true を返す(Promiseを返す)関数
* @param [options]
* @param {number} [options.timeout] タイムアウトをミリ秒で指定。デフォルトは 2 * 60 * config.timeoutUnit
* @param {number} [options.interval] { number }fnを実行するまでの間隔。ミリ秒で指定。デフォルトは 10 * config.timeoutUnit
* @param { {(number): Promise<void>} } [options.intervalFunc] fnを実行するまでの間隔を指定する関数。デフォルトは sleep
* @param { ('catch'|'exceeded')[] } [options.throwOn] 例外が起きた場合にthrowするタイミング。デフォルトは ['exceeded']
* @param { {(errors: unknown[]): Promise<void>} } [options.errorFunc] 例外が起きた場合に呼び出される関数。デフォルトでは、最後のエラー あるいは 'Retry exceeded maxAttempts' というErrorをthrowする
*/
const retryAttempts = (fn, options) => __awaiter(void 0, void 0, void 0, function* () {
const { maxAttempts, interval, throwOn, errorFunc, intervalFunc } = (0, mergeOptions_1.mergeOptions)(defaultRetryAttemptsOptions.asObject(), options);
const errors = [];
for (let attempts = 0; attempts < maxAttempts; attempts++) {
try {
const x = yield fn();
if (x)
return;
}
catch (err) {
errors.push(err);
if (throwOn.includes('catch'))
yield errorFunc(errors);
console.debug('retry function ignored an error: ', err);
}
yield intervalFunc(interval);
}
if (throwOn.includes('exceeded'))
yield errorFunc(errors);
});
exports.retryAttempts = retryAttempts;
const defaultRetryAttemptsOptions = new retryOptionsDefault_1.RetryAttemptOptionsDefault(() => 3, () => config_1.config.timeoutUnit, {
intervalFunc: sleep_1.sleep,
throwOn: ['exceeded'],
errorFunc: (0, RetryErrorProcessor_1.newRetryErrorProcessor)(() => new Error('Retry exceeded maxAttempts')),
});