diff --git a/lib/bcoin/peer.js b/lib/bcoin/peer.js index eb55fa5c..373f8f74 100644 --- a/lib/bcoin/peer.js +++ b/lib/bcoin/peer.js @@ -546,6 +546,8 @@ Peer.prototype.setFeeRate = function setFeeRate(rate) { */ Peer.prototype.destroy = function destroy() { + var i, j, hashes, hash, queue; + if (this.destroyed) return; @@ -559,13 +561,15 @@ Peer.prototype.destroy = function destroy() { this.ping.timer = null; } - Object.keys(this.requests.map).forEach(function(cmd) { - var queue = this.requests.map[cmd]; - var i; + hashes = Object.keys(this.requests.map); - for (i = 0; i < queue.length; i++) - clearTimeout(queue[i].timer); - }, this); + for (i = 0; i < hashes.length; i++) { + hash = hashes[i]; + queue = this.requests.map[cmd]; + + for (j = 0; j < queue.length; j++) + clearTimeout(queue[j].timer); + } }; /** diff --git a/lib/bcoin/pool.js b/lib/bcoin/pool.js index 32ceae95..8a336cb3 100644 --- a/lib/bcoin/pool.js +++ b/lib/bcoin/pool.js @@ -80,7 +80,7 @@ var InvItem = bcoin.packets.InvItem; function Pool(options) { var self = this; - var seeds; + var i, seeds, hostname, seed; if (!(this instanceof Pool)) return new Pool(options); @@ -111,13 +111,16 @@ function Pool(options) { seeds.unshift(process.env.BCOIN_SEED); } - this.seeds = seeds.map(function(hostname) { - return NetworkAddress.fromHostname(hostname, self.network); - }); - + this.seeds = []; this.hosts = []; this.hostMap = {}; + for (i = 0; i < seeds.length; i++) { + hostname = seeds[i]; + seed = NetworkAddress.fromHostname(hostname, this.network); + this.seeds.push(seed); + } + this.address = new NetworkAddress({ ts: utils.now() - (process.uptime() | 0), services: constants.LOCAL_SERVICES, @@ -1292,10 +1295,13 @@ Pool.prototype._addPeer = function _addPeer() { */ Pool.prototype._removePeer = function _removePeer(peer) { + var i, hashes, hash, item; + utils.binaryRemove(this.peers.pending, peer, compare); utils.binaryRemove(this.peers.regular, peer, compare); utils.binaryRemove(this.peers.leeches, peer, compare); utils.binaryRemove(this.peers.all, peer, compare); + delete this.peers.map[peer.host]; if (this.peers.load === peer) { @@ -1303,11 +1309,14 @@ Pool.prototype._removePeer = function _removePeer(peer) { this.peers.load = null; } - Object.keys(this.request.map).forEach(function(hash) { - var item = this.request.map[hash]; + hashes = Object.keys(this.request.map); + + for (i = 0; i < hashes.length; i++) { + hash = hashes[i]; + item = this.request.map[hash]; if (item.peer === peer) item.finish(new Error('Peer closed.')); - }, this); + } }; /** @@ -1663,6 +1672,8 @@ Pool.prototype.setFeeRate = function setFeeRate(rate) { Pool.prototype.close = Pool.prototype.destroy = function destroy(callback) { + var i, items, peers, hashes, hash; + callback = utils.ensure(callback); if (this.destroyed) @@ -1672,28 +1683,35 @@ Pool.prototype.destroy = function destroy(callback) { this.stopSync(); - this.inv.items.slice().forEach(function(entry) { - entry.finish(); - }); + items = this.inv.items.slice(); - Object.keys(this.request.map).forEach(function(hash) { + for (i = 0; i < items.length; i++) + items[i].finish(); + + hashes = Object.keys(this.request.map); + + for (i = 0; i < hashes.length; i++) { + hash = hashes[i]; this.request.map[hash].finish(new Error('Pool closed.')); - }, this); + } if (this.peers.load) this.peers.load.destroy(); - this.peers.regular.slice().forEach(function(peer) { - peer.destroy(); - }); + peers = this.peers.regular.slice(); - this.peers.pending.slice().forEach(function(peer) { - peer.destroy(); - }); + for (i = 0; i < peers.length; i++) + peers[i].destroy(); - this.peers.leeches.slice().forEach(function(peer) { - peer.destroy(); - }); + peers = this.peers.pending.slice(); + + for (i = 0; i < peers.length; i++) + peers[i].destroy(); + + peers = this.peers.leeches.slice(); + + for (i = 0; i < peers.length; i++) + peers[i].destroy(); this.unlisten(callback); };