Files
syncfilm/server.js
T
2025-06-10 01:17:19 +02:00

65 lines
2.2 KiB
JavaScript

require("dotenv").config();
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, {
path: process.env.SOCKET_IO_PATH || "/socket.io", // Custom socket.io path
});
// Serve static files from the public directory
app.use(express.static(path.join(__dirname, process.env.STATIC_FILES_PATH || "public")));
let expectedResponses = 0; // Number of connected clients
let receivedResponses = 0; // Number of clients that acknowledged an action
let emitData = {}; // Data to synchronize across clients
// Serve the main HTML file
app.get("/", (req, res) => {
res.sendFile(path.join(__dirname, "index.html"));
});
// Handle socket.io connections
io.on("connection", (socket) => {
console.log(`User connected: ${socket.id}`);
// Listen for the user's name
socket.on("setName", (name) => {
socket.data.name = name; // Store the user's name in the socket object
expectedResponses++;
io.emit("notification", { message: `${name} connected`, color: "green" });
});
// Handle actions (e.g., play/pause, seek)
socket.on("action", (data) => {
io.emit("make", data); // Broadcast the action to all clients
emitData = data; // Save the action data
receivedResponses = 0; // Reset the acknowledgment counter
});
// Handle acknowledgment from clients
socket.on("ok", (receivedData) => {
if (JSON.stringify(receivedData) === JSON.stringify(emitData)) {
receivedResponses++;
if (receivedResponses === expectedResponses) {
io.emit("allOk", emitData); // Notify all clients that everyone is synchronized
}
}
});
// Handle disconnections
socket.on("disconnect", () => {
const name = socket.data.name || "Unknown User";
console.log(`User disconnected: ${name}`);
expectedResponses--;
io.emit("notification", { message: `${name} disconnected`, color: "red" });
});
});
// Start the server
server.listen(process.env.PORT || 3000, () => {
console.log(`Listening on *:${process.env.PORT || 3000}`);
});