@appium/base-driver 8.2.0 → 8.2.4

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 (68) hide show
  1. package/build/lib/basedriver/capabilities.js +3 -1
  2. package/build/lib/basedriver/commands/index.js +2 -4
  3. package/build/lib/basedriver/driver.js +5 -5
  4. package/build/lib/basedriver/helpers.js +137 -81
  5. package/build/lib/express/express-logging.js +2 -2
  6. package/build/lib/index.js +126 -0
  7. package/build/lib/jsonwp-proxy/protocol-converter.js +2 -5
  8. package/build/lib/jsonwp-proxy/proxy.js +2 -5
  9. package/build/lib/protocol/errors.js +4 -2
  10. package/build/lib/protocol/helpers.js +3 -20
  11. package/build/lib/protocol/protocol.js +9 -19
  12. package/build/lib/protocol/routes.js +1 -10
  13. package/build/test/basedriver/capability-specs.js +10 -10
  14. package/build/test/basedriver/commands/event-specs.js +10 -10
  15. package/build/test/basedriver/driver-e2e-specs.js +3 -3
  16. package/build/test/basedriver/driver-e2e-tests.js +6 -223
  17. package/build/test/basedriver/driver-specs.js +3 -3
  18. package/build/test/basedriver/driver-tests.js +4 -4
  19. package/build/test/basedriver/helpers-specs.js +5 -1
  20. package/build/test/basedriver/timeout-specs.js +7 -7
  21. package/build/test/basedriver/websockets-e2e-specs.js +5 -5
  22. package/build/test/express/server-e2e-specs.js +156 -0
  23. package/build/test/express/server-specs.js +151 -0
  24. package/build/test/express/static-specs.js +23 -0
  25. package/build/test/helpers.js +57 -0
  26. package/build/test/jsonwp-proxy/mock-request.js +93 -0
  27. package/build/test/jsonwp-proxy/protocol-converter-specs.js +173 -0
  28. package/build/test/jsonwp-proxy/proxy-e2e-specs.js +61 -0
  29. package/build/test/jsonwp-proxy/proxy-specs.js +294 -0
  30. package/build/test/jsonwp-proxy/url-specs.js +167 -0
  31. package/build/test/jsonwp-status/status-specs.js +36 -0
  32. package/build/test/protocol/errors-specs.js +388 -0
  33. package/build/test/protocol/fake-driver.js +168 -0
  34. package/build/test/protocol/helpers.js +27 -0
  35. package/build/test/protocol/protocol-e2e-specs.js +1182 -0
  36. package/build/test/protocol/routes-specs.js +82 -0
  37. package/build/test/protocol/validator-specs.js +151 -0
  38. package/index.d.ts +0 -1
  39. package/index.js +1 -62
  40. package/lib/basedriver/capabilities.js +3 -0
  41. package/lib/basedriver/commands/index.js +0 -2
  42. package/lib/basedriver/driver.js +5 -5
  43. package/lib/basedriver/helpers.js +197 -81
  44. package/lib/express/express-logging.js +1 -1
  45. package/lib/index.js +64 -0
  46. package/lib/jsonwp-proxy/protocol-converter.js +1 -5
  47. package/lib/jsonwp-proxy/proxy.js +1 -3
  48. package/lib/protocol/errors.js +1 -1
  49. package/lib/protocol/helpers.js +5 -25
  50. package/lib/protocol/protocol.js +9 -25
  51. package/lib/protocol/routes.js +0 -3
  52. package/package.json +7 -15
  53. package/test/basedriver/capability-specs.js +1 -1
  54. package/test/basedriver/commands/event-specs.js +1 -1
  55. package/test/basedriver/driver-e2e-specs.js +1 -1
  56. package/test/basedriver/driver-e2e-tests.js +1 -179
  57. package/test/basedriver/driver-specs.js +1 -1
  58. package/test/basedriver/driver-tests.js +1 -1
  59. package/test/basedriver/helpers-specs.js +4 -0
  60. package/test/basedriver/timeout-specs.js +1 -1
  61. package/test/basedriver/websockets-e2e-specs.js +1 -1
  62. package/build/index.js +0 -124
  63. package/build/lib/basedriver/commands/execute-child.js +0 -137
  64. package/build/lib/basedriver/commands/execute.js +0 -119
  65. package/build/test/basedriver/fixtures/custom-element-finder-bad.js +0 -12
  66. package/build/test/basedriver/fixtures/custom-element-finder.js +0 -36
  67. package/lib/basedriver/commands/execute-child.js +0 -132
  68. package/lib/basedriver/commands/execute.js +0 -126
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "firefoxos",
12
12
  "testing"
13
13
  ],
14
- "version": "8.2.0",
14
+ "version": "8.2.4",
15
15
  "author": "https://github.com/appium",
16
16
  "license": "Apache-2.0",
17
17
  "repository": {
@@ -25,7 +25,6 @@
25
25
  "node": ">=12",
26
26
  "npm": ">=6"
27
27
  },
28
- "main": "./build/index.js",
29
28
  "directories": {
30
29
  "lib": "lib"
31
30
  },
@@ -36,20 +35,18 @@
36
35
  "static",
37
36
  "test/basedriver",
38
37
  "!test/basedriver/fixtures",
39
- "build/index.js",
40
- "build/lib",
41
- "build/test/basedriver",
38
+ "build",
42
39
  "!build/test/basedriver/fixtures"
43
40
  ],
44
41
  "dependencies": {
45
- "@appium/support": "^2.55.1",
42
+ "@appium/support": "^2.55.4",
46
43
  "@babel/runtime": "7.16.3",
44
+ "@dabh/colors": "1.4.0",
47
45
  "async-lock": "1.3.0",
48
46
  "asyncbox": "2.9.2",
49
47
  "axios": "0.24.0",
50
48
  "bluebird": "3.7.2",
51
49
  "body-parser": "1.19.0",
52
- "colors": "1.4.0",
53
50
  "es6-error": "4.1.1",
54
51
  "express": "4.17.1",
55
52
  "http-status-codes": "2.1.4",
@@ -58,18 +55,13 @@
58
55
  "method-override": "3.0.0",
59
56
  "morgan": "1.10.0",
60
57
  "serve-favicon": "2.5.0",
61
- "source-map-support": "0.5.20",
58
+ "source-map-support": "0.5.21",
62
59
  "validate.js": "0.13.1",
63
- "webdriverio": "6.12.1",
64
- "ws": "7.5.5"
65
- },
66
- "devDependencies": {
67
- "@appium/eslint-config-appium": "^4.7.4",
68
- "@appium/gulp-plugins": "^5.5.5"
60
+ "ws": "7.5.6"
69
61
  },
70
62
  "publishConfig": {
71
63
  "access": "public"
72
64
  },
73
65
  "homepage": "https://appium.io",
74
- "gitHead": "d7882a15eeca9992c5310b53811855f9ccaae36b"
66
+ "gitHead": "42f4a2de2d763d57cf0bdb6fb6c9a3bc9c3d232f"
75
67
  }
@@ -1,4 +1,4 @@
1
- import { default as BaseDriver, errors } from '../..';
1
+ import { default as BaseDriver, errors } from '../../lib';
2
2
  import logger from '../../lib/basedriver/logger';
3
3
  import sinon from 'sinon';
4
4
 
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { BaseDriver } from '../../..';
2
+ import { BaseDriver } from '../../../lib';
3
3
 
