-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcreator-plugin-bannergress.user.js
301 lines (268 loc) · 76.3 KB
/
creator-plugin-bannergress.user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
// ==UserScript==
// @name Mission Creator to Bannergress
// @description Connects Ingress Mission Creator to Bannergress.
// @author The Bannergress team
// @match https://missions.ingress.com/*
// @match https://bannergress.com/*
// @version 1.1
// @namespace https://github.com/bannergress/creator-plugin
// @updateURL https://bannergress.com/creator-plugin-bannergress.user.js
// @downloadURL https://bannergress.com/creator-plugin-bannergress.user.js
// @run-at document-idle
// ==/UserScript==
// Included library: [email protected]
// eslint-disable-next-line
"use strict";var oidc=(()=>{var it=Object.create;var de=Object.defineProperty;var st=Object.getOwnPropertyDescriptor;var nt=Object.getOwnPropertyNames;var ot=Object.getPrototypeOf,at=Object.prototype.hasOwnProperty;var Ne=(l=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(l,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):l)(function(l){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+l+'" is not supported')});var se=(l,e)=>()=>(e||l((e={exports:{}}).exports,e),e.exports),ct=(l,e)=>{for(var t in e)de(l,t,{get:e[t],enumerable:!0})},We=(l,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of nt(e))!at.call(l,i)&&i!==t&&de(l,i,{get:()=>e[i],enumerable:!(r=st(e,i))||r.enumerable});return l};var ge=(l,e,t)=>(t=l!=null?it(ot(l)):{},We(e||!l||!l.__esModule?de(t,"default",{value:l,enumerable:!0}):t,l)),lt=l=>We(de({},"__esModule",{value:!0}),l);var He=se(()=>{});var ne=se((ue,Le)=>{(function(l,e){typeof ue=="object"?Le.exports=ue=e():typeof define=="function"&&define.amd?define([],e):l.CryptoJS=e()})(ue,function(){var l=l||function(e,t){var r;if(typeof window<"u"&&window.crypto&&(r=window.crypto),typeof self<"u"&&self.crypto&&(r=self.crypto),typeof globalThis<"u"&&globalThis.crypto&&(r=globalThis.crypto),!r&&typeof window<"u"&&window.msCrypto&&(r=window.msCrypto),!r&&typeof global<"u"&&global.crypto&&(r=global.crypto),!r&&typeof Ne=="function")try{r=He()}catch{}var i=function(){if(r){if(typeof r.getRandomValues=="function")try{return r.getRandomValues(new Uint32Array(1))[0]}catch{}if(typeof r.randomBytes=="function")try{return r.randomBytes(4).readInt32LE()}catch{}}throw new Error("Native crypto module could not be used to get secure random number.")},n=Object.create||function(){function a(){}return function(g){var w;return a.prototype=g,w=new a,a.prototype=null,w}}(),s={},o=s.lib={},c=o.Base=function(){return{extend:function(a){var g=n(this);return a&&g.mixIn(a),(!g.hasOwnProperty("init")||this.init===g.init)&&(g.init=function(){g.$super.init.apply(this,arguments)}),g.init.prototype=g,g.$super=this,g},create:function(){var a=this.extend();return a.init.apply(a,arguments),a},init:function(){},mixIn:function(a){for(var g in a)a.hasOwnProperty(g)&&(this[g]=a[g]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}}}(),d=o.WordArray=c.extend({init:function(a,g){a=this.words=a||[],g!=t?this.sigBytes=g:this.sigBytes=a.length*4},toString:function(a){return(a||f).stringify(this)},concat:function(a){var g=this.words,w=a.words,_=this.sigBytes,y=a.sigBytes;if(this.clamp(),_%4)for(var b=0;b<y;b++){var P=w[b>>>2]>>>24-b%4*8&255;g[_+b>>>2]|=P<<24-(_+b)%4*8}else for(var R=0;R<y;R+=4)g[_+R>>>2]=w[R>>>2];return this.sigBytes+=y,this},clamp:function(){var a=this.words,g=this.sigBytes;a[g>>>2]&=4294967295<<32-g%4*8,a.length=e.ceil(g/4)},clone:function(){var a=c.clone.call(this);return a.words=this.words.slice(0),a},random:function(a){for(var g=[],w=0;w<a;w+=4)g.push(i());return new d.init(g,a)}}),h=s.enc={},f=h.Hex={stringify:function(a){for(var g=a.words,w=a.sigBytes,_=[],y=0;y<w;y++){var b=g[y>>>2]>>>24-y%4*8&255;_.push((b>>>4).toString(16)),_.push((b&15).toString(16))}return _.join("")},parse:function(a){for(var g=a.length,w=[],_=0;_<g;_+=2)w[_>>>3]|=parseInt(a.substr(_,2),16)<<24-_%8*4;return new d.init(w,g/2)}},p=h.Latin1={stringify:function(a){for(var g=a.words,w=a.sigBytes,_=[],y=0;y<w;y++){var b=g[y>>>2]>>>24-y%4*8&255;_.push(String.fromCharCode(b))}return _.join("")},parse:function(a){for(var g=a.length,w=[],_=0;_<g;_++)w[_>>>2]|=(a.charCodeAt(_)&255)<<24-_%4*8;return new d.init(w,g)}},m=h.Utf8={stringify:function(a){try{return decodeURIComponent(escape(p.stringify(a)))}catch{throw new Error("Malformed UTF-8 data")}},parse:function(a){return p.parse(unescape(encodeURIComponent(a)))}},S=o.BufferedBlockAlgorithm=c.extend({reset:function(){this._data=new d.init,this._nDataBytes=0},_append:function(a){typeof a=="string"&&(a=m.parse(a)),this._data.concat(a),this._nDataBytes+=a.sigBytes},_process:function(a){var g,w=this._data,_=w.words,y=w.sigBytes,b=this.blockSize,P=b*4,R=y/P;a?R=e.ceil(R):R=e.max((R|0)-this._minBufferSize,0);var I=R*b,H=e.min(I*4,y);if(I){for(var L=0;L<I;L+=b)this._doProcessBlock(_,L);g=_.splice(0,I),w.sigBytes-=H}return new d.init(g,H)},clone:function(){var a=c.clone.call(this);return a._data=this._data.clone(),a},_minBufferSize:0}),v=o.Hasher=S.extend({cfg:c.extend(),init:function(a){this.cfg=this.cfg.extend(a),this.reset()},reset:function(){S.reset.call(this),this._doReset()},update:function(a){return this._append(a),this._process(),this},finalize:function(a){a&&this._append(a);var g=this._doFinalize();return g},blockSize:512/32,_createHelper:function(a){return function(g,w){return new a.init(w).finalize(g)}},_createHmacHelper:function(a){return function(g,w){return new x.HMAC.init(a,w).finalize(g)}}}),x=s.algo={};return s}(Math);return l})});var Fe=se((pe,je)=>{(function(l,e){typeof pe=="object"?je.exports=pe=e(ne()):typeof define=="function"&&define.amd?define(["./core"],e):e(l.CryptoJS)})(pe,function(l){return function(e){var t=l,r=t.lib,i=r.WordArray,n=r.Hasher,s=t.algo,o=[],c=[];(function(){function f(v){for(var x=e.sqrt(v),a=2;a<=x;a++)if(!(v%a))return!1;return!0}function p(v){return(v-(v|0))*4294967296|0}for(var m=2,S=0;S<64;)f(m)&&(S<8&&(o[S]=p(e.pow(m,1/2))),c[S]=p(e.pow(m,1/3)),S++),m++})();var d=[],h=s.SHA256=n.extend({_doReset:function(){this._hash=new i.init(o.slice(0))},_doProcessBlock:function(f,p){for(var m=this._hash.words,S=m[0],v=m[1],x=m[2],a=m[3],g=m[4],w=m[5],_=m[6],y=m[7],b=0;b<64;b++){if(b<16)d[b]=f[p+b]|0;else{var P=d[b-15],R=(P<<25|P>>>7)^(P<<14|P>>>18)^P>>>3,I=d[b-2],H=(I<<15|I>>>17)^(I<<13|I>>>19)^I>>>10;d[b]=R+d[b-7]+H+d[b-16]}var L=g&w^~g&_,re=S&v^S&x^v&x,Ie=(S<<30|S>>>2)^(S<<19|S>>>13)^(S<<10|S>>>22),ie=(g<<26|g>>>6)^(g<<21|g>>>11)^(g<<7|g>>>25),le=y+ie+L+c[b]+d[b],Ee=Ie+re;y=_,_=w,w=g,g=a+le|0,a=x,x=v,v=S,S=le+Ee|0}m[0]=m[0]+S|0,m[1]=m[1]+v|0,m[2]=m[2]+x|0,m[3]=m[3]+a|0,m[4]=m[4]+g|0,m[5]=m[5]+w|0,m[6]=m[6]+_|0,m[7]=m[7]+y|0},_doFinalize:function(){var f=this._data,p=f.words,m=this._nDataBytes*8,S=f.sigBytes*8;return p[S>>>5]|=128<<24-S%32,p[(S+64>>>9<<4)+14]=e.floor(m/4294967296),p[(S+64>>>9<<4)+15]=m,f.sigBytes=p.length*4,this._process(),this._hash},clone:function(){var f=n.clone.call(this);return f._hash=this._hash.clone(),f}});t.SHA256=n._createHelper(h),t.HmacSHA256=n._createHmacHelper(h)}(Math),l.SHA256})});var Je=se((he,Be)=>{(function(l,e){typeof he=="object"?Be.exports=he=e(ne()):typeof define=="function"&&define.amd?define(["./core"],e):e(l.CryptoJS)})(he,function(l){return function(){var e=l,t=e.lib,r=t.WordArray,i=e.enc,n=i.Base64={stringify:function(o){var c=o.words,d=o.sigBytes,h=this._map;o.clamp();for(var f=[],p=0;p<d;p+=3)for(var m=c[p>>>2]>>>24-p%4*8&255,S=c[p+1>>>2]>>>24-(p+1)%4*8&255,v=c[p+2>>>2]>>>24-(p+2)%4*8&255,x=m<<16|S<<8|v,a=0;a<4&&p+a*.75<d;a++)f.push(h.charAt(x>>>6*(3-a)&63));var g=h.charAt(64);if(g)for(;f.length%4;)f.push(g);return f.join("")},parse:function(o){var c=o.length,d=this._map,h=this._reverseMap;if(!h){h=this._reverseMap=[];for(var f=0;f<d.length;f++)h[d.charCodeAt(f)]=f}var p=d.charAt(64);if(p){var m=o.indexOf(p);m!==-1&&(c=m)}return s(o,c,h)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="};function s(o,c,d){for(var h=[],f=0,p=0;p<c;p++)if(p%4){var m=d[o.charCodeAt(p-1)]<<p%4*2,S=d[o.charCodeAt(p)]>>>6-p%4*2,v=m|S;h[f>>>2]|=v<<24-f%4*8,f++}return r.create(h,f)}}(),l.enc.Base64})});var Ke=se((fe,De)=>{(function(l,e){typeof fe=="object"?De.exports=fe=e(ne()):typeof define=="function"&&define.amd?define(["./core"],e):e(l.CryptoJS)})(fe,function(l){return l.enc.Utf8})});var Ct={};ct(Ct,{AccessTokenEvents:()=>Q,CheckSessionIFrame:()=>V,ErrorResponse:()=>E,ErrorTimeout:()=>q,InMemoryWebStorage:()=>j,Log:()=>D,Logger:()=>u,MetadataService:()=>G,OidcClient:()=>ae,OidcClientSettingsStore:()=>W,SessionMonitor:()=>Z,SigninResponse:()=>J,SigninState:()=>M,SignoutResponse:()=>X,State:()=>T,User:()=>N,UserManager:()=>Me,UserManagerSettingsStore:()=>te,Version:()=>Ze,WebStorageStateStore:()=>B});var $e=ge(ne()),ze=ge(Fe()),Te=ge(Je()),Qe=ge(Ke());var dt={debug:()=>{},info:()=>{},warn:()=>{},error:()=>{}},A,O,D=(n=>(n[n.NONE=0]="NONE",n[n.ERROR=1]="ERROR",n[n.WARN=2]="WARN",n[n.INFO=3]="INFO",n[n.DEBUG=4]="DEBUG",n))(D||{});(r=>{function l(){A=3,O=dt}r.reset=l;function e(i){if(!(0<=i&&i<=4))throw new Error("Invalid log level");A=i}r.setLevel=e;function t(i){O=i}r.setLogger=t})(D||(D={}));var u=class{constructor(e){this._name=e}debug(...e){A>=4&&O.debug(u._format(this._name,this._method),...e)}info(...e){A>=3&&O.info(u._format(this._name,this._method),...e)}warn(...e){A>=2&&O.warn(u._format(this._name,this._method),...e)}error(...e){A>=1&&O.error(u._format(this._name,this._method),...e)}throw(e){throw this.error(e),e}create(e){let t=Object.create(this);return t._method=e,t.debug("begin"),t}static createStatic(e,t){let r=new u(`${e}.${t}`);return r.debug("begin"),r}static _format(e,t){let r=`[${e}]`;return t?`${r} ${t}:`:r}static debug(e,...t){A>=4&&O.debug(u._format(e),...t)}static info(e,...t){A>=3&&O.info(u._format(e),...t)}static warn(e,...t){A>=2&&O.warn(u._format(e),...t)}static error(e,...t){A>=1&&O.error(u._format(e),...t)}};D.reset();var gt="10000000-1000-4000-8000-100000000000",C=class{static _randomWord(){return $e.default.lib.WordArray.random(1).words[0]}static generateUUIDv4(){return gt.replace(/[018]/g,t=>(+t^C._randomWord()&15>>+t/4).toString(16)).replace(/-/g,"")}static generateCodeVerifier(){return C.generateUUIDv4()+C.generateUUIDv4()+C.generateUUIDv4()}static generateCodeChallenge(e){try{let t=(0,ze.default)(e);return Te.default.stringify(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}catch(t){throw u.error("CryptoUtils.generateCodeChallenge",t),t}}static generateBasicAuth(e,t){let r=Qe.default.parse([e,t].join(":"));return Te.default.stringify(r)}};var U=class{constructor(e){this._name=e;this._logger=new u(`Event('${this._name}')`);this._callbacks=[]}addHandler(e){return this._callbacks.push(e),()=>this.removeHandler(e)}removeHandler(e){let t=this._callbacks.lastIndexOf(e);t>=0&&this._callbacks.splice(t,1)}raise(...e){this._logger.debug("raise:",...e);for(let t of this._callbacks)t(...e)}};function Ue(l){this.message=l}Ue.prototype=new Error,Ue.prototype.name="InvalidCharacterError";var Ve=typeof window<"u"&&window.atob&&window.atob.bind(window)||function(l){var e=String(l).replace(/=+$/,"");if(e.length%4==1)throw new Ue("'atob' failed: The string to be decoded is not correctly encoded.");for(var t,r,i=0,n=0,s="";r=e.charAt(n++);~r&&(t=i%4?64*t+r:r,i++%4)?s+=String.fromCharCode(255&t>>(-2*i&6)):0)r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(r);return s};function ut(l){var e=l.replace(/-/g,"+").replace(/_/g,"/");switch(e.length%4){case 0:break;case 2:e+="==";break;case 3:e+="=";break;default:throw"Illegal base64url string!"}try{return function(t){return decodeURIComponent(Ve(t).replace(/(.)/g,function(r,i){var n=i.charCodeAt(0).toString(16).toUpperCase();return n.length<2&&(n="0"+n),"%"+n}))}(e)}catch{return Ve(e)}}function me(l){this.message=l}function pt(l,e){if(typeof l!="string")throw new me("Invalid token specified");var t=(e=e||{}).header===!0?0:1;try{return JSON.parse(ut(l.split(".")[t]))}catch(r){throw new me("Invalid token specified: "+r.message)}}me.prototype=new Error,me.prototype.name="InvalidTokenError";var Ge=pt;var K=class{static decode(e){try{return Ge(e)}catch(t){throw u.error("JwtUtils.decode",t),t}}};var oe=class{static center({...e}){var t,r,i;return e.width==null&&(e.width=(t=[800,720,600,480].find(n=>n<=window.outerWidth/1.618))!=null?t:360),(r=e.left)!=null||(e.left=Math.max(0,Math.round(window.screenX+(window.outerWidth-e.width)/2))),e.height!=null&&((i=e.top)!=null||(e.top=Math.max(0,Math.round(window.screenY+(window.outerHeight-e.height)/2)))),e}static serialize(e){return Object.entries(e).filter(([,t])=>t!=null).map(([t,r])=>`${t}=${typeof r!="boolean"?r:r?"yes":"no"}`).join(",")}};var k=class extends U{constructor(){super(...arguments);this._logger=new u(`Timer('${this._name}')`);this._timerHandle=null;this._expiration=0;this._callback=()=>{let t=this._expiration-k.getEpochTime();this._logger.debug("timer completes in",t),this._expiration<=k.getEpochTime()&&(this.cancel(),super.raise())}}static getEpochTime(){return Math.floor(Date.now()/1e3)}init(t){let r=this._logger.create("init");t=Math.max(Math.floor(t),1);let i=k.getEpochTime()+t;if(this.expiration===i&&this._timerHandle){r.debug("skipping since already initialized for expiration at",this.expiration);return}this.cancel(),r.debug("using duration",t),this._expiration=i;let n=Math.min(t,5);this._timerHandle=setInterval(this._callback,n*1e3)}get expiration(){return this._expiration}cancel(){this._logger.create("cancel"),this._timerHandle&&(clearInterval(this._timerHandle),this._timerHandle=null)}};var $=class{static readParams(e,t="query"){if(!e)throw new TypeError("Invalid URL");let i=new URL(e,"http://127.0.0.1")[t==="fragment"?"hash":"search"];return new URLSearchParams(i.slice(1))}};var E=class extends Error{constructor(t,r){var i,n,s;super(t.error_description||t.error||"");this.form=r;this.name="ErrorResponse";if(!t.error)throw u.error("ErrorResponse","No error passed"),new Error("No error passed");this.error=t.error,this.error_description=(i=t.error_description)!=null?i:null,this.error_uri=(n=t.error_uri)!=null?n:null,this.state=t.userState,this.session_state=(s=t.session_state)!=null?s:null}};var q=class extends Error{constructor(t){super(t);this.name="ErrorTimeout"}};var Q=class{constructor(e){this._logger=new u("AccessTokenEvents");this._expiringTimer=new k("Access token expiring");this._expiredTimer=new k("Access token expired");this._expiringNotificationTimeInSeconds=e.expiringNotificationTimeInSeconds}load(e){let t=this._logger.create("load");if(e.access_token&&e.expires_in!==void 0){let r=e.expires_in;if(t.debug("access token present, remaining duration:",r),r>0){let n=r-this._expiringNotificationTimeInSeconds;n<=0&&(n=1),t.debug("registering expiring timer, raising in",n,"seconds"),this._expiringTimer.init(n)}else t.debug("canceling existing expiring timer because we're past expiration."),this._expiringTimer.cancel();let i=r+1;t.debug("registering expired timer, raising in",i,"seconds"),this._expiredTimer.init(i)}else this._expiringTimer.cancel(),this._expiredTimer.cancel()}unload(){this._logger.debug("unload: canceling existing access token timers"),this._expiringTimer.cancel(),this._expiredTimer.cancel()}addAccessTokenExpiring(e){return this._expiringTimer.addHandler(e)}removeAccessTokenExpiring(e){this._expiringTimer.removeHandler(e)}addAccessTokenExpired(e){return this._expiredTimer.addHandler(e)}removeAccessTokenExpired(e){this._expiredTimer.removeHandler(e)}};var V=class{constructor(e,t,r,i,n){this._callback=e;this._client_id=t;this._intervalInSeconds=i;this._stopOnError=n;this._logger=new u("CheckSessionIFrame");this._timer=null;this._session_state=null;this._message=e=>{e.origin===this._frame_origin&&e.source===this._frame.contentWindow&&(e.data==="error"?(this._logger.error("error message from check session op iframe"),this._stopOnError&&this.stop()):e.data==="changed"?(this._logger.debug("changed message from check session op iframe"),this.stop(),this._callback()):this._logger.debug(e.data+" message from check session op iframe"))};let s=new URL(r);this._frame_origin=s.origin,this._frame=window.document.createElement("iframe"),this._frame.style.visibility="hidden",this._frame.style.position="fixed",this._frame.style.left="-1000px",this._frame.style.top="0",this._frame.width="0",this._frame.height="0",this._frame.src=s.href}load(){return new Promise(e=>{this._frame.onload=()=>{e()},window.document.body.appendChild(this._frame),window.addEventListener("message",this._message,!1)})}start(e){if(this._session_state===e)return;this._logger.create("start"),this.stop(),this._session_state=e;let t=()=>{!this._frame.contentWindow||!this._session_state||this._frame.contentWindow.postMessage(this._client_id+" "+this._session_state,this._frame_origin)};t(),this._timer=setInterval(t,this._intervalInSeconds*1e3)}stop(){this._logger.create("stop"),this._session_state=null,this._timer&&(clearInterval(this._timer),this._timer=null)}};var j=class{constructor(){this._logger=new u("InMemoryWebStorage");this._data={}}clear(){this._logger.create("clear"),this._data={}}getItem(e){return this._logger.create(`getItem('${e}')`),this._data[e]}setItem(e,t){this._logger.create(`setItem('${e}')`),this._data[e]=t}removeItem(e){this._logger.create(`removeItem('${e}')`),delete this._data[e]}get length(){return Object.getOwnPropertyNames(this._data).length}key(e){return Object.getOwnPropertyNames(this._data)[e]}};var F=class{constructor(e=[],t=null,r={}){this._jwtHandler=t;this._extraHeaders=r;this._logger=new u("JsonService");this._contentTypes=[];this._contentTypes.push(...e,"application/json"),t&&this._contentTypes.push("application/jwt")}async fetchWithTimeout(e,t={}){let{timeoutInSeconds:r,...i}=t;if(!r)return await fetch(e,i);let n=new AbortController,s=setTimeout(()=>n.abort(),r*1e3);try{return await fetch(e,{...t,signal:n.signal})}catch(o){throw o instanceof DOMException&&o.name==="AbortError"?new q("Network timed out"):o}finally{clearTimeout(s)}}async getJson(e,{token:t,credentials:r}={}){let i=this._logger.create("getJson"),n={Accept:this._contentTypes.join(", ")};t&&(i.debug("token passed, setting Authorization header"),n.Authorization="Bearer "+t),this.appendExtraHeaders(n);let s;try{i.debug("url:",e),s=await this.fetchWithTimeout(e,{method:"GET",headers:n,credentials:r})}catch(d){throw i.error("Network Error"),d}i.debug("HTTP response received, status",s.status);let o=s.headers.get("Content-Type");if(o&&!this._contentTypes.find(d=>o.startsWith(d))&&i.throw(new Error(`Invalid response Content-Type: ${o!=null?o:"undefined"}, from URL: ${e}`)),s.ok&&this._jwtHandler&&(o!=null&&o.startsWith("application/jwt")))return await this._jwtHandler(await s.text());let c;try{c=await s.json()}catch(d){throw i.error("Error parsing JSON response",d),s.ok?d:new Error(`${s.statusText} (${s.status})`)}if(!s.ok)throw i.error("Error from server:",c),c.error?new E(c):new Error(`${s.statusText} (${s.status}): ${JSON.stringify(c)}`);return c}async postForm(e,{body:t,basicAuth:r,timeoutInSeconds:i,initCredentials:n}){let s=this._logger.create("postForm"),o={Accept:this._contentTypes.join(", "),"Content-Type":"application/x-www-form-urlencoded"};r!==void 0&&(o.Authorization="Basic "+r),this.appendExtraHeaders(o);let c;try{s.debug("url:",e),c=await this.fetchWithTimeout(e,{method:"POST",headers:o,body:t,timeoutInSeconds:i,credentials:n})}catch(p){throw s.error("Network error"),p}s.debug("HTTP response received, status",c.status);let d=c.headers.get("Content-Type");if(d&&!this._contentTypes.find(p=>d.startsWith(p)))throw new Error(`Invalid response Content-Type: ${d!=null?d:"undefined"}, from URL: ${e}`);let h=await c.text(),f={};if(h)try{f=JSON.parse(h)}catch(p){throw s.error("Error parsing JSON response",p),c.ok?p:new Error(`${c.statusText} (${c.status})`)}if(!c.ok)throw s.error("Error from server:",f),f.error?new E(f,t):new Error(`${c.statusText} (${c.status}): ${JSON.stringify(f)}`);return f}appendExtraHeaders(e){let t=this._logger.create("appendExtraHeaders"),r=Object.keys(this._extraHeaders),i=["authorization","accept","content-type"];r.length!==0&&r.forEach(n=>{if(i.includes(n.toLocaleLowerCase())){t.warn("Protected header could not be overridden",n,i);return}let s=typeof this._extraHeaders[n]=="function"?this._extraHeaders[n]():this._extraHeaders[n];s&&s!==""&&(e[n]=s)})}};var G=class{constructor(e){this._settings=e;this._logger=new u("MetadataService");this._signingKeys=null;this._metadata=null;this._metadataUrl=this._settings.metadataUrl,this._jsonService=new F(["application/jwk-set+json"],null,this._settings.extraHeaders),this._settings.signingKeys&&(this._logger.debug("using signingKeys from settings"),this._signingKeys=this._settings.signingKeys),this._settings.metadata&&(this._logger.debug("using metadata from settings"),this._metadata=this._settings.metadata),this._settings.fetchRequestCredentials&&(this._logger.debug("using fetchRequestCredentials from settings"),this._fetchRequestCredentials=this._settings.fetchRequestCredentials)}resetSigningKeys(){this._signingKeys=null}async getMetadata(){let e=this._logger.create("getMetadata");if(this._metadata)return e.debug("using cached values"),this._metadata;if(!this._metadataUrl)throw e.throw(new Error("No authority or metadataUrl configured on settings")),null;e.debug("getting metadata from",this._metadataUrl);let t=await this._jsonService.getJson(this._metadataUrl,{credentials:this._fetchRequestCredentials});return e.debug("merging remote JSON with seed metadata"),this._metadata=Object.assign({},this._settings.metadataSeed,t),this._metadata}getIssuer(){return this._getMetadataProperty("issuer")}getAuthorizationEndpoint(){return this._getMetadataProperty("authorization_endpoint")}getUserInfoEndpoint(){return this._getMetadataProperty("userinfo_endpoint")}getTokenEndpoint(e=!0){return this._getMetadataProperty("token_endpoint",e)}getCheckSessionIframe(){return this._getMetadataProperty("check_session_iframe",!0)}getEndSessionEndpoint(){return this._getMetadataProperty("end_session_endpoint",!0)}getRevocationEndpoint(e=!0){return this._getMetadataProperty("revocation_endpoint",e)}getKeysEndpoint(e=!0){return this._getMetadataProperty("jwks_uri",e)}async _getMetadataProperty(e,t=!1){let r=this._logger.create(`_getMetadataProperty('${e}')`),i=await this.getMetadata();if(r.debug("resolved"),i[e]===void 0){if(t===!0){r.warn("Metadata does not contain optional property");return}r.throw(new Error("Metadata does not contain property "+e))}return i[e]}async getSigningKeys(){let e=this._logger.create("getSigningKeys");if(this._signingKeys)return e.debug("returning signingKeys from cache"),this._signingKeys;let t=await this.getKeysEndpoint(!1);e.debug("got jwks_uri",t);let r=await this._jsonService.getJson(t);if(e.debug("got key set",r),!Array.isArray(r.keys))throw e.throw(new Error("Missing keys on keyset")),null;return this._signingKeys=r.keys,this._signingKeys}};var B=class{constructor({prefix:e="oidc.",store:t=localStorage}={}){this._logger=new u("WebStorageStateStore");this._store=t,this._prefix=e}async set(e,t){this._logger.create(`set('${e}')`),e=this._prefix+e,await this._store.setItem(e,t)}async get(e){return this._logger.create(`get('${e}')`),e=this._prefix+e,await this._store.getItem(e)}async remove(e){this._logger.create(`remove('${e}')`),e=this._prefix+e;let t=await this._store.getItem(e);return await this._store.removeItem(e),t}async getAllKeys(){this._logger.create("getAllKeys");let e=await this._store.length,t=[];for(let r=0;r<e;r++){let i=await this._store.key(r);i&&i.indexOf(this._prefix)===0&&t.push(i.substr(this._prefix.length))}return t}};var ht="code",ft="openid",mt="client_secret_post",_t="query",wt=60*15,St=60*5,W=class{constructor({authority:e,metadataUrl:t,metadata:r,signingKeys:i,metadataSeed:n,client_id:s,client_secret:o,response_type:c=ht,scope:d=ft,redirect_uri:h,post_logout_redirect_uri:f,client_authentication:p=mt,prompt:m,display:S,max_age:v,ui_locales:x,acr_values:a,resource:g,response_mode:w=_t,filterProtocolClaims:_=!0,loadUserInfo:y=!1,staleStateAgeInSeconds:b=wt,clockSkewInSeconds:P=St,userInfoJwtIssuer:R="OP",mergeClaims:I=!1,disablePKCE:H=!1,stateStore:L,refreshTokenCredentials:re,revokeTokenAdditionalContentTypes:Ie,fetchRequestCredentials:ie,refreshTokenAllowedScope:le,extraQueryParams:Ee={},extraTokenParams:et={},extraHeaders:tt={}}){if(this.authority=e,t?this.metadataUrl=t:(this.metadataUrl=e,e&&(this.metadataUrl.endsWith("/")||(this.metadataUrl+="/"),this.metadataUrl+=".well-known/openid-configuration")),this.metadata=r,this.metadataSeed=n,this.signingKeys=i,this.client_id=s,this.client_secret=o,this.response_type=c,this.scope=d,this.redirect_uri=h,this.post_logout_redirect_uri=f,this.client_authentication=p,this.prompt=m,this.display=S,this.max_age=v,this.ui_locales=x,this.acr_values=a,this.resource=g,this.response_mode=w,this.filterProtocolClaims=_!=null?_:!0,this.loadUserInfo=!!y,this.staleStateAgeInSeconds=b,this.clockSkewInSeconds=P,this.userInfoJwtIssuer=R,this.mergeClaims=!!I,this.disablePKCE=!!H,this.revokeTokenAdditionalContentTypes=Ie,ie&&re&&console.warn("Both fetchRequestCredentials and refreshTokenCredentials is set. Only fetchRequestCredentials will be used."),this.fetchRequestCredentials=ie||re||"same-origin",L)this.stateStore=L;else{let rt=typeof window!="undefined"?window.localStorage:new j;this.stateStore=new B({store:rt})}this.refreshTokenAllowedScope=le,this.extraQueryParams=Ee,this.extraTokenParams=et,this.extraHeaders=tt}};var _e=class{constructor(e,t){this._settings=e;this._metadataService=t;this._logger=new u("UserInfoService");this._getClaimsFromJwt=async e=>{let t=this._logger.create("_getClaimsFromJwt");try{let r=K.decode(e);return t.debug("JWT decoding successful"),r}catch(r){throw t.error("Error parsing JWT response"),r}};this._jsonService=new F(void 0,this._getClaimsFromJwt,this._settings.extraHeaders)}async getClaims(e){let t=this._logger.create("getClaims");e||this._logger.throw(new Error("No token passed"));let r=await this._metadataService.getUserInfoEndpoint();t.debug("got userinfo url",r);let i=await this._jsonService.getJson(r,{token:e,credentials:this._settings.fetchRequestCredentials});return t.debug("got claims",i),i}};var Y=class{constructor(e,t){this._settings=e;this._metadataService=t;this._logger=new u("TokenClient");this._jsonService=new F(this._settings.revokeTokenAdditionalContentTypes,null,this._settings.extraHeaders)}async exchangeCode({grant_type:e="authorization_code",redirect_uri:t=this._settings.redirect_uri,client_id:r=this._settings.client_id,client_secret:i=this._settings.client_secret,...n}){let s=this._logger.create("exchangeCode");r||s.throw(new Error("A client_id is required")),t||s.throw(new Error("A redirect_uri is required")),n.code||s.throw(new Error("A code is required"));let o=new URLSearchParams({grant_type:e,redirect_uri:t});for(let[f,p]of Object.entries(n))p!=null&&o.set(f,p);let c;switch(this._settings.client_authentication){case"client_secret_basic":if(!i)throw s.throw(new Error("A client_secret is required")),null;c=C.generateBasicAuth(r,i);break;case"client_secret_post":o.append("client_id",r),i&&o.append("client_secret",i);break}let d=await this._metadataService.getTokenEndpoint(!1);s.debug("got token endpoint");let h=await this._jsonService.postForm(d,{body:o,basicAuth:c,initCredentials:this._settings.fetchRequestCredentials});return s.debug("got response"),h}async exchangeCredentials({grant_type:e="password",client_id:t=this._settings.client_id,client_secret:r=this._settings.client_secret,scope:i=this._settings.scope,...n}){let s=this._logger.create("exchangeCredentials");t||s.throw(new Error("A client_id is required"));let o=new URLSearchParams({grant_type:e,scope:i});for(let[f,p]of Object.entries(n))p!=null&&o.set(f,p);let c;switch(this._settings.client_authentication){case"client_secret_basic":if(!r)throw s.throw(new Error("A client_secret is required")),null;c=C.generateBasicAuth(t,r);break;case"client_secret_post":o.append("client_id",t),r&&o.append("client_secret",r);break}let d=await this._metadataService.getTokenEndpoint(!1);s.debug("got token endpoint");let h=await this._jsonService.postForm(d,{body:o,basicAuth:c,initCredentials:this._settings.fetchRequestCredentials});return s.debug("got response"),h}async exchangeRefreshToken({grant_type:e="refresh_token",client_id:t=this._settings.client_id,client_secret:r=this._settings.client_secret,timeoutInSeconds:i,...n}){let s=this._logger.create("exchangeRefreshToken");t||s.throw(new Error("A client_id is required")),n.refresh_token||s.throw(new Error("A refresh_token is required"));let o=new URLSearchParams({grant_type:e});for(let[f,p]of Object.entries(n))Array.isArray(p)?p.forEach(m=>o.append(f,m)):p!=null&&o.set(f,p);let c;switch(this._settings.client_authentication){case"client_secret_basic":if(!r)throw s.throw(new Error("A client_secret is required")),null;c=C.generateBasicAuth(t,r);break;case"client_secret_post":o.append("client_id",t),r&&o.append("client_secret",r);break}let d=await this._metadataService.getTokenEndpoint(!1);s.debug("got token endpoint");let h=await this._jsonService.postForm(d,{body:o,basicAuth:c,timeoutInSeconds:i,initCredentials:this._settings.fetchRequestCredentials});return s.debug("got response"),h}async revoke(e){var n;let t=this._logger.create("revoke");e.token||t.throw(new Error("A token is required"));let r=await this._metadataService.getRevocationEndpoint(!1);t.debug(`got revocation endpoint, revoking ${(n=e.token_type_hint)!=null?n:"default token type"}`);let i=new URLSearchParams;for(let[s,o]of Object.entries(e))o!=null&&i.set(s,o);i.set("client_id",this._settings.client_id),this._settings.client_secret&&i.set("client_secret",this._settings.client_secret),await this._jsonService.postForm(r,{body:i}),t.debug("got response")}};var we=class{constructor(e,t,r){this._settings=e;this._metadataService=t;this._claimsService=r;this._logger=new u("ResponseValidator");this._userInfoService=new _e(this._settings,this._metadataService);this._tokenClient=new Y(this._settings,this._metadataService)}async validateSigninResponse(e,t){let r=this._logger.create("validateSigninResponse");this._processSigninState(e,t),r.debug("state processed"),await this._processCode(e,t),r.debug("code processed"),e.isOpenId&&this._validateIdTokenAttributes(e),r.debug("tokens validated"),await this._processClaims(e,t==null?void 0:t.skipUserInfo,e.isOpenId),r.debug("claims processed")}async validateCredentialsResponse(e,t){let r=this._logger.create("validateCredentialsResponse");e.isOpenId&&this._validateIdTokenAttributes(e),r.debug("tokens validated"),await this._processClaims(e,t,e.isOpenId),r.debug("claims processed")}async validateRefreshResponse(e,t){var n,s;let r=this._logger.create("validateRefreshResponse");e.userState=t.data,(n=e.session_state)!=null||(e.session_state=t.session_state),(s=e.scope)!=null||(e.scope=t.scope),e.isOpenId&&e.id_token&&(this._validateIdTokenAttributes(e,t.id_token),r.debug("ID Token validated")),e.id_token||(e.id_token=t.id_token,e.profile=t.profile);let i=e.isOpenId&&!!e.id_token;await this._processClaims(e,!1,i),r.debug("claims processed")}validateSignoutResponse(e,t){let r=this._logger.create("validateSignoutResponse");if(t.id!==e.state&&r.throw(new Error("State does not match")),r.debug("state validated"),e.userState=t.data,e.error)throw r.warn("Response was error",e.error),new E(e)}_processSigninState(e,t){var i;let r=this._logger.create("_processSigninState");if(t.id!==e.state&&r.throw(new Error("State does not match")),t.client_id||r.throw(new Error("No client_id on state")),t.authority||r.throw(new Error("No authority on state")),this._settings.authority!==t.authority&&r.throw(new Error("authority mismatch on settings vs. signin state")),this._settings.client_id&&this._settings.client_id!==t.client_id&&r.throw(new Error("client_id mismatch on settings vs. signin state")),r.debug("state validated"),e.userState=t.data,(i=e.scope)!=null||(e.scope=t.scope),e.error)throw r.warn("Response was error",e.error),new E(e);t.code_verifier&&!e.code&&r.throw(new Error("Expected code in response"))}async _processClaims(e,t=!1,r=!0){let i=this._logger.create("_processClaims");if(e.profile=this._claimsService.filterProtocolClaims(e.profile),t||!this._settings.loadUserInfo||!e.access_token){i.debug("not loading user info");return}i.debug("loading user info");let n=await this._userInfoService.getClaims(e.access_token);i.debug("user info claims received from user info endpoint"),r&&n.sub!==e.profile.sub&&i.throw(new Error("subject from UserInfo response does not match subject in ID Token")),e.profile=this._claimsService.mergeClaims(e.profile,this._claimsService.filterProtocolClaims(n)),i.debug("user info claims received, updated profile:",e.profile)}async _processCode(e,t){let r=this._logger.create("_processCode");if(e.code){r.debug("Validating code");let i=await this._tokenClient.exchangeCode({client_id:t.client_id,client_secret:t.client_secret,code:e.code,redirect_uri:t.redirect_uri,code_verifier:t.code_verifier,...t.extraTokenParams});Object.assign(e,i)}else r.debug("No code to process")}_validateIdTokenAttributes(e,t){var n;let r=this._logger.create("_validateIdTokenAttributes");r.debug("decoding ID Token JWT");let i=K.decode((n=e.id_token)!=null?n:"");if(i.sub||r.throw(new Error("ID Token is missing a subject claim")),t){let s=K.decode(t);i.sub!==s.sub&&r.throw(new Error("sub in id_token does not match current sub")),i.auth_time&&i.auth_time!==s.auth_time&&r.throw(new Error("auth_time in id_token does not match original auth_time")),i.azp&&i.azp!==s.azp&&r.throw(new Error("azp in id_token does not match original azp")),!i.azp&&s.azp&&r.throw(new Error("azp not in id_token, but present in original id_token"))}e.profile=i}};var T=class{constructor(e){this.id=e.id||C.generateUUIDv4(),this.data=e.data,e.created&&e.created>0?this.created=e.created:this.created=k.getEpochTime(),this.request_type=e.request_type}toStorageString(){return new u("State").create("toStorageString"),JSON.stringify({id:this.id,data:this.data,created:this.created,request_type:this.request_type})}static fromStorageString(e){return u.createStatic("State","fromStorageString"),new T(JSON.parse(e))}static async clearStaleState(e,t){let r=u.createStatic("State","clearStaleState"),i=k.getEpochTime()-t,n=await e.getAllKeys();r.debug("got keys",n);for(let s=0;s<n.length;s++){let o=n[s],c=await e.get(o),d=!1;if(c)try{let h=T.fromStorageString(c);r.debug("got item from key:",o,h.created),h.created<=i&&(d=!0)}catch(h){r.error("Error parsing state for key:",o,h),d=!0}else r.debug("no item in storage for key:",o),d=!0;d&&(r.debug("removed item for key:",o),e.remove(o))}}};var M=class extends T{constructor(t){super(t);t.code_verifier===!0?this.code_verifier=C.generateCodeVerifier():t.code_verifier&&(this.code_verifier=t.code_verifier),this.code_verifier&&(this.code_challenge=C.generateCodeChallenge(this.code_verifier)),this.authority=t.authority,this.client_id=t.client_id,this.redirect_uri=t.redirect_uri,this.scope=t.scope,this.client_secret=t.client_secret,this.extraTokenParams=t.extraTokenParams,this.response_mode=t.response_mode,this.skipUserInfo=t.skipUserInfo}toStorageString(){return new u("SigninState").create("toStorageString"),JSON.stringify({id:this.id,data:this.data,created:this.created,request_type:this.request_type,code_verifier:this.code_verifier,authority:this.authority,client_id:this.client_id,redirect_uri:this.redirect_uri,scope:this.scope,client_secret:this.client_secret,extraTokenParams:this.extraTokenParams,response_mode:this.response_mode,skipUserInfo:this.skipUserInfo})}static fromStorageString(t){u.createStatic("SigninState","fromStorageString");let r=JSON.parse(t);return new M(r)}};var Se=class{constructor({url:e,authority:t,client_id:r,redirect_uri:i,response_type:n,scope:s,state_data:o,response_mode:c,request_type:d,client_secret:h,nonce:f,resource:p,skipUserInfo:m,extraQueryParams:S,extraTokenParams:v,disablePKCE:x,...a}){this._logger=new u("SigninRequest");if(!e)throw this._logger.error("ctor: No url passed"),new Error("url");if(!r)throw this._logger.error("ctor: No client_id passed"),new Error("client_id");if(!i)throw this._logger.error("ctor: No redirect_uri passed"),new Error("redirect_uri");if(!n)throw this._logger.error("ctor: No response_type passed"),new Error("response_type");if(!s)throw this._logger.error("ctor: No scope passed"),new Error("scope");if(!t)throw this._logger.error("ctor: No authority passed"),new Error("authority");this.state=new M({data:o,request_type:d,code_verifier:!x,client_id:r,authority:t,redirect_uri:i,response_mode:c,client_secret:h,scope:s,extraTokenParams:v,skipUserInfo:m});let g=new URL(e);g.searchParams.append("client_id",r),g.searchParams.append("redirect_uri",i),g.searchParams.append("response_type",n),g.searchParams.append("scope",s),f&&g.searchParams.append("nonce",f),g.searchParams.append("state",this.state.id),this.state.code_challenge&&(g.searchParams.append("code_challenge",this.state.code_challenge),g.searchParams.append("code_challenge_method","S256")),p&&(Array.isArray(p)?p:[p]).forEach(_=>g.searchParams.append("resource",_));for(let[w,_]of Object.entries({response_mode:c,...a,...S}))_!=null&&g.searchParams.append(w,_.toString());this.url=g.href}};var bt="openid",J=class{constructor(e){this.access_token="";this.token_type="";this.profile={};this.state=e.get("state"),this.session_state=e.get("session_state"),this.error=e.get("error"),this.error_description=e.get("error_description"),this.error_uri=e.get("error_uri"),this.code=e.get("code")}get expires_in(){if(this.expires_at!==void 0)return this.expires_at-k.getEpochTime()}set expires_in(e){typeof e=="string"&&(e=Number(e)),e!==void 0&&e>=0&&(this.expires_at=Math.floor(e)+k.getEpochTime())}get isOpenId(){var e;return((e=this.scope)==null?void 0:e.split(" ").includes(bt))||!!this.id_token}};var be=class{constructor({url:e,state_data:t,id_token_hint:r,post_logout_redirect_uri:i,extraQueryParams:n,request_type:s,client_id:o}){this._logger=new u("SignoutRequest");if(!e)throw this._logger.error("ctor: No url passed"),new Error("url");let c=new URL(e);r&&c.searchParams.append("id_token_hint",r),o&&c.searchParams.append("client_id",o),i&&(c.searchParams.append("post_logout_redirect_uri",i),t&&(this.state=new T({data:t,request_type:s}),c.searchParams.append("state",this.state.id)));for(let[d,h]of Object.entries({...n}))h!=null&&c.searchParams.append(d,h.toString());this.url=c.href}};var X=class{constructor(e){this.state=e.get("state"),this.error=e.get("error"),this.error_description=e.get("error_description"),this.error_uri=e.get("error_uri")}};var yt=["nbf","jti","auth_time","nonce","acr","amr","azp","at_hash"],vt=["sub","iss","aud","exp","iat"],ye=class{constructor(e){this._settings=e;this._logger=new u("ClaimsService")}filterProtocolClaims(e){let t={...e};if(this._settings.filterProtocolClaims){let r;Array.isArray(this._settings.filterProtocolClaims)?r=this._settings.filterProtocolClaims:r=yt;for(let i of r)vt.includes(i)||delete t[i]}return t}mergeClaims(e,t){let r={...e};for(let[i,n]of Object.entries(t))for(let s of Array.isArray(n)?n:[n]){let o=r[i];o?Array.isArray(o)?o.includes(s)||o.push(s):r[i]!==s&&(typeof s=="object"&&this._settings.mergeClaims?r[i]=this.mergeClaims(o,s):r[i]=[o,s]):r[i]=s}return r}};var ae=class{constructor(e,t){this._logger=new u("OidcClient");this.settings=e instanceof W?e:new W(e),this.metadataService=t!=null?t:new G(this.settings),this._claimsService=new ye(this.settings),this._validator=new we(this.settings,this.metadataService,this._claimsService),this._tokenClient=new Y(this.settings,this.metadataService)}async createSigninRequest({state:e,request:t,request_uri:r,request_type:i,id_token_hint:n,login_hint:s,skipUserInfo:o,nonce:c,response_type:d=this.settings.response_type,scope:h=this.settings.scope,redirect_uri:f=this.settings.redirect_uri,prompt:p=this.settings.prompt,display:m=this.settings.display,max_age:S=this.settings.max_age,ui_locales:v=this.settings.ui_locales,acr_values:x=this.settings.acr_values,resource:a=this.settings.resource,response_mode:g=this.settings.response_mode,extraQueryParams:w=this.settings.extraQueryParams,extraTokenParams:_=this.settings.extraTokenParams}){let y=this._logger.create("createSigninRequest");if(d!=="code")throw new Error("Only the Authorization Code flow (with PKCE) is supported");let b=await this.metadataService.getAuthorizationEndpoint();y.debug("Received authorization endpoint",b);let P=new Se({url:b,authority:this.settings.authority,client_id:this.settings.client_id,redirect_uri:f,response_type:d,scope:h,state_data:e,prompt:p,display:m,max_age:S,ui_locales:v,id_token_hint:n,login_hint:s,acr_values:x,resource:a,request:t,request_uri:r,extraQueryParams:w,extraTokenParams:_,request_type:i,response_mode:g,client_secret:this.settings.client_secret,skipUserInfo:o,nonce:c,disablePKCE:this.settings.disablePKCE});await this.clearStaleState();let R=P.state;return await this.settings.stateStore.set(R.id,R.toStorageString()),P}async readSigninResponseState(e,t=!1){let r=this._logger.create("readSigninResponseState"),i=new J($.readParams(e,this.settings.response_mode));if(!i.state)throw r.throw(new Error("No state in response")),null;let n=await this.settings.stateStore[t?"remove":"get"](i.state);if(!n)throw r.throw(new Error("No matching state found in storage")),null;return{state:M.fromStorageString(n),response:i}}async processSigninResponse(e){let t=this._logger.create("processSigninResponse"),{state:r,response:i}=await this.readSigninResponseState(e,!0);return t.debug("received state from storage; validating response"),await this._validator.validateSigninResponse(i,r),i}async processResourceOwnerPasswordCredentials({username:e,password:t,skipUserInfo:r=!1,extraTokenParams:i={}}){let n=await this._tokenClient.exchangeCredentials({username:e,password:t,...i}),s=new J(new URLSearchParams);return Object.assign(s,n),await this._validator.validateCredentialsResponse(s,r),s}async useRefreshToken({state:e,timeoutInSeconds:t}){var o;let r=this._logger.create("useRefreshToken"),i;if(this.settings.refreshTokenAllowedScope===void 0)i=e.scope;else{let c=this.settings.refreshTokenAllowedScope.split(" ");i=(((o=e.scope)==null?void 0:o.split(" "))||[]).filter(h=>c.includes(h)).join(" ")}let n=await this._tokenClient.exchangeRefreshToken({refresh_token:e.refresh_token,resource:e.resource,scope:i,timeoutInSeconds:t}),s=new J(new URLSearchParams);return Object.assign(s,n),r.debug("validating response",s),await this._validator.validateRefreshResponse(s,{...e,scope:i}),s}async createSignoutRequest({state:e,id_token_hint:t,client_id:r,request_type:i,post_logout_redirect_uri:n=this.settings.post_logout_redirect_uri,extraQueryParams:s=this.settings.extraQueryParams}={}){let o=this._logger.create("createSignoutRequest"),c=await this.metadataService.getEndSessionEndpoint();if(!c)throw o.throw(new Error("No end session endpoint")),null;o.debug("Received end session endpoint",c),!r&&n&&!t&&(r=this.settings.client_id);let d=new be({url:c,id_token_hint:t,client_id:r,post_logout_redirect_uri:n,state_data:e,extraQueryParams:s,request_type:i});await this.clearStaleState();let h=d.state;return h&&(o.debug("Signout request has state to persist"),await this.settings.stateStore.set(h.id,h.toStorageString())),d}async readSignoutResponseState(e,t=!1){let r=this._logger.create("readSignoutResponseState"),i=new X($.readParams(e,this.settings.response_mode));if(!i.state){if(r.debug("No state in response"),i.error)throw r.warn("Response was error:",i.error),new E(i);return{state:void 0,response:i}}let n=await this.settings.stateStore[t?"remove":"get"](i.state);if(!n)throw r.throw(new Error("No matching state found in storage")),null;return{state:T.fromStorageString(n),response:i}}async processSignoutResponse(e){let t=this._logger.create("processSignoutResponse"),{state:r,response:i}=await this.readSignoutResponseState(e,!0);return r?(t.debug("Received state from storage; validating response"),this._validator.validateSignoutResponse(i,r)):t.debug("No state from storage; skipping response validation"),i}clearStaleState(){return this._logger.create("clearStaleState"),T.clearStaleState(this.settings.stateStore,this.settings.staleStateAgeInSeconds)}async revokeToken(e,t){return this._logger.create("revokeToken"),await this._tokenClient.revoke({token:e,token_type_hint:t})}};var Z=class{constructor(e){this._userManager=e;this._logger=new u("SessionMonitor");this._start=async e=>{let t=e.session_state;if(!t)return;let r=this._logger.create("_start");if(e.profile?(this._sub=e.profile.sub,this._sid=e.profile.sid,r.debug("session_state",t,", sub",this._sub)):(this._sub=void 0,this._sid=void 0,r.debug("session_state",t,", anonymous user")),this._checkSessionIFrame){this._checkSessionIFrame.start(t);return}try{let i=await this._userManager.metadataService.getCheckSessionIframe();if(i){r.debug("initializing check session iframe");let n=this._userManager.settings.client_id,s=this._userManager.settings.checkSessionIntervalInSeconds,o=this._userManager.settings.stopCheckSessionOnError,c=new V(this._callback,n,i,s,o);await c.load(),this._checkSessionIFrame=c,c.start(t)}else r.warn("no check session iframe found in the metadata")}catch(i){r.error("Error from getCheckSessionIframe:",i instanceof Error?i.message:i)}};this._stop=()=>{let e=this._logger.create("_stop");if(this._sub=void 0,this._sid=void 0,this._checkSessionIFrame&&this._checkSessionIFrame.stop(),this._userManager.settings.monitorAnonymousSession){let t=setInterval(async()=>{clearInterval(t);try{let r=await this._userManager.querySessionStatus();if(r){let i={session_state:r.session_state,profile:r.sub&&r.sid?{sub:r.sub,sid:r.sid}:null};this._start(i)}}catch(r){e.error("error from querySessionStatus",r instanceof Error?r.message:r)}},1e3)}};this._callback=async()=>{let e=this._logger.create("_callback");try{let t=await this._userManager.querySessionStatus(),r=!0;t&&this._checkSessionIFrame?t.sub===this._sub?(r=!1,this._checkSessionIFrame.start(t.session_state),t.sid===this._sid?e.debug("same sub still logged in at OP, restarting check session iframe; session_state",t.session_state):(e.debug("same sub still logged in at OP, session state has changed, restarting check session iframe; session_state",t.session_state),this._userManager.events._raiseUserSessionChanged())):e.debug("different subject signed into OP",t.sub):e.debug("subject no longer signed into OP"),r?this._sub?this._userManager.events._raiseUserSignedOut():this._userManager.events._raiseUserSignedIn():e.debug("no change in session detected, no event to raise")}catch(t){this._sub&&(e.debug("Error calling queryCurrentSigninSession; raising signed out event",t),this._userManager.events._raiseUserSignedOut())}};e||this._logger.throw(new Error("No user manager passed")),this._userManager.events.addUserLoaded(this._start),this._userManager.events.addUserUnloaded(this._stop),this._init().catch(t=>{this._logger.error(t)})}async _init(){this._logger.create("_init");let e=await this._userManager.getUser();if(e)this._start(e);else if(this._userManager.settings.monitorAnonymousSession){let t=await this._userManager.querySessionStatus();if(t){let r={session_state:t.session_state,profile:t.sub&&t.sid?{sub:t.sub,sid:t.sid}:null};this._start(r)}}}};var N=class{constructor(e){var t;this.id_token=e.id_token,this.session_state=(t=e.session_state)!=null?t:null,this.access_token=e.access_token,this.refresh_token=e.refresh_token,this.token_type=e.token_type,this.scope=e.scope,this.profile=e.profile,this.expires_at=e.expires_at,this.state=e.userState}get expires_in(){if(this.expires_at!==void 0)return this.expires_at-k.getEpochTime()}set expires_in(e){e!==void 0&&(this.expires_at=Math.floor(e)+k.getEpochTime())}get expired(){let e=this.expires_in;if(e!==void 0)return e<=0}get scopes(){var e,t;return(t=(e=this.scope)==null?void 0:e.split(" "))!=null?t:[]}toStorageString(){return new u("User").create("toStorageString"),JSON.stringify({id_token:this.id_token,session_state:this.session_state,access_token:this.access_token,refresh_token:this.refresh_token,token_type:this.token_type,scope:this.scope,profile:this.profile,expires_at:this.expires_at})}static fromStorageString(e){return u.createStatic("User","fromStorageString"),new N(JSON.parse(e))}};var Ye="oidc-client",ee=class{constructor(){this._abort=new U("Window navigation aborted");this._disposeHandlers=new Set;this._window=null}async navigate(e){let t=this._logger.create("navigate");if(!this._window)throw new Error("Attempted to navigate on a disposed window");t.debug("setting URL in window"),this._window.location.replace(e.url);let{url:r,keepOpen:i}=await new Promise((n,s)=>{let o=c=>{var f;let d=c.data,h=(f=e.scriptOrigin)!=null?f:window.location.origin;if(!(c.origin!==h||(d==null?void 0:d.source)!==Ye)){try{let p=$.readParams(d.url,e.response_mode).get("state");if(p||t.warn("no state found in response url"),c.source!==this._window&&p!==e.state)return}catch{this._dispose(),s(new Error("Invalid response from window"))}n(d)}};window.addEventListener("message",o,!1),this._disposeHandlers.add(()=>window.removeEventListener("message",o,!1)),this._disposeHandlers.add(this._abort.addHandler(c=>{this._dispose(),s(c)}))});return t.debug("got response from window"),this._dispose(),i||this.close(),{url:r}}_dispose(){this._logger.create("_dispose");for(let e of this._disposeHandlers)e();this._disposeHandlers.clear()}static _notifyParent(e,t,r=!1,i=window.location.origin){e.postMessage({source:Ye,url:t,keepOpen:r},i)}};var Ae={location:!1,toolbar:!1,height:640},Oe="_blank",kt=60,xt=2,qe=10,te=class extends W{constructor(t){let{popup_redirect_uri:r=t.redirect_uri,popup_post_logout_redirect_uri:i=t.post_logout_redirect_uri,popupWindowFeatures:n=Ae,popupWindowTarget:s=Oe,redirectMethod:o="assign",redirectTarget:c="self",iframeNotifyParentOrigin:d=t.iframeNotifyParentOrigin,iframeScriptOrigin:h=t.iframeScriptOrigin,silent_redirect_uri:f=t.redirect_uri,silentRequestTimeoutInSeconds:p=qe,automaticSilentRenew:m=!0,validateSubOnSilentRenew:S=!0,includeIdTokenInSilentRenew:v=!1,monitorSession:x=!1,monitorAnonymousSession:a=!1,checkSessionIntervalInSeconds:g=xt,query_status_response_type:w="code",stopCheckSessionOnError:_=!0,revokeTokenTypes:y=["access_token","refresh_token"],revokeTokensOnSignout:b=!1,includeIdTokenInSilentSignout:P=!1,accessTokenExpiringNotificationTimeInSeconds:R=kt,userStore:I}=t;super(t);if(this.popup_redirect_uri=r,this.popup_post_logout_redirect_uri=i,this.popupWindowFeatures=n,this.popupWindowTarget=s,this.redirectMethod=o,this.redirectTarget=c,this.iframeNotifyParentOrigin=d,this.iframeScriptOrigin=h,this.silent_redirect_uri=f,this.silentRequestTimeoutInSeconds=p,this.automaticSilentRenew=m,this.validateSubOnSilentRenew=S,this.includeIdTokenInSilentRenew=v,this.monitorSession=x,this.monitorAnonymousSession=a,this.checkSessionIntervalInSeconds=g,this.stopCheckSessionOnError=_,this.query_status_response_type=w,this.revokeTokenTypes=y,this.revokeTokensOnSignout=b,this.includeIdTokenInSilentSignout=P,this.accessTokenExpiringNotificationTimeInSeconds=R,I)this.userStore=I;else{let H=typeof window!="undefined"?window.sessionStorage:new j;this.userStore=new B({store:H})}}};var z=class extends ee{constructor({silentRequestTimeoutInSeconds:t=qe}){super();this._logger=new u("IFrameWindow");this._timeoutInSeconds=t,this._frame=z.createHiddenIframe(),this._window=this._frame.contentWindow}static createHiddenIframe(){let t=window.document.createElement("iframe");return t.style.visibility="hidden",t.style.position="fixed",t.style.left="-1000px",t.style.top="0",t.width="0",t.height="0",window.document.body.appendChild(t),t}async navigate(t){this._logger.debug("navigate: Using timeout of:",this._timeoutInSeconds);let r=setTimeout(()=>this._abort.raise(new q("IFrame timed out without a response")),this._timeoutInSeconds*1e3);return this._disposeHandlers.add(()=>clearTimeout(r)),await super.navigate(t)}close(){var t;this._frame&&(this._frame.parentNode&&(this._frame.addEventListener("load",r=>{var n;let i=r.target;(n=i.parentNode)==null||n.removeChild(i),this._abort.raise(new Error("IFrame removed from DOM"))},!0),(t=this._frame.contentWindow)==null||t.location.replace("about:blank")),this._frame=null),this._window=null}static notifyParent(t,r){return super._notifyParent(window.parent,t,!1,r)}};var ve=class{constructor(e){this._settings=e;this._logger=new u("IFrameNavigator")}async prepare({silentRequestTimeoutInSeconds:e=this._settings.silentRequestTimeoutInSeconds}){return new z({silentRequestTimeoutInSeconds:e})}async callback(e){this._logger.create("callback"),z.notifyParent(e,this._settings.iframeNotifyParentOrigin)}};var Rt=500,ce=class extends ee{constructor({popupWindowTarget:t=Oe,popupWindowFeatures:r={}}){super();this._logger=new u("PopupWindow");let i=oe.center({...Ae,...r});this._window=window.open(void 0,t,oe.serialize(i))}async navigate(t){var i;(i=this._window)==null||i.focus();let r=setInterval(()=>{(!this._window||this._window.closed)&&this._abort.raise(new Error("Popup closed by user"))},Rt);return this._disposeHandlers.add(()=>clearInterval(r)),await super.navigate(t)}close(){this._window&&(this._window.closed||(this._window.close(),this._abort.raise(new Error("Popup closed")))),this._window=null}static notifyOpener(t,r){if(!window.opener)throw new Error("No window.opener. Can't complete notification.");return super._notifyParent(window.opener,t,r)}};var ke=class{constructor(e){this._settings=e;this._logger=new u("PopupNavigator")}async prepare({popupWindowFeatures:e=this._settings.popupWindowFeatures,popupWindowTarget:t=this._settings.popupWindowTarget}){return new ce({popupWindowFeatures:e,popupWindowTarget:t})}async callback(e,t=!1){this._logger.create("callback"),ce.notifyOpener(e,t)}};var xe=class{constructor(e){this._settings=e;this._logger=new u("RedirectNavigator")}async prepare({redirectMethod:e=this._settings.redirectMethod,redirectTarget:t=this._settings.redirectTarget}){var s;this._logger.create("prepare");let r=window.self;t==="top"&&(r=(s=window.top)!=null?s:window.self);let i=r.location[e].bind(r.location),n;return{navigate:async o=>{this._logger.create("navigate");let c=new Promise((d,h)=>{n=h});return i(o.url),await c},close:()=>{this._logger.create("close"),n==null||n(new Error("Redirect aborted")),r.stop()}}}};var Re=class extends Q{constructor(t){super({expiringNotificationTimeInSeconds:t.accessTokenExpiringNotificationTimeInSeconds});this._logger=new u("UserManagerEvents");this._userLoaded=new U("User loaded");this._userUnloaded=new U("User unloaded");this._silentRenewError=new U("Silent renew error");this._userSignedIn=new U("User signed in");this._userSignedOut=new U("User signed out");this._userSessionChanged=new U("User session changed")}load(t,r=!0){super.load(t),r&&this._userLoaded.raise(t)}unload(){super.unload(),this._userUnloaded.raise()}addUserLoaded(t){return this._userLoaded.addHandler(t)}removeUserLoaded(t){return this._userLoaded.removeHandler(t)}addUserUnloaded(t){return this._userUnloaded.addHandler(t)}removeUserUnloaded(t){return this._userUnloaded.removeHandler(t)}addSilentRenewError(t){return this._silentRenewError.addHandler(t)}removeSilentRenewError(t){return this._silentRenewError.removeHandler(t)}_raiseSilentRenewError(t){this._silentRenewError.raise(t)}addUserSignedIn(t){return this._userSignedIn.addHandler(t)}removeUserSignedIn(t){this._userSignedIn.removeHandler(t)}_raiseUserSignedIn(){this._userSignedIn.raise()}addUserSignedOut(t){return this._userSignedOut.addHandler(t)}removeUserSignedOut(t){this._userSignedOut.removeHandler(t)}_raiseUserSignedOut(){this._userSignedOut.raise()}addUserSessionChanged(t){return this._userSessionChanged.addHandler(t)}removeUserSessionChanged(t){this._userSessionChanged.removeHandler(t)}_raiseUserSessionChanged(){this._userSessionChanged.raise()}};var Pe=class{constructor(e){this._userManager=e;this._logger=new u("SilentRenewService");this._isStarted=!1;this._retryTimer=new k("Retry Silent Renew");this._tokenExpiring=async()=>{let e=this._logger.create("_tokenExpiring");try{await this._userManager.signinSilent(),e.debug("silent token renewal successful")}catch(t){if(t instanceof q){e.warn("ErrorTimeout from signinSilent:",t,"retry in 5s"),this._retryTimer.init(5);return}e.error("Error from signinSilent:",t),this._userManager.events._raiseSilentRenewError(t)}}}async start(){let e=this._logger.create("start");if(!this._isStarted){this._isStarted=!0,this._userManager.events.addAccessTokenExpiring(this._tokenExpiring),this._retryTimer.addHandler(this._tokenExpiring);try{await this._userManager.getUser()}catch(t){e.error("getUser error",t)}}}stop(){this._isStarted&&(this._retryTimer.cancel(),this._retryTimer.removeHandler(this._tokenExpiring),this._userManager.events.removeAccessTokenExpiring(this._tokenExpiring),this._isStarted=!1)}};var Ce=class{constructor(e,t){this.refresh_token=e.refresh_token,this.id_token=e.id_token,this.session_state=e.session_state,this.scope=e.scope,this.profile=e.profile,this.resource=t,this.data=e.state}};var Me=class{constructor(e){this._logger=new u("UserManager");this.settings=new te(e),this._client=new ae(e),this._redirectNavigator=new xe(this.settings),this._popupNavigator=new ke(this.settings),this._iframeNavigator=new ve(this.settings),this._events=new Re(this.settings),this._silentRenewService=new Pe(this),this.settings.automaticSilentRenew&&this.startSilentRenew(),this._sessionMonitor=null,this.settings.monitorSession&&(this._sessionMonitor=new Z(this))}get events(){return this._events}get metadataService(){return this._client.metadataService}async getUser(){let e=this._logger.create("getUser"),t=await this._loadUser();return t?(e.info("user loaded"),this._events.load(t,!1),t):(e.info("user not found in storage"),null)}async removeUser(){let e=this._logger.create("removeUser");await this.storeUser(null),e.info("user removed from storage"),this._events.unload()}async signinRedirect(e={}){this._logger.create("signinRedirect");let{redirectMethod:t,...r}=e,i=await this._redirectNavigator.prepare({redirectMethod:t});await this._signinStart({request_type:"si:r",...r},i)}async signinRedirectCallback(e=window.location.href){let t=this._logger.create("signinRedirectCallback"),r=await this._signinEnd(e);return r.profile&&r.profile.sub?t.info("success, signed in subject",r.profile.sub):t.info("no subject"),r}async signinResourceOwnerCredentials({username:e,password:t,skipUserInfo:r=!1}){let i=this._logger.create("signinResourceOwnerCredential"),n=await this._client.processResourceOwnerPasswordCredentials({username:e,password:t,skipUserInfo:r,extraTokenParams:this.settings.extraTokenParams});i.debug("got signin response");let s=await this._buildUser(n);return s.profile&&s.profile.sub?i.info("success, signed in subject",s.profile.sub):i.info("no subject"),s}async signinPopup(e={}){let t=this._logger.create("signinPopup"),{popupWindowFeatures:r,popupWindowTarget:i,...n}=e,s=this.settings.popup_redirect_uri;s||t.throw(new Error("No popup_redirect_uri configured"));let o=await this._popupNavigator.prepare({popupWindowFeatures:r,popupWindowTarget:i}),c=await this._signin({request_type:"si:p",redirect_uri:s,display:"popup",...n},o);return c&&(c.profile&&c.profile.sub?t.info("success, signed in subject",c.profile.sub):t.info("no subject")),c}async signinPopupCallback(e=window.location.href,t=!1){let r=this._logger.create("signinPopupCallback");await this._popupNavigator.callback(e,t),r.info("success")}async signinSilent(e={}){var h;let t=this._logger.create("signinSilent"),{silentRequestTimeoutInSeconds:r,resource:i,...n}=e,s=await this._loadUser();if(s!=null&&s.refresh_token){t.debug("using refresh token");let f=new Ce(s,i);return await this._useRefreshToken(f)}let o=this.settings.silent_redirect_uri;o||t.throw(new Error("No silent_redirect_uri configured"));let c;s&&this.settings.validateSubOnSilentRenew&&(t.debug("subject prior to silent renew:",s.profile.sub),c=s.profile.sub);let d=await this._iframeNavigator.prepare({silentRequestTimeoutInSeconds:r});return s=await this._signin({request_type:"si:s",redirect_uri:o,prompt:"none",id_token_hint:this.settings.includeIdTokenInSilentRenew?s==null?void 0:s.id_token:void 0,...n},d,c),s&&((h=s.profile)!=null&&h.sub?t.info("success, signed in subject",s.profile.sub):t.info("no subject")),s}async _useRefreshToken(e){let t=await this._client.useRefreshToken({state:e,timeoutInSeconds:this.settings.silentRequestTimeoutInSeconds}),r=new N({...e,...t});return await this.storeUser(r),this._events.load(r),r}async signinSilentCallback(e=window.location.href){let t=this._logger.create("signinSilentCallback");await this._iframeNavigator.callback(e),t.info("success")}async signinCallback(e=window.location.href){let{state:t}=await this._client.readSigninResponseState(e);switch(t.request_type){case"si:r":return await this.signinRedirectCallback(e);case"si:p":return await this.signinPopupCallback(e);case"si:s":return await this.signinSilentCallback(e);default:throw new Error("invalid response_type in state")}}async signoutCallback(e=window.location.href,t=!1){let{state:r}=await this._client.readSignoutResponseState(e);if(r)switch(r.request_type){case"so:r":await this.signoutRedirectCallback(e);break;case"so:p":await this.signoutPopupCallback(e,t);break;case"so:s":await this.signoutSilentCallback(e);break;default:throw new Error("invalid response_type in state")}}async querySessionStatus(e={}){let t=this._logger.create("querySessionStatus"),{silentRequestTimeoutInSeconds:r,...i}=e,n=this.settings.silent_redirect_uri;n||t.throw(new Error("No silent_redirect_uri configured"));let s=await this._loadUser(),o=await this._iframeNavigator.prepare({silentRequestTimeoutInSeconds:r}),c=await this._signinStart({request_type:"si:s",redirect_uri:n,prompt:"none",id_token_hint:this.settings.includeIdTokenInSilentRenew?s==null?void 0:s.id_token:void 0,response_type:this.settings.query_status_response_type,scope:"openid",skipUserInfo:!0,...i},o);try{let d=await this._client.processSigninResponse(c.url);return t.debug("got signin response"),d.session_state&&d.profile.sub?(t.info("success for subject",d.profile.sub),{session_state:d.session_state,sub:d.profile.sub,sid:d.profile.sid}):(t.info("success, user not authenticated"),null)}catch(d){if(this.settings.monitorAnonymousSession&&d instanceof E)switch(d.error){case"login_required":case"consent_required":case"interaction_required":case"account_selection_required":return t.info("success for anonymous user"),{session_state:d.session_state}}throw d}}async _signin(e,t,r){let i=await this._signinStart(e,t);return await this._signinEnd(i.url,r)}async _signinStart(e,t){let r=this._logger.create("_signinStart");try{let i=await this._client.createSigninRequest(e);return r.debug("got signin request"),await t.navigate({url:i.url,state:i.state.id,response_mode:i.state.response_mode,scriptOrigin:this.settings.iframeScriptOrigin})}catch(i){throw r.debug("error after preparing navigator, closing navigator window"),t.close(),i}}async _signinEnd(e,t){let r=this._logger.create("_signinEnd"),i=await this._client.processSigninResponse(e);return r.debug("got signin response"),await this._buildUser(i,t)}async _buildUser(e,t){let r=this._logger.create("_buildUser"),i=new N(e);if(t){if(t!==i.profile.sub)throw r.debug("current user does not match user returned from signin. sub from signin:",i.profile.sub),new E({...e,error:"login_required"});r.debug("current user matches user returned from signin")}return await this.storeUser(i),r.debug("user stored"),this._events.load(i),i}async signoutRedirect(e={}){let t=this._logger.create("signoutRedirect"),{redirectMethod:r,...i}=e,n=await this._redirectNavigator.prepare({redirectMethod:r});await this._signoutStart({request_type:"so:r",post_logout_redirect_uri:this.settings.post_logout_redirect_uri,...i},n),t.info("success")}async signoutRedirectCallback(e=window.location.href){let t=this._logger.create("signoutRedirectCallback"),r=await this._signoutEnd(e);return t.info("success"),r}async signoutPopup(e={}){let t=this._logger.create("signoutPopup"),{popupWindowFeatures:r,popupWindowTarget:i,...n}=e,s=this.settings.popup_post_logout_redirect_uri,o=await this._popupNavigator.prepare({popupWindowFeatures:r,popupWindowTarget:i});await this._signout({request_type:"so:p",post_logout_redirect_uri:s,state:s==null?void 0:{},...n},o),t.info("success")}async signoutPopupCallback(e=window.location.href,t=!1){let r=this._logger.create("signoutPopupCallback");await this._popupNavigator.callback(e,t),r.info("success")}async _signout(e,t){let r=await this._signoutStart(e,t);return await this._signoutEnd(r.url)}async _signoutStart(e={},t){var i;let r=this._logger.create("_signoutStart");try{let n=await this._loadUser();r.debug("loaded current user from storage"),this.settings.revokeTokensOnSignout&&await this._revokeInternal(n);let s=e.id_token_hint||n&&n.id_token;s&&(r.debug("setting id_token_hint in signout request"),e.id_token_hint=s),await this.removeUser(),r.debug("user removed, creating signout request");let o=await this._client.createSignoutRequest(e);return r.debug("got signout request"),await t.navigate({url:o.url,state:(i=o.state)==null?void 0:i.id})}catch(n){throw r.debug("error after preparing navigator, closing navigator window"),t.close(),n}}async _signoutEnd(e){let t=this._logger.create("_signoutEnd"),r=await this._client.processSignoutResponse(e);return t.debug("got signout response"),r}async signoutSilent(e={}){var c;let t=this._logger.create("signoutSilent"),{silentRequestTimeoutInSeconds:r,...i}=e,n=this.settings.includeIdTokenInSilentSignout?(c=await this._loadUser())==null?void 0:c.id_token:void 0,s=this.settings.popup_post_logout_redirect_uri,o=await this._iframeNavigator.prepare({silentRequestTimeoutInSeconds:r});await this._signout({request_type:"so:s",post_logout_redirect_uri:s,id_token_hint:n,...i},o),t.info("success")}async signoutSilentCallback(e=window.location.href){let t=this._logger.create("signoutSilentCallback");await this._iframeNavigator.callback(e),t.info("success")}async revokeTokens(e){let t=await this._loadUser();await this._revokeInternal(t,e)}async _revokeInternal(e,t=this.settings.revokeTokenTypes){let r=this._logger.create("_revokeInternal");if(!e)return;let i=t.filter(n=>typeof e[n]=="string");if(!i.length){r.debug("no need to revoke due to no token(s)");return}for(let n of i)await this._client.revokeToken(e[n],n),r.info(`${n} revoked successfully`),n!=="access_token"&&(e[n]=null);await this.storeUser(e),r.debug("user stored"),this._events.load(e)}startSilentRenew(){this._logger.create("startSilentRenew"),this._silentRenewService.start()}stopSilentRenew(){this._silentRenewService.stop()}get _userStoreKey(){return`user:${this.settings.authority}:${this.settings.client_id}`}async _loadUser(){let e=this._logger.create("_loadUser"),t=await this.settings.userStore.get(this._userStoreKey);return t?(e.debug("user storageString loaded"),N.fromStorageString(t)):(e.debug("no user storageString"),null)}async storeUser(e){let t=this._logger.create("storeUser");if(e){t.debug("storing user");let r=e.toStorageString();await this.settings.userStore.set(this._userStoreKey,r)}else this._logger.debug("removing user"),await this.settings.userStore.remove(this._userStoreKey)}async clearStaleState(){await this._client.clearStaleState()}};var Xe="2.2.5";var Ze=Xe;return lt(Ct);})();
(async function() {
/* global oidc angular */
if (window.location.origin !== 'https://missions.ingress.com') {
document.body.dataset.creatorPluginAvailable = true;
return;
}
const api = "https://api.bannergress.com";
const realm = "bannergress";
const bannergressTitle = "Bannergress";
let rateLimiter = null;
oidc.Log.setLogger(console);
const manager = new oidc.UserManager({
authority: `https://login.bannergress.com/auth/realms/${realm}`,
client_id: "bannergress-creator-plugin",
redirect_uri: "https://missions.ingress.com/",
response_mode: "fragment",
userStore: new oidc.WebStorageStateStore({ store: window.localStorage })
});
if (window.location.hash) {
await manager.signinCallback();
return;
}
manager.startSilentRenew();
registerMenuItem();
var action = (new URLSearchParams(window.location.search)).get('bgRefresh');
switch (action) {
case "sync":
await executeSync();
break;
default:
if (action) {
await refreshBanner(action);
}
break;
}
/** Workflow for syncing mission data for a user between creator and Bannergress. */
async function executeSync() {
var ui = createUi();
try {
if (await ui.confirm(`Sync your missions with ${bannergressTitle}?`)) {
ui.progress("Logging in...");
const user = await getUser();
await rateLimit(ui);
ui.progress("Retrieving mission list...");
const response = await getMissionsList();
ui.progress("Syncing mission list...");
await syncMissionsList(user, response.data);
ui.progress("Retrieving missions without details...");
const missionIds = response.data.missionLists.flat().filter(m => m.state === "PUBLISHED").map(m => m.mission_guid);
const missionIdsWithoutDetails = await getMissionsWithoutDetails(missionIds);
await refreshMissions(ui, user, missionIdsWithoutDetails);
await ui.alert("🗹 Import complete");
}
} catch (e) {
console.error(e);
await ui.alert("❌ Import failed");
} finally {
await ui.hide();
}
}
/** Workflow for syncing mission data for a banner between creator and Bannergress. */
async function refreshBanner(slug) {
var ui = createUi();
try {
ui.progress(`Requesting missions for banner ${slug}...`);
const missionIds = await getMissionIds(slug);
if (await ui.confirm(`Sync ${missionIds.length} missions with ${bannergressTitle}?`)) {
ui.progress("Logging in...");
const user = await getUser();
await refreshMissions(ui, user, missionIds);
await ui.alert("🗹 Import complete");
}
} catch (e) {
console.error(e);
await ui.alert("❌ Import failed");
} finally {
await ui.hide();
}
}
/** Partial workflow for syncing mission data for a set of mission IDs between creator and Bannergress. */
async function refreshMissions(ui, user, missionIds) {
for (const missionId of missionIds) {
await rateLimit(ui);
ui.progress(`Requesting mission ${missionId}...`);
const response = await getMissionForProfile(missionId);
ui.progress(`Syncing mission ${missionId}...`);
await syncMission(user, missionId, response.data);
}
}
/** Gets OIDC user information needed for authentication to Bannergress api. */
async function getUser() {
const user = await manager.getUser();
if (user && user.expires_in > 30) {
return user;
} else {
return await manager.signinPopup();
}
}
/** Waits for a rate limit. Resolves as soon as the previous call to this method has been at least <rate limit> seconds ago. */
async function rateLimit(ui) {
ui.progress(`Waiting for next step...`);
await rateLimiter;
rateLimiter = sleep(1000);
}
// UI functionality
/** Registers the sync menu item in the creator menu. */
function registerMenuItem() {
const item = document.createElement("a");
item.href = '#';
item.className = 'navbar-my-missions navbar-brand';
item.textContent = `Sync with ${bannergressTitle}`;
item.addEventListener('click', executeSync);
document.querySelector('.navbar-header').appendChild(item);
}
/** Creates a basic UI that allows to show progress, confirmation messages and alert messages. */
function createUi() {
const outer = document.createElement("div");
outer.style = "position: fixed; left: 0; right: 0; top: 0; bottom: 0; z-index: 10000; display: flex; justify-content: center; align-items: center; backdrop-filter: blur(5px)";
document.body.appendChild(outer);
const message = document.createElement("div");
message.style = "background: black; width: 80%; height: 5em; margin: 2em; display: flex; justify-content: center; align-items: center; border: 1px solid #5afbea";
outer.appendChild(message);
return {
progress: text => {
message.textContent = text;
},
alert: async text => {
return new Promise(resolve => {
message.textContent = text;
message.appendChild(createUiButton("OK", () => resolve()));
});
},
confirm: async text => {
return new Promise(resolve => {
message.textContent = text;
message.appendChild(createUiButton("Yes", () => resolve(true)));
message.appendChild(createUiButton("No", () => resolve(false)));
});
},
hide: async () => {
outer.removeChild(message);
await sleep(500);
outer.parentElement.removeChild(outer);
}
};
}
/** Creates a button for the basic UI. */
function createUiButton(text, handler) {
const button = document.createElement("button");
button.textContent = text;
button.type = "button";
button.style = "margin-left:2em; padding: revert;";
button.onclick = handler;
return button;
}
// Creator api functionality
/** Gets the list of missions for the current user from the creator api. */
async function getMissionsList() {
const creator = getCreatorContext();
return creator.$http.post(creator.Api.GET_MISSIONS_LIST);
}
/** Gets a mission definition from the creator api. */
async function getMissionForProfile(missionId) {
const creator = getCreatorContext();
let result;
try {
result = await creator.$http.post(creator.Api.GET_MISSION_FOR_PROFILE, {
"mission_guid": missionId
});
} catch (e) {
// "Mission Not Found" errors are not treated as errors, but instead as responses, since they indicate offline status
if (e && e.data && e.data && e.data.mat_error && e.data.mat_error.title === "Mission Not Found") {
result = e;
} else {
throw e;
}
}
return result;
}
/** Gets context information from the underlying Angular app that is needed to query the creator api. */
function getCreatorContext() {
const injector = angular.element(document.body).injector();
return {
Api: injector.get('Api'),
$http: injector.get('$http')
};
}
// Bannergress functionality
/** Gets all mission IDs of a Bannergress banner, identified by its slug. */
async function getMissionIds(slug) {
const response = await fetch(`${api}/bnrs/${encodeURIComponent(slug)}`);
handleError(response);
const banner = await response.json();
return Object.values(banner.missions).map(m => m.id).filter(id => id);
}
/** Retrieves the subset of mission IDs from a set of mission IDs that have no detail info in Bannergress. */
async function getMissionsWithoutDetails(missionIds) {
const response = await fetch(`${api}/missions/status`, {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(missionIds)
});
handleError(response);
const json = await response.json();
return Object.entries(json).filter(pair => !pair[1].latestUpdateDetails).map(pair => pair[0]);
}
/** Uploads a missions response from getMissionsList creator api to Bannergress. */
async function syncMissionsList(user, data) {
const response = await fetch(`${api}/import/getMissionsList`, {
method: "POST",
mode: "cors",
headers: {
"Authorization": "Bearer " + user.access_token,
"Content-Type": "application/json"
},
body: JSON.stringify(data)
})
handleError(response);
}
/** Uploads a mission response from getMissionForProfile creator api to Bannergress. */
async function syncMission(user, missionId, response) {
const payloadString = JSON.stringify({
request: {
"mission_guid": missionId
},
response
});
const importResponse = await fetch(`${api}/import/getMissionForProfile`, {
method: "POST",
mode: "cors",
headers: {
"Authorization": "Bearer " + user.access_token,
"Content-Type": "application/json"
},
body: payloadString
})
handleError(importResponse, response);
}
function handleError(response, data) {
if (!response.ok) {
console.error(response, data);
throw new Error(response.statusText);
}
}
// Utilities
/** Resolves after the specified number of milliseconds. */
async function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
})();