Emit
Com o WebSocket utilizando o socket.io, é possível enviar mensagens do Backend -> Frontend utilizando o socket.emit('message', 'Hello World')
no Backend e ouvindo no Frontend com socket.on('message', text => { console.log(text) })
.
No Backend
Arquivo src/websocket.js
const socketio = require('socket.io'); // Importa o Socket.iolet io; // Seta a variável do Socket.ioconst connections = []; // Cria um array vazio para armazenar as conexões (geralmente usa-se algum banco de dados)exports.setupWebSocket = (server) => { // Cria as configurações do WebSocketio = socketio(server); // Conecta o servidor com o Socket.ioio.on('connection', (socket) => { // Quando o usuário conecta, envia uma funçãoconst { latitude, longitude, techs } = socket.handshake.query; // Pega as informações obtidas no frontendconnections.push({ // Armazena no arrayid: socket.id, // Id do socket obtidocoordinates: {latitude: Number(latitude),longitude: Number(longitude),},techs: parseStringAsArray(techs),});});};// Recebe as coordenadas e tecnologias como parâmetro da primeira função e realiza um filtro que a cada conexão, calcula as distacia e caso seja menor de 10km && haja um item ativo sendo pesquisado no Frontend/Mobile.exports.findConnections = (coordinates, techs) => connections.filter((connection) => calculateDistance(coordinates, connections.coordinates) < 10 && connection.techs.some((item) => techs.includes(item)));exports.sendMessage = (to, message, data) => { // A função recebe como parâmetro o destino, a mensagem e os dados.to.forEach((connection) => { // Realiza um forEach recebendo a conexão como parâmetroio.to(connection.id).emit(message, data); // Envia para o id conectado a mensagem e os dados});};
Arquivo do Controller
const { findConnections, sendMessage } = require('../websocket');// ...// Filtrar as conexões que estão a no máximo 10km de distância e que o// novo dev tenha pelo menos uma das tecnologias filtradasconst sendSocketMessageTo = findConnections({latitude, longitude,}, techsArray);sendMessage(sendSocketMessageTo, 'new-dev', dev);// ...