probe.gl
Version:
JavaScript Console Instrumentation and Benchmarking for Browser and Node
220 lines (181 loc) • 6.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _puppeteer = _interopRequireDefault(require("puppeteer"));
var _child_process = _interopRequireDefault(require("child_process"));
var _color = require("../../lib/utils/color");
var _log = _interopRequireDefault(require("../../lib/log"));
var _processUtils = require("./process-utils");
var DEFAULT_SERVER_CONFIG = {
command: 'webpack-dev-server',
arguments: [],
port: 'auto',
wait: 2000,
options: {
maxBuffer: 5000 * 1024
}
};
var DEFAULT_PUPPETEER_OPTIONS = {
headless: false,
defaultViewport: {
width: 800,
height: 600
}
};
var AUTO_PORT_START = 5000;
function noop() {}
function normalizeServerConfig(config, logger) {
var result = Object.assign({}, DEFAULT_SERVER_CONFIG);
if (config.process) {
result.command = config.process;
logger.deprecated('process', 'command');
}
if (config.parameters) {
result.arguments = config.parameters;
logger.deprecated('parameters', 'arguments');
}
Object.assign(result, config, {
options: Object.assign({}, result.options, config.options)
});
return result;
}
var BrowserDriver = function () {
function BrowserDriver() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref$id = _ref.id,
id = _ref$id === void 0 ? 'browser-driver' : _ref$id;
(0, _classCallCheck2.default)(this, BrowserDriver);
this.id = id;
this.logger = new _log.default({
id: id
});
this.server = null;
this.browser = null;
this.page = null;
this.port = null;
}
(0, _createClass2.default)(BrowserDriver, [{
key: "startBrowser",
value: function startBrowser() {
var _this = this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
options = Object.assign({}, DEFAULT_PUPPETEER_OPTIONS, options);
if (this.browser) {
return Promise.resolve(this.browser);
}
return _puppeteer.default.launch(options).then(function (browser) {
_this.browser = browser;
});
}
}, {
key: "openPage",
value: function openPage() {
var _this2 = this;
var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref2$url = _ref2.url,
url = _ref2$url === void 0 ? 'http://localhost' : _ref2$url,
_ref2$exposeFunctions = _ref2.exposeFunctions,
exposeFunctions = _ref2$exposeFunctions === void 0 ? {} : _ref2$exposeFunctions,
_ref2$onLoad = _ref2.onLoad,
onLoad = _ref2$onLoad === void 0 ? noop : _ref2$onLoad,
_ref2$onConsole = _ref2.onConsole,
onConsole = _ref2$onConsole === void 0 ? noop : _ref2$onConsole,
_ref2$onError = _ref2.onError,
onError = _ref2$onError === void 0 ? noop : _ref2$onError;
if (!this.browser) {
return Promise.reject(new Error('No browser instance is found. Forgot to call startBrowser()?'));
}
return this.browser.newPage().then(function (page) {
_this2.page = page;
page.on('load', onLoad);
page.on('console', onConsole);
page.on('error', onError);
var promises = [];
for (var name in exposeFunctions) {
promises.push(page.exposeFunction(name, exposeFunctions[name]));
}
return Promise.all(promises);
}).then(function (_) {
return _this2.page.goto(url);
});
}
}, {
key: "stopBrowser",
value: function stopBrowser() {
var _this3 = this;
if (this.browser) {
return this.browser.close().then(function () {
_this3.browser = null;
});
}
return Promise.resolve();
}
}, {
key: "startServer",
value: function startServer() {
var _this4 = this;
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
config = normalizeServerConfig(config, this.logger);
var getPort = config.port === 'auto' ? (0, _processUtils.getAvailablePort)(AUTO_PORT_START) : Promise.resolve(config.port);
return getPort.then(function (port) {
return new Promise(function (resolve, reject) {
var args = (0, _toConsumableArray2.default)(config.arguments);
if (port) {
args.push('--port', port);
}
var server = _child_process.default.spawn(config.command, args, config.options);
server.on('error', function (error) {
reject(error);
});
server.on('close', function () {
return function () {
_this4.server = null;
};
});
_this4.server = server;
_this4.port = port;
setTimeout(function () {
var url = "http://localhost:".concat(_this4.port);
_this4.logger.log({
message: "Started ".concat(config.command, " at ").concat(url),
color: _color.COLOR.BRIGHT_GREEN
})();
resolve(url);
}, config.wait);
});
});
}
}, {
key: "stopServer",
value: function stopServer() {
if (this.server) {
this.server.kill();
this.server = null;
}
return Promise.resolve();
}
}, {
key: "exit",
value: function exit() {
var _this5 = this;
var statusCode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
this.stopBrowser().then(function () {
return _this5.stopServer();
}).then(function () {
return process.exit(statusCode);
}).catch(function (error) {
_this5.logger.error(error.message || error);
process.exit(1);
});
}
}]);
return BrowserDriver;
}();
exports.default = BrowserDriver;
//# sourceMappingURL=browser-driver.js.map