@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
285 lines (239 loc) • 16.6 kB
JavaScript
"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;