forked from snxraven/LinkUp-P2P-Chat
Re adding per room topic counts
This commit is contained in:
parent
5edcff29e1
commit
0a3732fb07
107
app.js
107
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user