diff --git a/package.json b/package.json index 89da04a..ca306b3 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "passport": "^0.7.0", "passport-kakao": "^1.0.1", "prisma": "^6.1.0", + "socket.io": "^4.8.1", "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^5.0.1", "ws": "^8.18.1" diff --git a/src/app.ts b/src/app.ts index b6d4691..39155b5 100644 --- a/src/app.ts +++ b/src/app.ts @@ -18,6 +18,7 @@ import cookieParser from 'cookie-parser'; import {prisma} from './db.config.js'; import {RegisterRoutes} from './routers/tsoaRoutes.js'; import {authRouter} from './routers/auth.router.js'; +import './ws-study-status-server.js'; dotenv.config(); diff --git a/src/ws-study-status-server.ts b/src/ws-study-status-server.ts new file mode 100644 index 0000000..881b03c --- /dev/null +++ b/src/ws-study-status-server.ts @@ -0,0 +1,33 @@ +import express, {Express} from 'express'; +import {createServer} from 'http'; +import {Server as SocketIOServer, Socket} from 'socket.io'; + +const app: Express = express(); +const httpServer = createServer(app); +const io = new SocketIOServer(httpServer, { + cors: {origin: '*'}, +}); + +// REST API 예시 라우트 +app.get('/api/hello', (req, res) => { + res.json({message: 'Hello from REST API!'}); +}); + +let timer = 0; +const status = '게임중'; + +// 1초마다 타이머 값 증가 및 브로드캐스트 +setInterval(() => { + timer += 1; + io.emit('timer', {status, timer}); +}, 1000); + +io.on('connection', (socket: Socket) => { + // 클라이언트가 새로 접속하면 현재 상태 전송 + socket.emit('timer', {status, timer}); +}); + +const PORT = 3000; // REST와 웹소켓 모두 3000번 포트에서 운영 +httpServer.listen(PORT, () => { + console.log(`서버가 ${PORT} 포트에서 REST와 WebSocket을 함께 운영 중`); +});