@appium/execute-driver-plugin 2.0.6 → 3.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.
@@ -1,139 +1,129 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.W3C_ELEMENT_KEY = exports.MJSONWP_ELEMENT_KEY = void 0;
7
-
8
- require("source-map-support/register");
9
-
10
- var _lodash = _interopRequireDefault(require("lodash"));
11
-
12
- var _bluebird = _interopRequireDefault(require("bluebird"));
13
-
14
- var _vm = require("vm2");
15
-
16
- var _support = require("appium/support");
17
-
18
- var _webdriverio = require("webdriverio");
19
-
20
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
-
22
- const log = _support.logger.getLogger('ExecuteDriver Child');
23
-
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MJSONWP_ELEMENT_KEY = exports.W3C_ELEMENT_KEY = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const bluebird_1 = __importDefault(require("bluebird"));
9
+ const vm2_1 = require("vm2");
10
+ const support_1 = require("appium/support");
11
+ const webdriverio_1 = require("webdriverio");
12
+ const log = support_1.logger.getLogger('ExecuteDriver Child');
24
13
  let send;
25
- const W3C_ELEMENT_KEY = _support.util.W3C_WEB_ELEMENT_IDENTIFIER;
26
- exports.W3C_ELEMENT_KEY = W3C_ELEMENT_KEY;
27
- const MJSONWP_ELEMENT_KEY = 'ELEMENT';
28
- exports.MJSONWP_ELEMENT_KEY = MJSONWP_ELEMENT_KEY;
29
-
14
+ // duplicate defining these keys here so we don't need to re-load a huge appium
15
+ // dependency tree into memory just to run a wdio script
16
+ exports.W3C_ELEMENT_KEY = support_1.util.W3C_WEB_ELEMENT_IDENTIFIER;
17
+ exports.MJSONWP_ELEMENT_KEY = 'ELEMENT';
30
18
  async function runScript(driverOpts, script, timeoutMs) {
31
- if (!_lodash.default.isNumber(timeoutMs)) {
32
- throw new TypeError('Timeout parameter must be a number');
33
- }
34
-
35
- const logLevels = ['error', 'warn', 'log'];
36
- const logs = {};
37
- const consoleFns = {};
38
-
39
- for (const level of logLevels) {
40
- logs[level] = [];
41
-
42
- consoleFns[level] = (...logMsgs) => logs[level].push(...logMsgs);
43
- }
44
-
45
- const driver = await (0, _webdriverio.attach)(driverOpts);
46
- const fullScript = buildScript(script);
47
- log.info('Running driver script in Node vm');
48
- const vmCtx = new _vm.NodeVM({
49
- timeout: timeoutMs
50
- });
51
- const vmFn = vmCtx.run(fullScript);
52
- let result = await vmFn(driver, consoleFns, _bluebird.default);
53
- result = coerceScriptResult(result);
54
- log.info('Successfully ensured driver script result is appropriate type for return');
55
- return {
56
- result,
57
- logs
58
- };
19
+ if (!lodash_1.default.isNumber(timeoutMs)) {
20
+ throw new TypeError('Timeout parameter must be a number');
21
+ }
22
+ // set up fake logger
23
+ const logLevels = ['error', 'warn', 'log'];
24
+ const logs = {};
25
+ const consoleFns = {};
26
+ for (const level of logLevels) {
27
+ logs[level] = [];
28
+ consoleFns[level] = (...logMsgs) => logs[level].push(...logMsgs);
29
+ }
30
+ const driver = await (0, webdriverio_1.attach)(driverOpts);
31
+ const fullScript = buildScript(script);
32
+ log.info('Running driver script in Node vm');
33
+ const vmCtx = new vm2_1.NodeVM({ timeout: timeoutMs });
34
+ const vmFn = vmCtx.run(fullScript);
35
+ // run the driver script, giving user access to the driver object, a fake
36
+ // console logger, and a promise library
37
+ let result = await vmFn(driver, consoleFns, bluebird_1.default);
38
+ result = coerceScriptResult(result);
39
+ log.info('Successfully ensured driver script result is appropriate type for return');
40
+ return { result, logs };
59
41
  }
