]> git.proxmox.com Git - mirror_novnc.git/blobdiff - vendor/browser-es-module-loader/src/browser-es-module-loader.js
Avoid nested function declarations
[mirror_novnc.git] / vendor / browser-es-module-loader / src / browser-es-module-loader.js
index a9d720972dc888a0095c4491e032c8289e6535cc..a0c189e963ba7cfe90ed0edc23fe52e2705c8d92 100644 (file)
@@ -9,7 +9,35 @@ var loader;
 // <script type="module"> support
 var anonSources = {};
 if (typeof document != 'undefined' && document.getElementsByTagName) {
-  function ready() {
+  var handleError = function(err) {
+    // dispatch an error event so that we can display in errors in browsers
+    // that don't yet support unhandledrejection
+    if (window.onunhandledrejection === undefined) {
+      try {
+        var evt = new Event('error');
+      } catch (_eventError) {
+        var evt = document.createEvent('Event');
+        evt.initEvent('error', true, true);
+      }
+      evt.message = err.message;
+      if (err.fileName) {
+        evt.filename = err.fileName;
+        evt.lineno = err.lineNumber;
+        evt.colno = err.columnNumber;
+      } else if (err.sourceURL) {
+        evt.filename = err.sourceURL;
+        evt.lineno = err.line;
+        evt.colno = err.column;
+      }
+      evt.error = err;
+      window.dispatchEvent(evt);
+    }
+
+    // throw so it still shows up in the console
+    throw err;
+  }
+
+  var ready = function() {
     document.removeEventListener('DOMContentLoaded', ready, false );
 
     var anonCnt = 0;
@@ -20,22 +48,7 @@ if (typeof document != 'undefined' && document.getElementsByTagName) {
       if (script.type == 'module' && !script.loaded) {
         script.loaded = true;
         if (script.src) {
-          loader.import(script.src).catch(function(err) {
-              // dispatch an error event so that we can display in errors in browsers
-              // that don't yet support unhandledrejection
-              try {
-                  var evt = new Event('error');
-              } catch (_eventError) {
-                  var evt = document.createEvent('Event');
-                  evt.initEvent('error', true, true);
-              }
-              evt.message = err.message;
-              evt.error = err;
-              window.dispatchEvent(evt);
-
-              // throw so it still shows up in the console
-              throw err;
-          });
+          loader.import(script.src).catch(handleError);
         }
         // anonymous modules supported via a custom naming scheme and registry
         else {
@@ -46,22 +59,7 @@ if (typeof document != 'undefined' && document.getElementsByTagName) {
 
           var anonName = resolveIfNotPlain(uri, baseURI);
           anonSources[anonName] = script.innerHTML;
-          loader.import(anonName).catch(function(err) {
-              // dispatch an error event so that we can display in errors in browsers
-              // that don't yet support unhandledrejection
-              try {
-                  var evt = new Event('error');
-              } catch (_eventError) {
-                  var evt = document.createEvent('Event');
-                  evt.initEvent('error', true, true);
-              }
-              evt.message = err.message;
-              evt.error = err;
-              window.dispatchEvent(evt);
-
-              // throw so it still shows up in the console
-              throw err;
-          });
+          loader.import(anonName).catch(handleError);
         }
       }
     }
@@ -105,10 +103,10 @@ BrowserESModuleLoader.prototype[RegisterLoader.resolve] = function(key, parent)
 
 function xhrFetch(url, resolve, reject) {
   var xhr = new XMLHttpRequest();
-  function load(source) {
+  var load = function(source) {
     resolve(xhr.responseText);
   }
-  function error() {
+  var error = function() {
     reject(new Error('XHR error' + (xhr.status ? ' (' + xhr.status + (xhr.statusText ? ' ' + xhr.statusText  : '') + ')' : '') + ' loading ' + url));
   }
 
@@ -139,6 +137,7 @@ function xhrFetch(url, resolve, reject) {
 }
 
 var WorkerPool = function (script, size) {
+  script = document.currentScript.src.substr(0, document.currentScript.src.lastIndexOf("/")) + "/" + script;
   this._workers = new Array(size);
   this._ind = 0;
   this._size = size;
@@ -150,6 +149,7 @@ var WorkerPool = function (script, size) {
     wrkr._count = 0;
     wrkr._ind = i;
     wrkr.onmessage = this._onmessage.bind(this, wrkr);
+    wrkr.onerror = this._onerror.bind(this);
     this._workers[i] = wrkr;
   }
 
@@ -175,6 +175,21 @@ WorkerPool.prototype = {
     this._checkJobs();
   },
 
+  _onerror: function(err) {
+    try {
+        var evt = new Event('error');
+    } catch (_eventError) {
+        var evt = document.createEvent('Event');
+        evt.initEvent('error', true, true);
+    }
+    evt.message = err.message;
+    evt.filename = err.filename;
+    evt.lineno = err.lineno;
+    evt.colno = err.colno;
+    evt.error = err.error;
+    window.dispatchEvent(evt);
+  },
+
   _checkJobs: function () {
     if (this._jobs === 0 && this._stopTimeout === undefined) {
       // wait for 2s of inactivity before stopping (that should be enough for local loading)
@@ -183,14 +198,14 @@ WorkerPool.prototype = {
   },
 
   _stop: function () {
-    for (let wrkr of this._workers) {
+    this._workers.forEach(function(wrkr) {
       wrkr.terminate();
-    }
+    });
   }
 };
 
 var promiseMap = new Map();
-var babelWorker = new WorkerPool('vendor/browser-es-module-loader/dist/babel-worker.js', 3);
+var babelWorker = new WorkerPool('babel-worker.js', 3);
 babelWorker.onmessage = function (evt) {
     var promFuncs = promiseMap.get(evt.data.key);
     promFuncs.resolve(evt.data);
@@ -216,12 +231,12 @@ BrowserESModuleLoader.prototype[RegisterLoader.instantiate] = function(key, proc
   })
   .then(function(source) {
     // check our cache first
-    const cacheEntryTrans = localStorage.getItem(key+'!transpiled');
-    if (cacheEntryTrans) {
-      const cacheEntryRaw = localStorage.getItem(key+'!raw');
+    var cacheEntry = localStorage.getItem(key);
+    if (cacheEntry) {
+      cacheEntry = JSON.parse(cacheEntry);
       // TODO: store a hash instead
-      if (cacheEntryRaw === source) {
-        return Promise.resolve({key: key, code: cacheEntryTrans, source: source});
+      if (cacheEntry.source === source) {
+        return Promise.resolve({key: key, code: cacheEntry.code, source: cacheEntry.source});
       }
     }
     return new Promise(function (resolve, reject) {
@@ -231,8 +246,14 @@ BrowserESModuleLoader.prototype[RegisterLoader.instantiate] = function(key, proc
   }).then(function (data) {
     // evaluate without require, exports and module variables
     // we leave module in for now to allow module.require access
-    localStorage.setItem(key+'!raw', data.source);
-    localStorage.setItem(data.key+'!transpiled', data.code);
+    try {
+      var cacheEntry = JSON.stringify({source: data.source, code: data.code});
+      localStorage.setItem(key, cacheEntry);
+    } catch (e) {
+      if (window.console) {
+        window.console.warn('Unable to cache transpiled version of ' + key + ': ' + e);
+      }
+    }
     (0, eval)(data.code + '\n//# sourceURL=' + data.key + '!transpiled');
     processAnonRegister();
   });