UNPKG

@honor-minigame/cli

Version:

honor minigame pack cli

109 lines (93 loc) 2.9 kB
import Koa from 'koa'; import Router from 'koa-router'; import portfinder from 'portfinder'; import bodyParser from 'koa-bodyparser'; import compress from 'koa-compress'; import Static from 'koa-static'; import { logger } from './logger.js'; import { rpkDebugRouter } from './router.js'; import http from 'http'; import internalIp from 'internal-ip' import QRCode from 'qrcode' import os from 'os'; import { generateRpkLink } from '../utils/fsUtils.js' let server = null async function initServer(args) { const app = new Koa() const route = new Router() const port = await portfinder.getPortPromise() app.use(bodyParser()) app.use(compress()) app.use(route.get(/\.rpk$/, rpkDebugRouter).routes()) app.use(Static(args['DISTPROJECT'], { maxAge: 1000, // 缓存时间为1秒 gzip: true, setHeaders: (res) => { res.setHeader('Cache-Control', 'public, max-age=1') res.setHeader('Expires', new Date(Date.now() + 1000).toUTCString()) } })) app.use(logger) server = http.Server(app.callback()) // 监听错误 app.on('error', (err, ctx) => { console.error('server error', err) }) // const isIde = args && args.ide let ip = internalIp.v4.sync() //ip获取失败时重新判断 if (!ip){ const nets = os.networkInterfaces(); let ipv4; for (const name of Object.keys(nets)) { for (const net of nets[name]) { if (net.family === 'IPv4' && !net.internal) { ipv4 = net.address; break; } } if (ipv4) break; } ip = ipv4 } const filename = await generateRpkLink(args['DISTPROJECT'], 'rpk') const url = `http://${ip}:${port}/${filename}` server.listen(port, () => { console.log(`地址 ${url}`) console.log(`若二维码无法识别,可打开以上地址尝试~`) console.log('请确保手机与App Server处于相同网段!') QRCode.toString(url, { type: 'terminal', small: true }, function (err, url) { if (err) { console.error('生成二维码错误:', err) return; } console.log(url) }) }) // 监听进程终止信号 process.on('SIGINT', handleShutdown) process.on('SIGTERM', handleShutdown) async function handleShutdown () { console.log('\n### App Server ### 服务器即将关闭') process.exit(0) } return url } function stopServer () { return new Promise(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 } }) } export { initServer, stopServer };