forked from snxraven/LinkUp-P2P-Chat
test
This commit is contained in:
parent
c58671dc7d
commit
6e171c5ffa
116
app.js
116
app.js
@ -1,25 +1,29 @@
|
|||||||
|
// Import required modules
|
||||||
import Hyperswarm from 'hyperswarm';
|
import Hyperswarm from 'hyperswarm';
|
||||||
import crypto from 'hypercore-crypto';
|
import crypto from 'hypercore-crypto';
|
||||||
import b4a from 'b4a';
|
import b4a from 'b4a';
|
||||||
import ServeDrive from 'serve-drive';
|
import ServeDrive from 'serve-drive';
|
||||||
import Localdrive from 'localdrive';
|
import Localdrive from 'localdrive';
|
||||||
|
|
||||||
|
// Create instances for local drive and Hyperswarm
|
||||||
const drive = new Localdrive('./storage');
|
const drive = new Localdrive('./storage');
|
||||||
let swarm;
|
let swarm;
|
||||||
let userName = 'Anonymous';
|
|
||||||
let userAvatar = '';
|
|
||||||
let registeredUsers = JSON.parse(localStorage.getItem('registeredUsers')) || {};
|
|
||||||
let peerCount = 0;
|
let peerCount = 0;
|
||||||
|
|
||||||
|
// Initialize the application
|
||||||
async function initialize() {
|
async function initialize() {
|
||||||
swarm = new Hyperswarm();
|
swarm = new Hyperswarm();
|
||||||
|
|
||||||
|
// Ensure the local drive is ready
|
||||||
await drive.ready();
|
await drive.ready();
|
||||||
|
|
||||||
|
// Set up ServeDrive
|
||||||
const servePort = 1337;
|
const servePort = 1337;
|
||||||
const serve = new ServeDrive({ port: servePort, get: ({ key, filename, version }) => drive });
|
const serve = new ServeDrive({ port: servePort, get: ({ key, filename, version }) => drive });
|
||||||
await serve.ready();
|
await serve.ready();
|
||||||
console.log('Listening on http://localhost:' + serve.address().port);
|
console.log('Listening on http://localhost:' + serve.address().port);
|
||||||
|
|
||||||
|
// Set up event listeners for UI elements
|
||||||
const registerForm = document.querySelector('#register-form');
|
const registerForm = document.querySelector('#register-form');
|
||||||
const selectAvatarButton = document.querySelector('#select-avatar');
|
const selectAvatarButton = document.querySelector('#select-avatar');
|
||||||
const createChatRoomButton = document.querySelector('#create-chat-room');
|
const createChatRoomButton = document.querySelector('#create-chat-room');
|
||||||
@ -44,6 +48,43 @@ async function initialize() {
|
|||||||
messageForm.addEventListener('submit', sendMessage);
|
messageForm.addEventListener('submit', sendMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Listen for connections from peers
|
||||||
|
swarm.on('connection', (connection, info) => {
|
||||||
|
peerCount++;
|
||||||
|
updatePeerCount();
|
||||||
|
|
||||||
|
// Handle data received from peers
|
||||||
|
connection.on('data', async (data) => {
|
||||||
|
const messageObj = JSON.parse(data.toString());
|
||||||
|
if (messageObj.type === 'avatarRequest') {
|
||||||
|
// Respond to avatar request by sending the requested avatar
|
||||||
|
const avatarBuffer = await getAvatar(messageObj.username);
|
||||||
|
if (avatarBuffer) {
|
||||||
|
connection.write(avatarBuffer);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Handle other types of messages
|
||||||
|
onMessageAdded(messageObj.name, messageObj.message, messageObj.avatar);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle disconnection of peers
|
||||||
|
connection.on('close', () => {
|
||||||
|
peerCount--;
|
||||||
|
updatePeerCount();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Error and close event handlers for the swarm
|
||||||
|
swarm.on('error', (err) => {
|
||||||
|
console.error('Swarm error:', err);
|
||||||
|
});
|
||||||
|
|
||||||
|
swarm.on('close', () => {
|
||||||
|
console.log('Swarm closed.');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Perform any additional setup tasks
|
||||||
const savedUser = localStorage.getItem('currentUser');
|
const savedUser = localStorage.getItem('currentUser');
|
||||||
if (savedUser) {
|
if (savedUser) {
|
||||||
const user = JSON.parse(savedUser);
|
const user = JSON.parse(savedUser);
|
||||||
@ -59,29 +100,56 @@ async function initialize() {
|
|||||||
registerDiv.classList.remove('hidden');
|
registerDiv.classList.remove('hidden');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
swarm.on('connection', (connection, info) => {
|
|
||||||
peerCount++;
|
|
||||||
updatePeerCount();
|
|
||||||
connection.on('data', (data) => {
|
|
||||||
const messageObj = JSON.parse(data.toString());
|
|
||||||
onMessageAdded(messageObj.name, messageObj.message, messageObj.avatar);
|
|
||||||
});
|
|
||||||
connection.on('close', () => {
|
|
||||||
peerCount--;
|
|
||||||
updatePeerCount();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
swarm.on('error', (err) => {
|
|
||||||
console.error('Swarm error:', err);
|
|
||||||
});
|
|
||||||
|
|
||||||
swarm.on('close', () => {
|
|
||||||
console.log('Swarm closed.');
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function to get the avatar for a given username
|
||||||
|
async function getAvatar(username) {
|
||||||
|
try {
|
||||||
|
// Check if the avatar exists locally
|
||||||
|
const avatarPath = `./storage/icons/${username}.png`;
|
||||||
|
const avatarBuffer = await drive.get(avatarPath);
|
||||||
|
return avatarBuffer;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error getting avatar:', error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to update the count of connected peers in the UI
|
||||||
|
function updatePeerCount() {
|
||||||
|
const peersCountElement = document.querySelector('#peers-count');
|
||||||
|
if (peersCountElement) {
|
||||||
|
peersCountElement.textContent = peerCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to handle incoming messages from peers
|
||||||
|
function onMessageAdded(from, message, avatar) {
|
||||||
|
const $div = document.createElement('div');
|
||||||
|
$div.classList.add('message');
|
||||||
|
|
||||||
|
const $img = document.createElement('img');
|
||||||
|
$img.src = avatar || 'https://via.placeholder.com/40';
|
||||||
|
$div.appendChild($img);
|
||||||
|
|
||||||
|
const $content = document.createElement('div');
|
||||||
|
$content.classList.add('message-content');
|
||||||
|
|
||||||
|
const $header = document.createElement('div');
|
||||||
|
$header.classList.add('message-header');
|
||||||
|
$header.textContent = from;
|
||||||
|
|
||||||
|
const $text = document.createElement('div');
|
||||||
|
$text.textContent = message;
|
||||||
|
|
||||||
|
$content.appendChild($header);
|
||||||
|
$content.appendChild($text);
|
||||||
|
$div.appendChild($content);
|
||||||
|
|
||||||
|
document.querySelector('#messages').appendChild($div);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function updatePeerCount() {
|
function updatePeerCount() {
|
||||||
const peersCountElement = document.querySelector('#peers-count');
|
const peersCountElement = document.querySelector('#peers-count');
|
||||||
if (peersCountElement) {
|
if (peersCountElement) {
|
||||||
|
Loading…
Reference in New Issue
Block a user