UNPKG

absenat

Version:

dedicated messaging service core

96 lines (95 loc) 3.81 kB
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); }); }); } }