A Place Where Random People Meet And Chat.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(server/db): update server and Redis setup for message storage

+68 -21
+51 -14
server/src/redisClient.js
··· 7 7 socket: { host: "127.0.0.1", port: 6379 } 8 8 }); 9 9 10 + redis.on("error", (err) => console.error("Redis error:", err)); 11 + redis.on("end", () => console.warn("Redis connection closed")); 12 + 10 13 redis.connect() 11 14 .then(() => console.log("Connected to Redis")) 12 15 .catch((err) => console.error("Redis connection error:", err)); ··· 14 17 export const addUser = async (user, socket) => { 15 18 await redis.sAdd("activeUsers", user); 16 19 address.set(user, socket); 17 - } 20 + }; 18 21 19 22 export const removeUser = async (user) => { 20 23 const friend = await redis.hGet("friends", user); ··· 31 34 friendSocket.send(JSON.stringify({ type: "disconnected" })); 32 35 } 33 36 } 34 - } 37 + }; 38 + 39 + 35 40 36 41 export const getRandom = async (user) => { 42 + const TIMEOUT_MS = 10000; 43 + const INTERVAL_MS = 500; 44 + const start = Date.now(); 45 + 37 46 const existing = await redis.hGet("friends", user); 38 47 if (existing) return existing; 39 48 40 - const users = await redis.sMembers("activeUsers"); 41 - if (users.length < 2) return null; 49 + while (Date.now() - start < TIMEOUT_MS) { 50 + const friend = await redis.sRandMember("activeUsers"); 51 + if (!friend || friend === user) { 52 + await new Promise(r => setTimeout(r, INTERVAL_MS)); 53 + continue; 54 + } 55 + 56 + await redis.watch(`friends:${user}`, `friends:${friend}`); 57 + const [userPaired, friendPaired] = await redis.hmGet("friends", user, friend); 58 + 59 + if (userPaired || friendPaired) { 60 + await redis.unwatch(); 61 + await new Promise(r => setTimeout(r, INTERVAL_MS)); 62 + continue; 63 + } 64 + 65 + const tx = redis.multi(); 66 + tx.hSet("friends", user, friend); 67 + tx.hSet("friends", friend, user); 68 + tx.sRem("activeUsers", user); 69 + tx.sRem("activeUsers", friend); 42 70 43 - // Pick random friend excluding self 44 - const availableUsers = users.filter(u => u !== user); 45 - const friend = availableUsers[Math.floor(Math.random() * availableUsers.length)]; 71 + const result = await tx.exec(); 72 + if (result) { 73 + return friend; 74 + } 46 75 47 - // Save friendship 48 - await redis.hSet("friends", user, friend); 49 - await redis.hSet("friends", friend, user); 76 + await new Promise(r => setTimeout(r, INTERVAL_MS)); 77 + } 50 78 51 - await redis.sRem("activeUsers", user); 52 - await redis.sRem("activeUsers", friend); 79 + return null; 80 + }; 53 81 54 - return friend; 55 - } 82 + 83 + export const addMessage = async (payload, user, type) => { 84 + const friend = await redis.hGet("friends", user); 85 + if (!friend) return; 86 + 87 + const field = `${user}:${friend}:${type}`; 88 + await redis.rPush(field, JSON.stringify(payload)); 89 + await redis.expire(field, 3600); // 1 hour expiry 90 + }; 91 + 92 + export const getTime = () => new Date().toISOString(); 56 93
+17 -7
server/src/server.js
··· 1 - import dotenv from "dotenv" 2 - import app from "./app.js" 3 1 4 - dotenv.config() 2 + import dotenv from "dotenv"; 3 + import app from "./app.js"; 4 + import http from "http"; 5 + import webSocketServer from "./webSocket.js"; 5 6 6 - const PORT = process.env.PORT || 5000 7 + dotenv.config(); 7 8 8 - app.listen(PORT, () => { 9 - console.log(`🚀 Server running on http://localhost:${PORT}`) 10 - }) 9 + const PORT = process.env.PORT || 3000; 10 + 11 + // Create a single HTTP server 12 + const server = http.createServer(app); 13 + 14 + // Attach WebSocket server to the same HTTP server 15 + webSocketServer(server); 16 + 17 + // Start listening 18 + server.listen(PORT, () => { 19 + console.log(`🚀 Server running on http://localhost:${PORT}`); 20 + }); 11 21