absenat
Version:
dedicated messaging service core
77 lines (76 loc) • 2.27 kB
JavaScript
/**
* @author mr-exception
* @description generates the main message
* @param {string} id
* @param {array[string]} chunks
* @param {string} dst_public_key
*/
const generateMessages = (id, chunks, dst_public_key) => {
// declare count of chunks have to be sent
const c = chunks.length;
// devlare the array of sending chunks before encrypting
const result = [];
for (let i = 0; i < chunks.length; i++) {
const chunk = {
i, c, id,
data: chunks[i],
};
if (i === c - 1)
chunk.pk = dst_public_key;
result.push(chunk);
}
return result;
}
/**
* @author mr-exception
* @description converts a message into chunks
* @param {string} id
* @param {string} content
* @param {string} dst_public_key
*/
const chunkStringMessage = (id, content, dst_public_key) => {
const chunks = [];
// creating rsa node from public key
const dstPublicKey = createPublicKey(dst_public_key);
for (let i = 0; i < content.length; i += 128) {
chunks.push(dstPublicKey.encrypt(content.substring(i, i + 128)));
}
return generateMessages(id, chunks, dst_public_key);
}
/**
* @author mr-exception
* @description stringifies message
* @param {string} id
* @param {string} content
* @param {string} dst_public_key
*/
global.chunkMessage = (id, content, dst_public_key) => {
const message = JSON.stringify(content);
return chunkStringMessage(id, message, dst_public_key);
}
/**
* @author mr-exception
* @description saves a chunked message into a single file and submits it in database
* @param {string} id
* @param {string} src_public_key
* @param {string} dst_public_key
* @param {array[Burffer]} chunks
*/
global.saveMessage = (id, src_public_key, dst_public_key, chunks) => {
// saving message conent in a file
if (!fs.existsSync('./storage')) {
fs.mkdirSync('./storage');
if (!fs.existsSync('./storage/bridge')) {
fs.mkdirSync('./storage/bridge');
}
}
const file = fs.createWriteStream(`./storage/bridge/${id}.data`);
for (const i in chunks) {
const data = Buffer.from(chunks[i]);
file.write(data);
}
file.end();
// saving message informations in database
db.saveBridgeMessage(id, src_public_key, dst_public_key, `./storage/bridge/${id}.data`);
return true;
}