const express = require('express'); const http = require('http'); const { Server } = require('socket.io'); const path = require('path'); const app = express(); const server = http.createServer(app); const io = new Server(server, { pingTimeout: 60000, pingInterval: 25000, }); app.use(express.static(path.join(__dirname, 'public'))); // pin -> { issuedCount, calledCount } const sessions = {}; function sessionState(pin) { const s = sessions[pin] || { issuedCount: 0, calledCount: 0 }; return { issuedCount: s.issuedCount, calledCount: s.calledCount, waitingCount: s.issuedCount - s.calledCount, }; } io.on('connection', (socket) => { let pin = null; socket.on('join', ({ pin: p }) => { if (!p || typeof p !== 'string' || p.length < 4) { socket.emit('join_error', 'PIN은 최소 4자리 이상이어야 합니다.'); return; } pin = p.trim(); if (!sessions[pin]) { sessions[pin] = { issuedCount: 0, calledCount: 0 }; } socket.join(pin); socket.emit('join_ok', sessionState(pin)); }); socket.on('issue_ticket', () => { if (!pin || !sessions[pin]) return; sessions[pin].issuedCount += 1; const ticketNumber = sessions[pin].issuedCount; const state = sessionState(pin); socket.emit('ticket_issued', { ticketNumber, waitingCount: state.waitingCount }); io.to(pin).emit('state_update', state); }); socket.on('call_next', () => { if (!pin || !sessions[pin]) return; const s = sessions[pin]; if (s.calledCount >= s.issuedCount) return; s.calledCount += 1; io.to(pin).emit('state_update', sessionState(pin)); }); socket.on('reset', () => { if (!pin || !sessions[pin]) return; sessions[pin] = { issuedCount: 0, calledCount: 0 }; io.to(pin).emit('state_update', sessionState(pin)); io.to(pin).emit('reset_done'); }); }); const PORT = process.env.PORT || 3000; server.listen(PORT, '0.0.0.0', () => { console.log(`Queue server running on port ${PORT}`); });