add message sending

This commit is contained in:
hippoz 2020-11-16 22:08:23 +02:00
parent dcdcc64553
commit 893b1d4ff6
2 changed files with 49 additions and 6 deletions

View file

@ -14,6 +14,7 @@ class GatewayServer {
} }
GatewayServer.prototype.authDisconnect = function(socket, callback) { GatewayServer.prototype.authDisconnect = function(socket, callback) {
console.log('[E] [gateway] [handshake] User disconnected due to failed authentication');
socket.isConnected = false; socket.isConnected = false;
socket.disconnect(); socket.disconnect();
socket.disconnect(true); socket.disconnect(true);
@ -22,12 +23,12 @@ GatewayServer.prototype.authDisconnect = function(socket, callback) {
GatewayServer.prototype.eventSetup = function() { GatewayServer.prototype.eventSetup = function() {
this._gateway.use((socket, callback) => { this._gateway.use((socket, callback) => {
console.log('[*] [gateway] User authentication attempt'); console.log('[*] [gateway] [handshake] User authentication attempt');
socket.isConnected = false; socket.isConnected = false;
setTimeout(() => { setTimeout(() => {
if (socket.isConnected) return; if (socket.isConnected) return;
console.log('[*] [gateway] User still not connected after timeout, removing...'); console.log('[*] [gateway] [handshake] User still not connected after timeout, removing...');
socket.disconnect(); socket.disconnect();
socket.disconnect(true); socket.disconnect(true);
}, config.gatewayStillNotConnectedTimeoutMS); }, config.gatewayStillNotConnectedTimeoutMS);
@ -54,17 +55,33 @@ GatewayServer.prototype.eventSetup = function() {
if (permissionLevel < config.roleMap.USER) return this.authDisconnect(socket, callback); if (permissionLevel < config.roleMap.USER) return this.authDisconnect(socket, callback);
socket.username = data.username; socket.username = data.username;
console.log(`[*] [gateway] User ${data.username} has successfully authenticated`); console.log(`[*] [gateway] [handshake] User ${data.username} has successfully authenticated`);
return callback(); return callback();
}); });
}); });
this._gateway.on('connection', (socket) => { this._gateway.on('connection', (socket) => {
console.log(`[*] [gateway] User ${socket.username} connected, sending hello and waiting for yoo...`); console.log(`[*] [gateway] [handshake] User ${socket.username} connected, sending hello and waiting for yoo...`);
socket.emit('hello'); socket.emit('hello');
socket.once('yoo', () => { socket.once('yoo', () => {
console.log(`[*] [gateway] Got yoo from ${socket.username}, connection is finally completed!`); console.log(`[*] [gateway] [handshake] Got yoo from ${socket.username}, connection is finally completed!`);
socket.isConnected = true; socket.isConnected = true;
socket.on('message', ({ categoryId, content }) => {
// TODO: URGENT: Check if the category exists and if the user has access to it (access coming soon)
socket.to(categoryId).emit('message', {
username: socket.username,
categoryId: categoryId,
content: content
});
});
socket.on('subscribe', (categories) => {
for (let v of categories) {
// TODO: URGENT: Check if the category exists and if the user has access to it (access coming soon)
socket.join(v);
}
});
}); });
}); });
}; };

View file

@ -76,6 +76,7 @@ GatewayConnection.prototype.connect = function(token) {
this.socket.on('hello', () => { this.socket.on('hello', () => {
console.log('[*] [gateway] [handshake] Got hello from server, sending yoo...'); console.log('[*] [gateway] [handshake] Got hello from server, sending yoo...');
this.socket.emit('yoo'); this.socket.emit('yoo');
this.isConnected = true;
this.onConnect('CONNECT_RECEIVED_HELLO'); this.onConnect('CONNECT_RECEIVED_HELLO');
}); });
@ -96,6 +97,19 @@ GatewayConnection.prototype.connect = function(token) {
}); });
}; };
GatewayConnection.prototype.sendMessage = function(categoryId, content) {
if (!this.isConnected) return;
this.socket.emit('message', { categoryId, content });
};
GatewayConnection.prototype.subscribeToCategoryChat = function(categoryId) {
if (!this.isConnected) return;
this.socket.emit('subscribe', [categoryId]);
};
const app = new Vue({ const app = new Vue({
el: '#app', el: '#app',
data: { data: {
@ -204,8 +218,17 @@ const app = new Vue({
this.resetSnackbarButton(); this.resetSnackbarButton();
this.notification('ERROR: You have been disconnected from the gateway. Realtime features such as chat will not work and unexpected errors may occur.'); this.notification('ERROR: You have been disconnected from the gateway. Realtime features such as chat will not work and unexpected errors may occur.');
}; };
this.gateway.onConnect = () => {
this.gateway.socket.on('message', ({ username, categoryId, content }) => {
this.showMessageNotification(username, content);
})
};
this.gateway.connect(this.loggedInUser.token); this.gateway.connect(this.loggedInUser.token);
}, },
showMessageNotification: async function(username, content) {
this.resetSnackbarButton();
this.notification(`${username}: ${content}`);
},
button: function(text, click) { button: function(text, click) {
this.cardButtons.push({ text, click }); this.cardButtons.push({ text, click });
}, },
@ -397,7 +420,10 @@ const app = new Vue({
this.cardButtons = []; this.cardButtons = [];
this.button('Chat', (post) => { this.button('Chat', (post) => {
this.browse(post); if (post._id) {
this.gateway.subscribeToCategoryChat(post._id);
this.gateway.sendMessage(post._id, 'yoooo');
}
}); });
this.button('View', (post) => { this.button('View', (post) => {
this.browse(post); this.browse(post);