@appium/base-driver 8.1.1 → 8.2.2

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 (75) hide show
  1. package/build/lib/basedriver/capabilities.js +6 -6
  2. package/build/lib/basedriver/commands/find.js +1 -1
  3. package/build/lib/basedriver/commands/index.js +2 -4
  4. package/build/lib/basedriver/commands/log.js +1 -1
  5. package/build/lib/basedriver/commands/session.js +1 -1
  6. package/build/lib/basedriver/commands/timeout.js +1 -1
  7. package/build/lib/basedriver/desired-caps.js +1 -1
  8. package/build/lib/basedriver/device-settings.js +1 -1
  9. package/build/lib/basedriver/driver.js +5 -7
  10. package/build/lib/basedriver/helpers.js +5 -3
  11. package/build/lib/constants.js +1 -1
  12. package/build/lib/express/crash.js +1 -1
  13. package/build/lib/express/middleware.js +3 -3
  14. package/build/lib/express/server.js +1 -1
  15. package/build/lib/express/static.js +2 -2
  16. package/build/lib/express/websocket.js +3 -3
  17. package/build/lib/index.js +124 -0
  18. package/build/lib/jsonwp-status/status.js +1 -1
  19. package/build/lib/protocol/errors.js +6 -5
  20. package/build/lib/protocol/helpers.js +3 -3
  21. package/build/lib/protocol/index.js +31 -19
  22. package/build/lib/protocol/protocol.js +22 -11
  23. package/build/lib/protocol/routes.js +6 -12
  24. package/build/test/basedriver/capability-specs.js +10 -10
  25. package/build/test/basedriver/commands/event-specs.js +10 -10
  26. package/build/test/basedriver/driver-e2e-specs.js +3 -3
  27. package/build/test/basedriver/driver-e2e-tests.js +53 -256
  28. package/build/test/basedriver/driver-specs.js +3 -3
  29. package/build/test/basedriver/driver-tests.js +6 -6
  30. package/build/test/basedriver/helpers-e2e-specs.js +10 -4
  31. package/build/test/basedriver/index.js +4 -4
  32. package/build/test/basedriver/timeout-specs.js +7 -7
  33. package/build/test/basedriver/websockets-e2e-specs.js +11 -11
  34. package/build/test/express/server-e2e-specs.js +156 -0
  35. package/build/test/express/server-specs.js +151 -0
  36. package/build/test/express/static-specs.js +23 -0
  37. package/build/test/helpers.js +57 -0
  38. package/build/test/jsonwp-proxy/mock-request.js +93 -0
  39. package/build/test/jsonwp-proxy/protocol-converter-specs.js +173 -0
  40. package/build/test/jsonwp-proxy/proxy-e2e-specs.js +62 -0
  41. package/build/test/jsonwp-proxy/proxy-specs.js +299 -0
  42. package/build/test/jsonwp-proxy/url-specs.js +167 -0
  43. package/build/test/jsonwp-status/status-specs.js +36 -0
  44. package/build/test/protocol/errors-specs.js +388 -0
  45. package/build/test/protocol/fake-driver.js +168 -0
  46. package/build/test/protocol/helpers.js +27 -0
  47. package/build/test/protocol/protocol-e2e-specs.js +1242 -0
  48. package/build/test/protocol/routes-specs.js +82 -0
  49. package/build/test/protocol/validator-specs.js +151 -0
  50. package/index.d.ts +309 -44
  51. package/index.js +1 -62
  52. package/lib/basedriver/commands/index.js +0 -2
  53. package/lib/basedriver/driver.js +2 -22
  54. package/lib/basedriver/helpers.js +5 -4
  55. package/lib/index.js +62 -0
  56. package/lib/protocol/index.js +3 -1
  57. package/lib/protocol/protocol.js +18 -7
  58. package/lib/protocol/routes.js +1 -4
  59. package/package.json +8 -16
  60. package/test/basedriver/capability-specs.js +1 -1
  61. package/test/basedriver/commands/event-specs.js +1 -1
  62. package/test/basedriver/driver-e2e-specs.js +1 -1
  63. package/test/basedriver/driver-e2e-tests.js +66 -213
  64. package/test/basedriver/driver-specs.js +1 -1
  65. package/test/basedriver/driver-tests.js +3 -3
  66. package/test/basedriver/helpers-e2e-specs.js +9 -4
  67. package/test/basedriver/timeout-specs.js +1 -1
  68. package/test/basedriver/websockets-e2e-specs.js +7 -7
  69. package/build/index.js +0 -118
  70. package/build/lib/basedriver/commands/execute-child.js +0 -137
  71. package/build/lib/basedriver/commands/execute.js +0 -119
  72. package/build/test/basedriver/fixtures/custom-element-finder-bad.js +0 -12
  73. package/build/test/basedriver/fixtures/custom-element-finder.js +0 -36
  74. package/lib/basedriver/commands/execute-child.js +0 -132
  75. package/lib/basedriver/commands/execute.js +0 -126
