appium-android-driver 5.13.0 → 5.13.2
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/CHANGELOG.md +14 -0
- package/build/index.js +43 -40
- package/build/lib/android-helpers.d.ts +136 -0
- package/build/lib/android-helpers.d.ts.map +1 -0
- package/build/lib/android-helpers.js +760 -679
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.d.ts +29 -0
- package/build/lib/bootstrap.d.ts.map +1 -0
- package/build/lib/bootstrap.js +192 -179
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.d.ts +209 -0
- package/build/lib/commands/actions.d.ts.map +1 -0
- package/build/lib/commands/actions.js +327 -265
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.d.ts +10 -0
- package/build/lib/commands/alert.d.ts.map +1 -0
- package/build/lib/commands/alert.js +12 -18
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.d.ts +314 -0
- package/build/lib/commands/app-management.d.ts.map +1 -0
- package/build/lib/commands/app-management.js +278 -110
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.d.ts +94 -0
- package/build/lib/commands/context.d.ts.map +1 -0
- package/build/lib/commands/context.js +412 -260
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/coverage.d.ts +5 -0
- package/build/lib/commands/coverage.d.ts.map +1 -0
- package/build/lib/commands/coverage.js +14 -17
- package/build/lib/commands/coverage.js.map +1 -1
- package/build/lib/commands/element.d.ts +36 -0
- package/build/lib/commands/element.d.ts.map +1 -0
- package/build/lib/commands/element.js +97 -127
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/emu-console.d.ts +49 -0
- package/build/lib/commands/emu-console.d.ts.map +1 -0
- package/build/lib/commands/emu-console.js +36 -25
- package/build/lib/commands/emu-console.js.map +1 -1
- package/build/lib/commands/execute.d.ts +6 -0
- package/build/lib/commands/execute.d.ts.map +1 -0
- package/build/lib/commands/execute.js +68 -69
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.d.ts +129 -0
- package/build/lib/commands/file-actions.d.ts.map +1 -0
- package/build/lib/commands/file-actions.js +321 -178
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.d.ts +13 -0
- package/build/lib/commands/find.d.ts.map +1 -0
- package/build/lib/commands/find.js +69 -51
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.d.ts +133 -0
- package/build/lib/commands/general.d.ts.map +1 -0
- package/build/lib/commands/general.js +275 -216
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.d.ts +11 -0
- package/build/lib/commands/ime.d.ts.map +1 -0
- package/build/lib/commands/ime.js +27 -33
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.d.ts +3 -0
- package/build/lib/commands/index.d.ts.map +1 -0
- package/build/lib/commands/index.js +32 -35
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.d.ts +418 -0
- package/build/lib/commands/intent.d.ts.map +1 -0
- package/build/lib/commands/intent.js +281 -151
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/keyboard.d.ts +6 -0
- package/build/lib/commands/keyboard.d.ts.map +1 -0
- package/build/lib/commands/keyboard.js +6 -14
- package/build/lib/commands/keyboard.js.map +1 -1
- package/build/lib/commands/log.d.ts +45 -0
- package/build/lib/commands/log.d.ts.map +1 -0
- package/build/lib/commands/log.js +117 -103
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.d.ts +144 -0
- package/build/lib/commands/media-projection.d.ts.map +1 -0
- package/build/lib/commands/media-projection.js +228 -171
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.d.ts +139 -0
- package/build/lib/commands/network.d.ts.map +1 -0
- package/build/lib/commands/network.js +249 -181
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.d.ts +101 -0
- package/build/lib/commands/performance.d.ts.map +1 -0
- package/build/lib/commands/performance.js +390 -236
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/permissions.d.ts +93 -0
- package/build/lib/commands/permissions.d.ts.map +1 -0
- package/build/lib/commands/permissions.js +133 -93
- package/build/lib/commands/permissions.js.map +1 -1
- package/build/lib/commands/recordscreen.d.ts +194 -0
- package/build/lib/commands/recordscreen.d.ts.map +1 -0
- package/build/lib/commands/recordscreen.js +293 -224
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/shell.d.ts +8 -0
- package/build/lib/commands/shell.d.ts.map +1 -0
- package/build/lib/commands/shell.js +38 -43
- package/build/lib/commands/shell.js.map +1 -1
- package/build/lib/commands/streamscreen.d.ts +104 -0
- package/build/lib/commands/streamscreen.d.ts.map +1 -0
- package/build/lib/commands/streamscreen.js +364 -305
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/system-bars.d.ts +100 -0
- package/build/lib/commands/system-bars.d.ts.map +1 -0
- package/build/lib/commands/system-bars.js +148 -90
- package/build/lib/commands/system-bars.js.map +1 -1
- package/build/lib/commands/touch.d.ts +30 -0
- package/build/lib/commands/touch.d.ts.map +1 -0
- package/build/lib/commands/touch.js +311 -287
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/desired-caps.d.ts +353 -0
- package/build/lib/desired-caps.d.ts.map +1 -0
- package/build/lib/desired-caps.js +291 -292
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.d.ts +430 -0
- package/build/lib/driver.d.ts.map +1 -0
- package/build/lib/driver.js +449 -384
- package/build/lib/driver.js.map +1 -1
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logger.js +5 -11
- package/build/lib/logger.js.map +1 -1
- package/build/lib/method-map.d.ts +389 -0
- package/build/lib/method-map.d.ts.map +1 -0
- package/build/lib/method-map.js +220 -394
- package/build/lib/method-map.js.map +1 -1
- package/build/lib/stubs.d.ts +8 -0
- package/build/lib/stubs.d.ts.map +1 -0
- package/build/lib/stubs.js +5 -0
- package/build/lib/stubs.js.map +1 -0
- package/build/lib/uiautomator.d.ts +24 -0
- package/build/lib/uiautomator.d.ts.map +1 -0
- package/build/lib/uiautomator.js +86 -82
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.d.ts +38 -0
- package/build/lib/unlock-helpers.d.ts.map +1 -0
- package/build/lib/unlock-helpers.js +228 -204
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.d.ts +11 -0
- package/build/lib/utils.d.ts.map +1 -0
- package/build/lib/utils.js +23 -18
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.d.ts +223 -0
- package/build/lib/webview-helpers.d.ts.map +1 -0
- package/build/lib/webview-helpers.js +476 -298
- package/build/lib/webview-helpers.js.map +1 -1
- package/index.js +3 -1
- package/lib/android-helpers.js +2 -1
- package/lib/stubs.ts +8 -0
- package/lib/unlock-helpers.js +2 -2
- package/package.json +23 -14
package/build/lib/bootstrap.js
CHANGED
|
@@ -1,200 +1,213 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
require("
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
var _support = require("@appium/support");
|
|
16
|
-
const log = _support.logger.getLogger('AndroidBootstrap');
|
|
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.COMMAND_TYPES = exports.AndroidBootstrap = void 0;
|
|
7
|
+
const uiautomator_1 = __importDefault(require("./uiautomator"));
|
|
8
|
+
const net_1 = __importDefault(require("net"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
11
|
+
const driver_1 = require("appium/driver");
|
|
12
|
+
const bluebird_1 = __importDefault(require("bluebird"));
|
|
13
|
+
const support_1 = require("@appium/support");
|
|
14
|
+
const log = support_1.logger.getLogger('AndroidBootstrap');
|
|
17
15
|
const COMMAND_TYPES = {
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
ACTION: 'action',
|
|
17
|
+
SHUTDOWN: 'shutdown'
|
|
20
18
|
};
|
|
21
19
|
exports.COMMAND_TYPES = COMMAND_TYPES;
|
|
22
20
|
const SEND_COMMAND_TIMEOUT = 1 * 60 * 1000;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Calculates the path to the current module's root folder
|
|
23
|
+
*
|
|
24
|
+
* @returns {string} The full path to module root
|
|
25
|
+
* @throws {Error} If the current module root folder cannot be determined
|
|
26
|
+
*/
|
|
27
|
+
const getModuleRoot = lodash_1.default.memoize(async function getModuleRoot() {
|
|
28
|
+
let currentDir = path_1.default.dirname(path_1.default.resolve(__filename));
|
|
29
|
+
let isAtFsRoot = false;
|
|
30
|
+
while (!isAtFsRoot) {
|
|
31
|
+
const manifestPath = path_1.default.join(currentDir, 'package.json');
|
|
32
|
+
try {
|
|
33
|
+
if (await support_1.fs.exists(manifestPath) &&
|
|
34
|
+
JSON.parse(await support_1.fs.readFile(manifestPath, 'utf8')).name === 'appium-android-driver') {
|
|
35
|
+
return currentDir;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (ign) { }
|
|
39
|
+
currentDir = path_1.default.dirname(currentDir);
|
|
40
|
+
isAtFsRoot = currentDir.length <= path_1.default.dirname(currentDir).length;
|
|
41
|
+
}
|
|
42
|
+
throw new Error('Cannot find the root folder of the appium-android-driver Node.js module');
|
|
37
43
|
});
|
|
38
44
|
class AndroidBootstrap {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
get onUnexpectedShutdown() {
|
|
46
|
-
if (!this._onUnexpectedShutdownPromise) {
|
|
47
|
-
let reject;
|
|
48
|
-
this._onUnexpectedShutdownPromise = new _bluebird.default(function _onUnexpectedShutdownPromise(_resolve, _reject) {
|
|
49
|
-
reject = _reject;
|
|
50
|
-
});
|
|
51
|
-
this._onUnexpectedShutdownPromise.cancel = reject;
|
|
45
|
+
constructor(adb, systemPort = 4724, webSocket = undefined) {
|
|
46
|
+
this.adb = adb;
|
|
47
|
+
this.systemPort = systemPort;
|
|
48
|
+
this.webSocket = webSocket;
|
|
49
|
+
this.ignoreUnexpectedShutdown = false;
|
|
52
50
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const bootstrapJar = _path.default.resolve(await getModuleRoot(), 'bootstrap', 'bin', 'AppiumBootstrap.jar');
|
|
59
|
-
await this.init();
|
|
60
|
-
await this.adb.forwardPort(this.systemPort, 4724);
|
|
61
|
-
this.process = await this.uiAutomator.start(bootstrapJar, 'io.appium.android.bootstrap.Bootstrap', startDetector, '-e', 'pkg', appPackage, '-e', 'disableAndroidWatchers', disableAndroidWatchers, '-e', 'acceptSslCerts', acceptSslCerts);
|
|
62
|
-
this.process.on('output', (stdout, stderr) => {
|
|
63
|
-
const alertRe = /Emitting system alert message/;
|
|
64
|
-
if (alertRe.test(stdout)) {
|
|
65
|
-
log.debug('Emitting alert message...');
|
|
66
|
-
if (this.webSocket) {
|
|
67
|
-
this.webSocket.sockets.emit('alert', {
|
|
68
|
-
message: stdout
|
|
51
|
+
get onUnexpectedShutdown() {
|
|
52
|
+
if (!this._onUnexpectedShutdownPromise) {
|
|
53
|
+
let reject;
|
|
54
|
+
this._onUnexpectedShutdownPromise = new bluebird_1.default(function _onUnexpectedShutdownPromise(_resolve, _reject) {
|
|
55
|
+
reject = _reject;
|
|
69
56
|
});
|
|
70
|
-
|
|
57
|
+
this._onUnexpectedShutdownPromise.cancel = reject;
|
|
71
58
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
59
|
+
return this._onUnexpectedShutdownPromise;
|
|
60
|
+
}
|
|
61
|
+
async start(appPackage, disableAndroidWatchers = false, acceptSslCerts = false) {
|
|
62
|
+
try {
|
|
63
|
+
const startDetector = (s) => /Appium Socket Server Ready/.test(s);
|
|
64
|
+
const bootstrapJar = path_1.default.resolve(await getModuleRoot(), 'bootstrap', 'bin', 'AppiumBootstrap.jar');
|
|
65
|
+
await this.init();
|
|
66
|
+
await this.adb.forwardPort(this.systemPort, 4724);
|
|
67
|
+
this.process = await this.uiAutomator.start(bootstrapJar, 'io.appium.android.bootstrap.Bootstrap', startDetector, '-e', 'pkg', appPackage, '-e', 'disableAndroidWatchers', disableAndroidWatchers, '-e', 'acceptSslCerts', acceptSslCerts);
|
|
68
|
+
// process the output
|
|
69
|
+
this.process.on('output', (stdout, stderr) => {
|
|
70
|
+
const alertRe = /Emitting system alert message/;
|
|
71
|
+
if (alertRe.test(stdout)) {
|
|
72
|
+
log.debug('Emitting alert message...');
|
|
73
|
+
if (this.webSocket) {
|
|
74
|
+
this.webSocket.sockets.emit('alert', { message: stdout });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// the bootstrap logger wraps its own log lines with
|
|
78
|
+
// [APPIUM-UIAUTO] ... [APPIUM-UIAUTO]
|
|
79
|
+
// and leaves actual UiAutomator logs as they are
|
|
80
|
+
let stdoutLines = (stdout || '').split('\n');
|
|
81
|
+
const uiautoLog = /\[APPIUM-UIAUTO\](.+)\[\/APPIUM-UIAUTO\]/;
|
|
82
|
+
for (let line of stdoutLines) {
|
|
83
|
+
if (line.trim()) {
|
|
84
|
+
if (uiautoLog.test(line)) {
|
|
85
|
+
let innerLine = uiautoLog.exec(line)[1].trim();
|
|
86
|
+
let logMethod = log.info.bind(log);
|
|
87
|
+
// if the bootstrap log considers something debug, log that as
|
|
88
|
+
// debug and not info
|
|
89
|
+
if (/\[debug\]/.test(innerLine)) {
|
|
90
|
+
logMethod = log.debug.bind(log);
|
|
91
|
+
}
|
|
92
|
+
logMethod(`[BOOTSTRAP LOG] ${innerLine}`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
log.debug(`[UIAUTO STDOUT] ${line}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
let stderrLines = (stderr || '').split('\n');
|
|
100
|
+
for (let line of stderrLines) {
|
|
101
|
+
if (line.trim()) {
|
|
102
|
+
log.debug(`[UIAUTO STDERR] ${line}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
// only return when the socket client has connected
|
|
107
|
+
return await new bluebird_1.default((resolve, reject) => {
|
|
108
|
+
try {
|
|
109
|
+
this.socketClient = net_1.default.connect(this.systemPort, '127.0.0.1');
|
|
110
|
+
// Windows: the socket errors out when ADB restarts. Let's catch it to avoid crashing.
|
|
111
|
+
this.socketClient.on('error', (err) => {
|
|
112
|
+
if (!this.ignoreUnexpectedShutdown) {
|
|
113
|
+
throw new Error(`Android bootstrap socket crashed: ${err}`);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
this.socketClient.once('connect', () => {
|
|
117
|
+
log.info('Android bootstrap socket is now connected');
|
|
118
|
+
resolve();
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
reject(err);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
87
125
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (line.trim()) {
|
|
91
|
-
log.debug(`[UIAUTO STDERR] ${line}`);
|
|
92
|
-
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
log.errorAndThrow(`Error occured while starting AndroidBootstrap. Original error: ${err}`);
|
|
93
128
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
this.socketClient.on('error', err => {
|
|
99
|
-
if (!this.ignoreUnexpectedShutdown) {
|
|
100
|
-
throw new Error(`Android bootstrap socket crashed: ${err}`);
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
this.socketClient.once('connect', () => {
|
|
104
|
-
log.info('Android bootstrap socket is now connected');
|
|
105
|
-
resolve();
|
|
106
|
-
});
|
|
107
|
-
} catch (err) {
|
|
108
|
-
reject(err);
|
|
129
|
+
}
|
|
130
|
+
async sendCommand(type, extra = {}) {
|
|
131
|
+
if (!this.socketClient) {
|
|
132
|
+
throw new Error('Socket connection closed unexpectedly');
|
|
109
133
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
134
|
+
return await new bluebird_1.default((resolve, reject) => {
|
|
135
|
+
let cmd = Object.assign({ cmd: type }, extra);
|
|
136
|
+
let cmdJson = `${JSON.stringify(cmd)} \n`;
|
|
137
|
+
log.debug(`Sending command to android: ${lodash_1.default.truncate(cmdJson, { length: 1000 }).trim()}`);
|
|
138
|
+
this.socketClient.write(cmdJson);
|
|
139
|
+
this.socketClient.setEncoding('utf8');
|
|
140
|
+
let streamData = '';
|
|
141
|
+
let sendCommandTimeoutHandler = null;
|
|
142
|
+
this.socketClient.on('data', (data) => {
|
|
143
|
+
if (sendCommandTimeoutHandler) {
|
|
144
|
+
clearTimeout(sendCommandTimeoutHandler);
|
|
145
|
+
}
|
|
146
|
+
log.debug('Received command result from bootstrap');
|
|
147
|
+
try {
|
|
148
|
+
streamData = JSON.parse(streamData + data);
|
|
149
|
+
// we successfully parsed JSON so we've got all the data,
|
|
150
|
+
// remove the socket listener and evaluate
|
|
151
|
+
this.socketClient.removeAllListeners('data');
|
|
152
|
+
if (streamData.status === 0) {
|
|
153
|
+
return resolve(streamData.value);
|
|
154
|
+
}
|
|
155
|
+
reject((0, driver_1.errorFromCode)(streamData.status, streamData.value));
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
if (!lodash_1.default.isString(streamData)) {
|
|
159
|
+
log.error('Got an unexpected error inside socket listener');
|
|
160
|
+
log.error(err.stack);
|
|
161
|
+
return reject((0, driver_1.errorFromCode)(13, err.message));
|
|
162
|
+
}
|
|
163
|
+
log.debug(`Stream still not complete, waiting up to ${SEND_COMMAND_TIMEOUT}ms for the data to arrive`);
|
|
164
|
+
streamData += data;
|
|
165
|
+
sendCommandTimeoutHandler = setTimeout(() => {
|
|
166
|
+
const errMsg = `Server socket stopped responding. The recent response was '${streamData}'`;
|
|
167
|
+
log.error(errMsg);
|
|
168
|
+
this.socketClient.removeAllListeners('data');
|
|
169
|
+
reject((0, driver_1.errorFromCode)(13, errMsg));
|
|
170
|
+
}, SEND_COMMAND_TIMEOUT);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
});
|
|
113
174
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
throw new Error('Socket connection closed unexpectedly');
|
|
175
|
+
async sendAction(action, params = {}) {
|
|
176
|
+
let extra = { action, params };
|
|
177
|
+
return await this.sendCommand(COMMAND_TYPES.ACTION, extra);
|
|
118
178
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
let cmdJson = `${JSON.stringify(cmd)} \n`;
|
|
124
|
-
log.debug(`Sending command to android: ${_lodash.default.truncate(cmdJson, {
|
|
125
|
-
length: 1000
|
|
126
|
-
}).trim()}`);
|
|
127
|
-
this.socketClient.write(cmdJson);
|
|
128
|
-
this.socketClient.setEncoding('utf8');
|
|
129
|
-
let streamData = '';
|
|
130
|
-
let sendCommandTimeoutHandler = null;
|
|
131
|
-
this.socketClient.on('data', data => {
|
|
132
|
-
if (sendCommandTimeoutHandler) {
|
|
133
|
-
clearTimeout(sendCommandTimeoutHandler);
|
|
179
|
+
async shutdown() {
|
|
180
|
+
if (!this.uiAutomator) {
|
|
181
|
+
log.warn('Cannot shut down Android bootstrap; it has already shut down');
|
|
182
|
+
return;
|
|
134
183
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
if (streamData.status === 0) {
|
|
140
|
-
return resolve(streamData.value);
|
|
141
|
-
}
|
|
142
|
-
reject((0, _driver.errorFromCode)(streamData.status, streamData.value));
|
|
143
|
-
} catch (err) {
|
|
144
|
-
if (!_lodash.default.isString(streamData)) {
|
|
145
|
-
log.error('Got an unexpected error inside socket listener');
|
|
146
|
-
log.error(err.stack);
|
|
147
|
-
return reject((0, _driver.errorFromCode)(13, err.message));
|
|
148
|
-
}
|
|
149
|
-
log.debug(`Stream still not complete, waiting up to ${SEND_COMMAND_TIMEOUT}ms for the data to arrive`);
|
|
150
|
-
streamData += data;
|
|
151
|
-
sendCommandTimeoutHandler = setTimeout(() => {
|
|
152
|
-
const errMsg = `Server socket stopped responding. The recent response was '${streamData}'`;
|
|
153
|
-
log.error(errMsg);
|
|
154
|
-
this.socketClient.removeAllListeners('data');
|
|
155
|
-
reject((0, _driver.errorFromCode)(13, errMsg));
|
|
156
|
-
}, SEND_COMMAND_TIMEOUT);
|
|
184
|
+
// remove listners so we don't trigger unexpected shutdown
|
|
185
|
+
this.uiAutomator.removeAllListeners(uiautomator_1.default.EVENT_CHANGED);
|
|
186
|
+
if (this.socketClient) {
|
|
187
|
+
await this.sendCommand(COMMAND_TYPES.SHUTDOWN);
|
|
157
188
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
async sendAction(action, params = {}) {
|
|
162
|
-
let extra = {
|
|
163
|
-
action,
|
|
164
|
-
params
|
|
165
|
-
};
|
|
166
|
-
return await this.sendCommand(COMMAND_TYPES.ACTION, extra);
|
|
167
|
-
}
|
|
168
|
-
async shutdown() {
|
|
169
|
-
if (!this.uiAutomator) {
|
|
170
|
-
log.warn('Cannot shut down Android bootstrap; it has already shut down');
|
|
171
|
-
return;
|
|
189
|
+
await this.uiAutomator.shutdown();
|
|
190
|
+
this.uiAutomator = null;
|
|
172
191
|
}
|
|
173
|
-
this.
|
|
174
|
-
|
|
175
|
-
|
|
192
|
+
// this helper function makes unit testing easier.
|
|
193
|
+
async init() {
|
|
194
|
+
this.uiAutomator = new uiautomator_1.default(this.adb);
|
|
195
|
+
// Handle unexpected UiAutomator shutdown
|
|
196
|
+
this.uiAutomator.on(uiautomator_1.default.EVENT_CHANGED, (msg) => {
|
|
197
|
+
if (msg.state === uiautomator_1.default.STATE_STOPPED) {
|
|
198
|
+
this.uiAutomator = null;
|
|
199
|
+
this.onUnexpectedShutdown.cancel(new Error('UiAUtomator shut down unexpectedly'));
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
set ignoreUnexpectedShutdown(ignore) {
|
|
204
|
+
log.debug(`${ignore ? 'Ignoring' : 'Watching for'} bootstrap disconnect`);
|
|
205
|
+
this._ignoreUnexpectedShutdown = ignore;
|
|
206
|
+
}
|
|
207
|
+
get ignoreUnexpectedShutdown() {
|
|
208
|
+
return this._ignoreUnexpectedShutdown;
|
|
176
209
|
}
|
|
177
|
-
await this.uiAutomator.shutdown();
|
|
178
|
-
this.uiAutomator = null;
|
|
179
|
-
}
|
|
180
|
-
async init() {
|
|
181
|
-
this.uiAutomator = new _uiautomator.default(this.adb);
|
|
182
|
-
this.uiAutomator.on(_uiautomator.default.EVENT_CHANGED, msg => {
|
|
183
|
-
if (msg.state === _uiautomator.default.STATE_STOPPED) {
|
|
184
|
-
this.uiAutomator = null;
|
|
185
|
-
this.onUnexpectedShutdown.cancel(new Error('UiAUtomator shut down unexpectedly'));
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
set ignoreUnexpectedShutdown(ignore) {
|
|
190
|
-
log.debug(`${ignore ? 'Ignoring' : 'Watching for'} bootstrap disconnect`);
|
|
191
|
-
this._ignoreUnexpectedShutdown = ignore;
|
|
192
|
-
}
|
|
193
|
-
get ignoreUnexpectedShutdown() {
|
|
194
|
-
return this._ignoreUnexpectedShutdown;
|
|
195
|
-
}
|
|
196
210
|
}
|
|
197
211
|
exports.AndroidBootstrap = AndroidBootstrap;
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdWlhdXRvbWF0b3IiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9uZXQiLCJfcGF0aCIsIl9sb2Rhc2giLCJfZHJpdmVyIiwiX2JsdWViaXJkIiwiX3N1cHBvcnQiLCJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJDT01NQU5EX1RZUEVTIiwiQUNUSU9OIiwiU0hVVERPV04iLCJleHBvcnRzIiwiU0VORF9DT01NQU5EX1RJTUVPVVQiLCJnZXRNb2R1bGVSb290IiwiXyIsIm1lbW9pemUiLCJjdXJyZW50RGlyIiwicGF0aCIsImRpcm5hbWUiLCJyZXNvbHZlIiwiX19maWxlbmFtZSIsImlzQXRGc1Jvb3QiLCJtYW5pZmVzdFBhdGgiLCJqb2luIiwiZnMiLCJleGlzdHMiLCJKU09OIiwicGFyc2UiLCJyZWFkRmlsZSIsIm5hbWUiLCJpZ24iLCJsZW5ndGgiLCJFcnJvciIsIkFuZHJvaWRCb290c3RyYXAiLCJjb25zdHJ1Y3RvciIsImFkYiIsInN5c3RlbVBvcnQiLCJ3ZWJTb2NrZXQiLCJ1bmRlZmluZWQiLCJpZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24iLCJvblVuZXhwZWN0ZWRTaHV0ZG93biIsIl9vblVuZXhwZWN0ZWRTaHV0ZG93blByb21pc2UiLCJyZWplY3QiLCJCIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwiY2FuY2VsIiwic3RhcnQiLCJhcHBQYWNrYWdlIiwiZGlzYWJsZUFuZHJvaWRXYXRjaGVycyIsImFjY2VwdFNzbENlcnRzIiwic3RhcnREZXRlY3RvciIsInMiLCJ0ZXN0IiwiYm9vdHN0cmFwSmFyIiwiaW5pdCIsImZvcndhcmRQb3J0IiwicHJvY2VzcyIsInVpQXV0b21hdG9yIiwib24iLCJzdGRvdXQiLCJzdGRlcnIiLCJhbGVydFJlIiwiZGVidWciLCJzb2NrZXRzIiwiZW1pdCIsIm1lc3NhZ2UiLCJzdGRvdXRMaW5lcyIsInNwbGl0IiwidWlhdXRvTG9nIiwibGluZSIsInRyaW0iLCJpbm5lckxpbmUiLCJleGVjIiwibG9nTWV0aG9kIiwiaW5mbyIsImJpbmQiLCJzdGRlcnJMaW5lcyIsInNvY2tldENsaWVudCIsIm5ldCIsImNvbm5lY3QiLCJlcnIiLCJvbmNlIiwiZXJyb3JBbmRUaHJvdyIsInNlbmRDb21tYW5kIiwidHlwZSIsImV4dHJhIiwiY21kIiwiT2JqZWN0IiwiYXNzaWduIiwiY21kSnNvbiIsInN0cmluZ2lmeSIsInRydW5jYXRlIiwid3JpdGUiLCJzZXRFbmNvZGluZyIsInN0cmVhbURhdGEiLCJzZW5kQ29tbWFuZFRpbWVvdXRIYW5kbGVyIiwiZGF0YSIsImNsZWFyVGltZW91dCIsInJlbW92ZUFsbExpc3RlbmVycyIsInN0YXR1cyIsInZhbHVlIiwiZXJyb3JGcm9tQ29kZSIsImlzU3RyaW5nIiwiZXJyb3IiLCJzdGFjayIsInNldFRpbWVvdXQiLCJlcnJNc2ciLCJzZW5kQWN0aW9uIiwiYWN0aW9uIiwicGFyYW1zIiwic2h1dGRvd24iLCJ3YXJuIiwiVWlBdXRvbWF0b3IiLCJFVkVOVF9DSEFOR0VEIiwibXNnIiwic3RhdGUiLCJTVEFURV9TVE9QUEVEIiwiaWdub3JlIiwiX2lnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9ib290c3RyYXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFVpQXV0b21hdG9yIGZyb20gJy4vdWlhdXRvbWF0b3InO1xuaW1wb3J0IG5ldCBmcm9tICduZXQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JGcm9tQ29kZSB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgbG9nZ2VyLCBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5cblxuY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignQW5kcm9pZEJvb3RzdHJhcCcpO1xuY29uc3QgQ09NTUFORF9UWVBFUyA9IHtcbiAgQUNUSU9OOiAnYWN0aW9uJyxcbiAgU0hVVERPV046ICdzaHV0ZG93bidcbn07XG5jb25zdCBTRU5EX0NPTU1BTkRfVElNRU9VVCA9IDEgKiA2MCAqIDEwMDA7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgcGF0aCB0byB0aGUgY3VycmVudCBtb2R1bGUncyByb290IGZvbGRlclxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmdWxsIHBhdGggdG8gbW9kdWxlIHJvb3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY3VycmVudCBtb2R1bGUgcm9vdCBmb2xkZXIgY2Fubm90IGJlIGRldGVybWluZWRcbiAqL1xuY29uc3QgZ2V0TW9kdWxlUm9vdCA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRNb2R1bGVSb290ICgpIHtcbiAgbGV0IGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUocGF0aC5yZXNvbHZlKF9fZmlsZW5hbWUpKTtcbiAgbGV0IGlzQXRGc1Jvb3QgPSBmYWxzZTtcbiAgd2hpbGUgKCFpc0F0RnNSb290KSB7XG4gICAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhtYW5pZmVzdFBhdGgpICYmXG4gICAgICAgICAgSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShtYW5pZmVzdFBhdGgsICd1dGY4JykpLm5hbWUgPT09ICdhcHBpdW0tYW5kcm9pZC1kcml2ZXInKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50RGlyO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXIpO1xuICAgIGlzQXRGc1Jvb3QgPSBjdXJyZW50RGlyLmxlbmd0aCA8PSBwYXRoLmRpcm5hbWUoY3VycmVudERpcikubGVuZ3RoO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgdGhlIHJvb3QgZm9sZGVyIG9mIHRoZSBhcHBpdW0tYW5kcm9pZC1kcml2ZXIgTm9kZS5qcyBtb2R1bGUnKTtcbn0pO1xuXG5jbGFzcyBBbmRyb2lkQm9vdHN0cmFwIHtcbiAgY29uc3RydWN0b3IgKGFkYiwgc3lzdGVtUG9ydCA9IDQ3MjQsIHdlYlNvY2tldCA9IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuYWRiID0gYWRiO1xuICAgIHRoaXMuc3lzdGVtUG9ydCA9IHN5c3RlbVBvcnQ7XG4gICAgdGhpcy53ZWJTb2NrZXQgPSB3ZWJTb2NrZXQ7XG4gICAgdGhpcy5pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24gPSBmYWxzZTtcbiAgfVxuXG4gIGdldCBvblVuZXhwZWN0ZWRTaHV0ZG93biAoKSB7XG4gICAgaWYgKCF0aGlzLl9vblVuZXhwZWN0ZWRTaHV0ZG93blByb21pc2UpIHtcbiAgICAgIGxldCByZWplY3Q7XG4gICAgICB0aGlzLl9vblVuZXhwZWN0ZWRTaHV0ZG93blByb21pc2UgPSBuZXcgQihmdW5jdGlvbiBfb25VbmV4cGVjdGVkU2h1dGRvd25Qcm9taXNlIChfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZWplY3QgPSBfcmVqZWN0O1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9vblVuZXhwZWN0ZWRTaHV0ZG93blByb21pc2UuY2FuY2VsID0gcmVqZWN0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fb25VbmV4cGVjdGVkU2h1dGRvd25Qcm9taXNlO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQgKGFwcFBhY2thZ2UsIGRpc2FibGVBbmRyb2lkV2F0Y2hlcnMgPSBmYWxzZSwgYWNjZXB0U3NsQ2VydHMgPSBmYWxzZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydERldGVjdG9yID0gKHMpID0+IC9BcHBpdW0gU29ja2V0IFNlcnZlciBSZWFkeS8udGVzdChzKTtcbiAgICAgIGNvbnN0IGJvb3RzdHJhcEphciA9IHBhdGgucmVzb2x2ZShhd2FpdCBnZXRNb2R1bGVSb290KCksICdib290c3RyYXAnLCAnYmluJywgJ0FwcGl1bUJvb3RzdHJhcC5qYXInKTtcblxuICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5mb3J3YXJkUG9ydCh0aGlzLnN5c3RlbVBvcnQsIDQ3MjQpO1xuICAgICAgdGhpcy5wcm9jZXNzID0gYXdhaXQgdGhpcy51aUF1dG9tYXRvci5zdGFydChcbiAgICAgICAgYm9vdHN0cmFwSmFyLCAnaW8uYXBwaXVtLmFuZHJvaWQuYm9vdHN0cmFwLkJvb3RzdHJhcCcsXG4gICAgICAgIHN0YXJ0RGV0ZWN0b3IsXG4gICAgICAgICctZScsICdwa2cnLCBhcHBQYWNrYWdlLFxuICAgICAgICAnLWUnLCAnZGlzYWJsZUFuZHJvaWRXYXRjaGVycycsIGRpc2FibGVBbmRyb2lkV2F0Y2hlcnMsXG4gICAgICAgICctZScsICdhY2NlcHRTc2xDZXJ0cycsIGFjY2VwdFNzbENlcnRzXG4gICAgICApO1xuXG4gICAgICAvLyBwcm9jZXNzIHRoZSBvdXRwdXRcbiAgICAgIHRoaXMucHJvY2Vzcy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsZXJ0UmUgPSAvRW1pdHRpbmcgc3lzdGVtIGFsZXJ0IG1lc3NhZ2UvO1xuICAgICAgICBpZiAoYWxlcnRSZS50ZXN0KHN0ZG91dCkpIHtcbiAgICAgICAgICBsb2cuZGVidWcoJ0VtaXR0aW5nIGFsZXJ0IG1lc3NhZ2UuLi4nKTtcbiAgICAgICAgICBpZiAodGhpcy53ZWJTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0LnNvY2tldHMuZW1pdCgnYWxlcnQnLCB7bWVzc2FnZTogc3Rkb3V0fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhlIGJvb3RzdHJhcCBsb2dnZXIgd3JhcHMgaXRzIG93biBsb2cgbGluZXMgd2l0aFxuICAgICAgICAvLyBbQVBQSVVNLVVJQVVUT10gLi4uIFtBUFBJVU0tVUlBVVRPXVxuICAgICAgICAvLyBhbmQgbGVhdmVzIGFjdHVhbCBVaUF1dG9tYXRvciBsb2dzIGFzIHRoZXkgYXJlXG4gICAgICAgIGxldCBzdGRvdXRMaW5lcyA9IChzdGRvdXQgfHwgJycpLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgY29uc3QgdWlhdXRvTG9nID0gL1xcW0FQUElVTS1VSUFVVE9cXF0oLispXFxbXFwvQVBQSVVNLVVJQVVUT1xcXS87XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2Ygc3Rkb3V0TGluZXMpIHtcbiAgICAgICAgICBpZiAobGluZS50cmltKCkpIHtcbiAgICAgICAgICAgIGlmICh1aWF1dG9Mb2cudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICBsZXQgaW5uZXJMaW5lID0gdWlhdXRvTG9nLmV4ZWMobGluZSlbMV0udHJpbSgpO1xuICAgICAgICAgICAgICBsZXQgbG9nTWV0aG9kID0gbG9nLmluZm8uYmluZChsb2cpO1xuICAgICAgICAgICAgICAvLyBpZiB0aGUgYm9vdHN0cmFwIGxvZyBjb25zaWRlcnMgc29tZXRoaW5nIGRlYnVnLCBsb2cgdGhhdCBhc1xuICAgICAgICAgICAgICAvLyBkZWJ1ZyBhbmQgbm90IGluZm9cbiAgICAgICAgICAgICAgaWYgKC9cXFtkZWJ1Z1xcXS8udGVzdChpbm5lckxpbmUpKSB7XG4gICAgICAgICAgICAgICAgbG9nTWV0aG9kID0gbG9nLmRlYnVnLmJpbmQobG9nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsb2dNZXRob2QoYFtCT09UU1RSQVAgTE9HXSAke2lubmVyTGluZX1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvZy5kZWJ1ZyhgW1VJQVVUTyBTVERPVVRdICR7bGluZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RkZXJyTGluZXMgPSAoc3RkZXJyIHx8ICcnKS5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2Ygc3RkZXJyTGluZXMpIHtcbiAgICAgICAgICBpZiAobGluZS50cmltKCkpIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgW1VJQVVUTyBTVERFUlJdICR7bGluZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBvbmx5IHJldHVybiB3aGVuIHRoZSBzb2NrZXQgY2xpZW50IGhhcyBjb25uZWN0ZWRcbiAgICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5zb2NrZXRDbGllbnQgPSBuZXQuY29ubmVjdCh0aGlzLnN5c3RlbVBvcnQsICcxMjcuMC4wLjEnKTtcbiAgICAgICAgICAvLyBXaW5kb3dzOiB0aGUgc29ja2V0IGVycm9ycyBvdXQgd2hlbiBBREIgcmVzdGFydHMuIExldCdzIGNhdGNoIGl0IHRvIGF2b2lkIGNyYXNoaW5nLlxuICAgICAgICAgIHRoaXMuc29ja2V0Q2xpZW50Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24pIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbmRyb2lkIGJvb3RzdHJhcCBzb2NrZXQgY3Jhc2hlZDogJHtlcnJ9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5zb2NrZXRDbGllbnQub25jZSgnY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgICAgIGxvZy5pbmZvKCdBbmRyb2lkIGJvb3RzdHJhcCBzb2NrZXQgaXMgbm93IGNvbm5lY3RlZCcpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgRXJyb3Igb2NjdXJlZCB3aGlsZSBzdGFydGluZyBBbmRyb2lkQm9vdHN0cmFwLiBPcmlnaW5hbCBlcnJvcjogJHtlcnJ9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2VuZENvbW1hbmQgKHR5cGUsIGV4dHJhID0ge30pIHtcbiAgICBpZiAoIXRoaXMuc29ja2V0Q2xpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvY2tldCBjb25uZWN0aW9uIGNsb3NlZCB1bmV4cGVjdGVkbHknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IGNtZCA9IE9iamVjdC5hc3NpZ24oe2NtZDogdHlwZX0sIGV4dHJhKTtcbiAgICAgIGxldCBjbWRKc29uID0gYCR7SlNPTi5zdHJpbmdpZnkoY21kKX0gXFxuYDtcbiAgICAgIGxvZy5kZWJ1ZyhgU2VuZGluZyBjb21tYW5kIHRvIGFuZHJvaWQ6ICR7Xy50cnVuY2F0ZShjbWRKc29uLCB7bGVuZ3RoOiAxMDAwfSkudHJpbSgpfWApO1xuICAgICAgdGhpcy5zb2NrZXRDbGllbnQud3JpdGUoY21kSnNvbik7XG4gICAgICB0aGlzLnNvY2tldENsaWVudC5zZXRFbmNvZGluZygndXRmOCcpO1xuICAgICAgbGV0IHN0cmVhbURhdGEgPSAnJztcbiAgICAgIGxldCBzZW5kQ29tbWFuZFRpbWVvdXRIYW5kbGVyID0gbnVsbDtcbiAgICAgIHRoaXMuc29ja2V0Q2xpZW50Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgaWYgKHNlbmRDb21tYW5kVGltZW91dEhhbmRsZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoc2VuZENvbW1hbmRUaW1lb3V0SGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLmRlYnVnKCdSZWNlaXZlZCBjb21tYW5kIHJlc3VsdCBmcm9tIGJvb3RzdHJhcCcpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN0cmVhbURhdGEgPSBKU09OLnBhcnNlKHN0cmVhbURhdGEgKyBkYXRhKTtcbiAgICAgICAgICAvLyB3ZSBzdWNjZXNzZnVsbHkgcGFyc2VkIEpTT04gc28gd2UndmUgZ290IGFsbCB0aGUgZGF0YSxcbiAgICAgICAgICAvLyByZW1vdmUgdGhlIHNvY2tldCBsaXN0ZW5lciBhbmQgZXZhbHVhdGVcbiAgICAgICAgICB0aGlzLnNvY2tldENsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2RhdGEnKTtcbiAgICAgICAgICBpZiAoc3RyZWFtRGF0YS5zdGF0dXMgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHN0cmVhbURhdGEudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWplY3QoZXJyb3JGcm9tQ29kZShzdHJlYW1EYXRhLnN0YXR1cywgc3RyZWFtRGF0YS52YWx1ZSkpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoIV8uaXNTdHJpbmcoc3RyZWFtRGF0YSkpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignR290IGFuIHVuZXhwZWN0ZWQgZXJyb3IgaW5zaWRlIHNvY2tldCBsaXN0ZW5lcicpO1xuICAgICAgICAgICAgbG9nLmVycm9yKGVyci5zdGFjayk7XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yRnJvbUNvZGUoMTMsIGVyci5tZXNzYWdlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZy5kZWJ1ZyhgU3RyZWFtIHN0aWxsIG5vdCBjb21wbGV0ZSwgd2FpdGluZyB1cCB0byAke1NFTkRfQ09NTUFORF9USU1FT1VUfW1zIGZvciB0aGUgZGF0YSB0byBhcnJpdmVgKTtcbiAgICAgICAgICBzdHJlYW1EYXRhICs9IGRhdGE7XG4gICAgICAgICAgc2VuZENvbW1hbmRUaW1lb3V0SGFuZGxlciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gYFNlcnZlciBzb2NrZXQgc3RvcHBlZCByZXNwb25kaW5nLiBUaGUgcmVjZW50IHJlc3BvbnNlIHdhcyAnJHtzdHJlYW1EYXRhfSdgO1xuICAgICAgICAgICAgbG9nLmVycm9yKGVyck1zZyk7XG4gICAgICAgICAgICB0aGlzLnNvY2tldENsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2RhdGEnKTtcbiAgICAgICAgICAgIHJlamVjdChlcnJvckZyb21Db2RlKDEzLCBlcnJNc2cpKTtcbiAgICAgICAgICB9LCBTRU5EX0NPTU1BTkRfVElNRU9VVCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2VuZEFjdGlvbiAoYWN0aW9uLCBwYXJhbXMgPSB7fSkge1xuICAgIGxldCBleHRyYSA9IHthY3Rpb24sIHBhcmFtc307XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoQ09NTUFORF9UWVBFUy5BQ1RJT04sIGV4dHJhKTtcbiAgfVxuXG4gIGFzeW5jIHNodXRkb3duICgpIHtcbiAgICBpZiAoIXRoaXMudWlBdXRvbWF0b3IpIHtcbiAgICAgIGxvZy53YXJuKCdDYW5ub3Qgc2h1dCBkb3duIEFuZHJvaWQgYm9vdHN0cmFwOyBpdCBoYXMgYWxyZWFkeSBzaHV0IGRvd24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgbGlzdG5lcnMgc28gd2UgZG9uJ3QgdHJpZ2dlciB1bmV4cGVjdGVkIHNodXRkb3duXG4gICAgdGhpcy51aUF1dG9tYXRvci5yZW1vdmVBbGxMaXN0ZW5lcnMoVWlBdXRvbWF0b3IuRVZFTlRfQ0hBTkdFRCk7XG4gICAgaWYgKHRoaXMuc29ja2V0Q2xpZW50KSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKENPTU1BTkRfVFlQRVMuU0hVVERPV04pO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnVpQXV0b21hdG9yLnNodXRkb3duKCk7XG4gICAgdGhpcy51aUF1dG9tYXRvciA9IG51bGw7XG4gIH1cblxuICAvLyB0aGlzIGhlbHBlciBmdW5jdGlvbiBtYWtlcyB1bml0IHRlc3RpbmcgZWFzaWVyLlxuICBhc3luYyBpbml0ICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gICAgdGhpcy51aUF1dG9tYXRvciA9IG5ldyBVaUF1dG9tYXRvcih0aGlzLmFkYik7XG5cbiAgICAvLyBIYW5kbGUgdW5leHBlY3RlZCBVaUF1dG9tYXRvciBzaHV0ZG93blxuICAgIHRoaXMudWlBdXRvbWF0b3Iub24oVWlBdXRvbWF0b3IuRVZFTlRfQ0hBTkdFRCwgKG1zZykgPT4ge1xuICAgICAgaWYgKG1zZy5zdGF0ZSA9PT0gVWlBdXRvbWF0b3IuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgICB0aGlzLnVpQXV0b21hdG9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5vblVuZXhwZWN0ZWRTaHV0ZG93bi5jYW5jZWwobmV3IEVycm9yKCdVaUFVdG9tYXRvciBzaHV0IGRvd24gdW5leHBlY3RlZGx5JykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0IGlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biAoaWdub3JlKSB7XG4gICAgbG9nLmRlYnVnKGAke2lnbm9yZSA/ICdJZ25vcmluZycgOiAnV2F0Y2hpbmcgZm9yJ30gYm9vdHN0cmFwIGRpc2Nvbm5lY3RgKTtcbiAgICB0aGlzLl9pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24gPSBpZ25vcmU7XG4gIH1cblxuICBnZXQgaWdub3JlVW5leHBlY3RlZFNodXRkb3duICgpIHtcbiAgICByZXR1cm4gdGhpcy5faWdub3JlVW5leHBlY3RlZFNodXRkb3duO1xuICB9XG59XG5cbmV4cG9ydCB7IEFuZHJvaWRCb290c3RyYXAsIENPTU1BTkRfVFlQRVMgfTtcbmV4cG9ydCBkZWZhdWx0IEFuZHJvaWRCb290c3RyYXA7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsWUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMs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
|
|
212
|
+
exports.default = AndroidBootstrap;
|
|
213
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","names":["_uiautomator","_interopRequireDefault","require","_net","_path","_lodash","_driver","_bluebird","_support","log","logger","getLogger","COMMAND_TYPES","ACTION","SHUTDOWN","exports","SEND_COMMAND_TIMEOUT","getModuleRoot","_","memoize","currentDir","path","dirname","resolve","__filename","isAtFsRoot","manifestPath","join","fs","exists","JSON","parse","readFile","name","ign","length","Error","AndroidBootstrap","constructor","adb","systemPort","webSocket","undefined","ignoreUnexpectedShutdown","onUnexpectedShutdown","_onUnexpectedShutdownPromise","reject","B","_resolve","_reject","cancel","start","appPackage","disableAndroidWatchers","acceptSslCerts","startDetector","s","test","bootstrapJar","init","forwardPort","process","uiAutomator","on","stdout","stderr","alertRe","debug","sockets","emit","message","stdoutLines","split","uiautoLog","line","trim","innerLine","exec","logMethod","info","bind","stderrLines","socketClient","net","connect","err","once","errorAndThrow","sendCommand","type","extra","cmd","Object","assign","cmdJson","stringify","truncate","write","setEncoding","streamData","sendCommandTimeoutHandler","data","clearTimeout","removeAllListeners","status","value","errorFromCode","isString","error","stack","setTimeout","errMsg","sendAction","action","params","shutdown","warn","UiAutomator","EVENT_CHANGED","msg","state","STATE_STOPPED","ignore","_ignoreUnexpectedShutdown","_default","default"],"sources":["../../lib/bootstrap.js"],"sourcesContent":["import UiAutomator from './uiautomator';\nimport net from 'net';\nimport path from 'path';\nimport _ from 'lodash';\nimport { errorFromCode } from 'appium/driver';\nimport B from 'bluebird';\nimport { logger, fs } from '@appium/support';\n\n\nconst log = logger.getLogger('AndroidBootstrap');\nconst COMMAND_TYPES = {\n ACTION: 'action',\n SHUTDOWN: 'shutdown'\n};\nconst SEND_COMMAND_TIMEOUT = 1 * 60 * 1000;\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(async function getModuleRoot () {\n let currentDir = path.dirname(path.resolve(__filename));\n let isAtFsRoot = false;\n while (!isAtFsRoot) {\n const manifestPath = path.join(currentDir, 'package.json');\n try {\n if (await fs.exists(manifestPath) &&\n JSON.parse(await fs.readFile(manifestPath, 'utf8')).name === 'appium-android-driver') {\n return currentDir;\n }\n } catch (ign) {}\n currentDir = path.dirname(currentDir);\n isAtFsRoot = currentDir.length <= path.dirname(currentDir).length;\n }\n throw new Error('Cannot find the root folder of the appium-android-driver Node.js module');\n});\n\nclass AndroidBootstrap {\n constructor (adb, systemPort = 4724, webSocket = undefined) {\n this.adb = adb;\n this.systemPort = systemPort;\n this.webSocket = webSocket;\n this.ignoreUnexpectedShutdown = false;\n }\n\n get onUnexpectedShutdown () {\n if (!this._onUnexpectedShutdownPromise) {\n let reject;\n this._onUnexpectedShutdownPromise = new B(function _onUnexpectedShutdownPromise (_resolve, _reject) {\n reject = _reject;\n });\n this._onUnexpectedShutdownPromise.cancel = reject;\n }\n return this._onUnexpectedShutdownPromise;\n }\n\n async start (appPackage, disableAndroidWatchers = false, acceptSslCerts = false) {\n try {\n const startDetector = (s) => /Appium Socket Server Ready/.test(s);\n const bootstrapJar = path.resolve(await getModuleRoot(), 'bootstrap', 'bin', 'AppiumBootstrap.jar');\n\n await this.init();\n await this.adb.forwardPort(this.systemPort, 4724);\n this.process = await this.uiAutomator.start(\n bootstrapJar, 'io.appium.android.bootstrap.Bootstrap',\n startDetector,\n '-e', 'pkg', appPackage,\n '-e', 'disableAndroidWatchers', disableAndroidWatchers,\n '-e', 'acceptSslCerts', acceptSslCerts\n );\n\n // process the output\n this.process.on('output', (stdout, stderr) => {\n const alertRe = /Emitting system alert message/;\n if (alertRe.test(stdout)) {\n log.debug('Emitting alert message...');\n if (this.webSocket) {\n this.webSocket.sockets.emit('alert', {message: stdout});\n }\n }\n\n // the bootstrap logger wraps its own log lines with\n // [APPIUM-UIAUTO] ... [APPIUM-UIAUTO]\n // and leaves actual UiAutomator logs as they are\n let stdoutLines = (stdout || '').split('\\n');\n const uiautoLog = /\\[APPIUM-UIAUTO\\](.+)\\[\\/APPIUM-UIAUTO\\]/;\n for (let line of stdoutLines) {\n if (line.trim()) {\n if (uiautoLog.test(line)) {\n let innerLine = uiautoLog.exec(line)[1].trim();\n let logMethod = log.info.bind(log);\n // if the bootstrap log considers something debug, log that as\n // debug and not info\n if (/\\[debug\\]/.test(innerLine)) {\n logMethod = log.debug.bind(log);\n }\n logMethod(`[BOOTSTRAP LOG] ${innerLine}`);\n } else {\n log.debug(`[UIAUTO STDOUT] ${line}`);\n }\n }\n }\n\n let stderrLines = (stderr || '').split('\\n');\n for (let line of stderrLines) {\n if (line.trim()) {\n log.debug(`[UIAUTO STDERR] ${line}`);\n }\n }\n });\n\n // only return when the socket client has connected\n return await new B((resolve, reject) => {\n try {\n this.socketClient = net.connect(this.systemPort, '127.0.0.1');\n // Windows: the socket errors out when ADB restarts. Let's catch it to avoid crashing.\n this.socketClient.on('error', (err) => {\n if (!this.ignoreUnexpectedShutdown) {\n throw new Error(`Android bootstrap socket crashed: ${err}`);\n }\n });\n this.socketClient.once('connect', () => {\n log.info('Android bootstrap socket is now connected');\n resolve();\n });\n } catch (err) {\n reject(err);\n }\n });\n } catch (err) {\n log.errorAndThrow(`Error occured while starting AndroidBootstrap. Original error: ${err}`);\n }\n }\n\n async sendCommand (type, extra = {}) {\n if (!this.socketClient) {\n throw new Error('Socket connection closed unexpectedly');\n }\n\n return await new B((resolve, reject) => {\n let cmd = Object.assign({cmd: type}, extra);\n let cmdJson = `${JSON.stringify(cmd)} \\n`;\n log.debug(`Sending command to android: ${_.truncate(cmdJson, {length: 1000}).trim()}`);\n this.socketClient.write(cmdJson);\n this.socketClient.setEncoding('utf8');\n let streamData = '';\n let sendCommandTimeoutHandler = null;\n this.socketClient.on('data', (data) => {\n if (sendCommandTimeoutHandler) {\n clearTimeout(sendCommandTimeoutHandler);\n }\n log.debug('Received command result from bootstrap');\n try {\n streamData = JSON.parse(streamData + data);\n // we successfully parsed JSON so we've got all the data,\n // remove the socket listener and evaluate\n this.socketClient.removeAllListeners('data');\n if (streamData.status === 0) {\n return resolve(streamData.value);\n }\n reject(errorFromCode(streamData.status, streamData.value));\n } catch (err) {\n if (!_.isString(streamData)) {\n log.error('Got an unexpected error inside socket listener');\n log.error(err.stack);\n return reject(errorFromCode(13, err.message));\n }\n log.debug(`Stream still not complete, waiting up to ${SEND_COMMAND_TIMEOUT}ms for the data to arrive`);\n streamData += data;\n sendCommandTimeoutHandler = setTimeout(() => {\n const errMsg = `Server socket stopped responding. The recent response was '${streamData}'`;\n log.error(errMsg);\n this.socketClient.removeAllListeners('data');\n reject(errorFromCode(13, errMsg));\n }, SEND_COMMAND_TIMEOUT);\n }\n });\n });\n }\n\n async sendAction (action, params = {}) {\n let extra = {action, params};\n return await this.sendCommand(COMMAND_TYPES.ACTION, extra);\n }\n\n async shutdown () {\n if (!this.uiAutomator) {\n log.warn('Cannot shut down Android bootstrap; it has already shut down');\n return;\n }\n\n // remove listners so we don't trigger unexpected shutdown\n this.uiAutomator.removeAllListeners(UiAutomator.EVENT_CHANGED);\n if (this.socketClient) {\n await this.sendCommand(COMMAND_TYPES.SHUTDOWN);\n }\n await this.uiAutomator.shutdown();\n this.uiAutomator = null;\n }\n\n // this helper function makes unit testing easier.\n async init () { // eslint-disable-line require-await\n this.uiAutomator = new UiAutomator(this.adb);\n\n // Handle unexpected UiAutomator shutdown\n this.uiAutomator.on(UiAutomator.EVENT_CHANGED, (msg) => {\n if (msg.state === UiAutomator.STATE_STOPPED) {\n this.uiAutomator = null;\n this.onUnexpectedShutdown.cancel(new Error('UiAUtomator shut down unexpectedly'));\n }\n });\n }\n\n set ignoreUnexpectedShutdown (ignore) {\n log.debug(`${ignore ? 'Ignoring' : 'Watching for'} bootstrap disconnect`);\n this._ignoreUnexpectedShutdown = ignore;\n }\n\n get ignoreUnexpectedShutdown () {\n return this._ignoreUnexpectedShutdown;\n }\n}\n\nexport { AndroidBootstrap, COMMAND_TYPES };\nexport default AndroidBootstrap;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../lib/bootstrap.js"],"names":[],"mappings":"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"}
|