smugford
smugford

Reputation: 769

handle browser refresh socket.io

I have a requirement using node js that handles disconnecting a user from a chat application.

I am not sure how to handle telling the difference between a browser closing and a user refreshing the browser.

client.on('disconnect', function () {
        console.log( 'Disconnected' );
        // run mysql code to remove user from logged in table
});

I have googled for a couple hours and cannot find a solution.

This seems like something pretty simple and I think it is the keywords that I am using.

Can someone point me in the right direction on how to handle this?

Thanks in advance.

Upvotes: 2

Views: 11473

Answers (2)

andreasonny83
andreasonny83

Reputation: 1213

I have a better solution for that to handle multiple users:

var users = [],
    users_connected = [];

io.on('connection', function(socket) {
  var uid = null;

  // register the new user
  socket.on('register', function (user_uid) {
    if ( users_connected.indexOf(user_uid) < 0 ) {
      users_connected.push(user_uid);
    }

    if ( users.indexOf(user_uid) < 0 ) {
      console.log('New user connected: ' + user_uid);
      users.push(user_uid);

      // notify other clients that a new user has joined
      socket.broadcast.emit('user:join', {
        name: user_uid,
        users: users_connected.length
      });
    }

    uid = user_uid;
  });

  // clean up when a user leaves, and broadcast it to other users
  socket.on('disconnect', function () {
    users_connected.splice( users_connected.indexOf(uid), 1);

    setTimeout(function () {
      if ( users_connected.indexOf(uid) < 0 ) {
        socket.broadcast.emit('user:left', {
          name: uid
        });

        var index = users.indexOf(uid);
        users.splice(index, 1);
      }
    }, 3000);
  });

});

Upvotes: 3

Cam Cecil
Cam Cecil

Reputation: 328

One way would be to generate a random UID and save it to local storage. Right after the client connects, send this UID to the server and check to see if that UID exists as a connected user. On the server side, set a timeout in the disconnect that gives the user 15 seconds or so before their unique UID is deleted from the "users online" data.

Client:

// When the client starts, create the uid.
localstorage.setItem('uUID', Math.random().toString(24) + new Date());

// Emit the UID right after connection
socket.emit('userLogin', localstorage.getItem('uUID');

Server:

var currentUIDS = [];
var userIsConnected = true;


io.sockets.on('connection', function (socket) {
    var currentUID = null;

    socket.on('userLogin', function (data) {
        if (data !== null) {
            if (currentUIDS.includes(data)) {
                userIsConnected = true;
        currentUID = data;
            }
        }
    });

    socket.on('disconnect', function () {
        userIsConnected = false;
        setTimeout(function () {
            if (!userIsConnected) currentUIDS.pop(currentUID);
        }, 15000);
    });
});

Upvotes: 5

Related Questions