{"version":3,"sources":["https://lively-kernel.org/lively4S2/lively4-theresa/src/client/fetch.js"],"names":["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","installFetchHandlers","baseUrlsAuthNeeded","baseUrlsAuthNeededForWriting"],"mappings":"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","file":"fetch.js","sourcesContent":["var baseUrlsAuthNeeded = [ \"https://lively-kernel.org/voices\"]\nvar baseUrlsAuthNeededForWriting = [ \"https://lively-kernel.org/lively4\"]\n\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 focalStorage = (await System.import(\"src/external/focalStorage.js\")).default\n  \n//   var mounts = await focalStorage.getItem(\"lively4mounts\")\n  \n//   if (!mounts) return \n  \n  var gh = window.lively4github\n  \n  self.lively4fetchHandlers = self.lively4fetchHandlers.filter(ea => !ea.isAuthFetch);\n  \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      \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      \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      \n      if (baseUrlsAuthNeeded.find( ea => url.startsWith(ea))) {\n        return {\n            result: (async () => {\n              console.log(\"AuthorizedFetch: \" + url)\n            \n              await ensureGithubLogin() \n              options =  addUserNameAndPassword(options, gh.username,   await gh.token)\n             \n          \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            \n              ensureGithubLogin() // but don't wait... we want to avoid deadlocks... or if there is no login..\n              \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\n\nexport async function installFetchHandlers() {\n  await installProxyFetch()\n  await installAuthorizedFetch()\n} \n\n\nif (self.lively) {\n  // dev time\n installFetchHandlers()\n}\n\n// installProxyFetch()\n"]}