import { models } from '../models' import * as LND from '../utils/lightning' import {personalizeMessage} from '../utils/msg' import * as path from 'path' import * as tribes from '../utils/tribes' const constants = require(path.join(__dirname,'../../config/constants.json')) export function signAndSend(opts){ return new Promise(async function(resolve, reject) { if(!opts.data || typeof opts.data!=='object') { return reject('object plz') } let data = JSON.stringify(opts.data) // SIGN HERE and append sig const sig = await LND.signAscii(data) data = data + sig console.log("DATA") console.log(opts.data) try { const payload = opts.data if(payload.chat&&payload.chat.type===constants.chat_types.tribe) { // if owner pub to mqtt all group members (but not to self!!!) const chatUUID = payload.chat.uuid const recipient = opts.dest if(!chatUUID || !recipient) return const tribeOwnerPubKey = await tribes.verifySignedTimestamp(chatUUID) const owner = await models.Contact.findOne({ where: { isOwner: true } }) if(owner.publicKey===tribeOwnerPubKey){ tribes.publish(`${recipient}/${chatUUID}`, data) } else { // else keysend to owner ONLY if(recipient===tribeOwnerPubKey) { LND.keysendMessage({...opts,data}) } } } else { LND.keysendMessage({...opts,data}) } } catch(e) { throw e } }) } export async function sendMessage(params) { const { type, chat, message, sender, amount, success, failure } = params const m = newmsg(type, chat, sender, message) const contactIds = typeof chat.contactIds==='string' ? JSON.parse(chat.contactIds) : chat.contactIds let yes:any = null let no:any = null console.log('all contactIds',contactIds) await asyncForEach(contactIds, async contactId => { if (contactId == sender.id) { return } console.log('-> sending to contact #', contactId) const contact = await models.Contact.findOne({ where: { id: contactId } }) const destkey = contact.publicKey const finalMsg = await personalizeMessage(m, contactId, destkey) const opts = { dest: destkey, data: finalMsg, amt: Math.max(amount, 3) } try { const r = await signAndSend(opts) yes = r } catch (e) { console.log("KEYSEND ERROR", e) no = e } }) if(yes){ if(success) success(yes) } else { if(failure) failure(no) } } function newmsg(type, chat, sender, message){ return { type: type, chat: { uuid: chat.uuid, ...chat.name && { name: chat.name }, ...(chat.type||chat.type===0) && { type: chat.type }, ...chat.members && { members: chat.members }, ...chat.groupKey && { groupKey: chat.groupKey }, ...chat.host && { host: chat.host } }, message: message, // sender: { // pub_key: sender.publicKey, // // ...sender.contactKey && {contact_key: sender.contactKey} // } } } async function asyncForEach(array, callback) { for (let index = 0; index < array.length; index++) { await callback(array[index], index, array); } }