File size: 2,906 Bytes
6d4d78a
42e18e6
 
 
6d4d78a
7fe989f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d770303
7fe989f
975319a
7fe989f
 
 
 
14053ab
7fe989f
 
 
 
 
 
d770303
 
 
7fe989f
 
 
 
 
 
42e18e6
7fe989f
 
 
 
 
 
 
 
 
 
 
 
d770303
7fe989f
 
 
89397d0
7fe989f
 
 
 
 
6d4d78a
7fe989f
 
 
 
 
 
 
 
 
 
 
 
6d4d78a
7fe989f
 
 
 
 
 
89397d0
7fe989f
 
 
 
 
 
89397d0
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
99
100
101
102
103
104
105
106
107
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() {
    try {
      const roomId = document.getElementById('room').value;
      ws = new WebSocket('wss://' + location.host);
      ws.onopen = () => {
        ws.send(JSON.stringify({ action: 'join', roomId }));
        currentRoom = roomId;
        log('Joined room: ' + roomId);
      //  alert('Joined room: ' + roomId);
      };
      ws.onmessage = ({ data }) => {
        const msg = JSON.parse(data);
        log('[' + msg.roomId + '] ' + msg.message);
      };
      ws.onclose = () => log('Disconnected.');
      } catch (err) {
      alert("err "+err) 
      }
    }

    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;
  console.log("fresh connect")

  ws.on('message', raw => {
    let msg;
    console.log("message enter")
    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);
        }
      }
    }
    console.log("message down")
  });

  ws.on('close', () => {
    if (currentRoom && rooms.has(currentRoom)) {
      rooms.get(currentRoom).delete(ws);
    }
    console.log("room close")
  });
});

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