@appium/base-driver 8.7.2 → 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.
Files changed (121) hide show
  1. package/build/lib/basedriver/capabilities.d.ts +11 -163
  2. package/build/lib/basedriver/capabilities.d.ts.map +1 -1
  3. package/build/lib/basedriver/capabilities.js +354 -236
  4. package/build/lib/basedriver/capabilities.js.map +1 -1
  5. package/build/lib/basedriver/commands/event.d.ts +7 -6
  6. package/build/lib/basedriver/commands/event.d.ts.map +1 -1
  7. package/build/lib/basedriver/commands/event.js +55 -35
  8. package/build/lib/basedriver/commands/event.js.map +1 -1
  9. package/build/lib/basedriver/commands/execute.d.ts +7 -6
  10. package/build/lib/basedriver/commands/execute.d.ts.map +1 -1
  11. package/build/lib/basedriver/commands/execute.js +66 -58
  12. package/build/lib/basedriver/commands/execute.js.map +1 -1
  13. package/build/lib/basedriver/commands/find.d.ts +9 -7
  14. package/build/lib/basedriver/commands/find.d.ts.map +1 -1
  15. package/build/lib/basedriver/commands/find.js +102 -54
  16. package/build/lib/basedriver/commands/find.js.map +1 -1
  17. package/build/lib/basedriver/commands/index.d.ts +3 -7
  18. package/build/lib/basedriver/commands/index.d.ts.map +1 -1
  19. package/build/lib/basedriver/commands/index.js +30 -33
  20. package/build/lib/basedriver/commands/index.js.map +1 -1
  21. package/build/lib/basedriver/commands/log.d.ts +8 -9
  22. package/build/lib/basedriver/commands/log.d.ts.map +1 -1
  23. package/build/lib/basedriver/commands/log.js +54 -38
  24. package/build/lib/basedriver/commands/log.js.map +1 -1
  25. package/build/lib/basedriver/commands/session.d.ts +7 -6
  26. package/build/lib/basedriver/commands/session.d.ts.map +1 -1
  27. package/build/lib/basedriver/commands/session.js +46 -39
  28. package/build/lib/basedriver/commands/session.js.map +1 -1
  29. package/build/lib/basedriver/commands/settings.d.ts +7 -7
  30. package/build/lib/basedriver/commands/settings.d.ts.map +1 -1
  31. package/build/lib/basedriver/commands/settings.js +35 -28
  32. package/build/lib/basedriver/commands/settings.js.map +1 -1
  33. package/build/lib/basedriver/commands/timeout.d.ts +7 -5
  34. package/build/lib/basedriver/commands/timeout.d.ts.map +1 -1
  35. package/build/lib/basedriver/commands/timeout.js +144 -162
  36. package/build/lib/basedriver/commands/timeout.js.map +1 -1
  37. package/build/lib/basedriver/core.d.ts +6 -157
  38. package/build/lib/basedriver/core.d.ts.map +1 -1
  39. package/build/lib/basedriver/core.js +361 -230
  40. package/build/lib/basedriver/core.js.map +1 -1
  41. package/build/lib/basedriver/desired-caps.js +80 -110
  42. package/build/lib/basedriver/desired-caps.js.map +1 -1
  43. package/build/lib/basedriver/device-settings.js +57 -62
  44. package/build/lib/basedriver/device-settings.js.map +1 -1
  45. package/build/lib/basedriver/driver.d.ts +21 -267
  46. package/build/lib/basedriver/driver.d.ts.map +1 -1
  47. package/build/lib/basedriver/driver.js +362 -258
  48. package/build/lib/basedriver/driver.js.map +1 -1
  49. package/build/lib/basedriver/helpers.js +500 -495
  50. package/build/lib/basedriver/helpers.js.map +1 -1
  51. package/build/lib/basedriver/logger.d.ts +1 -1
  52. package/build/lib/basedriver/logger.d.ts.map +1 -1
  53. package/build/lib/basedriver/logger.js +5 -15
  54. package/build/lib/basedriver/logger.js.map +1 -1
  55. package/build/lib/constants.js +14 -14
  56. package/build/lib/constants.js.map +1 -1
  57. package/build/lib/express/crash.js +8 -15
  58. package/build/lib/express/crash.js.map +1 -1
  59. package/build/lib/express/express-logging.js +49 -59
  60. package/build/lib/express/express-logging.js.map +1 -1
  61. package/build/lib/express/idempotency.js +125 -177
  62. package/build/lib/express/idempotency.js.map +1 -1
  63. package/build/lib/express/logger.d.ts +1 -1
  64. package/build/lib/express/logger.d.ts.map +1 -1
  65. package/build/lib/express/logger.js +5 -15
  66. package/build/lib/express/logger.js.map +1 -1
  67. package/build/lib/express/middleware.js +82 -107
  68. package/build/lib/express/middleware.js.map +1 -1
  69. package/build/lib/express/server.d.ts +17 -5
  70. package/build/lib/express/server.d.ts.map +1 -1
  71. package/build/lib/express/server.js +259 -224
  72. package/build/lib/express/server.js.map +1 -1
  73. package/build/lib/express/static.js +64 -81
  74. package/build/lib/express/static.js.map +1 -1
  75. package/build/lib/express/websocket.js +115 -87
  76. package/build/lib/express/websocket.js.map +1 -1
  77. package/build/lib/helpers/capabilities.d.ts +1 -59
  78. package/build/lib/helpers/capabilities.d.ts.map +1 -1
  79. package/build/lib/helpers/capabilities.js +72 -69
  80. package/build/lib/helpers/capabilities.js.map +1 -1
  81. package/build/lib/index.js +64 -180
  82. package/build/lib/index.js.map +1 -1
  83. package/build/lib/jsonwp-proxy/protocol-converter.js +215 -227
  84. package/build/lib/jsonwp-proxy/protocol-converter.js.map +1 -1
  85. package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -1
  86. package/build/lib/jsonwp-proxy/proxy.js +355 -393
  87. package/build/lib/jsonwp-proxy/proxy.js.map +1 -1
  88. package/build/lib/jsonwp-status/status.js +119 -130
  89. package/build/lib/jsonwp-status/status.js.map +1 -1
  90. package/build/lib/protocol/errors.d.ts +135 -32
  91. package/build/lib/protocol/errors.d.ts.map +1 -1
  92. package/build/lib/protocol/errors.js +871 -919
  93. package/build/lib/protocol/errors.js.map +1 -1
  94. package/build/lib/protocol/helpers.js +37 -37
  95. package/build/lib/protocol/helpers.js.map +1 -1
  96. package/build/lib/protocol/index.js +22 -109
  97. package/build/lib/protocol/index.js.map +1 -1
  98. package/build/lib/protocol/protocol.js +394 -350
  99. package/build/lib/protocol/protocol.js.map +1 -1
  100. package/build/lib/protocol/routes.d.ts +1238 -4
  101. package/build/lib/protocol/routes.d.ts.map +1 -1
  102. package/build/lib/protocol/routes.js +964 -1327
  103. package/build/lib/protocol/routes.js.map +1 -1
  104. package/build/lib/protocol/validators.js +32 -39
  105. package/build/lib/protocol/validators.js.map +1 -1
  106. package/build/tsconfig.tsbuildinfo +1 -1
  107. package/lib/basedriver/capabilities.js +80 -39
  108. package/lib/basedriver/commands/event.js +10 -5
  109. package/lib/basedriver/commands/execute.js +14 -9
  110. package/lib/basedriver/commands/find.js +18 -12
  111. package/lib/basedriver/commands/index.js +21 -16
  112. package/lib/basedriver/commands/log.js +24 -18
  113. package/lib/basedriver/commands/session.js +10 -5
  114. package/lib/basedriver/commands/settings.js +9 -6
  115. package/lib/basedriver/commands/timeout.js +10 -4
  116. package/lib/basedriver/core.js +2 -3
  117. package/lib/basedriver/driver.js +29 -18
  118. package/lib/express/server.js +6 -3
  119. package/lib/protocol/errors.js +155 -44
  120. package/lib/protocol/routes.js +11 -7
  121. package/package.json +14 -16
