absenat
Version:
dedicated messaging service core
96 lines (95 loc) • 3.81 kB
JavaScript
const dtn_list = {};
const profile_lists = {};
module.exports = {
init: (io) => {
/**
* ===============================================
* Step 0: sends public key to dst node
* ===============================================
*/
io.on('connect_0', (socket, contact_nickname, contact_public_key) => {
console.log(`${socket.id} connected as ${from}`);
connections[socket.id] = {
nickname: contact_nickname,
public_key: contact_public_key,
socket,
};
/**
* ===============================================
* Step 1: dst node sends public key and a random number (DTN or dst trust number), encrypted by src node public key to src node
* ===============================================
*/
const contactPublicKeyNode = createPublicKey(contact_public_key);
const dtn = parseInt(Math.random() * 99999);
dtn_list[contact_public_key] = dtn;
socket.emit('connect_1', config.nickname, contactPublicKeyNode.encrypt(JSON.stringify({ public_key: config.public_key, dtn })));
});
io.on('connect_2', (socket, contact_public_key, cipher) => {
const answer = JSON.parse(myPrivateKey.decrypt(cipher));
const correct_dtn = dtn_list[contact_public_key];
if (answer.dtn !== correct_dtn) {
console.log(chalk.red('Err: invalid DTN.'));
delete dtn_list[contactPublicKeyNode];
cli.finished();
} else {
console.log(chalk.green('DTN is valid.'));
/**
* ===============================================
* Step 3: sends stn to src node to completing the trust level
* ===============================================
*/
socket.emit('connect_3', config.public_key, contactPublicKeyNode.encrypt(answer.stn));
}
});
/**
* ===============================================
* Step 3: recieves stn from dst to complete the trust level
* ===============================================
*/
socket.on('connect_3', (contact_public_key, cipher) => {
console.log(chalk.green('DTN is valid. finished the trusting level!'));
const answer = parseInt(myPrivateKey.decrypt(cipher).toString());
if (answer === stn) {
const address = socket.handshake.address;
console.log(address);
db.addBridge('NuLL', 'NuLL', contact_public_key, address.address, address.port);
console.log(chalk.green('STN is valid.'));
// hearbeat progress
setInterval(() => {
socket.emit('hi_im_normal');
}, config.max_timeout);
socket.on('hi_im_bridge', () => {
db.bridgeHeartBeat(contact_public_key);
});
handlers.messages(socket);
/**
* ===============================================
* Step 4: tells dst node that finished the trusing level
* ===============================================
*/
socket.emit('connect_4', config.public_key);
finished();
} else {
console.log(chalk.red('Err: invalid STN.'));
}
});
/**
* ===============================================
* Step 4: sends stn to src node to completing the trust level
* ===============================================
*/
io.on('connect_4', (socket, contact_public_key) => {
console.log(chalk.green('STN is valid. finished the trusting level!'));
db.addConnection(from, socket, contact_public_key);
cli.finished();
// hearbeat progress
setInterval(() => {
socket.emit('hi_im_bridge');
}, config.max_timeout);
socket.on('hi_im_normal', () => {
db.connectionHeartBeat(contact_public_key);
send_undelivereds(socket, contact_public_key);
});
});
}
}