lib/peer.js
function Peer(options) {
  /* jshint maxstatements: 26 */
  /* jshint maxcomplexity: 8 */

  if (!(this instanceof Peer)) {
    return new Peer(options);
  }

  if (options.socket) {
    this.socket = options.socket;
    this.host = this.socket.remoteAddress;
    this.port = this.socket.remotePort;
    this.status = Peer.STATUS.CONNECTED;
    this._addSocketEventHandlers();
  } else {
    this.host = options.host || 'localhost';
    this.status = Peer.STATUS.DISCONNECTED;
    this.port = options.port;
  }

  this.network = Networks.get(options.network) || Networks.defaultNetwork;

  if (!this.port) {
    this.port = this.network.port;
  }

  this.messages = options.messages || new Messages({
    network: this.network,
    Block: bitcore.Block,
    Transaction: bitcore.Transaction
  });

  this.dataBuffer = new Buffers();

  this.version = 0;
  this.bestHeight = 0;
  this.subversion = null;
  this.relay = options.relay === false ? false : true;

  this.versionSent = false;

  // set message handlers
  var self = this;
  this.on('verack', function() {
    self.status = Peer.STATUS.READY;
    self.emit('ready');
  });

  this.on('version', function(message) {
    self.version = message.version;
    self.subversion = message.subversion;
    self.bestHeight = message.startHeight;

    var verackResponse = self.messages.VerAck();
    self.sendMessage(verackResponse);

    if(!self.versionSent) {
      self._sendVersion();
    }
  });

  this.on('ping', function(message) {
    self._sendPong(message.nonce);
  });

  return this;

}
function Peer(options) {
  /* jshint maxstatements: 26 */
  /* jshint maxcomplexity: 8 */

  if (!(this instanceof Peer)) {
    return new Peer(options);
  }

  if (options.socket) {
    this.socket = options.socket;
    this.host = this.socket.remoteAddress;
    this.port = this.socket.remotePort;
    this.status = Peer.STATUS.CONNECTED;
    this._addSocketEventHandlers();
  } else {
    this.host = options.host || 'localhost';
    this.status = Peer.STATUS.DISCONNECTED;
    this.port = options.port;
  }

  this.network = Networks.get(options.network) || Networks.defaultNetwork;

  if (!this.port) {
    this.port = this.network.port;
  }

  this.messages = options.messages || new Messages({
    network: this.network,
    Block: bitcore.Block,
    Transaction: bitcore.Transaction
  });

  this.dataBuffer = new Buffers();

  this.version = 0;
  this.bestHeight = 0;
  this.subversion = null;
  this.relay = options.relay === false ? false : true;

  this.versionSent = false;

  // set message handlers
  var self = this;
  this.on('verack', function() {
    self.status = Peer.STATUS.READY;
    self.emit('ready');
  });

  this.on('version', function(message) {
    self.version = message.version;
    self.subversion = message.subversion;
    self.bestHeight = message.startHeight;

    var verackResponse = self.messages.VerAck();
    self.sendMessage(verackResponse);

    if(!self.versionSent) {
      self._sendVersion();
    }
  });

  this.on('ping', function(message) {
    self._sendPong(message.nonce);
  });

  return this;

}
function Peer ( options ) { /* jshint maxstatements: 26 */ /* jshint maxcomplexity: 8 */ if ( ! ( this instanceof Peer ) ) { return new Peer ( options ) ; } if ( options . socket ) { this . socket = options . socket ; this . host = this . socket . remoteAddress ; this . port = this . socket . remotePort ; this . status = Peer . STATUS . CONNECTED ; this . _addSocketEventHandlers ( ) ; } else { this . host = options . host || 'localhost' ; this . status = Peer . STATUS . DISCONNECTED ; this . port = options . port ; } this . network = Networks . get ( options . network ) || Networks . defaultNetwork ; if ( ! this . port ) { this . port = this . network . port ; } this . messages = options . messages || new Messages ( { network : this . network , Block : bitcore . Block , Transaction : bitcore . Transaction } ) ; this . dataBuffer = new Buffers ( ) ; this . version = 0 ; this . bestHeight = 0 ; this . subversion = null ; this . relay = options . relay === false ? false : true ; this . versionSent = false ; // set message handlers var self = this ; this . on ( 'verack' , function ( ) { self . status = Peer . STATUS . READY ; self . emit ( 'ready' ) ; } ) ; this . on ( 'version' , function ( message ) { self . version = message . version ; self . subversion = message . subversion ; self . bestHeight = message . startHeight ; var verackResponse = self . messages . VerAck ( ) ; self . sendMessage ( verackResponse ) ; if ( ! self . versionSent ) { self . _sendVersion ( ) ; } } ) ; this . on ( 'ping' , function ( message ) { self . _sendPong ( message . nonce ) ; } ) ; return this ; }
The Peer constructor will create an instance of Peer to send and receive messages
using the standard Bitcoin protocol. A Peer instance represents one connection
on the Bitcoin network. To create a new peer connection provide the host and port
options and then invoke the connect method. Additionally, a newly connected socket
can be provided instead of host and port.

@example
```javascript

var peer = new Peer({host: '127.0.0.1'}).setProxy('127.0.0.1', 9050);
peer.on('tx', function(tx) {
console.log('New transaction: ', tx.id);
});
peer.connect();
```

@param {Object} options
@param {String} options.host - IP address of the remote host
@param {Number} options.port - Port number of the remote host
@param {Network} options.network - The network configuration
@param {Boolean=} options.relay - An option to disable automatic inventory relaying from the remote peer
@param {Socket=} options.socket - An existing connected socket

@returns {Peer} A new instance of Peer.
@constructor
The Peer constructor will create an instance of Peer to send and receive messages using the standard Bitcoin protocol . A Peer instance represents one connection on the Bitcoin network . To create a new peer connection provide the host and port options and then invoke the connect method . Additionally a newly connected socket can be provided instead of host and port .