code: func SendDefaultRequest(target ChromeTargeter, sendCh chan<- *Message, paramRequest *ParamRequest) (*ChromeResponse, error) {
  	req := &ChromeRequest{Id: paramRequest.Id, Method: paramRequest.Method, Params: paramRequest.Params}
  	data, err := json.Marshal(req)
  	if err != nil {
  		return nil, err
  	}
  
  	recvCh := make(chan *Message, 1)
  	sendMsg := &Message{ReplyCh: recvCh, Id: paramRequest.Id, Data: []byte(data)}
  
  	timeout := time.NewTimer(target.GetApiTimeout())
  	defer timeout.Stop()
  
  	select {
  	case sendCh <- sendMsg:
  		timeout.Stop()
  	case <-timeout.C:
  		return nil, &ChromeApiTimeoutErr{}
  	case <-target.GetDoneCh():
  		return nil, &ChromeDoneErr{}
  	}
  
  	timeout.Reset(target.GetApiTimeout())
  
  	var resp *Message
  	select {
  	case <-timeout.C:
  		return nil, &ChromeApiTimeoutErr{}
  	case resp = <-recvCh:
  		timeout.Stop()
  	case <-target.GetDoneCh():
  		return nil, &ChromeDoneErr{}
  	}
  
  	if resp == nil || resp.Data == nil {
  		return nil, &ChromeEmptyResponseErr{}
  	}
  
  	chromeResponse := &ChromeResponse{}
  	err = json.Unmarshal(resp.Data, chromeResponse)
  	if err != nil {
  		return nil, err
  	}
  	return chromeResponse, nil
  }
docs: // Sends a generic request that gets back a generic response, or error. This returns a ChromeResponse
  // object.