txproposal comuninication between peers. Still WIP

This commit is contained in:
Matias Alejo Garcia 2014-04-11 13:26:36 -03:00
commit 333ecb352a
12 changed files with 282 additions and 124 deletions

View file

@ -20,14 +20,14 @@ angular.module('copay.network')
});
};
// set new inbound connections
var _setNewPeer = function(newPeer) {
var cp = $rootScope.cp;
console.log('#### SENDING PKR 1111 ');
cp.send(newPeer, {
type: 'publicKeyRing',
publicKeyRing: $rootScope.publicKeyRing.toObj(),
});
console.log('#### Setting new PEER:', newPeer);
sendPublicKeyRing(newPeer);
sendTxProposals(newPeer);
};
var _handleNetworkChange = function(newPeer) {
@ -40,6 +40,16 @@ angular.module('copay.network')
_refreshUx();
};
// TODO -> probably not in network.js
var storeOpenWallet = function() {
var id = $rootScope.walletId;
Storage.addWalletId(id);
Storage.set(id, 'publicKeyRing',$rootScope.publicKeyRing.toObj());
Storage.set(id, 'privateKey', $rootScope.privateKey.toObj());
Storage.set(id, 'txProposals', $rootScope.txProposals.toObj());
console.log('\t### Wallet Stored');
};
// TODO -> probably not in network.js
var createWallet = function(walletId) {
@ -47,48 +57,67 @@ angular.module('copay.network')
var priv = new copay.PrivateKey({networkName: config.networkName});
console.log('\t### PrivateKey Initialized');
//TODO
console.log('[PRIVATE]',priv.toObj()); //TODO
//TODO create a wallet and WalletId, not only pkr
var pkr = new copay.PublicKeyRing({
networkName: config.networkName,
id: walletId,
requiredCopayers: config.requiredCopayers || 3, // TODO set per wallet
totalCopayers: config.totalCopayers || 5,
});
console.log('[network.js.70] WALLET ID IS:', pkr.id); //TODO
// Add self to the ring.
pkr.addCopayer(priv.getBIP32().extendedPublicKeyString());
console.log('\t### PublicKeyRing Initialized');
var txp = new copay.TxProposals({
networkName: config.networkName,
publicKeyRing: pkr,
walletId: pkr.id,
});
console.log('\t### TxProposals Initialized');
Storage.addWalletId(pkr.id);
Storage.set(pkr.id, 'publicKeyRing', pkr.toObj());
Storage.set(pkr.id, 'privateKey', priv.toObj());
Storage.set(pkr.id, 'txProposals', txp.toObj());
console.log('\t### Wallet Stored');
// Store it on rootScope
$rootScope.priv = priv; // TODO secure this.
$rootScope.walletId = pkr.id;
$rootScope.publicKeyRing = pkr;
$rootScope.txProposals = txp;
$rootScope.walletId = pkr.id;
$rootScope.privateKey = priv; // TODO secure this.
$rootScope.publicKeyRing = pkr;
$rootScope.txProposals = txp;
storeOpenWallet();
};
var openWallet = function (walletId) {
var ret = false;
var pkr = Storage.get(walletId, 'publicKeyRing');
var priv = Storage.get(walletId, 'privateKey');
var txp = Storage.get(walletId, 'txProposals');
console.log('[network.js.90:openWallet:]',walletId); //TODO
if (pkr) {
var ret = false;
var pkr = Storage.get(walletId, 'publicKeyRing');
var priv = Storage.get(walletId, 'privateKey');
var txp = Storage.get(walletId, 'txProposals');
console.log('[network.js.96:pkr:]',pkr); //TODO
console.log('[network.js.97:priv:]',priv); //TODO
if (pkr && pkr.copayersExtPubKeys.length && priv) {
console.log('### WALLET OPENED:', walletId, pkr);
$rootScope.walletId = walletId;
$rootScope.walletId = walletId;
$rootScope.publicKeyRing = new copay.PublicKeyRing.fromObj(pkr);
$rootScope.txProposals = new copay.TxProposals.fromObj(txp);
$rootScope.priv = new copay.PrivateKey.fromObj(priv); //TODO secure
$rootScope.txProposals = new copay.TxProposals.fromObj(txp);
$rootScope.PrivateKey = new copay.PrivateKey.fromObj(priv); //TODO secure
// Add our key JIC
try {
$rootScope.publicKeyRing.addCopayer(
$rootScope.PrivateKey.getBIP32().extendedPublicKeyString()
);
} catch (e) {
console.log('[network.js.103]', e); //TODO
};
ret = true;
}
return ret;
@ -101,52 +130,112 @@ angular.module('copay.network')
//TODO
};
var _checkWallet = function(walletId) {
var _checkWallet = function(walletId, allowChange) {
console.log('[network.js.79:_checkWallet:]',walletId); //TODO
if ($rootScope.walletId && $rootScope.walletId !== walletId)
closeWallet();
if ($rootScope.walletId)
return;
if ($rootScope.walletId && $rootScope.walletId === walletId)
return;
if ($rootScope.walletId && $rootScope.walletId !== walletId) {
if (allowChange)
closeWallet();
else
throw new Error('message to wrong walletID');
}
if (!openWallet(walletId)) {
createWallet(walletId);
}
};
var _handleData = function(senderId, data, isInbound) {
var _handlePublicKeyRing = function(senderId, data, isInbound) {
var cp = $rootScope.cp;
_checkWallet(data.publicKeyRing.id, true);
var shouldSend = false;
var recipients, pkr = $rootScope.publicKeyRing;
var inPKR = copay.PublicKeyRing.fromObj(data.publicKeyRing);
if (pkr.merge(inPKR, true) && !data.isBroadcast) {
console.log('### BROADCASTING PKR');
recipients = null;
shouldSend = true;
}
else if (isInbound && !data.isBroadcast) {
// always replying to connecting peer
console.log('### REPLYING PKR TO:', senderId);
recipients = senderId;
shouldSend = true;
}
if (shouldSend) {
console.log('### SENDING PKR TO:', recipients);
cp.send( recipients, {
type: 'publicKeyRing',
publicKeyRing: $rootScope.publicKeyRing.toObj(),
});
}
};
var sendTxProposals = function(recipients) {
var cp = $rootScope.cp;
console.log('### SENDING txProposals TO:', recipients||'All');
cp.send( recipients, {
type: 'txProposals',
txProposals: $rootScope.txProposals.toObj(),
walletId: $rootScope.walletId,
});
};
var sendPublicKeyRing = function(recipients) {
var cp = $rootScope.cp;
console.log('### SENDING publicKeyRing TO:', recipients||'All');
cp.send(recipients, {
type: 'publicKeyRing',
publicKeyRing: $rootScope.publicKeyRing.toObj(),
});
};
var _handleTxProposals = function(senderId, data, isInbound) {
var cp = $rootScope.cp;
_checkWallet(data.txProposals.walletId, false);
var shouldSend = false;
console.log('RECV TXPROPOSAL:',data); //TODO
var recipients, pkr = $rootScope.txProposals;
var inTxProposals = copay.TxProposals.fromObj(data.txProposals);
var mergeInfo = pkr.merge(inTxProposals, true);
if ( mergeInfo.merged && !data.isBroadcast) {
console.log('### BROADCASTING txProposals');
recipients = null;
shouldSend = true;
}
else if (isInbound && !data.isBroadcast) {
// always replying to connecting peer
console.log('### REPLYING txProposals TO:', senderId);
recipients = senderId;
shouldSend = true;
}
if (shouldSend) {
this.sendTxProposals(recipients);
}
};
var _handleData = function(senderId, data, isInbound) {
switch(data.type) {
case 'publicKeyRing':
_checkWallet(data.publicKeyRing.id);
var shouldSend = false;
var recipients, pkr = $rootScope.publicKeyRing;
if (pkr.merge(data.publicKeyRing, true) && !data.isBroadcast) {
console.log('### BROADCASTING PKR');
recipients = null;
shouldSend = true;
}
else if (isInbound && !data.isBroadcast) {
// always replying to connecting peer
console.log('### REPLYING PKR TO:', senderId);
recipients = senderId;
shouldSend = true;
}
if (shouldSend) {
console.log('### SENDING PKR TO:', recipients);
cp.send( recipients, {
type: 'publicKeyRing',
publicKeyRing: $rootScope.publicKeyRing.toObj(),
});
}
_refreshUx();
_handlePublicKeyRing(senderId, data, isInbound);
break;
case 'txProposals':
_handleTxProposals(senderId, data, isInbound);
break;
}
_refreshUx();
};
var _setupHandlers = function () {
var cp = $rootScope.cp;
@ -192,8 +281,12 @@ angular.module('copay.network')
init: init,
connect: connect,
disconnect: disconnect,
sendTxProposals: sendTxProposals,
// TODO Move to Wallet.
createWallet: createWallet,
openWallet: openWallet,
storeOpenWallet: storeOpenWallet,
}
});

View file

@ -41,6 +41,13 @@ angular.module('copay.storage')
},
addWalletId: function(walletId) {
var ids = localStorage.getItem('walletIds');
if (ids) {
var list = ids.split(',');
var l = list.length;
for(var i=0; i<l; i++)
if (walletId === list[i])
return;
}
localStorage.setItem('walletIds', (ids?ids+',':'') + walletId);
},
delWalletId: function(walletId) {