quickgame-server
Version:
quickgame server
1 lines • 9.57 kB
JavaScript
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault"),_regenerator=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.colorconsole=exports.SOURCE=exports.LINK_MODE=void 0,exports.emitWSEvent=emitWSEvent,exports.forwardPort=forwardPort,exports.generateQrcode=generateQrcode,exports.getClientFromRequest=getClientFromRequest,exports.getClientIPAddress=getClientIPAddress,exports.getDebugInfoFromRequest=getDebugInfoFromRequest,exports.getInspectorUrl=getInspectorUrl,exports.getPort=void 0,exports.getProjectName=getProjectName,exports.getSerialNumber=getSerialNumber,exports.getServerIPAndPort=getServerIPAndPort,exports.getWebSocketDebuggerUrl=getWebSocketDebuggerUrl,exports.mkdirsSync=mkdirsSync,exports.outputQRCodeOnTerminal=outputQRCodeOnTerminal,exports.removeAllForward=removeAllForward,exports.sleep=sleep,exports.startChrome=startChrome,exports.stripPrefixForIPV4MappedIPV6Address=stripPrefixForIPV4MappedIPV6Address,exports.traverseDirSync=traverseDirSync,_interopRequireDefault(require("@babel/runtime/regenerator"))),_asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")),_os=_interopRequireDefault(require("os")),_net=_interopRequireDefault(require("net")),_fs=_interopRequireDefault(require("fs")),_request=_interopRequireDefault(require("request")),_path=_interopRequireDefault(require("path")),_chalk=_interopRequireDefault(require("chalk")),_qrcodeTerminal=_interopRequireDefault(require("qrcode-terminal")),_chromeSimpleLauncher=_interopRequireDefault(require("chrome-simple-launcher")),_portfinder=_interopRequireDefault(require("portfinder")),_adbCommander=_interopRequireDefault(require("adb-commander")),LINK_MODE=exports.LINK_MODE={NULL:0,WIFI:1,ADB:2},TITLE_STRING="title",NETSTAT_STATUS_LISTENING="LISTENING",MIWEBVIEW_DEVTOOLS_PORT_REGEX=/((?:hybrid_)|(?:miui_))?webview_devtools_remote_(\d+)/,WEBSOCKET_DEBUGGER_URL_STRING="webSocketDebuggerUrl",REMOTE_INSPECT_PORT=9229,isDebugWebview=!1,CHROME_INSPECTOR_QUERY="experiments=true&v8only=true",CHROME_INSPECTOR_QUERY_WEBVIEW="experiments=true",logLevelMap={};function prependLevel(e,r){var t;logLevelMap[e]||((t=e.toUpperCase().substr(0,5)).paddEnd&&t.paddEnd(4),logLevelMap[e]=t),"string"==typeof r[0]&&1<r[0].length&&"["!==r[0][0]&&(r[0]="[".concat(logLevelMap[e],"] ").concat(r[0]))}var colorconsole=exports.colorconsole={trace:function(){for(var e,r=arguments.length,t=new Array(r),o=0;o<r;o++)t[o]=arguments[o];prependLevel("trace",t),(e=console).trace.apply(e,t)},log:function(){for(var e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];prependLevel("log",r),console.log(_chalk.default.green.apply(_chalk.default,r))},info:function(){for(var e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];prependLevel("info",r),console.info(_chalk.default.green.apply(_chalk.default,r))},warn:function(){for(var e,r=arguments.length,t=new Array(r),o=0;o<r;o++)t[o]=arguments[o];prependLevel("warn",t),console.warn((e=_chalk.default.yellow).bold.apply(e,t))},error:function(){for(var e,r=arguments.length,t=new Array(r),o=0;o<r;o++)t[o]=arguments[o];prependLevel("error",t),console.error((e=_chalk.default.red).bold.apply(e,t))},throw:function(){var e;throw new Error((e=_chalk.default.red).bold.apply(e,arguments))}};function mkdirsSync(e){return!!_fs.default.existsSync(e)||(mkdirsSync(_path.default.dirname(e))?(_fs.default.mkdirSync(e),!0):void 0)}function getServerIPAndPort(e){return(getIPv4IPAddress()||"127.0.0.1")+"".concat(80===e?"":":"+e)}function getClientIPAddress(e){return stripPrefixForIPV4MappedIPV6Address(e.headers["x-forwarded-for"]||e.connection&&e.connection.remoteAddress||e.socket&&e.socket.remoteAddress||e.connection&&e.connection.socket&&e.connection.socket.remoteAddress)}function stripPrefixForIPV4MappedIPV6Address(e){return/^::1$/.test(e)&&(e="127.0.0.1"),e=/^::.{0,4}:(\d{1,3}\.){3}\d{1,3}/.test(e)?e.replace(/^.*:/,""):e}function generateQrcode(e){var r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"unity",t=getIPv4IPAddress();t?(t="http://".concat(t,":").concat(e,"?engineType=").concat(r),colorconsole.info(""),colorconsole.info("### App Server ### 服务器地址:".concat(t)),colorconsole.info("### App Server ### 请确保手机与App Server处于相同网段"),colorconsole.info(""),outputQRCodeOnTerminal(t)):colorconsole.warn("### App Server ### 本机IP地址为空,无法通过WIFI调试")}function outputQRCodeOnTerminal(e){console.info(""),console.info("生成HTTP服务器的二维码: ".concat(e)),_qrcodeTerminal.default.generate(e,{small:!0})}var _getPort=exports.getPort=function(n){return new Promise(function(r,t){var o=_net.default.createServer().listen(n);o.on("error",function(e){"EADDRINUSE"===e.code?(o.close(),r(_getPort(n+1))):t(e)}),o.on("listening",function(){o.close(),r(n)})})};function traverseDirSync(t,o,n){_fs.default.readdirSync(t).forEach(function(e){e=_path.default.join(t,e);var r=_fs.default.statSync(e);r&&r.isDirectory()?traverseDirSync(e,o,n):("function"!=typeof n||n(e))&&"function"==typeof n||o.push(e)})}function getProjectName(){try{var e=process.cwd(),r=_path.default.join(e,"manifest.json"),t=require(r);return t&&t.package||"Bundle"}catch(e){colorconsole.error("### App Server ### 获取项目名称出错:".concat(e.message))}}function getIPv4IPAddress(){var r,e,t=_os.default.networkInterfaces();for(e in t)if(Object.prototype.hasOwnProperty.call(t,e))if(t[e].every(function(e){return!("IPv4"===e.family&&!e.internal&&"127.0.0.1"!==e.address&&(r=e,1))}),void 0!==r)break;return r&&r.address}function getClientFromRequest(e){var r=getClientIPAddress(e),t=getIPv4IPAddress(),e=e.header["device-serial-number"],o=LINK_MODE.NULL;return"127.0.0.1"===r&&e?o=LINK_MODE.ADB:"127.0.0.1"!==r&&r!==t&&(o=LINK_MODE.WIFI),{clientIp:r,sn:e,linkMode:o}}function emitWSEvent(e,r,t){e.sockets.emit(r,t||{})}function getInspectorUrl(e){var r=e.ws,e="http://".concat(getServerIPAndPort(e.serverPort)),r="?".concat(isDebugWebview?CHROME_INSPECTOR_QUERY_WEBVIEW:CHROME_INSPECTOR_QUERY,"&").concat(encodeURI(r));return"".concat(e).concat("/inspector/inspector.html").concat(r)}function getDebugInfoFromRequest(e){var r=getClientFromRequest(e),t=r.sn,r=r.linkMode,e=e.body,o=e.ws,e=e.application,n=o.split(":")[1].split("/")[0];return{sn:t,linkMode:r,ws:o,application:e,devicePort:n}}function getWebSocketDebuggerUrl(){return _getWebSocketDebuggerUrl.apply(this,arguments)}function _getWebSocketDebuggerUrl(){return(_getWebSocketDebuggerUrl=(0,_asyncToGenerator2.default)(_regenerator.default.mark(function e(){var r,t=arguments;return _regenerator.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return r="http://127.0.0.1:".concat(0<t.length&&void 0!==t[0]?t[0]:REMOTE_INSPECT_PORT,"/json/list"),colorconsole.info("### App Server ### 获取调试页面WebSocketDebuggerUrl: ",r),e.next=5,sleep(3e3);case 5:return e.abrupt("return",new Promise(function(t,e){(0,_request.default)({url:r,headers:{Connection:"keep-alive"},timeout:1e4},function(e,r){if(e)return colorconsole.error("Error request inspectable pages: "+e);JSON.parse(r.body).map(function(e){e[TITLE_STRING];e=e[WEBSOCKET_DEBUGGER_URL_STRING];e&&(e=e.replace("ws://","ws="),t(e))})})}));case 6:case"end":return e.stop()}},e)}))).apply(this,arguments)}function forwardPort(e,r){var t=2<arguments.length&&void 0!==arguments[2]?arguments[2]:REMOTE_INSPECT_PORT;return"web"===r&&(isDebugWebview=!0),new Promise(function(r){return Promise.all(e.map(function(n){return new Promise(function(o,e){(isDebugWebview?_adbCommander.default.exeCommand("adb shell netstat -anl").then(function(e){e=e.result;if(!e)throw new Error("No network connections.");e.trim().split("\n").map(function(e){var t,r;-1!==e.search(NETSTAT_STATUS_LISTENING)&&(t=e.match(MIWEBVIEW_DEVTOOLS_PORT_REGEX))&&(r=t[2],_adbCommander.default.exeCommand("adb -s ".concat(n," shell ps ").concat(r)).then(function(e){e=e.result,e=e.trim().split("\n")[1];e&&e.match(/com.miui.hybrid:Launcher(\d+)/)&&(_portfinder.default.basePort=r,_portfinder.default.getPortPromise().then(function(r){var e="adb -s ".concat(n," forward tcp:").concat(r," localabstract:").concat(t[0]);return _adbCommander.default.exeCommand(e).then(function(e){e.result;e=e.err;if(e)return colorconsole.error(e);o(r)})}).catch(function(){colorconsole.error("Can not find valid port forward.")}))}))})}):(_portfinder.default.basePort=t,_portfinder.default.getPortPromise().then(function(r){var e="adb -s ".concat(n," forward tcp:").concat(r," tcp:").concat(REMOTE_INSPECT_PORT);return _adbCommander.default.exeCommand(e).then(function(e){e.result;e=e.err;if(e)return colorconsole.error(e);o(r)})}))).catch(function(){colorconsole.error("Can not find valid port forward.")})})})).then(function(e){r(e[0])}).catch(function(e){colorconsole.error("Error in forwardPort:",e.stack)})})}function getSerialNumber(){return new Promise(function(t){_adbCommander.default.deviceList().then(function(e,r){if(r)colorconsole.error("fail to execute adb devices");else{r=e.deviceList;if(0===r.length)throw new Error("No Device attached to PC.");t(r)}}).then(function(){}).catch(function(e){colorconsole.error("Error in getSerialNumber:",e.stack)})})}function removeAllForward(e){_adbCommander.default.exeCommand("adb forward --remove-all").then(function(e,r){r&&colorconsole.error("Error clear port forward"),colorconsole.info("adb forward --remove-all")})}function startChrome(e){return _chromeSimpleLauncher.default.launch(e)}var SOURCE=exports.SOURCE={IDE:"ide"};function sleep(r){return new Promise(function(e){return setTimeout(e,r)})}