Spaces:
Sleeping
Sleeping
Update server.js
Browse files
server.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
| 1 |
-
// server.js — HF Spaces ready (PORT + 0.0.0.0) with blackout + rooms
|
| 2 |
const path = require('path');
|
| 3 |
const express = require('express');
|
| 4 |
const http = require('http');
|
|
@@ -12,59 +11,40 @@ const io = new Server(server, {
|
|
| 12 |
cors: { origin: true }
|
| 13 |
});
|
| 14 |
|
|
|
|
| 15 |
app.use(express.static(path.join(__dirname, 'public')));
|
| 16 |
|
| 17 |
-
//
|
| 18 |
-
app.get('/', (req, res) => res.redirect('/admin'));
|
| 19 |
app.get('/admin', (req, res) => res.sendFile(path.join(__dirname, 'public', 'admin.html')));
|
| 20 |
app.get('/client', (req, res) => res.sendFile(path.join(__dirname, 'public', 'client.html')));
|
| 21 |
|
| 22 |
-
// Hugging Face sets PORT (usually 7860). Bind to 0.0.0.0 for container.
|
| 23 |
const HOST = '0.0.0.0';
|
| 24 |
const PORT = process.env.PORT || 7860;
|
| 25 |
|
| 26 |
-
//
|
| 27 |
-
function getRoom(socket) { return (socket.handshake.query.room || 'default').toString(); }
|
| 28 |
-
function getRole(socket) { return (socket.handshake.query.role || 'client').toString(); }
|
| 29 |
-
|
| 30 |
io.on('connection', (socket) => {
|
| 31 |
-
const room =
|
| 32 |
-
const role =
|
| 33 |
socket.join(room);
|
| 34 |
|
| 35 |
-
const emitStats = () => {
|
| 36 |
-
const sockets = io.sockets.adapter.rooms.get(room) || new Set();
|
| 37 |
-
const clients = Array.from(sockets).map(id => io.sockets.sockets.get(id));
|
| 38 |
-
const numAdmins = clients.filter(s => s?.handshake?.query?.role === 'admin').length;
|
| 39 |
-
const numClients = clients.length - numAdmins;
|
| 40 |
-
io.to(room).emit('stats', { numAdmins, numClients });
|
| 41 |
-
};
|
| 42 |
-
emitStats();
|
| 43 |
-
|
| 44 |
-
// NTP-like sync
|
| 45 |
socket.on('sync:ping', (msg = {}) => {
|
| 46 |
const t1 = Date.now();
|
| 47 |
socket.emit('sync:pong', { t0: msg.t0, t1, t2: Date.now() });
|
| 48 |
});
|
| 49 |
|
| 50 |
-
//
|
| 51 |
-
socket.on('admin:start', ({ delayMs = 3000, label = '' }
|
| 52 |
-
if (role !== 'admin') return;
|
| 53 |
const startAt = Date.now() + Math.max(500, Number(delayMs));
|
| 54 |
io.to(room).emit('cmd', { type: 'start', startAt, label });
|
| 55 |
});
|
| 56 |
-
socket.on('admin:stop',
|
| 57 |
-
socket.on('admin:reset', () => {
|
| 58 |
-
|
| 59 |
-
// Blackout toggle
|
| 60 |
-
socket.on('admin:blackout', ({ on = true } = {}) => {
|
| 61 |
-
if (role !== 'admin') return;
|
| 62 |
-
io.to(room).emit('cmd', { type: 'blackout', on: !!on });
|
| 63 |
-
});
|
| 64 |
|
| 65 |
-
socket.on('disconnect',
|
| 66 |
});
|
| 67 |
|
| 68 |
server.listen(PORT, HOST, () => {
|
| 69 |
-
console.log(`
|
| 70 |
});
|
|
|
|
|
|
|
| 1 |
const path = require('path');
|
| 2 |
const express = require('express');
|
| 3 |
const http = require('http');
|
|
|
|
| 11 |
cors: { origin: true }
|
| 12 |
});
|
| 13 |
|
| 14 |
+
// Serve static files
|
| 15 |
app.use(express.static(path.join(__dirname, 'public')));
|
| 16 |
|
| 17 |
+
// Handle routing for /admin and /client
|
| 18 |
+
app.get('/', (req, res) => res.redirect('/admin')); // Default redirect to admin
|
| 19 |
app.get('/admin', (req, res) => res.sendFile(path.join(__dirname, 'public', 'admin.html')));
|
| 20 |
app.get('/client', (req, res) => res.sendFile(path.join(__dirname, 'public', 'client.html')));
|
| 21 |
|
|
|
|
| 22 |
const HOST = '0.0.0.0';
|
| 23 |
const PORT = process.env.PORT || 7860;
|
| 24 |
|
| 25 |
+
// Setup WebSocket connection with socket.io
|
|
|
|
|
|
|
|
|
|
| 26 |
io.on('connection', (socket) => {
|
| 27 |
+
const room = socket.handshake.query.room || 'default';
|
| 28 |
+
const role = socket.handshake.query.role || 'client';
|
| 29 |
socket.join(room);
|
| 30 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
socket.on('sync:ping', (msg = {}) => {
|
| 32 |
const t1 = Date.now();
|
| 33 |
socket.emit('sync:pong', { t0: msg.t0, t1, t2: Date.now() });
|
| 34 |
});
|
| 35 |
|
| 36 |
+
// Admin commands
|
| 37 |
+
socket.on('admin:start', ({ delayMs = 3000, label = '' }) => {
|
|
|
|
| 38 |
const startAt = Date.now() + Math.max(500, Number(delayMs));
|
| 39 |
io.to(room).emit('cmd', { type: 'start', startAt, label });
|
| 40 |
});
|
| 41 |
+
socket.on('admin:stop', () => { io.to(room).emit('cmd', { type: 'stop' }); });
|
| 42 |
+
socket.on('admin:reset', () => { io.to(room).emit('cmd', { type: 'reset' }); });
|
| 43 |
+
socket.on('admin:blackout', ({ on = true }) => { io.to(room).emit('cmd', { type: 'blackout', on }); });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
|
| 45 |
+
socket.on('disconnect', () => {});
|
| 46 |
});
|
| 47 |
|
| 48 |
server.listen(PORT, HOST, () => {
|
| 49 |
+
console.log(`Server running on http://${HOST}:${PORT}`);
|
| 50 |
});
|