UNPKG

cabbie-async

Version:
1,023 lines (766 loc) 36 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); var _stringify = require('babel-runtime/core-js/json/stringify'); var _stringify2 = _interopRequireDefault(_stringify); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _applicationCacheStatuses = require('./enums/application-cache-statuses'); var _browserOrientations = require('./enums/browser-orientations'); var _httpMethod = require('./flow-types/http-method'); var _options4 = require('./flow-types/options'); var _sessionData = require('./flow-types/session-data'); var _logEntry = require('./log-entry'); var _url = require('url'); var _fs = require('fs'); var _dotenv = require('dotenv'); var _depd = require('depd'); var _depd2 = _interopRequireDefault(_depd); var _availableBrowsers = require('available-browsers'); var _availableBrowsers2 = _interopRequireDefault(_availableBrowsers); var _crossSpawn = require('cross-spawn'); var _crossSpawn2 = _interopRequireDefault(_crossSpawn); var _addDebugging = require('./add-debugging'); var _addDebugging2 = _interopRequireDefault(_addDebugging); var _thenRequest = require('then-request'); var _thenRequest2 = _interopRequireDefault(_thenRequest); var _errors = require('./utils/errors'); var _connection = require('./connection'); var _connection2 = _interopRequireDefault(_connection); var _browser = require('./browser'); var _browser2 = _interopRequireDefault(_browser); var _debug = require('./debug'); var _debug2 = _interopRequireDefault(_debug); var _timeOut = require('./time-out'); var _timeOut2 = _interopRequireDefault(_timeOut); var _status = require('./status'); var _status2 = _interopRequireDefault(_status); var _parseResponse = require('./utils/parse-response'); var _parseResponse2 = _interopRequireDefault(_parseResponse); var _activeWindow = require('./active-window'); var _activeWindow2 = _interopRequireDefault(_activeWindow); var _ime = require('./ime'); var _ime2 = _interopRequireDefault(_ime); var _cookieStorage = require('./cookie-storage'); var _cookieStorage2 = _interopRequireDefault(_cookieStorage); var _localStorage = require('./local-storage'); var _localStorage2 = _interopRequireDefault(_localStorage); var _sessionStorage = require('./session-storage'); var _sessionStorage2 = _interopRequireDefault(_sessionStorage); var _windowHandle = require('./window-handle'); var _windowHandle2 = _interopRequireDefault(_windowHandle); var _flowRuntime = require('flow-runtime'); var _flowRuntime2 = _interopRequireDefault(_flowRuntime); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * * This file is generated automatically, run npm run build to re-generate. **/ var LogEntry = _flowRuntime2.default.tdz(function () { return _logEntry.LogEntry; }); var Session = _flowRuntime2.default.tdz(function () { return _sessionData.Session; }); var Options = _flowRuntime2.default.tdz(function () { return _options4.Options; }); var HttpMethod = _flowRuntime2.default.tdz(function () { return _httpMethod.HttpMethod; }); var BrowserOrientation = _flowRuntime2.default.tdz(function () { return _browserOrientations.BrowserOrientation; }); var ApplicationCacheStatus = _flowRuntime2.default.tdz(function () { return _applicationCacheStatuses.ApplicationCacheStatus; }); var deprecate = (0, _depd2.default)('cabbie'); /* * Create a new Driver session, remember to call `.dispose()` * at the end to terminate the session. */ var Driver = function () { /* * Get the Session-Storage object. */ /* * Get the Cookie-Storage object. */ /* * The currently active window. This has most of the methods to interact with * the the current page. */ /* * The browser object. * * @private */ /* * The location of the selenium server */ /* * @private */ function Driver(remote /*: string*/) { var options /*: Options*/ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; (0, _classCallCheck3.default)(this, Driver); var _remoteType = _flowRuntime2.default.string(); var _optionsType = _flowRuntime2.default.ref(Options); _flowRuntime2.default.param('remote', _remoteType).assert(remote); _flowRuntime2.default.param('options', _optionsType).assert(options); options = _optionsType.assert(addEnvironment(options)); this.remote = remote; this.options = options; this.debug = new _debug2.default(options); var remoteURI = remote; var capabilities = (0, _extends3.default)({}, options.browser && (remote === 'saucelabs' || remote === 'browserstack' || remote === 'testingbot') ? (0, _availableBrowsers2.default)(remote, options.browser.name, options.browser.version, options.browser.platform) : {}, options.capabilities || {}); var remoteAliases = { 'chrome-driver': 'chromedriver', 'taxi-rank': 'taxirank', 'sauce-labs': 'saucelabs', 'browser-stack': 'browserstack', 'testing-bot': 'testingbot' }; if (remote in remoteAliases) { remote = _remoteType.assert(remoteAliases[remote]); } switch (remote) { case 'chromedriver': remoteURI = 'http://localhost:9515/'; break; case 'taxirank': remoteURI = 'http://localhost:9516'; break; case 'saucelabs': var _options = options, sauceUsername = _options.sauceUsername, sauceAccessKey = _options.sauceAccessKey; if (!sauceUsername || !sauceAccessKey) { throw new Error('To use sauce labs, you must specify SAUCE_USERNAME and SAUCE_ACCESS_KEY in enviornment variables or ' + 'provide sauceUsername and sauceAccessKey as options.'); } remoteURI = 'http://' + sauceUsername + ':' + sauceAccessKey + '@ondemand.saucelabs.com/wd/hub'; break; case 'browserstack': var _options2 = options, browserStackUsername = _options2.browserStackUsername, browserStackAccessKey = _options2.browserStackAccessKey; if (!browserStackUsername || !browserStackAccessKey) { throw new Error('To use browserstack, you must specify BROWSER_STACK_USERNAME and BROWSER_STACK_ACCESS_KEY in ' + 'enviornment variables or provide browserStackUsername and browserStackAccessKey as options.'); } remoteURI = 'http://hub-cloud.browserstack.com/wd/hub'; capabilities['browserstack.user'] = browserStackUsername; capabilities['browserstack.key'] = browserStackAccessKey; break; case 'testingbot': var _options3 = options, testingBotKey = _options3.testingBotKey, testingBotSecret = _options3.testingBotSecret; if (!testingBotKey || !testingBotSecret) { throw new Error('To use testingbot, you must specify TESTING_BOT_KEY and TESTING_BOT_SECRET in enviornment ' + 'variables or provide testingBotKey and testingBotSecret as options.'); } remoteURI = 'http://' + testingBotKey + ':' + testingBotSecret + '@hub.testingbot.com/wd/hub'; break; } this._connection = new _connection2.default(remote, remoteURI, this.debug); this.session = this._createSession(remote, this._connection, (0, _extends3.default)({}, options, { capabilities: capabilities })); this.browser = new _browser2.default(this, options); this.timeOut = new _timeOut2.default(this); this.activeWindow = new _activeWindow2.default(this, options); this.ime = new _ime2.default(this); this.cookieStorage = new _cookieStorage2.default(this); this.localStorage = new _localStorage2.default(this); this.sessionStorage = new _sessionStorage2.default(this); deprecate.property(this, 'browser', 'All properties of browser are now directly available on the Driver object'); } /* * Get the Local-Storage object. */ /* * Get the IME object. */ /* * Timeout configuration */ /* * The options that were originally passed in to createCabbieDriver */ /* * @private */ /* * The current session. You can pass this session to createCabbieDriver to convert * between sync and async drivers. e.g. * * ```js * const driver = createCabbieDriver(oldDriver.remote, {...oldDriver.options, session: oldDriver.session}); * ``` */ (0, _createClass3.default)(Driver, [{ key: '_createSession', value: function _createSession(remote /*: string*/, connection /*: Connection*/, options /*: Options*/) /*: Promise<Session>*/ { var _remoteType2, _connectionType, _optionsType2, _returnType; return _regenerator2.default.async(function _createSession$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _remoteType2 = _flowRuntime2.default.string(); _connectionType = _flowRuntime2.default.ref(_connection2.default); _optionsType2 = _flowRuntime2.default.ref(Options); _returnType = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.ref(Session), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.ref(Session)))); _flowRuntime2.default.param('remote', _remoteType2).assert(remote); _flowRuntime2.default.param('connection', _connectionType).assert(connection); _flowRuntime2.default.param('options', _optionsType2).assert(options); if (!(remote === 'taxirank')) { _context.next = 11; break; } _context.next = 10; return _regenerator2.default.awrap(startTaxiRank(connection)); case 10: this._closeTaxiRank = _context.sent; case 11: return _context.abrupt('return', _returnType.assert(createSession(remote, this._connection, options))); case 12: case 'end': return _context.stop(); } } }, null, this); } /* * Performs a context dependent JSON request for the current session. * The result is parsed for errors. * @private */ }, { key: 'requestJSON', value: function requestJSON(method /*: HttpMethod*/, path /*: string*/, body /*:: ?: Object*/) /*: Promise<any>*/ { var _methodType, _pathType, _bodyType, _returnType2, session; return _regenerator2.default.async(function requestJSON$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _methodType = _flowRuntime2.default.ref(HttpMethod); _pathType = _flowRuntime2.default.string(); _bodyType = _flowRuntime2.default.object(); _returnType2 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.any(), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.any()))); _flowRuntime2.default.param('method', _methodType).assert(method); _flowRuntime2.default.param('path', _pathType).assert(path); _flowRuntime2.default.param('body', _bodyType, true).assert(body); _context2.next = 9; return _regenerator2.default.awrap(this.session); case 9: session = _context2.sent; return _context2.abrupt('return', _returnType2.assert(this._connection.requestWithSession(session, method, path, { json: body }))); case 11: case 'end': return _context2.stop(); } } }, null, this); } /* * Get an array of windows for all available windows */ }, { key: 'getWindows', value: function getWindows() /*: Promise<Array<WindowHandle>>*/ { var _this = this; var _returnType3, windowHandles; return _regenerator2.default.async(function getWindows$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _returnType3 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.array(_flowRuntime2.default.ref(_windowHandle2.default)), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.array(_flowRuntime2.default.ref(_windowHandle2.default))))); _context3.next = 3; return _regenerator2.default.awrap(this.requestJSON('GET', '/window_handles')); case 3: windowHandles = _context3.sent; return _context3.abrupt('return', _returnType3.assert(windowHandles.map(function (windowHandle) { return new _windowHandle2.default(_this, windowHandle); }))); case 5: case 'end': return _context3.stop(); } } }, null, this); } /* * Get the current browser orientation */ }, { key: 'getOrientation', value: function getOrientation() /*: Promise<BrowserOrientation>*/ { var _returnType4; return _regenerator2.default.async(function getOrientation$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _returnType4 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.ref(BrowserOrientation), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.ref(BrowserOrientation)))); return _context4.abrupt('return', _returnType4.assert(this.requestJSON('GET', '/orientation'))); case 2: case 'end': return _context4.stop(); } } }, null, this); } /* * Get the current browser orientation */ }, { key: 'setOrientation', value: function setOrientation(orientation /*: BrowserOrientation*/) /*: Promise<void>*/ { var _orientationType, _returnType5; return _regenerator2.default.async(function setOrientation$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: _orientationType = _flowRuntime2.default.ref(BrowserOrientation); _returnType5 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.void(), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.void()))); _flowRuntime2.default.param('orientation', _orientationType).assert(orientation); _context5.next = 5; return _regenerator2.default.awrap(this.requestJSON('POST', '/orientation', { orientation: orientation })); case 5: case 'end': return _context5.stop(); } } }, null, this); } /* * Get the current geo location */ }, { key: 'getGeoLocation', value: function getGeoLocation() /*: Promise<{ latitude: number; longitude: number; altitude: number; }>*/ { var _returnType6; return _regenerator2.default.async(function getGeoLocation$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: _returnType6 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.object(_flowRuntime2.default.property('latitude', _flowRuntime2.default.number()), _flowRuntime2.default.property('longitude', _flowRuntime2.default.number()), _flowRuntime2.default.property('altitude', _flowRuntime2.default.number())), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.object(_flowRuntime2.default.property('latitude', _flowRuntime2.default.number()), _flowRuntime2.default.property('longitude', _flowRuntime2.default.number()), _flowRuntime2.default.property('altitude', _flowRuntime2.default.number()))))); _context6.t0 = _returnType6; _context6.next = 4; return _regenerator2.default.awrap(this.requestJSON('GET', '/location')); case 4: _context6.t1 = _context6.sent; return _context6.abrupt('return', _context6.t0.assert.call(_context6.t0, _context6.t1)); case 6: case 'end': return _context6.stop(); } } }, null, this); } /* * Set the current geo location */ }, { key: 'setGeoLocation', value: function setGeoLocation(loc /*: { latitude: number; longitude: number; altitude: number; }*/) /*: Promise<void>*/ { var _locType, _returnType7; return _regenerator2.default.async(function setGeoLocation$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: _locType = _flowRuntime2.default.object(_flowRuntime2.default.property('latitude', _flowRuntime2.default.number()), _flowRuntime2.default.property('longitude', _flowRuntime2.default.number()), _flowRuntime2.default.property('altitude', _flowRuntime2.default.number())); _returnType7 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.void(), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.void()))); _flowRuntime2.default.param('loc', _locType).assert(loc); _context7.next = 5; return _regenerator2.default.awrap(this.requestJSON('POST', '/location', loc)); case 5: case 'end': return _context7.stop(); } } }, null, this); } /* * Get the status of the html5 application cache */ }, { key: 'getApplicationCacheStatus', value: function getApplicationCacheStatus() /*: Promise<ApplicationCacheStatus>*/ { var _returnType8; return _regenerator2.default.async(function getApplicationCacheStatus$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: _returnType8 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.ref(ApplicationCacheStatus), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.ref(ApplicationCacheStatus)))); _context8.t0 = _returnType8; _context8.next = 4; return _regenerator2.default.awrap(this.requestJSON('GET', '/application_cache/status')); case 4: _context8.t1 = _context8.sent; return _context8.abrupt('return', _context8.t0.assert.call(_context8.t0, _context8.t1)); case 6: case 'end': return _context8.stop(); } } }, null, this); } /* * Get the log for a given log type. Log buffer is reset after each request. */ }, { key: 'getLogs', value: function getLogs(logType /*: string*/) /*: Promise<Array<LogEntry>>*/ { var _logTypeType, _returnType9; return _regenerator2.default.async(function getLogs$(_context9) { while (1) { switch (_context9.prev = _context9.next) { case 0: _logTypeType = _flowRuntime2.default.string(); _returnType9 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.array(_flowRuntime2.default.ref(LogEntry)), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.array(_flowRuntime2.default.ref(LogEntry))))); _flowRuntime2.default.param('logType', _logTypeType).assert(logType); _context9.t0 = _returnType9; _context9.next = 6; return _regenerator2.default.awrap(this.requestJSON('POST', '/log', { type: logType })); case 6: _context9.t1 = _context9.sent; return _context9.abrupt('return', _context9.t0.assert.call(_context9.t0, _context9.t1)); case 8: case 'end': return _context9.stop(); } } }, null, this); } /* * Get available log types */ }, { key: 'getLogTypes', value: function getLogTypes() /*: Promise<Array<string>>*/ { var _returnType10; return _regenerator2.default.async(function getLogTypes$(_context10) { while (1) { switch (_context10.prev = _context10.next) { case 0: _returnType10 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.array(_flowRuntime2.default.string()), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.array(_flowRuntime2.default.string())))); _context10.t0 = _returnType10; _context10.next = 4; return _regenerator2.default.awrap(this.requestJSON('GET', '/log/types')); case 4: _context10.t1 = _context10.sent; return _context10.abrupt('return', _context10.t0.assert.call(_context10.t0, _context10.t1)); case 6: case 'end': return _context10.stop(); } } }, null, this); } /* * End this Driver session */ }, { key: 'dispose', value: function dispose(status /*:: ?: Object*/) /*: Promise<void>*/ { var _statusType, _returnType11; return _regenerator2.default.async(function dispose$(_context11) { while (1) { switch (_context11.prev = _context11.next) { case 0: _statusType = _flowRuntime2.default.object(); _returnType11 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.void(), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.void()))); _flowRuntime2.default.param('status', _statusType, true).assert(status); if (!status) { _context11.next = 6; break; } _context11.next = 6; return _regenerator2.default.awrap(this.sauceJobUpdate(status)); case 6: _context11.next = 8; return _regenerator2.default.awrap(this.requestJSON('DELETE', '')); case 8: if (this._closeTaxiRank) { this._closeTaxiRank(); } case 9: case 'end': return _context11.stop(); } } }, null, this); } /* * Sauce Labs Methods */ }, { key: 'sauceJobUpdate', value: function sauceJobUpdate(body /*: Object*/) /*: Promise<boolean>*/ { var _bodyType2, _returnType12, remote, session, auth; return _regenerator2.default.async(function sauceJobUpdate$(_context12) { while (1) { switch (_context12.prev = _context12.next) { case 0: _bodyType2 = _flowRuntime2.default.object(); _returnType12 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.boolean(), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.boolean()))); _flowRuntime2.default.param('body', _bodyType2).assert(body); remote = _flowRuntime2.default.string().assert(this._connection.remote); _context12.next = 6; return _regenerator2.default.awrap(this.session); case 6: session = _context12.sent; if (!(remote.indexOf('saucelabs') === -1)) { _context12.next = 9; break; } return _context12.abrupt('return', _returnType12.assert(false)); case 9: if (!(body === undefined)) { _context12.next = 11; break; } return _context12.abrupt('return', _returnType12.assert(true)); case 11: auth = (0, _url.parse)(remote).auth; if (!(typeof auth !== 'string')) { _context12.next = 14; break; } throw new Error('Could not find sauce labs authentication in remote'); case 14: _context12.next = 16; return _regenerator2.default.awrap((0, _thenRequest2.default)('PUT', 'http://' + auth + '@saucelabs.com/rest/v1/' + auth.split(':')[0] + '/jobs/' + session.sessionID, { json: body })); case 16: return _context12.abrupt('return', _returnType12.assert(true)); case 17: case 'end': return _context12.stop(); } } }, null, this); } // TODO: provide instructions for converting async driver to sync driver and visa versersa }]); return Driver; }(); /* * End this Driver session * * Alias for `dispose` * @method quit */ _flowRuntime2.default.any().assert(Driver.prototype).quit = Driver.prototype.dispose; function startTaxiRank(connection /*: Connection*/) /*: Promise<() => void>*/ { var _connectionType2, _returnType13, started, res, version, expectedVersion, taxiRank, startTime, endTime, logger; return _regenerator2.default.async(function startTaxiRank$(_context13) { while (1) { switch (_context13.prev = _context13.next) { case 0: _connectionType2 = _flowRuntime2.default.ref(_connection2.default); _returnType13 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.function(_flowRuntime2.default.return(_flowRuntime2.default.void())), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.function(_flowRuntime2.default.return(_flowRuntime2.default.void()))))); _flowRuntime2.default.param('connection', _connectionType2).assert(connection); started = false; _context13.prev = 4; _context13.next = 7; return _regenerator2.default.awrap(connection.request('GET', '/version', { noRetries: true })); case 7: res = _context13.sent; if (res.statusCode === 200) { version = JSON.parse(res.body.toString('utf8')); expectedVersion = require('taxi-rank/package.json').version; started = version === expectedVersion; } _context13.next = 13; break; case 11: _context13.prev = 11; _context13.t0 = _context13['catch'](4); case 13: if (!process.env.CI) { _context13.next = 18; break; } if (!started) { _context13.next = 16; break; } return _context13.abrupt('return', _returnType13.assert(function () {})); case 16: taxiRank = (0, _crossSpawn2.default)(process.execPath, [require.resolve('./taxi-rank-ci.js')], { stdio: ['inherit', 'inherit', 'inherit'] }); return _context13.abrupt('return', _returnType13.assert(function () { return taxiRank.kill(); })); case 18: if (started) { _context13.next = 33; break; } console.log('starting taxi rank'); (0, _crossSpawn2.default)(process.execPath, [require.resolve('./taxi-rank.js')], { detached: true, stdio: ['ignore', 'ignore', 'ignore'] }).unref(); startTime = Date.now(); _context13.prev = 22; _context13.next = 25; return _regenerator2.default.awrap(connection.request('GET', '/version')); case 25: _context13.next = 33; break; case 27: _context13.prev = 27; _context13.t1 = _context13['catch'](22); endTime = Date.now(); console.log('Failed to start a detached server after ' + Math.round((endTime - startTime) / 1000) + ' seconds.'); console.log('Starting slower, attached server.'); (0, _crossSpawn2.default)(process.execPath, [require.resolve('./taxi-rank.js')], { stdio: ['inherit', 'inherit', 'inherit'] }); case 33: // this could be done in process for async mode, but must be a separate process for sync mode logger = (0, _crossSpawn2.default)(process.execPath, [require.resolve('./taxi-rank-log.js')], { stdio: ['inherit', 'inherit', 'inherit'] }); return _context13.abrupt('return', _returnType13.assert(function () { logger.kill(); })); case 35: case 'end': return _context13.stop(); } } }, null, this, [[4, 11], [22, 27]]); } _flowRuntime2.default.annotate(startTaxiRank, _flowRuntime2.default.function(_flowRuntime2.default.param('connection', _flowRuntime2.default.ref(_connection2.default)), _flowRuntime2.default.return(_flowRuntime2.default.ref('Promise', _flowRuntime2.default.function(_flowRuntime2.default.return(_flowRuntime2.default.void())))))); function createSession(remote /*: string*/, connection /*: Connection*/, options /*: Options*/) /*: Promise<Session>*/ { var _remoteType3, _connectionType3, _optionsType3, _returnType14, capabilities, res, err, _err, _err2, body; return _regenerator2.default.async(function createSession$(_context14) { while (1) { switch (_context14.prev = _context14.next) { case 0: _remoteType3 = _flowRuntime2.default.string(); _connectionType3 = _flowRuntime2.default.ref(_connection2.default); _optionsType3 = _flowRuntime2.default.ref(Options); _returnType14 = _flowRuntime2.default.return(_flowRuntime2.default.union(_flowRuntime2.default.ref(Session), _flowRuntime2.default.ref('Promise', _flowRuntime2.default.ref(Session)))); _flowRuntime2.default.param('remote', _remoteType3).assert(remote); _flowRuntime2.default.param('connection', _connectionType3).assert(connection); _flowRuntime2.default.param('options', _optionsType3).assert(options); if (!(options.session !== undefined)) { _context14.next = 9; break; } return _context14.abrupt('return', _returnType14.assert(options.session)); case 9: capabilities = _flowRuntime2.default.object().assert({}); capabilities.desiredCapabilities = options.capabilities || {}; if (options.requiredCapabilities) { capabilities.requiredCapabilities = options.requiredCapabilities; } _context14.next = 14; return _regenerator2.default.awrap(connection.request('POST', '/session', { json: capabilities })); case 14: res = _context14.sent; if (!(res.statusCode !== 200)) { _context14.next = 32; break; } _context14.t0 = remote; _context14.next = _context14.t0 === 'saucelabs' ? 19 : _context14.t0 === 'browserstack' ? 23 : _context14.t0 === 'testingbot' ? 27 : 31; break; case 19: if (!(res.statusCode === 401)) { _context14.next = 22; break; } err = new Error('Sauce Labs Authentication Failed.\r\nCheck the value of the SAUCE_USERNAME and SAUCE_ACCESS_KEY ' + 'environment variables exactly match your credentials, you passed in: ' + (0, _stringify2.default)(options.sauceUsername) + ' and ' + (0, _stringify2.default)(options.sauceAccessKey) + '.'); throw err; case 22: return _context14.abrupt('break', 31); case 23: if (!(res.statusCode === 401)) { _context14.next = 26; break; } _err = new Error('Browser Stack Authentication Failed.\r\nCheck the value of the BROWSER_STACK_USERNAME and BROWSER_STACK_ACCESS_KEY ' + 'environment variables exactly match your credentials, you passed in: ' + (0, _stringify2.default)(options.browserStackUsername) + ' and ' + (0, _stringify2.default)(options.browserStackAccessKey) + '.'); throw _err; case 26: return _context14.abrupt('break', 31); case 27: if (!(res.statusCode === 401)) { _context14.next = 30; break; } _err2 = new Error('Testing Bot Authentication Failed.\r\nCheck the value of the TESTING_BOT_KEY and TESTING_BOT_SECRET ' + 'environment variables exactly match your credentials, you passed in: ' + (0, _stringify2.default)(options.testingBotKey) + ' and ' + (0, _stringify2.default)(options.testingBotSecret) + '.'); throw _err2; case 30: return _context14.abrupt('break', 31); case 31: throw new Error('Failed to start a Selenium session. ' + remote + ' responded with status code ' + res.statusCode + ':\n' + res.body.toString('utf8')); case 32: body = JSON.parse(res.body.toString('utf8')); if (!(body.status === 0)) { _context14.next = 37; break; } return _context14.abrupt('return', _returnType14.assert({ sessionID: body.sessionId, capabilities: body.value })); case 37: throw (0, _errors.fromBody)(body); case 38: case 'end': return _context14.stop(); } } }, null, this); } _flowRuntime2.default.annotate(createSession, _flowRuntime2.default.function(_flowRuntime2.default.param('remote', _flowRuntime2.default.string()), _flowRuntime2.default.param('connection', _flowRuntime2.default.ref(_connection2.default)), _flowRuntime2.default.param('options', _flowRuntime2.default.ref(Options)), _flowRuntime2.default.return(_flowRuntime2.default.ref('Promise', _flowRuntime2.default.ref(Session))))); var environmentAliases = { SAUCE_USERNAME: 'sauceUsername', SAUCE_ACCESS_KEY: 'sauceAccessKey', BROWSER_STACK_USERNAME: 'browserStackUsername', BROWSER_STACK_ACCESS_KEY: 'browserStackAccessKey', TESTING_BOT_KEY: 'testingBotkey', TESTING_BOT_SECRET: 'testingBotSecret', // deprecated aliases TESTINGBOT_KEY: 'testingBotkey', TESTINGBOT_SECRET: 'testingBotSecret' }; function addEnvironment(options /*: Options*/) /*: Options*/ { var _optionsType4 = _flowRuntime2.default.ref(Options); var _returnType15 = _flowRuntime2.default.return(_flowRuntime2.default.ref(Options)); _flowRuntime2.default.param('options', _optionsType4).assert(options); var result = (0, _extends3.default)({}, options); (0, _keys2.default)(environmentAliases).forEach(function (key) { if (result[environmentAliases[key]] === undefined && process.env[key]) { result[environmentAliases[key]] = process.env[key]; } }); try { var parsedObj = (0, _dotenv.parse)((0, _fs.readFileSync)('.env.local', 'utf8')); (0, _keys2.default)(environmentAliases).forEach(function (key) { if (result[environmentAliases[key]] === undefined && parsedObj[key]) { result[environmentAliases[key]] = parsedObj[key]; } }); } catch (e) {} try { var _parsedObj = (0, _dotenv.parse)((0, _fs.readFileSync)('.env', 'utf8')); (0, _keys2.default)(environmentAliases).forEach(function (key) { if (result[environmentAliases[key]] === undefined && _parsedObj[key]) { result[environmentAliases[key]] = _parsedObj[key]; } }); } catch (e) {} return _returnType15.assert(result); } _flowRuntime2.default.annotate(addEnvironment, _flowRuntime2.default.function(_flowRuntime2.default.param('options', _flowRuntime2.default.ref(Options)), _flowRuntime2.default.return(_flowRuntime2.default.ref(Options)))); (0, _addDebugging2.default)(Driver); exports.default = Driver;