UNPKG

2.5 kBJavaScriptView Raw
1const Promise = require('bluebird');
2const utils = require('../utils');
3const gridService = require('../services/gridService');
4const logger = require('../commons/logger').getLogger("worker-utils");
5const {timeoutMessages} = require('../commons/constants');
6const {GetBrowserError} = require('../errors');
7
8const waitUntilBrowserTimeout = (err, startTime, interval, projectId, workerId, player, releaseSlotOnTestFinished) => {
9 logger.warn('failed getting browser from grid', { err });
10 return releasePlayer(workerId, releaseSlotOnTestFinished, projectId, player)
11 .then(() => {
12 const requestTime = Date.now() - startTime;
13 const timeDiff = interval - requestTime;
14 return Promise.delay(timeDiff).then(() => Promise.reject(err));
15 });
16
17};
18
19const releaseGridSlot = (workerId, releaseSlotOnTestFinished, projectId) => {
20 if (!releaseSlotOnTestFinished) {
21 return Promise.resolve();
22 }
23 return gridService.releaseGridSlot(workerId, projectId);
24};
25
26const releasePlayer = (workerId, releaseSlotOnTestFinished, projectId, player) => {
27 logger.info('releasing player', { hasPlayer: Boolean(player) });
28 return (player ? player.onDone() : Promise.resolve())
29 .finally(() => releaseGridSlot(workerId, releaseSlotOnTestFinished, projectId));
30};
31
32module.exports.releasePlayer = releasePlayer;
33
34module.exports.getBrowserWithRetries = ({ getBrowserOnce, testPlayerFactory, releaseSlotOnTestFinished }, {totalTimeoutDuration, singleGetBrowserDuration , projectId, workerId, reporter}) => {
35 const maxGetBrowserAttempts = totalTimeoutDuration / singleGetBrowserDuration;
36 let failedAttempts = 0;
37
38 return utils.runWithRetries(() => {
39 const startTime = Date.now();
40 const player = testPlayerFactory();
41 return getBrowserOnce(player)
42 .then((getBrowserRes) => player || getBrowserRes)
43 .timeout(singleGetBrowserDuration, timeoutMessages.GET_BROWSER_TIMEOUT_MSG)
44 .tapCatch(() => reporter.onGetBrowserFailure(workerId, projectId, ++failedAttempts))
45 .tap(() => reporter.onGetBrowserSuccess(workerId, projectId))
46 .catch(err => waitUntilBrowserTimeout(err, startTime, singleGetBrowserDuration, projectId, workerId, player, releaseSlotOnTestFinished));
47 }, maxGetBrowserAttempts).catch(err => { throw new GetBrowserError(err); });
48};
49
50module.exports.isGetBrowserError = err => err && err.constructor && err.constructor.name === 'GetBrowserError';