Files
2026-01-07 05:25:30 +08:00

83 lines
2.3 KiB
JavaScript

const express = require('express');
const http = require('http');
const { Server } = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = new Server(server);
app.use(express.static('public'));
let textQueue = [];
let videoQueue = [];
let onlineUsers = 0;
io.on('connection', (socket) => {
onlineUsers++;
io.emit('update_count', onlineUsers);
socket.on('find_partner', ({ mode, interests }) => {
socket.mode = mode; // 'text' or 'video'
// Simple Queue Logic
let queue = mode === 'text' ? textQueue : videoQueue;
if (queue.length > 0) {
// Match found!
const partner = queue.pop();
const roomId = `room_${socket.id}_${partner.id}`;
socket.join(roomId);
partner.join(roomId);
// Notify both
io.to(roomId).emit('match_found', { roomId });
// If video, tell them who is initiating
if (mode === 'video') {
socket.emit('make_offer', { roomId }); // One side starts WebRTC
}
} else {
// No match, wait in queue
queue.push(socket);
socket.emit('waiting', { message: `Looking for a ${mode} partner...` });
}
});
// WebRTC Signaling (Video Mode)
socket.on('signal', (data) => {
socket.to(data.room).emit('signal', data);
});
// Chat Messages
socket.on('message', (data) => {
socket.to(data.room).emit('message', {
text: data.text,
sender: 'stranger'
});
});
// Handle Stop/Disconnect
socket.on('leave_room', (roomId) => {
if(roomId) {
socket.to(roomId).emit('partner_disconnected');
socket.leave(roomId);
}
// Remove from queues if they were waiting
textQueue = textQueue.filter(s => s.id !== socket.id);
videoQueue = videoQueue.filter(s => s.id !== socket.id);
});
socket.on('disconnect', () => {
onlineUsers--;
io.emit('update_count', onlineUsers);
// Clean up queues
textQueue = textQueue.filter(s => s.id !== socket.id);
videoQueue = videoQueue.filter(s => s.id !== socket.id);
});
});
server.listen(3002, () => {
console.log('Server running on http://localhost:3002');
});