trying to make private messaging
This commit is contained in:
@@ -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 = {
|
||||
|
||||
@@ -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));
|
||||
@@ -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>
|
||||
|
||||
|
||||
26
index.js
26
index.js
@@ -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, () => {
|
||||
|
||||
Reference in New Issue
Block a user