From f7d88179975725383261cd9df88d251e59b7c406 Mon Sep 17 00:00:00 2001
From: netpro2k <netpro2k@gmail.com>
Date: Wed, 25 Jul 2018 19:50:23 -0700
Subject: [PATCH] Move sketchfab zip to worker

---
 src/components/gltf-model-plus.js   | 36 ++++++++++++++---------------
 src/utils/media-utils.js            |  2 +-
 src/workers/sketchfab-zip.worker.js | 31 +++++++++++++++++++++++++
 3 files changed, 49 insertions(+), 20 deletions(-)
 create mode 100644 src/workers/sketchfab-zip.worker.js

diff --git a/src/components/gltf-model-plus.js b/src/components/gltf-model-plus.js
index b32e05a95..f51a2d9ab 100644
--- a/src/components/gltf-model-plus.js
+++ b/src/components/gltf-model-plus.js
@@ -1,5 +1,7 @@
 import JSZip from "jszip";
 
+import SketchfabZipWorker from "../workers/sketchfab-zip.worker.js";
+
 const GLTFCache = {};
 
 AFRAME.GLTFModelPlus = {
@@ -183,6 +185,17 @@ function nextTick() {
   });
 }
 
+function getFilesFromSketchfabZip(src) {
+  return new Promise((resolve, reject) => {
+    const worker = new SketchfabZipWorker();
+    worker.onmessage = e => {
+      const [success, fileMapOrError] = e.data;
+      (success ? resolve : reject)(fileMapOrError);
+    };
+    worker.postMessage(src);
+  });
+}
+
 function cachedLoadGLTF(src, basePath, contentType, preferredTechnique, onProgress) {
   // Load the gltf model from the cache if it exists.
   if (!GLTFCache[src]) {
@@ -190,30 +203,15 @@ function cachedLoadGLTF(src, basePath, contentType, preferredTechnique, onProgre
       let gltfUrl = src;
       let onLoad = resolve;
       if (contentType === "model/gltf+zip") {
-        const zip = await fetch(src)
-          .then(r => r.blob())
-          .then(JSZip.loadAsync);
-
-        // Rewrite any url refferences in the GLTF to blob urls
-        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]));
-
-        gltfUrl = fileMap["scene.gtlf"] = URL.createObjectURL(
-          new Blob([JSON.stringify(gltfJson, null, 2)], { type: "text/plain" })
-        );
-
+        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;
diff --git a/src/utils/media-utils.js b/src/utils/media-utils.js
index 7d699d172..112996db1 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
new file mode 100644
index 000000000..2ba952fb6
--- /dev/null
+++ b/src/workers/sketchfab-zip.worker.js
@@ -0,0 +1,31 @@
+import JSZip from "jszip";
+
+async function fetchZipAndGetBlobs(src) {
+  const zip = await fetch(src)
+    .then(r => r.blob())
+    .then(JSZip.loadAsync);
+
+  // Rewrite any url refferences in the GLTF to blob urls
+  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]));
+
+  fileMap["scene.gtlf"] = URL.createObjectURL(new Blob([JSON.stringify(gltfJson, null, 2)], { type: "text/plain" }));
+
+  return fileMap;
+}
+
+self.onmessage = async e => {
+  try {
+    const fileMap = await fetchZipAndGetBlobs(e.data);
+    self.postMessage([true, fileMap]);
+  } catch (e) {
+    self.postMessage([false, e]);
+  }
+};
-- 
GitLab