From 6d13df39f57d0ba7c94feef01c465d6f4da8ef5f Mon Sep 17 00:00:00 2001 From: ztimson Date: Sat, 17 Aug 2024 14:21:05 -0400 Subject: [PATCH] Added JSONAttemptParse & fixed uploadProgress response --- package.json | 2 +- src/files.ts | 8 +++++--- src/objects.ts | 7 ++++++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index e5b291b..0902deb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ztimson/utils", - "version": "0.14.12", + "version": "0.15.0", "description": "Utility library", "author": "Zak Timson", "license": "MIT", diff --git a/src/files.ts b/src/files.ts index 1863ce2..314d52b 100644 --- a/src/files.ts +++ b/src/files.ts @@ -1,3 +1,4 @@ +import {deepCopy, JSONAttemptParse} from './objects.ts'; import {PromiseProgress} from './promise-progress'; export function download(href: any, name: string) { @@ -42,10 +43,11 @@ export function uploadWithProgress(options: { const formData = new FormData(); options.files.forEach(f => formData.append('file', f)); - xhr.withCredentials = !!options.withCredentials + xhr.withCredentials = !!options.withCredentials; xhr.upload.addEventListener('progress', (event) => event.lengthComputable ? prog(event.loaded / event.total) : null); - xhr.upload.addEventListener('load', (resp) => res(resp)); - xhr.upload.addEventListener('error', (err) => rej(err)); + xhr.addEventListener('loadend', () => res(JSONAttemptParse(xhr.responseText))); + xhr.addEventListener('error', () => rej(JSONAttemptParse(xhr.responseText))); + xhr.addEventListener('timeout', () => rej({error: 'Request timed out'})); xhr.open('POST', options.url); Object.entries(options.headers || {}).forEach(([key, value]) => xhr.setRequestHeader(key, value)); diff --git a/src/objects.ts b/src/objects.ts index 5aecb47..8a67294 100644 --- a/src/objects.ts +++ b/src/objects.ts @@ -186,7 +186,12 @@ export function mixin(target: any, constructors: any[]) { }); } -export function sanitizedJSON(obj: any, space?: number) { +export function JSONAttemptParse(json: string): T | string { + try { return JSON.parse(json); } + catch { return json; } +} + +export function JSONSanitized(obj: any, space?: number) { let cache: any[] = []; return JSON.parse(JSON.stringify(obj, (key, value) => { if (typeof value === 'object' && value !== null) {