@quick-game/cli
Version:
Command line interface for rapid qg development
138 lines (127 loc) • 5.15 kB
JavaScript
;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.initServer = initServer;_Object$defineProperty(exports, "notifyUpdate", { enumerable: true, get: function () {return _notify.default;} });exports.stopServer = stopServer;var _now = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/date/now"));var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));var _koa = _interopRequireDefault(require("koa"));
var _path = _interopRequireDefault(require("path"));
var _koaStatic = _interopRequireDefault(require("koa-static"));
var _http = _interopRequireDefault(require("http"));
var _internalIp = _interopRequireDefault(require("internal-ip"));
var _koaBodyparser = _interopRequireDefault(require("koa-bodyparser"));
var _qrcode = _interopRequireDefault(require("qrcode"));
var _koaRouter = _interopRequireDefault(require("koa-router"));
var _portfinder = _interopRequireDefault(require("portfinder"));
var _router = require("./router.js");
var _logger = require("./logger.js");
var _recordClient = require("./record-client.js");
var _notify = _interopRequireDefault(require("./notify.js"));
var _wsserver = require("./wsserver.js");
var _index = require("./adb/index.js");
var _requestIde = require("../utils/requestIde.js");
var _os = _interopRequireDefault(require("os"));
const compress = require('koa-compress');
let server = null;
async function initServer(args) {
const app = new _koa.default();
const route = new _koaRouter.default();
const port = await _portfinder.default.getPortPromise();
app.use((0, _koaBodyparser.default)());
app.use(compress());
app.use((0, _koaStatic.default)(_path.default.resolve(__dirname, './client'), {
maxAge: 2592000000, // 缓存时间为一年
gzip: true,
setHeaders: (res) => {
res.setHeader('Cache-Control', 'public, max-age=2592000');
res.setHeader('Expires', new Date((0, _now.default)() + 2592000000).toUTCString());
}
}));
app.use(_logger.logger);
app.use(route.get('/', _router.indexRouter).routes());
app.use(route.get('/bundle', _router.bundleRouter).routes());
app.use(route.post('/poststdbg', (ctx) => (0, _router.poststdbgRouter)(ctx, args)).routes());
app.use(route.get('/debug', _router.debugRouter).routes());
server = _http.default.Server(app.callback());
await beforeStart(server, app, port, args.ide);
app.on('error', (err, ctx) => {
console.error('server error', err);
});
let ip = _internalIp.default.v4.sync();
//ip获取失败时重新判断
if (!ip) {
const nets = _os.default.networkInterfaces();
let ipv4;
for (const name of (0, _keys.default)(nets)) {
for (const net of nets[name]) {
if (net.family === 'IPv4' && !net.internal) {
ipv4 = net.address;
break;
}
}
if (ipv4) break;
}
ip = ipv4;
}
const url = `http://${ip}:${port}`;
// 下面的log不能随便改,否则cocos IDE预览会有问题
server.listen(port, () => {
console.log(`地址 ${url}`);
console.log(`若二维码无法识别,可打开以上地址尝试~`);
console.log('请确保手机与App Server处于相同网段!');
_qrcode.default.toString(url, { type: 'terminal', small: true }, function (err, url) {
if (err) {
// Handle the error, e.g., log it or deal with it appropriately
console.error('Failed to generate QR code:', err);
return; // Early return to prevent further processing
}
console.log(url);
});
if (args.ide) {
(0, _requestIde.fetchInfo)({
url,
port
}, 'startDebug');
}
});
// 监听进程终止信号
process.on('SIGINT', handleShutdown);
process.on('SIGTERM', handleShutdown);
async function handleShutdown() {
console.log('\n### App Server ### 服务器即将关闭');
if (args.ide) {
await (0, _requestIde.fetchInfo)({
url,
port
}, 'stopDebug');
}
process.exit(0);
}
return url;
}
function stopServer() {
return new _promise.default((resolve) => {
if (!server) {
resolve({ stopServerError: 'no server' });
return;
}
try {
server.close((data) => {
resolve({ stopServerError: data });
});
} catch (err) {
console.error(`### App Server ### 服务器关闭失败: ${err.message}`);
resolve({ stopServerError: err });
throw err;
}
});
}
async function beforeStart(server, app, port, isIde) {
await (0, _wsserver.createSocketServer)(server, app);
if (isIde) {
console.log("### App Server ### 这是IDE环境");
return;
}
(0, _index.createADBDebugger)({
pathClientLog: _recordClient.clientRecordPath,
localReversePort: port
}).then((data) => {
app.context.adbDebugger = data;
}).catch((err) => {
console.error(err);
});
}