pack/templates/js/token.js

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;
}
});
}