import callApi from './callApi';
import rejectAfterTimeout from './rejectAfterTimeout';
import parseResponse from './parseResponse';
import { CallApi, ClientTimeout, ParseMethod } from '../types';

export default async function callApiAndParseWithTimeout<T extends ParseMethod = 'json'>({
  timeout,
  parseMethod,
  ...rest
}: { timeout?: ClientTimeout; parseMethod?: T } & CallApi) {
  const apiPromise = callApi(rest);
  const racedPromise =
    typeof timeout === 'number' && timeout > 0
      ? Promise.race([apiPromise, rejectAfterTimeout<Response>(timeout)])
      : apiPromise;

  return parseResponse(racedPromise, parseMethod);
}
