roomsjs
Version:
adding postgres database connector example
135 lines (114 loc) • 4.62 kB
JavaScript
/*
* Copyright 2018 Elad Elrom, All Rights Reserved.
* Code licensed under the BSD License:
* @author Elad Elrom <elad.ny...gmail.com>
*/
let crypto = require('crypto'),
Swarm = require('discovery-swarm'),
defaults = require('dat-swarm-defaults'),
getPort = require('get-port'),
basketutil = require('./basketutil.js'),
peers = {},
counterforConnections = 0,
masterPeerId = Buffer.from('548e09f70356a1237594fbe489e33684', 'hex'),
channel,
peerType,
PEER_MASTER = 'master',
PEER_SLAVE = 'slave',
roomsCallbackFromP2P;
let initP2PMasterServer = (channelName, type, callback) => {
roomsCallbackFromP2P = callback;
channel = channelName;
peerType = type;
let config = defaults({
id: masterPeerId,
});
let swarm = Swarm(config);
(async () => {
let randomUnusedPortToListenToTCPPeerConnections = await getPort();
basketutil.log('type: ' + peerType + ', masterPeerId: ' + masterPeerId.toString('hex') + ', channel: ' + channelName + ', port: ' + randomUnusedPortToListenToTCPPeerConnections);
swarm.listen(randomUnusedPortToListenToTCPPeerConnections);
swarm.join(channel);
swarm.on('connection', (conn, info) => {
let seq = counterforConnections,
checkMasterPeerId = info.id.toString('hex');
basketutil.log(`Master Connected #${seq} to peer: ${checkMasterPeerId}`);
// Keep peer alive
if (info.initiator) {
try {
conn.setKeepAlive(true, 600);
} catch (exception) {
basketutil.log('exception', exception);
}
}
conn.on('data', data => {
basketutil.log('From: ' + checkMasterPeerId);
let mPeerId = masterPeerId.toString('hex');
if (checkMasterPeerId == mPeerId) {
basketutil.log('ignore messages sent by myself');
}
basketutil.log('From: ' + checkMasterPeerId);
basketutil.log('Received message' + Buffer.from(data, 'hex'));
let message = JSON.parse(data);
roomsCallbackFromP2P(checkMasterPeerId, message.type, message.data);
});
conn.on('close', () => {
basketutil.log(`Master Connection ${seq} closed, peer id: ${checkMasterPeerId}`);
// If last connection delete
if (peers[checkMasterPeerId].seq === seq) {
delete peers[checkMasterPeerId]
}
});
// Save connection
if (!peers[checkMasterPeerId]) {
peers[checkMasterPeerId] = {}
}
peers[checkMasterPeerId].conn = conn;
peers[checkMasterPeerId].seq = seq;
counterforConnections++
})
})();
};
sendMessageToAllPeersExceptFromPeerId = (msg, fromId) => {
basketutil.log('sendMessageToAllPeersExceptFromPeerId :: ' + msg);
for (let id in peers) {
if (id !== fromId)
peers[id].conn.write('MsgFrom: ' + fromId + ', msg:' + msg);
}
};
writeMessageToPeer = (toUserId, type, data) => {
basketutil.log('sendMessageToAllPeersExceptFromPeerId :: type: ' + type + ', to: ' + toUserId);
for (let id in peers) {
if (id == toUserId) {
console.log('-------- send message -------- ');
console.log('message to roomjs peer: ' + id);
peers[id].conn.write(JSON.stringify(
{
to: toUserId,
type: type,
data: data
}
));
}
}
};
function exitHandler(options, exitCode) {
if (options.cleanup) console.log('clean');
if (exitCode || exitCode === 0) console.log(exitCode);
if (options.exit) process.exit();
}
process.on('exit', exitHandler.bind(null,{cleanup:true}));
//catches ctrl+c event
process.on('SIGINT', exitHandler.bind(null, {exit:true}));
// catches "kill pid" (for example: nodemon restart)
process.on('SIGUSR1', exitHandler.bind(null, {exit:true}));
process.on('SIGUSR2', exitHandler.bind(null, {exit:true}));
//catches uncaught exceptions
process.on('uncaughtException', exitHandler.bind(null, {exit:true}));
if (typeof exports != 'undefined' ) {
exports.initP2PMasterServer = initP2PMasterServer;
exports.PEER_SLAVE = PEER_SLAVE;
exports.PEER_MASTER = PEER_MASTER;
exports.roomsCallbackFromP2P = roomsCallbackFromP2P;
exports.writeMessageToPeer = writeMessageToPeer;
}