{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tabs/src/client/oauth2.js"],"names":["Auth","focalStorage","LivelyAuthURL","AuthGeneric","constructor","name","onAuthenticatedCallbacks","logout","cb","setItem","tokenName","then","parseAuthInfoFromUrl","data","authInfo","JSON","parse","replace","key","value","decodeURIComponent","notifyMe","title","text","Notification","permission","requestPermission","notification","icon","notificationIconURL","body","onclick","onAuthenticated","windowUuid","state","token","tokenFromAuthInfo","Error","stringify","popup","url","width","height","screenX","window","screenY","outerWidth","outerHeight","left","Math","max","top","features","popupWindow","open","join","focus","challengeForAuth","uuid","config","fetch","r","json","oauthTokenURL","oauthURL","Promise","resolve","Date","now","cachedToken","getItem","ensureToken","iconURL","appInfo","clientId","redirectUri","openTokenURL","scope","encodeURIComponent"],"mappings":"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","file":"oauth2.js","sourcesContent":["import Auth from \"./auth.js\"\nimport focalStorage from '../external/focalStorage.js';\n\nconst LivelyAuthURL = \"https://lively-kernel.org/lively4-auth\"\n\nexport default class AuthGeneric extends Auth {\n  \n constructor(name) {\n    super()\n    this.name = name\n    this.onAuthenticatedCallbacks = {}\n  }\n\n  logout(cb) {\n    focalStorage.setItem(this.tokenName, null).then(cb)\n  }\n\n  parseAuthInfoFromUrl(data) {\n    var authInfo = JSON.parse(\n      '{\"' + data.replace(/&/g, '\",\"').replace(/=/g, '\":\"') + '\"}',\n      (key, value) => { return key === \"\" ? value : decodeURIComponent(value); });\n    return authInfo;\n  }\n\n  notifyMe(title, text, cb) {\n    if (Notification.permission !== \"granted\")\n      Notification.requestPermission();\n    else {\n      var notification = new Notification(title, {\n        icon: this.notificationIconURL,\n        body: text,\n      });\n      notification.onclick = cb\n    }\n  }\n  \n  onAuthenticated(windowUuid, authInfo) {\n    var state = authInfo.state\n    var token = this.tokenFromAuthInfo(authInfo)\n\n    if (!state) { \n      throw new Error(\"AuthError, no state! Authinfo: \" + JSON.stringify(authInfo))\n    }\n    focalStorage.setItem(this.tokenName, token).then(() => {\n      var cb = this.onAuthenticatedCallbacks[state]\n      if (cb) {\n        cb(token)\n      } else {\n        throw new Error(\"AuthError: no callback found for\" + state)\n      }\n    })\n  }\n  \n  popup(url) {\n    var width = 525,\n      height = 525,\n      screenX = window.screenX,\n      screenY = window.screenY,\n      outerWidth = window.outerWidth,\n      outerHeight = window.outerHeight;\n    var left = screenX + Math.max(outerWidth - width, 0) / 2;\n    var top = screenY + Math.max(outerHeight - height, 0) / 2;\n    var features = [\n      \"width=\" + width,\n      \"height=\" + height,\n      \"top=\" + top,\n      \"left=\" + left,\n      \"status=no\",\n      \"resizable=yes\",\n      \"toolbar=no\",\n      \"menubar=no\",\n      \"scrollbars=yes\"];\n    var popupWindow = window.open(url, \"oauth\", features.join(\",\"));\n    if (!popupWindow) {\n      this.notifyMe(this.name + \" Authenfication required\", \"click here to authenticate\", () => {\n      window.open(url, \"oauth\", features.join(\",\"));\n      })\n    } else {\n      popupWindow.focus();\n    }\n  }\n  \n  \n  async challengeForAuth(uuid, cb) {\n    this.config = await fetch(LivelyAuthURL + \"/config/\" + this.name).then(r => r.json())  \n    \n    if (uuid && cb) {\n      this.onAuthenticatedCallbacks[uuid] = cb\n    }\n    fetch(this.oauthTokenURL(uuid))\n      .then(r => r.text())\n      .then(data => {\n        // console.log(\"challenge got a token, too: \" + data)      \n        var authInfo = this.parseAuthInfoFromUrl(data)\n        this.onAuthenticated(uuid, authInfo)\n    })\n    this.popup(this.oauthURL(uuid));\n  }\n  \n  token() {\n    return new Promise(resolve => {\n      this.challengeForAuth(Date.now(), resolve)\n    })\n  }\n\n  cachedToken() {\n    return focalStorage.getItem(this.tokenName)\n  }\n  \n  async ensureToken() {\n    var token = await this.cachedToken()\n    if (token) {\n      return token\n    } else {\n      return this.token()\n    }\n  }\n  \n\n  get tokenName() {\n    return this.name + \"Token\"\n  }\n  \n  \n \n  \n  tokenFromAuthInfo(authInfo) {\n    return authInfo.token\n  }\n\n  get notificationIconURL() {\n    return this.config.iconURL\n  }\n\n  get appInfo() {\n    return {\n      \"clientId\": this.config.clientId,\n      \"redirectUri\": this.config.redirectUri\n    };\n  }\n\n  oauthTokenURL(uuid) {\n    return this.config.openTokenURL + \"?state=\"+uuid\n  }\n  \n  oauthURL(uuid) {\n    return this.config.url +\n      \"?client_id=\" + this.appInfo.clientId +\n      \"&response_type=token\" +\n      \"&scope=\" + this.config.scope +\n      \"&state=\" + uuid +\n      \"&redirect_uri=\" + encodeURIComponent(this.appInfo.redirectUri);\n  } \n}\n\n"]}