Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can i share socket.io into other modules in nodejs?

I have the following structure of my project in node

project structure

in a app.js, let's say i have a app.js like this

'use strict'
const express = require('express');

const realtime = require('./controllers/realtime');

const app = express();
const server = require('http').Server(app);



var sessionMiddleware = session(sessionConfig);
realtime(server,sessionMiddleware);

in a controllers/realtime.js

"use strict";
const config = require("../config");

module.exports = (server,sessionMiddleware) => {
    const io = require('socket.io')(server);

    io.use(function(socket, next) {
        sessionMiddleware(socket.request, socket.request.res, next);
    });

    io.on('connection', (socket) => {

        socket.on('statusConnetion',(data)=>{
            console.log(data)
        });

        socket.on('disconnect', function () {
            console.log(socket.id,"Un socket se desconecto");
        });

        console.log(`New socket connection: ${socket.id}`);
    });    
}

in controllers/cargos.js

const express = require('express');
const router = express.Router();
let cargos = {};

cargos.update = (req, res, next) =>{
    //How can I use sockets here?
}

module.exports = cargos;

How can I use sockets in the file cargos.js and other controllers?

like image 941
Thaylor Mosquera Castro Avatar asked Apr 23 '18 11:04

Thaylor Mosquera Castro


1 Answers

You can export not only the function that initiates the server, but a class that handles all the socket.io connection and functionality. This class will be a singleton and will have functions that uses the connection, and can be usable in the different modules.

example: app.js:

'use strict'
const express = require('express');

const realtime = require('./controllers/realtime');

const app = express();
const server = require('http').Server(app);



var sessionMiddleware = session(sessionConfig);
realtime.connect(server,sessionMiddleware);

realtime.js:

let connection = null;

class Realtime {
    constructor() {
        this._socket = null;
    }
    connect(server,sessionMiddleware) {
        const io = require('socket.io')(server);

        io.use(function(socket, next) {
            sessionMiddleware(socket.request, socket.request.res, next);
        });
        io.on('connection', (socket) => {
            this._socket = socket; 
            this._socket.on('statusConnetion',(data)=>{
                console.log(data)
            });

            this._socket.on('disconnect', function () {
                console.log(socket.id,"Un socket se desconecto");
            });

            console.log(`New socket connection: ${socket.id}`);
        });
    }

    sendEvent(event, data) {
        this._socket.emit(event, data);
    }

    registerEvent(event, handler) {
        this._socket.on(event, handler);
    }

    static init(server,sessionMiddleware) {
        if(!connection) {
            connection = new Realtime();
            connection.connect(server,sessionMiddleware);
        }
    }

    static getConnection() {
        if(!connection) {
            throw new Error("no active connection");
        }
        return connection;
    }
}

module.exports = {
    connect: Realtime.init,
    connection: Realtime.getConnection 
}

cargos.js:

const express = require('express');
const router = express.Router();

let cargos = {};

cargos.update = (req, res, next) =>{
    const connection  = require('./controllers/realtime').connection();
    connection.sendEvent("update", {params: req.params});
}

module.exports = cargos;
like image 161
RomanY Avatar answered Sep 25 '22 00:09

RomanY