UNPKG

ayakashi

Version:

The next generation web scraping framework

65 lines (64 loc) 2.56 kB
"use strict"; 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.retryOnErrorOrTimeOut = void 0; const async_1 = require("async"); const backoff_1 = require("backoff"); function retryOnErrorOrTimeOut(task, retries = 20) { return __awaiter(this, void 0, void 0, function* () { const strategy = new backoff_1.ExponentialStrategy({ randomisationFactor: 0.5, initialDelay: 100, maxDelay: 1000, factor: 2 }); return new Promise(function (resolve, reject) { async_1.retry({ times: retries, interval: function () { return strategy.next(); } }, function (cb) { let resolved = false; let aborted = false; const timedOut = setTimeout(function () { if (!resolved) { aborted = true; cb(new Error(`timed_out`)); } }, 1000); task() .then(function (taskResult) { if (!aborted) { resolved = true; clearTimeout(timedOut); cb(null, taskResult); } }) .catch(function (err) { if (!aborted) { resolved = true; clearTimeout(timedOut); cb(err); } }); }, function (err, taskResult) { if (err) { reject(err); } else { resolve(taskResult); } }); }); }); } exports.retryOnErrorOrTimeOut = retryOnErrorOrTimeOut;