feat: separazione display e controller su porte distinte (5173/3001)

- Creati entry point separati per il Display (porta 5173) e il Controller (porta 3001).
- Aggiunti controller.html e src/controller-main.js per l'app di controllo remoto.
- Semplificato src/main.js per montare direttamente DisplayPage, rimuovendo vue-router.
- Implementato un server di sviluppo proxy per il controller in vite-plugin-websocket.js.
- Aggiornato server.js per gestire due istanze Express (display e controller) in produzione.
- Aggiornata la configurazione di Vite per il supporto alla build multi-pagina
This commit is contained in:
2026-02-10 23:45:58 +01:00
parent 9598d587c6
commit f84f3805cd
10 changed files with 211 additions and 53 deletions

View File

@@ -11,24 +11,72 @@ const __dirname = dirname(__filename)
// --- Configurazione del server ---
const app = express()
const PORT = process.env.PORT || 3000
const DISPLAY_PORT = process.env.PORT || 3000
const CONTROLLER_PORT = process.env.CONTROLLER_PORT || 3001
// ========================================
// Server Display (porta principale)
// ========================================
const displayApp = express()
// Espone i file generati dalla build di Vite.
app.use(express.static(join(__dirname, 'dist')))
displayApp.use(express.static(join(__dirname, 'dist')))
// Fallback per SPA: restituisce `index.html` per tutte le route che non puntano a file statici.
app.get('/{*splat}', (_req, res) => {
// Fallback per SPA: restituisce `index.html` per tutte le route.
displayApp.get('/{*splat}', (_req, res) => {
res.sendFile(join(__dirname, 'dist', 'index.html'))
})
const server = createServer(app)
const displayServer = createServer(displayApp)
// Inizializza il server WebSocket con la logica di gioco.
const wss = new WebSocketServer({ server })
// Inizializza il server WebSocket condiviso.
const wss = new WebSocketServer({ noServer: true })
setupWebSocketHandler(wss)
// Avvia il server HTTP.
server.listen(PORT, '0.0.0.0', () => {
printServerInfo(PORT)
displayServer.on('upgrade', (request, socket, head) => {
const pathname = new URL(request.url, `http://${request.headers.host}`).pathname
if (pathname === '/ws') {
wss.handleUpgrade(request, socket, head, (ws) => {
wss.emit('connection', ws, request)
})
} else {
socket.destroy()
}
})
displayServer.listen(DISPLAY_PORT, '0.0.0.0', () => {
console.log(`[Display] Server running on port ${DISPLAY_PORT}`)
})
// ========================================
// Server Controller (porta separata)
// ========================================
const controllerApp = express()
// Espone gli stessi file statici della build.
controllerApp.use(express.static(join(__dirname, 'dist')))
// Fallback: restituisce `controller.html` per tutte le route.
controllerApp.get('/{*splat}', (_req, res) => {
res.sendFile(join(__dirname, 'dist', 'controller.html'))
})
const controllerServer = createServer(controllerApp)
// Gestisce l'upgrade WebSocket anche sulla porta del controller.
controllerServer.on('upgrade', (request, socket, head) => {
const pathname = new URL(request.url, `http://${request.headers.host}`).pathname
if (pathname === '/ws') {
wss.handleUpgrade(request, socket, head, (ws) => {
wss.emit('connection', ws, request)
})
} else {
socket.destroy()
}
})
controllerServer.listen(CONTROLLER_PORT, '0.0.0.0', () => {
printServerInfo(DISPLAY_PORT, CONTROLLER_PORT)
})