const TIMEOUT = 15000

function fetchWithTimeout (url, options) {
  return Promise.race([
    fetch(url, options),
    new Promise((resolve, reject) => {
      setTimeout(() => reject(new Error(`Timed out after ${TIMEOUT / 1000} seconds`)), TIMEOUT)
    })
  ])
}

export async function post (url, body) {
  return (await fetchWithTimeout(url, {
    method: 'POST',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(body)
  })).json()
}

export function paramsString (paramsObject) {
  let params = new URLSearchParams()
  Object.keys(paramsObject).forEach(key => {
    params.set(key, paramsObject[key])
  })
  return params.toString()
}

export async function get (url, headers = {}) {
  return (await fetchWithTimeout(url, {
    method: 'GET',
    headers: Object.assign(headers, {
      'Accept': 'application/json'
    })
  })).json()
}