@appium/base-driver 8.7.3 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/basedriver/capabilities.d.ts +11 -163
- package/build/lib/basedriver/capabilities.d.ts.map +1 -1
- package/build/lib/basedriver/capabilities.js +354 -236
- package/build/lib/basedriver/capabilities.js.map +1 -1
- package/build/lib/basedriver/commands/event.d.ts +7 -6
- package/build/lib/basedriver/commands/event.d.ts.map +1 -1
- package/build/lib/basedriver/commands/event.js +55 -35
- package/build/lib/basedriver/commands/event.js.map +1 -1
- package/build/lib/basedriver/commands/execute.d.ts +7 -6
- package/build/lib/basedriver/commands/execute.d.ts.map +1 -1
- package/build/lib/basedriver/commands/execute.js +66 -58
- package/build/lib/basedriver/commands/execute.js.map +1 -1
- package/build/lib/basedriver/commands/find.d.ts +9 -7
- package/build/lib/basedriver/commands/find.d.ts.map +1 -1
- package/build/lib/basedriver/commands/find.js +102 -54
- package/build/lib/basedriver/commands/find.js.map +1 -1
- package/build/lib/basedriver/commands/index.d.ts +3 -7
- package/build/lib/basedriver/commands/index.d.ts.map +1 -1
- package/build/lib/basedriver/commands/index.js +30 -33
- package/build/lib/basedriver/commands/index.js.map +1 -1
- package/build/lib/basedriver/commands/log.d.ts +8 -9
- package/build/lib/basedriver/commands/log.d.ts.map +1 -1
- package/build/lib/basedriver/commands/log.js +54 -38
- package/build/lib/basedriver/commands/log.js.map +1 -1
- package/build/lib/basedriver/commands/session.d.ts +7 -6
- package/build/lib/basedriver/commands/session.d.ts.map +1 -1
- package/build/lib/basedriver/commands/session.js +46 -39
- package/build/lib/basedriver/commands/session.js.map +1 -1
- package/build/lib/basedriver/commands/settings.d.ts +7 -7
- package/build/lib/basedriver/commands/settings.d.ts.map +1 -1
- package/build/lib/basedriver/commands/settings.js +35 -28
- package/build/lib/basedriver/commands/settings.js.map +1 -1
- package/build/lib/basedriver/commands/timeout.d.ts +7 -5
- package/build/lib/basedriver/commands/timeout.d.ts.map +1 -1
- package/build/lib/basedriver/commands/timeout.js +144 -162
- package/build/lib/basedriver/commands/timeout.js.map +1 -1
- package/build/lib/basedriver/core.d.ts +6 -157
- package/build/lib/basedriver/core.d.ts.map +1 -1
- package/build/lib/basedriver/core.js +361 -230
- package/build/lib/basedriver/core.js.map +1 -1
- package/build/lib/basedriver/desired-caps.js +80 -110
- package/build/lib/basedriver/desired-caps.js.map +1 -1
- package/build/lib/basedriver/device-settings.js +57 -62
- package/build/lib/basedriver/device-settings.js.map +1 -1
- package/build/lib/basedriver/driver.d.ts +11 -262
- package/build/lib/basedriver/driver.d.ts.map +1 -1
- package/build/lib/basedriver/driver.js +362 -262
- package/build/lib/basedriver/driver.js.map +1 -1
- package/build/lib/basedriver/helpers.js +500 -495
- package/build/lib/basedriver/helpers.js.map +1 -1
- package/build/lib/basedriver/logger.d.ts +1 -1
- package/build/lib/basedriver/logger.d.ts.map +1 -1
- package/build/lib/basedriver/logger.js +5 -15
- package/build/lib/basedriver/logger.js.map +1 -1
- package/build/lib/constants.js +14 -14
- package/build/lib/constants.js.map +1 -1
- package/build/lib/express/crash.js +8 -15
- package/build/lib/express/crash.js.map +1 -1
- package/build/lib/express/express-logging.js +49 -59
- package/build/lib/express/express-logging.js.map +1 -1
- package/build/lib/express/idempotency.js +125 -177
- package/build/lib/express/idempotency.js.map +1 -1
- package/build/lib/express/logger.d.ts +1 -1
- package/build/lib/express/logger.d.ts.map +1 -1
- package/build/lib/express/logger.js +5 -15
- package/build/lib/express/logger.js.map +1 -1
- package/build/lib/express/middleware.js +82 -107
- package/build/lib/express/middleware.js.map +1 -1
- package/build/lib/express/server.d.ts +17 -5
- package/build/lib/express/server.d.ts.map +1 -1
- package/build/lib/express/server.js +259 -224
- package/build/lib/express/server.js.map +1 -1
- package/build/lib/express/static.js +64 -81
- package/build/lib/express/static.js.map +1 -1
- package/build/lib/express/websocket.js +115 -87
- package/build/lib/express/websocket.js.map +1 -1
- package/build/lib/helpers/capabilities.d.ts +1 -59
- package/build/lib/helpers/capabilities.d.ts.map +1 -1
- package/build/lib/helpers/capabilities.js +72 -69
- package/build/lib/helpers/capabilities.js.map +1 -1
- package/build/lib/index.js +64 -180
- package/build/lib/index.js.map +1 -1
- package/build/lib/jsonwp-proxy/protocol-converter.js +215 -227
- package/build/lib/jsonwp-proxy/protocol-converter.js.map +1 -1
- package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -1
- package/build/lib/jsonwp-proxy/proxy.js +355 -393
- package/build/lib/jsonwp-proxy/proxy.js.map +1 -1
- package/build/lib/jsonwp-status/status.js +119 -130
- package/build/lib/jsonwp-status/status.js.map +1 -1
- package/build/lib/protocol/errors.d.ts +135 -32
- package/build/lib/protocol/errors.d.ts.map +1 -1
- package/build/lib/protocol/errors.js +871 -919
- package/build/lib/protocol/errors.js.map +1 -1
- package/build/lib/protocol/helpers.js +37 -37
- package/build/lib/protocol/helpers.js.map +1 -1
- package/build/lib/protocol/index.js +22 -109
- package/build/lib/protocol/index.js.map +1 -1
- package/build/lib/protocol/protocol.js +394 -350
- package/build/lib/protocol/protocol.js.map +1 -1
- package/build/lib/protocol/routes.d.ts +1238 -4
- package/build/lib/protocol/routes.d.ts.map +1 -1
- package/build/lib/protocol/routes.js +964 -1327
- package/build/lib/protocol/routes.js.map +1 -1
- package/build/lib/protocol/validators.js +32 -39
- package/build/lib/protocol/validators.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/basedriver/capabilities.js +80 -39
- package/lib/basedriver/commands/event.js +10 -5
- package/lib/basedriver/commands/execute.js +14 -9
- package/lib/basedriver/commands/find.js +18 -12
- package/lib/basedriver/commands/index.js +21 -16
- package/lib/basedriver/commands/log.js +24 -18
- package/lib/basedriver/commands/session.js +10 -5
- package/lib/basedriver/commands/settings.js +9 -6
- package/lib/basedriver/commands/timeout.js +10 -4
- package/lib/basedriver/core.js +2 -3
- package/lib/basedriver/driver.js +12 -16
- package/lib/express/server.js +6 -3
- package/lib/protocol/errors.js +155 -44
- package/lib/protocol/routes.js +11 -7
- package/package.json +14 -16
|
@@ -1,235 +1,270 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
exports.configureServer =
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
require("
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
var _middleware = require("./middleware");
|
|
31
|
-
|
|
32
|
-
var _static = require("./static");
|
|
33
|
-
|
|
34
|
-
var _crash = require("./crash");
|
|
35
|
-
|
|
36
|
-
var _websocket = require("./websocket");
|
|
37
|
-
|
|
38
|
-
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
39
|
-
|
|
40
|
-
var _constants = require("../constants");
|
|
41
|
-
|
|
42
|
-
var _events = require("events");
|
|
43
|
-
|
|
44
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
45
|
-
|
|
46
|
-
const KEEP_ALIVE_TIMEOUT_MS = 10 * 60 * 1000;
|
|
47
|
-
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.normalizeBasePath = exports.configureServer = exports.server = void 0;
|
|
7
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const express_1 = __importDefault(require("express"));
|
|
10
|
+
const http_1 = __importDefault(require("http"));
|
|
11
|
+
const serve_favicon_1 = __importDefault(require("serve-favicon"));
|
|
12
|
+
const body_parser_1 = __importDefault(require("body-parser"));
|
|
13
|
+
const method_override_1 = __importDefault(require("method-override"));
|
|
14
|
+
const logger_1 = __importDefault(require("./logger"));
|
|
15
|
+
const express_logging_1 = require("./express-logging");
|
|
16
|
+
const middleware_1 = require("./middleware");
|
|
17
|
+
const static_1 = require("./static");
|
|
18
|
+
const crash_1 = require("./crash");
|
|
19
|
+
const websocket_1 = require("./websocket");
|
|
20
|
+
const bluebird_1 = __importDefault(require("bluebird"));
|
|
21
|
+
const constants_1 = require("../constants");
|
|
22
|
+
const events_1 = require("events");
|
|
23
|
+
const KEEP_ALIVE_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes
|
|
24
|
+
/**
|
|
25
|
+
*
|
|
26
|
+
* @param {ServerOpts} opts
|
|
27
|
+
* @returns {Promise<AppiumServer>}
|
|
28
|
+
*/
|
|
48
29
|
async function server(opts) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
port,
|
|
88
|
-
keepAliveTimeout
|
|
89
|
-
});
|
|
90
|
-
resolve(appiumServer);
|
|
91
|
-
} catch (err) {
|
|
92
|
-
reject(err);
|
|
93
|
-
}
|
|
94
|
-
});
|
|
30
|
+
const { routeConfiguringFunction, port, hostname, cliArgs = {}, allowCors = true, basePath = constants_1.DEFAULT_BASE_PATH, extraMethodMap = {}, serverUpdaters = [], keepAliveTimeout = KEEP_ALIVE_TIMEOUT_MS, } = opts;
|
|
31
|
+
// create the actual http server
|
|
32
|
+
const app = (0, express_1.default)();
|
|
33
|
+
const httpServer = http_1.default.createServer(app);
|
|
34
|
+
return await new bluebird_1.default(async (resolve, reject) => {
|
|
35
|
+
// we put an async function as the promise constructor because we want some things to happen in
|
|
36
|
+
// serial (application of plugin updates, for example). But we still need to use a promise here
|
|
37
|
+
// because some elements of server start failure only happen in httpServer listeners. So the
|
|
38
|
+
// way we resolve it is to use an async function here but to wrap all the inner logic in
|
|
39
|
+
// try/catch so any errors can be passed to reject.
|
|
40
|
+
try {
|
|
41
|
+
const appiumServer = configureHttp({
|
|
42
|
+
httpServer,
|
|
43
|
+
reject,
|
|
44
|
+
keepAliveTimeout,
|
|
45
|
+
});
|
|
46
|
+
configureServer({
|
|
47
|
+
app,
|
|
48
|
+
addRoutes: routeConfiguringFunction,
|
|
49
|
+
allowCors,
|
|
50
|
+
basePath,
|
|
51
|
+
extraMethodMap,
|
|
52
|
+
});
|
|
53
|
+
// allow extensions to update the app and http server objects
|
|
54
|
+
for (const updater of serverUpdaters) {
|
|
55
|
+
await updater(app, appiumServer, cliArgs);
|
|
56
|
+
}
|
|
57
|
+
// once all configurations and updaters have been applied, make sure to set up a catchall
|
|
58
|
+
// handler so that anything unknown 404s. But do this after everything else since we don't
|
|
59
|
+
// want to block extensions' ability to add routes if they want.
|
|
60
|
+
app.all('*', middleware_1.catch404Handler);
|
|
61
|
+
await startServer({ httpServer, hostname, port, keepAliveTimeout });
|
|
62
|
+
resolve(appiumServer);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
reject(err);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
95
68
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
app.all('/welcome', _static.welcome);
|
|
134
|
-
app.all('/test/guinea-pig', _static.guineaPig);
|
|
135
|
-
app.all('/test/guinea-pig-scrollable', _static.guineaPigScrollable);
|
|
136
|
-
app.all('/test/guinea-pig-app-banner', _static.guineaPigAppBanner);
|
|
69
|
+
exports.server = server;
|
|
70
|
+
/**
|
|
71
|
+
* Sets up some Express middleware and stuff
|
|
72
|
+
* @param {ConfigureServerOpts} opts
|
|
73
|
+
*/
|
|
74
|
+
function configureServer({ app, addRoutes, allowCors = true, basePath = constants_1.DEFAULT_BASE_PATH, extraMethodMap = {}, }) {
|
|
75
|
+
basePath = normalizeBasePath(basePath);
|
|
76
|
+
app.use(express_logging_1.endLogFormatter);
|
|
77
|
+
// set up static assets
|
|
78
|
+
app.use((0, serve_favicon_1.default)(path_1.default.resolve(static_1.STATIC_DIR, 'favicon.ico')));
|
|
79
|
+
app.use(express_1.default.static(static_1.STATIC_DIR));
|
|
80
|
+
// crash routes, for testing
|
|
81
|
+
app.use(`${basePath}/produce_error`, crash_1.produceError);
|
|
82
|
+
app.use(`${basePath}/crash`, crash_1.produceCrash);
|
|
83
|
+
// add middlewares
|
|
84
|
+
if (allowCors) {
|
|
85
|
+
app.use(middleware_1.allowCrossDomain);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
app.use((0, middleware_1.allowCrossDomainAsyncExecute)(basePath));
|
|
89
|
+
}
|
|
90
|
+
app.use(middleware_1.handleIdempotency);
|
|
91
|
+
app.use((0, middleware_1.fixPythonContentType)(basePath));
|
|
92
|
+
app.use(middleware_1.defaultToJSONContentType);
|
|
93
|
+
app.use(body_parser_1.default.urlencoded({ extended: true }));
|
|
94
|
+
app.use((0, method_override_1.default)());
|
|
95
|
+
app.use(middleware_1.catchAllHandler);
|
|
96
|
+
// make sure appium never fails because of a file size upload limit
|
|
97
|
+
app.use(body_parser_1.default.json({ limit: '1gb' }));
|
|
98
|
+
// set up start logging (which depends on bodyParser doing its thing)
|
|
99
|
+
app.use(express_logging_1.startLogFormatter);
|
|
100
|
+
addRoutes(app, { basePath, extraMethodMap });
|
|
101
|
+
// dynamic routes for testing, etc.
|
|
102
|
+
app.all('/welcome', static_1.welcome);
|
|
103
|
+
app.all('/test/guinea-pig', static_1.guineaPig);
|
|
104
|
+
app.all('/test/guinea-pig-scrollable', static_1.guineaPigScrollable);
|
|
105
|
+
app.all('/test/guinea-pig-app-banner', static_1.guineaPigAppBanner);
|
|
137
106
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
107
|
+
exports.configureServer = configureServer;
|
|
108
|
+
/**
|
|
109
|
+
* Monkeypatches the `http.Server` instance and returns a {@linkcode AppiumServer}.
|
|
110
|
+
* This function _mutates_ the `httpServer` parameter.
|
|
111
|
+
* @param {ConfigureHttpOpts} opts
|
|
112
|
+
* @returns {AppiumServer}
|
|
113
|
+
*/
|
|
114
|
+
function configureHttp({ httpServer, reject, keepAliveTimeout }) {
|
|
115
|
+
const serverState = {
|
|
116
|
+
notifier: new events_1.EventEmitter(),
|
|
117
|
+
closed: false,
|
|
118
|
+
};
|
|
119
|
+
// TS does not love monkeypatching.
|
|
120
|
+
const appiumServer = /** @type {AppiumServer} */ ( /** @type {unknown} */(httpServer));
|
|
121
|
+
appiumServer.addWebSocketHandler = websocket_1.addWebSocketHandler;
|
|
122
|
+
appiumServer.removeWebSocketHandler = websocket_1.removeWebSocketHandler;
|
|
123
|
+
appiumServer.removeAllWebSocketHandlers = websocket_1.removeAllWebSocketHandlers;
|
|
124
|
+
appiumServer.getWebSocketHandlers = websocket_1.getWebSocketHandlers;
|
|
125
|
+
// http.Server.close() only stops new connections, but we need to wait until
|
|
126
|
+
// all connections are closed and the `close` event is emitted
|
|
127
|
+
const close = appiumServer.close.bind(appiumServer);
|
|
128
|
+
appiumServer.close = async () => await new bluebird_1.default((resolve, reject) => {
|
|
129
|
+
// https://github.com/nodejs/node-v0.x-archive/issues/9066#issuecomment-124210576
|
|
130
|
+
serverState.closed = true;
|
|
131
|
+
serverState.notifier.emit('shutdown');
|
|
132
|
+
logger_1.default.info('Waiting until the server is closed');
|
|
133
|
+
httpServer.on('close', () => {
|
|
134
|
+
logger_1.default.info('Received server close event');
|
|
135
|
+
resolve();
|
|
136
|
+
});
|
|
137
|
+
close((err) => {
|
|
138
|
+
if (err)
|
|
139
|
+
reject(err); // eslint-disable-line curly
|
|
140
|
+
});
|
|
165
141
|
});
|
|
166
|
-
|
|
167
|
-
|
|
142
|
+
appiumServer.on('error',
|
|
143
|
+
/** @param {NodeJS.ErrnoException} err */ (err) => {
|
|
144
|
+
if (err.code === 'EADDRNOTAVAIL') {
|
|
145
|
+
logger_1.default.error('Could not start REST http interface listener. ' + 'Requested address is not available.');
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
logger_1.default.error('Could not start REST http interface listener. The requested ' +
|
|
149
|
+
'port may already be in use. Please make sure there is no ' +
|
|
150
|
+
'other instance of this server running already.');
|
|
151
|
+
}
|
|
152
|
+
reject(err);
|
|
168
153
|
});
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
socket.once('close', () => serverState.notifier.removeListener('shutdown', destroy));
|
|
190
|
-
serverState.notifier.once('shutdown', destroy);
|
|
191
|
-
});
|
|
192
|
-
appiumServer.on('request', function (req, res) {
|
|
193
|
-
const socket = req.connection || req.socket;
|
|
194
|
-
socket._openReqCount++;
|
|
195
|
-
res.on('finish', function () {
|
|
196
|
-
socket._openReqCount--;
|
|
197
|
-
|
|
198
|
-
if (serverState.closed && socket._openReqCount === 0) {
|
|
199
|
-
socket.destroy();
|
|
200
|
-
}
|
|
154
|
+
appiumServer.on('connection',
|
|
155
|
+
/** @param {AppiumServerSocket} socket */ (socket) => {
|
|
156
|
+
socket.setTimeout(keepAliveTimeout);
|
|
157
|
+
socket.on('error', reject);
|
|
158
|
+
function destroy() {
|
|
159
|
+
socket.destroy();
|
|
160
|
+
}
|
|
161
|
+
socket._openReqCount = 0;
|
|
162
|
+
socket.once('close', () => serverState.notifier.removeListener('shutdown', destroy));
|
|
163
|
+
serverState.notifier.once('shutdown', destroy);
|
|
164
|
+
});
|
|
165
|
+
appiumServer.on('request', function (req, res) {
|
|
166
|
+
const socket = /** @type {AppiumServerSocket} */ (req.connection || req.socket);
|
|
167
|
+
socket._openReqCount++;
|
|
168
|
+
res.on('finish', function () {
|
|
169
|
+
socket._openReqCount--;
|
|
170
|
+
if (serverState.closed && socket._openReqCount === 0) {
|
|
171
|
+
socket.destroy();
|
|
172
|
+
}
|
|
173
|
+
});
|
|
201
174
|
});
|
|
202
|
-
|
|
203
|
-
return appiumServer;
|
|
175
|
+
return appiumServer;
|
|
204
176
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
177
|
+
/**
|
|
178
|
+
* Starts an {@linkcode AppiumServer}
|
|
179
|
+
* @param {StartServerOpts} opts
|
|
180
|
+
* @returns {Promise<void>}
|
|
181
|
+
*/
|
|
182
|
+
async function startServer({ httpServer, port, hostname, keepAliveTimeout }) {
|
|
183
|
+
// If the hostname is omitted, the server will accept
|
|
184
|
+
// connections on any IP address
|
|
185
|
+
/** @type {(port: number, hostname?: string) => B<http.Server>} */
|
|
186
|
+
const start = bluebird_1.default.promisify(httpServer.listen, { context: httpServer });
|
|
187
|
+
const startPromise = start(port, hostname);
|
|
188
|
+
httpServer.keepAliveTimeout = keepAliveTimeout;
|
|
189
|
+
// headers timeout must be greater than keepAliveTimeout
|
|
190
|
+
httpServer.headersTimeout = keepAliveTimeout + 5 * 1000;
|
|
191
|
+
await startPromise;
|
|
220
192
|
}
|
|
221
|
-
|
|
193
|
+
/**
|
|
194
|
+
* Normalize base path string
|
|
195
|
+
* @param {string} basePath
|
|
196
|
+
* @returns {string}
|
|
197
|
+
*/
|
|
222
198
|
function normalizeBasePath(basePath) {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
199
|
+
if (!lodash_1.default.isString(basePath)) {
|
|
200
|
+
throw new Error(`Invalid path prefix ${basePath}`);
|
|
201
|
+
}
|
|
202
|
+
// ensure the path prefix does not end in '/', since our method map
|
|
203
|
+
// starts all paths with '/'
|
|
204
|
+
basePath = basePath.replace(/\/$/, '');
|
|
205
|
+
// likewise, ensure the path prefix does always START with /, unless the path
|
|
206
|
+
// is empty meaning no base path at all
|
|
207
|
+
if (basePath !== '' && basePath[0] !== '/') {
|
|
208
|
+
basePath = `/${basePath}`;
|
|
209
|
+
}
|
|
210
|
+
return basePath;
|
|
234
211
|
}
|
|
235
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJLRUVQX0FMSVZFX1RJTUVPVVRfTVMiLCJzZXJ2ZXIiLCJvcHRzIiwicm91dGVDb25maWd1cmluZ0Z1bmN0aW9uIiwicG9ydCIsImhvc3RuYW1lIiwiY2xpQXJncyIsImFsbG93Q29ycyIsImJhc2VQYXRoIiwiREVGQVVMVF9CQVNFX1BBVEgiLCJleHRyYU1ldGhvZE1hcCIsInNlcnZlclVwZGF0ZXJzIiwia2VlcEFsaXZlVGltZW91dCIsImFwcCIsImV4cHJlc3MiLCJodHRwU2VydmVyIiwiaHR0cCIsImNyZWF0ZVNlcnZlciIsIkIiLCJyZXNvbHZlIiwicmVqZWN0IiwiYXBwaXVtU2VydmVyIiwiY29uZmlndXJlSHR0cCIsImNvbmZpZ3VyZVNlcnZlciIsImFkZFJvdXRlcyIsInVwZGF0ZXIiLCJhbGwiLCJjYXRjaDQwNEhhbmRsZXIiLCJzdGFydFNlcnZlciIsImVyciIsIm5vcm1hbGl6ZUJhc2VQYXRoIiwidXNlIiwiZW5kTG9nRm9ybWF0dGVyIiwiZmF2aWNvbiIsInBhdGgiLCJTVEFUSUNfRElSIiwic3RhdGljIiwicHJvZHVjZUVycm9yIiwicHJvZHVjZUNyYXNoIiwiYWxsb3dDcm9zc0RvbWFpbiIsImFsbG93Q3Jvc3NEb21haW5Bc3luY0V4ZWN1dGUiLCJoYW5kbGVJZGVtcG90ZW5jeSIsImZpeFB5dGhvbkNvbnRlbnRUeXBlIiwiZGVmYXVsdFRvSlNPTkNvbnRlbnRUeXBlIiwiYm9keVBhcnNlciIsInVybGVuY29kZWQiLCJleHRlbmRlZCIsIm1ldGhvZE92ZXJyaWRlIiwiY2F0Y2hBbGxIYW5kbGVyIiwianNvbiIsImxpbWl0Iiwic3RhcnRMb2dGb3JtYXR0ZXIiLCJ3ZWxjb21lIiwiZ3VpbmVhUGlnIiwiZ3VpbmVhUGlnU2Nyb2xsYWJsZSIsImd1aW5lYVBpZ0FwcEJhbm5lciIsInNlcnZlclN0YXRlIiwibm90aWZpZXIiLCJFdmVudEVtaXR0ZXIiLCJjbG9zZWQiLCJhZGRXZWJTb2NrZXRIYW5kbGVyIiwicmVtb3ZlV2ViU29ja2V0SGFuZGxlciIsInJlbW92ZUFsbFdlYlNvY2tldEhhbmRsZXJzIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJjbG9zZSIsImJpbmQiLCJlbWl0IiwibG9nIiwiaW5mbyIsIm9uIiwiY29kZSIsImVycm9yIiwic29ja2V0Iiwic2V0VGltZW91dCIsImRlc3Ryb3kiLCJfb3BlblJlcUNvdW50Iiwib25jZSIsInJlbW92ZUxpc3RlbmVyIiwicmVxIiwicmVzIiwiY29ubmVjdGlvbiIsInN0YXJ0IiwicHJvbWlzaWZ5IiwibGlzdGVuIiwiY29udGV4dCIsInN0YXJ0UHJvbWlzZSIsImhlYWRlcnNUaW1lb3V0IiwiXyIsImlzU3RyaW5nIiwiRXJyb3IiLCJyZXBsYWNlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2V4cHJlc3Mvc2VydmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgZmF2aWNvbiBmcm9tICdzZXJ2ZS1mYXZpY29uJztcbmltcG9ydCBib2R5UGFyc2VyIGZyb20gJ2JvZHktcGFyc2VyJztcbmltcG9ydCBtZXRob2RPdmVycmlkZSBmcm9tICdtZXRob2Qtb3ZlcnJpZGUnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQge3N0YXJ0TG9nRm9ybWF0dGVyLCBlbmRMb2dGb3JtYXR0ZXJ9IGZyb20gJy4vZXhwcmVzcy1sb2dnaW5nJztcbmltcG9ydCB7XG4gIGFsbG93Q3Jvc3NEb21haW4sXG4gIGZpeFB5dGhvbkNvbnRlbnRUeXBlLFxuICBkZWZhdWx0VG9KU09OQ29udGVudFR5cGUsXG4gIGNhdGNoQWxsSGFuZGxlcixcbiAgYWxsb3dDcm9zc0RvbWFpbkFzeW5jRXhlY3V0ZSxcbiAgaGFuZGxlSWRlbXBvdGVuY3ksXG4gIGNhdGNoNDA0SGFuZGxlcixcbn0gZnJvbSAnLi9taWRkbGV3YXJlJztcbmltcG9ydCB7Z3VpbmVhUGlnLCBndWluZWFQaWdTY3JvbGxhYmxlLCBndWluZWFQaWdBcHBCYW5uZXIsIHdlbGNvbWUsIFNUQVRJQ19ESVJ9IGZyb20gJy4vc3RhdGljJztcbmltcG9ydCB7cHJvZHVjZUVycm9yLCBwcm9kdWNlQ3Jhc2h9IGZyb20gJy4vY3Jhc2gnO1xuaW1wb3J0IHtcbiAgYWRkV2ViU29ja2V0SGFuZGxlcixcbiAgcmVtb3ZlV2ViU29ja2V0SGFuZGxlcixcbiAgcmVtb3ZlQWxsV2ViU29ja2V0SGFuZGxlcnMsXG4gIGdldFdlYlNvY2tldEhhbmRsZXJzLFxufSBmcm9tICcuL3dlYnNvY2tldCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQge0RFRkFVTFRfQkFTRV9QQVRIfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJ2V2ZW50cyc7XG5cbmNvbnN0IEtFRVBfQUxJVkVfVElNRU9VVF9NUyA9IDEwICogNjAgKiAxMDAwOyAvLyAxMCBtaW51dGVzXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7U2VydmVyT3B0c30gb3B0c1xuICogQHJldHVybnMge1Byb21pc2U8QXBwaXVtU2VydmVyPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2VydmVyKG9wdHMpIHtcbiAgY29uc3Qge1xuICAgIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbixcbiAgICBwb3J0LFxuICAgIGhvc3RuYW1lLFxuICAgIGNsaUFyZ3MsXG4gICAgYWxsb3dDb3JzID0gdHJ1ZSxcbiAgICBiYXNlUGF0aCA9IERFRkFVTFRfQkFTRV9QQVRILFxuICAgIGV4dHJhTWV0aG9kTWFwID0ge30sXG4gICAgc2VydmVyVXBkYXRlcnMgPSBbXSxcbiAgICBrZWVwQWxpdmVUaW1lb3V0ID0gS0VFUF9BTElWRV9USU1FT1VUX01TLFxuICB9ID0gb3B0cztcblxuICAvLyBjcmVhdGUgdGhlIGFjdHVhbCBodHRwIHNlcnZlclxuICBjb25zdCBhcHAgPSBleHByZXNzKCk7XG4gIGNvbnN0IGh0dHBTZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihhcHApO1xuICByZXR1cm4gYXdhaXQgbmV3IEIoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8vIHdlIHB1dCBhbiBhc3luYyBmdW5jdGlvbiBhcyB0aGUgcHJvbWlzZSBjb25zdHJ1Y3RvciBiZWNhdXNlIHdlIHdhbnQgc29tZSB0aGluZ3MgdG8gaGFwcGVuIGluXG4gICAgLy8gc2VyaWFsIChhcHBsaWNhdGlvbiBvZiBwbHVnaW4gdXBkYXRlcywgZm9yIGV4YW1wbGUpLiBCdXQgd2Ugc3RpbGwgbmVlZCB0byB1c2UgYSBwcm9taXNlIGhlcmVcbiAgICAvLyBiZWNhdXNlIHNvbWUgZWxlbWVudHMgb2Ygc2VydmVyIHN0YXJ0IGZhaWx1cmUgb25seSBoYXBwZW4gaW4gaHR0cFNlcnZlciBsaXN0ZW5lcnMuIFNvIHRoZVxuICAgIC8vIHdheSB3ZSByZXNvbHZlIGl0IGlzIHRvIHVzZSBhbiBhc3luYyBmdW5jdGlvbiBoZXJlIGJ1dCB0byB3cmFwIGFsbCB0aGUgaW5uZXIgbG9naWMgaW5cbiAgICAvLyB0cnkvY2F0Y2ggc28gYW55IGVycm9ycyBjYW4gYmUgcGFzc2VkIHRvIHJlamVjdC5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYXBwaXVtU2VydmVyID0gY29uZmlndXJlSHR0cCh7XG4gICAgICAgIGh0dHBTZXJ2ZXIsXG4gICAgICAgIHJlamVjdCxcbiAgICAgICAga2VlcEFsaXZlVGltZW91dCxcbiAgICAgIH0pO1xuICAgICAgY29uZmlndXJlU2VydmVyKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBhZGRSb3V0ZXM6IHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbixcbiAgICAgICAgYWxsb3dDb3JzLFxuICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgZXh0cmFNZXRob2RNYXAsXG4gICAgICB9KTtcbiAgICAgIC8vIGFsbG93IGV4dGVuc2lvbnMgdG8gdXBkYXRlIHRoZSBhcHAgYW5kIGh0dHAgc2VydmVyIG9iamVjdHNcbiAgICAgIGZvciAoY29uc3QgdXBkYXRlciBvZiBzZXJ2ZXJVcGRhdGVycykge1xuICAgICAgICBhd2FpdCB1cGRhdGVyKGFwcCwgYXBwaXVtU2VydmVyLCBjbGlBcmdzKTtcbiAgICAgIH1cblxuICAgICAgLy8gb25jZSBhbGwgY29uZmlndXJhdGlvbnMgYW5kIHVwZGF0ZXJzIGhhdmUgYmVlbiBhcHBsaWVkLCBtYWtlIHN1cmUgdG8gc2V0IHVwIGEgY2F0Y2hhbGxcbiAgICAgIC8vIGhhbmRsZXIgc28gdGhhdCBhbnl0aGluZyB1bmtub3duIDQwNHMuIEJ1dCBkbyB0aGlzIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZSBzaW5jZSB3ZSBkb24ndFxuICAgICAgLy8gd2FudCB0byBibG9jayBleHRlbnNpb25zJyBhYmlsaXR5IHRvIGFkZCByb3V0ZXMgaWYgdGhleSB3YW50LlxuICAgICAgYXBwLmFsbCgnKicsIGNhdGNoNDA0SGFuZGxlcik7XG5cbiAgICAgIGF3YWl0IHN0YXJ0U2VydmVyKHtodHRwU2VydmVyLCBob3N0bmFtZSwgcG9ydCwga2VlcEFsaXZlVGltZW91dH0pO1xuXG4gICAgICByZXNvbHZlKGFwcGl1bVNlcnZlcik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFNldHMgdXAgc29tZSBFeHByZXNzIG1pZGRsZXdhcmUgYW5kIHN0dWZmXG4gKiBAcGFyYW0ge0NvbmZpZ3VyZVNlcnZlck9wdHN9IG9wdHNcbiAqL1xuZnVuY3Rpb24gY29uZmlndXJlU2VydmVyKHtcbiAgYXBwLFxuICBhZGRSb3V0ZXMsXG4gIGFsbG93Q29ycyA9IHRydWUsXG4gIGJhc2VQYXRoID0gREVGQVVMVF9CQVNFX1BBVEgsXG4gIGV4dHJhTWV0aG9kTWFwID0ge30sXG59KSB7XG4gIGJhc2VQYXRoID0gbm9ybWFsaXplQmFzZVBhdGgoYmFzZVBhdGgpO1xuXG4gIGFwcC51c2UoZW5kTG9nRm9ybWF0dGVyKTtcblxuICAvLyBzZXQgdXAgc3RhdGljIGFzc2V0c1xuICBhcHAudXNlKGZhdmljb24ocGF0aC5yZXNvbHZlKFNUQVRJQ19ESVIsICdmYXZpY29uLmljbycpKSk7XG4gIGFwcC51c2UoZXhwcmVzcy5zdGF0aWMoU1RBVElDX0RJUikpO1xuXG4gIC8vIGNyYXNoIHJvdXRlcywgZm9yIHRlc3RpbmdcbiAgYXBwLnVzZShgJHtiYXNlUGF0aH0vcHJvZHVjZV9lcnJvcmAsIHByb2R1Y2VFcnJvcik7XG4gIGFwcC51c2UoYCR7YmFzZVBhdGh9L2NyYXNoYCwgcHJvZHVjZUNyYXNoKTtcblxuICAvLyBhZGQgbWlkZGxld2FyZXNcbiAgaWYgKGFsbG93Q29ycykge1xuICAgIGFwcC51c2UoYWxsb3dDcm9zc0RvbWFpbik7XG4gIH0gZWxzZSB7XG4gICAgYXBwLnVzZShhbGxvd0Nyb3NzRG9tYWluQXN5bmNFeGVjdXRlKGJhc2VQYXRoKSk7XG4gIH1cbiAgYXBwLnVzZShoYW5kbGVJZGVtcG90ZW5jeSk7XG4gIGFwcC51c2UoZml4UHl0aG9uQ29udGVudFR5cGUoYmFzZVBhdGgpKTtcbiAgYXBwLnVzZShkZWZhdWx0VG9KU09OQ29udGVudFR5cGUpO1xuICBhcHAudXNlKGJvZHlQYXJzZXIudXJsZW5jb2RlZCh7ZXh0ZW5kZWQ6IHRydWV9KSk7XG4gIGFwcC51c2UobWV0aG9kT3ZlcnJpZGUoKSk7XG4gIGFwcC51c2UoY2F0Y2hBbGxIYW5kbGVyKTtcblxuICAvLyBtYWtlIHN1cmUgYXBwaXVtIG5ldmVyIGZhaWxzIGJlY2F1c2Ugb2YgYSBmaWxlIHNpemUgdXBsb2FkIGxpbWl0XG4gIGFwcC51c2UoYm9keVBhcnNlci5qc29uKHtsaW1pdDogJzFnYid9KSk7XG5cbiAgLy8gc2V0IHVwIHN0YXJ0IGxvZ2dpbmcgKHdoaWNoIGRlcGVuZHMgb24gYm9keVBhcnNlciBkb2luZyBpdHMgdGhpbmcpXG4gIGFwcC51c2Uoc3RhcnRMb2dGb3JtYXR0ZXIpO1xuXG4gIGFkZFJvdXRlcyhhcHAsIHtiYXNlUGF0aCwgZXh0cmFNZXRob2RNYXB9KTtcblxuICAvLyBkeW5hbWljIHJvdXRlcyBmb3IgdGVzdGluZywgZXRjLlxuICBhcHAuYWxsKCcvd2VsY29tZScsIHdlbGNvbWUpO1xuICBhcHAuYWxsKCcvdGVzdC9ndWluZWEtcGlnJywgZ3VpbmVhUGlnKTtcbiAgYXBwLmFsbCgnL3Rlc3QvZ3VpbmVhLXBpZy1zY3JvbGxhYmxlJywgZ3VpbmVhUGlnU2Nyb2xsYWJsZSk7XG4gIGFwcC5hbGwoJy90ZXN0L2d1aW5lYS1waWctYXBwLWJhbm5lcicsIGd1aW5lYVBpZ0FwcEJhbm5lcik7XG59XG5cbi8qKlxuICogTW9ua2V5cGF0Y2hlcyB0aGUgYGh0dHAuU2VydmVyYCBpbnN0YW5jZSBhbmQgcmV0dXJucyBhIHtAbGlua2NvZGUgQXBwaXVtU2VydmVyfS5cbiAqIFRoaXMgZnVuY3Rpb24gX211dGF0ZXNfIHRoZSBgaHR0cFNlcnZlcmAgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtDb25maWd1cmVIdHRwT3B0c30gb3B0c1xuICogQHJldHVybnMge0FwcGl1bVNlcnZlcn1cbiAqL1xuZnVuY3Rpb24gY29uZmlndXJlSHR0cCh7aHR0cFNlcnZlciwgcmVqZWN0LCBrZWVwQWxpdmVUaW1lb3V0fSkge1xuICBjb25zdCBzZXJ2ZXJTdGF0ZSA9IHtcbiAgICBub3RpZmllcjogbmV3IEV2ZW50RW1pdHRlcigpLFxuICAgIGNsb3NlZDogZmFsc2UsXG4gIH07XG4gIC8vIFRTIGRvZXMgbm90IGxvdmUgbW9ua2V5cGF0Y2hpbmcuXG4gIGNvbnN0IGFwcGl1bVNlcnZlciA9IC8qKiBAdHlwZSB7QXBwaXVtU2VydmVyfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoaHR0cFNlcnZlcikpO1xuICBhcHBpdW1TZXJ2ZXIuYWRkV2ViU29ja2V0SGFuZGxlciA9IGFkZFdlYlNvY2tldEhhbmRsZXI7XG4gIGFwcGl1bVNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyID0gcmVtb3ZlV2ViU29ja2V0SGFuZGxlcjtcbiAgYXBwaXVtU2VydmVyLnJlbW92ZUFsbFdlYlNvY2tldEhhbmRsZXJzID0gcmVtb3ZlQWxsV2ViU29ja2V0SGFuZGxlcnM7XG4gIGFwcGl1bVNlcnZlci5nZXRXZWJTb2NrZXRIYW5kbGVycyA9IGdldFdlYlNvY2tldEhhbmRsZXJzO1xuXG4gIC8vIGh0dHAuU2VydmVyLmNsb3NlKCkgb25seSBzdG9wcyBuZXcgY29ubmVjdGlvbnMsIGJ1dCB3ZSBuZWVkIHRvIHdhaXQgdW50aWxcbiAgLy8gYWxsIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQgYW5kIHRoZSBgY2xvc2VgIGV2ZW50IGlzIGVtaXR0ZWRcbiAgY29uc3QgY2xvc2UgPSBhcHBpdW1TZXJ2ZXIuY2xvc2UuYmluZChhcHBpdW1TZXJ2ZXIpO1xuICBhcHBpdW1TZXJ2ZXIuY2xvc2UgPSBhc3luYyAoKSA9PlxuICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS12MC54LWFyY2hpdmUvaXNzdWVzLzkwNjYjaXNzdWVjb21tZW50LTEyNDIxMDU3NlxuICAgICAgc2VydmVyU3RhdGUuY2xvc2VkID0gdHJ1ZTtcbiAgICAgIHNlcnZlclN0YXRlLm5vdGlmaWVyLmVtaXQoJ3NodXRkb3duJyk7XG4gICAgICBsb2cuaW5mbygnV2FpdGluZyB1bnRpbCB0aGUgc2VydmVyIGlzIGNsb3NlZCcpO1xuICAgICAgaHR0cFNlcnZlci5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIGxvZy5pbmZvKCdSZWNlaXZlZCBzZXJ2ZXIgY2xvc2UgZXZlbnQnKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICBjbG9zZSgoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG4gICAgICB9KTtcbiAgICB9KTtcblxuICBhcHBpdW1TZXJ2ZXIub24oXG4gICAgJ2Vycm9yJyxcbiAgICAvKiogQHBhcmFtIHtOb2RlSlMuRXJybm9FeGNlcHRpb259IGVyciAqLyAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUk5PVEFWQUlMJykge1xuICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgJ0NvdWxkIG5vdCBzdGFydCBSRVNUIGh0dHAgaW50ZXJmYWNlIGxpc3RlbmVyLiAnICsgJ1JlcXVlc3RlZCBhZGRyZXNzIGlzIG5vdCBhdmFpbGFibGUuJ1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICdDb3VsZCBub3Qgc3RhcnQgUkVTVCBodHRwIGludGVyZmFjZSBsaXN0ZW5lci4gVGhlIHJlcXVlc3RlZCAnICtcbiAgICAgICAgICAgICdwb3J0IG1heSBhbHJlYWR5IGJlIGluIHVzZS4gUGxlYXNlIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyAnICtcbiAgICAgICAgICAgICdvdGhlciBpbnN0YW5jZSBvZiB0aGlzIHNlcnZlciBydW5uaW5nIGFscmVhZHkuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmVqZWN0KGVycik7XG4gICAgfVxuICApO1xuXG4gIGFwcGl1bVNlcnZlci5vbihcbiAgICAnY29ubmVjdGlvbicsXG4gICAgLyoqIEBwYXJhbSB7QXBwaXVtU2VydmVyU29ja2V0fSBzb2NrZXQgKi8gKHNvY2tldCkgPT4ge1xuICAgICAgc29ja2V0LnNldFRpbWVvdXQoa2VlcEFsaXZlVGltZW91dCk7XG4gICAgICBzb2NrZXQub24oJ2Vycm9yJywgcmVqZWN0KTtcblxuICAgICAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICAgIHNvY2tldC5fb3BlblJlcUNvdW50ID0gMDtcbiAgICAgIHNvY2tldC5vbmNlKCdjbG9zZScsICgpID0+IHNlcnZlclN0YXRlLm5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKCdzaHV0ZG93bicsIGRlc3Ryb3kpKTtcbiAgICAgIHNlcnZlclN0YXRlLm5vdGlmaWVyLm9uY2UoJ3NodXRkb3duJywgZGVzdHJveSk7XG4gICAgfVxuICApO1xuXG4gIGFwcGl1bVNlcnZlci5vbigncmVxdWVzdCcsIGZ1bmN0aW9uIChyZXEsIHJlcykge1xuICAgIGNvbnN0IHNvY2tldCA9IC8qKiBAdHlwZSB7QXBwaXVtU2VydmVyU29ja2V0fSAqLyAocmVxLmNvbm5lY3Rpb24gfHwgcmVxLnNvY2tldCk7XG4gICAgc29ja2V0Ll9vcGVuUmVxQ291bnQrKztcbiAgICByZXMub24oJ2ZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNvY2tldC5fb3BlblJlcUNvdW50LS07XG4gICAgICBpZiAoc2VydmVyU3RhdGUuY2xvc2VkICYmIHNvY2tldC5fb3BlblJlcUNvdW50ID09PSAwKSB7XG4gICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBhcHBpdW1TZXJ2ZXI7XG59XG5cbi8qKlxuICogU3RhcnRzIGFuIHtAbGlua2NvZGUgQXBwaXVtU2VydmVyfVxuICogQHBhcmFtIHtTdGFydFNlcnZlck9wdHN9IG9wdHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydFNlcnZlcih7aHR0cFNlcnZlciwgcG9ydCwgaG9zdG5hbWUsIGtlZXBBbGl2ZVRpbWVvdXR9KSB7XG4gIC8vIElmIHRoZSBob3N0bmFtZSBpcyBvbWl0dGVkLCB0aGUgc2VydmVyIHdpbGwgYWNjZXB0XG4gIC8vIGNvbm5lY3Rpb25zIG9uIGFueSBJUCBhZGRyZXNzXG4gIC8qKiBAdHlwZSB7KHBvcnQ6IG51bWJlciwgaG9zdG5hbWU/OiBzdHJpbmcpID0+IEI8aHR0cC5TZXJ2ZXI+fSAqL1xuICBjb25zdCBzdGFydCA9IEIucHJvbWlzaWZ5KGh0dHBTZXJ2ZXIubGlzdGVuLCB7Y29udGV4dDogaHR0cFNlcnZlcn0pO1xuICBjb25zdCBzdGFydFByb21pc2UgPSBzdGFydChwb3J0LCBob3N0bmFtZSk7XG4gIGh0dHBTZXJ2ZXIua2VlcEFsaXZlVGltZW91dCA9IGtlZXBBbGl2ZVRpbWVvdXQ7XG4gIC8vIGhlYWRlcnMgdGltZW91dCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBrZWVwQWxpdmVUaW1lb3V0XG4gIGh0dHBTZXJ2ZXIuaGVhZGVyc1RpbWVvdXQgPSBrZWVwQWxpdmVUaW1lb3V0ICsgNSAqIDEwMDA7XG4gIGF3YWl0IHN0YXJ0UHJvbWlzZTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYmFzZSBwYXRoIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVCYXNlUGF0aChiYXNlUGF0aCkge1xuICBpZiAoIV8uaXNTdHJpbmcoYmFzZVBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhdGggcHJlZml4ICR7YmFzZVBhdGh9YCk7XG4gIH1cblxuICAvLyBlbnN1cmUgdGhlIHBhdGggcHJlZml4IGRvZXMgbm90IGVuZCBpbiAnLycsIHNpbmNlIG91ciBtZXRob2QgbWFwXG4gIC8vIHN0YXJ0cyBhbGwgcGF0aHMgd2l0aCAnLydcbiAgYmFzZVBhdGggPSBiYXNlUGF0aC5yZXBsYWNlKC9cXC8kLywgJycpO1xuXG4gIC8vIGxpa2V3aXNlLCBlbnN1cmUgdGhlIHBhdGggcHJlZml4IGRvZXMgYWx3YXlzIFNUQVJUIHdpdGggLywgdW5sZXNzIHRoZSBwYXRoXG4gIC8vIGlzIGVtcHR5IG1lYW5pbmcgbm8gYmFzZSBwYXRoIGF0IGFsbFxuICBpZiAoYmFzZVBhdGggIT09ICcnICYmIGJhc2VQYXRoWzBdICE9PSAnLycpIHtcbiAgICBiYXNlUGF0aCA9IGAvJHtiYXNlUGF0aH1gO1xuICB9XG5cbiAgcmV0dXJuIGJhc2VQYXRoO1xufVxuXG5leHBvcnQge3NlcnZlciwgY29uZmlndXJlU2VydmVyLCBub3JtYWxpemVCYXNlUGF0aH07XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBzdGFydFNlcnZlcn0uXG4gKiBAdHlwZWRlZiBTdGFydFNlcnZlck9wdHNcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCdodHRwJykuU2VydmVyfSBodHRwU2VydmVyIC0gSFRUUCBzZXJ2ZXIgaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwb3J0IC0gUG9ydCB0byBydW4gb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBrZWVwQWxpdmVUaW1lb3V0IC0gS2VlcC1hbGl2ZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtob3N0bmFtZV0gLSBPcHRpb25hbCBob3N0bmFtZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkFwcGl1bVNlcnZlcn0gQXBwaXVtU2VydmVyXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtU2VydmVyU29ja2V0fSBBcHBpdW1TZXJ2ZXJTb2NrZXRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5NZXRob2RNYXB9IE1ldGhvZE1hcFxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBjb25maWd1cmVIdHRwfVxuICogQHR5cGVkZWYgQ29uZmlndXJlSHR0cE9wdHNcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCdodHRwJykuU2VydmVyfSBodHRwU2VydmVyIC0gSFRUUCBzZXJ2ZXIgaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7KGVycm9yPzogYW55KSA9PiB2b2lkfSByZWplY3QgLSBSZWplY3Rpb24gZnVuY3Rpb24gZnJvbSBgUHJvbWlzZWAgY29uc3RydWN0b3JcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBrZWVwQWxpdmVUaW1lb3V0IC0gS2VlcC1hbGl2ZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBzZXJ2ZXJ9XG4gKiBAdHlwZWRlZiBTZXJ2ZXJPcHRzXG4gKiBAcHJvcGVydHkge1JvdXRlQ29uZmlndXJpbmdGdW5jdGlvbn0gcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uXG4gKiBAcHJvcGVydHkge251bWJlcn0gcG9ydFxuICogQHByb3BlcnR5IHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5TZXJ2ZXJBcmdzfSBjbGlBcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RuYW1lXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbYWxsb3dDb3JzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtiYXNlUGF0aF1cbiAqIEBwcm9wZXJ0eSB7TWV0aG9kTWFwfSBbZXh0cmFNZXRob2RNYXBdXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlVwZGF0ZVNlcnZlckNhbGxiYWNrW119IFtzZXJ2ZXJVcGRhdGVyc11cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBba2VlcEFsaXZlVGltZW91dF1cbiAqL1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gd2hpY2ggY29uZmlndXJlcyByb3V0ZXNcbiAqIEBjYWxsYmFjayBSb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb25cbiAqIEBwYXJhbSB7aW1wb3J0KCdleHByZXNzJykuRXhwcmVzc30gYXBwXG4gKiBAcGFyYW0ge1JvdXRlQ29uZmlndXJpbmdGdW5jdGlvbk9wdHN9IFtvcHRzXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIHtAbGlua2NvZGUgUm91dGVDb25maWd1cmluZ0Z1bmN0aW9ufVxuICogQHR5cGVkZWYgUm91dGVDb25maWd1cmluZ0Z1bmN0aW9uT3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtiYXNlUGF0aF1cbiAqIEBwcm9wZXJ0eSB7TWV0aG9kTWFwfSBbZXh0cmFNZXRob2RNYXBdXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIGNvbmZpZ3VyZVNlcnZlcn1cbiAqIEB0eXBlZGVmIENvbmZpZ3VyZVNlcnZlck9wdHNcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCdleHByZXNzJykuRXhwcmVzc30gYXBwXG4gKiBAcHJvcGVydHkge1JvdXRlQ29uZmlndXJpbmdGdW5jdGlvbn0gYWRkUm91dGVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthbGxvd0NvcnNdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Jhc2VQYXRoXVxuICogQHByb3BlcnR5IHtNZXRob2RNYXB9IFtleHRyYU1ldGhvZE1hcF1cbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQVNBOztBQUNBOztBQUNBOztBQU1BOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEscUJBQXFCLEdBQUcsS0FBSyxFQUFMLEdBQVUsSUFBeEM7O0FBT0EsZUFBZUMsTUFBZixDQUFzQkMsSUFBdEIsRUFBNEI7RUFDMUIsTUFBTTtJQUNKQyx3QkFESTtJQUVKQyxJQUZJO0lBR0pDLFFBSEk7SUFJSkMsT0FKSTtJQUtKQyxTQUFTLEdBQUcsSUFMUjtJQU1KQyxRQUFRLEdBQUdDLDRCQU5QO0lBT0pDLGNBQWMsR0FBRyxFQVBiO0lBUUpDLGNBQWMsR0FBRyxFQVJiO0lBU0pDLGdCQUFnQixHQUFHWjtFQVRmLElBVUZFLElBVko7RUFhQSxNQUFNVyxHQUFHLEdBQUcsSUFBQUMsZ0JBQUEsR0FBWjs7RUFDQSxNQUFNQyxVQUFVLEdBQUdDLGFBQUEsQ0FBS0MsWUFBTCxDQUFrQkosR0FBbEIsQ0FBbkI7O0VBQ0EsT0FBTyxNQUFNLElBQUlLLGlCQUFKLENBQU0sT0FBT0MsT0FBUCxFQUFnQkMsTUFBaEIsS0FBMkI7SUFNNUMsSUFBSTtNQUNGLE1BQU1DLFlBQVksR0FBR0MsYUFBYSxDQUFDO1FBQ2pDUCxVQURpQztRQUVqQ0ssTUFGaUM7UUFHakNSO01BSGlDLENBQUQsQ0FBbEM7TUFLQVcsZUFBZSxDQUFDO1FBQ2RWLEdBRGM7UUFFZFcsU0FB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
|
|
212
|
+
exports.normalizeBasePath = normalizeBasePath;
|
|
213
|
+
/**
|
|
214
|
+
* Options for {@linkcode startServer}.
|
|
215
|
+
* @typedef StartServerOpts
|
|
216
|
+
* @property {import('http').Server} httpServer - HTTP server instance
|
|
217
|
+
* @property {number} port - Port to run on
|
|
218
|
+
* @property {number} keepAliveTimeout - Keep-alive timeout in milliseconds
|
|
219
|
+
* @property {string} [hostname] - Optional hostname
|
|
220
|
+
*/
|
|
221
|
+
/**
|
|
222
|
+
* @typedef {import('@appium/types').AppiumServer} AppiumServer
|
|
223
|
+
* @typedef {import('@appium/types').AppiumServerSocket} AppiumServerSocket
|
|
224
|
+
*/
|
|
225
|
+
/**
|
|
226
|
+
* @typedef {import('@appium/types').MethodMap<import('@appium/types').ExternalDriver>} MethodMap
|
|
227
|
+
*/
|
|
228
|
+
/**
|
|
229
|
+
* Options for {@linkcode configureHttp}
|
|
230
|
+
* @typedef ConfigureHttpOpts
|
|
231
|
+
* @property {import('http').Server} httpServer - HTTP server instance
|
|
232
|
+
* @property {(error?: any) => void} reject - Rejection function from `Promise` constructor
|
|
233
|
+
* @property {number} keepAliveTimeout - Keep-alive timeout in milliseconds
|
|
234
|
+
*/
|
|
235
|
+
/**
|
|
236
|
+
* Options for {@linkcode server}
|
|
237
|
+
* @typedef ServerOpts
|
|
238
|
+
* @property {RouteConfiguringFunction} routeConfiguringFunction
|
|
239
|
+
* @property {number} port
|
|
240
|
+
* @property {import('@appium/types').ServerArgs} [cliArgs]
|
|
241
|
+
* @property {string} [hostname]
|
|
242
|
+
* @property {boolean} [allowCors]
|
|
243
|
+
* @property {string} [basePath]
|
|
244
|
+
* @property {MethodMap} [extraMethodMap]
|
|
245
|
+
* @property {import('@appium/types').UpdateServerCallback[]} [serverUpdaters]
|
|
246
|
+
* @property {number} [keepAliveTimeout]
|
|
247
|
+
*/
|
|
248
|
+
/**
|
|
249
|
+
* A function which configures routes
|
|
250
|
+
* @callback RouteConfiguringFunction
|
|
251
|
+
* @param {import('express').Express} app
|
|
252
|
+
* @param {RouteConfiguringFunctionOpts} [opts]
|
|
253
|
+
* @returns {void}
|
|
254
|
+
*/
|
|
255
|
+
/**
|
|
256
|
+
* Options for a {@linkcode RouteConfiguringFunction}
|
|
257
|
+
* @typedef RouteConfiguringFunctionOpts
|
|
258
|
+
* @property {string} [basePath]
|
|
259
|
+
* @property {MethodMap} [extraMethodMap]
|
|
260
|
+
*/
|
|
261
|
+
/**
|
|
262
|
+
* Options for {@linkcode configureServer}
|
|
263
|
+
* @typedef ConfigureServerOpts
|
|
264
|
+
* @property {import('express').Express} app
|
|
265
|
+
* @property {RouteConfiguringFunction} addRoutes
|
|
266
|
+
* @property {boolean} [allowCors]
|
|
267
|
+
* @property {string} [basePath]
|
|
268
|
+
* @property {MethodMap} [extraMethodMap]
|
|
269
|
+
*/
|
|
270
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","names":["KEEP_ALIVE_TIMEOUT_MS","server","opts","routeConfiguringFunction","port","hostname","cliArgs","allowCors","basePath","DEFAULT_BASE_PATH","extraMethodMap","serverUpdaters","keepAliveTimeout","app","express","httpServer","http","createServer","B","resolve","reject","appiumServer","configureHttp","configureServer","addRoutes","updater","all","catch404Handler","startServer","err","normalizeBasePath","use","endLogFormatter","favicon","path","STATIC_DIR","static","produceError","produceCrash","allowCrossDomain","allowCrossDomainAsyncExecute","handleIdempotency","fixPythonContentType","defaultToJSONContentType","bodyParser","urlencoded","extended","methodOverride","catchAllHandler","json","limit","startLogFormatter","welcome","guineaPig","guineaPigScrollable","guineaPigAppBanner","serverState","notifier","EventEmitter","closed","addWebSocketHandler","removeWebSocketHandler","removeAllWebSocketHandlers","getWebSocketHandlers","close","bind","emit","log","info","on","code","error","socket","setTimeout","destroy","_openReqCount","once","removeListener","req","res","connection","start","promisify","listen","context","startPromise","headersTimeout","_","isString","Error","replace"],"sources":["../../../lib/express/server.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport express from 'express';\nimport http from 'http';\nimport favicon from 'serve-favicon';\nimport bodyParser from 'body-parser';\nimport methodOverride from 'method-override';\nimport log from './logger';\nimport {startLogFormatter, endLogFormatter} from './express-logging';\nimport {\n allowCrossDomain,\n fixPythonContentType,\n defaultToJSONContentType,\n catchAllHandler,\n allowCrossDomainAsyncExecute,\n handleIdempotency,\n catch404Handler,\n} from './middleware';\nimport {guineaPig, guineaPigScrollable, guineaPigAppBanner, welcome, STATIC_DIR} from './static';\nimport {produceError, produceCrash} from './crash';\nimport {\n addWebSocketHandler,\n removeWebSocketHandler,\n removeAllWebSocketHandlers,\n getWebSocketHandlers,\n} from './websocket';\nimport B from 'bluebird';\nimport {DEFAULT_BASE_PATH} from '../constants';\nimport {EventEmitter} from 'events';\n\nconst KEEP_ALIVE_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes\n\n/**\n *\n * @param {ServerOpts} opts\n * @returns {Promise<AppiumServer>}\n */\nasync function server(opts) {\n const {\n routeConfiguringFunction,\n port,\n hostname,\n cliArgs,\n allowCors = true,\n basePath = DEFAULT_BASE_PATH,\n extraMethodMap = {},\n serverUpdaters = [],\n keepAliveTimeout = KEEP_ALIVE_TIMEOUT_MS,\n } = opts;\n\n // create the actual http server\n const app = express();\n const httpServer = http.createServer(app);\n return await new B(async (resolve, reject) => {\n // we put an async function as the promise constructor because we want some things to happen in\n // serial (application of plugin updates, for example). But we still need to use a promise here\n // because some elements of server start failure only happen in httpServer listeners. So the\n // way we resolve it is to use an async function here but to wrap all the inner logic in\n // try/catch so any errors can be passed to reject.\n try {\n const appiumServer = configureHttp({\n httpServer,\n reject,\n keepAliveTimeout,\n });\n configureServer({\n app,\n addRoutes: routeConfiguringFunction,\n allowCors,\n basePath,\n extraMethodMap,\n });\n // allow extensions to update the app and http server objects\n for (const updater of serverUpdaters) {\n await updater(app, appiumServer, cliArgs);\n }\n\n // once all configurations and updaters have been applied, make sure to set up a catchall\n // handler so that anything unknown 404s. But do this after everything else since we don't\n // want to block extensions' ability to add routes if they want.\n app.all('*', catch404Handler);\n\n await startServer({httpServer, hostname, port, keepAliveTimeout});\n\n resolve(appiumServer);\n } catch (err) {\n reject(err);\n }\n });\n}\n\n/**\n * Sets up some Express middleware and stuff\n * @param {ConfigureServerOpts} opts\n */\nfunction configureServer({\n app,\n addRoutes,\n allowCors = true,\n basePath = DEFAULT_BASE_PATH,\n extraMethodMap = {},\n}) {\n basePath = normalizeBasePath(basePath);\n\n app.use(endLogFormatter);\n\n // set up static assets\n app.use(favicon(path.resolve(STATIC_DIR, 'favicon.ico')));\n app.use(express.static(STATIC_DIR));\n\n // crash routes, for testing\n app.use(`${basePath}/produce_error`, produceError);\n app.use(`${basePath}/crash`, produceCrash);\n\n // add middlewares\n if (allowCors) {\n app.use(allowCrossDomain);\n } else {\n app.use(allowCrossDomainAsyncExecute(basePath));\n }\n app.use(handleIdempotency);\n app.use(fixPythonContentType(basePath));\n app.use(defaultToJSONContentType);\n app.use(bodyParser.urlencoded({extended: true}));\n app.use(methodOverride());\n app.use(catchAllHandler);\n\n // make sure appium never fails because of a file size upload limit\n app.use(bodyParser.json({limit: '1gb'}));\n\n // set up start logging (which depends on bodyParser doing its thing)\n app.use(startLogFormatter);\n\n addRoutes(app, {basePath, extraMethodMap});\n\n // dynamic routes for testing, etc.\n app.all('/welcome', welcome);\n app.all('/test/guinea-pig', guineaPig);\n app.all('/test/guinea-pig-scrollable', guineaPigScrollable);\n app.all('/test/guinea-pig-app-banner', guineaPigAppBanner);\n}\n\n/**\n * Monkeypatches the `http.Server` instance and returns a {@linkcode AppiumServer}.\n * This function _mutates_ the `httpServer` parameter.\n * @param {ConfigureHttpOpts} opts\n * @returns {AppiumServer}\n */\nfunction configureHttp({httpServer, reject, keepAliveTimeout}) {\n const serverState = {\n notifier: new EventEmitter(),\n closed: false,\n };\n // TS does not love monkeypatching.\n const appiumServer = /** @type {AppiumServer} */ (/** @type {unknown} */ (httpServer));\n appiumServer.addWebSocketHandler = addWebSocketHandler;\n appiumServer.removeWebSocketHandler = removeWebSocketHandler;\n appiumServer.removeAllWebSocketHandlers = removeAllWebSocketHandlers;\n appiumServer.getWebSocketHandlers = getWebSocketHandlers;\n\n // http.Server.close() only stops new connections, but we need to wait until\n // all connections are closed and the `close` event is emitted\n const close = appiumServer.close.bind(appiumServer);\n appiumServer.close = async () =>\n await new B((resolve, reject) => {\n // https://github.com/nodejs/node-v0.x-archive/issues/9066#issuecomment-124210576\n serverState.closed = true;\n serverState.notifier.emit('shutdown');\n log.info('Waiting until the server is closed');\n httpServer.on('close', () => {\n log.info('Received server close event');\n resolve();\n });\n close((err) => {\n if (err) reject(err); // eslint-disable-line curly\n });\n });\n\n appiumServer.on(\n 'error',\n /** @param {NodeJS.ErrnoException} err */ (err) => {\n if (err.code === 'EADDRNOTAVAIL') {\n log.error(\n 'Could not start REST http interface listener. ' + 'Requested address is not available.'\n );\n } else {\n log.error(\n 'Could not start REST http interface listener. The requested ' +\n 'port may already be in use. Please make sure there is no ' +\n 'other instance of this server running already.'\n );\n }\n reject(err);\n }\n );\n\n appiumServer.on(\n 'connection',\n /** @param {AppiumServerSocket} socket */ (socket) => {\n socket.setTimeout(keepAliveTimeout);\n socket.on('error', reject);\n\n function destroy() {\n socket.destroy();\n }\n socket._openReqCount = 0;\n socket.once('close', () => serverState.notifier.removeListener('shutdown', destroy));\n serverState.notifier.once('shutdown', destroy);\n }\n );\n\n appiumServer.on('request', function (req, res) {\n const socket = /** @type {AppiumServerSocket} */ (req.connection || req.socket);\n socket._openReqCount++;\n res.on('finish', function () {\n socket._openReqCount--;\n if (serverState.closed && socket._openReqCount === 0) {\n socket.destroy();\n }\n });\n });\n\n return appiumServer;\n}\n\n/**\n * Starts an {@linkcode AppiumServer}\n * @param {StartServerOpts} opts\n * @returns {Promise<void>}\n */\nasync function startServer({httpServer, port, hostname, keepAliveTimeout}) {\n // If the hostname is omitted, the server will accept\n // connections on any IP address\n /** @type {(port: number, hostname?: string) => B<http.Server>} */\n const start = B.promisify(httpServer.listen, {context: httpServer});\n const startPromise = start(port, hostname);\n httpServer.keepAliveTimeout = keepAliveTimeout;\n // headers timeout must be greater than keepAliveTimeout\n httpServer.headersTimeout = keepAliveTimeout + 5 * 1000;\n await startPromise;\n}\n\n/**\n * Normalize base path string\n * @param {string} basePath\n * @returns {string}\n */\nfunction normalizeBasePath(basePath) {\n if (!_.isString(basePath)) {\n throw new Error(`Invalid path prefix ${basePath}`);\n }\n\n // ensure the path prefix does not end in '/', since our method map\n // starts all paths with '/'\n basePath = basePath.replace(/\\/$/, '');\n\n // likewise, ensure the path prefix does always START with /, unless the path\n // is empty meaning no base path at all\n if (basePath !== '' && basePath[0] !== '/') {\n basePath = `/${basePath}`;\n }\n\n return basePath;\n}\n\nexport {server, configureServer, normalizeBasePath};\n\n/**\n * Options for {@linkcode startServer}.\n * @typedef StartServerOpts\n * @property {import('http').Server} httpServer - HTTP server instance\n * @property {number} port - Port to run on\n * @property {number} keepAliveTimeout - Keep-alive timeout in milliseconds\n * @property {string} [hostname] - Optional hostname\n */\n\n/**\n * @typedef {import('@appium/types').AppiumServer} AppiumServer\n * @typedef {import('@appium/types').AppiumServerSocket} AppiumServerSocket\n * @typedef {import('@appium/types').MethodMap} MethodMap\n */\n\n/**\n * Options for {@linkcode configureHttp}\n * @typedef ConfigureHttpOpts\n * @property {import('http').Server} httpServer - HTTP server instance\n * @property {(error?: any) => void} reject - Rejection function from `Promise` constructor\n * @property {number} keepAliveTimeout - Keep-alive timeout in milliseconds\n */\n\n/**\n * Options for {@linkcode server}\n * @typedef ServerOpts\n * @property {RouteConfiguringFunction} routeConfiguringFunction\n * @property {number} port\n * @property {import('@appium/types').ServerArgs} cliArgs\n * @property {string} [hostname]\n * @property {boolean} [allowCors]\n * @property {string} [basePath]\n * @property {MethodMap} [extraMethodMap]\n * @property {import('@appium/types').UpdateServerCallback[]} [serverUpdaters]\n * @property {number} [keepAliveTimeout]\n */\n\n/**\n * A function which configures routes\n * @callback RouteConfiguringFunction\n * @param {import('express').Express} app\n * @param {RouteConfiguringFunctionOpts} [opts]\n * @returns {void}\n */\n\n/**\n * Options for a {@linkcode RouteConfiguringFunction}\n * @typedef RouteConfiguringFunctionOpts\n * @property {string} [basePath]\n * @property {MethodMap} [extraMethodMap]\n */\n\n/**\n * Options for {@linkcode configureServer}\n * @typedef ConfigureServerOpts\n * @property {import('express').Express} app\n * @property {RouteConfiguringFunction} addRoutes\n * @property {boolean} [allowCors]\n * @property {string} [basePath]\n * @property {MethodMap} [extraMethodMap]\n */\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../lib/express/server.js"],"names":[],"mappings":"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"}
|