UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

285 lines (239 loc) 16.6 kB
"use strict";var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");_Object$defineProperty(exports, "__esModule", { value: true });exports["default"] = void 0;var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));var _map = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/map"));var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));var _from = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/from"));var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass")); var _adbDevicesEmitter = _interopRequireDefault(require("adb-devices-emitter")); var _adbCommander = _interopRequireDefault(require("adb-commander")); var _recordClient = require("../record-client.js"); var _debuglog = _interopRequireDefault(require("./debuglog")); /** * Copyright (C) 2017, hapjs.org. All rights reserved. */var REMOTE_REVERSE_PORT = 12306; var REMOTE_UP_FORWARD_PORT = 39517; /** * ADB Modules */var ADBModule = /*#__PURE__*/function () { /** * ADBModule constructor * @param option * @param option.localReversePort {number} adb reverse命令使用的端口 */ function ADBModule(option) {(0, _classCallCheck2["default"])(this, ADBModule); this.option = option; // 当前连接的设备列表 sn: { upForwardPortPair:[localPort, remotePort], wsPortPair[localPort, remotePort] } this.currentDeviceMap = new _map["default"](); // 用来记录所有当前连接和已拔出的设备列表 this.cachedDeviceMap = new _map["default"](); this.DEBUG = (process.env.NODE_DEBUG || '').split(',').includes('adb'); // 记录localUpForwardPort(自增)的端口号, 初始值等于REMOTE_UP_FORWARD_PORT this._localUpForwardPort = REMOTE_UP_FORWARD_PORT; this.commander = _adbCommander["default"]; this.devicesEmitter = _adbDevicesEmitter["default"]; this._lastPromise = null; this.emulators = new _map["default"](); this.init(); } /** * 注册事件, 开始查询设备 */return (0, _createClass2["default"])(ADBModule, [{ key: "init", value: function init() {var _this = this; (0, _debuglog["default"])("init(): start"); this.devicesEmitter.addEventListener('deviceAdded', function (event) { _this._listen(event, _this.onDeviceAdded.bind(_this)); }); this.devicesEmitter.addEventListener('deviceRemoved', function (event) { _this._listen(event, _this.onDeviceRemoved.bind(_this)); }); this.devicesEmitter.start(); } /** * 确保队列式的调用顺序 * @private */ }, { key: "_listen", value: function _listen(event, callback) { if (!this._lastPromise) { this._lastPromise = callback(event); } else { this._lastPromise = this._lastPromise.then( function () { return callback(event); }, function () { return callback(event); } ); } } /** * 取得一个_localUpForwardPort端口数字 * @private */ }, { key: "_getNextLocalForwardPort", value: function _getNextLocalForwardPort() { return this._localUpForwardPort++; } /** * 处理每个新增设备 * @desc * 为每一个设备执行以下操作: * 1. adb reverse tcp:${localReversePort} tcp:REMOTE_REVERSE_PORT, * 2. adb forward tcp:${localUpForwardPort} tcp:REMOTE_UP_FORWARD_PORT; * 3. 如果cachedDeviceList中存在当前新增设备, 且状态为已断开, 检查该设备是否 * 已有wsForwardPort端口记录信息, 有则执行adb forward tcp:${wsPair[0]} tcp:${wsPair[1]}; * 4. 为currentList中新增当前设备; * @param event * @param event.sn 设备序列号 */ }, { key: "onDeviceAdded", value: (function () {var _onDeviceAdded = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark( function _callee(event) {var sn, _yield$this$commander, result, localReversePort, reverseResult, currentDevice, upForwardResult, debugForwardResult;return _regenerator["default"].wrap(function _callee$(_context) {while (1) switch (_context.prev = _context.next) {case 0: sn = event.sn; console.info("### App Server ### \u624B\u673A\u8BBE\u5907(".concat(sn, ")\u88AB\u8FDE\u5165"));_context.next = 4;return ( this.commander.getProp(sn));case 4:_yield$this$commander = _context.sent;result = _yield$this$commander.result; if (result) { this.emulators.set(result.trim(), sn); } localReversePort = this.option.localReversePort; // 建立reverse设定 _context.next = 10;return this.establishADBProxyLink('reverse', [ sn, localReversePort, REMOTE_REVERSE_PORT] );case 10:reverseResult = _context.sent;if (! reverseResult.err) {_context.next = 14;break;} console.error("### App Server ### onDeviceAdded(): (".concat( sn, ")\u5EFA\u7ACBadb reverse\u5931\u8D25(local port: ").concat(localReversePort, ", remote port: ").concat(REMOTE_REVERSE_PORT, ")") );return _context.abrupt("return");case 14: // 检查cachedDeviceList中的设备状况 currentDevice = this.cachedDeviceMap.get(sn); (0, _debuglog["default"])("onDeviceAdded():(".concat( sn, ")\ncachedDevice:\t").concat((0, _stringify["default"])( currentDevice ), "\ncachedDeviceList:\t").concat((0, _stringify["default"])((0, _from["default"])(this.cachedDeviceMap.entries()))) ); // 建立forward update port设定 if (!currentDevice || !currentDevice.upForwardPortPair) { currentDevice = { upForwardPortPair: [this._getNextLocalForwardPort(), REMOTE_UP_FORWARD_PORT] }; }_context.next = 19;return ( this.establishADBProxyLink( 'forward', [sn].concat(currentDevice.upForwardPortPair) ));case 19:upForwardResult = _context.sent;if (! upForwardResult.err) {_context.next = 23;break;} console.error("### App Server ### onDeviceAdded(): (".concat( sn, ")\u5EFA\u7ACBadb forward\u5931\u8D25(local port: ").concat( currentDevice.upForwardPortPair[0], ", remote port: ").concat( currentDevice.upForwardPortPair[1], ") ") );return _context.abrupt("return");case 23:if (! currentDevice.wsPortPair) {_context.next = 28;break;}_context.next = 26;return ( this.establishADBProxyLink('forward', [ sn, currentDevice.wsPortPair[0], currentDevice.wsPortPair[1]] ));case 26:debugForwardResult = _context.sent; if (debugForwardResult.err) { console.info("### App Server ### onDeviceAdded():(".concat( sn, ") \u5EFA\u7ACBadb forward\u5931\u8D25(local port: ").concat( currentDevice.wsPortPair[0], ", remote port: ").concat( currentDevice.wsPortPair[1], ")") ); currentDevice.wsPortPair = undefined; }case 28: // 记录当前设备 this.currentDeviceMap.set(sn, currentDevice); this.cachedDeviceMap.set(sn, currentDevice); // 记录发送update http请求需要的ip和端口 _context.next = 32;return this._writeClientLogFile({ sn: sn, ip: "127.0.0.1", port: currentDevice.upForwardPortPair[0] });case 32: (0, _debuglog["default"])("onDeviceAdded():(".concat(sn, ") end"));case 33:case "end":return _context.stop();}}, _callee, this);}));function onDeviceAdded(_x) {return _onDeviceAdded.apply(this, arguments);}return onDeviceAdded;}() /** * 移除设备事件 */) }, { key: "onDeviceRemoved", value: (function () {var _onDeviceRemoved = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark( function _callee2(event) {var sn;return _regenerator["default"].wrap(function _callee2$(_context2) {while (1) switch (_context2.prev = _context2.next) {case 0: sn = event.sn; console.info("### App Server ### \u624B\u673A\u8BBE\u5907(".concat(sn, ")\u88AB\u62D4\u51FA")); this.currentDeviceMap["delete"](sn);if (! this.DEBUG) {_context2.next = 9;break;} (0, _debuglog["default"])("deviceRemoved():(".concat( sn, ") cachedDeviceList: ").concat((0, _stringify["default"])( (0, _from["default"])(this.cachedDeviceMap.entries()) )) );_context2.next = 7;return ( this.commander.print("adb -s ".concat(sn, " reverse --list")));case 7:_context2.next = 9;return ( this.commander.print("adb -s ".concat(sn, " forward --list")));case 9:_context2.next = 11;return ( this._removeItemFromClientLogFile(sn));case 11: (0, _debuglog["default"])("deviceRemoved():(".concat(sn, ") end"));case 12:case "end":return _context2.stop();}}, _callee2, this);}));function onDeviceRemoved(_x2) {return _onDeviceRemoved.apply(this, arguments);}return onDeviceRemoved;}() /** * 记录一条端口映射条目 */) }, { key: "_writeClientLogFile", value: (function () {var _writeClientLogFile2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark( function _callee3(newClient) {return _regenerator["default"].wrap(function _callee3$(_context3) {while (1) switch (_context3.prev = _context3.next) {case 0: try { (0, _recordClient.recordClient)(_recordClient.clientRecordPath, newClient, function (msg) { (0, _debuglog["default"])(msg); }); } catch (err) { console.error("### App Server ### writeClientLogFile(): \u5199\u5165client.json\u6587\u4EF6\u51FA\u9519: ".concat( err.message) ); }case 1:case "end":return _context3.stop();}}, _callee3);}));function _writeClientLogFile(_x3) {return _writeClientLogFile2.apply(this, arguments);}return _writeClientLogFile;}() /** * 从端口映射记录文件中移除一个条目 */) }, { key: "_removeItemFromClientLogFile", value: (function () {var _removeItemFromClientLogFile2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark( function _callee4(sn) {return _regenerator["default"].wrap(function _callee4$(_context4) {while (1) switch (_context4.prev = _context4.next) {case 0: try { (0, _recordClient.removeClientBySn)(_recordClient.clientRecordPath, sn, function (msg) { (0, _debuglog["default"])(msg); }); } catch (err) { console.error("### App Server ### _removeItemFromClientLogFile(): \u79FB\u9664client.json\u8BBE\u5907\u4FE1\u606F\u51FA\u9519\uFF1A ".concat( err.message) ); }case 1:case "end":return _context4.stop();}}, _callee4);}));function _removeItemFromClientLogFile(_x4) {return _removeItemFromClientLogFile2.apply(this, arguments);}return _removeItemFromClientLogFile;}() /** * 建立Websocket连接的端口映射 * @param sn 设备序列号 * @param remoteWsPort Websocket连接的远程端口号 * @returns {Promise.<{ localWsPort } | { err }>} */) }, { key: "forwardForWsChannel", value: (function () {var _forwardForWsChannel = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark( function _callee5(sn, remoteWsPort) {var device, localWsPort, localReversePort, realSN, wsPortPair, _yield$this$establish, err;return _regenerator["default"].wrap(function _callee5$(_context5) {while (1) switch (_context5.prev = _context5.next) {case 0: device = this.currentDeviceMap.get(sn); // 暂时localWsPort与remoteWsPort一样; localWsPort = remoteWsPort; localReversePort = this.option.localReversePort; if (!device) { realSN = this.emulators.get(sn); console.info("### App Server ### \u901A\u8FC7\uFF08".concat(sn, "\uFF09\u67E5\u627E\u5230\u8BBE\u5907").concat(realSN)); device = this.currentDeviceMap.get(realSN); if (device) { sn = realSN; } }if ( device) {_context5.next = 7;break;} console.error("### App Server ### \u83B7\u53D6(".concat(sn, ")\u8BBE\u5907\u4FE1\u606F\u5931\u8D25"));return _context5.abrupt("return", { localWsPort: localWsPort, localReversePort: localReversePort });case 7: wsPortPair = device.wsPortPair; // 若之前不存在端口, 说明是第一次连接,否则可以不必设定 if (!(wsPortPair && wsPortPair[0] === localWsPort && wsPortPair[1] === remoteWsPort)) {_context5.next = 10;break;}return _context5.abrupt("return", { localWsPort: localWsPort, localReversePort: localReversePort });case 10:_context5.next = 12;return ( this.establishADBProxyLink('forward', [sn, localWsPort, remoteWsPort]));case 12:_yield$this$establish = _context5.sent;err = _yield$this$establish.err;if (! err) {_context5.next = 18;break;} console.error("### AppApp Server ### forwardForWsChannel(): \u521B\u5EFAWebSocket\u7AEF\u53E3\u6620\u5C04\u5931\u8D25"); device.wsPortPair = undefined;return _context5.abrupt("return", { err: err });case 18: device.wsPortPair = [localWsPort, remoteWsPort];return _context5.abrupt("return", { localWsPort: localWsPort, localReversePort: localReversePort });case 20:case "end":return _context5.stop();}}, _callee5, this);}));function forwardForWsChannel(_x5, _x6) {return _forwardForWsChannel.apply(this, arguments);}return forwardForWsChannel;}() /** * 建立adb reverse/forward通道 * @param type {string} "reverse"|"forward" * @param args {array} 建立reverse/forward通道所需的参数. e.g. [sn, localPort, devicePort] */) }, { key: "establishADBProxyLink", value: (function () {var _establishADBProxyLink = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark( function _callee6(type, args) {var _this$commander;var result;return _regenerator["default"].wrap(function _callee6$(_context6) {while (1) switch (_context6.prev = _context6.next) {case 0:_context6.next = 2;return ( (_this$commander = this.commander)[type].apply(_this$commander, (0, _toConsumableArray2["default"])(args)));case 2:result = _context6.sent;if (! this.DEBUG) {_context6.next = 7;break;} (0, _debuglog["default"])("establishADBReverseLink(): (".concat( args[0], ") adb ").concat(type, " setup result: ").concat((0, _stringify["default"])( result )) );_context6.next = 7;return ( this.commander.print("adb -s ".concat(args[0], " ").concat(type, " --list")));case 7:return _context6.abrupt("return", result);case 8:case "end":return _context6.stop();}}, _callee6, this);}));function establishADBProxyLink(_x7, _x8) {return _establishADBProxyLink.apply(this, arguments);}return establishADBProxyLink;}()) }]);}();var _default = exports["default"] = ADBModule;