@@ -0,0 +1,173 @@
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 _constants = require("../../lib/constants");
10
+
11
+ var _protocolConverter = _interopRequireWildcard(require("../../lib/jsonwp-proxy/protocol-converter"));
12
+
13
+ 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); }
14
+
15
+ 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; }
16
+
17
+ const {
18
+ MJSONWP,
19
+ W3C
20
+ } = _constants.PROTOCOLS;
21
+ describe('Protocol Converter', function () {
22
+ describe('getTimeoutRequestObjects', function () {
23
+ let converter;
24
+ before(function () {
25
+ converter = new _protocolConverter.default(_lodash.default.noop);
26
+ });
27
+ it('should take W3C inputs and produce MJSONWP compatible objects', function () {
28
+ converter.downstreamProtocol = MJSONWP;
29
+ let timeoutObjects = converter.getTimeoutRequestObjects({
30
+ script: 100
31
+ });
32
+ timeoutObjects.length.should.equal(1);
33
+ timeoutObjects[0].should.eql({
34
+ type: 'script',
35
+ ms: 100
36
+ });
37
+ });
38
+ it('should ignore invalid entries while converting from W3C', function () {
39
+ converter.downstreamProtocol = MJSONWP;
40
+ let timeoutObjects = converter.getTimeoutRequestObjects({
41
+ script: 100,
42
+ sessionId: '5432a4f3-cd89-4781-8905-ea9d3150840c',
43
+ bar: -1,
44
+ baz: undefined
45
+ });
46
+ timeoutObjects.length.should.equal(1);
47
+ timeoutObjects[0].should.eql({
48
+ type: 'script',
49
+ ms: 100
50
+ });
51
+ });
52
+ it('should take multiple W3C timeouts and produce multiple MJSONWP compatible objects', function () {
53
+ converter.downstreamProtocol = MJSONWP;
54
+ let [scriptTimeout, pageLoadTimeout, implicitTimeout] = converter.getTimeoutRequestObjects({
55
+ script: 100,
56
+ pageLoad: 200,
57
+ implicit: 300
58
+ });
59
+ scriptTimeout.should.eql({
60
+ type: 'script',
61
+ ms: 100
62
+ });
63
+ pageLoadTimeout.should.eql({
64
+ type: 'page load',
65
+ ms: 200
66
+ });
67
+ implicitTimeout.should.eql({
68
+ type: 'implicit',
69
+ ms: 300
70
+ });
71
+ });
72
+ it('should take MJSONWP input and produce W3C compatible object', function () {
73
+ converter.downstreamProtocol = W3C;
74
+ let timeoutObjects = converter.getTimeoutRequestObjects({
75
+ type: 'implicit',
76
+ ms: 300
77
+ });
78
+ timeoutObjects.length.should.equal(1);
79
+ timeoutObjects[0].should.eql({
80
+ implicit: 300
81
+ });
82
+ });
83
+ it('should not change the input if protocol name is unknown', function () {
84
+ converter.downstreamProtocol = null;
85
+ let timeoutObjects = converter.getTimeoutRequestObjects({
86
+ type: 'implicit',
87
+ ms: 300
88
+ });
89
+ timeoutObjects.length.should.equal(1);
90
+ timeoutObjects[0].should.eql({
91
+ type: 'implicit',
92
+ ms: 300
93
+ });
94
+ });
95
+ it('should not change the input if protocol name is unchanged', function () {
96
+ converter.downstreamProtocol = MJSONWP;
97
+ let timeoutObjects = converter.getTimeoutRequestObjects({
98
+ type: 'implicit',
99
+ ms: 300
100
+ });
101
+ timeoutObjects.length.should.equal(1);
102
+ timeoutObjects[0].should.eql({
103
+ type: 'implicit',
104
+ ms: 300
105
+ });
106
+ });
107
+ });
108
+ describe('setValue', function () {
109
+ let converter;
110
+ let responseBody;
111
+ before(function () {
112
+ responseBody = null;
113
+ converter = new _protocolConverter.default((url, method, body) => {
114
+ responseBody = body;
115
+ });
116
+ });
117
+ beforeEach(function () {
118
+ responseBody = {};
119
+ });
120
+ it('should calculate value if not present', async function () {
121
+ await converter.proxySetValue('', '', {
122
+ text: 'bla'
123
+ });
124
+ responseBody.should.eql({
125
+ text: 'bla',
126
+ value: ['b', 'l', 'a']
127
+ });
128
+ });
129
+ it('should calculate text if not present', async function () {
130
+ await converter.proxySetValue('', '', {
131
+ value: ['b', 'l', 'a']
132
+ });
133
+ responseBody.should.eql({
134
+ text: 'bla',
135
+ value: ['b', 'l', 'a']
136
+ });
137
+ });
138
+ it('should keep the response body unchanged if both value and text are present', async function () {
139
+ await converter.proxySetValue('', '', {
140
+ text: 'bla',
141
+ value: ['b', 'l', 'a']
142
+ });
143
+ responseBody.should.eql({
144
+ text: 'bla',
145
+ value: ['b', 'l', 'a']
146
+ });
147
+ });
148
+ });
149
+ describe('getProperty', function () {
150
+ let jsonwpConverter, w3cConverter;
151
+ before(function () {
152
+ for (let command of _protocolConverter.COMMAND_URLS_CONFLICTS) {
153
+ if (command.commandNames.includes('getProperty')) {
154
+ jsonwpConverter = command.jsonwpConverter;
155
+ w3cConverter = command.w3cConverter;
156
+ }
157
+ }
158
+ });
159
+ it('should convert "property/value" to "attribute/value"', function () {
160
+ jsonwpConverter('/session/123/element/456/property/value').should.equal('/session/123/element/456/attribute/value');
161
+ });
162
+ it('should convert "property/:somePropName" to "attribute/:somePropName"', function () {
163
+ jsonwpConverter('/session/123/element/456/property/somePropName').should.equal('/session/123/element/456/attribute/somePropName');
164
+ });
165
+ it('should not convert from JSONWP to W3C', function () {
166
+ w3cConverter('/session/123/element/456/attribute/someAttr').should.equal('/session/123/element/456/attribute/someAttr');
167
+ w3cConverter('/session/123/element/456/property/someProp').should.equal('/session/123/element/456/property/someProp');
168
+ });
169
+ });
170
+ });require('source-map-support').install();
171
+
172
+
173
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvanNvbndwLXByb3h5L3Byb3RvY29sLWNvbnZlcnRlci1zcGVjcy5qcyJdLCJuYW1lcyI6WyJNSlNPTldQIiwiVzNDIiwiUFJPVE9DT0xTIiwiZGVzY3JpYmUiLCJjb252ZXJ0ZXIiLCJiZWZvcmUiLCJQcm90b2NvbENvbnZlcnRlciIsIl8iLCJub29wIiwiaXQiLCJkb3duc3RyZWFtUHJvdG9jb2wiLCJ0aW1lb3V0T2JqZWN0cyIsImdldFRpbWVvdXRSZXF1ZXN0T2JqZWN0cyIsInNjcmlwdCIsImxlbmd0aCIsInNob3VsZCIsImVxdWFsIiwiZXFsIiwidHlwZSIsIm1zIiwic2Vzc2lvbklkIiwiYmFyIiwiYmF6IiwidW5kZWZpbmVkIiwic2NyaXB0VGltZW91dCIsInBhZ2VMb2FkVGltZW91dCIsImltcGxpY2l0VGltZW91dCIsInBhZ2VMb2FkIiwiaW1wbGljaXQiLCJyZXNwb25zZUJvZHkiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwiYmVmb3JlRWFjaCIsInByb3h5U2V0VmFsdWUiLCJ0ZXh0IiwidmFsdWUiLCJqc29ud3BDb252ZXJ0ZXIiLCJ3M2NDb252ZXJ0ZXIiLCJjb21tYW5kIiwiQ09NTUFORF9VUkxTX0NPTkZMSUNUUyIsImNvbW1hbmROYW1lcyIsImluY2x1ZGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRUEsTUFBTTtBQUFDQSxFQUFBQSxPQUFEO0FBQVVDLEVBQUFBO0FBQVYsSUFBaUJDLG9CQUF2QjtBQUdBQyxRQUFRLENBQUMsb0JBQUQsRUFBdUIsWUFBWTtBQUN6Q0EsRUFBQUEsUUFBUSxDQUFDLDBCQUFELEVBQTZCLFlBQVk7QUFDL0MsUUFBSUMsU0FBSjtBQUNBQyxJQUFBQSxNQUFNLENBQUMsWUFBWTtBQUNqQkQsTUFBQUEsU0FBUyxHQUFHLElBQUlFLDBCQUFKLENBQXNCQyxnQkFBRUMsSUFBeEIsQ0FBWjtBQUNELEtBRkssQ0FBTjtBQUdBQyxJQUFBQSxFQUFFLENBQUMsK0RBQUQs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aURBQS9FO0FBQ0QsS0FGQyxDQUFGO0FBR0FQLElBQUFBLEVBQUUsQ0FBQyx1Q0FBRCxFQUEwQyxZQUFZO0FBQ3RENkIsTUFBQUEsWUFBWSxDQUFDLDZDQUFELENBQVosQ0FBNER2QixNQUE1RCxDQUFtRUMsS0FBbkUsQ0FBeUUsNkNBQXpFO0FBQ0FzQixNQUFBQSxZQUFZLENBQUMsNENBQUQsQ0FBWixDQUEyRHZCLE1BQTNELENBQWtFQyxLQUFsRSxDQUF3RSw0Q0FBeEU7QUFDRCxLQUhDLENBQUY7QUFJRCxHQXBCTyxDQUFSO0FBcUJELENBMUhPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgUFJPVE9DT0xTIH0gZnJvbSAnLi4vLi4vbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgUHJvdG9jb2xDb252ZXJ0ZXIsIHtDT01NQU5EX1VSTFNfQ09ORkxJQ1RTfSBmcm9tICcuLi8uLi9saWIvanNvbndwLXByb3h5L3Byb3RvY29sLWNvbnZlcnRlcic7XG5cbmNvbnN0IHtNSlNPTldQLCBXM0N9ID0gUFJPVE9DT0xTO1xuXG5cbmRlc2NyaWJlKCdQcm90b2NvbCBDb252ZXJ0ZXInLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdnZXRUaW1lb3V0UmVxdWVzdE9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGNvbnZlcnRlcjtcbiAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgY29udmVydGVyID0gbmV3IFByb3RvY29sQ29udmVydGVyKF8ubm9vcCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0YWtlIFczQyBpbnB1dHMgYW5kIHByb2R1Y2UgTUpTT05XUCBjb21wYXRpYmxlIG9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb252ZXJ0ZXIuZG93bnN0cmVhbVByb3RvY29sID0gTUpTT05XUDtcbiAgICAgIGxldCB0aW1lb3V0T2JqZWN0cyA9IGNvbnZlcnRlci5nZXRUaW1lb3V0UmVxdWVzdE9iamVjdHMoe3NjcmlwdDogMTAwfSk7XG4gICAgICB0aW1lb3V0T2JqZWN0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdGltZW91dE9iamVjdHNbMF0uc2hvdWxkLmVxbCh7dHlwZTogJ3NjcmlwdCcsIG1zOiAxMDB9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGlnbm9yZSBpbnZhbGlkIGVudHJpZXMgd2hpbGUgY29udmVydGluZyBmcm9tIFczQycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnZlcnRlci5kb3duc3RyZWFtUHJvdG9jb2wgPSBNSlNPTldQO1xuICAgICAgbGV0IHRpbWVvdXRPYmplY3RzID0gY29udmVydGVyLmdldFRpbWVvdXRSZXF1ZXN0T2JqZWN0cyh7XG4gICAgICAgIHNjcmlwdDogMTAwLFxuICAgICAgICBzZXNzaW9uSWQ6ICc1NDMyYTRmMy1jZDg5LTQ3ODEtODkwNS1lYTlkMzE1MDg0MGMnLFxuICAgICAgICBiYXI6IC0xLFxuICAgICAgICBiYXo6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgdGltZW91dE9iamVjdHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHRpbWVvdXRPYmplY3RzWzBdLnNob3VsZC5lcWwoe3R5cGU6ICdzY3JpcHQnLCBtczogMTAwfSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0YWtlIG11bHRpcGxlIFczQyB0aW1lb3V0cyBhbmQgcHJvZHVjZSBtdWx0aXBsZSBNSlNPTldQIGNvbXBhdGlibGUgb2JqZWN0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnZlcnRlci5kb3duc3RyZWFtUHJvdG9jb2wgPSBNSlNPTldQO1xuICAgICAgbGV0IFtzY3JpcHRUaW1lb3V0LCBwYWdlTG9hZFRpbWVvdXQsIGltcGxpY2l0VGltZW91dF0gPSBjb252ZXJ0ZXIuZ2V0VGltZW91dFJlcXVlc3RPYmplY3RzKHtzY3JpcHQ6IDEwMCwgcGFnZUxvYWQ6IDIwMCwgaW1wbGljaXQ6IDMwMH0pO1xuICAgICAgc2NyaXB0VGltZW91dC5zaG91bGQuZXFsKHtcbiAgICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICAgIG1zOiAxMDAsXG4gICAgICB9KTtcbiAgICAgIHBhZ2VMb2FkVGltZW91dC5zaG91bGQuZXFsKHtcbiAgICAgICAgdHlwZTogJ3BhZ2UgbG9hZCcsXG4gICAgICAgIG1zOiAyMDAsXG4gICAgICB9KTtcbiAgICAgIGltcGxpY2l0VGltZW91dC5zaG91bGQuZXFsKHtcbiAgICAgICAgdHlwZTogJ2ltcGxpY2l0JyxcbiAgICAgICAgbXM6IDMwMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGFrZSBNSlNPTldQIGlucHV0IGFuZCBwcm9kdWNlIFczQyBjb21wYXRpYmxlIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnZlcnRlci5kb3duc3RyZWFtUHJvdG9jb2wgPSBXM0M7XG4gICAgICBsZXQgdGltZW91dE9iamVjdHMgPSBjb252ZXJ0ZXIuZ2V0VGltZW91dFJlcXVlc3RPYmplY3RzKHt0eXBlOiAnaW1wbGljaXQnLCBtczogMzAwfSk7XG4gICAgICB0aW1lb3V0T2JqZWN0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdGltZW91dE9iamVjdHNbMF0uc2hvdWxkLmVxbCh7aW1wbGljaXQ6IDMwMH0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgbm90IGNoYW5nZSB0aGUgaW5wdXQgaWYgcHJvdG9jb2wgbmFtZSBpcyB1bmtub3duJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29udmVydGVyLmRvd25zdHJlYW1Qcm90b2NvbCA9IG51bGw7XG4gICAgICBsZXQgdGltZW91dE9iamVjdHMgPSBjb252ZXJ0ZXIuZ2V0VGltZW91dFJlcXVlc3RPYmplY3RzKHt0eXBlOiAnaW1wbGljaXQnLCBtczogMzAwfSk7XG4gICAgICB0aW1lb3V0T2JqZWN0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdGltZW91dE9iamVjdHNbMF0uc2hvdWxkLmVxbCh7dHlwZTogJ2ltcGxpY2l0JywgbXM6IDMwMH0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgbm90IGNoYW5nZSB0aGUgaW5wdXQgaWYgcHJvdG9jb2wgbmFtZSBpcyB1bmNoYW5nZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb252ZXJ0ZXIuZG93bnN0cmVhbVByb3RvY29sID0gTUpTT05XUDtcbiAgICAgIGxldCB0aW1lb3V0T2JqZWN0cyA9IGNvbnZlcnRlci5nZXRUaW1lb3V0UmVxdWVzdE9iamVjdHMoe3R5cGU6ICdpbXBsaWNpdCcsIG1zOiAzMDB9KTtcbiAgICAgIHRpbWVvdXRPYmplY3RzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0aW1lb3V0T2JqZWN0c1swXS5zaG91bGQuZXFsKHt0eXBlOiAnaW1wbGljaXQnLCBtczogMzAwfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzZXRWYWx1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgY29udmVydGVyO1xuICAgIGxldCByZXNwb25zZUJvZHk7XG4gICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc3BvbnNlQm9keSA9IG51bGw7XG4gICAgICBjb252ZXJ0ZXIgPSBuZXcgUHJvdG9jb2xDb252ZXJ0ZXIoKHVybCwgbWV0aG9kLCBib2R5KSA9PiB7XG4gICAgICAgIHJlc3BvbnNlQm9keSA9IGJvZHk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc3BvbnNlQm9keSA9IHt9O1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgdmFsdWUgaWYgbm90IHByZXNlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBjb252ZXJ0ZXIucHJveHlTZXRWYWx1ZSgnJywgJycsIHtcbiAgICAgICAgdGV4dDogJ2JsYScsXG4gICAgICB9KTtcbiAgICAgIHJlc3BvbnNlQm9keS5zaG91bGQuZXFsKHtcbiAgICAgICAgdGV4dDogJ2JsYScsXG4gICAgICAgIHZhbHVlOiBbJ2InLCAnbCcsICdhJ10sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSB0ZXh0IGlmIG5vdCBwcmVzZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgY29udmVydGVyLnByb3h5U2V0VmFsdWUoJycsICcnLCB7XG4gICAgICAgIHZhbHVlOiBbJ2InLCAnbCcsICdhJ10sXG4gICAgICB9KTtcbiAgICAgIHJlc3BvbnNlQm9keS5zaG91bGQuZXFsKHtcbiAgICAgICAgdGV4dDogJ2JsYScsXG4gICAgICAgIHZhbHVlOiBbJ2InLCAnbCcsICdhJ10sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGtlZXAgdGhlIHJlc3BvbnNlIGJvZHkgdW5jaGFuZ2VkIGlmIGJvdGggdmFsdWUgYW5kIHRleHQgYXJlIHByZXNlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBjb252ZXJ0ZXIucHJveHlTZXRWYWx1ZSgnJywgJycsIHtcbiAgICAgICAgdGV4dDogJ2JsYScsXG4gICAgICAgIHZhbHVlOiBbJ2InLCAnbCcsICdhJ10sXG4gICAgICB9KTtcbiAgICAgIHJlc3BvbnNlQm9keS5zaG91bGQuZXFsKHtcbiAgICAgICAgdGV4dDogJ2JsYScsXG4gICAgICAgIHZhbHVlOiBbJ2InLCAnbCcsICdhJ10sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdnZXRQcm9wZXJ0eScsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQganNvbndwQ29udmVydGVyLCB3M2NDb252ZXJ0ZXI7XG4gICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAobGV0IGNvbW1hbmQgb2YgQ09NTUFORF9VUkxTX0NPTkZMSUNUUykge1xuICAgICAgICBpZiAoY29tbWFuZC5jb21tYW5kTmFtZXMuaW5jbHVkZXMoJ2dldFByb3BlcnR5JykpIHtcbiAgICAgICAgICBqc29ud3BDb252ZXJ0ZXIgPSBjb21tYW5kLmpzb253cENvbnZlcnRlcjtcbiAgICAgICAgICB3M2NDb252ZXJ0ZXIgPSBjb21tYW5kLnczY0NvbnZlcnRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgY29udmVydCBcInByb3BlcnR5L3ZhbHVlXCIgdG8gXCJhdHRyaWJ1dGUvdmFsdWVcIicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGpzb253cENvbnZlcnRlcignL3Nlc3Npb24vMTIzL2VsZW1lbnQvNDU2L3Byb3BlcnR5L3ZhbHVlJykuc2hvdWxkLmVxdWFsKCcvc2Vzc2lvbi8xMjMvZWxlbWVudC80NTYvYXR0cmlidXRlL3ZhbHVlJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IFwicHJvcGVydHkvOnNvbWVQcm9wTmFtZVwiIHRvIFwiYXR0cmlidXRlLzpzb21lUHJvcE5hbWVcIicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGpzb253cENvbnZlcnRlcignL3Nlc3Npb24vMTIzL2VsZW1lbnQvNDU2L3Byb3BlcnR5L3NvbWVQcm9wTmFtZScpLnNob3VsZC5lcXVhbCgnL3Nlc3Npb24vMTIzL2VsZW1lbnQvNDU2L2F0dHJpYnV0ZS9zb21lUHJvcE5hbWUnKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG5vdCBjb252ZXJ0IGZyb20gSlNPTldQIHRvIFczQycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHczY0NvbnZlcnRlcignL3Nlc3Npb24vMTIzL2VsZW1lbnQvNDU2L2F0dHJpYnV0ZS9zb21lQXR0cicpLnNob3VsZC5lcXVhbCgnL3Nlc3Npb24vMTIzL2VsZW1lbnQvNDU2L2F0dHJpYnV0ZS9zb21lQXR0cicpO1xuICAgICAgdzNjQ29udmVydGVyKCcvc2Vzc2lvbi8xMjMvZWxlbWVudC80NTYvcHJvcGVydHkvc29tZVByb3AnKS5zaG91bGQuZXF1YWwoJy9zZXNzaW9uLzEyMy9lbGVtZW50LzQ1Ni9wcm9wZXJ0eS9zb21lUHJvcCcpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L2pzb253cC1wcm94eS9wcm90b2NvbC1jb252ZXJ0ZXItc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ require("source-map-support/register");
4
+
5
+ var _lib = require("../../lib");
6
+
7
+ var _fakeDriver = require("../protocol/fake-driver");
8
+
9
+ describe('proxy', function () {
10
+ const jwproxy = new _lib.JWProxy();
11
+ let baseServer;
12
+ before(async function () {
13
+ baseServer = await (0, _lib.server)({
14
+ routeConfiguringFunction: (0, _lib.routeConfiguringFunction)(new _fakeDriver.FakeDriver()),
15
+ port: 4444
16
+ });
17
+ });
18
+ after(async function () {
19
+ await baseServer.close();
20
+ });
21
+ it('should proxy status straight', async function () {
22
+ let [res, resBody] = await jwproxy.proxy('/status', 'GET');
23
+ res.statusCode.should.equal(200);
24
+ resBody.status.should.equal(0);
25
+ resBody.value.should.equal(`I'm fine`);
26
+ });
27
+ it('should proxy status as command', async function () {
28
+ const res = await jwproxy.command('/status', 'GET');
29
+ res.should.eql(`I'm fine`);
30
+ });
31
+ describe('new session', function () {
32
+ afterEach(async function () {
33
+ await jwproxy.command('', 'DELETE');
34
+ });
35
+ it('should start a new session', async function () {
36
+ const caps = {
37
+ browserName: 'fake'
38
+ };
39
+ const res = await jwproxy.command('/session', 'POST', {
40
+ capabilities: {
41
+ alwaysMatch: caps
42
+ }
43
+ });
44
+ res.capabilities.alwaysMatch.should.have.property('browserName');
45
+ jwproxy.sessionId.should.have.length(48);
46
+ });
47
+ });
48
+ describe('delete session', function () {
49
+ beforeEach(async function () {
50
+ await jwproxy.command('/session', 'POST', {
51
+ desiredCapabilities: {}
52
+ });
53
+ });
54
+ it('should quit a session', async function () {
55
+ const res = await jwproxy.command('', 'DELETE');
56
+ should.not.exist(res);
57
+ });
58
+ });
59
+ });require('source-map-support').install();
60
+
61
+
62
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvanNvbndwLXByb3h5L3Byb3h5LWUyZS1zcGVjcy5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsImp3cHJveHkiLCJKV1Byb3h5IiwiYmFzZVNlcnZlciIsImJlZm9yZSIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsIkZha2VEcml2ZXIiLCJwb3J0IiwiYWZ0ZXIiLCJjbG9zZSIsIml0IiwicmVzIiwicmVzQm9keSIsInByb3h5Iiwic3RhdHVzQ29kZSIsInNob3VsZCIsImVxdWFsIiwic3RhdHVzIiwidmFsdWUiLCJjb21tYW5kIiwiZXFsIiwiYWZ0ZXJFYWNoIiwiY2FwcyIsImJyb3dzZXJOYW1lIiwiY2FwYWJpbGl0aWVzIiwiYWx3YXlzTWF0Y2giLCJoYXZlIiwicHJvcGVydHkiLCJzZXNzaW9uSWQiLCJsZW5ndGgiLCJiZWZvcmVFYWNoIiwiZGVzaXJlZENhcGFiaWxpdGllcyIsIm5vdCIsImV4aXN0Il0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7O0FBQ0E7O0FBRUFBLFFBQVEsQ0FBQyxPQUFELEVBQVUsWUFBWTtBQUM1QixRQUFNQyxPQUFPLEdBQUcsSUFBSUMsWUFBSixFQUFoQjtBQUNBLE1BQUlDLFVBQUo7QUFDQUMsRUFBQUEsTUFBTSxDQUFDLGtCQUFrQjtBQUN2QkQsSUFBQUEsVUFBVSxHQUFHLE1BQU0saUJBQU87QUFDeEJFLE1BQUFBLHdCQUF3QixFQUFFLG1DQUF5QixJQUFJQyxzQkFBSixFQUF6QixDQURGO0FBRXhCQyxNQUFBQSxJQUFJLEVBQUU7QUFGa0IsS0FBUCxDQUFuQjtBQUlELEdBTEssQ0FBTjtBQU1BQyxFQUFBQSxLQUFLLENBQUMsa0JBQWtCO0FBQ3RCLFVBQU1MLFVBQVUsQ0FBQ00sS0FBWCxFQUFOO0FBQ0QsR0FGSSxDQUFMO0FBSUFDLEVBQUFBLEVBQUUsQ0FBQyw4QkFBRCxFQUFpQyxrQkFBa0I7QUFDbkQsUUFBSSxDQUFDQyxHQUFELEVBQU1DLE9BQU4sSUFBaUIsTUFBTVgsT0FBTyxDQUFDWSxLQUFSLENBQWMsU0FBZCxFQUF5QixLQUF6QixDQUEzQjtBQUNBRixJQUFBQSxHQUFHLENBQUNHLFVBQUosQ0FBZUMsTUFBZixDQUFzQkMsS0FBdEIsQ0FBNEIsR0FBNUI7QUFDQUosSUFBQUEsT0FBTyxDQUFDSyxNQUFSLENBQWVGLE1BQWYsQ0FBc0JDLEtBQXRCLENBQTRCLENBQTVCO0FBQ0FKLElBQUFBLE9BQU8sQ0FBQ00sS0FBUixDQUFjSCxNQUFkLENBQXFCQyxLQUFyQixDQUE0QixVQUE1QjtBQUNELEdBTEMsQ0FBRjtBQU1BTixFQUFBQSxFQUFFLENBQUMsZ0NBQUQsRUFBbUMsa0JBQWtCO0FBQ3JELFVBQU1DLEdBQUcsR0FBRyxNQUFNVixPQUFPLENBQUNrQixPQUFSLENBQWdCLFNBQWhCLEVBQTJCLEtBQTNCLENBQWxCO0FBQ0FSLElBQUFBLEdBQUcsQ0FBQ0ksTUFBSixDQUFXSyxHQUFYLENBQWdCLFVBQWhCO0FBQ0QsR0FIQyxDQUFGO0FBSUFwQixFQUFBQSxRQUFRLENBQUMsYUFBRCxFQUFnQixZQUFZO0FBQ2xDcUIsSUFBQUEsU0FBUyxDQUFDLGtCQUFrQjtBQUMxQixZQUFNcEIsT0FBTyxDQUFDa0IsT0FBUixDQUFnQixFQUFoQixFQUFvQixRQUFwQixDQUFOO0FBQ0QsS0FGUSxDQUFUO0FBR0FULElBQUFBLEVBQUUsQ0FBQyw0QkFBRCxFQUErQixrQkFBa0I7QUFDakQsWUFBTVksSUFBSSxHQUFHO0FBQUNDLFFBQUFBLFdBQVcsRUFBRTtBQUFkLE9BQWI7QUFDQSxZQUFNWixHQUFHLEdBQUcsTUFBTVYsT0FBTyxDQUFDa0IsT0FBUixDQUFnQixVQUFoQixFQUE0QixNQUE1QixFQUFvQztBQUFDSyxRQUFBQSxZQUFZLEVBQUU7QUFBQ0MsVUFBQUEsV0FBVyxFQUFFSDtBQUFkO0FBQWYsT0FBcEMsQ0FBbEI7QUFDQVgsTUFBQUEsR0FBRyxDQUFDYSxZQUFKLENBQWlCQyxXQUFqQixDQUE2QlYsTUFBN0IsQ0FBb0NXLElBQXBDLENBQXlDQyxRQUF6QyxDQUFrRCxhQUFsRDtBQUNBMUIsTUFBQUEsT0FBTyxDQUFDMkIsU0FBUixDQUFrQmIsTUFBbEIsQ0FBeUJXLElBQXpCLENBQThCRyxNQUE5QixDQUFxQyxFQUFyQztBQUNELEtBTEMsQ0FBRjtBQU1ELEdBVk8sQ0FBUjtBQVdBN0IsRUFBQUEsUUFBUSxDQUFDLGdCQUFELEVBQW1CLFlBQVk7QUFDckM4QixJQUFBQSxVQUFVLENBQUMsa0JBQWtCO0FBQzNCLFlBQU03QixPQUFPLENBQUNrQixPQUFSLENBQWdCLFVBQWhCLEVBQTRCLE1BQTVCLEVBQW9DO0FBQUNZLFFBQUFBLG1CQUFtQixFQUFFO0FBQXRCLE9BQXBDLENBQU47QUFDRCxLQUZTLENBQVY7QUFHQXJCLElBQUFBLEVBQUUsQ0FBQyx1QkFBRCxFQUEwQixrQkFBa0I7QUFDNUMsWUFBTUMsR0FBRyxHQUFHLE1BQU1WLE9BQU8sQ0FBQ2tCLE9BQVIsQ0FBZ0IsRUFBaEIsRUFBb0IsUUFBcEIsQ0FBbEI7QUFDQUosTUFBQUEsTUFBTSxDQUFDaUIsR0FBUCxDQUFXQyxLQUFYLENBQWlCdEIsR0FBakI7QUFDRCxLQUhDLENBQUY7QUFJRCxHQVJPLENBQVI7QUFTRCxDQTNDTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSldQcm94eSwgc2VydmVyLCByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24gfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IHsgRmFrZURyaXZlciB9IGZyb20gJy4uL3Byb3RvY29sL2Zha2UtZHJpdmVyJztcblxuZGVzY3JpYmUoJ3Byb3h5JywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBqd3Byb3h5ID0gbmV3IEpXUHJveHkoKTtcbiAgbGV0IGJhc2VTZXJ2ZXI7XG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYmFzZVNlcnZlciA9IGF3YWl0IHNlcnZlcih7XG4gICAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb246IHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbihuZXcgRmFrZURyaXZlcigpKSxcbiAgICAgIHBvcnQ6IDQ0NDQsXG4gICAgfSk7XG4gIH0pO1xuICBhZnRlcihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgYmFzZVNlcnZlci5jbG9zZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHByb3h5IHN0YXR1cyBzdHJhaWdodCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgW3JlcywgcmVzQm9keV0gPSBhd2FpdCBqd3Byb3h5LnByb3h5KCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgIHJlcy5zdGF0dXNDb2RlLnNob3VsZC5lcXVhbCgyMDApO1xuICAgIHJlc0JvZHkuc3RhdHVzLnNob3VsZC5lcXVhbCgwKTtcbiAgICByZXNCb2R5LnZhbHVlLnNob3VsZC5lcXVhbChgSSdtIGZpbmVgKTtcbiAgfSk7XG4gIGl0KCdzaG91bGQgcHJveHkgc3RhdHVzIGFzIGNvbW1hbmQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgandwcm94eS5jb21tYW5kKCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgIHJlcy5zaG91bGQuZXFsKGBJJ20gZmluZWApO1xuICB9KTtcbiAgZGVzY3JpYmUoJ25ldyBzZXNzaW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGFmdGVyRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBqd3Byb3h5LmNvbW1hbmQoJycsICdERUxFVEUnKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHN0YXJ0IGEgbmV3IHNlc3Npb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjYXBzID0ge2Jyb3dzZXJOYW1lOiAnZmFrZSd9O1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgandwcm94eS5jb21tYW5kKCcvc2Vzc2lvbicsICdQT1NUJywge2NhcGFiaWxpdGllczoge2Fsd2F5c01hdGNoOiBjYXBzfX0pO1xuICAgICAgcmVzLmNhcGFiaWxpdGllcy5hbHdheXNNYXRjaC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYnJvd3Nlck5hbWUnKTtcbiAgICAgIGp3cHJveHkuc2Vzc2lvbklkLnNob3VsZC5oYXZlLmxlbmd0aCg0OCk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnZGVsZXRlIHNlc3Npb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBqd3Byb3h5LmNvbW1hbmQoJy9zZXNzaW9uJywgJ1BPU1QnLCB7ZGVzaXJlZENhcGFiaWxpdGllczoge319KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHF1aXQgYSBzZXNzaW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgandwcm94eS5jb21tYW5kKCcnLCAnREVMRVRFJyk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KHJlcyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvanNvbndwLXByb3h5L3Byb3h5LWUyZS1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ require("source-map-support/register");
6
+
7
+ var _lib = require("../../lib");
8
+
9
+ var _mockRequest = _interopRequireDefault(require("./mock-request"));
10
+
11
+ var _errors = require("../../lib/protocol/errors");
12
+
13
+ var _helpers = require("../helpers");
14
+
15
+ function buildReqRes(url, method, body) {
16
+ let req = {
17
+ originalUrl: url,
18
+ method,
19
+ body
20
+ };
21
+ let res = {};
22
+ res.headers = {};
23
+
24
+ res.set = (k, v) => {
25
+ res[k] = v;
26
+ };
27
+
28
+ res.status = code => {
29
+ res.sentCode = code;
30
+ return res;
31
+ };
32
+
33
+ res.send = body => {
34
+ try {
35
+ body = JSON.parse(body);
36
+ } catch (e) {}
37
+
38
+ res.sentBody = body;
39
+ };
40
+
41
+ return [req, res];
42
+ }
43
+
44
+ describe('proxy', function () {
45
+ let port;
46
+
47
+ function mockProxy(opts = {}) {
48
+ opts = {
49
+ server: _helpers.TEST_HOST,
50
+ port,
51
+ ...opts
52
+ };
53
+ let proxy = new _lib.JWProxy(opts);
54
+
55
+ proxy.request = async function (...args) {
56
+ return await (0, _mockRequest.default)(...args);
57
+ };
58
+
59
+ return proxy;
60
+ }
61
+
62
+ before(async function () {
63
+ port = await (0, _helpers.getTestPort)();
64
+ });
65
+ it('should override default params', function () {
66
+ let j = mockProxy({
67
+ server: '127.0.0.2',
68
+ port
69
+ });
70
+ j.server.should.equal('127.0.0.2');
71
+ j.port.should.equal(port);
72
+ });
73
+ it('should save session id on session creation', async function () {
74
+ let j = mockProxy();
75
+ let [res, body] = await j.proxy('/session', 'POST', {
76
+ desiredCapabilities: {}
77
+ });
78
+ res.statusCode.should.equal(200);
79
+ body.should.eql({
80
+ status: 0,
81
+ sessionId: '123',
82
+ value: {
83
+ browserName: 'boo'
84
+ }
85
+ });
86
+ j.sessionId.should.equal('123');
87
+ });
88
+ describe('getUrlForProxy', function () {
89
+ it('should modify session id, host, and port', function () {
90
+ let j = mockProxy({
91
+ sessionId: '123'
92
+ });
93
+ j.getUrlForProxy('http://host.com:1234/session/456/element/200/value').should.eql(`http://${_helpers.TEST_HOST}:${port}/session/123/element/200/value`);
94
+ });
95
+ it('should prepend scheme, host and port if not provided', function () {
96
+ let j = mockProxy({
97
+ sessionId: '123'
98
+ });
99
+ j.getUrlForProxy('/session/456/element/200/value').should.eql(`http://${_helpers.TEST_HOST}:${port}/session/123/element/200/value`);
100
+ });
101
+ it('should respect nonstandard incoming request base path', function () {
102
+ let j = mockProxy({
103
+ sessionId: '123',
104
+ reqBasePath: ''
105
+ });
106
+ j.getUrlForProxy('/session/456/element/200/value').should.eql(`http://${_helpers.TEST_HOST}:${port}/session/123/element/200/value`);
107
+ j = mockProxy({
108
+ sessionId: '123',
109
+ reqBasePath: '/my/base/path'
110
+ });
111
+ j.getUrlForProxy('/my/base/path/session/456/element/200/value').should.eql(`http://${_helpers.TEST_HOST}:${port}/session/123/element/200/value`);
112
+ });
113
+ it('should work with urls which do not have session ids', function () {
114
+ let j = mockProxy({
115
+ sessionId: '123'
116
+ });
117
+ j.getUrlForProxy('http://host.com:1234/session').should.eql(`http://${_helpers.TEST_HOST}:${port}/session`);
118
+ let newUrl = j.getUrlForProxy('/session');
119
+ newUrl.should.eql(`http://${_helpers.TEST_HOST}:${port}/session`);
120
+ });
121
+ it('should throw an error if url requires a sessionId but its null', function () {
122
+ let j = mockProxy();
123
+ let e;
124
+
125
+ try {
126
+ j.getUrlForProxy('/session/456/element/200/value');
127
+ } catch (err) {
128
+ e = err;
129
+ }
130
+
131
+ should.exist(e);
132
+ e.message.should.contain('without session id');
133
+ });
134
+ it('should not throw an error if url does not require a session id and its null', function () {
135
+ let j = mockProxy();
136
+ let newUrl = j.getUrlForProxy('/status');
137
+ should.exist(newUrl);
138
+ });
139
+ });
140
+ describe('straight proxy', function () {
141
+ it('should successfully proxy straight', async function () {
142
+ let j = mockProxy();
143
+ let [res, body] = await j.proxy('/status', 'GET');
144
+ res.statusCode.should.equal(200);
145
+ body.should.eql({
146
+ status: 0,
147
+ value: {
148
+ foo: 'bar'
149
+ }
150
+ });
151
+ });
152
+ it('should pass along request errors', function () {
153
+ let j = mockProxy({
154
+ sessionId: '123'
155
+ });
156
+ j.proxy('/badurl', 'GET').should.eventually.be.rejectedWith('Could not proxy');
157
+ });
158
+ it('should proxy error responses and codes', async function () {
159
+ let j = mockProxy({
160
+ sessionId: '123'
161
+ });
162
+
163
+ try {
164
+ await j.proxy('/element/bad/text', 'GET');
165
+ } catch (e) {
166
+ (0, _errors.isErrorType)(e.getActualError(), _errors.errors.ElementNotVisibleError).should.be.true;
167
+ }
168
+ });
169
+ });
170
+ describe('command proxy', function () {
171
+ it('should successfully proxy command', async function () {
172
+ let j = mockProxy();
173
+ let res = await j.command('/status', 'GET');
174
+ res.should.eql({
175
+ foo: 'bar'
176
+ });
177
+ });
178
+ it('should pass along request errors', function () {
179
+ let j = mockProxy({
180
+ sessionId: '123'
181
+ });
182
+ j.command('/badurl', 'GET').should.eventually.be.rejectedWith('Could not proxy');
183
+ });
184
+ it('should throw when a command fails', async function () {
185
+ let j = mockProxy({
186
+ sessionId: '123'
187
+ });
188
+ let e = null;
189
+
190
+ try {
191
+ await j.command('/element/bad/text', 'GET');
192
+ } catch (err) {
193
+ e = err;
194
+ }
195
+
196
+ should.exist(e);
197
+ e.message.should.contain('Invisible element');
198
+ });
199
+ it('should throw when a command fails with a 200 because the status is not 0', async function () {
200
+ let j = mockProxy({
201
+ sessionId: '123'
202
+ });
203
+ let e = null;
204
+
205
+ try {
206
+ await j.command('/element/200/text', 'GET');
207
+ } catch (err) {
208
+ e = err;
209
+ }
210
+
211
+ should.exist(e);
212
+ e.error.should.eql('element not visible');
213
+ });
214
+ it('should throw when a command fails with a 100', async function () {
215
+ let j = mockProxy({
216
+ sessionId: '123'
217
+ });
218
+ let e = null;
219
+
220
+ try {
221
+ await j.command('/session/badchrome/nochrome', 'GET');
222
+ } catch (err) {
223
+ e = err;
224
+ }
225
+
226
+ should.exist(e);
227
+ e.message.should.contain('chrome not reachable');
228
+ });
229
+ });
230
+ describe('req/res proxy', function () {
231
+ it('should successfully proxy via req and send to res', async function () {
232
+ let j = mockProxy();
233
+ let [req, res] = buildReqRes('/status', 'GET');
234
+ await j.proxyReqRes(req, res);
235
+ res.headers['content-type'].should.equal('application/json; charset=utf-8');
236
+ res.sentCode.should.equal(200);
237
+ res.sentBody.should.eql({
238
+ status: 0,
239
+ value: {
240
+ foo: 'bar'
241
+ }
242
+ });
243
+ });
244
+ it('should rewrite the inner session id so it doesnt change', async function () {
245
+ let j = mockProxy({
246
+ sessionId: '123'
247
+ });
248
+ let [req, res] = buildReqRes('/element/200/value', 'GET');
249
+ await j.proxyReqRes(req, res);
250
+ res.sentBody.should.eql({
251
+ status: 0,
252
+ value: 'foobar',
253
+ sessionId: '123'
254
+ });
255
+ });
256
+ it('should rewrite the inner session id with sessionId in url', async function () {
257
+ let j = mockProxy({
258
+ sessionId: '123'
259
+ });
260
+ let [req, res] = buildReqRes('/session/456/element/200/value', 'POST');
261
+ await j.proxyReqRes(req, res);
262
+ res.sentBody.should.eql({
263
+ status: 0,
264
+ value: 'foobar',
265
+ sessionId: '456'
266
+ });
267
+ });
268
+ it('should pass through urls that do not require session IDs', async function () {
269
+ let j = mockProxy({
270
+ sessionId: '123'
271
+ });
272
+ let [req, res] = buildReqRes('/status', 'GET');
273
+ await j.proxyReqRes(req, res);
274
+ res.sentBody.should.eql({
275
+ status: 0,
276
+ value: {
277
+ 'foo': 'bar'
278
+ }
279
+ });
280
+ });
281
+ it('should proxy strange responses', async function () {
282
+ let j = mockProxy({
283
+ sessionId: '123'
284
+ });
285
+ let [req, res] = buildReqRes('/nochrome', 'GET');
286
+ await j.proxyReqRes(req, res);
287
+ res.sentCode.should.equal(100);
288
+ res.sentBody.should.eql({
289
+ status: 0,
290
+ value: {
291
+ message: 'chrome not reachable'
292
+ }
293
+ });
294
+ });
295
+ });
296
+ });require('source-map-support').install();
297
+
298
+
299
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvanNvbndwLXByb3h5L3Byb3h5LXNwZWNzLmpzIl0sIm5hbWVzIjpbImJ1aWxkUmVxUmVzIiwidXJsIiwibWV0aG9kIiwiYm9keSIsInJlcSIsIm9yaWdpbmFsVXJsIiwicmVzIiwiaGVhZGVycyIsInNldCIsImsiLCJ2Iiwic3RhdHVzIiwiY29kZSIsInNlbnRDb2RlIiwic2VuZCIsIkpTT04iLCJwYXJzZSIsImUiLCJzZW50Qm9keSIsImRlc2NyaWJlIiwicG9ydCIsIm1vY2tQcm94eSIsIm9wdHMiLCJzZXJ2ZXIiLCJURVNUX0hPU1QiLCJwcm94eSIsIkpXUHJveHkiLCJyZXF1ZXN0IiwiYXJncyIsImJlZm9yZSIsIml0IiwiaiIsInNob3VsZCIsImVxdWFsIiwiZGVzaXJlZENhcGFiaWxpdGllcyIsInN0YXR1c0NvZGUiLCJlcWwiLCJzZXNzaW9uSWQiLCJ2YWx1ZSIsImJyb3dzZXJOYW1lIiwiZ2V0VXJsRm9yUHJveHkiLCJyZXFCYXNlUGF0aCIsIm5ld1VybCIsImVyciIsImV4aXN0IiwibWVzc2FnZSIsImNvbnRhaW4iLCJmb28iLCJldmVudHVhbGx5IiwiYmUiLCJyZWplY3RlZFdpdGgiLCJnZXRBY3R1YWxFcnJvciIsImVycm9ycyIsIkVsZW1lbnROb3RWaXNpYmxlRXJyb3IiLCJ0cnVlIiwiY29tbWFuZCIsImVycm9yIiwicHJveHlSZXFSZXMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLFNBQVNBLFdBQVQsQ0FBc0JDLEdBQXRCLEVBQTJCQyxNQUEzQixFQUFtQ0MsSUFBbkMsRUFBeUM7QUFDdkMsTUFBSUMsR0FBRyxHQUFHO0FBQUNDLElBQUFBLFdBQVcsRUFBRUosR0FBZDtBQUFtQkMsSUFBQUEsTUFBbkI7QUFBMkJDLElBQUFBO0FBQTNCLEdBQVY7QUFDQSxNQUFJRyxHQUFHLEdBQUcsRUFBVjtBQUNBQSxFQUFBQSxHQUFHLENBQUNDLE9BQUosR0FBYyxFQUFkOztBQUNBRCxFQUFBQSxH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QUFTLEVBQUU7QUFBWixPQUFELENBQWpCO0FBQ0EsVUFBSSxDQUFDakMsR0FBRCxFQUFNRSxHQUFOLElBQWFOLFdBQVcsQ0FBQyxXQUFELEVBQWMsS0FBZCxDQUE1QjtBQUNBLFlBQU0rQixDQUFDLENBQUMwQixXQUFGLENBQWNyRCxHQUFkLEVBQW1CRSxHQUFuQixDQUFOO0FBQ0FBLE1BQUFBLEdBQUcsQ0FBQ08sUUFBSixDQUFhbUIsTUFBYixDQUFvQkMsS0FBcEIsQ0FBMEIsR0FBMUI7QUFDQTNCLE1BQUFBLEdBQUcsQ0FBQ1ksUUFBSixDQUFhYyxNQUFiLENBQW9CSSxHQUFwQixDQUF3QjtBQUFDekIsUUFBQUEsTUFBTSxFQUFFLENBQVQ7QUFBWTJCLFFBQUFBLEtBQUssRUFBRTtBQUFDTyxVQUFBQSxPQUFPLEVBQUU7QUFBVjtBQUFuQixPQUF4QjtBQUNELEtBTkMsQ0FBRjtBQU9ELEdBbENPLENBQVI7QUFtQ0QsQ0E5S08sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptb2NoYVxuXG5pbXBvcnQgeyBKV1Byb3h5IH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4vbW9jay1yZXF1ZXN0JztcbmltcG9ydCB7IGlzRXJyb3JUeXBlLCBlcnJvcnMgfSBmcm9tICcuLi8uLi9saWIvcHJvdG9jb2wvZXJyb3JzJztcbmltcG9ydCB7IGdldFRlc3RQb3J0LCBURVNUX0hPU1QgfSBmcm9tICcuLi9oZWxwZXJzJztcblxuZnVuY3Rpb24gYnVpbGRSZXFSZXMgKHVybCwgbWV0aG9kLCBib2R5KSB7XG4gIGxldCByZXEgPSB7b3JpZ2luYWxVcmw6IHVybCwgbWV0aG9kLCBib2R5fTtcbiAgbGV0IHJlcyA9IHt9O1xuICByZXMuaGVhZGVycyA9IHt9O1xuICByZXMuc2V0ID0gKGssIHYpID0+IHsgcmVzW2tdID0gdjsgfTtcbiAgcmVzLnN0YXR1cyA9IChjb2RlKSA9PiB7XG4gICAgcmVzLnNlbnRDb2RlID0gY29kZTtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuICByZXMuc2VuZCA9IChib2R5KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGJvZHkgPSBKU09OLnBhcnNlKGJvZHkpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmVzLnNlbnRCb2R5ID0gYm9keTtcbiAgfTtcbiAgcmV0dXJuIFtyZXEsIHJlc107XG59XG5cbmRlc2NyaWJlKCdwcm94eScsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHBvcnQ7XG5cbiAgZnVuY3Rpb24gbW9ja1Byb3h5IChvcHRzID0ge30pIHtcbiAgICAvLyBzZXRzIGRlZmF1bHQgc2VydmVyL3BvcnRcbiAgICBvcHRzID0ge3NlcnZlcjogVEVTVF9IT1NULCBwb3J0LCAuLi5vcHRzfTtcbiAgICBsZXQgcHJveHkgPSBuZXcgSldQcm94eShvcHRzKTtcbiAgICBwcm94eS5yZXF1ZXN0ID0gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXF1ZXN0KC4uLmFyZ3MpO1xuICAgIH07XG4gICAgcmV0dXJuIHByb3h5O1xuICB9XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBwb3J0ID0gYXdhaXQgZ2V0VGVzdFBvcnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBvdmVycmlkZSBkZWZhdWx0IHBhcmFtcycsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2VydmVyOiAnMTI3LjAuMC4yJywgcG9ydH0pO1xuICAgIGouc2VydmVyLnNob3VsZC5lcXVhbCgnMTI3LjAuMC4yJyk7XG4gICAgai5wb3J0LnNob3VsZC5lcXVhbChwb3J0KTtcbiAgfSk7XG4gIGl0KCdzaG91bGQgc2F2ZSBzZXNzaW9uIGlkIG9uIHNlc3Npb24gY3JlYXRpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGogPSBtb2NrUHJveHkoKTtcbiAgICBsZXQgW3JlcywgYm9keV0gPSBhd2FpdCBqLnByb3h5KCcvc2Vzc2lvbicsICdQT1NUJywge2Rlc2lyZWRDYXBhYmlsaXRpZXM6IHt9fSk7XG4gICAgcmVzLnN0YXR1c0NvZGUuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgYm9keS5zaG91bGQuZXFsKHtzdGF0dXM6IDAsIHNlc3Npb25JZDogJzEyMycsIHZhbHVlOiB7YnJvd3Nlck5hbWU6ICdib28nfX0pO1xuICAgIGouc2Vzc2lvbklkLnNob3VsZC5lcXVhbCgnMTIzJyk7XG4gIH0pO1xuICBkZXNjcmliZSgnZ2V0VXJsRm9yUHJveHknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBtb2RpZnkgc2Vzc2lvbiBpZCwgaG9zdCwgYW5kIHBvcnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJ30pO1xuICAgICAgai5nZXRVcmxGb3JQcm94eSgnaHR0cDovL2hvc3QuY29tOjEyMzQvc2Vzc2lvbi80NTYvZWxlbWVudC8yMDAvdmFsdWUnKVxuICAgICAgIC5zaG91bGQuZXFsKGBodHRwOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0vc2Vzc2lvbi8xMjMvZWxlbWVudC8yMDAvdmFsdWVgKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHByZXBlbmQgc2NoZW1lLCBob3N0IGFuZCBwb3J0IGlmIG5vdCBwcm92aWRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KHtzZXNzaW9uSWQ6ICcxMjMnfSk7XG4gICAgICBqLmdldFVybEZvclByb3h5KCcvc2Vzc2lvbi80NTYvZWxlbWVudC8yMDAvdmFsdWUnKVxuICAgICAgIC5zaG91bGQuZXFsKGBodHRwOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0vc2Vzc2lvbi8xMjMvZWxlbWVudC8yMDAvdmFsdWVgKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJlc3BlY3Qgbm9uc3RhbmRhcmQgaW5jb21pbmcgcmVxdWVzdCBiYXNlIHBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJywgcmVxQmFzZVBhdGg6ICcnfSk7XG4gICAgICBqLmdldFVybEZvclByb3h5KCcvc2Vzc2lvbi80NTYvZWxlbWVudC8yMDAvdmFsdWUnKVxuICAgICAgIC5zaG91bGQuZXFsKGBodHRwOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0vc2Vzc2lvbi8xMjMvZWxlbWVudC8yMDAvdmFsdWVgKTtcblxuICAgICAgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJywgcmVxQmFzZVBhdGg6ICcvbXkvYmFzZS9wYXRoJ30pO1xuICAgICAgai5nZXRVcmxGb3JQcm94eSgnL215L2Jhc2UvcGF0aC9zZXNzaW9uLzQ1Ni9lbGVtZW50LzIwMC92YWx1ZScpXG4gICAgICAgLnNob3VsZC5lcWwoYGh0dHA6Ly8ke1RFU1RfSE9TVH06JHtwb3J0fS9zZXNzaW9uLzEyMy9lbGVtZW50LzIwMC92YWx1ZWApO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgd29yayB3aXRoIHVybHMgd2hpY2ggZG8gbm90IGhhdmUgc2Vzc2lvbiBpZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJ30pO1xuICAgICAgai5nZXRVcmxGb3JQcm94eSgnaHR0cDovL2hvc3QuY29tOjEyMzQvc2Vzc2lvbicpXG4gICAgICAgLnNob3VsZC5lcWwoYGh0dHA6Ly8ke1RFU1RfSE9TVH06JHtwb3J0fS9zZXNzaW9uYCk7XG5cbiAgICAgIGxldCBuZXdVcmwgPSBqLmdldFVybEZvclByb3h5KCcvc2Vzc2lvbicpO1xuICAgICAgbmV3VXJsLnNob3VsZC5lcWwoYGh0dHA6Ly8ke1RFU1RfSE9TVH06JHtwb3J0fS9zZXNzaW9uYCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciBpZiB1cmwgcmVxdWlyZXMgYSBzZXNzaW9uSWQgYnV0IGl0cyBudWxsJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoKTtcbiAgICAgIGxldCBlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgai5nZXRVcmxGb3JQcm94eSgnL3Nlc3Npb24vNDU2L2VsZW1lbnQvMjAwL3ZhbHVlJyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgZSA9IGVycjtcbiAgICAgIH1cbiAgICAgIHNob3VsZC5leGlzdChlKTtcbiAgICAgIGUubWVzc2FnZS5zaG91bGQuY29udGFpbignd2l0aG91dCBzZXNzaW9uIGlkJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBub3QgdGhyb3cgYW4gZXJyb3IgaWYgdXJsIGRvZXMgbm90IHJlcXVpcmUgYSBzZXNzaW9uIGlkIGFuZCBpdHMgbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KCk7XG4gICAgICBsZXQgbmV3VXJsID0gai5nZXRVcmxGb3JQcm94eSgnL3N0YXR1cycpO1xuXG4gICAgICBzaG91bGQuZXhpc3QobmV3VXJsKTtcbiAgICB9KTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdzdHJhaWdodCBwcm94eScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBwcm94eSBzdHJhaWdodCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KCk7XG4gICAgICBsZXQgW3JlcywgYm9keV0gPSBhd2FpdCBqLnByb3h5KCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgICAgcmVzLnN0YXR1c0NvZGUuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICBib2R5LnNob3VsZC5lcWwoe3N0YXR1czogMCwgdmFsdWU6IHtmb286ICdiYXInfX0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGFzcyBhbG9uZyByZXF1ZXN0IGVycm9ycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KHtzZXNzaW9uSWQ6ICcxMjMnfSk7XG4gICAgICBqLnByb3h5KCcvYmFkdXJsJywgJ0dFVCcpLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgnQ291bGQgbm90IHByb3h5Jyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwcm94eSBlcnJvciByZXNwb25zZXMgYW5kIGNvZGVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMyd9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGoucHJveHkoJy9lbGVtZW50L2JhZC90ZXh0JywgJ0dFVCcpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpc0Vycm9yVHlwZShlLmdldEFjdHVhbEVycm9yKCksIGVycm9ycy5FbGVtZW50Tm90VmlzaWJsZUVycm9yKS5zaG91bGQuYmUudHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdjb21tYW5kIHByb3h5JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IHByb3h5IGNvbW1hbmQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSgpO1xuICAgICAgbGV0IHJlcyA9IGF3YWl0IGouY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgIHJlcy5zaG91bGQuZXFsKHtmb286ICdiYXInfSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwYXNzIGFsb25nIHJlcXVlc3QgZXJyb3JzJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMyd9KTtcbiAgICAgIGouY29tbWFuZCgnL2JhZHVybCcsICdHRVQnKS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoJ0NvdWxkIG5vdCBwcm94eScpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBhIGNvbW1hbmQgZmFpbHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJ30pO1xuICAgICAgbGV0IGUgPSBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgai5jb21tYW5kKCcvZWxlbWVudC9iYWQvdGV4dCcsICdHRVQnKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlID0gZXJyO1xuICAgICAgfVxuICAgICAgc2hvdWxkLmV4aXN0KGUpO1xuICAgICAgZS5tZXNzYWdlLnNob3VsZC5jb250YWluKCdJbnZpc2libGUgZWxlbWVudCcpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBhIGNvbW1hbmQgZmFpbHMgd2l0aCBhIDIwMCBiZWNhdXNlIHRoZSBzdGF0dXMgaXMgbm90IDAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJ30pO1xuICAgICAgbGV0IGUgPSBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgai5jb21tYW5kKCcvZWxlbWVudC8yMDAvdGV4dCcsICdHRVQnKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlID0gZXJyO1xuICAgICAgfVxuICAgICAgc2hvdWxkLmV4aXN0KGUpO1xuICAgICAgZS5lcnJvci5zaG91bGQuZXFsKCdlbGVtZW50IG5vdCB2aXNpYmxlJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGEgY29tbWFuZCBmYWlscyB3aXRoIGEgMTAwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMyd9KTtcbiAgICAgIGxldCBlID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGouY29tbWFuZCgnL3Nlc3Npb24vYmFkY2hyb21lL25vY2hyb21lJywgJ0dFVCcpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGUgPSBlcnI7XG4gICAgICB9XG4gICAgICBzaG91bGQuZXhpc3QoZSk7XG4gICAgICBlLm1lc3NhZ2Uuc2hvdWxkLmNvbnRhaW4oJ2Nocm9tZSBub3QgcmVhY2hhYmxlJyk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgncmVxL3JlcyBwcm94eScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBwcm94eSB2aWEgcmVxIGFuZCBzZW5kIHRvIHJlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KCk7XG4gICAgICBsZXQgW3JlcSwgcmVzXSA9IGJ1aWxkUmVxUmVzKCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgICAgYXdhaXQgai5wcm94eVJlcVJlcyhyZXEsIHJlcyk7XG4gICAgICByZXMuaGVhZGVyc1snY29udGVudC10eXBlJ10uc2hvdWxkLmVxdWFsKCdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04Jyk7XG4gICAgICByZXMuc2VudENvZGUuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICByZXMuc2VudEJvZHkuc2hvdWxkLmVxbCh7c3RhdHVzOiAwLCB2YWx1ZToge2ZvbzogJ2Jhcid9fSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZXdyaXRlIHRoZSBpbm5lciBzZXNzaW9uIGlkIHNvIGl0IGRvZXNudCBjaGFuZ2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJ30pO1xuICAgICAgbGV0IFtyZXEsIHJlc10gPSBidWlsZFJlcVJlcygnL2VsZW1lbnQvMjAwL3ZhbHVlJywgJ0dFVCcpO1xuICAgICAgYXdhaXQgai5wcm94eVJlcVJlcyhyZXEsIHJlcyk7XG4gICAgICByZXMuc2VudEJvZHkuc2hvdWxkLmVxbCh7c3RhdHVzOiAwLCB2YWx1ZTogJ2Zvb2JhcicsIHNlc3Npb25JZDogJzEyMyd9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJld3JpdGUgdGhlIGlubmVyIHNlc3Npb24gaWQgd2l0aCBzZXNzaW9uSWQgaW4gdXJsJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMyd9KTtcbiAgICAgIGxldCBbcmVxLCByZXNdID0gYnVpbGRSZXFSZXMoJy9zZXNzaW9uLzQ1Ni9lbGVtZW50LzIwMC92YWx1ZScsICdQT1NUJyk7XG4gICAgICBhd2FpdCBqLnByb3h5UmVxUmVzKHJlcSwgcmVzKTtcbiAgICAgIHJlcy5zZW50Qm9keS5zaG91bGQuZXFsKHtzdGF0dXM6IDAsIHZhbHVlOiAnZm9vYmFyJywgc2Vzc2lvbklkOiAnNDU2J30pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGFzcyB0aHJvdWdoIHVybHMgdGhhdCBkbyBub3QgcmVxdWlyZSBzZXNzaW9uIElEcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KHtzZXNzaW9uSWQ6ICcxMjMnfSk7XG4gICAgICBsZXQgW3JlcSwgcmVzXSA9IGJ1aWxkUmVxUmVzKCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgICAgYXdhaXQgai5wcm94eVJlcVJlcyhyZXEsIHJlcyk7XG4gICAgICByZXMuc2VudEJvZHkuc2hvdWxkLmVxbCh7c3RhdHVzOiAwLCB2YWx1ZTogeydmb28nOiAnYmFyJ319KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHByb3h5IHN0cmFuZ2UgcmVzcG9uc2VzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMyd9KTtcbiAgICAgIGxldCBbcmVxLCByZXNdID0gYnVpbGRSZXFSZXMoJy9ub2Nocm9tZScsICdHRVQnKTtcbiAgICAgIGF3YWl0IGoucHJveHlSZXFSZXMocmVxLCByZXMpO1xuICAgICAgcmVzLnNlbnRDb2RlLnNob3VsZC5lcXVhbCgxMDApO1xuICAgICAgcmVzLnNlbnRCb2R5LnNob3VsZC5lcWwoe3N0YXR1czogMCwgdmFsdWU6IHttZXNzYWdlOiAnY2hyb21lIG5vdCByZWFjaGFibGUnfX0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L2pzb253cC1wcm94eS9wcm94eS1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9