Browse Source

network send receive interfaces

feature/dockerfile-arm
Evan Feenstra 5 years ago
parent
commit
c91c218227
  1. 32
      api/controllers/index.ts
  2. 82
      api/grpc/index.ts
  3. 2
      api/helpers.ts
  4. 14
      api/network/index.ts
  5. 117
      api/network/receive.ts
  6. 14
      api/network/send.ts
  7. 1
      api/utils/lightning.ts
  8. 2
      api/utils/msg.ts
  9. 16
      api/utils/tribes.ts
  10. 8
      app.ts
  11. 33
      dist/api/controllers/index.js
  12. 2
      dist/api/controllers/index.js.map
  13. 87
      dist/api/grpc/index.js
  14. 2
      dist/api/grpc/index.js.map
  15. 1
      dist/api/network.js.map
  16. 10
      dist/api/network/index.js
  17. 1
      dist/api/network/index.js.map
  18. 140
      dist/api/network/receive.js
  19. 1
      dist/api/network/receive.js.map
  20. 34
      dist/api/network/send.js
  21. 1
      dist/api/network/send.js.map
  22. 1
      dist/api/utils/lightning.js
  23. 2
      dist/api/utils/lightning.js.map
  24. 12
      dist/api/utils/msg.js
  25. 2
      dist/api/utils/msg.js.map
  26. 18
      dist/api/utils/tribes.js
  27. 2
      dist/api/utils/tribes.js.map
  28. 8
      dist/app.js
  29. 2
      dist/app.js.map

32
api/controllers/index.ts

