Spaces:
Sleeping
Sleeping
| // server.js (for Bun) | |
| import { serve } from "bun"; | |
| const rooms = new Map(); // roomId → Set<WebSocket> | |
| serve({ | |
| port: Number(process.env.PORT) || 7860, | |
| // Serve the HTML page at “/” | |
| async fetch(req) { | |
| const url = new URL(req.url); | |
| if (url.pathname !== "/") return new Response("Not Found", { status: 404 }); | |
| return new Response(`<!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 (truly 1)</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', () => { | |
| // scheme + host from location, no interpolation syntax | |
| var scheme = location.protocol === 'https:' ? 'wss' : 'ws'; | |
| var socketUrl = scheme + '://' + location.host + '/'; | |
| console.log('Connecting to ' + socketUrl); | |
| ws = new WebSocket(socketUrl); | |
| ws.onopen = function() { | |
| log('🔌 Connected to server'); | |
| }; | |
| ws.onmessage = function(event) { | |
| var msg = JSON.parse(event.data); | |
| log('🗨️ [' + msg.roomId + '] ' + msg.message); | |
| }; | |
| ws.onerror = function(event) { | |
| console.error('WebSocket error event:', event); | |
| log('⚠️ WebSocket error. Check console.'); | |
| }; | |
| ws.onclose = function(event) { | |
| log('❌ Disconnected (code=' + event.code + ' reason="' + | |
| (event.reason || 'none') + '")'); | |
| }; | |
| }); | |
| function joinRoom() { | |
| var roomId = document.getElementById('room').value.trim(); | |
| if (!roomId) return alert('Please enter a room ID'); | |
| if (!ws || ws.readyState !== ws.OPEN) { | |
| return alert('Socket not open yet!'); | |
| } | |
| ws.send(JSON.stringify({ action: 'join', roomId: roomId })); | |
| currentRoom = roomId; | |
| log('➡️ Joined room: ' + roomId); | |
| } | |
| function sendMsg() { | |
| var txt = document.getElementById('msg').value.trim(); | |
| if (!txt) return; | |
| if (!ws || ws.readyState !== ws.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(text) { | |
| var el = document.getElementById('log'); | |
| el.innerHTML += '<div>' + text + '</div>'; | |
| el.scrollTop = el.scrollHeight; | |
| } | |
| </script> | |
| </body> | |
| </html>`, { | |
| headers: { "Content-Type": "text/html; charset=utf-8" }, | |
| }); | |
| }, | |
| // Hook into Bun's WebSocket handling | |
| websocket: { | |
| open(ws) { | |
| // no-op here; clients join via “join” action | |
| }, | |
| message(ws, raw) { | |
| let msg; | |
| try { | |
| msg = JSON.parse(raw.toString()); | |
| } catch { | |
| return; | |
| } | |
| if (msg.action === "join" && msg.roomId) { | |
| // remove from all rooms | |
| for (const clients of rooms.values()) { | |
| clients.delete(ws); | |
| } | |
| // add to new room | |
| const roomSet = rooms.get(msg.roomId) || new Set(); | |
| roomSet.add(ws); | |
| rooms.set(msg.roomId, roomSet); | |
| 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 === 1) { // OPEN | |
| client.send(payload); | |
| } | |
| } | |
| } | |
| }, | |
| close(ws) { | |
| // on disconnect, remove from all rooms | |
| for (const clients of rooms.values()) { | |
| clients.delete(ws); | |
| } | |
| }, | |
| }, | |
| }); | |
| console.log("✅ Bun realtime server running on port " + (process.env.PORT || 7860)); |