@appium/base-driver 8.7.3 → 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.
Files changed (121) hide show
  1. package/build/lib/basedriver/capabilities.d.ts +11 -163
  2. package/build/lib/basedriver/capabilities.d.ts.map +1 -1
  3. package/build/lib/basedriver/capabilities.js +354 -236
  4. package/build/lib/basedriver/capabilities.js.map +1 -1
  5. package/build/lib/basedriver/commands/event.d.ts +7 -6
  6. package/build/lib/basedriver/commands/event.d.ts.map +1 -1
  7. package/build/lib/basedriver/commands/event.js +55 -35
  8. package/build/lib/basedriver/commands/event.js.map +1 -1
  9. package/build/lib/basedriver/commands/execute.d.ts +7 -6
  10. package/build/lib/basedriver/commands/execute.d.ts.map +1 -1
  11. package/build/lib/basedriver/commands/execute.js +66 -58
  12. package/build/lib/basedriver/commands/execute.js.map +1 -1
  13. package/build/lib/basedriver/commands/find.d.ts +9 -7
  14. package/build/lib/basedriver/commands/find.d.ts.map +1 -1
  15. package/build/lib/basedriver/commands/find.js +102 -54
  16. package/build/lib/basedriver/commands/find.js.map +1 -1
  17. package/build/lib/basedriver/commands/index.d.ts +3 -7
  18. package/build/lib/basedriver/commands/index.d.ts.map +1 -1
  19. package/build/lib/basedriver/commands/index.js +30 -33
  20. package/build/lib/basedriver/commands/index.js.map +1 -1
  21. package/build/lib/basedriver/commands/log.d.ts +8 -9
  22. package/build/lib/basedriver/commands/log.d.ts.map +1 -1
  23. package/build/lib/basedriver/commands/log.js +54 -38
  24. package/build/lib/basedriver/commands/log.js.map +1 -1
  25. package/build/lib/basedriver/commands/session.d.ts +7 -6
  26. package/build/lib/basedriver/commands/session.d.ts.map +1 -1
  27. package/build/lib/basedriver/commands/session.js +46 -39
  28. package/build/lib/basedriver/commands/session.js.map +1 -1
  29. package/build/lib/basedriver/commands/settings.d.ts +7 -7
  30. package/build/lib/basedriver/commands/settings.d.ts.map +1 -1
  31. package/build/lib/basedriver/commands/settings.js +35 -28
  32. package/build/lib/basedriver/commands/settings.js.map +1 -1
  33. package/build/lib/basedriver/commands/timeout.d.ts +7 -5
  34. package/build/lib/basedriver/commands/timeout.d.ts.map +1 -1
  35. package/build/lib/basedriver/commands/timeout.js +144 -162
  36. package/build/lib/basedriver/commands/timeout.js.map +1 -1
  37. package/build/lib/basedriver/core.d.ts +6 -157
  38. package/build/lib/basedriver/core.d.ts.map +1 -1
  39. package/build/lib/basedriver/core.js +361 -230
  40. package/build/lib/basedriver/core.js.map +1 -1
  41. package/build/lib/basedriver/desired-caps.js +80 -110
  42. package/build/lib/basedriver/desired-caps.js.map +1 -1
  43. package/build/lib/basedriver/device-settings.js +57 -62
  44. package/build/lib/basedriver/device-settings.js.map +1 -1
  45. package/build/lib/basedriver/driver.d.ts +11 -262
  46. package/build/lib/basedriver/driver.d.ts.map +1 -1
  47. package/build/lib/basedriver/driver.js +362 -262
  48. package/build/lib/basedriver/driver.js.map +1 -1
  49. package/build/lib/basedriver/helpers.js +500 -495
  50. package/build/lib/basedriver/helpers.js.map +1 -1
  51. package/build/lib/basedriver/logger.d.ts +1 -1
  52. package/build/lib/basedriver/logger.d.ts.map +1 -1
  53. package/build/lib/basedriver/logger.js +5 -15
  54. package/build/lib/basedriver/logger.js.map +1 -1
  55. package/build/lib/constants.js +14 -14
  56. package/build/lib/constants.js.map +1 -1
  57. package/build/lib/express/crash.js +8 -15
  58. package/build/lib/express/crash.js.map +1 -1
  59. package/build/lib/express/express-logging.js +49 -59
  60. package/build/lib/express/express-logging.js.map +1 -1
  61. package/build/lib/express/idempotency.js +125 -177
  62. package/build/lib/express/idempotency.js.map +1 -1
  63. package/build/lib/express/logger.d.ts +1 -1
  64. package/build/lib/express/logger.d.ts.map +1 -1
  65. package/build/lib/express/logger.js +5 -15
  66. package/build/lib/express/logger.js.map +1 -1
  67. package/build/lib/express/middleware.js +82 -107
  68. package/build/lib/express/middleware.js.map +1 -1
  69. package/build/lib/express/server.d.ts +17 -5
  70. package/build/lib/express/server.d.ts.map +1 -1
  71. package/build/lib/express/server.js +259 -224
  72. package/build/lib/express/server.js.map +1 -1
  73. package/build/lib/express/static.js +64 -81
  74. package/build/lib/express/static.js.map +1 -1
  75. package/build/lib/express/websocket.js +115 -87
  76. package/build/lib/express/websocket.js.map +1 -1
  77. package/build/lib/helpers/capabilities.d.ts +1 -59
  78. package/build/lib/helpers/capabilities.d.ts.map +1 -1
  79. package/build/lib/helpers/capabilities.js +72 -69
  80. package/build/lib/helpers/capabilities.js.map +1 -1
  81. package/build/lib/index.js +64 -180
  82. package/build/lib/index.js.map +1 -1
  83. package/build/lib/jsonwp-proxy/protocol-converter.js +215 -227
  84. package/build/lib/jsonwp-proxy/protocol-converter.js.map +1 -1
  85. package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -1
  86. package/build/lib/jsonwp-proxy/proxy.js +355 -393
  87. package/build/lib/jsonwp-proxy/proxy.js.map +1 -1
  88. package/build/lib/jsonwp-status/status.js +119 -130
  89. package/build/lib/jsonwp-status/status.js.map +1 -1
  90. package/build/lib/protocol/errors.d.ts +135 -32
  91. package/build/lib/protocol/errors.d.ts.map +1 -1
  92. package/build/lib/protocol/errors.js +871 -919
  93. package/build/lib/protocol/errors.js.map +1 -1
  94. package/build/lib/protocol/helpers.js +37 -37
  95. package/build/lib/protocol/helpers.js.map +1 -1
  96. package/build/lib/protocol/index.js +22 -109
  97. package/build/lib/protocol/index.js.map +1 -1
  98. package/build/lib/protocol/protocol.js +394 -350
  99. package/build/lib/protocol/protocol.js.map +1 -1
  100. package/build/lib/protocol/routes.d.ts +1238 -4
  101. package/build/lib/protocol/routes.d.ts.map +1 -1
  102. package/build/lib/protocol/routes.js +964 -1327
  103. package/build/lib/protocol/routes.js.map +1 -1
  104. package/build/lib/protocol/validators.js +32 -39
  105. package/build/lib/protocol/validators.js.map +1 -1
  106. package/build/tsconfig.tsbuildinfo +1 -1
  107. package/lib/basedriver/capabilities.js +80 -39
  108. package/lib/basedriver/commands/event.js +10 -5
  109. package/lib/basedriver/commands/execute.js +14 -9
  110. package/lib/basedriver/commands/find.js +18 -12
  111. package/lib/basedriver/commands/index.js +21 -16
  112. package/lib/basedriver/commands/log.js +24 -18
  113. package/lib/basedriver/commands/session.js +10 -5
  114. package/lib/basedriver/commands/settings.js +9 -6
  115. package/lib/basedriver/commands/timeout.js +10 -4
  116. package/lib/basedriver/core.js +2 -3
  117. package/lib/basedriver/driver.js +12 -16
  118. package/lib/express/server.js +6 -3
  119. package/lib/protocol/errors.js +155 -44
  120. package/lib/protocol/routes.js +11 -7
  121. package/package.json +14 -16
