Files

227 lines
7.5 KiB
JavaScript

import { JSONStringify } from "./form";
export function http_get(url, type = "json", params) {
return new Promise((done, err) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.withCredentials = true;
xhr.setRequestHeader("X-Requested-With", "XmlHttpRequest");
if (window.BEARER_TOKEN) xhr.setRequestHeader("Authorization", `Bearer ${window.BEARER_TOKEN}`);
xhr.onerror = function() {
handle_error_response(xhr, err);
};
xhr.onreadystatechange = function() {
if (xhr.readyState !== XMLHttpRequest.DONE) {
return;
} else if (xhr.status !== 200) {
const isAborted = xhr.onerror === null;
if (isAborted) return
handle_error_response(xhr, err);
return;
}
if (type !== "json") {
done(xhr.responseText);
return
}
try {
const data = JSON.parse(xhr.responseText);
if ("status" in data === false || data.status === "ok") {
done(data);
} else {
err(data);
}
} catch (error) {
err({ message: "oups", trace: error });
}
};
xhr.send(null);
if (params && params.abort) {
params.abort.signal.onabort = () => {
xhr.onerror = null;
err({ message: "aborted", code: "ABORTED" });
xhr.abort();
};
}
});
}
export function http_post(url, data, type = "json", params) {
return new Promise((done, err) => {
const xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.withCredentials = true;
xhr.setRequestHeader("X-Requested-With", "XmlHttpRequest");
if (window.BEARER_TOKEN) xhr.setRequestHeader("Authorization", `Bearer ${window.BEARER_TOKEN}`);
if (data && type === "json") {
data = JSON.stringify(data);
xhr.setRequestHeader("Content-Type", "application/json");
}
if (params && params.progress) {
xhr.upload.addEventListener("progress", params.progress, false);
}
xhr.onerror = function() {
handle_error_response(xhr, err);
};
xhr.onload = function() {
if (xhr.readyState !== XMLHttpRequest.DONE) {
return;
} else if (xhr.status !== 200) {
const isAborted = xhr.onerror === null;
if (isAborted) return
handle_error_response(xhr, err);
return;
}
const bearerToken = xhr.getResponseHeader("bearer");
if (bearerToken) window.BEARER_TOKEN = bearerToken;
try {
const data = JSON.parse(xhr.responseText);
if (data.status !== "ok") {
err(data);
return;
}
done(data);
} catch (error) {
err({ message: "oups", trace: error });
}
};
xhr.send(data);
if (params && params.abort) {
params.abort(() => {
xhr.onerror = null;
xhr.abort();
err({ message: "aborted", code: "ABORTED" });
});
}
});
}
export function http_delete(url) {
return new Promise((done, err) => {
const xhr = new XMLHttpRequest();
xhr.open("DELETE", url, true);
xhr.withCredentials = true;
xhr.setRequestHeader("X-Requested-With", "XmlHttpRequest");
if (window.BEARER_TOKEN) xhr.setRequestHeader("Authorization", `Bearer ${window.BEARER_TOKEN}`);
xhr.onerror = function() {
handle_error_response(xhr, err);
};
xhr.onload = function() {
if (xhr.readyState !== XMLHttpRequest.DONE) {
return;
} else if (xhr.status !== 200) {
handle_error_response(xhr, err);
return;
}
try {
const data = JSON.parse(xhr.responseText);
if (data.status !== "ok") {
err(data);
return
}
done(data);
} catch (error) {
err({ message: "oups", trace: error });
}
};
xhr.send(null);
});
}
export function http_options(url) {
return new Promise((done, err) => {
const xhr = new XMLHttpRequest();
xhr.open("OPTIONS", url, true);
xhr.withCredentials = true;
xhr.setRequestHeader("X-Requested-With", "XmlHttpRequest");
if (window.BEARER_TOKEN) xhr.setRequestHeader("Authorization", `Bearer ${window.BEARER_TOKEN}`);
xhr.onerror = function() {
handle_error_response(xhr, err);
};
xhr.onload = function() {
if (xhr.readyState !== XMLHttpRequest.DONE) {
return
} else if (xhr.status !== 200) {
handle_error_response(xhr, err);
return;
}
done(
xhr.getAllResponseHeaders()
.split("\n")
.reduce((acc, r) => {
const a = r.split(": ");
acc[a[0]] = a[1];
return acc;
}, {}),
);
};
xhr.send(null);
});
}
function handle_error_response(xhr, err) {
const response = (function(content) {
let message = content;
try {
message = JSON.parse(content);
} catch (err) {
return {
message: Array.from(new Set(
content.replace(/<[^>]*>/g, "")
.replace(/\n{2,}/, "\n")
.trim()
.split("\n")
)).join(" "),
};
}
return message || { message: "empty response" };
})(xhr.responseText);
const message = response.message || null;
if (navigator.onLine === false) {
err({ message: "Connection Lost", code: "NO_INTERNET" });
return;
}
switch(xhr.status) {
case 500:
err({
message: message || "Oups something went wrong with our servers",
code: "INTERNAL_SERVER_ERROR",
});
break;
case 401:
err({ message: message || "Authentication error", code: "Unauthorized" });
break;
case 403:
err({ message: message || "You can\'t do that", code: "Forbidden" });
break;
case 413:
err({ message: message || "Payload too large", code: "PAYLOAD_TOO_LARGE" });
case 502:
err({ message: message || "The destination is acting weird", code: "BAD_GATEWAY" });
case 409:
if (response["error_summary"]) { // dropbox way to say doesn't exist
err({ message: "Doesn\'t exist", code: "UNKNOWN_PATH" });
return
}
err({ message: message || "Oups you just ran into a conflict", code: "CONFLICT" });
case 0:
switch(xhr.responseText) {
case "":
err({
message: "Service unavailable, if the problem persist, contact your administrator",
code: "INTERNAL_SERVER_ERROR",
});
break;
default:
err({ message: xhr.responseText, code: "INTERNAL_SERVER_ERROR" });
}
default:
err({ message: message || "Oups something went wrong" });
}
}