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