57 lines
1.9 KiB
JavaScript
57 lines
1.9 KiB
JavaScript
// Fetch function for applet use case.
|
|
async function jfetch(url, method, obj={}) {
|
|
let request = {
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"Authorization": window.localStorage.getItem("token"),
|
|
},
|
|
method: method,
|
|
};
|
|
|
|
if (!isEmpty(obj)) request["body"] = JSON.stringify(obj);
|
|
|
|
return fetch(url, request)
|
|
.then((response) => {
|
|
let contentType = response.headers.get("Content-Type");
|
|
let json;
|
|
if (contentType && contentType.indexOf("application/json" !== -1)) {
|
|
json = response.json();
|
|
} else { // Reprocess non-json into json.
|
|
json = response.text().then((text) => {
|
|
return { status: response.status, "message": text };
|
|
});
|
|
}
|
|
if (!response.ok) { throw json; }
|
|
return json;
|
|
});
|
|
}
|
|
|
|
// OAUTH //
|
|
|
|
async function getToken() {
|
|
let response;
|
|
if (G_QUERY.code) {
|
|
response = await jfetch("/api/token", "POST", { code: G_QUERY.code });
|
|
} else {
|
|
response = await jfetch("/api/token", "PATCH", { code: window.localStorage.getItem("refresh_token") });
|
|
}
|
|
|
|
window.localStorage.setItem("token", response.access_token);
|
|
window.localStorage.setItem("token_expiry", (Date.now() + response.expires_in*1000).toString());
|
|
window.localStorage.setItem("refresh_token", response.refresh_token);
|
|
}
|
|
|
|
async function tryRefresh() {
|
|
if (Date.now() < parseInt(window.localStorage.getItem("token_expiry"))) return; // Not expired.
|
|
await getToken().catch((err) => {
|
|
let json = err.json();
|
|
if (json.status == 401 && json.code === 0) { // Could not refresh, so refresh token expired.
|
|
window.localStorage.clear();
|
|
alert(`Could not get new session, did you remove access from Gitea?`);
|
|
window.location = "/";
|
|
} else {
|
|
throw json;
|
|
}
|
|
});
|
|
}
|