@@ -1,235 +1,270 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.configureServer = configureServer;
7
- exports.normalizeBasePath = normalizeBasePath;
8
- exports.server = server;
9
-
10
- require("source-map-support/register");
11
-
12
- var _lodash = _interopRequireDefault(require("lodash"));
13
-
14
- var _path = _interopRequireDefault(require("path"));
15
-
16
- var _express = _interopRequireDefault(require("express"));
17
-
18
- var _http = _interopRequireDefault(require("http"));
19
-
20
- var _serveFavicon = _interopRequireDefault(require("serve-favicon"));
21
-
22
- var _bodyParser = _interopRequireDefault(require("body-parser"));
23
-
24
- var _methodOverride = _interopRequireDefault(require("method-override"));
25
-
26
- var _logger = _interopRequireDefault(require("./logger"));
27
-
28
- var _expressLogging = require("./express-logging");
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
- const {
50
- routeConfiguringFunction,
51
- port,
52
- hostname,
53
- cliArgs,
54
- allowCors = true,
55
- basePath = _constants.DEFAULT_BASE_PATH,
56
- extraMethodMap = {},
57
- serverUpdaters = [],
58
- keepAliveTimeout = KEEP_ALIVE_TIMEOUT_MS
59
- } = opts;
60
- const app = (0, _express.default)();
61
-
62
- const httpServer = _http.default.createServer(app);
63
-
64
- return await new _bluebird.default(async (resolve, reject) => {
65
- try {
66
- const appiumServer = configureHttp({
67
- httpServer,
68
- reject,
69
- keepAliveTimeout
70
- });
71
- configureServer({
72
- app,
73
- addRoutes: routeConfiguringFunction,
74
- allowCors,
75
- basePath,
76
- extraMethodMap
77
- });
78
-
79
- for (const updater of serverUpdaters) {
80
- await updater(app, appiumServer, cliArgs);
81
- }
82
-
83
- app.all('*', _middleware.catch404Handler);
84
- await startServer({
85
- httpServer,
86
- hostname,
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
- function configureServer({
98
- app,
99
- addRoutes,
100
- allowCors = true,
101
- basePath = _constants.DEFAULT_BASE_PATH,
102
- extraMethodMap = {}
103
- }) {
104
- basePath = normalizeBasePath(basePath);
105
- app.use(_expressLogging.endLogFormatter);
106
- app.use((0, _serveFavicon.default)(_path.default.resolve(_static.STATIC_DIR, 'favicon.ico')));
107
- app.use(_express.default.static(_static.STATIC_DIR));
108
- app.use(`${basePath}/produce_error`, _crash.produceError);
109
- app.use(`${basePath}/crash`, _crash.produceCrash);
110
-
111
- if (allowCors) {
112
- app.use(_middleware.allowCrossDomain);
113
- } else {
114
- app.use((0, _middleware.allowCrossDomainAsyncExecute)(basePath));
115
- }
116
-
117
- app.use(_middleware.handleIdempotency);
118
- app.use((0, _middleware.fixPythonContentType)(basePath));
119
- app.use(_middleware.defaultToJSONContentType);
120
- app.use(_bodyParser.default.urlencoded({
121
- extended: true
122
- }));
123
- app.use((0, _methodOverride.default)());
124
- app.use(_middleware.catchAllHandler);
125
- app.use(_bodyParser.default.json({
126
- limit: '1gb'
127
- }));
128
- app.use(_expressLogging.startLogFormatter);
129
- addRoutes(app, {
130
- basePath,
131
- extraMethodMap
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
- function configureHttp({
140
- httpServer,
141
- reject,
142
- keepAliveTimeout
143
- }) {
144
- const serverState = {
145
- notifier: new _events.EventEmitter(),
146
- closed: false
147
- };
148
- const appiumServer = httpServer;
149
- appiumServer.addWebSocketHandler = _websocket.addWebSocketHandler;
150
- appiumServer.removeWebSocketHandler = _websocket.removeWebSocketHandler;
151
- appiumServer.removeAllWebSocketHandlers = _websocket.removeAllWebSocketHandlers;
152
- appiumServer.getWebSocketHandlers = _websocket.getWebSocketHandlers;
153
- const close = appiumServer.close.bind(appiumServer);
154
-
155
- appiumServer.close = async () => await new _bluebird.default((resolve, reject) => {
156
- serverState.closed = true;
157
- serverState.notifier.emit('shutdown');
158
-
159
- _logger.default.info('Waiting until the server is closed');
160
-
161
- httpServer.on('close', () => {
162
- _logger.default.info('Received server close event');
163
-
164
- resolve();
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
- close(err => {
167
- if (err) reject(err);
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
- appiumServer.on('error', err => {
172
- if (err.code === 'EADDRNOTAVAIL') {
173
- _logger.default.error('Could not start REST http interface listener. ' + 'Requested address is not available.');
174
- } else {
175
- _logger.default.error('Could not start REST http interface listener. The requested ' + 'port may already be in use. Please make sure there is no ' + 'other instance of this server running already.');
176
- }
177
-
178
- reject(err);
179
- });
180
- appiumServer.on('connection', socket => {
181
- socket.setTimeout(keepAliveTimeout);
182
- socket.on('error', reject);
183
-
184
- function destroy() {
185
- socket.destroy();
186
- }
187
-
188
- socket._openReqCount = 0;
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
- async function startServer({
207
- httpServer,
208
- port,
209
- hostname,
210
- keepAliveTimeout
211
- }) {
212
- const start = _bluebird.default.promisify(httpServer.listen, {
213
- context: httpServer
214
- });
215
-
216
- const startPromise = start(port, hostname);
217
- httpServer.keepAliveTimeout = keepAliveTimeout;
218
- httpServer.headersTimeout = keepAliveTimeout + 5 * 1000;
219
- await startPromise;
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
- if (!_lodash.default.isString(basePath)) {
224
- throw new Error(`Invalid path prefix ${basePath}`);
225
- }
226
-
227
- basePath = basePath.replace(/\/$/, '');
228
-
229
- if (basePath !== '' && basePath[0] !== '/') {
230
- basePath = `/${basePath}`;
231
- }
232
-
233
- return basePath;
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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"}