@appium/base-driver 8.7.3 → 9.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/basedriver/capabilities.d.ts +11 -163
- package/build/lib/basedriver/capabilities.d.ts.map +1 -1
- package/build/lib/basedriver/capabilities.js +355 -236
- package/build/lib/basedriver/capabilities.js.map +1 -1
- package/build/lib/basedriver/commands/event.d.ts +7 -6
- package/build/lib/basedriver/commands/event.d.ts.map +1 -1
- package/build/lib/basedriver/commands/event.js +55 -35
- package/build/lib/basedriver/commands/event.js.map +1 -1
- package/build/lib/basedriver/commands/execute.d.ts +7 -6
- package/build/lib/basedriver/commands/execute.d.ts.map +1 -1
- package/build/lib/basedriver/commands/execute.js +66 -58
- package/build/lib/basedriver/commands/execute.js.map +1 -1
- package/build/lib/basedriver/commands/find.d.ts +9 -7
- package/build/lib/basedriver/commands/find.d.ts.map +1 -1
- package/build/lib/basedriver/commands/find.js +102 -54
- package/build/lib/basedriver/commands/find.js.map +1 -1
- package/build/lib/basedriver/commands/index.d.ts +3 -7
- package/build/lib/basedriver/commands/index.d.ts.map +1 -1
- package/build/lib/basedriver/commands/index.js +30 -33
- package/build/lib/basedriver/commands/index.js.map +1 -1
- package/build/lib/basedriver/commands/log.d.ts +8 -9
- package/build/lib/basedriver/commands/log.d.ts.map +1 -1
- package/build/lib/basedriver/commands/log.js +54 -38
- package/build/lib/basedriver/commands/log.js.map +1 -1
- package/build/lib/basedriver/commands/session.d.ts +7 -6
- package/build/lib/basedriver/commands/session.d.ts.map +1 -1
- package/build/lib/basedriver/commands/session.js +46 -39
- package/build/lib/basedriver/commands/session.js.map +1 -1
- package/build/lib/basedriver/commands/settings.d.ts +7 -7
- package/build/lib/basedriver/commands/settings.d.ts.map +1 -1
- package/build/lib/basedriver/commands/settings.js +35 -28
- package/build/lib/basedriver/commands/settings.js.map +1 -1
- package/build/lib/basedriver/commands/timeout.d.ts +7 -5
- package/build/lib/basedriver/commands/timeout.d.ts.map +1 -1
- package/build/lib/basedriver/commands/timeout.js +144 -162
- package/build/lib/basedriver/commands/timeout.js.map +1 -1
- package/build/lib/basedriver/core.d.ts +6 -157
- package/build/lib/basedriver/core.d.ts.map +1 -1
- package/build/lib/basedriver/core.js +361 -230
- package/build/lib/basedriver/core.js.map +1 -1
- package/build/lib/basedriver/desired-caps.js +80 -110
- package/build/lib/basedriver/desired-caps.js.map +1 -1
- package/build/lib/basedriver/device-settings.js +57 -62
- package/build/lib/basedriver/device-settings.js.map +1 -1
- package/build/lib/basedriver/driver.d.ts +11 -262
- package/build/lib/basedriver/driver.d.ts.map +1 -1
- package/build/lib/basedriver/driver.js +362 -262
- package/build/lib/basedriver/driver.js.map +1 -1
- package/build/lib/basedriver/helpers.js +500 -495
- package/build/lib/basedriver/helpers.js.map +1 -1
- package/build/lib/basedriver/logger.d.ts +1 -1
- package/build/lib/basedriver/logger.d.ts.map +1 -1
- package/build/lib/basedriver/logger.js +5 -15
- package/build/lib/basedriver/logger.js.map +1 -1
- package/build/lib/constants.js +14 -14
- package/build/lib/constants.js.map +1 -1
- package/build/lib/express/crash.js +8 -15
- package/build/lib/express/crash.js.map +1 -1
- package/build/lib/express/express-logging.js +49 -59
- package/build/lib/express/express-logging.js.map +1 -1
- package/build/lib/express/idempotency.js +125 -177
- package/build/lib/express/idempotency.js.map +1 -1
- package/build/lib/express/logger.d.ts +1 -1
- package/build/lib/express/logger.d.ts.map +1 -1
- package/build/lib/express/logger.js +5 -15
- package/build/lib/express/logger.js.map +1 -1
- package/build/lib/express/middleware.js +82 -107
- package/build/lib/express/middleware.js.map +1 -1
- package/build/lib/express/server.d.ts +17 -5
- package/build/lib/express/server.d.ts.map +1 -1
- package/build/lib/express/server.js +259 -224
- package/build/lib/express/server.js.map +1 -1
- package/build/lib/express/static.js +64 -81
- package/build/lib/express/static.js.map +1 -1
- package/build/lib/express/websocket.js +115 -87
- package/build/lib/express/websocket.js.map +1 -1
- package/build/lib/helpers/capabilities.d.ts +1 -59
- package/build/lib/helpers/capabilities.d.ts.map +1 -1
- package/build/lib/helpers/capabilities.js +72 -69
- package/build/lib/helpers/capabilities.js.map +1 -1
- package/build/lib/index.js +64 -180
- package/build/lib/index.js.map +1 -1
- package/build/lib/jsonwp-proxy/protocol-converter.js +215 -227
- package/build/lib/jsonwp-proxy/protocol-converter.js.map +1 -1
- package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -1
- package/build/lib/jsonwp-proxy/proxy.js +355 -393
- package/build/lib/jsonwp-proxy/proxy.js.map +1 -1
- package/build/lib/jsonwp-status/status.js +119 -130
- package/build/lib/jsonwp-status/status.js.map +1 -1
- package/build/lib/protocol/errors.d.ts +135 -32
- package/build/lib/protocol/errors.d.ts.map +1 -1
- package/build/lib/protocol/errors.js +871 -919
- package/build/lib/protocol/errors.js.map +1 -1
- package/build/lib/protocol/helpers.js +37 -37
- package/build/lib/protocol/helpers.js.map +1 -1
- package/build/lib/protocol/index.js +22 -109
- package/build/lib/protocol/index.js.map +1 -1
- package/build/lib/protocol/protocol.js +394 -350
- package/build/lib/protocol/protocol.js.map +1 -1
- package/build/lib/protocol/routes.d.ts +1248 -4
- package/build/lib/protocol/routes.d.ts.map +1 -1
- package/build/lib/protocol/routes.js +972 -1327
- package/build/lib/protocol/routes.js.map +1 -1
- package/build/lib/protocol/validators.js +32 -39
- package/build/lib/protocol/validators.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/basedriver/capabilities.js +83 -39
- package/lib/basedriver/commands/event.js +10 -5
- package/lib/basedriver/commands/execute.js +14 -9
- package/lib/basedriver/commands/find.js +18 -12
- package/lib/basedriver/commands/index.js +21 -16
- package/lib/basedriver/commands/log.js +24 -18
- package/lib/basedriver/commands/session.js +10 -5
- package/lib/basedriver/commands/settings.js +9 -6
- package/lib/basedriver/commands/timeout.js +10 -4
- package/lib/basedriver/core.js +2 -3
- package/lib/basedriver/driver.js +12 -16
- package/lib/express/server.js +6 -3
- package/lib/protocol/errors.js +155 -44
- package/lib/protocol/routes.js +19 -7
- package/package.json +16 -18
|
@@ -1,282 +1,382 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
var _capabilities2 = require("../helpers/capabilities");
|
|
21
|
-
|
|
22
|
-
var _protocol = require("../protocol");
|
|
23
|
-
|
|
24
|
-
var _commands = require("./commands");
|
|
25
|
-
|
|
26
|
-
var _helpers = _interopRequireDefault(require("./helpers"));
|
|
27
|
-
|
|
28
|
-
var _types = require("@appium/types");
|
|
29
|
-
|
|
30
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
31
|
-
|
|
2
|
+
/* eslint-disable require-await */
|
|
3
|
+
/* eslint-disable no-unused-vars */
|
|
4
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
|
+
};
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.BaseDriver = exports.BaseDriverCore = void 0;
|
|
9
|
+
const capabilities_1 = require("./capabilities");
|
|
10
|
+
const core_1 = require("./core");
|
|
11
|
+
const support_1 = require("@appium/support");
|
|
12
|
+
const bluebird_1 = __importDefault(require("bluebird"));
|
|
13
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
14
|
+
const capabilities_2 = require("../helpers/capabilities");
|
|
15
|
+
const protocol_1 = require("../protocol");
|
|
16
|
+
const commands_1 = require("./commands");
|
|
17
|
+
const helpers_1 = __importDefault(require("./helpers"));
|
|
18
|
+
const types_1 = require("@appium/types");
|
|
32
19
|
const EVENT_SESSION_INIT = 'newSessionRequested';
|
|
33
20
|
const EVENT_SESSION_START = 'newSessionStarted';
|
|
34
21
|
const EVENT_SESSION_QUIT_START = 'quitSessionRequested';
|
|
35
22
|
const EVENT_SESSION_QUIT_DONE = 'quitSessionFinished';
|
|
36
23
|
const ON_UNEXPECTED_SHUTDOWN_EVENT = 'onUnexpectedShutdown';
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if (cmd === 'createSession') {
|
|
59
|
-
this.protocol = (0, _protocol.determineProtocol)(args);
|
|
60
|
-
this.logEvent(EVENT_SESSION_INIT);
|
|
61
|
-
} else if (cmd === _protocol.DELETE_SESSION_COMMAND) {
|
|
62
|
-
this.logEvent(EVENT_SESSION_QUIT_START);
|
|
24
|
+
/**
|
|
25
|
+
* @implements {SessionHandler<C>}
|
|
26
|
+
* @template {Constraints} C
|
|
27
|
+
* @template {StringRecord} [CArgs=StringRecord]
|
|
28
|
+
* @extends {DriverCore<C>}
|
|
29
|
+
*/
|
|
30
|
+
class BaseDriverCore extends core_1.DriverCore {
|
|
31
|
+
/**
|
|
32
|
+
*
|
|
33
|
+
* @param {DriverOpts<C>} opts
|
|
34
|
+
* @param {boolean} shouldValidateCaps
|
|
35
|
+
*/
|
|
36
|
+
constructor(opts = /** @type {DriverOpts<C>} */ ({}), shouldValidateCaps = true) {
|
|
37
|
+
super(opts, shouldValidateCaps);
|
|
38
|
+
/**
|
|
39
|
+
* This must be assigned here because the declaration of {@linkcode BaseDriverCore.opts} above
|
|
40
|
+
* blows away {@linkcode DriverCore.opts}.
|
|
41
|
+
*/
|
|
42
|
+
this.opts = opts;
|
|
43
|
+
this.caps = {};
|
|
44
|
+
this.cliArgs = /** @type {CArgs & ServerArgs} */ ({});
|
|
63
45
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Contains the base constraints plus whatever the subclass wants to add.
|
|
48
|
+
*
|
|
49
|
+
* Subclasses _shouldn't_ need to use this. If you need to use this, please create
|
|
50
|
+
* an issue:
|
|
51
|
+
* @see https://github.com/appium/appium/issues/new
|
|
52
|
+
* @type {Readonly<BaseDriverCapConstraints & C>}
|
|
53
|
+
* @protected
|
|
54
|
+
*/
|
|
55
|
+
get _desiredCapConstraints() {
|
|
56
|
+
return Object.freeze(lodash_1.default.merge({}, types_1.BASE_DESIRED_CAP_CONSTRAINTS, this.desiredCapConstraints));
|
|
69
57
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
58
|
+
// This is the main command handler for the driver. It wraps command
|
|
59
|
+
// execution with timeout logic, checking that we have a valid session,
|
|
60
|
+
// and ensuring that we execute commands one at a time. This method is called
|
|
61
|
+
// by MJSONWP's express router.
|
|
62
|
+
/**
|
|
63
|
+
* @param {string} cmd
|
|
64
|
+
* @param {...any} args
|
|
65
|
+
* @returns {Promise<any>}
|
|
66
|
+
*/
|
|
67
|
+
async executeCommand(cmd, ...args) {
|
|
68
|
+
// get start time for this command, and log in special cases
|
|
69
|
+
let startTime = Date.now();
|
|
70
|
+
if (cmd === 'createSession') {
|
|
71
|
+
// If creating a session determine if W3C or MJSONWP protocol was requested and remember the choice
|
|
72
|
+
this.protocol = (0, protocol_1.determineProtocol)(args);
|
|
73
|
+
this.logEvent(EVENT_SESSION_INIT);
|
|
74
|
+
}
|
|
75
|
+
else if (cmd === protocol_1.DELETE_SESSION_COMMAND) {
|
|
76
|
+
this.logEvent(EVENT_SESSION_QUIT_START);
|
|
77
|
+
}
|
|
78
|
+
// if we had a command timer running, clear it now that we're starting
|
|
79
|
+
// a new command and so don't want to time out
|
|
80
|
+
await this.clearNewCommandTimeout();
|
|
81
|
+
if (this.shutdownUnexpectedly) {
|
|
82
|
+
throw new protocol_1.errors.NoSuchDriverError('The driver was unexpectedly shut down!');
|
|
83
|
+
}
|
|
84
|
+
// If we don't have this command, it must not be implemented
|
|
85
|
+
if (!this[cmd]) {
|
|
86
|
+
throw new protocol_1.errors.NotYetImplementedError();
|
|
87
|
+
}
|
|
88
|
+
let unexpectedShutdownListener;
|
|
89
|
+
const commandExecutor = async () => await bluebird_1.default.race([
|
|
90
|
+
this[cmd](...args),
|
|
91
|
+
new bluebird_1.default((resolve, reject) => {
|
|
92
|
+
unexpectedShutdownListener = reject;
|
|
93
|
+
this.eventEmitter.on(ON_UNEXPECTED_SHUTDOWN_EVENT, unexpectedShutdownListener);
|
|
94
|
+
}),
|
|
95
|
+
]).finally(() => {
|
|
96
|
+
if (unexpectedShutdownListener) {
|
|
97
|
+
// This is needed to prevent memory leaks
|
|
98
|
+
this.eventEmitter.removeListener(ON_UNEXPECTED_SHUTDOWN_EVENT, unexpectedShutdownListener);
|
|
99
|
+
unexpectedShutdownListener = null;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
const res = this.isCommandsQueueEnabled
|
|
103
|
+
? await this.commandsQueueGuard.acquire(BaseDriver.name, commandExecutor)
|
|
104
|
+
: await commandExecutor();
|
|
105
|
+
// if we have set a new command timeout (which is the default), start a
|
|
106
|
+
// timer once we've finished executing this command. If we don't clear
|
|
107
|
+
// the timer (which is done when a new command comes in), we will trigger
|
|
108
|
+
// automatic session deletion in this.onCommandTimeout. Of course we don't
|
|
109
|
+
// want to trigger the timer when the user is shutting down the session
|
|
110
|
+
// intentionally
|
|
111
|
+
if (this.isCommandsQueueEnabled && cmd !== protocol_1.DELETE_SESSION_COMMAND) {
|
|
112
|
+
// resetting existing timeout
|
|
113
|
+
await this.startNewCommandTimeout();
|
|
114
|
+
}
|
|
115
|
+
// log timing information about this command
|
|
116
|
+
const endTime = Date.now();
|
|
117
|
+
this._eventHistory.commands.push({ cmd, startTime, endTime });
|
|
118
|
+
if (cmd === 'createSession') {
|
|
119
|
+
this.logEvent(EVENT_SESSION_START);
|
|
120
|
+
}
|
|
121
|
+
else if (cmd === protocol_1.DELETE_SESSION_COMMAND) {
|
|
122
|
+
this.logEvent(EVENT_SESSION_QUIT_DONE);
|
|
123
|
+
}
|
|
124
|
+
return res;
|
|
73
125
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
if (this.isCommandsQueueEnabled && cmd !== _protocol.DELETE_SESSION_COMMAND) {
|
|
90
|
-
await this.startNewCommandTimeout();
|
|
126
|
+
/**
|
|
127
|
+
*
|
|
128
|
+
* @param {Error|import('../protocol/errors').NoSuchDriverError} err
|
|
129
|
+
*/
|
|
130
|
+
async startUnexpectedShutdown(err = new protocol_1.errors.NoSuchDriverError('The driver was unexpectedly shut down!')) {
|
|
131
|
+
this.eventEmitter.emit(ON_UNEXPECTED_SHUTDOWN_EVENT, err); // allow others to listen for this
|
|
132
|
+
this.shutdownUnexpectedly = true;
|
|
133
|
+
try {
|
|
134
|
+
if (this.sessionId !== null) {
|
|
135
|
+
await this.deleteSession(this.sessionId);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
this.shutdownUnexpectedly = false;
|
|
140
|
+
}
|
|
91
141
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
142
|
+
async startNewCommandTimeout() {
|
|
143
|
+
// make sure there are no rogue timeouts
|
|
144
|
+
await this.clearNewCommandTimeout();
|
|
145
|
+
// if command timeout is 0, it is disabled
|
|
146
|
+
if (!this.newCommandTimeoutMs)
|
|
147
|
+
return; // eslint-disable-line curly
|
|
148
|
+
this.noCommandTimer = setTimeout(async () => {
|
|
149
|
+
this.log.warn(`Shutting down because we waited ` +
|
|
150
|
+
`${this.newCommandTimeoutMs / 1000.0} seconds for a command`);
|
|
151
|
+
const errorMessage = `New Command Timeout of ` +
|
|
152
|
+
`${this.newCommandTimeoutMs / 1000.0} seconds ` +
|
|
153
|
+
`expired. Try customizing the timeout using the ` +
|
|
154
|
+
`'newCommandTimeout' desired capability`;
|
|
155
|
+
await this.startUnexpectedShutdown(new Error(errorMessage));
|
|
156
|
+
}, this.newCommandTimeoutMs);
|
|
105
157
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
} finally {
|
|
119
|
-
this.shutdownUnexpectedly = false;
|
|
158
|
+
/**
|
|
159
|
+
*
|
|
160
|
+
* @param {import('@appium/types').AppiumServer} server
|
|
161
|
+
* @param {string} host
|
|
162
|
+
* @param {number} port
|
|
163
|
+
* @param {string} path
|
|
164
|
+
*/
|
|
165
|
+
assignServer(server, host, port, path) {
|
|
166
|
+
this.server = server;
|
|
167
|
+
this.serverHost = host;
|
|
168
|
+
this.serverPort = port;
|
|
169
|
+
this.serverPath = path;
|
|
120
170
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
171
|
+
/*
|
|
172
|
+
* Restart the session with the original caps,
|
|
173
|
+
* preserving the timeout config.
|
|
174
|
+
*/
|
|
175
|
+
async reset() {
|
|
176
|
+
this.log.debug('Resetting app mid-session');
|
|
177
|
+
this.log.debug('Running generic full reset');
|
|
178
|
+
// preserving state
|
|
179
|
+
let currentConfig = {};
|
|
180
|
+
for (let property of [
|
|
181
|
+
'implicitWaitMs',
|
|
182
|
+
'newCommandTimeoutMs',
|
|
183
|
+
'sessionId',
|
|
184
|
+
'resetOnUnexpectedShutdown',
|
|
185
|
+
]) {
|
|
186
|
+
currentConfig[property] = this[property];
|
|
187
|
+
}
|
|
188
|
+
// We also need to preserve the unexpected shutdown, and make sure it is not cancelled during reset.
|
|
189
|
+
this.resetOnUnexpectedShutdown = () => { };
|
|
190
|
+
try {
|
|
191
|
+
if (this.sessionId !== null) {
|
|
192
|
+
await this.deleteSession(this.sessionId);
|
|
193
|
+
}
|
|
194
|
+
this.log.debug('Restarting app');
|
|
195
|
+
await this.createSession(this.originalCaps);
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
198
|
+
// always restore state.
|
|
199
|
+
for (let [key, value] of lodash_1.default.toPairs(currentConfig)) {
|
|
200
|
+
this[key] = value;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
await this.clearNewCommandTimeout();
|
|
147
204
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
205
|
+
/**
|
|
206
|
+
*
|
|
207
|
+
* Historically the first two arguments were reserved for JSONWP capabilities.
|
|
208
|
+
* Appium 2 has dropped the support of these, so now we only accept capability
|
|
209
|
+
* objects in W3C format and thus allow any of the three arguments to represent
|
|
210
|
+
* the latter.
|
|
211
|
+
* @param {W3CCapabilities<C>} w3cCapabilities1
|
|
212
|
+
* @param {W3CCapabilities<C>} [w3cCapabilities2]
|
|
213
|
+
* @param {W3CCapabilities<C>} [w3cCapabilities]
|
|
214
|
+
* @param {DriverData[]} [driverData]
|
|
215
|
+
* @returns {Promise<[string,Capabilities<C>]>}
|
|
216
|
+
*/
|
|
217
|
+
async createSession(w3cCapabilities1, w3cCapabilities2, w3cCapabilities, driverData) {
|
|
218
|
+
if (this.sessionId !== null) {
|
|
219
|
+
throw new protocol_1.errors.SessionNotCreatedError('Cannot create a new session while one is in progress');
|
|
220
|
+
}
|
|
221
|
+
this.log.debug();
|
|
222
|
+
const originalCaps = lodash_1.default.cloneDeep([w3cCapabilities, w3cCapabilities1, w3cCapabilities2].find(capabilities_2.isW3cCaps));
|
|
223
|
+
if (!originalCaps) {
|
|
224
|
+
throw new protocol_1.errors.SessionNotCreatedError('Appium only supports W3C-style capability objects. ' +
|
|
225
|
+
'Your client is sending an older capabilities format. Please update your client library.');
|
|
226
|
+
}
|
|
227
|
+
this.setProtocolW3C();
|
|
228
|
+
this.originalCaps = originalCaps;
|
|
229
|
+
this.log.debug(`Creating session with W3C capabilities: ${JSON.stringify(originalCaps, null, 2)}`);
|
|
230
|
+
/** @type {Capabilities<C>} */
|
|
231
|
+
let caps;
|
|
232
|
+
try {
|
|
233
|
+
caps = (0, capabilities_1.processCapabilities)((0, capabilities_1.promoteAppiumOptions)(originalCaps), this._desiredCapConstraints, this.shouldValidateCaps);
|
|
234
|
+
caps = (0, capabilities_2.fixCaps)(caps, this._desiredCapConstraints, this.log);
|
|
235
|
+
}
|
|
236
|
+
catch (e) {
|
|
237
|
+
throw new protocol_1.errors.SessionNotCreatedError(e.message);
|
|
238
|
+
}
|
|
239
|
+
this.validateDesiredCaps(caps);
|
|
240
|
+
this.sessionId = support_1.util.uuidV4();
|
|
241
|
+
this.caps = caps;
|
|
242
|
+
// merge caps onto opts so we don't need to worry about what's where
|
|
243
|
+
this.opts = { ...lodash_1.default.cloneDeep(this.initialOpts), ...this.caps };
|
|
244
|
+
// deal with resets
|
|
245
|
+
// some people like to do weird things by setting noReset and fullReset
|
|
246
|
+
// both to true, but this is misguided and strange, so error here instead
|
|
247
|
+
if (this.opts.noReset && this.opts.fullReset) {
|
|
248
|
+
throw new Error("The 'noReset' and 'fullReset' capabilities are mutually " +
|
|
249
|
+
'exclusive and should not both be set to true. You ' +
|
|
250
|
+
"probably meant to just use 'fullReset' on its own");
|
|
251
|
+
}
|
|
252
|
+
if (this.opts.noReset === true) {
|
|
253
|
+
this.opts.fullReset = false;
|
|
254
|
+
}
|
|
255
|
+
if (this.opts.fullReset === true) {
|
|
256
|
+
this.opts.noReset = false;
|
|
257
|
+
}
|
|
258
|
+
this.opts.fastReset = !this.opts.fullReset && !this.opts.noReset;
|
|
259
|
+
this.opts.skipUninstall = this.opts.fastReset || this.opts.noReset;
|
|
260
|
+
// Prevents empty string caps so we don't need to test it everywhere
|
|
261
|
+
if (typeof this.opts.app === 'string' && this.opts.app.trim() === '') {
|
|
262
|
+
delete this.opts.app;
|
|
263
|
+
}
|
|
264
|
+
if (!lodash_1.default.isUndefined(this.caps.newCommandTimeout)) {
|
|
265
|
+
this.newCommandTimeoutMs = /** @type {number} */ (this.caps.newCommandTimeout) * 1000;
|
|
266
|
+
}
|
|
267
|
+
this._log.prefix = helpers_1.default.generateDriverLogPrefix(this, this.sessionId);
|
|
268
|
+
this.log.info(`Session created with session id: ${this.sessionId}`);
|
|
269
|
+
return [this.sessionId, caps];
|
|
162
270
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
271
|
+
/**
|
|
272
|
+
*
|
|
273
|
+
* @param {string} [sessionId]
|
|
274
|
+
* @param {DriverData[]} [driverData]
|
|
275
|
+
* @returns {Promise<void>}
|
|
276
|
+
*/
|
|
277
|
+
async deleteSession(sessionId, driverData) {
|
|
278
|
+
await this.clearNewCommandTimeout();
|
|
279
|
+
if (this.isCommandsQueueEnabled && this.commandsQueueGuard.isBusy()) {
|
|
280
|
+
// simple hack to release pending commands if they exist
|
|
281
|
+
// @ts-ignore
|
|
282
|
+
for (const key of lodash_1.default.keys(this.commandsQueueGuard.queues)) {
|
|
283
|
+
// @ts-ignore
|
|
284
|
+
this.commandsQueueGuard.queues[key] = [];
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
this.sessionId = null;
|
|
288
|
+
this._log.prefix = helpers_1.default.generateDriverLogPrefix(this);
|
|
170
289
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
290
|
+
/**
|
|
291
|
+
*
|
|
292
|
+
* @param {Capabilities<C>} caps
|
|
293
|
+
*/
|
|
294
|
+
logExtraCaps(caps) {
|
|
295
|
+
let extraCaps = lodash_1.default.difference(lodash_1.default.keys(caps), lodash_1.default.keys(this._desiredCapConstraints));
|
|
296
|
+
if (extraCaps.length) {
|
|
297
|
+
this.log.warn(`The following capabilities were provided, but are not ` + `recognized by Appium:`);
|
|
298
|
+
for (const cap of extraCaps) {
|
|
299
|
+
this.log.warn(` ${cap}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
178
302
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
303
|
+
/**
|
|
304
|
+
*
|
|
305
|
+
* @param {Capabilities<C>} caps
|
|
306
|
+
* @returns {boolean}
|
|
307
|
+
*/
|
|
308
|
+
validateDesiredCaps(caps) {
|
|
309
|
+
if (!this.shouldValidateCaps) {
|
|
310
|
+
return true;
|
|
311
|
+
}
|
|
312
|
+
try {
|
|
313
|
+
(0, capabilities_1.validateCaps)(caps, this._desiredCapConstraints);
|
|
314
|
+
}
|
|
315
|
+
catch (e) {
|
|
316
|
+
this.log.errorAndThrow(new protocol_1.errors.SessionNotCreatedError(`The desiredCapabilities object was not valid for the ` +
|
|
317
|
+
`following reason(s): ${e.message}`));
|
|
318
|
+
}
|
|
319
|
+
this.logExtraCaps(caps);
|
|
320
|
+
return true;
|
|
196
321
|
}
|
|
197
|
-
|
|
198
|
-
this.validateDesiredCaps(caps);
|
|
199
|
-
this.sessionId = _support.util.uuidV4();
|
|
200
|
-
this.caps = caps;
|
|
201
|
-
this.opts = { ..._lodash.default.cloneDeep(this.initialOpts),
|
|
202
|
-
...this.caps
|
|
203
|
-
};
|
|
204
|
-
|
|
205
|
-
if (this.opts.noReset && this.opts.fullReset) {
|
|
206
|
-
throw new Error("The 'noReset' and 'fullReset' capabilities are mutually " + 'exclusive and should not both be set to true. You ' + "probably meant to just use 'fullReset' on its own");
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
if (this.opts.noReset === true) {
|
|
210
|
-
this.opts.fullReset = false;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
if (this.opts.fullReset === true) {
|
|
214
|
-
this.opts.noReset = false;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
this.opts.fastReset = !this.opts.fullReset && !this.opts.noReset;
|
|
218
|
-
this.opts.skipUninstall = this.opts.fastReset || this.opts.noReset;
|
|
219
|
-
|
|
220
|
-
if (typeof this.opts.app === 'string' && this.opts.app.trim() === '') {
|
|
221
|
-
delete this.opts.app;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
if (!_lodash.default.isUndefined(this.caps.newCommandTimeout)) {
|
|
225
|
-
this.newCommandTimeoutMs = this.caps.newCommandTimeout * 1000;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
this._log.prefix = _helpers.default.generateDriverLogPrefix(this, this.sessionId);
|
|
229
|
-
this.log.info(`Session created with session id: ${this.sessionId}`);
|
|
230
|
-
return [this.sessionId, caps];
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
async deleteSession(sessionId, driverData) {
|
|
234
|
-
await this.clearNewCommandTimeout();
|
|
235
|
-
|
|
236
|
-
if (this.isCommandsQueueEnabled && this.commandsQueueGuard.isBusy()) {
|
|
237
|
-
for (const key of _lodash.default.keys(this.commandsQueueGuard.queues)) {
|
|
238
|
-
this.commandsQueueGuard.queues[key] = [];
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
this.sessionId = null;
|
|
243
|
-
this._log.prefix = _helpers.default.generateDriverLogPrefix(this);
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
logExtraCaps(caps) {
|
|
247
|
-
let extraCaps = _lodash.default.difference(_lodash.default.keys(caps), _lodash.default.keys(this._desiredCapConstraints));
|
|
248
|
-
|
|
249
|
-
if (extraCaps.length) {
|
|
250
|
-
this.log.warn(`The following capabilities were provided, but are not ` + `recognized by Appium:`);
|
|
251
|
-
|
|
252
|
-
for (const cap of extraCaps) {
|
|
253
|
-
this.log.warn(` ${cap}`);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
validateDesiredCaps(caps) {
|
|
259
|
-
if (!this.shouldValidateCaps) {
|
|
260
|
-
return true;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
try {
|
|
264
|
-
(0, _capabilities.validateCaps)(caps, this._desiredCapConstraints);
|
|
265
|
-
} catch (e) {
|
|
266
|
-
this.log.errorAndThrow(new _protocol.errors.SessionNotCreatedError(`The desiredCapabilities object was not valid for the ` + `following reason(s): ${e.message}`));
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
this.logExtraCaps(caps);
|
|
270
|
-
return true;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
322
|
}
|
|
274
|
-
|
|
275
323
|
exports.BaseDriverCore = BaseDriverCore;
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
324
|
+
/**
|
|
325
|
+
* This ensures that all of the mixins correctly implement the interface described in {@linkcode Driver}.
|
|
326
|
+
* @template {Constraints} [C={}]
|
|
327
|
+
* @implements {Driver<C>}
|
|
328
|
+
*/
|
|
329
|
+
class BaseDriver extends (0, commands_1.createBaseDriverClass)(BaseDriverCore) {
|
|
330
|
+
}
|
|
279
331
|
exports.BaseDriver = BaseDriver;
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFVkVOVF9TRVNTSU9OX0lOSVQiLCJFVkVOVF9TRVNTSU9OX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX0RPTkUiLCJPTl9VTkVYUEVDVEVEX1NIVVRET1dOX0VWRU5UIiwiQmFzZURyaXZlckNvcmUiLCJEcml2ZXJDb3JlIiwiY2xpQXJncyIsImNhcHMiLCJvcmlnaW5hbENhcHMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJvcHRzIiwiQkFTRV9ERVNJUkVEX0NBUF9DT05TVFJBSU5UUyIsImNvbnN0cnVjdG9yIiwic2hvdWxkVmFsaWRhdGVDYXBzIiwiX2Rlc2lyZWRDYXBDb25zdHJhaW50cyIsIk9iamVjdCIsImZyZWV6ZSIsIl8iLCJtZXJnZSIsImV4ZWN1dGVDb21tYW5kIiwiY21kIiwiYXJncyIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJwcm90b2NvbCIsImRldGVybWluZVByb3RvY29sIiwibG9nRXZlbnQiLCJERUxFVEVfU0VTU0lPTl9DT01NQU5EIiwiY2xlYXJOZXdDb21tYW5kVGltZW91dCIsInNodXRkb3duVW5leHBlY3RlZGx5IiwiZXJyb3JzIiwiTm9TdWNoRHJpdmVyRXJyb3IiLCJOb3RZZXRJbXBsZW1lbnRlZEVycm9yIiwidW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXIiLCJjb21tYW5kRXhlY3V0b3IiLCJCIiwicmFjZSIsInJlc29sdmUiLCJyZWplY3QiLCJldmVudEVtaXR0ZXIiLCJvbiIsImZpbmFsbHkiLCJyZW1vdmVMaXN0ZW5lciIsInJlcyIsImlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQiLCJjb21tYW5kc1F1ZXVlR3VhcmQiLCJhY3F1aXJlIiwiQmFzZURyaXZlciIsIm5hbWUiLCJzdGFydE5ld0NvbW1hbmRUaW1lb3V0IiwiZW5kVGltZSIsIl9ldmVudEhpc3RvcnkiLCJjb21tYW5kcyIsInB1c2giLCJzdGFydFVuZXhwZWN0ZWRTaHV0ZG93biIsImVyciIsImVtaXQiLCJzZXNzaW9uSWQiLCJkZWxldGVTZXNzaW9uIiwibmV3Q29tbWFuZFRpbWVvdXRNcyIsIm5vQ29tbWFuZFRpbWVyIiwic2V0VGltZW91dCIsImxvZyIsIndhcm4iLCJlcnJvck1lc3NhZ2UiLCJFcnJvciIsImFzc2lnblNlcnZlciIsInNlcnZlciIsImhvc3QiLCJwb3J0IiwicGF0aCIsInNlcnZlckhvc3QiLCJzZXJ2ZXJQb3J0Iiwic2VydmVyUGF0aCIsInJlc2V0IiwiZGVidWciLCJjdXJyZW50Q29uZmlnIiwicHJvcGVydHkiLCJyZXNldE9uVW5leHBlY3RlZFNodXRkb3duIiwiY3JlYXRlU2Vzc2lvbiIsImtleSIsInZhbHVlIiwidG9QYWlycyIsInczY0NhcGFiaWxpdGllczEiLCJ3M2NDYXBhYmlsaXRpZXMyIiwidzNjQ2FwYWJpbGl0aWVzIiwiZHJpdmVyRGF0YSIsIlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IiLCJjbG9uZURlZXAiLCJmaW5kIiwiaXNXM2NDYXBzIiwic2V0UHJvdG9jb2xXM0MiLCJKU09OIiwic3RyaW5naWZ5IiwicHJvY2Vzc0NhcGFiaWxpdGllcyIsIkFQUElVTV9PUFRTX0NBUCIsIlBSRUZJWEVEX0FQUElVTV9PUFRTX0NBUCIsInByb21vdGVBcHBpdW1PcHRpb25zIiwiZml4Q2FwcyIsImUiLCJtZXNzYWdlIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsInV0aWwiLCJ1dWlkVjQiLCJpbml0aWFsT3B0cyIsIm5vUmVzZXQiLCJmdWxsUmVzZXQiLCJmYXN0UmVzZXQiLCJza2lwVW5pbnN0YWxsIiwiYXBwIiwidHJpbSIsImlzVW5kZWZpbmVkIiwibmV3Q29tbWFuZFRpbWVvdXQiLCJfbG9nIiwicHJlZml4IiwiaGVscGVycyIsImdlbmVyYXRlRHJpdmVyTG9nUHJlZml4IiwiaW5mbyIsImlzQnVzeSIsImtleXMiLCJxdWV1ZXMiLCJsb2dFeHRyYUNhcHMiLCJleHRyYUNhcHMiLCJkaWZmZXJlbmNlIiwibGVuZ3RoIiwiY2FwIiwidmFsaWRhdGVDYXBzIiwiZXJyb3JBbmRUaHJvdyIsImNyZWF0ZUJhc2VEcml2ZXJDbGFzcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9iYXNlZHJpdmVyL2RyaXZlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSByZXF1aXJlLWF3YWl0ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG5pbXBvcnQge1xuICB2YWxpZGF0ZUNhcHMsXG4gIEFQUElVTV9PUFRTX0NBUCxcbiAgUFJFRklYRURfQVBQSVVNX09QVFNfQ0FQLFxuICBwcm9jZXNzQ2FwYWJpbGl0aWVzLFxuICBwcm9tb3RlQXBwaXVtT3B0aW9ucyxcbn0gZnJvbSAnLi9jYXBhYmlsaXRpZXMnO1xuaW1wb3J0IHtEcml2ZXJDb3JlfSBmcm9tICcuL2NvcmUnO1xuaW1wb3J0IHt1dGlsfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7Zml4Q2FwcywgaXNXM2NDYXBzfSBmcm9tICcuLi9oZWxwZXJzL2NhcGFiaWxpdGllcyc7XG5pbXBvcnQge0RFTEVURV9TRVNTSU9OX0NPTU1BTkQsIGRldGVybWluZVByb3RvY29sLCBlcnJvcnN9IGZyb20gJy4uL3Byb3RvY29sJztcbmltcG9ydCB7Y3JlYXRlQmFzZURyaXZlckNsYXNzfSBmcm9tICcuL2NvbW1hbmRzJztcbmltcG9ydCBoZWxwZXJzIGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge0JBU0VfREVTSVJFRF9DQVBfQ09OU1RSQUlOVFN9IGZyb20gJ0BhcHBpdW0vdHlwZXMnO1xuXG5jb25zdCBFVkVOVF9TRVNTSU9OX0lOSVQgPSAnbmV3U2Vzc2lvblJlcXVlc3RlZCc7XG5jb25zdCBFVkVOVF9TRVNTSU9OX1NUQVJUID0gJ25ld1Nlc3Npb25TdGFydGVkJztcbmNvbnN0IEVWRU5UX1NFU1NJT05fUVVJVF9TVEFSVCA9ICdxdWl0U2Vzc2lvblJlcXVlc3RlZCc7XG5jb25zdCBFVkVOVF9TRVNTSU9OX1FVSVRfRE9ORSA9ICdxdWl0U2Vzc2lvbkZpbmlzaGVkJztcbmNvbnN0IE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQgPSAnb25VbmV4cGVjdGVkU2h1dGRvd24nO1xuXG4vKipcbiAqIEBpbXBsZW1lbnRzIHtTZXNzaW9uSGFuZGxlcjxDPn1cbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IENcbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfSBbQ0FyZ3M9U3RyaW5nUmVjb3JkXVxuICogQGV4dGVuZHMge0RyaXZlckNvcmU8Qz59XG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlRHJpdmVyQ29yZSBleHRlbmRzIERyaXZlckNvcmUge1xuICAvKipcbiAgICogQHR5cGUge0NBcmdzICYgU2VydmVyQXJnc31cbiAgICovXG4gIGNsaUFyZ3M7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtDYXBhYmlsaXRpZXM8Qz59XG4gICAqL1xuICBjYXBzO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7VzNDQ2FwYWJpbGl0aWVzPEM+fVxuICAgKi9cbiAgb3JpZ2luYWxDYXBzO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7Q31cbiAgICovXG4gIGRlc2lyZWRDYXBDb25zdHJhaW50cztcblxuICAvKipcbiAgICogQHR5cGUge0RyaXZlck9wdHM8Qz4gJiBEcml2ZXJPcHRzPEJhc2VEcml2ZXJDYXBDb25zdHJhaW50cz59XG4gICAqL1xuICBvcHRzO1xuXG4gIHN0YXRpYyBCQVNFX0RFU0lSRURfQ0FQX0NPTlNUUkFJTlRTID0gQkFTRV9ERVNJUkVEX0NBUF9DT05TVFJBSU5UUztcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtEcml2ZXJPcHRzPEM+fSBvcHRzXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkVmFsaWRhdGVDYXBzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRzID0gLyoqIEB0eXBlIHtEcml2ZXJPcHRzPEM+fSAqLyAoe30pLCBzaG91bGRWYWxpZGF0ZUNhcHMgPSB0cnVlKSB7XG4gICAgc3VwZXIob3B0cywgc2hvdWxkVmFsaWRhdGVDYXBzKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbXVzdCBiZSBhc3NpZ25lZCBoZXJlIGJlY2F1c2UgdGhlIGRlY2xhcmF0aW9uIG9mIHtAbGlua2NvZGUgQmFzZURyaXZlckNvcmUub3B0c30gYWJvdmVcbiAgICAgKiBibG93cyBhd2F5IHtAbGlua2NvZGUgRHJpdmVyQ29yZS5vcHRzfS5cbiAgICAgKi9cbiAgICB0aGlzLm9wdHMgPSBvcHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIHRoZSBiYXNlIGNvbnN0cmFpbnRzIHBsdXMgd2hhdGV2ZXIgdGhlIHN1YmNsYXNzIHdhbnRzIHRvIGFkZC5cbiAgICpcbiAgICogU3ViY2xhc3NlcyBfc2hvdWxkbid0XyBuZWVkIHRvIHVzZSB0aGlzLiBJZiB5b3UgbmVlZCB0byB1c2UgdGhpcywgcGxlYXNlIGNyZWF0ZVxuICAgKiBhbiBpc3N1ZTpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvbmV3XG4gICAqIEB0eXBlIHtSZWFkb25seTxCYXNlRHJpdmVyQ2FwQ29uc3RyYWludHMgJiBDPn1cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgZ2V0IF9kZXNpcmVkQ2FwQ29uc3RyYWludHMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoXy5tZXJnZSh7fSwgQkFTRV9ERVNJUkVEX0NBUF9DT05TVFJBSU5UUywgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMpKTtcbiAgfVxuXG4gIC8vIFRoaXMgaXMgdGhlIG1haW4gY29tbWFuZCBoYW5kbGVyIGZvciB0aGUgZHJpdmVyLiBJdCB3cmFwcyBjb21tYW5kXG4gIC8vIGV4ZWN1dGlvbiB3aXRoIHRpbWVvdXQgbG9naWMsIGNoZWNraW5nIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIHNlc3Npb24sXG4gIC8vIGFuZCBlbnN1cmluZyB0aGF0IHdlIGV4ZWN1dGUgY29tbWFuZHMgb25lIGF0IGEgdGltZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkXG4gIC8vIGJ5IE1KU09OV1AncyBleHByZXNzIHJvdXRlci5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbWRcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBleGVjdXRlQ29tbWFuZChjbWQsIC4uLmFyZ3MpIHtcbiAgICAvLyBnZXQgc3RhcnQgdGltZSBmb3IgdGhpcyBjb21tYW5kLCBhbmQgbG9nIGluIHNwZWNpYWwgY2FzZXNcbiAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChjbWQgPT09ICdjcmVhdGVTZXNzaW9uJykge1xuICAgICAgLy8gSWYgY3JlYXRpbmcgYSBzZXNzaW9uIGRldGVybWluZSBpZiBXM0Mgb3IgTUpTT05XUCBwcm90b2NvbCB3YXMgcmVxdWVzdGVkIGFuZCByZW1lbWJlciB0aGUgY2hvaWNlXG4gICAgICB0aGlzLnByb3RvY29sID0gZGV0ZXJtaW5lUHJvdG9jb2woYXJncyk7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fSU5JVCk7XG4gICAgfSBlbHNlIGlmIChjbWQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgIHRoaXMubG9nRXZlbnQoRVZFTlRfU0VTU0lPTl9RVUlUX1NUQVJUKTtcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBoYWQgYSBjb21tYW5kIHRpbWVyIHJ1bm5pbmcsIGNsZWFyIGl0IG5vdyB0aGF0IHdlJ3JlIHN0YXJ0aW5nXG4gICAgLy8gYSBuZXcgY29tbWFuZCBhbmQgc28gZG9uJ3Qgd2FudCB0byB0aW1lIG91dFxuICAgIGF3YWl0IHRoaXMuY2xlYXJOZXdDb21tYW5kVGltZW91dCgpO1xuXG4gICAgaWYgKHRoaXMuc2h1dGRvd25VbmV4cGVjdGVkbHkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRHJpdmVyRXJyb3IoJ1RoZSBkcml2ZXIgd2FzIHVuZXhwZWN0ZWRseSBzaHV0IGRvd24hJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIGNvbW1hbmQsIGl0IG11c3Qgbm90IGJlIGltcGxlbWVudGVkXG4gICAgaWYgKCF0aGlzW2NtZF0pIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuTm90WWV0SW1wbGVtZW50ZWRFcnJvcigpO1xuICAgIH1cblxuICAgIGxldCB1bmV4cGVjdGVkU2h1dGRvd25MaXN0ZW5lcjtcbiAgICBjb25zdCBjb21tYW5kRXhlY3V0b3IgPSBhc3luYyAoKSA9PlxuICAgICAgYXdhaXQgQi5yYWNlKFtcbiAgICAgICAgdGhpc1tjbWRdKC4uLmFyZ3MpLFxuICAgICAgICBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXIgPSByZWplY3Q7XG4gICAgICAgICAgdGhpcy5ldmVudEVtaXR0ZXIub24oT05fVU5FWFBFQ1RFRF9TSFVURE9XTl9FVkVOVCwgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXIpO1xuICAgICAgICB9KSxcbiAgICAgIF0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBpZiAodW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXIpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuICAgICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLnJlbW92ZUxpc3RlbmVyKFxuICAgICAgICAgICAgT05fVU5FWFBFQ1RFRF9TSFVURE9XTl9FVkVOVCxcbiAgICAgICAgICAgIHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1bmV4cGVjdGVkU2h1dGRvd25MaXN0ZW5lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IHRoaXMuaXNDb21tYW5kc1F1ZXVlRW5hYmxlZFxuICAgICAgPyBhd2FpdCB0aGlzLmNvbW1hbmRzUXVldWVHdWFyZC5hY3F1aXJlKEJhc2VEcml2ZXIubmFtZSwgY29tbWFuZEV4ZWN1dG9yKVxuICAgICAgOiBhd2FpdCBjb21tYW5kRXhlY3V0b3IoKTtcblxuICAgIC8vIGlmIHdlIGhhdmUgc2V0IGEgbmV3IGNvbW1hbmQgdGltZW91dCAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLCBzdGFydCBhXG4gICAgLy8gdGltZXIgb25jZSB3ZSd2ZSBmaW5pc2hlZCBleGVjdXRpbmcgdGhpcyBjb21tYW5kLiBJZiB3ZSBkb24ndCBjbGVhclxuICAgIC8vIHRoZSB0aW1lciAod2hpY2ggaXMgZG9uZSB3aGVuIGEgbmV3IGNvbW1hbmQgY29tZXMgaW4pLCB3ZSB3aWxsIHRyaWdnZXJcbiAgICAvLyBhdXRvbWF0aWMgc2Vzc2lvbiBkZWxldGlvbiBpbiB0aGlzLm9uQ29tbWFuZFRpbWVvdXQuIE9mIGNvdXJzZSB3ZSBkb24ndFxuICAgIC8vIHdhbnQgdG8gdHJpZ2dlciB0aGUgdGltZXIgd2hlbiB0aGUgdXNlciBpcyBzaHV0dGluZyBkb3duIHRoZSBzZXNzaW9uXG4gICAgLy8gaW50ZW50aW9uYWxseVxuICAgIGlmICh0aGlzLmlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQgJiYgY21kICE9PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAvLyByZXNldHRpbmcgZXhpc3RpbmcgdGltZW91dFxuICAgICAgYXdhaXQgdGhpcy5zdGFydE5ld0NvbW1hbmRUaW1lb3V0KCk7XG4gICAgfVxuXG4gICAgLy8gbG9nIHRpbWluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbW1hbmRcbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLl9ldmVudEhpc3RvcnkuY29tbWFuZHMucHVzaCh7Y21kLCBzdGFydFRpbWUsIGVuZFRpbWV9KTtcbiAgICBpZiAoY21kID09PSAnY3JlYXRlU2Vzc2lvbicpIHtcbiAgICAgIHRoaXMubG9nRXZlbnQoRVZFTlRfU0VTU0lPTl9TVEFSVCk7XG4gICAgfSBlbHNlIGlmIChjbWQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgIHRoaXMubG9nRXZlbnQoRVZFTlRfU0VTU0lPTl9RVUlUX0RPTkUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtFcnJvcnxpbXBvcnQoJy4uL3Byb3RvY29sL2Vycm9ycycpLk5vU3VjaERyaXZlckVycm9yfSBlcnJcbiAgICovXG4gIGFzeW5jIHN0YXJ0VW5leHBlY3RlZFNodXRkb3duKFxuICAgIGVyciA9IG5ldyBlcnJvcnMuTm9TdWNoRHJpdmVyRXJyb3IoJ1RoZSBkcml2ZXIgd2FzIHVuZXhwZWN0ZWRseSBzaHV0IGRvd24hJylcbiAgKSB7XG4gICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdChPTl9VTkVYUEVDVEVEX1NIVVRET1dOX0VWRU5ULCBlcnIpOyAvLyBhbGxvdyBvdGhlcnMgdG8gbGlzdGVuIGZvciB0aGlzXG4gICAgdGhpcy5zaHV0ZG93blVuZXhwZWN0ZWRseSA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNlc3Npb25JZCAhPT0gbnVsbCkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24odGhpcy5zZXNzaW9uSWQpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNodXRkb3duVW5leHBlY3RlZGx5ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnROZXdDb21tYW5kVGltZW91dCgpIHtcbiAgICAvLyBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHJvZ3VlIHRpbWVvdXRzXG4gICAgYXdhaXQgdGhpcy5jbGVhck5ld0NvbW1hbmRUaW1lb3V0KCk7XG5cbiAgICAvLyBpZiBjb21tYW5kIHRpbWVvdXQgaXMgMCwgaXQgaXMgZGlzYWJsZWRcbiAgICBpZiAoIXRoaXMubmV3Q29tbWFuZFRpbWVvdXRNcykgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICB0aGlzLm5vQ29tbWFuZFRpbWVyID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLmxvZy53YXJuKFxuICAgICAgICBgU2h1dHRpbmcgZG93biBiZWNhdXNlIHdlIHdhaXRlZCBgICtcbiAgICAgICAgICBgJHt0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMgLyAxMDAwLjB9IHNlY29uZHMgZm9yIGEgY29tbWFuZGBcbiAgICAgICk7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICBgTmV3IENvbW1hbmQgVGltZW91dCBvZiBgICtcbiAgICAgICAgYCR7dGhpcy5uZXdDb21tYW5kVGltZW91dE1zIC8gMTAwMC4wfSBzZWNvbmRzIGAgK1xuICAgICAgICBgZXhwaXJlZC4gVHJ5IGN1c3RvbWl6aW5nIHRoZSB0aW1lb3V0IHVzaW5nIHRoZSBgICtcbiAgICAgICAgYCduZXdDb21tYW5kVGltZW91dCcgZGVzaXJlZCBjYXBhYmlsaXR5YDtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24obmV3IEVycm9yKGVycm9yTWVzc2FnZSkpO1xuICAgIH0sIHRoaXMubmV3Q29tbWFuZFRpbWVvdXRNcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5BcHBpdW1TZXJ2ZXJ9IHNlcnZlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaG9zdFxuICAgKiBAcGFyYW0ge251bWJlcn0gcG9ydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgYXNzaWduU2VydmVyKHNlcnZlciwgaG9zdCwgcG9ydCwgcGF0aCkge1xuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuICAgIHRoaXMuc2VydmVySG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5zZXJ2ZXJQb3J0ID0gcG9ydDtcbiAgICB0aGlzLnNlcnZlclBhdGggPSBwYXRoO1xuICB9XG5cbiAgLypcbiAgICogUmVzdGFydCB0aGUgc2Vzc2lvbiB3aXRoIHRoZSBvcmlnaW5hbCBjYXBzLFxuICAgKiBwcmVzZXJ2aW5nIHRoZSB0aW1lb3V0IGNvbmZpZy5cbiAgICovXG4gIGFzeW5jIHJlc2V0KCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdSZXNldHRpbmcgYXBwIG1pZC1zZXNzaW9uJyk7XG4gICAgdGhpcy5sb2cuZGVidWcoJ1J1bm5pbmcgZ2VuZXJpYyBmdWxsIHJlc2V0Jyk7XG5cbiAgICAvLyBwcmVzZXJ2aW5nIHN0YXRlXG4gICAgbGV0IGN1cnJlbnRDb25maWcgPSB7fTtcbiAgICBmb3IgKGxldCBwcm9wZXJ0eSBvZiBbXG4gICAgICAnaW1wbGljaXRXYWl0TXMnLFxuICAgICAgJ25ld0NvbW1hbmRUaW1lb3V0TXMnLFxuICAgICAgJ3Nlc3Npb25JZCcsXG4gICAgICAncmVzZXRPblVuZXhwZWN0ZWRTaHV0ZG93bicsXG4gICAgXSkge1xuICAgICAgY3VycmVudENvbmZpZ1twcm9wZXJ0eV0gPSB0aGlzW3Byb3BlcnR5XTtcbiAgICB9XG5cbiAgICAvLyBXZSBhbHNvIG5lZWQgdG8gcHJlc2VydmUgdGhlIHVuZXhwZWN0ZWQgc2h1dGRvd24sIGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IGNhbmNlbGxlZCBkdXJpbmcgcmVzZXQuXG4gICAgdGhpcy5yZXNldE9uVW5leHBlY3RlZFNodXRkb3duID0gKCkgPT4ge307XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc2Vzc2lvbklkICE9PSBudWxsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbih0aGlzLnNlc3Npb25JZCk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnUmVzdGFydGluZyBhcHAnKTtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlU2Vzc2lvbih0aGlzLm9yaWdpbmFsQ2Fwcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIGFsd2F5cyByZXN0b3JlIHN0YXRlLlxuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIF8udG9QYWlycyhjdXJyZW50Q29uZmlnKSkge1xuICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbGVhck5ld0NvbW1hbmRUaW1lb3V0KCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogSGlzdG9yaWNhbGx5IHRoZSBmaXJzdCB0d28gYXJndW1lbnRzIHdlcmUgcmVzZXJ2ZWQgZm9yIEpTT05XUCBjYXBhYmlsaXRpZXMuXG4gICAqIEFwcGl1bSAyIGhhcyBkcm9wcGVkIHRoZSBzdXBwb3J0IG9mIHRoZXNlLCBzbyBub3cgd2Ugb25seSBhY2NlcHQgY2FwYWJpbGl0eVxuICAgKiBvYmplY3RzIGluIFczQyBmb3JtYXQgYW5kIHRodXMgYWxsb3cgYW55IG9mIHRoZSB0aHJlZSBhcmd1bWVudHMgdG8gcmVwcmVzZW50XG4gICAqIHRoZSBsYXR0ZXIuXG4gICAqIEBwYXJhbSB7VzNDQ2FwYWJpbGl0aWVzPEM+fSB3M2NDYXBhYmlsaXRpZXMxXG4gICAqIEBwYXJhbSB7VzNDQ2FwYWJpbGl0aWVzPEM+fSBbdzNjQ2FwYWJpbGl0aWVzMl1cbiAgICogQHBhcmFtIHtXM0NDYXBhYmlsaXRpZXM8Qz59IFt3M2NDYXBhYmlsaXRpZXNdXG4gICAqIEBwYXJhbSB7RHJpdmVyRGF0YVtdfSBbZHJpdmVyRGF0YV1cbiAgICogQHJldHVybnMge1Byb21pc2U8W3N0cmluZyxDYXBhYmlsaXRpZXM8Qz5dPn1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24odzNjQ2FwYWJpbGl0aWVzMSwgdzNjQ2FwYWJpbGl0aWVzMiwgdzNjQ2FwYWJpbGl0aWVzLCBkcml2ZXJEYXRhKSB7XG4gICAgaWYgKHRoaXMuc2Vzc2lvbklkICE9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoXG4gICAgICAgICdDYW5ub3QgY3JlYXRlIGEgbmV3IHNlc3Npb24gd2hpbGUgb25lIGlzIGluIHByb2dyZXNzJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZy5kZWJ1ZygpO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxDYXBzID0gXy5jbG9uZURlZXAoXG4gICAgICBbdzNjQ2FwYWJpbGl0aWVzLCB3M2NDYXBhYmlsaXRpZXMxLCB3M2NDYXBhYmlsaXRpZXMyXS5maW5kKGlzVzNjQ2FwcylcbiAgICApO1xuICAgIGlmICghb3JpZ2luYWxDYXBzKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoXG4gICAgICAgICdBcHBpdW0gb25seSBzdXBwb3J0cyBXM0Mtc3R5bGUgY2FwYWJpbGl0eSBvYmplY3RzLiAnICtcbiAgICAgICAgICAnWW91ciBjbGllbnQgaXMgc2VuZGluZyBhbiBvbGRlciBjYXBhYmlsaXRpZXMgZm9ybWF0LiBQbGVhc2UgdXBkYXRlIHlvdXIgY2xpZW50IGxpYnJhcnkuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFByb3RvY29sVzNDKCk7XG5cbiAgICB0aGlzLm9yaWdpbmFsQ2FwcyA9IG9yaWdpbmFsQ2FwcztcbiAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyBzZXNzaW9uIHdpdGggVzNDIGNhcGFiaWxpdGllczogJHtKU09OLnN0cmluZ2lmeShvcmlnaW5hbENhcHMsIG51bGwsIDIpfWBcbiAgICApO1xuXG4gICAgLyoqIEB0eXBlIHtDYXBhYmlsaXRpZXM8Qz59ICovXG4gICAgbGV0IGNhcHM7XG4gICAgdHJ5IHtcbiAgICAgIGNhcHMgPSBwcm9jZXNzQ2FwYWJpbGl0aWVzKFxuICAgICAgICBvcmlnaW5hbENhcHMsXG4gICAgICAgIHRoaXMuX2Rlc2lyZWRDYXBDb25zdHJhaW50cyxcbiAgICAgICAgdGhpcy5zaG91bGRWYWxpZGF0ZUNhcHNcbiAgICAgICk7XG4gICAgICBpZiAoY2Fwc1tBUFBJVU1fT1BUU19DQVBdKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBGb3VuZCAke1BSRUZJWEVEX0FQUElVTV9PUFRTX0NBUH0gY2FwYWJpbGl0eSBwcmVzZW50OyB3aWxsIHByb21vdGUgaXRlbXMgaW5zaWRlIHRvIGNhcHNgXG4gICAgICAgICk7XG4gICAgICAgIGNhcHMgPSBwcm9tb3RlQXBwaXVtT3B0aW9ucyhjYXBzKTtcbiAgICAgIH1cbiAgICAgIGNhcHMgPSBmaXhDYXBzKGNhcHMsIHRoaXMuX2Rlc2lyZWRDYXBDb25zdHJhaW50cywgdGhpcy5sb2cpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihlLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHRoaXMudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKTtcblxuICAgIHRoaXMuc2Vzc2lvbklkID0gdXRpbC51dWlkVjQoKTtcbiAgICB0aGlzLmNhcHMgPSBjYXBzO1xuICAgIC8vIG1lcmdlIGNhcHMgb250byBvcHRzIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgd2hhdCdzIHdoZXJlXG4gICAgdGhpcy5vcHRzID0gey4uLl8uY2xvbmVEZWVwKHRoaXMuaW5pdGlhbE9wdHMpLCAuLi50aGlzLmNhcHN9O1xuXG4gICAgLy8gZGVhbCB3aXRoIHJlc2V0c1xuICAgIC8vIHNvbWUgcGVvcGxlIGxpa2UgdG8gZG8gd2VpcmQgdGhpbmdzIGJ5IHNldHRpbmcgbm9SZXNldCBhbmQgZnVsbFJlc2V0XG4gICAgLy8gYm90aCB0byB0cnVlLCBidXQgdGhpcyBpcyBtaXNndWlkZWQgYW5kIHN0cmFuZ2UsIHNvIGVycm9yIGhlcmUgaW5zdGVhZFxuICAgIGlmICh0aGlzLm9wdHMubm9SZXNldCAmJiB0aGlzLm9wdHMuZnVsbFJlc2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVGhlICdub1Jlc2V0JyBhbmQgJ2Z1bGxSZXNldCcgY2FwYWJpbGl0aWVzIGFyZSBtdXR1YWxseSBcIiArXG4gICAgICAgICAgJ2V4Y2x1c2l2ZSBhbmQgc2hvdWxkIG5vdCBib3RoIGJlIHNldCB0byB0cnVlLiBZb3UgJyArXG4gICAgICAgICAgXCJwcm9iYWJseSBtZWFudCB0byBqdXN0IHVzZSAnZnVsbFJlc2V0JyBvbiBpdHMgb3duXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdHMubm9SZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5vcHRzLmZ1bGxSZXNldCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5vcHRzLm5vUmVzZXQgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5vcHRzLmZhc3RSZXNldCA9ICF0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMubm9SZXNldDtcbiAgICB0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCA9IHRoaXMub3B0cy5mYXN0UmVzZXQgfHwgdGhpcy5vcHRzLm5vUmVzZXQ7XG5cbiAgICAvLyBQcmV2ZW50cyBlbXB0eSBzdHJpbmcgY2FwcyBzbyB3ZSBkb24ndCBuZWVkIHRvIHRlc3QgaXQgZXZlcnl3aGVyZVxuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRzLmFwcCA9PT0gJ3N0cmluZycgJiYgdGhpcy5vcHRzLmFwcC50cmltKCkgPT09ICcnKSB7XG4gICAgICBkZWxldGUgdGhpcy5vcHRzLmFwcDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5jYXBzLm5ld0NvbW1hbmRUaW1lb3V0KSkge1xuICAgICAgdGhpcy5uZXdDb21tYW5kVGltZW91dE1zID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovICh0aGlzLmNhcHMubmV3Q29tbWFuZFRpbWVvdXQpICogMTAwMDtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2cucHJlZml4ID0gaGVscGVycy5nZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCh0aGlzLCB0aGlzLnNlc3Npb25JZCk7XG5cbiAgICB0aGlzLmxvZy5pbmZvKGBTZXNzaW9uIGNyZWF0ZWQgd2l0aCBzZXNzaW9uIGlkOiAke3RoaXMuc2Vzc2lvbklkfWApO1xuXG4gICAgcmV0dXJuIFt0aGlzLnNlc3Npb25JZCwgY2Fwc107XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZXNzaW9uSWRdXG4gICAqIEBwYXJhbSB7RHJpdmVyRGF0YVtdfSBbZHJpdmVyRGF0YV1cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkZWxldGVTZXNzaW9uKHNlc3Npb25JZCwgZHJpdmVyRGF0YSkge1xuICAgIGF3YWl0IHRoaXMuY2xlYXJOZXdDb21tYW5kVGltZW91dCgpO1xuICAgIGlmICh0aGlzLmlzQ29tbWFuZHNRdWV1ZUVuYWJsZWQgJiYgdGhpcy5jb21tYW5kc1F1ZXVlR3VhcmQuaXNCdXN5KCkpIHtcbiAgICAgIC8vIHNpbXBsZSBoYWNrIHRvIHJlbGVhc2UgcGVuZGluZyBjb21tYW5kcyBpZiB0aGV5IGV4aXN0XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBfLmtleXModGhpcy5jb21tYW5kc1F1ZXVlR3VhcmQucXVldWVzKSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuY29tbWFuZHNRdWV1ZUd1YXJkLnF1ZXVlc1trZXldID0gW107XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2Vzc2lvbklkID0gbnVsbDtcbiAgICB0aGlzLl9sb2cucHJlZml4ID0gaGVscGVycy5nZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0NhcGFiaWxpdGllc30gY2Fwc1xuICAgKi9cbiAgbG9nRXh0cmFDYXBzKGNhcHMpIHtcbiAgICBsZXQgZXh0cmFDYXBzID0gXy5kaWZmZXJlbmNlKF8ua2V5cyhjYXBzKSwgXy5rZXlzKHRoaXMuX2Rlc2lyZWRDYXBDb25zdHJhaW50cykpO1xuICAgIGlmIChleHRyYUNhcHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKFxuICAgICAgICBgVGhlIGZvbGxvd2luZyBjYXBhYmlsaXRpZXMgd2VyZSBwcm92aWRlZCwgYnV0IGFyZSBub3QgYCArIGByZWNvZ25pemVkIGJ5IEFwcGl1bTpgXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBjYXAgb2YgZXh0cmFDYXBzKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYCAgJHtjYXB9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Q2FwYWJpbGl0aWVzPEM+fSBjYXBzXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgdmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFZhbGlkYXRlQ2Fwcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlQ2FwcyhjYXBzLCB0aGlzLl9kZXNpcmVkQ2FwQ29uc3RyYWludHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coXG4gICAgICAgIG5ldyBlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcihcbiAgICAgICAgICBgVGhlIGRlc2lyZWRDYXBhYmlsaXRpZXMgb2JqZWN0IHdhcyBub3QgdmFsaWQgZm9yIHRoZSBgICtcbiAgICAgICAgICAgIGBmb2xsb3dpbmcgcmVhc29uKHMpOiAke2UubWVzc2FnZX1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2dFeHRyYUNhcHMoY2Fwcyk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgZW5zdXJlcyB0aGF0IGFsbCBvZiB0aGUgbWl4aW5zIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSBkZXNjcmliZWQgaW4ge0BsaW5rY29kZSBEcml2ZXJ9LlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9e31dXG4gKiBAaW1wbGVtZW50cyB7RHJpdmVyPEM+fVxuICovXG5leHBvcnQgY2xhc3MgQmFzZURyaXZlciBleHRlbmRzIGNyZWF0ZUJhc2VEcml2ZXJDbGFzcyhCYXNlRHJpdmVyQ29yZSkge31cbmV4cG9ydCBkZWZhdWx0IEJhc2VEcml2ZXI7XG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkhUVFBNZXRob2R9IEhUVFBNZXRob2RcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlcm5hbERyaXZlcn0gRXh0ZXJuYWxEcml2ZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJEYXRhfSBEcml2ZXJEYXRhXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ29uc3RyYWludHN9IENvbnN0cmFpbnRzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ29uc3RyYWludH0gQ29uc3RyYWludFxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlN0cmluZ1JlY29yZH0gU3RyaW5nUmVjb3JkXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQmFzZURyaXZlckNhcENvbnN0cmFpbnRzfSBCYXNlRHJpdmVyQ2FwQ29uc3RyYWludHNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TZXJ2ZXJBcmdzfSBTZXJ2ZXJBcmdzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgVXBkYXRlU2VydmVyQ2FsbGJhY2tcbiAqIEBwYXJhbSB7aW1wb3J0KCdleHByZXNzJykuRXhwcmVzc30gYXBwIC0gRXhwcmVzcyBhcHBcbiAqIEBwYXJhbSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtU2VydmVyfSBodHRwU2VydmVyIC0gSFRUUCBzZXJ2ZXJcbiAqIEByZXR1cm5zIHtpbXBvcnQoJ3R5cGUtZmVzdCcpLlByb21pc2FibGU8dm9pZD59XG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHVzZWQgdG8gZXh0ZW5kIHtAbGlua2NvZGUgQmFzZURyaXZlckNvcmV9IGJ5IHRoZSBtaXhpbnMgYW5kIGFsc28gZXh0ZXJuYWwgZHJpdmVycy5cbiAqIEB0ZW1wbGF0ZSBbUHJvdG89e31dXG4gKiBAdGVtcGxhdGUgW1N0YXRpYz17fV1cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DbGFzczxCYXNlRHJpdmVyQ29yZSAmIFByb3RvLGltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlclN0YXRpYyAmIFN0YXRpYz59IEJhc2VEcml2ZXJCYXNlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBbQz1CYXNlRHJpdmVyQ2FwQ29uc3RyYWludHNdXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuU2Vzc2lvbkhhbmRsZXI8W3N0cmluZywgb2JqZWN0XSx2b2lkLCBDPn0gU2Vzc2lvbkhhbmRsZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPUJhc2VEcml2ZXJDYXBDb25zdHJhaW50c11cbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfHZvaWR9IFtFeHRyYT12b2lkXVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNhcGFiaWxpdGllczxDLCBFeHRyYT59IENhcGFiaWxpdGllc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9QmFzZURyaXZlckNhcENvbnN0cmFpbnRzXVxuICogQHRlbXBsYXRlIHtTdHJpbmdSZWNvcmR8dm9pZH0gW0V4dHJhPXZvaWRdXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuVzNDQ2FwYWJpbGl0aWVzPEMsIEV4dHJhPn0gVzNDQ2FwYWJpbGl0aWVzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBDXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ29uc3RyYWludHNUb0NhcHM8Qz59IENvbnN0cmFpbnRzVG9DYXBzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBDXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyPEM+fSBEcml2ZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IENcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJPcHRzPEM+fSBEcml2ZXJPcHRzXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBR0E7O0FBT0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxrQkFBa0IsR0FBRyxxQkFBM0I7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxtQkFBNUI7QUFDQSxNQUFNQyx3QkFBd0IsR0FBRyxzQkFBakM7QUFDQSxNQUFNQyx1QkFBdUIsR0FBRyxxQkFBaEM7QUFDQSxNQUFNQyw0QkFBNEIsR0FBRyxzQkFBckM7O0FBUU8sTUFBTUMsY0FBTixTQUE2QkMsZ0JBQTdCLENBQXdDO0VBSTdDQyxPQUFPO0VBS1BDLElBQUk7RUFLSkMsWUFBWTtFQUtaQyxxQkFBcUI7RUFLckJDLElBQUk7RUFFK0IsT0FBNUJDLDRCQUE0QixHQUFHQSxtQ0FBSDs7RUFPbkNDLFdBQVcsQ0FBQ0YsSUFBSSxHQUFpQyxFQUF0QyxFQUEyQ0csa0JBQWtCLEdBQUcsSUFBaEUsRUFBc0U7SUFDL0UsTUFBTUgsSUFBTixFQUFZRyxrQkFBWjtJQU1BLEtBQUtILElBQUwsR0FBWUEsSUFBWjtFQUNEOztFQVd5QixJQUF0Qkksc0JBQXNCLEdBQUc7SUFDM0IsT0FBT0MsTUFBTSxDQUFDQyxNQUFQLENBQWNDLGVBQUEsQ0FBRUMsS0FBRixDQUFRLEVBQVIsRUFBWVAsbUNBQVos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
|
|
332
|
+
exports.default = BaseDriver;
|
|
333
|
+
/**
|
|
334
|
+
* @typedef {import('@appium/types').HTTPMethod} HTTPMethod
|
|
335
|
+
* @typedef {import('@appium/types').DriverData} DriverData
|
|
336
|
+
* @typedef {import('@appium/types').Constraints} Constraints
|
|
337
|
+
* @typedef {import('@appium/types').Constraint} Constraint
|
|
338
|
+
* @typedef {import('@appium/types').StringRecord} StringRecord
|
|
339
|
+
* @typedef {import('@appium/types').BaseDriverCapConstraints} BaseDriverCapConstraints
|
|
340
|
+
* @typedef {import('@appium/types').ServerArgs} ServerArgs
|
|
341
|
+
*/
|
|
342
|
+
/**
|
|
343
|
+
* @callback UpdateServerCallback
|
|
344
|
+
* @param {import('express').Express} app - Express app
|
|
345
|
+
* @param {import('@appium/types').AppiumServer} httpServer - HTTP server
|
|
346
|
+
* @returns {import('type-fest').Promisable<void>}
|
|
347
|
+
*/
|
|
348
|
+
/**
|
|
349
|
+
* This is used to extend {@linkcode BaseDriverCore} by the mixins and also external drivers.
|
|
350
|
+
* @template {Constraints} C
|
|
351
|
+
* @template [Proto={}]
|
|
352
|
+
* @template [Static={}]
|
|
353
|
+
* @typedef {import('@appium/types').Class<BaseDriverCore<C> & Proto,import('@appium/types').DriverStatic & Static>} BaseDriverBase
|
|
354
|
+
*/
|
|
355
|
+
/**
|
|
356
|
+
* @template {Constraints} [C=BaseDriverCapConstraints]
|
|
357
|
+
* @typedef {import('@appium/types').SessionHandler<[string, object],void, C>} SessionHandler
|
|
358
|
+
*/
|
|
359
|
+
/**
|
|
360
|
+
* @template {Constraints} [C=BaseDriverCapConstraints]
|
|
361
|
+
* @template {StringRecord|void} [Extra=void]
|
|
362
|
+
* @typedef {import('@appium/types').Capabilities<C, Extra>} Capabilities
|
|
363
|
+
*/
|
|
364
|
+
/**
|
|
365
|
+
* @template {Constraints} [C=BaseDriverCapConstraints]
|
|
366
|
+
* @template {StringRecord|void} [Extra=void]
|
|
367
|
+
* @typedef {import('@appium/types').W3CCapabilities<C, Extra>} W3CCapabilities
|
|
368
|
+
*/
|
|
369
|
+
/**
|
|
370
|
+
* @template {Constraints} [C=BaseDriverCapConstraints]
|
|
371
|
+
* @template {StringRecord} [CArgs=StringRecord]
|
|
372
|
+
* @typedef {import('@appium/types').Driver<C, CArgs>} Driver
|
|
373
|
+
*/
|
|
374
|
+
/**
|
|
375
|
+
* @template {Constraints} C
|
|
376
|
+
* @typedef {import('@appium/types').ExternalDriver<C>} ExternalDriver
|
|
377
|
+
*/
|
|
378
|
+
/**
|
|
379
|
+
* @template {Constraints} C
|
|
380
|
+
* @typedef {import('@appium/types').DriverOpts<C>} DriverOpts
|
|
381
|
+
*/
|
|
382
|
+
//# sourceMappingURL=driver.js.map
|