From 2c785f6cb6514fa17a07a36f3a05fadea3d12300 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 15 Dec 2022 20:24:53 +0100 Subject: [PATCH] Expose more of the results in Utils --- Utils.ts | 53 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/Utils.ts b/Utils.ts index b9f98c18d..242df3ca8 100644 --- a/Utils.ts +++ b/Utils.ts @@ -1,5 +1,5 @@ import * as colors from "./assets/colors.json" -import HTML = Mocha.reporters.HTML; + export class Utils { /** @@ -139,7 +139,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be "false", ] private static injectedDownloads = {} - private static _download_cache = new Map; timestamp: number }>() + private static _download_cache = new Map; timestamp: number }>() /** * Parses the arguments for special visualisations @@ -809,11 +809,13 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be * Download function which also indicates advanced options, such as redirects * @param url * @param headers + * @param onStatusCode Callback which is always triggered with the status code */ public static downloadAdvanced( url: string, - headers?: any - ): Promise<{ content: string } | { redirect: string }> { + headers?: any, + onStatusCode?: (code:number) => void + ): Promise<{ content: string } | { redirect: string } | { error: string,url: string, statuscode?: number}> { if (this.externalDownloadFunction !== undefined) { return this.externalDownloadFunction(url, headers) } @@ -821,14 +823,17 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest() xhr.onload = () => { + if(onStatusCode ){ + onStatusCode(xhr.status) + } if (xhr.status == 200) { resolve({ content: xhr.response }) } else if (xhr.status === 302) { resolve({ redirect: xhr.getResponseHeader("location") }) } else if (xhr.status === 509 || xhr.status === 429) { - reject("rate limited") + resolve ({error: "rate limited", url, statuscode: xhr.status}) } else { - reject("Could not download " + url + " due to " + xhr.statusText) + resolve ({error: "other error: "+xhr.statusText, url, statuscode: xhr.status}) } } xhr.open("GET", url) @@ -872,13 +877,25 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be maxCacheTimeMs: number, headers?: any ): Promise { + const result = await Utils.downloadJsonAdvanced(url, headers) + if(result["content"]){ + return result["content"] + } + throw result["error"] + } + + public static async downloadJsonCachedAdvanced( + url: string, + maxCacheTimeMs: number, + headers?: any + ): Promise { const cached = Utils._download_cache.get(url) if (cached !== undefined) { if (new Date().getTime() - cached.timestamp <= maxCacheTimeMs) { return cached.promise } } - const promise = /*NO AWAIT as we work with the promise directly */ Utils.downloadJson( + const promise = /*NO AWAIT as we work with the promise directly */ Utils.downloadJsonAdvanced( url, headers ) @@ -887,26 +904,40 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be } public static async downloadJson(url: string, headers?: any): Promise { + const result = await Utils.downloadJsonAdvanced(url, headers) + if(result["content"]){ + return result["content"] + } + throw result["error"] + } + + + public static async downloadJsonAdvanced(url: string, headers?: any): Promise<{content: any} | {error: string, url: string, statuscode?: number}> { const injected = Utils.injectedDownloads[url] if (injected !== undefined) { console.log("Using injected resource for test for URL", url) - return new Promise((resolve, _) => resolve(injected)) + return new Promise((resolve, _) => resolve({content: injected})) } - const data = await Utils.download( + const result = await Utils.downloadAdvanced( url, Utils.Merge({ accept: "application/json" }, headers ?? {}) ) + if(result["error"]){ + return <{error: string, url: string, statuscode?: number}> result + } + const data = result["content"] try { if (typeof data === "string") { return JSON.parse(data) } - return data + return {"content": data} } catch (e) { console.error("Could not parse ", data, "due to", e, "\n", e.stack) - throw e + return {error: "malformed", url} } } + /** * Triggers a 'download file' popup which will download the contents */