1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/**
* Utilities for parsing WebDriver commands from HTTP Requests.
*/
"use strict";
var CommandName;
(function (CommandName) {
CommandName[CommandName["NewSession"] = 0] = "NewSession";
CommandName[CommandName["DeleteSession"] = 1] = "DeleteSession";
CommandName[CommandName["Status"] = 2] = "Status";
CommandName[CommandName["GetTimeouts"] = 3] = "GetTimeouts";
CommandName[CommandName["SetTimeouts"] = 4] = "SetTimeouts";
CommandName[CommandName["Go"] = 5] = "Go";
CommandName[CommandName["GetCurrentURL"] = 6] = "GetCurrentURL";
CommandName[CommandName["UNKNOWN"] = 7] = "UNKNOWN";
})(CommandName = exports.CommandName || (exports.CommandName = {}));
/**
* Represents an endpoint in the WebDriver spec. Endpoints are defined by
* the CommandName enum and the url pattern that they match.
*
* For example, the pattern
* /session/:sessionId/element/:elementId/click
* will match urls such as
* /session/d9e52b96-9b6a-4cb3-b017-76e8b4236646/element/1c2855ba-213d-4466-ba16-b14a7e6c3699/click
*
* @param pattern The url pattern
* @param method The HTTP method, ie GET, POST, DELETE
* @param name The CommandName of this endpoint.
*/
class Endpoint {
constructor(pattern, method, name) {
this.pattern = pattern;
this.method = method;
this.name = name;
}
/**
* Tests whether a given url from a request matches this endpoint.
*
* @param url A url from a request to test against the endpoint.
* @param method The HTTP method.
* @returns {boolean} Whether the endpoint matches.
*/
matches(url, method) {
let urlParts = url.split('/');
let patternParts = this.pattern.split('/');
if (method != this.method || urlParts.length != patternParts.length) {
return false;
}
// TODO: Replace this naive search with better parsing.
for (let idx in patternParts) {
if (!patternParts[idx].startsWith(':') && patternParts[idx] != urlParts[idx]) {
return false;
}
}
return true;
}
/**
* Given a url from a http request, create an object containing parameters from the URL.
*
* Parameters are the parts of the endpoint's pattern that start with ':'. The ':' is dropped
* from the parameter key.
*
* @param url The url from the request.
* @returns An object mapping parameter keys to values from the url.
*/
getParams(url) {
let urlParts = url.split('/');
let patternParts = this.pattern.split('/');
let params = {};
for (let idx in patternParts) {
if (patternParts[idx].startsWith(':')) {
let paramName = patternParts[idx].slice(1);
params[paramName] = urlParts[idx];
}
}
return params;
}
}
/**
* An instance of a WebDriver command, containing the params and data for that request.
*
* @param commandName The enum identifying the command.
* @param params Parameters for the command taken from the request's url.
* @param data Optional data included with the command, taken from the body of the request.
*/
class WebDriverCommand {
constructor(commandName, params, data) {
this.commandName = commandName;
this.data = data;
this.params = params;
}
getParam(key) {
return this.params[key];
}
}
exports.WebDriverCommand = WebDriverCommand;
/**
* The set of known endpoints.
*/
let endpoints = [];
function addWebDriverCommand(command, method, pattern) {
endpoints.push(new Endpoint(pattern, method, command));
}
/**
* Returns a new WebdriverCommand object for the resource at the given URL.
*/
function parseWebDriverCommand(url, method, data) {
let parsedData = {};
if (data) {
parsedData = JSON.parse(data);
}
for (let endpoint of endpoints) {
if (endpoint.matches(url, method)) {
let params = endpoint.getParams(url);
return new WebDriverCommand(endpoint.name, params, parsedData);
}
}
return new WebDriverCommand(CommandName.UNKNOWN, {}, { 'url': url });
}
exports.parseWebDriverCommand = parseWebDriverCommand;
let sessionPrefix = '/session/:sessionId';
addWebDriverCommand(CommandName.NewSession, 'POST', '/session');
addWebDriverCommand(CommandName.DeleteSession, 'DELETE', '/session/:sessionId');
addWebDriverCommand(CommandName.Status, 'GET', sessionPrefix + '/status');
addWebDriverCommand(CommandName.GetTimeouts, 'GET', sessionPrefix + '/timeouts');
addWebDriverCommand(CommandName.SetTimeouts, 'POST', sessionPrefix + '/timeouts');
addWebDriverCommand(CommandName.Go, 'POST', sessionPrefix + '/url');
addWebDriverCommand(CommandName.GetCurrentURL, 'GET', sessionPrefix + '/url');
//# sourceMappingURL=webdriverCommands.js.map