60
-
42
+ /**
43
+ * Embed a user-generated script inside a method which takes only the
44
+ * predetermined objects we specify
45
+ *
46
+ * @param {string} script - the javascript to execute
47
+ *
48
+ * @return {string} - the full script to execute
49
+ */
61
50
  function buildScript(script) {
62
- return `module.exports = async function execute (driver, console, Promise) {
51
+ return `module.exports = async function execute (driver, console, Promise) {
63
52
  ${script}
64
53
  }`;
65
54
  }
66
-
55
+ /**
56
+ * We can get any manner of crazy thing back from a vm executing untrusted
57
+ * code. We might also get WebdriverIO objects that aren't suitable for JSON
58
+ * response. So make sure we convert the things we know about to their
59
+ * appropriate response format, and squash other weird things.
60
+ *
61
+ * @param {Object} obj - object to convert and sanitize
62
+ *
63
+ * @return {Object} - safely converted object
64
+ */
67
65
  function coerceScriptResult(obj) {
68
- try {
69
- obj = JSON.parse(JSON.stringify(obj));
70
- } catch (e) {
71
- log.warn('Could not convert executeDriverScript to safe response!' + `Result was: ${JSON.stringify(obj)}. Will make it null`);
72
- return null;
73
- }
74
-
75
- let res;
76
-
77
- if (_lodash.default.isPlainObject(obj)) {
78
- res = {};
79
-
80
- if (obj[MJSONWP_ELEMENT_KEY] || obj[W3C_ELEMENT_KEY]) {
81
- if (obj[MJSONWP_ELEMENT_KEY]) {
82
- res[MJSONWP_ELEMENT_KEY] = obj[MJSONWP_ELEMENT_KEY];
83
- }
84
-
85
- if (obj[W3C_ELEMENT_KEY]) {
86
- res[W3C_ELEMENT_KEY] = obj[W3C_ELEMENT_KEY];
87
- }
88
-
89
- return res;
66
+ // first ensure obj is of a type that can be JSON encoded safely. This will
67
+ // get rid of custom objects, functions, etc... and turn them into POJOs
68
+ try {
69
+ obj = JSON.parse(JSON.stringify(obj));
70
+ }
71
+ catch (e) {
72
+ log.warn('Could not convert executeDriverScript to safe response!' +
73
+ `Result was: ${JSON.stringify(obj)}. Will make it null`);
74
+ return null;
90
75
  }
91
-
92
- for (const key of Object.keys(obj)) {
93
- res[key] = coerceScriptResult(obj[key]);
76
+ let res;
77
+ // now we begin our recursive case options
78
+ if (lodash_1.default.isPlainObject(obj)) {
79
+ // if we have an object, it's either an element object or something else
80
+ // webdriverio has no monadic object types other than element and driver,
81
+ // and we don't want to allow special casing return of driver
82
+ res = {};
83
+ if (obj[exports.MJSONWP_ELEMENT_KEY] || obj[exports.W3C_ELEMENT_KEY]) {
84
+ // if it's an element object, clear out anything that's not the key, and then return the
85
+ // object. Note that if the element object contains only one element key type (MJSONWP or
86
+ // W3C), keep it that way in our response. But if the element contains both key types
87
+ // (because the client is being backwards compatible) then keep both keys in our response as
88
+ // well.
89
+ if (obj[exports.MJSONWP_ELEMENT_KEY]) {
90
+ res[exports.MJSONWP_ELEMENT_KEY] = obj[exports.MJSONWP_ELEMENT_KEY];
91
+ }
92
+ if (obj[exports.W3C_ELEMENT_KEY]) {
93
+ res[exports.W3C_ELEMENT_KEY] = obj[exports.W3C_ELEMENT_KEY];
94
+ }
95
+ return res;
96
+ }
97
+ // otherwise, recurse into the object
98
+ for (const key of Object.keys(obj)) {
99
+ res[key] = coerceScriptResult(obj[key]);
100
+ }
101
+ return res;
94
102
  }
95
-
96
- return res;
97
- }
98
-
99
- if (_lodash.default.isArray(obj)) {
100
- return obj.map(coerceScriptResult);
101
- }
102
-
103
- return obj;
103
+ // also handle arrays
104
+ if (lodash_1.default.isArray(obj)) {
105
+ return obj.map(coerceScriptResult);
106
+ }
107
+ // base case, if it's not an object or array, return straightaway
108
+ return obj;
104
109
  }
105
-
106
110
  async function main(driverOpts, script, timeoutMs) {
107
- let res;
108
-
109
- try {
110
- res = {
111
- success: await runScript(driverOpts, script, timeoutMs)
112
- };
113
- } catch (error) {
114
- res = {
115
- error: {
116
- message: error.message,
117
- stack: error.stack
118
- }
119
- };
120
- }
121
-
122
- await send(res);
111
+ let res;
112
+ try {
113
+ res = { success: await runScript(driverOpts, script, timeoutMs) };
114
+ }
115
+ catch (error) {
116
+ res = { error: { message: error.message, stack: error.stack } };
117
+ }
118
+ await send(res);
123
119
  }
124
-
125
- if (require.main === module && _lodash.default.isFunction(process.send)) {
126
- send = _bluebird.default.promisify(process.send, {
127
- context: process
128
- });
129
- log.info('Running driver execution in child process');
130
- process.on('message', ({
131
- driverOpts,
132
- script,
133
- timeoutMs
134
- }) => {
135
- log.info('Parameters received from parent process');
136
- main(driverOpts, script, timeoutMs);
137
- });
120
+ // ensure we're running this script in IPC mode
121
+ if (require.main === module && lodash_1.default.isFunction(process.send)) {
122
+ send = bluebird_1.default.promisify(process.send, { context: process });
123
+ log.info('Running driver execution in child process');
124
+ process.on('message', ({ driverOpts, script, timeoutMs }) => {
125
+ log.info('Parameters received from parent process');
126
+ main(driverOpts, script, timeoutMs);
127
+ });
138
128
  }
139
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJzZW5kIiwiVzNDX0VMRU1FTlRfS0VZIiwidXRpbCIsIlczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSIiwiTUpTT05XUF9FTEVNRU5UX0tFWSIsInJ1blNjcmlwdCIsImRyaXZlck9wdHMiLCJzY3JpcHQiLCJ0aW1lb3V0TXMiLCJfIiwiaXNOdW1iZXIiLCJUeXBlRXJyb3IiLCJsb2dMZXZlbHMiLCJsb2dzIiwiY29uc29sZUZucyIsImxldmVsIiwibG9nTXNncyIsInB1c2giLCJkcml2ZXIiLCJhdHRhY2giLCJmdWxsU2NyaXB0IiwiYnVpbGRTY3JpcHQiLCJpbmZvIiwidm1DdHgiLCJOb2RlVk0iLCJ0aW1lb3V0Iiwidm1GbiIsInJ1biIsInJlc3VsdCIsIkIiLCJjb2VyY2VTY3JpcHRSZXN1bHQiLCJvYmoiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJlIiwid2FybiIsInJlcyIsImlzUGxhaW5PYmplY3QiLCJrZXkiLCJPYmplY3QiLCJrZXlzIiwiaXNBcnJheSIsIm1hcCIsIm1haW4iLCJzdWNjZXNzIiwiZXJyb3IiLCJtZXNzYWdlIiwic3RhY2siLCJyZXF1aXJlIiwibW9kdWxlIiwiaXNGdW5jdGlvbiIsInByb2Nlc3MiLCJwcm9taXNpZnkiLCJjb250ZXh0Iiwib24iXSwic291cmNlcyI6WyIuLi8uLi9saWIvZXhlY3V0ZS1jaGlsZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtOb2RlVk19IGZyb20gJ3ZtMic7XG5pbXBvcnQge2xvZ2dlciwgdXRpbH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHthdHRhY2h9IGZyb20gJ3dlYmRyaXZlcmlvJztcblxuY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignRXhlY3V0ZURyaXZlciBDaGlsZCcpO1xubGV0IHNlbmQ7XG5cbi8vIGR1cGxpY2F0ZSBkZWZpbmluZyB0aGVzZSBrZXlzIGhlcmUgc28gd2UgZG9uJ3QgbmVlZCB0byByZS1sb2FkIGEgaHVnZSBhcHBpdW1cbi8vIGRlcGVuZGVuY3kgdHJlZSBpbnRvIG1lbW9yeSBqdXN0IHRvIHJ1biBhIHdkaW8gc2NyaXB0XG5leHBvcnQgY29uc3QgVzNDX0VMRU1FTlRfS0VZID0gdXRpbC5XM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUjtcbmV4cG9ydCBjb25zdCBNSlNPTldQX0VMRU1FTlRfS0VZID0gJ0VMRU1FTlQnO1xuXG5hc3luYyBmdW5jdGlvbiBydW5TY3JpcHQoZHJpdmVyT3B0cywgc2NyaXB0LCB0aW1lb3V0TXMpIHtcbiAgaWYgKCFfLmlzTnVtYmVyKHRpbWVvdXRNcykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaW1lb3V0IHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gIH1cblxuICAvLyBzZXQgdXAgZmFrZSBsb2dnZXJcbiAgY29uc3QgbG9nTGV2ZWxzID0gWydlcnJvcicsICd3YXJuJywgJ2xvZyddO1xuICBjb25zdCBsb2dzID0ge307XG4gIGNvbnN0IGNvbnNvbGVGbnMgPSB7fTtcbiAgZm9yIChjb25zdCBsZXZlbCBvZiBsb2dMZXZlbHMpIHtcbiAgICBsb2dzW2xldmVsXSA9IFtdO1xuICAgIGNvbnNvbGVGbnNbbGV2ZWxdID0gKC4uLmxvZ01zZ3MpID0+IGxvZ3NbbGV2ZWxdLnB1c2goLi4ubG9nTXNncyk7XG4gIH1cblxuICBjb25zdCBkcml2ZXIgPSBhd2FpdCBhdHRhY2goZHJpdmVyT3B0cyk7XG5cbiAgY29uc3QgZnVsbFNjcmlwdCA9IGJ1aWxkU2NyaXB0KHNjcmlwdCk7XG5cbiAgbG9nLmluZm8oJ1J1bm5pbmcgZHJpdmVyIHNjcmlwdCBpbiBOb2RlIHZtJyk7XG5cbiAgY29uc3Qgdm1DdHggPSBuZXcgTm9kZVZNKHt0aW1lb3V0OiB0aW1lb3V0TXN9KTtcbiAgY29uc3Qgdm1GbiA9IHZtQ3R4LnJ1bihmdWxsU2NyaXB0KTtcblxuICAvLyBydW4gdGhlIGRyaXZlciBzY3JpcHQsIGdpdmluZyB1c2VyIGFjY2VzcyB0byB0aGUgZHJpdmVyIG9iamVjdCwgYSBmYWtlXG4gIC8vIGNvbnNvbGUgbG9nZ2VyLCBhbmQgYSBwcm9taXNlIGxpYnJhcnlcbiAgbGV0IHJlc3VsdCA9IGF3YWl0IHZtRm4oZHJpdmVyLCBjb25zb2xlRm5zLCBCKTtcblxuICByZXN1bHQgPSBjb2VyY2VTY3JpcHRSZXN1bHQocmVzdWx0KTtcbiAgbG9nLmluZm8oJ1N1Y2Nlc3NmdWxseSBlbnN1cmVkIGRyaXZlciBzY3JpcHQgcmVzdWx0IGlzIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHJldHVybicpO1xuICByZXR1cm4ge3Jlc3VsdCwgbG9nc307XG59XG5cbi8qKlxuICogRW1iZWQgYSB1c2VyLWdlbmVyYXRlZCBzY3JpcHQgaW5zaWRlIGEgbWV0aG9kIHdoaWNoIHRha2VzIG9ubHkgdGhlXG4gKiBwcmVkZXRlcm1pbmVkIG9iamVjdHMgd2Ugc3BlY2lmeVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzY3JpcHQgLSB0aGUgamF2YXNjcmlwdCB0byBleGVjdXRlXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSAtIHRoZSBmdWxsIHNjcmlwdCB0byBleGVjdXRlXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2NyaXB0KHNjcmlwdCkge1xuICByZXR1cm4gYG1vZHVsZS5leHBvcnRzID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZSAoZHJpdmVyLCBjb25zb2xlLCBQcm9taXNlKSB7XG4gICAgJHtzY3JpcHR9XG4gIH1gO1xufVxuXG4vKipcbiAqIFdlIGNhbiBnZXQgYW55IG1hbm5lciBvZiBjcmF6eSB0aGluZyBiYWNrIGZyb20gYSB2bSBleGVjdXRpbmcgdW50cnVzdGVkXG4gKiBjb2RlLiBXZSBtaWdodCBhbHNvIGdldCBXZWJkcml2ZXJJTyBvYmplY3RzIHRoYXQgYXJlbid0IHN1aXRhYmxlIGZvciBKU09OXG4gKiByZXNwb25zZS4gU28gbWFrZSBzdXJlIHdlIGNvbnZlcnQgdGhlIHRoaW5ncyB3ZSBrbm93IGFib3V0IHRvIHRoZWlyXG4gKiBhcHByb3ByaWF0ZSByZXNwb25zZSBmb3JtYXQsIGFuZCBzcXVhc2ggb3RoZXIgd2VpcmQgdGhpbmdzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBvYmplY3QgdG8gY29udmVydCBhbmQgc2FuaXRpemVcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gc2FmZWx5IGNvbnZlcnRlZCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gY29lcmNlU2NyaXB0UmVzdWx0KG9iaikge1xuICAvLyBmaXJzdCBlbnN1cmUgb2JqIGlzIG9mIGEgdHlwZSB0aGF0IGNhbiBiZSBKU09OIGVuY29kZWQgc2FmZWx5LiBUaGlzIHdpbGxcbiAgLy8gZ2V0IHJpZCBvZiBjdXN0b20gb2JqZWN0cywgZnVuY3Rpb25zLCBldGMuLi4gYW5kIHR1cm4gdGhlbSBpbnRvIFBPSk9zXG4gIHRyeSB7XG4gICAgb2JqID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy53YXJuKFxuICAgICAgJ0NvdWxkIG5vdCBjb252ZXJ0IGV4ZWN1dGVEcml2ZXJTY3JpcHQgdG8gc2FmZSByZXNwb25zZSEnICtcbiAgICAgICAgYFJlc3VsdCB3YXM6ICR7SlNPTi5zdHJpbmdpZnkob2JqKX0uIFdpbGwgbWFrZSBpdCBudWxsYFxuICAgICk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgcmVzO1xuXG4gIC8vIG5vdyB3ZSBiZWdpbiBvdXIgcmVjdXJzaXZlIGNhc2Ugb3B0aW9uc1xuICBpZiAoXy5pc1BsYWluT2JqZWN0KG9iaikpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGFuIG9iamVjdCwgaXQncyBlaXRoZXIgYW4gZWxlbWVudCBvYmplY3Qgb3Igc29tZXRoaW5nIGVsc2VcbiAgICAvLyB3ZWJkcml2ZXJpbyBoYXMgbm8gbW9uYWRpYyBvYmplY3QgdHlwZXMgb3RoZXIgdGhhbiBlbGVtZW50IGFuZCBkcml2ZXIsXG4gICAgLy8gYW5kIHdlIGRvbid0IHdhbnQgdG8gYWxsb3cgc3BlY2lhbCBjYXNpbmcgcmV0dXJuIG9mIGRyaXZlclxuICAgIHJlcyA9IHt9O1xuXG4gICAgaWYgKG9ialtNSlNPTldQX0VMRU1FTlRfS0VZXSB8fCBvYmpbVzNDX0VMRU1FTlRfS0VZXSkge1xuICAgICAgLy8gaWYgaXQncyBhbiBlbGVtZW50IG9iamVjdCwgY2xlYXIgb3V0IGFueXRoaW5nIHRoYXQncyBub3QgdGhlIGtleSwgYW5kIHRoZW4gcmV0dXJuIHRoZVxuICAgICAgLy8gb2JqZWN0LiBOb3RlIHRoYXQgaWYgdGhlIGVsZW1lbnQgb2JqZWN0IGNvbnRhaW5zIG9ubHkgb25lIGVsZW1lbnQga2V5IHR5cGUgKE1KU09OV1Agb3JcbiAgICAgIC8vIFczQyksIGtlZXAgaXQgdGhhdCB3YXkgaW4gb3VyIHJlc3BvbnNlLiBCdXQgaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgYm90aCBrZXkgdHlwZXNcbiAgICAgIC8vIChiZWNhdXNlIHRoZSBjbGllbnQgaXMgYmVpbmcgYmFja3dhcmRzIGNvbXBhdGlibGUpIHRoZW4ga2VlcCBib3RoIGtleXMgaW4gb3VyIHJlc3BvbnNlIGFzXG4gICAgICAvLyB3ZWxsLlxuICAgICAgaWYgKG9ialtNSlNPTldQX0VMRU1FTlRfS0VZXSkge1xuICAgICAgICByZXNbTUpTT05XUF9FTEVNRU5UX0tFWV0gPSBvYmpbTUpTT05XUF9FTEVNRU5UX0tFWV07XG4gICAgICB9XG5cbiAgICAgIGlmIChvYmpbVzNDX0VMRU1FTlRfS0VZXSkge1xuICAgICAgICByZXNbVzNDX0VMRU1FTlRfS0VZXSA9IG9ialtXM0NfRUxFTUVOVF9LRVldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBvdGhlcndpc2UsIHJlY3Vyc2UgaW50byB0aGUgb2JqZWN0XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgcmVzW2tleV0gPSBjb2VyY2VTY3JpcHRSZXN1bHQob2JqW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLy8gYWxzbyBoYW5kbGUgYXJyYXlzXG4gIGlmIChfLmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmoubWFwKGNvZXJjZVNjcmlwdFJlc3VsdCk7XG4gIH1cblxuICAvLyBiYXNlIGNhc2UsIGlmIGl0J3Mgbm90IGFuIG9iamVjdCBvciBhcnJheSwgcmV0dXJuIHN0cmFpZ2h0YXdheVxuICByZXR1cm4gb2JqO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKGRyaXZlck9wdHMsIHNjcmlwdCwgdGltZW91dE1zKSB7XG4gIGxldCByZXM7XG4gIHRyeSB7XG4gICAgcmVzID0ge3N1Y2Nlc3M6IGF3YWl0IHJ1blNjcmlwdChkcml2ZXJPcHRzLCBzY3JpcHQsIHRpbWVvdXRNcyl9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcyA9IHtlcnJvcjoge21lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsIHN0YWNrOiBlcnJvci5zdGFja319O1xuICB9XG4gIGF3YWl0IHNlbmQocmVzKTtcbn1cblxuLy8gZW5zdXJlIHdlJ3JlIHJ1bm5pbmcgdGhpcyBzY3JpcHQgaW4gSVBDIG1vZGVcbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSAmJiBfLmlzRnVuY3Rpb24ocHJvY2Vzcy5zZW5kKSkge1xuICBzZW5kID0gQi5wcm9taXNpZnkocHJvY2Vzcy5zZW5kLCB7Y29udGV4dDogcHJvY2Vzc30pO1xuICBsb2cuaW5mbygnUnVubmluZyBkcml2ZXIgZXhlY3V0aW9uIGluIGNoaWxkIHByb2Nlc3MnKTtcbiAgcHJvY2Vzcy5vbignbWVzc2FnZScsICh7ZHJpdmVyT3B0cywgc2NyaXB0LCB0aW1lb3V0TXN9KSA9PiB7XG4gICAgbG9nLmluZm8oJ1BhcmFtZXRlcnMgcmVjZWl2ZWQgZnJvbSBwYXJlbnQgcHJvY2VzcycpO1xuICAgIG1haW4oZHJpdmVyT3B0cywgc2NyaXB0LCB0aW1lb3V0TXMpO1xuICB9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
129
+ //# sourceMappingURL=execute-child.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"execute-child.js","names":["log","logger","getLogger","send","W3C_ELEMENT_KEY","util","W3C_WEB_ELEMENT_IDENTIFIER","MJSONWP_ELEMENT_KEY","runScript","driverOpts","script","timeoutMs","_","isNumber","TypeError","logLevels","logs","consoleFns","level","logMsgs","push","driver","attach","fullScript","buildScript","info","vmCtx","NodeVM","timeout","vmFn","run","result","B","coerceScriptResult","obj","JSON","parse","stringify","e","warn","res","isPlainObject","key","Object","keys","isArray","map","main","success","error","message","stack","require","module","isFunction","process","promisify","context","on"],"sources":["../../lib/execute-child.js"],"sourcesContent":["import _ from 'lodash';\nimport B from 'bluebird';\nimport {NodeVM} from 'vm2';\nimport {logger, util} from 'appium/support';\nimport {attach} from 'webdriverio';\n\nconst log = logger.getLogger('ExecuteDriver Child');\nlet send;\n\n// duplicate defining these keys here so we don't need to re-load a huge appium\n// dependency tree into memory just to run a wdio script\nexport const W3C_ELEMENT_KEY = util.W3C_WEB_ELEMENT_IDENTIFIER;\nexport const MJSONWP_ELEMENT_KEY = 'ELEMENT';\n\nasync function runScript(driverOpts, script, timeoutMs) {\n if (!_.isNumber(timeoutMs)) {\n throw new TypeError('Timeout parameter must be a number');\n }\n\n // set up fake logger\n const logLevels = ['error', 'warn', 'log'];\n const logs = {};\n const consoleFns = {};\n for (const level of logLevels) {\n logs[level] = [];\n consoleFns[level] = (...logMsgs) => logs[level].push(...logMsgs);\n }\n\n const driver = await attach(driverOpts);\n\n const fullScript = buildScript(script);\n\n log.info('Running driver script in Node vm');\n\n const vmCtx = new NodeVM({timeout: timeoutMs});\n const vmFn = vmCtx.run(fullScript);\n\n // run the driver script, giving user access to the driver object, a fake\n // console logger, and a promise library\n let result = await vmFn(driver, consoleFns, B);\n\n result = coerceScriptResult(result);\n log.info('Successfully ensured driver script result is appropriate type for return');\n return {result, logs};\n}\n\n/**\n * Embed a user-generated script inside a method which takes only the\n * predetermined objects we specify\n *\n * @param {string} script - the javascript to execute\n *\n * @return {string} - the full script to execute\n */\nfunction buildScript(script) {\n return `module.exports = async function execute (driver, console, Promise) {\n ${script}\n }`;\n}\n\n/**\n * We can get any manner of crazy thing back from a vm executing untrusted\n * code. We might also get WebdriverIO objects that aren't suitable for JSON\n * response. So make sure we convert the things we know about to their\n * appropriate response format, and squash other weird things.\n *\n * @param {Object} obj - object to convert and sanitize\n *\n * @return {Object} - safely converted object\n */\nfunction coerceScriptResult(obj) {\n // first ensure obj is of a type that can be JSON encoded safely. This will\n // get rid of custom objects, functions, etc... and turn them into POJOs\n try {\n obj = JSON.parse(JSON.stringify(obj));\n } catch (e) {\n log.warn(\n 'Could not convert executeDriverScript to safe response!' +\n `Result was: ${JSON.stringify(obj)}. Will make it null`\n );\n return null;\n }\n\n let res;\n\n // now we begin our recursive case options\n if (_.isPlainObject(obj)) {\n // if we have an object, it's either an element object or something else\n // webdriverio has no monadic object types other than element and driver,\n // and we don't want to allow special casing return of driver\n res = {};\n\n if (obj[MJSONWP_ELEMENT_KEY] || obj[W3C_ELEMENT_KEY]) {\n // if it's an element object, clear out anything that's not the key, and then return the\n // object. Note that if the element object contains only one element key type (MJSONWP or\n // W3C), keep it that way in our response. But if the element contains both key types\n // (because the client is being backwards compatible) then keep both keys in our response as\n // well.\n if (obj[MJSONWP_ELEMENT_KEY]) {\n res[MJSONWP_ELEMENT_KEY] = obj[MJSONWP_ELEMENT_KEY];\n }\n\n if (obj[W3C_ELEMENT_KEY]) {\n res[W3C_ELEMENT_KEY] = obj[W3C_ELEMENT_KEY];\n }\n return res;\n }\n\n // otherwise, recurse into the object\n for (const key of Object.keys(obj)) {\n res[key] = coerceScriptResult(obj[key]);\n }\n return res;\n }\n\n // also handle arrays\n if (_.isArray(obj)) {\n return obj.map(coerceScriptResult);\n }\n\n // base case, if it's not an object or array, return straightaway\n return obj;\n}\n\nasync function main(driverOpts, script, timeoutMs) {\n let res;\n try {\n res = {success: await runScript(driverOpts, script, timeoutMs)};\n } catch (error) {\n res = {error: {message: error.message, stack: error.stack}};\n }\n await send(res);\n}\n\n// ensure we're running this script in IPC mode\nif (require.main === module && _.isFunction(process.send)) {\n send = B.promisify(process.send, {context: process});\n log.info('Running driver execution in child process');\n process.on('message', ({driverOpts, script, timeoutMs}) => {\n log.info('Parameters received from parent process');\n main(driverOpts, script, timeoutMs);\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"execute-child.js","sourceRoot":"","sources":["../../lib/execute-child.js"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  export default class ExecuteDriverPlugin extends BasePlugin {
2
2
  static newMethodMap: {
3
- '/session/:sessionId/appium/execute_driver': {
4
- POST: {
5
- command: string;
6
- payloadParams: {
7
- required: string[];
8
- optional: string[];
3
+ readonly '/session/:sessionId/appium/execute_driver': {
4
+ readonly POST: {
5
+ readonly command: "executeDriverScript";
6
+ readonly payloadParams: {
7
+ readonly required: readonly ["script"];
8
+ readonly optional: readonly ["type", "timeout"];
9
9
  };
10
10
  };
11
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../lib/plugin.js"],"names":[],"mappings":"AAUA;IACE;;;;;;;;;;MAOE;IAEF;;;;;;;;;;;;;;OAcG;IACH,gEARW,MAAM,wEAgIhB;CACF"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../lib/plugin.js"],"names":[],"mappings":"AAUA;IACE;;;;;;;;;;MAOG;IAEH;;;;;;;;;;;;;;OAcG;IACH,gEARW,MAAM,wEAgIhB;CACF"}
@@ -1,134 +1,132 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = exports.ExecuteDriverPlugin = void 0;
7
-
8
- require("source-map-support/register");
9
-
10
- var _plugin = require("appium/plugin");
11
-
12
- var _lodash = _interopRequireDefault(require("lodash"));
13
-
14
- var _child_process = _interopRequireDefault(require("child_process"));
15
-
16
- var _support = require("appium/support");
17
-
18
- var _bluebird = _interopRequireDefault(require("bluebird"));
19
-
20
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
-
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ExecuteDriverPlugin = void 0;
7
+ const plugin_1 = require("appium/plugin");
8
+ const lodash_1 = __importDefault(require("lodash"));
9
+ const child_process_1 = __importDefault(require("child_process"));
10
+ const support_1 = require("appium/support");
11
+ const bluebird_1 = __importDefault(require("bluebird"));
22
12
  const FEAT_FLAG = 'execute_driver_script';
23
- const DEFAULT_SCRIPT_TIMEOUT_MS = 1000 * 60 * 60;
13
+ const DEFAULT_SCRIPT_TIMEOUT_MS = 1000 * 60 * 60; // default to 1 hour timeout
24
14
  const SCRIPT_TYPE_WDIO = 'webdriverio';
25
-
26
- class ExecuteDriverPlugin extends _plugin.BasePlugin {
27
- static newMethodMap = {
28
- '/session/:sessionId/appium/execute_driver': {
29
- POST: {
30
- command: 'executeDriverScript',
31
- payloadParams: {
32
- required: ['script'],
33
- optional: ['type', 'timeout']
15
+ class ExecuteDriverPlugin extends plugin_1.BasePlugin {
16
+ /**
17
+ * This method takes a string which is executed as javascript in the context of
18
+ * a new nodejs VM, and which has available a webdriverio driver object, having
19
+ * already been attached to the currently running session.
20
+ *
21
+ * @param {function} next - standard behaviour for executeDriverScript
22
+ * @param {BaseDriver} driver - Appium driver handling this command
23
+ * @param {string} script - the string representing the driver script to run
24
+ * @param {string} [scriptType='webdriverio'] - the name of the driver script
25
+ * library (currently only webdriverio is supported)
26
+ * @param {number} [timeoutMs=3600000] - timeout for the script process
27
+ *
28
+ * @returns {Object} - a JSONifiable object representing the return value of
29
+ * the script
30
+ */
31
+ async executeDriverScript(next, driver, script, scriptType = 'webdriverio', timeoutMs = DEFAULT_SCRIPT_TIMEOUT_MS) {
32
+ if (!driver.isFeatureEnabled(FEAT_FLAG)) {
33
+ throw new Error(`Execute driver script functionality is not available ` +
34
+ `unless server is started with --allow-insecure including ` +
35
+ `the '${FEAT_FLAG}' flag, e.g., --allow-insecure=${FEAT_FLAG}`);
34
36
  }
35
- }
36
- }
37
- };
38
-
39
- async executeDriverScript(next, driver, script, scriptType = 'webdriverio', timeoutMs = DEFAULT_SCRIPT_TIMEOUT_MS) {
40
- if (!driver.isFeatureEnabled(FEAT_FLAG)) {
41
- throw new Error(`Execute driver script functionality is not available ` + `unless server is started with --allow-insecure including ` + `the '${FEAT_FLAG}' flag, e.g., --allow-insecure=${FEAT_FLAG}`);
42
- }
43
-
44
- if (scriptType !== SCRIPT_TYPE_WDIO) {
45
- throw new TypeError(`Only the '${SCRIPT_TYPE_WDIO}' script type is currently supported`);
46
- }
47
-
48
- if (!driver.serverHost || !driver.serverPort) {
49
- throw new Error('Address or port of running server were not defined; this ' + 'is required. This is probably a programming error in the driver');
50
- }
51
-
52
- if (!_lodash.default.isNumber(timeoutMs)) {
53
- throw new TypeError('Timeout parameter must be a number');
54
- }
55
-
56
- const driverOpts = {
57
- sessionId: driver.sessionId,
58
- protocol: 'http',
59
- hostname: driver.serverHost,
60
- port: driver.serverPort,
61
- path: driver.serverPath,
62
- isW3C: true,
63
- isMobile: true,
64
- capabilities: driver.caps
65
- };
66
- this.logger.info(`Constructed webdriverio driver options; W3C mode is ${driverOpts.isW3C ? 'on' : 'off'}`);
67
-
68
- const childScript = require.resolve('./execute-child.js');
69
-
70
- this.logger.info(`Forking process to run webdriver script as child using ${childScript}`);
71
-
72
- const scriptProc = _child_process.default.fork(childScript);
73
-
74
- let timeoutCanceled = false;
75
-
76
- try {
77
- const timer = new _support.timing.Timer();
78
- timer.start();
79
-
80
- const waitForResult = async () => {
81
- const res = await new _bluebird.default(res => {
82
- scriptProc.on('message', res);
83
- });
84
- this.logger.info('Received execute driver script result from child process, shutting it down');
85
-
86
- if (res.error) {
87
- throw new Error(res.error.message);
37
+ if (scriptType !== SCRIPT_TYPE_WDIO) {
38
+ throw new TypeError(`Only the '${SCRIPT_TYPE_WDIO}' script type is currently supported`);
39
+ }
40
+ if (!driver.serverHost || !driver.serverPort) {
41
+ throw new Error('Address or port of running server were not defined; this ' +
42
+ 'is required. This is probably a programming error in the driver');
43
+ }
44
+ if (!lodash_1.default.isNumber(timeoutMs)) {
45
+ throw new TypeError('Timeout parameter must be a number');
88
46
  }
89
-
90
- return res.success;
91
- };
92
-
93
- const waitForTimeout = async () => {
94
- while (!timeoutCanceled && timer.getDuration().asMilliSeconds < timeoutMs) {
95
- await _bluebird.default.delay(500);
47
+ const driverOpts = {
48
+ sessionId: driver.sessionId,
49
+ // Appium probably won't be behind ssl locally; if it ever is, might need to update this to
50
+ // provide a user configurable parameter
51
+ protocol: 'http',
52
+ hostname: driver.serverHost,
53
+ port: driver.serverPort,
54
+ path: driver.serverPath,
55
+ isW3C: true,
56
+ isMobile: true,
57
+ capabilities: driver.caps,
58
+ };
59
+ this.logger.info(`Constructed webdriverio driver options; W3C mode is ${driverOpts.isW3C ? 'on' : 'off'}`);
60
+ // fork the execution script as a child process
61
+ const childScript = require.resolve('./execute-child.js');
62
+ this.logger.info(`Forking process to run webdriver script as child using ${childScript}`);
63
+ const scriptProc = child_process_1.default.fork(childScript);
64
+ // keep track of whether we have canceled the script timeout, so we can stop
65
+ // waiting for it and allow this process to finish gracefully
66
+ let timeoutCanceled = false;
67
+ try {
68
+ const timer = new support_1.timing.Timer();
69
+ timer.start();
70
+ // promise that deals with the result from the child process
71
+ const waitForResult = async () => {
72
+ const res = await new bluebird_1.default((res) => {
73
+ scriptProc.on('message', res); // this is node IPC
74
+ });
75
+ this.logger.info('Received execute driver script result from child process, shutting it down');
76
+ if (res.error) {
77
+ throw new Error(res.error.message);
78
+ }
79
+ return res.success;
80
+ };
81
+ // promise that waits up to the timeout and throws an error if so, or does
82
+ // nothing if the timeout is canceled because we got a result from the
83
+ // child script
84
+ const waitForTimeout = async () => {
85
+ while (!timeoutCanceled && timer.getDuration().asMilliSeconds < timeoutMs) {
86
+ await bluebird_1.default.delay(500);
87
+ }
88
+ if (timeoutCanceled) {
89
+ return;
90
+ }
91
+ throw new Error(`Execute driver script timed out after ${timeoutMs}ms. ` +
92
+ `You can adjust this with the 'timeout' parameter.`);
93
+ };
94
+ // now that the child script is alive, send it the data it needs to start
95
+ // running the driver script
96
+ this.logger.info('Sending driver and script data to child');
97
+ scriptProc.send({ driverOpts, script, timeoutMs });
98
+ // and set up a race between the response from the child and the timeout
99
+ return await bluebird_1.default.race([waitForResult(), waitForTimeout()]);
96
100
  }
97
-
98
- if (timeoutCanceled) {
99
- return;
101
+ catch (err) {
102
+ throw new Error(`Could not execute driver script. Original error was: ${err}`);
103
+ }
104
+ finally {
105
+ // ensure we always cancel the timeout so that the timeout promise stops
106
+ // spinning and allows this process to die gracefully
107
+ timeoutCanceled = true;
108
+ if (scriptProc.connected) {
109
+ this.logger.info('Disconnecting from child proc');
110
+ scriptProc.disconnect();
111
+ }
112
+ if (scriptProc.exitCode === null) {
113
+ this.logger.info('Disconnecting from and killing driver script child proc');
114
+ scriptProc.kill();
115
+ }
116
+ else {
117
+ this.logger.info('Script already ended on its own, no need to kill it');
118
+ }
100
119
  }
101
-
102
- throw new Error(`Execute driver script timed out after ${timeoutMs}ms. ` + `You can adjust this with the 'timeout' parameter.`);
103
- };
104
-
105
- this.logger.info('Sending driver and script data to child');
106
- scriptProc.send({
107
- driverOpts,
108
- script,
109
- timeoutMs
110
- });
111
- return await _bluebird.default.race([waitForResult(), waitForTimeout()]);
112
- } catch (err) {
113
- throw new Error(`Could not execute driver script. Original error was: ${err}`);
114
- } finally {
115
- timeoutCanceled = true;
116
-
117
- if (scriptProc.connected) {
118
- this.logger.info('Disconnecting from child proc');
119
- scriptProc.disconnect();
120
- }
121
-
122
- if (scriptProc.exitCode === null) {
123
- this.logger.info('Disconnecting from and killing driver script child proc');
124
- scriptProc.kill();
125
- } else {
126
- this.logger.info('Script already ended on its own, no need to kill it');
127
- }
128
120
  }
129
- }
130
-
131
121
  }
132
-
133
- exports.ExecuteDriverPlugin = exports.default = ExecuteDriverPlugin;
134
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGRUFUX0ZMQUciLCJERUZBVUxUX1NDUklQVF9USU1FT1VUX01TIiwiU0NSSVBUX1RZUEVfV0RJTyIsIkV4ZWN1dGVEcml2ZXJQbHVnaW4iLCJCYXNlUGx1Z2luIiwibmV3TWV0aG9kTWFwIiwiUE9TVCIsImNvbW1hbmQiLCJwYXlsb2FkUGFyYW1zIiwicmVxdWlyZWQiLCJvcHRpb25hbCIsImV4ZWN1dGVEcml2ZXJTY3JpcHQiLCJuZXh0IiwiZHJpdmVyIiwic2NyaXB0Iiwic2NyaXB0VHlwZSIsInRpbWVvdXRNcyIsImlzRmVhdHVyZUVuYWJsZWQiLCJFcnJvciIsIlR5cGVFcnJvciIsInNlcnZlckhvc3QiLCJzZXJ2ZXJQb3J0IiwiXyIsImlzTnVtYmVyIiwiZHJpdmVyT3B0cyIsInNlc3Npb25JZCIsInByb3RvY29sIiwiaG9zdG5hbWUiLCJwb3J0IiwicGF0aCIsInNlcnZlclBhdGgiLCJpc1czQyIsImlzTW9iaWxlIiwiY2FwYWJpbGl0aWVzIiwiY2FwcyIsImxvZ2dlciIsImluZm8iLCJjaGlsZFNjcmlwdCIsInJlcXVpcmUiLCJyZXNvbHZlIiwic2NyaXB0UHJvYyIsImNwIiwiZm9yayIsInRpbWVvdXRDYW5jZWxlZCIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGFydCIsIndhaXRGb3JSZXN1bHQiLCJyZXMiLCJCIiwib24iLCJlcnJvciIsIm1lc3NhZ2UiLCJzdWNjZXNzIiwid2FpdEZvclRpbWVvdXQiLCJnZXREdXJhdGlvbiIsImFzTWlsbGlTZWNvbmRzIiwiZGVsYXkiLCJzZW5kIiwicmFjZSIsImVyciIsImNvbm5lY3RlZCIsImRpc2Nvbm5lY3QiLCJleGl0Q29kZSIsImtpbGwiXSwic291cmNlcyI6WyIuLi8uLi9saWIvcGx1Z2luLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QmFzZVBsdWdpbn0gZnJvbSAnYXBwaXVtL3BsdWdpbic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGNwIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHt0aW1pbmd9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgRkVBVF9GTEFHID0gJ2V4ZWN1dGVfZHJpdmVyX3NjcmlwdCc7XG5jb25zdCBERUZBVUxUX1NDUklQVF9USU1FT1VUX01TID0gMTAwMCAqIDYwICogNjA7IC8vIGRlZmF1bHQgdG8gMSBob3VyIHRpbWVvdXRcbmNvbnN0IFNDUklQVF9UWVBFX1dESU8gPSAnd2ViZHJpdmVyaW8nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFeGVjdXRlRHJpdmVyUGx1Z2luIGV4dGVuZHMgQmFzZVBsdWdpbiB7XG4gIHN0YXRpYyBuZXdNZXRob2RNYXAgPSB7XG4gICAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2V4ZWN1dGVfZHJpdmVyJzoge1xuICAgICAgUE9TVDoge1xuICAgICAgICBjb21tYW5kOiAnZXhlY3V0ZURyaXZlclNjcmlwdCcsXG4gICAgICAgIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWydzY3JpcHQnXSwgb3B0aW9uYWw6IFsndHlwZScsICd0aW1lb3V0J119LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB0YWtlcyBhIHN0cmluZyB3aGljaCBpcyBleGVjdXRlZCBhcyBqYXZhc2NyaXB0IGluIHRoZSBjb250ZXh0IG9mXG4gICAqIGEgbmV3IG5vZGVqcyBWTSwgYW5kIHdoaWNoIGhhcyBhdmFpbGFibGUgYSB3ZWJkcml2ZXJpbyBkcml2ZXIgb2JqZWN0LCBoYXZpbmdcbiAgICogYWxyZWFkeSBiZWVuIGF0dGFjaGVkIHRvIHRoZSBjdXJyZW50bHkgcnVubmluZyBzZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBuZXh0IC0gc3RhbmRhcmQgYmVoYXZpb3VyIGZvciBleGVjdXRlRHJpdmVyU2NyaXB0XG4gICAqIEBwYXJhbSB7QmFzZURyaXZlcn0gZHJpdmVyIC0gQXBwaXVtIGRyaXZlciBoYW5kbGluZyB0aGlzIGNvbW1hbmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjcmlwdCAtIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkcml2ZXIgc2NyaXB0IHRvIHJ1blxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NjcmlwdFR5cGU9J3dlYmRyaXZlcmlvJ10gLSB0aGUgbmFtZSBvZiB0aGUgZHJpdmVyIHNjcmlwdFxuICAgKiBsaWJyYXJ5IChjdXJyZW50bHkgb25seSB3ZWJkcml2ZXJpbyBpcyBzdXBwb3J0ZWQpXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdGltZW91dE1zPTM2MDAwMDBdIC0gdGltZW91dCBmb3IgdGhlIHNjcmlwdCBwcm9jZXNzXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IC0gYSBKU09OaWZpYWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXR1cm4gdmFsdWUgb2ZcbiAgICogdGhlIHNjcmlwdFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZURyaXZlclNjcmlwdChcbiAgICBuZXh0LFxuICAgIGRyaXZlcixcbiAgICBzY3JpcHQsXG4gICAgc2NyaXB0VHlwZSA9ICd3ZWJkcml2ZXJpbycsXG4gICAgdGltZW91dE1zID0gREVGQVVMVF9TQ1JJUFRfVElNRU9VVF9NU1xuICApIHtcbiAgICBpZiAoIWRyaXZlci5pc0ZlYXR1cmVFbmFibGVkKEZFQVRfRkxBRykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEV4ZWN1dGUgZHJpdmVyIHNjcmlwdCBmdW5jdGlvbmFsaXR5IGlzIG5vdCBhdmFpbGFibGUgYCArXG4gICAgICAgICAgYHVubGVzcyBzZXJ2ZXIgaXMgc3RhcnRlZCB3aXRoIC0tYWxsb3ctaW5zZWN1cmUgaW5jbHVkaW5nIGAgK1xuICAgICAgICAgIGB0aGUgJyR7RkVBVF9GTEFHfScgZmxhZywgZS5nLiwgLS1hbGxvdy1pbnNlY3VyZT0ke0ZFQVRfRkxBR31gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChzY3JpcHRUeXBlICE9PSBTQ1JJUFRfVFlQRV9XRElPKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBPbmx5IHRoZSAnJHtTQ1JJUFRfVFlQRV9XRElPfScgc2NyaXB0IHR5cGUgaXMgY3VycmVudGx5IHN1cHBvcnRlZGApO1xuICAgIH1cblxuICAgIGlmICghZHJpdmVyLnNlcnZlckhvc3QgfHwgIWRyaXZlci5zZXJ2ZXJQb3J0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdBZGRyZXNzIG9yIHBvcnQgb2YgcnVubmluZyBzZXJ2ZXIgd2VyZSBub3QgZGVmaW5lZDsgdGhpcyAnICtcbiAgICAgICAgICAnaXMgcmVxdWlyZWQuIFRoaXMgaXMgcHJvYmFibHkgYSBwcm9ncmFtbWluZyBlcnJvciBpbiB0aGUgZHJpdmVyJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOdW1iZXIodGltZW91dE1zKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGltZW91dCBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgIH1cblxuICAgIGNvbnN0IGRyaXZlck9wdHMgPSB7XG4gICAgICBzZXNzaW9uSWQ6IGRyaXZlci5zZXNzaW9uSWQsXG4gICAgICAvLyBBcHBpdW0gcHJvYmFibHkgd29uJ3QgYmUgYmVoaW5kIHNzbCBsb2NhbGx5OyBpZiBpdCBldmVyIGlzLCBtaWdodCBuZWVkIHRvIHVwZGF0ZSB0aGlzIHRvXG4gICAgICAvLyBwcm92aWRlIGEgdXNlciBjb25maWd1cmFibGUgcGFyYW1ldGVyXG4gICAgICBwcm90b2NvbDogJ2h0dHAnLFxuICAgICAgaG9zdG5hbWU6IGRyaXZlci5zZXJ2ZXJIb3N0LFxuICAgICAgcG9ydDogZHJpdmVyLnNlcnZlclBvcnQsXG4gICAgICBwYXRoOiBkcml2ZXIuc2VydmVyUGF0aCxcbiAgICAgIGlzVzNDOiB0cnVlLFxuICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICBjYXBhYmlsaXRpZXM6IGRyaXZlci5jYXBzLFxuICAgIH07XG4gICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgIGBDb25zdHJ1Y3RlZCB3ZWJkcml2ZXJpbyBkcml2ZXIgb3B0aW9uczsgVzNDIG1vZGUgaXMgJHtkcml2ZXJPcHRzLmlzVzNDID8gJ29uJyA6ICdvZmYnfWBcbiAgICApO1xuXG4gICAgLy8gZm9yayB0aGUgZXhlY3V0aW9uIHNjcmlwdCBhcyBhIGNoaWxkIHByb2Nlc3NcbiAgICBjb25zdCBjaGlsZFNjcmlwdCA9IHJlcXVpcmUucmVzb2x2ZSgnLi9leGVjdXRlLWNoaWxkLmpzJyk7XG4gICAgdGhpcy5sb2dnZXIuaW5mbyhgRm9ya2luZyBwcm9jZXNzIHRvIHJ1biB3ZWJkcml2ZXIgc2NyaXB0IGFzIGNoaWxkIHVzaW5nICR7Y2hpbGRTY3JpcHR9YCk7XG4gICAgY29uc3Qgc2NyaXB0UHJvYyA9IGNwLmZvcmsoY2hpbGRTY3JpcHQpO1xuXG4gICAgLy8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlIGhhdmUgY2FuY2VsZWQgdGhlIHNjcmlwdCB0aW1lb3V0LCBzbyB3ZSBjYW4gc3RvcFxuICAgIC8vIHdhaXRpbmcgZm9yIGl0IGFuZCBhbGxvdyB0aGlzIHByb2Nlc3MgdG8gZmluaXNoIGdyYWNlZnVsbHlcbiAgICBsZXQgdGltZW91dENhbmNlbGVkID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCk7XG4gICAgICB0aW1lci5zdGFydCgpO1xuXG4gICAgICAvLyBwcm9taXNlIHRoYXQgZGVhbHMgd2l0aCB0aGUgcmVzdWx0IGZyb20gdGhlIGNoaWxkIHByb2Nlc3NcbiAgICAgIGNvbnN0IHdhaXRGb3JSZXN1bHQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IG5ldyBCKChyZXMpID0+IHtcbiAgICAgICAgICBzY3JpcHRQcm9jLm9uKCdtZXNzYWdlJywgcmVzKTsgLy8gdGhpcyBpcyBub2RlIElQQ1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICdSZWNlaXZlZCBleGVjdXRlIGRyaXZlciBzY3JpcHQgcmVzdWx0IGZyb20gY2hpbGQgcHJvY2Vzcywgc2h1dHRpbmcgaXQgZG93bidcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzLmVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcy5lcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXMuc3VjY2VzcztcbiAgICAgIH07XG5cbiAgICAgIC8vIHByb21pc2UgdGhhdCB3YWl0cyB1cCB0byB0aGUgdGltZW91dCBhbmQgdGhyb3dzIGFuIGVycm9yIGlmIHNvLCBvciBkb2VzXG4gICAgICAvLyBub3RoaW5nIGlmIHRoZSB0aW1lb3V0IGlzIGNhbmNlbGVkIGJlY2F1c2Ugd2UgZ290IGEgcmVzdWx0IGZyb20gdGhlXG4gICAgICAvLyBjaGlsZCBzY3JpcHRcbiAgICAgIGNvbnN0IHdhaXRGb3JUaW1lb3V0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICB3aGlsZSAoIXRpbWVvdXRDYW5jZWxlZCAmJiB0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzIDwgdGltZW91dE1zKSB7XG4gICAgICAgICAgYXdhaXQgQi5kZWxheSg1MDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbWVvdXRDYW5jZWxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXhlY3V0ZSBkcml2ZXIgc2NyaXB0IHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXRNc31tcy4gYCArXG4gICAgICAgICAgICBgWW91IGNhbiBhZGp1c3QgdGhpcyB3aXRoIHRoZSAndGltZW91dCcgcGFyYW1ldGVyLmBcbiAgICAgICAgKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIG5vdyB0aGF0IHRoZSBjaGlsZCBzY3JpcHQgaXMgYWxpdmUsIHNlbmQgaXQgdGhlIGRhdGEgaXQgbmVlZHMgdG8gc3RhcnRcbiAgICAgIC8vIHJ1bm5pbmcgdGhlIGRyaXZlciBzY3JpcHRcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ1NlbmRpbmcgZHJpdmVyIGFuZCBzY3JpcHQgZGF0YSB0byBjaGlsZCcpO1xuICAgICAgc2NyaXB0UHJvYy5zZW5kKHtkcml2ZXJPcHRzLCBzY3JpcHQsIHRpbWVvdXRNc30pO1xuXG4gICAgICAvLyBhbmQgc2V0IHVwIGEgcmFjZSBiZXR3ZWVuIHRoZSByZXNwb25zZSBmcm9tIHRoZSBjaGlsZCBhbmQgdGhlIHRpbWVvdXRcbiAgICAgIHJldHVybiBhd2FpdCBCLnJhY2UoW3dhaXRGb3JSZXN1bHQoKSwgd2FpdEZvclRpbWVvdXQoKV0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXhlY3V0ZSBkcml2ZXIgc2NyaXB0LiBPcmlnaW5hbCBlcnJvciB3YXM6ICR7ZXJyfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBlbnN1cmUgd2UgYWx3YXlzIGNhbmNlbCB0aGUgdGltZW91dCBzbyB0aGF0IHRoZSB0aW1lb3V0IHByb21pc2Ugc3RvcHNcbiAgICAgIC8vIHNwaW5uaW5nIGFuZCBhbGxvd3MgdGhpcyBwcm9jZXNzIHRvIGRpZSBncmFjZWZ1bGx5XG4gICAgICB0aW1lb3V0Q2FuY2VsZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2NyaXB0UHJvYy5jb25uZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygnRGlzY29ubmVjdGluZyBmcm9tIGNoaWxkIHByb2MnKTtcbiAgICAgICAgc2NyaXB0UHJvYy5kaXNjb25uZWN0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY3JpcHRQcm9jLmV4aXRDb2RlID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ0Rpc2Nvbm5lY3RpbmcgZnJvbSBhbmQga2lsbGluZyBkcml2ZXIgc2NyaXB0IGNoaWxkIHByb2MnKTtcbiAgICAgICAgc2NyaXB0UHJvYy5raWxsKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdTY3JpcHQgYWxyZWFkeSBlbmRlZCBvbiBpdHMgb3duLCBubyBuZWVkIHRvIGtpbGwgaXQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHtFeGVjdXRlRHJpdmVyUGx1Z2lufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxTQUFTLEdBQUcsdUJBQWxCO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsT0FBTyxFQUFQLEdBQVksRUFBOUM7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxhQUF6Qjs7QUFFZSxNQUFNQyxtQkFBTixTQUFrQ0Msa0JBQWxDLENBQTZDO0VBQ3ZDLE9BQVpDLFlBQVksR0FBRztJQUNwQiw2Q0FBNkM7TUFDM0NDLElBQUksRUFBRTtRQUNKQyxPQUFPLEVBQUUscUJBREw7UUFFSkMsYUFBYSxFQUFFO1VBQUNDLFFBQVEsRUFBRSxDQUFDLFFBQUQsQ0FBWDtVQUF1QkMsUUFBUSxFQUFFLENBQUMsTUFBRCxFQUFTLFNBQVQ7UUFBakM7TUFGWDtJQURxQztFQUR6QixDQUFIOztFQXdCTSxNQUFuQkMsbUJBQW1CLENBQ3ZCQyxJQUR1QixFQUV2QkMsTUFGdUIsRUFHdkJDLE1BSHVCLEVBSXZCQyxVQUFVLEdBQUcsYUFKVSxFQUt2QkMsU0FBUyxHQUFHZix5QkFMVyxFQU12QjtJQUNBLElBQUksQ0FBQ1ksTUFBTSxDQUFDSSxnQkFBUCxDQUF3QmpCLFNBQXhCLENBQUwsRUFBeUM7TUFDdkMsTUFBTSxJQUFJa0IsS0FBSixDQUNILHVEQUFELEdBQ0csMkRBREgsR0FFRyxRQUFPbEIsU0FBVSxrQ0FBaUNBLFNBQVUsRUFIM0QsQ0FBTjtJQUtEOztJQUVELElBQUllLFVBQVUsS0FBS2IsZ0JBQW5CLEVBQXFDO01BQ25DLE1BQU0sSUFBSWlCLFNB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
122
+ exports.default = ExecuteDriverPlugin;
123
+ exports.ExecuteDriverPlugin = ExecuteDriverPlugin;
124
+ ExecuteDriverPlugin.newMethodMap = ({
125
+ '/session/:sessionId/appium/execute_driver': {
126
+ POST: {
127
+ command: 'executeDriverScript',
128
+ payloadParams: { required: ['script'], optional: ['type', 'timeout'] },
129
+ },
130
+ },
131
+ });
132
+ //# sourceMappingURL=plugin.js.map