From 9947f8af4060de61fe45ddff2406d8ba4f3e1b18 Mon Sep 17 00:00:00 2001 From: dank074 Date: Fri, 18 Nov 2022 20:07:05 -0600 Subject: [PATCH] fix asset loading when no content-type header --- src/api/asset/AssetManager.ts | 28 +++++++++++++++++++--------- src/nitro/room/RoomContentLoader.ts | 7 ++++++- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/api/asset/AssetManager.ts b/src/api/asset/AssetManager.ts index 80c5588b..fc212853 100644 --- a/src/api/asset/AssetManager.ts +++ b/src/api/asset/AssetManager.ts @@ -85,19 +85,28 @@ export class AssetManager implements IAssetManager public async downloadAssets(urls: string[]): Promise { - if(!urls || !urls.length) return true; + if(!urls || !urls.length) return Promise.resolve(true); + + const responses = await Promise.allSettled(urls.map(url => fetch(url))); try { - for await (const url of urls) + for(const response of responses) { - const response = await fetch(url); - const contentType = response.headers.get('Content-Type'); + if(response.status === 'rejected') continue; + + let contentType = 'application/octet-stream'; + + if(response.value.headers.has('Content-Type')) + { + contentType = response.value.headers.get('Content-Type'); + } switch(contentType) { case 'application/octet-stream': { - const nitroBundle = new NitroBundle(await response.arrayBuffer()); + const buffer = await response.value.arrayBuffer(); + const nitroBundle = new NitroBundle(buffer); await this.processAsset(nitroBundle.baseTexture, (nitroBundle.jsonFile as IAssetData)); break; @@ -105,14 +114,15 @@ export class AssetManager implements IAssetManager case 'image/png': case 'image/jpeg': case 'image/gif': { - const base64 = ArrayBufferToBase64(await response.arrayBuffer()); + const buffer = await response.value.arrayBuffer(); + const base64 = ArrayBufferToBase64(buffer); const baseTexture = BaseTexture.from(`data:${contentType};base64,${base64}`); const createAsset = async () => { const texture = new Texture(baseTexture); - this.setTexture(response.url, texture); + this.setTexture(response.value.url, texture); }; if(baseTexture.valid) @@ -136,14 +146,14 @@ export class AssetManager implements IAssetManager } } - return true; + return Promise.resolve(true); } catch (err) { NitroLogger.error(err); - return false; + return Promise.resolve(false); } } diff --git a/src/nitro/room/RoomContentLoader.ts b/src/nitro/room/RoomContentLoader.ts index 4a310c33..29884d92 100644 --- a/src/nitro/room/RoomContentLoader.ts +++ b/src/nitro/room/RoomContentLoader.ts @@ -494,7 +494,12 @@ export class RoomContentLoader implements IFurnitureDataListener, IRoomContentLo try { const response = await fetch(assetUrl); - const contentType = response.headers.get('Content-Type'); + let contentType = 'application/octet-stream'; + + if(response.headers.has('Content-Type')) + { + contentType = response.headers.get('Content-Type'); + } switch(contentType) {