run js-beautify on everything
...with two spaces. Command: js-beautify -s 2 -r [filename]
This commit is contained in:
parent
da445e7c69
commit
ea2e2d4e19
49 changed files with 859 additions and 682 deletions
|
|
@ -168,15 +168,29 @@ Insight.prototype.checkActivity = function(addresses, cb) {
|
|||
if (!addresses) throw new Error('address must be set');
|
||||
|
||||
this.getTransactions(addresses, function onResult(txs) {
|
||||
var flatArray = function (xss) { return xss.reduce(function(r, xs) { return r.concat(xs); }, []); };
|
||||
var getInputs = function (t) { return t.vin.map(function (vin) { return vin.addr }); };
|
||||
var getOutputs = function (t) { return flatArray(
|
||||
t.vout.map(function (vout) { return vout.scriptPubKey.addresses; })
|
||||
);};
|
||||
var flatArray = function(xss) {
|
||||
return xss.reduce(function(r, xs) {
|
||||
return r.concat(xs);
|
||||
}, []);
|
||||
};
|
||||
var getInputs = function(t) {
|
||||
return t.vin.map(function(vin) {
|
||||
return vin.addr
|
||||
});
|
||||
};
|
||||
var getOutputs = function(t) {
|
||||
return flatArray(
|
||||
t.vout.map(function(vout) {
|
||||
return vout.scriptPubKey.addresses;
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
var activityMap = new Array(addresses.length);
|
||||
var activeAddress = flatArray(txs.map(function(t) { return getInputs(t).concat(getOutputs(t)); }));
|
||||
activeAddress.forEach(function (addr) {
|
||||
var activeAddress = flatArray(txs.map(function(t) {
|
||||
return getInputs(t).concat(getOutputs(t));
|
||||
}));
|
||||
activeAddress.forEach(function(addr) {
|
||||
var index = addresses.indexOf(addr);
|
||||
if (index != -1) activityMap[index] = true;
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,17 +1,17 @@
|
|||
'use strict';
|
||||
|
||||
|
||||
var imports = require('soop').imports();
|
||||
var bitcore = require('bitcore');
|
||||
var HK = bitcore.HierarchicalKey;
|
||||
var WalletKey = bitcore.WalletKey;
|
||||
var networks = bitcore.networks;
|
||||
var util = bitcore.util;
|
||||
var Structure = require('./Structure');
|
||||
var imports = require('soop').imports();
|
||||
var bitcore = require('bitcore');
|
||||
var HK = bitcore.HierarchicalKey;
|
||||
var WalletKey = bitcore.WalletKey;
|
||||
var networks = bitcore.networks;
|
||||
var util = bitcore.util;
|
||||
var Structure = require('./Structure');
|
||||
|
||||
function PrivateKey(opts) {
|
||||
opts = opts || {};
|
||||
this.network = opts.networkName === 'testnet' ?
|
||||
this.network = opts.networkName === 'testnet' ?
|
||||
networks.testnet : networks.livenet;
|
||||
var init = opts.extendedPrivateKeyString || this.network.name;
|
||||
this.bip = opts.HK || new HK(init);
|
||||
|
|
@ -81,15 +81,19 @@ PrivateKey.prototype.getForPaths = function(paths) {
|
|||
PrivateKey.prototype.getForPath = function(path) {
|
||||
var pk = this.privateKeyCache[path];
|
||||
if (!pk) {
|
||||
var derivedHK = this._getHK(path);
|
||||
var derivedHK = this._getHK(path);
|
||||
pk = this.privateKeyCache[path] = derivedHK.eckey.private.toString('hex');
|
||||
}
|
||||
var wk = new WalletKey({network: this.network});
|
||||
wk.fromObj({priv: pk});
|
||||
var wk = new WalletKey({
|
||||
network: this.network
|
||||
});
|
||||
wk.fromObj({
|
||||
priv: pk
|
||||
});
|
||||
return wk;
|
||||
};
|
||||
|
||||
PrivateKey.prototype.get = function(index,isChange) {
|
||||
PrivateKey.prototype.get = function(index, isChange) {
|
||||
var path = Structure.FullBranch(index, isChange);
|
||||
return this.getForPath(path);
|
||||
};
|
||||
|
|
@ -99,11 +103,11 @@ PrivateKey.prototype.getAll = function(receiveIndex, changeIndex) {
|
|||
throw new Error('Invalid parameters');
|
||||
|
||||
var ret = [];
|
||||
for(var i=0;i<receiveIndex; i++) {
|
||||
ret.push(this.get(i,false));
|
||||
for (var i = 0; i < receiveIndex; i++) {
|
||||
ret.push(this.get(i, false));
|
||||
}
|
||||
for(var i=0; i<changeIndex; i++) {
|
||||
ret.push(this.get(i,true));
|
||||
for (var i = 0; i < changeIndex; i++) {
|
||||
ret.push(this.get(i, true));
|
||||
}
|
||||
return ret;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,24 +1,23 @@
|
|||
|
||||
'use strict';
|
||||
|
||||
|
||||
var imports = require('soop').imports();
|
||||
var imports = require('soop').imports();
|
||||
var preconditions = require('preconditions').instance();
|
||||
var bitcore = require('bitcore');
|
||||
var HK = bitcore.HierarchicalKey;
|
||||
var PrivateKey = require('./PrivateKey');
|
||||
var Structure = require('./Structure');
|
||||
var AddressIndex= require('./AddressIndex');
|
||||
var Address = bitcore.Address;
|
||||
var Script = bitcore.Script;
|
||||
var bitcore = require('bitcore');
|
||||
var HK = bitcore.HierarchicalKey;
|
||||
var PrivateKey = require('./PrivateKey');
|
||||
var Structure = require('./Structure');
|
||||
var AddressIndex = require('./AddressIndex');
|
||||
var Address = bitcore.Address;
|
||||
var Script = bitcore.Script;
|
||||
|
||||
function PublicKeyRing(opts) {
|
||||
opts = opts || {};
|
||||
|
||||
this.walletId = opts.walletId;
|
||||
|
||||
this.network = opts.networkName === 'livenet' ?
|
||||
bitcore.networks.livenet : bitcore.networks.testnet;
|
||||
this.network = opts.networkName === 'livenet' ?
|
||||
bitcore.networks.livenet : bitcore.networks.testnet;
|
||||
|
||||
this.requiredCopayers = opts.requiredCopayers || 3;
|
||||
this.totalCopayers = opts.totalCopayers || 5;
|
||||
|
|
@ -33,11 +32,11 @@ function PublicKeyRing(opts) {
|
|||
this.addressToPath = {};
|
||||
}
|
||||
|
||||
PublicKeyRing.fromObj = function (data) {
|
||||
PublicKeyRing.fromObj = function(data) {
|
||||
if (data instanceof PublicKeyRing) {
|
||||
throw new Error('bad data format: Did you use .toObj()?');
|
||||
}
|
||||
var ret = new PublicKeyRing(data);
|
||||
var ret = new PublicKeyRing(data);
|
||||
|
||||
for (var k in data.copayersExtPubKeys) {
|
||||
ret.addCopayer(data.copayersExtPubKeys[k]);
|
||||
|
|
@ -54,8 +53,8 @@ PublicKeyRing.prototype.toObj = function() {
|
|||
totalCopayers: this.totalCopayers,
|
||||
indexes: this.indexes.toObj(),
|
||||
|
||||
copayersExtPubKeys: this.copayersHK.map( function (b) {
|
||||
return b.extendedPublicKeyString();
|
||||
copayersExtPubKeys: this.copayersHK.map(function(b) {
|
||||
return b.extendedPublicKeyString();
|
||||
}),
|
||||
nicknameFor: this.nicknameFor,
|
||||
publicKeysCache: this.publicKeysCache
|
||||
|
|
@ -67,11 +66,11 @@ PublicKeyRing.prototype.getCopayerId = function(i) {
|
|||
return this.copayerIds[i];
|
||||
};
|
||||
|
||||
PublicKeyRing.prototype.registeredCopayers = function () {
|
||||
PublicKeyRing.prototype.registeredCopayers = function() {
|
||||
return this.copayersHK.length;
|
||||
};
|
||||
|
||||
PublicKeyRing.prototype.isComplete = function () {
|
||||
PublicKeyRing.prototype.isComplete = function() {
|
||||
return this.registeredCopayers() === this.totalCopayers;
|
||||
};
|
||||
|
||||
|
|
@ -86,21 +85,23 @@ PublicKeyRing.prototype.myCopayerId = function(i) {
|
|||
PublicKeyRing.prototype._checkKeys = function() {
|
||||
|
||||
if (!this.isComplete())
|
||||
throw new Error('dont have required keys yet');
|
||||
throw new Error('dont have required keys yet');
|
||||
};
|
||||
|
||||
PublicKeyRing.prototype._newExtendedPublicKey = function () {
|
||||
return new PrivateKey({networkName: this.network.name})
|
||||
PublicKeyRing.prototype._newExtendedPublicKey = function() {
|
||||
return new PrivateKey({
|
||||
networkName: this.network.name
|
||||
})
|
||||
.deriveBIP45Branch()
|
||||
.extendedPublicKeyString();
|
||||
};
|
||||
|
||||
PublicKeyRing.prototype._updateBip = function (index) {
|
||||
PublicKeyRing.prototype._updateBip = function(index) {
|
||||
var hk = this.copayersHK[index].derive(Structure.IdBranch);
|
||||
this.copayerIds[index]= hk.eckey.public.toString('hex');
|
||||
this.copayerIds[index] = hk.eckey.public.toString('hex');
|
||||
};
|
||||
|
||||
PublicKeyRing.prototype._setNicknameForIndex = function (index, nickname) {
|
||||
PublicKeyRing.prototype._setNicknameForIndex = function(index, nickname) {
|
||||
this.nicknameFor[this.copayerIds[index]] = nickname;
|
||||
};
|
||||
|
||||
|
|
@ -114,9 +115,9 @@ PublicKeyRing.prototype.nicknameForCopayer = function(copayerId) {
|
|||
|
||||
PublicKeyRing.prototype.addCopayer = function(newEpk, nickname) {
|
||||
if (this.isComplete())
|
||||
throw new Error('PKR already has all required key:' + this.totalCopayers);
|
||||
throw new Error('PKR already has all required key:' + this.totalCopayers);
|
||||
|
||||
this.copayersHK.forEach(function(b){
|
||||
this.copayersHK.forEach(function(b) {
|
||||
if (b.extendedPublicKeyString() === newEpk)
|
||||
throw new Error('PKR already has that key');
|
||||
});
|
||||
|
|
@ -129,7 +130,7 @@ PublicKeyRing.prototype.addCopayer = function(newEpk, nickname) {
|
|||
var bip = new HK(newEpk);
|
||||
this.copayersHK.push(bip);
|
||||
this._updateBip(i);
|
||||
if (nickname) {
|
||||
if (nickname) {
|
||||
this._setNicknameForIndex(i, nickname);
|
||||
}
|
||||
return newEpk;
|
||||
|
|
@ -138,19 +139,22 @@ PublicKeyRing.prototype.addCopayer = function(newEpk, nickname) {
|
|||
PublicKeyRing.prototype.getPubKeys = function(index, isChange) {
|
||||
this._checkKeys();
|
||||
|
||||
var path = Structure.Branch(index, isChange);
|
||||
var path = Structure.Branch(index, isChange);
|
||||
var pubKeys = this.publicKeysCache[path];
|
||||
if (!pubKeys) {
|
||||
pubKeys = [];
|
||||
var l = this.copayersHK.length;
|
||||
for(var i=0; i<l; i++) {
|
||||
for (var i = 0; i < l; i++) {
|
||||
var hk = this.copayersHK[i].derive(path);
|
||||
pubKeys[i] = hk.eckey.public;
|
||||
}
|
||||
this.publicKeysCache[path] = pubKeys.map(function(pk){return pk.toString('hex');});
|
||||
}
|
||||
else {
|
||||
pubKeys = pubKeys.map(function(s){return new Buffer(s,'hex');});
|
||||
this.publicKeysCache[path] = pubKeys.map(function(pk) {
|
||||
return pk.toString('hex');
|
||||
});
|
||||
} else {
|
||||
pubKeys = pubKeys.map(function(s) {
|
||||
return new Buffer(s, 'hex');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -158,15 +162,15 @@ PublicKeyRing.prototype.getPubKeys = function(index, isChange) {
|
|||
};
|
||||
|
||||
// TODO this could be cached
|
||||
PublicKeyRing.prototype.getRedeemScript = function (index, isChange) {
|
||||
PublicKeyRing.prototype.getRedeemScript = function(index, isChange) {
|
||||
var pubKeys = this.getPubKeys(index, isChange);
|
||||
var script = Script.createMultisig(this.requiredCopayers, pubKeys);
|
||||
var script = Script.createMultisig(this.requiredCopayers, pubKeys);
|
||||
return script;
|
||||
};
|
||||
|
||||
// TODO this could be cached
|
||||
PublicKeyRing.prototype.getAddress = function (index, isChange) {
|
||||
var script = this.getRedeemScript(index,isChange);
|
||||
PublicKeyRing.prototype.getAddress = function(index, isChange) {
|
||||
var script = this.getRedeemScript(index, isChange);
|
||||
var address = Address.fromScript(script, this.network.name);
|
||||
this.addressToPath[address.toString()] = Structure.FullBranch(index, isChange);
|
||||
return address;
|
||||
|
|
@ -174,13 +178,13 @@ PublicKeyRing.prototype.getAddress = function (index, isChange) {
|
|||
|
||||
PublicKeyRing.prototype.pathForAddress = function(address) {
|
||||
var path = this.addressToPath[address];
|
||||
if (!path) throw new Error('Couldn\'t find path for address '+address);
|
||||
if (!path) throw new Error('Couldn\'t find path for address ' + address);
|
||||
return path;
|
||||
};
|
||||
|
||||
// TODO this could be cached
|
||||
PublicKeyRing.prototype.getScriptPubKeyHex = function (index, isChange) {
|
||||
var addr = this.getAddress(index,isChange);
|
||||
PublicKeyRing.prototype.getScriptPubKeyHex = function(index, isChange) {
|
||||
var addr = this.getAddress(index, isChange);
|
||||
return Script.createP2SH(addr.payload()).getBuffer().toString('hex');
|
||||
};
|
||||
|
||||
|
|
@ -204,18 +208,18 @@ PublicKeyRing.prototype.getAddressesInfo = function(opts) {
|
|||
|
||||
var ret = [];
|
||||
if (!opts.excludeChange) {
|
||||
for (var i=0; i<this.indexes.getChangeIndex(); i++) {
|
||||
for (var i = 0; i < this.indexes.getChangeIndex(); i++) {
|
||||
ret.unshift({
|
||||
address: this.getAddress(i,true),
|
||||
address: this.getAddress(i, true),
|
||||
isChange: true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (!opts.excludeMain) {
|
||||
for (var i=0; i<this.indexes.getReceiveIndex(); i++) {
|
||||
for (var i = 0; i < this.indexes.getReceiveIndex(); i++) {
|
||||
ret.unshift({
|
||||
address: this.getAddress(i,false),
|
||||
address: this.getAddress(i, false),
|
||||
isChange: false
|
||||
});
|
||||
}
|
||||
|
|
@ -225,59 +229,59 @@ PublicKeyRing.prototype.getAddressesInfo = function(opts) {
|
|||
};
|
||||
|
||||
// TODO this could be cached
|
||||
PublicKeyRing.prototype._addScriptMap = function (map, index, isChange) {
|
||||
var script = this.getRedeemScript(index,isChange);
|
||||
PublicKeyRing.prototype._addScriptMap = function(map, index, isChange) {
|
||||
var script = this.getRedeemScript(index, isChange);
|
||||
map[Address.fromScript(script, this.network.name).toString()] = script.getBuffer().toString('hex');
|
||||
};
|
||||
|
||||
PublicKeyRing.prototype.getRedeemScriptMap = function () {
|
||||
PublicKeyRing.prototype.getRedeemScriptMap = function() {
|
||||
var ret = {};
|
||||
|
||||
for (var i=0; i<this.indexes.getChangeIndex(); i++) {
|
||||
this._addScriptMap(ret,i,true);
|
||||
for (var i = 0; i < this.indexes.getChangeIndex(); i++) {
|
||||
this._addScriptMap(ret, i, true);
|
||||
}
|
||||
for (var i=0; i<this.indexes.getReceiveIndex(); i++) {
|
||||
this._addScriptMap(ret,i,false);
|
||||
for (var i = 0; i < this.indexes.getReceiveIndex(); i++) {
|
||||
this._addScriptMap(ret, i, false);
|
||||
}
|
||||
return ret;
|
||||
};
|
||||
|
||||
PublicKeyRing.prototype._checkInPKR = function(inPKR, ignoreId) {
|
||||
|
||||
if (!ignoreId && this.walletId !== inPKR.walletId) {
|
||||
if (!ignoreId && this.walletId !== inPKR.walletId) {
|
||||
throw new Error('inPKR walletId mismatch');
|
||||
}
|
||||
|
||||
if (this.network.name !== inPKR.network.name) {
|
||||
throw new Error('Network mismatch. Should be '+this.network.name +
|
||||
' and found '+inPKR.network.name);
|
||||
throw new Error('Network mismatch. Should be ' + this.network.name +
|
||||
' and found ' + inPKR.network.name);
|
||||
}
|
||||
|
||||
if (
|
||||
this.requiredCopayers && inPKR.requiredCopayers &&
|
||||
(this.requiredCopayers !== inPKR.requiredCopayers))
|
||||
throw new Error('inPKR requiredCopayers mismatch '+this.requiredCopayers+'!='+inPKR.requiredCopayers);
|
||||
throw new Error('inPKR requiredCopayers mismatch ' + this.requiredCopayers + '!=' + inPKR.requiredCopayers);
|
||||
|
||||
if (
|
||||
this.totalCopayers && inPKR.totalCopayers &&
|
||||
(this.totalCopayers !== inPKR.totalCopayers))
|
||||
throw new Error('inPKR totalCopayers mismatch'+this.totalCopayers+'!='+inPKR.requiredCopayers);
|
||||
throw new Error('inPKR totalCopayers mismatch' + this.totalCopayers + '!=' + inPKR.requiredCopayers);
|
||||
};
|
||||
|
||||
|
||||
PublicKeyRing.prototype._mergePubkeys = function(inPKR) {
|
||||
var self = this;
|
||||
var hasChanged = false;
|
||||
var l= self.copayersHK.length;
|
||||
if (self.isComplete())
|
||||
var l = self.copayersHK.length;
|
||||
if (self.isComplete())
|
||||
return;
|
||||
|
||||
inPKR.copayersHK.forEach( function(b) {
|
||||
inPKR.copayersHK.forEach(function(b) {
|
||||
var haveIt = false;
|
||||
var epk = b.extendedPublicKeyString();
|
||||
for(var j=0; j<l; j++) {
|
||||
var epk = b.extendedPublicKeyString();
|
||||
for (var j = 0; j < l; j++) {
|
||||
if (self.copayersHK[j].extendedPublicKeyString() === epk) {
|
||||
haveIt=true;
|
||||
haveIt = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -289,8 +293,8 @@ PublicKeyRing.prototype._mergePubkeys = function(inPKR) {
|
|||
self.copayersHK.push(new HK(epk));
|
||||
self._updateBip(l2);
|
||||
if (inPKR.nicknameFor[self.getCopayerId(l2)])
|
||||
self._setNicknameForIndex(l2,inPKR.nicknameFor[self.getCopayerId(l2)]);
|
||||
hasChanged=true;
|
||||
self._setNicknameForIndex(l2, inPKR.nicknameFor[self.getCopayerId(l2)]);
|
||||
hasChanged = true;
|
||||
}
|
||||
});
|
||||
return hasChanged;
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ TxProposal.prototype.mergeMetadata = function(v1, author) {
|
|||
|
||||
Object.keys(v1.seenBy).forEach(function(k) {
|
||||
if (!v0.seenBy[k]) {
|
||||
if (k != author) throw new Error('Non authoritative seenBy change by '+author);
|
||||
if (k != author) throw new Error('Non authoritative seenBy change by ' + author);
|
||||
v0.seenBy[k] = v1.seenBy[k];
|
||||
events.push({
|
||||
type: 'seen',
|
||||
|
|
@ -89,7 +89,7 @@ TxProposal.prototype.mergeMetadata = function(v1, author) {
|
|||
|
||||
Object.keys(v1.signedBy).forEach(function(k) {
|
||||
if (!v0.signedBy[k]) {
|
||||
if (k != author) throw new Error('Non authoritative signedBy change by '+author);
|
||||
if (k != author) throw new Error('Non authoritative signedBy change by ' + author);
|
||||
v0.signedBy[k] = v1.signedBy[k];
|
||||
events.push({
|
||||
type: 'signed',
|
||||
|
|
@ -101,7 +101,7 @@ TxProposal.prototype.mergeMetadata = function(v1, author) {
|
|||
|
||||
Object.keys(v1.rejectedBy).forEach(function(k) {
|
||||
if (!v0.rejectedBy[k]) {
|
||||
if (k != author) throw new Error('Non authoritative rejectedBy change by '+author);
|
||||
if (k != author) throw new Error('Non authoritative rejectedBy change by ' + author);
|
||||
v0.rejectedBy[k] = v1.rejectedBy[k];
|
||||
events.push({
|
||||
type: 'rejected',
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ function Wallet(opts) {
|
|||
this.token = opts.token;
|
||||
this.tokenTime = opts.tokenTime;
|
||||
}
|
||||
|
||||
|
||||
this.verbose = opts.verbose;
|
||||
this.publicKeyRing.walletId = this.id;
|
||||
this.txProposals.walletId = this.id;
|
||||
|
|
@ -142,12 +142,11 @@ Wallet.prototype._handleAddressBook = function(senderId, data, isInbound) {
|
|||
this.log('RECV ADDRESSBOOK:', data);
|
||||
var rcv = data.addressBook;
|
||||
var hasChange;
|
||||
for(var key in rcv) {
|
||||
for (var key in rcv) {
|
||||
if (!this.addressBook[key]) {
|
||||
this.addressBook[key] = rcv[key];
|
||||
hasChange = true;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
if (rcv[key].createdTs > this.addressBook[key].createdTs) {
|
||||
this.addressBook[key] = rcv[key];
|
||||
hasChange = true;
|
||||
|
|
@ -395,7 +394,7 @@ Wallet.prototype.sendAllTxProposals = function(recipients) {
|
|||
Wallet.prototype.sendTxProposal = function(ntxid, recipients) {
|
||||
preconditions.checkArgument(ntxid);
|
||||
preconditions.checkState(this.txProposals.txps[ntxid]);
|
||||
this.log('### SENDING txProposal '+ntxid+' TO:', recipients || 'All', this.txProposals);
|
||||
this.log('### SENDING txProposal ' + ntxid + ' TO:', recipients || 'All', this.txProposals);
|
||||
this.network.send(recipients, {
|
||||
type: 'txProposal',
|
||||
txProposal: this.txProposals.txps[ntxid].toObj(),
|
||||
|
|
@ -771,7 +770,7 @@ Wallet.prototype.updateIndexes = function(callback) {
|
|||
|
||||
Wallet.prototype.deriveAddresses = function(index, amout, isChange) {
|
||||
var ret = new Array(amout);
|
||||
for(var i = 0; i < amout; i++) {
|
||||
for (var i = 0; i < amout; i++) {
|
||||
ret[i] = this.publicKeyRing.getAddress(index + i, isChange).toString();
|
||||
}
|
||||
return ret;
|
||||
|
|
@ -791,7 +790,7 @@ Wallet.prototype.indexDiscovery = function(start, change, gap, cb) {
|
|||
// Optimize window to minimize the derivations.
|
||||
var scanWindow = (lastActive == -1) ? gap : gap - (scanIndex - lastActive) + 1;
|
||||
var addresses = self.deriveAddresses(scanIndex, scanWindow, change);
|
||||
self.blockchain.checkActivity(addresses, function(err, actives){
|
||||
self.blockchain.checkActivity(addresses, function(err, actives) {
|
||||
if (err) throw err;
|
||||
|
||||
// Check for new activities in the newlly scanned addresses
|
||||
|
|
@ -804,7 +803,9 @@ Wallet.prototype.indexDiscovery = function(start, change, gap, cb) {
|
|||
next();
|
||||
});
|
||||
},
|
||||
function _while() { return hasActivity; },
|
||||
function _while() {
|
||||
return hasActivity;
|
||||
},
|
||||
function _finnaly(err) {
|
||||
if (err) return cb(err);
|
||||
cb(null, lastActive);
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
'use strict';
|
||||
|
||||
var imports = require('soop').imports();
|
||||
var EventEmitter= imports.EventEmitter || require('events').EventEmitter;
|
||||
var bitcore = require('bitcore');
|
||||
var util = bitcore.util;
|
||||
var extend = require('util')._extend;
|
||||
var imports = require('soop').imports();
|
||||
var EventEmitter = imports.EventEmitter || require('events').EventEmitter;
|
||||
var bitcore = require('bitcore');
|
||||
var util = bitcore.util;
|
||||
var extend = require('util')._extend;
|
||||
/*
|
||||
* Emits
|
||||
* 'connect'
|
||||
|
|
@ -19,17 +19,17 @@ var extend = require('util')._extend;
|
|||
*/
|
||||
|
||||
function Network(opts) {
|
||||
var self = this;
|
||||
opts = opts || {};
|
||||
this.apiKey = opts.apiKey || 'lwjd5qra8257b9';
|
||||
this.debug = opts.debug || 3;
|
||||
this.maxPeers = opts.maxPeers || 10;
|
||||
var self = this;
|
||||
opts = opts || {};
|
||||
this.apiKey = opts.apiKey || 'lwjd5qra8257b9';
|
||||
this.debug = opts.debug || 3;
|
||||
this.maxPeers = opts.maxPeers || 10;
|
||||
this.reconnectAttempts = opts.reconnectAttempts || 3;
|
||||
this.sjclParams = opts.sjclParams || {
|
||||
salt: 'f28bfb49ef70573c',
|
||||
iter:500,
|
||||
mode:'ccm',
|
||||
ts:parseInt(64),
|
||||
this.sjclParams = opts.sjclParams || {
|
||||
salt: 'f28bfb49ef70573c',
|
||||
iter: 500,
|
||||
mode: 'ccm',
|
||||
ts: parseInt(64),
|
||||
};
|
||||
this.opts = {};
|
||||
['config', 'port', 'host', 'path', 'debug', 'key', 'secure'].forEach(function(k) {
|
||||
|
|
@ -47,11 +47,11 @@ Network.prototype.cleanUp = function() {
|
|||
this.privkey = null; //TODO: hide privkey in a closure
|
||||
this.copayerId = null;
|
||||
this.signingKey = null;
|
||||
this.allowedCopayerIds=null;
|
||||
this.isInboundPeerAuth=[];
|
||||
this.copayerForPeer={};
|
||||
this.connections={};
|
||||
this.criticalErr='';
|
||||
this.allowedCopayerIds = null;
|
||||
this.isInboundPeerAuth = [];
|
||||
this.copayerForPeer = {};
|
||||
this.connections = {};
|
||||
this.criticalErr = '';
|
||||
if (this.peer) {
|
||||
this.peer.disconnect();
|
||||
this.peer.destroy();
|
||||
|
|
@ -62,7 +62,7 @@ Network.prototype.cleanUp = function() {
|
|||
this.tries = 0;
|
||||
};
|
||||
|
||||
Network.parent=EventEmitter;
|
||||
Network.parent = EventEmitter;
|
||||
|
||||
// Array helpers
|
||||
Network._arrayDiff = function(a, b) {
|
||||
|
|
@ -99,9 +99,9 @@ Network._arrayRemove = function(el, array) {
|
|||
};
|
||||
|
||||
Network.prototype.connectedCopayers = function() {
|
||||
var ret =[];
|
||||
for(var i in this.connectedPeers){
|
||||
var copayerId =this.copayerForPeer[this.connectedPeers[i]];
|
||||
var ret = [];
|
||||
for (var i in this.connectedPeers) {
|
||||
var copayerId = this.copayerForPeer[this.connectedPeers[i]];
|
||||
if (copayerId) ret.push(copayerId);
|
||||
}
|
||||
return ret;
|
||||
|
|
@ -126,7 +126,7 @@ Network.prototype._onClose = function(peerID) {
|
|||
|
||||
Network.prototype.connectToCopayers = function(copayerIds) {
|
||||
var self = this;
|
||||
var arrayDiff= Network._arrayDiff(copayerIds, self.connectedCopayers());
|
||||
var arrayDiff = Network._arrayDiff(copayerIds, self.connectedCopayers());
|
||||
|
||||
arrayDiff.forEach(function(copayerId) {
|
||||
if (self.allowedCopayerIds && !self.allowedCopayerIds[copayerId]) {
|
||||
|
|
@ -146,7 +146,7 @@ Network.prototype._sendHello = function(copayerId) {
|
|||
|
||||
Network.prototype._addConnectedCopayer = function(copayerId, isInbound) {
|
||||
var peerId = this.peerFromCopayer(copayerId);
|
||||
this._addCopayerMap(peerId,copayerId);
|
||||
this._addCopayerMap(peerId, copayerId);
|
||||
Network._arrayPushOnce(peerId, this.connectedPeers);
|
||||
this.emit('connect', copayerId);
|
||||
};
|
||||
|
|
@ -158,15 +158,15 @@ Network.prototype._onData = function(enchex, isInbound, peerId) {
|
|||
|
||||
var privkey = this.privkey;
|
||||
|
||||
try {
|
||||
try {
|
||||
var data = this._decrypt(privkey, encbuf);
|
||||
payload= JSON.parse(data);
|
||||
payload = JSON.parse(data);
|
||||
} catch (e) {
|
||||
this._deletePeer(peerId);
|
||||
return;
|
||||
}
|
||||
|
||||
if(isInbound && payload.type === 'hello') {
|
||||
if (isInbound && payload.type === 'hello') {
|
||||
var payloadStr = JSON.stringify(payload);
|
||||
|
||||
if (this.allowedCopayerIds && !this.allowedCopayerIds[payload.copayerId]) {
|
||||
|
|
@ -179,13 +179,13 @@ Network.prototype._onData = function(enchex, isInbound, peerId) {
|
|||
return;
|
||||
}
|
||||
|
||||
if ( !this.copayerForPeer[peerId] || (isInbound && !this.isInboundPeerAuth[peerId]) ) {
|
||||
if (!this.copayerForPeer[peerId] || (isInbound && !this.isInboundPeerAuth[peerId])) {
|
||||
this._deletePeer(peerId);
|
||||
return;
|
||||
}
|
||||
|
||||
var self=this;
|
||||
switch(payload.type) {
|
||||
var self = this;
|
||||
switch (payload.type) {
|
||||
case 'disconnect':
|
||||
this._onClose(peerId);
|
||||
break;
|
||||
|
|
@ -206,21 +206,21 @@ Network.prototype._setupConnectionHandlers = function(dataConn, toCopayerId) {
|
|||
var isInbound = toCopayerId ? false : true;
|
||||
|
||||
dataConn.on('open', function() {
|
||||
if (!Network._inArray(dataConn.peer, self.connectedPeers) &&
|
||||
!self.connections[dataConn.peer]) {
|
||||
if (!Network._inArray(dataConn.peer, self.connectedPeers) &&
|
||||
!self.connections[dataConn.peer]) {
|
||||
|
||||
self.connections[dataConn.peer] = dataConn;
|
||||
|
||||
// The connecting peer send hello
|
||||
if(toCopayerId) {
|
||||
if (toCopayerId) {
|
||||
self.emit('connected');
|
||||
self._sendHello(toCopayerId);
|
||||
self._sendHello(toCopayerId);
|
||||
self._addConnectedCopayer(toCopayerId);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
dataConn.on('data', function(data) {
|
||||
dataConn.on('data', function(data) {
|
||||
self._onData(data, isInbound, dataConn.peer);
|
||||
});
|
||||
|
||||
|
|
@ -244,14 +244,14 @@ Network.prototype._setupPeerHandlers = function(openCallback) {
|
|||
|
||||
p.on('open', function() {
|
||||
self.connectedPeers = [self.peerId];
|
||||
self.copayerForPeer[self.peerId]= self.copayerId;
|
||||
self.copayerForPeer[self.peerId] = self.copayerId;
|
||||
return openCallback();
|
||||
});
|
||||
|
||||
p.on('error', function(err) {
|
||||
console.log('RECV ERROR: ', err); //TODO
|
||||
if (!err.message.match(/Could\snot\sconnect\sto peer/) ) {
|
||||
self.criticalError=err.message;
|
||||
if (!err.message.match(/Could\snot\sconnect\sto peer/)) {
|
||||
self.criticalError = err.message;
|
||||
}
|
||||
});
|
||||
|
||||
|
|
@ -270,11 +270,9 @@ Network.prototype._setupPeerHandlers = function(openCallback) {
|
|||
|
||||
Network.prototype._addCopayerMap = function(peerId, copayerId) {
|
||||
if (!this.copayerForPeer[peerId]) {
|
||||
if(Object.keys(this.copayerForPeer).length < this.maxPeers) {
|
||||
this.copayerForPeer[peerId]=copayerId;
|
||||
}
|
||||
else {
|
||||
}
|
||||
if (Object.keys(this.copayerForPeer).length < this.maxPeers) {
|
||||
this.copayerForPeer[peerId] = copayerId;
|
||||
} else {}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -288,16 +286,16 @@ Network.prototype.setCopayerId = function(copayerId) {
|
|||
throw new Error('network already started: can not change peerId')
|
||||
}
|
||||
this.copayerId = copayerId;
|
||||
this.copayerIdBuf = new Buffer(copayerId,'hex');
|
||||
this.copayerIdBuf = new Buffer(copayerId, 'hex');
|
||||
this.peerId = this.peerFromCopayer(this.copayerId);
|
||||
this._addCopayerMap(this.peerId,copayerId);
|
||||
this._addCopayerMap(this.peerId, copayerId);
|
||||
};
|
||||
|
||||
|
||||
// TODO cache this.
|
||||
Network.prototype.peerFromCopayer = function(hex) {
|
||||
var SIN = bitcore.SIN;
|
||||
return new SIN(new Buffer(hex,'hex')).toString();
|
||||
return new SIN(new Buffer(hex, 'hex')).toString();
|
||||
};
|
||||
|
||||
Network.prototype.start = function(opts, openCallback) {
|
||||
|
|
@ -317,7 +315,7 @@ Network.prototype.start = function(opts, openCallback) {
|
|||
this.setCopayerId(opts.copayerId);
|
||||
|
||||
var self = this;
|
||||
var setupPeer = function () {
|
||||
var setupPeer = function() {
|
||||
if (self.connectedPeers.length > 0) return; // Already connected!
|
||||
if (self.peer) {
|
||||
self.peer.destroy();
|
||||
|
|
@ -333,7 +331,7 @@ Network.prototype.start = function(opts, openCallback) {
|
|||
return;
|
||||
}
|
||||
if (self.criticalError && self.criticalError.match(/taken/)) {
|
||||
self.criticalError=' Looks like you are already connected to this wallet please close all other Copay Wallets '
|
||||
self.criticalError = ' Looks like you are already connected to this wallet please close all other Copay Wallets '
|
||||
}
|
||||
self.emit('serverError', self.criticalError);
|
||||
self.cleanUp();
|
||||
|
|
@ -376,7 +374,7 @@ Network.prototype._sendToOne = function(copayerId, payload, sig, cb) {
|
|||
Network.prototype.send = function(copayerIds, payload, cb) {
|
||||
if (!payload) return cb();
|
||||
|
||||
var self=this;
|
||||
var self = this;
|
||||
if (!copayerIds) {
|
||||
copayerIds = this.connectedCopayers();
|
||||
payload.isBroadcast = 1;
|
||||
|
|
@ -394,7 +392,7 @@ Network.prototype.send = function(copayerIds, payload, cb) {
|
|||
copayerIds.forEach(function(copayerId) {
|
||||
var copayerIdBuf = new Buffer(copayerId, 'hex');
|
||||
var encPayload = self._encrypt(copayerIdBuf, payloadBuf);
|
||||
self._sendToOne(copayerId, encPayload, sig, function () {
|
||||
self._sendToOne(copayerId, encPayload, sig, function() {
|
||||
if (++i === l && typeof cb === 'function') cb();
|
||||
});
|
||||
});
|
||||
|
|
@ -417,16 +415,18 @@ Network.prototype.connectTo = function(copayerId) {
|
|||
};
|
||||
|
||||
Network.prototype.lockIncommingConnections = function(allowedCopayerIdsArray) {
|
||||
this.allowedCopayerIds={};
|
||||
for(var i in allowedCopayerIdsArray) {
|
||||
this.allowedCopayerIds[ allowedCopayerIdsArray[i] ] = true;
|
||||
this.allowedCopayerIds = {};
|
||||
for (var i in allowedCopayerIdsArray) {
|
||||
this.allowedCopayerIds[allowedCopayerIdsArray[i]] = true;
|
||||
}
|
||||
};
|
||||
|
||||
Network.prototype.disconnect = function(cb, forced) {
|
||||
var self = this;
|
||||
self.closing = 1;
|
||||
self.send(null, { type: 'disconnect' }, function(){
|
||||
self.send(null, {
|
||||
type: 'disconnect'
|
||||
}, function() {
|
||||
self.cleanUp();
|
||||
if (typeof cb === 'function') cb();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -111,7 +111,7 @@ Storage.prototype.get = function(walletId, k) {
|
|||
|
||||
// set value for key
|
||||
Storage.prototype.set = function(walletId, k, v, callback) {
|
||||
this.setGlobal(this._key(walletId,k), v, callback);
|
||||
this.setGlobal(this._key(walletId, k), v, callback);
|
||||
};
|
||||
|
||||
// remove value for key
|
||||
|
|
@ -143,6 +143,6 @@ Storage.prototype.getEncryptedObj = function(walletId) {
|
|||
Storage.prototype.clearAll = function(callback) {
|
||||
this.data = {};
|
||||
this.save(callback);
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = require('soop')(Storage);
|
||||
|
|
|
|||
|
|
@ -2,8 +2,7 @@
|
|||
|
||||
var imports = require('soop').imports();
|
||||
|
||||
function Storage() {
|
||||
}
|
||||
function Storage() {}
|
||||
|
||||
Storage.prototype._read = function(k) {
|
||||
var ret;
|
||||
|
|
@ -13,7 +12,7 @@ Storage.prototype._read = function(k) {
|
|||
return ret;
|
||||
};
|
||||
|
||||
Storage.prototype._write = function(k,v) {
|
||||
Storage.prototype._write = function(k, v) {
|
||||
localStorage.setItem(k, JSON.stringify(v));
|
||||
};
|
||||
|
||||
|
|
@ -27,7 +26,7 @@ Storage.prototype._getWalletKeys = function(walletId) {
|
|||
if (walletId = split[0])
|
||||
keys.push(split[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return keys;
|
||||
};
|
||||
|
|
@ -38,8 +37,8 @@ Storage.prototype.getGlobal = function(k) {
|
|||
};
|
||||
|
||||
// set value for key
|
||||
Storage.prototype.setGlobal = function(k,v) {
|
||||
this._write(k,v);
|
||||
Storage.prototype.setGlobal = function(k, v) {
|
||||
this._write(k, v);
|
||||
};
|
||||
|
||||
// remove value for key
|
||||
|
|
@ -54,44 +53,44 @@ Storage.prototype._key = function(walletId, k) {
|
|||
};
|
||||
// get value by key
|
||||
Storage.prototype.get = function(walletId, k) {
|
||||
return this.getGlobal(this._key(walletId,k));
|
||||
return this.getGlobal(this._key(walletId, k));
|
||||
};
|
||||
|
||||
// set value for key
|
||||
Storage.prototype.set = function(walletId, k,v) {
|
||||
this.setGlobal(this._key(walletId,k), v);
|
||||
Storage.prototype.set = function(walletId, k, v) {
|
||||
this.setGlobal(this._key(walletId, k), v);
|
||||
};
|
||||
|
||||
// remove value for key
|
||||
Storage.prototype.remove = function(walletId, k) {
|
||||
this.removeGlobal(this._key(walletId,k));
|
||||
this.removeGlobal(this._key(walletId, k));
|
||||
};
|
||||
|
||||
Storage.prototype.setName = function(walletId, name) {
|
||||
this.setGlobal('nameFor::'+walletId, name);
|
||||
this.setGlobal('nameFor::' + walletId, name);
|
||||
};
|
||||
|
||||
Storage.prototype.getName = function(walletId) {
|
||||
return this.getGlobal('nameFor::'+walletId);
|
||||
return this.getGlobal('nameFor::' + walletId);
|
||||
};
|
||||
|
||||
Storage.prototype.getWalletIds = function() {
|
||||
var walletIds = [];
|
||||
var uniq = {};
|
||||
for (var i = 0; i < localStorage.length; i++) {
|
||||
var key = localStorage.key(i);
|
||||
var split = key.split('::');
|
||||
if (split.length == 2) {
|
||||
var key = localStorage.key(i);
|
||||
var split = key.split('::');
|
||||
if (split.length == 2) {
|
||||
var walletId = split[0];
|
||||
|
||||
if (walletId === 'nameFor') continue;
|
||||
|
||||
if (typeof uniq[walletId] === 'undefined' ) {
|
||||
if (typeof uniq[walletId] === 'undefined') {
|
||||
walletIds.push(walletId);
|
||||
uniq[walletId] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return walletIds;
|
||||
};
|
||||
|
||||
|
|
@ -100,9 +99,9 @@ Storage.prototype.getWallets = function() {
|
|||
var uniq = {};
|
||||
var ids = this.getWalletIds();
|
||||
|
||||
for (var i in ids){
|
||||
for (var i in ids) {
|
||||
wallets.push({
|
||||
id:ids[i],
|
||||
id: ids[i],
|
||||
name: this.getName(ids[i]),
|
||||
});
|
||||
}
|
||||
|
|
@ -120,6 +119,6 @@ Storage.prototype.setFromObj = function(walletId, obj) {
|
|||
// remove all values
|
||||
Storage.prototype.clearAll = function() {
|
||||
localStorage.clear();
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = require('soop')(Storage);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue