{"version":3,"sources":["https://lively-kernel.org/lively4/swt1-debugging/src/client/fetch.js"],"names":["installFetchHandlers","installDebugFetch","installAuthorizedFetch","installProxyFetch","proxyRequest","baseUrlsAuthNeeded","baseUrlsAuthNeededForWriting","url","options","self","originalFetch","mode","cache","method","headers","redirect","referrer","credentials","body","focalStorage","System","import","default","mounts","getItem","lively4fetchHandlers","filter","ea","isProxyFetch","push","handle","request","toString","m","match","result","Response","JSON","stringify","name","contents","mountPoint","rest","json","newMounts","parse","e","setItem","status","proxy","path","base","Error","gh","window","lively4github","isAuthFetch","isWriting","ensureGithubLogin","lively","console","log","GitHub","then","loadCredentials","addUserNameAndPassword","username","password","Headers","get","set","find","startsWith","token","lively4url","isDebugFetch","stack","split","slice","map","replace","lively4session","lively4systemid"],"mappings":"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","file":"fetch.js","sourcesContent":["\nvar baseUrlsAuthNeeded = [ \"https://lively-kernel.org/voices\",\"https://lively-kernel.org/research\"] // #TODO how to detect this?\nvar baseUrlsAuthNeededForWriting = [ \"https://lively-kernel.org/lively4\"]\n\nasync function proxyRequest(url, options={}) {\n  // console.log(\"PROXY reqest: \" + options.method + \" \" + url)\n  return self.originalFetch(url, {\n      mode: options.mode,\n      cache: options.cache,\n      method: options.method,\n      headers: options.headers,\n      redirect: options.redirect,\n      referrer: options.referrer,\n      credentials: options.credentials,\n      body: options.body && await options.body\n    })\n}\n\nexport async function installProxyFetch() {\n  var focalStorage = (await System.import(\"src/external/focalStorage.js\")).default\n  \n  var mounts = await focalStorage.getItem(\"lively4mounts\")\n  \n  if (!mounts) return \n  \n  self.lively4fetchHandlers = self.lively4fetchHandlers.filter(ea => !ea.isProxyFetch);\n  \n  self.lively4fetchHandlers.push({\n    isProxyFetch: true,\n    handle(request, options) {\n      var url = (request.url || request).toString()\n      var method = \"GET\"\n      if (options && options.method) method = options.method;\n      var m = url.match(/^https?:\\/\\/lively4(\\/[^/]*)(\\/.*)?/)\n      if (m) {\n        if (m[1] == \"/\") {\n          return {\n              result: new Response(JSON.stringify({\n                name: \"root\",\n                contents: []\n              }, null, 2))\n          }\n        }\n        \n        // console.log(\"proxy fetch \" + url)\n        var mountPoint = m[1]\n        var rest = m[2]\n       \n        if (mountPoint == \"/sys\" && rest == \"/mounts\") {\n          if (method == \"GET\") {\n            return {\n              result: new Response(JSON.stringify(mounts, null, 2))\n            }            \n          } else if (method == \"PUT\") {\n            \n            return {\n              result: (async () => {\n                try {\n                  var json = options.body\n                  var newMounts = JSON.parse(json)\n                } catch(e) {\n                  // json could not be parsed\n                }\n                if (newMounts) {\n                  mounts = newMounts\n                  await focalStorage.setItem(\"lively4mounts\", mounts)\n                  return new Response(\"updated mounts\", {status: 200})\n                } else {\n                  return new Response(\"could not parse json: \" + json, {status: 500})\n                }\n              })()\n            }\n          }\n        }\n        \n        for (var proxy of mounts.filter(ea => ea.name == \"http\")) {\n          if (mountPoint == proxy.path) {\n            if (!proxy.options || !proxy.options.base) \n              throw new Error(\"options.base is missing in mount config for \" + mountPoint)\n            return {\n              result: proxyRequest(proxy.options.base + rest, options)\n            }  \n          }\n        }\n        // give SWX a chance to handle POID requests...\n        // return  {\n        //   result: new Response(\"Could not handle \" + url)\n        // }          \n      }\n    }\n  })\n}\n\n\nexport async function installAuthorizedFetch() {\n  var gh = window.lively4github  \n  self.lively4fetchHandlers = self.lively4fetchHandlers.filter(ea => !ea.isAuthFetch);\n  self.lively4fetchHandlers.push({\n    isAuthFetch: true,\n    handle(request, options) {\n      var url = (request.url || request).toString()\n      var method = \"GET\"\n      if (options && options.method) method = options.method;\n      \n      var isWriting = method != \"OPTIONS\" && method != \"GET\" && method != \"HEAD\"\n      \n      async function ensureGithubLogin() {\n        if (!gh && window.lively) {\n          console.log(\"Ensure Github Credentials: \" + url)\n          var GitHub = await System.import(\"src/client/github.js\").then( m => m.default)\n          window.lively4github =  new GitHub();\n          gh = window.lively4github\n          await gh.loadCredentials()\n        }\n      }\n      \n      function addUserNameAndPassword(options, username=\"anonymous\", password=\"xxx\") {\n        if (!options) options = {};\n        if (!options.headers) options.headers = {};\n        options.headers = new Headers(options.headers) // ensure headers\n\n        // inject authentification tokens into request\n        if (!options.headers.get(\"gitusername\")) {\n            options.headers.set(\"gitusername\",  username)\n        }\n        if (!options.headers.get(\"gitpassword\")) {\n            options.headers.set(\"gitpassword\", password)\n        }\n        return options\n      }\n      \n      if (baseUrlsAuthNeeded.find( ea => url.startsWith(ea))) {\n        return {\n            result: (async () => {\n              console.log(\"AuthorizedFetch: \" + url)\n              await ensureGithubLogin() \n              options =  addUserNameAndPassword(options, gh.username,   await gh.token)\n              return proxyRequest(url, options)\n            })()\n        }          \n      }\n      \n      if  (isWriting && baseUrlsAuthNeededForWriting.find(\n          ea => url.startsWith(ea) && !url.startsWith(lively4url + \"/.transpiled/\")  )) {\n        return {\n            result: (async () => {\n              console.log(\"AuthorizedFetch Write: \" + url)\n              ensureGithubLogin() // but don't wait... we want to avoid deadlocks... or if there is no login..\n              if (gh) {\n                options = addUserNameAndPassword(options, gh.username,  gh.token)\n              } else {\n                options = addUserNameAndPassword(options)\n              }\n              return proxyRequest(url, options)\n            })()\n        }\n      }\n    }\n  })\n}\n\nexport async function installDebugFetch() {\n  self.lively4fetchHandlers = self.lively4fetchHandlers.filter(ea => !ea.isDebugFetch);\n  self.lively4fetchHandlers.push({\n    isDebugFetch: true,\n    options(request, options) {\n      var url = (request.url || request).toString()\n      if (url.match(/lively4(S2)?\\//)) {\n        // console.log(\"DEBUG FETCH \" + url)\n        if (!options) {\n          options = {\n            method: \"GET\"\n          }\n        }\n        if (!options.headers) {\n          options.headers = new Headers()\n        }\n        if (options.headers.set) {\n          var stack = self.lively ? ''+lively.stack() : \"\";\n          if(!options.headers.get(\"debug-initiator\")) {\n            options.headers.set(\"debug-initiator\", JSON.stringify(stack.split(\"\\n\").slice(4).map(ea => ea.replace(\"    at \",\"\"))))\n            options.headers.set(\"debug-session\", self.lively4session)\n             options.headers.set(\"debug-system\", self.lively4systemid)\n          }\n          \n          \n          return options  \n        } else {\n          // convert first?\n        }\n        \n        \n      }\n      \n    }   \n  })\n}\n\n\nexport async function installFetchHandlers() {\n  await installProxyFetch()\n  await installAuthorizedFetch()\n  await installDebugFetch()\n} \n\n\nif (self.lively) {\n  // dev time\n installFetchHandlers()\n}\n"]}