81 lines
3.5 KiB
JavaScript
Executable file
81 lines
3.5 KiB
JavaScript
Executable file
"use strict";
|
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const http = require("http");
|
|
const url = require("url");
|
|
const webdriver_commands_1 = require("./webdriver_commands");
|
|
/**
|
|
* A proxy that understands WebDriver commands. Users can add barriers (similar to middleware in
|
|
* express) that will be called before forwarding the request to WebDriver. The proxy will wait for
|
|
* each barrier to finish, calling them in the order in which they were added.
|
|
*/
|
|
class WebDriverProxy {
|
|
constructor(seleniumAddress) {
|
|
this.barriers = [];
|
|
this.seleniumAddress = seleniumAddress;
|
|
}
|
|
addBarrier(barrier) {
|
|
this.barriers.push(barrier);
|
|
}
|
|
handleRequest(originalRequest, response) {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
let command = webdriver_commands_1.parseWebDriverCommand(originalRequest.url, originalRequest.method);
|
|
let replyWithError = (err) => {
|
|
response.writeHead(502);
|
|
if (err && err.toString) {
|
|
response.write(err.toString());
|
|
}
|
|
response.end();
|
|
};
|
|
// Process barriers in order, one at a time.
|
|
try {
|
|
for (let barrier of this.barriers) {
|
|
yield barrier.onCommand(command);
|
|
}
|
|
}
|
|
catch (err) {
|
|
replyWithError(err);
|
|
// Don't call through if a barrier fails.
|
|
return;
|
|
}
|
|
let parsedUrl = url.parse(this.seleniumAddress);
|
|
let options = {};
|
|
options.method = originalRequest.method;
|
|
options.path = parsedUrl.path + originalRequest.url;
|
|
options.hostname = parsedUrl.hostname;
|
|
options.port = parseInt(parsedUrl.port);
|
|
options.headers = originalRequest.headers;
|
|
let forwardedRequest = http.request(options);
|
|
// clang-format off
|
|
let reqData = '';
|
|
originalRequest.on('data', (d) => {
|
|
reqData += d;
|
|
forwardedRequest.write(d);
|
|
}).on('end', () => {
|
|
command.handleData(reqData);
|
|
forwardedRequest.end();
|
|
}).on('error', replyWithError);
|
|
forwardedRequest.on('response', (seleniumResponse) => {
|
|
response.writeHead(seleniumResponse.statusCode, seleniumResponse.headers);
|
|
let respData = '';
|
|
seleniumResponse.on('data', (d) => {
|
|
respData += d;
|
|
response.write(d);
|
|
}).on('end', () => {
|
|
command.handleResponse(seleniumResponse.statusCode, respData);
|
|
response.end();
|
|
}).on('error', replyWithError);
|
|
}).on('error', replyWithError);
|
|
// clang-format on
|
|
});
|
|
}
|
|
}
|
|
exports.WebDriverProxy = WebDriverProxy;
|
|
//# sourceMappingURL=webdriver_proxy.js.map
|