Files
lyroc/backend-deno/main.ts

80 lines
1.8 KiB
TypeScript

/**
* lyroc 后端主程序 (Deno + Hono 版本)
* 负责初始化应用和启动服务器
*/
import { Hono } from "hono";
import { ConnectionManager } from "./modules/websocket_manager.ts";
import {
startBackgroundTask,
stopBackgroundTask,
} from "./modules/background_tasks.ts";
import { registerRoutes } from "./modules/routes.ts";
import { initDB } from "./modules/lyrics.ts";
// 创建 Hono 应用
const app = new Hono();
// 创建 WebSocket 连接管理器
const manager = new ConnectionManager();
// 注册路由
registerRoutes(app, manager);
// 启动时初始化
async function startup() {
console.log("正在启动 API 服务...");
try {
// 初始化数据库
await initDB();
console.log("数据库初始化完成");
// 启动后台任务
startBackgroundTask(manager);
console.log("后台任务已启动");
} catch (error) {
console.error(`启动失败: ${error}`);
}
}
// 关闭时清理
function shutdown() {
console.log("正在关闭服务...");
try {
// 停止后台任务
stopBackgroundTask();
console.log("后台任务已停止");
// 关闭所有 WebSocket 连接
manager.closeAllConnections();
console.log("所有连接已关闭");
} catch (error) {
console.error(`关闭时出错: ${error}`);
}
}
// 处理进程信号
Deno.addSignalListener("SIGINT", () => {
console.log("收到 SIGINT 信号,正在关闭...");
shutdown();
Deno.exit(0);
});
Deno.addSignalListener("SIGTERM", () => {
console.log("收到 SIGTERM 信号,正在关闭...");
shutdown();
Deno.exit(0);
});
// 启动应用
await startup();
// 获取端口号
const port = Number(Deno.env.get("PORT") ?? 5005);
console.log(`启动后端服务器在端口: ${port}`);
// 启动服务器
Deno.serve({ port }, app.fetch);