|
export type RequestResult = { body: string; status: number }; |
|
|
|
|
|
|
|
|
|
|
|
export function requestWithUploadDownloadProgress( |
|
url: string, |
|
method: "GET" | "HEAD" | "POST" | "PUT" | "DELETE" | "CONNECT" | "OPTIONS" | "TRACE" | "PATCH", |
|
body: string, |
|
uploadProgress: (progress: number) => void, |
|
downloadOccurring: () => void, |
|
): [Promise<RequestResult>, XMLHttpRequest | undefined] { |
|
let xhrValue: XMLHttpRequest | undefined; |
|
const promise = new Promise<RequestResult>((resolve, reject) => { |
|
const xhr = new XMLHttpRequest(); |
|
xhr.upload.addEventListener("progress", (e) => uploadProgress(e.loaded / e.total)); |
|
xhr.addEventListener("progress", () => downloadOccurring()); |
|
xhr.addEventListener("load", () => resolve({ status: xhr.status, body: xhr.responseText })); |
|
xhr.addEventListener("abort", () => resolve({ status: xhr.status, body: xhr.responseText })); |
|
xhr.addEventListener("error", () => reject(new Error("Request error"))); |
|
xhr.open(method, url, true); |
|
xhr.setRequestHeader("accept", "*/*"); |
|
xhr.setRequestHeader("accept-language", "en-US,en;q=0.9"); |
|
xhr.setRequestHeader("content-type", "application/json"); |
|
|
|
xhrValue = xhr; |
|
|
|
xhr.send(body); |
|
}); |
|
|
|
return [promise, xhrValue]; |
|
} |
|
|