@ -1,10 +1,5 @@
import {models} from '../models'
import * as lndService from '../grpc'
import {checkTag} from '../utils/gitinfo'
import {getInfo} from '../utils/lightning'
import * as path from 'path'
const constants = require(path.join(__dirname,'../../config/constants.json'))
const env = process.env.NODE_ENV || 'development';
console.log("=> env:",env)
@ -23,31 +18,6 @@ let controllers = {
confirmations: require('./confirmations')
}
async function iniGrpcSubscriptions() {
try{
await getInfo()
const types = constants.message_types
await lndService.subscribeInvoices({
[types.contact_key]: controllers.contacts.receiveContactKey,
[types.contact_key_confirmation]: controllers.contacts.receiveConfirmContactKey,
[types.message]: controllers.messages.receiveMessage,
[types.invoice]: controllers.invoices.receiveInvoice,
[types.direct_payment]: controllers.payments.receivePayment,
[types.confirmation]: controllers.confirmations.receiveConfirmation,
[types.attachment]: controllers.media.receiveAttachment,
[types.purchase]: controllers.media.receivePurchase,
[types.purchase_accept]: controllers.media.receivePurchaseAccept,
[types.purchase_deny]: controllers.media.receivePurchaseDeny,
[types.group_create]: controllers.chats.receiveGroupCreateOrInvite,
[types.group_invite]: controllers.chats.receiveGroupCreateOrInvite,
[types.group_join]: controllers.chats.receiveGroupJoin,
[types.group_leave]: controllers.chats.receiveGroupLeave,
})
} catch(e) {
throw e
}
}
async function set(app) {
if(models && models.Subscription){
@ -140,4 +110,4 @@ const login = (req, res) => {
}
}
export {set, iniGrpcSubscriptions}
export {set, controllers}

82
api/grpc/index.ts

@ -3,85 +3,15 @@ import * as socket from '../utils/socket'
import { sendNotification, sendInvoice } from '../hub'
import * as jsonUtils from '../utils/json'
import * as decodeUtils from '../utils/decode'
import {loadLightning, SPHINX_CUSTOM_RECORD_KEY, verifyAscii} from '../utils/lightning'
import * as controllers from '../controllers'
import {loadLightning} from '../utils/lightning'
import * as network from '../network'
import * as moment from 'moment'
import * as path from 'path'
import {parseKeysendInvoice} from '../network'
const constants = require(path.join(__dirname,'../../config/constants.json'))
// VERIFY PUBKEY OF SENDER
async function parseAndVerifyPayload(data){
let payload
const li = data.lastIndexOf('}')
const msg = data.substring(0,li+1)
const sig = data.substring(li+1)
try {
payload = JSON.parse(msg)
if(payload) {
const v = await verifyAscii(msg, sig)
if(v && v.valid && v.pubkey) {
payload.sender = payload.sender||{}
payload.sender.pub_key=v.pubkey
return payload
}
}
} catch(e) {
return null
}
}
async function parseKeysendInvoice(i, actions){
const recs = i.htlcs && i.htlcs[0] && i.htlcs[0].custom_records
const buf = recs && recs[SPHINX_CUSTOM_RECORD_KEY]
const data = buf && buf.toString()
const value = i && i.value && parseInt(i.value)
if(!data) return
let payload
if(data[0]==='{'){
try {
payload = await parseAndVerifyPayload(data)
} catch(e){}
} else {
const threads = weave(data)
if(threads) payload = await parseAndVerifyPayload(threads)
}
if(payload){
const dat = payload.content || payload
if(value && dat && dat.message){
dat.message.amount = value // ADD IN TRUE VALUE
}
if(actions[payload.type]) {
actions[payload.type](payload)
} else {
console.log('Incorrect payload type:', payload.type)
}
}
}
const chunks = {}
function weave(p){
const pa = p.split('_')
if(pa.length<4) return
const ts = pa[0]
const i = pa[1]
const n = pa[2]
const m = pa.filter((u,i)=>i>2).join('_')
chunks[ts] = chunks[ts] ? [...chunks[ts], {i,n,m}] : [{i,n,m}]
if(chunks[ts].length===parseInt(n)){
// got em all!
const all = chunks[ts]
let payload = ''
all.slice().sort((a,b)=>a.i-b.i).forEach(obj=>{
payload += obj.m
})
delete chunks[ts]
return payload
}
}
function subscribeInvoices(actions) {
function subscribeInvoices() {
return new Promise(async(resolve,reject)=>{
const lightning = await loadLightning()
@ -93,7 +23,7 @@ function subscribeInvoices(actions) {
}
// console.log("IS KEYSEND", response.is_keysend)
if(response.is_keysend) {
parseKeysendInvoice(response, actions)
parseKeysendInvoice(response)
} else {
const invoice = await models.Message.findOne({ where: { type: constants.message_types.invoice, payment_request: response['payment_request'] } })
if (invoice == null) {
@ -177,7 +107,7 @@ async function reconnectToLND(){
i++
console.log(`=> [lnd] reconnecting... attempt #${i}`)
try {
await controllers.iniGrpcSubscriptions()
await network.initGrpcSubscriptions()
const now = moment().format('YYYY-MM-DD HH:mm:ss').trim();
console.log(`=> [lnd] reconnected! ${now}`)
} catch(e) {

2
api/helpers.ts

@ -146,7 +146,7 @@ async function parseReceiveParams(payload) {
const mediaKey = dat.message.mediaKey
const mediaType = dat.message.mediaType
const isConversation = chat_type && chat_type == constants.chat_types.group
const isConversation = !chat_type || (chat_type && chat_type == constants.chat_types.conversation)
let sender
let chat
const owner = await models.Contact.findOne({ where: { isOwner: true } })

14
api/network/index.ts

@ -0,0 +1,14 @@
import {sendMessage,signAndSend} from './send'
import {initGrpcSubscriptions,initTribesSubscriptions,parseKeysendInvoice} from './receive'
/*
Abstracts between lightning network and MQTT depending on Chat type and sender
*/
export {
sendMessage,signAndSend,
initGrpcSubscriptions,
initTribesSubscriptions,
parseKeysendInvoice,
}

117
api/network/receive.ts

@ -0,0 +1,117 @@
import * as path from 'path'
import * as lndService from '../grpc'
import {getInfo} from '../utils/lightning'
import {controllers} from '../controllers'
import * as tribes from '../utils/tribes'
import {SPHINX_CUSTOM_RECORD_KEY, verifyAscii} from '../utils/lightning'
const constants = require(path.join(__dirname,'../../config/constants.json'))
const types = constants.message_types
const ACTIONS = {
[types.contact_key]: controllers.contacts.receiveContactKey,
[types.contact_key_confirmation]: controllers.contacts.receiveConfirmContactKey,
[types.message]: controllers.messages.receiveMessage,
[types.invoice]: controllers.invoices.receiveInvoice,
[types.direct_payment]: controllers.payments.receivePayment,
[types.confirmation]: controllers.confirmations.receiveConfirmation,
[types.attachment]: controllers.media.receiveAttachment,
[types.purchase]: controllers.media.receivePurchase,
[types.purchase_accept]: controllers.media.receivePurchaseAccept,
[types.purchase_deny]: controllers.media.receivePurchaseDeny,
[types.group_create]: controllers.chats.receiveGroupCreateOrInvite,
[types.group_invite]: controllers.chats.receiveGroupCreateOrInvite,
[types.group_join]: controllers.chats.receiveGroupJoin,
[types.group_leave]: controllers.chats.receiveGroupLeave,
}
export async function initGrpcSubscriptions() {
try{
await getInfo()
await lndService.subscribeInvoices()
} catch(e) {
throw e
}
}
export async function initTribesSubscriptions(){
await tribes.connect((myPubKey)=>{ // connected callback
// get all tribes and sub to each individually ????
tribes.subscribe(`${myPubKey}/#`)
}, (topic, message)=>{ // onMessage callback
console.log("TOPIC", topic, "MESSAGE", message)
// check topic is signed by sender?
// fire off the ACTION
})
}
// VERIFY PUBKEY OF SENDER from sig
async function parseAndVerifyPayload(data){
let payload
const li = data.lastIndexOf('}')
const msg = data.substring(0,li+1)
const sig = data.substring(li+1)
try {
payload = JSON.parse(msg)
if(payload) {
const v = await verifyAscii(msg, sig)
if(v && v.valid && v.pubkey) {
payload.sender = payload.sender||{}
payload.sender.pub_key=v.pubkey
return payload
}
}
} catch(e) {
return null
}
}
export async function parseKeysendInvoice(i){
const recs = i.htlcs && i.htlcs[0] && i.htlcs[0].custom_records
const buf = recs && recs[SPHINX_CUSTOM_RECORD_KEY]
const data = buf && buf.toString()
const value = i && i.value && parseInt(i.value)
if(!data) return
let payload
if(data[0]==='{'){
try {
payload = await parseAndVerifyPayload(data)
} catch(e){}
} else {
const threads = weave(data)
if(threads) payload = await parseAndVerifyPayload(threads)
}
if(payload){
const dat = payload.content || payload
if(value && dat && dat.message){
dat.message.amount = value // ADD IN TRUE VALUE
}
if(ACTIONS[payload.type]) {
ACTIONS[payload.type](payload)
} else {
console.log('Incorrect payload type:', payload.type)
}
}
}
const chunks = {}
function weave(p){
const pa = p.split('_')
if(pa.length<4) return
const ts = pa[0]
const i = pa[1]
const n = pa[2]
const m = pa.filter((u,i)=>i>2).join('_')
chunks[ts] = chunks[ts] ? [...chunks[ts], {i,n,m}] : [{i,n,m}]
if(chunks[ts].length===parseInt(n)){
// got em all!
const all = chunks[ts]
let payload = ''
all.slice().sort((a,b)=>a.i-b.i).forEach(obj=>{
payload += obj.m
})
delete chunks[ts]
return payload
}
}

14
api/network.ts → api/network/send.ts

@ -1,13 +1,9 @@
import { models } from './models'
import * as LND from './utils/lightning'
import {personalizeMessage} from './utils/msg'
import { models } from '../models'
import * as LND from '../utils/lightning'
import {personalizeMessage} from '../utils/msg'
// const constants = require('../config/constants.json');
/*
Abstracts between lightning network and MQTT depending on Chat type and sender
*/
export function signAndSend(opts){
return new Promise(async function(resolve, reject) {
if(!opts.data || typeof opts.data!=='object') {
@ -18,6 +14,8 @@ export function signAndSend(opts){
const sig = await LND.signAscii(data)
data = data + sig
console.log("DATA")
console.log(opts.data)
// if tribe
// if owner pub to mqtt
// else keysend to owner ONLY
@ -73,7 +71,7 @@ function newmsg(type, chat, sender, message){
chat: {
uuid: chat.uuid,
...chat.name && { name: chat.name },
...chat.type && { type: chat.type },
...(chat.type||chat.type===0) && { type: chat.type },
...chat.members && { members: chat.members },
...chat.groupKey && { groupKey: chat.groupKey },
...chat.host && { host: chat.host }

1
api/utils/lightning.ts

@ -157,6 +157,7 @@ async function keysendMessage(opts) {
let fail = false
let res:any = null
const ts = new Date().valueOf()
// WEAVE MESSAGE If TOO LARGE
await asyncForEach(Array.from(Array(n)), async(u,i)=> {
const spliti = Math.ceil(opts.data.length/n)
const m = opts.data.substr(i*spliti, spliti)

2
api/utils/msg.ts

@ -64,7 +64,7 @@ async function personalizeMessage(m,contactId,destkey){
const cloned = JSON.parse(JSON.stringify(m))
const msg = addInRemoteText(cloned, contactId)
const cleanMsg = removeRecipientFromChatMembers(msg, destkey)
const cleanerMsg = removeAllNonAdminMembersIfTribe(msg, destkey)
const cleanerMsg = removeAllNonAdminMembersIfTribe(cleanMsg, destkey)
const msgWithMediaKey = addInMediaKey(cleanerMsg, contactId)
const finalMsg = await finishTermsAndReceipt(msgWithMediaKey, destkey)
return finalMsg

16
api/utils/tribes.ts

@ -8,25 +8,35 @@ import * as mqtt from 'mqtt'
const env = process.env.NODE_ENV || 'development'
const config = require(path.join(__dirname,'../../config/app.json'))[env]
export async function connect() {
let client:any
export async function connect(connectedCallback, onMessage) {
const pwd = await genSignedTimestamp()
const info = await LND.getInfo()
console.log('=========> try to connect:',`tcp://${config.tribes_host}`)
console.log('[tribes] try to connect:',`tcp://${config.tribes_host}`)
const client = mqtt.connect(`tcp://${config.tribes_host}`,{
client = mqtt.connect(`tcp://${config.tribes_host}`,{
username:info.identity_pubkey,
password:pwd,
})
client.on('connect', function () {
console.log("[tribes] connected!")
if(connectedCallback) connectedCallback(client, info.identity_pubkey)
// subscribe to all public groups here
// that you are NOT admin of (dont sub to your own!)
})
client.on('close', function () {
//console.log("MQTT CLOSED")
})
client.on('message', function(topic, message) {
if(onMessage) onMessage(topic, message)
})
}
export function subscribe(topic){
if(client) client.subscribe(topic)
}
export async function genSignedTimestamp(){

8
app.ts

@ -10,7 +10,7 @@ import {pingHubInterval, checkInvitesHubInterval} from './api/hub'
import {setupDatabase, setupDone} from './api/utils/setup'
import * as controllers from './api/controllers'
import * as socket from './api/utils/socket'
import * as tribes from './api/utils/tribes'
import * as network from './api/network'
let server: any = null
const port = process.env.PORT || 3001;
@ -28,9 +28,9 @@ async function connectToLND(){
i++
console.log(`=> [lnd] connecting... attempt #${i}`)
try {
await controllers.iniGrpcSubscriptions()
await mainSetup()
tribes.connect()
await network.initGrpcSubscriptions() // LND
await mainSetup() // DB + express
await network.initTribesSubscriptions() // MQTT
} catch(e) {
setTimeout(async()=>{ // retry each 2 secs
await connectToLND()

33
dist/api/controllers/index.js

@ -10,11 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
};
Object.defineProperty(exports, "__esModule", { value: true });
const models_1 = require("../models");
const lndService = require("../grpc");
const gitinfo_1 = require("../utils/gitinfo");
const lightning_1 = require("../utils/lightning");
const path = require("path");
const constants = require(path.join(__dirname, '../../config/constants.json'));
const env = process.env.NODE_ENV || 'development';
console.log("=> env:", env);
let controllers = {
@ -30,34 +26,7 @@ let controllers = {
media: require('./media'),
confirmations: require('./confirmations')
};
function iniGrpcSubscriptions() {
return __awaiter(this, void 0, void 0, function* () {
try {
yield lightning_1.getInfo();
const types = constants.message_types;
yield lndService.subscribeInvoices({
[types.contact_key]: controllers.contacts.receiveContactKey,
[types.contact_key_confirmation]: controllers.contacts.receiveConfirmContactKey,
[types.message]: controllers.messages.receiveMessage,
[types.invoice]: controllers.invoices.receiveInvoice,
[types.direct_payment]: controllers.payments.receivePayment,
[types.confirmation]: controllers.confirmations.receiveConfirmation,
[types.attachment]: controllers.media.receiveAttachment,
[types.purchase]: controllers.media.receivePurchase,
[types.purchase_accept]: controllers.media.receivePurchaseAccept,
[types.purchase_deny]: controllers.media.receivePurchaseDeny,
[types.group_create]: controllers.chats.receiveGroupCreateOrInvite,
[types.group_invite]: controllers.chats.receiveGroupCreateOrInvite,
[types.group_join]: controllers.chats.receiveGroupJoin,
[types.group_leave]: controllers.chats.receiveGroupLeave,
});
}
catch (e) {
throw e;
}
});
}
exports.iniGrpcSubscriptions = iniGrpcSubscriptions;
exports.controllers = controllers;
function set(app) {
return __awaiter(this, void 0, void 0, function* () {
if (models_1.models && models_1.models.Subscription) {

2
dist/api/controllers/index.js.map

File diff suppressed because one or more lines are too long

87
dist/api/grpc/index.js

@ -15,89 +15,12 @@ const hub_1 = require("../hub");
const jsonUtils = require("../utils/json");
const decodeUtils = require("../utils/decode");
const lightning_1 = require("../utils/lightning");
const controllers = require("../controllers");
const network = require("../network");
const moment = require("moment");
const path = require("path");
const network_1 = require("../network");
const constants = require(path.join(__dirname, '../../config/constants.json'));
// VERIFY PUBKEY OF SENDER
function parseAndVerifyPayload(data) {
return __awaiter(this, void 0, void 0, function* () {
let payload;
const li = data.lastIndexOf('}');
const msg = data.substring(0, li + 1);
const sig = data.substring(li + 1);
try {
payload = JSON.parse(msg);
if (payload) {
const v = yield lightning_1.verifyAscii(msg, sig);
if (v && v.valid && v.pubkey) {
payload.sender = payload.sender || {};
payload.sender.pub_key = v.pubkey;
return payload;
}
}
}
catch (e) {
return null;
}
});
}
function parseKeysendInvoice(i, actions) {
return __awaiter(this, void 0, void 0, function* () {
const recs = i.htlcs && i.htlcs[0] && i.htlcs[0].custom_records;
const buf = recs && recs[lightning_1.SPHINX_CUSTOM_RECORD_KEY];
const data = buf && buf.toString();
const value = i && i.value && parseInt(i.value);
if (!data)
return;
let payload;
if (data[0] === '{') {
try {
payload = yield parseAndVerifyPayload(data);
}
catch (e) { }
}
else {
const threads = weave(data);
if (threads)
payload = yield parseAndVerifyPayload(threads);
}
if (payload) {
const dat = payload.content || payload;
if (value && dat && dat.message) {
dat.message.amount = value; // ADD IN TRUE VALUE
}
if (actions[payload.type]) {
actions[payload.type](payload);
}
else {
console.log('Incorrect payload type:', payload.type);
}
}
});
}
const chunks = {};
function weave(p) {
const pa = p.split('_');
if (pa.length < 4)
return;
const ts = pa[0];
const i = pa[1];
const n = pa[2];
const m = pa.filter((u, i) => i > 2).join('_');
chunks[ts] = chunks[ts] ? [...chunks[ts], { i, n, m }] : [{ i, n, m }];
if (chunks[ts].length === parseInt(n)) {
// got em all!
const all = chunks[ts];
let payload = '';
all.slice().sort((a, b) => a.i - b.i).forEach(obj => {
payload += obj.m;
});
delete chunks[ts];
return payload;
}
}
function subscribeInvoices(actions) {
function subscribeInvoices() {
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
const lightning = yield lightning_1.loadLightning();
var call = lightning.subscribeInvoices();
@ -109,7 +32,7 @@ function subscribeInvoices(actions) {
}
// console.log("IS KEYSEND", response.is_keysend)
if (response.is_keysend) {
parseKeysendInvoice(response, actions);
network_1.parseKeysendInvoice(response);
}
else {
const invoice = yield models_1.models.Message.findOne({ where: { type: constants.message_types.invoice, payment_request: response['payment_request'] } });
@ -188,7 +111,7 @@ function reconnectToLND() {
i++;
console.log(`=> [lnd] reconnecting... attempt #${i}`);
try {
yield controllers.iniGrpcSubscriptions();
yield network.initGrpcSubscriptions();
const now = moment().format('YYYY-MM-DD HH:mm:ss').trim();
console.log(`=> [lnd] reconnected! ${now}`);
}

2
dist/api/grpc/index.js.map

File diff suppressed because one or more lines are too long

1
dist/api/network.js.map

@ -1 +0,0 @@
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../api/network.ts"],"names":[],"mappings":"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"}

10
dist/api/network/index.js

@ -0,0 +1,10 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const send_1 = require("./send");
exports.sendMessage = send_1.sendMessage;
exports.signAndSend = send_1.signAndSend;
const receive_1 = require("./receive");
exports.initGrpcSubscriptions = receive_1.initGrpcSubscriptions;
exports.initTribesSubscriptions = receive_1.initTribesSubscriptions;
exports.parseKeysendInvoice = receive_1.parseKeysendInvoice;
//# sourceMappingURL=index.js.map

1
dist/api/network/index.js.map

@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../api/network/index.ts"],"names":[],"mappings":";;AAAA,iCAA8C;AAQ1C,sBARI,kBAAW,CAQJ;AAAC,sBARI,kBAAW,CAQJ;AAP3B,uCAA2F;AAQvF,gCARI,+BAAqB,CAQJ;AACrB,kCAT0B,iCAAuB,CAS1B;AACvB,8BAVkD,6BAAmB,CAUlD"}

140
dist/api/network/receive.js

@ -0,0 +1,140 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
const lndService = require("../grpc");
const lightning_1 = require("../utils/lightning");
const controllers_1 = require("../controllers");
const tribes = require("../utils/tribes");
const lightning_2 = require("../utils/lightning");
const constants = require(path.join(__dirname, '../../config/constants.json'));
const types = constants.message_types;
const ACTIONS = {
[types.contact_key]: controllers_1.controllers.contacts.receiveContactKey,
[types.contact_key_confirmation]: controllers_1.controllers.contacts.receiveConfirmContactKey,
[types.message]: controllers_1.controllers.messages.receiveMessage,
[types.invoice]: controllers_1.controllers.invoices.receiveInvoice,
[types.direct_payment]: controllers_1.controllers.payments.receivePayment,
[types.confirmation]: controllers_1.controllers.confirmations.receiveConfirmation,
[types.attachment]: controllers_1.controllers.media.receiveAttachment,
[types.purchase]: controllers_1.controllers.media.receivePurchase,
[types.purchase_accept]: controllers_1.controllers.media.receivePurchaseAccept,
[types.purchase_deny]: controllers_1.controllers.media.receivePurchaseDeny,
[types.group_create]: controllers_1.controllers.chats.receiveGroupCreateOrInvite,
[types.group_invite]: controllers_1.controllers.chats.receiveGroupCreateOrInvite,
[types.group_join]: controllers_1.controllers.chats.receiveGroupJoin,
[types.group_leave]: controllers_1.controllers.chats.receiveGroupLeave,
};
function initGrpcSubscriptions() {
return __awaiter(this, void 0, void 0, function* () {
try {
yield lightning_1.getInfo();
yield lndService.subscribeInvoices();
}
catch (e) {
throw e;
}
});
}
exports.initGrpcSubscriptions = initGrpcSubscriptions;
function initTribesSubscriptions() {
return __awaiter(this, void 0, void 0, function* () {
yield tribes.connect((myPubKey) => {
// get all tribes and sub to each individually ????
tribes.subscribe(`${myPubKey}/#`);
}, (topic, message) => {
console.log("TOPIC", topic, "MESSAGE", message);
// check topic is signed by sender?
// fire off the ACTION
});
});
}
exports.initTribesSubscriptions = initTribesSubscriptions;
// VERIFY PUBKEY OF SENDER from sig
function parseAndVerifyPayload(data) {
return __awaiter(this, void 0, void 0, function* () {
let payload;
const li = data.lastIndexOf('}');
const msg = data.substring(0, li + 1);
const sig = data.substring(li + 1);
try {
payload = JSON.parse(msg);
if (payload) {
const v = yield lightning_2.verifyAscii(msg, sig);
if (v && v.valid && v.pubkey) {
payload.sender = payload.sender || {};
payload.sender.pub_key = v.pubkey;
return payload;
}
}
}
catch (e) {
return null;
}
});
}
function parseKeysendInvoice(i) {
return __awaiter(this, void 0, void 0, function* () {
const recs = i.htlcs && i.htlcs[0] && i.htlcs[0].custom_records;
const buf = recs && recs[lightning_2.SPHINX_CUSTOM_RECORD_KEY];
const data = buf && buf.toString();
const value = i && i.value && parseInt(i.value);
if (!data)
return;
let payload;
if (data[0] === '{') {
try {
payload = yield parseAndVerifyPayload(data);
}
catch (e) { }
}
else {
const threads = weave(data);
if (threads)
payload = yield parseAndVerifyPayload(threads);
}
if (payload) {
const dat = payload.content || payload;
if (value && dat && dat.message) {
dat.message.amount = value; // ADD IN TRUE VALUE
}
if (ACTIONS[payload.type]) {
ACTIONS[payload.type](payload);
}
else {
console.log('Incorrect payload type:', payload.type);
}
}
});
}
exports.parseKeysendInvoice = parseKeysendInvoice;
const chunks = {};
function weave(p) {
const pa = p.split('_');
if (pa.length < 4)
return;
const ts = pa[0];
const i = pa[1];
const n = pa[2];
const m = pa.filter((u, i) => i > 2).join('_');
chunks[ts] = chunks[ts] ? [...chunks[ts], { i, n, m }] : [{ i, n, m }];
if (chunks[ts].length === parseInt(n)) {
// got em all!
const all = chunks[ts];
let payload = '';
all.slice().sort((a, b) => a.i - b.i).forEach(obj => {
payload += obj.m;
});
delete chunks[ts];
return payload;
}
}
//# sourceMappingURL=receive.js.map

1
dist/api/network/receive.js.map

@ -0,0 +1 @@
{"version":3,"file":"receive.js","sourceRoot":"","sources":["../../../api/network/receive.ts"],"names":[],"mappings":"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"}

34
dist/api/network.js → dist/api/network/send.js

@ -9,23 +9,27 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const models_1 = require("./models");
const LND = require("./utils/lightning");
const msg_1 = require("./utils/msg");
const models_1 = require("../models");
const LND = require("../utils/lightning");
const msg_1 = require("../utils/msg");
// const constants = require('../config/constants.json');
/*
Abstracts between lightning network and MQTT depending on Chat type and sender
*/
function signAndSend(opts) {
return new Promise(function (resolve, reject) {
return __awaiter(this, void 0, void 0, function* () {
if (!opts.data || typeof opts.data !== 'string') {
return reject('string plz');
if (!opts.data || typeof opts.data !== 'object') {
return reject('object plz');
}
let data = JSON.stringify(opts.data);
// SIGN HERE and append sig
const sig = yield LND.signAscii(opts.data);
opts.data = opts.data + sig;
LND.keysendMessage(opts);
const sig = yield LND.signAscii(data);
data = data + sig;
console.log("DATA");
console.log(opts.data);
// if tribe
// if owner pub to mqtt
// else keysend to owner ONLY
// else:
LND.keysendMessage(Object.assign(Object.assign({}, opts), { data }));
});
});
}
@ -48,8 +52,8 @@ function sendMessage(params) {
const finalMsg = yield msg_1.personalizeMessage(m, contactId, destkey);
const opts = {
dest: destkey,
data: JSON.stringify(finalMsg),
amt: amount || 3,
data: finalMsg,
amt: Math.max(amount, 3)
};
try {
const r = yield signAndSend(opts);
@ -74,7 +78,7 @@ exports.sendMessage = sendMessage;
function newmsg(type, chat, sender, message) {
return {
type: type,
chat: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ uuid: chat.uuid }, chat.name && { name: chat.name }), chat.type && { type: chat.type }), chat.members && { members: chat.members }), chat.groupKey && { groupKey: chat.groupKey }), chat.host && { host: chat.host }),
chat: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ 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,
};
}
@ -85,4 +89,4 @@ function asyncForEach(array, callback) {
}
});
}
//# sourceMappingURL=network.js.map
//# sourceMappingURL=send.js.map

1
dist/api/network/send.js.map

@ -0,0 +1 @@
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../../api/network/send.ts"],"names":[],"mappings":"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"}

1
dist/api/utils/lightning.js

@ -170,6 +170,7 @@ function keysendMessage(opts) {
let fail = false;
let res = null;
const ts = new Date().valueOf();
// WEAVE MESSAGE If TOO LARGE
yield asyncForEach(Array.from(Array(n)), (u, i) => __awaiter(this, void 0, void 0, function* () {
const spliti = Math.ceil(opts.data.length / n);
const m = opts.data.substr(i * spliti, spliti);

2
dist/api/utils/lightning.js.map

File diff suppressed because one or more lines are too long

12
dist/api/utils/msg.js

@ -29,6 +29,15 @@ function removeRecipientFromChatMembers(full, destkey) {
delete members[destkey];
return fillchatmsg(full, { members });
}
function removeAllNonAdminMembersIfTribe(full, destkey) {
return full;
// const c = full && full.chat
// if (!(c && c.members)) return full
// if (!(typeof c.members==='object')) return full
// const members = {...c.members}
// if(members[destkey]) delete members[destkey]
// return fillchatmsg(full, {members})
}
function addInMediaKey(full, contactId) {
const m = full && full.message;
if (!(m && m.mediaKey))
@ -67,7 +76,8 @@ function personalizeMessage(m, contactId, destkey) {
const cloned = JSON.parse(JSON.stringify(m));
const msg = addInRemoteText(cloned, contactId);
const cleanMsg = removeRecipientFromChatMembers(msg, destkey);
const msgWithMediaKey = addInMediaKey(cleanMsg, contactId);
const cleanerMsg = removeAllNonAdminMembersIfTribe(cleanMsg, destkey);
const msgWithMediaKey = addInMediaKey(cleanerMsg, contactId);
const finalMsg = yield finishTermsAndReceipt(msgWithMediaKey, destkey);
return finalMsg;
});

2
dist/api/utils/msg.js.map

@ -1 +1 @@
{"version":3,"file":"msg.js","sourceRoot":"","sources":["../../../api/utils/msg.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"msg.js","sourceRoot":"","sources":["../../../api/utils/msg.ts"],"names":[],"mappings":"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"}

18
dist/api/utils/tribes.js

@ -16,26 +16,38 @@ const path = require("path");
const mqtt = require("mqtt");
const env = process.env.NODE_ENV || 'development';
const config = require(path.join(__dirname, '../../config/app.json'))[env];
function connect() {
let client;
function connect(connectedCallback, onMessage) {
return __awaiter(this, void 0, void 0, function* () {
const pwd = yield genSignedTimestamp();
const info = yield LND.getInfo();
console.log('=========> try to connect:', `tcp://${config.tribes_host}`);
const client = mqtt.connect(`tcp://${config.tribes_host}`, {
console.log('[tribes] try to connect:', `tcp://${config.tribes_host}`);
client = mqtt.connect(`tcp://${config.tribes_host}`, {
username: info.identity_pubkey,
password: pwd,
});
client.on('connect', function () {
console.log("[tribes] connected!");
if (connectedCallback)
connectedCallback(client, info.identity_pubkey);
// subscribe to all public groups here
// that you are NOT admin of (dont sub to your own!)
});
client.on('close', function () {
//console.log("MQTT CLOSED")
});
client.on('message', function (topic, message) {
if (onMessage)
onMessage(topic, message);
});
});
}
exports.connect = connect;
function subscribe(topic) {
if (client)
client.subscribe(topic);
}
exports.subscribe = subscribe;
function genSignedTimestamp() {
return __awaiter(this, void 0, void 0, function* () {
const now = moment().unix();

2
dist/api/utils/tribes.js.map

@ -1 +1 @@
{"version":3,"file":"tribes.js","sourceRoot":"","sources":["../../../api/utils/tribes.ts"],"names":[],"mappings":";;;;;;;;;;;AACA,iCAAgC;AAChC,qCAAoC;AACpC,mCAAkC;AAClC,6BAA4B;AAC5B,6BAA4B;AAE5B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAA;AACjD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAC,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAEzE,SAAsB,OAAO;;QACzB,MAAM,GAAG,GAAG,MAAM,kBAAkB,EAAE,CAAA;QACtC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAA;QAEhC,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAC,SAAS,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;QAEvE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,MAAM,CAAC,WAAW,EAAE,EAAC;YACtD,QAAQ,EAAC,IAAI,CAAC,eAAe;YAC7B,QAAQ,EAAC,GAAG;SACf,CAAC,CAAA;QAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE;YACjB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;YAClC,sCAAsC;YACtC,oDAAoD;QACxD,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE;YACf,4BAA4B;QAChC,CAAC,CAAC,CAAA;IACN,CAAC;CAAA;AAnBD,0BAmBC;AAED,SAAsB,kBAAkB;;QACpC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAA;QAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;QACpD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACpC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA;QACpD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAA;QAC3D,OAAO,SAAS,CAAC,GAAG,CAAC,CAAA;IACzB,CAAC;CAAA;AARD,gDAQC;AAED,SAAsB,qBAAqB,CAAC,SAAS;;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAC,EAAE,CAAC,CAAA;QACjC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACtC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA,CAAC,6BAA6B;QAC/F,IAAI,CAAC,CAAC,KAAK,EAAE;YACT,OAAO,CAAC,CAAC,MAAM,CAAA;SAClB;aAAM;YACH,OAAO,KAAK,CAAA;SACf;IACL,CAAC;CAAA;AAVD,sDAUC;AAED,SAAgB,OAAO;IACnB,OAAO,MAAM,CAAC,WAAW,IAAI,EAAE,CAAA;AACnC,CAAC;AAFD,0BAEC;AAED,SAAS,SAAS,CAAC,GAAG;IAClB,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AACzE,CAAC"}
{"version":3,"file":"tribes.js","sourceRoot":"","sources":["../../../api/utils/tribes.ts"],"names":[],"mappings":"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"}

8
dist/app.js

@ -21,7 +21,7 @@ const hub_1 = require("./api/hub");
const setup_1 = require("./api/utils/setup");
const controllers = require("./api/controllers");
const socket = require("./api/utils/socket");
const tribes = require("./api/utils/tribes");
const network = require("./api/network");
let server = null;
const port = process.env.PORT || 3001;
const env = process.env.NODE_ENV || 'development';
@ -35,9 +35,9 @@ function connectToLND() {
i++;
console.log(`=> [lnd] connecting... attempt #${i}`);
try {
yield controllers.iniGrpcSubscriptions();
yield mainSetup();
tribes.connect();
yield network.initGrpcSubscriptions(); // LND
yield mainSetup(); // DB + express
yield network.initTribesSubscriptions(); // MQTT
}
catch (e) {
setTimeout(() => __awaiter(this, void 0, void 0, function* () {

2
dist/app.js.map

@ -1 +1 @@
{"version":3,"file":"app.js","sourceRoot":"","sources":["../app.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"app.js","sourceRoot":"","sources":["../app.ts"],"names":[],"mappings":"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"}
Loading…
Cancel
Save