Spaces:
Sleeping
Sleeping
File size: 3,878 Bytes
d441744 6d4d78a 42e18e6 d441744 7fe989f d441744 7fe989f d441744 7fe989f d441744 7fe989f d441744 7fe989f d441744 7fe989f d441744 7fe989f d441744 7fe989f d441744 d770303 d441744 7fe989f d441744 42e18e6 d441744 7fe989f d441744 7fe989f d441744 7fe989f d441744 7fe989f d441744 6d4d78a d441744 7fe989f 6d4d78a 7fe989f d441744 7fe989f 42e18e6 7fe989f 6d4d78a 03315c7 f19b3cf | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | // server.js
const express = require('express');
const http = require('http');
const WebSocket = require('ws');
const app = express();
const server = http.createServer(app);
const wss = new WebSocket.Server({ server });
const rooms = new Map();
app.get('/', (req, res) => {
res.send(`<!doctype html>
<html>
<head>
<title>Dubem Realtime Rooms</title>
<meta charset="utf-8" />
<style>
body { font-family: sans-serif; padding: 20px; background: #f0f0f0; }
#log { border: 1px solid #ccc; height: 200px; overflow-y: auto; padding: 10px; background: #fff; }
input, button { margin: 5px 0; padding: 8px; font-size: 16px; }
</style>
</head>
<body>
<h2>Join a Room & Send Messages</h2>
<input id="room" placeholder="Room ID" />
<button onclick="joinRoom()">Join Room</button>
<div id="log"></div>
<input id="msg" placeholder="Type a message" style="width:80%;" />
<button onclick="sendMsg()">Send</button>
<script>
let ws;
let currentRoom = null;
window.addEventListener('load', () => {
const scheme = location.protocol === 'https:' ? 'wss' : 'ws';
ws = new WebSocket(\`\${scheme}://\${location.host}\`);
ws.onopen = () => {
log('🔌 Connected to server');
};
ws.onmessage = ({ data }) => {
const msg = JSON.parse(data);
log(\`[\${msg.roomId}] \${msg.message}\`);
};
ws.onclose = () => {
log('❌ Disconnected from server');
};
ws.onerror = err => {
log('⚠️ WebSocket error: ' + err.message);
};
});
function joinRoom() {
const roomId = document.getElementById('room').value.trim();
if (!roomId) return alert('Please enter a room ID');
if (!ws || ws.readyState !== WebSocket.OPEN) {
return alert('Socket not open yet!');
}
ws.send(JSON.stringify({ action: 'join', roomId }));
currentRoom = roomId;
log('➡️ Joined room: ' + roomId);
}
function sendMsg() {
const txt = document.getElementById('msg').value.trim();
if (!txt) return;
if (!ws || ws.readyState !== WebSocket.OPEN) {
return alert('Socket not open yet!');
}
if (!currentRoom) {
return alert('Please join a room first');
}
ws.send(JSON.stringify({
action: 'post',
roomId: currentRoom,
message: txt
}));
document.getElementById('msg').value = '';
}
function log(t) {
const el = document.getElementById('log');
el.innerHTML += '<div>' + t + '</div>';
el.scrollTop = el.scrollHeight;
}
</script>
</body>
</html>`);
});
wss.on('connection', ws => {
// When a client sends a 'join', we remove it from ALL rooms first
ws.on('message', raw => {
let msg;
try { msg = JSON.parse(raw); } catch { return; }
if (msg.action === 'join' && msg.roomId) {
// leave all existing rooms
for (const clients of rooms.values()) {
clients.delete(ws);
}
// join the new room
const room = msg.roomId;
if (!rooms.has(room)) rooms.set(room, new Set());
rooms.get(room).add(ws);
return;
}
if (msg.action === 'post' && msg.roomId && msg.message) {
const clients = rooms.get(msg.roomId);
if (!clients) return;
const payload = JSON.stringify({
roomId: msg.roomId,
message: msg.message,
timestamp: Date.now()
});
for (const client of clients) {
if (client.readyState === WebSocket.OPEN) {
client.send(payload);
}
}
}
});
ws.on('close', () => {
// remove from all rooms on disconnect
for (const clients of rooms.values()) {
clients.delete(ws);
}
});
});
const PORT = process.env.PORT || 8000
//7860;
server.listen(PORT, () => console.log(`✅ Activity server running at http://localhost:${PORT}`)); |