@honor-minigame/cli
Version:
honor minigame pack cli
109 lines (93 loc) • 2.9 kB
JavaScript
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 };