2018-03-06 17:03:59 +00:00
|
|
|
const TIMEOUT = process.browser ? 15000 : 60000
|
2018-02-11 18:49:32 +00:00
|
|
|
|
2018-02-11 22:11:03 +00:00
|
|
|
function fetchWithTimeout (url, options) {
|
2018-02-24 02:23:36 +00:00
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
fetch(url, options).then(resolve, reject)
|
|
|
|
setTimeout(() => reject(new Error(`Timed out after ${TIMEOUT / 1000} seconds`)), TIMEOUT)
|
|
|
|
})
|
2018-02-11 18:49:32 +00:00
|
|
|
}
|
|
|
|
|
2018-02-25 02:20:33 +00:00
|
|
|
async function throwErrorIfInvalidResponse (response) {
|
2018-02-25 03:25:33 +00:00
|
|
|
let json = await response.json()
|
|
|
|
if (response.status >= 200 && response.status < 300) {
|
|
|
|
return json
|
|
|
|
}
|
|
|
|
if (json && json.error) {
|
|
|
|
throw new Error(response.status + ': ' + json.error)
|
|
|
|
}
|
|
|
|
throw new Error('Request failed: ' + response.status)
|
|
|
|
}
|
|
|
|
|
2018-02-24 02:23:36 +00:00
|
|
|
async function _post (url, body, headers, timeout) {
|
|
|
|
let fetchFunc = timeout ? fetchWithTimeout : fetch
|
2018-02-24 22:49:28 +00:00
|
|
|
let opts = {
|
|
|
|
method: 'POST'
|
|
|
|
}
|
|
|
|
if (body) {
|
2018-03-02 05:21:49 +00:00
|
|
|
let isFormData = body instanceof FormData
|
|
|
|
opts.headers = Object.assign(headers, isFormData ? {
|
|
|
|
'Accept': 'application/json'
|
|
|
|
} : {
|
2018-01-13 22:19:51 +00:00
|
|
|
'Accept': 'application/json',
|
|
|
|
'Content-Type': 'application/json'
|
2018-02-24 22:49:28 +00:00
|
|
|
})
|
2018-03-02 05:21:49 +00:00
|
|
|
opts.body = isFormData ? body : JSON.stringify(body)
|
2018-02-24 22:49:28 +00:00
|
|
|
} else {
|
|
|
|
opts.headers = Object.assign(headers, {
|
|
|
|
'Accept': 'application/json'
|
|
|
|
})
|
|
|
|
}
|
2018-02-25 03:25:33 +00:00
|
|
|
let response = await fetchFunc(url, opts)
|
|
|
|
return throwErrorIfInvalidResponse(response)
|
2018-01-13 22:19:51 +00:00
|
|
|
}
|
|
|
|
|
2018-02-24 02:23:36 +00:00
|
|
|
async function _get (url, headers, timeout) {
|
|
|
|
let fetchFunc = timeout ? fetchWithTimeout : fetch
|
2018-02-25 03:25:33 +00:00
|
|
|
let response = await fetchFunc(url, {
|
2018-01-13 22:19:51 +00:00
|
|
|
method: 'GET',
|
|
|
|
headers: Object.assign(headers, {
|
2018-02-09 06:29:29 +00:00
|
|
|
'Accept': 'application/json'
|
2018-01-13 22:19:51 +00:00
|
|
|
})
|
2018-02-25 03:25:33 +00:00
|
|
|
})
|
|
|
|
return throwErrorIfInvalidResponse(response)
|
2018-02-09 06:29:29 +00:00
|
|
|
}
|
2018-02-24 02:23:36 +00:00
|
|
|
|
|
|
|
export async function post (url, body, headers = {}) {
|
|
|
|
return _post(url, body, headers, false)
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function postWithTimeout (url, body, headers = {}) {
|
|
|
|
return _post(url, body, headers, true)
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function getWithTimeout (url, headers = {}) {
|
|
|
|
return _get(url, headers, true)
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function get (url, headers = {}) {
|
|
|
|
return _get(url, headers, false)
|
|
|
|
}
|
|
|
|
|
|
|
|
export function paramsString (paramsObject) {
|
2018-03-09 08:08:23 +00:00
|
|
|
let res = ''
|
|
|
|
Object.keys(paramsObject).forEach((key, i) => {
|
|
|
|
if (i > 0) {
|
|
|
|
res += '&'
|
|
|
|
}
|
|
|
|
res += encodeURIComponent(key) + '=' + encodeURIComponent(paramsObject[key])
|
2018-02-24 02:23:36 +00:00
|
|
|
})
|
2018-03-09 08:08:23 +00:00
|
|
|
return res
|
2018-02-24 22:49:28 +00:00
|
|
|
}
|