Browse Source

use loadjs

Nikolay Suslov 4 years ago
parent
commit
e67aa003a2
5 changed files with 737 additions and 122 deletions
  1. 5 122
      public/index.html
  2. 308 0
      public/lib/loadjs/loadjs.js
  3. 1 0
      public/lib/loadjs/loadjs.min.js
  4. 316 0
      public/lib/loadjs/loadjs.umd.js
  5. 107 0
      public/loadLibs.js

+ 5 - 122
public/index.html

@@ -14,95 +14,22 @@ Copyright (c) 2014-2018 Nikolai Suslov and the Krestianstvo.org project contribu
     
     <title>Live Coding Space 0.2</title>
     <!-- <script type="text/javascript" src="/lib/page.js"></script> -->
-    <script type="text/javascript" src="/lib/yamljs/dist/yaml.js"></script>
 
-    <script type="text/javascript" src="/lib/compatibilitycheck.js"></script>
-
-    <script type="text/javascript" src="/lib/socket.io/socket.io.js"></script>
-    <!-- <script type="text/javascript" src="socket.io-sessionid-patch.js"></script> -->
-    <script src="/vwf/view/webrtc/adapter-latest.js"></script>
-
-    <script src="/lib/gundb/gun.js"></script>
-    <script src="/lib/gundb/sea.js"></script>
-    <script src="/lib/gundb/lib/then.js"></script>
-    <script src="/lib/gundb/lib/path.js"></script>
-    <script src="/lib/gundb/lib/not.js"></script>
-    <script src="/lib/gundb/lib/open.js"></script>
-    <script src="/lib/gundb/lib/load.js"></script>
-    <script src="/lib/gundb/lib/promise.js"></script>
-    <script src="/lib/gundb/lib/time.js"></script>
-    <script src="/lib/gundb/lib/bye.js"></script>
-
-   <script src="/lib/gundb/lib/webrtc.js"></script> 
-  <script src="/lib/gundb/nts.js"></script>
-
-   <script src="/lib/gundb/lib/radix.js"></script>
-    <script src="/lib/gundb/lib/radisk.js"></script>
-    <script src="/lib/gundb/lib/store.js"></script>
-    <script src="/lib/gundb/lib/rindexed.js"></script>
+    <script type="text/javascript" src="/lib/loadjs/loadjs.js"></script>
+    <script type="text/javascript" src="/loadLibs.js"></script>
   
-    <!-- <script src="/gun/as.js"></script>
-  <script src="/gun/nts.js"></script> -->
-
-    <script type="text/javascript" src="/lib/cell.js"></script>
-    <script type="text/javascript" src="/lib/he.js"></script>
-
-    <!-- signals for AR.js 
-    <script type="text/javascript" src="/lib/signals/signals.min.js"></script> -->
-
-    <script type="text/javascript" src="/lib/draggabilly/draggabilly.pkgd.js"></script>
-    <script type="text/javascript" src="/lib/screenfull/screenfull.min.js"></script>
-
     <link href="/lib/noty/noty.css" rel="stylesheet">
     <link href="/lib/noty/themes/mint.css" rel="stylesheet">
-    <script type="text/javascript" src="/lib/noty/noty.js"></script>
-
-    <script type="text/javascript" src="/lib/polyglot/polyglot.min.js"></script>
-    <!-- <script type="text/javascript" src="/vwf/view/lib/polyglot/language.js"></script> -->
-
     <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500" rel="stylesheet">
-
     <link rel="stylesheet" href="/lib/mdc/dist/material-components-web.min.css">
