@appium/base-driver 8.3.0 → 8.4.1
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.d.ts +80 -0
- package/build/lib/basedriver/capabilities.d.ts.map +1 -0
- package/build/lib/basedriver/capabilities.js +12 -13
- package/build/lib/basedriver/commands/event.d.ts +9 -0
- package/build/lib/basedriver/commands/event.d.ts.map +1 -0
- package/build/lib/basedriver/commands/event.js +21 -23
- package/build/lib/basedriver/commands/find.d.ts +11 -0
- package/build/lib/basedriver/commands/find.d.ts.map +1 -0
- package/build/lib/basedriver/commands/find.js +42 -37
- package/build/lib/basedriver/commands/index.d.ts +8 -0
- package/build/lib/basedriver/commands/index.d.ts.map +1 -0
- package/build/lib/basedriver/commands/index.js +17 -16
- package/build/lib/basedriver/commands/log.d.ts +12 -0
- package/build/lib/basedriver/commands/log.d.ts.map +1 -0
- package/build/lib/basedriver/commands/log.js +23 -27
- package/build/lib/basedriver/commands/session.d.ts +11 -0
- package/build/lib/basedriver/commands/session.d.ts.map +1 -0
- package/build/lib/basedriver/commands/session.js +21 -149
- package/build/lib/basedriver/commands/settings.d.ts +10 -0
- package/build/lib/basedriver/commands/settings.d.ts.map +1 -0
- package/build/lib/basedriver/commands/settings.js +19 -19
- package/build/lib/basedriver/commands/timeout.d.ts +8 -0
- package/build/lib/basedriver/commands/timeout.d.ts.map +1 -0
- package/build/lib/basedriver/commands/timeout.js +118 -139
- package/build/lib/basedriver/core.d.ts +235 -0
- package/build/lib/basedriver/core.d.ts.map +1 -0
- package/build/lib/basedriver/core.js +283 -0
- package/build/lib/basedriver/desired-caps.d.ts +5 -0
- package/build/lib/basedriver/desired-caps.d.ts.map +1 -0
- package/build/lib/basedriver/desired-caps.js +2 -4
- package/build/lib/basedriver/device-settings.d.ts +32 -0
- package/build/lib/basedriver/device-settings.d.ts.map +1 -0
- package/build/lib/basedriver/device-settings.js +20 -14
- package/build/lib/basedriver/driver.d.ts +83 -0
- package/build/lib/basedriver/driver.d.ts.map +1 -0
- package/build/lib/basedriver/driver.js +101 -256
- package/build/lib/basedriver/helpers.d.ts +132 -0
- package/build/lib/basedriver/helpers.d.ts.map +1 -0
- package/build/lib/basedriver/helpers.js +16 -2
- package/build/lib/basedriver/logger.d.ts +3 -0
- package/build/lib/basedriver/logger.d.ts.map +1 -0
- package/build/lib/basedriver/logger.js +2 -4
- package/build/lib/constants.d.ts +9 -0
- package/build/lib/constants.d.ts.map +1 -0
- package/build/lib/constants.js +2 -4
- package/build/lib/express/crash.d.ts +3 -0
- package/build/lib/express/crash.d.ts.map +1 -0
- package/build/lib/express/crash.js +2 -4
- package/build/lib/express/express-logging.d.ts +3 -0
- package/build/lib/express/express-logging.d.ts.map +1 -0
- package/build/lib/express/express-logging.js +2 -4
- package/build/lib/express/idempotency.d.ts +2 -0
- package/build/lib/express/idempotency.d.ts.map +1 -0
- package/build/lib/express/idempotency.js +2 -4
- package/build/lib/express/logger.d.ts +3 -0
- package/build/lib/express/logger.d.ts.map +1 -0
- package/build/lib/express/logger.js +2 -4
- package/build/lib/express/middleware.d.ts +9 -0
- package/build/lib/express/middleware.d.ts.map +1 -0
- package/build/lib/express/middleware.js +2 -4
- package/build/lib/express/server.d.ts +10 -0
- package/build/lib/express/server.d.ts.map +1 -0
- package/build/lib/express/server.js +2 -4
- package/build/lib/express/static.d.ts +6 -0
- package/build/lib/express/static.d.ts.map +1 -0
- package/build/lib/express/static.js +2 -4
- package/build/lib/express/websocket.d.ts +64 -0
- package/build/lib/express/websocket.d.ts.map +1 -0
- package/build/lib/express/websocket.js +40 -41
- package/build/lib/helpers/capabilities.d.ts +13 -0
- package/build/lib/helpers/capabilities.d.ts.map +1 -0
- package/build/lib/helpers/capabilities.js +40 -2
- package/build/lib/index.d.ts +183 -0
- package/build/lib/index.d.ts.map +1 -0
- package/build/lib/index.js +41 -23
- package/build/lib/jsonwp-proxy/protocol-converter.d.ts +48 -0
- package/build/lib/jsonwp-proxy/protocol-converter.d.ts.map +1 -0
- package/build/lib/jsonwp-proxy/protocol-converter.js +2 -4
- package/build/lib/jsonwp-proxy/proxy.d.ts +41 -0
- package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -0
- package/build/lib/jsonwp-proxy/proxy.js +25 -9
- package/build/lib/jsonwp-status/status.d.ts +159 -0
- package/build/lib/jsonwp-status/status.d.ts.map +1 -0
- package/build/lib/jsonwp-status/status.js +2 -4
- package/build/lib/protocol/errors.d.ts +310 -0
- package/build/lib/protocol/errors.d.ts.map +1 -0
- package/build/lib/protocol/errors.js +82 -5
- package/build/lib/protocol/helpers.d.ts +22 -0
- package/build/lib/protocol/helpers.d.ts.map +1 -0
- package/build/lib/protocol/helpers.js +2 -4
- package/build/lib/protocol/index.d.ts +16 -0
- package/build/lib/protocol/index.d.ts.map +1 -0
- package/build/lib/protocol/index.js +8 -10
- package/build/lib/protocol/protocol.d.ts +11 -0
- package/build/lib/protocol/protocol.d.ts.map +1 -0
- package/build/lib/protocol/protocol.js +3 -9
- package/build/lib/protocol/routes.d.ts +6 -0
- package/build/lib/protocol/routes.d.ts.map +1 -0
- package/build/lib/protocol/routes.js +18 -4
- package/build/lib/protocol/validators.d.ts +8 -0
- package/build/lib/protocol/validators.d.ts.map +1 -0
- package/build/lib/protocol/validators.js +2 -4
- package/build/test/basedriver/README.md +5 -0
- package/build/test/basedriver/driver-e2e-tests.js +2 -4
- package/build/test/basedriver/driver-tests.js +31 -6
- package/build/test/basedriver/index.js +2 -4
- package/build/test/e2e/basedriver/driver.e2e.spec.js +15 -0
- package/build/test/e2e/basedriver/helpers.e2e.spec.js +192 -0
- package/build/test/e2e/basedriver/websockets.e2e.spec.js +87 -0
- package/build/test/e2e/express/server.e2e.spec.js +159 -0
- package/build/test/e2e/jsonwp-proxy/proxy.e2e.spec.js +59 -0
- package/build/test/e2e/protocol/fake-driver.js +163 -0
- package/build/test/e2e/protocol/helpers.js +25 -0
- package/build/test/e2e/protocol/protocol.e2e.spec.js +1186 -0
- package/build/test/helpers.js +2 -4
- package/build/test/unit/basedriver/capabilities.spec.js +672 -0
- package/build/test/unit/basedriver/capability.spec.js +353 -0
- package/build/test/unit/basedriver/commands/event.spec.js +110 -0
- package/build/test/unit/basedriver/commands/log.spec.js +92 -0
- package/build/test/unit/basedriver/driver.spec.js +15 -0
- package/build/test/unit/basedriver/helpers.spec.js +151 -0
- package/build/test/unit/basedriver/timeout.spec.js +135 -0
- package/build/test/unit/express/server.spec.js +155 -0
- package/build/test/unit/express/static.spec.js +26 -0
- package/build/test/unit/jsonwp-proxy/mock-request.js +91 -0
- package/build/test/unit/jsonwp-proxy/protocol-converter.spec.js +171 -0
- package/build/test/unit/jsonwp-proxy/proxy.spec.js +292 -0
- package/build/test/unit/jsonwp-proxy/url.spec.js +165 -0
- package/build/test/unit/jsonwp-status/status.spec.js +34 -0
- package/build/test/unit/protocol/errors.spec.js +390 -0
- package/build/test/unit/protocol/routes.spec.js +80 -0
- package/build/test/unit/protocol/validator.spec.js +149 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/lib/basedriver/capabilities.js +49 -10
- package/lib/basedriver/commands/event.js +49 -31
- package/lib/basedriver/commands/find.js +108 -43
- package/lib/basedriver/commands/index.js +25 -19
- package/lib/basedriver/commands/log.js +60 -33
- package/lib/basedriver/commands/session.js +39 -141
- package/lib/basedriver/commands/settings.js +33 -13
- package/lib/basedriver/commands/timeout.js +153 -153
- package/lib/basedriver/core.js +497 -0
- package/lib/basedriver/desired-caps.js +1 -1
- package/lib/basedriver/device-settings.js +47 -12
- package/lib/basedriver/driver.js +272 -383
- package/lib/basedriver/helpers.js +18 -2
- package/lib/express/websocket.js +35 -32
- package/lib/helpers/capabilities.js +60 -1
- package/lib/index.js +16 -12
- package/lib/jsonwp-proxy/proxy.js +26 -6
- package/lib/protocol/errors.js +42 -42
- package/lib/protocol/index.js +4 -4
- package/lib/protocol/protocol.js +1 -3
- package/lib/protocol/routes.js +9 -0
- package/package.json +22 -14
- package/test/basedriver/README.md +5 -0
- package/test/basedriver/driver-e2e-tests.js +1 -1
- package/test/basedriver/driver-tests.js +31 -2
- package/build/test/basedriver/capabilities-specs.js +0 -674
- package/build/test/basedriver/capability-specs.js +0 -355
- package/build/test/basedriver/commands/event-specs.js +0 -112
- package/build/test/basedriver/commands/log-specs.js +0 -87
- package/build/test/basedriver/driver-e2e-specs.js +0 -17
- package/build/test/basedriver/driver-specs.js +0 -17
- package/build/test/basedriver/helpers-e2e-specs.js +0 -194
- package/build/test/basedriver/helpers-specs.js +0 -153
- package/build/test/basedriver/timeout-specs.js +0 -137
- package/build/test/basedriver/websockets-e2e-specs.js +0 -84
- package/build/test/express/server-e2e-specs.js +0 -161
- package/build/test/express/server-specs.js +0 -157
- package/build/test/express/static-specs.js +0 -28
- package/build/test/jsonwp-proxy/mock-request.js +0 -93
- package/build/test/jsonwp-proxy/protocol-converter-specs.js +0 -173
- package/build/test/jsonwp-proxy/proxy-e2e-specs.js +0 -61
- package/build/test/jsonwp-proxy/proxy-specs.js +0 -294
- package/build/test/jsonwp-proxy/url-specs.js +0 -167
- package/build/test/jsonwp-status/status-specs.js +0 -36
- package/build/test/protocol/errors-specs.js +0 -388
- package/build/test/protocol/fake-driver.js +0 -165
- package/build/test/protocol/helpers.js +0 -27
- package/build/test/protocol/protocol-e2e-specs.js +0 -1188
- package/build/test/protocol/routes-specs.js +0 -82
- package/build/test/protocol/validator-specs.js +0 -151
- package/index.d.ts +0 -386
- package/test/basedriver/capabilities-specs.js +0 -537
- package/test/basedriver/capability-specs.js +0 -383
- package/test/basedriver/commands/event-specs.js +0 -74
- package/test/basedriver/commands/log-specs.js +0 -79
- package/test/basedriver/driver-e2e-specs.js +0 -8
- package/test/basedriver/driver-specs.js +0 -8
- package/test/basedriver/fixtures/BadZippedApp.zip +0 -1
- package/test/basedriver/fixtures/FakeAndroidApp.apk +0 -1
- package/test/basedriver/fixtures/FakeAndroidApp.asd +0 -0
- package/test/basedriver/fixtures/FakeIOSApp.app +0 -1
- package/test/basedriver/fixtures/FakeIOSApp.app.zip +0 -0
- package/test/basedriver/fixtures/FakeIOSApp.ipa +0 -0
- package/test/basedriver/fixtures/custom-element-finder-bad.js +0 -5
- package/test/basedriver/fixtures/custom-element-finder.js +0 -29
- package/test/basedriver/helpers-e2e-specs.js +0 -187
- package/test/basedriver/helpers-specs.js +0 -137
- package/test/basedriver/timeout-specs.js +0 -128
- package/test/basedriver/websockets-e2e-specs.js +0 -75
|
@@ -1,84 +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.on('connection', (ws, req) => {
|
|
58
|
-
ws.should.not.be.empty;
|
|
59
|
-
req.connection.remoteAddress.should.not.be.empty;
|
|
60
|
-
});
|
|
61
|
-
client.on('message', data => {
|
|
62
|
-
data.should.eql(WS_DATA);
|
|
63
|
-
resolve();
|
|
64
|
-
});
|
|
65
|
-
client.on('error', reject);
|
|
66
|
-
setTimeout(() => reject(new Error('No websocket messages have been received after the timeout')), timeout);
|
|
67
|
-
});
|
|
68
|
-
(await baseServer.removeWebSocketHandler(endpoint)).should.be.true;
|
|
69
|
-
|
|
70
|
-
_lodash.default.keys(await baseServer.getWebSocketHandlers()).length.should.eql(0);
|
|
71
|
-
|
|
72
|
-
await new _bluebird.default((resolve, reject) => {
|
|
73
|
-
const client = new _ws.default(`ws://${_helpers.TEST_HOST}:${port}${endpoint}`);
|
|
74
|
-
client.on('message', data => reject(new Error(`No websocket messages are expected after the handler ` + `has been removed. '${data}' is received instead. `)));
|
|
75
|
-
client.on('error', resolve);
|
|
76
|
-
setTimeout(resolve, timeout);
|
|
77
|
-
});
|
|
78
|
-
baseServer.listenerCount('upgrade').should.be.above(previousListenerCount);
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
});require('source-map-support').install();
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYmFzZWRyaXZlci93ZWJzb2NrZXRzLWUyZS1zcGVjcy5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsImJhc2VTZXJ2ZXIiLCJkcml2ZXIiLCJwb3J0IiwiU0VTU0lPTl9JRCIsIldTX0RBVEEiLCJiZWZvcmUiLCJGYWtlRHJpdmVyIiwic2Vzc2lvbklkIiwicm91dGVDb25maWd1cmluZ0Z1bmN0aW9uIiwiYWZ0ZXIiLCJjbG9zZSIsIml0Iiwid3NzIiwiV2ViU29ja2V0IiwiU2VydmVyIiwibm9TZXJ2ZXIiLCJvbiIsIndzIiwicmVhZHlTdGF0ZSIsIk9QRU4iLCJzZW5kIiwicHJldmlvdXNMaXN0ZW5lckNvdW50IiwibGlzdGVuZXJDb3VudCIsImVuZHBvaW50IiwiREVGQVVMVF9XU19QQVRITkFNRV9QUkVGSVgiLCJ0aW1lb3V0IiwiYWRkV2ViU29ja2V0SGFuZGxlciIsInNob3VsZCIsImJlIiwiYWJvdmUiLCJfIiwia2V5cyIsImdldFdlYlNvY2tldEhhbmRsZXJzIiwibGVuZ3RoIiwiZXFsIiwiQiIsInJlc29sdmUiLCJyZWplY3QiLCJjbGllbnQiLCJURVNUX0hPU1QiLCJyZXEiLCJub3QiLCJlbXB0eSIsImNvbm5lY3Rpb24iLCJyZW1vdGVBZGRyZXNzIiwiZGF0YSIsInNldFRpbWVvdXQiLCJFcnJvciIsInJlbW92ZVdlYlNvY2tldEhhbmRsZXIiLCJ0cnVlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQUEsUUFBUSxDQUFDLGtCQUFELEVBQXFCLFlBQVk7QUFDdkMsTUFBSUMsVUFBSjtBQUNBLE1BQUlDLE1BQUo7QUFDQSxNQUFJQyxJQUFKO0FBQ0EsUUFBTUMsVUFBVSxHQUFHLEtBQW5CO0FBQ0EsUUFBTUMsT0FBTyxHQUFHLE9BQWhCO0FBRUFDLEVBQUFBLE1BQU0sQ0FBQyxrQkFBa0I7QUFDdkJKLElBQUFBLE1BQU0sR0FBRyxJQUFJSyxzQkFBSixFQUFUO0FBQ0FMLElB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QVUsQ0FBQ2dDLG9CQUFYLEVBQWIsRUFBZ0RDLE1BQWhELENBQXVETixNQUF2RCxDQUE4RE8sR0FBOUQsQ0FBa0UsQ0FBbEU7O0FBQ0EsWUFBTSxJQUFJQyxpQkFBSixDQUFNLENBQUNDLE9BQUQsRUFBVUMsTUFBVixLQUFxQjtBQUMvQixjQUFNQyxNQUFNLEdBQUcsSUFBSXpCLFdBQUosQ0FBZSxRQUFPMEIsa0JBQVUsSUFBR3JDLElBQUssR0FBRXFCLFFBQVMsRUFBbkQsQ0FBZjtBQUNBZSxRQUFBQSxNQUFNLENBQUN0QixFQUFQLENBQVUsU0FBVixFQUFzQjZCLElBQUQsSUFDbkJSLE1BQU0sQ0FBQyxJQUFJVSxLQUFKLENBQVcsdURBQUQsR0FDQyxzQkFBcUJGLElBQUsseUJBRHJDLENBQUQsQ0FEUjtBQUlBUCxRQUFBQSxNQUFNLENBQUN0QixFQUFQLENBQVUsT0FBVixFQUFtQm9CLE9BQW5CO0FBQ0FVLFFBQUFBLFVBQVUsQ0FBQ1YsT0FBRCxFQUFVWCxPQUFWLENBQVY7QUFDRCxPQVJLLENBQU47QUFTQXpCLE1BQUFBLFVBQVUsQ0FBQ3NCLGFBQVgsQ0FBeUIsU0FBekIsRUFBb0NLLE1BQXBDLENBQTJDQyxFQUEzQyxDQUE4Q0MsS0FBOUMsQ0FBb0RSLHFCQUFwRDtBQUNELEtBMUNDLENBQUY7QUEyQ0QsR0E1Q08sQ0FBUjtBQTZDRCxDQWpFTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHNlcnZlciwgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLFxuICAgICAgICAgREVGQVVMVF9XU19QQVRITkFNRV9QUkVGSVggfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IHsgRmFrZURyaXZlciB9IGZyb20gJy4uL3Byb3RvY29sL2Zha2UtZHJpdmVyJztcbmltcG9ydCBXZWJTb2NrZXQgZnJvbSAnd3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtURVNUX0hPU1QsIGdldFRlc3RQb3J0fSBmcm9tICcuLi9oZWxwZXJzJztcblxuXG5kZXNjcmliZSgnV2Vic29ja2V0cyAoZTJlKScsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJhc2VTZXJ2ZXI7XG4gIGxldCBkcml2ZXI7XG4gIGxldCBwb3J0O1xuICBjb25zdCBTRVNTSU9OX0lEID0gJ2Zvbyc7XG4gIGNvbnN0IFdTX0RBVEEgPSAnSGVsbG8nO1xuXG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgZHJpdmVyID0gbmV3IEZha2VEcml2ZXIoKTtcbiAgICBkcml2ZXIuc2Vzc2lvbklkID0gU0VTU0lPTl9JRDtcbiAgICBwb3J0ID0gYXdhaXQgZ2V0VGVzdFBvcnQoKTtcbiAgICBiYXNlU2VydmVyID0gYXdhaXQgc2VydmVyKHtcbiAgICAgIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbjogcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uKGRyaXZlciksXG4gICAgICBwb3J0LFxuICAgIH0pO1xuICB9KTtcbiAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGJhc2VTZXJ2ZXIuY2xvc2UoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dlYiBzb2NrZXRzIHN1cHBvcnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIGFkZCB3ZWJzb2NrZXQgaGFuZGxlciBhbmQgcmVtb3ZlIGl0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd3NzID0gbmV3IFdlYlNvY2tldC5TZXJ2ZXIoe1xuICAgICAgICBub1NlcnZlcjogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgd3NzLm9uKCdjb25uZWN0aW9uJywgKHdzKSA9PiB7XG4gICAgICAgIGlmICh3cyAmJiB3cy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgICAgIHdzLnNlbmQoV1NfREFUQSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJldmlvdXNMaXN0ZW5lckNvdW50ID0gYmFzZVNlcnZlci5saXN0ZW5lckNvdW50KCd1cGdyYWRlJyk7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IGAke0RFRkFVTFRfV1NfUEFUSE5BTUVfUFJFRklYfS9oZWxsb2A7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gNTAwMDtcbiAgICAgIGF3YWl0IGJhc2VTZXJ2ZXIuYWRkV2ViU29ja2V0SGFuZGxlcihlbmRwb2ludCwgd3NzKTtcbiAgICAgIGJhc2VTZXJ2ZXIubGlzdGVuZXJDb3VudCgndXBncmFkZScpLnNob3VsZC5iZS5hYm92ZShwcmV2aW91c0xpc3RlbmVyQ291bnQpO1xuICAgICAgXy5rZXlzKGF3YWl0IGJhc2VTZXJ2ZXIuZ2V0V2ViU29ja2V0SGFuZGxlcnMoKSkubGVuZ3RoLnNob3VsZC5lcWwoMSk7XG4gICAgICBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBXZWJTb2NrZXQoYHdzOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0ke2VuZHBvaW50fWApO1xuICAgICAgICBjbGllbnQub24oJ2Nvbm5lY3Rpb24nLCAod3MsIHJlcSkgPT4ge1xuICAgICAgICAgIHdzLnNob3VsZC5ub3QuYmUuZW1wdHk7XG4gICAgICAgICAgcmVxLmNvbm5lY3Rpb24ucmVtb3RlQWRkcmVzcy5zaG91bGQubm90LmJlLmVtcHR5O1xuICAgICAgICB9KTtcbiAgICAgICAgY2xpZW50Lm9uKCdtZXNzYWdlJywgKGRhdGEpID0+IHtcbiAgICAgICAgICBkYXRhLnNob3VsZC5lcWwoV1NfREFUQSk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgY2xpZW50Lm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignTm8gd2Vic29ja2V0IG1lc3NhZ2VzIGhhdmUgYmVlbiByZWNlaXZlZCBhZnRlciB0aGUgdGltZW91dCcpKSxcbiAgICAgICAgICAgICAgICAgICB0aW1lb3V0KTtcbiAgICAgIH0pO1xuXG4gICAgICAoYXdhaXQgYmFzZVNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKGVuZHBvaW50KSkuc2hvdWxkLmJlLnRydWU7XG4gICAgICBfLmtleXMoYXdhaXQgYmFzZVNlcnZlci5nZXRXZWJTb2NrZXRIYW5kbGVycygpKS5sZW5ndGguc2hvdWxkLmVxbCgwKTtcbiAgICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gbmV3IFdlYlNvY2tldChgd3M6Ly8ke1RFU1RfSE9TVH06JHtwb3J0fSR7ZW5kcG9pbnR9YCk7XG4gICAgICAgIGNsaWVudC5vbignbWVzc2FnZScsIChkYXRhKSA9PlxuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYE5vIHdlYnNvY2tldCBtZXNzYWdlcyBhcmUgZXhwZWN0ZWQgYWZ0ZXIgdGhlIGhhbmRsZXIgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBgaGFzIGJlZW4gcmVtb3ZlZC4gJyR7ZGF0YX0nIGlzIHJlY2VpdmVkIGluc3RlYWQuIGApKVxuICAgICAgICApO1xuICAgICAgICBjbGllbnQub24oJ2Vycm9yJywgcmVzb2x2ZSk7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZW91dCk7XG4gICAgICB9KTtcbiAgICAgIGJhc2VTZXJ2ZXIubGlzdGVuZXJDb3VudCgndXBncmFkZScpLnNob3VsZC5iZS5hYm92ZShwcmV2aW91c0xpc3RlbmVyQ291bnQpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L2Jhc2Vkcml2ZXIvd2Vic29ja2V0cy1lMmUtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
@@ -1,161 +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
|
-
});require('source-map-support').install();
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvZXhwcmVzcy9zZXJ2ZXItZTJlLXNwZWNzLmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiaHdTZXJ2ZXIiLCJwb3J0Iiwic2FuZGJveCIsImJlZm9yZSIsImNvbmZpZ3VyZVJvdXRlcyIsImFwcCIsImdldCIsInJlcSIsInJlcyIsImhlYWRlciIsInN0YXR1cyIsInNlbmQiLCJoZWFkZXJzIiwiRXJyb3IiLCJCIiwiZGVsYXkiLCJyb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24iLCJiZWZvcmVFYWNoIiwic3R1YiIsImNvbnNvbGUiLCJhZnRlciIsImNsb3NlIiwiYWZ0ZXJFYWNoIiwicmVzdG9yZSIsIml0IiwiZGF0YSIsImF4aW9zIiwiVEVTVF9IT1NUIiwic2hvdWxkIiwiZXFsIiwidXJsIiwiYmUiLCJyZWplY3RlZCIsInJlamVjdGVkV2l0aCIsImJvZHlQcm9taXNlIiwiY2F0Y2giLCJEYXRlIiwibm93Iiwibm90IiwiYWJvdmUiLCJ0aW1lb3V0IiwiXyIsIm5vb3AiLCJob3N0bmFtZSIsImlnbiIsInVwZGF0ZXJXaXRoR2V0Um91dGUiLCJyb3V0ZSIsInJlcGx5IiwiaHR0cFNlcnZlciIsInNlcnZlclVwZGF0ZXJzIiwiX3VwZGF0ZWRfcGx1Z2luMSIsInRydWUiLCJfdXBkYXRlZF9wbHVnaW4yIiwiZXZlbnR1YWxseSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0FBLFFBQVEsQ0FBQyxRQUFELEVBQVcsWUFBWTtBQUM3QixNQUFJQyxRQUFKO0FBQ0EsTUFBSUMsSUFBSjtBQUNBLE1BQUlDLE9BQUo7QUFDQUMsRUFBQUEsTUFBTSxDQUFDLGtCQUFrQjtBQUN2QkYsSUFBQUEsSUFBSSxHQUFHLE1BQU0sMEJBQVksSUFBWixDQUFiOztBQUVBLGFBQVNHLGVBQVQsQ0FBMEJDLEdBQTFCLEVBQStCO0FBQzdCQSxNQUFBQSxHQUFHLENBQUNDLEdBQUosQ0FBUSxHQUFSLEVBQWEsQ0FBQ0Ms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UUFBSTtBQUFDcEIsTUFBQUE7QUFBRCxRQUFTLE1BQU1DLGVBQU1wQixHQUFOLENBQVcsVUFBU3FCLGtCQUFVLElBQUcxQixJQUFLLFVBQXRDLENBQW5CO0FBQ0F3QixJQUFBQSxJQUFJLENBQUNHLE1BQUwsQ0FBWUMsR0FBWixDQUFnQix3QkFBaEI7QUFDQSxLQUFDO0FBQUNKLE1BQUFBO0FBQUQsUUFBUyxNQUFNQyxlQUFNcEIsR0FBTixDQUFXLFVBQVNxQixrQkFBVSxJQUFHMUIsSUFBSyxVQUF0QyxDQUFoQjtBQUNBd0IsSUFBQUEsSUFBSSxDQUFDRyxNQUFMLENBQVlDLEdBQVosQ0FBZ0Isd0JBQWhCO0FBQ0E3QixJQUFBQSxRQUFRLENBQUNrRCxnQkFBVCxDQUEwQnRCLE1BQTFCLENBQWlDRyxFQUFqQyxDQUFvQ29CLElBQXBDO0FBQ0FuRCxJQUFBQSxRQUFRLENBQUNvRCxnQkFBVCxDQUEwQnhCLE1BQTFCLENBQWlDRyxFQUFqQyxDQUFvQ29CLElBQXBDO0FBQ0QsR0FmQyxDQUFGO0FBZ0JBM0IsRUFBQUEsRUFBRSxDQUFDLDJEQUFELEVBQThELGtCQUFrQjtBQUNoRixVQUFNLGlCQUFPO0FBQ1hSLE1BQUFBLHdCQUF3QixFQUFFeUIsZ0JBQUVDLElBRGpCO0FBRVh6QyxNQUFBQSxJQUZXO0FBR1hnRCxNQUFBQSxjQUFjLEVBQUUsQ0FBQyxNQUFNO0FBQUUsY0FBTSxJQUFJcEMsS0FBSixDQUFVLEtBQVYsQ0FBTjtBQUF3QixPQUFqQztBQUhMLEtBQVAsRUFJSGUsTUFKRyxDQUlJeUIsVUFKSixDQUlldEIsRUFKZixDQUlrQkUsWUFKbEIsQ0FJK0IsS0FKL0IsQ0FBTjtBQUtELEdBTkMsQ0FBRjtBQU9ELENBL0NPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bW9jaGFcblxuaW1wb3J0IHsgc2VydmVyIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyBjcmVhdGVTYW5kYm94IH0gZnJvbSAnc2lub24nO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7VEVTVF9IT1NULCBnZXRUZXN0UG9ydH0gZnJvbSAnLi4vaGVscGVycyc7XG5cblxuZGVzY3JpYmUoJ3NlcnZlcicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGh3U2VydmVyO1xuICBsZXQgcG9ydDtcbiAgbGV0IHNhbmRib3g7XG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgcG9ydCA9IGF3YWl0IGdldFRlc3RQb3J0KHRydWUpO1xuXG4gICAgZnVuY3Rpb24gY29uZmlndXJlUm91dGVzIChhcHApIHtcbiAgICAgIGFwcC5nZXQoJy8nLCAocmVxLCByZXMpID0+IHtcbiAgICAgICAgcmVzLmhlYWRlclsnY29udGVudC10eXBlJ10gPSAndGV4dC9odG1sJztcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLnNlbmQoJ0hlbGxvIFdvcmxkIScpO1xuICAgICAgfSk7XG4gICAgICBhcHAuZ2V0KCcvcHl0aG9uJywgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHJlcS5oZWFkZXJzWydjb250ZW50LXR5cGUnXSk7XG4gICAgICB9KTtcbiAgICAgIGFwcC5nZXQoJy9lcnJvcicsICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoYWhhaGEnKTtcbiAgICAgIH0pO1xuICAgICAgYXBwLmdldCgnL3BhdXNlJywgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIHJlcy5oZWFkZXJbJ2NvbnRlbnQtdHlwZSddID0gJ3RleHQvaHRtbCc7XG4gICAgICAgIGF3YWl0IEIuZGVsYXkoMTAwMCk7XG4gICAgICAgIHJlcy5zdGF0dXMoMjAwKS5zZW5kKCdXZSBoYXZlIHdhaXRlZCEnKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBod1NlcnZlciA9IGF3YWl0IHNlcnZlcih7XG4gICAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb246IGNvbmZpZ3VyZVJvdXRlcyxcbiAgICAgIHBvcnQsXG4gICAgfSk7XG4gIH0pO1xuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94ID0gY3JlYXRlU2FuZGJveCgpO1xuICAgIHNhbmRib3guc3R1Yihjb25zb2xlLCAnZXJyb3InKTtcbiAgfSk7XG4gIGFmdGVyKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBod1NlcnZlci5jbG9zZSgpO1xuICB9KTtcbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzdGFydCB1cCB3aXRoIG91ciBtaWRkbGV3YXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHtkYXRhfSA9IGF3YWl0IGF4aW9zLmdldChgaHR0cDovLyR7VEVTVF9IT1NUfToke3BvcnR9L2ApO1xuICAgIGRhdGEuc2hvdWxkLmVxbCgnSGVsbG8gV29ybGQhJyk7XG4gIH0pO1xuICBpdCgnc2hvdWxkIGZpeCBicm9rZW4gY29udGV4dCB0eXBlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHtkYXRhfSA9IGF3YWl0IGF4aW9zKHtcbiAgICAgIHVybDogYGh0dHA6Ly8ke1RFU1RfSE9TVH06JHtwb3J0fS9weXRob25gLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAndXNlci1hZ2VudCc6ICdQeXRob24nLFxuICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkYXRhLnNob3VsZC5lcWwoJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnKTtcbiAgfSk7XG4gIGl0KCdzaG91bGQgY2F0Y2ggZXJyb3JzIGluIHRoZSBjYXRjaGFsbCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBheGlvcy5nZXQoYGh0dHA6Ly8ke1RFU1RfSE9TVH06JHtwb3J0fS9lcnJvcmApLnNob3VsZC5iZS5yZWplY3RlZDtcbiAgfSk7XG4gIGl0KCdzaG91bGQgZXJyb3IgaWYgd2UgdHJ5IHRvIHN0YXJ0IGFnYWluIG9uIGEgcG9ydCB0aGF0IGlzIHVzZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgc2VydmVyKHtcbiAgICAgIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiAoKSB7fSxcbiAgICAgIHBvcnQsXG4gICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvRUFERFJJTlVTRS8pO1xuICB9KTtcbiAgaXQoJ3Nob3VsZCBub3Qgd2FpdCBmb3IgdGhlIHNlcnZlciBjbG9zZSBjb25uZWN0aW9ucyBiZWZvcmUgZmluaXNoaW5nIGNsb3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGJvZHlQcm9taXNlID0gYXhpb3MuZ2V0KGBodHRwOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0vcGF1c2VgKS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgICAvLyByZWxpbnF1aXNoIGNvbnRyb2wgc28gdGhhdCB3ZSBkb24ndCBjbG9zZSBiZWZvcmUgdGhlIHJlcXVlc3QgaXMgcmVjZWl2ZWRcbiAgICBhd2FpdCBCLmRlbGF5KDEwMCk7XG5cbiAgICBsZXQgYmVmb3JlID0gRGF0ZS5ub3coKTtcbiAgICBhd2FpdCBod1NlcnZlci5jbG9zZSgpO1xuICAgIC8vIGV4cGVjdCBzbGlnaHRseSBsZXNzIHRoYW4gdGhlIHJlcXVlc3Qgd2FpdGVkLCBzaW5jZSB3ZSBwYXVzZWQgYWJvdmVcbiAgICAoRGF0ZS5ub3coKSAtIGJlZm9yZSkuc2hvdWxkLm5vdC5iZS5hYm92ZSg4MDApO1xuXG4gICAgYXdhaXQgYm9keVByb21pc2U7XG4gIH0pO1xuICBpdCgnc2hvdWxkIGVycm9yIGlmIHdlIHRyeSB0byBzdGFydCBvbiBhIGJhZCBob3N0bmFtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRpbWVvdXQoNjAwMDApO1xuICAgIGF3YWl0IHNlcnZlcih7XG4gICAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb246IF8ubm9vcCxcbiAgICAgIHBvcnQsXG4gICAgICBob3N0bmFtZTogJ2xvbGNhdGhvc3QnLFxuICAgIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0VOT1RGT1VORHxFQUREUk5PVEFWQUlMfEVBSV9BR0FJTi8pO1xuICAgIGF3YWl0IHNlcnZlcih7XG4gICAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb246IF8ubm9vcCxcbiAgICAgIHBvcnQsXG4gICAgICBob3N0bmFtZTogJzEuMS4xLjEnLFxuICAgIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0VBRERSTk9UQVZBSUwvKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3NlcnZlciBwbHVnaW5zJywgZnVuY3Rpb24gKCkge1xuICBsZXQgaHdTZXJ2ZXI7XG4gIGxldCBwb3J0O1xuXG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgcG9ydCA9IGF3YWl0IGdldFRlc3RQb3J0KHRydWUpO1xuICB9KTtcblxuICBhZnRlckVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBod1NlcnZlci5jbG9zZSgpO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgfSk7XG5cbiAgZnVuY3Rpb24gdXBkYXRlcldpdGhHZXRSb3V0ZSAocm91dGUsIHJlcGx5KSB7XG4gICAgcmV0dXJuIGFzeW5jIChhcHAsIGh0dHBTZXJ2ZXIpID0+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgICBhcHAuZ2V0KGAvJHtyb3V0ZX1gLCAocmVxLCByZXMpID0+IHtcbiAgICAgICAgcmVzLmhlYWRlclsnY29udGVudC10eXBlJ10gPSAndGV4dC9odG1sJztcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLnNlbmQocmVwbHkpO1xuICAgICAgfSk7XG4gICAgICBodHRwU2VydmVyW2BfdXBkYXRlZF8ke3JvdXRlfWBdID0gdHJ1ZTtcbiAgICB9O1xuICB9XG5cbiAgaXQoJ3Nob3VsZCBhbGxvdyBvbmUgb3IgbW9yZSBwbHVnaW5zIHRvIHVwZGF0ZSB0aGUgc2VydmVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGh3U2VydmVyID0gYXdhaXQgc2VydmVyKHtcbiAgICAgIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbjogXy5ub29wLFxuICAgICAgcG9ydCxcbiAgICAgIHNlcnZlclVwZGF0ZXJzOiBbXG4gICAgICAgIHVwZGF0ZXJXaXRoR2V0Um91dGUoJ3BsdWdpbjEnLCAncmVzIGZyb20gcGx1Z2luMSByb3V0ZScpLFxuICAgICAgICB1cGRhdGVyV2l0aEdldFJvdXRlKCdwbHVnaW4yJywgJ3JlcyBmcm9tIHBsdWdpbjIgcm91dGUnKSxcbiAgICAgIF1cbiAgICB9KTtcbiAgICBsZXQge2RhdGF9ID0gYXdhaXQgYXhpb3MuZ2V0KGBodHRwOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0vcGx1Z2luMWApO1xuICAgIGRhdGEuc2hvdWxkLmVxbCgncmVzIGZyb20gcGx1Z2luMSByb3V0ZScpO1xuICAgICh7ZGF0YX0gPSBhd2FpdCBheGlvcy5nZXQoYGh0dHA6Ly8ke1RFU1RfSE9TVH06JHtwb3J0fS9wbHVnaW4yYCkpO1xuICAgIGRhdGEuc2hvdWxkLmVxbCgncmVzIGZyb20gcGx1Z2luMiByb3V0ZScpO1xuICAgIGh3U2VydmVyLl91cGRhdGVkX3BsdWdpbjEuc2hvdWxkLmJlLnRydWU7XG4gICAgaHdTZXJ2ZXIuX3VwZGF0ZWRfcGx1Z2luMi5zaG91bGQuYmUudHJ1ZTtcbiAgfSk7XG4gIGl0KCdzaG91bGQgcGFzcyBvbiBlcnJvcnMgZnJvbSB0aGUgcGx1Z2luIHVwZGF0ZVNlcnZlciBtZXRob2QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgc2VydmVyKHtcbiAgICAgIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbjogXy5ub29wLFxuICAgICAgcG9ydCxcbiAgICAgIHNlcnZlclVwZGF0ZXJzOiBbKCkgPT4geyB0aHJvdyBuZXcgRXJyb3IoJ3VnaCcpO31dXG4gICAgfSkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC91Z2gvKTtcbiAgfSk7XG59KTtcbiJdLCJmaWxlIjoidGVzdC9leHByZXNzL3NlcnZlci1lMmUtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
require("source-map-support/register");
|
|
4
|
-
|
|
5
|
-
var _lib = require("../../lib");
|
|
6
|
-
|
|
7
|
-
var _server2 = require("../../lib/express/server");
|
|
8
|
-
|
|
9
|
-
var _sinon = require("sinon");
|
|
10
|
-
|
|
11
|
-
var _helpers = require("../helpers");
|
|
12
|
-
|
|
13
|
-
const newMethodMap = {
|
|
14
|
-
'/session/:sessionId/fake': {
|
|
15
|
-
GET: {
|
|
16
|
-
command: 'fakeGet'
|
|
17
|
-
},
|
|
18
|
-
POST: {
|
|
19
|
-
command: 'fakePost',
|
|
20
|
-
payloadParams: {
|
|
21
|
-
required: ['fakeParam']
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
const updateServer = (app, httpServer) => {
|
|
28
|
-
app.updated = true;
|
|
29
|
-
httpServer.updated = true;
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
function fakeDriver() {
|
|
33
|
-
return {
|
|
34
|
-
sessionExists: () => {},
|
|
35
|
-
executeCommand: () => {}
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
describe('server configuration', function () {
|
|
40
|
-
let port;
|
|
41
|
-
let sandbox;
|
|
42
|
-
|
|
43
|
-
function fakeApp() {
|
|
44
|
-
const app = {
|
|
45
|
-
use: sandbox.spy(),
|
|
46
|
-
all: sandbox.spy(),
|
|
47
|
-
get: sandbox.spy(),
|
|
48
|
-
post: sandbox.spy(),
|
|
49
|
-
delete: sandbox.spy(),
|
|
50
|
-
totalCount: () => app.use.callCount + app.all.callCount + app.get.callCount + app.post.callCount + app.delete.callCount
|
|
51
|
-
};
|
|
52
|
-
return app;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
before(async function () {
|
|
56
|
-
port = await (0, _helpers.getTestPort)(true);
|
|
57
|
-
});
|
|
58
|
-
beforeEach(function () {
|
|
59
|
-
sandbox = (0, _sinon.createSandbox)();
|
|
60
|
-
});
|
|
61
|
-
afterEach(function () {
|
|
62
|
-
sandbox.restore();
|
|
63
|
-
});
|
|
64
|
-
it('should actually use the middleware', function () {
|
|
65
|
-
const app = fakeApp();
|
|
66
|
-
|
|
67
|
-
const configureRoutes = () => {};
|
|
68
|
-
|
|
69
|
-
(0, _server2.configureServer)({
|
|
70
|
-
app,
|
|
71
|
-
addRoutes: configureRoutes
|
|
72
|
-
});
|
|
73
|
-
app.use.callCount.should.equal(14);
|
|
74
|
-
app.all.callCount.should.equal(4);
|
|
75
|
-
});
|
|
76
|
-
it('should apply new methods in plugins to the standard method map', function () {
|
|
77
|
-
const app1 = fakeApp();
|
|
78
|
-
const app2 = fakeApp();
|
|
79
|
-
const driver = fakeDriver();
|
|
80
|
-
const addRoutes = (0, _lib.routeConfiguringFunction)(driver);
|
|
81
|
-
(0, _server2.configureServer)({
|
|
82
|
-
app: app1,
|
|
83
|
-
addRoutes
|
|
84
|
-
});
|
|
85
|
-
(0, _server2.configureServer)({
|
|
86
|
-
app: app2,
|
|
87
|
-
addRoutes,
|
|
88
|
-
extraMethodMap: newMethodMap
|
|
89
|
-
});
|
|
90
|
-
app2.totalCount().should.eql(app1.totalCount() + 2);
|
|
91
|
-
});
|
|
92
|
-
it('should silently reject new methods in plugins if not plain objects', function () {
|
|
93
|
-
const app1 = fakeApp();
|
|
94
|
-
const app2 = fakeApp();
|
|
95
|
-
const driver = fakeDriver();
|
|
96
|
-
const addRoutes = (0, _lib.routeConfiguringFunction)(driver);
|
|
97
|
-
(0, _server2.configureServer)({
|
|
98
|
-
app: app1,
|
|
99
|
-
addRoutes
|
|
100
|
-
});
|
|
101
|
-
(0, _server2.configureServer)({
|
|
102
|
-
app: app2,
|
|
103
|
-
addRoutes,
|
|
104
|
-
extraMethodMap: []
|
|
105
|
-
});
|
|
106
|
-
app2.totalCount().should.eql(app1.totalCount());
|
|
107
|
-
});
|
|
108
|
-
it('should allow plugins to update the server', async function () {
|
|
109
|
-
const driver = fakeDriver();
|
|
110
|
-
|
|
111
|
-
const _server = await (0, _lib.server)({
|
|
112
|
-
routeConfiguringFunction: (0, _lib.routeConfiguringFunction)(driver),
|
|
113
|
-
port,
|
|
114
|
-
extraMethodMap: newMethodMap,
|
|
115
|
-
serverUpdaters: [updateServer]
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
try {
|
|
119
|
-
_server.updated.should.be.true;
|
|
120
|
-
} finally {
|
|
121
|
-
await _server.close();
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
it('should reject if error thrown in configureRoutes parameter', async function () {
|
|
125
|
-
const configureRoutes = () => {
|
|
126
|
-
throw new Error('I am Mr. MeeSeeks look at me!');
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
await (0, _lib.server)({
|
|
130
|
-
routeConfiguringFunction: configureRoutes,
|
|
131
|
-
port
|
|
132
|
-
}).should.be.rejectedWith('MeeSeeks');
|
|
133
|
-
});
|
|
134
|
-
describe('#normalizeBasePath', function () {
|
|
135
|
-
it('should throw an error for paths of the wrong type', function () {
|
|
136
|
-
should.throw(() => {
|
|
137
|
-
(0, _server2.normalizeBasePath)(null);
|
|
138
|
-
});
|
|
139
|
-
should.throw(() => {
|
|
140
|
-
(0, _server2.normalizeBasePath)(1);
|
|
141
|
-
});
|
|
142
|
-
});
|
|
143
|
-
it('should remove trailing slashes', function () {
|
|
144
|
-
(0, _server2.normalizeBasePath)('/wd/hub/').should.eql('/wd/hub');
|
|
145
|
-
(0, _server2.normalizeBasePath)('/foo/').should.eql('/foo');
|
|
146
|
-
(0, _server2.normalizeBasePath)('/').should.eql('');
|
|
147
|
-
});
|
|
148
|
-
it('should ensure a leading slash is present', function () {
|
|
149
|
-
(0, _server2.normalizeBasePath)('foo').should.eql('/foo');
|
|
150
|
-
(0, _server2.normalizeBasePath)('wd/hub').should.eql('/wd/hub');
|
|
151
|
-
(0, _server2.normalizeBasePath)('wd/hub/').should.eql('/wd/hub');
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
});require('source-map-support').install();
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvZXhwcmVzcy9zZXJ2ZXItc3BlY3MuanMiXSwibmFtZXMiOlsibmV3TWV0aG9kTWFwIiwiR0VUIiwiY29tbWFuZCIsIlBPU1QiLCJwYXlsb2FkUGFyYW1zIiwicmVxdWlyZWQiLCJ1cGRhdGVTZXJ2ZXIiLCJhcHAiLCJodHRwU2VydmVyIiwidXBkYXRlZCIsImZha2VEcml2ZXIiLCJzZXNzaW9uRXhpc3RzIiwiZXhlY3V0ZUNvbW1hbmQiLCJkZXNjcmliZSIsInBvcnQiLCJzYW5kYm94IiwiZmFrZUFwcCIsInVzZSIsInNweSIsImFsbCIsImdldCIsInBvc3QiLCJkZWxldGUiLCJ0b3RhbENvdW50IiwiY2FsbENvdW50IiwiYmVmb3JlIiwiYmVmb3JlRWFjaCIsImFmdGVyRWFjaCIsInJlc3RvcmUiLCJpdCIsImNvbmZpZ3VyZVJvdXRlcyIsImFkZFJvdXRlcyIsInNob3VsZCIsImVxdWFsIiwiYXBwMSIsImFwcDIiLCJkcml2ZXIiLCJleHRyYU1ldGhvZE1hcCIsImVxbCIsIl9zZXJ2ZXIiLCJyb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24iLCJzZXJ2ZXJVcGRhdGVycyIsImJlIiwidHJ1ZSIsImNsb3NlIiwiRXJyb3IiLCJyZWplY3RlZFdpdGgiLCJ0aHJvdyJdLCJtYXBwaW5ncyI6Ijs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLFlBQVksR0FBRztBQUNuQiw4QkFBNEI7QUFDMUJDLElBQUFBLEdBQUcsRUFBRTtBQUFDQyxNQUFBQSxPQUFPLEVBQUU7QUFBVixLQURxQjtBQUUxQkMsSUFBQUEsSUFBSSxFQUFFO0FBQUNELE1BQUFBLE9BQU8sRUFBRSxVQUFWO0FBQXNCRSxNQUFBQSxhQUFhLEVBQUU7QUFBQ0MsUUFBQUEsUUFBUSxFQUFFLENBQUMsV0FBRDtBQUFYO0FBQXJDO0FBRm9CO0FBRFQsQ0FBckI7O0FBT0EsTUFBTUMsWUFBWSxHQUFHLENBQUNDLEdBQUQsRUFBTUMsVUFBTixLQUFxQjtBQUN4Q0QsRUFBQUEsR0FB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dXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptb2NoYVxuXG5pbXBvcnQgeyBzZXJ2ZXIsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgeyBjb25maWd1cmVTZXJ2ZXIsIG5vcm1hbGl6ZUJhc2VQYXRoIH0gZnJvbSAnLi4vLi4vbGliL2V4cHJlc3Mvc2VydmVyJztcbmltcG9ydCB7IGNyZWF0ZVNhbmRib3ggfSBmcm9tICdzaW5vbic7XG5pbXBvcnQgeyBnZXRUZXN0UG9ydCB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5jb25zdCBuZXdNZXRob2RNYXAgPSB7XG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2Zha2UnOiB7XG4gICAgR0VUOiB7Y29tbWFuZDogJ2Zha2VHZXQnfSxcbiAgICBQT1NUOiB7Y29tbWFuZDogJ2Zha2VQb3N0JywgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ2Zha2VQYXJhbSddfX1cbiAgfSxcbn07XG5cbmNvbnN0IHVwZGF0ZVNlcnZlciA9IChhcHAsIGh0dHBTZXJ2ZXIpID0+IHtcbiAgYXBwLnVwZGF0ZWQgPSB0cnVlO1xuICBodHRwU2VydmVyLnVwZGF0ZWQgPSB0cnVlO1xufTtcblxuZnVuY3Rpb24gZmFrZURyaXZlciAoKSB7XG4gIHJldHVybiB7c2Vzc2lvbkV4aXN0czogKCkgPT4ge30sIGV4ZWN1dGVDb21tYW5kOiAoKSA9PiB7fX07XG59XG5cbmRlc2NyaWJlKCdzZXJ2ZXIgY29uZmlndXJhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHBvcnQ7XG5cbiAgbGV0IHNhbmRib3g7XG5cbiAgZnVuY3Rpb24gZmFrZUFwcCAoKSB7XG4gICAgY29uc3QgYXBwID0ge1xuICAgICAgdXNlOiBzYW5kYm94LnNweSgpLFxuICAgICAgYWxsOiBzYW5kYm94LnNweSgpLFxuICAgICAgZ2V0OiBzYW5kYm94LnNweSgpLFxuICAgICAgcG9zdDogc2FuZGJveC5zcHkoKSxcbiAgICAgIGRlbGV0ZTogc2FuZGJveC5zcHkoKSxcbiAgICAgIHRvdGFsQ291bnQ6ICgpID0+IChcbiAgICAgICAgYXBwLnVzZS5jYWxsQ291bnQgKyBhcHAuYWxsLmNhbGxDb3VudCArIGFwcC5nZXQuY2FsbENvdW50ICsgYXBwLnBvc3QuY2FsbENvdW50ICtcbiAgICAgICAgYXBwLmRlbGV0ZS5jYWxsQ291bnRcbiAgICAgIClcbiAgICB9O1xuICAgIHJldHVybiBhcHA7XG4gIH1cblxuICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIHBvcnQgPSBhd2FpdCBnZXRUZXN0UG9ydCh0cnVlKTtcbiAgfSk7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveCA9IGNyZWF0ZVNhbmRib3goKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhY3R1YWxseSB1c2UgdGhlIG1pZGRsZXdhcmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYXBwID0gZmFrZUFwcCgpO1xuICAgIGNvbnN0IGNvbmZpZ3VyZVJvdXRlcyA9ICgpID0+IHt9O1xuICAgIGNvbmZpZ3VyZVNlcnZlcih7YXBwLCBhZGRSb3V0ZXM6IGNvbmZpZ3VyZVJvdXRlc30pO1xuICAgIGFwcC51c2UuY2FsbENvdW50LnNob3VsZC5lcXVhbCgxNCk7XG4gICAgYXBwLmFsbC5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFwcGx5IG5ldyBtZXRob2RzIGluIHBsdWdpbnMgdG8gdGhlIHN0YW5kYXJkIG1ldGhvZCBtYXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYXBwMSA9IGZha2VBcHAoKTtcbiAgICBjb25zdCBhcHAyID0gZmFrZUFwcCgpO1xuICAgIGNvbnN0IGRyaXZlciA9IGZha2VEcml2ZXIoKTtcbiAgICBjb25zdCBhZGRSb3V0ZXMgPSByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24oZHJpdmVyKTtcbiAgICBjb25maWd1cmVTZXJ2ZXIoe2FwcDogYXBwMSwgYWRkUm91dGVzfSk7XG4gICAgY29uZmlndXJlU2VydmVyKHthcHA6IGFwcDIsIGFkZFJvdXRlcywgZXh0cmFNZXRob2RNYXA6IG5ld01ldGhvZE1hcH0pO1xuICAgIGFwcDIudG90YWxDb3VudCgpLnNob3VsZC5lcWwoYXBwMS50b3RhbENvdW50KCkgKyAyKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzaWxlbnRseSByZWplY3QgbmV3IG1ldGhvZHMgaW4gcGx1Z2lucyBpZiBub3QgcGxhaW4gb2JqZWN0cycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBhcHAxID0gZmFrZUFwcCgpO1xuICAgIGNvbnN0IGFwcDIgPSBmYWtlQXBwKCk7XG4gICAgY29uc3QgZHJpdmVyID0gZmFrZURyaXZlcigpO1xuICAgIGNvbnN0IGFkZFJvdXRlcyA9IHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbihkcml2ZXIpO1xuICAgIGNvbmZpZ3VyZVNlcnZlcih7YXBwOiBhcHAxLCBhZGRSb3V0ZXN9KTtcbiAgICBjb25maWd1cmVTZXJ2ZXIoe2FwcDogYXBwMiwgYWRkUm91dGVzLCBleHRyYU1ldGhvZE1hcDogW119KTtcbiAgICBhcHAyLnRvdGFsQ291bnQoKS5zaG91bGQuZXFsKGFwcDEudG90YWxDb3VudCgpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhbGxvdyBwbHVnaW5zIHRvIHVwZGF0ZSB0aGUgc2VydmVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGRyaXZlciA9IGZha2VEcml2ZXIoKTtcbiAgICBjb25zdCBfc2VydmVyID0gYXdhaXQgc2VydmVyKHtcbiAgICAgIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbjogcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uKGRyaXZlciksXG4gICAgICBwb3J0LFxuICAgICAgZXh0cmFNZXRob2RNYXA6IG5ld01ldGhvZE1hcCxcbiAgICAgIHNlcnZlclVwZGF0ZXJzOiBbdXBkYXRlU2VydmVyXVxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBfc2VydmVyLnVwZGF0ZWQuc2hvdWxkLmJlLnRydWU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IF9zZXJ2ZXIuY2xvc2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmVqZWN0IGlmIGVycm9yIHRocm93biBpbiBjb25maWd1cmVSb3V0ZXMgcGFyYW1ldGVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvbmZpZ3VyZVJvdXRlcyA9ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSSBhbSBNci4gTWVlU2Vla3MgbG9vayBhdCBtZSEnKTtcbiAgICB9O1xuICAgIGF3YWl0IHNlcnZlcih7XG4gICAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb246IGNvbmZpZ3VyZVJvdXRlcyxcbiAgICAgIHBvcnQsXG4gICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnTWVlU2Vla3MnKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNub3JtYWxpemVCYXNlUGF0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHRocm93IGFuIGVycm9yIGZvciBwYXRocyBvZiB0aGUgd3JvbmcgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC50aHJvdygoKSA9PiB7XG4gICAgICAgIG5vcm1hbGl6ZUJhc2VQYXRoKG51bGwpO1xuICAgICAgfSk7XG4gICAgICBzaG91bGQudGhyb3coKCkgPT4ge1xuICAgICAgICBub3JtYWxpemVCYXNlUGF0aCgxKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBub3JtYWxpemVCYXNlUGF0aCgnL3dkL2h1Yi8nKS5zaG91bGQuZXFsKCcvd2QvaHViJyk7XG4gICAgICBub3JtYWxpemVCYXNlUGF0aCgnL2Zvby8nKS5zaG91bGQuZXFsKCcvZm9vJyk7XG4gICAgICBub3JtYWxpemVCYXNlUGF0aCgnLycpLnNob3VsZC5lcWwoJycpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZW5zdXJlIGEgbGVhZGluZyBzbGFzaCBpcyBwcmVzZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgbm9ybWFsaXplQmFzZVBhdGgoJ2ZvbycpLnNob3VsZC5lcWwoJy9mb28nKTtcbiAgICAgIG5vcm1hbGl6ZUJhc2VQYXRoKCd3ZC9odWInKS5zaG91bGQuZXFsKCcvd2QvaHViJyk7XG4gICAgICBub3JtYWxpemVCYXNlUGF0aCgnd2QvaHViLycpLnNob3VsZC5lcWwoJy93ZC9odWInKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJmaWxlIjoidGVzdC9leHByZXNzL3NlcnZlci1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
require("source-map-support/register");
|
|
4
|
-
|
|
5
|
-
var _static = require("../../lib/express/static");
|
|
6
|
-
|
|
7
|
-
var _sinon = require("sinon");
|
|
8
|
-
|
|
9
|
-
describe('welcome', function () {
|
|
10
|
-
let sandbox;
|
|
11
|
-
beforeEach(function () {
|
|
12
|
-
sandbox = (0, _sinon.createSandbox)();
|
|
13
|
-
});
|
|
14
|
-
afterEach(function () {
|
|
15
|
-
sandbox.restore();
|
|
16
|
-
});
|
|
17
|
-
it('should fill the template', async function () {
|
|
18
|
-
let res = {
|
|
19
|
-
send: sandbox.stub()
|
|
20
|
-
};
|
|
21
|
-
await (0, _static.welcome)({}, res);
|
|
22
|
-
res.send.calledOnce.should.be.true;
|
|
23
|
-
res.send.args[0][0].should.include('Let\'s browse!');
|
|
24
|
-
});
|
|
25
|
-
});require('source-map-support').install();
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvZXhwcmVzcy9zdGF0aWMtc3BlY3MuanMiXSwibmFtZXMiOlsiZGVzY3JpYmUiLCJzYW5kYm94IiwiYmVmb3JlRWFjaCIsImFmdGVyRWFjaCIsInJlc3RvcmUiLCJpdCIsInJlcyIsInNlbmQiLCJzdHViIiwiY2FsbGVkT25jZSIsInNob3VsZCIsImJlIiwidHJ1ZSIsImFyZ3MiLCJpbmNsdWRlIl0sIm1hcHBpbmdzIjoiOzs7O0FBRUE7O0FBQ0E7O0FBRUFBLFFBQVEsQ0FBQyxTQUFELEVBQVksWUFBWTtBQUM5QixNQUFJQyxPQUFKO0FBRUFDLEVBQUFBLFVBQVUsQ0FBQyxZQUFZO0FBQ3JCRCxJQUFBQSxPQUFPLEdBQUcsMkJBQVY7QUFDRCxHQUZTLENBQVY7QUFJQUUsRUFBQUEsU0FBUyxDQUFDLFlBQVk7QUFDcEJGLElBQUFBLE9BQU8sQ0FBQ0csT0FBUjtBQUNELEdBRlEsQ0FBVDtBQUlBQyxFQUFBQSxFQUFFLENBQUMsMEJBQUQsRUFBNkIsa0JBQWtCO0FBQy9DLFFBQUlDLEdBQUcsR0FBRztBQUNSQyxNQUFBQSxJQUFJLEVBQUVOLE9BQU8sQ0FBQ08sSUFBUjtBQURFLEtBQVY7QUFHQSxVQUFNLHFCQUFRLEVBQVIsRUFBWUYsR0FBWixDQUFOO0FBRUFBLElBQUFBLEdBQUcsQ0FBQ0MsSUFBSixDQUFTRSxVQUFULENBQW9CQyxNQUFwQixDQUEyQkMsRUFBM0IsQ0FBOEJDLElBQTlCO0FBQ0FOLElBQUFBLEdBQUcsQ0FBQ0MsSUFBSixDQUFTTSxJQUFULENBQWMsQ0FBZCxFQUFpQixDQUFqQixFQUFvQkgsTUFBcEIsQ0FBMkJJLE9BQTNCLENBQW1DLGdCQUFuQztBQUNELEdBUkMsQ0FBRjtBQVNELENBcEJPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bW9jaGFcblxuaW1wb3J0IHsgd2VsY29tZSB9IGZyb20gJy4uLy4uL2xpYi9leHByZXNzL3N0YXRpYyc7XG5pbXBvcnQgeyBjcmVhdGVTYW5kYm94IH0gZnJvbSAnc2lub24nO1xuXG5kZXNjcmliZSgnd2VsY29tZScsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHNhbmRib3g7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveCA9IGNyZWF0ZVNhbmRib3goKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmaWxsIHRoZSB0ZW1wbGF0ZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcmVzID0ge1xuICAgICAgc2VuZDogc2FuZGJveC5zdHViKClcbiAgICB9O1xuICAgIGF3YWl0IHdlbGNvbWUoe30sIHJlcyk7XG5cbiAgICByZXMuc2VuZC5jYWxsZWRPbmNlLnNob3VsZC5iZS50cnVlO1xuICAgIHJlcy5zZW5kLmFyZ3NbMF1bMF0uc2hvdWxkLmluY2x1ZGUoJ0xldFxcJ3MgYnJvd3NlIScpO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L2V4cHJlc3Mvc3RhdGljLXNwZWNzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
require("source-map-support/register");
|
|
9
|
-
|
|
10
|
-
function resFixture(url, method) {
|
|
11
|
-
if (/\/status$/.test(url)) {
|
|
12
|
-
return [200, {
|
|
13
|
-
status: 0,
|
|
14
|
-
value: {
|
|
15
|
-
foo: 'bar'
|
|
16
|
-
}
|
|
17
|
-
}];
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
if (/\/element\/bad\/text$/.test(url)) {
|
|
21
|
-
return [500, {
|
|
22
|
-
status: 11,
|
|
23
|
-
value: {
|
|
24
|
-
message: 'Invisible element'
|
|
25
|
-
}
|
|
26
|
-
}];
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
if (/\/element\/200\/text$/.test(url)) {
|
|
30
|
-
return [200, {
|
|
31
|
-
status: 11,
|
|
32
|
-
value: {
|
|
33
|
-
message: 'Invisible element'
|
|
34
|
-
}
|
|
35
|
-
}];
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (/\/element\/200\/value$/.test(url)) {
|
|
39
|
-
return [200, {
|
|
40
|
-
status: 0,
|
|
41
|
-
sessionId: 'innersessionid',
|
|
42
|
-
value: 'foobar'
|
|
43
|
-
}];
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
if (/\/session$/.test(url) && method === 'POST') {
|
|
47
|
-
return [200, {
|
|
48
|
-
status: 0,
|
|
49
|
-
sessionId: '123',
|
|
50
|
-
value: {
|
|
51
|
-
browserName: 'boo'
|
|
52
|
-
}
|
|
53
|
-
}];
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (/\/nochrome$/.test(url)) {
|
|
57
|
-
return [100, {
|
|
58
|
-
status: 0,
|
|
59
|
-
value: {
|
|
60
|
-
message: 'chrome not reachable'
|
|
61
|
-
}
|
|
62
|
-
}];
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
throw new Error("Can't handle url " + url);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
async function request(opts) {
|
|
69
|
-
const {
|
|
70
|
-
url,
|
|
71
|
-
method,
|
|
72
|
-
json
|
|
73
|
-
} = opts;
|
|
74
|
-
|
|
75
|
-
if (/badurl$/.test(url)) {
|
|
76
|
-
throw new Error('noworky');
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const [status, data] = resFixture(url, method, json);
|
|
80
|
-
return {
|
|
81
|
-
status,
|
|
82
|
-
headers: {
|
|
83
|
-
'content-type': 'application/json; charset=utf-8'
|
|
84
|
-
},
|
|
85
|
-
data
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
var _default = request;
|
|
90
|
-
exports.default = _default;require('source-map-support').install();
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvanNvbndwLXByb3h5L21vY2stcmVxdWVzdC5qcyJdLCJuYW1lcyI6WyJyZXNGaXh0dXJlIiwidXJsIiwibWV0aG9kIiwidGVzdCIsInN0YXR1cyIsInZhbHVlIiwiZm9vIiwibWVzc2FnZSIsInNlc3Npb25JZCIsImJyb3dzZXJOYW1lIiwiRXJyb3IiLCJyZXF1ZXN0Iiwib3B0cyIsImpzb24iLCJkYXRhIiwiaGVhZGVycyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsU0FBU0EsVUFBVCxDQUFxQkMsR0FBckIsRUFBMEJDLE1BQTFCLEVBQWtDO0FBQ2hDLE1BQUksWUFBWUMsSUFBWixDQUFpQkYsR0FBakIsQ0FBSixFQUEyQjtBQUN6QixXQUFPLENBQUMsR0FBRCxFQUFNO0FBQUNHLE1BQUFBLE1BQU0sRUFBRSxDQUFUO0FBQVlDLE1BQUFBLEtBQUssRUFBRTtBQUFDQyxRQUFBQSxHQUFHLEVBQUU7QUFBTjtBQUFuQixLQUFOLENBQVA7QUFDRDs7QUFDRCxNQUFJLHdCQUF3QkgsSUFBeEIsQ0FBNkJGLEdBQTdCLENBQUosRUFBdUM7QUFDckMsV0FBTyxDQUFDLEdBQUQsRUFBTTtBQUFDRyxNQUFBQSxNQUFNLEVBQUUsRUFBVDtBQUFhQyxNQUFBQSxLQUFLLEVBQUU7QUFBQ0UsUUFBQUEsT0FBTyxFQUFFO0FBQVY7QUFBcEIsS0FBTixDQUFQO0FBQ0Q7O0FBQ0QsTUFBSSx3QkFBd0JKLElBQXhCLENBQTZCRixHQUE3QixDQUFKLEVBQXVDO0FBQ3JDLFdBQU8sQ0FBQyxHQUFELEVBQU07QUFBQ0csTUFBQUEsTUFBTSxFQUFFLEVBQVQ7QUFBYUMsTUFBQUEsS0FBSyxFQUFFO0FBQUNFLFFBQUFBLE9BQU8sRUFBRTtBQUFWO0FBQXBCLEtBQU4sQ0FBUDtBQUNEOztBQUNELE1BQUkseUJBQXlCSixJQUF6QixDQUE4QkYsR0FBOUIsQ0FBSixFQUF3QztBQUN0QyxXQUFPLENBQUMsR0FBRCxFQUFNO0FBQUNHLE1BQUFBLE1BQU0sRUFBRSxDQUFUO0FBQVlJLE1BQUFBLFNBQVMsRUFBRSxnQkFBdkI7QUFBeUNILE1BQUFBLEtBQUssRUFBRTtBQUFoRCxLQUFOLENBQVA7QUFDRDs7QUFDRCxNQUFJLGFBQWFGLElBQWIsQ0FBa0JGLEdBQWxCLEtBQTBCQyxNQUFNLEtBQUssTUFBekMsRUFBaUQ7QUFDL0MsV0FBTyxDQUFDLEdBQUQsRUFBTTtBQUFDRSxNQUFBQSxNQUFNLEVBQUUsQ0FBVDtBQUFZSSxNQUFBQSxTQUFTLEVBQUUsS0FBdkI7QUFBOEJILE1BQUFBLEtBQUssRUFBRTtBQUFDSSxRQUFBQSxXQUFXLEVBQUU7QUFBZDtBQUFyQyxLQUFOLENBQVA7QUFDRDs7QUFDRCxNQUFJLGNBQWNOLElBQWQsQ0FBbUJGLEdBQW5CLENBQUosRUFBNkI7QUFDM0IsV0FBTyxDQUFDLEdBQUQsRUFBTTtBQUFDRyxNQUFBQSxNQUFNLEVBQUUsQ0FBVDtBQUFZQyxNQUFBQSxLQUFLLEVBQUU7QUFBQ0UsUUFBQUEsT0FBTyxFQUFFO0FBQVY7QUFBbkIsS0FBTixDQUFQO0FBQ0Q7O0FBQ0QsUUFBTSxJQUFJRyxLQUFKLENBQVUsc0JBQXNCVCxHQUFoQyxDQUFOO0FBQ0Q7O0FBRUQsZUFBZVUsT0FBZixDQUF3QkMsSUFBeEIsRUFBOEI7QUFDNUIsUUFBTTtBQUFDWCxJQUFBQSxHQUFEO0FBQU1DLElBQUFBLE1BQU47QUFBY1csSUFBQUE7QUFBZCxNQUFzQkQsSUFBNUI7O0FBQ0EsTUFBSSxVQUFVVCxJQUFWLENBQWVGLEdBQWYsQ0FBSixFQUF5QjtBQUN2QixVQUFNLElBQUlTLEtBQUosQ0FBVSxTQUFWLENBQU47QUFDRDs7QUFFRCxRQUFNLENBQUNOLE1BQUQsRUFBU1UsSUFBVCxJQUFpQmQsVUFBVSxDQUFDQyxHQUFELEVBQU1DLE1BQU4sRUFBY1csSUFBZCxDQUFqQztBQUNBLFNBQU87QUFDTFQsSUFBQUEsTUFESztBQUVMVyxJQUFBQSxPQUFPLEVBQUU7QUFBQyxzQkFBZ0I7QUFBakIsS0FGSjtBQUdMRCxJQUFBQTtBQUhLLEdBQVA7QUFLRDs7ZUFFY0gsTyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIHJlc0ZpeHR1cmUgKHVybCwgbWV0aG9kKSB7XG4gIGlmICgvXFwvc3RhdHVzJC8udGVzdCh1cmwpKSB7XG4gICAgcmV0dXJuIFsyMDAsIHtzdGF0dXM6IDAsIHZhbHVlOiB7Zm9vOiAnYmFyJ319XTtcbiAgfVxuICBpZiAoL1xcL2VsZW1lbnRcXC9iYWRcXC90ZXh0JC8udGVzdCh1cmwpKSB7XG4gICAgcmV0dXJuIFs1MDAsIHtzdGF0dXM6IDExLCB2YWx1ZToge21lc3NhZ2U6ICdJbnZpc2libGUgZWxlbWVudCd9fV07XG4gIH1cbiAgaWYgKC9cXC9lbGVtZW50XFwvMjAwXFwvdGV4dCQvLnRlc3QodXJsKSkge1xuICAgIHJldHVybiBbMjAwLCB7c3RhdHVzOiAxMSwgdmFsdWU6IHttZXNzYWdlOiAnSW52aXNpYmxlIGVsZW1lbnQnfX1dO1xuICB9XG4gIGlmICgvXFwvZWxlbWVudFxcLzIwMFxcL3ZhbHVlJC8udGVzdCh1cmwpKSB7XG4gICAgcmV0dXJuIFsyMDAsIHtzdGF0dXM6IDAsIHNlc3Npb25JZDogJ2lubmVyc2Vzc2lvbmlkJywgdmFsdWU6ICdmb29iYXInfV07XG4gIH1cbiAgaWYgKC9cXC9zZXNzaW9uJC8udGVzdCh1cmwpICYmIG1ldGhvZCA9PT0gJ1BPU1QnKSB7XG4gICAgcmV0dXJuIFsyMDAsIHtzdGF0dXM6IDAsIHNlc3Npb25JZDogJzEyMycsIHZhbHVlOiB7YnJvd3Nlck5hbWU6ICdib28nfX1dO1xuICB9XG4gIGlmICgvXFwvbm9jaHJvbWUkLy50ZXN0KHVybCkpIHtcbiAgICByZXR1cm4gWzEwMCwge3N0YXR1czogMCwgdmFsdWU6IHttZXNzYWdlOiAnY2hyb21lIG5vdCByZWFjaGFibGUnfX1dO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGhhbmRsZSB1cmwgXCIgKyB1cmwpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0IChvcHRzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICBjb25zdCB7dXJsLCBtZXRob2QsIGpzb259ID0gb3B0cztcbiAgaWYgKC9iYWR1cmwkLy50ZXN0KHVybCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vd29ya3knKTtcbiAgfVxuXG4gIGNvbnN0IFtzdGF0dXMsIGRhdGFdID0gcmVzRml4dHVyZSh1cmwsIG1ldGhvZCwganNvbik7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzLFxuICAgIGhlYWRlcnM6IHsnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnfSxcbiAgICBkYXRhLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCByZXF1ZXN0O1xuIl0sImZpbGUiOiJ0ZXN0L2pzb253cC1wcm94eS9tb2NrLXJlcXVlc3QuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|