@appium/base-driver 8.5.7 → 8.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/basedriver/capabilities.js +2 -2
- package/build/lib/basedriver/commands/execute.d.ts +11 -0
- package/build/lib/basedriver/commands/execute.d.ts.map +1 -0
- package/build/lib/basedriver/commands/execute.js +62 -0
- package/build/lib/basedriver/commands/index.d.ts +1 -1
- package/build/lib/basedriver/commands/index.d.ts.map +1 -1
- package/build/lib/basedriver/commands/index.js +5 -2
- package/build/lib/basedriver/commands/log.js +2 -4
- package/build/lib/basedriver/core.d.ts +11 -0
- package/build/lib/basedriver/core.d.ts.map +1 -1
- package/build/lib/basedriver/core.js +6 -1
- package/build/lib/basedriver/helpers.js +2 -2
- package/build/lib/express/server.d.ts +70 -7
- package/build/lib/express/server.d.ts.map +1 -1
- package/build/lib/express/server.js +19 -16
- package/build/lib/express/websocket.d.ts +12 -30
- package/build/lib/express/websocket.d.ts.map +1 -1
- package/build/lib/express/websocket.js +6 -4
- package/build/lib/index.d.ts +12 -180
- package/build/lib/index.d.ts.map +1 -1
- package/build/lib/index.js +107 -80
- package/build/lib/jsonwp-proxy/protocol-converter.js +2 -4
- package/build/lib/jsonwp-proxy/proxy.js +3 -7
- package/build/lib/protocol/index.d.ts +3 -1
- package/build/lib/protocol/index.js +13 -1
- package/build/lib/protocol/protocol.d.ts +8 -4
- package/build/lib/protocol/protocol.d.ts.map +1 -1
- package/build/lib/protocol/protocol.js +7 -7
- package/build/lib/protocol/routes.js +2 -6
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/basedriver/commands/execute.js +65 -0
- package/lib/basedriver/commands/index.js +3 -1
- package/lib/basedriver/core.js +15 -0
- package/lib/express/server.js +126 -36
- package/lib/express/websocket.js +13 -11
- package/lib/index.js +19 -61
- package/lib/protocol/index.js +4 -0
- package/lib/protocol/protocol.js +10 -3
- package/package.json +17 -15
- package/build/test/basedriver/README.md +0 -5
- package/build/test/basedriver/driver-e2e-tests.js +0 -413
- package/build/test/basedriver/driver-tests.js +0 -572
- package/build/test/basedriver/index.js +0 -26
- package/build/test/e2e/basedriver/driver.e2e.spec.js +0 -15
- package/build/test/e2e/basedriver/helpers.e2e.spec.js +0 -192
- package/build/test/e2e/basedriver/websockets.e2e.spec.js +0 -87
- package/build/test/e2e/express/server.e2e.spec.js +0 -159
- package/build/test/e2e/jsonwp-proxy/proxy.e2e.spec.js +0 -59
- package/build/test/e2e/protocol/fake-driver.js +0 -163
- package/build/test/e2e/protocol/helpers.js +0 -25
- package/build/test/e2e/protocol/protocol.e2e.spec.js +0 -1186
- package/build/test/helpers.js +0 -55
- package/build/test/unit/basedriver/capabilities.spec.js +0 -672
- package/build/test/unit/basedriver/capability.spec.js +0 -353
- package/build/test/unit/basedriver/commands/event.spec.js +0 -110
- package/build/test/unit/basedriver/commands/log.spec.js +0 -92
- package/build/test/unit/basedriver/device-settings.spec.js +0 -97
- package/build/test/unit/basedriver/driver.spec.js +0 -15
- package/build/test/unit/basedriver/helpers.spec.js +0 -151
- package/build/test/unit/basedriver/timeout.spec.js +0 -135
- package/build/test/unit/express/server.spec.js +0 -155
- package/build/test/unit/express/static.spec.js +0 -26
- package/build/test/unit/jsonwp-proxy/mock-request.js +0 -91
- package/build/test/unit/jsonwp-proxy/protocol-converter.spec.js +0 -171
- package/build/test/unit/jsonwp-proxy/proxy.spec.js +0 -292
- package/build/test/unit/jsonwp-proxy/url.spec.js +0 -165
- package/build/test/unit/jsonwp-status/status.spec.js +0 -34
- package/build/test/unit/protocol/errors.spec.js +0 -390
- package/build/test/unit/protocol/routes.spec.js +0 -80
- package/build/test/unit/protocol/validator.spec.js +0 -149
- package/test/basedriver/README.md +0 -5
- package/test/basedriver/driver-e2e-tests.js +0 -386
- package/test/basedriver/driver-tests.js +0 -624
- package/test/basedriver/index.js +0 -6
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
Object.defineProperty(exports, "baseDriverE2ETests", {
|
|
9
|
-
enumerable: true,
|
|
10
|
-
get: function () {
|
|
11
|
-
return _driverE2eTests.default;
|
|
12
|
-
}
|
|
13
|
-
});
|
|
14
|
-
Object.defineProperty(exports, "baseDriverUnitTests", {
|
|
15
|
-
enumerable: true,
|
|
16
|
-
get: function () {
|
|
17
|
-
return _driverTests.default;
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
require("source-map-support/register");
|
|
22
|
-
|
|
23
|
-
var _driverTests = _interopRequireDefault(require("./driver-tests"));
|
|
24
|
-
|
|
25
|
-
var _driverE2eTests = _interopRequireDefault(require("./driver-e2e-tests"));
|
|
26
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9iYXNlZHJpdmVyL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptYWluXG5cbmltcG9ydCBiYXNlRHJpdmVyVW5pdFRlc3RzIGZyb20gJy4vZHJpdmVyLXRlc3RzJztcbmltcG9ydCBiYXNlRHJpdmVyRTJFVGVzdHMgZnJvbSAnLi9kcml2ZXItZTJlLXRlc3RzJztcblxuZXhwb3J0IHtiYXNlRHJpdmVyVW5pdFRlc3RzLCBiYXNlRHJpdmVyRTJFVGVzdHN9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0EifQ==
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _lib = _interopRequireDefault(require("../../../lib"));
|
|
8
|
-
|
|
9
|
-
var _driverE2eTests = _interopRequireDefault(require("../../basedriver/driver-e2e-tests"));
|
|
10
|
-
|
|
11
|
-
(0, _driverE2eTests.default)(_lib.default, {
|
|
12
|
-
platformName: 'iOS',
|
|
13
|
-
'appium:deviceName': 'Delorean'
|
|
14
|
-
});
|
|
15
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJiYXNlRHJpdmVyRTJFVGVzdHMiLCJCYXNlRHJpdmVyIiwicGxhdGZvcm1OYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9lMmUvYmFzZWRyaXZlci9kcml2ZXIuZTJlLnNwZWMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1vY2hhXG5cbmltcG9ydCBCYXNlRHJpdmVyIGZyb20gJy4uLy4uLy4uL2xpYic7XG5pbXBvcnQgYmFzZURyaXZlckUyRVRlc3RzIGZyb20gJy4uLy4uL2Jhc2Vkcml2ZXIvZHJpdmVyLWUyZS10ZXN0cyc7XG5iYXNlRHJpdmVyRTJFVGVzdHMoQmFzZURyaXZlciwge1xuICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBOztBQUNBOztBQUNBLElBQUFBLHVCQUFBLEVBQW1CQyxZQUFuQixFQUErQjtFQUM3QkMsWUFBWSxFQUFFLEtBRGU7RUFFN0IscUJBQXFCO0FBRlEsQ0FBL0IifQ==
|
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _path = _interopRequireDefault(require("path"));
|
|
8
|
-
|
|
9
|
-
var _url = _interopRequireDefault(require("url"));
|
|
10
|
-
|
|
11
|
-
var _support = require("@appium/support");
|
|
12
|
-
|
|
13
|
-
var _helpers = require("../../../lib/basedriver/helpers");
|
|
14
|
-
|
|
15
|
-
var _http = _interopRequireDefault(require("http"));
|
|
16
|
-
|
|
17
|
-
var _finalhandler = _interopRequireDefault(require("finalhandler"));
|
|
18
|
-
|
|
19
|
-
var _serveStatic = _interopRequireDefault(require("serve-static"));
|
|
20
|
-
|
|
21
|
-
var _contentDisposition = _interopRequireDefault(require("content-disposition"));
|
|
22
|
-
|
|
23
|
-
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
24
|
-
|
|
25
|
-
var _helpers2 = require("../../helpers");
|
|
26
|
-
|
|
27
|
-
function getFixture(file) {
|
|
28
|
-
return _path.default.resolve(__dirname, '..', 'fixtures', file);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
describe('app download and configuration', function () {
|
|
32
|
-
describe('configureApp', function () {
|
|
33
|
-
it('should get the path for a local .app', async function () {
|
|
34
|
-
let newAppPath = await (0, _helpers.configureApp)(getFixture('FakeIOSApp.app'), '.app');
|
|
35
|
-
newAppPath.should.contain('FakeIOSApp.app');
|
|
36
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
37
|
-
contents.should.eql('this is not really an app\n');
|
|
38
|
-
});
|
|
39
|
-
it('should get the path for a local .apk', async function () {
|
|
40
|
-
let newAppPath = await (0, _helpers.configureApp)(getFixture('FakeAndroidApp.apk'), '.apk');
|
|
41
|
-
newAppPath.should.contain('FakeAndroidApp.apk');
|
|
42
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
43
|
-
contents.should.eql('this is not really an apk\n');
|
|
44
|
-
});
|
|
45
|
-
it('should unzip and get the path for a local .app.zip', async function () {
|
|
46
|
-
let newAppPath = await (0, _helpers.configureApp)(getFixture('FakeIOSApp.app.zip'), '.app');
|
|
47
|
-
newAppPath.should.contain('FakeIOSApp.app');
|
|
48
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
49
|
-
contents.should.eql('this is not really an app\n');
|
|
50
|
-
});
|
|
51
|
-
it('should unzip and get the path for a local .ipa', async function () {
|
|
52
|
-
let newAppPath = await (0, _helpers.configureApp)(getFixture('FakeIOSApp.ipa'), '.app');
|
|
53
|
-
newAppPath.should.contain('FakeIOSApp.app');
|
|
54
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
55
|
-
contents.should.eql('this is not really an app\n');
|
|
56
|
-
});
|
|
57
|
-
it('should fail for a bad zip file', async function () {
|
|
58
|
-
await (0, _helpers.configureApp)(getFixture('BadZippedApp.zip'), '.app').should.be.rejectedWith(/PK/);
|
|
59
|
-
});
|
|
60
|
-
it('should fail if extensions do not match', async function () {
|
|
61
|
-
await (0, _helpers.configureApp)(getFixture('FakeIOSApp.app'), '.wrong').should.be.rejectedWith(/did not have extension/);
|
|
62
|
-
});
|
|
63
|
-
it('should fail if zip file does not contain an app whose extension matches', async function () {
|
|
64
|
-
await (0, _helpers.configureApp)(getFixture('FakeIOSApp.app.zip'), '.wrong').should.be.rejectedWith(/did not have extension/);
|
|
65
|
-
});
|
|
66
|
-
describe('should download an app from the web', function () {
|
|
67
|
-
let port;
|
|
68
|
-
let serverUrl;
|
|
69
|
-
before(async function () {
|
|
70
|
-
port = await (0, _helpers2.getTestPort)(true);
|
|
71
|
-
serverUrl = `http://${_helpers2.TEST_HOST}:${port}`;
|
|
72
|
-
});
|
|
73
|
-
describe('server not available', function () {
|
|
74
|
-
it('should handle server not available', async function () {
|
|
75
|
-
await (0, _helpers.configureApp)(`${serverUrl}/FakeIOSApp.app.zip`, '.app').should.eventually.be.rejectedWith(/ECONNREFUSED/);
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
describe('server available', function () {
|
|
79
|
-
let server;
|
|
80
|
-
before(function () {
|
|
81
|
-
const dir = _path.default.resolve(__dirname, '..', 'fixtures');
|
|
82
|
-
|
|
83
|
-
const serve = (0, _serveStatic.default)(dir, {
|
|
84
|
-
index: false,
|
|
85
|
-
setHeaders: (res, path) => {
|
|
86
|
-
res.setHeader('Content-Disposition', (0, _contentDisposition.default)(path));
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
server = _http.default.createServer(function (req, res) {
|
|
90
|
-
if (req.url.indexOf('missing') !== -1) {
|
|
91
|
-
res.writeHead(404);
|
|
92
|
-
res.end();
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const contentType = new URLSearchParams(_url.default.parse(req.url).search).get('content-type');
|
|
97
|
-
|
|
98
|
-
if (contentType !== null) {
|
|
99
|
-
res.setHeader('content-type', contentType);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
serve(req, res, (0, _finalhandler.default)(req, res));
|
|
103
|
-
});
|
|
104
|
-
const close = server.close.bind(server);
|
|
105
|
-
|
|
106
|
-
server.close = async function () {
|
|
107
|
-
await _bluebird.default.delay(1000);
|
|
108
|
-
return await new _bluebird.default((resolve, reject) => {
|
|
109
|
-
server.on('close', resolve);
|
|
110
|
-
close(err => {
|
|
111
|
-
if (err) reject(err);
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
server.listen(port);
|
|
117
|
-
});
|
|
118
|
-
after(async function () {
|
|
119
|
-
await server.close();
|
|
120
|
-
});
|
|
121
|
-
it('should download zip file', async function () {
|
|
122
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeIOSApp.app.zip`, '.app');
|
|
123
|
-
newAppPath.should.contain('FakeIOSApp.app');
|
|
124
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
125
|
-
contents.should.eql('this is not really an app\n');
|
|
126
|
-
});
|
|
127
|
-
it('should download zip file with query string', async function () {
|
|
128
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeIOSApp.app.zip?sv=abc&sr=def`, '.app');
|
|
129
|
-
newAppPath.should.contain('.app');
|
|
130
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
131
|
-
contents.should.eql('this is not really an app\n');
|
|
132
|
-
});
|
|
133
|
-
it('should download an app file', async function () {
|
|
134
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeIOSApp.app`, '.app');
|
|
135
|
-
newAppPath.should.contain('.app');
|
|
136
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
137
|
-
contents.should.eql('this is not really an app\n');
|
|
138
|
-
});
|
|
139
|
-
it('should accept multiple extensions', async function () {
|
|
140
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeIOSApp.app.zip`, ['.app', '.aab']);
|
|
141
|
-
newAppPath.should.contain('FakeIOSApp.app');
|
|
142
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
143
|
-
contents.should.eql('this is not really an app\n');
|
|
144
|
-
});
|
|
145
|
-
it('should download an apk file', async function () {
|
|
146
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeAndroidApp.apk`, '.apk');
|
|
147
|
-
newAppPath.should.contain('.apk');
|
|
148
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
149
|
-
contents.should.eql('this is not really an apk\n');
|
|
150
|
-
});
|
|
151
|
-
it('should handle zip file that cannot be downloaded', async function () {
|
|
152
|
-
await (0, _helpers.configureApp)(`${serverUrl}/missing/FakeIOSApp.app.zip`, '.app').should.eventually.be.rejected;
|
|
153
|
-
});
|
|
154
|
-
it('should handle invalid protocol', async function () {
|
|
155
|
-
await (0, _helpers.configureApp)('file://C:/missing/FakeIOSApp.app.zip', '.app').should.eventually.be.rejectedWith(/is not supported/);
|
|
156
|
-
await (0, _helpers.configureApp)(`ftp://${_helpers2.TEST_HOST}:${port}/missing/FakeIOSApp.app.zip`, '.app').should.eventually.be.rejectedWith(/is not supported/);
|
|
157
|
-
});
|
|
158
|
-
it('should handle missing file in Windows path format', async function () {
|
|
159
|
-
await (0, _helpers.configureApp)('C:\\missing\\FakeIOSApp.app.zip', '.app').should.eventually.be.rejectedWith(/does not exist or is not accessible/);
|
|
160
|
-
});
|
|
161
|
-
it('should recognize zip mime types and unzip the downloaded file', async function () {
|
|
162
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeAndroidApp.asd?content-type=${encodeURIComponent('application/zip')}`, '.apk');
|
|
163
|
-
newAppPath.should.contain('FakeAndroidApp.apk');
|
|
164
|
-
newAppPath.should.not.contain('.asd');
|
|
165
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
166
|
-
contents.should.eql('this is not really an apk\n');
|
|
167
|
-
});
|
|
168
|
-
it('should recognize zip mime types with parameter and unzip the downloaded file', async function () {
|
|
169
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeAndroidApp.asd?content-type=${encodeURIComponent('application/zip; parameter=value')}`, '.apk');
|
|
170
|
-
newAppPath.should.contain('FakeAndroidApp.apk');
|
|
171
|
-
newAppPath.should.not.contain('.asd');
|
|
172
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
173
|
-
contents.should.eql('this is not really an apk\n');
|
|
174
|
-
});
|
|
175
|
-
it('should recognize zip mime types and unzip the downloaded file with query string', async function () {
|
|
176
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeAndroidApp.asd?content-type=${encodeURIComponent('application/zip')}&sv=abc&sr=def`, '.apk');
|
|
177
|
-
newAppPath.should.contain('FakeAndroidApp.apk');
|
|
178
|
-
newAppPath.should.not.contain('.asd');
|
|
179
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
180
|
-
contents.should.eql('this is not really an apk\n');
|
|
181
|
-
});
|
|
182
|
-
it('should treat an unknown mime type as an app', async function () {
|
|
183
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeAndroidApp.apk?content-type=${encodeURIComponent('application/bip')}`, '.apk');
|
|
184
|
-
newAppPath.should.contain('.apk');
|
|
185
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
186
|
-
contents.should.eql('this is not really an apk\n');
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
});
|
|
192
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRGaXh0dXJlIiwiZmlsZSIsInBhdGgiLCJyZXNvbHZlIiwiX19kaXJuYW1lIiwiZGVzY3JpYmUiLCJpdCIsIm5ld0FwcFBhdGgiLCJjb25maWd1cmVBcHAiLCJzaG91bGQiLCJjb250YWluIiwiY29udGVudHMiLCJmcyIsInJlYWRGaWxlIiwiZXFsIiwiYmUiLCJyZWplY3RlZFdpdGgiLCJwb3J0Iiwic2VydmVyVXJsIiwiYmVmb3JlIiwiZ2V0VGVzdFBvcnQiLCJURVNUX0hPU1QiLCJldmVudHVhbGx5Iiwic2VydmVyIiwiZGlyIiwic2VydmUiLCJzZXJ2ZVN0YXRpYyIsImluZGV4Iiwic2V0SGVhZGVycyIsInJlcyIsInNldEhlYWRlciIsImNvbnRlbnREaXNwb3NpdGlvbiIsImh0dHAiLCJjcmVhdGVTZXJ2ZXIiLCJyZXEiLCJ1cmwiLCJpbmRleE9mIiwid3JpdGVIZWFkIiwiZW5kIiwiY29udGVudFR5cGUiLCJVUkxTZWFyY2hQYXJhbXMiLCJwYXJzZSIsInNlYXJjaCIsImdldCIsImZpbmFsaGFuZGxlciIsImNsb3NlIiwiYmluZCIsIkIiLCJkZWxheSIsInJlamVjdCIsIm9uIiwiZXJyIiwibGlzdGVuIiwiYWZ0ZXIiLCJyZWplY3RlZCIsImVuY29kZVVSSUNvbXBvbmVudCIsIm5vdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvZTJlL2Jhc2Vkcml2ZXIvaGVscGVycy5lMmUuc3BlYy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcbmltcG9ydCB7ZnN9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQge2NvbmZpZ3VyZUFwcH0gZnJvbSAnLi4vLi4vLi4vbGliL2Jhc2Vkcml2ZXIvaGVscGVycyc7XG5pbXBvcnQgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCBmaW5hbGhhbmRsZXIgZnJvbSAnZmluYWxoYW5kbGVyJztcbmltcG9ydCBzZXJ2ZVN0YXRpYyBmcm9tICdzZXJ2ZS1zdGF0aWMnO1xuaW1wb3J0IGNvbnRlbnREaXNwb3NpdGlvbiBmcm9tICdjb250ZW50LWRpc3Bvc2l0aW9uJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7VEVTVF9IT1NULCBnZXRUZXN0UG9ydH0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5cbmZ1bmN0aW9uIGdldEZpeHR1cmUoZmlsZSkge1xuICAvLyBYWFg6IF9fZGlybmFtZSBkaXNhbGxvd2VkIGluIG5hdGl2ZSBFU01cbiAgcmV0dXJuIHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLicsICdmaXh0dXJlcycsIGZpbGUpO1xufVxuXG5kZXNjcmliZSgnYXBwIGRvd25sb2FkIGFuZCBjb25maWd1cmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnY29uZmlndXJlQXBwJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZ2V0IHRoZSBwYXRoIGZvciBhIGxvY2FsIC5hcHAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgbmV3QXBwUGF0aCA9IGF3YWl0IGNvbmZpZ3VyZUFwcChnZXRGaXh0dXJlKCdGYWtlSU9TQXBwLmFwcCcpLCAnLmFwcCcpO1xuICAgICAgbmV3QXBwUGF0aC5zaG91bGQuY29udGFpbignRmFrZUlPU0FwcC5hcHAnKTtcbiAgICAgIGxldCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKG5ld0FwcFBhdGgsICd1dGY4Jyk7XG4gICAgICBjb250ZW50cy5zaG91bGQuZXFsKCd0aGlzIGlzIG5vdCByZWFsbHkgYW4gYXBwXFxuJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBnZXQgdGhlIHBhdGggZm9yIGEgbG9jYWwgLmFwaycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBuZXdBcHBQYXRoID0gYXdhaXQgY29uZmlndXJlQXBwKGdldEZpeHR1cmUoJ0Zha2VBbmRyb2lkQXBwLmFwaycpLCAnLmFwaycpO1xuICAgICAgbmV3QXBwUGF0aC5zaG91bGQuY29udGFpbignRmFrZUFuZHJvaWRBcHAuYXBrJyk7XG4gICAgICBsZXQgY29udGVudHMgPSBhd2FpdCBmcy5yZWFkRmlsZShuZXdBcHBQYXRoLCAndXRmOCcpO1xuICAgICAgY29udGVudHMuc2hvdWxkLmVxbCgndGhpcyBpcyBub3QgcmVhbGx5IGFuIGFwa1xcbicpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdW56aXAgYW5kIGdldCB0aGUgcGF0aCBmb3IgYSBsb2NhbCAuYXBwLnppcCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBuZXdBcHBQYXRoID0gYXdhaXQgY29uZmlndXJlQXBwKGdldEZpeHR1cmUoJ0Zha2VJT1NBcHAuYXBwLnppcCcpLCAnLmFwcCcpO1xuICAgICAgbmV3QXBwUGF0aC5zaG91bGQuY29udGFpbignRmFrZUlPU0FwcC5hcHAnKTtcbiAgICAgIGxldCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKG5ld0FwcFBhdGgsICd1dGY4Jyk7XG4gICAgICBjb250ZW50cy5zaG91bGQuZXFsKCd0aGlzIGlzIG5vdCByZWFsbHkgYW4gYXBwXFxuJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB1bnppcCBhbmQgZ2V0IHRoZSBwYXRoIGZvciBhIGxvY2FsIC5pcGEnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgbmV3QXBwUGF0aCA9IGF3YWl0IGNvbmZpZ3VyZUFwcChnZXRGaXh0dXJlKCdGYWtlSU9TQXBwLmlwYScpLCAnLmFwcCcpO1xuICAgICAgbmV3QXBwUGF0aC5zaG91bGQuY29udGFpbignRmFrZUlPU0FwcC5hcHAnKTtcbiAgICAgIGxldCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKG5ld0FwcFBhdGgsICd1dGY4Jyk7XG4gICAgICBjb250ZW50cy5zaG91bGQuZXFsKCd0aGlzIGlzIG5vdCByZWFsbHkgYW4gYXBwXFxuJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBhIGJhZCB6aXAgZmlsZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGNvbmZpZ3VyZUFwcChnZXRGaXh0dXJlKCdCYWRaaXBwZWRBcHAuemlwJyksICcuYXBwJykuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvUEsvKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgZXh0ZW5zaW9ucyBkbyBub3QgbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBjb25maWd1cmVBcHAoZ2V0Rml4dHVyZSgnRmFrZUlPU0FwcC5hcHAnKSwgJy53cm9uZycpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgIC9kaWQgbm90IGhhdmUgZXh0ZW5zaW9uL1xuICAgICAgKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgemlwIGZpbGUgZG9lcyBub3QgY29udGFpbiBhbiBhcHAgd2hvc2UgZXh0ZW5zaW9uIG1hdGNoZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBjb25maWd1cmVBcHAoZ2V0Rml4dHVyZSgnRmFrZUlPU0FwcC5hcHAuemlwJyksICcud3JvbmcnKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAvZGlkIG5vdCBoYXZlIGV4dGVuc2lvbi9cbiAgICAgICk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ3Nob3VsZCBkb3dubG9hZCBhbiBhcHAgZnJvbSB0aGUgd2ViJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IHBvcnQ7XG4gICAgICBsZXQgc2VydmVyVXJsO1xuXG4gICAgICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBwb3J0ID0gYXdhaXQgZ2V0VGVzdFBvcnQodHJ1ZSk7XG4gICAgICAgIHNlcnZlclVybCA9IGBodHRwOi8vJHtURVNUX0hPU1R9OiR7cG9ydH1gO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdzZXJ2ZXIgbm90IGF2YWlsYWJsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgc2VydmVyIG5vdCBhdmFpbGFibGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgY29uZmlndXJlQXBwKFxuICAgICAgICAgICAgYCR7c2VydmVyVXJsfS9GYWtlSU9TQXBwLmFwcC56aXBgLFxuICAgICAgICAgICAgJy5hcHAnXG4gICAgICAgICAgKS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL0VDT05OUkVGVVNFRC8pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgZGVzY3JpYmUoJ3NlcnZlciBhdmFpbGFibGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHVzZSBhIGxvY2FsIHNlcnZlciBzbyB0aGVyZSBpcyBubyBkZXBlbmRlbmN5IG9uIHRoZSBpbnRlcm5ldFxuICAgICAgICBsZXQgc2VydmVyO1xuICAgICAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IGRpciA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLicsICdmaXh0dXJlcycpO1xuICAgICAgICAgIGNvbnN0IHNlcnZlID0gc2VydmVTdGF0aWMoZGlyLCB7XG4gICAgICAgICAgICBpbmRleDogZmFsc2UsXG4gICAgICAgICAgICBzZXRIZWFkZXJzOiAocmVzLCBwYXRoKSA9PiB7XG4gICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCBjb250ZW50RGlzcG9zaXRpb24ocGF0aCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGZ1bmN0aW9uIChyZXEsIHJlcykge1xuICAgICAgICAgICAgaWYgKHJlcS51cmwuaW5kZXhPZignbWlzc2luZycpICE9PSAtMSkge1xuICAgICAgICAgICAgICByZXMud3JpdGVIZWFkKDQwNCk7XG4gICAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZm9yIHRlc3RpbmcgemlwIGZpbGUgY29udGVudCB0eXBlc1xuICAgICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5wYXJzZShyZXEudXJsKS5zZWFyY2gpLmdldCgnY29udGVudC10eXBlJyk7XG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcignY29udGVudC10eXBlJywgY29udGVudFR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VydmUocmVxLCByZXMsIGZpbmFsaGFuZGxlcihyZXEsIHJlcykpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGNsb3NlID0gc2VydmVyLmNsb3NlLmJpbmQoc2VydmVyKTtcbiAgICAgICAgICBzZXJ2ZXIuY2xvc2UgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBwYXVzZSBhIG1vbWVudCBvciB3ZSBnZXQgRUNPTlJFU0VUIGVycm9yc1xuICAgICAgICAgICAgYXdhaXQgQi5kZWxheSgxMDAwKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgIHNlcnZlci5vbignY2xvc2UnLCByZXNvbHZlKTtcbiAgICAgICAgICAgICAgY2xvc2UoKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzZXJ2ZXIubGlzdGVuKHBvcnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGRvd25sb2FkIHppcCBmaWxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxldCBuZXdBcHBQYXRoID0gYXdhaXQgY29uZmlndXJlQXBwKGAke3NlcnZlclVybH0vRmFrZUlPU0FwcC5hcHAuemlwYCwgJy5hcHAnKTtcbiAgICAgICAgICBuZXdBcHBQYXRoLnNob3VsZC5jb250YWluKCdGYWtlSU9TQXBwLmFwcCcpO1xuICAgICAgICAgIGxldCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKG5ld0FwcFBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgY29udGVudHMuc2hvdWxkLmVxbCgndGhpcyBpcyBub3QgcmVhbGx5IGFuIGFwcFxcbicpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBkb3dubG9hZCB6aXAgZmlsZSB3aXRoIHF1ZXJ5IHN0cmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBsZXQgbmV3QXBwUGF0aCA9IGF3YWl0IGNvbmZpZ3VyZUFwcChcbiAgICAgICAgICAgIGAke3NlcnZlclVybH0vRmFrZUlPU0FwcC5hcHAuemlwP3N2PWFiYyZzcj1kZWZgLFxuICAgICAgICAgICAgJy5hcHAnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBuZXdBcHBQYXRoLnNob3VsZC5jb250YWluKCcuYXBwJyk7XG4gICAgICAgICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgZnMucmVhZEZpbGUobmV3QXBwUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgICBjb250ZW50cy5zaG91bGQuZXFsKCd0aGlzIGlzIG5vdCByZWFsbHkgYW4gYXBwXFxuJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIGRvd25sb2FkIGFuIGFwcCBmaWxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxldCBuZXdBcHBQYXRoID0gYXdhaXQgY29uZmlndXJlQXBwKGAke3NlcnZlclVybH0vRmFrZUlPU0FwcC5hcHBgLCAnLmFwcCcpO1xuICAgICAgICAgIG5ld0FwcFBhdGguc2hvdWxkLmNvbnRhaW4oJy5hcHAnKTtcbiAgICAgICAgICBsZXQgY29udGVudHMgPSBhd2FpdCBmcy5yZWFkRmlsZShuZXdBcHBQYXRoLCAndXRmOCcpO1xuICAgICAgICAgIGNvbnRlbnRzLnNob3VsZC5lcWwoJ3RoaXMgaXMgbm90IHJlYWxseSBhbiBhcHBcXG4nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgYWNjZXB0IG11bHRpcGxlIGV4dGVuc2lvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgbGV0IG5ld0FwcFBhdGggPSBhd2FpdCBjb25maWd1cmVBcHAoYCR7c2VydmVyVXJsfS9GYWtlSU9TQXBwLmFwcC56aXBgLCBbJy5hcHAnLCAnLmFhYiddKTtcbiAgICAgICAgICBuZXdBcHBQYXRoLnNob3VsZC5jb250YWluKCdGYWtlSU9TQXBwLmFwcCcpO1xuICAgICAgICAgIGxldCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKG5ld0FwcFBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgY29udGVudHMuc2hvdWxkLmVxbCgndGhpcyBpcyBub3QgcmVhbGx5IGFuIGFwcFxcbicpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBkb3dubG9hZCBhbiBhcGsgZmlsZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBsZXQgbmV3QXBwUGF0aCA9IGF3YWl0IGNvbmZpZ3VyZUFwcChgJHtzZXJ2ZXJVcmx9L0Zha2VBbmRyb2lkQXBwLmFwa2AsICcuYXBrJyk7XG4gICAgICAgICAgbmV3QXBwUGF0aC5zaG91bGQuY29udGFpbignLmFwaycpO1xuICAgICAgICAgIGxldCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKG5ld0FwcFBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgY29udGVudHMuc2hvdWxkLmVxbCgndGhpcyBpcyBub3QgcmVhbGx5IGFuIGFwa1xcbicpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgemlwIGZpbGUgdGhhdCBjYW5ub3QgYmUgZG93bmxvYWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBhd2FpdCBjb25maWd1cmVBcHAoYCR7c2VydmVyVXJsfS9taXNzaW5nL0Zha2VJT1NBcHAuYXBwLnppcGAsICcuYXBwJykuc2hvdWxkLmV2ZW50dWFsbHkuYmVcbiAgICAgICAgICAgIC5yZWplY3RlZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIGludmFsaWQgcHJvdG9jb2wnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgY29uZmlndXJlQXBwKFxuICAgICAgICAgICAgJ2ZpbGU6Ly9DOi9taXNzaW5nL0Zha2VJT1NBcHAuYXBwLnppcCcsXG4gICAgICAgICAgICAnLmFwcCdcbiAgICAgICAgICApLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgvaXMgbm90IHN1cHBvcnRlZC8pO1xuICAgICAgICAgIGF3YWl0IGNvbmZpZ3VyZUFwcChcbiAgICAgICAgICAgIGBmdHA6Ly8ke1RFU1RfSE9TVH06JHtwb3J0fS9taXNzaW5nL0Zha2VJT1NBcHAuYXBwLnppcGAsXG4gICAgICAgICAgICAnLmFwcCdcbiAgICAgICAgICApLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgvaXMgbm90IHN1cHBvcnRlZC8pO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbWlzc2luZyBmaWxlIGluIFdpbmRvd3MgcGF0aCBmb3JtYXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgY29uZmlndXJlQXBwKFxuICAgICAgICAgICAgJ0M6XFxcXG1pc3NpbmdcXFxcRmFrZUlPU0FwcC5hcHAuemlwJyxcbiAgICAgICAgICAgICcuYXBwJ1xuICAgICAgICAgICkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9kb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYWNjZXNzaWJsZS8pO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCByZWNvZ25pemUgemlwIG1pbWUgdHlwZXMgYW5kIHVuemlwIHRoZSBkb3dubG9hZGVkIGZpbGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgbGV0IG5ld0FwcFBhdGggPSBhd2FpdCBjb25maWd1cmVBcHAoXG4gICAgICAgICAgICBgJHtzZXJ2ZXJVcmx9L0Zha2VBbmRyb2lkQXBwLmFzZD9jb250ZW50LXR5cGU9JHtlbmNvZGVVUklDb21wb25lbnQoJ2FwcGxpY2F0aW9uL3ppcCcpfWAsXG4gICAgICAgICAgICAnLmFwaydcbiAgICAgICAgICApO1xuICAgICAgICAgIG5ld0FwcFBhdGguc2hvdWxkLmNvbnRhaW4oJ0Zha2VBbmRyb2lkQXBwLmFwaycpO1xuICAgICAgICAgIG5ld0FwcFBhdGguc2hvdWxkLm5vdC5jb250YWluKCcuYXNkJyk7XG4gICAgICAgICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgZnMucmVhZEZpbGUobmV3QXBwUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgICBjb250ZW50cy5zaG91bGQuZXFsKCd0aGlzIGlzIG5vdCByZWFsbHkgYW4gYXBrXFxuJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIHJlY29nbml6ZSB6aXAgbWltZSB0eXBlcyB3aXRoIHBhcmFtZXRlciBhbmQgdW56aXAgdGhlIGRvd25sb2FkZWQgZmlsZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBsZXQgbmV3QXBwUGF0aCA9IGF3YWl0IGNvbmZpZ3VyZUFwcChcbiAgICAgICAgICAgIGAke3NlcnZlclVybH0vRmFrZUFuZHJvaWRBcHAuYXNkP2NvbnRlbnQtdHlwZT0ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL3ppcDsgcGFyYW1ldGVyPXZhbHVlJ1xuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICAgJy5hcGsnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBuZXdBcHBQYXRoLnNob3VsZC5jb250YWluKCdGYWtlQW5kcm9pZEFwcC5hcGsnKTtcbiAgICAgICAgICBuZXdBcHBQYXRoLnNob3VsZC5ub3QuY29udGFpbignLmFzZCcpO1xuICAgICAgICAgIGxldCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKG5ld0FwcFBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgY29udGVudHMuc2hvdWxkLmVxbCgndGhpcyBpcyBub3QgcmVhbGx5IGFuIGFwa1xcbicpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCByZWNvZ25pemUgemlwIG1pbWUgdHlwZXMgYW5kIHVuemlwIHRoZSBkb3dubG9hZGVkIGZpbGUgd2l0aCBxdWVyeSBzdHJpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgbGV0IG5ld0FwcFBhdGggPSBhd2FpdCBjb25maWd1cmVBcHAoXG4gICAgICAgICAgICBgJHtzZXJ2ZXJVcmx9L0Zha2VBbmRyb2lkQXBwLmFzZD9jb250ZW50LXR5cGU9JHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICAgICAgICAgICdhcHBsaWNhdGlvbi96aXAnXG4gICAgICAgICAgICApfSZzdj1hYmMmc3I9ZGVmYCxcbiAgICAgICAgICAgICcuYXBrJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgbmV3QXBwUGF0aC5zaG91bGQuY29udGFpbignRmFrZUFuZHJvaWRBcHAuYXBrJyk7XG4gICAgICAgICAgbmV3QXBwUGF0aC5zaG91bGQubm90LmNvbnRhaW4oJy5hc2QnKTtcbiAgICAgICAgICBsZXQgY29udGVudHMgPSBhd2FpdCBmcy5yZWFkRmlsZShuZXdBcHBQYXRoLCAndXRmOCcpO1xuICAgICAgICAgIGNvbnRlbnRzLnNob3VsZC5lcWwoJ3RoaXMgaXMgbm90IHJlYWxseSBhbiBhcGtcXG4nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgdHJlYXQgYW4gdW5rbm93biBtaW1lIHR5cGUgYXMgYW4gYXBwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxldCBuZXdBcHBQYXRoID0gYXdhaXQgY29uZmlndXJlQXBwKFxuICAgICAgICAgICAgYCR7c2VydmVyVXJsfS9GYWtlQW5kcm9pZEFwcC5hcGs/Y29udGVudC10eXBlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KCdhcHBsaWNhdGlvbi9iaXAnKX1gLFxuICAgICAgICAgICAgJy5hcGsnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBuZXdBcHBQYXRoLnNob3VsZC5jb250YWluKCcuYXBrJyk7XG4gICAgICAgICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgZnMucmVhZEZpbGUobmV3QXBwUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgICBjb250ZW50cy5zaG91bGQuZXFsKCd0aGlzIGlzIG5vdCByZWFsbHkgYW4gYXBrXFxuJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLFNBQVNBLFVBQVQsQ0FBb0JDLElBQXBCLEVBQTBCO0VBRXhCLE9BQU9DLGFBQUEsQ0FBS0MsT0FBTCxDQUFhQyxTQUFiLEVBQXdCLElBQXhCLEVBQThCLFVBQTlCLEVBQTBDSCxJQUExQyxDQUFQO0FBQ0Q7O0FBRURJLFFBQVEsQ0FBQyxnQ0FBRCxFQUFtQyxZQUFZO0VBQ3JEQSxRQUFRLENBQUMsY0FBRCxFQUFpQixZQUFZO0lBQ25DQyxFQUFFLENBQUMsc0NBQUQsRUFBeUMsa0JBQWtCO01BQzNELElBQUlDLFVBQVUsR0FBRyxNQUFNLElBQUFDLHFCQUFBLEVBQWFSLFVBQVUsQ0FBQyxnQkFBRCxDQUF2QixFQUEyQyxNQUEzQyxDQUF2QjtNQUNBTyxVQUFVLENBQUNFLE1BQVgsQ0FBa0JDLE9BQWxCLENBQTBCLGdCQUExQjtNQUNBLElBQUlDLFFBQVEsR0FBRyxNQUFNQyxXQUFBLENBQUdDLFFBQUgsQ0FBWU4sVUFBWixFQUF3QixNQUF4QixDQUFyQjtNQUNBSSxRQUFRLENBQUNGLE1BQVQsQ0FBZ0JLLEdBQWhCLENBQW9CLDZCQUFwQjtJQUNELENBTEMsQ0FBRjtJQU1BUixFQUFFLENBQUMsc0NBQUQsRUFBeUMsa0JBQWtCO01BQzNELElBQUlDLFVBQVUsR0FBRyxNQUFNLElBQUFDLHFCQUFBLEVBQWFSLFVBQVUsQ0FBQyxvQkFBRCxDQUF2QixFQUErQyxNQUEvQyxDQUF2QjtNQUNBTyxVQUFVLENBQUNFLE1BQVgsQ0FBa0JDLE9BQWxCLENBQTBCLG9CQUExQjtNQUNBLElBQUlDLFFBQVEsR0FBRyxNQUFNQyxXQUFBLENBQUdDLFFBQUgsQ0FBWU4sVUFBWixFQUF3QixNQUF4QixDQUFyQjtNQUNBSSxRQUFRLENBQUNGLE1BQVQsQ0FBZ0JLLEdBQWhCLENBQW9CLDZCQUFwQjtJQUNELENBTEMsQ0FBRjtJQU1BUixFQUFFLENBQUMsb0RBQUQsRUFBdUQsa0JBQWtCO01BQ3pFLElBQUlDLFVBQVUsR0FBRyxNQUFNLElBQUFDLHFCQUFBLEVBQWFSLFVBQVUsQ0FBQyxvQkFBRCxDQUF2QixFQUErQyxNQUEvQyxDQUF2QjtNQUNBTyxVQUFVLENBQUNFLE1BQVgsQ0FBa0JDLE9BQWxCLENBQTBCLGdCQUExQjtNQUNBLElBQUlDLFFBQVEsR0FBRyxNQUFNQyxXQUFBLENBQUdDLFFBQUgsQ0FBWU4sVUFBWixFQUF3QixNQUF4QixDQUFyQjtNQUNBSSxRQUFRLENBQUNGLE1BQVQsQ0FBZ0JLLEdBQWhCLENBQW9CLDZCQUFwQjtJQUNELENBTEMsQ0FBRjtJQU1BUixFQUFFLENBQUMsZ0RBQUQsRUFBbUQsa0JBQWtCO01BQ3JFLElBQUlDLFVBQVUsR0FBRyxNQUFNLElBQUFDLHFCQUFBLEVBQWFSLFVBQVUsQ0FBQyxnQkFBRCxDQUF2QixFQUEyQyxNQUEzQyxDQUF2QjtNQUNBTyxVQUFVLENBQUNFLE1BQVgsQ0FBa0JDLE9BQWxCLENBQTBCLGdCQUExQjtNQUNBLElBQUlDLFFBQVEsR0FBRyxNQUFNQyxXQUFBLENBQUdDLFFBQUgsQ0FBWU4sVUFBWixFQUF3QixNQUF4QixDQUFyQjtNQUNBSSxRQUFRLENBQUNGLE1BQVQsQ0FBZ0JLLEdBQWhCLENBQW9CLDZCQUFwQjtJQUNELENBTEMsQ0FBRjtJQU1BUixFQUFFLENBQUMsZ0NBQUQsRUFBbUMsa0JBQWtCO01BQ3JELE1BQU0sSUFBQUUscUJBQUEsRUFBYVIsVUFBVSxDQUFDLGtCQUFELENBQXZCLEVBQTZDLE1BQTdDLEVBQXFEUyxNQUFyRCxDQUE0RE0sRUFBNUQsQ0FBK0RDLFlBQS9ELENBQTRFLElBQTVFLENBQU47SUFDRCxDQUZDLENBQUY7SUFHQVYsRUFBRSxDQUFDLHdDQUFELEVBQTJDLGtCQUFrQjtNQUM3RCxNQUFNLElBQUFFLHFCQUFBLEVBQWFSLFVBQVUsQ0FBQyxnQkFBRCxDQUF2QixFQUEyQyxRQUEzQyxFQUFxRFMsTUFBckQsQ0FBNERNLEVBQTVELENBQStEQyxZQUEvRCxDQUNKLHdCQURJLENBQU47SUFHRCxDQUpDLENBQUY7SUFLQVYsRUFBRSxDQUFDLHlFQUFELEVBQTRFLGtCQUFrQjtNQUM5RixNQUFNLElBQUFFLHFCQUFBLEVBQWFSLFVBQVUsQ0FBQyxvQkFBRCxDQUF2QixFQUErQyxRQUEvQyxFQUF5RFMsTUFBekQsQ0FBZ0VNLEVBQWhFLENBQW1FQyxZQUFuRSxDQUNKLHdCQURJLENBQU47SUFHRCxDQUpDLENBQUY7SUFLQVgsUUFBUSxDQUFDLHFDQUFELEVBQXdDLFlBQVk7TUFDMUQsSUFBSVksSUFBSjtNQUNBLElBQUlDLFNBQUo7TUFFQUMsTUFBTSxDQUFDLGtCQUFrQjtRQUN2QkYsSUFBSSxHQUFHLE1BQU0sSUFBQUcscUJBQUEsRUFBWSxJQUFaLENBQWI7UUFDQUYsU0FBUyxHQUFJLFVBQVNHLG1CQUFVLElBQUdKLElBQUssRUFBeEM7TUFDRCxDQUhLLENBQU47TUFLQVosUUFBUSxDQUFDLHNCQUFELEVBQXlCLFlBQVk7UUFDM0NDLEVBQUUsQ0FBQyxvQ0FBRCxFQUF1QyxrQkFBa0I7VUFDekQsTUFBTSxJQUFBRSxxQkFBQSxFQUNILEdBQUVVLFNBQVUscUJBRFQsRUFFSixNQUZJLEVBR0pULE1BSEksQ0FHR2EsVUFISCxDQUdjUCxFQUhkLENBR2lCQyxZQUhqQixDQUc4QixjQUg5QixDQUFOO1FBSUQsQ0FMQyxDQUFGO01BTUQsQ0FQTyxDQUFSO01BUUFYLFFBQVEsQ0FBQyxrQkFBRCxFQUFxQixZQUFZO1FBRXZDLElBQUlrQixNQUFKO1FBQ0FKLE1BQU0sQ0FBQyxZQUFZO1VBQ2pCLE1BQU1LLEdBQUcsR0FBR3RCLGFBQUEsQ0FBS0MsT0FBTCxDQUFhQyxTQUFiLEVBQXdCLElBQXhCLEVBQThCLFVBQTlCLENBQVo7O1VBQ0EsTUFBTXFCLEtBQUssR0FBRyxJQUFBQyxvQkFBQSxFQUFZRixHQUFaLEVBQWlCO1lBQzdCRyxLQUFLLEVBQUUsS0FEc0I7WUFFN0JDLFVBQVUsRUFBRSxDQUFDQyxHQUFELEVBQU0zQixJQUFOLEtBQWU7Y0FDekIyQixHQUFHLENBQUNDLFNBQUosQ0FBYyxxQkFBZCxFQUFxQyxJQUFBQywyQkFBQSxFQUFtQjdCLElBQW5CLENBQXJDO1lBQ0Q7VUFKNEIsQ0FBakIsQ0FBZDtVQU9BcUIsTUFBTSxHQUFHUyxhQUFBLENBQUtDLFlBQUwsQ0FBa0IsVUFBVUMsR0FBVixFQUFlTCxHQUFmLEVBQW9CO1lBQzdDLElBQUlLLEdBQUcsQ0FBQ0MsR0FBSixDQUFRQyxPQUFSLENBQWdCLFNBQWhCLE1BQStCLENBQUMsQ0FBcEMsRUFBdUM7Y0FDckNQLEdBQUcsQ0FBQ1EsU0FBSixDQUFjLEdBQWQ7Y0FDQVIsR0FBRyxDQUFDUyxHQUFKO2NBQ0E7WUFDRDs7WUFFRCxNQUFNQyxXQUFXLEdBQUcsSUFBSUMsZUFBSixDQUFvQkwsWUFBQSxDQUFJTSxLQUFKLENBQVVQLEdBQUcsQ0FBQ0MsR0FBZCxFQUFtQk8sTUFBdkMsRUFBK0NDLEdBQS9DLENBQW1ELGNBQW5ELENBQXBCOztZQUNBLElBQUlKLFdBQVcsS0FBSyxJQUFwQixFQUEwQjtjQUN4QlYsR0FBRyxDQUFDQyxTQUFKLENBQWMsY0FBZCxFQUE4QlMsV0FBOUI7WUFDRDs7WUFDRGQsS0FBSyxDQUFDUyxHQUFELEVBQU1MLEdBQU4sRUFBVyxJQUFBZSxxQkFBQSxFQUFhVixHQUFiLEVBQWtCTCxHQUFsQixDQUFYLENBQUw7VUFDRCxDQVpRLENBQVQ7VUFhQSxNQUFNZ0IsS0FBSyxHQUFHdEIsTUFBTSxDQUFDc0IsS0FBUCxDQUFhQyxJQUFiLENBQWtCdkIsTUFBbEIsQ0FBZDs7VUFDQUEsTUFBTSxDQUFDc0IsS0FBUCxHQUFlLGtCQUFrQjtZQUUvQixNQUFNRSxpQkFBQSxDQUFFQyxLQUFGLENBQVEsSUFBUixDQUFOO1lBQ0EsT0FBTyxNQUFNLElBQUlELGlCQUFKLENBQU0sQ0FBQzVDLE9BQUQsRUFBVThDLE1BQVYsS0FBcUI7Y0FDdEMxQixNQUFNLENBQUMyQixFQUFQLENBQVUsT0FBVixFQUFtQi9DLE9BQW5CO2NBQ0EwQyxLQUFLLENBQUVNLEdBQUQsSUFBUztnQkFDYixJQUFJQSxHQUFKLEVBQVNGLE1BQU0sQ0FBQ0UsR0FBRCxDQUFOO2NBQ1YsQ0FGSSxDQUFMO1lBR0QsQ0FMWSxDQUFiO1VBTUQsQ0FURDs7VUFVQTVCLE1BQU0sQ0FBQzZCLE1BQVAsQ0FBY25DLElBQWQ7UUFDRCxDQWxDSyxDQUFOO1FBbUNBb0MsS0FBSyxDQUFDLGtCQUFrQjtVQUN0QixNQUFNOUIsTUFBTSxDQUFDc0IsS0FBUCxFQUFOO1FBQ0QsQ0FGSSxDQUFMO1FBSUF2QyxFQUFFLENBQUMsMEJBQUQsRUFBNkIsa0JBQWtCO1VBQy9DLElBQUlDLFVBQVUsR0FBRyxNQUFNLElBQUFDLHFCQUFBLEVBQWMsR0FBRVUsU0FBVSxxQkFBMUIsRUFBZ0QsTUFBaEQsQ0FBdkI7VUFDQVgsVUFBVSxDQUFDRSxNQUFYLENBQWtCQyxPQUFsQixDQUEwQixnQkFBMUI7VUFDQSxJQUFJQyxRQUFRLEdBQUcsTUFBTUMsV0FBQSxDQUFHQyxRQUFILENBQVlOLFVBQVosRUFBd0IsTUFBeEIsQ0FBckI7VUFDQUksUUFBUSxDQUFDRixNQUFULENBQWdCSyxHQUFoQixDQUFvQiw2QkFBcEI7UUFDRCxDQUxDLENBQUY7UUFNQVIsRUFBRSxDQUFDLDRDQUFELEVBQStDLGtCQUFrQjtVQUNqRSxJQUFJQyxVQUFVLEdBQUcsTUFBTSxJQUFBQyxxQkFBQSxFQUNwQixHQUFFVSxTQUFVLG1DQURRLEVBRXJCLE1BRnFCLENBQXZCO1VBSUFYLFVBQVUsQ0FBQ0UsTUFBWCxDQUFrQkMsT0FBbEIsQ0FBMEIsTUFBMUI7VUFDQSxJQUFJQyxRQUFRLEdBQUcsTUFBTUMsV0FBQSxDQUFHQyxRQUFILENBQVlOLFVBQVosRUFBd0IsTUFBeEIsQ0FBckI7VUFDQUksUUFBUSxDQUFDRixNQUFULENBQWdCSyxHQUFoQixDQUFvQiw2QkFBcEI7UUFDRCxDQVJDLENBQUY7UUFTQVIsRUFBRSxDQUFDLDZCQUFELEVBQWdDLGtCQUFrQjtVQUNsRCxJQUFJQyxVQUFVLEdBQUcsTUFBTSxJQUFBQyxxQkFBQSxFQUFjLEdBQUVVLFNBQVUsaUJBQTFCLEVBQTRDLE1BQTVDLENBQXZCO1VBQ0FYLFVBQVUsQ0FBQ0UsTUFBWCxDQUFrQkMsT0FBbEIsQ0FBMEIsTUFBMUI7VUFDQSxJQUFJQyxRQUFRLEdBQUcsTUFBTUMsV0FBQSxDQUFHQyxRQUFILENBQVlOLFVBQVosRUFBd0IsTUFBeEIsQ0FBckI7VUFDQUksUUFBUSxDQUFDRixNQUFULENBQWdCSyxHQUFoQixDQUFvQiw2QkFBcEI7UUFDRCxDQUxDLENBQUY7UUFNQVIsRUFBRSxDQUFDLG1DQUFELEVBQXNDLGtCQUFrQjtVQUN4RCxJQUFJQyxVQUFVLEdBQUcsTUFBTSxJQUFBQyxxQkFBQSxFQUFjLEdBQUVVLFNBQVUscUJBQTFCLEVBQWdELENBQUMsTUFBRCxFQUFTLE1BQVQsQ0FBaEQsQ0FBdkI7VUFDQVgsVUFBVSxDQUFDRSxNQUFYLENBQWtCQyxPQUFsQixDQUEwQixnQkFBMUI7VUFDQSxJQUFJQyxRQUFRLEdBQUcsTUFBTUMsV0FBQSxDQUFHQyxRQUFILENBQVlOLFVBQVosRUFBd0IsTUFBeEIsQ0FBckI7VUFDQUksUUFBUSxDQUFDRixNQUFULENBQWdCSyxHQUFoQixDQUFvQiw2QkFBcEI7UUFDRCxDQUxDLENBQUY7UUFNQVIsRUFBRSxDQUFDLDZCQUFELEVBQWdDLGtCQUFrQjtVQUNsRCxJQUFJQyxVQUFVLEdBQUcsTUFBTSxJQUFBQyxxQkFBQSxFQUFjLEdBQUVVLFNBQVUscUJBQTFCLEVBQWdELE1BQWhELENBQXZCO1VBQ0FYLFVBQVUsQ0FBQ0UsTUFBWCxDQUFrQkMsT0FBbEIsQ0FBMEIsTUFBMUI7VUFDQSxJQUFJQyxRQUFRLEdBQUcsTUFBTUMsV0FBQSxDQUFHQyxRQUFILENBQVlOLFVBQVosRUFBd0IsTUFBeEIsQ0FBckI7VUFDQUksUUFBUSxDQUFDRixNQUFULENBQWdCSyxHQUFoQixDQUFvQiw2QkFBcEI7UUFDRCxDQUxDLENBQUY7UUFNQVIsRUFBRSxDQUFDLGtEQUFELEVBQXFELGtCQUFrQjtVQUN2RSxNQUFNLElBQUFFLHFCQUFBLEVBQWMsR0FBRVUsU0FBVSw2QkFBMUIsRUFBd0QsTUFBeEQsRUFBZ0VULE1BQWhFLENBQXVFYSxVQUF2RSxDQUFrRlAsRUFBbEYsQ0FDSHVDLFFBREg7UUFFRCxDQUhDLENBQUY7UUFJQWhELEVBQUUsQ0FBQyxnQ0FBRCxFQUFtQyxrQkFBa0I7VUFDckQsTUFBTSxJQUFBRSxxQkFBQSxFQUNKLHNDQURJLEVBRUosTUFGSSxFQUdKQyxNQUhJLENBR0dhLFVBSEgsQ0FHY1AsRUFIZCxDQUdpQkMsWUFIakIsQ0FHOEIsa0JBSDlCLENBQU47VUFJQSxNQUFNLElBQUFSLHFCQUFBLEVBQ0gsU0FBUWEsbUJBQVUsSUFBR0osSUFBSyw2QkFEdkIsRUFFSixNQUZJLEVBR0pSLE1BSEksQ0FHR2EsVUFISCxDQUdjUCxFQUhkLENBR2lCQyxZQUhqQixDQUc4QixrQkFIOUIsQ0FBTjtRQUlELENBVEMsQ0FBRjtRQVVBVixFQUFFLENBQUMsbURBQUQsRUFBc0Qsa0JBQWtCO1VBQ3hFLE1BQU0sSUFBQUUscUJBQUEsRUFDSixpQ0FESSxFQUVKLE1BRkksRUFHSkMsTUFISSxDQUdHYSxVQUhILENBR2NQLEVBSGQsQ0FHaUJDLFlBSGpCLENBRzhCLHFDQUg5QixDQUFOO1FBSUQsQ0FMQyxDQUFGO1FBTUFWLEVBQUUsQ0FBQywrREFBRCxFQUFrRSxrQkFBa0I7VUFDcEYsSUFBSUMsVUFBVSxHQUFHLE1BQU0sSUFBQUMscUJBQUEsRUFDcEIsR0FBRVUsU0FBVSxvQ0FBbUNxQyxrQkFBa0IsQ0FBQyxpQkFBRCxDQUFvQixFQURqRSxFQUVyQixNQUZxQixDQUF2QjtVQUlBaEQsVUFBVSxDQUFDRSxNQUFYLENBQWtCQyxPQUFsQixDQUEwQixvQkFBMUI7VUFDQUgsVUFBVSxDQUFDRSxNQUFYLENBQWtCK0MsR0FBbEIsQ0FBc0I5QyxPQUF0QixDQUE4QixNQUE5QjtVQUNBLElBQUlDLFFBQVEsR0FBRyxNQUFNQyxXQUFBLENBQUdDLFFBQUgsQ0FBWU4sVUFBWixFQUF3QixNQUF4QixDQUFyQjtVQUNBSSxRQUFRLENBQUNGLE1BQVQsQ0FBZ0JLLEdBQWhCLENBQW9CLDZCQUFwQjtRQUNELENBVEMsQ0FBRjtRQVVBUixFQUFFLENBQUMsOEVBQUQsRUFBaUYsa0JBQWtCO1VBQ25HLElBQUlDLFVBQVUsR0FBRyxNQUFNLElBQUFDLHFCQUFBLEVBQ3BCLEdBQUVVLFNBQVUsb0NBQW1DcUMsa0JBQWtCLENBQ2hFLGtDQURnRSxDQUVoRSxFQUhtQixFQUlyQixNQUpxQixDQUF2QjtVQU1BaEQsVUFBVSxDQUFDRSxNQUFYLENBQWtCQyxPQUFsQixDQUEwQixvQkFBMUI7VUFDQUgsVUFBVSxDQUFDRSxNQUFYLENBQWtCK0MsR0FBbEIsQ0FBc0I5QyxPQUF0QixDQUE4QixNQUE5QjtVQUNBLElBQUlDLFFBQVEsR0FBRyxNQUFNQyxXQUFBLENBQUdDLFFBQUgsQ0FBWU4sVUFBWixFQUF3QixNQUF4QixDQUFyQjtVQUNBSSxRQUFRLENBQUNGLE1BQVQsQ0FBZ0JLLEdBQWhCLENBQW9CLDZCQUFwQjtRQUNELENBWEMsQ0FBRjtRQVlBUixFQUFFLENBQUMsaUZBQUQsRUFBb0Ysa0JBQWtCO1VBQ3RHLElBQUlDLFVBQVUsR0FBRyxNQUFNLElBQUFDLHFCQUFBLEVBQ3BCLEdBQUVVLFNBQVUsb0NBQW1DcUMsa0JBQWtCLENBQ2hFLGlCQURnRSxDQUVoRSxnQkFIbUIsRUFJckIsTUFKcUIsQ0FBdkI7VUFNQWhELFVBQVUsQ0FBQ0UsTUFBWCxDQUFrQkMsT0FBbEIsQ0FBMEIsb0JBQTFCO1VBQ0FILFVBQVUsQ0FBQ0UsTUFBWCxDQUFrQitDLEdBQWxCLENBQXNCOUMsT0FBdEIsQ0FBOEIsTUFBOUI7VUFDQSxJQUFJQyxRQUFRLEdBQUcsTUFBTUMsV0FBQSxDQUFHQyxRQUFILENBQVlOLFVBQVosRUFBd0IsTUFBeEIsQ0FBckI7VUFDQUksUUFBUSxDQUFDRixNQUFULENBQWdCSyxHQUFoQixDQUFvQiw2QkFBcEI7UUFDRCxDQVhDLENBQUY7UUFZQVIsRUFBRSxDQUFDLDZDQUFELEVBQWdELGtCQUFrQjtVQUNsRSxJQUFJQyxVQUFVLEdBQUcsTUFBTSxJQUFBQyxxQkFBQSxFQUNwQixHQUFFVSxTQUFVLG9DQUFtQ3FDLGtCQUFrQixDQUFDLGlCQUFELENBQW9CLEVBRGpFLEVBRXJCLE1BRnFCLENBQXZCO1VBSUFoRCxVQUFVLENBQUNFLE1BQVgsQ0FBa0JDLE9BQWxCLENBQTBCLE1BQTFCO1VBQ0EsSUFBSUMsUUFBUSxHQUFHLE1BQU1DLFdBQUEsQ0FBR0MsUUFBSCxDQUFZTixVQUFaLEVBQXdCLE1BQXhCLENBQXJCO1VBQ0FJLFFBQVEsQ0FBQ0YsTUFBVCxDQUFnQkssR0FBaEIsQ0FBb0IsNkJBQXBCO1FBQ0QsQ0FSQyxDQUFGO01BU0QsQ0ExSU8sQ0FBUjtJQTJJRCxDQTVKTyxDQUFSO0VBNkpELENBbk1PLENBQVI7QUFvTUQsQ0FyTU8sQ0FBUiJ9
|
|
@@ -1,87 +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 _lib = require("../../../lib");
|
|
10
|
-
|
|
11
|
-
var _fakeDriver = require("../protocol/fake-driver");
|
|
12
|
-
|
|
13
|
-
var _ws = _interopRequireDefault(require("ws"));
|
|
14
|
-
|
|
15
|
-
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
16
|
-
|
|
17
|
-
var _helpers = require("../../helpers");
|
|
18
|
-
|
|
19
|
-
describe('Websockets (e2e)', function () {
|
|
20
|
-
let baseServer;
|
|
21
|
-
let driver;
|
|
22
|
-
let port;
|
|
23
|
-
const SESSION_ID = 'foo';
|
|
24
|
-
const WS_DATA = 'Hello';
|
|
25
|
-
before(async function () {
|
|
26
|
-
driver = new _fakeDriver.FakeDriver();
|
|
27
|
-
driver.sessionId = SESSION_ID;
|
|
28
|
-
port = await (0, _helpers.getTestPort)();
|
|
29
|
-
baseServer = await (0, _lib.server)({
|
|
30
|
-
routeConfiguringFunction: (0, _lib.routeConfiguringFunction)(driver),
|
|
31
|
-
port
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
after(async function () {
|
|
35
|
-
await baseServer.close();
|
|
36
|
-
});
|
|
37
|
-
describe('web sockets support', function () {
|
|
38
|
-
it('should be able to add websocket handler and remove it', async function () {
|
|
39
|
-
const wss = new _ws.default.Server({
|
|
40
|
-
noServer: true
|
|
41
|
-
});
|
|
42
|
-
wss.on('connection', ws => {
|
|
43
|
-
if (ws && ws.readyState === _ws.default.OPEN) {
|
|
44
|
-
ws.send(WS_DATA);
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
const previousListenerCount = baseServer.listenerCount('upgrade');
|
|
48
|
-
const endpoint = `${_lib.DEFAULT_WS_PATHNAME_PREFIX}/hello`;
|
|
49
|
-
const timeout = 5000;
|
|
50
|
-
await baseServer.addWebSocketHandler(endpoint, wss);
|
|
51
|
-
baseServer.listenerCount('upgrade').should.be.above(previousListenerCount);
|
|
52
|
-
|
|
53
|
-
_lodash.default.keys(await baseServer.getWebSocketHandlers()).length.should.eql(1);
|
|
54
|
-
|
|
55
|
-
await new _bluebird.default((resolve, reject) => {
|
|
56
|
-
const client = new _ws.default(`ws://${_helpers.TEST_HOST}:${port}${endpoint}`);
|
|
57
|
-
client.once('connection', (ws, req) => {
|
|
58
|
-
try {
|
|
59
|
-
ws.should.not.be.empty;
|
|
60
|
-
req.connection.remoteAddress.should.not.be.empty;
|
|
61
|
-
} catch (e) {
|
|
62
|
-
reject(e);
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
client.once('message', data => {
|
|
66
|
-
const dataStr = _lodash.default.isString(data) ? data : data.toString();
|
|
67
|
-
dataStr.should.eql(WS_DATA);
|
|
68
|
-
resolve();
|
|
69
|
-
});
|
|
70
|
-
client.once('error', reject);
|
|
71
|
-
setTimeout(() => reject(new Error('No websocket messages have been received after the timeout')), timeout);
|
|
72
|
-
});
|
|
73
|
-
(await baseServer.removeWebSocketHandler(endpoint)).should.be.true;
|
|
74
|
-
|
|
75
|
-
_lodash.default.keys(await baseServer.getWebSocketHandlers()).length.should.eql(0);
|
|
76
|
-
|
|
77
|
-
await new _bluebird.default((resolve, reject) => {
|
|
78
|
-
const client = new _ws.default(`ws://${_helpers.TEST_HOST}:${port}${endpoint}`);
|
|
79
|
-
client.on('message', data => reject(new Error(`No websocket messages are expected after the handler ` + `has been removed. '${data}' is received instead. `)));
|
|
80
|
-
client.on('error', resolve);
|
|
81
|
-
setTimeout(resolve, timeout);
|
|
82
|
-
});
|
|
83
|
-
baseServer.listenerCount('upgrade').should.be.above(previousListenerCount);
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXNjcmliZSIsImJhc2VTZXJ2ZXIiLCJkcml2ZXIiLCJwb3J0IiwiU0VTU0lPTl9JRCIsIldTX0RBVEEiLCJiZWZvcmUiLCJGYWtlRHJpdmVyIiwic2Vzc2lvbklkIiwiZ2V0VGVzdFBvcnQiLCJzZXJ2ZXIiLCJyb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24iLCJhZnRlciIsImNsb3NlIiwiaXQiLCJ3c3MiLCJXZWJTb2NrZXQiLCJTZXJ2ZXIiLCJub1NlcnZlciIsIm9uIiwid3MiLCJyZWFkeVN0YXRlIiwiT1BFTiIsInNlbmQiLCJwcmV2aW91c0xpc3RlbmVyQ291bnQiLCJsaXN0ZW5lckNvdW50IiwiZW5kcG9pbnQiLCJERUZBVUxUX1dTX1BBVEhOQU1FX1BSRUZJWCIsInRpbWVvdXQiLCJhZGRXZWJTb2NrZXRIYW5kbGVyIiwic2hvdWxkIiwiYmUiLCJhYm92ZSIsIl8iLCJrZXlzIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJsZW5ndGgiLCJlcWwiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsImNsaWVudCIsIlRFU1RfSE9TVCIsIm9uY2UiLCJyZXEiLCJub3QiLCJlbXB0eSIsImNvbm5lY3Rpb24iLCJyZW1vdGVBZGRyZXNzIiwiZSIsImRhdGEiLCJkYXRhU3RyIiwiaXNTdHJpbmciLCJ0b1N0cmluZyIsInNldFRpbWVvdXQiLCJFcnJvciIsInJlbW92ZVdlYlNvY2tldEhhbmRsZXIiLCJ0cnVlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9lMmUvYmFzZWRyaXZlci93ZWJzb2NrZXRzLmUyZS5zcGVjLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge3NlcnZlciwgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLCBERUZBVUxUX1dTX1BBVEhOQU1FX1BSRUZJWH0gZnJvbSAnLi4vLi4vLi4vbGliJztcbmltcG9ydCB7RmFrZURyaXZlcn0gZnJvbSAnLi4vcHJvdG9jb2wvZmFrZS1kcml2ZXInO1xuaW1wb3J0IFdlYlNvY2tldCBmcm9tICd3cyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQge1RFU1RfSE9TVCwgZ2V0VGVzdFBvcnR9IGZyb20gJy4uLy4uL2hlbHBlcnMnO1xuXG5kZXNjcmliZSgnV2Vic29ja2V0cyAoZTJlKScsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJhc2VTZXJ2ZXI7XG4gIGxldCBkcml2ZXI7XG4gIGxldCBwb3J0O1xuICBjb25zdCBTRVNTSU9OX0lEID0gJ2Zvbyc7XG4gIGNvbnN0IFdTX0RBVEEgPSAnSGVsbG8nO1xuXG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgZHJpdmVyID0gbmV3IEZha2VEcml2ZXIoKTtcbiAgICBkcml2ZXIuc2Vzc2lvbklkID0gU0VTU0lPTl9JRDtcbiAgICBwb3J0ID0gYXdhaXQgZ2V0VGVzdFBvcnQoKTtcbiAgICBiYXNlU2VydmVyID0gYXdhaXQgc2VydmVyKHtcbiAgICAgIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbjogcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uKGRyaXZlciksXG4gICAgICBwb3J0LFxuICAgIH0pO1xuICB9KTtcbiAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGJhc2VTZXJ2ZXIuY2xvc2UoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dlYiBzb2NrZXRzIHN1cHBvcnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIGFkZCB3ZWJzb2NrZXQgaGFuZGxlciBhbmQgcmVtb3ZlIGl0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd3NzID0gbmV3IFdlYlNvY2tldC5TZXJ2ZXIoe1xuICAgICAgICBub1NlcnZlcjogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgd3NzLm9uKCdjb25uZWN0aW9uJywgKHdzKSA9PiB7XG4gICAgICAgIGlmICh3cyAmJiB3cy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgICAgIHdzLnNlbmQoV1NfREFUQSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJldmlvdXNMaXN0ZW5lckNvdW50ID0gYmFzZVNlcnZlci5saXN0ZW5lckNvdW50KCd1cGdyYWRlJyk7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IGAke0RFRkFVTFRfV1NfUEFUSE5BTUVfUFJFRklYfS9oZWxsb2A7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gNTAwMDtcbiAgICAgIGF3YWl0IGJhc2VTZXJ2ZXIuYWRkV2ViU29ja2V0SGFuZGxlcihlbmRwb2ludCwgd3NzKTtcbiAgICAgIGJhc2VTZXJ2ZXIubGlzdGVuZXJDb3VudCgndXBncmFkZScpLnNob3VsZC5iZS5hYm92ZShwcmV2aW91c0xpc3RlbmVyQ291bnQpO1xuICAgICAgXy5rZXlzKGF3YWl0IGJhc2VTZXJ2ZXIuZ2V0V2ViU29ja2V0SGFuZGxlcnMoKSkubGVuZ3RoLnNob3VsZC5lcWwoMSk7XG4gICAgICBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBXZWJTb2NrZXQoYHdzOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0ke2VuZHBvaW50fWApO1xuICAgICAgICBjbGllbnQub25jZSgnY29ubmVjdGlvbicsICh3cywgcmVxKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdzLnNob3VsZC5ub3QuYmUuZW1wdHk7XG4gICAgICAgICAgICByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzLnNob3VsZC5ub3QuYmUuZW1wdHk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNsaWVudC5vbmNlKCdtZXNzYWdlJywgKGRhdGEpID0+IHtcbiAgICAgICAgICBjb25zdCBkYXRhU3RyID0gXy5pc1N0cmluZyhkYXRhKSA/IGRhdGEgOiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgICAgZGF0YVN0ci5zaG91bGQuZXFsKFdTX0RBVEEpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNsaWVudC5vbmNlKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignTm8gd2Vic29ja2V0IG1lc3NhZ2VzIGhhdmUgYmVlbiByZWNlaXZlZCBhZnRlciB0aGUgdGltZW91dCcpKSxcbiAgICAgICAgICB0aW1lb3V0XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgKGF3YWl0IGJhc2VTZXJ2ZXIucmVtb3ZlV2ViU29ja2V0SGFuZGxlcihlbmRwb2ludCkpLnNob3VsZC5iZS50cnVlO1xuICAgICAgXy5rZXlzKGF3YWl0IGJhc2VTZXJ2ZXIuZ2V0V2ViU29ja2V0SGFuZGxlcnMoKSkubGVuZ3RoLnNob3VsZC5lcWwoMCk7XG4gICAgICBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBXZWJTb2NrZXQoYHdzOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0ke2VuZHBvaW50fWApO1xuICAgICAgICBjbGllbnQub24oJ21lc3NhZ2UnLCAoZGF0YSkgPT5cbiAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBObyB3ZWJzb2NrZXQgbWVzc2FnZXMgYXJlIGV4cGVjdGVkIGFmdGVyIHRoZSBoYW5kbGVyIGAgK1xuICAgICAgICAgICAgICAgIGBoYXMgYmVlbiByZW1vdmVkLiAnJHtkYXRhfScgaXMgcmVjZWl2ZWQgaW5zdGVhZC4gYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgY2xpZW50Lm9uKCdlcnJvcicsIHJlc29sdmUpO1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXQpO1xuICAgICAgfSk7XG4gICAgICBiYXNlU2VydmVyLmxpc3RlbmVyQ291bnQoJ3VwZ3JhZGUnKS5zaG91bGQuYmUuYWJvdmUocHJldmlvdXNMaXN0ZW5lckNvdW50KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUFBLFFBQVEsQ0FBQyxrQkFBRCxFQUFxQixZQUFZO0VBQ3ZDLElBQUlDLFVBQUo7RUFDQSxJQUFJQyxNQUFKO0VBQ0EsSUFBSUMsSUFBSjtFQUNBLE1BQU1DLFVBQVUsR0FBRyxLQUFuQjtFQUNBLE1BQU1DLE9BQU8sR0FBRyxPQUFoQjtFQUVBQyxNQUFNLENBQUMsa0JBQWtCO0lBQ3ZCSixNQUFNLEdBQUcsSUFBSUssc0JBQUosRUFBVDtJQUNBTCxNQUFNLENBQUNNLFNBQVAsR0FBbUJKLFVBQW5CO0lBQ0FELElBQUksR0FBRyxNQUFNLElBQUFNLG9CQUFBLEdBQWI7SUFDQVIsVUFBVSxHQUFHLE1BQU0sSUFBQVMsV0FBQSxFQUFPO01BQ3hCQyx3QkFBd0IsRUFBRSxJQUFBQSw2QkFBQSxFQUF5QlQsTUFBekIsQ0FERjtNQUV4QkM7SUFGd0IsQ0FBUCxDQUFuQjtFQUlELENBUkssQ0FBTjtFQVNBUyxLQUFLLENBQUMsa0JBQWtCO0lBQ3RCLE1BQU1YLFVBQVUsQ0FBQ1ksS0FBWCxFQUFOO0VBQ0QsQ0FGSSxDQUFMO0VBSUFiLFFBQVEsQ0FBQyxxQkFBRCxFQUF3QixZQUFZO0lBQzFDYyxFQUFFLENBQUMsdURBQUQsRUFBMEQsa0JBQWtCO01BQzVFLE1BQU1DLEdBQUcsR0FBRyxJQUFJQyxXQUFBLENBQVVDLE1BQWQsQ0FBcUI7UUFDL0JDLFFBQVEsRUFBRTtNQURxQixDQUFyQixDQUFaO01BR0FILEdBQUcsQ0FBQ0ksRUFBSixDQUFPLFlBQVAsRUFBc0JDLEVBQUQsSUFBUTtRQUMzQixJQUFJQSxFQUFFLElBQUlBLEVBQUUsQ0FBQ0MsVUFBSCxLQUFrQkwsV0FBQSxDQUFVTSxJ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
|
|
@@ -1,159 +0,0 @@
|
|
|
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 _axios = _interopRequireDefault(require("axios"));
|
|
10
|
-
|
|
11
|
-
var _sinon = require("sinon");
|
|
12
|
-
|
|
13
|
-
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
14
|
-
|
|
15
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
16
|
-
|
|
17
|
-
var _helpers = require("../../helpers");
|
|
18
|
-
|
|
19
|
-
describe('server', function () {
|
|
20
|
-
let hwServer;
|
|
21
|
-
let port;
|
|
22
|
-
let sandbox;
|
|
23
|
-
before(async function () {
|
|
24
|
-
port = await (0, _helpers.getTestPort)(true);
|
|
25
|
-
|
|
26
|
-
function configureRoutes(app) {
|
|
27
|
-
app.get('/', (req, res) => {
|
|
28
|
-
res.header['content-type'] = 'text/html';
|
|
29
|
-
res.status(200).send('Hello World!');
|
|
30
|
-
});
|
|
31
|
-
app.get('/python', (req, res) => {
|
|
32
|
-
res.status(200).send(req.headers['content-type']);
|
|
33
|
-
});
|
|
34
|
-
app.get('/error', () => {
|
|
35
|
-
throw new Error('hahaha');
|
|
36
|
-
});
|
|
37
|
-
app.get('/pause', async (req, res) => {
|
|
38
|
-
res.header['content-type'] = 'text/html';
|
|
39
|
-
await _bluebird.default.delay(1000);
|
|
40
|
-
res.status(200).send('We have waited!');
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
hwServer = await (0, _lib.server)({
|
|
45
|
-
routeConfiguringFunction: configureRoutes,
|
|
46
|
-
port
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
beforeEach(function () {
|
|
50
|
-
sandbox = (0, _sinon.createSandbox)();
|
|
51
|
-
sandbox.stub(console, 'error');
|
|
52
|
-
});
|
|
53
|
-
after(async function () {
|
|
54
|
-
await hwServer.close();
|
|
55
|
-
});
|
|
56
|
-
afterEach(function () {
|
|
57
|
-
sandbox.restore();
|
|
58
|
-
});
|
|
59
|
-
it('should start up with our middleware', async function () {
|
|
60
|
-
const {
|
|
61
|
-
data
|
|
62
|
-
} = await _axios.default.get(`http://${_helpers.TEST_HOST}:${port}/`);
|
|
63
|
-
data.should.eql('Hello World!');
|
|
64
|
-
});
|
|
65
|
-
it('should fix broken context type', async function () {
|
|
66
|
-
const {
|
|
67
|
-
data
|
|
68
|
-
} = await (0, _axios.default)({
|
|
69
|
-
url: `http://${_helpers.TEST_HOST}:${port}/python`,
|
|
70
|
-
headers: {
|
|
71
|
-
'user-agent': 'Python',
|
|
72
|
-
'content-type': 'application/x-www-form-urlencoded'
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
data.should.eql('application/json; charset=utf-8');
|
|
76
|
-
});
|
|
77
|
-
it('should catch errors in the catchall', async function () {
|
|
78
|
-
await _axios.default.get(`http://${_helpers.TEST_HOST}:${port}/error`).should.be.rejected;
|
|
79
|
-
});
|
|
80
|
-
it('should error if we try to start again on a port that is used', async function () {
|
|
81
|
-
await (0, _lib.server)({
|
|
82
|
-
routeConfiguringFunction() {},
|
|
83
|
-
|
|
84
|
-
port
|
|
85
|
-
}).should.be.rejectedWith(/EADDRINUSE/);
|
|
86
|
-
});
|
|
87
|
-
it('should not wait for the server close connections before finishing closing', async function () {
|
|
88
|
-
let bodyPromise = _axios.default.get(`http://${_helpers.TEST_HOST}:${port}/pause`).catch(() => {});
|
|
89
|
-
|
|
90
|
-
await _bluebird.default.delay(100);
|
|
91
|
-
let before = Date.now();
|
|
92
|
-
await hwServer.close();
|
|
93
|
-
(Date.now() - before).should.not.be.above(800);
|
|
94
|
-
await bodyPromise;
|
|
95
|
-
});
|
|
96
|
-
it('should error if we try to start on a bad hostname', async function () {
|
|
97
|
-
this.timeout(60000);
|
|
98
|
-
await (0, _lib.server)({
|
|
99
|
-
routeConfiguringFunction: _lodash.default.noop,
|
|
100
|
-
port,
|
|
101
|
-
hostname: 'lolcathost'
|
|
102
|
-
}).should.be.rejectedWith(/ENOTFOUND|EADDRNOTAVAIL|EAI_AGAIN/);
|
|
103
|
-
await (0, _lib.server)({
|
|
104
|
-
routeConfiguringFunction: _lodash.default.noop,
|
|
105
|
-
port,
|
|
106
|
-
hostname: '1.1.1.1'
|
|
107
|
-
}).should.be.rejectedWith(/EADDRNOTAVAIL/);
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
describe('server plugins', function () {
|
|
111
|
-
let hwServer;
|
|
112
|
-
let port;
|
|
113
|
-
before(async function () {
|
|
114
|
-
port = await (0, _helpers.getTestPort)(true);
|
|
115
|
-
});
|
|
116
|
-
afterEach(async function () {
|
|
117
|
-
try {
|
|
118
|
-
await hwServer.close();
|
|
119
|
-
} catch (ign) {}
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
function updaterWithGetRoute(route, reply) {
|
|
123
|
-
return async (app, httpServer) => {
|
|
124
|
-
app.get(`/${route}`, (req, res) => {
|
|
125
|
-
res.header['content-type'] = 'text/html';
|
|
126
|
-
res.status(200).send(reply);
|
|
127
|
-
});
|
|
128
|
-
httpServer[`_updated_${route}`] = true;
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
it('should allow one or more plugins to update the server', async function () {
|
|
133
|
-
hwServer = await (0, _lib.server)({
|
|
134
|
-
routeConfiguringFunction: _lodash.default.noop,
|
|
135
|
-
port,
|
|
136
|
-
serverUpdaters: [updaterWithGetRoute('plugin1', 'res from plugin1 route'), updaterWithGetRoute('plugin2', 'res from plugin2 route')]
|
|
137
|
-
});
|
|
138
|
-
let {
|
|
139
|
-
data
|
|
140
|
-
} = await _axios.default.get(`http://${_helpers.TEST_HOST}:${port}/plugin1`);
|
|
141
|
-
data.should.eql('res from plugin1 route');
|
|
142
|
-
({
|
|
143
|
-
data
|
|
144
|
-
} = await _axios.default.get(`http://${_helpers.TEST_HOST}:${port}/plugin2`));
|
|
145
|
-
data.should.eql('res from plugin2 route');
|
|
146
|
-
hwServer._updated_plugin1.should.be.true;
|
|
147
|
-
hwServer._updated_plugin2.should.be.true;
|
|
148
|
-
});
|
|
149
|
-
it('should pass on errors from the plugin updateServer method', async function () {
|
|
150
|
-
await (0, _lib.server)({
|
|
151
|
-
routeConfiguringFunction: _lodash.default.noop,
|
|
152
|
-
port,
|
|
153
|
-
serverUpdaters: [() => {
|
|
154
|
-
throw new Error('ugh');
|
|
155
|
-
}]
|
|
156
|
-
}).should.eventually.be.rejectedWith(/ugh/);
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXNjcmliZSIsImh3U2VydmVyIiwicG9ydCIsInNhbmRib3giLCJiZWZvcmUiLCJnZXRUZXN0UG9ydCIsImNvbmZpZ3VyZVJvdXRlcyIsImFwcCIsImdldCIsInJlcSIsInJlcyIsImhlYWRlciIsInN0YXR1cyIsInNlbmQiLCJoZWFkZXJzIiwiRXJyb3IiLCJCIiwiZGVsYXkiLCJzZXJ2ZXIiLCJyb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24iLCJiZWZvcmVFYWNoIiwiY3JlYXRlU2FuZGJveCIsInN0dWIiLCJjb25zb2xlIiwiYWZ0ZXIiLCJjbG9zZSIsImFmdGVyRWFjaCIsInJlc3RvcmUiLCJpdCIsImRhdGEiLCJheGlvcyIsIlRFU1RfSE9TVCIsInNob3VsZCIsImVxbCIsInVybCIsImJlIiwicmVqZWN0ZWQiLCJyZWplY3RlZFdpdGgiLCJib2R5UHJvbWlzZSIsImNhdGNoIiwiRGF0ZSIsIm5vdyIsIm5vdCIsImFib3ZlIiwidGltZW91dCIsIl8iLCJub29wIiwiaG9zdG5hbWUiLCJpZ24iLCJ1cGRhdGVyV2l0aEdldFJvdXRlIiwicm91dGUiLCJyZXBseSIsImh0dHBTZXJ2ZXIiLCJzZXJ2ZXJVcGRhdGVycyIsIl91cGRhdGVkX3BsdWdpbjEiLCJ0cnVlIiwiX3VwZGF0ZWRfcGx1Z2luMiIsImV2ZW50dWFsbHkiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2UyZS9leHByZXNzL3NlcnZlci5lMmUuc3BlYy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bW9jaGFcblxuaW1wb3J0IHtzZXJ2ZXJ9IGZyb20gJy4uLy4uLy4uL2xpYic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHtjcmVhdGVTYW5kYm94fSBmcm9tICdzaW5vbic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtURVNUX0hPU1QsIGdldFRlc3RQb3J0fSBmcm9tICcuLi8uLi9oZWxwZXJzJztcblxuZGVzY3JpYmUoJ3NlcnZlcicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGh3U2VydmVyO1xuICBsZXQgcG9ydDtcbiAgbGV0IHNhbmRib3g7XG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgcG9ydCA9IGF3YWl0IGdldFRlc3RQb3J0KHRydWUpO1xuXG4gICAgZnVuY3Rpb24gY29uZmlndXJlUm91dGVzKGFwcCkge1xuICAgICAgYXBwLmdldCgnLycsIChyZXEsIHJlcykgPT4ge1xuICAgICAgICByZXMuaGVhZGVyWydjb250ZW50LXR5cGUnXSA9ICd0ZXh0L2h0bWwnO1xuICAgICAgICByZXMuc3RhdHVzKDIwMCkuc2VuZCgnSGVsbG8gV29ybGQhJyk7XG4gICAgICB9KTtcbiAgICAgIGFwcC5nZXQoJy9weXRob24nLCAocmVxLCByZXMpID0+IHtcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLnNlbmQocmVxLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKTtcbiAgICAgIH0pO1xuICAgICAgYXBwLmdldCgnL2Vycm9yJywgKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hhaGFoYScpO1xuICAgICAgfSk7XG4gICAgICBhcHAuZ2V0KCcvcGF1c2UnLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgcmVzLmhlYWRlclsnY29udGVudC10eXBlJ10gPSAndGV4dC9odG1sJztcbiAgICAgICAgYXdhaXQgQi5kZWxheSgxMDAwKTtcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLnNlbmQoJ1dlIGhhdmUgd2FpdGVkIScpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGh3U2VydmVyID0gYXdhaXQgc2VydmVyKHtcbiAgICAgIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbjogY29uZmlndXJlUm91dGVzLFxuICAgICAgcG9ydCxcbiAgICB9KTtcbiAgfSk7XG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3ggPSBjcmVhdGVTYW5kYm94KCk7XG4gICAgc2FuZGJveC5zdHViKGNvbnNvbGUsICdlcnJvcicpO1xuICB9KTtcbiAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGh3U2VydmVyLmNsb3NlKCk7XG4gIH0pO1xuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3gucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHN0YXJ0IHVwIHdpdGggb3VyIG1pZGRsZXdhcmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qge2RhdGF9ID0gYXdhaXQgYXhpb3MuZ2V0KGBodHRwOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0vYCk7XG4gICAgZGF0YS5zaG91bGQuZXFsKCdIZWxsbyBXb3JsZCEnKTtcbiAgfSk7XG4gIGl0KCdzaG91bGQgZml4IGJyb2tlbiBjb250ZXh0IHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qge2RhdGF9ID0gYXdhaXQgYXhpb3Moe1xuICAgICAgdXJsOiBgaHR0cDovLyR7VEVTVF9IT1NUfToke3BvcnR9L3B5dGhvbmAsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICd1c2VyLWFnZW50JzogJ1B5dGhvbicsXG4gICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZGF0YS5zaG91bGQuZXFsKCdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04Jyk7XG4gIH0pO1xuICBpdCgnc2hvdWxkIGNhdGNoIGVycm9ycyBpbiB0aGUgY2F0Y2hhbGwnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgYXhpb3MuZ2V0KGBodHRwOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0vZXJyb3JgKS5zaG91bGQuYmUucmVqZWN0ZWQ7XG4gIH0pO1xuICBpdCgnc2hvdWxkIGVycm9yIGlmIHdlIHRyeSB0byBzdGFydCBhZ2FpbiBvbiBhIHBvcnQgdGhhdCBpcyB1c2VkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IHNlcnZlcih7XG4gICAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24oKSB7fSxcbiAgICAgIHBvcnQsXG4gICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvRUFERFJJTlVTRS8pO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCBub3Qgd2FpdCBmb3IgdGhlIHNlcnZlciBjbG9zZSBjb25uZWN0aW9ucyBiZWZvcmUgZmluaXNoaW5nIGNsb3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGJvZHlQcm9taXNlID0gYXhpb3MuZ2V0KGBodHRwOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0vcGF1c2VgKS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgICAvLyByZWxpbnF1aXNoIGNvbnRyb2wgc28gdGhhdCB3ZSBkb24ndCBjbG9zZSBiZWZvcmUgdGhlIHJlcXVlc3QgaXMgcmVjZWl2ZWRcbiAgICBhd2FpdCBCLmRlbGF5KDEwMCk7XG5cbiAgICBsZXQgYmVmb3JlID0gRGF0ZS5ub3coKTtcbiAgICBhd2FpdCBod1NlcnZlci5jbG9zZSgpO1xuICAgIC8vIGV4cGVjdCBzbGlnaHRseSBsZXNzIHRoYW4gdGhlIHJlcXVlc3Qgd2FpdGVkLCBzaW5jZSB3ZSBwYXVzZWQgYWJvdmVcbiAgICAoRGF0ZS5ub3coKSAtIGJlZm9yZSkuc2hvdWxkLm5vdC5iZS5hYm92ZSg4MDApO1xuXG4gICAgYXdhaXQgYm9keVByb21pc2U7XG4gIH0pO1xuICBpdCgnc2hvdWxkIGVycm9yIGlmIHdlIHRyeSB0byBzdGFydCBvbiBhIGJhZCBob3N0bmFtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRpbWVvdXQoNjAwMDApO1xuICAgIGF3YWl0IHNlcnZlcih7XG4gICAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb246IF8ubm9vcCxcbiAgICAgIHBvcnQsXG4gICAgICBob3N0bmFtZTogJ2xvbGNhdGhvc3QnLFxuICAgIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0VOT1RGT1VORHxFQUREUk5PVEFWQUlMfEVBSV9BR0FJTi8pO1xuICAgIGF3YWl0IHNlcnZlcih7XG4gICAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb246IF8ubm9vcCxcbiAgICAgIHBvcnQsXG4gICAgICBob3N0bmFtZTogJzEuMS4xLjEnLFxuICAgIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0VBRERSTk9UQVZBSUwvKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3NlcnZlciBwbHVnaW5zJywgZnVuY3Rpb24gKCkge1xuICBsZXQgaHdTZXJ2ZXI7XG4gIGxldCBwb3J0O1xuXG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgcG9ydCA9IGF3YWl0IGdldFRlc3RQb3J0KHRydWUpO1xuICB9KTtcblxuICBhZnRlckVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBod1NlcnZlci5jbG9zZSgpO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgfSk7XG5cbiAgZnVuY3Rpb24gdXBkYXRlcldpdGhHZXRSb3V0ZShyb3V0ZSwgcmVwbHkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hd2FpdFxuICAgIHJldHVybiBhc3luYyAoYXBwLCBodHRwU2VydmVyKSA9PiB7XG4gICAgICBhcHAuZ2V0KGAvJHtyb3V0ZX1gLCAocmVxLCByZXMpID0+IHtcbiAgICAgICAgcmVzLmhlYWRlclsnY29udGVudC10eXBlJ10gPSAndGV4dC9odG1sJztcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLnNlbmQocmVwbHkpO1xuICAgICAgfSk7XG4gICAgICBodHRwU2VydmVyW2BfdXBkYXRlZF8ke3JvdXRlfWBdID0gdHJ1ZTtcbiAgICB9O1xuICB9XG5cbiAgaXQoJ3Nob3VsZCBhbGxvdyBvbmUgb3IgbW9yZSBwbHVnaW5zIHRvIHVwZGF0ZSB0aGUgc2VydmVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGh3U2VydmVyID0gYXdhaXQgc2VydmVyKHtcbiAgICAgIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbjogXy5ub29wLFxuICAgICAgcG9ydCxcbiAgICAgIHNlcnZlclVwZGF0ZXJzOiBbXG4gICAgICAgIHVwZGF0ZXJXaXRoR2V0Um91dGUoJ3BsdWdpbjEnLCAncmVzIGZyb20gcGx1Z2luMSByb3V0ZScpLFxuICAgICAgICB1cGRhdGVyV2l0aEdldFJvdXRlKCdwbHVnaW4yJywgJ3JlcyBmcm9tIHBsdWdpbjIgcm91dGUnKSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgbGV0IHtkYXRhfSA9IGF3YWl0IGF4aW9zLmdldChgaHR0cDovLyR7VEVTVF9IT1NUfToke3BvcnR9L3BsdWdpbjFgKTtcbiAgICBkYXRhLnNob3VsZC5lcWwoJ3JlcyBmcm9tIHBsdWdpbjEgcm91dGUnKTtcbiAgICAoe2RhdGF9ID0gYXdhaXQgYXhpb3MuZ2V0KGBodHRwOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0vcGx1Z2luMmApKTtcbiAgICBkYXRhLnNob3VsZC5lcWwoJ3JlcyBmcm9tIHBsdWdpbjIgcm91dGUnKTtcbiAgICBod1NlcnZlci5fdXBkYXRlZF9wbHVnaW4xLnNob3VsZC5iZS50cnVlO1xuICAgIGh3U2VydmVyLl91cGRhdGVkX3BsdWdpbjIuc2hvdWxkLmJlLnRydWU7XG4gIH0pO1xuICBpdCgnc2hvdWxkIHBhc3Mgb24gZXJyb3JzIGZyb20gdGhlIHBsdWdpbiB1cGRhdGVTZXJ2ZXIgbWV0aG9kJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IHNlcnZlcih7XG4gICAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb246IF8ubm9vcCxcbiAgICAgIHBvcnQsXG4gICAgICBzZXJ2ZXJVcGRhdGVyczogW1xuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1Z2gnKTtcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVq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
|
|
@@ -1,59 +0,0 @@
|
|
|
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.value.should.equal(`I'm fine`);
|
|
25
|
-
});
|
|
26
|
-
it('should proxy status as command', async function () {
|
|
27
|
-
const res = await jwproxy.command('/status', 'GET');
|
|
28
|
-
res.should.eql(`I'm fine`);
|
|
29
|
-
});
|
|
30
|
-
describe('new session', function () {
|
|
31
|
-
afterEach(async function () {
|
|
32
|
-
await jwproxy.command('', 'DELETE');
|
|
33
|
-
});
|
|
34
|
-
it('should start a new session', async function () {
|
|
35
|
-
const caps = {
|
|
36
|
-
browserName: 'fake'
|
|
37
|
-
};
|
|
38
|
-
const res = await jwproxy.command('/session', 'POST', {
|
|
39
|
-
capabilities: {
|
|
40
|
-
alwaysMatch: caps
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
res.capabilities.alwaysMatch.should.have.property('browserName');
|
|
44
|
-
jwproxy.sessionId.should.have.length(48);
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
describe('delete session', function () {
|
|
48
|
-
beforeEach(async function () {
|
|
49
|
-
await jwproxy.command('/session', 'POST', {
|
|
50
|
-
desiredCapabilities: {}
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
it('should quit a session', async function () {
|
|
54
|
-
const res = await jwproxy.command('', 'DELETE');
|
|
55
|
-
should.not.exist(res);
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXNjcmliZSIsImp3cHJveHkiLCJKV1Byb3h5IiwiYmFzZVNlcnZlciIsImJlZm9yZSIsInNlcnZlciIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsIkZha2VEcml2ZXIiLCJwb3J0IiwiYWZ0ZXIiLCJjbG9zZSIsIml0IiwicmVzIiwicmVzQm9keSIsInByb3h5Iiwic3RhdHVzQ29kZSIsInNob3VsZCIsImVxdWFsIiwidmFsdWUiLCJjb21tYW5kIiwiZXFsIiwiYWZ0ZXJFYWNoIiwiY2FwcyIsImJyb3dzZXJOYW1lIiwiY2FwYWJpbGl0aWVzIiwiYWx3YXlzTWF0Y2giLCJoYXZlIiwicHJvcGVydHkiLCJzZXNzaW9uSWQiLCJsZW5ndGgiLCJiZWZvcmVFYWNoIiwiZGVzaXJlZENhcGFiaWxpdGllcyIsIm5vdCIsImV4aXN0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9lMmUvanNvbndwLXByb3h5L3Byb3h5LmUyZS5zcGVjLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SldQcm94eSwgc2VydmVyLCByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb259IGZyb20gJy4uLy4uLy4uL2xpYic7XG5pbXBvcnQge0Zha2VEcml2ZXJ9IGZyb20gJy4uL3Byb3RvY29sL2Zha2UtZHJpdmVyJztcblxuZGVzY3JpYmUoJ3Byb3h5JywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBqd3Byb3h5ID0gbmV3IEpXUHJveHkoKTtcbiAgbGV0IGJhc2VTZXJ2ZXI7XG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYmFzZVNlcnZlciA9IGF3YWl0IHNlcnZlcih7XG4gICAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb246IHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbihuZXcgRmFrZURyaXZlcigpKSxcbiAgICAgIHBvcnQ6IDQ0NDQsXG4gICAgfSk7XG4gIH0pO1xuICBhZnRlcihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgYmFzZVNlcnZlci5jbG9zZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHByb3h5IHN0YXR1cyBzdHJhaWdodCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgW3JlcywgcmVzQm9keV0gPSBhd2FpdCBqd3Byb3h5LnByb3h5KCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgIHJlcy5zdGF0dXNDb2RlLnNob3VsZC5lcXVhbCgyMDApO1xuICAgIHJlc0JvZHkudmFsdWUuc2hvdWxkLmVxdWFsKGBJJ20gZmluZWApO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCBwcm94eSBzdGF0dXMgYXMgY29tbWFuZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBqd3Byb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgcmVzLnNob3VsZC5lcWwoYEknbSBmaW5lYCk7XG4gIH0pO1xuICBkZXNjcmliZSgnbmV3IHNlc3Npb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgYWZ0ZXJFYWNoKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGp3cHJveHkuY29tbWFuZCgnJywgJ0RFTEVURScpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgc3RhcnQgYSBuZXcgc2Vzc2lvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNhcHMgPSB7YnJvd3Nlck5hbWU6ICdmYWtlJ307XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBqd3Byb3h5LmNvbW1hbmQoJy9zZXNzaW9uJywgJ1BPU1QnLCB7XG4gICAgICAgIGNhcGFiaWxpdGllczoge2Fsd2F5c01hdGNoOiBjYXBzfSxcbiAgICAgIH0pO1xuICAgICAgcmVzLmNhcGFiaWxpdGllcy5hbHdheXNNYXRjaC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYnJvd3Nlck5hbWUnKTtcbiAgICAgIGp3cHJveHkuc2Vzc2lvbklkLnNob3VsZC5oYXZlLmxlbmd0aCg0OCk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnZGVsZXRlIHNlc3Npb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBqd3Byb3h5LmNvbW1hbmQoJy9zZXNzaW9uJywgJ1BPU1QnLCB7ZGVzaXJlZENhcGFiaWxpdGllczoge319KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHF1aXQgYSBzZXNzaW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgandwcm94eS5jb21tYW5kKCcnLCAnREVMRVRFJyk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KHJlcyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTs7QUFDQTs7QUFFQUEsUUFBUSxDQUFDLE9BQUQsRUFBVSxZQUFZO0VBQzVCLE1BQU1DLE9BQU8sR0FBRyxJQUFJQyxZQUFKLEVBQWhCO0VBQ0EsSUFBSUMsVUFBSjtFQUNBQyxNQUFNLENBQUMsa0JBQWtCO0lBQ3ZCRCxVQUFVLEdBQUcsTUFBTSxJQUFBRSxXQUFBLEVBQU87TUFDeEJDLHdCQUF3QixFQUFFLElBQUFBLDZCQUFBLEVBQXlCLElBQUlDLHNCQUFKLEVBQXpCLENBREY7TUFFeEJDLElBQUksRUFBRTtJQUZrQixDQUFQLENBQW5CO0VBSUQsQ0FMSyxDQUFOO0VBTUFDLEtBQUssQ0FBQyxrQkFBa0I7SUFDdEIsTUFBTU4sVUFBVSxDQUFDTyxLQUFYLEVBQU47RUFDRCxDQUZJLENBQUw7RUFJQUMsRUFBRSxDQUFDLDhCQUFELEVBQWlDLGtCQUFrQjtJQUNuRCxJQUFJLENBQUNDLEdBQUQsRUFBTUMsT0FBTixJQUFpQixNQUFNWixPQUFPLENBQUNhLEtBQVIsQ0FBYyxTQUFkLEVBQXlCLEtBQXpCLENBQTNCO0lBQ0FGLEdBQUcsQ0FBQ0csVUFBSixDQUFlQyxNQUFmLENBQXNCQyxLQUF0QixDQUE0QixHQUE1QjtJQUNBSixPQUFPLENBQUNLLEtBQVIsQ0FBY0YsTUFBZCxDQUFxQkMsS0FBckIsQ0FBNEIsVUFBNUI7RUFDRCxDQUpDLENBQUY7RUFLQU4sRUFBRSxDQUFDLGdDQUFELEVBQW1DLGtCQUFrQjtJQUNyRCxNQUFNQyxHQUFHLEdBQUcsTUFBTVgsT0FBTyxDQUFDa0IsT0FBUixDQUFnQixTQUFoQixFQUEyQixLQUEzQixDQUFsQjtJQUNBUCxHQUFHLENBQUNJLE1BQUosQ0FBV0ksR0FBWCxDQUFnQixVQUFoQjtFQUNELENBSEMsQ0FBRjtFQUlBcEIsUUFBUSxDQUFDLGFBQUQsRUFBZ0IsWUFBWTtJQUNsQ3FCLFNBQVMsQ0FBQyxrQkFBa0I7TUFDMUIsTUFBTXBCLE9BQU8sQ0FBQ2tCLE9BQVIsQ0FBZ0IsRUFBaEIsRUFBb0IsUUFBcEIsQ0FBTjtJQUNELENBRlEsQ0FBVDtJQUdBUixFQUFFLENBQUMsNEJBQUQsRUFBK0Isa0JBQWtCO01BQ2pELE1BQU1XLElBQUksR0FBRztRQUFDQyxXQUFXLEVBQUU7TUFBZCxDQUFiO01BQ0EsTUFBTVgsR0FBRyxHQUFHLE1BQU1YLE9BQU8sQ0FBQ2tCLE9BQVIsQ0FBZ0IsVUFBaEIsRUFBNEIsTUFBNUIsRUFBb0M7UUFDcERLLFlBQVksRUFBRTtVQUFDQyxXQUFXLEVBQUVIO1FBQWQ7TUFEc0MsQ0FBcEMsQ0FBbEI7TUFHQVYsR0FBRyxDQUFDWSxZQUFKLENBQWlCQyxXQUFqQixDQUE2QlQsTUFBN0IsQ0FBb0NVLElBQXBDLENBQXlDQyxRQUF6QyxDQUFrRCxhQUFsRDtNQUNBMUIsT0FBTyxDQUFDMkIsU0FBUixDQUFrQlosTUFBbEIsQ0FBeUJVLElBQXpCLENBQThCRyxNQUE5QixDQUFxQyxFQUFyQztJQUNELENBUEMsQ0FBRjtFQVFELENBWk8sQ0FBUjtFQWFBN0IsUUFBUSxDQUFDLGdCQUFELEVBQW1CLFlBQVk7SUFDckM4QixVQUFVLENBQUMsa0JBQWtCO01BQzNCLE1BQU03QixPQUFPLENBQUNrQixPQUFSLENBQWdCLFVBQWhCLEVBQTRCLE1BQTVCLEVBQW9DO1FBQUNZLG1CQUFtQixFQUFFO01BQXRCLENBQXBDLENBQU47SUFDRCxDQUZTLENBQVY7SUFHQXBCLEVBQUUsQ0FBQyx1QkFBRCxFQUEwQixrQkFBa0I7TUFDNUMsTUFBTUMsR0FBRyxHQUFHLE1BQU1YLE9BQU8sQ0FBQ2tCLE9BQVIsQ0FBZ0IsRUFBaEIsRUFBb0IsUUFBcEIsQ0FBbEI7TUFDQUgsTUFBTSxDQUFDZ0IsR0FBUCxDQUFXQyxLQUFYLENBQWlCckIsR0FBakI7SUFDRCxDQUhDLENBQUY7RUFJRCxDQVJPLENBQVI7QUFTRCxDQTVDTyxDQUFSIn0=
|