Chris
Chris

Reputation: 459

Emit() to everyone in /namespace - NodeJS, Socket.IO

I have tried several variations of trying to emit to all users connected to a particular /namespace, but have had no luck. I could be misunderstanding how sockets work.

But what I have right now is two browsers open on different pages. When a user connects to pageA, that user is now part of '/users' namespace. When a user connects to pageB, that user is now part of '/valets' namespace.

I have a .emit() on pageA that sends to server.js. I listen for it with .on(), and then try to run .emit() but to only the users in '/valets' namespace.

I am able to see in my terminal "listening for request valet" and the console.log(data) part.

I believe my problem is the usr_nsp.of('/valets').emit("incoming-request",{data:data}); portion. The other commented lines are what I have tried so far. They all give me an error: is not a function.

server.js

var app = require('http').createServer();
var io = require('socket.io')(app);
app.listen(3000, function(){
    console.log('listening on port 3000');
});

var redis = require('socket.io/node_modules/redis');


// create custom namespace for Users
var room_number;
var usr_nsp = io.of('/users');
usr_nsp.on('connection', function(socket){
    console.log('user has connected to /users namespace');

    socket.on('request-valet', function(data){

        console.log("listening for request valet");
        console.log(data);
        room_number = data.room_number;
        socket.join(room_number);

        // usr_nsp.broadcast.of('/valets').emit("incoming-request",{repark:data});
        // usr_nsp.of('/valets').broadcast.emit("incoming-request",{repark:data});
        // io.of('/valets').emit("incoming-request",{repark:data});
        // socket.of('/valets').emit("incoming-request",{repark:data});
        usr_nsp.of('/valets').emit("incoming-request",{repark:data});

    });


});

var valet_nsp = io.of('/valets');
valet_nsp.on('connection', function(socket){
    console.log('valet has connected to /valets namespace');

    // var room_number;

    socket.on('join-room', function(data){
        // assign valet to room
        room_number = data.room_number;
        socket.join(room_number);

        //valet_nsp.sockets.in(room_number).emit("request-accepted",{current_pos:current_pos})

    });

    socket.on('set-valet-starting-position', function(data){

        //var valet_starting_pos = data.starting_position;
        valet_nsp.sockets.in(room_number).emit('activate-directions-service', {repark:data});
    })

    socket.on('get-new-location', function(data){

        // send the updated location only to User
        // maybe use .broadcast??
        valet_nsp.sockets.in(room_number).emit("update-valet-location", {current_pos:data});

    });

});

pageB.html (sockets portion)

socket.on('incoming-request', function(data){

        console.log("incoming request");
        alert("incoming request");

        // use data to display on html screen


    });

Upvotes: 1

Views: 1704

Answers (1)

vesse
vesse

Reputation: 5078

The namespace handle you created is used to emit to users in that particular namespace. This should thus work:

var users  = io.of('/users'),
    valets = io.of('/valets');

users.on('connection', function(socket) {
  socket.on('request-valet', function(data) {
    valets.emit('incoming-request', { repark : data });
  });
});

Upvotes: 1

Related Questions