code: func (k *KeyManager) streamKeyResp(resp *KeyResponse, ch <-chan NodeResponse) {
  	for r := range ch {
  		var nodeResponse nodeKeyResponse
  
  		resp.NumResp++
  
  		// Decode the response
  		if len(r.Payload) < 1 || messageType(r.Payload[0]) != messageKeyResponseType {
  			resp.Messages[r.From] = fmt.Sprintf(
  				"Invalid key query response type: %v", r.Payload)
  			resp.NumErr++
  			goto NEXT
  		}
  		if err := decodeMessage(r.Payload[1:], &nodeResponse); err != nil {
  			resp.Messages[r.From] = fmt.Sprintf(
  				"Failed to decode key query response: %v", r.Payload)
  			resp.NumErr++
  			goto NEXT
  		}
  
  		if !nodeResponse.Result {
  			resp.Messages[r.From] = nodeResponse.Message
  			resp.NumErr++
  		}
  
  		if nodeResponse.Result && len(nodeResponse.Message) > 0 {
  			resp.Messages[r.From] = nodeResponse.Message
  			k.serf.logger.Println("[WARN] serf:", nodeResponse.Message)
  		}
  
  		// Currently only used for key list queries, this adds keys to a counter
  		// and increments them for each node response which contains them.
  		for _, key := range nodeResponse.Keys {
  			if _, ok := resp.Keys[key]; !ok {
  				resp.Keys[key] = 1
  			} else {
  				resp.Keys[key]++
  			}
  		}
  
  	NEXT:
  		// Return early if all nodes have responded. This allows us to avoid
  		// waiting for the full timeout when there is nothing left to do.
  		if resp.NumResp == resp.NumNodes {
  			return
  		}
  	}
  }
docs: // streamKeyResp takes care of reading responses from a channel and composing
  // them into a KeyResponse. It will update a KeyResponse *in place* and
  // therefore has nothing to return.