code: func (c *Client) CallContext(ctx context.Context, result interface{}, method string, args ...interface{}) error {
  	msg, err := c.newMessage(method, args...)
  	if err != nil {
  		return err
  	}
  	op := &requestOp{ids: []json.RawMessage{msg.ID}, resp: make(chan *jsonrpcMessage, 1)}
  
  	if c.isHTTP {
  		err = c.sendHTTP(ctx, op, msg)
  	} else {
  		err = c.send(ctx, op, msg)
  	}
  	if err != nil {
  		return err
  	}
  
  	// dispatch has accepted the request and will close the channel when it quits.
  	switch resp, err := op.wait(ctx, c); {
  	case err != nil:
  		return err
  	case resp.Error != nil:
  		return resp.Error
  	case len(resp.Result) == 0:
  		return ErrNoResult
  	default:
  		return json.Unmarshal(resp.Result, &result)
  	}
  }
docs: // CallContext performs a JSON-RPC call with the given arguments. If the context is
  // canceled before the call has successfully returned, CallContext returns immediately.
  //
  // The result must be a pointer so that package json can unmarshal into it. You
  // can also pass nil, in which case the result is ignored.