4
4
 
5
5
 
@@ -1,6 +1,6 @@
1
1
  // transpile:mocha
2
2
 
3
- import BaseDriver from '../..';
3
+ import BaseDriver from '../../lib';
4
4
  import baseDriverE2ETests from './driver-e2e-tests';
5
5
  baseDriverE2ETests(BaseDriver, {
6
6
  platformName: 'iOS',
@@ -1,8 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { BaseDriver, server, routeConfiguringFunction, DeviceSettings, errors } from '../..';
3
- import {
4
- MJSONWP_ELEMENT_KEY, W3C_ELEMENT_KEY
5
- } from '../../lib/constants';
2
+ import { BaseDriver, server, routeConfiguringFunction, DeviceSettings } from '../../lib';
6
3
  import axios from 'axios';
7
4
  import B from 'bluebird';
8
5
  import {TEST_HOST, getTestPort, createAppiumURL, METHODS} from '../helpers';
@@ -339,181 +336,6 @@ function baseDriverE2ETests (DriverClass, defaultCaps = {}) {
339
336
  });
340
337
  });
341
338
 
342
- describe('execute driver script', function () {
343
- // mock some methods on BaseDriver that aren't normally there except in
344
- // a fully blown driver
345
- let originalFindElement, sessionId;
346
- before(function () {
347
- d.allowInsecure = ['execute_driver_script'];
348
- originalFindElement = d.findElement;
349
- d.findElement = (function (strategy, selector) {
350
- if (strategy === 'accessibility id' && selector === 'amazing') {
351
- return {[W3C_ELEMENT_KEY]: 'element-id-1'};
352
- }
353
-
354
- throw new errors.NoSuchElementError('not found');
355
- }).bind(d);
356
- });
357
-
358
- beforeEach(async function () {
359
- ({sessionId} = await startSession(defaultCaps));
360
- });
361
-
362
- after(function () {
363
- d.findElement = originalFindElement;
364
- });
365
-
366
- afterEach(async function () {
367
- await endSession(sessionId);
368
- });
369
-
370
- it('should not work unless the allowInsecure feature flag is set', async function () {
371
- d._allowInsecure = d.allowInsecure;
372
- try {
373
- d.allowInsecure = [];
374
- const script = `return 'foo'`;
375
- await axios({
376
- url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
377
- method: POST,
378
- data: {script, type: 'wd'},
379
- }).should.eventually.be.rejected;
380
- await endSession(sessionId);
381
- } finally {
382
- d.allowInsecure = d._allowInsecure;
383
- }
384
- });
385
-
386
- it('should execute a webdriverio script in the context of session', async function () {
387
- const script = `
388
- const timeouts = await driver.getTimeouts();
389
- const status = await driver.status();
390
- return [timeouts, status];
391
- `;
392
- const {value} = (await axios({
393
- url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
394
- method: POST,
395
- data: {script, type: 'webdriverio'},
396
- })).data;
397
- const expectedTimeouts = {command: 250, implicit: 0};
398
- const expectedStatus = {};
399
- value.result.should.eql([expectedTimeouts, expectedStatus]);
400
- });
401
-
402
- it('should fail with any script type other than webdriverio currently', async function () {
403
- const script = `return 'foo'`;
404
- await axios({
405
- url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
406
- method: POST,
407
- data: {script, type: 'wd'},
408
- }).should.eventually.be.rejected;
409
- });
410
-
411
- it('should execute a webdriverio script that returns elements correctly', async function () {
412
- const script = `
413
- return await driver.$("~amazing");
414
- `;
415
- const {value} = (await axios({
416
- url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
417
- method: POST,
418
- data: {script},
419
- })).data;
420
- value.result.should.eql({
421
- [W3C_ELEMENT_KEY]: 'element-id-1',
422
- [MJSONWP_ELEMENT_KEY]: 'element-id-1'
423
- });
424
- });
425
-
426
- it('should execute a webdriverio script that returns elements in deep structure', async function () {
427
- const script = `
428
- const el = await driver.$("~amazing");
429
- return {element: el, elements: [el, el]};
430
- `;
431
- const {value} = (await axios({
432
- url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
433
- method: POST,
434
- data: {script},
435
- })).data;
436
- const elObj = {
437
- [W3C_ELEMENT_KEY]: 'element-id-1',
438
- [MJSONWP_ELEMENT_KEY]: 'element-id-1'
439
- };
440
- value.result.should.eql({element: elObj, elements: [elObj, elObj]});
441
- });
442
-
443
- it('should store and return logs to the user', async function () {
444
- const script = `
445
- console.log("foo");
446
- console.log("foo2");
447
- console.warn("bar");
448
- console.error("baz");
449
- return null;
450
- `;
451
- const {value} = (await axios({
452
- url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
453
- method: POST,
454
- data: {script},
455
- })).data;
456
- value.logs.should.eql({log: ['foo', 'foo2'], warn: ['bar'], error: ['baz']});
457
- });
458
-
459
- it('should have appium specific commands available', async function () {
460
- const script = `
461
- return typeof driver.lock;
462
- `;
463
- const {value} = (await axios({
464
- url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
465
- method: POST,
466
- data: {script},
467
- })).data;
468
- value.result.should.eql('function');
469
- });
470
-
471
- it('should correctly handle errors that happen in a webdriverio script', async function () {
472
- const script = `
473
- return await driver.$("~notfound");
474
- `;
475
- const {data} = await axios({
476
- url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
477
- method: POST,
478
- validateStatus: null,
479
- data: {script},
480
- });
481
- data.value.result.error.error.should.equal('no such element');
482
- data.value.result.error.message.should.equal('not found');
483
- data.value.result.error.stacktrace.should.includes('NoSuchElementError:');
484
- data.value.result.selector.should.equal('~notfound');
485
- data.value.result.sessionId.should.equal(sessionId);
486
- });
487
-
488
- it('should correctly handle errors that happen when a script cannot be compiled', async function () {
489
- const script = `
490
- return {;
491
- `;
492
- const {data} = await axios({
493
- url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
494
- method: POST,
495
- validateStatus: null,
496
- data: {script},
497
- });
498
- data.value.should.have.property('message');
499
- data.value.message.should.match(/An unknown server-side error occurred while processing the command. Original error: Could not execute driver script. Original error was: Error: Unexpected token '?;'?/);
500
- });
501
-
502
- it('should be able to set a timeout on a driver script', async function () {
503
- const script = `
504
- await Promise.delay(1000);
505
- return true;
506
- `;
507
- const {value} = (await axios({
508
- url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
509
- method: POST,
510
- validateStatus: null,
511
- data: {script, timeout: 50},
512
- })).data;
513
- value.message.should.match(/.+50.+timeout.+/);
514
- });
515
- });
516
-
517
339
  if (DriverClass === BaseDriver) {
518
340
  // only run this test on basedriver, not other drivers which also use these tests, since we
519
341
  // don't want them to try and start sessions with these random capabilities that are
@@ -1,6 +1,6 @@
1
1
  // transpile:mocha
2
2
 
3
- import BaseDriver from '../..';
3
+ import BaseDriver from '../../lib';
4
4
  import baseDriverUnitTests from './driver-tests';
5
5
  baseDriverUnitTests(BaseDriver, {
6
6
  platformName: 'iOS',
@@ -1,6 +1,6 @@
1
1
  import _ from 'lodash';
2
2
  import B from 'bluebird';
3
- import { DeviceSettings } from '../..';
3
+ import { DeviceSettings } from '../../lib';
4
4
  import sinon from 'sinon';
5
5
 
6
6
 
@@ -98,6 +98,10 @@ describe('helpers', function () {
98
98
  sandbox.stub(zip, 'extractAllTo').resolves();
99
99
  sandbox.stub(zip, 'assertValidZip').resolves();
100
100
  sandbox.stub(fs, 'mv').resolves();
101
+ sandbox.stub(fs, 'stat').resolves({
102
+ isFile: () => true,
103
+ isDirectory: () => false,
104
+ });
101
105
  sandbox.stub(fs, 'exists').resolves(true);
102
106
  sandbox.stub(fs, 'hash').resolves('0xDEADBEEF');
103
107
  sandbox.stub(fs, 'glob').resolves(['/path/to/an.apk']);
@@ -1,4 +1,4 @@
1
- import BaseDriver from '../..';
1
+ import BaseDriver from '../../lib';
2
2
  import sinon from 'sinon';
3
3
 
4
4
 
@@ -1,6 +1,6 @@
1
1
  import _ from 'lodash';
2
2
  import { server, routeConfiguringFunction,
3
- DEFAULT_WS_PATHNAME_PREFIX } from '../..';
3
+ DEFAULT_WS_PATHNAME_PREFIX } from '../../lib';
4
4
  import { FakeDriver } from '../protocol/fake-driver';
5
5
  import WebSocket from 'ws';
6
6
  import B from 'bluebird';
package/build/index.js DELETED
@@ -1,124 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.CREATE_SESSION_COMMAND = exports.BaseDriver = exports.BASEDRIVER_HANDLED_SETTINGS = exports.ALL_COMMANDS = void 0;
7
- Object.defineProperty(exports, "DEFAULT_BASE_PATH", {
8
- enumerable: true,
9
- get: function () {
10
- return _constants.DEFAULT_BASE_PATH;
11
- }
12
- });
13
- exports.NO_SESSION_ID_COMMANDS = exports.METHOD_MAP = exports.JWProxy = exports.DeviceSettings = exports.DELETE_SESSION_COMMAND = exports.DEFAULT_WS_PATHNAME_PREFIX = void 0;
14
- Object.defineProperty(exports, "PROTOCOLS", {
15
- enumerable: true,
16
- get: function () {
17
- return _constants.PROTOCOLS;
18
- }
19
- });
20
- exports.validateCaps = exports.statusCodes = exports.server = exports.routeToCommandName = exports.routeConfiguringFunction = exports.processCapabilities = exports.normalizeBasePath = exports.isStandardCap = exports.isSessionCommand = exports.isErrorType = exports.getSummaryByCode = exports.errors = exports.errorFromW3CJsonCode = exports.errorFromMJSONWPStatusCode = exports.errorFromCode = exports.determineProtocol = exports.default = exports.STATIC_DIR = exports.Protocol = void 0;
21
-
22
- require("source-map-support/register");
23
-
24
- var driver = _interopRequireWildcard(require("./lib/basedriver/driver"));
25
-
26
- var deviceSettings = _interopRequireWildcard(require("./lib/basedriver/device-settings"));
27
-
28
- var protocol = _interopRequireWildcard(require("./lib/protocol"));
29
-
30
- var _constants = require("./lib/constants");
31
-
32
- var staticIndex = _interopRequireWildcard(require("./lib/express/static"));
33
-
34
- var serverIndex = _interopRequireWildcard(require("./lib/express/server"));
35
-
36
- var proxyIndex = _interopRequireWildcard(require("./lib/jsonwp-proxy/proxy"));
37
-
38
- var statusIndex = _interopRequireWildcard(require("./lib/jsonwp-status/status"));
39
-
40
- var caps = _interopRequireWildcard(require("./lib/basedriver/capabilities"));
41
-
42
- var ws = _interopRequireWildcard(require("./lib/express/websocket"));
43
-
44
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
45
-
46
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
47
-
48
- const {
49
- BaseDriver
50
- } = driver;
51
- exports.BaseDriver = BaseDriver;
52
- const {
53
- DeviceSettings,
54
- BASEDRIVER_HANDLED_SETTINGS
55
- } = deviceSettings;
56
- exports.BASEDRIVER_HANDLED_SETTINGS = BASEDRIVER_HANDLED_SETTINGS;
57
- exports.DeviceSettings = DeviceSettings;
58
- var _default = BaseDriver;
59
- exports.default = _default;
60
- const {
61
- Protocol,
62
- routeConfiguringFunction,
63
- errors,
64
- isErrorType,
65
- errorFromMJSONWPStatusCode,
66
- errorFromW3CJsonCode,
67
- ALL_COMMANDS,
68
- METHOD_MAP,
69
- routeToCommandName,
70
- NO_SESSION_ID_COMMANDS,
71
- isSessionCommand,
72
- normalizeBasePath,
73
- determineProtocol,
74
- CREATE_SESSION_COMMAND,
75
- DELETE_SESSION_COMMAND
76
- } = protocol;
77
- exports.DELETE_SESSION_COMMAND = DELETE_SESSION_COMMAND;
78
- exports.CREATE_SESSION_COMMAND = CREATE_SESSION_COMMAND;
79
- exports.determineProtocol = determineProtocol;
80
- exports.normalizeBasePath = normalizeBasePath;
81
- exports.isSessionCommand = isSessionCommand;
82
- exports.NO_SESSION_ID_COMMANDS = NO_SESSION_ID_COMMANDS;
83
- exports.routeToCommandName = routeToCommandName;
84
- exports.METHOD_MAP = METHOD_MAP;
85
- exports.ALL_COMMANDS = ALL_COMMANDS;
86
- exports.errorFromW3CJsonCode = errorFromW3CJsonCode;
87
- exports.errorFromCode = exports.errorFromMJSONWPStatusCode = errorFromMJSONWPStatusCode;
88
- exports.isErrorType = isErrorType;
89
- exports.errors = errors;
90
- exports.routeConfiguringFunction = routeConfiguringFunction;
91
- exports.Protocol = Protocol;
92
- const {
93
- STATIC_DIR
94
- } = staticIndex;
95
- exports.STATIC_DIR = STATIC_DIR;
96
- const {
97
- server
98
- } = serverIndex;
99
- exports.server = server;
100
- const {
101
- JWProxy
102
- } = proxyIndex;
103
- exports.JWProxy = JWProxy;
104
- const {
105
- codes: statusCodes,
106
- getSummaryByCode
107
- } = statusIndex;
108
- exports.getSummaryByCode = getSummaryByCode;
109
- exports.statusCodes = statusCodes;
110
- const {
111
- processCapabilities,
112
- isStandardCap,
113
- validateCaps
114
- } = caps;
115
- exports.validateCaps = validateCaps;
116
- exports.isStandardCap = isStandardCap;
117
- exports.processCapabilities = processCapabilities;
118
- const {
119
- DEFAULT_WS_PATHNAME_PREFIX
120
- } = ws;
121
- exports.DEFAULT_WS_PATHNAME_PREFIX = DEFAULT_WS_PATHNAME_PREFIX;require('source-map-support').install();
122
-
123
-
124
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkJhc2VEcml2ZXIiLCJkcml2ZXIiLCJEZXZpY2VTZXR0aW5ncyIsIkJBU0VEUklWRVJfSEFORExFRF9TRVRUSU5HUyIsImRldmljZVNldHRpbmdzIiwiUHJvdG9jb2wiLCJyb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24iLCJlcnJvcnMiLCJpc0Vycm9yVHlwZSIsImVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlIiwiZXJyb3JGcm9tVzNDSnNvbkNvZGUiLCJBTExfQ09NTUFORFMiLCJNRVRIT0RfTUFQIiwicm91dGVUb0NvbW1hbmROYW1lIiwiTk9fU0VTU0lPTl9JRF9DT01NQU5EUyIsImlzU2Vzc2lvbkNvbW1hbmQiLCJub3JtYWxpemVCYXNlUGF0aCIsImRldGVybWluZVByb3RvY29sIiwiQ1JFQVRFX1NFU1NJT05fQ09NTUFORCIsIkRFTEVURV9TRVNTSU9OX0NPTU1BTkQiLCJwcm90b2NvbCIsIlNUQVRJQ19ESVIiLCJzdGF0aWNJbmRleCIsInNlcnZlciIsInNlcnZlckluZGV4IiwiSldQcm94eSIsInByb3h5SW5kZXgiLCJjb2RlcyIsInN0YXR1c0NvZGVzIiwiZ2V0U3VtbWFyeUJ5Q29kZSIsInN0YXR1c0luZGV4IiwicHJvY2Vzc0NhcGFiaWxpdGllcyIsImlzU3RhbmRhcmRDYXAiLCJ2YWxpZGF0ZUNhcHMiLCJjYXBzIiwiREVGQVVMVF9XU19QQVRITkFNRV9QUkVGSVgiLCJ3cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFVQTs7QUFDQTs7QUFvQkE7O0FBSUE7O0FBS0E7O0FBS0E7O0FBS0E7O0FBS0E7Ozs7OztBQXJEQSxNQUFNO0FBQUVBLEVBQUFBO0FBQUYsSUFBaUJDLE1BQXZCOztBQUNBLE1BQU07QUFBRUMsRUFBQUEsY0FBRjtBQUFrQkMsRUFBQUE7QUFBbEIsSUFBa0RDLGNBQXhEOzs7ZUFHZUosVTs7QUFTZixNQUFNO0FBQ0pLLEVBQUFBLFFBREk7QUFDTUMsRUFBQUEsd0JBRE47QUFDZ0NDLEVBQUFBLE1BRGhDO0FBQ3dDQyxFQUFBQSxXQUR4QztBQUVKQyxFQUFBQSwwQkFGSTtBQUV3QkMsRUFBQUEsb0JBRnhCO0FBRThDQyxFQUFBQSxZQUY5QztBQUU0REMsRUFBQUEsVUFGNUQ7QUFHSkMsRUFBQUEsa0JBSEk7QUFHZ0JDLEVBQUFBLHNCQUhoQjtBQUd3Q0MsRUFBQUEsZ0JBSHhDO0FBSUpDLEVBQUFBLGlCQUpJO0FBSWVDLEVBQUFBLGlCQUpmO0FBSWtDQyxFQUFBQSxzQkFKbEM7QUFJMERDLEVBQUFBO0FBSjFELElBS0ZDLFFBTEo7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkEsTUFBTTtBQUFFQyxFQUFBQTtBQUFGLElBQWlCQyxXQUF2Qjs7QUFJQSxNQUFNO0FBQUVDLEVBQUFBO0FBQUYsSUFBYUMsV0FBbkI7O0FBS0EsTUFBTTtBQUFFQyxFQUFBQTtBQUFGLElBQWNDLFVBQXBCOztBQUtBLE1BQU07QUFBRUMsRUFBQUEsS0FBSyxFQUFFQyxXQUFUO0FBQXNCQyxFQUFBQTtBQUF0QixJQUEyQ0MsV0FBakQ7OztBQUtBLE1BQU07QUFBRUMsRUFBQUEsbUJBQUY7QUFBdUJDLEVBQUFBLGFBQXZCO0FBQXNDQyxFQUFBQTtBQUF0QyxJQUF1REMsSUFBN0Q7Ozs7QUFLQSxNQUFNO0FBQUVDLEVBQUFBO0FBQUYsSUFBaUNDLEVBQXZDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1haW5cblxuLy8gQmFzZURyaXZlciBleHBvcnRzXG5pbXBvcnQgKiBhcyBkcml2ZXIgZnJvbSAnLi9saWIvYmFzZWRyaXZlci9kcml2ZXInO1xuaW1wb3J0ICogYXMgZGV2aWNlU2V0dGluZ3MgZnJvbSAnLi9saWIvYmFzZWRyaXZlci9kZXZpY2Utc2V0dGluZ3MnO1xuXG5jb25zdCB7IEJhc2VEcml2ZXIgfSA9IGRyaXZlcjtcbmNvbnN0IHsgRGV2aWNlU2V0dGluZ3MsIEJBU0VEUklWRVJfSEFORExFRF9TRVRUSU5HUyB9ID0gZGV2aWNlU2V0dGluZ3M7XG5cbmV4cG9ydCB7IEJhc2VEcml2ZXIsIERldmljZVNldHRpbmdzLCBCQVNFRFJJVkVSX0hBTkRMRURfU0VUVElOR1MgfTtcbmV4cG9ydCBkZWZhdWx0IEJhc2VEcml2ZXI7XG5cblxuLy8gTUpTT05XUCBleHBvcnRzXG5pbXBvcnQgKiBhcyBwcm90b2NvbCBmcm9tICcuL2xpYi9wcm90b2NvbCc7XG5pbXBvcnQge1xuICBERUZBVUxUX0JBU0VfUEFUSCwgUFJPVE9DT0xTXG59IGZyb20gJy4vbGliL2NvbnN0YW50cyc7XG5cbmNvbnN0IHtcbiAgUHJvdG9jb2wsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiwgZXJyb3JzLCBpc0Vycm9yVHlwZSxcbiAgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUsIGVycm9yRnJvbVczQ0pzb25Db2RlLCBBTExfQ09NTUFORFMsIE1FVEhPRF9NQVAsXG4gIHJvdXRlVG9Db21tYW5kTmFtZSwgTk9fU0VTU0lPTl9JRF9DT01NQU5EUywgaXNTZXNzaW9uQ29tbWFuZCxcbiAgbm9ybWFsaXplQmFzZVBhdGgsIGRldGVybWluZVByb3RvY29sLCBDUkVBVEVfU0VTU0lPTl9DT01NQU5ELCBERUxFVEVfU0VTU0lPTl9DT01NQU5ELFxufSA9IHByb3RvY29sO1xuXG5leHBvcnQge1xuICBQcm90b2NvbCwgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLCBlcnJvcnMsIGlzRXJyb3JUeXBlLCBQUk9UT0NPTFMsXG4gIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlLCBlcnJvckZyb21XM0NKc29uQ29kZSwgZGV0ZXJtaW5lUHJvdG9jb2wsXG4gIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlIGFzIGVycm9yRnJvbUNvZGUsIEFMTF9DT01NQU5EUywgTUVUSE9EX01BUCxcbiAgcm91dGVUb0NvbW1hbmROYW1lLCBOT19TRVNTSU9OX0lEX0NPTU1BTkRTLCBpc1Nlc3Npb25Db21tYW5kLFxuICBERUZBVUxUX0JBU0VfUEFUSCwgbm9ybWFsaXplQmFzZVBhdGgsIENSRUFURV9TRVNTSU9OX0NPTU1BTkQsIERFTEVURV9TRVNTSU9OX0NPTU1BTkRcbn07XG5cbi8vIEV4cHJlc3MgZXhwb3J0c1xuaW1wb3J0ICogYXMgc3RhdGljSW5kZXggZnJvbSAnLi9saWIvZXhwcmVzcy9zdGF0aWMnO1xuY29uc3QgeyBTVEFUSUNfRElSIH0gPSBzdGF0aWNJbmRleDtcbmV4cG9ydCB7IFNUQVRJQ19ESVIgfTtcblxuaW1wb3J0ICogYXMgc2VydmVySW5kZXggZnJvbSAnLi9saWIvZXhwcmVzcy9zZXJ2ZXInO1xuY29uc3QgeyBzZXJ2ZXIgfSA9IHNlcnZlckluZGV4O1xuZXhwb3J0IHsgc2VydmVyIH07XG5cbi8vIGpzb253cC1wcm94eSBleHBvcnRzXG5pbXBvcnQgKiBhcyBwcm94eUluZGV4IGZyb20gJy4vbGliL2pzb253cC1wcm94eS9wcm94eSc7XG5jb25zdCB7IEpXUHJveHkgfSA9IHByb3h5SW5kZXg7XG5leHBvcnQgeyBKV1Byb3h5IH07XG5cbi8vIGpzb253cC1zdGF0dXMgZXhwb3J0c1xuaW1wb3J0ICogYXMgc3RhdHVzSW5kZXggZnJvbSAnLi9saWIvanNvbndwLXN0YXR1cy9zdGF0dXMnO1xuY29uc3QgeyBjb2Rlczogc3RhdHVzQ29kZXMsIGdldFN1bW1hcnlCeUNvZGUgfSA9IHN0YXR1c0luZGV4O1xuZXhwb3J0IHsgc3RhdHVzQ29kZXMsIGdldFN1bW1hcnlCeUNvZGUgfTtcblxuLy8gVzNDIGNhcGFiaWxpdGllcyBwYXJzZXJcbmltcG9ydCAqIGFzIGNhcHMgZnJvbSAnLi9saWIvYmFzZWRyaXZlci9jYXBhYmlsaXRpZXMnO1xuY29uc3QgeyBwcm9jZXNzQ2FwYWJpbGl0aWVzLCBpc1N0YW5kYXJkQ2FwLCB2YWxpZGF0ZUNhcHMgfSA9IGNhcHM7XG5leHBvcnQgeyBwcm9jZXNzQ2FwYWJpbGl0aWVzLCBpc1N0YW5kYXJkQ2FwLCB2YWxpZGF0ZUNhcHMgfTtcblxuLy8gV2ViIHNvY2tldCBoZWxwZXJzXG5pbXBvcnQgKiBhcyB3cyBmcm9tICcuL2xpYi9leHByZXNzL3dlYnNvY2tldCc7XG5jb25zdCB7IERFRkFVTFRfV1NfUEFUSE5BTUVfUFJFRklYIH0gPSB3cztcbmV4cG9ydCB7IERFRkFVTFRfV1NfUEFUSE5BTUVfUFJFRklYIH07XG4iXSwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlUm9vdCI6Ii4uIn0=
@@ -1,137 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _lodash = _interopRequireDefault(require("lodash"));
8
-
9
- var _bluebird = _interopRequireDefault(require("bluebird"));
10
-
11
- var _vm = _interopRequireDefault(require("vm"));
12
-
13
- var _logger = _interopRequireDefault(require("../logger"));
14
-
15
- var _webdriverio = require("webdriverio");
16
-
17
- const W3C_ELEMENT_KEY = 'element-6066-11e4-a52e-4f735466cecf';
18
- const MJSONWP_ELEMENT_KEY = 'ELEMENT';
19
-
20
- async function runScript(driverOpts, script, timeout) {
21
- if (!_lodash.default.isNumber(timeout)) {
22
- throw new Error('Timeout parameter must be a number');
23
- }
24
-
25
- const logLevels = ['error', 'warn', 'log'];
26
- const logs = {};
27
- const consoleFns = {};
28
-
29
- for (const level of logLevels) {
30
- logs[level] = [];
31
-
32
- consoleFns[level] = (...logMsgs) => logs[level].push(...logMsgs);
33
- }
34
-
35
- const driver = (0, _webdriverio.attach)(driverOpts);
36
- const fullScript = buildScript(script);
37
-
38
- const vmCtx = _vm.default.runInNewContext(fullScript, {}, {
39
- timeout
40
- });
41
-
42
- _logger.default.info('Running driver script in Node vm');
43
-
44
- let result = await vmCtx(driver, consoleFns, _bluebird.default);
45
-
46
- _logger.default.info('Ensuring driver script result is appropriate type for return');
47
-
48
- result = coerceScriptResult(result);
49
- return {
50
- result,
51
- logs
52
- };
53
- }
54
-
55
- function buildScript(script) {
56
- return `(async function execute (driver, console, Promise) {
57
- ${script}
58
- })`;
59
- }
60
-
61
- function coerceScriptResult(obj) {
62
- try {
63
- obj = JSON.parse(JSON.stringify(obj));
64
- } catch (e) {
65
- _logger.default.warn('Could not convert executeDriverScript to safe response!' + `Result was: ${obj}. Will make it null`);
66
-
67
- return null;
68
- }
69
-
70
- let res;
71
-
72
- if (_lodash.default.isPlainObject(obj)) {
73
- res = {};
74
-
75
- if (obj[MJSONWP_ELEMENT_KEY] || obj[W3C_ELEMENT_KEY]) {
76
- if (obj[MJSONWP_ELEMENT_KEY]) {
77
- res[MJSONWP_ELEMENT_KEY] = obj[MJSONWP_ELEMENT_KEY];
78
- }
79
-
80
- if (obj[W3C_ELEMENT_KEY]) {
81
- res[W3C_ELEMENT_KEY] = obj[W3C_ELEMENT_KEY];
82
- }
83
-
84
- return res;
85
- }
86
-
87
- for (const key of Object.keys(obj)) {
88
- res[key] = coerceScriptResult(obj[key]);
89
- }
90
-
91
- return res;
92
- }
93
-
94
- if (_lodash.default.isArray(obj)) {
95
- return obj.map(coerceScriptResult);
96
- }
97
-
98
- return obj;
99
- }
100
-
101
- async function main(driverOpts, script, timeout) {
102
- let res;
103
-
104
- try {
105
- res = {
106
- success: await runScript(driverOpts, script, timeout)
107
- };
108
- } catch (error) {
109
- res = {
110
- error: {
111
- message: error.message,
112
- stack: error.stack
113
- }
114
- };
115
- }
116
-
117
- await _bluebird.default.promisify(process.send, {
118
- context: process
119
- })(res);
120
- }
121
-
122
- if (require.main === module) {
123
- _logger.default.info('Running driver execution in child process');
124
-
125
- process.on('message', ({
126
- driverOpts,
127
- script,
128
- timeout
129
- }) => {
130
- _logger.default.info('Parameters received from parent process');
131
-
132
- main(driverOpts, script, timeout);
133
- });
134
- }require('source-map-support').install();
135
-
136
-
137
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9iYXNlZHJpdmVyL2NvbW1hbmRzL2V4ZWN1dGUtY2hpbGQuanMiXSwibmFtZXMiOlsiVzNDX0VMRU1FTlRfS0VZIiwiTUpTT05XUF9FTEVNRU5UX0tFWSIsInJ1blNjcmlwdCIsImRyaXZlck9wdHMiLCJzY3JpcHQiLCJ0aW1lb3V0IiwiXyIsImlzTnVtYmVyIiwiRXJyb3IiLCJsb2dMZXZlbHMiLCJsb2dzIiwiY29uc29sZUZucyIsImxldmVsIiwibG9nTXNncyIsInB1c2giLCJkcml2ZXIiLCJmdWxsU2NyaXB0IiwiYnVpbGRTY3JpcHQiLCJ2bUN0eCIsInZtIiwicnVuSW5OZXdDb250ZXh0IiwibG9nIiwiaW5mbyIsInJlc3VsdCIsIkIiLCJjb2VyY2VTY3JpcHRSZXN1bHQiLCJvYmoiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJlIiwid2FybiIsInJlcyIsImlzUGxhaW5PYmplY3QiLCJrZXkiLCJPYmplY3QiLCJrZXlzIiwiaXNBcnJheSIsIm1hcCIsIm1haW4iLCJzdWNjZXNzIiwiZXJyb3IiLCJtZXNzYWdlIiwic3RhY2siLCJwcm9taXNpZnkiLCJwcm9jZXNzIiwic2VuZCIsImNvbnRleHQiLCJyZXF1aXJlIiwibW9kdWxlIiwib24iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUlBLE1BQU1BLGVBQWUsR0FBRyxxQ0FBeEI7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxTQUE1Qjs7QUFFQSxlQUFlQyxTQUFmLENBQTBCQyxVQUExQixFQUFzQ0MsTUFBdEMsRUFBOENDLE9BQTlDLEVBQXVEO0FBQ3JELE1BQUksQ0FBQ0MsZ0JBQUVDLFFBQUYsQ0FBV0YsT0FBWCxDQUFMLEVBQTBCO0FBQ3hCLFVBQU0sSUFBSUcsS0FBSixDQUFVLG9DQUFWLENBQU47QUFDRDs7QUFHRCxRQUFNQyxTQUFTLEdBQUcsQ0FBQyxPQUFELEVBQVUsTUFBVixFQUFrQixLQUFsQixDQUFsQjtBQUNBLFFBQU1DLElBQUksR0FBRyxFQUFiO0FBQ0EsUUFBTUMsVUFBVSxHQUFHLEVBQW5COztBQUNBLE9BQUssTUFBTUMsS0FBWCxJQUFvQkgsU0FBcEIsRUFBK0I7QUFDN0JDLElBQUFBLElBQUksQ0FBQ0UsS0FBRCxDQUFKLEdBQWMsRUFBZDs7QUFDQUQsSUFBQUEsVUFBVSxDQUFDQyxLQUFELENBQVYsR0FBb0IsQ0FBQyxHQUFHQyxPQUFKLEtBQWdCSCxJQUFJLENBQUNFLEtBQUQsQ0FBSixDQUFZRSxJQUFaLENBQWlCLEdBQUdELE9BQXBCLENBQXBDO0FBQ0Q7O0FBRUQsUUFBTUUsTUFBTSxHQUFHLHlCQUFPWixVQUFQLENBQWY7QUFFQSxRQUFNYSxVQUFVLEdBQUdDLFdBQVcsQ0FBQ2IsTUFBRCxDQUE5Qjs7QUFHQSxRQUFNYyxLQUFLLEdBQUdDLFlBQUdDLGVBQUgsQ0FBbUJKLFVBQW5CLEVBQStCLEVBQS9CLEVBQW1DO0FBQUNYLElBQUFBO0FBQUQsR0FBbkMsQ0FBZDs7QUFJQWdCLGtCQUFJQyxJQUFKLENBQVMsa0NBQVQ7O0FBQ0EsTUFBSUMsTUFBTSxHQUFHLE1BQU1MLEtBQUssQ0FBQ0gsTUFBRCxFQUFTSixVQUFULEVBQXFCYSxpQkFBckIsQ0FBeEI7O0FBRUFILGtCQUFJQyxJQUFKLENBQVMsOERBQVQ7O0FBQ0FDLEVBQUFBLE1BQU0sR0FBR0Usa0JBQWtCLENBQUNGLE1BQUQsQ0FBM0I7QUFDQSxTQUFPO0FBQUNBLElBQUFBLE1BQUQ7QUFBU2IsSUFBQUE7QUFBVCxHQUFQO0FBQ0Q7O0FBVUQsU0FBU08sV0FBVCxDQUFzQmIsTUFBdEIsRUFBOEI7QUFDNUIsU0FBUTtBQUNWLE1BQU1BLE1BQU87QUFDYixLQUZFO0FBR0Q7O0FBWUQsU0FBU3FCLGtCQUFULENBQTZCQyxHQUE3QixFQUFrQztBQUdoQyxNQUFJO0FBQ0ZBLElBQUFBLEdBQUcsR0FBR0MsSUFBSSxDQUFDQyxLQUFMLENBQVdELElBQUksQ0FBQ0UsU0FBTCxDQUFlSCxHQUFmLENBQVgsQ0FBTjtBQUNELEdBRkQsQ0FFRSxPQUFPSSxDQUFQLEVBQVU7QUFDVlQsb0JBQUlVLElBQUosQ0FBUyw0REFDQyxlQUFjTCxHQUFJLHFCQUQ1Qjs7QUFFQSxXQUFPLElBQVA7QUFDRDs7QUFFRCxNQUFJTSxHQUFKOztBQUdBLE1BQUkxQixnQkFBRTJCLGFBQUYsQ0FBZ0JQLEdBQWhCLENBQUosRUFBMEI7QUFJeEJNLElBQUFBLEdBQUcsR0FBRyxFQUFOOztBQUVBLFFBQUlOLEdBQUcsQ0FBQ3pCLG1CQUFELENBQUgsSUFBNEJ5QixHQUFHLENBQUMxQixlQUFELENBQW5DLEVBQXNEO0FBR3BELFVBQUkwQixHQUFHLENBQUN6QixtQkFBRCxDQUFQLEVBQThCO0FBQzVCK0IsUUFBQUEsR0FBRyxDQUFDL0IsbUJBQUQsQ0FBSCxHQUEyQnlCLEdBQUcsQ0FBQ3pCLG1CQUFELENBQTlCO0FBQ0Q7O0FBRUQsVUFBSXlCLEdBQUcsQ0FBQzFCLGVBQUQsQ0FBUCxFQUEwQjtBQUN4QmdDLFFBQUFBLEdBQUcsQ0FBQ2hDLGVBQUQsQ0FBSCxHQUF1QjBCLEdBQUcsQ0FBQzFCLGVBQUQsQ0FBMUI7QUFDRDs7QUFDRCxhQUFPZ0MsR0FBUDtBQUNEOztBQUdELFNBQUssTUFBTUUsR0FBWCxJQUFrQkMsTUFBTSxDQUFDQyxJQUFQLENBQVlWLEdBQVosQ0FBbEIsRUFBb0M7QUFDbENNLE1BQUFBLEdBQUcsQ0FBQ0UsR0FBRCxDQUFILEdBQVdULGtCQUFrQixDQUFDQyxHQUFHLENBQUNRLEdBQUQsQ0FBSixDQUE3QjtBQUNEOztBQUNELFdBQU9GLEdBQVA7QUFDRDs7QUFHRCxNQUFJMUIsZ0JBQUUrQixPQUFGLENBQVVYLEdBQVYsQ0FBSixFQUFvQjtBQUNsQixXQUFPQSxHQUFHLENBQUNZLEdBQUosQ0FBUWIsa0JBQVIsQ0FBUDtBQUNEOztBQUdELFNBQU9DLEdBQVA7QUFDRDs7QUFFRCxlQUFlYSxJQUFmLENBQXFCcEMsVUFBckIsRUFBaUNDLE1BQWpDLEVBQXlDQyxPQUF6QyxFQUFrRDtBQUNoRCxNQUFJMkIsR0FBSjs7QUFDQSxNQUFJO0FBQ0ZBLElBQUFBLEdBQUcsR0FBRztBQUFDUSxNQUFBQSxPQUFPLEVBQUUsTUFBTXRDLFNBQVMsQ0FBQ0MsVUFBRCxFQUFhQyxNQUFiLEVBQXFCQyxPQUFyQjtBQUF6QixLQUFOO0FBQ0QsR0FGRCxDQUVFLE9BQU9vQyxLQUFQLEVBQWM7QUFDZFQsSUFBQUEsR0FBRyxHQUFHO0FBQUNTLE1BQUFBLEtBQUssRUFBRTtBQUFDQyxRQUFBQSxPQUFPLEVBQUVELEtBQUssQ0FBQ0MsT0FBaEI7QUFBeUJDLFFBQUFBLEtBQUssRUFBRUYsS0FBSyxDQUFDRTtBQUF0QztBQUFSLEtBQU47QUFDRDs7QUFDRCxRQUFNbkIsa0JBQUVvQixTQUFGLENBQVlDLE9BQU8sQ0FBQ0MsSUFBcEIsRUFBMEI7QUFBQ0MsSUFBQUEsT0FBTyxFQUFFRjtBQUFWLEdBQTFCLEVBQThDYixHQUE5QyxDQUFOO0FBQ0Q7O0FBRUQsSUFBSWdCLE9BQU8sQ0FBQ1QsSUFBUixLQUFpQlUsTUFBckIsRUFBNkI7QUFDM0I1QixrQkFBSUMsSUFBSixDQUFTLDJDQUFUOztBQUNBdUIsRUFBQUEsT0FBTyxDQUFDSyxFQUFSLENBQVcsU0FBWCxFQUFzQixDQUFDO0FBQUMvQyxJQUFBQSxVQUFEO0FBQWFDLElBQUFBLE1BQWI7QUFBcUJDLElBQUFBO0FBQXJCLEdBQUQsS0FBbUM7QUFDdkRnQixvQkFBSUMsSUFBSixDQUFTLHlDQUFUOztBQUNBaUIsSUFBQUEsSUFBSSxDQUFDcEMsVUFBRCxFQUFhQyxNQUFiLEVBQXFCQyxPQUFyQixDQUFKO0FBQ0QsR0FIRDtBQUlEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB2bSBmcm9tICd2bSc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBhdHRhY2ggfSBmcm9tICd3ZWJkcml2ZXJpbyc7XG5cbi8vIGR1cGxpY2F0ZSBkZWZpbmluZyB0aGVzZSBrZXlzIGhlcmUgc28gd2UgZG9uJ3QgbmVlZCB0byByZS1sb2FkIGEgaHVnZSBhcHBpdW1cbi8vIGRlcGVuZGVuY3kgdHJlZSBpbnRvIG1lbW9yeSBqdXN0IHRvIHJ1biBhIHdkaW8gc2NyaXB0XG5jb25zdCBXM0NfRUxFTUVOVF9LRVkgPSAnZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2YnO1xuY29uc3QgTUpTT05XUF9FTEVNRU5UX0tFWSA9ICdFTEVNRU5UJztcblxuYXN5bmMgZnVuY3Rpb24gcnVuU2NyaXB0IChkcml2ZXJPcHRzLCBzY3JpcHQsIHRpbWVvdXQpIHtcbiAgaWYgKCFfLmlzTnVtYmVyKHRpbWVvdXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaW1lb3V0IHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gIH1cblxuICAvLyBzZXQgdXAgZmFrZSBsb2dnZXJcbiAgY29uc3QgbG9nTGV2ZWxzID0gWydlcnJvcicsICd3YXJuJywgJ2xvZyddO1xuICBjb25zdCBsb2dzID0ge307XG4gIGNvbnN0IGNvbnNvbGVGbnMgPSB7fTtcbiAgZm9yIChjb25zdCBsZXZlbCBvZiBsb2dMZXZlbHMpIHtcbiAgICBsb2dzW2xldmVsXSA9IFtdO1xuICAgIGNvbnNvbGVGbnNbbGV2ZWxdID0gKC4uLmxvZ01zZ3MpID0+IGxvZ3NbbGV2ZWxdLnB1c2goLi4ubG9nTXNncyk7XG4gIH1cblxuICBjb25zdCBkcml2ZXIgPSBhdHRhY2goZHJpdmVyT3B0cyk7XG5cbiAgY29uc3QgZnVsbFNjcmlwdCA9IGJ1aWxkU2NyaXB0KHNjcmlwdCk7XG4gIC8vIHRoZSB0aW1lb3V0IGhlcmUgd2lsbCBub3QgbWF0dGVyIHJlYWxseSwgYnV0IHNldCBpdCBhbnl3YXkgdG8gYmUgb24gdGhlXG4gIC8vIHNhZmUgc2lkZVxuICBjb25zdCB2bUN0eCA9IHZtLnJ1bkluTmV3Q29udGV4dChmdWxsU2NyaXB0LCB7fSwge3RpbWVvdXR9KTtcblxuICAvLyBydW4gdGhlIGRyaXZlciBzY3JpcHQsIGdpdmluZyB1c2VyIGFjY2VzcyB0byB0aGUgZHJpdmVyIG9iamVjdCwgYSBmYWtlXG4gIC8vIGNvbnNvbGUgbG9nZ2VyLCBhbmQgYSBwcm9taXNlIGxpYnJhcnlcbiAgbG9nLmluZm8oJ1J1bm5pbmcgZHJpdmVyIHNjcmlwdCBpbiBOb2RlIHZtJyk7XG4gIGxldCByZXN1bHQgPSBhd2FpdCB2bUN0eChkcml2ZXIsIGNvbnNvbGVGbnMsIEIpO1xuXG4gIGxvZy5pbmZvKCdFbnN1cmluZyBkcml2ZXIgc2NyaXB0IHJlc3VsdCBpcyBhcHByb3ByaWF0ZSB0eXBlIGZvciByZXR1cm4nKTtcbiAgcmVzdWx0ID0gY29lcmNlU2NyaXB0UmVzdWx0KHJlc3VsdCk7XG4gIHJldHVybiB7cmVzdWx0LCBsb2dzfTtcbn1cblxuLyoqXG4gKiBFbWJlZCBhIHVzZXItZ2VuZXJhdGVkIHNjcmlwdCBpbnNpZGUgYSBtZXRob2Qgd2hpY2ggdGFrZXMgb25seSB0aGVcbiAqIHByZWRldGVybWluZWQgb2JqZWN0cyB3ZSBzcGVjaWZ5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNjcmlwdCAtIHRoZSBqYXZhc2NyaXB0IHRvIGV4ZWN1dGVcbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gdGhlIGZ1bGwgc2NyaXB0IHRvIGV4ZWN1dGVcbiAqL1xuZnVuY3Rpb24gYnVpbGRTY3JpcHQgKHNjcmlwdCkge1xuICByZXR1cm4gYChhc3luYyBmdW5jdGlvbiBleGVjdXRlIChkcml2ZXIsIGNvbnNvbGUsIFByb21pc2UpIHtcbiAgICAke3NjcmlwdH1cbiAgfSlgO1xufVxuXG4vKipcbiAqIFdlIGNhbiBnZXQgYW55IG1hbm5lciBvZiBjcmF6eSB0aGluZyBiYWNrIGZyb20gYSB2bSBleGVjdXRpbmcgdW50cnVzdGVkXG4gKiBjb2RlLiBXZSBtaWdodCBhbHNvIGdldCBXZWJkcml2ZXJJTyBvYmplY3RzIHRoYXQgYXJlbid0IHN1aXRhYmxlIGZvciBKU09OXG4gKiByZXNwb25zZS4gU28gbWFrZSBzdXJlIHdlIGNvbnZlcnQgdGhlIHRoaW5ncyB3ZSBrbm93IGFib3V0IHRvIHRoZWlyXG4gKiBhcHByb3ByaWF0ZSByZXNwb25zZSBmb3JtYXQsIGFuZCBzcXVhc2ggb3RoZXIgd2VpcmQgdGhpbmdzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBvYmplY3QgdG8gY29udmVydCBhbmQgc2FuaXRpemVcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gc2FmZWx5IGNvbnZlcnRlZCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gY29lcmNlU2NyaXB0UmVzdWx0IChvYmopIHtcbiAgLy8gZmlyc3QgZW5zdXJlIG9iaiBpcyBvZiBhIHR5cGUgdGhhdCBjYW4gYmUgSlNPTiBlbmNvZGVkIHNhZmVseS4gVGhpcyB3aWxsXG4gIC8vIGdldCByaWQgb2YgY3VzdG9tIG9iamVjdHMsIGZ1bmN0aW9ucywgZXRjLi4uIGFuZCB0dXJuIHRoZW0gaW50byBQT0pPc1xuICB0cnkge1xuICAgIG9iaiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cud2FybignQ291bGQgbm90IGNvbnZlcnQgZXhlY3V0ZURyaXZlclNjcmlwdCB0byBzYWZlIHJlc3BvbnNlIScgK1xuICAgICAgICAgICAgIGBSZXN1bHQgd2FzOiAke29ian0uIFdpbGwgbWFrZSBpdCBudWxsYCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgcmVzO1xuXG4gIC8vIG5vdyB3ZSBiZWdpbiBvdXIgcmVjdXJzaXZlIGNhc2Ugb3B0aW9uc1xuICBpZiAoXy5pc1BsYWluT2JqZWN0KG9iaikpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGFuIG9iamVjdCwgaXQncyBlaXRoZXIgYW4gZWxlbWVudCBvYmplY3Qgb3Igc29tZXRoaW5nIGVsc2VcbiAgICAvLyB3ZWJkcml2ZXJpbyBoYXMgbm8gbW9uYWRpYyBvYmplY3QgdHlwZXMgb3RoZXIgdGhhbiBlbGVtZW50IGFuZCBkcml2ZXIsXG4gICAgLy8gYW5kIHdlIGRvbid0IHdhbnQgdG8gYWxsb3cgc3BlY2lhbCBjYXNpbmcgcmV0dXJuIG9mIGRyaXZlclxuICAgIHJlcyA9IHt9O1xuXG4gICAgaWYgKG9ialtNSlNPTldQX0VMRU1FTlRfS0VZXSB8fCBvYmpbVzNDX0VMRU1FTlRfS0VZXSkge1xuICAgICAgLy8gaWYgaXQncyBhbiBlbGVtZW50IG9iamVjdCwgY2xlYXIgb3V0IGFueXRoaW5nIHRoYXQncyBub3QgdGhlIGtleSwgYW5kXG4gICAgICAvLyB0aGVuIHJldHVybiB0aGUgb2JqZWN0XG4gICAgICBpZiAob2JqW01KU09OV1BfRUxFTUVOVF9LRVldKSB7XG4gICAgICAgIHJlc1tNSlNPTldQX0VMRU1FTlRfS0VZXSA9IG9ialtNSlNPTldQX0VMRU1FTlRfS0VZXTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9ialtXM0NfRUxFTUVOVF9LRVldKSB7XG4gICAgICAgIHJlc1tXM0NfRUxFTUVOVF9LRVldID0gb2JqW1czQ19FTEVNRU5UX0tFWV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIG90aGVyd2lzZSwgcmVjdXJzZSBpbnRvIHRoZSBvYmplY3RcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgICByZXNba2V5XSA9IGNvZXJjZVNjcmlwdFJlc3VsdChvYmpba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyBpbiB0aGUgY2FlIG9mIGFuIGFycmF5LCBqdXN0IHJlY3Vyc2UgaW50byB0aGUgaXRlbXNcbiAgaWYgKF8uaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9iai5tYXAoY29lcmNlU2NyaXB0UmVzdWx0KTtcbiAgfVxuXG4gIC8vIGJhc2UgY2FzZSwgaWYgaXQncyBub3QgYW4gb2JqZWN0IG9yIGFycmF5LCByZXR1cm4gc3RyYWlnaHRhd2F5XG4gIHJldHVybiBvYmo7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4gKGRyaXZlck9wdHMsIHNjcmlwdCwgdGltZW91dCkge1xuICBsZXQgcmVzO1xuICB0cnkge1xuICAgIHJlcyA9IHtzdWNjZXNzOiBhd2FpdCBydW5TY3JpcHQoZHJpdmVyT3B0cywgc2NyaXB0LCB0aW1lb3V0KX07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVzID0ge2Vycm9yOiB7bWVzc2FnZTogZXJyb3IubWVzc2FnZSwgc3RhY2s6IGVycm9yLnN0YWNrfX07XG4gIH1cbiAgYXdhaXQgQi5wcm9taXNpZnkocHJvY2Vzcy5zZW5kLCB7Y29udGV4dDogcHJvY2Vzc30pKHJlcyk7XG59XG5cbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBsb2cuaW5mbygnUnVubmluZyBkcml2ZXIgZXhlY3V0aW9uIGluIGNoaWxkIHByb2Nlc3MnKTtcbiAgcHJvY2Vzcy5vbignbWVzc2FnZScsICh7ZHJpdmVyT3B0cywgc2NyaXB0LCB0aW1lb3V0fSkgPT4ge1xuICAgIGxvZy5pbmZvKCdQYXJhbWV0ZXJzIHJlY2VpdmVkIGZyb20gcGFyZW50IHByb2Nlc3MnKTtcbiAgICBtYWluKGRyaXZlck9wdHMsIHNjcmlwdCwgdGltZW91dCk7XG4gIH0pO1xufVxuIl0sImZpbGUiOiJsaWIvYmFzZWRyaXZlci9jb21tYW5kcy9leGVjdXRlLWNoaWxkLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uIn0=