docs: function PoolEndpoint(protocol, ip, port, options) {
      options = options || {};
  
      this.http = protocol;
      this.healthy = true;
  
      this.ip = ip;
      this.address = ip;
      this.port = port;
  
      this.keep_alive = options.keep_alive || options.keepAlive;
      this.agent_options = options.agent_options || options.agentOptions;
  
      if (this.keep_alive) {
          if (protocol === http) {
              this.agent = new GO.KeepAliveAgent.HTTP(this.agent_options);
          } else {
              this.agent = new GO.KeepAliveAgent.HTTPS(this.agent_options);
          }
      } else {
          this.agent = new protocol.Agent(this.agent_options);
      }
  
      if (this.agent && typeof this.agent.getName === 'function') {
          this.name = this.agent.getName({
              host: this.ip,
              port: this.port
          });
      } else {
          this.name = this.ip + ":" + this.port;
      }
  
      this.agent.maxSockets = options.max_sockets || options.maxSockets || 5;
  
      this.requests = Object.create(null);
      this.request_count = 0;
      this.requests_last_check = 0;
      this.request_rate = 0;
      this.pending = 0;
      this.successes = 0;
      this.failures = 0;
      this.filtered = 0;
  
      this.timeout = (options.timeout === 0) ? 0 : options.timeout || (60 * 1000);
      this.resolution = (options.resolution === 0) ? 0 : options.resolution || 1000;
      this.timeout_enabled = this.resolution > 0 && this.timeout > 0;
      this.timeout_interval = null;
      this.bindCheckTimeouts = bindCheckTimeouts;
  
      // note that the pinger doesn't start by default, but in the future we might want to add an option for checking an endpoint before ever using it
      this.ping_path = options.ping;
      this.ping_timeout = options.ping_timeout || 5000;
      this.pinger = new GO.PoolPinger(this);
  
      var self = this;
      function bindCheckTimeouts() {
          self.check_timeouts();
      }
  }