From 15ef61440e27ee1f13f0151df9af1cdd5a1a85bf Mon Sep 17 00:00:00 2001
From: netpro2k <netpro2k@gmail.com>
Date: Thu, 26 Jul 2018 14:43:11 -0700
Subject: [PATCH] Cleanup and better error handling

---
 src/components/gltf-model-plus.js   | 35 ++++++++++++++++-------------
 src/utils/media-utils.js            |  2 +-
 src/workers/sketchfab-zip.worker.js | 15 +++++++------
 3 files changed, 28 insertions(+), 24 deletions(-)

diff --git a/src/components/gltf-model-plus.js b/src/components/gltf-model-plus.js
index f51a2d9ab..a2116b932 100644
--- a/src/components/gltf-model-plus.js
+++ b/src/components/gltf-model-plus.js
@@ -197,25 +197,28 @@ function getFilesFromSketchfabZip(src) {
 }
 
 function cachedLoadGLTF(src, basePath, contentType, preferredTechnique, onProgress) {
-  // Load the gltf model from the cache if it exists.
   if (!GLTFCache[src]) {
     GLTFCache[src] = new Promise(async (resolve, reject) => {
-      let gltfUrl = src;
-      let onLoad = resolve;
-      if (contentType === "model/gltf+zip") {
-        const fileMap = await getFilesFromSketchfabZip(src);
-        gltfUrl = fileMap["scene.gtlf"];
-        onLoad = model => {
-          // The GLTF is now cached as a THREE object, we can get rid of the original blobs
-          Object.keys(fileMap).forEach(URL.revokeObjectURL);
-          resolve(model);
-        };
-      }
+      try {
+        let gltfUrl = src;
+        let onLoad = resolve;
+        if (contentType === "model/gltf+zip") {
+          const fileMap = await getFilesFromSketchfabZip(src);
+          gltfUrl = fileMap["scene.gtlf"];
+          onLoad = model => {
+            // The GLTF is now cached as a THREE object, we can get rid of the original blobs
+            Object.keys(fileMap).forEach(URL.revokeObjectURL);
+            resolve(model);
+          };
+        }
 
-      const gltfLoader = new THREE.GLTFLoader();
-      gltfLoader.path = basePath;
-      gltfLoader.preferredTechnique = preferredTechnique;
-      gltfLoader.load(gltfUrl, onLoad, onProgress, reject);
+        const gltfLoader = new THREE.GLTFLoader();
+        gltfLoader.path = basePath;
+        gltfLoader.preferredTechnique = preferredTechnique;
+        gltfLoader.load(gltfUrl, onLoad, onProgress, reject);
+      } catch (e) {
+        reject(e);
+      }
     });
   }
   return GLTFCache[src].then(cloneGltf);
diff --git a/src/utils/media-utils.js b/src/utils/media-utils.js
index 112996db1..7d699d172 100644
--- a/src/utils/media-utils.js
+++ b/src/utils/media-utils.js
@@ -18,7 +18,7 @@ export const resolveFarsparkUrl = async url => {
           headers: { "Content-Type": "application/json" },
           body: JSON.stringify({ media: { url } })
         }).then(r => r.json());
-  // farsparkCache.set(url, resolved);
+  farsparkCache.set(url, resolved);
   return resolved;
 };
 
diff --git a/src/workers/sketchfab-zip.worker.js b/src/workers/sketchfab-zip.worker.js
index 2ba952fb6..2bfadd0e1 100644
--- a/src/workers/sketchfab-zip.worker.js
+++ b/src/workers/sketchfab-zip.worker.js
@@ -6,13 +6,14 @@ async function fetchZipAndGetBlobs(src) {
     .then(JSZip.loadAsync);
 
   // Rewrite any url refferences in the GLTF to blob urls
+  const fileMap = {};
+  const files = Object.values(zip.files);
+  const fileBlobs = await Promise.all(files.map(f => f.async("blob")));
+  for (let i = 0; i < fileBlobs.length; i++) {
+    fileMap[files[i].name] = URL.createObjectURL(fileBlobs[i]);
+  }
+
   const gltfJson = JSON.parse(await zip.file("scene.gltf").async("text"));
-  const fileMap = await Object.values(zip.files).reduce(async (prev, file) => {
-    if (file.name === "scene.gltf") return prev;
-    const out = await prev;
-    out[file.name] = URL.createObjectURL(await file.async("blob"));
-    return out;
-  }, Promise.resolve({}));
   gltfJson.buffers && gltfJson.buffers.forEach(b => (b.uri = fileMap[b.uri]));
   gltfJson.images && gltfJson.images.forEach(i => (i.uri = fileMap[i.uri]));
 
@@ -26,6 +27,6 @@ self.onmessage = async e => {
     const fileMap = await fetchZipAndGetBlobs(e.data);
     self.postMessage([true, fileMap]);
   } catch (e) {
-    self.postMessage([false, e]);
+    self.postMessage([false, e.message]);
   }
 };
-- 
GitLab