/* global AbortController */

export default function ({ timeout = 120000 } = {}) {
  return function _fetch (url, opts) {
    return new Promise(async (resolve, reject) => {
      const abortController = new AbortController()
      const abortSignal = abortController.signal
      const f = fetch(url, {
        ...opts,
        signal: abortSignal,
      })

      const timer = setTimeout(() => abortController.abort(), timeout)

      try {
        const res = await f
        clearTimeout(timer)
        return resolve(res)
      } catch (e) {
        clearTimeout(timer)
        return reject(e)
      }
    })
  }
}