feat: add join listener amd online user emitter

main
Justin Xiao 2023-07-18 16:17:42 +08:00
parent 5ef8e4317f
commit bd7f4a907e
2 changed files with 32 additions and 14 deletions

View File

@ -9,11 +9,10 @@ import {
ErrorType,
} from './core/ApiError';
process.on('uncaughtException', (e) => {
Logger.error(e);
});
process.on('uncaughtException', (e) => Logger.error(e));
const app = express();
app.use(cors({ origin: corsUrl, optionsSuccessStatus: 200 }));
// catch 404 and forward to error handler

View File

@ -13,15 +13,28 @@ const io = new Server(server, {
},
});
const userSockets = new Map();
const onlineUsers = new Map<string, string>();
let isEmitting = false;
let sendOnlineUsers: NodeJS.Timeout;
io.on('connection', (socket) => {
userSockets.set(socket.id, socket.id);
console.log(
'PRODUCTION SERVER: user connected, online user count:',
userSockets.size,
onlineUsers.size,
);
socket.on('join', (data) => {
const { socketId, name = socketId } = data;
onlineUsers.set(socketId, name);
// console.log(
// 'PRODUCTION SERVER: user joined, online user count:',
// 'socketId: ',
// socketId,
// 'name: ',
// name,
// );
});
socket.on('message', (message, callback) => {
console.log('PRODUCTION SERVER: ', message);
const { from: sourceSocketId, to: targetSocketId } = message;
@ -34,19 +47,25 @@ io.on('connection', (socket) => {
}
});
socket.on('online_user', () => {
console.log('PRODUCTION SERVER: online_user');
const onlineUsers = Array.from(userSockets.values());
io.to(socket.id).emit('online_user', onlineUsers);
});
socket.on('disconnect', () => {
userSockets.delete(socket.id);
onlineUsers.delete(socket.id);
console.log(
'PRODUCTION SERVER: user disconnected, online user count:',
userSockets.size,
onlineUsers.size,
);
if (isEmitting && onlineUsers.size === 0) {
clearInterval(sendOnlineUsers);
isEmitting = false;
}
});
if (!isEmitting) {
sendOnlineUsers = setInterval(
() => io.emit('online_user', Object.fromEntries(onlineUsers)),
5000,
);
isEmitting = true;
}
});
server