diff --git a/modules/server/src/main/ts/bedrock/auto/RemoteDriver.ts b/modules/server/src/main/ts/bedrock/auto/RemoteDriver.ts index 26228204..9aaebd95 100644 --- a/modules/server/src/main/ts/bedrock/auto/RemoteDriver.ts +++ b/modules/server/src/main/ts/bedrock/auto/RemoteDriver.ts @@ -4,6 +4,8 @@ import * as deepmerge from 'deepmerge'; import { DeviceFarmClient, CreateTestGridUrlCommand } from '@aws-sdk/client-device-farm'; import { Driver, DriverSettings } from './Driver'; +export const REMOTE_IDLE_TIMEOUT_SECONDS = 360; + const getFarmUrl = async (awsRegion: string, projectArn: string, expires = 5000): Promise => { console.log('Creating DeviceFarmClient...'); const client = new DeviceFarmClient({region: awsRegion}); @@ -101,7 +103,7 @@ const addDriverSpecificOpts = (opts: WebdriverIO.RemoteOptions, settings: Driver 'LT:Options': { username: settings.username, accesskey: settings.accesskey, - idleTimeout: '360', + idleTimeout: REMOTE_IDLE_TIMEOUT_SECONDS, tunnel: true, console: true, w3c: true, diff --git a/modules/server/src/main/ts/bedrock/server/Apis.ts b/modules/server/src/main/ts/bedrock/server/Apis.ts index 80da2b4f..314e7826 100644 --- a/modules/server/src/main/ts/bedrock/server/Apis.ts +++ b/modules/server/src/main/ts/bedrock/server/Apis.ts @@ -9,6 +9,7 @@ import { DriverMaster } from './DriverMaster'; import * as KeyEffects from './KeyEffects'; import * as MouseEffects from './MouseEffects'; import * as Routes from './Routes'; +import {REMOTE_IDLE_TIMEOUT_SECONDS} from '../auto/RemoteDriver'; type Executor = (driver: Browser) => (data: D) => Promise; @@ -75,7 +76,7 @@ export const create = (master: DriverMaster | null, maybeDriver: Attempt Promise.resolve(void driver.execute(() => console.info('keep-alive', Date.now()))); + const sendKeepAlive = (driver: Browser) => Promise.resolve(void driver.execute(() => console.info('server keep-alive', Date.now()))); const keepAliveAction = () => Attempt.cata(maybeDriver, () => Promise.resolve(), (driver) => waitForDriverReady(maxInvalidAttempts, () => sendKeepAlive(driver))); @@ -123,6 +124,25 @@ export const create = (master: DriverMaster | null, maybeDriver: Attempt Promise = (() => { + let lastKeepAlive = Date.now(); + /* + * If we're within a minute of the remote driver timeout, send a keep-alive. + * + * In theory this is only required if no other action has been taken in the last x minutes, + * but this happens so rarely it should be fine. + */ + const keepAliveTimer = (Math.max(120, REMOTE_IDLE_TIMEOUT_SECONDS - 60)) * 1000; + return () => { + if (Date.now() - lastKeepAlive > keepAliveTimer) { + lastKeepAlive = Date.now(); + return keepAliveAction(); + } else { + return Promise.resolve(); + } + }; + })(); + const routers = [ driverRouter('/keys', 'Keys', KeyEffects.executor, false), driverRouter('/mouse', 'Mouse', MouseEffects.executor, true), @@ -137,7 +157,7 @@ export const create = (master: DriverMaster | null, maybeDriver: Attempt { c.recordTestResults(data.session, data.results); - return Promise.resolve(); + return maybeSendKeepAlive(); }), Routes.effect('POST', '/tests/done', (data: DoneData) => { Coverage.writeCoverageData(data.coverage);