@lemoncloud/lemon-web-core
Version:
Core Web-based Library for signing request at LEMONCLOUD
68 lines (63 loc) • 30.4 kB
JavaScript
'use strict';
var xe = require('crypto-js/hmac-sha256.js');
var Re = require('crypto-js/enc-base64.js');
var util = require('util');
var jwtDecode = require('jwt-decode');
var Ke = require('axios');
var b = require('aws-sdk/global.js');
var He = require('crypto-js/sha256.js');
var Oe = require('crypto-js/enc-hex.js');
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
var xe__default = /*#__PURE__*/_interopDefault(xe);
var Re__default = /*#__PURE__*/_interopDefault(Re);
var Ke__default = /*#__PURE__*/_interopDefault(Ke);
var b__default = /*#__PURE__*/_interopDefault(b);
var He__default = /*#__PURE__*/_interopDefault(He);
var Oe__default = /*#__PURE__*/_interopDefault(Oe);
var we=Object.defineProperty,Te=Object.defineProperties;var Ce=Object.getOwnPropertyDescriptors;var se=Object.getOwnPropertySymbols;var Ie=Object.prototype.hasOwnProperty,Ae=Object.prototype.propertyIsEnumerable;var oe=(i,e,t)=>e in i?we(i,e,{enumerable:true,configurable:true,writable:true,value:t}):i[e]=t,h=(i,e)=>{for(var t in e||(e={}))Ie.call(e,t)&&oe(i,t,e[t]);if(se)for(var t of se(e))Ae.call(e,t)&&oe(i,t,e[t]);return i},v=(i,e)=>Te(i,Ce(e));var n=(i,e,t)=>new Promise((r,s)=>{var o=a=>{try{g(t.next(a));}catch(f){s(f);}},c=a=>{try{g(t.throw(a));}catch(f){s(f);}},g=a=>a.done?r(a.value):Promise.resolve(a.value).then(o,c);g((t=t.apply(i,e)).next());});var _={},X=class{constructor(){}setItem(e,t){return _[e]=t,_[e]}getItem(e){return Object.prototype.hasOwnProperty.call(_,e)?_[e]:void 0}removeItem(e){return delete _[e]}clear(){return _={},_}},K=class{constructor(){try{this.storage=window.localStorage,this.storage.setItem(".test-value",1),this.storage.removeItem(".test-value");}catch(e){this.storage=new X;}}setItem(e,t){this.storage.setItem(e,t);}getItem(e){return this.storage.getItem(e)}removeItem(e){this.storage.removeItem(e);}};var ve=i=>new Promise(e=>setTimeout(()=>e(),i)),ne=i=>typeof i!="object"?!i:Object.keys(i).length===0,je=(i,e,t)=>(...r)=>n(void 0,null,function*(){let s=0;do{try{return yield i(...r)}catch(o){if(s===e)return Promise.reject(o)}yield ve(t);}while(s++<e)}),P=(i,e)=>{let t=xe__default.default(i,e);return Re__default.default.stringify(t)},j=(i,e=new Date().toISOString(),t=navigator.userAgent)=>{let r=i.authId||"",s=i.accountId||"",o=i.identityId||"",c="";let g=[e,s,o,c,t].join("&");let a=P(P(P(g,r),s),o);return a},H=i=>i.toLowerCase().split("_").map((e,t)=>t>0?e.charAt(0).toUpperCase()+e.slice(1):e).join(""),Ve=i=>i.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`),F=(i,e)=>`${i}.${e}`,U=(i,e,t)=>n(void 0,null,function*(){let r=`${e}.${t}`,s=`${e}.${H(t)}`,o=yield i.getItem(r);return o||(yield i.getItem(s))}),Je=(i,e=new Date().toISOString(),t=navigator.userAgent)=>{let r=i.authId||"",s=i.accountId||"",o=i.identityId||"",c=i.identityToken||"";let g=[e,s,o,c,t].join("&");let a=P(P(P(g,r),s),o);return a};var be={Black:0,Red:1,Green:2,Yellow:3,Blue:4,Magenta:5,Cyan:6,Grey:7,White:9},Le={Black:"Black",Red:"IndianRed",Green:"LimeGreen",Yellow:"Orange",Blue:"RoyalBlue",Magenta:"Orchid",Cyan:"SkyBlue",Grey:"DimGrey",White:"White"},$=class{constructor(){this.colorSet=this.getColorSet(),this.logColors={DEBUG:this.colorSet.Blue,INFO:this.colorSet.Green,WARN:this.colorSet.Yellow,ERROR:this.colorSet.Red,DEFAULT:this.colorSet.Black};}formatMessage(e,t){let r=this.checkErrorInstance(t);return util.format(e,...r)}getColorAsType(e){return this.logColors[e]}getColorByName(e="Grey"){return this.colorSet[e]}isBrowser(){return typeof window!="undefined"&&typeof window.document!="undefined"}isNode(){return typeof process!="undefined"&&process.versions!=null&&process.versions.node!=null}checkErrorInstance(e){return this.isNode()?e:e.map(t=>t instanceof Error?{error:t.message,stack:t.stack}:t)}getColorSet(){return this.isBrowser()?Le:be}};var Pe=(s=>(s.DEBUG="DEBUG",s.WARN="WARN",s.INFO="INFO",s.ERROR="ERROR",s))(Pe||{}),x=class{constructor(e="LEMON",t={}){this.options={showTimestamp:true,showLogType:true};this.utils=new $,this.namespace=e,this.options=h(h({},this.options),t),this.isNode=this.utils.isNode(),this.isBrowser=this.utils.isBrowser();}log(e,...t){let r=this.utils.formatMessage(e,t);this.writeLog("DEBUG",r);}debug(e,...t){let r=this.utils.formatMessage(e,t);this.writeLog("DEBUG",r);}warn(e,...t){let r=this.utils.formatMessage(e,t);this.writeLog("WARN",r);}info(e,...t){let r=this.utils.formatMessage(e,t);this.writeLog("INFO",r);}error(e,...t){let r=this.utils.formatMessage(e,t);this.writeLog("ERROR",r);}writeLog(e,t){let r=this.getFormat(e),s=this.createLogMessage(e,t,r);if(this.isNode){console.log(s);return}this.logOnBrowser(e,s,r);}createLogMessage(e,t,r,s=true){let o=e==="INFO"||e==="WARN"?" ":"",{showTimestamp:c,showLogType:g}=this.options,{timestampFormat:a,typeFormat:f,textFormat:S,namespaceFormat:k}=r;this.isBrowser&&s&&(a="%c",f="%c",k="%c",S=": %c");let w=c?`${a}${this.createTimestamp(new Date)} `:`${a}`,A=g?`${f}[${e}]${o} `:`${f}`,L=`${k}${this.namespace}`,q=`${S}${t}`;return `${w}${A}${L}${q}`}logOnBrowser(e,t,r){let{timestampFormat:s,typeFormat:o,namespaceFormat:c,textFormat:g}=r;e==="ERROR"?console.error(t,s,o,c,g):console.log(t,s,o,c,g);}getFormat(e){return this.isNode?this.getNodeFormat(e):this.getBrowserFormat(e)}getNodeFormat(e){let t=this.utils.getColorByName("White"),r=this.utils.getColorAsType(e),o="\x1B[3"+this.utils.getColorByName("Grey")+"m",c="\x1B[3"+r+";22m",g="\x1B[3"+t+";1m";return {timestampFormat:o,typeFormat:c,textFormat:"\x1B[0m: ",namespaceFormat:g}}getBrowserFormat(e){let t=this.utils.getColorByName("Black"),r=this.utils.getColorAsType(e),o="color:"+this.utils.getColorByName("Grey"),c="color:"+r,g="color:"+t+"; font-weight: bold";return {timestampFormat:o,typeFormat:c,textFormat:": ",namespaceFormat:g}}createTimestamp(e){let t=w=>w<10?"0":"",r=e||new Date,[s,o,c,g,a,f]=[r.getFullYear(),r.getMonth()+1,r.getDate(),r.getHours(),r.getMinutes(),r.getSeconds()],S=`${t(s)}${s}-${t(o)}${o}-${t(c)}${c}`,k=`${t(g)}${g}:${t(a)}${a}:${t(f)}${f}`;return `${S} ${k}`}};var I="use_x_lemon_identity_key",T="use_x_lemon_language_key",M="region",E=class{constructor(e){this.config=e;this.prefix="lemon";this.storage=new K;this.prefix=`@${e.project}`,this.storage=this.config.storage||new K;}updatePrefix(e){this.prefix=`@${e}`;}setItem(e,t){return n(this,null,function*(){return yield this.storage.setItem(`${this.prefix}.${e}`,t)})}getItem(e){return n(this,null,function*(){return yield this.storage.getItem(`${this.prefix}.${e}`)})}calculateTokenExpiration(e,t){var o;if(e)return new Date(e).getTime()-3e5;if(t)try{let c=((o=this.extractJWT(t))==null?void 0:o.exp)||null;if(c)return c*1e3-3e5}catch(c){console.warn("Failed to parse JWT expiration:",c);}return console.warn("No server expiration found, using fallback duration"),new Date().getTime()+9e5}calculateTokenIssuedTime(e){var t;if(e)try{let r=((t=this.extractJWT(e))==null?void 0:t.iat)||null;if(r)return r*1e3}catch(r){return console.warn("Failed to parse JWT expiration:",r),""}return ""}extractJWT(e){try{return jwtDecode.jwtDecode(e)}catch(t){return null}}};var D=class extends E{constructor(t){super(t);this.config=t;this.credentialKeys=["account_id","auth_id","identity_id","identity_pool_id","identity_token","access_key_id","secret_key","session_token","expired_time","issued_time","kms_arn"];}getKey(t){return F(this.prefix,t)}getStorageItem(t){return n(this,null,function*(){return (yield U(this.storage,this.prefix,t))||""})}initLemonConfig(){return n(this,null,function*(){yield this.setItem(I,"true"),yield this.setItem(M,this.config.region||"ap-northeast-2");})}getAllItems(){return n(this,null,function*(){return yield this.credentialKeys.reduce((t,r)=>n(this,null,function*(){let s=yield t.then(),o=this.getKey(r),c=yield this.getStorageItem(r);return c&&(s[o]=c),Promise.resolve(s)}),Promise.resolve({}))})}hasCachedToken(){return n(this,null,function*(){let t=yield this.getStorageItem("expired_time"),r=yield this.getStorageItem("access_key_id"),s=yield this.getStorageItem("secret_key"),o=yield this.getStorageItem("identity_token");return !!r&&!!s&&!!t&&!!o})}shouldRefreshToken(){return n(this,null,function*(){let t=+(yield this.getStorageItem("expired_time")),r=new Date().getTime(),s=!t||t<=0,o=r>=t;return s||o})}getCachedCredentials(){return n(this,null,function*(){let t=yield this.getStorageItem("access_key_id"),r=yield this.getStorageItem("secret_key"),s=yield this.getStorageItem("session_token");return {AccessKeyId:t,SecretKey:r,SessionToken:s}})}getCachedOAuthToken(){return n(this,null,function*(){let t=yield this.credentialKeys.reduce((c,g)=>n(this,null,function*(){let a=yield c.then();return a[H(g)]=yield this.getStorageItem(g),Promise.resolve(a)}),Promise.resolve({})),r=yield this.getStorageItem("access_key_id"),s=yield this.getStorageItem("secret_key"),o=yield this.getStorageItem("session_token");return t.credential={AccessKeyId:r,SecretKey:s,SessionToken:o},delete t.accessKeyId,delete t.secretKey,delete t.sessionToken,delete t.expiredTime,delete t.kmsArn,t})}saveOAuthToken(t){return n(this,null,function*(){let{accountId:r,authId:s,credential:o,identityId:c,identityPoolId:g,identityToken:a}=t,{AccessKeyId:f,SecretKey:S,SessionToken:k,Expiration:w}=o;this.storage.setItem(this.getKey("account_id"),r||""),this.storage.setItem(this.getKey("auth_id"),s||""),this.storage.setItem(this.getKey("identity_id"),c||""),this.storage.setItem(this.getKey("identity_token"),a||""),this.storage.setItem(this.getKey("identity_pool_id"),g||""),this.storage.setItem(this.getKey("access_key_id"),f||""),this.storage.setItem(this.getKey("secret_key"),S||""),this.storage.setItem(this.getKey("session_token"),k||"");let A=this.calculateTokenExpiration(w,a);this.storage.setItem(this.getKey("expired_time"),A.toString());let L=this.calculateTokenIssuedTime(a);L&&this.storage.setItem(this.getKey("issued_time"),L.toString());})}clearOAuthToken(){return n(this,null,function*(){yield Promise.all(this.credentialKeys.map(t=>this.storage.removeItem(this.getKey(t))));})}saveKMS(t){return n(this,null,function*(){let r=t.arn;this.storage.setItem(this.getKey("kms_arn"),r||"");})}};var z=class extends E{constructor(t){super(t);this.config=t;this.credentialKeys=["account_id","auth_id","identity_id","identity_token","access_token","host_key","expired_time","issued_time","client_id"];}getKey(t){return F(this.prefix,t)}getStorageItem(t){return n(this,null,function*(){return (yield U(this.storage,this.prefix,t))||""})}getAllItems(){return n(this,null,function*(){return yield this.credentialKeys.reduce((t,r)=>n(this,null,function*(){let s=yield t,o=this.getKey(r),c=yield this.getStorageItem(r);return c&&(s[o]=c),Promise.resolve(s)}),Promise.resolve({}))})}hasCachedToken(){return n(this,null,function*(){let t=yield this.getStorageItem("expired_time"),r=yield this.getStorageItem("identity_token"),s=yield this.getStorageItem("access_token"),o=yield this.getStorageItem("host_key");return !!r&&!!s&&!!o&&!!t})}shouldRefreshToken(){return n(this,null,function*(){let t=+(yield this.getStorageItem("expired_time")),r=new Date().getTime(),s=!t||t<=0,o=r>=t;return s||o})}getCachedOAuthToken(){return n(this,null,function*(){let t=yield this.credentialKeys.reduce((s,o)=>n(this,null,function*(){let c=yield s;return c[H(o)]=yield this.getStorageItem(o),Promise.resolve(c)}),Promise.resolve({})),r=yield this.getStorageItem("host_key");return t.credential={HostKey:r},delete t.hostKey,delete t.expiredTime,t})}saveOAuthToken(t){return n(this,null,function*(){let{accountId:r,authId:s,credential:o,identityId:c,identityToken:g,accessToken:a}=t,{hostKey:f,clientId:S,Expiration:k}=o;this.storage.setItem(this.getKey("account_id"),r||""),this.storage.setItem(this.getKey("auth_id"),s||""),this.storage.setItem(this.getKey("identity_id"),c||""),this.storage.setItem(this.getKey("identity_token"),g||""),this.storage.setItem(this.getKey("host_key"),f||""),this.storage.setItem(this.getKey("access_token"),a||""),this.storage.setItem(this.getKey("client_id"),S||"default");let w=this.calculateTokenExpiration(k,g);this.storage.setItem(this.getKey("expired_time"),w.toString());let A=this.calculateTokenIssuedTime(g);A&&this.storage.setItem(this.getKey("issued_time"),A.toString());})}clearOAuthToken(){return n(this,null,function*(){yield Promise.all(this.credentialKeys.map(t=>this.storage.removeItem(this.getKey(t))));})}};var R=class{constructor(e,t){this.config={headers:{"Content-Type":"application/json"},method:"get"};if(!e.method)throw new Error("method should be defined!");if(!e.baseURL)throw new Error("baseURL should be defined!");this.config=h(h({},this.config),e),this.axiosInstance=t||Ke__default.default.create(e);}setHeaders(e){return this.config.headers=e,this}setParams(e){return this.config.params=e,this}setBody(e){return this.config.data=e,this}setMethod(e){return this.config.method=e,this}addHeaders(e={}){return this.config.headers=h(h({},this.config.headers),e),this}addAxiosRequestConfig(e){return this.config=h(h({},this.config),e),this}execute(){return n(this,null,function*(){try{return yield this.axiosInstance.request(this.config)}catch(e){throw e}})}};var We=He__default.default,qe=Oe__default.default,Ne=xe__default.default,V={};V.newClient=function(i){let e="AWS4-HMAC-SHA256",t="aws4_request",r="AWS4",s="x-amz-date",o="x-amz-security-token",c="host",g="Authorization";function a(d){return We(d)}function f(d){return d.toString(qe)}function S(d,m){return Ne(m,d)}function k(d,m,l,p,u){return d+`
`+A(m)+`
`+q(l)+`
`+ce(p)+`
`+J(p)+`
`+f(a(u))}function w(d){return f(a(d))}function A(d){return L(d)}function L(d,m=false){let l=[];for(let p=0;p<d.length;p++){let u=d.charAt(p);u>="A"&&u<="Z"||u>="a"&&u<="z"||u>="0"&&u<="9"||u=="_"||u=="-"||u=="~"||u=="."?l.push(u):u=="*"?l.push("%2A"):u=="!"?l.push("%21"):u=="("?l.push("%28"):u==")"?l.push("%29"):u=="/"?l.push(m?"%2F":u):l.push(encodeURIComponent(u));}return l.join("").toString()}function q(d){if(Object.keys(d).length<1)return "";let m=[];for(let p in d)Object.prototype.hasOwnProperty.call(d,p)&&m.push(p);m.sort();let l="";for(let p=0;p<m.length;p++)l+=m[p]+"="+ae(d[m[p]])+"&";return l.substr(0,l.length-1)}function ae(d){return encodeURIComponent(d).replace(/!/g,"%21").replace(/'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\*/g,"%2A").replace(/%20/g,"%20")}function ce(d){let m="",l=[];for(let p in d)Object.prototype.hasOwnProperty.call(d,p)&&l.push(p);l.sort();for(let p=0;p<l.length;p++)m+=l[p].toLowerCase()+":"+d[l[p]]+`
`;return m}function J(d){let m=[];for(let l in d)Object.prototype.hasOwnProperty.call(d,l)&&m.push(l.toLowerCase());return m.sort(),m.join(";")}function de(d,m,l){return e+`
`+d+`
`+m+`
`+l}function ge(d,m,l){return d.substr(0,8)+"/"+m+"/"+l+"/"+t}function he(d,m,l,p){return S(S(S(S(r+d,m.substr(0,8)),l),p),t)}function ue(d,m){return f(S(d,m))}function le(d,m,l,p){return e+" Credential="+d+"/"+m+", SignedHeaders="+J(l)+", Signature="+p}let y={};if(i.accessKey===void 0||i.secretKey===void 0)return y;y.host=i.host,y.accessKey=i.accessKey,y.secretKey=i.secretKey,y.sessionToken=i.sessionToken,y.serviceName=i.serviceName||"execute-api",y.region=i.region||"ap-northeast-2",y.defaultAcceptType=i.defaultAcceptType||"application/json",y.defaultContentType=i.defaultContentType||"application/json";let Z=i.endpoint,Q=/(^https?:\/\/[^/]+)/g.exec(Z)[1],me=Z.substring(Q.length);return y.endpoint=Q,y.pathComponent=me,y.signRequest=function(d){let m=d.method.toUpperCase(),l=y.pathComponent+d.path,p=d.queryParams||{},u=d.headers||{};u["Content-Type"]===void 0&&(u["Content-Type"]=y.defaultContentType),u.Accept===void 0&&(u.Accept=y.defaultAcceptType);let C=d.body||{};d.body===void 0||m==="GET"?C="":C=C&&typeof C=="object"?JSON.stringify(C):C,(C===""||C===void 0||C===null)&&delete u["Content-Type"];let N=new Date().toISOString().replace(/\.\d{3}Z$/,"Z").replace(/[:-]|\.\d{3}/g,"");u[s]=N,u[c]=y.host;let pe=k(m,l,p,u,C),ye=w(pe),ee=ge(N,y.region,y.serviceName),fe=de(N,ee,ye),Se=he(y.secretKey,N,y.region,y.serviceName),ke=ue(Se,fe);u[g]=le(y.accessKey,ee,u,ke),y.sessionToken!==void 0&&y.sessionToken!==""&&(u[o]=y.sessionToken),delete u[c];let te=y.endpoint+l,re=q(p);return re!==""&&(te+="?"+re),u["Content-Type"]===void 0&&(u["Content-Type"]=y.defaultContentType),{headers:u,url:te}},y};var O=class{constructor(e,t,r){this.tokenStorage=e;this.config={headers:{"Content-Type":"application/json"},method:"get"};if(!e)throw new Error("tokenStorage should be defined!");if(!t.method)throw new Error("method should be defined!");if(!t.baseURL)throw new Error("baseURL should be defined!");this.config=h(h({},this.config),t),this.axiosInstance=r||Ke__default.default.create(this.config),this.logger=new x("AWSHttpBuilder");}setHeaders(e){return this.config.headers=e,this}setParams(e){return this.config.params=e,this}setBody(e){return this.config.data=e,this}setMethod(e){return this.config.method=e,this}addHeaders(e={}){return this.config.headers=h(h({},this.config.headers),e),this}addAxiosRequestConfig(e){return this.config=h(h({},this.config),e),this}execute(){return n(this,null,function*(){var e;try{let t=yield this.getSignedClient(this.config.baseURL),r={method:((e=this.config.method)==null?void 0:e.toLowerCase())||"get",params:this.config.params,body:this.config.data},s=yield this.getSignedHeader(t,r);return this.addHeaders(s),yield this.axiosInstance.request(this.config)}catch(t){throw t}})}getSignedClient(e){return n(this,null,function*(){if(!e)throw new Error("@endpoint (string) is required!");let t=yield this.tokenStorage.getItem(M),s=b__default.default.config&&b__default.default.config.credentials&&V.newClient({accessKey:b__default.default.config.credentials.accessKeyId,secretKey:b__default.default.config.credentials.secretAccessKey,sessionToken:b__default.default.config.credentials.sessionToken,region:t||"ap-northeast-2",endpoint:e,host:this.extractHostname(e)});return s||this.logger.warn("signedClient is missing. Request without signing.."),yield s})}getSignedHeader(e,t){return n(this,null,function*(){if(!e)return {};let{method:r,path:s,params:o,body:c}=t,g=e.signRequest({method:r,path:s||"",headers:{},queryParams:o||{},body:c||{}}),a=g&&g.headers;if(ne(a))return this.logger.warn("signedClient is missing => Request without signing"),this.config.headers;let S=yield this.addXLemonIdentityToHeader(a);return yield this.addXLemonLanguageToHeader(S)})}addXLemonIdentityToHeader(e){return n(this,null,function*(){let t=yield this.tokenStorage.getItem(I);if(!t||t==="false")return h(h({},e),this.config.headers);let r=yield this.tokenStorage.getItem("identity_token");return v(h(h({},e),this.config.headers),{"x-lemon-identity":r})})}addXLemonLanguageToHeader(e){return n(this,null,function*(){let[t,r]=yield Promise.all([this.tokenStorage.getItem(T),this.tokenStorage.getItem((yield this.tokenStorage.getItem(T))||"")]);return h(h(h({},e),this.config.headers),t&&r&&{"x-lemon-language":r})})}extractHostname(e){let t;return e.indexOf("//")>-1?t=e.split("/")[2]:t=e.split("/")[0],t=t.split(":")[0],t=t.split("?")[0],t}};var W=class{constructor(e,t){this.tokenStorage=e;this.config={headers:{"Content-Type":"application/json"},method:"get"};if(!e)throw new Error("tokenStorage should be defined!");if(!t.method)throw new Error("method should be defined!");if(!t.baseURL)throw new Error("baseURL should be defined!");this.config=h(h({},this.config),t),this.axiosInstance=Ke__default.default.create(this.config);}setHeaders(e){return this.config.headers=e,this}setParams(e){return this.config.params=e,this}setBody(e){return this.config.data=e,this}setMethod(e){return this.config.method=e,this}addHeaders(e={}){return this.config.headers=h(h({},this.config.headers),e),this}addAxiosRequestConfig(e){return this.config=h(h({},this.config),e),this}execute(){return n(this,null,function*(){try{return yield this.addCodeParams(),yield this.addBearerTokenToHeader(),yield this.addXLemonIdentityToHeader(),yield this.addXLemonLanguageToHeader(),yield this.axiosInstance.request(this.config)}catch(e){throw e}})}addCodeParams(){return n(this,null,function*(){let e=(yield this.tokenStorage.getItem("host_key"))||"";if(!e)return;let t=(yield this.tokenStorage.getItem("client_id"))||"default",r=this.config.params||{};this.setParams(v(h({},r),{code:e,clientId:t}));})}addBearerTokenToHeader(){return n(this,null,function*(){let e=(yield this.tokenStorage.getItem("identity_token"))||"";e&&this.addHeaders({Authorization:`Bearer ${e}`});})}addXLemonIdentityToHeader(){return n(this,null,function*(){let e=yield this.tokenStorage.getItem(I);if(!e||e==="false")return;let t=yield this.tokenStorage.getItem("identity_token");this.addHeaders({"x-lemon-identity":t});})}addXLemonLanguageToHeader(){return n(this,null,function*(){let e=yield this.tokenStorage.getItem(T);if(!e)return;let t=yield this.tokenStorage.getItem(e);t&&this.addHeaders({"x-lemon-language":t});})}};var G=class{constructor(e){this.config=e;this.logger=new x("AWSCore"),this.tokenStorage=new D(this.config),this.sharedAxiosInstance=Ke__default.default.create();}getSharedAxiosInstance(){return this.sharedAxiosInstance}init(){return n(this,null,function*(){if(yield this.tokenStorage.initLemonConfig(),!(yield this.tokenStorage.hasCachedToken()))return this.logger.warn("initialized without token!"),"no-token";if((yield this.tokenStorage.shouldRefreshToken())&&(yield this.refreshCachedToken()))return yield this.getCurrentCredentials(),this.logger.info("initialized and refreshed token!"),"refreshed";if(!(yield this.tokenStorage.hasCachedToken()))return this.logger.warn("initialized without token!"),"no-token";let s=yield this.tokenStorage.getCachedCredentials();return this.createAWSCredentials(s),this.logger.info("initialized with token!"),"build"})}getTokenStorage(){return this.tokenStorage}buildRequest(e){return new R(e,this.sharedAxiosInstance)}request(c,g){return n(this,arguments,function*(e,t,r={},s,o){let a=new R({method:e,baseURL:t,params:r});return s&&a.setBody(s),o&&a.addAxiosRequestConfig(o),yield a.execute()})}buildSignedRequest(e){return new O(this.tokenStorage,e,this.sharedAxiosInstance)}signedRequest(c,g){return n(this,arguments,function*(e,t,r={},s,o){let a=new O(this.tokenStorage,{method:e,baseURL:t,params:r});return s&&a.setBody(s),o&&a.addAxiosRequestConfig(o),yield a.execute()})}getSavedToken(){return this.tokenStorage.getAllItems()}isAuthenticated(){return n(this,null,function*(){try{return (yield this.tokenStorage.hasCachedToken())?(yield this.tokenStorage.shouldRefreshToken())?(this.logger.info("return isAuthenticated after refresh token"),(yield this.refreshCachedToken())!==null):new Promise(r=>{try{let s=b__default.default.config.credentials;if(!s){r(!1);return}s.get(o=>{o&&this.logger.error("get AWSConfig.credentials error: ",o),r(!o);});}catch(s){this.logger.error("isAuthenticated error: ",s),r(!1);}}):!1}catch(e){return this.logger.error("isAuthenticated error:",e),false}})}buildCredentialsByToken(e){return n(this,null,function*(){this.logger.log("buildCredentialsByToken()..."),yield this.buildAWSCredentialsByToken(e);let t=b__default.default.config.credentials;if(!t)throw new Error("Failed to build AWS credentials");return t})}buildCredentialsByStorage(){return n(this,null,function*(){this.logger.log("buildCredentialsByStorage()..."),yield this.buildAWSCredentialsByStorage();let e=b__default.default.config.credentials;if(!e)throw new Error("Failed to build AWS credentials from storage");return e})}saveKMS(e){return n(this,null,function*(){return this.logger.log("saveKMS()..."),yield this.tokenStorage.saveKMS(e)})}refreshCachedToken(e="",t=""){return n(this,null,function*(){try{let r=yield this.tokenStorage.getCachedOAuthToken();if(!r.authId)throw new Error("authId is required for token refresh");let s=yield this.tokenStorage.getCachedCredentials();this.createAWSCredentials(s);let o={authId:r.authId,accountId:r.accountId,identityId:r.identityId,identityToken:r.identityToken},c=new Date().toISOString(),g=j(o,c),a={current:c,signature:g};e&&e.length>0&&(a=v(h({},a),{domain:e}));let f=yield this.signedRequest("POST",t||`${this.config.oAuthEndpoint}/oauth/${r.authId}/refresh`,{token:1},h({},a)),S=f.data.Token||f.data,k=h({identityToken:S.identityToken||r.identityToken,identityPoolId:r.identityPoolId},S);return this.logger.info("success to refresh token"),yield this.buildCredentialsByToken(k)}catch(r){return this.logger.error("token refresh failed:",r),null}})}changeUserSite(e,t){return n(this,null,function*(){var w;if(!e||!e.siteId||!e.userId)throw new Error("@changeSiteBody required");let r=yield this.tokenStorage.getCachedOAuthToken(),s=`${e.userId}@${e.siteId}`,o=yield this.getTokenSignature(),{authId:c,current:g,signature:a,originToken:f}=o;if(!c)throw new Error("authId is required for token refresh");let S=yield this.signedRequest("POST",t||`${this.config.oAuthEndpoint}/oauth/${c}/refresh`,{token:1},{current:g,signature:a,target:s}),k=v(h({},S.data),{identityToken:((w=S.data)==null?void 0:w.identityToken)||f.identityToken,identityPoolId:r.identityPoolId});return this.logger.info("success to change user site"),yield this.buildCredentialsByToken(k)})}logout(){return n(this,null,function*(){b__default.default.config.credentials=null,yield this.tokenStorage.clearOAuthToken();})}setUseXLemonIdentity(e){return n(this,null,function*(){yield this.tokenStorage.setItem(I,`${e}`);})}setUseXLemonLanguage(e,t){return n(this,null,function*(){if(!e){yield this.tokenStorage.setItem(T,"");return}t&&(yield this.tokenStorage.setItem(T,t));})}getTokenSignature(){return n(this,null,function*(){let e=yield this.tokenStorage.getCachedOAuthToken(),t={authId:e.authId,accountId:e.accountId,identityId:e.identityId,identityToken:e.identityToken},r=new Date().toISOString(),s=j(t,r);return {authId:t.authId,current:r,signature:s,originToken:e}})}getCredentials(){return n(this,null,function*(){return (yield this.tokenStorage.hasCachedToken())?(yield this.tokenStorage.shouldRefreshToken())&&(this.logger.info("should refresh token!"),!(yield this.refreshCachedToken()))?null:yield this.getCurrentCredentials():(this.logger.info("has no cached token!"),null)})}buildAWSCredentialsByStorage(){return n(this,null,function*(){this.logger.log("buildAWSCredentialsByStorage()...");let e=yield this.tokenStorage.getCachedCredentials(),{AccessKeyId:t,SecretKey:r}=e;if(!t)throw new Error(".AccessKeyId (string) is required!");if(!r)throw new Error(".SecretKey (string) is required!");this.createAWSCredentials(e);})}getCurrentCredentials(){return new Promise((e,t)=>{let r=b__default.default.config.credentials;if(!r){t(new Error("No AWS credentials configured"));return}r.get(s=>{s?(this.logger.error("Error on getCurrentCredentials: ",s),t(s)):(this.logger.info("success to get AWS credentials"),e(r));});})}buildAWSCredentialsByToken(e){return n(this,null,function*(){let{credential:t}=e,{AccessKeyId:r,SecretKey:s}=t;if(!r)throw new Error(".AccessKeyId (string) is required!");if(!s)throw new Error(".SecretKey (string) is required!");return yield this.tokenStorage.saveOAuthToken(e),this.createAWSCredentials(t)})}createAWSCredentials(e){let{AccessKeyId:t,SecretKey:r,SessionToken:s}=e;b__default.default.config.credentials=new b__default.default.Credentials(t,r,s);}};var Y=class{constructor(e){this.config=e;this.logger=new x("AzureCore"),this.tokenStorage=new z(this.config),this.sharedAxiosInstance=Ke__default.default.create();}init(){return n(this,null,function*(){return (yield this.tokenStorage.hasCachedToken())?((yield this.tokenStorage.shouldRefreshToken())&&this.logger.info("initialized and refreshed token!"),this.logger.info("initialized with token!"),"has-token"):(this.logger.warn("initialized without token!"),"no-token")})}getTokenStorage(){return this.tokenStorage}getSharedAxiosInstance(){return this.sharedAxiosInstance}buildRequest(e){return new R(e,this.sharedAxiosInstance)}request(c,g){return n(this,arguments,function*(e,t,r={},s,o){let a=new R({method:e,baseURL:t,params:r});return s&&a.setBody(s),o&&a.addAxiosRequestConfig(o),yield a.execute()})}buildSignedRequest(e){return new W(this.tokenStorage,e)}signedRequest(c,g){return n(this,arguments,function*(e,t,r={},s,o){let a=new W(this.tokenStorage,{method:e,baseURL:t,params:r});return s&&a.setBody(s),o&&a.addAxiosRequestConfig(o),yield a.execute()})}getSavedToken(){return this.tokenStorage.getAllItems()}isAuthenticated(){return n(this,null,function*(){return (yield this.tokenStorage.hasCachedToken())?((yield this.tokenStorage.shouldRefreshToken())&&this.logger.info("should refresh token!"),true):false})}saveOAuthToken(e){return n(this,null,function*(){return yield this.tokenStorage.saveOAuthToken(e)})}logout(){return n(this,null,function*(){yield this.tokenStorage.clearOAuthToken();})}setUseXLemonIdentity(e){return n(this,null,function*(){yield this.tokenStorage.setItem(I,`${e}`);})}setUseXLemonLanguage(e,t){return n(this,null,function*(){if(!e){yield this.tokenStorage.setItem(T,"");return}t&&(yield this.tokenStorage.setItem(T,t));})}};var De={aws:G,azure:Y},ie=class{static create(e){let{cloud:t}=e,r=De[t];if(!r)throw new Error("Unsupported cloud provider");return new r(e)}};//! INFO: lemon-account-api
//! algorithm: sha256, encoding: base64
//! build payload to sign......
//! make signature with auth-id
//! returns signature..........
//! code from: https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html
//! '*' '+' '!' 같은 특수 문자가 들어갈 경우 인증 에러 발생할 수 있음.
exports.AWSHttpRequestBuilder = O;
exports.AWSStorageService = D;
exports.AWSWebCore = G;
exports.AzureHttpRequestBuilder = W;
exports.AzureStorageService = z;
exports.AzureWebCore = Y;
exports.BROWSER_COLORS = Le;
exports.HttpRequestBuilder = R;
exports.LocalStorageService = K;
exports.LogType = Pe;
exports.LoggerHelperService = $;
exports.LoggerService = x;
exports.NODE_COLORS = be;
exports.REGION_KEY = M;
exports.TokenStorageService = E;
exports.USE_X_LEMON_IDENTITY_KEY = I;
exports.USE_X_LEMON_LANGUAGE_KEY = T;
exports.WebCoreFactory = ie;
exports.calcSignature = j;
exports.calcTestSignature = Je;
exports.convertCamelCaseFromSnake = H;
exports.convertSnakeCaseFromCamel = Ve;
exports.createAsyncDelay = ve;
exports.getStorageKey = F;
exports.getStorageValue = U;
exports.hmac = P;
exports.isEmptyObject = ne;
exports.sigV4Client = V;
exports.withRetries = je;
//# sourceMappingURL=out.js.map
//# sourceMappingURL=index.cjs.map