mdmb
mdmb

Reputation: 5283

socket.io - stop receiving own emits

TL;DR - How to prevent client from receiving its own messages?

So I'm playing with socket.io after my experience with apollo and graphql.

My simple server looks like this:

io.on('connection', (socket) => {
  console.log('New connection established.');
  socket.on('disconnect', () => {
    console.log('User disconnected.');
  });
  // Projects:
  socket.on('join project', (data) => {
    console.log(`User (${data.user.email}) join project with ID ${data.project.id}`);
    socket.join(data.project.id);
  });
  socket.on('leave project', (data) => {
    socket.leave(data.project.id);
  });

  socket.on('change field', (data) => {
    console.log('Field was changed:', data);
    const { project } = data;
    socket.to(project.id).broadcast.emit('field changed', data);
  });
});

I'm emitting something like this inside my application:

socket.emit('change field', {
          project: {
            id: 1,
          },
          value: 'Hello world',
          usersEmail: '[email protected]',
          fieldName: 'description',
        });
socket.on('field changed', (data) => {
      // if (data.usersEmail === '[email protected]') return; // This would stop from receiving own messages
      console.log('CLIENT: field was changed!', data);
    });

What I thought would happen is (due to the broadcast flag that I set up in the on('change field', ...)):

  1. Clients A emits the message
  2. Clients other than A receive the message

What is happening is a log inside other clients and client A itself, saying that the field was changed. Am I missing something?

Upvotes: 2

Views: 964

Answers (1)

Slava Eremenko
Slava Eremenko

Reputation: 2506

I had the exact same problem. Couldn't (or didn't try hard enough) to find a setting for it, so instead just added this to my clients on page load:

document.windowid = Math.round(Math.random() * 1000000000000);

Then, add this to the message you emit in your client:

windowid: document.windowid

Then, when you accept data on the client, only do the action when windowid is not the same:

if (message.windowid != document.windowid)

It's not great and socket.io should take care of this issue, but this is the solution I used in my app :)

Upvotes: 1

Related Questions