docs: function(callback, context) {
      if (this._advice.reconnect === this.NONE) return;
      if (this._state !== this.UNCONNECTED) return;
  
      this._state = this.CONNECTING;
      var self = this;
  
      this.info('Initiating handshake with ?', Faye.URI.stringify(this.endpoint));
      this._selectTransport(Faye.MANDATORY_CONNECTION_TYPES);
  
      this._send({
        channel:                  Faye.Channel.HANDSHAKE,
        version:                  Faye.BAYEUX_VERSION,
        supportedConnectionTypes: [this._transport.connectionType]
  
      }, function(response) {
  
        if (response.successful) {
          this._state     = this.CONNECTED;
          this._clientId  = response.clientId;
  
          this._selectTransport(response.supportedConnectionTypes);
  
          this.info('Handshake successful: ?', this._clientId);
  
          this.subscribe(this._channels.getKeys(), true);
          if (callback) Faye.Promise.defer(function() { callback.call(context) });
  
        } else {
          this.info('Handshake unsuccessful');
          Faye.ENV.setTimeout(function() { self.handshake(callback, context) }, this._advice.interval);
          this._state = this.UNCONNECTED;
        }
      }, this);
    }