mirror of
https://github.com/minetest/contentdb.git
synced 2024-11-10 17:43:46 +01:00
63 lines
1.5 KiB
JavaScript
63 lines
1.5 KiB
JavaScript
// @author rubenwardy
|
|
// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later
|
|
|
|
function getJSON(url, method) {
|
|
return new Promise(function(resolve, reject) {
|
|
fetch(new Request(url, {
|
|
method: method || "get",
|
|
credentials: "same-origin",
|
|
headers: {
|
|
"Accept": "application/json",
|
|
},
|
|
})).then(function(response) {
|
|
response.text().then(function(txt) {
|
|
resolve(JSON.parse(txt))
|
|
}).catch(reject)
|
|
}).catch(reject)
|
|
})
|
|
}
|
|
|
|
function pollTask(poll_url, disableTimeout) {
|
|
return new Promise(function(resolve, reject) {
|
|
let tries = 0;
|
|
|
|
function retry() {
|
|
tries++;
|
|
if (!disableTimeout && tries > 30) {
|
|
reject("timeout")
|
|
} else {
|
|
const interval = Math.min(tries*100, 1000)
|
|
console.log("Polling task in " + interval + "ms")
|
|
setTimeout(step, interval)
|
|
}
|
|
}
|
|
function step() {
|
|
getJSON(poll_url).then(function(res) {
|
|
if (res.status == "SUCCESS") {
|
|
console.log("Got result")
|
|
resolve(res.result)
|
|
} else if (res.status == "FAILURE" || res.status == "REVOKED") {
|
|
reject(res.error || "Unknown server error")
|
|
} else {
|
|
retry()
|
|
}
|
|
}).catch(retry)
|
|
}
|
|
retry()
|
|
})
|
|
}
|
|
|
|
|
|
function performTask(url) {
|
|
return new Promise(function(resolve, reject) {
|
|
getJSON(url, "post").then(function(startResult) {
|
|
console.log(startResult)
|
|
if (typeof startResult.poll_url == "string") {
|
|
pollTask(startResult.poll_url).then(resolve).catch(reject)
|
|
} else {
|
|
reject("Start task didn't return string!")
|
|
}
|
|
}).catch(reject)
|
|
})
|
|
}
|