{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-augment/src/client/auth.js"],"names":["focalStorage","Auth","name","tokenName","Error","tokenFromAuthInfo","notificationIconURL","appInfo","oauthTokenURL","oauthURL","logout","cb","setItem","then","parseAuthInfoFromUrl","data","authInfo","JSON","parse","replace","key","value","decodeURIComponent","notifyMe","title","text","Notification","permission","requestPermission","notification","icon","body","onclick","onAuthenticated","windowUuid","state","token","stringify","onAuthenticatedCallbacks","popup","url","width","height","screenX","window","screenY","outerWidth","outerHeight","left","Math","max","top","features","popupWindow","open","join","focus","challengeForAuth","uuid","fetch","r","Promise","resolve","Date","now","load"],"mappings":"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","file":"auth.js","sourcesContent":["import focalStorage from '../external/focalStorage.js';\n\n\n\nexport default class Auth {\n  \n  static get name() { /* subclass responsibility */}\n  static get tokenName() {throw Error('override in subclass')}\n  static tokenFromAuthInfo() {throw Error('override in subclass')}\n  static get notificationIconURL() {throw Error('override in subclass')}\n  static get appInfo() { throw Error('override in subclass')}\n  static oauthTokenURL() { throw Error('override in subclass')}\n  static oauthURL() { throw Error('override in subclass')}\n  \n  static logout(cb) {\n    focalStorage.setItem(this.tokenName, null).then(cb)\n  }\n\n  static 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  static 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  static 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  static 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  static challengeForAuth(uuid, cb) {\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  static token() {\n    return new Promise(resolve => {\n      this.challengeForAuth(Date.now(), resolve)\n    })\n  }\n  \n  static load() {\n    this.onAuthenticatedCallbacks = {}\n  }\n\n}\n\n\n"]}