quickgame-server
Advanced tools
Comparing version 0.1.10 to 0.1.11
@@ -1,1 +0,34 @@ | ||
"use strict";var _interopRequireWildcard=require("@babel/runtime/helpers/interopRequireWildcard"),_interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault"),_path=_interopRequireDefault(require("path")),_koa=_interopRequireDefault(require("koa")),_koaStatic=_interopRequireDefault(require("koa-static"));require("./common/regenerator");var _record=require("./middleware/record"),_qrcodeTerminal=_interopRequireDefault(require("qrcode-terminal")),utils=_interopRequireWildcard(require("./common/utils")),_bundle=_interopRequireDefault(require("./routes/bundle")),_debug=_interopRequireDefault(require("./routes/debug")),app=new _koa.default;app.use((0,_koaStatic.default)(_path.default.join(__dirname,"public"))),app.use(_record.record),app.use(_bundle.default.routes(),_bundle.default.allowedMethods()),app.use(_debug.default.routes(),_bundle.default.allowedMethods()),app.on("error",function(e,r){console.error("### App Server ### 服务器错误: ".concat(e.message));var u="出错了!HTTP error code: ".concat(e.status,", 出错信息: ").concat(e.message);r&&(r.body=u)}),module.exports=app; | ||
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
var _path = _interopRequireDefault(require("path")); | ||
var _koa = _interopRequireDefault(require("koa")); | ||
var _koaStatic = _interopRequireDefault(require("koa-static")); | ||
var _record = require("./middleware/record"); | ||
var _bundle = _interopRequireDefault(require("./routes/bundle")); | ||
var _debug = _interopRequireDefault(require("./routes/debug")); | ||
var app = new _koa["default"](); // 静态服务 | ||
app.use((0, _koaStatic["default"])(_path["default"].join(__dirname, 'public'))); // record | ||
app.use(_record.record); // 路由 | ||
app.use(_bundle["default"].routes(), _bundle["default"].allowedMethods()); | ||
app.use(_debug["default"].routes(), _bundle["default"].allowedMethods()); // 配置静态web服务的中间件 | ||
app.on('error', function (err, ctx) { | ||
console.error("### App Server ### \u670D\u52A1\u5668\u9519\u8BEF: ".concat(err.message)); | ||
var errMsg = "\u51FA\u9519\u4E86!HTTP error code: ".concat(err.status, ", \u51FA\u9519\u4FE1\u606F: ").concat(err.message); | ||
if (ctx) { | ||
ctx.body = errMsg; | ||
} | ||
}); | ||
module.exports = app; |
@@ -1,1 +0,400 @@ | ||
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:!0}),exports.mkdirsSync=mkdirsSync,exports.getServerIPAndPort=getServerIPAndPort,exports.getClientIPAddress=getClientIPAddress,exports.stripPrefixForIPV4MappedIPV6Address=stripPrefixForIPV4MappedIPV6Address,exports.generateQrcode=generateQrcode,exports.outputQRCodeOnTerminal=outputQRCodeOnTerminal,exports.traverseDirSync=traverseDirSync,exports.getProjectName=getProjectName,exports.getClientFromRequest=getClientFromRequest,exports.emitWSEvent=emitWSEvent,exports.getInspectorUrl=getInspectorUrl,exports.getDebugInfoFromRequest=getDebugInfoFromRequest,exports.startChrome=startChrome,exports.SOURCE=exports.getPort=exports.colorconsole=exports.LINK_MODE=void 0;var _os=_interopRequireDefault(require("os")),_net=_interopRequireDefault(require("net")),_fs=_interopRequireDefault(require("fs")),_path=_interopRequireDefault(require("path")),_chalk=_interopRequireDefault(require("chalk")),_qrcodeTerminal=_interopRequireDefault(require("qrcode-terminal")),_chromeSimpleLauncher=_interopRequireDefault(require("chrome-simple-launcher")),LINK_MODE={NULL:0,WIFI:1,ADB:2};exports.LINK_MODE=LINK_MODE;var logLevelMap={};function prependLevel(e,r){var t;!logLevelMap[e]&&((t=e.toUpperCase().substr(0,4)).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={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"),/^::.{0,4}:(\d{1,3}\.){3}\d{1,3}/.test(e)&&(e=e.replace(/^.*:/,"")),e}function generateQrcode(e){var r=getIPv4IPAddress();if(r){var t="http://".concat(r,":").concat(e);colorconsole.info(""),colorconsole.info("### App Server ### 服务器地址:".concat(t)),colorconsole.info("### App Server ### 请确保手机与App Server处于相同网段"),colorconsole.info(""),outputQRCodeOnTerminal(t)}else colorconsole.warn("### App Server ### 本机IP地址为空,无法通过WIFI调试")}function outputQRCodeOnTerminal(e){console.info(""),console.info("生成HTTP服务器的二维码: ".concat(e)),_qrcodeTerminal.default.generate(e,{small:!0})}exports.colorconsole=colorconsole;var getPort=function n(c){return new Promise(function(r,t){var o=_net.default.createServer().listen(c);o.on("error",function(e){"EADDRINUSE"===e.code?(o.close(),r(n(c+1))):t(e)}),o.on("listening",function(){o.close(),r(c)})})};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=_os.default.networkInterfaces();for(var t in e){if(Object.prototype.hasOwnProperty.call(e,t))if(e[t].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(),o=e.header["device-serial-number"],n=LINK_MODE.NULL;return"127.0.0.1"===r&&o?n=LINK_MODE.ADB:"127.0.0.1"!==r&&r!==t&&(n=LINK_MODE.WIFI),{clientIp:r,sn:o,linkMode:n}}function emitWSEvent(e,r,t){e.sockets.emit(r,t||{})}function getInspectorUrl(e){var r=e.ws,t=e.serverPort,o="http://".concat(getServerIPAndPort(t)),n="?ws=".concat(encodeURI(r),"&remoteFrontend=true&dockSide=undocked");return"".concat(o).concat("/inspector/inspector.html").concat(n)}function getDebugInfoFromRequest(e){var r=getClientFromRequest(e),t=r.sn,o=r.linkMode,n=e.body,c=n.ws,a=n.application,s=c.split(":")[1].split("/")[0];return{sn:t,linkMode:o,ws:c,application:a,devicePort:s}}function startChrome(e){return _chromeSimpleLauncher.default.launch(e)}exports.getPort=getPort;var SOURCE={IDE:"ide"};exports.SOURCE=SOURCE; | ||
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.mkdirsSync = mkdirsSync; | ||
exports.getServerIPAndPort = getServerIPAndPort; | ||
exports.getClientIPAddress = getClientIPAddress; | ||
exports.stripPrefixForIPV4MappedIPV6Address = stripPrefixForIPV4MappedIPV6Address; | ||
exports.generateQrcode = generateQrcode; | ||
exports.outputQRCodeOnTerminal = outputQRCodeOnTerminal; | ||
exports.traverseDirSync = traverseDirSync; | ||
exports.getProjectName = getProjectName; | ||
exports.getClientFromRequest = getClientFromRequest; | ||
exports.emitWSEvent = emitWSEvent; | ||
exports.getInspectorUrl = getInspectorUrl; | ||
exports.getDebugInfoFromRequest = getDebugInfoFromRequest; | ||
exports.startChrome = startChrome; | ||
exports.SOURCE = exports.getPort = exports.colorconsole = exports.LINK_MODE = void 0; | ||
var _os = _interopRequireDefault(require("os")); | ||
var _net = _interopRequireDefault(require("net")); | ||
var _fs = _interopRequireDefault(require("fs")); | ||
var _path = _interopRequireDefault(require("path")); | ||
var _chalk = _interopRequireDefault(require("chalk")); | ||
var _qrcodeTerminal = _interopRequireDefault(require("qrcode-terminal")); | ||
var _chromeSimpleLauncher = _interopRequireDefault(require("chrome-simple-launcher")); | ||
var LINK_MODE = { | ||
NULL: 0, | ||
WIFI: 1, | ||
ADB: 2 | ||
}; | ||
exports.LINK_MODE = LINK_MODE; | ||
var logLevelMap = {}; | ||
function prependLevel(levelName, args) { | ||
!logLevelMap[levelName] && function (levelNameInner) { | ||
var logLevel = levelNameInner.toUpperCase().substr(0, 4); | ||
logLevel.paddEnd && logLevel.paddEnd(4); | ||
logLevelMap[levelName] = logLevel; | ||
}(levelName); | ||
if (typeof args[0] === 'string' && args[0].length > 1 && args[0][0] !== '[') { | ||
args[0] = "[".concat(logLevelMap[levelName], "] ").concat(args[0]); | ||
} | ||
} | ||
/** | ||
* 带颜色的 info, log, warn, error, trace 的输出工具函数 | ||
*/ | ||
var colorconsole = { | ||
trace: function trace() { | ||
var _console; | ||
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { | ||
args[_key] = arguments[_key]; | ||
} | ||
prependLevel('trace', args); | ||
(_console = console).trace.apply(_console, args); | ||
}, | ||
log: function log() { | ||
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { | ||
args[_key2] = arguments[_key2]; | ||
} | ||
prependLevel('log', args); | ||
console.log(_chalk["default"].green.apply(_chalk["default"], args)); | ||
}, | ||
info: function info() { | ||
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { | ||
args[_key3] = arguments[_key3]; | ||
} | ||
prependLevel('info', args); | ||
console.info(_chalk["default"].green.apply(_chalk["default"], args)); | ||
}, | ||
warn: function warn() { | ||
var _chalk$yellow; | ||
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { | ||
args[_key4] = arguments[_key4]; | ||
} | ||
prependLevel('warn', args); | ||
console.warn((_chalk$yellow = _chalk["default"].yellow).bold.apply(_chalk$yellow, args)); | ||
}, | ||
error: function error() { | ||
var _chalk$red; | ||
for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { | ||
args[_key5] = arguments[_key5]; | ||
} | ||
prependLevel('error', args); | ||
console.error((_chalk$red = _chalk["default"].red).bold.apply(_chalk$red, args)); | ||
}, | ||
"throw": function _throw() { | ||
var _chalk$red2; | ||
throw new Error((_chalk$red2 = _chalk["default"].red).bold.apply(_chalk$red2, arguments)); | ||
} | ||
}; | ||
/** | ||
* 创建任意深度的路径的文件夹 | ||
* @param dirname | ||
* @returns {boolean} | ||
*/ | ||
exports.colorconsole = colorconsole; | ||
function mkdirsSync(dirname) { | ||
if (_fs["default"].existsSync(dirname)) { | ||
return true; | ||
} else { | ||
if (mkdirsSync(_path["default"].dirname(dirname))) { | ||
_fs["default"].mkdirSync(dirname); | ||
return true; | ||
} | ||
} | ||
} | ||
/** | ||
* 取得server端的IP和port | ||
* @param port {number} | ||
* @returns {string} | ||
*/ | ||
function getServerIPAndPort(port) { | ||
return (getIPv4IPAddress() || '127.0.0.1') + "".concat(port === 80 ? '' : ':' + port); | ||
} | ||
/** | ||
* 获取客户端ip | ||
* @param req node Http IncomingRequest Object | ||
* @returns {any|*|string} | ||
*/ | ||
function getClientIPAddress(req) { | ||
var ip = req.headers['x-forwarded-for'] || req.connection && req.connection.remoteAddress || req.socket && req.socket.remoteAddress || req.connection && req.connection.socket && req.connection.socket.remoteAddress; | ||
return stripPrefixForIPV4MappedIPV6Address(ip); | ||
} | ||
/** | ||
* 检测可能是IpV4-mapped IpV6 格式的ip | ||
* - https://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses | ||
* | ||
* @param ip IpV4-mapped IpV6 string | ||
* @returns {*} | ||
*/ | ||
function stripPrefixForIPV4MappedIPV6Address(ip) { | ||
if (/^::1$/.test(ip)) { | ||
ip = '127.0.0.1'; | ||
} | ||
if (/^::.{0,4}:(\d{1,3}\.){3}\d{1,3}/.test(ip)) { | ||
ip = ip.replace(/^.*:/, ''); | ||
} | ||
return ip; | ||
} | ||
/** | ||
* 二维码生成 | ||
* @param {*} port | ||
*/ | ||
function generateQrcode(port) { | ||
var ip = getIPv4IPAddress(); | ||
if (!ip) { | ||
colorconsole.warn('### App Server ### 本机IP地址为空,无法通过WIFI调试'); | ||
return; | ||
} | ||
var addr2 = "http://".concat(ip, ":").concat(port); | ||
colorconsole.info(''); | ||
colorconsole.info("### App Server ### \u670D\u52A1\u5668\u5730\u5740:".concat(addr2)); | ||
colorconsole.info('### App Server ### 请确保手机与App Server处于相同网段'); | ||
colorconsole.info(''); // 输出二维码地址 | ||
outputQRCodeOnTerminal(addr2); //startChrome(debugAddr) | ||
} | ||
/** | ||
* 命令行输出二维码 | ||
* @param text | ||
*/ | ||
function outputQRCodeOnTerminal(text) { | ||
console.info(''); | ||
console.info("\u751F\u6210HTTP\u670D\u52A1\u5668\u7684\u4E8C\u7EF4\u7801: ".concat(text)); | ||
_qrcodeTerminal["default"].generate(text, { | ||
small: true | ||
}); | ||
} | ||
/** | ||
* 获取可用的端口号 | ||
* @param port | ||
* @returns {Number} | ||
*/ | ||
var getPort = function getPort(port) { | ||
return (// 处理自定义端口 | ||
new Promise(function (resolve, reject) { | ||
var server = _net["default"].createServer().listen(port); | ||
server.on('error', function (err) { | ||
if (err.code === 'EADDRINUSE') { | ||
server.close(); | ||
resolve(getPort(port + 1)); | ||
} else { | ||
reject(err); | ||
} | ||
}); | ||
server.on('listening', function () { | ||
server.close(); | ||
resolve(port); | ||
}); | ||
}) | ||
); | ||
}; | ||
/** | ||
* 遍历目录文件 同步方法 | ||
* @param dir | ||
* @param files 收集的文件列表 | ||
* @param isInWhiteListFilter 判断文件是否处于白名单的回调函数 | ||
*/ | ||
exports.getPort = getPort; | ||
function traverseDirSync(dir, files, isInWhiteListFilter) { | ||
var list = _fs["default"].readdirSync(dir); | ||
list.forEach(function (file) { | ||
file = _path["default"].join(dir, file); | ||
var stat = _fs["default"].statSync(file); | ||
if (stat && stat.isDirectory()) { | ||
traverseDirSync(file, files, isInWhiteListFilter); | ||
} else { | ||
if (typeof isInWhiteListFilter === 'function' && !isInWhiteListFilter(file) || typeof isInWhiteListFilter !== 'function') { | ||
files.push(file); | ||
} | ||
} | ||
}); | ||
} | ||
/** | ||
* 获取开发者项目中的项目名称 | ||
*/ | ||
function getProjectName() { | ||
try { | ||
var pathProject = process.cwd(); // 平级目录 没有src文件夹 | ||
var pathManifest = _path["default"].join(pathProject, 'manifest.json'); | ||
var contManifest = require(pathManifest); | ||
return contManifest && contManifest["package"] || 'Bundle'; | ||
} catch (err) { | ||
colorconsole.error("### App Server ### \u83B7\u53D6\u9879\u76EE\u540D\u79F0\u51FA\u9519\uFF1A".concat(err.message)); | ||
} | ||
} | ||
/** | ||
* 获取服务器端的IP | ||
*/ | ||
function getIPv4IPAddress() { | ||
var ifaces = _os["default"].networkInterfaces(); | ||
var result; | ||
for (var prop in ifaces) { | ||
if (Object.prototype.hasOwnProperty.call(ifaces, prop)) { | ||
var iface = ifaces[prop]; | ||
iface.every(function (eachAlias) { | ||
if (eachAlias.family === 'IPv4' && !eachAlias.internal && eachAlias.address !== '127.0.0.1') { | ||
result = eachAlias; | ||
return false; | ||
} | ||
return true; | ||
}); | ||
if (result !== void 0) { | ||
break; | ||
} | ||
} | ||
} | ||
return result && result.address; | ||
} | ||
/** | ||
* 获取请求信息 | ||
* @param request | ||
* @returns {{clientIp: (any|*|string), sn, linkMode}} | ||
*/ | ||
function getClientFromRequest(request) { | ||
var clientIp = getClientIPAddress(request); | ||
var serverIp = getIPv4IPAddress(); | ||
var sn = request.header['device-serial-number']; | ||
var linkMode = LINK_MODE.NULL; | ||
if (clientIp === '127.0.0.1' && sn) { | ||
linkMode = LINK_MODE.ADB; | ||
} else if (clientIp !== '127.0.0.1' && clientIp !== serverIp) { | ||
linkMode = LINK_MODE.WIFI; | ||
} | ||
return { | ||
clientIp: clientIp, | ||
sn: sn, | ||
linkMode: linkMode | ||
}; | ||
} | ||
/** | ||
* 发送ws事件 | ||
*/ | ||
function emitWSEvent(wsSocket, evName, data) { | ||
wsSocket.sockets.emit(evName, data || {}); | ||
} | ||
/** | ||
* 提供insepctor页面的打开地址 | ||
* @param opt | ||
* @param opt.ws 手机端的websocket的地址 | ||
* @param opt.serverPort 调试器server的所用端口号 | ||
* @returns {string} | ||
*/ | ||
function getInspectorUrl(opt) { | ||
var ws = opt.ws, | ||
serverPort = opt.serverPort; | ||
var urlDomain = "http://".concat(getServerIPAndPort(serverPort)); | ||
var urlPath = '/inspector/inspector.html'; | ||
var urlQueryStr = "?ws=".concat(encodeURI(ws), "&remoteFrontend=true&dockSide=undocked"); | ||
return "".concat(urlDomain).concat(urlPath).concat(urlQueryStr); | ||
} | ||
/** | ||
* 获取请求信息 | ||
* @param request | ||
* @returns {{sn, linkMode, ws, application, devicePort}} | ||
*/ | ||
function getDebugInfoFromRequest(request) { | ||
var _getClientFromRequest = getClientFromRequest(request), | ||
sn = _getClientFromRequest.sn, | ||
linkMode = _getClientFromRequest.linkMode; | ||
var _request$body = request.body, | ||
ws = _request$body.ws, | ||
application = _request$body.application; | ||
var devicePort = ws.split(':')[1].split('/')[0]; | ||
return { | ||
sn: sn, | ||
linkMode: linkMode, | ||
ws: ws, | ||
application: application, | ||
devicePort: devicePort | ||
}; | ||
} | ||
/** | ||
* 开启一个chrome进程 | ||
*/ | ||
function startChrome(url) { | ||
return _chromeSimpleLauncher["default"].launch(url); | ||
} | ||
var SOURCE = { | ||
// 启动hapserver的类型 | ||
IDE: 'ide' | ||
}; | ||
exports.SOURCE = SOURCE; |
@@ -1,1 +0,34 @@ | ||
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:!0}),exports.createSocketServer=createSocketServer;var _socket=_interopRequireDefault(require("socket.io")),_utils=require("./utils");function createSocketServer(e,r){var o=(0,_socket.default)(e);(r.context.io=o).on("connection",function(e){o.on("error",function(e){_utils.colorconsole.error("### App Socket Server ### websocket server发生错误: ".concat(e.message))}),_utils.colorconsole.info("### App Socket Server ### websocket用户(".concat((0,_utils.stripPrefixForIPV4MappedIPV6Address)(e.conn.remoteAddress),")连入到websocket server")),e.on("disconnect",function(){_utils.colorconsole.info("### App Socket Server ### websocket client与websocket server断开"),o.emit("user disconnected")})})} | ||
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.createSocketServer = createSocketServer; | ||
var _socket = _interopRequireDefault(require("socket.io")); | ||
var _utils = require("./utils"); | ||
/** | ||
* Copyright (C) 2017, hapjs.org. All rights reserved. | ||
*/ | ||
function createSocketServer(server, app) { | ||
var io = (0, _socket["default"])(server); // 暂时绑定io | ||
app.context.io = io; | ||
io.on('connection', function (socket) { | ||
io.on('error', function (err) { | ||
_utils.colorconsole.error("### App Socket Server ### websocket server\u53D1\u751F\u9519\u8BEF: ".concat(err.message)); | ||
}); | ||
_utils.colorconsole.info("### App Socket Server ### websocket\u7528\u6237(".concat((0, _utils.stripPrefixForIPV4MappedIPV6Address)(socket.conn.remoteAddress), ")\u8FDE\u5165\u5230websocket server")); | ||
socket.on('disconnect', function () { | ||
_utils.colorconsole.info('### App Socket Server ### websocket client与websocket server断开'); | ||
io.emit('user disconnected'); | ||
}); | ||
}); | ||
} |
@@ -1,1 +0,24 @@ | ||
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _path=_interopRequireDefault(require("path")),port=process.env.PORT||"8000",clientLogPath=_path.default.join(__dirname,"../client.json"),_default={port:port,clientLogPath:clientLogPath};exports.default=_default; | ||
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _path = _interopRequireDefault(require("path")); | ||
/** | ||
* Copyright (C) 2017, hapjs.org. All rights reserved. | ||
*/ | ||
// 端口 | ||
var port = process.env.PORT || '8000'; | ||
var clientLogPath = _path["default"].join(__dirname, '../client.json'); | ||
var _default = { | ||
port: port, | ||
clientLogPath: clientLogPath | ||
}; | ||
exports["default"] = _default; |
116
lib/index.js
@@ -1,1 +0,115 @@ | ||
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault"),_regenerator=_interopRequireDefault(require("@babel/runtime/regenerator")),_asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")),_slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));require("./common/regenerator");var _http=_interopRequireDefault(require("http")),_config=_interopRequireDefault(require("./config")),_app=_interopRequireDefault(require("./app")),_utils=require("./common/utils"),digits=process.versions.node.split("."),_digits=digits=digits.map(function(e){return parseInt(e,10)}),_digits2=(0,_slicedToArray2.default)(_digits,2),major=_digits2[0],minor=_digits2[1],supportAsyncAwait=7<major||7===major&&6<=minor;function start(e,r){return _start.apply(this,arguments)}function _start(){return(_start=(0,_asyncToGenerator2.default)(_regenerator.default.mark(function e(r,t){var o,i;return _regenerator.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:r.context.config=t,o=_http.default.createServer(r.callback()),i=t.port,o.listen(i,function(){(0,_utils.generateQrcode)(i)}),o.on("error",function(e){_utils.colorconsole.error("### App Server ### 服务器错误: ".concat(e.message)),"EADDRINUSE"===e.code&&_utils.colorconsole.error("### App Server ### 服务器错误:端口 ".concat(i," 被占用, 请检查"))}),process.on("SIGINT",function(){_utils.colorconsole.info("### App Server ### SIGINT信号"),_utils.colorconsole.info("### App Server ### 退出server进程 pid: ".concat(process.pid)),process.exit()}),process.on("uncaughtException",function(e){_utils.colorconsole.error("### App Server ### 未定义的异常, 出错信息: ".concat(e.message))}),process.on("message",function(e){e&&e.source&&(r.source=e.source)});case 8:case"end":return e.stop()}},e)}))).apply(this,arguments)}supportAsyncAwait||require("@babel/register")({only:[/\bkoa-?/]}),module.exports=function(e){(e.port||e.clientLogPath)&&Object.assign(_config.default,{port:e.port,clientLogPath:e.clientLogPath}),start(_app.default,_config.default)}; | ||
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); | ||
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); | ||
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); | ||
var _http = _interopRequireDefault(require("http")); | ||
var _config = _interopRequireDefault(require("./config")); | ||
var _app = _interopRequireDefault(require("./app")); | ||
var _utils = require("./common/utils"); | ||
/** | ||
* Copyright (C) 2017, hapjs.org. All rights reserved. | ||
*/ | ||
// https://koajs.com/#async-functions-with-babel | ||
// https://babeljs.io/docs/en/babel-register/#ignores-node-modules-by-default | ||
var digits = process.versions.node.split('.'); // '01' => 1 | ||
digits = digits.map(function (num) { | ||
return parseInt(num, 10); | ||
}); | ||
var _digits = digits, | ||
_digits2 = (0, _slicedToArray2["default"])(_digits, 2), | ||
major = _digits2[0], | ||
minor = _digits2[1]; | ||
var supportAsyncAwait = major > 7 || major === 7 && minor >= 6; | ||
if (!supportAsyncAwait) { | ||
require('@babel/register')({ | ||
only: [/\bkoa-?/] | ||
}); | ||
} | ||
function start(_x, _x2) { | ||
return _start.apply(this, arguments); | ||
} | ||
/** | ||
* 启动开发服务 | ||
* | ||
* @param {Object} options - 参数配置项 | ||
* @param {String|Number} [options.port] - 服务端口 | ||
*/ | ||
function _start() { | ||
_start = (0, _asyncToGenerator2["default"])( | ||
/*#__PURE__*/ | ||
_regenerator["default"].mark(function _callee(app, config) { | ||
var server, port; | ||
return _regenerator["default"].wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
app.context.config = config; | ||
server = _http["default"].createServer(app.callback()); | ||
port = config.port; // 容错端口、请求地址 | ||
// port = await getPort(port) | ||
server.listen(port, function () { | ||
(0, _utils.generateQrcode)(port); | ||
}); | ||
server.on('error', function (err) { | ||
_utils.colorconsole.error("### App Server ### \u670D\u52A1\u5668\u9519\u8BEF: ".concat(err.message)); | ||
if (err.code === 'EADDRINUSE') { | ||
_utils.colorconsole.error("### App Server ### \u670D\u52A1\u5668\u9519\u8BEF:\u7AEF\u53E3 ".concat(port, " \u88AB\u5360\u7528, \u8BF7\u68C0\u67E5")); | ||
} | ||
}); | ||
process.on('SIGINT', function () { | ||
_utils.colorconsole.info('### App Server ### SIGINT信号'); | ||
_utils.colorconsole.info("### App Server ### \u9000\u51FAserver\u8FDB\u7A0B pid: ".concat(process.pid)); | ||
process.exit(); | ||
}); | ||
process.on('uncaughtException', function (err) { | ||
_utils.colorconsole.error("### App Server ### \u672A\u5B9A\u4E49\u7684\u5F02\u5E38, \u51FA\u9519\u4FE1\u606F: ".concat(err.message)); | ||
}); | ||
process.on('message', function (data) { | ||
if (data && data.source) { | ||
// 判断server是否来自于ide | ||
app.source = data.source; | ||
} | ||
}); | ||
case 8: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee); | ||
})); | ||
return _start.apply(this, arguments); | ||
} | ||
module.exports = function launch(options) { | ||
if (options.port || options.clientLogPath) { | ||
Object.assign(_config["default"], { | ||
port: options.port, | ||
clientLogPath: options.clientLogPath | ||
}); | ||
} // 启动服务器 | ||
start(_app["default"], _config["default"]); | ||
}; |
@@ -1,1 +0,129 @@ | ||
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:!0}),exports.record=record;var _fs=_interopRequireDefault(require("fs")),_path=_interopRequireDefault(require("path")),_utils=require("../common/utils"),CLIENT_PORT=39517;function record(e,t){var r=e.config.clientLogPath;e.config.clearRecords&&_fs.default.existsSync(r)&&(_fs.default.unlinkSync(r),_utils.colorconsole.info("### App Server ### 清空调试设备记录"));var i=(0,_utils.getClientFromRequest)(e.request),n=i.sn,s=i.clientIp,l=i.linkMode,o={sn:n,ip:s,port:CLIENT_PORT};switch(l){case _utils.LINK_MODE.WIFI:_utils.colorconsole.info("### App Server ### 记录从".concat(s,"进入的HTTP请求")),recordClient(r,o);break;case _utils.LINK_MODE.ADB:(o=getRecordClient(r,n,s))?(_utils.colorconsole.info("### App Server ### 记录从设备(".concat(n,")进入的HTTP请求")),recordClient(r,o)):_utils.colorconsole.warn("### App Server ### :记录设备(".concat(n,")失败"))}t()}function recordClient(e,t){var r=_path.default.dirname(e),i={clients:[]};if(_fs.default.existsSync(r)){if(_fs.default.existsSync(e)&&(i=JSON.parse(_fs.default.readFileSync(e).toString())).clients instanceof Array)for(i.clients=i.clients.filter(function(e){return e.ip!==t.ip||e.port!==t.port});4<i.clients.length;)i.clients.shift()}else(0,_utils.mkdirsSync)(r);i.clients.push(t),_fs.default.writeFileSync(e,JSON.stringify(i))}function getRecordClient(e,t,r){if(_fs.default.existsSync(e)){var i=JSON.parse(_fs.default.readFileSync(e).toString()).clients;return(i=i instanceof Array?i:[]).find(function(e){return e.sn===t&&e.ip===r&&e.port})}} | ||
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.record = record; | ||
var _fs = _interopRequireDefault(require("fs")); | ||
var _path = _interopRequireDefault(require("path")); | ||
var _utils = require("../common/utils"); | ||
var CLIENT_PORT = 39517; | ||
/** | ||
* 记录日志 | ||
* @param {} ctx | ||
* @param {*} next | ||
*/ | ||
function record(ctx, next) { | ||
//client.json的路径 | ||
var clientPath = ctx.config.clientLogPath; // 清空调试设备记录 | ||
var clearRecords = ctx.config.clearRecords; | ||
if (clearRecords) { | ||
if (_fs["default"].existsSync(clientPath)) { | ||
_fs["default"].unlinkSync(clientPath); | ||
_utils.colorconsole.info('### App Server ### 清空调试设备记录'); | ||
} | ||
} | ||
var _getClientFromRequest = (0, _utils.getClientFromRequest)(ctx.request), | ||
sn = _getClientFromRequest.sn, | ||
clientIp = _getClientFromRequest.clientIp, | ||
linkMode = _getClientFromRequest.linkMode; | ||
var client = { | ||
sn: sn, | ||
ip: clientIp, | ||
port: CLIENT_PORT | ||
}; | ||
switch (linkMode) { | ||
case _utils.LINK_MODE.WIFI: | ||
_utils.colorconsole.info("### App Server ### \u8BB0\u5F55\u4ECE".concat(clientIp, "\u8FDB\u5165\u7684HTTP\u8BF7\u6C42")); | ||
recordClient(clientPath, client); | ||
break; | ||
case _utils.LINK_MODE.ADB: | ||
// ADB模式下需要先读取连接时记录的信息 | ||
client = getRecordClient(clientPath, sn, clientIp); | ||
if (client) { | ||
_utils.colorconsole.info("### App Server ### \u8BB0\u5F55\u4ECE\u8BBE\u5907(".concat(sn, ")\u8FDB\u5165\u7684HTTP\u8BF7\u6C42")); | ||
recordClient(clientPath, client); | ||
} else { | ||
_utils.colorconsole.warn("### App Server ### \uFF1A\u8BB0\u5F55\u8BBE\u5907(".concat(sn, ")\u5931\u8D25")); | ||
} | ||
break; | ||
} | ||
next(); | ||
} | ||
/** | ||
* 记录地址 | ||
* @param filePath {String} | ||
* @param newClient {sn, ip, port} | ||
* | ||
*/ | ||
function recordClient(filePath, newClient) { | ||
// 目录存在 | ||
var pathParentDir = _path["default"].dirname(filePath); | ||
var tmpJSONData = { | ||
clients: [] | ||
}; | ||
if (!_fs["default"].existsSync(pathParentDir)) { | ||
(0, _utils.mkdirsSync)(pathParentDir); | ||
} else if (_fs["default"].existsSync(filePath)) { | ||
tmpJSONData = JSON.parse(_fs["default"].readFileSync(filePath).toString()); | ||
if (tmpJSONData.clients instanceof Array) { | ||
// 过滤相同的记录 | ||
tmpJSONData.clients = tmpJSONData.clients.filter(function (client) { | ||
return client.ip !== newClient.ip || client.port !== newClient.port; | ||
}); // 保留最后的4条记录,最多记录5条 | ||
while (tmpJSONData.clients.length > 4) { | ||
tmpJSONData.clients.shift(); | ||
} | ||
} | ||
} // 写入文件 | ||
tmpJSONData.clients.push(newClient); | ||
_fs["default"].writeFileSync(filePath, JSON.stringify(tmpJSONData)); | ||
} | ||
/** | ||
* 根据设备sn和ip获取设备的记录 | ||
* @param filePath | ||
* @param sn | ||
* @param ip | ||
* @returns {null} | ||
*/ | ||
function getRecordClient(filePath, sn, ip) { | ||
if (_fs["default"].existsSync(filePath)) { | ||
var _JSON$parse = JSON.parse(_fs["default"].readFileSync(filePath).toString()), | ||
clients = _JSON$parse.clients; | ||
clients = clients instanceof Array ? clients : []; | ||
return clients.find(function (client) { | ||
return client.sn === sn && client.ip === ip && client.port; | ||
}); | ||
} | ||
} |
@@ -1,1 +0,127 @@ | ||
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _regenerator=_interopRequireDefault(require("@babel/runtime/regenerator")),_asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")),_fs=_interopRequireDefault(require("fs")),_path=_interopRequireDefault(require("path")),_koaRouter=_interopRequireDefault(require("koa-router")),_utils=require("../common/utils"),router=(0,_koaRouter.default)(),RPKS_SUPPORT_VERSION_FROM=1040;function getDistFilePath(e,r,t){var a;return a=_path.default.join(e,"".concat(r,".debug.").concat(t)),_fs.default.existsSync(a)?a:(a=_path.default.join(e,"".concat(r,".release.").concat(t)),_fs.default.existsSync(a)?a:void 0)}router.get("/",function(){var t=(0,_asyncToGenerator2.default)(_regenerator.default.mark(function e(r,t){return _regenerator.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return r.response.redirect("/home/index.html"),e.next=3,t();case 3:case"end":return e.stop()}},e)}));return function(e,r){return t.apply(this,arguments)}}()),router.get("/bundle",function(){var t=(0,_asyncToGenerator2.default)(_regenerator.default.mark(function e(r,t){var a,n,u,o,i;return _regenerator.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=process.cwd(),n=(0,_utils.getProjectName)(),u=_path.default.join(a,"dist"),(o=r.request.query.platformVersion)&&RPKS_SUPPORT_VERSION_FROM<=o&&(i=getDistFilePath(u,n,"rpks")),i||(i=getDistFilePath(u,n,"rpk")),i?(r.body=_fs.default.createReadStream(i),r.set("Content-Type","application/octet-stream")):(console.error("### App Server ### 项目dist目录下不存在rpk文件:".concat(u)),r.throw("404","无法找到项目的rpk文件")),e.next=9,t();case 9:case"end":return e.stop()}},e)}));return function(e,r){return t.apply(this,arguments)}}());var _default=router;exports.default=_default; | ||
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); | ||
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); | ||
var _fs = _interopRequireDefault(require("fs")); | ||
var _path = _interopRequireDefault(require("path")); | ||
var _koaRouter = _interopRequireDefault(require("koa-router")); | ||
var _utils = require("../common/utils"); | ||
var router = (0, _koaRouter["default"])(); // 能使用rpks能力的调试器最低版本 | ||
var RPKS_SUPPORT_VERSION_FROM = 1040; | ||
/** | ||
* 首页 | ||
*/ | ||
router.get('/', | ||
/*#__PURE__*/ | ||
function () { | ||
var _ref = (0, _asyncToGenerator2["default"])( | ||
/*#__PURE__*/ | ||
_regenerator["default"].mark(function _callee(ctx, next) { | ||
return _regenerator["default"].wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
ctx.response.redirect('/home/index.html'); | ||
_context.next = 3; | ||
return next(); | ||
case 3: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee); | ||
})); | ||
return function (_x, _x2) { | ||
return _ref.apply(this, arguments); | ||
}; | ||
}()); // 下载rpk文件 | ||
router.get('/bundle', | ||
/*#__PURE__*/ | ||
function () { | ||
var _ref2 = (0, _asyncToGenerator2["default"])( | ||
/*#__PURE__*/ | ||
_regenerator["default"].mark(function _callee2(ctx, next) { | ||
var projectPath, projectName, projectDist, platformVersion, projectDistFilePath; | ||
return _regenerator["default"].wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
projectPath = process.cwd(); | ||
projectName = (0, _utils.getProjectName)(); | ||
projectDist = _path["default"].join(projectPath, 'dist'); | ||
platformVersion = ctx.request.query.platformVersion; | ||
if (platformVersion && platformVersion >= RPKS_SUPPORT_VERSION_FROM) { | ||
projectDistFilePath = getDistFilePath(projectDist, projectName, 'rpks'); | ||
} | ||
if (!projectDistFilePath) { | ||
projectDistFilePath = getDistFilePath(projectDist, projectName, 'rpk'); | ||
} | ||
if (projectDistFilePath) { | ||
ctx.body = _fs["default"].createReadStream(projectDistFilePath); | ||
ctx.set('Content-Type', 'application/octet-stream'); | ||
} else { | ||
console.error("### App Server ### \u9879\u76EEdist\u76EE\u5F55\u4E0B\u4E0D\u5B58\u5728rpk\u6587\u4EF6\uFF1A".concat(projectDist)); | ||
ctx["throw"]('404', '无法找到项目的rpk文件'); | ||
} | ||
_context2.next = 9; | ||
return next(); | ||
case 9: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2); | ||
})); | ||
return function (_x3, _x4) { | ||
return _ref2.apply(this, arguments); | ||
}; | ||
}()); | ||
/** | ||
* 获取文件路径 | ||
* @param projectDist | ||
* @param projectName | ||
* @param fileType | ||
* @returns {String} | ||
*/ | ||
function getDistFilePath(projectDist, projectName, fileType) { | ||
var projectDistFilePath; | ||
projectDistFilePath = _path["default"].join(projectDist, "".concat(projectName, ".debug.").concat(fileType)); | ||
if (_fs["default"].existsSync(projectDistFilePath)) { | ||
return projectDistFilePath; | ||
} else { | ||
projectDistFilePath = _path["default"].join(projectDist, "".concat(projectName, ".release.").concat(fileType)); | ||
if (_fs["default"].existsSync(projectDistFilePath)) { | ||
return projectDistFilePath; | ||
} | ||
} | ||
} | ||
var _default = router; | ||
exports["default"] = _default; |
@@ -1,1 +0,283 @@ | ||
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _regenerator=_interopRequireDefault(require("@babel/runtime/regenerator")),_asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")),_koaRouter=_interopRequireDefault(require("koa-router")),_qrImage=_interopRequireDefault(require("qr-image")),_utils=require("../common/utils"),router=(0,_koaRouter.default)();router.post("/",function(){var t=(0,_asyncToGenerator2.default)(_regenerator.default.mark(function e(r,t){var n,o,a,i,u,s,c,l,p;return _regenerator.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,n=r.request.body,o=r.method,a=r.path,i="ws"in n&&0<=n.ws.indexOf("inspector"),u="application"in n&&0<=n.application.indexOf("hybrid.loader"),"post"!==o.toLowerCase()||"/"!==a||!i||!u){e.next=15;break}_utils.colorconsole.warn("调试器已有重要更新,请更新调试器"),(0,_utils.emitWSEvent)(r.io,"informUpdate"),s=n.ws,c=n.application,l=r.config.port,p=(0,_utils.getInspectorUrl)({ws:s,port:l}),(0,_utils.emitWSEvent)(r.io,"appRegistered",{inspectorUrl:p,application:c}),_utils.colorconsole.info("请访问以下链接进行调试:\n\n".concat(p,"\n")),e.next=17;break;case 15:return e.next=17,t();case 17:e.next=25;break;case 19:return e.prev=19,e.t0=e.catch(0),_utils.colorconsole.error("### App Server ### 出错信息: ".concat(e.t0.message)),_utils.colorconsole.error("### App Server ### 当前调试器与toolkit不兼容,请更新调试器。"),e.next=25,t();case 25:case"end":return e.stop()}},e,null,[[0,19]])}));return function(e,r){return t.apply(this,arguments)}}()),router.post("/postwsid",function(){var t=(0,_asyncToGenerator2.default)(_regenerator.default.mark(function e(r,t){var n,o,a,i,u;return _regenerator.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return _utils.colorconsole.info("### App Server ### 收到App注册信息, 格式:\n".concat(JSON.stringify(r.request.body),"\n")),n=r.request.body,o=n.ws,a=n.application,i=r.config.port,u=(0,_utils.getInspectorUrl)({ws:o,port:i}),(0,_utils.emitWSEvent)(r.io,"appRegistered",{inspectorUrl:u,application:a}),_utils.colorconsole.info("请访问以下链接进行调试:\n\n".concat(u,"\n")),e.next=8,t();case 8:case"end":return e.stop()}},e)}));return function(e,r){return t.apply(this,arguments)}}()),router.post("/poststdbg",function(){var t=(0,_asyncToGenerator2.default)(_regenerator.default.mark(function e(r,t){var n,o,a,i,u,s,c,l,p,f,d;return _regenerator.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(n=(0,_utils.getDebugInfoFromRequest)(r.request),o=n.sn,a=n.linkMode,i=n.devicePort,u=n.application,s=n.ws,a===_utils.LINK_MODE.ADB)return e.next=6,r.adbDebugger.forwardForWsChannel(o,i);e.next=15;break;case 6:if(c=e.sent,l=c.localWsPort,p=c.err)return _utils.colorconsole.error("startDebug(): adb forward 端口映射失败: ".concat(p.message)),e.next=13,t();e.next=14;break;case 13:return e.abrupt("return");case 14:s=s.replace(i,l);case 15:if(f=r.config.port,d=(0,_utils.getInspectorUrl)({ws:s,port:f}),(0,_utils.emitWSEvent)(r.io,"appRegistered",{inspectorUrl:d,application:u}),_utils.colorconsole.info("请访问以下链接进行调试:\n\n".concat(d,"\n")),r.app.source!==_utils.SOURCE.IDE){e.next=23;break}process.send({url:d,type:"openWin"}),e.next=25;break;case 23:return e.next=25,(0,_utils.startChrome)(d);case 25:return e.next=27,t();case 27:case"end":return e.stop()}},e)}));return function(e,r){return t.apply(this,arguments)}}()),router.get("/qrcode",function(){var t=(0,_asyncToGenerator2.default)(_regenerator.default.mark(function e(r,t){var n,o,a;return _regenerator.default.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=r.config.port,o="http://".concat((0,_utils.getServerIPAndPort)(n)),a=_qrImage.default.image(o,{size:9}),r.type="image/png",r.body=a,e.next=7,t();case 7:case"end":return e.stop()}},e)}));return function(e,r){return t.apply(this,arguments)}}());var _default=router;exports.default=_default; | ||
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports["default"] = void 0; | ||
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); | ||
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); | ||
var _koaRouter = _interopRequireDefault(require("koa-router")); | ||
var _qrImage = _interopRequireDefault(require("qr-image")); | ||
var _utils = require("../common/utils"); | ||
var router = (0, _koaRouter["default"])(); | ||
/** | ||
* @desc 适配老版本的应用加载器。 | ||
* 使用老版本的应用加载器,会发送post到/, 并不会向/postwsid发请求; | ||
* 在新版本toolkit/老版本的应用加载器的组合下,用户将无法无法访问调试界面。因此提示用户更新应用加载器,并把请求转发至/postwsid; | ||
*/ | ||
router.post('/', | ||
/*#__PURE__*/ | ||
function () { | ||
var _ref = (0, _asyncToGenerator2["default"])( | ||
/*#__PURE__*/ | ||
_regenerator["default"].mark(function _callee(ctx, next) { | ||
var body, method, path, isWs, isHybridLoader, ws, application, port, inspectorUrl; | ||
return _regenerator["default"].wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
_context.prev = 0; | ||
body = ctx.request.body; | ||
method = ctx.method, path = ctx.path; | ||
isWs = 'ws' in body && body.ws.indexOf('inspector') >= 0; | ||
isHybridLoader = 'application' in body && body.application.indexOf('hybrid.loader') >= 0; | ||
if (!(method.toLowerCase() === 'post' && path === '/' && isWs && isHybridLoader)) { | ||
_context.next = 15; | ||
break; | ||
} | ||
// 通知用户更新应用加载器版本 | ||
_utils.colorconsole.warn('调试器已有重要更新,请更新调试器'); | ||
(0, _utils.emitWSEvent)(ctx.io, 'informUpdate'); | ||
ws = body.ws, application = body.application; // 生成调试url,并且向页面输出调试APP信息 | ||
port = ctx.config.port; | ||
inspectorUrl = (0, _utils.getInspectorUrl)({ | ||
ws: ws, | ||
port: port | ||
}); | ||
(0, _utils.emitWSEvent)(ctx.io, 'appRegistered', { | ||
inspectorUrl: inspectorUrl, | ||
application: application | ||
}); | ||
_utils.colorconsole.info("\u8BF7\u8BBF\u95EE\u4EE5\u4E0B\u94FE\u63A5\u8FDB\u884C\u8C03\u8BD5\uFF1A\n\n".concat(inspectorUrl, "\n")); | ||
_context.next = 17; | ||
break; | ||
case 15: | ||
_context.next = 17; | ||
return next(); | ||
case 17: | ||
_context.next = 25; | ||
break; | ||
case 19: | ||
_context.prev = 19; | ||
_context.t0 = _context["catch"](0); | ||
_utils.colorconsole.error("### App Server ### \u51FA\u9519\u4FE1\u606F: ".concat(_context.t0.message)); | ||
_utils.colorconsole.error('### App Server ### 当前调试器与toolkit不兼容,请更新调试器。'); | ||
_context.next = 25; | ||
return next(); | ||
case 25: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, null, [[0, 19]]); | ||
})); | ||
return function (_x, _x2) { | ||
return _ref.apply(this, arguments); | ||
}; | ||
}()); | ||
/** | ||
* 手机注册 | ||
*/ | ||
router.post('/postwsid', | ||
/*#__PURE__*/ | ||
function () { | ||
var _ref2 = (0, _asyncToGenerator2["default"])( | ||
/*#__PURE__*/ | ||
_regenerator["default"].mark(function _callee2(ctx, next) { | ||
var _ctx$request$body, ws, application, port, inspectorUrl; | ||
return _regenerator["default"].wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
_utils.colorconsole.info("### App Server ### \u6536\u5230App\u6CE8\u518C\u4FE1\u606F, \u683C\u5F0F:\n".concat(JSON.stringify(ctx.request.body), "\n")); | ||
_ctx$request$body = ctx.request.body, ws = _ctx$request$body.ws, application = _ctx$request$body.application; // 生成调试url,并且向页面输出调试APP信息 | ||
port = ctx.config.port; | ||
inspectorUrl = (0, _utils.getInspectorUrl)({ | ||
ws: ws, | ||
port: port | ||
}); | ||
(0, _utils.emitWSEvent)(ctx.io, 'appRegistered', { | ||
inspectorUrl: inspectorUrl, | ||
application: application | ||
}); | ||
_utils.colorconsole.info("\u8BF7\u8BBF\u95EE\u4EE5\u4E0B\u94FE\u63A5\u8FDB\u884C\u8C03\u8BD5\uFF1A\n\n".concat(inspectorUrl, "\n")); | ||
_context2.next = 8; | ||
return next(); | ||
case 8: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2); | ||
})); | ||
return function (_x3, _x4) { | ||
return _ref2.apply(this, arguments); | ||
}; | ||
}()); | ||
/** | ||
* 开始调试 | ||
*/ | ||
router.post('/poststdbg', | ||
/*#__PURE__*/ | ||
function () { | ||
var _ref3 = (0, _asyncToGenerator2["default"])( | ||
/*#__PURE__*/ | ||
_regenerator["default"].mark(function _callee3(ctx, next) { | ||
var params, sn, linkMode, devicePort, application, ws, _ref4, localWsPort, err, port, inspectorUrl; | ||
return _regenerator["default"].wrap(function _callee3$(_context3) { | ||
while (1) { | ||
switch (_context3.prev = _context3.next) { | ||
case 0: | ||
params = (0, _utils.getDebugInfoFromRequest)(ctx.request); | ||
sn = params.sn, linkMode = params.linkMode, devicePort = params.devicePort, application = params.application; | ||
ws = params.ws; // ADB调试模式 | ||
if (!(linkMode === _utils.LINK_MODE.ADB)) { | ||
_context3.next = 15; | ||
break; | ||
} | ||
_context3.next = 6; | ||
return ctx.adbDebugger.forwardForWsChannel(sn, devicePort); | ||
case 6: | ||
_ref4 = _context3.sent; | ||
localWsPort = _ref4.localWsPort; | ||
err = _ref4.err; | ||
if (!err) { | ||
_context3.next = 14; | ||
break; | ||
} | ||
_utils.colorconsole.error("startDebug(): adb forward \u7AEF\u53E3\u6620\u5C04\u5931\u8D25: ".concat(err.message)); | ||
_context3.next = 13; | ||
return next(); | ||
case 13: | ||
return _context3.abrupt("return"); | ||
case 14: | ||
// ws中是手机的端口号,ADB模式下需要替换为forward对应的pc端口 | ||
ws = ws.replace(devicePort, localWsPort); | ||
case 15: | ||
// 生成调试url,并且向页面输出调试APP信息 | ||
port = ctx.config.port; | ||
inspectorUrl = (0, _utils.getInspectorUrl)({ | ||
ws: ws, | ||
port: port | ||
}); | ||
(0, _utils.emitWSEvent)(ctx.io, 'appRegistered', { | ||
inspectorUrl: inspectorUrl, | ||
application: application | ||
}); | ||
_utils.colorconsole.info("\u8BF7\u8BBF\u95EE\u4EE5\u4E0B\u94FE\u63A5\u8FDB\u884C\u8C03\u8BD5\uFF1A\n\n".concat(inspectorUrl, "\n")); | ||
if (!(ctx.app.source === _utils.SOURCE.IDE)) { | ||
_context3.next = 23; | ||
break; | ||
} | ||
// 判断hapserver是否由ide启动 | ||
process.send({ | ||
url: inspectorUrl, | ||
type: 'openWin' | ||
}); | ||
_context3.next = 25; | ||
break; | ||
case 23: | ||
_context3.next = 25; | ||
return (0, _utils.startChrome)(inspectorUrl); | ||
case 25: | ||
_context3.next = 27; | ||
return next(); | ||
case 27: | ||
case "end": | ||
return _context3.stop(); | ||
} | ||
} | ||
}, _callee3); | ||
})); | ||
return function (_x5, _x6) { | ||
return _ref3.apply(this, arguments); | ||
}; | ||
}()); | ||
/** | ||
* 生成二维码 | ||
*/ | ||
router.get('/qrcode', | ||
/*#__PURE__*/ | ||
function () { | ||
var _ref5 = (0, _asyncToGenerator2["default"])( | ||
/*#__PURE__*/ | ||
_regenerator["default"].mark(function _callee4(ctx, next) { | ||
var port, qrText, image; | ||
return _regenerator["default"].wrap(function _callee4$(_context4) { | ||
while (1) { | ||
switch (_context4.prev = _context4.next) { | ||
case 0: | ||
port = ctx.config.port; | ||
qrText = "http://".concat((0, _utils.getServerIPAndPort)(port)); | ||
image = _qrImage["default"].image(qrText, { | ||
size: 9 | ||
}); | ||
ctx.type = 'image/png'; | ||
ctx.body = image; | ||
_context4.next = 7; | ||
return next(); | ||
case 7: | ||
case "end": | ||
return _context4.stop(); | ||
} | ||
} | ||
}, _callee4); | ||
})); | ||
return function (_x7, _x8) { | ||
return _ref5.apply(this, arguments); | ||
}; | ||
}()); | ||
var _default = router; | ||
exports["default"] = _default; |
{ | ||
"name": "quickgame-server", | ||
"version": "0.1.10", | ||
"version": "0.1.11", | ||
"description": "quickgame server", | ||
@@ -12,15 +12,14 @@ "main": "lib/index.js", | ||
"license": "ISC", | ||
"keywords": [ | ||
"quickgame", | ||
"game", | ||
"quickgame-server" | ||
], | ||
"devDependencies": { | ||
"@babel/cli": "^7.2.0", | ||
"@babel/core": "^7.2.0", | ||
"@babel/preset-env": "^7.2.0", | ||
"adb-commander": "0.0.7", | ||
"adb-devices-emitter": "0.0.2", | ||
"chalk": "^2.4.1", | ||
"http": "0.0.0", | ||
"opn": "^5.4.0", | ||
"os": "^0.1.1", | ||
"util": "^0.11.1" | ||
"chalk": "^2.4.1" | ||
}, | ||
"dependencies": { | ||
"@babel/runtime": "^7.4.4", | ||
"chrome-simple-launcher": "0.0.7", | ||
@@ -35,3 +34,3 @@ "koa": "^2.6.2", | ||
}, | ||
"gitHead": "f9a313d1aef7b857f076adf011c3d529d0d03dce" | ||
"gitHead": "4aad92a79f251386082e0c224de2db14cb94a297" | ||
} |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
No README
QualityPackage does not have a README. This may indicate a failed publish or a low quality package.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 3 instances in 1 package
104300
3
13
1146
2
1
12
9
3
+ Added@babel/runtime@^7.4.4
+ Added@babel/runtime@7.26.7(transitive)
+ Addedregenerator-runtime@0.14.1(transitive)