{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-augment/src/client/fetch.js"],"names":["baseUrlsAuthNeeded","baseUrlsAuthNeededForWriting","proxyRequest","url","options","console","log","method","self","originalFetch","mode","cache","headers","redirect","referrer","credentials","body","installProxyFetch","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","installAuthorizedFetch","gh","window","lively4github","isAuthFetch","isWriting","ensureGithubLogin","lively","GitHub","then","loadCredentials","addUserNameAndPassword","username","password","Headers","get","set","find","startsWith","token","installDebugFetch","isDebugFetch","stack","currentStack","split","slice","map","replace","lively4session","lively4systemid","installFetchHandlers"],"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(ea => url.startsWith(ea))) {\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.currentStack() : \"\";\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"]}