trying to make private messaging

This commit is contained in:
slawk0
2024-08-23 22:56:24 +02:00
parent 921f5cf1a7
commit 6ba76793ec
4 changed files with 112 additions and 15 deletions

View File

@@ -3,11 +3,75 @@ const { createServer } = require('node:http');
const { join } = require('node:path');
const express = require('express');
const jwt = require("jsonwebtoken");
const app = express();
const server = createServer(app);
const io = new Server(server);
const io = new Server(server, {
cookie: {
httpOnly: true,
sameSite: "strict",
maxAge: 30 * 24 * 60 * 60 * 1000
},
cors: {
origin: process.env.ORIGIN
},
connectionStateRecovery: {}
});
function socket(username) {
const jwtSecret = process.env.JWT_SECRET;
function socket() {
const users = new Map();
io.use((socket, next) => {
const token = socket.handshake.auth.token;
if(token) {
jwt.verify(token, jwtSecret, (err, user) => {
if(err) {
console.log(err);
}
socket.user = user;
next();
});
} else {
next(new Error('Not logged in'));
}
});
// socket io connection
io.on('connection', (socket) => {
const username = socket.user.username;
console.log(username + ' connected');
users.set(username, socket.id);
// chat message event
socket.on('chat message', (msg, callback) => {
const message = username + ': ' + msg;
console.log(message);
callback();
io.emit('chat message', message);
});
// private message event
socket.on('private message', ({ to, message }, callback) => {
const recipientSocketId = users.get(to);
if (recipientSocketId) {
io.to(recipientSocketId).emit('private message', {
from: username,
message: message
});
callback(true);
} else {
callback(false);
}
});
// disconnect event
socket.on('disconnect', () => {
console.log(username + ' has disconnected');
users.delete(username);
});
});
}
module.exports = {

View File

@@ -1,7 +1,8 @@
const form = document.getElementById('form');
const recipmentForm = document.getElementById('recipmentForm');
const input = document.getElementById('input');
const messages = document.getElementById('messages');
const recipientInput = document.getElementById('recipient');
// Function to get the token
async function getToken() {
try {
@@ -26,13 +27,22 @@ async function initializeSocket() {
const socket = io({
auth: {
token: token
}
},
ackTimeout: 10000,
retries: 3
});
socket.on('connect', () => {
console.log('Connected to server');
});
socket.on('private message', ({ from, message }) => {
const item = document.createElement('li');
item.textContent = `${from} (private): ${message}`;
messages.appendChild(item);
window.scrollTo(0, document.body.scrollHeight);
});
socket.on('chat message', (msg) => {
const item = document.createElement('li');
item.textContent = msg;
@@ -40,13 +50,19 @@ async function initializeSocket() {
window.scrollTo(0, document.body.scrollHeight);
});
form.addEventListener('submit', (e) => {
recipmentForm.addEventListener('submit', (e) => {
e.preventDefault();
if (input.value) {
socket.emit('chat message', input.value);
const recipient = recipientInput.value.trim();
if (recipient) {
socket.emit('private message', { to: recipient, message: input.value });
} else {
socket.emit('chat message', input.value);
}
input.value = '';
recipientInput.value = '';
}
});
}
initializeSocket();
initializeSocket().then(r => console.log(r));

View File

@@ -25,6 +25,11 @@
<button>Send</button>
</form>
<form id="recipmentForm" action="">
<input id="recipient" autocomplete="off" placeholder="Recipient (optional)"/>
<input id="recipmentInput" autocomplete="off" /><button>Send</button>
</form>
<script src="/socket.io/socket.io.js"></script>
<script src="/static/js/chat.js"></script>

View File

@@ -18,7 +18,12 @@ const io = new Server(server, {
httpOnly: true,
sameSite: "strict",
maxAge: 30 * 24 * 60 * 60 * 1000
}
},
cors: {
origin: process.env.ORIGIN
},
connectionStateRecovery: {}
});
const jwt = require('jsonwebtoken');
@@ -42,6 +47,8 @@ app.use(session({
}
}));
//TODO logout option
// auth login API
app.post('/auth/login', async (req, res) => {
await loginUser(req, res);
@@ -125,20 +132,25 @@ io.use((socket, next) => {
}
})
// socket io connection
io.on('connection', (socket) => {
const username = socket.user.username;
console.log(username + ' connected');
// chat message event
socket.on('chat message', (msg, callback) => {
const message = username + ': ' + msg;
console.log(message);
callback();
io.emit('chat message', message);
});
// disconnect event
socket.on('disconnect', () => {
console.log(username + ' have disconnected');
});
// chat message event
socket.on('chat message', (msg) => {
const message = username + ': ' + msg;
console.log(message);
io.emit('chat message', message);
});
})
// run server
server.listen(port, () => {