83 lines
2.3 KiB
JavaScript
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');
|
|
});
|