-    <script src="/lib/mdc/dist/material-components-web.min.js"></script>
-
-    <!-- <link rel="stylesheet" href="https://unpkg.com/material-components-web@latest/dist/material-components-web.min.css">
-  <script src="https://unpkg.com/material-components-web@latest/dist/material-components-web.min.js"></script> -->
-
-  <script type="text/javascript" src="/vwf/model/aframe/addon/virtualgc/nipplejs.js"></script>
-  <link rel="stylesheet" type="text/css" href="/vwf/model/aframe/addon/virtualgc/virtual-gamepad-controls.css" />
-
-    <script type="text/javascript" src="/lib/lively.vm_standalone.js"></script>
-    <script type="text/javascript" src="/lib/async/async.min.js"></script>
-    <script type="text/javascript" src="/lib/require.js"></script>
-    <script type="text/javascript" src="/lib/crypto.js"></script>
-    <script type="text/javascript" src="/lib/md5.js"></script>
-    <script type="text/javascript" src="/lib/alea.js"></script>
-    <script type="text/javascript" src="/lib/mash.js"></script>
-    <script type="text/javascript" src="/lib/ace/ace.js"></script>
-   
-   
+    <link rel="stylesheet" type="text/css" href="/vwf/model/aframe/addon/virtualgc/virtual-gamepad-controls.css" />
+    <link rel="stylesheet" type="text/css" href="/lib/index.css" />
 
     <script type="text/javascript" src="/lib/closure/base.js"></script>
     <script type="text/javascript">goog.require('goog.vec.Vec2')</script>
     <script type="text/javascript">goog.require('goog.vec.Mat4')</script>
     <script type="text/javascript">goog.require('goog.vec.Quaternion')</script>
-
-
-    <script type="text/javascript" src="/vwf.js"></script>
-
-    <link rel="stylesheet" type="text/css" href="/lib/index.css" />
-
-    <script type="module">
-        //localStorage.clear();
-        let oldGunStorage = localStorage.getItem('gun/');
-        if(oldGunStorage){
-            localStorage.removeItem('gun/');
-        }
-        import { App } from '/app.js';
-        window.onload = new App;
-    </script>
-
-
+  
 </head>
 
 <body class="mdc-typography">
@@ -137,50 +64,6 @@ Copyright (c) 2014-2018 Nikolai Suslov and the Krestianstvo.org project contribu
             tabindex="0" data-toggle-on='{"label": "Hide", "content": "fullscreen"}' data-toggle-off='{"label": "Show", "content": "fullscreen_exit"}'>
             fullscreen
         </i>
-
-
-
     </div>
-
-
-
-    <script>
-        mdc.autoInit();
-        window.addEventListener("load", function (event) {
-
-            console.log("All resources finished loading!");
-
-        });
-
-        const iconEl = document.querySelector('#hideui');
-        const compHideUI = new mdc.iconButton.MDCIconButtonToggle(iconEl);
-        iconEl.addEventListener('MDCIconButtonToggle:change', (e) => {
-
-            let ui = document.querySelector('.mdc-top-app-bar');
-            if (ui) {
-
-                let chkAttr = e.detail.isOn;
-                if (chkAttr) {
-                    ui.style.visibility = 'visible'
-                } else {
-                    ui.style.visibility = 'hidden'
-                }
-            }
-
-        });
-
-        const fullScreenToggle = document.querySelector('#fullscreenui');
-        const compfullScreen = new mdc.iconButton.MDCIconButtonToggle(fullScreenToggle);
-        fullScreenToggle.addEventListener('MDCIconButtonToggle:change', (e) => {
-
-            if (screenfull.enabled) {
-                screenfull.toggle();
-            } else {
-                // Ignore or do something else
-            }
-        });
-
-    </script>
 </body>
-
 </html>

+ 308 - 0
public/lib/loadjs/loadjs.js

