@appium/base-driver 8.7.2 → 9.0.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 +354 -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 +21 -267
- package/build/lib/basedriver/driver.d.ts.map +1 -1
- package/build/lib/basedriver/driver.js +362 -258
- 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 +1238 -4
- package/build/lib/protocol/routes.d.ts.map +1 -1
- package/build/lib/protocol/routes.js +964 -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 +80 -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 +29 -18
- package/lib/express/server.js +6 -3
- package/lib/protocol/errors.js +155 -44
- package/lib/protocol/routes.js +11 -7
- package/package.json +14 -16
|
@@ -1,278 +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
|
-
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} */ ({});
|
|
59
45
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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));
|
|
65
57
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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;
|
|
69
125
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
if (this.isCommandsQueueEnabled && cmd !== _protocol.DELETE_SESSION_COMMAND) {
|
|
86
|
-
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
|
+
}
|
|
87
141
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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);
|
|
101
157
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
} finally {
|
|
115
|
-
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;
|
|
116
170
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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();
|
|
143
204
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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];
|
|
158
270
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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);
|
|
166
289
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
+
}
|
|
174
302
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
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;
|
|
192
321
|
}
|
|
193
|
-
|
|
194
|
-
this.validateDesiredCaps(caps);
|
|
195
|
-
this.sessionId = _support.util.uuidV4();
|
|
196
|
-
this.caps = caps;
|
|
197
|
-
this.opts = { ..._lodash.default.cloneDeep(this.initialOpts),
|
|
198
|
-
...this.caps
|
|
199
|
-
};
|
|
200
|
-
|
|
201
|
-
if (this.opts.noReset && this.opts.fullReset) {
|
|
202
|
-
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");
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
if (this.opts.noReset === true) {
|
|
206
|
-
this.opts.fullReset = false;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
if (this.opts.fullReset === true) {
|
|
210
|
-
this.opts.noReset = false;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
this.opts.fastReset = !this.opts.fullReset && !this.opts.noReset;
|
|
214
|
-
this.opts.skipUninstall = this.opts.fastReset || this.opts.noReset;
|
|
215
|
-
|
|
216
|
-
if (typeof this.opts.app === 'string' && this.opts.app.trim() === '') {
|
|
217
|
-
delete this.opts.app;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
if (!_lodash.default.isUndefined(this.caps.newCommandTimeout)) {
|
|
221
|
-
this.newCommandTimeoutMs = this.caps.newCommandTimeout * 1000;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
this._log.prefix = _helpers.default.generateDriverLogPrefix(this, this.sessionId);
|
|
225
|
-
this.log.info(`Session created with session id: ${this.sessionId}`);
|
|
226
|
-
return [this.sessionId, caps];
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
async deleteSession(sessionId, driverData) {
|
|
230
|
-
await this.clearNewCommandTimeout();
|
|
231
|
-
|
|
232
|
-
if (this.isCommandsQueueEnabled && this.commandsQueueGuard.isBusy()) {
|
|
233
|
-
for (const key of _lodash.default.keys(this.commandsQueueGuard.queues)) {
|
|
234
|
-
this.commandsQueueGuard.queues[key] = [];
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
this.sessionId = null;
|
|
239
|
-
this._log.prefix = _helpers.default.generateDriverLogPrefix(this);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
logExtraCaps(caps) {
|
|
243
|
-
let extraCaps = _lodash.default.difference(_lodash.default.keys(caps), _lodash.default.keys(this._desiredCapConstraints));
|
|
244
|
-
|
|
245
|
-
if (extraCaps.length) {
|
|
246
|
-
this.log.warn(`The following capabilities were provided, but are not ` + `recognized by Appium:`);
|
|
247
|
-
|
|
248
|
-
for (const cap of extraCaps) {
|
|
249
|
-
this.log.warn(` ${cap}`);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
validateDesiredCaps(caps) {
|
|
255
|
-
if (!this.shouldValidateCaps) {
|
|
256
|
-
return true;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
try {
|
|
260
|
-
(0, _capabilities.validateCaps)(caps, this._desiredCapConstraints);
|
|
261
|
-
} catch (e) {
|
|
262
|
-
this.log.errorAndThrow(new _protocol.errors.SessionNotCreatedError(`The desiredCapabilities object was not valid for the ` + `following reason(s): ${e.message}`));
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
this.logExtraCaps(caps);
|
|
266
|
-
return true;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
322
|
}
|
|
270
|
-
|
|
271
323
|
exports.BaseDriverCore = BaseDriverCore;
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
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
|
+
}
|
|
275
331
|
exports.BaseDriver = BaseDriver;
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFVkVOVF9TRVNTSU9OX0lOSVQiLCJFVkVOVF9TRVNTSU9OX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX1NUQVJUIiwiRVZFTlRfU0VTU0lPTl9RVUlUX0RPTkUiLCJPTl9VTkVYUEVDVEVEX1NIVVRET1dOX0VWRU5UIiwiQmFzZURyaXZlckNvcmUiLCJEcml2ZXJDb3JlIiwiY2xpQXJncyIsImNhcHMiLCJvcmlnaW5hbENhcHMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJvcHRzIiwiX2Rlc2lyZWRDYXBDb25zdHJhaW50cyIsIk9iamVjdCIsImZyZWV6ZSIsIl8iLCJtZXJnZSIsIkJBU0VfREVTSVJFRF9DQVBfQ09OU1RSQUlOVFMiLCJleGVjdXRlQ29tbWFuZCIsImNtZCIsImFyZ3MiLCJzdGFydFRpbWUiLCJEYXRlIiwibm93IiwicHJvdG9jb2wiLCJkZXRlcm1pbmVQcm90b2NvbCIsImxvZ0V2ZW50IiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsImNsZWFyTmV3Q29tbWFuZFRpbWVvdXQiLCJzaHV0ZG93blVuZXhwZWN0ZWRseSIsImVycm9ycyIsIk5vU3VjaERyaXZlckVycm9yIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsInVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyIiwiY29tbWFuZEV4ZWN1dG9yIiwiQiIsInJhY2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZXZlbnRFbWl0dGVyIiwib24iLCJmaW5hbGx5IiwicmVtb3ZlTGlzdGVuZXIiLCJyZXMiLCJpc0NvbW1hbmRzUXVldWVFbmFibGVkIiwiY29tbWFuZHNRdWV1ZUd1YXJkIiwiYWNxdWlyZSIsIkJhc2VEcml2ZXIiLCJuYW1lIiwic3RhcnROZXdDb21tYW5kVGltZW91dCIsImVuZFRpbWUiLCJfZXZlbnRIaXN0b3J5IiwiY29tbWFuZHMiLCJwdXNoIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJlcnIiLCJlbWl0Iiwic2Vzc2lvbklkIiwiZGVsZXRlU2Vzc2lvbiIsIm5ld0NvbW1hbmRUaW1lb3V0TXMiLCJub0NvbW1hbmRUaW1lciIsInNldFRpbWVvdXQiLCJsb2ciLCJ3YXJuIiwiZXJyb3JNZXNzYWdlIiwiRXJyb3IiLCJhc3NpZ25TZXJ2ZXIiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInBhdGgiLCJzZXJ2ZXJIb3N0Iiwic2VydmVyUG9ydCIsInNlcnZlclBhdGgiLCJyZXNldCIsImRlYnVnIiwiY3VycmVudENvbmZpZyIsInByb3BlcnR5IiwicmVzZXRPblVuZXhwZWN0ZWRTaHV0ZG93biIsImNyZWF0ZVNlc3Npb24iLCJrZXkiLCJ2YWx1ZSIsInRvUGFpcnMiLCJ3M2NDYXBhYmlsaXRpZXMxIiwidzNjQ2FwYWJpbGl0aWVzMiIsInczY0NhcGFiaWxpdGllcyIsImRyaXZlckRhdGEiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwiY2xvbmVEZWVwIiwiZmluZCIsImlzVzNjQ2FwcyIsInNldFByb3RvY29sVzNDIiwiSlNPTiIsInN0cmluZ2lmeSIsInByb2Nlc3NDYXBhYmlsaXRpZXMiLCJzaG91bGRWYWxpZGF0ZUNhcHMiLCJBUFBJVU1fT1BUU19DQVAiLCJQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVAiLCJwcm9tb3RlQXBwaXVtT3B0aW9ucyIsImZpeENhcHMiLCJlIiwibWVzc2FnZSIsInZhbGlkYXRlRGVzaXJlZENhcHMiLCJ1dGlsIiwidXVpZFY0IiwiaW5pdGlhbE9wdHMiLCJub1Jlc2V0IiwiZnVsbFJlc2V0IiwiZmFzdFJlc2V0Iiwic2tpcFVuaW5zdGFsbCIsImFwcCIsInRyaW0iLCJpc1VuZGVmaW5lZCIsIm5ld0NvbW1hbmRUaW1lb3V0IiwiX2xvZyIsInByZWZpeCIsImhlbHBlcnMiLCJnZW5lcmF0ZURyaXZlckxvZ1ByZWZpeCIsImluZm8iLCJpc0J1c3kiLCJrZXlzIiwicXVldWVzIiwibG9nRXh0cmFDYXBzIiwiZXh0cmFDYXBzIiwiZGlmZmVyZW5jZSIsImxlbmd0aCIsImNhcCIsInZhbGlkYXRlQ2FwcyIsImVycm9yQW5kVGhyb3ciLCJjcmVhdGVCYXNlRHJpdmVyQ2xhc3MiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvYmFzZWRyaXZlci9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgcmVxdWlyZS1hd2FpdCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cblxuaW1wb3J0IHtcbiAgdmFsaWRhdGVDYXBzLFxuICBBUFBJVU1fT1BUU19DQVAsXG4gIFBSRUZJWEVEX0FQUElVTV9PUFRTX0NBUCxcbiAgcHJvY2Vzc0NhcGFiaWxpdGllcyxcbiAgcHJvbW90ZUFwcGl1bU9wdGlvbnMsXG59IGZyb20gJy4vY2FwYWJpbGl0aWVzJztcbmltcG9ydCB7RHJpdmVyQ29yZX0gZnJvbSAnLi9jb3JlJztcbmltcG9ydCB7dXRpbH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge2ZpeENhcHMsIGlzVzNjQ2Fwc30gZnJvbSAnLi4vaGVscGVycy9jYXBhYmlsaXRpZXMnO1xuaW1wb3J0IHtERUxFVEVfU0VTU0lPTl9DT01NQU5ELCBkZXRlcm1pbmVQcm90b2NvbCwgZXJyb3JzfSBmcm9tICcuLi9wcm90b2NvbCc7XG5pbXBvcnQge2NyZWF0ZUJhc2VEcml2ZXJDbGFzc30gZnJvbSAnLi9jb21tYW5kcyc7XG5pbXBvcnQgaGVscGVycyBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtCQVNFX0RFU0lSRURfQ0FQX0NPTlNUUkFJTlRTfSBmcm9tICdAYXBwaXVtL3R5cGVzJztcblxuY29uc3QgRVZFTlRfU0VTU0lPTl9JTklUID0gJ25ld1Nlc3Npb25SZXF1ZXN0ZWQnO1xuY29uc3QgRVZFTlRfU0VTU0lPTl9TVEFSVCA9ICduZXdTZXNzaW9uU3RhcnRlZCc7XG5jb25zdCBFVkVOVF9TRVNTSU9OX1FVSVRfU1RBUlQgPSAncXVpdFNlc3Npb25SZXF1ZXN0ZWQnO1xuY29uc3QgRVZFTlRfU0VTU0lPTl9RVUlUX0RPTkUgPSAncXVpdFNlc3Npb25GaW5pc2hlZCc7XG5jb25zdCBPTl9VTkVYUEVDVEVEX1NIVVRET1dOX0VWRU5UID0gJ29uVW5leHBlY3RlZFNodXRkb3duJztcblxuLyoqXG4gKiBAaW1wbGVtZW50cyB7U2Vzc2lvbkhhbmRsZXI8Qz59XG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBDXG4gKiBAdGVtcGxhdGUge1N0cmluZ1JlY29yZH0gW0E9U3RyaW5nUmVjb3JkXVxuICogQGV4dGVuZHMge0RyaXZlckNvcmU8Qz59XG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlRHJpdmVyQ29yZSBleHRlbmRzIERyaXZlckNvcmUge1xuICAvKipcbiAgICogQHR5cGUge0EgJiBTZXJ2ZXJBcmdzfVxuICAgKi9cbiAgY2xpQXJncztcblxuICAvKipcbiAgICogQHR5cGUge0NhcGFiaWxpdGllczxDPn1cbiAgICovXG4gIGNhcHM7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtXM0NDYXBhYmlsaXRpZXM8Qz59XG4gICAqL1xuICBvcmlnaW5hbENhcHM7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtDfVxuICAgKi9cbiAgZGVzaXJlZENhcENvbnN0cmFpbnRzO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7RHJpdmVyT3B0czxDPiAmIERyaXZlck9wdHM8QmFzZURyaXZlckNhcENvbnN0cmFpbnRzPn1cbiAgICovXG4gIG9wdHM7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIHRoZSBiYXNlIGNvbnN0cmFpbnRzIHBsdXMgd2hhdGV2ZXIgdGhlIHN1YmNsYXNzIHdhbnRzIHRvIGFkZC5cbiAgICpcbiAgICogU3ViY2xhc3NlcyBfc2hvdWxkbid0XyBuZWVkIHRvIHVzZSB0aGlzLiBJZiB5b3UgbmVlZCB0byB1c2UgdGhpcywgcGxlYXNlIGNyZWF0ZVxuICAgKiBhbiBpc3N1ZTpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvbmV3XG4gICAqIEB0eXBlIHtSZWFkb25seTxCYXNlRHJpdmVyQ2FwQ29uc3RyYWludHMgJiBDPn1cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgZ2V0IF9kZXNpcmVkQ2FwQ29uc3RyYWludHMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoXy5tZXJnZSh7fSwgQkFTRV9ERVNJUkVEX0NBUF9DT05TVFJBSU5UUywgdGhpcy5kZXNpcmVkQ2FwQ29uc3RyYWludHMpKTtcbiAgfVxuXG4gIHN0YXRpYyBCQVNFX0RFU0lSRURfQ0FQX0NPTlNUUkFJTlRTID0gQkFTRV9ERVNJUkVEX0NBUF9DT05TVFJBSU5UUztcblxuICAvLyBUaGlzIGlzIHRoZSBtYWluIGNvbW1hbmQgaGFuZGxlciBmb3IgdGhlIGRyaXZlci4gSXQgd3JhcHMgY29tbWFuZFxuICAvLyBleGVjdXRpb24gd2l0aCB0aW1lb3V0IGxvZ2ljLCBjaGVja2luZyB0aGF0IHdlIGhhdmUgYSB2YWxpZCBzZXNzaW9uLFxuICAvLyBhbmQgZW5zdXJpbmcgdGhhdCB3ZSBleGVjdXRlIGNvbW1hbmRzIG9uZSBhdCBhIHRpbWUuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZFxuICAvLyBieSBNSlNPTldQJ3MgZXhwcmVzcyByb3V0ZXIuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY21kXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUNvbW1hbmQoY21kLCAuLi5hcmdzKSB7XG4gICAgLy8gZ2V0IHN0YXJ0IHRpbWUgZm9yIHRoaXMgY29tbWFuZCwgYW5kIGxvZyBpbiBzcGVjaWFsIGNhc2VzXG4gICAgbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICBpZiAoY21kID09PSAnY3JlYXRlU2Vzc2lvbicpIHtcbiAgICAgIC8vIElmIGNyZWF0aW5nIGEgc2Vzc2lvbiBkZXRlcm1pbmUgaWYgVzNDIG9yIE1KU09OV1AgcHJvdG9jb2wgd2FzIHJlcXVlc3RlZCBhbmQgcmVtZW1iZXIgdGhlIGNob2ljZVxuICAgICAgdGhpcy5wcm90b2NvbCA9IGRldGVybWluZVByb3RvY29sKGFyZ3MpO1xuICAgICAgdGhpcy5sb2dFdmVudChFVkVOVF9TRVNTSU9OX0lOSVQpO1xuICAgIH0gZWxzZSBpZiAoY21kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fUVVJVF9TVEFSVCk7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgaGFkIGEgY29tbWFuZCB0aW1lciBydW5uaW5nLCBjbGVhciBpdCBub3cgdGhhdCB3ZSdyZSBzdGFydGluZ1xuICAgIC8vIGEgbmV3IGNvbW1hbmQgYW5kIHNvIGRvbid0IHdhbnQgdG8gdGltZSBvdXRcbiAgICBhd2FpdCB0aGlzLmNsZWFyTmV3Q29tbWFuZFRpbWVvdXQoKTtcblxuICAgIGlmICh0aGlzLnNodXRkb3duVW5leHBlY3RlZGx5KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaERyaXZlckVycm9yKCdUaGUgZHJpdmVyIHdhcyB1bmV4cGVjdGVkbHkgc2h1dCBkb3duIScpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBjb21tYW5kLCBpdCBtdXN0IG5vdCBiZSBpbXBsZW1lbnRlZFxuICAgIGlmICghdGhpc1tjbWRdKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdFlldEltcGxlbWVudGVkRXJyb3IoKTtcbiAgICB9XG5cbiAgICBsZXQgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXI7XG4gICAgY29uc3QgY29tbWFuZEV4ZWN1dG9yID0gYXN5bmMgKCkgPT5cbiAgICAgIGF3YWl0IEIucmFjZShbXG4gICAgICAgIHRoaXNbY21kXSguLi5hcmdzKSxcbiAgICAgICAgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyID0gcmVqZWN0O1xuICAgICAgICAgIHRoaXMuZXZlbnRFbWl0dGVyLm9uKE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQsIHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyKTtcbiAgICAgICAgfSksXG4gICAgICBdKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgaWYgKHVuZXhwZWN0ZWRTaHV0ZG93bkxpc3RlbmVyKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICAgICAgICB0aGlzLmV2ZW50RW1pdHRlci5yZW1vdmVMaXN0ZW5lcihcbiAgICAgICAgICAgIE9OX1VORVhQRUNURURfU0hVVERPV05fRVZFTlQsXG4gICAgICAgICAgICB1bmV4cGVjdGVkU2h1dGRvd25MaXN0ZW5lclxuICAgICAgICAgICk7XG4gICAgICAgICAgdW5leHBlY3RlZFNodXRkb3duTGlzdGVuZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBjb25zdCByZXMgPSB0aGlzLmlzQ29tbWFuZHNRdWV1ZUVuYWJsZWRcbiAgICAgID8gYXdhaXQgdGhpcy5jb21tYW5kc1F1ZXVlR3VhcmQuYWNxdWlyZShCYXNlRHJpdmVyLm5hbWUsIGNvbW1hbmRFeGVjdXRvcilcbiAgICAgIDogYXdhaXQgY29tbWFuZEV4ZWN1dG9yKCk7XG5cbiAgICAvLyBpZiB3ZSBoYXZlIHNldCBhIG5ldyBjb21tYW5kIHRpbWVvdXQgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KSwgc3RhcnQgYVxuICAgIC8vIHRpbWVyIG9uY2Ugd2UndmUgZmluaXNoZWQgZXhlY3V0aW5nIHRoaXMgY29tbWFuZC4gSWYgd2UgZG9uJ3QgY2xlYXJcbiAgICAvLyB0aGUgdGltZXIgKHdoaWNoIGlzIGRvbmUgd2hlbiBhIG5ldyBjb21tYW5kIGNvbWVzIGluKSwgd2Ugd2lsbCB0cmlnZ2VyXG4gICAgLy8gYXV0b21hdGljIHNlc3Npb24gZGVsZXRpb24gaW4gdGhpcy5vbkNvbW1hbmRUaW1lb3V0LiBPZiBjb3Vyc2Ugd2UgZG9uJ3RcbiAgICAvLyB3YW50IHRvIHRyaWdnZXIgdGhlIHRpbWVyIHdoZW4gdGhlIHVzZXIgaXMgc2h1dHRpbmcgZG93biB0aGUgc2Vzc2lvblxuICAgIC8vIGludGVudGlvbmFsbHlcbiAgICBpZiAodGhpcy5pc0NvbW1hbmRzUXVldWVFbmFibGVkICYmIGNtZCAhPT0gREVMRVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgLy8gcmVzZXR0aW5nIGV4aXN0aW5nIHRpbWVvdXRcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnROZXdDb21tYW5kVGltZW91dCgpO1xuICAgIH1cblxuICAgIC8vIGxvZyB0aW1pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb21tYW5kXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5fZXZlbnRIaXN0b3J5LmNvbW1hbmRzLnB1c2goe2NtZCwgc3RhcnRUaW1lLCBlbmRUaW1lfSk7XG4gICAgaWYgKGNtZCA9PT0gJ2NyZWF0ZVNlc3Npb24nKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fU1RBUlQpO1xuICAgIH0gZWxzZSBpZiAoY21kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICB0aGlzLmxvZ0V2ZW50KEVWRU5UX1NFU1NJT05fUVVJVF9ET05FKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RXJyb3J8aW1wb3J0KCcuLi9wcm90b2NvbC9lcnJvcnMnKS5Ob1N1Y2hEcml2ZXJFcnJvcn0gZXJyXG4gICAqL1xuICBhc3luYyBzdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihcbiAgICBlcnIgPSBuZXcgZXJyb3JzLk5vU3VjaERyaXZlckVycm9yKCdUaGUgZHJpdmVyIHdhcyB1bmV4cGVjdGVkbHkgc2h1dCBkb3duIScpXG4gICkge1xuICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQoT05fVU5FWFBFQ1RFRF9TSFVURE9XTl9FVkVOVCwgZXJyKTsgLy8gYWxsb3cgb3RoZXJzIHRvIGxpc3RlbiBmb3IgdGhpc1xuICAgIHRoaXMuc2h1dGRvd25VbmV4cGVjdGVkbHkgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zZXNzaW9uSWQgIT09IG51bGwpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKHRoaXMuc2Vzc2lvbklkKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zaHV0ZG93blVuZXhwZWN0ZWRseSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0TmV3Q29tbWFuZFRpbWVvdXQoKSB7XG4gICAgLy8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyByb2d1ZSB0aW1lb3V0c1xuICAgIGF3YWl0IHRoaXMuY2xlYXJOZXdDb21tYW5kVGltZW91dCgpO1xuXG4gICAgLy8gaWYgY29tbWFuZCB0aW1lb3V0IGlzIDAsIGl0IGlzIGRpc2FibGVkXG4gICAgaWYgKCF0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuXG4gICAgdGhpcy5ub0NvbW1hbmRUaW1lciA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5sb2cud2FybihcbiAgICAgICAgYFNodXR0aW5nIGRvd24gYmVjYXVzZSB3ZSB3YWl0ZWQgYCArXG4gICAgICAgICAgYCR7dGhpcy5uZXdDb21tYW5kVGltZW91dE1zIC8gMTAwMC4wfSBzZWNvbmRzIGZvciBhIGNvbW1hbmRgXG4gICAgICApO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cbiAgICAgICAgYE5ldyBDb21tYW5kIFRpbWVvdXQgb2YgYCArXG4gICAgICAgIGAke3RoaXMubmV3Q29tbWFuZFRpbWVvdXRNcyAvIDEwMDAuMH0gc2Vjb25kcyBgICtcbiAgICAgICAgYGV4cGlyZWQuIFRyeSBjdXN0b21pemluZyB0aGUgdGltZW91dCB1c2luZyB0aGUgYCArXG4gICAgICAgIGAnbmV3Q29tbWFuZFRpbWVvdXQnIGRlc2lyZWQgY2FwYWJpbGl0eWA7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgICB9LCB0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtU2VydmVyfSBzZXJ2ZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhvc3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBvcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGFzc2lnblNlcnZlcihzZXJ2ZXIsIGhvc3QsIHBvcnQsIHBhdGgpIHtcbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcbiAgICB0aGlzLnNlcnZlckhvc3QgPSBob3N0O1xuICAgIHRoaXMuc2VydmVyUG9ydCA9IHBvcnQ7XG4gICAgdGhpcy5zZXJ2ZXJQYXRoID0gcGF0aDtcbiAgfVxuXG4gIC8qXG4gICAqIFJlc3RhcnQgdGhlIHNlc3Npb24gd2l0aCB0aGUgb3JpZ2luYWwgY2FwcyxcbiAgICogcHJlc2VydmluZyB0aGUgdGltZW91dCBjb25maWcuXG4gICAqL1xuICBhc3luYyByZXNldCgpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnUmVzZXR0aW5nIGFwcCBtaWQtc2Vzc2lvbicpO1xuICAgIHRoaXMubG9nLmRlYnVnKCdSdW5uaW5nIGdlbmVyaWMgZnVsbCByZXNldCcpO1xuXG4gICAgLy8gcHJlc2VydmluZyBzdGF0ZVxuICAgIGxldCBjdXJyZW50Q29uZmlnID0ge307XG4gICAgZm9yIChsZXQgcHJvcGVydHkgb2YgW1xuICAgICAgJ2ltcGxpY2l0V2FpdE1zJyxcbiAgICAgICduZXdDb21tYW5kVGltZW91dE1zJyxcbiAgICAgICdzZXNzaW9uSWQnLFxuICAgICAgJ3Jlc2V0T25VbmV4cGVjdGVkU2h1dGRvd24nLFxuICAgIF0pIHtcbiAgICAgIGN1cnJlbnRDb25maWdbcHJvcGVydHldID0gdGhpc1twcm9wZXJ0eV07XG4gICAgfVxuXG4gICAgLy8gV2UgYWxzbyBuZWVkIHRvIHByZXNlcnZlIHRoZSB1bmV4cGVjdGVkIHNodXRkb3duLCBhbmQgbWFrZSBzdXJlIGl0IGlzIG5vdCBjYW5jZWxsZWQgZHVyaW5nIHJlc2V0LlxuICAgIHRoaXMucmVzZXRPblVuZXhwZWN0ZWRTaHV0ZG93biA9ICgpID0+IHt9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNlc3Npb25JZCAhPT0gbnVsbCkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24odGhpcy5zZXNzaW9uSWQpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoJ1Jlc3RhcnRpbmcgYXBwJyk7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZVNlc3Npb24odGhpcy5vcmlnaW5hbENhcHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBhbHdheXMgcmVzdG9yZSBzdGF0ZS5cbiAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMoY3VycmVudENvbmZpZykpIHtcbiAgICAgICAgdGhpc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2xlYXJOZXdDb21tYW5kVGltZW91dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEhpc3RvcmljYWxseSB0aGUgZmlyc3QgdHdvIGFyZ3VtZW50cyB3ZXJlIHJlc2VydmVkIGZvciBKU09OV1AgY2FwYWJpbGl0aWVzLlxuICAgKiBBcHBpdW0gMiBoYXMgZHJvcHBlZCB0aGUgc3VwcG9ydCBvZiB0aGVzZSwgc28gbm93IHdlIG9ubHkgYWNjZXB0IGNhcGFiaWxpdHlcbiAgICogb2JqZWN0cyBpbiBXM0MgZm9ybWF0IGFuZCB0aHVzIGFsbG93IGFueSBvZiB0aGUgdGhyZWUgYXJndW1lbnRzIHRvIHJlcHJlc2VudFxuICAgKiB0aGUgbGF0dGVyLlxuICAgKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllczxDPn0gdzNjQ2FwYWJpbGl0aWVzMVxuICAgKiBAcGFyYW0ge1czQ0NhcGFiaWxpdGllczxDPn0gW3czY0NhcGFiaWxpdGllczJdXG4gICAqIEBwYXJhbSB7VzNDQ2FwYWJpbGl0aWVzPEM+fSBbdzNjQ2FwYWJpbGl0aWVzXVxuICAgKiBAcGFyYW0ge0RyaXZlckRhdGFbXX0gW2RyaXZlckRhdGFdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFtzdHJpbmcsQ2FwYWJpbGl0aWVzPEM+XT59XG4gICAqL1xuICBhc3luYyBjcmVhdGVTZXNzaW9uKHczY0NhcGFiaWxpdGllczEsIHczY0NhcGFiaWxpdGllczIsIHczY0NhcGFiaWxpdGllcywgZHJpdmVyRGF0YSkge1xuICAgIGlmICh0aGlzLnNlc3Npb25JZCAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKFxuICAgICAgICAnQ2Fubm90IGNyZWF0ZSBhIG5ldyBzZXNzaW9uIHdoaWxlIG9uZSBpcyBpbiBwcm9ncmVzcydcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2cuZGVidWcoKTtcblxuICAgIGNvbnN0IG9yaWdpbmFsQ2FwcyA9IF8uY2xvbmVEZWVwKFxuICAgICAgW3czY0NhcGFiaWxpdGllcywgdzNjQ2FwYWJpbGl0aWVzMSwgdzNjQ2FwYWJpbGl0aWVzMl0uZmluZChpc1czY0NhcHMpXG4gICAgKTtcbiAgICBpZiAoIW9yaWdpbmFsQ2Fwcykge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKFxuICAgICAgICAnQXBwaXVtIG9ubHkgc3VwcG9ydHMgVzNDLXN0eWxlIGNhcGFiaWxpdHkgb2JqZWN0cy4gJyArXG4gICAgICAgICAgJ1lvdXIgY2xpZW50IGlzIHNlbmRpbmcgYW4gb2xkZXIgY2FwYWJpbGl0aWVzIGZvcm1hdC4gUGxlYXNlIHVwZGF0ZSB5b3VyIGNsaWVudCBsaWJyYXJ5LidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRQcm90b2NvbFczQygpO1xuXG4gICAgdGhpcy5vcmlnaW5hbENhcHMgPSBvcmlnaW5hbENhcHM7XG4gICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICBgQ3JlYXRpbmcgc2Vzc2lvbiB3aXRoIFczQyBjYXBhYmlsaXRpZXM6ICR7SlNPTi5zdHJpbmdpZnkob3JpZ2luYWxDYXBzLCBudWxsLCAyKX1gXG4gICAgKTtcblxuICAgIC8qKiBAdHlwZSB7Q2FwYWJpbGl0aWVzPEM+fSAqL1xuICAgIGxldCBjYXBzO1xuICAgIHRyeSB7XG4gICAgICBjYXBzID0gcHJvY2Vzc0NhcGFiaWxpdGllcyhcbiAgICAgICAgb3JpZ2luYWxDYXBzLFxuICAgICAgICB0aGlzLl9kZXNpcmVkQ2FwQ29uc3RyYWludHMsXG4gICAgICAgIHRoaXMuc2hvdWxkVmFsaWRhdGVDYXBzXG4gICAgICApO1xuICAgICAgaWYgKGNhcHNbQVBQSVVNX09QVFNfQ0FQXSkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgRm91bmQgJHtQUkVGSVhFRF9BUFBJVU1fT1BUU19DQVB9IGNhcGFiaWxpdHkgcHJlc2VudDsgd2lsbCBwcm9tb3RlIGl0ZW1zIGluc2lkZSB0byBjYXBzYFxuICAgICAgICApO1xuICAgICAgICBjYXBzID0gcHJvbW90ZUFwcGl1bU9wdGlvbnMoY2Fwcyk7XG4gICAgICB9XG4gICAgICBjYXBzID0gZml4Q2FwcyhjYXBzLCB0aGlzLl9kZXNpcmVkQ2FwQ29uc3RyYWludHMsIHRoaXMubG9nKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoZS5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcyk7XG5cbiAgICB0aGlzLnNlc3Npb25JZCA9IHV0aWwudXVpZFY0KCk7XG4gICAgdGhpcy5jYXBzID0gY2FwcztcbiAgICAvLyBtZXJnZSBjYXBzIG9udG8gb3B0cyBzbyB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHdoYXQncyB3aGVyZVxuICAgIHRoaXMub3B0cyA9IHsuLi5fLmNsb25lRGVlcCh0aGlzLmluaXRpYWxPcHRzKSwgLi4udGhpcy5jYXBzfTtcblxuICAgIC8vIGRlYWwgd2l0aCByZXNldHNcbiAgICAvLyBzb21lIHBlb3BsZSBsaWtlIHRvIGRvIHdlaXJkIHRoaW5ncyBieSBzZXR0aW5nIG5vUmVzZXQgYW5kIGZ1bGxSZXNldFxuICAgIC8vIGJvdGggdG8gdHJ1ZSwgYnV0IHRoaXMgaXMgbWlzZ3VpZGVkIGFuZCBzdHJhbmdlLCBzbyBlcnJvciBoZXJlIGluc3RlYWRcbiAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgJiYgdGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlRoZSAnbm9SZXNldCcgYW5kICdmdWxsUmVzZXQnIGNhcGFiaWxpdGllcyBhcmUgbXV0dWFsbHkgXCIgK1xuICAgICAgICAgICdleGNsdXNpdmUgYW5kIHNob3VsZCBub3QgYm90aCBiZSBzZXQgdG8gdHJ1ZS4gWW91ICcgK1xuICAgICAgICAgIFwicHJvYmFibHkgbWVhbnQgdG8ganVzdCB1c2UgJ2Z1bGxSZXNldCcgb24gaXRzIG93blwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRzLm5vUmVzZXQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMub3B0cy5mdWxsUmVzZXQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMub3B0cy5ub1Jlc2V0ID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMub3B0cy5mYXN0UmVzZXQgPSAhdGhpcy5vcHRzLmZ1bGxSZXNldCAmJiAhdGhpcy5vcHRzLm5vUmVzZXQ7XG4gICAgdGhpcy5vcHRzLnNraXBVbmluc3RhbGwgPSB0aGlzLm9wdHMuZmFzdFJlc2V0IHx8IHRoaXMub3B0cy5ub1Jlc2V0O1xuXG4gICAgLy8gUHJldmVudHMgZW1wdHkgc3RyaW5nIGNhcHMgc28gd2UgZG9uJ3QgbmVlZCB0byB0ZXN0IGl0IGV2ZXJ5d2hlcmVcbiAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5hcHAgPT09ICdzdHJpbmcnICYmIHRoaXMub3B0cy5hcHAudHJpbSgpID09PSAnJykge1xuICAgICAgZGVsZXRlIHRoaXMub3B0cy5hcHA7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMuY2Fwcy5uZXdDb21tYW5kVGltZW91dCkpIHtcbiAgICAgIHRoaXMubmV3Q29tbWFuZFRpbWVvdXRNcyA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAodGhpcy5jYXBzLm5ld0NvbW1hbmRUaW1lb3V0KSAqIDEwMDA7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nLnByZWZpeCA9IGhlbHBlcnMuZ2VuZXJhdGVEcml2ZXJMb2dQcmVmaXgodGhpcywgdGhpcy5zZXNzaW9uSWQpO1xuXG4gICAgdGhpcy5sb2cuaW5mbyhgU2Vzc2lvbiBjcmVhdGVkIHdpdGggc2Vzc2lvbiBpZDogJHt0aGlzLnNlc3Npb25JZH1gKTtcblxuICAgIHJldHVybiBbdGhpcy5zZXNzaW9uSWQsIGNhcHNdO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2Vzc2lvbklkXVxuICAgKiBAcGFyYW0ge0RyaXZlckRhdGFbXX0gW2RyaXZlckRhdGFdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbihzZXNzaW9uSWQsIGRyaXZlckRhdGEpIHtcbiAgICBhd2FpdCB0aGlzLmNsZWFyTmV3Q29tbWFuZFRpbWVvdXQoKTtcbiAgICBpZiAodGhpcy5pc0NvbW1hbmRzUXVldWVFbmFibGVkICYmIHRoaXMuY29tbWFuZHNRdWV1ZUd1YXJkLmlzQnVzeSgpKSB7XG4gICAgICAvLyBzaW1wbGUgaGFjayB0byByZWxlYXNlIHBlbmRpbmcgY29tbWFuZHMgaWYgdGhleSBleGlzdFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgXy5rZXlzKHRoaXMuY29tbWFuZHNRdWV1ZUd1YXJkLnF1ZXVlcykpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmNvbW1hbmRzUXVldWVHdWFyZC5xdWV1ZXNba2V5XSA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNlc3Npb25JZCA9IG51bGw7XG4gICAgdGhpcy5fbG9nLnByZWZpeCA9IGhlbHBlcnMuZ2VuZXJhdGVEcml2ZXJMb2dQcmVmaXgodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtDYXBhYmlsaXRpZXN9IGNhcHNcbiAgICovXG4gIGxvZ0V4dHJhQ2FwcyhjYXBzKSB7XG4gICAgbGV0IGV4dHJhQ2FwcyA9IF8uZGlmZmVyZW5jZShfLmtleXMoY2FwcyksIF8ua2V5cyh0aGlzLl9kZXNpcmVkQ2FwQ29uc3RyYWludHMpKTtcbiAgICBpZiAoZXh0cmFDYXBzLmxlbmd0aCkge1xuICAgICAgdGhpcy5sb2cud2FybihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgY2FwYWJpbGl0aWVzIHdlcmUgcHJvdmlkZWQsIGJ1dCBhcmUgbm90IGAgKyBgcmVjb2duaXplZCBieSBBcHBpdW06YFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgY2FwIG9mIGV4dHJhQ2Fwcykge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGAgICR7Y2FwfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0NhcGFiaWxpdGllczxDPn0gY2Fwc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcykge1xuICAgIGlmICghdGhpcy5zaG91bGRWYWxpZGF0ZUNhcHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZUNhcHMoY2FwcywgdGhpcy5fZGVzaXJlZENhcENvbnN0cmFpbnRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KFxuICAgICAgICBuZXcgZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IoXG4gICAgICAgICAgYFRoZSBkZXNpcmVkQ2FwYWJpbGl0aWVzIG9iamVjdCB3YXMgbm90IHZhbGlkIGZvciB0aGUgYCArXG4gICAgICAgICAgICBgZm9sbG93aW5nIHJlYXNvbihzKTogJHtlLm1lc3NhZ2V9YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubG9nRXh0cmFDYXBzKGNhcHMpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgb2YgdGhlIG1peGlucyBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgZGVzY3JpYmVkIGluIHtAbGlua2NvZGUgRHJpdmVyfS5cbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPXt9XVxuICogQGltcGxlbWVudHMge0RyaXZlcjxDPn1cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VEcml2ZXIgZXh0ZW5kcyBjcmVhdGVCYXNlRHJpdmVyQ2xhc3MoQmFzZURyaXZlckNvcmUpIHt9XG5leHBvcnQgZGVmYXVsdCBCYXNlRHJpdmVyO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5IVFRQTWV0aG9kfSBIVFRQTWV0aG9kXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRXh0ZXJuYWxEcml2ZXJ9IEV4dGVybmFsRHJpdmVyXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyRGF0YX0gRHJpdmVyRGF0YVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnRzfSBDb25zdHJhaW50c1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnR9IENvbnN0cmFpbnRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TdHJpbmdSZWNvcmR9IFN0cmluZ1JlY29yZFxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkJhc2VEcml2ZXJDYXBDb25zdHJhaW50c30gQmFzZURyaXZlckNhcENvbnN0cmFpbnRzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuU2VydmVyQXJnc30gU2VydmVyQXJnc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFVwZGF0ZVNlcnZlckNhbGxiYWNrXG4gKiBAcGFyYW0ge2ltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3N9IGFwcCAtIEV4cHJlc3MgYXBwXG4gKiBAcGFyYW0ge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVNlcnZlcn0gaHR0cFNlcnZlciAtIEhUVFAgc2VydmVyXG4gKiBAcmV0dXJucyB7aW1wb3J0KCd0eXBlLWZlc3QnKS5Qcm9taXNhYmxlPHZvaWQ+fVxuICovXG5cbi8qKlxuICogVGhpcyBpcyB1c2VkIHRvIGV4dGVuZCB7QGxpbmtjb2RlIEJhc2VEcml2ZXJDb3JlfSBieSB0aGUgbWl4aW5zIGFuZCBhbHNvIGV4dGVybmFsIGRyaXZlcnMuXG4gKiBAdGVtcGxhdGUgW1Byb3RvPXt9XVxuICogQHRlbXBsYXRlIFtTdGF0aWM9e31dXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ2xhc3M8QmFzZURyaXZlckNvcmUgJiBQcm90byxpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJTdGF0aWMgJiBTdGF0aWM+fSBCYXNlRHJpdmVyQmFzZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gW0M9QmFzZURyaXZlckNhcENvbnN0cmFpbnRzXVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlNlc3Npb25IYW5kbGVyPFtzdHJpbmcsIG9iamVjdF0sdm9pZCwgQz59IFNlc3Npb25IYW5kbGVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBbQz1CYXNlRHJpdmVyQ2FwQ29uc3RyYWludHNdXG4gKiBAdGVtcGxhdGUge1N0cmluZ1JlY29yZHx2b2lkfSBbRXh0cmE9dm9pZF1cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXM8QywgRXh0cmE+fSBDYXBhYmlsaXRpZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q29uc3RyYWludHN9IFtDPUJhc2VEcml2ZXJDYXBDb25zdHJhaW50c11cbiAqIEB0ZW1wbGF0ZSB7U3RyaW5nUmVjb3JkfHZvaWR9IFtFeHRyYT12b2lkXVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlczQ0NhcGFiaWxpdGllczxDLCBFeHRyYT59IFczQ0NhcGFiaWxpdGllc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gQ1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNvbnN0cmFpbnRzVG9DYXBzPEM+fSBDb25zdHJhaW50c1RvQ2Fwc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb25zdHJhaW50c30gQ1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlcjxDPn0gRHJpdmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0NvbnN0cmFpbnRzfSBDXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyT3B0czxDPn0gRHJpdmVyT3B0c1xuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUdBOztBQU9BOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsa0JBQWtCLEdBQUcscUJBQTNCO0FBQ0EsTUFBTUMsbUJB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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
|