File size: 2,671 Bytes
6d4d78a
42e18e6
 
 
6d4d78a
7fe989f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42e18e6
7fe989f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6d4d78a
7fe989f
 
 
 
 
 
 
 
 
 
 
 
6d4d78a
7fe989f
 
 
 
 
 
 
 
 
 
 
 
42e18e6
7fe989f
6d4d78a
7fe989f
033822e
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
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>
</head>
<body style="font-family:sans-serif">
  <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" />
  <button onclick="sendMsg()">Send</button>

  <script>
    let ws, currentRoom = null;

    function joinRoom() {
      const roomId = document.getElementById('room').value;
      ws = new WebSocket('ws://' + location.host);
      ws.onopen = () => {
        ws.send(JSON.stringify({ action: 'join', roomId }));
        currentRoom = roomId;
        log('Joined room: ' + roomId);
      };
      ws.onmessage = ({ data }) => {
        const msg = JSON.parse(data);
        log('[' + msg.roomId + '] ' + msg.message);
      };
      ws.onclose = () => log('Disconnected.');
    }

    function sendMsg() {
      const txt = document.getElementById('msg').value;
      if (ws && currentRoom) {
        ws.send(JSON.stringify({ action: 'post', roomId: currentRoom, message: txt }));
      }
    }

    function log(t) {
      document.getElementById('log').innerHTML += '<p>' + t + '</p>';
    }
  </script>
</body>
</html>`);
});

wss.on('connection', ws => {
  let currentRoom = null;

  ws.on('message', raw => {
    let msg;
    try { msg = JSON.parse(raw); } catch (e) { return; }

    if (msg.action === 'join' && msg.roomId) {
      if (currentRoom && rooms.has(currentRoom)) {
        rooms.get(currentRoom).delete(ws);
      }
      currentRoom = msg.roomId;
      if (!rooms.has(currentRoom)) rooms.set(currentRoom, new Set());
      rooms.get(currentRoom).add(ws);
    }

    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', () => {
    if (currentRoom && rooms.has(currentRoom)) {
      rooms.get(currentRoom).delete(ws);
    }
  });
});

const PORT = process.env.PORT || 7860;
server.listen(PORT, () => console.log(`✅ Activity server running at http://localhost:${PORT}`));