diff --git a/app.js b/app.js index f771de0..7d33ed3 100644 --- a/app.js +++ b/app.js @@ -14,7 +14,6 @@ const drive = new Hyperdrive(store); await drive.ready(); let swarm; -let peerCount = 0; let activeRooms = []; const eventEmitter = new EventEmitter(); @@ -32,6 +31,12 @@ let config = { // Store messages for each room let messagesStore = {}; +// Store peer counts for each room +let peerCounts = {}; + +// Map to store discovery instances and their associated topics +const discoveryTopicsMap = new Map(); + // Function to get a random port between 49152 and 65535 function getRandomPort() { return Math.floor(Math.random() * (65535 - 49152 + 1)) + 49152; @@ -155,31 +160,47 @@ async function initialize() { }); swarm.on('connection', async (connection, info) => { - peerCount++; - updatePeerCount(); - console.log('Peer connected, current peer count:', peerCount); + try { + const discovery = [...discoveryTopicsMap.entries()].find(([key, value]) => key.id === info.id); + const topic = discovery ? discovery[1] : null; - // Send the current user's icon to the new peer - const iconBuffer = await drive.get(`/icons/${config.userName}.png`); - if (iconBuffer) { - const iconMessage = JSON.stringify({ - type: 'icon', - username: config.userName, - avatar: b4a.toString(iconBuffer, 'base64'), + if (!topic) { + console.error('No topic found in connection info:', info); + return; + } + + if (!peerCounts[topic]) { + peerCounts[topic] = 0; + } + peerCounts[topic]++; + updatePeerCount(topic); + console.log('Peer connected, current peer count:', peerCounts[topic]); + + // Send the current user's icon to the new peer + const iconBuffer = await drive.get(`/icons/${config.userName}.png`); + if (iconBuffer) { + const iconMessage = JSON.stringify({ + type: 'icon', + username: config.userName, + avatar: b4a.toString(iconBuffer, 'base64'), + topic + }); + connection.write(iconMessage); + } + + connection.on('data', (data) => { + const messageObj = JSON.parse(data.toString()); + eventEmitter.emit('onMessage', messageObj); }); - connection.write(iconMessage); + + connection.on('close', () => { + peerCounts[topic]--; + updatePeerCount(topic); + console.log('Peer disconnected, current peer count:', peerCounts[topic]); + }); + } catch (error) { + console.error('Error handling connection:', error); } - - connection.on('data', (data) => { - const messageObj = JSON.parse(data.toString()); - eventEmitter.emit('onMessage', messageObj); - }); - - connection.on('close', () => { - peerCount--; - updatePeerCount(); - console.log('Peer disconnected, current peer count:', peerCount); - }); }); swarm.on('error', (err) => { @@ -330,6 +351,10 @@ async function joinSwarm(topicBuffer) { await discovery.flushed(); activeRooms.push({ topic, discovery }); + peerCounts[topic] = 0; // Initialize peer count for the new room + + // Store the topic in the map + discoveryTopicsMap.set(discovery, topic); console.log('Joined room:', topic); // Debugging log @@ -343,9 +368,13 @@ async function joinSwarm(topicBuffer) { function addRoomToList(topic) { const roomList = document.querySelector('#room-list'); const roomItem = document.createElement('li'); - roomItem.textContent = truncateHash(topic); roomItem.dataset.topic = topic; + const roomName = document.createElement('span'); + roomName.textContent = truncateHash(topic); + + roomItem.appendChild(roomName); + roomItem.addEventListener('dblclick', () => enterEditMode(roomItem)); roomItem.addEventListener('click', () => switchRoom(topic)); roomList.appendChild(roomItem); @@ -433,6 +462,9 @@ function switchRoom(topic) { // Show chat UI elements document.querySelector('#chat').classList.remove('hidden'); document.querySelector('#setup').classList.add('hidden'); + + // Update the peer count in the header + updateHeaderPeerCount(topic); } function leaveRoom(topic) { @@ -441,6 +473,7 @@ function leaveRoom(topic) { const room = activeRooms[roomIndex]; room.discovery.destroy(); activeRooms.splice(roomIndex, 1); + discoveryTopicsMap.delete(room.discovery); } const roomItem = document.querySelector(`li[data-topic="${topic}"]`); @@ -568,10 +601,32 @@ function addFileMessage(from, fileName, fileUrl, fileType, avatar, topic) { } } -function updatePeerCount() { +function updatePeerCount(topic) { + let peerCountElement = document.querySelector(`#peers-count-${topic}`); + if (!peerCountElement) { + const roomItem = document.querySelector(`#room-list li[data-topic="${topic}"]`); + if (roomItem) { + peerCountElement = document.createElement('span'); + peerCountElement.id = `peers-count-${topic}`; + // roomItem.appendChild(peerCountElement); + } + } + if (peerCountElement) { + peerCountElement.textContent = ` (${peerCounts[topic]})`; // Display the peer count for the specific topic + } + + // Update the header peer count if the current room matches the topic + const currentTopic = document.querySelector('#chat-room-topic').innerText; + if (currentTopic === topic) { + updateHeaderPeerCount(topic); + } +} + +function updateHeaderPeerCount(topic) { const peerCountElement = document.querySelector('#peers-count'); if (peerCountElement) { - peerCountElement.textContent = peerCount; // Display the actual peer count + const peerCount = peerCounts[topic] || 0; + peerCountElement.textContent = peerCount; } } @@ -759,4 +814,4 @@ function addMessageToStore(topic, messageObj) { // Call this function when loading the rooms initially renderRoomList(); -initialize(); +initialize(); \ No newline at end of file