Skip to content
Snippets Groups Projects
gogetter.js 3.02 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jake Read's avatar
    Jake Read committed
    /*
    gogetter.js
    
    Jake Read at the Center for Bits and Atoms
    (c) Massachusetts Institute of Technology 2019
    
    This work may be reproduced, modified, distributed, performed, and
    displayed for any purpose, but must acknowledge the squidworks and cuttlefish projects.
    Copyright is retained and must be preserved. The work is provided as is;
    no warranty is provided, and users accept all liability.
    */
    
    
    // fs abstraction for sys
    
    Jake Read's avatar
    Jake Read committed
    
    function GoGetter() {
    
      // I'm keeping this here because GoGetter is localized to the environment, mgr is not
      this.interpreterName = 'cuttlefish'
      this.interpreterVersion = 'v0.1'
    
    
    Jake Read's avatar
    Jake Read committed
      this.recursivePathSearch = (root, debug) => {
    
        return new Promise((resolve, reject) => {
    
    Jake Read's avatar
    Jake Read committed
          jQuery.get(`/fileList?path=${root}`, (resp) => {
    
    Jake Read's avatar
    Jake Read committed
            //console.log('resp at jq', resp)
    
    Jake Read's avatar
    Jake Read committed
            resolve(resp)
    
      // https://github.com/tc39/proposal-dynamic-import
      this.importSource = (url) => {
        // escape characters that are used to delimit the module URL.
        // this way the following module works: 'data:text/javascript,console.log("hello")'
        url = url.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
    
    Jake Read's avatar
    Jake Read committed
        //
        let ogurl = url;
    
        // try adding this query modifier to convince the browser it's new (if not, cannot refresh source)
        url += `?mtime=${performance.now()}`
        // to try...
        return new Promise((resolve, reject) => {
          import(url).then((obj) => {
            resolve(obj.default)
          }).catch((err) => {
    
    Jake Read's avatar
    Jake Read committed
            // at these levels, probably ah syntax error
            if(err.name === "SyntaxError"){
              console.error("Syntax Error at Load")
              console.error("in:", ogurl)
              console.error("at line:", err.lineNumber)
              reject(err)
            } else {
              reject(err)
            }
    
    Jake Read's avatar
    Jake Read committed
    
    
        // ... previously, this hack... but why?
        /*
    
        return new Promise((resolve, reject) => {
          const script = document.createElement("script")
    
          const tempGlobal = "__tempModuleLoadingVariable" + Math.random().toString(32).substring(2
    
          function cleanup() {
            delete window[tempGlobal]
            script.remove()
          }
          window[tempGlobal] = function(module) {
            cleanup()
            //console.log('ADDHUNK (2) import resolves', url)
            resolve(module[Object.keys(module)[0]])
          }
          script.type = "module"
          script.onerror = () => {
    
            console.error(`error from imported script...`, err)
    
            reject(new Error("Failed to load module script with URL " + url))
            cleanup()
          }
    
          script.textContent = `import * as m from "${url}"; window.${tempGlobal}(m);`
    
      }
    
      this.getJson = (path) => {
        return new Promise((resolve, reject) => {
    
    Jake Read's avatar
    Jake Read committed
          console.log('to get', path)
    
          $.ajax({
            url: path,
            type: 'GET',
            success: (data) => {
              resolve(data)
            },
            error: (err) => {
              reject(new Error("failure at GG ajax get for json object: program probably doesn't exist"))
            }
          })
        })
      }
    
    
    export default GoGetter