{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-portal/src/client/protocols/rest.js"],"names":["Scheme","RestScheme","baseURL","Error","resolve","auth","getBearerToken","ensureToken","getDefaultHeaders","headers","Headers","append","api","method","path","options","resp","fetch","body","status","logout","get","match","text","Response","JSON","stringify","parse","undefined","e","apiJSON","then","r","json","urlObj","URL","url","pathname","replace","GET","search","PATCH","PUT","POST","DELETE","OPTIONS"],"mappings":";;;;;;AAAQA,Y,oBAAAA,M;;;;;;;;;;;AAAAA,iD;;;;;;;AAEO,YAAMC,UAAN,SAAyBD,MAAzB,CAAgC;;AAE7C,YAAIE,OAAJ,GAAc;AACZ,gBAAM,IAAIC,KAAJ,CAAU,0BAAV,CAAN;AACD;;AAEDC,kBAAU;AACR,iBAAO,IAAP;AACD;;AAEDC,eAAO;AACJ,gBAAM,IAAIF,KAAJ,CAAU,0BAAV,CAAN;AACF;;AAED,cAAMG,cAAN,GAAuB;AACrB,iBAAQ,UAAS,MAAM,KAAKD,IAAL,GAAYE,WAAZ,EAA0B,EAAjD;AACD;;AAED,cAAMC,iBAAN,CAAwBC,OAAxB,EAAiC;AAC/BA,oBAAU,IAAIC,OAAJ,CAAYD,OAAZ,CAAV;AACAA,kBAAQE,MAAR,CAAe,eAAf,GAAgC,MAAM,KAAKL,cAAL,EAAtC;AACA,iBAAOG,OAAP;AACD;;AAGD,cAAMG,GAAN,CAAUC,SAAO,KAAjB,EAAwBC,IAAxB,EAA8BC,UAAQ,EAAtC,EAA0C;AACxC,cAAIN,UAAU,MAAM,KAAKD,iBAAL,CAAuBO,QAAQN,OAA/B,CAApB;AACA,cAAIO,OAAO,MAAMC,MAAM,KAAKf,OAAL,GAAeY,IAArB,EAA2B;AAC1CD,oBAAQA,MADkC;AAE1CJ,qBAASA,OAFiC;AAG1CS,kBAAMH,QAAQG;AAH4B,WAA3B,CAAjB;AAKA,cAAIF,KAAKG,MAAL,IAAe,GAAnB,EAAwB;AACtB,kBAAM,KAAKd,IAAL,GAAYe;AAClB;AADM,cAAN,CAEAJ,OAAO,MAAMC,MAAM,KAAKf,OAAL,GAAeY,IAArB,EAA2B;AACtCD,sBAAQA,MAD8B;AAEtCJ,uBAASA;AAF6B,aAA3B,CAAb;AAID;;AAGD,cAAIO,KAAKP,OAAL,CAAaY,GAAb,CAAiB,cAAjB,EAAiCC,KAAjC,CAAuC,kBAAvC,CAAJ,EAAgE;AAC9D,gBAAIC,OAAO,MAAMP,KAAKO,IAAL,EAAjB;AACA,gBAAI;AACF,qBAAO,IAAIC,QAAJ,CAAaC,KAAKC,SAAL,CAAeD,KAAKE,KAAL,CAAWJ,IAAX,CAAf,EAAiCK,SAAjC,EAA4C,CAA5C,CAAb,CAAP;AACD,aAFD,CAEE,OAAMC,CAAN,EAAS;AACT,qBAAO,IAAIL,QAAJ,CAAc,sBAAsBD,IAApC,EAA0C,EAACJ,QAAQ,GAAT,EAA1C,CAAP;AACD;AACF;AACD,iBAAOH,IAAP;AACD;;AAED,cAAMc,OAAN,CAAcjB,MAAd,EAAsBC,IAAtB,EAA4B;AAC1B,iBAAO,MAAM,KAAMF,GAAN,CAAUC,MAAV,EAAkBC,IAAlB,EAAwBiB,IAAxB,CAA6BC,KAAKA,EAAEC,IAAF,EAAlC,CAAb;AACD;;AAGD,YAAInB,IAAJ,GAAW;AACT,cAAIoB,SAAS,IAAIC,GAAJ,CAAQ,KAAKC,GAAb,CAAb;AACA,iBAAOF,OAAOG,QAAP,CAAgBC,OAAhB,CAAwB,MAAxB,EAA+B,EAA/B,CAAP;AACD;;AAED,cAAMC,GAAN,CAAUxB,OAAV,EAAmB;AACjB,cAAI,KAAKD,IAAL,IAAa,QAAjB,EAA2B;AACzB,gBAAIT,OAAO,KAAKA,IAAL,EAAX;AACAA,iBAAKe,MAAL;AACA,mBAAO,IAAII,QAAJ,CAAa,YAAb,CAAP;AACD;AACD,cAAIU,SAAS,IAAIC,GAAJ,CAAQ,KAAKC,GAAb,CAAb;AACA,iBAAO,MAAM,KAAKxB,GAAL,CAAS,KAAT,EAAgB,KAAKE,IAAL,GAAYoB,OAAOM,MAAnC,EAA2CzB,OAA3C,CAAb;AACD;;AAED,cAAM0B,KAAN,CAAY1B,OAAZ,EAAqB;AACnB,iBAAO,MAAM,KAAKH,GAAL,CAAS,OAAT,EAAkB,KAAKE,IAAvB,EAA6BC,OAA7B,CAAb;AACD;;AAED,cAAM2B,GAAN,CAAU3B,OAAV,EAAmB;AACjB,iBAAO,MAAM,KAAKH,GAAL,CAAS,KAAT,EAAgB,KAAKE,IAArB,EAA2BC,OAA3B,CAAb;AACD;;AAED,cAAM4B,IAAN,CAAW5B,OAAX,EAAoB;AAClB,iBAAO,MAAM,KAAKH,GAAL,CAAS,MAAT,EAAiB,KAAKE,IAAtB,EAA4BC,OAA5B,CAAb;AACD;;AAED,cAAM6B,MAAN,CAAa7B,OAAb,EAAsB;AACpB,iBAAO,MAAM,KAAKH,GAAL,CAAS,QAAT,EAAmB,KAAKE,IAAxB,EAA8BC,OAA9B,CAAb;AACD;;AAED,cAAM8B,OAAN,CAAc9B,OAAd,EAAuB;AACrB,gBAAM,IAAIZ,KAAJ,CAAU,0BAAV,CAAN;AACD;AA3F4C;;yBAA1BF,U;;;;;;;;6BAAAA,2C","file":"rest.js","sourcesContent":["import {Scheme}  from \"src/client/poid.js\"\n\nexport default class RestScheme extends Scheme {\n  \n  get baseURL() {\n    throw new Error(\"subclass responsibililty\")\n  }\n  \n  resolve() {\n    return true\n  }  \n  \n  auth() {\n     throw new Error(\"subclass responsibililty\")\n  }\n  \n  async getBearerToken() { \n    return `Bearer ${await this.auth().ensureToken()}`\n  }\n  \n  async getDefaultHeaders(headers) {\n    headers = new Headers(headers);\n    headers.append('Authorization', await this.getBearerToken());\n    return headers;\n  }\n    \n\n  async api(method=\"GET\", path, options={}) {\n    var headers = await this.getDefaultHeaders(options.headers)\n    var resp = await fetch(this.baseURL + path, {\n      method: method,\n      headers: headers,\n      body: options.body\n    })\n    if (resp.status == 401) {\n      await this.auth().logout()\n      // try again once with new authorization... token might have beeen expired\n      resp = await fetch(this.baseURL + path, {\n        method: method,\n        headers: headers\n      })\n    }\n    \n    \n    if (resp.headers.get(\"content-type\").match(\"application/json\")) {\n      var text = await resp.text()\n      try {\n        return new Response(JSON.stringify(JSON.parse(text), undefined, 2))\n      } catch(e) {\n        return new Response( \"Could not parse: \" + text, {status: 400} )\n      }\n    }\n    return resp\n  }\n  \n  async apiJSON(method, path) {\n    return await this. api(method, path).then(r => r.json())\n  }\n  \n  \n  get path() {\n    let urlObj = new URL(this.url)\n    return urlObj.pathname.replace(/^\\/*/,\"\")\n  }\n\n  async GET(options) {\n    if (this.path == \"logout\") {\n      var auth = this.auth()\n      auth.logout()\n      return new Response(\"logged out\")\n    }\n    let urlObj = new URL(this.url)\n    return await this.api(\"GET\", this.path + urlObj.search, options)\n  }\n  \n  async PATCH(options) {\n    return await this.api(\"PATCH\", this.path, options)\n  }\n  \n  async PUT(options) {\n    return await this.api(\"PUT\", this.path, options)\n  }\n  \n  async POST(options) {\n    return await this.api(\"POST\", this.path, options)\n  }\n\n  async DELETE(options) {\n    return await this.api(\"DELETE\", this.path, options)\n  }\n  \n  async OPTIONS(options) {\n    throw new Error(\"subclass responsibililty\")\n  }\n}\n"]}