0

I am stuck in a problem.

I am making a Socket.IO connection in the bin file which is working, but can anyone tell me how I can export this connection to different controller. This is my bin file code.

var app = require('../app');
var debug = require('debug')('userservice:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3015');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = http.createServer(app);
var io = require('socket.io')(server);
io.on('connection', (socket) => {
  console.log('Connection made #######################################################.', socket.id);
  socket.on('disconnect', () => {
    console.log('Connection disconnected @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.', socket.id);
  });
});
/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
Shubham Joshi
  • 22
  • 2
  • 4

3 Answers3

4

There is plenty of techniques can be used to re-use the socket instance, an easy and simple one is to create a singular class, to be able to:

  1. Initiate socket instance
  2. Export the instance to other modules

socket.js:

let io;

module.exports = {
  init: (server) => {
    io = require('socket.io').listen(server); io.origins('*:*');
    return io;
  },
  get: () => {
    if (!io) {
      throw new Error("socket is not initialized");
    }
    return io;
  }
};

server.js:

const app = require('../app');
const http = require('http');

/**
 * Get port from environment and store in Express.
 */

const port = '3015';
app.set('port', port);

/**
 * Create HTTP server.
 */

const server = http.createServer(app);
const io = require('./socket.js').init(server);

io.on('connection', (socket) => {
  console.log('Connection success', socket.id);
  socket.on('disconnect', () => {
    console.log('Connection disconnected', socket.id);
  });
}

Now you can use it in other modules.

const io = require('./socket.js').get();
MAS
  • 706
  • 1
  • 5
  • 14
0

You could just create a socket.io controller module that exports a function that you call for every new connection.

So, in your current server file, you add this:

const {socketConnected} = require('socketController.');

And, you modify this portion to call it for each new socket:

var server = http.createServer(app);
var io = require('socket.io')(server);
io.on('connection', (socket) => {
  console.log('Connection made #######################################################.', socket.id);
  // tell controller about new socket (and pass the io instance)
  socketConnected(socket, io);
  socket.on('disconnect', () => {
    console.log('Connection disconnected @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.', socket.id);
  });
});

Then, your socket controller can be like this:

module.exports.socketConnected = function(socket, io) {
    // new socket.io socket connected
    console.log(`controller: got socket.io connection ${socket.id}`);

    // register appropriate event handlers on the socket here
}
jfriend00
  • 683,504
  • 96
  • 985
  • 979
0

We can export the socket module in every file by creating a global object in such a way.

let io;
const connectedUsers = [];
const setupSocketIO = function (server) {
  io = require('socket.io')(server, { cors: { origin: '*' } });
  io.on('connection', function (socket) {
    connectedUsers[connectedUsers.length] = socket.id;
    socket.on('getConnectedUsers', () => {
      io.sockets.emit('returnConnectedUsers', connectedUsers.length);
    });
    socket.on('disconnect', () => {
      let socketIdToRemoveIndex = -1;
      for (let i = 0; i < connectedUsers.length; i++) {
        if (connectedUsers[i] === socket.id) {
          socketIdToRemoveIndex = i;
        }
      }
      if (socketIdToRemoveIndex !== -1) {
        connectedUsers.splice(socketIdToRemoveIndex, 1);
      }
      io.sockets.emit('connectedUsers', connectedUsers.length);
    });
  });
};
const Socket = function () {
  return {
    emit: function (event, data) {
      io.sockets.emit(event, data);
    },
    to: function (roomId, event, data) {
      io.sockets.to(roomId).emit(event, data);
    },
  };
};
exports.setupSocketIO = setupSocketIO;
exports.Socket = Socket;

And in file or componenet, we want to use.

const getAllProjects = async (req, res) => {
    let Socket = require('../sockets').Socket();
    Socket.emit('SOCKET_PUSH_NOTIFICATION', { data: 'This is random data' });
    Socket.to('SOCKET_PUSH_NOTIFICATION', 'event', { data: 'Muhammad' });
}