@appium/base-driver 10.1.2 → 10.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/basedriver/capabilities.d.ts.map +1 -1
- package/build/lib/basedriver/capabilities.js +7 -7
- package/build/lib/basedriver/capabilities.js.map +1 -1
- package/build/lib/basedriver/commands/event.d.ts +1 -1
- package/build/lib/basedriver/commands/event.d.ts.map +1 -1
- package/build/lib/basedriver/commands/execute.d.ts +1 -1
- package/build/lib/basedriver/commands/execute.d.ts.map +1 -1
- package/build/lib/basedriver/commands/find.d.ts +1 -1
- package/build/lib/basedriver/commands/find.d.ts.map +1 -1
- package/build/lib/basedriver/commands/mixin.d.ts +1 -1
- package/build/lib/basedriver/commands/mixin.d.ts.map +1 -1
- package/build/lib/basedriver/commands/timeout.d.ts +1 -1
- package/build/lib/basedriver/commands/timeout.d.ts.map +1 -1
- package/build/lib/basedriver/device-settings.d.ts +14 -23
- package/build/lib/basedriver/device-settings.d.ts.map +1 -1
- package/build/lib/basedriver/device-settings.js +11 -26
- package/build/lib/basedriver/device-settings.js.map +1 -1
- package/build/lib/basedriver/helpers.d.ts +36 -57
- package/build/lib/basedriver/helpers.d.ts.map +1 -1
- package/build/lib/basedriver/helpers.js +160 -248
- package/build/lib/basedriver/helpers.js.map +1 -1
- package/build/lib/basedriver/logger.d.ts +1 -2
- package/build/lib/basedriver/logger.d.ts.map +1 -1
- package/build/lib/basedriver/logger.js +2 -2
- package/build/lib/basedriver/logger.js.map +1 -1
- package/build/lib/basedriver/validation.d.ts.map +1 -1
- package/build/lib/basedriver/validation.js +3 -3
- package/build/lib/basedriver/validation.js.map +1 -1
- package/build/lib/constants.d.ts +1 -1
- package/build/lib/constants.d.ts.map +1 -1
- package/build/lib/express/crash.d.ts +8 -2
- package/build/lib/express/crash.d.ts.map +1 -1
- package/build/lib/express/crash.js +6 -0
- package/build/lib/express/crash.js.map +1 -1
- package/build/lib/express/express-logging.d.ts +12 -2
- package/build/lib/express/express-logging.d.ts.map +1 -1
- package/build/lib/express/express-logging.js +34 -26
- package/build/lib/express/express-logging.js.map +1 -1
- package/build/lib/express/idempotency.d.ts +4 -10
- package/build/lib/express/idempotency.d.ts.map +1 -1
- package/build/lib/express/idempotency.js +71 -75
- package/build/lib/express/idempotency.js.map +1 -1
- package/build/lib/express/logger.d.ts +1 -2
- package/build/lib/express/logger.d.ts.map +1 -1
- package/build/lib/express/logger.js +2 -2
- package/build/lib/express/logger.js.map +1 -1
- package/build/lib/express/middleware.d.ts +37 -41
- package/build/lib/express/middleware.d.ts.map +1 -1
- package/build/lib/express/middleware.js +48 -60
- package/build/lib/express/middleware.js.map +1 -1
- package/build/lib/express/server.d.ts +57 -101
- package/build/lib/express/server.d.ts.map +1 -1
- package/build/lib/express/server.js +55 -133
- package/build/lib/express/server.js.map +1 -1
- package/build/lib/express/static.d.ts +10 -5
- package/build/lib/express/static.d.ts.map +1 -1
- package/build/lib/express/static.js +33 -43
- package/build/lib/express/static.js.map +1 -1
- package/build/lib/express/websocket.d.ts +22 -6
- package/build/lib/express/websocket.d.ts.map +1 -1
- package/build/lib/express/websocket.js +10 -15
- package/build/lib/express/websocket.js.map +1 -1
- package/build/lib/helpers/capabilities.d.ts +4 -16
- package/build/lib/helpers/capabilities.d.ts.map +1 -1
- package/build/lib/helpers/capabilities.js +36 -48
- package/build/lib/helpers/capabilities.js.map +1 -1
- package/build/lib/jsonwp-proxy/proxy.d.ts +4 -2
- package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -1
- package/build/lib/jsonwp-proxy/proxy.js +9 -4
- package/build/lib/jsonwp-proxy/proxy.js.map +1 -1
- package/build/lib/jsonwp-status/status.d.ts +113 -158
- package/build/lib/jsonwp-status/status.d.ts.map +1 -1
- package/build/lib/jsonwp-status/status.js +10 -14
- package/build/lib/jsonwp-status/status.js.map +1 -1
- package/build/lib/protocol/bidi-commands.d.ts +31 -36
- package/build/lib/protocol/bidi-commands.d.ts.map +1 -1
- package/build/lib/protocol/bidi-commands.js +5 -5
- package/build/lib/protocol/bidi-commands.js.map +1 -1
- package/build/lib/protocol/errors.d.ts.map +1 -1
- package/build/lib/protocol/errors.js.map +1 -1
- package/build/lib/protocol/helpers.d.ts +7 -11
- package/build/lib/protocol/helpers.d.ts.map +1 -1
- package/build/lib/protocol/helpers.js +5 -9
- package/build/lib/protocol/helpers.js.map +1 -1
- package/build/lib/protocol/index.d.ts +4 -21
- package/build/lib/protocol/index.d.ts.map +1 -1
- package/build/lib/protocol/index.js.map +1 -1
- package/build/lib/protocol/protocol.d.ts +15 -1
- package/build/lib/protocol/protocol.d.ts.map +1 -1
- package/build/lib/protocol/protocol.js +50 -20
- package/build/lib/protocol/protocol.js.map +1 -1
- package/build/lib/protocol/routes.d.ts +8 -15
- package/build/lib/protocol/routes.d.ts.map +1 -1
- package/build/lib/protocol/routes.js +18 -33
- package/build/lib/protocol/routes.js.map +1 -1
- package/lib/basedriver/capabilities.ts +2 -2
- package/lib/basedriver/commands/event.ts +2 -2
- package/lib/basedriver/commands/execute.ts +2 -2
- package/lib/basedriver/commands/find.ts +2 -2
- package/lib/basedriver/commands/mixin.ts +1 -1
- package/lib/basedriver/commands/timeout.ts +2 -2
- package/lib/basedriver/{device-settings.js → device-settings.ts} +24 -35
- package/lib/basedriver/{helpers.js → helpers.ts} +215 -270
- package/lib/basedriver/logger.ts +3 -0
- package/lib/basedriver/validation.ts +2 -2
- package/lib/constants.ts +1 -1
- package/lib/express/crash.ts +15 -0
- package/lib/express/express-logging.ts +84 -0
- package/lib/express/{idempotency.js → idempotency.ts} +106 -90
- package/lib/express/logger.ts +3 -0
- package/lib/express/middleware.ts +187 -0
- package/lib/express/{server.js → server.ts} +177 -170
- package/lib/express/static.ts +77 -0
- package/lib/express/websocket.ts +81 -0
- package/lib/helpers/capabilities.ts +83 -0
- package/lib/jsonwp-proxy/proxy.js +7 -2
- package/lib/jsonwp-status/{status.js → status.ts} +12 -15
- package/lib/protocol/{bidi-commands.js → bidi-commands.ts} +7 -5
- package/lib/protocol/errors.ts +4 -4
- package/lib/protocol/{helpers.js → helpers.ts} +8 -11
- package/lib/protocol/protocol.ts +57 -26
- package/lib/protocol/{routes.js → routes.ts} +29 -40
- package/package.json +15 -15
- package/tsconfig.json +3 -1
- package/lib/basedriver/logger.js +0 -4
- package/lib/express/crash.js +0 -11
- package/lib/express/express-logging.js +0 -60
- package/lib/express/logger.js +0 -4
- package/lib/express/middleware.js +0 -171
- package/lib/express/static.js +0 -76
- package/lib/express/websocket.js +0 -79
- package/lib/helpers/capabilities.js +0 -93
- /package/lib/protocol/{index.js → index.ts} +0 -0
|
@@ -7,13 +7,13 @@ exports.server = server;
|
|
|
7
7
|
exports.configureServer = configureServer;
|
|
8
8
|
exports.normalizeBasePath = normalizeBasePath;
|
|
9
9
|
const lodash_1 = __importDefault(require("lodash"));
|
|
10
|
-
const
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
11
|
const express_1 = __importDefault(require("express"));
|
|
12
|
-
const
|
|
12
|
+
const node_http_1 = __importDefault(require("node:http"));
|
|
13
13
|
const serve_favicon_1 = __importDefault(require("serve-favicon"));
|
|
14
14
|
const body_parser_1 = __importDefault(require("body-parser"));
|
|
15
15
|
const method_override_1 = __importDefault(require("method-override"));
|
|
16
|
-
const logger_1 =
|
|
16
|
+
const logger_1 = require("./logger");
|
|
17
17
|
const express_logging_1 = require("./express-logging");
|
|
18
18
|
const middleware_1 = require("./middleware");
|
|
19
19
|
const static_1 = require("./static");
|
|
@@ -24,12 +24,11 @@ const constants_1 = require("../constants");
|
|
|
24
24
|
const support_1 = require("@appium/support");
|
|
25
25
|
const KEEP_ALIVE_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
28
|
-
* @
|
|
29
|
-
* @returns {Promise<AppiumServer>}
|
|
27
|
+
* @param opts - Server options
|
|
28
|
+
* @returns Promise resolving to the Appium server instance
|
|
30
29
|
*/
|
|
31
30
|
async function server(opts) {
|
|
32
|
-
const { routeConfiguringFunction, port, hostname, cliArgs =
|
|
31
|
+
const { routeConfiguringFunction, port, hostname, cliArgs = {}, allowCors = true, basePath = constants_1.DEFAULT_BASE_PATH, extraMethodMap = {}, serverUpdaters = [], keepAliveTimeout = KEEP_ALIVE_TIMEOUT_MS, requestTimeout, } = opts;
|
|
33
32
|
const app = (0, express_1.default)();
|
|
34
33
|
const httpServer = await createServer(app, cliArgs);
|
|
35
34
|
return await new bluebird_1.default(async (resolve, reject) => {
|
|
@@ -78,21 +77,21 @@ async function server(opts) {
|
|
|
78
77
|
});
|
|
79
78
|
}
|
|
80
79
|
/**
|
|
81
|
-
* Sets up
|
|
82
|
-
*
|
|
80
|
+
* Sets up Express middleware and routes.
|
|
81
|
+
*
|
|
82
|
+
* @param opts - Configuration options
|
|
83
83
|
*/
|
|
84
84
|
function configureServer({ app, addRoutes, allowCors = true, basePath = constants_1.DEFAULT_BASE_PATH, extraMethodMap = {}, webSocketsMapping = {}, useLegacyUpgradeHandler = true, }) {
|
|
85
85
|
basePath = normalizeBasePath(basePath);
|
|
86
86
|
app.use(express_logging_1.endLogFormatter);
|
|
87
87
|
app.use(middleware_1.handleLogContext);
|
|
88
88
|
// set up static assets
|
|
89
|
-
app.use((0, serve_favicon_1.default)(
|
|
90
|
-
// eslint-disable-next-line import/no-named-as-default-member
|
|
89
|
+
app.use((0, serve_favicon_1.default)(node_path_1.default.resolve(static_1.STATIC_DIR, 'favicon.ico')));
|
|
91
90
|
app.use(express_1.default.static(static_1.STATIC_DIR));
|
|
92
91
|
// crash routes, for testing
|
|
93
92
|
app.use(`${basePath}/produce_error`, crash_1.produceError);
|
|
94
93
|
app.use(`${basePath}/crash`, crash_1.produceCrash);
|
|
95
|
-
// Only use legacy Express middleware for WebSocket upgrades if shouldUpgradeCallback is not available
|
|
94
|
+
// Only use legacy Express middleware for WebSocket upgrades if shouldUpgradeCallback is not available.
|
|
96
95
|
// When shouldUpgradeCallback is available, upgrades are handled directly on the HTTP server
|
|
97
96
|
// to avoid Express middleware timeout issues with long-lived connections
|
|
98
97
|
if (useLegacyUpgradeHandler) {
|
|
@@ -121,16 +120,16 @@ function configureServer({ app, addRoutes, allowCors = true, basePath = constant
|
|
|
121
120
|
app.all('/test/guinea-pig-app-banner', static_1.guineaPigAppBanner);
|
|
122
121
|
}
|
|
123
122
|
/**
|
|
124
|
-
* Normalize base path string
|
|
125
|
-
*
|
|
126
|
-
* @
|
|
123
|
+
* Normalize base path string (leading slash, no trailing slash).
|
|
124
|
+
*
|
|
125
|
+
* @param basePath - Raw base path
|
|
126
|
+
* @returns Normalized base path
|
|
127
127
|
*/
|
|
128
128
|
function normalizeBasePath(basePath) {
|
|
129
129
|
if (!lodash_1.default.isString(basePath)) {
|
|
130
130
|
throw new Error(`Invalid path prefix ${basePath}`);
|
|
131
131
|
}
|
|
132
|
-
// ensure the path prefix does not end in '/', since our method map
|
|
133
|
-
// starts all paths with '/'
|
|
132
|
+
// ensure the path prefix does not end in '/', since our method map starts all paths with '/'
|
|
134
133
|
basePath = basePath.replace(/\/$/, '');
|
|
135
134
|
// likewise, ensure the path prefix does always START with /, unless the path
|
|
136
135
|
// is empty meaning no base path at all
|
|
@@ -139,16 +138,10 @@ function normalizeBasePath(basePath) {
|
|
|
139
138
|
}
|
|
140
139
|
return basePath;
|
|
141
140
|
}
|
|
142
|
-
/**
|
|
143
|
-
*
|
|
144
|
-
* @param {import('express').Express} app
|
|
145
|
-
* @param {Partial<import('@appium/types').ServerArgs>} [cliArgs]
|
|
146
|
-
* @returns {Promise<http.Server>}
|
|
147
|
-
*/
|
|
148
141
|
async function createServer(app, cliArgs) {
|
|
149
142
|
const { sslCertificatePath, sslKeyPath } = cliArgs ?? {};
|
|
150
143
|
if (!sslCertificatePath && !sslKeyPath) {
|
|
151
|
-
return
|
|
144
|
+
return node_http_1.default.createServer(app);
|
|
152
145
|
}
|
|
153
146
|
if (!sslCertificatePath || !sslKeyPath) {
|
|
154
147
|
throw new Error(`Both certificate path and key path must be provided to enable TLS`);
|
|
@@ -161,43 +154,40 @@ async function createServer(app, cliArgs) {
|
|
|
161
154
|
}
|
|
162
155
|
}
|
|
163
156
|
const [cert, key] = await bluebird_1.default.all(certKey.map((p) => support_1.fs.readFile(p, 'utf8')));
|
|
164
|
-
logger_1.
|
|
165
|
-
|
|
157
|
+
logger_1.log.debug('Enabling TLS/SPDY on the server using the provided certificate');
|
|
158
|
+
const spdy = require('spdy');
|
|
159
|
+
return spdy.createServer({
|
|
166
160
|
cert,
|
|
167
161
|
key,
|
|
168
162
|
spdy: {
|
|
169
163
|
plain: false,
|
|
170
164
|
ssl: true,
|
|
171
|
-
}
|
|
165
|
+
},
|
|
172
166
|
}, app);
|
|
173
167
|
}
|
|
174
168
|
/**
|
|
175
|
-
*
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
* @
|
|
169
|
+
* Attaches Appium-specific behavior to the HTTP server and returns it as {@linkcode AppiumServer}.
|
|
170
|
+
* Mutates the `httpServer` parameter.
|
|
171
|
+
*
|
|
172
|
+
* @param opts - Configuration options
|
|
173
|
+
* @returns The same server instance typed as AppiumServer
|
|
179
174
|
*/
|
|
180
|
-
function configureHttp({ httpServer, reject, keepAliveTimeout, gracefulShutdownTimeout }) {
|
|
181
|
-
|
|
182
|
-
* @type {AppiumServer}
|
|
183
|
-
*/
|
|
184
|
-
const appiumServer = /** @type {any} */ (httpServer);
|
|
175
|
+
function configureHttp({ httpServer, reject, keepAliveTimeout, gracefulShutdownTimeout, }) {
|
|
176
|
+
const appiumServer = httpServer;
|
|
185
177
|
appiumServer.webSocketsMapping = {};
|
|
186
178
|
appiumServer.addWebSocketHandler = websocket_1.addWebSocketHandler;
|
|
187
179
|
appiumServer.removeWebSocketHandler = websocket_1.removeWebSocketHandler;
|
|
188
180
|
appiumServer.removeAllWebSocketHandlers = websocket_1.removeAllWebSocketHandlers;
|
|
189
181
|
appiumServer.getWebSocketHandlers = websocket_1.getWebSocketHandlers;
|
|
190
182
|
appiumServer.isSecure = function isSecure() {
|
|
191
|
-
|
|
192
|
-
return Boolean(this['_spdyState']?.secure);
|
|
183
|
+
return Boolean(this._spdyState?.secure);
|
|
193
184
|
};
|
|
194
185
|
// This avoids Express middleware timeout issues with long-lived WebSocket connections
|
|
195
186
|
// See: https://github.com/appium/appium/issues/20760
|
|
196
187
|
// See: https://github.com/nodejs/node/pull/59824
|
|
197
188
|
if (hasShouldUpgradeCallback(httpServer)) {
|
|
198
189
|
// shouldUpgradeCallback only returns a boolean to indicate if the upgrade should proceed
|
|
199
|
-
|
|
200
|
-
appiumServer['shouldUpgradeCallback'] = (req) => lodash_1.default.toLower(req.headers?.upgrade) === 'websocket';
|
|
190
|
+
appiumServer.shouldUpgradeCallback = (req) => lodash_1.default.toLower(req.headers?.upgrade) === 'websocket';
|
|
201
191
|
appiumServer.on('upgrade', (req, socket, head) => {
|
|
202
192
|
if (!(0, middleware_1.tryHandleWebSocketUpgrade)(req, socket, head, appiumServer.webSocketsMapping)) {
|
|
203
193
|
socket.destroy();
|
|
@@ -208,35 +198,38 @@ function configureHttp({ httpServer, reject, keepAliveTimeout, gracefulShutdownT
|
|
|
208
198
|
// all connections are closed and the `close` event is emitted
|
|
209
199
|
const originalClose = appiumServer.close.bind(appiumServer);
|
|
210
200
|
appiumServer.close = async () => await new bluebird_1.default((_resolve, _reject) => {
|
|
211
|
-
logger_1.
|
|
201
|
+
logger_1.log.info('Closing Appium HTTP server');
|
|
212
202
|
const timer = new support_1.timing.Timer().start();
|
|
213
203
|
const onTimeout = setTimeout(() => {
|
|
214
|
-
if (gracefulShutdownTimeout > 0) {
|
|
215
|
-
logger_1.
|
|
204
|
+
if ((gracefulShutdownTimeout ?? 0) > 0) {
|
|
205
|
+
logger_1.log.info(`Not all active connections have been closed within ${gracefulShutdownTimeout}ms. ` +
|
|
216
206
|
`This timeout might be customized by the --shutdown-timeout command line ` +
|
|
217
207
|
`argument. Closing the server anyway.`);
|
|
218
208
|
}
|
|
219
209
|
process.exit(process.exitCode ?? 0);
|
|
220
|
-
}, gracefulShutdownTimeout);
|
|
221
|
-
|
|
222
|
-
logger_1.
|
|
210
|
+
}, gracefulShutdownTimeout ?? 0);
|
|
211
|
+
const onClose = () => {
|
|
212
|
+
logger_1.log.info(`Appium HTTP server has been successfully closed after ` +
|
|
223
213
|
`${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
|
|
224
214
|
clearTimeout(onTimeout);
|
|
225
215
|
_resolve();
|
|
226
|
-
}
|
|
227
|
-
|
|
216
|
+
};
|
|
217
|
+
httpServer.once('close', onClose);
|
|
218
|
+
originalClose((err) => {
|
|
228
219
|
if (err) {
|
|
220
|
+
clearTimeout(onTimeout);
|
|
221
|
+
httpServer.removeListener('close', onClose);
|
|
229
222
|
_reject(err);
|
|
230
223
|
}
|
|
231
224
|
});
|
|
232
225
|
});
|
|
233
|
-
appiumServer.once('error',
|
|
234
|
-
/** @param {NodeJS.ErrnoException} err */ (err) => {
|
|
226
|
+
appiumServer.once('error', (err) => {
|
|
235
227
|
if (err.code === 'EADDRNOTAVAIL') {
|
|
236
|
-
logger_1.
|
|
228
|
+
logger_1.log.error('Could not start REST http interface listener. ' +
|
|
229
|
+
'Requested address is not available.');
|
|
237
230
|
}
|
|
238
231
|
else {
|
|
239
|
-
logger_1.
|
|
232
|
+
logger_1.log.error('Could not start REST http interface listener. The requested ' +
|
|
240
233
|
'port may already be in use. Please make sure there is no ' +
|
|
241
234
|
'other instance of this server running already.');
|
|
242
235
|
}
|
|
@@ -245,16 +238,11 @@ function configureHttp({ httpServer, reject, keepAliveTimeout, gracefulShutdownT
|
|
|
245
238
|
appiumServer.on('connection', (socket) => socket.setTimeout(keepAliveTimeout));
|
|
246
239
|
return appiumServer;
|
|
247
240
|
}
|
|
248
|
-
/**
|
|
249
|
-
* Starts an {@linkcode AppiumServer}
|
|
250
|
-
* @param {StartServerOpts} opts
|
|
251
|
-
* @returns {Promise<void>}
|
|
252
|
-
*/
|
|
253
241
|
async function startServer({ httpServer, port, hostname, keepAliveTimeout, requestTimeout, }) {
|
|
254
|
-
// If the hostname is omitted, the server will accept
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
242
|
+
// If the hostname is omitted, the server will accept connections on any IP address
|
|
243
|
+
const start = bluebird_1.default.promisify(httpServer.listen, {
|
|
244
|
+
context: httpServer,
|
|
245
|
+
});
|
|
258
246
|
const startPromise = start(port, hostname);
|
|
259
247
|
httpServer.keepAliveTimeout = keepAliveTimeout;
|
|
260
248
|
if (lodash_1.default.isInteger(requestTimeout)) {
|
|
@@ -265,86 +253,20 @@ async function startServer({ httpServer, port, hostname, keepAliveTimeout, reque
|
|
|
265
253
|
await startPromise;
|
|
266
254
|
}
|
|
267
255
|
/**
|
|
268
|
-
* Checks if the
|
|
269
|
-
*
|
|
270
|
-
* @param
|
|
271
|
-
* @returns
|
|
256
|
+
* Checks if the server supports `shouldUpgradeCallback` (Node.js v22.21.0+ / v24.9.0+).
|
|
257
|
+
*
|
|
258
|
+
* @param server - The HTTP server instance
|
|
259
|
+
* @returns true if shouldUpgradeCallback is available
|
|
272
260
|
*/
|
|
273
261
|
function hasShouldUpgradeCallback(server) {
|
|
274
262
|
// Check if shouldUpgradeCallback is available on http.Server
|
|
275
263
|
// This is a runtime check that works regardless of TypeScript types
|
|
276
264
|
try {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
return typeof server['shouldUpgradeCallback'] !== 'undefined';
|
|
265
|
+
return (typeof server.shouldUpgradeCallback !==
|
|
266
|
+
'undefined');
|
|
280
267
|
}
|
|
281
268
|
catch {
|
|
282
269
|
return false;
|
|
283
270
|
}
|
|
284
271
|
}
|
|
285
|
-
/**
|
|
286
|
-
* Options for {@linkcode startServer}.
|
|
287
|
-
* @typedef StartServerOpts
|
|
288
|
-
* @property {import('http').Server} httpServer - HTTP server instance
|
|
289
|
-
* @property {number} port - Port to run on
|
|
290
|
-
* @property {number} keepAliveTimeout - Keep-alive timeout in milliseconds
|
|
291
|
-
* @property {string} [hostname] - Optional hostname
|
|
292
|
-
* @property {number} [requestTimeout] - The timeout value in milliseconds for
|
|
293
|
-
* receiving the entire request from the client
|
|
294
|
-
*/
|
|
295
|
-
/**
|
|
296
|
-
* @typedef {import('@appium/types').AppiumServer} AppiumServer
|
|
297
|
-
*/
|
|
298
|
-
/**
|
|
299
|
-
* @typedef {import('@appium/types').MethodMap<import('@appium/types').ExternalDriver>} MethodMap
|
|
300
|
-
*/
|
|
301
|
-
/**
|
|
302
|
-
* Options for {@linkcode configureHttp}
|
|
303
|
-
* @typedef ConfigureHttpOpts
|
|
304
|
-
* @property {import('http').Server} httpServer - HTTP server instance
|
|
305
|
-
* @property {(error?: any) => void} reject - Rejection function from `Promise` constructor
|
|
306
|
-
* @property {number} keepAliveTimeout - Keep-alive timeout in milliseconds
|
|
307
|
-
* @property {number} gracefulShutdownTimeout - For how long the server should delay its
|
|
308
|
-
* shutdown before force-closing all open connections to it. Providing zero will force-close
|
|
309
|
-
* the server without waiting for any connections.
|
|
310
|
-
*/
|
|
311
|
-
/**
|
|
312
|
-
* Options for {@linkcode server}
|
|
313
|
-
* @typedef ServerOpts
|
|
314
|
-
* @property {RouteConfiguringFunction} routeConfiguringFunction
|
|
315
|
-
* @property {number} port
|
|
316
|
-
* @property {import('@appium/types').ServerArgs} [cliArgs]
|
|
317
|
-
* @property {string} [hostname]
|
|
318
|
-
* @property {boolean} [allowCors]
|
|
319
|
-
* @property {string} [basePath]
|
|
320
|
-
* @property {MethodMap} [extraMethodMap]
|
|
321
|
-
* @property {import('@appium/types').UpdateServerCallback[]} [serverUpdaters]
|
|
322
|
-
* @property {number} [keepAliveTimeout]
|
|
323
|
-
* @property {number} [requestTimeout]
|
|
324
|
-
*/
|
|
325
|
-
/**
|
|
326
|
-
* A function which configures routes
|
|
327
|
-
* @callback RouteConfiguringFunction
|
|
328
|
-
* @param {import('express').Express} app
|
|
329
|
-
* @param {RouteConfiguringFunctionOpts} [opts]
|
|
330
|
-
* @returns {void}
|
|
331
|
-
*/
|
|
332
|
-
/**
|
|
333
|
-
* Options for a {@linkcode RouteConfiguringFunction}
|
|
334
|
-
* @typedef RouteConfiguringFunctionOpts
|
|
335
|
-
* @property {string} [basePath]
|
|
336
|
-
* @property {MethodMap} [extraMethodMap]
|
|
337
|
-
*/
|
|
338
|
-
/**
|
|
339
|
-
* Options for {@linkcode configureServer}
|
|
340
|
-
* @typedef ConfigureServerOpts
|
|
341
|
-
* @property {import('express').Express} app
|
|
342
|
-
* @property {RouteConfiguringFunction} addRoutes
|
|
343
|
-
* @property {boolean} [allowCors]
|
|
344
|
-
* @property {string} [basePath]
|
|
345
|
-
* @property {MethodMap} [extraMethodMap]
|
|
346
|
-
* @property {import('@appium/types').StringRecord} [webSocketsMapping={}]
|
|
347
|
-
* @property {boolean} [useLegacyUpgradeHandler=true] - Whether to use legacy Express middleware for WebSocket upgrades.
|
|
348
|
-
* Set to false when using shouldUpgradeCallback on the HTTP server (Node.js >= 22.21.0 or >= 24.9.0).
|
|
349
|
-
*/
|
|
350
272
|
//# sourceMappingURL=server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../lib/express/server.
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../lib/express/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
export function
|
|
5
|
-
|
|
1
|
+
import type { Request, Response } from 'express';
|
|
2
|
+
export declare const STATIC_DIR: string;
|
|
3
|
+
/** Dynamic page mapped to /test/guinea-pig */
|
|
4
|
+
export declare function guineaPig(req: Request, res: Response): Promise<void>;
|
|
5
|
+
/** Dynamic page mapped to /test/guinea-pig-scrollable */
|
|
6
|
+
export declare function guineaPigScrollable(req: Request, res: Response): Promise<void>;
|
|
7
|
+
/** Dynamic page mapped to /test/guinea-pig-app-banner */
|
|
8
|
+
export declare function guineaPigAppBanner(req: Request, res: Response): Promise<void>;
|
|
9
|
+
/** Dynamic page mapped to /welcome */
|
|
10
|
+
export declare function welcome(req: Request, res: Response): Promise<void>;
|
|
6
11
|
//# sourceMappingURL=static.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../../lib/express/static.
|
|
1
|
+
{"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../../lib/express/static.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,OAAO,EAAE,QAAQ,EAAC,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,UAAU,QAEgC,CAAC;AAIxD,8CAA8C;AAC9C,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1E;AAED,yDAAyD;AACzD,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpF;AAED,yDAAyD;AACzD,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnF;AAED,sCAAsC;AACtC,wBAAsB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxE"}
|
|
@@ -8,33 +8,48 @@ exports.guineaPig = guineaPig;
|
|
|
8
8
|
exports.guineaPigScrollable = guineaPigScrollable;
|
|
9
9
|
exports.guineaPigAppBanner = guineaPigAppBanner;
|
|
10
10
|
exports.welcome = welcome;
|
|
11
|
-
const
|
|
12
|
-
const logger_1 =
|
|
11
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
12
|
+
const logger_1 = require("./logger");
|
|
13
13
|
const lodash_1 = __importDefault(require("lodash"));
|
|
14
14
|
const support_1 = require("@appium/support");
|
|
15
15
|
const bluebird_1 = __importDefault(require("bluebird"));
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
exports.STATIC_DIR = lodash_1.default.isNull(node_path_1.default.resolve(__dirname).match(/build[/\\]lib[/\\]express$/))
|
|
17
|
+
? node_path_1.default.resolve(__dirname, '..', '..', 'static')
|
|
18
|
+
: node_path_1.default.resolve(__dirname, '..', '..', '..', 'static');
|
|
19
|
+
/** Dynamic page mapped to /test/guinea-pig */
|
|
20
|
+
async function guineaPig(req, res) {
|
|
21
|
+
await guineaPigTemplate(req, res, 'guinea-pig.html');
|
|
22
|
+
}
|
|
23
|
+
/** Dynamic page mapped to /test/guinea-pig-scrollable */
|
|
24
|
+
async function guineaPigScrollable(req, res) {
|
|
25
|
+
await guineaPigTemplate(req, res, 'guinea-pig-scrollable.html');
|
|
26
|
+
}
|
|
27
|
+
/** Dynamic page mapped to /test/guinea-pig-app-banner */
|
|
28
|
+
async function guineaPigAppBanner(req, res) {
|
|
29
|
+
await guineaPigTemplate(req, res, 'guinea-pig-app-banner.html');
|
|
30
|
+
}
|
|
31
|
+
/** Dynamic page mapped to /welcome */
|
|
32
|
+
async function welcome(req, res) {
|
|
33
|
+
const params = { message: "Let's browse!" };
|
|
34
|
+
logger_1.log.debug(`Sending welcome response with params: ${JSON.stringify(params)}`);
|
|
35
|
+
const template = await getTemplate('welcome.html');
|
|
36
|
+
res.send(template(params));
|
|
22
37
|
}
|
|
23
38
|
async function guineaPigTemplate(req, res, page) {
|
|
24
|
-
const delay = parseInt(req.params.delay
|
|
25
|
-
const throwError = req.params.throwError
|
|
26
|
-
|
|
39
|
+
const delay = parseInt(String(req.params.delay ?? (req.query?.delay ?? 0)), 10);
|
|
40
|
+
const throwError = String(req.params.throwError ?? req.query?.throwError ?? '');
|
|
41
|
+
const params = {
|
|
27
42
|
throwError,
|
|
28
43
|
serverTime: new Date(),
|
|
29
44
|
userAgent: req.headers['user-agent'],
|
|
30
45
|
comment: 'None',
|
|
31
46
|
};
|
|
32
|
-
if (req.method === 'POST') {
|
|
33
|
-
params.comment = req.body.comments
|
|
47
|
+
if (req.method === 'POST' && req.body && typeof req.body === 'object' && 'comments' in req.body) {
|
|
48
|
+
params.comment = String(req.body.comments ?? params.comment);
|
|
34
49
|
}
|
|
35
|
-
logger_1.
|
|
50
|
+
logger_1.log.debug(`Sending guinea pig response with params: ${JSON.stringify(params)}`);
|
|
36
51
|
if (delay) {
|
|
37
|
-
logger_1.
|
|
52
|
+
logger_1.log.debug(`Waiting ${delay}ms before responding`);
|
|
38
53
|
await bluebird_1.default.delay(delay);
|
|
39
54
|
}
|
|
40
55
|
res.set('content-type', 'text/html');
|
|
@@ -44,36 +59,11 @@ async function guineaPigTemplate(req, res, page) {
|
|
|
44
59
|
domain: '.blargimarg.com',
|
|
45
60
|
path: '/',
|
|
46
61
|
});
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
/*
|
|
50
|
-
* Dynamic page mapped to /test/guinea-pig
|
|
51
|
-
*/
|
|
52
|
-
async function guineaPig(req, res) {
|
|
53
|
-
return await guineaPigTemplate(req, res, 'guinea-pig.html');
|
|
54
|
-
}
|
|
55
|
-
/*
|
|
56
|
-
* Dynamic page mapped to /test/guinea-pig-scrollable
|
|
57
|
-
*/
|
|
58
|
-
async function guineaPigScrollable(req, res) {
|
|
59
|
-
return await guineaPigTemplate(req, res, 'guinea-pig-scrollable.html');
|
|
60
|
-
}
|
|
61
|
-
/*
|
|
62
|
-
* Dynamic page mapped to /test/guinea-pig-app-banner
|
|
63
|
-
*/
|
|
64
|
-
async function guineaPigAppBanner(req, res) {
|
|
65
|
-
return await guineaPigTemplate(req, res, 'guinea-pig-app-banner.html');
|
|
66
|
-
}
|
|
67
|
-
/*
|
|
68
|
-
* Dynamic page mapped to /welcome
|
|
69
|
-
*/
|
|
70
|
-
async function welcome(req, res) {
|
|
71
|
-
let params = { message: "Let's browse!" };
|
|
72
|
-
logger_1.default.debug(`Sending welcome response with params: ${JSON.stringify(params)}`);
|
|
73
|
-
res.send((await getTemplate('welcome.html'))(params));
|
|
62
|
+
const template = await getTemplate(page);
|
|
63
|
+
res.send(template(params));
|
|
74
64
|
}
|
|
75
65
|
async function getTemplate(templateName) {
|
|
76
|
-
|
|
66
|
+
const content = await support_1.fs.readFile(node_path_1.default.resolve(exports.STATIC_DIR, 'test', templateName));
|
|
77
67
|
return lodash_1.default.template(content.toString());
|
|
78
68
|
}
|
|
79
69
|
//# sourceMappingURL=static.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../../lib/express/static.
|
|
1
|
+
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../../lib/express/static.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import type { AppiumServer, WSServer } from '@appium/types';
|
|
2
|
+
export declare const DEFAULT_WS_PATHNAME_PREFIX = "/ws";
|
|
3
|
+
/**
|
|
4
|
+
* Adds a WebSocket handler to this server's mapping.
|
|
5
|
+
* @see AppiumServerExtension.addWebSocketHandler
|
|
6
|
+
*/
|
|
7
|
+
export declare function addWebSocketHandler(this: AppiumServer, handlerPathname: string, handlerServer: WSServer): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Returns WebSocket handlers for this server, optionally filtered by pathname.
|
|
10
|
+
* @see AppiumServerExtension.getWebSocketHandlers
|
|
11
|
+
*/
|
|
12
|
+
export declare function getWebSocketHandlers(this: AppiumServer, keysFilter?: string | null): Promise<Record<string, WSServer>>;
|
|
13
|
+
/**
|
|
14
|
+
* Removes a WebSocket handler by pathname.
|
|
15
|
+
* @see AppiumServerExtension.removeWebSocketHandler
|
|
16
|
+
*/
|
|
17
|
+
export declare function removeWebSocketHandler(this: AppiumServer, handlerPathname: string): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Removes all WebSocket handlers from this server.
|
|
20
|
+
* @see AppiumServerExtension.removeAllWebSocketHandlers
|
|
21
|
+
*/
|
|
22
|
+
export declare function removeAllWebSocketHandlers(this: AppiumServer): Promise<boolean>;
|
|
7
23
|
//# sourceMappingURL=websocket.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../../lib/express/websocket.
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../../lib/express/websocket.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,YAAY,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAC;AAE1D,eAAO,MAAM,0BAA0B,QAAQ,CAAC;AAEhD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,YAAY,EAClB,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,QAAQ,GACtB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,YAAY,EAClB,UAAU,GAAE,MAAM,GAAG,IAAW,GAC/B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAUnC;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,YAAY,EAClB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAYrF"}
|
|
@@ -5,23 +5,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.DEFAULT_WS_PATHNAME_PREFIX = void 0;
|
|
7
7
|
exports.addWebSocketHandler = addWebSocketHandler;
|
|
8
|
+
exports.getWebSocketHandlers = getWebSocketHandlers;
|
|
8
9
|
exports.removeWebSocketHandler = removeWebSocketHandler;
|
|
9
10
|
exports.removeAllWebSocketHandlers = removeAllWebSocketHandlers;
|
|
10
|
-
exports.getWebSocketHandlers = getWebSocketHandlers;
|
|
11
11
|
const lodash_1 = __importDefault(require("lodash"));
|
|
12
12
|
const bluebird_1 = __importDefault(require("bluebird"));
|
|
13
|
-
|
|
14
|
-
exports.DEFAULT_WS_PATHNAME_PREFIX = DEFAULT_WS_PATHNAME_PREFIX;
|
|
13
|
+
exports.DEFAULT_WS_PATHNAME_PREFIX = '/ws';
|
|
15
14
|
/**
|
|
16
|
-
*
|
|
17
|
-
* @
|
|
15
|
+
* Adds a WebSocket handler to this server's mapping.
|
|
16
|
+
* @see AppiumServerExtension.addWebSocketHandler
|
|
18
17
|
*/
|
|
19
18
|
async function addWebSocketHandler(handlerPathname, handlerServer) {
|
|
20
19
|
this.webSocketsMapping[handlerPathname] = handlerServer;
|
|
21
20
|
}
|
|
22
21
|
/**
|
|
23
|
-
*
|
|
24
|
-
* @
|
|
22
|
+
* Returns WebSocket handlers for this server, optionally filtered by pathname.
|
|
23
|
+
* @see AppiumServerExtension.getWebSocketHandlers
|
|
25
24
|
*/
|
|
26
25
|
async function getWebSocketHandlers(keysFilter = null) {
|
|
27
26
|
return lodash_1.default.toPairs(this.webSocketsMapping).reduce((acc, [pathname, wsServer]) => {
|
|
@@ -32,8 +31,8 @@ async function getWebSocketHandlers(keysFilter = null) {
|
|
|
32
31
|
}, {});
|
|
33
32
|
}
|
|
34
33
|
/**
|
|
35
|
-
*
|
|
36
|
-
* @
|
|
34
|
+
* Removes a WebSocket handler by pathname.
|
|
35
|
+
* @see AppiumServerExtension.removeWebSocketHandler
|
|
37
36
|
*/
|
|
38
37
|
async function removeWebSocketHandler(handlerPathname) {
|
|
39
38
|
const wsServer = this.webSocketsMapping?.[handlerPathname];
|
|
@@ -56,9 +55,8 @@ async function removeWebSocketHandler(handlerPathname) {
|
|
|
56
55
|
return false;
|
|
57
56
|
}
|
|
58
57
|
/**
|
|
59
|
-
*
|
|
60
|
-
* @
|
|
61
|
-
* @type {AppiumServer['removeAllWebSocketHandlers']}
|
|
58
|
+
* Removes all WebSocket handlers from this server.
|
|
59
|
+
* @see AppiumServerExtension.removeAllWebSocketHandlers
|
|
62
60
|
*/
|
|
63
61
|
async function removeAllWebSocketHandlers() {
|
|
64
62
|
if (lodash_1.default.isEmpty(this.webSocketsMapping)) {
|
|
@@ -66,7 +64,4 @@ async function removeAllWebSocketHandlers() {
|
|
|
66
64
|
}
|
|
67
65
|
return lodash_1.default.some(await bluebird_1.default.all(lodash_1.default.keys(this.webSocketsMapping).map((pathname) => this.removeWebSocketHandler(pathname))));
|
|
68
66
|
}
|
|
69
|
-
/**
|
|
70
|
-
* @typedef {import('@appium/types').AppiumServer} AppiumServer
|
|
71
|
-
*/
|
|
72
67
|
//# sourceMappingURL=websocket.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../lib/express/websocket.
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../lib/express/websocket.ts"],"names":[],"mappings":";;;;;;AAUA,kDAMC;AAMD,oDAaC;AAMD,wDAqBC;AAMD,gEAYC;AAhFD,oDAAuB;AACvB,wDAAyB;AAGZ,QAAA,0BAA0B,GAAG,KAAK,CAAC;AAEhD;;;GAGG;AACI,KAAK,UAAU,mBAAmB,CAEvC,eAAuB,EACvB,aAAuB;IAEvB,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,GAAG,aAAa,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,oBAAoB,CAExC,aAA4B,IAAI;IAEhC,OAAO,gBAAC,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAC7C,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE;QAC5B,IAAI,CAAC,gBAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;QAC3B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,CACH,CAAC;AACJ,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,sBAAsB,CAE1C,eAAuB;IAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,eAAe,CAAC,CAAC;IAC3D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YAC5C,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;YAAS,CAAC;QACT,OAAO,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,0BAA0B;IAC9C,IAAI,gBAAC,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,gBAAC,CAAC,IAAI,CACX,MAAM,kBAAC,CAAC,GAAG,CACT,gBAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC9C,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CACtC,CACF,CACF,CAAC;AACJ,CAAC"}
|