@@ -1,282 +1,382 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = exports.BaseDriverCore = exports.BaseDriver = void 0;
7
-
8
- require("source-map-support/register");
9
-
10
- var _capabilities = require("./capabilities");
11
-
12
- var _core = require("./core");
13
-
14
- var _support = require("@appium/support");
15
-
16
- var _bluebird = _interopRequireDefault(require("bluebird"));
17
-
18
- var _lodash = _interopRequireDefault(require("lodash"));
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
- class BaseDriverCore extends _core.DriverCore {
39
- cliArgs;
40
- caps;
41
- originalCaps;
42
- desiredCapConstraints;
43
- opts;
44
- static BASE_DESIRED_CAP_CONSTRAINTS = _types.BASE_DESIRED_CAP_CONSTRAINTS;
45
-
46
- constructor(opts = {}, shouldValidateCaps = true) {
47
- super(opts, shouldValidateCaps);
48
- this.opts = opts;
49
- }
50
-
51
- get _desiredCapConstraints() {
52
- return Object.freeze(_lodash.default.merge({}, _types.BASE_DESIRED_CAP_CONSTRAINTS, this.desiredCapConstraints));
53
- }
54
-
55
- async executeCommand(cmd, ...args) {
56
- let startTime = Date.now();
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
- await this.clearNewCommandTimeout();
66
-
67
- if (this.shutdownUnexpectedly) {
68
- throw new _protocol.errors.NoSuchDriverError('The driver was unexpectedly shut down!');
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
- if (!this[cmd]) {
72
- throw new _protocol.errors.NotYetImplementedError();
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
- let unexpectedShutdownListener;
76
-
77
- const commandExecutor = async () => await _bluebird.default.race([this[cmd](...args), new _bluebird.default((resolve, reject) => {
78
- unexpectedShutdownListener = reject;
79
- this.eventEmitter.on(ON_UNEXPECTED_SHUTDOWN_EVENT, unexpectedShutdownListener);
80
- })]).finally(() => {
81
- if (unexpectedShutdownListener) {
82
- this.eventEmitter.removeListener(ON_UNEXPECTED_SHUTDOWN_EVENT, unexpectedShutdownListener);
83
- unexpectedShutdownListener = null;
84
- }
85
- });
86
-
87
- const res = this.isCommandsQueueEnabled ? await this.commandsQueueGuard.acquire(BaseDriver.name, commandExecutor) : await commandExecutor();
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
- const endTime = Date.now();
94
-
95
- this._eventHistory.commands.push({
96
- cmd,
97
- startTime,
98
- endTime
99
- });
100
-
101
- if (cmd === 'createSession') {
102
- this.logEvent(EVENT_SESSION_START);
103
- } else if (cmd === _protocol.DELETE_SESSION_COMMAND) {
104
- this.logEvent(EVENT_SESSION_QUIT_DONE);
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
- return res;
108
- }
109
-
110
- async startUnexpectedShutdown(err = new _protocol.errors.NoSuchDriverError('The driver was unexpectedly shut down!')) {
111
- this.eventEmitter.emit(ON_UNEXPECTED_SHUTDOWN_EVENT, err);
112
- this.shutdownUnexpectedly = true;
113
-
114
- try {
115
- if (this.sessionId !== null) {
116
- await this.deleteSession(this.sessionId);
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
- async startNewCommandTimeout() {
124
- await this.clearNewCommandTimeout();
125
- if (!this.newCommandTimeoutMs) return;
126
- this.noCommandTimer = setTimeout(async () => {
127
- this.log.warn(`Shutting down because we waited ` + `${this.newCommandTimeoutMs / 1000.0} seconds for a command`);
128
- const errorMessage = `New Command Timeout of ` + `${this.newCommandTimeoutMs / 1000.0} seconds ` + `expired. Try customizing the timeout using the ` + `'newCommandTimeout' desired capability`;
129
- await this.startUnexpectedShutdown(new Error(errorMessage));
130
- }, this.newCommandTimeoutMs);
131
- }
132
-
133
- assignServer(server, host, port, path) {
134
- this.server = server;
135
- this.serverHost = host;
136
- this.serverPort = port;
137
- this.serverPath = path;
138
- }
139
-
140
- async reset() {
141
- this.log.debug('Resetting app mid-session');
142
- this.log.debug('Running generic full reset');
143
- let currentConfig = {};
144
-
145
- for (let property of ['implicitWaitMs', 'newCommandTimeoutMs', 'sessionId', 'resetOnUnexpectedShutdown']) {
146
- currentConfig[property] = this[property];
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
- this.resetOnUnexpectedShutdown = () => {};
150
-
151
- try {
152
- if (this.sessionId !== null) {
153
- await this.deleteSession(this.sessionId);
154
- }
155
-
156
- this.log.debug('Restarting app');
157
- await this.createSession(this.originalCaps);
158
- } finally {
159
- for (let [key, value] of _lodash.default.toPairs(currentConfig)) {
160
- this[key] = value;
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
- await this.clearNewCommandTimeout();
165
- }
166
-
167
- async createSession(w3cCapabilities1, w3cCapabilities2, w3cCapabilities, driverData) {
168
- if (this.sessionId !== null) {
169
- throw new _protocol.errors.SessionNotCreatedError('Cannot create a new session while one is in progress');
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
- this.log.debug();
173
-
174
- const originalCaps = _lodash.default.cloneDeep([w3cCapabilities, w3cCapabilities1, w3cCapabilities2].find(_capabilities2.isW3cCaps));
175
-
176
- if (!originalCaps) {
177
- throw new _protocol.errors.SessionNotCreatedError('Appium only supports W3C-style capability objects. ' + 'Your client is sending an older capabilities format. Please update your client library.');
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
- this.setProtocolW3C();
181
- this.originalCaps = originalCaps;
182
- this.log.debug(`Creating session with W3C capabilities: ${JSON.stringify(originalCaps, null, 2)}`);
183
- let caps;
184
-
185
- try {
186
- caps = (0, _capabilities.processCapabilities)(originalCaps, this._desiredCapConstraints, this.shouldValidateCaps);
187
-
188
- if (caps[_capabilities.APPIUM_OPTS_CAP]) {
189
- this.log.debug(`Found ${_capabilities.PREFIXED_APPIUM_OPTS_CAP} capability present; will promote items inside to caps`);
190
- caps = (0, _capabilities.promoteAppiumOptions)(caps);
191
- }
192
-
193
- caps = (0, _capabilities2.fixCaps)(caps, this._desiredCapConstraints, this.log);
194
- } catch (e) {
195
- throw new _protocol.errors.SessionNotCreatedError(e.message);
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
- class BaseDriver extends (0, _commands.createBaseDriverClass)(BaseDriverCore) {}
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
- var _default = BaseDriver;
281
- exports.default = _default;
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