docs: function( connection ) {
      this._users = []; // Collect high-level information about users
      this._channels = {}; // Collect high-level information about channels
      this.sessions = {}; // Sessions to user map
  
      // TODO: We are storing the users twice to avoid some looping. Is this the
      // best approach?
  
      /**
       * @summary Defines whether the connection has been succesffully handshaken.
       *
       * @description
       * The connection is considered `ready` when the server handshake has been
       * processed and the initial ping has been received.
       *
       * @name MumbleClient#ready
       * @type Boolean
       */
      this.ready = false;
  
      /**
       * @summary The internal {@link MumbleConnection} object.
       *
       * @description
       * The connection object is used for the low level access to the Mumble
       * protocol. Most developers should find a higher level APIs for the
       * functionality on the {@link MumbleClient} class instead.
       *
       * @name MumbleClient#connection
       * @type MumbleConnection
       */
      this.connection = connection;
  
      /**
       * @summary The server root channel.
       *
       * @name MumbleClient#rootChannel
       * @type Channel
       */
      this.rootChannel = undefined;
  
      /**
       * @summary The current user.
       *
       * @name MumbleClient#user
       * @type User
       */
      this.user = undefined;
  
      this._gotServerSync = false;
      this._gotInitialPing = false;
  
      // Generate list of free whisper target IDs.
      this.freeTargets = [];
      for( var i = 1; i <= 30; i++ ) {
          this.freeTargets.push( i );
      }
  
      /*
       * Forward all events from the connection
       */
      this.on( 'newListener', function( event, listener ) {
          connection.on( event, listener );
      } );
  
      connection.once( 'ping', this._initialPing.bind( this ) );
      connection.on( 'channelRemove', this._channelRemove.bind( this ) );
      connection.on( 'userRemove', this._userRemove.bind( this ) );
      connection.on( 'serverSync', this._serverSync.bind( this ) );
      connection.on( 'userState', this._userState.bind( this ) );
      connection.on( 'channelState', this._channelState.bind( this ) );
      connection.on( 'permissionQuery', this._permissionQuery.bind( this ) );
      connection.on( 'textMessage', this._textMessage.bind( this ) );
  }