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.
Files changed (151) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/index.js +43 -40
  3. package/build/lib/android-helpers.d.ts +136 -0
  4. package/build/lib/android-helpers.d.ts.map +1 -0
  5. package/build/lib/android-helpers.js +760 -679
  6. package/build/lib/android-helpers.js.map +1 -1
  7. package/build/lib/bootstrap.d.ts +29 -0
  8. package/build/lib/bootstrap.d.ts.map +1 -0
  9. package/build/lib/bootstrap.js +192 -179
  10. package/build/lib/bootstrap.js.map +1 -1
  11. package/build/lib/commands/actions.d.ts +209 -0
  12. package/build/lib/commands/actions.d.ts.map +1 -0
  13. package/build/lib/commands/actions.js +327 -265
  14. package/build/lib/commands/actions.js.map +1 -1
  15. package/build/lib/commands/alert.d.ts +10 -0
  16. package/build/lib/commands/alert.d.ts.map +1 -0
  17. package/build/lib/commands/alert.js +12 -18
  18. package/build/lib/commands/alert.js.map +1 -1
  19. package/build/lib/commands/app-management.d.ts +314 -0
  20. package/build/lib/commands/app-management.d.ts.map +1 -0
  21. package/build/lib/commands/app-management.js +278 -110
  22. package/build/lib/commands/app-management.js.map +1 -1
  23. package/build/lib/commands/context.d.ts +94 -0
  24. package/build/lib/commands/context.d.ts.map +1 -0
  25. package/build/lib/commands/context.js +412 -260
  26. package/build/lib/commands/context.js.map +1 -1
  27. package/build/lib/commands/coverage.d.ts +5 -0
  28. package/build/lib/commands/coverage.d.ts.map +1 -0
  29. package/build/lib/commands/coverage.js +14 -17
  30. package/build/lib/commands/coverage.js.map +1 -1
  31. package/build/lib/commands/element.d.ts +36 -0
  32. package/build/lib/commands/element.d.ts.map +1 -0
  33. package/build/lib/commands/element.js +97 -127
  34. package/build/lib/commands/element.js.map +1 -1
  35. package/build/lib/commands/emu-console.d.ts +49 -0
  36. package/build/lib/commands/emu-console.d.ts.map +1 -0
  37. package/build/lib/commands/emu-console.js +36 -25
  38. package/build/lib/commands/emu-console.js.map +1 -1
  39. package/build/lib/commands/execute.d.ts +6 -0
  40. package/build/lib/commands/execute.d.ts.map +1 -0
  41. package/build/lib/commands/execute.js +68 -69
  42. package/build/lib/commands/execute.js.map +1 -1
  43. package/build/lib/commands/file-actions.d.ts +129 -0
  44. package/build/lib/commands/file-actions.d.ts.map +1 -0
  45. package/build/lib/commands/file-actions.js +321 -178
  46. package/build/lib/commands/file-actions.js.map +1 -1
  47. package/build/lib/commands/find.d.ts +13 -0
  48. package/build/lib/commands/find.d.ts.map +1 -0
  49. package/build/lib/commands/find.js +69 -51
  50. package/build/lib/commands/find.js.map +1 -1
  51. package/build/lib/commands/general.d.ts +133 -0
  52. package/build/lib/commands/general.d.ts.map +1 -0
  53. package/build/lib/commands/general.js +275 -216
  54. package/build/lib/commands/general.js.map +1 -1
  55. package/build/lib/commands/ime.d.ts +11 -0
  56. package/build/lib/commands/ime.d.ts.map +1 -0
  57. package/build/lib/commands/ime.js +27 -33
  58. package/build/lib/commands/ime.js.map +1 -1
  59. package/build/lib/commands/index.d.ts +3 -0
  60. package/build/lib/commands/index.d.ts.map +1 -0
  61. package/build/lib/commands/index.js +32 -35
  62. package/build/lib/commands/index.js.map +1 -1
  63. package/build/lib/commands/intent.d.ts +418 -0
  64. package/build/lib/commands/intent.d.ts.map +1 -0
  65. package/build/lib/commands/intent.js +281 -151
  66. package/build/lib/commands/intent.js.map +1 -1
  67. package/build/lib/commands/keyboard.d.ts +6 -0
  68. package/build/lib/commands/keyboard.d.ts.map +1 -0
  69. package/build/lib/commands/keyboard.js +6 -14
  70. package/build/lib/commands/keyboard.js.map +1 -1
  71. package/build/lib/commands/log.d.ts +45 -0
  72. package/build/lib/commands/log.d.ts.map +1 -0
  73. package/build/lib/commands/log.js +117 -103
  74. package/build/lib/commands/log.js.map +1 -1
  75. package/build/lib/commands/media-projection.d.ts +144 -0
  76. package/build/lib/commands/media-projection.d.ts.map +1 -0
  77. package/build/lib/commands/media-projection.js +228 -171
  78. package/build/lib/commands/media-projection.js.map +1 -1
  79. package/build/lib/commands/network.d.ts +139 -0
  80. package/build/lib/commands/network.d.ts.map +1 -0
  81. package/build/lib/commands/network.js +249 -181
  82. package/build/lib/commands/network.js.map +1 -1
  83. package/build/lib/commands/performance.d.ts +101 -0
  84. package/build/lib/commands/performance.d.ts.map +1 -0
  85. package/build/lib/commands/performance.js +390 -236
  86. package/build/lib/commands/performance.js.map +1 -1
  87. package/build/lib/commands/permissions.d.ts +93 -0
  88. package/build/lib/commands/permissions.d.ts.map +1 -0
  89. package/build/lib/commands/permissions.js +133 -93
  90. package/build/lib/commands/permissions.js.map +1 -1
  91. package/build/lib/commands/recordscreen.d.ts +194 -0
  92. package/build/lib/commands/recordscreen.d.ts.map +1 -0
  93. package/build/lib/commands/recordscreen.js +293 -224
  94. package/build/lib/commands/recordscreen.js.map +1 -1
  95. package/build/lib/commands/shell.d.ts +8 -0
  96. package/build/lib/commands/shell.d.ts.map +1 -0
  97. package/build/lib/commands/shell.js +38 -43
  98. package/build/lib/commands/shell.js.map +1 -1
  99. package/build/lib/commands/streamscreen.d.ts +104 -0
  100. package/build/lib/commands/streamscreen.d.ts.map +1 -0
  101. package/build/lib/commands/streamscreen.js +364 -305
  102. package/build/lib/commands/streamscreen.js.map +1 -1
  103. package/build/lib/commands/system-bars.d.ts +100 -0
  104. package/build/lib/commands/system-bars.d.ts.map +1 -0
  105. package/build/lib/commands/system-bars.js +148 -90
  106. package/build/lib/commands/system-bars.js.map +1 -1
  107. package/build/lib/commands/touch.d.ts +30 -0
  108. package/build/lib/commands/touch.d.ts.map +1 -0
  109. package/build/lib/commands/touch.js +311 -287
  110. package/build/lib/commands/touch.js.map +1 -1
  111. package/build/lib/desired-caps.d.ts +353 -0
  112. package/build/lib/desired-caps.d.ts.map +1 -0
  113. package/build/lib/desired-caps.js +291 -292
  114. package/build/lib/desired-caps.js.map +1 -1
  115. package/build/lib/driver.d.ts +430 -0
  116. package/build/lib/driver.d.ts.map +1 -0
  117. package/build/lib/driver.js +449 -384
  118. package/build/lib/driver.js.map +1 -1
  119. package/build/lib/logger.d.ts +3 -0
  120. package/build/lib/logger.d.ts.map +1 -0
  121. package/build/lib/logger.js +5 -11
  122. package/build/lib/logger.js.map +1 -1
  123. package/build/lib/method-map.d.ts +389 -0
  124. package/build/lib/method-map.d.ts.map +1 -0
  125. package/build/lib/method-map.js +220 -394
  126. package/build/lib/method-map.js.map +1 -1
  127. package/build/lib/stubs.d.ts +8 -0
  128. package/build/lib/stubs.d.ts.map +1 -0
  129. package/build/lib/stubs.js +5 -0
  130. package/build/lib/stubs.js.map +1 -0
  131. package/build/lib/uiautomator.d.ts +24 -0
  132. package/build/lib/uiautomator.d.ts.map +1 -0
  133. package/build/lib/uiautomator.js +86 -82
  134. package/build/lib/uiautomator.js.map +1 -1
  135. package/build/lib/unlock-helpers.d.ts +38 -0
  136. package/build/lib/unlock-helpers.d.ts.map +1 -0
  137. package/build/lib/unlock-helpers.js +228 -204
  138. package/build/lib/unlock-helpers.js.map +1 -1
  139. package/build/lib/utils.d.ts +11 -0
  140. package/build/lib/utils.d.ts.map +1 -0
  141. package/build/lib/utils.js +23 -18
  142. package/build/lib/utils.js.map +1 -1
  143. package/build/lib/webview-helpers.d.ts +223 -0
  144. package/build/lib/webview-helpers.d.ts.map +1 -0
  145. package/build/lib/webview-helpers.js +476 -298
  146. package/build/lib/webview-helpers.js.map +1 -1
  147. package/index.js +3 -1
  148. package/lib/android-helpers.js +2 -1
  149. package/lib/stubs.ts +8 -0
  150. package/lib/unlock-helpers.js +2 -2
  151. package/package.json +23 -14
