Adding disablePipeline

- Added disablePipeline(pipeID): disables the pipeline and stops its requests from cloud.
- Close btc_multisig pipeline when a tx is broadcasted into blockchain
- Changed all spread operators to standard alternatives
This commit is contained in:
sairajzero 2022-08-16 21:30:48 +05:30
parent 1bb6f7a280
commit b8b58503f6
2 changed files with 54 additions and 34 deletions

View File

@ -1,4 +1,4 @@
(function(EXPORTS) { //btcOperator v1.0.7c
(function(EXPORTS) { //btcOperator v1.0.8
/* BTC Crypto and API Operator */
const btcOperator = EXPORTS;
@ -519,6 +519,20 @@
return bool ? !(n.filter(x => x !== true).length) : n;
}
btcOperator.checkIfSameTx = function(tx1, tx2) {
tx1 = deserializeTx(tx1);
tx2 = deserializeTx(tx2);
if (tx1.ins.length !== tx2.ins.length || tx1.outs.length !== tx2.outs.length)
return false;
for (let i = 0; i < tx1.ins.length; i++)
if (tx1.ins[i].outpoint.hash !== tx2.ins[i].outpoint.hash || tx1.ins[i].outpoint.index !== tx2.ins[i].outpoint.index)
return false;
for (let i = 0; i < tx2.ins.length; i++)
if (tx1.outs[i].value !== tx2.outs[i].value || Crypto.util.bytesToHex(tx1.outs[i].script.buffer) !== Crypto.util.bytesToHex(tx2.outs[i].script.buffer))
return false;
return true;
}
btcOperator.getTx = txid => new Promise((resolve, reject) => {
fetch_api(`get_tx/BTC/${txid}`)
.then(result => resolve(result.data))

View File

@ -191,9 +191,7 @@
}
_loaded.chats[receiver] = parseInt(vc)
compactIDB.writeData("chats", parseInt(vc), receiver)
compactIDB.addData("messages", {
...data
}, `${receiver}|${vc}`)
compactIDB.addData("messages", Object.assign({}, data), `${receiver}|${vc}`)
data.message = message;
resolve({
[vc]: data
@ -224,9 +222,7 @@
if (mail.to.length === 0)
return reject(results)
mail.content = encrypt(content)
compactIDB.addData("mails", {
...mail
}, mail.ref)
compactIDB.addData("mails", Object.assign({}, mail), mail.ref)
mail.content = content
resolve({
[mail.ref]: mail
@ -253,9 +249,7 @@
category: "received",
message: encrypt(unparsed.message)
}
compactIDB.addData("messages", {
...dm
}, `${dm.floID}|${vc}`)
compactIDB.addData("messages", Object.assign({}, dm), `${dm.floID}|${vc}`)
_loaded.chats[dm.floID] = parseInt(vc)
compactIDB.writeData("chats", parseInt(vc), dm.floID)
dm.message = unparsed.message;
@ -274,9 +268,7 @@
ref: data.ref,
prev: data.prev
}
compactIDB.addData("mails", {
...mail
}, mail.ref);
compactIDB.addData("mails", Object.assign({}, mail), mail.ref);
mail.content = data.content;
newInbox.mails[mail.ref] = mail;
addMark(mail.ref, "unread");
@ -290,9 +282,7 @@
floCrypto.getFloID(groupInfo.pubKey) === groupInfo.groupID) {
let eKey = groupInfo.eKey
groupInfo.eKey = encrypt(eKey)
compactIDB.writeData("groups", {
...groupInfo
}, groupInfo.groupID)
compactIDB.writeData("groups", Object.assign({}, groupInfo), groupInfo.groupID)
groupInfo.eKey = eKey
_loaded.groups[groupInfo.groupID] = groupInfo
requestGroupInbox(groupInfo.groupID)
@ -309,9 +299,7 @@
expiredKeys[r.groupID][vc] = groupInfo.eKey
let eKey = r.newKey
groupInfo.eKey = encrypt(eKey);
compactIDB.writeData("groups", {
...groupInfo
}, groupInfo.groupID)
compactIDB.writeData("groups", Object.assign({}, groupInfo), groupInfo.groupID)
groupInfo.eKey = eKey
newInbox.keyrevoke.push(groupInfo.groupID)
}
@ -321,9 +309,7 @@
let pipelineInfo = JSON.parse(unparsed.message);
let eKey = pipelineInfo.eKey;
pipelineInfo.eKey = encrypt(eKey)
compactIDB.addData("pipeline", {
...pipelineInfo
}, pipelineInfo.id);
compactIDB.addData("pipeline", Object.assign({}, pipelineInfo), pipelineInfo.id);
pipelineInfo.eKey = eKey;
_loaded.pipeline[pipelineInfo.id] = pipelineInfo
requestPipelineInbox(pipelineInfo.id, pipelineInfo.model);
@ -499,7 +485,7 @@
})
}
messenger.getChat = function(chatID) {
const getChat = messenger.getChat = function(chatID) {
return new Promise((resolve, reject) => {
let options = {
lowerKey: `${chatID}|`,
@ -773,9 +759,7 @@
return new Promise((resolve, reject) => {
if (!_loaded.groups[groupID])
return reject("Group not found");
let groupInfo = {
..._loaded.groups[groupID]
};
let groupInfo = Object.assign({}, _loaded.groups[groupID]);
if (groupInfo.disabled)
return resolve("Group already diabled");
groupInfo.disabled = true;
@ -818,7 +802,7 @@
case "ADD_MEMBERS": {
data.newMembers = unparsed.message.split("|")
data.note = unparsed.comment
groupInfo.members = [...new Set(groupInfo.members.concat(data.newMembers))]
groupInfo.members = Array.from(new Set(groupInfo.members.concat(data.newMembers)))
break;
}
case "UP_DESCRIPTION": {
@ -844,9 +828,7 @@
}
infoChange = true;
}
compactIDB.addData("messages", {
...data
}, `${groupID}|${vc}`)
compactIDB.addData("messages", Object.assign({}, data), `${groupID}|${vc}`)
if (data.message)
data.message = decrypt(data.message);
newInbox.messages[vc] = data;
@ -1155,6 +1137,24 @@
.catch(error => console.error(`request-pipeline(${pipeID}):`, error))
}
const disablePipeline = messenger.disablePipeline = function(pipeID) {
console.debug(JSON.stringify(pipeConnID), pipeConnID[pipeID])
return new Promise((resolve, reject) => {
if (!_loaded.pipeline[pipeID])
return reject("Pipeline not found");
if (_loaded.pipeline[pipeID].disabled)
return resolve("Pipeline already diabled");
_loaded.pipeline[pipeID].disabled = true;
let pipelineInfo = Object.assign({}, _loaded.pipeline[pipeID]);
pipelineInfo.eKey = encrypt(pipelineInfo.eKey)
compactIDB.writeData("pipeline", pipelineInfo, pipeID).then(result => {
floCloudAPI.closeRequest(pipeConnID[pipeID]);
delete pipeConnID[pipeID];
resolve("Pipeline diabled");
}).catch(error => reject(error))
})
}
processData.pipeline = {};
processData.pipeline[TYPE_BTC_MULTISIG] = function(pipeID) {
return (unparsed, newInbox) => {
@ -1174,11 +1174,17 @@
data.message = encrypt(unparsed.message);
} else if (unparsed.type === "BROADCAST") {
data.txid = unparsed.message;
//TODO: check if txid is valid (and confirmed?) and close the pipeline connection
//the following check is done on parallel (in background) instead of sync
btcOperator.getTx(data.txid).then(tx => {
let tx_hex_final = tx.tx_hex;
getChat(pipeID).then(result => {
let tx_hex_inital = Object.keys(result).sort().map(i => result[i].message).filter(x => x).shift();
if (btcOperator.checkIfSameTx(tx_hex_inital, tx_hex_final))
disablePipeline(pipeID);
}).catch(error => console.error(error))
}).catch(error => console.error(error))
}
compactIDB.addData("messages", {
...data
}, `${pipeID}|${vc}`);
compactIDB.addData("messages", Object.assign({}, data), `${pipeID}|${vc}`);
if (data.message)
data.message = decrypt(data.message);
newInbox.messages[vc] = data;