feat: add web backend — Express REST API, WebSocket, full wiring in entry point

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
saopig1andClaude Opus 4.6 committed 2026-03-30 00:47:19 +08:00
1 parent e5d5185f14
commit 0b54809113
7 files changed
+633

No files matched your search

+48
View File
@@ -3,6 +3,12 @@ import { fileURLToPath } from "node:url";
import { loadConfig, saveConfig } from "./data/config.js";
import { createDatabase } from "./data/database.js";
import { createLogger } from "./logger.js";
import { createApiServerManager } from "./music/api-server.js";
import { NeteaseProvider } from "./music/netease.js";
import { QQMusicProvider } from "./music/qq.js";
import { createCookieStore } from "./music/auth.js";
import { BotManager } from "./bot/manager.js";
import { createWebServer } from "./web/server.js";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const ROOT_DIR = path.resolve(__dirname, "..");
@@ -10,6 +16,8 @@ const DATA_DIR = path.join(ROOT_DIR, "data");
const CONFIG_PATH = path.join(ROOT_DIR, "config.json");
const DB_PATH = path.join(DATA_DIR, "tsmusicbot.db");
const LOG_DIR = path.join(DATA_DIR, "logs");
const COOKIE_DIR = path.join(DATA_DIR, "cookies");
const STATIC_DIR = path.join(ROOT_DIR, "web", "dist");
async function main() {
const config = loadConfig(CONFIG_PATH);
@@ -18,10 +26,50 @@ async function main() {
const logger = createLogger(LOG_DIR);
const db = createDatabase(DB_PATH);
const apiServer = createApiServerManager(
{ neteasePort: config.neteaseApiPort, qqMusicPort: config.qqMusicApiPort },
logger
);
await apiServer.start();
const neteaseProvider = new NeteaseProvider(apiServer.getNeteaseBaseUrl());
const qqProvider = new QQMusicProvider(apiServer.getQQMusicBaseUrl());
const cookieStore = createCookieStore(COOKIE_DIR);
const neteaseCookie = cookieStore.load("netease");
if (neteaseCookie) neteaseProvider.setCookie(neteaseCookie);
const qqCookie = cookieStore.load("qq");
if (qqCookie) qqProvider.setCookie(qqCookie);
const botManager = new BotManager(
neteaseProvider,
qqProvider,
db,
config,
logger
);
await botManager.loadSavedBots();
const webServer = createWebServer({
port: config.webPort,
botManager,
neteaseProvider,
qqProvider,
database: db,
config,
logger,
staticDir: STATIC_DIR,
});
await webServer.start();
logger.info({ webPort: config.webPort }, "TSMusicBot started");
logger.info(`WebUI: http://localhost:${config.webPort}`);
const shutdown = () => {
logger.info("Shutting down...");
botManager.shutdown();
webServer.stop();
apiServer.stop();
db.close();
process.exit(0);
};