@@ -1,200 +1,213 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.default = exports.COMMAND_TYPES = exports.AndroidBootstrap = void 0;
8
- require("source-map-support/register");
9
- var _uiautomator = _interopRequireDefault(require("./uiautomator"));
10
- var _net = _interopRequireDefault(require("net"));
11
- var _path = _interopRequireDefault(require("path"));
12
- var _lodash = _interopRequireDefault(require("lodash"));
13
- var _driver = require("appium/driver");
14
- var _bluebird = _interopRequireDefault(require("bluebird"));
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
- ACTION: 'action',
19
- SHUTDOWN: 'shutdown'
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
- const getModuleRoot = _lodash.default.memoize(async function getModuleRoot() {
24
- let currentDir = _path.default.dirname(_path.default.resolve(__filename));
25
- let isAtFsRoot = false;
26
- while (!isAtFsRoot) {
27
- const manifestPath = _path.default.join(currentDir, 'package.json');
28
- try {
29
- if ((await _support.fs.exists(manifestPath)) && JSON.parse(await _support.fs.readFile(manifestPath, 'utf8')).name === 'appium-android-driver') {
30
- return currentDir;
31
- }
32
- } catch (ign) {}
33
- currentDir = _path.default.dirname(currentDir);
34
- isAtFsRoot = currentDir.length <= _path.default.dirname(currentDir).length;
35
- }
36
- throw new Error('Cannot find the root folder of the appium-android-driver Node.js module');
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
- constructor(adb, systemPort = 4724, webSocket = undefined) {
40
- this.adb = adb;
41
- this.systemPort = systemPort;
42
- this.webSocket = webSocket;
43
- this.ignoreUnexpectedShutdown = false;
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
- return this._onUnexpectedShutdownPromise;
54
- }
55
- async start(appPackage, disableAndroidWatchers = false, acceptSslCerts = false) {
56
- try {
57
- const startDetector = s => /Appium Socket Server Ready/.test(s);
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
- let stdoutLines = (stdout || '').split('\n');
73
- const uiautoLog = /\[APPIUM-UIAUTO\](.+)\[\/APPIUM-UIAUTO\]/;
74
- for (let line of stdoutLines) {
75
- if (line.trim()) {
76
- if (uiautoLog.test(line)) {
77
- let innerLine = uiautoLog.exec(line)[1].trim();
78
- let logMethod = log.info.bind(log);
79
- if (/\[debug\]/.test(innerLine)) {
80
- logMethod = log.debug.bind(log);
81
- }
82
- logMethod(`[BOOTSTRAP LOG] ${innerLine}`);
83
- } else {
84
- log.debug(`[UIAUTO STDOUT] ${line}`);
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
- let stderrLines = (stderr || '').split('\n');
89
- for (let line of stderrLines) {
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
- return await new _bluebird.default((resolve, reject) => {
96
- try {
97
- this.socketClient = _net.default.connect(this.systemPort, '127.0.0.1');
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
- } catch (err) {
112
- log.errorAndThrow(`Error occured while starting AndroidBootstrap. Original error: ${err}`);
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
- async sendCommand(type, extra = {}) {
116
- if (!this.socketClient) {
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
- return await new _bluebird.default((resolve, reject) => {
120
- let cmd = Object.assign({
121
- cmd: type
122
- }, extra);
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
- log.debug('Received command result from bootstrap');
136
- try {
137
- streamData = JSON.parse(streamData + data);
138
- this.socketClient.removeAllListeners('data');
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.uiAutomator.removeAllListeners(_uiautomator.default.EVENT_CHANGED);
174
- if (this.socketClient) {
175
- await this.sendCommand(COMMAND_TYPES.SHUTDOWN);
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
- var _default = AndroidBootstrap;
199
- exports.default = _default;
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":";;;;;;;;AAAA,IAAAA,YAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,IAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,KAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,OAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,SAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,QAAA,GAAAN,OAAA;AAGA,MAAMO,GAAG,GAAGC,eAAM,CAACC,SAAS,CAAC,kBAAkB,CAAC;AAChD,MAAMC,aAAa,GAAG;EACpBC,MAAM,EAAE,QAAQ;EAChBC,QAAQ,EAAE;AACZ,CAAC;AAACC,OAAA,CAAAH,aAAA,GAAAA,aAAA;AACF,MAAMI,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;AAQ1C,MAAMC,aAAa,GAAGC,eAAC,CAACC,OAAO,CAAC,eAAeF,aAAaA,CAAA,EAAI;EAC9D,IAAIG,UAAU,GAAGC,aAAI,CAACC,OAAO,CAACD,aAAI,CAACE,OAAO,CAACC,UAAU,CAAC,CAAC;EACvD,IAAIC,UAAU,GAAG,KAAK;EACtB,OAAO,CAACA,UAAU,EAAE;IAClB,MAAMC,YAAY,GAAGL,aAAI,CAACM,IAAI,CAACP,UAAU,EAAE,cAAc,CAAC;IAC1D,IAAI;MACF,IAAI,OAAMQ,WAAE,CAACC,MAAM,CAACH,YAAY,CAAC,KAC7BI,IAAI,CAACC,KAAK,CAAC,MAAMH,WAAE,CAACI,QAAQ,CAACN,YAAY,EAAE,MAAM,CAAC,CAAC,CAACO,IAAI,KAAK,uBAAuB,EAAE;QACxF,OAAOb,UAAU;MACnB;IACF,CAAC,CAAC,OAAOc,GAAG,EAAE,CAAC;IACfd,UAAU,GAAGC,aAAI,CAACC,OAAO,CAACF,UAAU,CAAC;IACrCK,UAAU,GAAGL,UAAU,CAACe,MAAM,IAAId,aAAI,CAACC,OAAO,CAACF,UAAU,CAAC,CAACe,MAAM;EACnE;EACA,MAAM,IAAIC,KAAK,CAAC,yEAAyE,CAAC;AAC5F,CAAC,CAAC;AAEF,MAAMC,gBAAgB,CAAC;EACrBC,WAAWA,CAAEC,GAAG,EAAEC,UAAU,GAAG,IAAI,EAAEC,SAAS,GAAGC,SAAS,EAAE;IAC1D,IAAI,CAACH,GAAG,GAAGA,GAAG;IACd,IAAI,CAACC,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACC,SAAS,GAAGA,SAAS;IAC1B,IAAI,CAACE,wBAAwB,GAAG,KAAK;EACvC;EAEA,IAAIC,oBAAoBA,CAAA,EAAI;IAC1B,IAAI,CAAC,IAAI,CAACC,4BAA4B,EAAE;MACtC,IAAIC,MAAM;MACV,IAAI,CAACD,4BAA4B,GAAG,IAAIE,iBAAC,CAAC,SAASF,4BAA4BA,CAAEG,QAAQ,EAAEC,OAAO,EAAE;QAClGH,MAAM,GAAGG,OAAO;MAClB,CAAC,CAAC;MACF,IAAI,CAACJ,4BAA4B,CAACK,MAAM,GAAGJ,MAAM;IACnD;IACA,OAAO,IAAI,CAACD,4BAA4B;EAC1C;EAEA,MAAMM,KAAKA,CAAEC,UAAU,EAAEC,sBAAsB,GAAG,KAAK,EAAEC,cAAc,GAAG,KAAK,EAAE;IAC/E,IAAI;MACF,MAAMC,aAAa,GAAIC,CAAC,IAAK,4BAA4B,CAACC,IAAI,CAACD,CAAC,CAAC;MACjE,MAAME,YAAY,GAAGrC,aAAI,CAACE,OAAO,CAAC,MAAMN,aAAa,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,qBAAqB,CAAC;MAEnG,MAAM,IAAI,CAAC0C,IAAI,CAAC,CAAC;MACjB,MAAM,IAAI,CAACpB,GAAG,CAACqB,WAAW,CAAC,IAAI,CAACpB,UAAU,EAAE,IAAI,CAAC;MACjD,IAAI,CAACqB,OAAO,GAAG,MAAM,IAAI,CAACC,WAAW,CAACX,KAAK,CACzCO,YAAY,EAAE,uCAAuC,EACrDH,aAAa,EACb,IAAI,EAAE,KAAK,EAAEH,UAAU,EACvB,IAAI,EAAE,wBAAwB,EAAEC,sBAAsB,EACtD,IAAI,EAAE,gBAAgB,EAAEC,cAC1B,CAAC;MAGD,IAAI,CAACO,OAAO,CAACE,EAAE,CAAC,QAAQ,EAAE,CAACC,MAAM,EAAEC,MAAM,KAAK;QAC5C,MAAMC,OAAO,GAAG,+BAA+B;QAC/C,IAAIA,OAAO,CAACT,IAAI,CAACO,MAAM,CAAC,EAAE;UACxBvD,GAAG,CAAC0D,KAAK,CAAC,2BAA2B,CAAC;UACtC,IAAI,IAAI,CAAC1B,SAAS,EAAE;YAClB,IAAI,CAACA,SAAS,CAAC2B,OAAO,CAACC,IAAI,CAAC,OAAO,EAAE;cAACC,OAAO,EAAEN;YAAM,CAAC,CAAC;UACzD;QACF;QAKA,IAAIO,WAAW,GAAG,CAACP,MAAM,IAAI,EAAE,EAAEQ,KAAK,CAAC,IAAI,CAAC;QAC5C,MAAMC,SAAS,GAAG,0CAA0C;QAC5D,KAAK,IAAIC,IAAI,IAAIH,WAAW,EAAE;UAC5B,IAAIG,IAAI,CAACC,IAAI,CAAC,CAAC,EAAE;YACf,IAAIF,SAAS,CAAChB,IAAI,CAACiB,IAAI,CAAC,EAAE;cACxB,IAAIE,SAAS,GAAGH,SAAS,CAACI,IAAI,CAACH,IAAI,CAAC,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC;cAC9C,IAAIG,SAAS,GAAGrE,GAAG,CAACsE,IAAI,CAACC,IAAI,CAACvE,GAAG,CAAC;cAGlC,IAAI,WAAW,CAACgD,IAAI,CAACmB,SAAS,CAAC,EAAE;gBAC/BE,SAAS,GAAGrE,GAAG,CAAC0D,KAAK,CAACa,IAAI,CAACvE,GAAG,CAAC;cACjC;cACAqE,SAAS,CAAE,mBAAkBF,SAAU,EAAC,CAAC;YAC3C,CAAC,MAAM;cACLnE,GAAG,CAAC0D,KAAK,CAAE,mBAAkBO,IAAK,EAAC,CAAC;YACtC;UACF;QACF;QAEA,IAAIO,WAAW,GAAG,CAAChB,MAAM,IAAI,EAAE,EAAEO,KAAK,CAAC,IAAI,CAAC;QAC5C,KAAK,IAAIE,IAAI,IAAIO,WAAW,EAAE;UAC5B,IAAIP,IAAI,CAACC,IAAI,CAAC,CAAC,EAAE;YACflE,GAAG,CAAC0D,KAAK,CAAE,mBAAkBO,IAAK,EAAC,CAAC;UACtC;QACF;MACF,CAAC,CAAC;MAGF,OAAO,MAAM,IAAI3B,iBAAC,CAAC,CAACxB,OAAO,EAAEuB,MAAM,KAAK;QACtC,IAAI;UACF,IAAI,CAACoC,YAAY,GAAGC,YAAG,CAACC,OAAO,CAAC,IAAI,CAAC5C,UAAU,EAAE,WAAW,CAAC;UAE7D,IAAI,CAAC0C,YAAY,CAACnB,EAAE,CAAC,OAAO,EAAGsB,GAAG,IAAK;YACrC,IAAI,CAAC,IAAI,CAAC1C,wBAAwB,EAAE;cAClC,MAAM,IAAIP,KAAK,CAAE,qCAAoCiD,GAAI,EAAC,CAAC;YAC7D;UACF,CAAC,CAAC;UACF,IAAI,CAACH,YAAY,CAACI,IAAI,CAAC,SAAS,EAAE,MAAM;YACtC7E,GAAG,CAACsE,IAAI,CAAC,2CAA2C,CAAC;YACrDxD,OAAO,CAAC,CAAC;UACX,CAAC,CAAC;QACJ,CAAC,CAAC,OAAO8D,GAAG,EAAE;UACZvC,MAAM,CAACuC,GAAG,CAAC;QACb;MACF,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOA,GAAG,EAAE;MACZ5E,GAAG,CAAC8E,aAAa,CAAE,kEAAiEF,GAAI,EAAC,CAAC;IAC5F;EACF;EAEA,MAAMG,WAAWA,CAAEC,IAAI,EAAEC,KAAK,GAAG,CAAC,CAAC,EAAE;IACnC,IAAI,CAAC,IAAI,CAACR,YAAY,EAAE;MACtB,MAAM,IAAI9C,KAAK,CAAC,uCAAuC,CAAC;IAC1D;IAEA,OAAO,MAAM,IAAIW,iBAAC,CAAC,CAACxB,OAAO,EAAEuB,MAAM,KAAK;MACtC,IAAI6C,GAAG,GAAGC,MAAM,CAACC,MAAM,CAAC;QAACF,GAAG,EAAEF;MAAI,CAAC,EAAEC,KAAK,CAAC;MAC3C,IAAII,OAAO,GAAI,GAAEhE,IAAI,CAACiE,SAAS,CAACJ,GAAG,CAAE,KAAI;MACzClF,GAAG,CAAC0D,KAAK,CAAE,+BAA8BjD,eAAC,CAAC8E,QAAQ,CAACF,OAAO,EAAE;QAAC3D,MAAM,EAAE;MAAI,CAAC,CAAC,CAACwC,IAAI,CAAC,CAAE,EAAC,CAAC;MACtF,IAAI,CAACO,YAAY,CAACe,KAAK,CAACH,OAAO,CAAC;MAChC,IAAI,CAACZ,YAAY,CAACgB,WAAW,CAAC,MAAM,CAAC;MACrC,IAAIC,UAAU,GAAG,EAAE;MACnB,IAAIC,yBAAyB,GAAG,IAAI;MACpC,IAAI,CAAClB,YAAY,CAACnB,EAAE,CAAC,MAAM,EAAGsC,IAAI,IAAK;QACrC,IAAID,yBAAyB,EAAE;UAC7BE,YAAY,CAACF,yBAAyB,CAAC;QACzC;QACA3F,GAAG,CAAC0D,KAAK,CAAC,wCAAwC,CAAC;QACnD,IAAI;UACFgC,UAAU,GAAGrE,IAAI,CAACC,KAAK,CAACoE,UAAU,GAAGE,IAAI,CAAC;UAG1C,IAAI,CAACnB,YAAY,CAACqB,kBAAkB,CAAC,MAAM,CAAC;UAC5C,IAAIJ,UAAU,CAACK,MAAM,KAAK,CAAC,EAAE;YAC3B,OAAOjF,OAAO,CAAC4E,UAAU,CAACM,KAAK,CAAC;UAClC;UACA3D,MAAM,CAAC,IAAA4D,qBAAa,EAACP,UAAU,CAACK,MAAM,EAAEL,UAAU,CAACM,KAAK,CAAC,CAAC;QAC5D,CAAC,CAAC,OAAOpB,GAAG,EAAE;UACZ,IAAI,CAACnE,eAAC,CAACyF,QAAQ,CAACR,UAAU,CAAC,EAAE;YAC3B1F,GAAG,CAACmG,KAAK,CAAC,gDAAgD,CAAC;YAC3DnG,GAAG,CAACmG,KAAK,CAACvB,GAAG,CAACwB,KAAK,CAAC;YACpB,OAAO/D,MAAM,CAAC,IAAA4D,qBAAa,EAAC,EAAE,EAAErB,GAAG,CAACf,OAAO,CAAC,CAAC;UAC/C;UACA7D,GAAG,CAAC0D,KAAK,CAAE,4CAA2CnD,oBAAqB,2BAA0B,CAAC;UACtGmF,UAAU,IAAIE,IAAI;UAClBD,yBAAyB,GAAGU,UAAU,CAAC,MAAM;YAC3C,MAAMC,MAAM,GAAI,8DAA6DZ,UAAW,GAAE;YAC1F1F,GAAG,CAACmG,KAAK,CAACG,MAAM,CAAC;YACjB,IAAI,CAAC7B,YAAY,CAACqB,kBAAkB,CAAC,MAAM,CAAC;YAC5CzD,MAAM,CAAC,IAAA4D,qBAAa,EAAC,EAAE,EAAEK,MAAM,CAAC,CAAC;UACnC,CAAC,EAAE/F,oBAAoB,CAAC;QAC1B;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EAEA,MAAMgG,UAAUA,CAAEC,MAAM,EAAEC,MAAM,GAAG,CAAC,CAAC,EAAE;IACrC,IAAIxB,KAAK,GAAG;MAACuB,MAAM;MAAEC;IAAM,CAAC;IAC5B,OAAO,MAAM,IAAI,CAAC1B,WAAW,CAAC5E,aAAa,CAACC,MAAM,EAAE6E,KAAK,CAAC;EAC5D;EAEA,MAAMyB,QAAQA,CAAA,EAAI;IAChB,IAAI,CAAC,IAAI,CAACrD,WAAW,EAAE;MACrBrD,GAAG,CAAC2G,IAAI,CAAC,8DAA8D,CAAC;MACxE;IACF;IAGA,IAAI,CAACtD,WAAW,CAACyC,kBAAkB,CAACc,oBAAW,CAACC,aAAa,CAAC;IAC9D,IAAI,IAAI,CAACpC,YAAY,EAAE;MACrB,MAAM,IAAI,CAACM,WAAW,CAAC5E,aAAa,CAACE,QAAQ,CAAC;IAChD;IACA,MAAM,IAAI,CAACgD,WAAW,CAACqD,QAAQ,CAAC,CAAC;IACjC,IAAI,CAACrD,WAAW,GAAG,IAAI;EACzB;EAGA,MAAMH,IAAIA,CAAA,EAAI;IACZ,IAAI,CAACG,WAAW,GAAG,IAAIuD,oBAAW,CAAC,IAAI,CAAC9E,GAAG,CAAC;IAG5C,IAAI,CAACuB,WAAW,CAACC,EAAE,CAACsD,oBAAW,CAACC,aAAa,EAAGC,GAAG,IAAK;MACtD,IAAIA,GAAG,CAACC,KAAK,KAAKH,oBAAW,CAACI,aAAa,EAAE;QAC3C,IAAI,CAAC3D,WAAW,GAAG,IAAI;QACvB,IAAI,CAAClB,oBAAoB,CAACM,MAAM,CAAC,IAAId,KAAK,CAAC,oCAAoC,CAAC,CAAC;MACnF;IACF,CAAC,CAAC;EACJ;EAEA,IAAIO,wBAAwBA,CAAE+E,MAAM,EAAE;IACpCjH,GAAG,CAAC0D,KAAK,CAAE,GAAEuD,MAAM,GAAG,UAAU,GAAG,cAAe,uBAAsB,CAAC;IACzE,IAAI,CAACC,yBAAyB,GAAGD,MAAM;EACzC;EAEA,IAAI/E,wBAAwBA,CAAA,EAAI;IAC9B,OAAO,IAAI,CAACgF,yBAAyB;EACvC;AACF;AAAC5G,OAAA,CAAAsB,gBAAA,GAAAA,gBAAA;AAAA,IAAAuF,QAAA,GAGcvF,gBAAgB;AAAAtB,OAAA,CAAA8G,OAAA,GAAAD,QAAA"}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../lib/bootstrap.js"],"names":[],"mappings":"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"}