Source: Utils/signal.js

const net = require('net');
const logger = require('./logger');
const { prepareNetworkMapData, jsonDecodeObj } = require('./networking');
const { POOL_ADDRESS, POOL_PORT } = require('./config');

let peers = [];

/**
 * Creates a signaling server which provides the data about peers connected to blockchain
 * @type {Server}
 */
const server = net.createServer((socket) => {

    socket.on('error', (err) => {
        logger.error(`socket error: ${err}`);
    });

    socket.on('data', (obj) => {

        let hostInfo = jsonDecodeObj(obj);

        if (hostInfo.needData) {
            logger.log('verbose', `Requested list of all users!`);
        } else {
            if (hostInfo.connected) {
                peers.push([
                        hostInfo.ip,
                        hostInfo.port,
                        hostInfo.name
                    ]
                );
                logger.log('info', `Added new user to list! ${hostInfo.ip}:${hostInfo.port}`);
            } else {
                logger.log('verbose', 'Deleting disconnected user...');
                peers.forEach((peerInfo, index, object) => {
                    const ip = peerInfo[0];
                    const port = peerInfo[1];
                    if (hostInfo.ip === ip && hostInfo.port === port)
                        object.splice(index, 1);
                });
            }
        }
    });

    let data = prepareNetworkMapData(peers);
    socket.write(data);

    socket.on('close', () => {
        logger.log('verbose', 'SOCKED CLOSED');
    });
});

server.on('connection', () => {
    logger.log('verbose', 'New connection');
});

/**
 * Starts the signaling server
 * @param port
 * @param address
 */
module.exports.start = (port = POOL_PORT, address = POOL_ADDRESS) => {
    server.listen(port, address);
    logger.log('info', `Signaling server listening on: ${address+':'+port}`);
};

/**
 * Return the list of connected peers
 * @returns {Array}
 */
module.exports.peers = () => {
    return peers;
};

/**
 * Clear peer list
 */
module.exports.clearList = () => {
  peers = [];
};