|
|
@@ -3,17 +3,28 @@ import fs from 'node:fs/promises';
|
|
|
import { URL } from 'node:url';
|
|
|
import { Transform } from 'node:stream';
|
|
|
import { Readable } from 'node:stream';
|
|
|
+import { pipeline } from 'node:stream/promises';
|
|
|
import { Hono } from 'hono';
|
|
|
+import { cors } from 'hono/cors'
|
|
|
import { logger } from 'hono/logger';
|
|
|
import { createServer as createNodeServer } from 'node:http';
|
|
|
import process from 'node:process';
|
|
|
-import { createAdaptorServer } from '@hono/node-server'
|
|
|
+import { createAdaptorServer } from '@hono/node-server'
|
|
|
+// 新增:导入 Socket.IO
|
|
|
+import { Server } from 'socket.io';
|
|
|
|
|
|
// 创建 Hono 应用
|
|
|
const app = new Hono();
|
|
|
|
|
|
-// 全局使用 Hono 日志中间件
|
|
|
+// 全局使用 Hono 日志中间件(记录所有请求)
|
|
|
app.use('*', logger());
|
|
|
+app.use('*', cors(
|
|
|
+ // {
|
|
|
+ // origin: ['http://localhost:3000'],
|
|
|
+ // allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
|
|
|
+ // credentials: true
|
|
|
+ // }
|
|
|
+))
|
|
|
|
|
|
// 常量定义
|
|
|
const isProduction = process.env.NODE_ENV === 'production';
|
|
|
@@ -34,13 +45,27 @@ console.log(`基础URL解析完成: ${baseUrl.href}`);
|
|
|
|
|
|
// 创建服务器实例
|
|
|
console.log('正在创建服务器实例...');
|
|
|
-const parentServer = createAdaptorServer({
|
|
|
- fetch: app.fetch,
|
|
|
- createServer: createNodeServer,
|
|
|
- port: port,
|
|
|
+const parentServer = createAdaptorServer({
|
|
|
+ fetch: app.fetch,
|
|
|
+ createServer: createNodeServer,
|
|
|
+ port: port,
|
|
|
})
|
|
|
console.log('服务器实例创建成功');
|
|
|
|
|
|
+// 新增:初始化 Socket.IO 服务器
|
|
|
+console.log('正在初始化 Socket.IO 服务器...');
|
|
|
+const io = new Server(parentServer, {
|
|
|
+ // // 配置 CORS,根据实际需求调整
|
|
|
+ // cors: {
|
|
|
+ // origin: isProduction ? process.env.FRONTEND_URL || false : "http://localhost:8080",
|
|
|
+ // methods: ["GET", "POST"],
|
|
|
+ // credentials: true
|
|
|
+ // },
|
|
|
+ // // 路径配置,避免与其他路由冲突
|
|
|
+ // path: `${base}socket.io`
|
|
|
+});
|
|
|
+console.log('Socket.IO 服务器初始化完成');
|
|
|
+
|
|
|
// 生产环境中间件
|
|
|
let compressionMiddleware;
|
|
|
let sirvMiddleware;
|
|
|
@@ -95,6 +120,49 @@ const processDevTemplate = async (template) => {
|
|
|
return template;
|
|
|
};
|
|
|
|
|
|
+// 新增:加载 Socket.IO 中间件和路由
|
|
|
+if (!isProduction) {
|
|
|
+ console.log('开发环境: 从 Vite 加载 Socket.IO 路由和中间件...');
|
|
|
+ try {
|
|
|
+ const socketModule = await vite.ssrLoadModule('./src/server/socket.ts');
|
|
|
+
|
|
|
+ // 应用认证中间件
|
|
|
+ if (socketModule.authMiddleware) {
|
|
|
+ console.log('应用 Socket.IO 认证中间件');
|
|
|
+ io.use(socketModule.authMiddleware);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 应用路由
|
|
|
+ if (socketModule.default) {
|
|
|
+ console.log('注册 Socket.IO 路由处理');
|
|
|
+ socketModule.default(io);
|
|
|
+ }
|
|
|
+ console.log('Socket.IO 路由和中间件加载完成');
|
|
|
+ } catch (err) {
|
|
|
+ console.error('开发环境加载 Socket.IO 模块失败:', err);
|
|
|
+ }
|
|
|
+} else {
|
|
|
+ console.log('生产环境: 加载编译后的 Socket.IO 路由和中间件...');
|
|
|
+ try {
|
|
|
+ const socket = (await import('./dist/socket/socket.js')).default;
|
|
|
+
|
|
|
+ // 应用认证中间件
|
|
|
+ if (socket.authMiddleware) {
|
|
|
+ console.log('应用 Socket.IO 认证中间件');
|
|
|
+ io.use(socket.authMiddleware);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 应用路由
|
|
|
+ if (socket.default) {
|
|
|
+ console.log('注册 Socket.IO 路由处理');
|
|
|
+ socket.default(io);
|
|
|
+ }
|
|
|
+ console.log('Socket.IO 路由和中间件加载完成');
|
|
|
+ } catch (err) {
|
|
|
+ console.error('加载 Socket.IO 模块失败:', err);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// 生产环境模板处理函数 - 仅处理资源路径替换
|
|
|
const processProdTemplate = async (template) => {
|
|
|
console.log('生产环境: 处理模板资源路径...');
|
|
|
@@ -310,6 +378,7 @@ parentServer.listen(port, () => {
|
|
|
console.log('========================================');
|
|
|
console.log(`服务器已成功启动!`);
|
|
|
console.log(`访问地址: http://localhost:${port}`);
|
|
|
+ console.log(`Socket.IO 路径: ${base}socket.io`);
|
|
|
console.log(`环境: ${isProduction ? '生产环境' : '开发环境'}`);
|
|
|
console.log('========================================');
|
|
|
})
|