docs: def refresh(self, access_token=None, **kwargs):
          """Refresh access and refresh tokens.
  
          Args:
              access_token (str): Access token to refresh. Defaults to ``None``.
  
          Returns:
              str: Refreshed access token.
  
          """
          if not self.token_lock.locked():
              with self.token_lock:
                  if access_token == self.access_token or access_token is None:
                      if self.developer_token is not None:
                          r = self._httpclient.request(
                              method='POST',
                              url=self.developer_token_url,
                              path='/request_token',
                              headers={
                                  'Authorization': 'Bearer {}'.format(
                                      self.developer_token
                                  )
                              },
                              timeout=30,
                              raise_for_status=True
                          )
  
                      elif all(
                          [
                              self.client_id,
                              self.client_secret,
                              self.refresh_token
                          ]
                      ):
                          data = {
                              'client_id': self.client_id,
                              'client_secret': self.client_secret,
                              'refresh_token': self.refresh_token,
                              'grant_type': 'refresh_token'
                          }
                          r = self._httpclient.request(
                              method='POST',
                              url=self.token_url,
                              json=data,
                              path='/api/oauth2/RequestToken',
                              **kwargs
                          )
                      else:
                          raise PartialCredentialsError(
                              "Missing one or more required credentials"
                          )
  
                      if r:
                          if not r.ok:
                              raise PanCloudError(
                                  '%s %s: %s' % (
                                  r.status_code, r.reason, r.text)
                              )
                          try:
                              r_json = r.json()
                          except ValueError as e:
                              raise PanCloudError("Invalid JSON: %s" % e)
                          else:
                              if r.json().get(
                                  'error_description'
                              ) or r.json().get(
                                  'error'
                              ):
                                  raise PanCloudError(r.text)
                              self.access_token = r_json.get(
                                  'access_token', None
                              )
                              self.jwt_exp = self._decode_exp(
                                  self.access_token_)
                              if r_json.get('refresh_token', None):
                                  self.refresh_token = \
                                      r_json.get('refresh_token')
                              self.write_credentials()
                          return self.access_token_