@@ -0,0 +1,308 @@
+loadjs = (function () {
+/**
+ * Global dependencies.
+ * @global {Object} document - DOM
+ */
+
+var devnull = function() {},
+    bundleIdCache = {},
+    bundleResultCache = {},
+    bundleCallbackQueue = {};
+
+
+/**
+ * Subscribe to bundle load event.
+ * @param {string[]} bundleIds - Bundle ids
+ * @param {Function} callbackFn - The callback function
+ */
+function subscribe(bundleIds, callbackFn) {
+  // listify
+  bundleIds = bundleIds.push ? bundleIds : [bundleIds];
+
+  var depsNotFound = [],
+      i = bundleIds.length,
+      numWaiting = i,
+      fn,
+      bundleId,
+      r,
+      q;
+
+  // define callback function
+  fn = function (bundleId, pathsNotFound) {
+    if (pathsNotFound.length) depsNotFound.push(bundleId);
+
+    numWaiting--;
+    if (!numWaiting) callbackFn(depsNotFound);
+  };
+
+  // register callback
+  while (i--) {
+    bundleId = bundleIds[i];
+
+    // execute callback if in result cache
+    r = bundleResultCache[bundleId];
+    if (r) {
+      fn(bundleId, r);
+      continue;
+    }
+
+    // add to callback queue
+    q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
+    q.push(fn);
+  }
+}
+
+
+/**
+ * Publish bundle load event.
+ * @param {string} bundleId - Bundle id
+ * @param {string[]} pathsNotFound - List of files not found
+ */
+function publish(bundleId, pathsNotFound) {
+  // exit if id isn't defined
+  if (!bundleId) return;
+
+  var q = bundleCallbackQueue[bundleId];
+
+  // cache result
+  bundleResultCache[bundleId] = pathsNotFound;
+
+  // exit if queue is empty
+  if (!q) return;
+
+  // empty callback queue
+  while (q.length) {
+    q[0](bundleId, pathsNotFound);
+    q.splice(0, 1);
+  }
+}
+
+
+/**
+ * Execute callbacks.
+ * @param {Object or Function} args - The callback args
+ * @param {string[]} depsNotFound - List of dependencies not found
+ */
+function executeCallbacks(args, depsNotFound) {
+  // accept function as argument
+  if (args.call) args = {success: args};
+
+  // success and error callbacks
+  if (depsNotFound.length) (args.error || devnull)(depsNotFound);
+  else (args.success || devnull)(args);
+}
+
+
+/**
+ * Load individual file.
+ * @param {string} path - The file path
+ * @param {Function} callbackFn - The callback function
+ */
+function loadFile(path, callbackFn, args, numTries) {
+  var doc = document,
+      async = args.async,
+      maxTries = (args.numRetries || 0) + 1,
+      beforeCallbackFn = args.before || devnull,
+      pathname = path.replace(/[\?|#].*$/, ''),
+      pathStripped = path.replace(/^(css|img)!/, ''),
+      isLegacyIECss,
+      e;
+
+  numTries = numTries || 0;
+
+  if (/(^css!|\.css$)/.test(pathname)) {
+    // css
+    e = doc.createElement('link');
+    e.rel = 'stylesheet';
+    e.href = pathStripped;
+
+    // tag IE9+
+    isLegacyIECss = 'hideFocus' in e;
+
+    // use preload in IE Edge (to detect load errors)
+    if (isLegacyIECss && e.relList) {
+      isLegacyIECss = 0;
+      e.rel = 'preload';
+      e.as = 'style';
+    }
+  } else if (/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {
+    // image
+    e = doc.createElement('img');
+    e.src = pathStripped;    
+  } else {
+    // javascript
+    e = doc.createElement('script');
+    e.src = path;
+    e.async = async === undefined ? true : async;
+  }
+
+  e.onload = e.onerror = e.onbeforeload = function (ev) {
+    var result = ev.type[0];
+
+    // treat empty stylesheets as failures to get around lack of onerror
+    // support in IE9-11
+    if (isLegacyIECss) {
+      try {
+        if (!e.sheet.cssText.length) result = 'e';
+      } catch (x) {
+        // sheets objects created from load errors don't allow access to
+        // `cssText` (unless error is Code:18 SecurityError)
+        if (x.code != 18) result = 'e';
+      }
+    }
+
+    // handle retries in case of load failure
+    if (result == 'e') {
+      // increment counter
+      numTries += 1;
+
+      // exit function and try again
+      if (numTries < maxTries) {
+        return loadFile(path, callbackFn, args, numTries);
+      }
+    } else if (e.rel == 'preload' && e.as == 'style') {
+      // activate preloaded stylesheets
+      return e.rel = 'stylesheet'; // jshint ignore:line
+    }
+    
+    // execute callback
+    callbackFn(path, result, ev.defaultPrevented);
+  };
+
+  // add to document (unless callback returns `false`)
+  if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
+}
+
+
+/**
+ * Load multiple files.
+ * @param {string[]} paths - The file paths
+ * @param {Function} callbackFn - The callback function
+ */
+function loadFiles(paths, callbackFn, args) {
+  // listify paths
+  paths = paths.push ? paths : [paths];
+
+  var numWaiting = paths.length,
+      x = numWaiting,
+      pathsNotFound = [],
+      fn,
+      i;
+
+  // define callback function
+  fn = function(path, result, defaultPrevented) {
+    // handle error
+    if (result == 'e') pathsNotFound.push(path);
+
+    // handle beforeload event. If defaultPrevented then that means the load
+    // will be blocked (ex. Ghostery/ABP on Safari)
+    if (result == 'b') {
+      if (defaultPrevented) pathsNotFound.push(path);
+      else return;
+    }
+
+    numWaiting--;
+    if (!numWaiting) callbackFn(pathsNotFound);
+  };
+
+  // load scripts
+  for (i=0; i < x; i++) loadFile(paths[i], fn, args);
+}
+
+
+/**
+ * Initiate script load and register bundle.
+ * @param {(string|string[])} paths - The file paths
+ * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success
+ *   callback or (3) object literal with success/error arguments, numRetries,
+ *   etc.
+ * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object
+ *   literal with success/error arguments, numRetries, etc.
+ */
+function loadjs(paths, arg1, arg2) {
+  var bundleId,
+      args;
+
+  // bundleId (if string)
+  if (arg1 && arg1.trim) bundleId = arg1;
+
+  // args (default is {})
+  args = (bundleId ? arg2 : arg1) || {};
+
+  // throw error if bundle is already defined
+  if (bundleId) {
+    if (bundleId in bundleIdCache) {
+      throw "LoadJS";
+    } else {
+      bundleIdCache[bundleId] = true;
+    }
+  }
+
+  function loadFn(resolve, reject) {
+    loadFiles(paths, function (pathsNotFound) {
+      // execute callbacks
+      executeCallbacks(args, pathsNotFound);
+      
+      // resolve Promise
+      if (resolve) {
+        executeCallbacks({success: resolve, error: reject}, pathsNotFound);
+      }
+
+      // publish bundle load event
+      publish(bundleId, pathsNotFound);
+    }, args);
+  }
+  
+  if (args.returnPromise) return new Promise(loadFn);
+  else loadFn();
+}
+
+
+/**
+ * Execute callbacks when dependencies have been satisfied.
+ * @param {(string|string[])} deps - List of bundle ids
+ * @param {Object} args - success/error arguments
+ */
+loadjs.ready = function ready(deps, args) {
+  // subscribe to bundle load event
+  subscribe(deps, function (depsNotFound) {
+    // execute callbacks
+    executeCallbacks(args, depsNotFound);
+  });
+
+  return loadjs;
+};
+
+
+/**
+ * Manually satisfy bundle dependencies.
+ * @param {string} bundleId - The bundle id
+ */
+loadjs.done = function done(bundleId) {
+  publish(bundleId, []);
+};
+
+
+/**
+ * Reset loadjs dependencies statuses
+ */
+loadjs.reset = function reset() {
+  bundleIdCache = {};
+  bundleResultCache = {};
+  bundleCallbackQueue = {};
+};
+
+
+/**
+ * Determine if bundle has already been defined
+ * @param String} bundleId - The bundle id
+ */
+loadjs.isDefined = function isDefined(bundleId) {
+  return bundleId in bundleIdCache;
+};
+
+
+// export
+return loadjs;
+
+})();

+ 1 - 0
public/lib/loadjs/loadjs.min.js

@@ -0,0 +1 @@
+loadjs=function(){var h=function(){},c={},u={},f={};function o(e,n){if(e){var r=f[e];if(u[e]=n,r)for(;r.length;)r[0](e,n),r.splice(0,1)}}function l(e,n){e.call&&(e={success:e}),n.length?(e.error||h)(n):(e.success||h)(e)}function d(r,t,s,i){var c,o,e=document,n=s.async,u=(s.numRetries||0)+1,f=s.before||h,l=r.replace(/[\?|#].*$/,""),a=r.replace(/^(css|img)!/,"");i=i||0,/(^css!|\.css$)/.test(l)?((o=e.createElement("link")).rel="stylesheet",o.href=a,(c="hideFocus"in o)&&o.relList&&(c=0,o.rel="preload",o.as="style")):/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(l)?(o=e.createElement("img")).src=a:((o=e.createElement("script")).src=r,o.async=void 0===n||n),!(o.onload=o.onerror=o.onbeforeload=function(e){var n=e.type[0];if(c)try{o.sheet.cssText.length||(n="e")}catch(e){18!=e.code&&(n="e")}if("e"==n){if((i+=1)<u)return d(r,t,s,i)}else if("preload"==o.rel&&"style"==o.as)return o.rel="stylesheet";t(r,n,e.defaultPrevented)})!==f(r,o)&&e.head.appendChild(o)}function r(e,n,r){var t,s;if(n&&n.trim&&(t=n),s=(t?r:n)||{},t){if(t in c)throw"LoadJS";c[t]=!0}function i(n,r){!function(e,t,n){var r,s,i=(e=e.push?e:[e]).length,c=i,o=[];for(r=function(e,n,r){if("e"==n&&o.push(e),"b"==n){if(!r)return;o.push(e)}--i||t(o)},s=0;s<c;s++)d(e[s],r,n)}(e,function(e){l(s,e),n&&l({success:n,error:r},e),o(t,e)},s)}if(s.returnPromise)return new Promise(i);i()}return r.ready=function(e,n){return function(e,r){e=e.push?e:[e];var n,t,s,i=[],c=e.length,o=c;for(n=function(e,n){n.length&&i.push(e),--o||r(i)};c--;)t=e[c],(s=u[t])?n(t,s):(f[t]=f[t]||[]).push(n)}(e,function(e){l(n,e)}),r},r.done=function(e){o(e,[])},r.reset=function(){c={},u={},f={}},r.isDefined=function(e){return e in c},r}();

+ 316 - 0
public/lib/loadjs/loadjs.umd.js

@@ -0,0 +1,316 @@
+(function(root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    define([], factory);
+  } else if (typeof exports === 'object') {
+    module.exports = factory();
+  } else {
+    root.loadjs = factory();
+  }
+}(this, function() {
+/**
+ * Global dependencies.
+ * @global {Object} document - DOM
+ */
+
+var devnull = function() {},
+    bundleIdCache = {},
+    bundleResultCache = {},
+    bundleCallbackQueue = {};
+
+
+/**
+ * Subscribe to bundle load event.
+ * @param {string[]} bundleIds - Bundle ids
+ * @param {Function} callbackFn - The callback function
+ */
+function subscribe(bundleIds, callbackFn) {
+  // listify
+  bundleIds = bundleIds.push ? bundleIds : [bundleIds];
+
+  var depsNotFound = [],
+      i = bundleIds.length,
+      numWaiting = i,
+      fn,
+      bundleId,
+      r,
+      q;
+
+  // define callback function
+  fn = function (bundleId, pathsNotFound) {
+    if (pathsNotFound.length) depsNotFound.push(bundleId);
+
+    numWaiting--;
+    if (!numWaiting) callbackFn(depsNotFound);
+  };
+
+  // register callback
+  while (i--) {
+    bundleId = bundleIds[i];
+
+    // execute callback if in result cache
+    r = bundleResultCache[bundleId];
+    if (r) {
+      fn(bundleId, r);
+      continue;
+    }
+
+    // add to callback queue
+    q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
+    q.push(fn);
+  }
+}
+
+
+/**
+ * Publish bundle load event.
+ * @param {string} bundleId - Bundle id
+ * @param {string[]} pathsNotFound - List of files not found
+ */
+function publish(bundleId, pathsNotFound) {
+  // exit if id isn't defined
+  if (!bundleId) return;
+
+  var q = bundleCallbackQueue[bundleId];
+
+  // cache result
+  bundleResultCache[bundleId] = pathsNotFound;
+
+  // exit if queue is empty
+  if (!q) return;
+
+  // empty callback queue
+  while (q.length) {
+    q[0](bundleId, pathsNotFound);
+    q.splice(0, 1);
+  }
+}
+
+
+/**
+ * Execute callbacks.
+ * @param {Object or Function} args - The callback args
+ * @param {string[]} depsNotFound - List of dependencies not found
+ */
+function executeCallbacks(args, depsNotFound) {
+  // accept function as argument
+  if (args.call) args = {success: args};
+
+  // success and error callbacks
+  if (depsNotFound.length) (args.error || devnull)(depsNotFound);
+  else (args.success || devnull)(args);
+}
+
+
+/**
+ * Load individual file.
+ * @param {string} path - The file path
+ * @param {Function} callbackFn - The callback function
+ */
+function loadFile(path, callbackFn, args, numTries) {
+  var doc = document,
+      async = args.async,
+      maxTries = (args.numRetries || 0) + 1,
+      beforeCallbackFn = args.before || devnull,
+      pathname = path.replace(/[\?|#].*$/, ''),
+      pathStripped = path.replace(/^(css|img)!/, ''),
+      isLegacyIECss,
+      e;
+
+  numTries = numTries || 0;
+
+  if (/(^css!|\.css$)/.test(pathname)) {
+    // css
+    e = doc.createElement('link');
+    e.rel = 'stylesheet';
+    e.href = pathStripped;
+
+    // tag IE9+
+    isLegacyIECss = 'hideFocus' in e;
+
+    // use preload in IE Edge (to detect load errors)
+    if (isLegacyIECss && e.relList) {
+      isLegacyIECss = 0;
+      e.rel = 'preload';
+      e.as = 'style';
+    }
+  } else if (/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {
+    // image
+    e = doc.createElement('img');
+    e.src = pathStripped;    
+  } else {
+    // javascript
+    e = doc.createElement('script');
+    e.src = path;
+    e.async = async === undefined ? true : async;
+  }
+
+  e.onload = e.onerror = e.onbeforeload = function (ev) {
+    var result = ev.type[0];
+
+    // treat empty stylesheets as failures to get around lack of onerror
+    // support in IE9-11
+    if (isLegacyIECss) {
+      try {
+        if (!e.sheet.cssText.length) result = 'e';
+      } catch (x) {
+        // sheets objects created from load errors don't allow access to
+        // `cssText` (unless error is Code:18 SecurityError)
+        if (x.code != 18) result = 'e';
+      }
+    }
+
+    // handle retries in case of load failure
+    if (result == 'e') {
+      // increment counter
+      numTries += 1;
+
+      // exit function and try again
+      if (numTries < maxTries) {
+        return loadFile(path, callbackFn, args, numTries);
+      }
+    } else if (e.rel == 'preload' && e.as == 'style') {
+      // activate preloaded stylesheets
+      return e.rel = 'stylesheet'; // jshint ignore:line
+    }
+    
+    // execute callback
+    callbackFn(path, result, ev.defaultPrevented);
+  };
+
+  // add to document (unless callback returns `false`)
+  if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
+}
+
+
+/**
+ * Load multiple files.
+ * @param {string[]} paths - The file paths
+ * @param {Function} callbackFn - The callback function
+ */
+function loadFiles(paths, callbackFn, args) {
+  // listify paths
+  paths = paths.push ? paths : [paths];
+
+  var numWaiting = paths.length,
+      x = numWaiting,
+      pathsNotFound = [],
+      fn,
+      i;
+
+  // define callback function
+  fn = function(path, result, defaultPrevented) {
+    // handle error
+    if (result == 'e') pathsNotFound.push(path);
+
+    // handle beforeload event. If defaultPrevented then that means the load
+    // will be blocked (ex. Ghostery/ABP on Safari)
+    if (result == 'b') {
+      if (defaultPrevented) pathsNotFound.push(path);
+      else return;
+    }
+
+    numWaiting--;
+    if (!numWaiting) callbackFn(pathsNotFound);
+  };
+
+  // load scripts
+  for (i=0; i < x; i++) loadFile(paths[i], fn, args);
+}
+
+
+/**
+ * Initiate script load and register bundle.
+ * @param {(string|string[])} paths - The file paths
+ * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success
+ *   callback or (3) object literal with success/error arguments, numRetries,
+ *   etc.
+ * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object
+ *   literal with success/error arguments, numRetries, etc.
+ */
+function loadjs(paths, arg1, arg2) {
+  var bundleId,
+      args;
+
+  // bundleId (if string)
+  if (arg1 && arg1.trim) bundleId = arg1;
+
+  // args (default is {})
+  args = (bundleId ? arg2 : arg1) || {};
+
+  // throw error if bundle is already defined
+  if (bundleId) {
+    if (bundleId in bundleIdCache) {
+      throw "LoadJS";
+    } else {
+      bundleIdCache[bundleId] = true;
+    }
+  }
+
+  function loadFn(resolve, reject) {
+    loadFiles(paths, function (pathsNotFound) {
+      // execute callbacks
+      executeCallbacks(args, pathsNotFound);
+      
+      // resolve Promise
+      if (resolve) {
+        executeCallbacks({success: resolve, error: reject}, pathsNotFound);
+      }
+
+      // publish bundle load event
+      publish(bundleId, pathsNotFound);
+    }, args);
+  }
+  
+  if (args.returnPromise) return new Promise(loadFn);
+  else loadFn();
+}
+
+
+/**
+ * Execute callbacks when dependencies have been satisfied.
+ * @param {(string|string[])} deps - List of bundle ids
+ * @param {Object} args - success/error arguments
+ */
+loadjs.ready = function ready(deps, args) {
+  // subscribe to bundle load event
+  subscribe(deps, function (depsNotFound) {
+    // execute callbacks
+    executeCallbacks(args, depsNotFound);
+  });
+
+  return loadjs;
+};
+
+
+/**
+ * Manually satisfy bundle dependencies.
+ * @param {string} bundleId - The bundle id
+ */
+loadjs.done = function done(bundleId) {
+  publish(bundleId, []);
+};
+
+
+/**
+ * Reset loadjs dependencies statuses
+ */
+loadjs.reset = function reset() {
+  bundleIdCache = {};
+  bundleResultCache = {};
+  bundleCallbackQueue = {};
+};
+
+
+/**
+ * Determine if bundle has already been defined
+ * @param String} bundleId - The bundle id
+ */
+loadjs.isDefined = function isDefined(bundleId) {
+  return bundleId in bundleIdCache;
+};
+
+
+// export
+return loadjs;
+
+}));

+ 107 - 0
public/loadLibs.js

@@ -0,0 +1,107 @@
+//Load all required JS libs
+
+loadjs(['/lib/yamljs/dist/yaml.js',
+        '/lib/compatibilitycheck.js',
+        '/lib/socket.io/socket.io.js',
+        '/vwf/view/webrtc/adapter-latest.js',
+        '/lib/cell.js',
+        '/lib/he.js',
+        '/lib/noty/noty.js',
+        '/lib/draggabilly/draggabilly.pkgd.js',
+        '/lib/screenfull/screenfull.min.js',
+        '/lib/polyglot/polyglot.min.js',
+        '/vwf/model/aframe/addon/virtualgc/nipplejs.js',
+        '/lib/lively.vm_standalone.js',
+        '/lib/async/async.min.js',
+        '/lib/require.js',
+        '/lib/crypto.js',
+        '/lib/md5.js',
+        '/lib/alea.js',
+        '/lib/mash.js',
+        '/lib/ace/ace.js'
+        ],'libs', {
+            async: false
+        });
+
+loadjs('/lib/mdc/dist/material-components-web.min.js', 'mdc');
+
+loadjs(['/lib/gundb/gun.js',
+        '/lib/gundb/sea.js',
+        '/lib/gundb/lib/then.js',
+        '/lib/gundb/lib/path.js',
+        '/lib/gundb/lib/not.js',
+        '/lib/gundb/lib/open.js',
+        '/lib/gundb/lib/load.js',
+        '/lib/gundb/lib/promise.js',
+        '/lib/gundb/lib/time.js',
+        '/lib/gundb/lib/bye.js',
+        '/lib/gundb/lib/webrtc.js',
+        '/lib/gundb/nts.js',
+        '/lib/gundb/lib/radix.js',
+        '/lib/gundb/lib/radisk.js',
+        '/lib/gundb/lib/store.js',
+        '/lib/gundb/lib/rindexed.js'
+        ], 'gundb', {
+            async: false
+        }
+);
+
+loadjs(['/vwf.js'],'vwf');
+
+loadjs.ready('libs', function() {
+    //load libs
+    }).ready('gundb', function() {
+        //load gundb
+    }).ready('mdc', function() {
+        guiInit();
+    }).ready('vwf', function() {
+       
+        import('/app.js')
+            .then((module) => {
+                let oldGunStorage = localStorage.getItem('gun/');
+                if(oldGunStorage){
+                    localStorage.removeItem('gun/');
+                };
+                new module.App
+        });
+})
+
+
+function guiInit() {
+
+    mdc.autoInit();
+    window.addEventListener("load", function (event) {
+
+        console.log("All resources finished loading!");
+
+    });
+
+    const iconEl = document.querySelector('#hideui');
+    const compHideUI = new mdc.iconButton.MDCIconButtonToggle(iconEl);
+    iconEl.addEventListener('MDCIconButtonToggle:change', (e) => {
+
+        let ui = document.querySelector('.mdc-top-app-bar');
+        if (ui) {
+
+            let chkAttr = e.detail.isOn;
+            if (chkAttr) {
+                ui.style.visibility = 'visible'
+            } else {
+                ui.style.visibility = 'hidden'
+            }
+        }
+
+    });
+
+    const fullScreenToggle = document.querySelector('#fullscreenui');
+    const compfullScreen = new mdc.iconButton.MDCIconButtonToggle(fullScreenToggle);
+    fullScreenToggle.addEventListener('MDCIconButtonToggle:change', (e) => {
+
+        if (screenfull.enabled) {
+            screenfull.toggle();
+        } else {
+            // Ignore or do something else
+        }
+    });
+
+}