"use strict"; const adb_driver_1 = require("adb-driver"); class ADBCommander { async _commandFactory(command) { const cmdResult = await adb_driver_1.execADBCommand(command); const isError = cmdResult instanceof Error || (cmdResult.stack && cmdResult.message); if (isError) { return { err: cmdResult }; } else { return { result: cmdResult }; } } async deviceList() { const { result, err } = await this._commandFactory(`adb devices`); return { deviceList: _parseDeviceInfo(result), err, }; function _parseDeviceInfo(stdout) { if (!stdout) { return []; } const lines = stdout.replace(/(\n|\r\n){1,}/g, '\n').split('\n'); const result = lines .filter((item, idx) => { const oneDevice = item.split('\t'); return idx !== 0 && oneDevice[1] === 'device'; }) .map(item => { return item.split('\t')[0]; }); return result; } } async reverse(deviceSN, localPort, remotePort) { const cmd = `adb -s ${deviceSN} reverse tcp:${remotePort} tcp:${localPort}`; return await this._commandFactory(cmd); } async forward(deviceSN, localPort, remotePort) { const cmd = `adb -s ${deviceSN} forward tcp:${localPort} tcp:${remotePort}`; return await this._commandFactory(cmd); } async version() { const { result, err } = await this._commandFactory(`adb version`); return { version: result, err }; } async print(cmd) { const { err } = await this._commandFactory(cmd); if (err) { console.error(`### App Server ### print(): adb error: ${err.message}`); } } async uninstall(deviceSN, pkg) { const { result, err } = await this._commandFactory(`adb -s ${deviceSN} uninstall ${pkg}`); return { result, err }; } async install(deviceSN, apkPath) { const { result, err } = await this._commandFactory(`adb -s ${deviceSN} install ${apkPath}`); return { result, err }; } async isInstalled(deviceSN, pkg) { const { result, err } = await this._commandFactory(`adb -s ${deviceSN} shell pm path ${pkg}`); let isInstalled = false; if (result && result.indexOf('package:') > -1) { isInstalled = true; } return { isInstalled, err }; } async startActivity(deviceSN, action, component, extra) { let commandArray = []; commandArray.push('adb', '-s', deviceSN, 'shell', 'am', 'start'); if (action !== undefined) { commandArray.push('-a', action); } if (component !== undefined) { commandArray.push('-n', component); } function parseExtra(extra) { const typeMap = { string: '--es', null: '--esn', boolean: '--ez', int: '--ei', float: '--ef', uri: '--eu', component: '--ecn', 'String[]': '--esa', 'int[]': '--eia', 'long[]': '--ela', 'float[]': '--efa', }; let extraCommands = []; extra.forEach(item => { if (item.type in typeMap) { extraCommands.push(typeMap[item.type]); extraCommands.push(item.key); if (item.type.endsWith('[]')) { extraCommands.push(item.value.join(',')); } else { extraCommands.push(item.value); } } }); return extraCommands; } if (extra) { commandArray.push(parseExtra(extra).join(' ')); } const { result, err } = await this._commandFactory(commandArray.join(' ')); return { result, err }; } async exeCommand(command) { return await this._commandFactory(command); } async getProp(deviceSN) { const { result, err } = await this._commandFactory(`adb -s ${deviceSN} shell getprop ro.serialno`); return { result, err }; } } const adbCommander = new ADBCommander(); module.exports = adbCommander;