@strivacity/sdk-core 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/LICENSE +1 -1
  3. package/README.md +57 -0
  4. package/dist/flows/BaseFlow.cjs +1 -1
  5. package/dist/flows/BaseFlow.cjs.map +1 -1
  6. package/dist/flows/BaseFlow.d.ts +19 -0
  7. package/dist/flows/BaseFlow.mjs +1 -1
  8. package/dist/flows/BaseFlow.mjs.map +1 -1
  9. package/dist/flows/NativeFlow.cjs +1 -1
  10. package/dist/flows/NativeFlow.cjs.map +1 -1
  11. package/dist/flows/NativeFlow.d.ts +6 -0
  12. package/dist/flows/NativeFlow.mjs +1 -1
  13. package/dist/flows/NativeFlow.mjs.map +1 -1
  14. package/dist/flows/PopupFlow.cjs +1 -1
  15. package/dist/flows/PopupFlow.cjs.map +1 -1
  16. package/dist/flows/PopupFlow.d.ts +6 -0
  17. package/dist/flows/PopupFlow.mjs +1 -1
  18. package/dist/flows/PopupFlow.mjs.map +1 -1
  19. package/dist/flows/RedirectFlow.cjs +1 -1
  20. package/dist/flows/RedirectFlow.cjs.map +1 -1
  21. package/dist/flows/RedirectFlow.d.ts +6 -0
  22. package/dist/flows/RedirectFlow.mjs +1 -1
  23. package/dist/flows/RedirectFlow.mjs.map +1 -1
  24. package/dist/types.cjs.map +1 -1
  25. package/dist/types.d.ts +112 -2
  26. package/dist/types.mjs.map +1 -1
  27. package/dist/utils/NativeFlowHandler.cjs +1 -1
  28. package/dist/utils/NativeFlowHandler.cjs.map +1 -1
  29. package/dist/utils/NativeFlowHandler.mjs +1 -1
  30. package/dist/utils/NativeFlowHandler.mjs.map +1 -1
  31. package/dist/utils/credentials.cjs +2 -0
  32. package/dist/utils/credentials.cjs.map +1 -0
  33. package/dist/utils/credentials.d.ts +3 -0
  34. package/dist/utils/credentials.mjs +2 -0
  35. package/dist/utils/credentials.mjs.map +1 -0
  36. package/dist/utils/handlers.cjs +1 -1
  37. package/dist/utils/handlers.cjs.map +1 -1
  38. package/dist/utils/handlers.mjs +1 -1
  39. package/dist/utils/handlers.mjs.map +1 -1
  40. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## 2.1.0 (2025-11-10)
2
+
3
+ ### 🚀 Features
4
+
5
+ - webauthn support added ([f1b0fc4](https://github.com/Strivacity/sdk-js/commit/f1b0fc4))
6
+ - entry url added ([808bf81](https://github.com/Strivacity/sdk-js/commit/808bf81))
7
+ - nextjs headless example app added ([0c1dafa](https://github.com/Strivacity/sdk-js/commit/0c1dafa))
8
+ - sdk param for nativeFlowHandler added ([8c3ffed](https://github.com/Strivacity/sdk-js/commit/8c3ffed))
9
+
10
+ ### 🩹 Fixes
11
+
12
+ - isAuthenticated getter refresh token handling updated ([a067318](https://github.com/Strivacity/sdk-js/commit/a067318))
13
+ - async flow initialization updated ([477df9f](https://github.com/Strivacity/sdk-js/commit/477df9f))
14
+
1
15
  ## 2.0.1 (2025-10-07)
2
16
 
3
17
  ### 🩹 Fixes
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023 Strivacity Inc. <info@strivacity.com>
3
+ Copyright (c) 2023 Strivacity Inc. <opensource@strivacity.com>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -117,3 +117,60 @@ Submits a form in the native flow. Optionally specify a form ID and request body
117
117
  #### `finalizeSession(finalizeUrl: string): Promise<void>`
118
118
 
119
119
  Finalizes the session using the provided URL. You can gather the finalize URL from the `LoginFlowState` returned by `startSession` or `submitForm`.
120
+
121
+ ---
122
+
123
+ ## Event Subscription
124
+
125
+ The SDK provides an event subscription system that allows you to listen to various authentication lifecycle events.
126
+
127
+ ### Usage
128
+
129
+ ```js
130
+ import { initFlow } from '@strivacity/sdk-core';
131
+
132
+ const sdk = initFlow({
133
+ mode: 'redirect',
134
+ issuer: 'https://<YOUR_DOMAIN>',
135
+ scopes: ['openid', 'profile'],
136
+ clientId: '<YOUR_CLIENT_ID>',
137
+ redirectUri: '<YOUR_REDIRECT_URI>',
138
+ });
139
+
140
+ // Subscribe to events
141
+ function updateSession(eventData) {
142
+ console.log('Event received:', eventData);
143
+ // Handle the event as needed
144
+ }
145
+
146
+ sdk.subscribeToEvent('init', updateSession);
147
+ sdk.subscribeToEvent('loggedIn', updateSession);
148
+ sdk.subscribeToEvent('sessionLoaded', updateSession);
149
+ sdk.subscribeToEvent('tokenRefreshed', updateSession);
150
+ sdk.subscribeToEvent('tokenRefreshFailed', updateSession);
151
+ sdk.subscribeToEvent('logoutInitiated', updateSession);
152
+ sdk.subscribeToEvent('tokenRevoked', updateSession);
153
+ sdk.subscribeToEvent('tokenRevokeFailed', updateSession);
154
+ ```
155
+
156
+ ### Available Events
157
+
158
+ - **`init`**: Fired when the SDK is initialized
159
+ - **`loggedIn`**: Fired when a user successfully logs in
160
+ - **`sessionLoaded`**: Fired when an existing session is loaded
161
+ - **`tokenRefreshed`**: Fired when access tokens are successfully refreshed
162
+ - **`tokenRefreshFailed`**: Fired when token refresh fails
163
+ - **`logoutInitiated`**: Fired when logout process is initiated
164
+ - **`tokenRevoked`**: Fired when tokens are successfully revoked
165
+ - **`tokenRevokeFailed`**: Fired when token revocation fails
166
+
167
+ ### API Documentation
168
+
169
+ #### `subscribeToEvent(eventType: string, callback: (eventData: any) => void): void`
170
+
171
+ Subscribe to SDK events to handle authentication state changes.
172
+
173
+ **Parameters:**
174
+
175
+ - `eventType` (string): The type of event to listen for
176
+ - `callback` (function): The function to call when the event is fired
@@ -1,2 +1,2 @@
1
- "use strict";var I=Object.defineProperty;var m=t=>{throw TypeError(t)};var R=(t,e,s)=>e in t?I(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var o=(t,e,s)=>R(t,typeof e!="symbol"?e+"":e,s),k=(t,e,s)=>e.has(t)||m("Cannot "+s);var r=(t,e,s)=>(k(t,e,"read from private field"),s?s.call(t):e.get(t)),c=(t,e,s)=>e.has(t)?m("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,s),d=(t,e,s,i)=>(k(t,e,"write to private field"),i?i.call(t,s):e.set(t,s),s),y=(t,e,s)=>(k(t,e,"access private method"),s);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const E=require("../utils/jwt.cjs"),P=require("../utils/date.cjs"),q=require("../utils/Metadata.cjs"),v=require("../utils/Session.cjs"),j=require("../utils/State.cjs");require("../utils/base64Url.cjs");require("../utils/crypto.cjs");const p={accessTokenExpired:new Set,init:new Set,loggedIn:new Set,loginInitiated:new Set,logoutInitiated:new Set,sessionLoaded:new Set,tokenRefreshed:new Set,tokenRefreshFailed:new Set,tokenRevoked:new Set,tokenRevokeFailed:new Set};var a,n,l,S;class U{constructor(e,s,i){c(this,l);c(this,a,!1);c(this,n,null);o(this,"httpClient");o(this,"storage");o(this,"metadata");o(this,"session",null);o(this,"options");if(!e.issuer)throw new Error("Missing option: issuer");if(!e.clientId)throw new Error("Missing option: clientId");if(!e.redirectUri)throw new Error("Missing option: redirectUri");if(!e.urlHandler)throw new Error("Missing option: urlHandler");if(!e.callbackHandler)throw new Error("Missing option: callbackHandler");if(e.scopes&&!Array.isArray(e.scopes))throw new Error("Invalid option: scopes");e.scopes||(e.scopes=["openid"]),e.responseType||(e.responseType="code"),e.responseMode||(e.responseMode="query"),e.storageTokenName||(e.storageTokenName="sty.session"),this.options=e,this.storage=s,this.httpClient=i,this.metadata=new q.Metadata(this,new URL("/.well-known/openid-configuration",e.issuer).toString()),y(this,l,S).call(this)}get idTokenClaims(){var e;return(e=this.session)==null?void 0:e.claims}get accessToken(){var e;return(e=this.session)==null?void 0:e.access_token}get refreshToken(){var e;return(e=this.session)==null?void 0:e.refresh_token}get accessTokenExpired(){var e,s;return!((e=this.session)!=null&&e.access_token)||!((s=this.session)!=null&&s.expires_at)||this.session.expires_at<=P.timestamp()}get accessTokenExpirationDate(){var e;return(e=this.session)==null?void 0:e.expires_at}get isAuthenticated(){return r(this,n)?r(this,n):(d(this,n,new Promise(async e=>{await this.waitToInitialize();try{this.refreshToken&&this.accessTokenExpired&&await this.refresh()}catch{}setTimeout(()=>{e(!this.accessTokenExpired),d(this,n,null)})})),r(this,n))}async logout(e){if(typeof this.options.urlHandler!="function")throw new Error("URL handler is not defined. Please provide a valid URL handler function in the SDK options.");await this.waitToInitialize();const s=this.session;if(!(s!=null&&s.id_token))return;await this.storage.delete(this.options.storageTokenName),this.session=null;const i=new URL(await this.metadata.endSessionEndpoint);i.searchParams.append("id_token_hint",s==null?void 0:s.id_token),e!=null&&e.postLogoutRedirectUri&&i.searchParams.append("post_logout_redirect_uri",e.postLogoutRedirectUri),this.dispatchEvent("logoutInitiated",[{idToken:s.id_token,claims:s.claims}]);try{await this.options.urlHandler(i.toString(),e)}catch{}}async refresh(){var s,i;if(await this.waitToInitialize(),typeof((s=this.session)==null?void 0:s.refresh_token)!="string")return;const e=this.session;try{const h=await this.sendTokenRequest(await this.metadata.tokenEndpoint,{grant_type:"refresh_token",client_id:this.options.clientId,refresh_token:(i=this.session)==null?void 0:i.refresh_token});Object.assign(this.session,await h.json()),this.session.id_token&&(this.session.claims=E.jwt.decode(this.session.id_token)),await this.storage.set(this.options.storageTokenName,JSON.stringify(this.session)),this.accessToken&&this.refreshToken&&this.idTokenClaims&&this.dispatchEvent("tokenRefreshed",[{accessToken:this.accessToken,refreshToken:this.refreshToken,claims:this.idTokenClaims}])}catch{this.session=null,await this.storage.delete(this.options.storageTokenName),this.dispatchEvent("tokenRefreshFailed",[{refreshToken:e.refresh_token}])}}async revoke(){await this.waitToInitialize();const e=this.session;let s=!0;try{e!=null&&e.refresh_token?await this.sendTokenRequest(await this.metadata.revocationEndpoint,{client_id:this.options.clientId,token_type_hint:"refresh_token",token:e.refresh_token}):e!=null&&e.access_token&&await this.sendTokenRequest(await this.metadata.revocationEndpoint,{client_id:this.options.clientId,token_type_hint:"access_token",token:e.access_token})}catch{s=!1}finally{this.session=null,await this.storage.delete(this.options.storageTokenName),e!=null&&e.refresh_token?this.dispatchEvent(s?"tokenRevoked":"tokenRevokeFailed",[{token:e.refresh_token,tokenTypeHint:"refresh_token"}]):e!=null&&e.access_token&&this.dispatchEvent(s?"tokenRevoked":"tokenRevokeFailed",[{token:e.access_token,tokenTypeHint:"access_token"}])}}async tokenExchange(e={}){var h,w,u,f,T,g;if(await this.waitToInitialize(),this.session=new v.Session,Object.assign(this.session,e),this.session.error)throw new Error(`${this.session.error}: ${this.session.error_description}`);if(!this.session.code)throw new Error("Invalid or missing code");let s;try{const _=await this.storage.get(`sty.${this.session.state}`);if(!_)throw new Error;s=j.State.fromSerializedData(_),await this.storage.delete(`sty.${this.session.state}`)}catch{throw new Error("Invalid or missing state")}const i=await this.sendTokenRequest(await this.metadata.tokenEndpoint,{grant_type:"authorization_code",client_id:this.options.clientId,redirect_uri:this.options.redirectUri,code_verifier:s.codeVerifier,code:this.session.code});if(Object.assign(this.session,await i.json()),this.session.id_token&&(this.session.claims=E.jwt.decode(this.session.id_token)),this.session.error)throw new Error(`${this.session.error}: ${this.session.error_description}`);if(this.session.scope!==((h=this.options.scopes)==null?void 0:h.join(" ")))throw new Error("Invalid scope");if(((w=this.session.claims)==null?void 0:w.nonce)!==s.nonce)throw new Error("Invalid nonce");if(((u=this.session.claims)==null?void 0:u.iss)!==await this.metadata.issuer)throw new Error("Invalid iss");if(Array.isArray((f=this.session.claims)==null?void 0:f.aud)?((T=this.session.claims)==null?void 0:T.aud[0])!==this.options.clientId:((g=this.session.claims)==null?void 0:g.aud)!==this.options.clientId)throw new Error("Invalid aud");await this.storage.set(this.options.storageTokenName,JSON.stringify(this.session)),this.accessToken&&this.idTokenClaims&&this.dispatchEvent("loggedIn",[{accessToken:this.accessToken,refreshToken:this.refreshToken,claims:this.idTokenClaims}])}async getAuthorizationUrl(e={}){var i;const s=new URL(await this.metadata.authorizationEndpoint);return s.searchParams.append("client_id",this.options.clientId),s.searchParams.append("redirect_uri",this.options.redirectUri),s.searchParams.append("response_type",this.options.responseType||"code"),s.searchParams.append("response_mode",this.options.responseMode||"fragment"),s.searchParams.append("scope",((i=this.options.scopes)==null?void 0:i.join(" "))||""),s.searchParams.append("code_challenge_method","S256"),e.prompt&&s.searchParams.append("prompt",e.prompt),e.acrValues&&s.searchParams.append("acr_values",e.acrValues.join(" ")),e.loginHint&&s.searchParams.append("login_hint",e.loginHint),e.uiLocales&&s.searchParams.append("ui_locales",e.uiLocales.join(" ")),s}async waitToInitialize(){for(;!r(this,a);)await new Promise(e=>setTimeout(e,10))}async sendTokenRequest(e,s={}){return this.httpClient.request(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(s).toString()})}subscribeToEvent(e,s){return p[e].add(s),{dispose:()=>{p[e].delete(s)}}}dispatchEvent(e,s){for(const i of p[e])i(...s)}}a=new WeakMap,n=new WeakMap,l=new WeakSet,S=async function(){this.session=v.Session.load(await this.storage.get(this.options.storageTokenName)),setTimeout(()=>{this.dispatchEvent("init",[]),this.session&&this.accessToken&&this.idTokenClaims&&this.dispatchEvent("sessionLoaded",[{accessToken:this.accessToken,refreshToken:this.refreshToken,claims:this.idTokenClaims}]),this.accessToken&&this.accessTokenExpired&&this.dispatchEvent("accessTokenExpired",[{accessToken:this.accessToken,refreshToken:this.refreshToken}]),d(this,a,!0)})};exports.BaseFlow=U;
1
+ "use strict";var P=Object.defineProperty;var E=t=>{throw TypeError(t)};var q=(t,e,s)=>e in t?P(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var o=(t,e,s)=>q(t,typeof e!="symbol"?e+"":e,s),p=(t,e,s)=>e.has(t)||E("Cannot "+s);var r=(t,e,s)=>(p(t,e,"read from private field"),s?s.call(t):e.get(t)),d=(t,e,s)=>e.has(t)?E("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,s),a=(t,e,s,i)=>(p(t,e,"write to private field"),i?i.call(t,s):e.set(t,s),s),f=(t,e,s)=>(p(t,e,"access private method"),s);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("../utils/jwt.cjs"),j=require("../utils/date.cjs"),x=require("../utils/Metadata.cjs"),S=require("../utils/Session.cjs"),U=require("../utils/State.cjs");require("../utils/base64Url.cjs");require("../utils/crypto.cjs");const w={accessTokenExpired:new Set,init:new Set,loggedIn:new Set,loginInitiated:new Set,logoutInitiated:new Set,sessionLoaded:new Set,tokenRefreshed:new Set,tokenRefreshFailed:new Set,tokenRevoked:new Set,tokenRevokeFailed:new Set};var l,n,h,c,I,R;class z{constructor(e,s,i){d(this,c);d(this,l);d(this,n,null);d(this,h,!1);o(this,"httpClient");o(this,"storage");o(this,"metadata");o(this,"session",null);o(this,"options");if(!e.issuer)throw new Error("Missing option: issuer");if(!e.clientId)throw new Error("Missing option: clientId");if(!e.redirectUri)throw new Error("Missing option: redirectUri");if(!e.urlHandler)throw new Error("Missing option: urlHandler");if(!e.callbackHandler)throw new Error("Missing option: callbackHandler");if(e.scopes&&!Array.isArray(e.scopes))throw new Error("Invalid option: scopes");e.scopes||(e.scopes=["openid"]),e.responseType||(e.responseType="code"),e.responseMode||(e.responseMode="query"),e.storageTokenName||(e.storageTokenName="sty.session"),this.options=e,this.storage=s,this.httpClient=i,this.metadata=new x.Metadata(this,new URL("/.well-known/openid-configuration",e.issuer).toString()),a(this,l,f(this,c,I).call(this))}get idTokenClaims(){var e;return(e=this.session)==null?void 0:e.claims}get accessToken(){var e;return(e=this.session)==null?void 0:e.access_token}get refreshToken(){var e;return(e=this.session)==null?void 0:e.refresh_token}get refreshInProgress(){return r(this,h)}get accessTokenExpired(){var e,s;return!((e=this.session)!=null&&e.access_token)||!((s=this.session)!=null&&s.expires_at)||this.session.expires_at<=j.timestamp()}get accessTokenExpirationDate(){var e;return(e=this.session)==null?void 0:e.expires_at}get isAuthenticated(){return r(this,n)?r(this,n):(a(this,n,f(this,c,R).call(this)),r(this,n))}get isAuthenticatedSync(){var e;return!!((e=this.session)!=null&&e.access_token&&!this.accessTokenExpired)}async logout(e){if(typeof this.options.urlHandler!="function")throw new Error("URL handler is not defined. Please provide a valid URL handler function in the SDK options.");await this.waitToInitialize();const s=this.session;if(!(s!=null&&s.id_token))return;await this.storage.delete(this.options.storageTokenName),this.session=null;const i=new URL(await this.metadata.endSessionEndpoint);i.searchParams.append("id_token_hint",s==null?void 0:s.id_token),e!=null&&e.postLogoutRedirectUri&&i.searchParams.append("post_logout_redirect_uri",e.postLogoutRedirectUri),this.dispatchEvent("logoutInitiated",[{idToken:s.id_token,claims:s.claims}]);try{await this.options.urlHandler(i.toString(),e)}catch{}}async refresh(){var s,i;if(await this.waitToInitialize(),typeof((s=this.session)==null?void 0:s.refresh_token)!="string")return;const e=this.session;try{const k=await this.sendTokenRequest(await this.metadata.tokenEndpoint,{grant_type:"refresh_token",client_id:this.options.clientId,refresh_token:(i=this.session)==null?void 0:i.refresh_token});Object.assign(this.session,await k.json()),this.session.id_token&&(this.session.claims=v.jwt.decode(this.session.id_token)),await this.storage.set(this.options.storageTokenName,JSON.stringify(this.session)),this.accessToken&&this.refreshToken&&this.idTokenClaims&&this.dispatchEvent("tokenRefreshed",[{accessToken:this.accessToken,refreshToken:this.refreshToken,claims:this.idTokenClaims}])}catch{this.session=null,await this.storage.delete(this.options.storageTokenName),this.dispatchEvent("tokenRefreshFailed",[{refreshToken:e.refresh_token}])}}async revoke(){await this.waitToInitialize();const e=this.session;let s=!0;try{e!=null&&e.refresh_token?await this.sendTokenRequest(await this.metadata.revocationEndpoint,{client_id:this.options.clientId,token_type_hint:"refresh_token",token:e.refresh_token}):e!=null&&e.access_token&&await this.sendTokenRequest(await this.metadata.revocationEndpoint,{client_id:this.options.clientId,token_type_hint:"access_token",token:e.access_token})}catch{s=!1}finally{this.session=null,await this.storage.delete(this.options.storageTokenName),e!=null&&e.refresh_token?this.dispatchEvent(s?"tokenRevoked":"tokenRevokeFailed",[{token:e.refresh_token,tokenTypeHint:"refresh_token"}]):e!=null&&e.access_token&&this.dispatchEvent(s?"tokenRevoked":"tokenRevokeFailed",[{token:e.access_token,tokenTypeHint:"access_token"}])}}async tokenExchange(e={}){var k,u,g,T,_,m;if(await this.waitToInitialize(),this.session=new S.Session,Object.assign(this.session,e),this.session.error)throw new Error(`${this.session.error}: ${this.session.error_description}`);if(!this.session.code)throw new Error("Invalid or missing code");let s;try{const y=await this.storage.get(`sty.${this.session.state}`);if(!y)throw new Error;s=U.State.fromSerializedData(y),await this.storage.delete(`sty.${this.session.state}`)}catch{throw new Error("Invalid or missing state")}const i=await this.sendTokenRequest(await this.metadata.tokenEndpoint,{grant_type:"authorization_code",client_id:this.options.clientId,redirect_uri:this.options.redirectUri,code_verifier:s.codeVerifier,code:this.session.code});if(Object.assign(this.session,await i.json()),this.session.id_token&&(this.session.claims=v.jwt.decode(this.session.id_token)),this.session.error)throw new Error(`${this.session.error}: ${this.session.error_description}`);if(this.session.scope!==((k=this.options.scopes)==null?void 0:k.join(" ")))throw new Error("Invalid scope");if(((u=this.session.claims)==null?void 0:u.nonce)!==s.nonce)throw new Error("Invalid nonce");if(((g=this.session.claims)==null?void 0:g.iss)!==await this.metadata.issuer)throw new Error("Invalid iss");if(Array.isArray((T=this.session.claims)==null?void 0:T.aud)?((_=this.session.claims)==null?void 0:_.aud[0])!==this.options.clientId:((m=this.session.claims)==null?void 0:m.aud)!==this.options.clientId)throw new Error("Invalid aud");await this.storage.set(this.options.storageTokenName,JSON.stringify(this.session)),this.accessToken&&this.idTokenClaims&&this.dispatchEvent("loggedIn",[{accessToken:this.accessToken,refreshToken:this.refreshToken,claims:this.idTokenClaims}])}async getAuthorizationUrl(e={}){var i;const s=new URL(await this.metadata.authorizationEndpoint);return s.searchParams.append("client_id",this.options.clientId),s.searchParams.append("redirect_uri",this.options.redirectUri),s.searchParams.append("response_type",this.options.responseType||"code"),s.searchParams.append("response_mode",this.options.responseMode||"fragment"),s.searchParams.append("scope",((i=this.options.scopes)==null?void 0:i.join(" "))||""),s.searchParams.append("code_challenge_method","S256"),e.prompt&&s.searchParams.append("prompt",e.prompt),e.acrValues&&s.searchParams.append("acr_values",e.acrValues.join(" ")),e.loginHint&&s.searchParams.append("login_hint",e.loginHint),e.uiLocales&&s.searchParams.append("ui_locales",e.uiLocales.join(" ")),s}async waitToInitialize(){await r(this,l)}async sendTokenRequest(e,s={}){return this.httpClient.request(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(s).toString()})}subscribeToEvent(e,s){return w[e].add(s),{dispose:()=>{w[e].delete(s)}}}dispatchEvent(e,s){for(const i of w[e])i(...s)}}l=new WeakMap,n=new WeakMap,h=new WeakMap,c=new WeakSet,I=async function(){this.session=S.Session.load(await this.storage.get(this.options.storageTokenName)),this.dispatchEvent("init",[]),this.session&&this.accessToken&&this.idTokenClaims&&this.dispatchEvent("sessionLoaded",[{accessToken:this.accessToken,refreshToken:this.refreshToken,claims:this.idTokenClaims}]),this.accessToken&&this.accessTokenExpired&&this.dispatchEvent("accessTokenExpired",[{accessToken:this.accessToken,refreshToken:this.refreshToken}])},R=async function(){let e=!1;try{await this.waitToInitialize()}catch{}if(this.accessTokenExpired&&this.refreshToken&&!this.refreshInProgress)try{a(this,h,!0),await this.refresh()}catch{}finally{a(this,h,!1)}return this.accessTokenExpired||(e=!0),a(this,n,null),e};exports.BaseFlow=z;
2
2
  //# sourceMappingURL=BaseFlow.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseFlow.cjs","sources":["../../src/flows/BaseFlow.ts"],"sourcesContent":["import type { IdTokenClaims, SDKOptions, SDKStorage, EventFunctions, ExtraRequestArgs, LogoutParams, SDKHttpClient, HttpClientResponse } from '../types';\nimport { jwt } from '../utils/jwt';\nimport { timestamp } from '../utils/date';\nimport { Metadata } from '../utils/Metadata';\nimport { Session } from '../utils/Session';\nimport { State } from '../utils/State';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst eventCallbacks: Record<keyof EventFunctions, Set<(...args: Array<any>) => Promise<void> | void>> = {\n\taccessTokenExpired: new Set(),\n\tinit: new Set(),\n\tloggedIn: new Set(),\n\tloginInitiated: new Set(),\n\tlogoutInitiated: new Set(),\n\tsessionLoaded: new Set(),\n\ttokenRefreshed: new Set(),\n\ttokenRefreshFailed: new Set(),\n\ttokenRevoked: new Set(),\n\ttokenRevokeFailed: new Set(),\n};\n\n/**\n * An abstract base class that provides common functionality for different OIDC flows.\n *\n * @template Options - The options type extending `SDKOptions` used for configuring the flow.\n * @template URLHandlerParams - The options type extending `ExtraRequestArgs` used for URL handling.\n */\nexport abstract class BaseFlow<Options extends SDKOptions = SDKOptions, URLHandlerParams extends ExtraRequestArgs = ExtraRequestArgs> {\n\t/**\n\t * @ignore\n\t */\n\t#initialized = false;\n\n\t/**\n\t * @ignore\n\t */\n\t#isAuthenticatedPromise: Promise<boolean> | null = null;\n\n\t/**\n\t * An instance of the HTTP client used for making requests.\n\t *\n\t * @type {SDKHttpClient}\n\t */\n\thttpClient: SDKHttpClient;\n\n\t/**\n\t * The storage mechanism used to persist session data.\n\t *\n\t * @type {SDKStorage}\n\t */\n\tstorage: SDKStorage;\n\n\t/**\n\t * Metadata information about the authorization server.\n\t *\n\t * @type {Metadata}\n\t */\n\tmetadata: Metadata;\n\n\t/**\n\t * The current session data.\n\t *\n\t * @type {Session | null}\n\t */\n\tsession: Session | null = null;\n\n\t/**\n\t * The configuration options for the flow.\n\t *\n\t * @type {Options}\n\t */\n\toptions: Options;\n\n\t/**\n\t * Retrieves the ID token claims from the current session.\n\t *\n\t * @type {IdTokenClaims | null | undefined}\n\t */\n\tget idTokenClaims(): IdTokenClaims | null | undefined {\n\t\treturn this.session?.claims;\n\t}\n\n\t/**\n\t * Retrieves the access token from the current session.\n\t *\n\t * @type {string | null | undefined}\n\t */\n\tget accessToken(): string | null | undefined {\n\t\treturn this.session?.access_token;\n\t}\n\n\t/**\n\t * Retrieves the refresh token from the current session.\n\t *\n\t * @type {string | null | undefined}\n\t */\n\tget refreshToken(): string | null | undefined {\n\t\treturn this.session?.refresh_token;\n\t}\n\n\t/**\n\t * Determines if the access token has expired.\n\t *\n\t * @type {boolean}\n\t */\n\tget accessTokenExpired(): boolean {\n\t\treturn !this.session?.access_token || !this.session?.expires_at || this.session.expires_at <= timestamp();\n\t}\n\n\t/**\n\t * Retrieves the access token expiration date.\n\t *\n\t * @type {number | null | undefined}\n\t */\n\tget accessTokenExpirationDate(): number | null | undefined {\n\t\treturn this.session?.expires_at;\n\t}\n\n\t/**\n\t * Checks if the user is authenticated by evaluating the presence of access or refresh tokens.\n\t *\n\t * @returns {Promise<boolean>} - A promise that resolves to `true` if the user is authenticated, otherwise `false`.\n\t */\n\tget isAuthenticated(): Promise<boolean> {\n\t\tif (this.#isAuthenticatedPromise) {\n\t\t\treturn this.#isAuthenticatedPromise;\n\t\t}\n\n\t\t// eslint-disable-next-line no-async-promise-executor, @typescript-eslint/no-misused-promises\n\t\tthis.#isAuthenticatedPromise = new Promise(async (resolve) => {\n\t\t\tawait this.waitToInitialize();\n\n\t\t\ttry {\n\t\t\t\tif (this.refreshToken && this.accessTokenExpired) {\n\t\t\t\t\tawait this.refresh();\n\t\t\t\t}\n\t\t\t} catch {}\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tresolve(!this.accessTokenExpired);\n\t\t\t\tthis.#isAuthenticatedPromise = null;\n\t\t\t});\n\t\t});\n\n\t\treturn this.#isAuthenticatedPromise;\n\t}\n\n\t/**\n\t * Constructs a new instance of the `BaseFlow` class.\n\t *\n\t * @param {Options} options - Configuration options for the flow.\n\t * @param {SDKStorage} storage - Storage mechanism for session data.\n\t *\n\t * @throws {Error} Throws an error if required options are missing or invalid.\n\t */\n\tconstructor(options: Options, storage: SDKStorage, httpClient: SDKHttpClient) {\n\t\tif (!options.issuer) {\n\t\t\tthrow new Error('Missing option: issuer');\n\t\t}\n\t\tif (!options.clientId) {\n\t\t\tthrow new Error('Missing option: clientId');\n\t\t}\n\t\tif (!options.redirectUri) {\n\t\t\tthrow new Error('Missing option: redirectUri');\n\t\t}\n\t\tif (!options.urlHandler) {\n\t\t\tthrow new Error('Missing option: urlHandler');\n\t\t}\n\t\tif (!options.callbackHandler) {\n\t\t\tthrow new Error('Missing option: callbackHandler');\n\t\t}\n\t\tif (options.scopes && !Array.isArray(options.scopes)) {\n\t\t\tthrow new Error('Invalid option: scopes');\n\t\t}\n\n\t\tif (!options.scopes) {\n\t\t\toptions.scopes = ['openid'];\n\t\t}\n\t\tif (!options.responseType) {\n\t\t\toptions.responseType = 'code';\n\t\t}\n\t\tif (!options.responseMode) {\n\t\t\toptions.responseMode = 'query';\n\t\t}\n\t\tif (!options.storageTokenName) {\n\t\t\toptions.storageTokenName = 'sty.session';\n\t\t}\n\n\t\tthis.options = options;\n\t\tthis.storage = storage;\n\t\tthis.httpClient = httpClient;\n\t\tthis.metadata = new Metadata(this, new URL('/.well-known/openid-configuration', options.issuer).toString());\n\n\t\tvoid this.#init();\n\t}\n\n\t/**\n\t * Initializes the flow by loading the session from storage and setting up event listeners.\n\t * @ignore\n\t */\n\tasync #init() {\n\t\tthis.session = Session.load(await this.storage.get(this.options.storageTokenName!));\n\n\t\tsetTimeout(() => {\n\t\t\tthis.dispatchEvent('init', []);\n\n\t\t\tif (this.session && this.accessToken && this.idTokenClaims) {\n\t\t\t\tthis.dispatchEvent('sessionLoaded', [{ accessToken: this.accessToken, refreshToken: this.refreshToken, claims: this.idTokenClaims }]);\n\t\t\t}\n\n\t\t\tif (this.accessToken && this.accessTokenExpired) {\n\t\t\t\tthis.dispatchEvent('accessTokenExpired', [{ accessToken: this.accessToken, refreshToken: this.refreshToken }]);\n\t\t\t}\n\n\t\t\tthis.#initialized = true;\n\t\t});\n\t}\n\n\t/**\n\t * Initiates the login process. Subclasses should implement this method to handle the specific login flow.\n\t *\n\t * @param {URLHandlerParams} [params] - Additional params for handling URLs during login.\n\t * @returns {Promise<void>} - A promise that resolves when the login process is complete.\n\t */\n\tabstract login(params?: URLHandlerParams): unknown;\n\n\t/**\n\t * Registers a new user. Subclasses should implement this method to handle the specific registration flow.\n\t *\n\t * @param {URLHandlerParams} [params] - Additional params for handling URLs during registration.\n\t * @returns {Promise<void>} - A promise that resolves when the registration process is complete.\n\t */\n\tabstract register(params?: URLHandlerParams): unknown;\n\n\t/**\n\t * Logs out the current user and optionally redirects to a post-logout URI.\n\t *\n\t * @param {URLHandlerParams & LogoutParams} [params] - Additional params for handling URLs during logout.\n\t * @returns {Promise<void>} - A promise that resolves when the logout process is complete.\n\t */\n\tasync logout(params?: URLHandlerParams & LogoutParams): Promise<void> {\n\t\tif (typeof this.options.urlHandler !== 'function') {\n\t\t\tthrow new Error('URL handler is not defined. Please provide a valid URL handler function in the SDK options.');\n\t\t}\n\n\t\tawait this.waitToInitialize();\n\n\t\tconst session = this.session;\n\n\t\tif (!session?.id_token) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.storage.delete(this.options.storageTokenName!);\n\t\tthis.session = null;\n\n\t\tconst url = new URL(await this.metadata.endSessionEndpoint);\n\n\t\turl.searchParams.append('id_token_hint', session?.id_token);\n\n\t\tif (params?.postLogoutRedirectUri) {\n\t\t\turl.searchParams.append('post_logout_redirect_uri', params.postLogoutRedirectUri);\n\t\t}\n\n\t\tthis.dispatchEvent('logoutInitiated', [{ idToken: session.id_token, claims: session.claims! }]);\n\n\t\ttry {\n\t\t\tawait this.options.urlHandler(url.toString(), params as URLHandlerParams);\n\t\t} catch {}\n\t}\n\n\t/**\n\t * Refreshes the access token using the refresh token.\n\t *\n\t * @returns {Promise<void>} - A promise that resolves when the token refresh is complete.\n\t *\n\t * @throws {Error} Throws an error if the refresh fails.\n\t */\n\tasync refresh(): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tif (typeof this.session?.refresh_token !== 'string') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst session = this.session;\n\n\t\ttry {\n\t\t\tconst request = await this.sendTokenRequest(await this.metadata.tokenEndpoint, {\n\t\t\t\tgrant_type: 'refresh_token',\n\t\t\t\tclient_id: this.options.clientId,\n\t\t\t\trefresh_token: this.session?.refresh_token,\n\t\t\t});\n\n\t\t\tObject.assign(this.session, await request.json());\n\n\t\t\tif (this.session.id_token) {\n\t\t\t\tthis.session.claims = jwt.decode<IdTokenClaims>(this.session.id_token);\n\t\t\t}\n\n\t\t\tawait this.storage.set(this.options.storageTokenName!, JSON.stringify(this.session));\n\n\t\t\tif (this.accessToken && this.refreshToken && this.idTokenClaims) {\n\t\t\t\tthis.dispatchEvent('tokenRefreshed', [{ accessToken: this.accessToken, refreshToken: this.refreshToken, claims: this.idTokenClaims }]);\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.session = null;\n\t\t\tawait this.storage.delete(this.options.storageTokenName!);\n\n\t\t\tthis.dispatchEvent('tokenRefreshFailed', [{ refreshToken: session.refresh_token! }]);\n\t\t}\n\t}\n\n\t/**\n\t * Revokes the current access or refresh token.\n\t *\n\t * @returns {Promise<void>} - A promise that resolves when the token revocation is complete.\n\t */\n\tasync revoke(): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tconst session = this.session;\n\t\tlet success = true;\n\n\t\ttry {\n\t\t\tif (session?.refresh_token) {\n\t\t\t\tawait this.sendTokenRequest(await this.metadata.revocationEndpoint, {\n\t\t\t\t\tclient_id: this.options.clientId,\n\t\t\t\t\ttoken_type_hint: 'refresh_token',\n\t\t\t\t\ttoken: session.refresh_token,\n\t\t\t\t});\n\t\t\t} else if (session?.access_token) {\n\t\t\t\tawait this.sendTokenRequest(await this.metadata.revocationEndpoint, {\n\t\t\t\t\tclient_id: this.options.clientId,\n\t\t\t\t\ttoken_type_hint: 'access_token',\n\t\t\t\t\ttoken: session.access_token,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch {\n\t\t\tsuccess = false;\n\t\t} finally {\n\t\t\tthis.session = null;\n\t\t\tawait this.storage.delete(this.options.storageTokenName!);\n\n\t\t\tif (session?.refresh_token) {\n\t\t\t\tthis.dispatchEvent(success ? 'tokenRevoked' : 'tokenRevokeFailed', [{ token: session.refresh_token, tokenTypeHint: 'refresh_token' }]);\n\t\t\t} else if (session?.access_token) {\n\t\t\t\tthis.dispatchEvent(success ? 'tokenRevoked' : 'tokenRevokeFailed', [{ token: session.access_token, tokenTypeHint: 'access_token' }]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Exchanges an authorization code for access and refresh tokens.\n\t *\n\t * @param {Record<string, string>} [params={}] - Parameters containing the authorization code and other required values.\n\t * @returns {Promise<void>} - A promise that resolves when the token exchange is complete.\n\t *\n\t * @throws {Error} Throws an error if the authorization code is invalid or if there are issues with state, nonce, or tokens.\n\t */\n\tasync tokenExchange(params: Record<string, string> = {}): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tthis.session = new Session();\n\n\t\tObject.assign(this.session, params);\n\n\t\tif (this.session.error) {\n\t\t\tthrow new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t}\n\t\tif (!this.session.code) {\n\t\t\tthrow new Error('Invalid or missing code');\n\t\t}\n\n\t\tlet state: State;\n\n\t\ttry {\n\t\t\tconst serializedState = await this.storage.get(`sty.${this.session.state}`);\n\n\t\t\tif (!serializedState) {\n\t\t\t\tthrow new Error();\n\t\t\t}\n\n\t\t\tstate = State.fromSerializedData(serializedState);\n\n\t\t\tawait this.storage.delete(`sty.${this.session.state}`);\n\t\t} catch {\n\t\t\tthrow new Error('Invalid or missing state');\n\t\t}\n\n\t\tconst request = await this.sendTokenRequest(await this.metadata.tokenEndpoint, {\n\t\t\tgrant_type: 'authorization_code',\n\t\t\tclient_id: this.options.clientId,\n\t\t\tredirect_uri: this.options.redirectUri,\n\t\t\tcode_verifier: state.codeVerifier,\n\t\t\tcode: this.session.code,\n\t\t});\n\n\t\tObject.assign(this.session, await request.json());\n\n\t\tif (this.session.id_token) {\n\t\t\tthis.session.claims = jwt.decode<IdTokenClaims>(this.session.id_token);\n\t\t}\n\n\t\tif (this.session.error) {\n\t\t\tthrow new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t}\n\t\tif (this.session.scope !== this.options.scopes?.join(' ')) {\n\t\t\tthrow new Error('Invalid scope');\n\t\t}\n\t\tif (this.session.claims?.nonce !== state.nonce) {\n\t\t\tthrow new Error('Invalid nonce');\n\t\t}\n\t\tif (this.session.claims?.iss !== (await this.metadata.issuer)) {\n\t\t\tthrow new Error('Invalid iss');\n\t\t}\n\t\tif (Array.isArray(this.session.claims?.aud) ? this.session.claims?.aud[0] !== this.options.clientId : this.session.claims?.aud !== this.options.clientId) {\n\t\t\tthrow new Error('Invalid aud');\n\t\t}\n\n\t\tawait this.storage.set(this.options.storageTokenName!, JSON.stringify(this.session));\n\n\t\tif (this.accessToken && this.idTokenClaims) {\n\t\t\tthis.dispatchEvent('loggedIn', [{ accessToken: this.accessToken, refreshToken: this.refreshToken, claims: this.idTokenClaims }]);\n\t\t}\n\t}\n\n\t/**\n\t * Constructs the authorization URL for initiating the authorization flow.\n\t *\n\t * @param {ExtraRequestArgs} [params={}] - Additional params to include in the authorization URL.\n\t * @returns {Promise<URL>} - A promise that resolves to the constructed authorization URL.\n\t */\n\tasync getAuthorizationUrl(params: ExtraRequestArgs = {}): Promise<URL> {\n\t\tconst url = new URL(await this.metadata.authorizationEndpoint);\n\n\t\turl.searchParams.append('client_id', this.options.clientId);\n\t\turl.searchParams.append('redirect_uri', this.options.redirectUri);\n\t\turl.searchParams.append('response_type', this.options.responseType || 'code');\n\t\turl.searchParams.append('response_mode', this.options.responseMode || 'fragment');\n\t\turl.searchParams.append('scope', this.options.scopes?.join(' ') || '');\n\t\turl.searchParams.append('code_challenge_method', 'S256');\n\n\t\tif (params.prompt) {\n\t\t\turl.searchParams.append('prompt', params.prompt);\n\t\t}\n\t\tif (params.acrValues) {\n\t\t\turl.searchParams.append('acr_values', params.acrValues.join(' '));\n\t\t}\n\t\tif (params.loginHint) {\n\t\t\turl.searchParams.append('login_hint', params.loginHint);\n\t\t}\n\t\tif (params.uiLocales) {\n\t\t\turl.searchParams.append('ui_locales', params.uiLocales.join(' '));\n\t\t}\n\n\t\treturn url;\n\t}\n\n\tprotected async waitToInitialize(): Promise<void> {\n\t\twhile (!this.#initialized) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 10));\n\t\t}\n\t}\n\n\t/**\n\t * Sends a token request to the specified URL with the given data.\n\t *\n\t * @param {string} url - The URL to send the request to.\n\t * @param {Record<string, string>} [data={}] - The data to include in the request body.\n\t * @returns {Promise<HttpClientResponse<Session>>} - A promise that resolves to the response from the request.\n\t */\n\tasync sendTokenRequest(url: string, data: Record<string, string> = {}): Promise<HttpClientResponse<Session>> {\n\t\treturn this.httpClient.request<Session>(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/x-www-form-urlencoded' },\n\t\t\tbody: new URLSearchParams(data).toString(),\n\t\t});\n\t}\n\n\t/**\n\t * Subscribes a callback function to an event.\n\t *\n\t * @param {T} eventName - The name of the event to subscribe to.\n\t * @param {(...params: Parameters<EventFunctions[T]>) => Promise<void> | void} callbackFn - The callback function to execute when the event is dispatched.\n\t * @returns {{ dispose: () => void }} - An object with a `dispose` method to remove the subscription.\n\t */\n\tsubscribeToEvent<T extends keyof EventFunctions>(\n\t\teventName: T,\n\t\tcallbackFn: (...params: Parameters<EventFunctions[T]>) => Promise<void> | void,\n\t): { dispose: () => void } {\n\t\teventCallbacks[eventName].add(callbackFn);\n\n\t\treturn {\n\t\t\tdispose: () => {\n\t\t\t\teventCallbacks[eventName].delete(callbackFn);\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Dispatches an event to all subscribed callback functions.\n\t *\n\t * @param {T} eventName - The name of the event to dispatch.\n\t * @param {Parameters<EventFunctions[T]>} args - The arguments to pass to the callback functions.\n\t */\n\tprotected dispatchEvent<T extends keyof EventFunctions>(eventName: T, args: Parameters<EventFunctions[T]>): void {\n\t\tfor (const eventFn of eventCallbacks[eventName]) {\n\t\t\tvoid eventFn(...args);\n\t\t}\n\t}\n}\n"],"names":["eventCallbacks","BaseFlow","options","storage","httpClient","__privateAdd","_BaseFlow_instances","_initialized","_isAuthenticatedPromise","__publicField","Metadata","__privateMethod","init_fn","_a","_b","timestamp","__privateGet","__privateSet","resolve","params","session","url","request","jwt","success","Session","state","serializedState","State","_c","_d","_e","_f","data","eventName","callbackFn","args","eventFn"],"mappings":"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"}
1
+ {"version":3,"file":"BaseFlow.cjs","sources":["../../src/flows/BaseFlow.ts"],"sourcesContent":["import type { IdTokenClaims, SDKOptions, SDKStorage, EventFunctions, ExtraRequestArgs, LogoutParams, SDKHttpClient, HttpClientResponse } from '../types';\nimport { jwt } from '../utils/jwt';\nimport { timestamp } from '../utils/date';\nimport { Metadata } from '../utils/Metadata';\nimport { Session } from '../utils/Session';\nimport { State } from '../utils/State';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst eventCallbacks: Record<keyof EventFunctions, Set<(...args: Array<any>) => Promise<void> | void>> = {\n\taccessTokenExpired: new Set(),\n\tinit: new Set(),\n\tloggedIn: new Set(),\n\tloginInitiated: new Set(),\n\tlogoutInitiated: new Set(),\n\tsessionLoaded: new Set(),\n\ttokenRefreshed: new Set(),\n\ttokenRefreshFailed: new Set(),\n\ttokenRevoked: new Set(),\n\ttokenRevokeFailed: new Set(),\n};\n\n/**\n * An abstract base class that provides common functionality for different OIDC flows.\n *\n * @template Options - The options type extending `SDKOptions` used for configuring the flow.\n * @template URLHandlerParams - The options type extending `ExtraRequestArgs` used for URL handling.\n */\nexport abstract class BaseFlow<Options extends SDKOptions = SDKOptions, URLHandlerParams extends ExtraRequestArgs = ExtraRequestArgs> {\n\t/**\n\t * @ignore\n\t */\n\t#initializationPromise: Promise<void>;\n\n\t/**\n\t * @ignore\n\t */\n\t#isAuthenticatedPromise: Promise<boolean> | null = null;\n\n\t/**\n\t * Indicates whether a token refresh operation is currently in progress.\n\t *\n\t * @type {boolean}\n\t */\n\t#refreshInProgressState = false;\n\n\t/**\n\t * An instance of the HTTP client used for making requests.\n\t *\n\t * @type {SDKHttpClient}\n\t */\n\thttpClient: SDKHttpClient;\n\n\t/**\n\t * The storage mechanism used to persist session data.\n\t *\n\t * @type {SDKStorage}\n\t */\n\tstorage: SDKStorage;\n\n\t/**\n\t * Metadata information about the authorization server.\n\t *\n\t * @type {Metadata}\n\t */\n\tmetadata: Metadata;\n\n\t/**\n\t * The current session data.\n\t *\n\t * @type {Session | null}\n\t */\n\tsession: Session | null = null;\n\n\t/**\n\t * The configuration options for the flow.\n\t *\n\t * @type {Options}\n\t */\n\toptions: Options;\n\n\t/**\n\t * Retrieves the ID token claims from the current session.\n\t *\n\t * @type {IdTokenClaims | null | undefined}\n\t */\n\tget idTokenClaims(): IdTokenClaims | null | undefined {\n\t\treturn this.session?.claims;\n\t}\n\n\t/**\n\t * Retrieves the access token from the current session.\n\t *\n\t * @type {string | null | undefined}\n\t */\n\tget accessToken(): string | null | undefined {\n\t\treturn this.session?.access_token;\n\t}\n\n\t/**\n\t * Retrieves the refresh token from the current session.\n\t *\n\t * @type {string | null | undefined}\n\t */\n\tget refreshToken(): string | null | undefined {\n\t\treturn this.session?.refresh_token;\n\t}\n\n\t/**\n\t * Indicates whether a token refresh operation is currently in progress.\n\t *\n\t * @type {boolean}\n\t */\n\tget refreshInProgress(): boolean {\n\t\treturn this.#refreshInProgressState;\n\t}\n\n\t/**\n\t * Determines if the access token has expired.\n\t *\n\t * @type {boolean}\n\t */\n\tget accessTokenExpired(): boolean {\n\t\treturn !this.session?.access_token || !this.session?.expires_at || this.session.expires_at <= timestamp();\n\t}\n\n\t/**\n\t * Retrieves the access token expiration date.\n\t *\n\t * @type {number | null | undefined}\n\t */\n\tget accessTokenExpirationDate(): number | null | undefined {\n\t\treturn this.session?.expires_at;\n\t}\n\n\t/**\n\t * Checks if the user is authenticated by evaluating the presence of access or refresh tokens.\n\t *\n\t * @returns {Promise<boolean>} - A promise that resolves to `true` if the user is authenticated, otherwise `false`.\n\t */\n\tget isAuthenticated(): Promise<boolean> {\n\t\tif (this.#isAuthenticatedPromise) {\n\t\t\treturn this.#isAuthenticatedPromise;\n\t\t}\n\n\t\tthis.#isAuthenticatedPromise = this.#checkAuthentication();\n\n\t\treturn this.#isAuthenticatedPromise;\n\t}\n\n\t/**\n\t * Checks authentication status without attempting token refresh.\n\t * Useful when you want to avoid side effects.\n\t *\n\t * @returns {boolean} - Returns `true` if the user has a valid, non-expired access token.\n\t */\n\tget isAuthenticatedSync(): boolean {\n\t\treturn Boolean(this.session?.access_token && !this.accessTokenExpired);\n\t}\n\n\t/**\n\t * Constructs a new instance of the `BaseFlow` class.\n\t *\n\t * @param {Options} options - Configuration options for the flow.\n\t * @param {SDKStorage} storage - Storage mechanism for session data.\n\t *\n\t * @throws {Error} Throws an error if required options are missing or invalid.\n\t */\n\tconstructor(options: Options, storage: SDKStorage, httpClient: SDKHttpClient) {\n\t\tif (!options.issuer) {\n\t\t\tthrow new Error('Missing option: issuer');\n\t\t}\n\t\tif (!options.clientId) {\n\t\t\tthrow new Error('Missing option: clientId');\n\t\t}\n\t\tif (!options.redirectUri) {\n\t\t\tthrow new Error('Missing option: redirectUri');\n\t\t}\n\t\tif (!options.urlHandler) {\n\t\t\tthrow new Error('Missing option: urlHandler');\n\t\t}\n\t\tif (!options.callbackHandler) {\n\t\t\tthrow new Error('Missing option: callbackHandler');\n\t\t}\n\t\tif (options.scopes && !Array.isArray(options.scopes)) {\n\t\t\tthrow new Error('Invalid option: scopes');\n\t\t}\n\n\t\tif (!options.scopes) {\n\t\t\toptions.scopes = ['openid'];\n\t\t}\n\t\tif (!options.responseType) {\n\t\t\toptions.responseType = 'code';\n\t\t}\n\t\tif (!options.responseMode) {\n\t\t\toptions.responseMode = 'query';\n\t\t}\n\t\tif (!options.storageTokenName) {\n\t\t\toptions.storageTokenName = 'sty.session';\n\t\t}\n\n\t\tthis.options = options;\n\t\tthis.storage = storage;\n\t\tthis.httpClient = httpClient;\n\t\tthis.metadata = new Metadata(this, new URL('/.well-known/openid-configuration', options.issuer).toString());\n\n\t\tthis.#initializationPromise = this.#init();\n\t}\n\n\t/**\n\t * Initializes the flow by loading the session from storage and setting up event listeners.\n\t * @ignore\n\t */\n\tasync #init() {\n\t\tthis.session = Session.load(await this.storage.get(this.options.storageTokenName!));\n\n\t\tthis.dispatchEvent('init', []);\n\n\t\tif (this.session && this.accessToken && this.idTokenClaims) {\n\t\t\tthis.dispatchEvent('sessionLoaded', [{ accessToken: this.accessToken, refreshToken: this.refreshToken, claims: this.idTokenClaims }]);\n\t\t}\n\n\t\tif (this.accessToken && this.accessTokenExpired) {\n\t\t\tthis.dispatchEvent('accessTokenExpired', [{ accessToken: this.accessToken, refreshToken: this.refreshToken }]);\n\t\t}\n\t}\n\n\t/**\n\t * Internal method to check authentication status with proper error handling.\n\t * @ignore\n\t */\n\tasync #checkAuthentication(): Promise<boolean> {\n\t\tlet isAuthenticated = false;\n\n\t\ttry {\n\t\t\tawait this.waitToInitialize();\n\t\t} catch {\n\t\t\t// Initialization failed\n\t\t}\n\n\t\t// Attempt to refresh the token if it has expired\n\t\tif (this.accessTokenExpired && this.refreshToken && !this.refreshInProgress) {\n\t\t\ttry {\n\t\t\t\tthis.#refreshInProgressState = true;\n\t\t\t\tawait this.refresh();\n\t\t\t} catch {\n\t\t\t\t// Token refresh failed - if you want to log errors use the tokenRefreshFailed event\n\t\t\t} finally {\n\t\t\t\tthis.#refreshInProgressState = false;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.accessTokenExpired) {\n\t\t\tisAuthenticated = true;\n\t\t}\n\n\t\tthis.#isAuthenticatedPromise = null;\n\n\t\treturn isAuthenticated;\n\t}\n\n\t/**\n\t * Initiates the login process. Subclasses should implement this method to handle the specific login flow.\n\t *\n\t * @param {URLHandlerParams} [params] - Additional params for handling URLs during login.\n\t * @returns {Promise<void>} - A promise that resolves when the login process is complete.\n\t */\n\tabstract login(params?: URLHandlerParams): unknown;\n\n\t/**\n\t * Registers a new user. Subclasses should implement this method to handle the specific registration flow.\n\t *\n\t * @param {URLHandlerParams} [params] - Additional params for handling URLs during registration.\n\t * @returns {Promise<void>} - A promise that resolves when the registration process is complete.\n\t */\n\tabstract register(params?: URLHandlerParams): unknown;\n\n\t/**\n\t * Initiates the entry process.\n\t * @param {string} url Optional URL to use for the entry process. If not provided, the current window location will be used.\n\t * @returns {Promise<void>} A promise that resolves when the entry process completes.\n\t */\n\tabstract entry(url?: string): unknown;\n\n\t/**\n\t * Logs out the current user and optionally redirects to a post-logout URI.\n\t *\n\t * @param {URLHandlerParams & LogoutParams} [params] - Additional params for handling URLs during logout.\n\t * @returns {Promise<void>} - A promise that resolves when the logout process is complete.\n\t */\n\tasync logout(params?: URLHandlerParams & LogoutParams): Promise<void> {\n\t\tif (typeof this.options.urlHandler !== 'function') {\n\t\t\tthrow new Error('URL handler is not defined. Please provide a valid URL handler function in the SDK options.');\n\t\t}\n\n\t\tawait this.waitToInitialize();\n\n\t\tconst session = this.session;\n\n\t\tif (!session?.id_token) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.storage.delete(this.options.storageTokenName!);\n\t\tthis.session = null;\n\n\t\tconst url = new URL(await this.metadata.endSessionEndpoint);\n\n\t\turl.searchParams.append('id_token_hint', session?.id_token);\n\n\t\tif (params?.postLogoutRedirectUri) {\n\t\t\turl.searchParams.append('post_logout_redirect_uri', params.postLogoutRedirectUri);\n\t\t}\n\n\t\tthis.dispatchEvent('logoutInitiated', [{ idToken: session.id_token, claims: session.claims! }]);\n\n\t\ttry {\n\t\t\tawait this.options.urlHandler(url.toString(), params as URLHandlerParams);\n\t\t} catch {}\n\t}\n\n\t/**\n\t * Refreshes the access token using the refresh token.\n\t *\n\t * @returns {Promise<void>} - A promise that resolves when the token refresh is complete.\n\t *\n\t * @throws {Error} Throws an error if the refresh fails.\n\t */\n\tasync refresh(): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tif (typeof this.session?.refresh_token !== 'string') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst session = this.session;\n\n\t\ttry {\n\t\t\tconst request = await this.sendTokenRequest(await this.metadata.tokenEndpoint, {\n\t\t\t\tgrant_type: 'refresh_token',\n\t\t\t\tclient_id: this.options.clientId,\n\t\t\t\trefresh_token: this.session?.refresh_token,\n\t\t\t});\n\n\t\t\tObject.assign(this.session, await request.json());\n\n\t\t\tif (this.session.id_token) {\n\t\t\t\tthis.session.claims = jwt.decode<IdTokenClaims>(this.session.id_token);\n\t\t\t}\n\n\t\t\tawait this.storage.set(this.options.storageTokenName!, JSON.stringify(this.session));\n\n\t\t\tif (this.accessToken && this.refreshToken && this.idTokenClaims) {\n\t\t\t\tthis.dispatchEvent('tokenRefreshed', [{ accessToken: this.accessToken, refreshToken: this.refreshToken, claims: this.idTokenClaims }]);\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.session = null;\n\t\t\tawait this.storage.delete(this.options.storageTokenName!);\n\n\t\t\tthis.dispatchEvent('tokenRefreshFailed', [{ refreshToken: session.refresh_token! }]);\n\t\t}\n\t}\n\n\t/**\n\t * Revokes the current access or refresh token.\n\t *\n\t * @returns {Promise<void>} - A promise that resolves when the token revocation is complete.\n\t */\n\tasync revoke(): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tconst session = this.session;\n\t\tlet success = true;\n\n\t\ttry {\n\t\t\tif (session?.refresh_token) {\n\t\t\t\tawait this.sendTokenRequest(await this.metadata.revocationEndpoint, {\n\t\t\t\t\tclient_id: this.options.clientId,\n\t\t\t\t\ttoken_type_hint: 'refresh_token',\n\t\t\t\t\ttoken: session.refresh_token,\n\t\t\t\t});\n\t\t\t} else if (session?.access_token) {\n\t\t\t\tawait this.sendTokenRequest(await this.metadata.revocationEndpoint, {\n\t\t\t\t\tclient_id: this.options.clientId,\n\t\t\t\t\ttoken_type_hint: 'access_token',\n\t\t\t\t\ttoken: session.access_token,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch {\n\t\t\tsuccess = false;\n\t\t} finally {\n\t\t\tthis.session = null;\n\t\t\tawait this.storage.delete(this.options.storageTokenName!);\n\n\t\t\tif (session?.refresh_token) {\n\t\t\t\tthis.dispatchEvent(success ? 'tokenRevoked' : 'tokenRevokeFailed', [{ token: session.refresh_token, tokenTypeHint: 'refresh_token' }]);\n\t\t\t} else if (session?.access_token) {\n\t\t\t\tthis.dispatchEvent(success ? 'tokenRevoked' : 'tokenRevokeFailed', [{ token: session.access_token, tokenTypeHint: 'access_token' }]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Exchanges an authorization code for access and refresh tokens.\n\t *\n\t * @param {Record<string, string>} [params={}] - Parameters containing the authorization code and other required values.\n\t * @returns {Promise<void>} - A promise that resolves when the token exchange is complete.\n\t *\n\t * @throws {Error} Throws an error if the authorization code is invalid or if there are issues with state, nonce, or tokens.\n\t */\n\tasync tokenExchange(params: Record<string, string> = {}): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tthis.session = new Session();\n\n\t\tObject.assign(this.session, params);\n\n\t\tif (this.session.error) {\n\t\t\tthrow new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t}\n\t\tif (!this.session.code) {\n\t\t\tthrow new Error('Invalid or missing code');\n\t\t}\n\n\t\tlet state: State;\n\n\t\ttry {\n\t\t\tconst serializedState = await this.storage.get(`sty.${this.session.state}`);\n\n\t\t\tif (!serializedState) {\n\t\t\t\tthrow new Error();\n\t\t\t}\n\n\t\t\tstate = State.fromSerializedData(serializedState);\n\n\t\t\tawait this.storage.delete(`sty.${this.session.state}`);\n\t\t} catch {\n\t\t\tthrow new Error('Invalid or missing state');\n\t\t}\n\n\t\tconst request = await this.sendTokenRequest(await this.metadata.tokenEndpoint, {\n\t\t\tgrant_type: 'authorization_code',\n\t\t\tclient_id: this.options.clientId,\n\t\t\tredirect_uri: this.options.redirectUri,\n\t\t\tcode_verifier: state.codeVerifier,\n\t\t\tcode: this.session.code,\n\t\t});\n\n\t\tObject.assign(this.session, await request.json());\n\n\t\tif (this.session.id_token) {\n\t\t\tthis.session.claims = jwt.decode<IdTokenClaims>(this.session.id_token);\n\t\t}\n\n\t\tif (this.session.error) {\n\t\t\tthrow new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t}\n\t\tif (this.session.scope !== this.options.scopes?.join(' ')) {\n\t\t\tthrow new Error('Invalid scope');\n\t\t}\n\t\tif (this.session.claims?.nonce !== state.nonce) {\n\t\t\tthrow new Error('Invalid nonce');\n\t\t}\n\t\tif (this.session.claims?.iss !== (await this.metadata.issuer)) {\n\t\t\tthrow new Error('Invalid iss');\n\t\t}\n\t\tif (Array.isArray(this.session.claims?.aud) ? this.session.claims?.aud[0] !== this.options.clientId : this.session.claims?.aud !== this.options.clientId) {\n\t\t\tthrow new Error('Invalid aud');\n\t\t}\n\n\t\tawait this.storage.set(this.options.storageTokenName!, JSON.stringify(this.session));\n\n\t\tif (this.accessToken && this.idTokenClaims) {\n\t\t\tthis.dispatchEvent('loggedIn', [{ accessToken: this.accessToken, refreshToken: this.refreshToken, claims: this.idTokenClaims }]);\n\t\t}\n\t}\n\n\t/**\n\t * Constructs the authorization URL for initiating the authorization flow.\n\t *\n\t * @param {ExtraRequestArgs} [params={}] - Additional params to include in the authorization URL.\n\t * @returns {Promise<URL>} - A promise that resolves to the constructed authorization URL.\n\t */\n\tasync getAuthorizationUrl(params: ExtraRequestArgs = {}): Promise<URL> {\n\t\tconst url = new URL(await this.metadata.authorizationEndpoint);\n\n\t\turl.searchParams.append('client_id', this.options.clientId);\n\t\turl.searchParams.append('redirect_uri', this.options.redirectUri);\n\t\turl.searchParams.append('response_type', this.options.responseType || 'code');\n\t\turl.searchParams.append('response_mode', this.options.responseMode || 'fragment');\n\t\turl.searchParams.append('scope', this.options.scopes?.join(' ') || '');\n\t\turl.searchParams.append('code_challenge_method', 'S256');\n\n\t\tif (params.prompt) {\n\t\t\turl.searchParams.append('prompt', params.prompt);\n\t\t}\n\t\tif (params.acrValues) {\n\t\t\turl.searchParams.append('acr_values', params.acrValues.join(' '));\n\t\t}\n\t\tif (params.loginHint) {\n\t\t\turl.searchParams.append('login_hint', params.loginHint);\n\t\t}\n\t\tif (params.uiLocales) {\n\t\t\turl.searchParams.append('ui_locales', params.uiLocales.join(' '));\n\t\t}\n\n\t\treturn url;\n\t}\n\n\tprotected async waitToInitialize(): Promise<void> {\n\t\tawait this.#initializationPromise;\n\t}\n\n\t/**\n\t * Sends a token request to the specified URL with the given data.\n\t *\n\t * @param {string} url - The URL to send the request to.\n\t * @param {Record<string, string>} [data={}] - The data to include in the request body.\n\t * @returns {Promise<HttpClientResponse<Session>>} - A promise that resolves to the response from the request.\n\t */\n\tasync sendTokenRequest(url: string, data: Record<string, string> = {}): Promise<HttpClientResponse<Session>> {\n\t\treturn this.httpClient.request<Session>(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/x-www-form-urlencoded' },\n\t\t\tbody: new URLSearchParams(data).toString(),\n\t\t});\n\t}\n\n\t/**\n\t * Subscribes a callback function to an event.\n\t *\n\t * @param {T} eventName - The name of the event to subscribe to.\n\t * @param {(...params: Parameters<EventFunctions[T]>) => Promise<void> | void} callbackFn - The callback function to execute when the event is dispatched.\n\t * @returns {{ dispose: () => void }} - An object with a `dispose` method to remove the subscription.\n\t */\n\tsubscribeToEvent<T extends keyof EventFunctions>(\n\t\teventName: T,\n\t\tcallbackFn: (...params: Parameters<EventFunctions[T]>) => Promise<void> | void,\n\t): { dispose: () => void } {\n\t\teventCallbacks[eventName].add(callbackFn);\n\n\t\treturn {\n\t\t\tdispose: () => {\n\t\t\t\teventCallbacks[eventName].delete(callbackFn);\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Dispatches an event to all subscribed callback functions.\n\t *\n\t * @param {T} eventName - The name of the event to dispatch.\n\t * @param {Parameters<EventFunctions[T]>} args - The arguments to pass to the callback functions.\n\t */\n\tprotected dispatchEvent<T extends keyof EventFunctions>(eventName: T, args: Parameters<EventFunctions[T]>): void {\n\t\tfor (const eventFn of eventCallbacks[eventName]) {\n\t\t\tvoid eventFn(...args);\n\t\t}\n\t}\n}\n"],"names":["eventCallbacks","BaseFlow","options","storage","httpClient","__privateAdd","_BaseFlow_instances","_initializationPromise","_isAuthenticatedPromise","_refreshInProgressState","__publicField","Metadata","__privateSet","__privateMethod","init_fn","_a","__privateGet","_b","timestamp","checkAuthentication_fn","params","session","url","request","jwt","success","Session","state","serializedState","State","_c","_d","_e","_f","data","eventName","callbackFn","args","eventFn","isAuthenticated"],"mappings":"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"}
@@ -57,6 +57,12 @@ export declare abstract class BaseFlow<Options extends SDKOptions = SDKOptions,
57
57
  * @type {string | null | undefined}
58
58
  */
59
59
  get refreshToken(): string | null | undefined;
60
+ /**
61
+ * Indicates whether a token refresh operation is currently in progress.
62
+ *
63
+ * @type {boolean}
64
+ */
65
+ get refreshInProgress(): boolean;
60
66
  /**
61
67
  * Determines if the access token has expired.
62
68
  *
@@ -75,6 +81,13 @@ export declare abstract class BaseFlow<Options extends SDKOptions = SDKOptions,
75
81
  * @returns {Promise<boolean>} - A promise that resolves to `true` if the user is authenticated, otherwise `false`.
76
82
  */
77
83
  get isAuthenticated(): Promise<boolean>;
84
+ /**
85
+ * Checks authentication status without attempting token refresh.
86
+ * Useful when you want to avoid side effects.
87
+ *
88
+ * @returns {boolean} - Returns `true` if the user has a valid, non-expired access token.
89
+ */
90
+ get isAuthenticatedSync(): boolean;
78
91
  /**
79
92
  * Constructs a new instance of the `BaseFlow` class.
80
93
  *
@@ -98,6 +111,12 @@ export declare abstract class BaseFlow<Options extends SDKOptions = SDKOptions,
98
111
  * @returns {Promise<void>} - A promise that resolves when the registration process is complete.
99
112
  */
100
113
  abstract register(params?: URLHandlerParams): unknown;
114
+ /**
115
+ * Initiates the entry process.
116
+ * @param {string} url Optional URL to use for the entry process. If not provided, the current window location will be used.
117
+ * @returns {Promise<void>} A promise that resolves when the entry process completes.
118
+ */
119
+ abstract entry(url?: string): unknown;
101
120
  /**
102
121
  * Logs out the current user and optionally redirects to a post-logout URI.
103
122
  *
@@ -1,2 +1,2 @@
1
- var S=Object.defineProperty;var _=t=>{throw TypeError(t)};var R=(t,e,s)=>e in t?S(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var o=(t,e,s)=>R(t,typeof e!="symbol"?e+"":e,s),k=(t,e,s)=>e.has(t)||_("Cannot "+s);var r=(t,e,s)=>(k(t,e,"read from private field"),s?s.call(t):e.get(t)),c=(t,e,s)=>e.has(t)?_("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,s),d=(t,e,s,i)=>(k(t,e,"write to private field"),i?i.call(t,s):e.set(t,s),s),E=(t,e,s)=>(k(t,e,"access private method"),s);import{jwt as y}from"../utils/jwt.mjs";import{timestamp as P}from"../utils/date.mjs";import{Metadata as x}from"../utils/Metadata.mjs";import{Session as v}from"../utils/Session.mjs";import{State as U}from"../utils/State.mjs";import"../utils/base64Url.mjs";import"../utils/crypto.mjs";const p={accessTokenExpired:new Set,init:new Set,loggedIn:new Set,loginInitiated:new Set,logoutInitiated:new Set,sessionLoaded:new Set,tokenRefreshed:new Set,tokenRefreshFailed:new Set,tokenRevoked:new Set,tokenRevokeFailed:new Set};var a,n,l,I;class b{constructor(e,s,i){c(this,l);c(this,a,!1);c(this,n,null);o(this,"httpClient");o(this,"storage");o(this,"metadata");o(this,"session",null);o(this,"options");if(!e.issuer)throw new Error("Missing option: issuer");if(!e.clientId)throw new Error("Missing option: clientId");if(!e.redirectUri)throw new Error("Missing option: redirectUri");if(!e.urlHandler)throw new Error("Missing option: urlHandler");if(!e.callbackHandler)throw new Error("Missing option: callbackHandler");if(e.scopes&&!Array.isArray(e.scopes))throw new Error("Invalid option: scopes");e.scopes||(e.scopes=["openid"]),e.responseType||(e.responseType="code"),e.responseMode||(e.responseMode="query"),e.storageTokenName||(e.storageTokenName="sty.session"),this.options=e,this.storage=s,this.httpClient=i,this.metadata=new x(this,new URL("/.well-known/openid-configuration",e.issuer).toString()),E(this,l,I).call(this)}get idTokenClaims(){var e;return(e=this.session)==null?void 0:e.claims}get accessToken(){var e;return(e=this.session)==null?void 0:e.access_token}get refreshToken(){var e;return(e=this.session)==null?void 0:e.refresh_token}get accessTokenExpired(){var e,s;return!((e=this.session)!=null&&e.access_token)||!((s=this.session)!=null&&s.expires_at)||this.session.expires_at<=P()}get accessTokenExpirationDate(){var e;return(e=this.session)==null?void 0:e.expires_at}get isAuthenticated(){return r(this,n)?r(this,n):(d(this,n,new Promise(async e=>{await this.waitToInitialize();try{this.refreshToken&&this.accessTokenExpired&&await this.refresh()}catch{}setTimeout(()=>{e(!this.accessTokenExpired),d(this,n,null)})})),r(this,n))}async logout(e){if(typeof this.options.urlHandler!="function")throw new Error("URL handler is not defined. Please provide a valid URL handler function in the SDK options.");await this.waitToInitialize();const s=this.session;if(!(s!=null&&s.id_token))return;await this.storage.delete(this.options.storageTokenName),this.session=null;const i=new URL(await this.metadata.endSessionEndpoint);i.searchParams.append("id_token_hint",s==null?void 0:s.id_token),e!=null&&e.postLogoutRedirectUri&&i.searchParams.append("post_logout_redirect_uri",e.postLogoutRedirectUri),this.dispatchEvent("logoutInitiated",[{idToken:s.id_token,claims:s.claims}]);try{await this.options.urlHandler(i.toString(),e)}catch{}}async refresh(){var s,i;if(await this.waitToInitialize(),typeof((s=this.session)==null?void 0:s.refresh_token)!="string")return;const e=this.session;try{const h=await this.sendTokenRequest(await this.metadata.tokenEndpoint,{grant_type:"refresh_token",client_id:this.options.clientId,refresh_token:(i=this.session)==null?void 0:i.refresh_token});Object.assign(this.session,await h.json()),this.session.id_token&&(this.session.claims=y.decode(this.session.id_token)),await this.storage.set(this.options.storageTokenName,JSON.stringify(this.session)),this.accessToken&&this.refreshToken&&this.idTokenClaims&&this.dispatchEvent("tokenRefreshed",[{accessToken:this.accessToken,refreshToken:this.refreshToken,claims:this.idTokenClaims}])}catch{this.session=null,await this.storage.delete(this.options.storageTokenName),this.dispatchEvent("tokenRefreshFailed",[{refreshToken:e.refresh_token}])}}async revoke(){await this.waitToInitialize();const e=this.session;let s=!0;try{e!=null&&e.refresh_token?await this.sendTokenRequest(await this.metadata.revocationEndpoint,{client_id:this.options.clientId,token_type_hint:"refresh_token",token:e.refresh_token}):e!=null&&e.access_token&&await this.sendTokenRequest(await this.metadata.revocationEndpoint,{client_id:this.options.clientId,token_type_hint:"access_token",token:e.access_token})}catch{s=!1}finally{this.session=null,await this.storage.delete(this.options.storageTokenName),e!=null&&e.refresh_token?this.dispatchEvent(s?"tokenRevoked":"tokenRevokeFailed",[{token:e.refresh_token,tokenTypeHint:"refresh_token"}]):e!=null&&e.access_token&&this.dispatchEvent(s?"tokenRevoked":"tokenRevokeFailed",[{token:e.access_token,tokenTypeHint:"access_token"}])}}async tokenExchange(e={}){var h,w,f,u,T,m;if(await this.waitToInitialize(),this.session=new v,Object.assign(this.session,e),this.session.error)throw new Error(`${this.session.error}: ${this.session.error_description}`);if(!this.session.code)throw new Error("Invalid or missing code");let s;try{const g=await this.storage.get(`sty.${this.session.state}`);if(!g)throw new Error;s=U.fromSerializedData(g),await this.storage.delete(`sty.${this.session.state}`)}catch{throw new Error("Invalid or missing state")}const i=await this.sendTokenRequest(await this.metadata.tokenEndpoint,{grant_type:"authorization_code",client_id:this.options.clientId,redirect_uri:this.options.redirectUri,code_verifier:s.codeVerifier,code:this.session.code});if(Object.assign(this.session,await i.json()),this.session.id_token&&(this.session.claims=y.decode(this.session.id_token)),this.session.error)throw new Error(`${this.session.error}: ${this.session.error_description}`);if(this.session.scope!==((h=this.options.scopes)==null?void 0:h.join(" ")))throw new Error("Invalid scope");if(((w=this.session.claims)==null?void 0:w.nonce)!==s.nonce)throw new Error("Invalid nonce");if(((f=this.session.claims)==null?void 0:f.iss)!==await this.metadata.issuer)throw new Error("Invalid iss");if(Array.isArray((u=this.session.claims)==null?void 0:u.aud)?((T=this.session.claims)==null?void 0:T.aud[0])!==this.options.clientId:((m=this.session.claims)==null?void 0:m.aud)!==this.options.clientId)throw new Error("Invalid aud");await this.storage.set(this.options.storageTokenName,JSON.stringify(this.session)),this.accessToken&&this.idTokenClaims&&this.dispatchEvent("loggedIn",[{accessToken:this.accessToken,refreshToken:this.refreshToken,claims:this.idTokenClaims}])}async getAuthorizationUrl(e={}){var i;const s=new URL(await this.metadata.authorizationEndpoint);return s.searchParams.append("client_id",this.options.clientId),s.searchParams.append("redirect_uri",this.options.redirectUri),s.searchParams.append("response_type",this.options.responseType||"code"),s.searchParams.append("response_mode",this.options.responseMode||"fragment"),s.searchParams.append("scope",((i=this.options.scopes)==null?void 0:i.join(" "))||""),s.searchParams.append("code_challenge_method","S256"),e.prompt&&s.searchParams.append("prompt",e.prompt),e.acrValues&&s.searchParams.append("acr_values",e.acrValues.join(" ")),e.loginHint&&s.searchParams.append("login_hint",e.loginHint),e.uiLocales&&s.searchParams.append("ui_locales",e.uiLocales.join(" ")),s}async waitToInitialize(){for(;!r(this,a);)await new Promise(e=>setTimeout(e,10))}async sendTokenRequest(e,s={}){return this.httpClient.request(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(s).toString()})}subscribeToEvent(e,s){return p[e].add(s),{dispose:()=>{p[e].delete(s)}}}dispatchEvent(e,s){for(const i of p[e])i(...s)}}a=new WeakMap,n=new WeakMap,l=new WeakSet,I=async function(){this.session=v.load(await this.storage.get(this.options.storageTokenName)),setTimeout(()=>{this.dispatchEvent("init",[]),this.session&&this.accessToken&&this.idTokenClaims&&this.dispatchEvent("sessionLoaded",[{accessToken:this.accessToken,refreshToken:this.refreshToken,claims:this.idTokenClaims}]),this.accessToken&&this.accessTokenExpired&&this.dispatchEvent("accessTokenExpired",[{accessToken:this.accessToken,refreshToken:this.refreshToken}]),d(this,a,!0)})};export{b as BaseFlow};
1
+ var P=Object.defineProperty;var E=t=>{throw TypeError(t)};var x=(t,e,s)=>e in t?P(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var o=(t,e,s)=>x(t,typeof e!="symbol"?e+"":e,s),p=(t,e,s)=>e.has(t)||E("Cannot "+s);var r=(t,e,s)=>(p(t,e,"read from private field"),s?s.call(t):e.get(t)),d=(t,e,s)=>e.has(t)?E("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,s),a=(t,e,s,i)=>(p(t,e,"write to private field"),i?i.call(t,s):e.set(t,s),s),f=(t,e,s)=>(p(t,e,"access private method"),s);import{jwt as v}from"../utils/jwt.mjs";import{timestamp as U}from"../utils/date.mjs";import{Metadata as z}from"../utils/Metadata.mjs";import{Session as I}from"../utils/Session.mjs";import{State as C}from"../utils/State.mjs";import"../utils/base64Url.mjs";import"../utils/crypto.mjs";const w={accessTokenExpired:new Set,init:new Set,loggedIn:new Set,loginInitiated:new Set,logoutInitiated:new Set,sessionLoaded:new Set,tokenRefreshed:new Set,tokenRefreshFailed:new Set,tokenRevoked:new Set,tokenRevokeFailed:new Set};var l,n,h,c,S,R;class F{constructor(e,s,i){d(this,c);d(this,l);d(this,n,null);d(this,h,!1);o(this,"httpClient");o(this,"storage");o(this,"metadata");o(this,"session",null);o(this,"options");if(!e.issuer)throw new Error("Missing option: issuer");if(!e.clientId)throw new Error("Missing option: clientId");if(!e.redirectUri)throw new Error("Missing option: redirectUri");if(!e.urlHandler)throw new Error("Missing option: urlHandler");if(!e.callbackHandler)throw new Error("Missing option: callbackHandler");if(e.scopes&&!Array.isArray(e.scopes))throw new Error("Invalid option: scopes");e.scopes||(e.scopes=["openid"]),e.responseType||(e.responseType="code"),e.responseMode||(e.responseMode="query"),e.storageTokenName||(e.storageTokenName="sty.session"),this.options=e,this.storage=s,this.httpClient=i,this.metadata=new z(this,new URL("/.well-known/openid-configuration",e.issuer).toString()),a(this,l,f(this,c,S).call(this))}get idTokenClaims(){var e;return(e=this.session)==null?void 0:e.claims}get accessToken(){var e;return(e=this.session)==null?void 0:e.access_token}get refreshToken(){var e;return(e=this.session)==null?void 0:e.refresh_token}get refreshInProgress(){return r(this,h)}get accessTokenExpired(){var e,s;return!((e=this.session)!=null&&e.access_token)||!((s=this.session)!=null&&s.expires_at)||this.session.expires_at<=U()}get accessTokenExpirationDate(){var e;return(e=this.session)==null?void 0:e.expires_at}get isAuthenticated(){return r(this,n)?r(this,n):(a(this,n,f(this,c,R).call(this)),r(this,n))}get isAuthenticatedSync(){var e;return!!((e=this.session)!=null&&e.access_token&&!this.accessTokenExpired)}async logout(e){if(typeof this.options.urlHandler!="function")throw new Error("URL handler is not defined. Please provide a valid URL handler function in the SDK options.");await this.waitToInitialize();const s=this.session;if(!(s!=null&&s.id_token))return;await this.storage.delete(this.options.storageTokenName),this.session=null;const i=new URL(await this.metadata.endSessionEndpoint);i.searchParams.append("id_token_hint",s==null?void 0:s.id_token),e!=null&&e.postLogoutRedirectUri&&i.searchParams.append("post_logout_redirect_uri",e.postLogoutRedirectUri),this.dispatchEvent("logoutInitiated",[{idToken:s.id_token,claims:s.claims}]);try{await this.options.urlHandler(i.toString(),e)}catch{}}async refresh(){var s,i;if(await this.waitToInitialize(),typeof((s=this.session)==null?void 0:s.refresh_token)!="string")return;const e=this.session;try{const k=await this.sendTokenRequest(await this.metadata.tokenEndpoint,{grant_type:"refresh_token",client_id:this.options.clientId,refresh_token:(i=this.session)==null?void 0:i.refresh_token});Object.assign(this.session,await k.json()),this.session.id_token&&(this.session.claims=v.decode(this.session.id_token)),await this.storage.set(this.options.storageTokenName,JSON.stringify(this.session)),this.accessToken&&this.refreshToken&&this.idTokenClaims&&this.dispatchEvent("tokenRefreshed",[{accessToken:this.accessToken,refreshToken:this.refreshToken,claims:this.idTokenClaims}])}catch{this.session=null,await this.storage.delete(this.options.storageTokenName),this.dispatchEvent("tokenRefreshFailed",[{refreshToken:e.refresh_token}])}}async revoke(){await this.waitToInitialize();const e=this.session;let s=!0;try{e!=null&&e.refresh_token?await this.sendTokenRequest(await this.metadata.revocationEndpoint,{client_id:this.options.clientId,token_type_hint:"refresh_token",token:e.refresh_token}):e!=null&&e.access_token&&await this.sendTokenRequest(await this.metadata.revocationEndpoint,{client_id:this.options.clientId,token_type_hint:"access_token",token:e.access_token})}catch{s=!1}finally{this.session=null,await this.storage.delete(this.options.storageTokenName),e!=null&&e.refresh_token?this.dispatchEvent(s?"tokenRevoked":"tokenRevokeFailed",[{token:e.refresh_token,tokenTypeHint:"refresh_token"}]):e!=null&&e.access_token&&this.dispatchEvent(s?"tokenRevoked":"tokenRevokeFailed",[{token:e.access_token,tokenTypeHint:"access_token"}])}}async tokenExchange(e={}){var k,u,g,T,m,_;if(await this.waitToInitialize(),this.session=new I,Object.assign(this.session,e),this.session.error)throw new Error(`${this.session.error}: ${this.session.error_description}`);if(!this.session.code)throw new Error("Invalid or missing code");let s;try{const y=await this.storage.get(`sty.${this.session.state}`);if(!y)throw new Error;s=C.fromSerializedData(y),await this.storage.delete(`sty.${this.session.state}`)}catch{throw new Error("Invalid or missing state")}const i=await this.sendTokenRequest(await this.metadata.tokenEndpoint,{grant_type:"authorization_code",client_id:this.options.clientId,redirect_uri:this.options.redirectUri,code_verifier:s.codeVerifier,code:this.session.code});if(Object.assign(this.session,await i.json()),this.session.id_token&&(this.session.claims=v.decode(this.session.id_token)),this.session.error)throw new Error(`${this.session.error}: ${this.session.error_description}`);if(this.session.scope!==((k=this.options.scopes)==null?void 0:k.join(" ")))throw new Error("Invalid scope");if(((u=this.session.claims)==null?void 0:u.nonce)!==s.nonce)throw new Error("Invalid nonce");if(((g=this.session.claims)==null?void 0:g.iss)!==await this.metadata.issuer)throw new Error("Invalid iss");if(Array.isArray((T=this.session.claims)==null?void 0:T.aud)?((m=this.session.claims)==null?void 0:m.aud[0])!==this.options.clientId:((_=this.session.claims)==null?void 0:_.aud)!==this.options.clientId)throw new Error("Invalid aud");await this.storage.set(this.options.storageTokenName,JSON.stringify(this.session)),this.accessToken&&this.idTokenClaims&&this.dispatchEvent("loggedIn",[{accessToken:this.accessToken,refreshToken:this.refreshToken,claims:this.idTokenClaims}])}async getAuthorizationUrl(e={}){var i;const s=new URL(await this.metadata.authorizationEndpoint);return s.searchParams.append("client_id",this.options.clientId),s.searchParams.append("redirect_uri",this.options.redirectUri),s.searchParams.append("response_type",this.options.responseType||"code"),s.searchParams.append("response_mode",this.options.responseMode||"fragment"),s.searchParams.append("scope",((i=this.options.scopes)==null?void 0:i.join(" "))||""),s.searchParams.append("code_challenge_method","S256"),e.prompt&&s.searchParams.append("prompt",e.prompt),e.acrValues&&s.searchParams.append("acr_values",e.acrValues.join(" ")),e.loginHint&&s.searchParams.append("login_hint",e.loginHint),e.uiLocales&&s.searchParams.append("ui_locales",e.uiLocales.join(" ")),s}async waitToInitialize(){await r(this,l)}async sendTokenRequest(e,s={}){return this.httpClient.request(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(s).toString()})}subscribeToEvent(e,s){return w[e].add(s),{dispose:()=>{w[e].delete(s)}}}dispatchEvent(e,s){for(const i of w[e])i(...s)}}l=new WeakMap,n=new WeakMap,h=new WeakMap,c=new WeakSet,S=async function(){this.session=I.load(await this.storage.get(this.options.storageTokenName)),this.dispatchEvent("init",[]),this.session&&this.accessToken&&this.idTokenClaims&&this.dispatchEvent("sessionLoaded",[{accessToken:this.accessToken,refreshToken:this.refreshToken,claims:this.idTokenClaims}]),this.accessToken&&this.accessTokenExpired&&this.dispatchEvent("accessTokenExpired",[{accessToken:this.accessToken,refreshToken:this.refreshToken}])},R=async function(){let e=!1;try{await this.waitToInitialize()}catch{}if(this.accessTokenExpired&&this.refreshToken&&!this.refreshInProgress)try{a(this,h,!0),await this.refresh()}catch{}finally{a(this,h,!1)}return this.accessTokenExpired||(e=!0),a(this,n,null),e};export{F as BaseFlow};
2
2
  //# sourceMappingURL=BaseFlow.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseFlow.mjs","sources":["../../src/flows/BaseFlow.ts"],"sourcesContent":["import type { IdTokenClaims, SDKOptions, SDKStorage, EventFunctions, ExtraRequestArgs, LogoutParams, SDKHttpClient, HttpClientResponse } from '../types';\nimport { jwt } from '../utils/jwt';\nimport { timestamp } from '../utils/date';\nimport { Metadata } from '../utils/Metadata';\nimport { Session } from '../utils/Session';\nimport { State } from '../utils/State';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst eventCallbacks: Record<keyof EventFunctions, Set<(...args: Array<any>) => Promise<void> | void>> = {\n\taccessTokenExpired: new Set(),\n\tinit: new Set(),\n\tloggedIn: new Set(),\n\tloginInitiated: new Set(),\n\tlogoutInitiated: new Set(),\n\tsessionLoaded: new Set(),\n\ttokenRefreshed: new Set(),\n\ttokenRefreshFailed: new Set(),\n\ttokenRevoked: new Set(),\n\ttokenRevokeFailed: new Set(),\n};\n\n/**\n * An abstract base class that provides common functionality for different OIDC flows.\n *\n * @template Options - The options type extending `SDKOptions` used for configuring the flow.\n * @template URLHandlerParams - The options type extending `ExtraRequestArgs` used for URL handling.\n */\nexport abstract class BaseFlow<Options extends SDKOptions = SDKOptions, URLHandlerParams extends ExtraRequestArgs = ExtraRequestArgs> {\n\t/**\n\t * @ignore\n\t */\n\t#initialized = false;\n\n\t/**\n\t * @ignore\n\t */\n\t#isAuthenticatedPromise: Promise<boolean> | null = null;\n\n\t/**\n\t * An instance of the HTTP client used for making requests.\n\t *\n\t * @type {SDKHttpClient}\n\t */\n\thttpClient: SDKHttpClient;\n\n\t/**\n\t * The storage mechanism used to persist session data.\n\t *\n\t * @type {SDKStorage}\n\t */\n\tstorage: SDKStorage;\n\n\t/**\n\t * Metadata information about the authorization server.\n\t *\n\t * @type {Metadata}\n\t */\n\tmetadata: Metadata;\n\n\t/**\n\t * The current session data.\n\t *\n\t * @type {Session | null}\n\t */\n\tsession: Session | null = null;\n\n\t/**\n\t * The configuration options for the flow.\n\t *\n\t * @type {Options}\n\t */\n\toptions: Options;\n\n\t/**\n\t * Retrieves the ID token claims from the current session.\n\t *\n\t * @type {IdTokenClaims | null | undefined}\n\t */\n\tget idTokenClaims(): IdTokenClaims | null | undefined {\n\t\treturn this.session?.claims;\n\t}\n\n\t/**\n\t * Retrieves the access token from the current session.\n\t *\n\t * @type {string | null | undefined}\n\t */\n\tget accessToken(): string | null | undefined {\n\t\treturn this.session?.access_token;\n\t}\n\n\t/**\n\t * Retrieves the refresh token from the current session.\n\t *\n\t * @type {string | null | undefined}\n\t */\n\tget refreshToken(): string | null | undefined {\n\t\treturn this.session?.refresh_token;\n\t}\n\n\t/**\n\t * Determines if the access token has expired.\n\t *\n\t * @type {boolean}\n\t */\n\tget accessTokenExpired(): boolean {\n\t\treturn !this.session?.access_token || !this.session?.expires_at || this.session.expires_at <= timestamp();\n\t}\n\n\t/**\n\t * Retrieves the access token expiration date.\n\t *\n\t * @type {number | null | undefined}\n\t */\n\tget accessTokenExpirationDate(): number | null | undefined {\n\t\treturn this.session?.expires_at;\n\t}\n\n\t/**\n\t * Checks if the user is authenticated by evaluating the presence of access or refresh tokens.\n\t *\n\t * @returns {Promise<boolean>} - A promise that resolves to `true` if the user is authenticated, otherwise `false`.\n\t */\n\tget isAuthenticated(): Promise<boolean> {\n\t\tif (this.#isAuthenticatedPromise) {\n\t\t\treturn this.#isAuthenticatedPromise;\n\t\t}\n\n\t\t// eslint-disable-next-line no-async-promise-executor, @typescript-eslint/no-misused-promises\n\t\tthis.#isAuthenticatedPromise = new Promise(async (resolve) => {\n\t\t\tawait this.waitToInitialize();\n\n\t\t\ttry {\n\t\t\t\tif (this.refreshToken && this.accessTokenExpired) {\n\t\t\t\t\tawait this.refresh();\n\t\t\t\t}\n\t\t\t} catch {}\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tresolve(!this.accessTokenExpired);\n\t\t\t\tthis.#isAuthenticatedPromise = null;\n\t\t\t});\n\t\t});\n\n\t\treturn this.#isAuthenticatedPromise;\n\t}\n\n\t/**\n\t * Constructs a new instance of the `BaseFlow` class.\n\t *\n\t * @param {Options} options - Configuration options for the flow.\n\t * @param {SDKStorage} storage - Storage mechanism for session data.\n\t *\n\t * @throws {Error} Throws an error if required options are missing or invalid.\n\t */\n\tconstructor(options: Options, storage: SDKStorage, httpClient: SDKHttpClient) {\n\t\tif (!options.issuer) {\n\t\t\tthrow new Error('Missing option: issuer');\n\t\t}\n\t\tif (!options.clientId) {\n\t\t\tthrow new Error('Missing option: clientId');\n\t\t}\n\t\tif (!options.redirectUri) {\n\t\t\tthrow new Error('Missing option: redirectUri');\n\t\t}\n\t\tif (!options.urlHandler) {\n\t\t\tthrow new Error('Missing option: urlHandler');\n\t\t}\n\t\tif (!options.callbackHandler) {\n\t\t\tthrow new Error('Missing option: callbackHandler');\n\t\t}\n\t\tif (options.scopes && !Array.isArray(options.scopes)) {\n\t\t\tthrow new Error('Invalid option: scopes');\n\t\t}\n\n\t\tif (!options.scopes) {\n\t\t\toptions.scopes = ['openid'];\n\t\t}\n\t\tif (!options.responseType) {\n\t\t\toptions.responseType = 'code';\n\t\t}\n\t\tif (!options.responseMode) {\n\t\t\toptions.responseMode = 'query';\n\t\t}\n\t\tif (!options.storageTokenName) {\n\t\t\toptions.storageTokenName = 'sty.session';\n\t\t}\n\n\t\tthis.options = options;\n\t\tthis.storage = storage;\n\t\tthis.httpClient = httpClient;\n\t\tthis.metadata = new Metadata(this, new URL('/.well-known/openid-configuration', options.issuer).toString());\n\n\t\tvoid this.#init();\n\t}\n\n\t/**\n\t * Initializes the flow by loading the session from storage and setting up event listeners.\n\t * @ignore\n\t */\n\tasync #init() {\n\t\tthis.session = Session.load(await this.storage.get(this.options.storageTokenName!));\n\n\t\tsetTimeout(() => {\n\t\t\tthis.dispatchEvent('init', []);\n\n\t\t\tif (this.session && this.accessToken && this.idTokenClaims) {\n\t\t\t\tthis.dispatchEvent('sessionLoaded', [{ accessToken: this.accessToken, refreshToken: this.refreshToken, claims: this.idTokenClaims }]);\n\t\t\t}\n\n\t\t\tif (this.accessToken && this.accessTokenExpired) {\n\t\t\t\tthis.dispatchEvent('accessTokenExpired', [{ accessToken: this.accessToken, refreshToken: this.refreshToken }]);\n\t\t\t}\n\n\t\t\tthis.#initialized = true;\n\t\t});\n\t}\n\n\t/**\n\t * Initiates the login process. Subclasses should implement this method to handle the specific login flow.\n\t *\n\t * @param {URLHandlerParams} [params] - Additional params for handling URLs during login.\n\t * @returns {Promise<void>} - A promise that resolves when the login process is complete.\n\t */\n\tabstract login(params?: URLHandlerParams): unknown;\n\n\t/**\n\t * Registers a new user. Subclasses should implement this method to handle the specific registration flow.\n\t *\n\t * @param {URLHandlerParams} [params] - Additional params for handling URLs during registration.\n\t * @returns {Promise<void>} - A promise that resolves when the registration process is complete.\n\t */\n\tabstract register(params?: URLHandlerParams): unknown;\n\n\t/**\n\t * Logs out the current user and optionally redirects to a post-logout URI.\n\t *\n\t * @param {URLHandlerParams & LogoutParams} [params] - Additional params for handling URLs during logout.\n\t * @returns {Promise<void>} - A promise that resolves when the logout process is complete.\n\t */\n\tasync logout(params?: URLHandlerParams & LogoutParams): Promise<void> {\n\t\tif (typeof this.options.urlHandler !== 'function') {\n\t\t\tthrow new Error('URL handler is not defined. Please provide a valid URL handler function in the SDK options.');\n\t\t}\n\n\t\tawait this.waitToInitialize();\n\n\t\tconst session = this.session;\n\n\t\tif (!session?.id_token) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.storage.delete(this.options.storageTokenName!);\n\t\tthis.session = null;\n\n\t\tconst url = new URL(await this.metadata.endSessionEndpoint);\n\n\t\turl.searchParams.append('id_token_hint', session?.id_token);\n\n\t\tif (params?.postLogoutRedirectUri) {\n\t\t\turl.searchParams.append('post_logout_redirect_uri', params.postLogoutRedirectUri);\n\t\t}\n\n\t\tthis.dispatchEvent('logoutInitiated', [{ idToken: session.id_token, claims: session.claims! }]);\n\n\t\ttry {\n\t\t\tawait this.options.urlHandler(url.toString(), params as URLHandlerParams);\n\t\t} catch {}\n\t}\n\n\t/**\n\t * Refreshes the access token using the refresh token.\n\t *\n\t * @returns {Promise<void>} - A promise that resolves when the token refresh is complete.\n\t *\n\t * @throws {Error} Throws an error if the refresh fails.\n\t */\n\tasync refresh(): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tif (typeof this.session?.refresh_token !== 'string') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst session = this.session;\n\n\t\ttry {\n\t\t\tconst request = await this.sendTokenRequest(await this.metadata.tokenEndpoint, {\n\t\t\t\tgrant_type: 'refresh_token',\n\t\t\t\tclient_id: this.options.clientId,\n\t\t\t\trefresh_token: this.session?.refresh_token,\n\t\t\t});\n\n\t\t\tObject.assign(this.session, await request.json());\n\n\t\t\tif (this.session.id_token) {\n\t\t\t\tthis.session.claims = jwt.decode<IdTokenClaims>(this.session.id_token);\n\t\t\t}\n\n\t\t\tawait this.storage.set(this.options.storageTokenName!, JSON.stringify(this.session));\n\n\t\t\tif (this.accessToken && this.refreshToken && this.idTokenClaims) {\n\t\t\t\tthis.dispatchEvent('tokenRefreshed', [{ accessToken: this.accessToken, refreshToken: this.refreshToken, claims: this.idTokenClaims }]);\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.session = null;\n\t\t\tawait this.storage.delete(this.options.storageTokenName!);\n\n\t\t\tthis.dispatchEvent('tokenRefreshFailed', [{ refreshToken: session.refresh_token! }]);\n\t\t}\n\t}\n\n\t/**\n\t * Revokes the current access or refresh token.\n\t *\n\t * @returns {Promise<void>} - A promise that resolves when the token revocation is complete.\n\t */\n\tasync revoke(): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tconst session = this.session;\n\t\tlet success = true;\n\n\t\ttry {\n\t\t\tif (session?.refresh_token) {\n\t\t\t\tawait this.sendTokenRequest(await this.metadata.revocationEndpoint, {\n\t\t\t\t\tclient_id: this.options.clientId,\n\t\t\t\t\ttoken_type_hint: 'refresh_token',\n\t\t\t\t\ttoken: session.refresh_token,\n\t\t\t\t});\n\t\t\t} else if (session?.access_token) {\n\t\t\t\tawait this.sendTokenRequest(await this.metadata.revocationEndpoint, {\n\t\t\t\t\tclient_id: this.options.clientId,\n\t\t\t\t\ttoken_type_hint: 'access_token',\n\t\t\t\t\ttoken: session.access_token,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch {\n\t\t\tsuccess = false;\n\t\t} finally {\n\t\t\tthis.session = null;\n\t\t\tawait this.storage.delete(this.options.storageTokenName!);\n\n\t\t\tif (session?.refresh_token) {\n\t\t\t\tthis.dispatchEvent(success ? 'tokenRevoked' : 'tokenRevokeFailed', [{ token: session.refresh_token, tokenTypeHint: 'refresh_token' }]);\n\t\t\t} else if (session?.access_token) {\n\t\t\t\tthis.dispatchEvent(success ? 'tokenRevoked' : 'tokenRevokeFailed', [{ token: session.access_token, tokenTypeHint: 'access_token' }]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Exchanges an authorization code for access and refresh tokens.\n\t *\n\t * @param {Record<string, string>} [params={}] - Parameters containing the authorization code and other required values.\n\t * @returns {Promise<void>} - A promise that resolves when the token exchange is complete.\n\t *\n\t * @throws {Error} Throws an error if the authorization code is invalid or if there are issues with state, nonce, or tokens.\n\t */\n\tasync tokenExchange(params: Record<string, string> = {}): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tthis.session = new Session();\n\n\t\tObject.assign(this.session, params);\n\n\t\tif (this.session.error) {\n\t\t\tthrow new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t}\n\t\tif (!this.session.code) {\n\t\t\tthrow new Error('Invalid or missing code');\n\t\t}\n\n\t\tlet state: State;\n\n\t\ttry {\n\t\t\tconst serializedState = await this.storage.get(`sty.${this.session.state}`);\n\n\t\t\tif (!serializedState) {\n\t\t\t\tthrow new Error();\n\t\t\t}\n\n\t\t\tstate = State.fromSerializedData(serializedState);\n\n\t\t\tawait this.storage.delete(`sty.${this.session.state}`);\n\t\t} catch {\n\t\t\tthrow new Error('Invalid or missing state');\n\t\t}\n\n\t\tconst request = await this.sendTokenRequest(await this.metadata.tokenEndpoint, {\n\t\t\tgrant_type: 'authorization_code',\n\t\t\tclient_id: this.options.clientId,\n\t\t\tredirect_uri: this.options.redirectUri,\n\t\t\tcode_verifier: state.codeVerifier,\n\t\t\tcode: this.session.code,\n\t\t});\n\n\t\tObject.assign(this.session, await request.json());\n\n\t\tif (this.session.id_token) {\n\t\t\tthis.session.claims = jwt.decode<IdTokenClaims>(this.session.id_token);\n\t\t}\n\n\t\tif (this.session.error) {\n\t\t\tthrow new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t}\n\t\tif (this.session.scope !== this.options.scopes?.join(' ')) {\n\t\t\tthrow new Error('Invalid scope');\n\t\t}\n\t\tif (this.session.claims?.nonce !== state.nonce) {\n\t\t\tthrow new Error('Invalid nonce');\n\t\t}\n\t\tif (this.session.claims?.iss !== (await this.metadata.issuer)) {\n\t\t\tthrow new Error('Invalid iss');\n\t\t}\n\t\tif (Array.isArray(this.session.claims?.aud) ? this.session.claims?.aud[0] !== this.options.clientId : this.session.claims?.aud !== this.options.clientId) {\n\t\t\tthrow new Error('Invalid aud');\n\t\t}\n\n\t\tawait this.storage.set(this.options.storageTokenName!, JSON.stringify(this.session));\n\n\t\tif (this.accessToken && this.idTokenClaims) {\n\t\t\tthis.dispatchEvent('loggedIn', [{ accessToken: this.accessToken, refreshToken: this.refreshToken, claims: this.idTokenClaims }]);\n\t\t}\n\t}\n\n\t/**\n\t * Constructs the authorization URL for initiating the authorization flow.\n\t *\n\t * @param {ExtraRequestArgs} [params={}] - Additional params to include in the authorization URL.\n\t * @returns {Promise<URL>} - A promise that resolves to the constructed authorization URL.\n\t */\n\tasync getAuthorizationUrl(params: ExtraRequestArgs = {}): Promise<URL> {\n\t\tconst url = new URL(await this.metadata.authorizationEndpoint);\n\n\t\turl.searchParams.append('client_id', this.options.clientId);\n\t\turl.searchParams.append('redirect_uri', this.options.redirectUri);\n\t\turl.searchParams.append('response_type', this.options.responseType || 'code');\n\t\turl.searchParams.append('response_mode', this.options.responseMode || 'fragment');\n\t\turl.searchParams.append('scope', this.options.scopes?.join(' ') || '');\n\t\turl.searchParams.append('code_challenge_method', 'S256');\n\n\t\tif (params.prompt) {\n\t\t\turl.searchParams.append('prompt', params.prompt);\n\t\t}\n\t\tif (params.acrValues) {\n\t\t\turl.searchParams.append('acr_values', params.acrValues.join(' '));\n\t\t}\n\t\tif (params.loginHint) {\n\t\t\turl.searchParams.append('login_hint', params.loginHint);\n\t\t}\n\t\tif (params.uiLocales) {\n\t\t\turl.searchParams.append('ui_locales', params.uiLocales.join(' '));\n\t\t}\n\n\t\treturn url;\n\t}\n\n\tprotected async waitToInitialize(): Promise<void> {\n\t\twhile (!this.#initialized) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 10));\n\t\t}\n\t}\n\n\t/**\n\t * Sends a token request to the specified URL with the given data.\n\t *\n\t * @param {string} url - The URL to send the request to.\n\t * @param {Record<string, string>} [data={}] - The data to include in the request body.\n\t * @returns {Promise<HttpClientResponse<Session>>} - A promise that resolves to the response from the request.\n\t */\n\tasync sendTokenRequest(url: string, data: Record<string, string> = {}): Promise<HttpClientResponse<Session>> {\n\t\treturn this.httpClient.request<Session>(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/x-www-form-urlencoded' },\n\t\t\tbody: new URLSearchParams(data).toString(),\n\t\t});\n\t}\n\n\t/**\n\t * Subscribes a callback function to an event.\n\t *\n\t * @param {T} eventName - The name of the event to subscribe to.\n\t * @param {(...params: Parameters<EventFunctions[T]>) => Promise<void> | void} callbackFn - The callback function to execute when the event is dispatched.\n\t * @returns {{ dispose: () => void }} - An object with a `dispose` method to remove the subscription.\n\t */\n\tsubscribeToEvent<T extends keyof EventFunctions>(\n\t\teventName: T,\n\t\tcallbackFn: (...params: Parameters<EventFunctions[T]>) => Promise<void> | void,\n\t): { dispose: () => void } {\n\t\teventCallbacks[eventName].add(callbackFn);\n\n\t\treturn {\n\t\t\tdispose: () => {\n\t\t\t\teventCallbacks[eventName].delete(callbackFn);\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Dispatches an event to all subscribed callback functions.\n\t *\n\t * @param {T} eventName - The name of the event to dispatch.\n\t * @param {Parameters<EventFunctions[T]>} args - The arguments to pass to the callback functions.\n\t */\n\tprotected dispatchEvent<T extends keyof EventFunctions>(eventName: T, args: Parameters<EventFunctions[T]>): void {\n\t\tfor (const eventFn of eventCallbacks[eventName]) {\n\t\t\tvoid eventFn(...args);\n\t\t}\n\t}\n}\n"],"names":["eventCallbacks","BaseFlow","options","storage","httpClient","__privateAdd","_BaseFlow_instances","_initialized","_isAuthenticatedPromise","__publicField","Metadata","__privateMethod","init_fn","_a","_b","timestamp","__privateGet","__privateSet","resolve","params","session","url","request","jwt","success","Session","state","serializedState","State","_c","_d","_e","_f","data","eventName","callbackFn","args","eventFn"],"mappings":"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"}
1
+ {"version":3,"file":"BaseFlow.mjs","sources":["../../src/flows/BaseFlow.ts"],"sourcesContent":["import type { IdTokenClaims, SDKOptions, SDKStorage, EventFunctions, ExtraRequestArgs, LogoutParams, SDKHttpClient, HttpClientResponse } from '../types';\nimport { jwt } from '../utils/jwt';\nimport { timestamp } from '../utils/date';\nimport { Metadata } from '../utils/Metadata';\nimport { Session } from '../utils/Session';\nimport { State } from '../utils/State';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst eventCallbacks: Record<keyof EventFunctions, Set<(...args: Array<any>) => Promise<void> | void>> = {\n\taccessTokenExpired: new Set(),\n\tinit: new Set(),\n\tloggedIn: new Set(),\n\tloginInitiated: new Set(),\n\tlogoutInitiated: new Set(),\n\tsessionLoaded: new Set(),\n\ttokenRefreshed: new Set(),\n\ttokenRefreshFailed: new Set(),\n\ttokenRevoked: new Set(),\n\ttokenRevokeFailed: new Set(),\n};\n\n/**\n * An abstract base class that provides common functionality for different OIDC flows.\n *\n * @template Options - The options type extending `SDKOptions` used for configuring the flow.\n * @template URLHandlerParams - The options type extending `ExtraRequestArgs` used for URL handling.\n */\nexport abstract class BaseFlow<Options extends SDKOptions = SDKOptions, URLHandlerParams extends ExtraRequestArgs = ExtraRequestArgs> {\n\t/**\n\t * @ignore\n\t */\n\t#initializationPromise: Promise<void>;\n\n\t/**\n\t * @ignore\n\t */\n\t#isAuthenticatedPromise: Promise<boolean> | null = null;\n\n\t/**\n\t * Indicates whether a token refresh operation is currently in progress.\n\t *\n\t * @type {boolean}\n\t */\n\t#refreshInProgressState = false;\n\n\t/**\n\t * An instance of the HTTP client used for making requests.\n\t *\n\t * @type {SDKHttpClient}\n\t */\n\thttpClient: SDKHttpClient;\n\n\t/**\n\t * The storage mechanism used to persist session data.\n\t *\n\t * @type {SDKStorage}\n\t */\n\tstorage: SDKStorage;\n\n\t/**\n\t * Metadata information about the authorization server.\n\t *\n\t * @type {Metadata}\n\t */\n\tmetadata: Metadata;\n\n\t/**\n\t * The current session data.\n\t *\n\t * @type {Session | null}\n\t */\n\tsession: Session | null = null;\n\n\t/**\n\t * The configuration options for the flow.\n\t *\n\t * @type {Options}\n\t */\n\toptions: Options;\n\n\t/**\n\t * Retrieves the ID token claims from the current session.\n\t *\n\t * @type {IdTokenClaims | null | undefined}\n\t */\n\tget idTokenClaims(): IdTokenClaims | null | undefined {\n\t\treturn this.session?.claims;\n\t}\n\n\t/**\n\t * Retrieves the access token from the current session.\n\t *\n\t * @type {string | null | undefined}\n\t */\n\tget accessToken(): string | null | undefined {\n\t\treturn this.session?.access_token;\n\t}\n\n\t/**\n\t * Retrieves the refresh token from the current session.\n\t *\n\t * @type {string | null | undefined}\n\t */\n\tget refreshToken(): string | null | undefined {\n\t\treturn this.session?.refresh_token;\n\t}\n\n\t/**\n\t * Indicates whether a token refresh operation is currently in progress.\n\t *\n\t * @type {boolean}\n\t */\n\tget refreshInProgress(): boolean {\n\t\treturn this.#refreshInProgressState;\n\t}\n\n\t/**\n\t * Determines if the access token has expired.\n\t *\n\t * @type {boolean}\n\t */\n\tget accessTokenExpired(): boolean {\n\t\treturn !this.session?.access_token || !this.session?.expires_at || this.session.expires_at <= timestamp();\n\t}\n\n\t/**\n\t * Retrieves the access token expiration date.\n\t *\n\t * @type {number | null | undefined}\n\t */\n\tget accessTokenExpirationDate(): number | null | undefined {\n\t\treturn this.session?.expires_at;\n\t}\n\n\t/**\n\t * Checks if the user is authenticated by evaluating the presence of access or refresh tokens.\n\t *\n\t * @returns {Promise<boolean>} - A promise that resolves to `true` if the user is authenticated, otherwise `false`.\n\t */\n\tget isAuthenticated(): Promise<boolean> {\n\t\tif (this.#isAuthenticatedPromise) {\n\t\t\treturn this.#isAuthenticatedPromise;\n\t\t}\n\n\t\tthis.#isAuthenticatedPromise = this.#checkAuthentication();\n\n\t\treturn this.#isAuthenticatedPromise;\n\t}\n\n\t/**\n\t * Checks authentication status without attempting token refresh.\n\t * Useful when you want to avoid side effects.\n\t *\n\t * @returns {boolean} - Returns `true` if the user has a valid, non-expired access token.\n\t */\n\tget isAuthenticatedSync(): boolean {\n\t\treturn Boolean(this.session?.access_token && !this.accessTokenExpired);\n\t}\n\n\t/**\n\t * Constructs a new instance of the `BaseFlow` class.\n\t *\n\t * @param {Options} options - Configuration options for the flow.\n\t * @param {SDKStorage} storage - Storage mechanism for session data.\n\t *\n\t * @throws {Error} Throws an error if required options are missing or invalid.\n\t */\n\tconstructor(options: Options, storage: SDKStorage, httpClient: SDKHttpClient) {\n\t\tif (!options.issuer) {\n\t\t\tthrow new Error('Missing option: issuer');\n\t\t}\n\t\tif (!options.clientId) {\n\t\t\tthrow new Error('Missing option: clientId');\n\t\t}\n\t\tif (!options.redirectUri) {\n\t\t\tthrow new Error('Missing option: redirectUri');\n\t\t}\n\t\tif (!options.urlHandler) {\n\t\t\tthrow new Error('Missing option: urlHandler');\n\t\t}\n\t\tif (!options.callbackHandler) {\n\t\t\tthrow new Error('Missing option: callbackHandler');\n\t\t}\n\t\tif (options.scopes && !Array.isArray(options.scopes)) {\n\t\t\tthrow new Error('Invalid option: scopes');\n\t\t}\n\n\t\tif (!options.scopes) {\n\t\t\toptions.scopes = ['openid'];\n\t\t}\n\t\tif (!options.responseType) {\n\t\t\toptions.responseType = 'code';\n\t\t}\n\t\tif (!options.responseMode) {\n\t\t\toptions.responseMode = 'query';\n\t\t}\n\t\tif (!options.storageTokenName) {\n\t\t\toptions.storageTokenName = 'sty.session';\n\t\t}\n\n\t\tthis.options = options;\n\t\tthis.storage = storage;\n\t\tthis.httpClient = httpClient;\n\t\tthis.metadata = new Metadata(this, new URL('/.well-known/openid-configuration', options.issuer).toString());\n\n\t\tthis.#initializationPromise = this.#init();\n\t}\n\n\t/**\n\t * Initializes the flow by loading the session from storage and setting up event listeners.\n\t * @ignore\n\t */\n\tasync #init() {\n\t\tthis.session = Session.load(await this.storage.get(this.options.storageTokenName!));\n\n\t\tthis.dispatchEvent('init', []);\n\n\t\tif (this.session && this.accessToken && this.idTokenClaims) {\n\t\t\tthis.dispatchEvent('sessionLoaded', [{ accessToken: this.accessToken, refreshToken: this.refreshToken, claims: this.idTokenClaims }]);\n\t\t}\n\n\t\tif (this.accessToken && this.accessTokenExpired) {\n\t\t\tthis.dispatchEvent('accessTokenExpired', [{ accessToken: this.accessToken, refreshToken: this.refreshToken }]);\n\t\t}\n\t}\n\n\t/**\n\t * Internal method to check authentication status with proper error handling.\n\t * @ignore\n\t */\n\tasync #checkAuthentication(): Promise<boolean> {\n\t\tlet isAuthenticated = false;\n\n\t\ttry {\n\t\t\tawait this.waitToInitialize();\n\t\t} catch {\n\t\t\t// Initialization failed\n\t\t}\n\n\t\t// Attempt to refresh the token if it has expired\n\t\tif (this.accessTokenExpired && this.refreshToken && !this.refreshInProgress) {\n\t\t\ttry {\n\t\t\t\tthis.#refreshInProgressState = true;\n\t\t\t\tawait this.refresh();\n\t\t\t} catch {\n\t\t\t\t// Token refresh failed - if you want to log errors use the tokenRefreshFailed event\n\t\t\t} finally {\n\t\t\t\tthis.#refreshInProgressState = false;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.accessTokenExpired) {\n\t\t\tisAuthenticated = true;\n\t\t}\n\n\t\tthis.#isAuthenticatedPromise = null;\n\n\t\treturn isAuthenticated;\n\t}\n\n\t/**\n\t * Initiates the login process. Subclasses should implement this method to handle the specific login flow.\n\t *\n\t * @param {URLHandlerParams} [params] - Additional params for handling URLs during login.\n\t * @returns {Promise<void>} - A promise that resolves when the login process is complete.\n\t */\n\tabstract login(params?: URLHandlerParams): unknown;\n\n\t/**\n\t * Registers a new user. Subclasses should implement this method to handle the specific registration flow.\n\t *\n\t * @param {URLHandlerParams} [params] - Additional params for handling URLs during registration.\n\t * @returns {Promise<void>} - A promise that resolves when the registration process is complete.\n\t */\n\tabstract register(params?: URLHandlerParams): unknown;\n\n\t/**\n\t * Initiates the entry process.\n\t * @param {string} url Optional URL to use for the entry process. If not provided, the current window location will be used.\n\t * @returns {Promise<void>} A promise that resolves when the entry process completes.\n\t */\n\tabstract entry(url?: string): unknown;\n\n\t/**\n\t * Logs out the current user and optionally redirects to a post-logout URI.\n\t *\n\t * @param {URLHandlerParams & LogoutParams} [params] - Additional params for handling URLs during logout.\n\t * @returns {Promise<void>} - A promise that resolves when the logout process is complete.\n\t */\n\tasync logout(params?: URLHandlerParams & LogoutParams): Promise<void> {\n\t\tif (typeof this.options.urlHandler !== 'function') {\n\t\t\tthrow new Error('URL handler is not defined. Please provide a valid URL handler function in the SDK options.');\n\t\t}\n\n\t\tawait this.waitToInitialize();\n\n\t\tconst session = this.session;\n\n\t\tif (!session?.id_token) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.storage.delete(this.options.storageTokenName!);\n\t\tthis.session = null;\n\n\t\tconst url = new URL(await this.metadata.endSessionEndpoint);\n\n\t\turl.searchParams.append('id_token_hint', session?.id_token);\n\n\t\tif (params?.postLogoutRedirectUri) {\n\t\t\turl.searchParams.append('post_logout_redirect_uri', params.postLogoutRedirectUri);\n\t\t}\n\n\t\tthis.dispatchEvent('logoutInitiated', [{ idToken: session.id_token, claims: session.claims! }]);\n\n\t\ttry {\n\t\t\tawait this.options.urlHandler(url.toString(), params as URLHandlerParams);\n\t\t} catch {}\n\t}\n\n\t/**\n\t * Refreshes the access token using the refresh token.\n\t *\n\t * @returns {Promise<void>} - A promise that resolves when the token refresh is complete.\n\t *\n\t * @throws {Error} Throws an error if the refresh fails.\n\t */\n\tasync refresh(): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tif (typeof this.session?.refresh_token !== 'string') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst session = this.session;\n\n\t\ttry {\n\t\t\tconst request = await this.sendTokenRequest(await this.metadata.tokenEndpoint, {\n\t\t\t\tgrant_type: 'refresh_token',\n\t\t\t\tclient_id: this.options.clientId,\n\t\t\t\trefresh_token: this.session?.refresh_token,\n\t\t\t});\n\n\t\t\tObject.assign(this.session, await request.json());\n\n\t\t\tif (this.session.id_token) {\n\t\t\t\tthis.session.claims = jwt.decode<IdTokenClaims>(this.session.id_token);\n\t\t\t}\n\n\t\t\tawait this.storage.set(this.options.storageTokenName!, JSON.stringify(this.session));\n\n\t\t\tif (this.accessToken && this.refreshToken && this.idTokenClaims) {\n\t\t\t\tthis.dispatchEvent('tokenRefreshed', [{ accessToken: this.accessToken, refreshToken: this.refreshToken, claims: this.idTokenClaims }]);\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.session = null;\n\t\t\tawait this.storage.delete(this.options.storageTokenName!);\n\n\t\t\tthis.dispatchEvent('tokenRefreshFailed', [{ refreshToken: session.refresh_token! }]);\n\t\t}\n\t}\n\n\t/**\n\t * Revokes the current access or refresh token.\n\t *\n\t * @returns {Promise<void>} - A promise that resolves when the token revocation is complete.\n\t */\n\tasync revoke(): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tconst session = this.session;\n\t\tlet success = true;\n\n\t\ttry {\n\t\t\tif (session?.refresh_token) {\n\t\t\t\tawait this.sendTokenRequest(await this.metadata.revocationEndpoint, {\n\t\t\t\t\tclient_id: this.options.clientId,\n\t\t\t\t\ttoken_type_hint: 'refresh_token',\n\t\t\t\t\ttoken: session.refresh_token,\n\t\t\t\t});\n\t\t\t} else if (session?.access_token) {\n\t\t\t\tawait this.sendTokenRequest(await this.metadata.revocationEndpoint, {\n\t\t\t\t\tclient_id: this.options.clientId,\n\t\t\t\t\ttoken_type_hint: 'access_token',\n\t\t\t\t\ttoken: session.access_token,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch {\n\t\t\tsuccess = false;\n\t\t} finally {\n\t\t\tthis.session = null;\n\t\t\tawait this.storage.delete(this.options.storageTokenName!);\n\n\t\t\tif (session?.refresh_token) {\n\t\t\t\tthis.dispatchEvent(success ? 'tokenRevoked' : 'tokenRevokeFailed', [{ token: session.refresh_token, tokenTypeHint: 'refresh_token' }]);\n\t\t\t} else if (session?.access_token) {\n\t\t\t\tthis.dispatchEvent(success ? 'tokenRevoked' : 'tokenRevokeFailed', [{ token: session.access_token, tokenTypeHint: 'access_token' }]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Exchanges an authorization code for access and refresh tokens.\n\t *\n\t * @param {Record<string, string>} [params={}] - Parameters containing the authorization code and other required values.\n\t * @returns {Promise<void>} - A promise that resolves when the token exchange is complete.\n\t *\n\t * @throws {Error} Throws an error if the authorization code is invalid or if there are issues with state, nonce, or tokens.\n\t */\n\tasync tokenExchange(params: Record<string, string> = {}): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tthis.session = new Session();\n\n\t\tObject.assign(this.session, params);\n\n\t\tif (this.session.error) {\n\t\t\tthrow new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t}\n\t\tif (!this.session.code) {\n\t\t\tthrow new Error('Invalid or missing code');\n\t\t}\n\n\t\tlet state: State;\n\n\t\ttry {\n\t\t\tconst serializedState = await this.storage.get(`sty.${this.session.state}`);\n\n\t\t\tif (!serializedState) {\n\t\t\t\tthrow new Error();\n\t\t\t}\n\n\t\t\tstate = State.fromSerializedData(serializedState);\n\n\t\t\tawait this.storage.delete(`sty.${this.session.state}`);\n\t\t} catch {\n\t\t\tthrow new Error('Invalid or missing state');\n\t\t}\n\n\t\tconst request = await this.sendTokenRequest(await this.metadata.tokenEndpoint, {\n\t\t\tgrant_type: 'authorization_code',\n\t\t\tclient_id: this.options.clientId,\n\t\t\tredirect_uri: this.options.redirectUri,\n\t\t\tcode_verifier: state.codeVerifier,\n\t\t\tcode: this.session.code,\n\t\t});\n\n\t\tObject.assign(this.session, await request.json());\n\n\t\tif (this.session.id_token) {\n\t\t\tthis.session.claims = jwt.decode<IdTokenClaims>(this.session.id_token);\n\t\t}\n\n\t\tif (this.session.error) {\n\t\t\tthrow new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t}\n\t\tif (this.session.scope !== this.options.scopes?.join(' ')) {\n\t\t\tthrow new Error('Invalid scope');\n\t\t}\n\t\tif (this.session.claims?.nonce !== state.nonce) {\n\t\t\tthrow new Error('Invalid nonce');\n\t\t}\n\t\tif (this.session.claims?.iss !== (await this.metadata.issuer)) {\n\t\t\tthrow new Error('Invalid iss');\n\t\t}\n\t\tif (Array.isArray(this.session.claims?.aud) ? this.session.claims?.aud[0] !== this.options.clientId : this.session.claims?.aud !== this.options.clientId) {\n\t\t\tthrow new Error('Invalid aud');\n\t\t}\n\n\t\tawait this.storage.set(this.options.storageTokenName!, JSON.stringify(this.session));\n\n\t\tif (this.accessToken && this.idTokenClaims) {\n\t\t\tthis.dispatchEvent('loggedIn', [{ accessToken: this.accessToken, refreshToken: this.refreshToken, claims: this.idTokenClaims }]);\n\t\t}\n\t}\n\n\t/**\n\t * Constructs the authorization URL for initiating the authorization flow.\n\t *\n\t * @param {ExtraRequestArgs} [params={}] - Additional params to include in the authorization URL.\n\t * @returns {Promise<URL>} - A promise that resolves to the constructed authorization URL.\n\t */\n\tasync getAuthorizationUrl(params: ExtraRequestArgs = {}): Promise<URL> {\n\t\tconst url = new URL(await this.metadata.authorizationEndpoint);\n\n\t\turl.searchParams.append('client_id', this.options.clientId);\n\t\turl.searchParams.append('redirect_uri', this.options.redirectUri);\n\t\turl.searchParams.append('response_type', this.options.responseType || 'code');\n\t\turl.searchParams.append('response_mode', this.options.responseMode || 'fragment');\n\t\turl.searchParams.append('scope', this.options.scopes?.join(' ') || '');\n\t\turl.searchParams.append('code_challenge_method', 'S256');\n\n\t\tif (params.prompt) {\n\t\t\turl.searchParams.append('prompt', params.prompt);\n\t\t}\n\t\tif (params.acrValues) {\n\t\t\turl.searchParams.append('acr_values', params.acrValues.join(' '));\n\t\t}\n\t\tif (params.loginHint) {\n\t\t\turl.searchParams.append('login_hint', params.loginHint);\n\t\t}\n\t\tif (params.uiLocales) {\n\t\t\turl.searchParams.append('ui_locales', params.uiLocales.join(' '));\n\t\t}\n\n\t\treturn url;\n\t}\n\n\tprotected async waitToInitialize(): Promise<void> {\n\t\tawait this.#initializationPromise;\n\t}\n\n\t/**\n\t * Sends a token request to the specified URL with the given data.\n\t *\n\t * @param {string} url - The URL to send the request to.\n\t * @param {Record<string, string>} [data={}] - The data to include in the request body.\n\t * @returns {Promise<HttpClientResponse<Session>>} - A promise that resolves to the response from the request.\n\t */\n\tasync sendTokenRequest(url: string, data: Record<string, string> = {}): Promise<HttpClientResponse<Session>> {\n\t\treturn this.httpClient.request<Session>(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/x-www-form-urlencoded' },\n\t\t\tbody: new URLSearchParams(data).toString(),\n\t\t});\n\t}\n\n\t/**\n\t * Subscribes a callback function to an event.\n\t *\n\t * @param {T} eventName - The name of the event to subscribe to.\n\t * @param {(...params: Parameters<EventFunctions[T]>) => Promise<void> | void} callbackFn - The callback function to execute when the event is dispatched.\n\t * @returns {{ dispose: () => void }} - An object with a `dispose` method to remove the subscription.\n\t */\n\tsubscribeToEvent<T extends keyof EventFunctions>(\n\t\teventName: T,\n\t\tcallbackFn: (...params: Parameters<EventFunctions[T]>) => Promise<void> | void,\n\t): { dispose: () => void } {\n\t\teventCallbacks[eventName].add(callbackFn);\n\n\t\treturn {\n\t\t\tdispose: () => {\n\t\t\t\teventCallbacks[eventName].delete(callbackFn);\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Dispatches an event to all subscribed callback functions.\n\t *\n\t * @param {T} eventName - The name of the event to dispatch.\n\t * @param {Parameters<EventFunctions[T]>} args - The arguments to pass to the callback functions.\n\t */\n\tprotected dispatchEvent<T extends keyof EventFunctions>(eventName: T, args: Parameters<EventFunctions[T]>): void {\n\t\tfor (const eventFn of eventCallbacks[eventName]) {\n\t\t\tvoid eventFn(...args);\n\t\t}\n\t}\n}\n"],"names":["eventCallbacks","BaseFlow","options","storage","httpClient","__privateAdd","_BaseFlow_instances","_initializationPromise","_isAuthenticatedPromise","_refreshInProgressState","__publicField","Metadata","__privateSet","__privateMethod","init_fn","_a","__privateGet","_b","timestamp","checkAuthentication_fn","params","session","url","request","jwt","success","Session","state","serializedState","State","_c","_d","_e","_f","data","eventName","callbackFn","args","eventFn","isAuthenticated"],"mappings":"ozBAQA,MAAMA,EAAmG,CACxG,uBAAwB,IACxB,SAAU,IACV,aAAc,IACd,mBAAoB,IACpB,oBAAqB,IACrB,kBAAmB,IACnB,mBAAoB,IACpB,uBAAwB,IACxB,iBAAkB,IAClB,sBAAuB,GACxB,kBAQO,MAAeC,CAAgH,CA4IrI,YAAYC,EAAkBC,EAAqBC,EAA2B,CA5IxEC,EAAA,KAAAC,GAIND,EAAA,KAAAE,GAKAF,EAAA,KAAAG,EAAmD,MAOnDH,EAAA,KAAAI,EAA0B,IAO1BC,EAAA,mBAOAA,EAAA,gBAOAA,EAAA,iBAOAA,EAAA,eAA0B,MAO1BA,EAAA,gBA0FC,GAAI,CAACR,EAAQ,OACZ,MAAM,IAAI,MAAM,wBAAwB,EAEzC,GAAI,CAACA,EAAQ,SACZ,MAAM,IAAI,MAAM,0BAA0B,EAE3C,GAAI,CAACA,EAAQ,YACZ,MAAM,IAAI,MAAM,6BAA6B,EAE9C,GAAI,CAACA,EAAQ,WACZ,MAAM,IAAI,MAAM,4BAA4B,EAE7C,GAAI,CAACA,EAAQ,gBACZ,MAAM,IAAI,MAAM,iCAAiC,EAElD,GAAIA,EAAQ,QAAU,CAAC,MAAM,QAAQA,EAAQ,MAAM,EAClD,MAAM,IAAI,MAAM,wBAAwB,EAGpCA,EAAQ,SACZA,EAAQ,OAAS,CAAC,QAAQ,GAEtBA,EAAQ,eACZA,EAAQ,aAAe,QAEnBA,EAAQ,eACZA,EAAQ,aAAe,SAEnBA,EAAQ,mBACZA,EAAQ,iBAAmB,eAG5B,KAAK,QAAUA,EACf,KAAK,QAAUC,EACf,KAAK,WAAaC,EAClB,KAAK,SAAW,IAAIO,EAAS,KAAM,IAAI,IAAI,oCAAqCT,EAAQ,MAAM,EAAE,SAAA,CAAU,EAE1GU,EAAA,KAAKL,EAAyBM,EAAA,KAAKP,EAAAQ,GAAL,WAAW,CAxH1C,IAAI,eAAkD,OACrD,OAAOC,EAAA,KAAK,UAAL,YAAAA,EAAc,MAAA,CAQtB,IAAI,aAAyC,OAC5C,OAAOA,EAAA,KAAK,UAAL,YAAAA,EAAc,YAAA,CAQtB,IAAI,cAA0C,OAC7C,OAAOA,EAAA,KAAK,UAAL,YAAAA,EAAc,aAAA,CAQtB,IAAI,mBAA6B,CAChC,OAAOC,EAAA,KAAKP,EAAA,CAQb,IAAI,oBAA8B,SACjC,MAAO,GAACM,EAAA,KAAK,UAAL,MAAAA,EAAc,eAAgB,GAACE,EAAA,KAAK,UAAL,MAAAA,EAAc,aAAc,KAAK,QAAQ,YAAcC,EAAA,CAAU,CAQzG,IAAI,2BAAuD,OAC1D,OAAOH,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAA,CAQtB,IAAI,iBAAoC,CACvC,OAAIC,EAAA,KAAKR,GACDQ,EAAA,KAAKR,IAGbI,EAAA,KAAKJ,EAA0BK,EAAA,KAAKP,EAAAa,GAAL,YAExBH,EAAA,KAAKR,GAAA,CASb,IAAI,qBAA+B,OAClC,MAAO,IAAQO,EAAA,KAAK,UAAL,MAAAA,EAAc,cAAgB,CAAC,KAAK,mBAAkB,CAqItE,MAAM,OAAOK,EAAyD,CACrE,GAAI,OAAO,KAAK,QAAQ,YAAe,WACtC,MAAM,IAAI,MAAM,6FAA6F,EAG9G,MAAM,KAAK,iBAAA,EAEX,MAAMC,EAAU,KAAK,QAErB,GAAI,EAACA,GAAA,MAAAA,EAAS,UACb,OAGD,MAAM,KAAK,QAAQ,OAAO,KAAK,QAAQ,gBAAiB,EACxD,KAAK,QAAU,KAEf,MAAMC,EAAM,IAAI,IAAI,MAAM,KAAK,SAAS,kBAAkB,EAE1DA,EAAI,aAAa,OAAO,gBAAiBD,GAAA,YAAAA,EAAS,QAAQ,EAEtDD,GAAA,MAAAA,EAAQ,uBACXE,EAAI,aAAa,OAAO,2BAA4BF,EAAO,qBAAqB,EAGjF,KAAK,cAAc,kBAAmB,CAAC,CAAE,QAASC,EAAQ,SAAU,OAAQA,EAAQ,MAAA,CAAS,CAAC,EAE9F,GAAI,CACH,MAAM,KAAK,QAAQ,WAAWC,EAAI,SAAA,EAAYF,CAA0B,CAAA,MACjE,CAAA,CAAC,CAUV,MAAM,SAAyB,SAG9B,GAFA,MAAM,KAAK,iBAAA,EAEP,QAAOL,EAAA,KAAK,UAAL,YAAAA,EAAc,gBAAkB,SAC1C,OAGD,MAAMM,EAAU,KAAK,QAErB,GAAI,CACH,MAAME,EAAU,MAAM,KAAK,iBAAiB,MAAM,KAAK,SAAS,cAAe,CAC9E,WAAY,gBACZ,UAAW,KAAK,QAAQ,SACxB,eAAeN,EAAA,KAAK,UAAL,YAAAA,EAAc,aAAA,CAC7B,EAED,OAAO,OAAO,KAAK,QAAS,MAAMM,EAAQ,MAAM,EAE5C,KAAK,QAAQ,WAChB,KAAK,QAAQ,OAASC,EAAI,OAAsB,KAAK,QAAQ,QAAQ,GAGtE,MAAM,KAAK,QAAQ,IAAI,KAAK,QAAQ,iBAAmB,KAAK,UAAU,KAAK,OAAO,CAAC,EAE/E,KAAK,aAAe,KAAK,cAAgB,KAAK,eACjD,KAAK,cAAc,iBAAkB,CAAC,CAAE,YAAa,KAAK,YAAa,aAAc,KAAK,aAAc,OAAQ,KAAK,aAAA,CAAe,CAAC,CACtI,MACO,CACP,KAAK,QAAU,KACf,MAAM,KAAK,QAAQ,OAAO,KAAK,QAAQ,gBAAiB,EAExD,KAAK,cAAc,qBAAsB,CAAC,CAAE,aAAcH,EAAQ,aAAA,CAAgB,CAAC,CAAA,CACpF,CAQD,MAAM,QAAwB,CAC7B,MAAM,KAAK,iBAAA,EAEX,MAAMA,EAAU,KAAK,QACrB,IAAII,EAAU,GAEd,GAAI,CACCJ,GAAA,MAAAA,EAAS,cACZ,MAAM,KAAK,iBAAiB,MAAM,KAAK,SAAS,mBAAoB,CACnE,UAAW,KAAK,QAAQ,SACxB,gBAAiB,gBACjB,MAAOA,EAAQ,aAAA,CACf,EACSA,GAAA,MAAAA,EAAS,cACnB,MAAM,KAAK,iBAAiB,MAAM,KAAK,SAAS,mBAAoB,CACnE,UAAW,KAAK,QAAQ,SACxB,gBAAiB,eACjB,MAAOA,EAAQ,YAAA,CACf,CACF,MACO,CACPI,EAAU,EAAA,QACX,CACC,KAAK,QAAU,KACf,MAAM,KAAK,QAAQ,OAAO,KAAK,QAAQ,gBAAiB,EAEpDJ,GAAA,MAAAA,EAAS,cACZ,KAAK,cAAcI,EAAU,eAAiB,oBAAqB,CAAC,CAAE,MAAOJ,EAAQ,cAAe,cAAe,eAAA,CAAiB,CAAC,EAC3HA,GAAA,MAAAA,EAAS,cACnB,KAAK,cAAcI,EAAU,eAAiB,oBAAqB,CAAC,CAAE,MAAOJ,EAAQ,aAAc,cAAe,cAAA,CAAgB,CAAC,CACpI,CACD,CAWD,MAAM,cAAcD,EAAiC,GAAmB,iBAOvE,GANA,MAAM,KAAK,iBAAA,EAEX,KAAK,QAAU,IAAIM,EAEnB,OAAO,OAAO,KAAK,QAASN,CAAM,EAE9B,KAAK,QAAQ,MAChB,MAAM,IAAI,MAAM,GAAG,KAAK,QAAQ,KAAK,KAAK,KAAK,QAAQ,iBAAiB,EAAE,EAE3E,GAAI,CAAC,KAAK,QAAQ,KACjB,MAAM,IAAI,MAAM,yBAAyB,EAG1C,IAAIO,EAEJ,GAAI,CACH,MAAMC,EAAkB,MAAM,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ,KAAK,EAAE,EAE1E,GAAI,CAACA,EACJ,MAAM,IAAI,MAGXD,EAAQE,EAAM,mBAAmBD,CAAe,EAEhD,MAAM,KAAK,QAAQ,OAAO,OAAO,KAAK,QAAQ,KAAK,EAAE,CAAA,MAC9C,CACP,MAAM,IAAI,MAAM,0BAA0B,CAAA,CAG3C,MAAML,EAAU,MAAM,KAAK,iBAAiB,MAAM,KAAK,SAAS,cAAe,CAC9E,WAAY,qBACZ,UAAW,KAAK,QAAQ,SACxB,aAAc,KAAK,QAAQ,YAC3B,cAAeI,EAAM,aACrB,KAAM,KAAK,QAAQ,IAAA,CACnB,EAQD,GANA,OAAO,OAAO,KAAK,QAAS,MAAMJ,EAAQ,MAAM,EAE5C,KAAK,QAAQ,WAChB,KAAK,QAAQ,OAASC,EAAI,OAAsB,KAAK,QAAQ,QAAQ,GAGlE,KAAK,QAAQ,MAChB,MAAM,IAAI,MAAM,GAAG,KAAK,QAAQ,KAAK,KAAK,KAAK,QAAQ,iBAAiB,EAAE,EAE3E,GAAI,KAAK,QAAQ,UAAUT,EAAA,KAAK,QAAQ,SAAb,YAAAA,EAAqB,KAAK,MACpD,MAAM,IAAI,MAAM,eAAe,EAEhC,KAAIE,EAAA,KAAK,QAAQ,SAAb,YAAAA,EAAqB,SAAUU,EAAM,MACxC,MAAM,IAAI,MAAM,eAAe,EAEhC,KAAIG,EAAA,KAAK,QAAQ,SAAb,YAAAA,EAAqB,OAAS,MAAM,KAAK,SAAS,OACrD,MAAM,IAAI,MAAM,aAAa,EAE9B,GAAI,MAAM,SAAQC,EAAA,KAAK,QAAQ,SAAb,YAAAA,EAAqB,GAAG,IAAIC,EAAA,KAAK,QAAQ,SAAb,YAAAA,EAAqB,IAAI,MAAO,KAAK,QAAQ,WAAWC,EAAA,KAAK,QAAQ,SAAb,YAAAA,EAAqB,OAAQ,KAAK,QAAQ,SAC/I,MAAM,IAAI,MAAM,aAAa,EAG9B,MAAM,KAAK,QAAQ,IAAI,KAAK,QAAQ,iBAAmB,KAAK,UAAU,KAAK,OAAO,CAAC,EAE/E,KAAK,aAAe,KAAK,eAC5B,KAAK,cAAc,WAAY,CAAC,CAAE,YAAa,KAAK,YAAa,aAAc,KAAK,aAAc,OAAQ,KAAK,aAAA,CAAe,CAAC,CAChI,CASD,MAAM,oBAAoBb,EAA2B,GAAkB,OACtE,MAAME,EAAM,IAAI,IAAI,MAAM,KAAK,SAAS,qBAAqB,EAE7D,OAAAA,EAAI,aAAa,OAAO,YAAa,KAAK,QAAQ,QAAQ,EAC1DA,EAAI,aAAa,OAAO,eAAgB,KAAK,QAAQ,WAAW,EAChEA,EAAI,aAAa,OAAO,gBAAiB,KAAK,QAAQ,cAAgB,MAAM,EAC5EA,EAAI,aAAa,OAAO,gBAAiB,KAAK,QAAQ,cAAgB,UAAU,EAChFA,EAAI,aAAa,OAAO,UAASP,EAAA,KAAK,QAAQ,SAAb,YAAAA,EAAqB,KAAK,OAAQ,EAAE,EACrEO,EAAI,aAAa,OAAO,wBAAyB,MAAM,EAEnDF,EAAO,QACVE,EAAI,aAAa,OAAO,SAAUF,EAAO,MAAM,EAE5CA,EAAO,WACVE,EAAI,aAAa,OAAO,aAAcF,EAAO,UAAU,KAAK,GAAG,CAAC,EAE7DA,EAAO,WACVE,EAAI,aAAa,OAAO,aAAcF,EAAO,SAAS,EAEnDA,EAAO,WACVE,EAAI,aAAa,OAAO,aAAcF,EAAO,UAAU,KAAK,GAAG,CAAC,EAG1DE,CAAA,CAGR,MAAgB,kBAAkC,CACjD,MAAMN,EAAA,KAAKT,EAAA,CAUZ,MAAM,iBAAiBe,EAAaY,EAA+B,GAA0C,CAC5G,OAAO,KAAK,WAAW,QAAiBZ,EAAK,CAC5C,OAAQ,OACR,QAAS,CAAE,eAAgB,mCAAA,EAC3B,KAAM,IAAI,gBAAgBY,CAAI,EAAE,SAAA,CAAS,CACzC,CAAA,CAUF,iBACCC,EACAC,EAC0B,CAC1B,OAAApC,EAAemC,CAAS,EAAE,IAAIC,CAAU,EAEjC,CACN,QAAS,IAAM,CACdpC,EAAemC,CAAS,EAAE,OAAOC,CAAU,CAAA,CAC5C,CACD,CASS,cAA8CD,EAAcE,EAA2C,CAChH,UAAWC,KAAWtC,EAAemC,CAAS,EACxCG,EAAQ,GAAGD,CAAI,CACrB,CAEF,CA/gBC9B,EAAA,YAKAC,EAAA,YAOAC,EAAA,YAhBMH,EAAA,YAyLAQ,EAAA,gBAAQ,CACb,KAAK,QAAUY,EAAQ,KAAK,MAAM,KAAK,QAAQ,IAAI,KAAK,QAAQ,gBAAiB,CAAC,EAElF,KAAK,cAAc,OAAQ,EAAE,EAEzB,KAAK,SAAW,KAAK,aAAe,KAAK,eAC5C,KAAK,cAAc,gBAAiB,CAAC,CAAE,YAAa,KAAK,YAAa,aAAc,KAAK,aAAc,OAAQ,KAAK,aAAA,CAAe,CAAC,EAGjI,KAAK,aAAe,KAAK,oBAC5B,KAAK,cAAc,qBAAsB,CAAC,CAAE,YAAa,KAAK,YAAa,aAAc,KAAK,YAAA,CAAc,CAAC,CAC9G,EAOKP,EAAA,gBAAyC,CAC9C,IAAIoB,EAAkB,GAEtB,GAAI,CACH,MAAM,KAAK,iBAAA,CAAiB,MACrB,CAAA,CAKR,GAAI,KAAK,oBAAsB,KAAK,cAAgB,CAAC,KAAK,kBACzD,GAAI,CACH3B,EAAA,KAAKH,EAA0B,IAC/B,MAAM,KAAK,QAAA,CAAQ,MACZ,CAAA,QAER,CACCG,EAAA,KAAKH,EAA0B,GAAA,CAIjC,OAAK,KAAK,qBACT8B,EAAkB,IAGnB3B,EAAA,KAAKJ,EAA0B,MAExB+B,CAAA"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("../utils/handlers.cjs"),l=require("../utils/NativeFlowHandler.cjs"),t=require("./BaseFlow.cjs");require("../utils/State.cjs");require("../utils/crypto.cjs");require("../utils/base64Url.cjs");require("../utils/date.cjs");require("../utils/errors.cjs");require("../utils/jwt.cjs");require("../utils/Metadata.cjs");require("../utils/Session.cjs");class n extends t.BaseFlow{constructor(e,r,i){e.urlHandler||(e.urlHandler=a.redirectUrlHandler),e.callbackHandler||(e.callbackHandler=a.redirectCallbackHandler),super(e,r,i)}login(e={}){return this.dispatchEvent("loginInitiated",[]),new l.NativeFlowHandler(this,e)}register(e={}){return e.prompt="create",this.login(e)}async handleCallback(e){var r;if(typeof this.options.callbackHandler!="function")throw new Error("Callback handler is not defined. Please provide a valid callback handler function in the SDK options.");e||(e=(r=globalThis.window)==null?void 0:r.location.href),await this.tokenExchange(await this.options.callbackHandler(e,this.options.responseMode||"fragment"))}}exports.NativeFlow=n;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("../utils/handlers.cjs"),l=require("../utils/NativeFlowHandler.cjs"),c=require("./BaseFlow.cjs");require("../utils/State.cjs");require("../utils/crypto.cjs");require("../utils/base64Url.cjs");require("../utils/date.cjs");require("../utils/errors.cjs");require("../utils/jwt.cjs");require("../utils/Metadata.cjs");require("../utils/Session.cjs");class d extends c.BaseFlow{constructor(e,r,t){e.urlHandler||(e.urlHandler=o.redirectUrlHandler),e.callbackHandler||(e.callbackHandler=o.redirectCallbackHandler),super(e,r,t)}login(e={}){return this.dispatchEvent("loginInitiated",[]),new l.NativeFlowHandler(this,e)}register(e={}){return e.prompt="create",this.login(e)}async entry(e){var n;e||(e=(n=globalThis.window)==null?void 0:n.location.href);const r=new URL(e);r.searchParams.append("sdk","web"),r.searchParams.append("client_id",this.options.clientId),r.searchParams.append("redirect_uri",this.options.redirectUri);const t=await this.httpClient.request(`${this.options.issuer}/provider/flow/entry?${r.searchParams.toString()}`);if(!t.ok){if(t.status===400){const i=await t.json();let a="Entry request failed with status 400";throw typeof i=="object"&&(i.error?a=`${i.error}: ${i.error_description}`:i.errorKey&&(a=i.errorKey)),new Error(a)}throw new Error(`Entry request failed with status ${t.status}`)}const s=new URL(await t.text()).searchParams.get("session_id");if(!s)throw new Error("Session ID not found in entry response");return s}async handleCallback(e){var r;if(typeof this.options.callbackHandler!="function")throw new Error("Callback handler is not defined. Please provide a valid callback handler function in the SDK options.");e||(e=(r=globalThis.window)==null?void 0:r.location.href),await this.tokenExchange(await this.options.callbackHandler(e,this.options.responseMode||"fragment"))}}exports.NativeFlow=d;
2
2
  //# sourceMappingURL=NativeFlow.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"NativeFlow.cjs","sources":["../../src/flows/NativeFlow.ts"],"sourcesContent":["import type { SDKOptions, NativeParams, SDKStorage, SDKHttpClient } from '../types';\nimport { redirectUrlHandler, redirectCallbackHandler } from '../utils/handlers';\nimport { NativeFlowHandler } from '../utils/NativeFlowHandler';\nimport { BaseFlow } from './BaseFlow';\n\nexport class NativeFlow extends BaseFlow<SDKOptions, NativeParams> {\n\tconstructor(options: SDKOptions, storage: SDKStorage, httpClient: SDKHttpClient) {\n\t\tif (!options.urlHandler) {\n\t\t\toptions.urlHandler = redirectUrlHandler;\n\t\t}\n\t\tif (!options.callbackHandler) {\n\t\t\toptions.callbackHandler = redirectCallbackHandler;\n\t\t}\n\n\t\tsuper(options, storage, httpClient);\n\t}\n\n\t/**\n\t * Initiates the login process via native UI.\n\t * @param {NativeParams} [params={}] Optional parameters for native configuration.\n\t * @returns {NativeFlowHandler} Returns with a native login handler.\n\t */\n\tlogin(params: NativeParams = {}): NativeFlowHandler {\n\t\tthis.dispatchEvent('loginInitiated', []);\n\n\t\treturn new NativeFlowHandler(this, params);\n\t}\n\n\t/**\n\t * Initiates the registration process via native UI.\n\t * @param {NativeParams} [params={}] Optional parameters for native configuration.\n\t * @returns {NativeFlowHandler} Returns with a native login handler.\n\t */\n\tregister(params: NativeParams = {}): NativeFlowHandler {\n\t\tparams.prompt = 'create';\n\n\t\treturn this.login(params);\n\t}\n\n\t/**\n\t * Handles the callback after login or registration via a redirect.\n\t * @param {string} [url] The URL to handle the callback from. Defaults to the current window location.\n\t * @returns {Promise<void>} A promise that resolves when the callback is handled.\n\t */\n\tasync handleCallback(url?: string): Promise<void> {\n\t\tif (typeof this.options.callbackHandler !== 'function') {\n\t\t\tthrow new Error('Callback handler is not defined. Please provide a valid callback handler function in the SDK options.');\n\t\t}\n\n\t\tif (!url) {\n\t\t\turl = globalThis.window?.location.href;\n\t\t}\n\n\t\tawait this.tokenExchange((await this.options.callbackHandler(url, this.options.responseMode || 'fragment')) as Record<string, string>);\n\t}\n}\n"],"names":["NativeFlow","BaseFlow","options","storage","httpClient","redirectUrlHandler","redirectCallbackHandler","params","NativeFlowHandler","url","_a"],"mappings":"ybAKO,MAAMA,UAAmBC,EAAAA,QAAmC,CAClE,YAAYC,EAAqBC,EAAqBC,EAA2B,CAC3EF,EAAQ,aACZA,EAAQ,WAAaG,EAAAA,oBAEjBH,EAAQ,kBACZA,EAAQ,gBAAkBI,EAAAA,yBAG3B,MAAMJ,EAASC,EAASC,CAAU,CAAA,CAQnC,MAAMG,EAAuB,GAAuB,CACnD,YAAK,cAAc,iBAAkB,EAAE,EAEhC,IAAIC,EAAAA,kBAAkB,KAAMD,CAAM,CAAA,CAQ1C,SAASA,EAAuB,GAAuB,CACtD,OAAAA,EAAO,OAAS,SAET,KAAK,MAAMA,CAAM,CAAA,CAQzB,MAAM,eAAeE,EAA6B,OACjD,GAAI,OAAO,KAAK,QAAQ,iBAAoB,WAC3C,MAAM,IAAI,MAAM,uGAAuG,EAGnHA,IACJA,GAAMC,EAAA,WAAW,SAAX,YAAAA,EAAmB,SAAS,MAGnC,MAAM,KAAK,cAAe,MAAM,KAAK,QAAQ,gBAAgBD,EAAK,KAAK,QAAQ,cAAgB,UAAU,CAA4B,CAAA,CAEvI"}
1
+ {"version":3,"file":"NativeFlow.cjs","sources":["../../src/flows/NativeFlow.ts"],"sourcesContent":["import type { SDKOptions, NativeParams, SDKStorage, SDKHttpClient } from '../types';\nimport { redirectUrlHandler, redirectCallbackHandler } from '../utils/handlers';\nimport { NativeFlowHandler } from '../utils/NativeFlowHandler';\nimport { BaseFlow } from './BaseFlow';\n\nexport class NativeFlow extends BaseFlow<SDKOptions, NativeParams> {\n\tconstructor(options: SDKOptions, storage: SDKStorage, httpClient: SDKHttpClient) {\n\t\tif (!options.urlHandler) {\n\t\t\toptions.urlHandler = redirectUrlHandler;\n\t\t}\n\t\tif (!options.callbackHandler) {\n\t\t\toptions.callbackHandler = redirectCallbackHandler;\n\t\t}\n\n\t\tsuper(options, storage, httpClient);\n\t}\n\n\t/**\n\t * Initiates the login process via native UI.\n\t * @param {NativeParams} [params={}] Optional parameters for native configuration.\n\t * @returns {NativeFlowHandler} Returns with a native login handler.\n\t */\n\tlogin(params: NativeParams = {}): NativeFlowHandler {\n\t\tthis.dispatchEvent('loginInitiated', []);\n\n\t\treturn new NativeFlowHandler(this, params);\n\t}\n\n\t/**\n\t * Initiates the registration process via native UI.\n\t * @param {NativeParams} [params={}] Optional parameters for native configuration.\n\t * @returns {NativeFlowHandler} Returns with a native login handler.\n\t */\n\tregister(params: NativeParams = {}): NativeFlowHandler {\n\t\tparams.prompt = 'create';\n\n\t\treturn this.login(params);\n\t}\n\n\t/**\n\t * Initiates the entry process via a redirect.\n\t * @param {string} url Optional URL to use for the entry process. If not provided, the current window location will be used.\n\t * @returns {Promise<string>} A promise that resolves to the session ID.\n\t */\n\tasync entry(url?: string): Promise<string> {\n\t\tif (!url) {\n\t\t\turl = globalThis.window?.location.href;\n\t\t}\n\n\t\tconst entryUrl = new URL(url);\n\t\tentryUrl.searchParams.append('sdk', 'web');\n\t\tentryUrl.searchParams.append('client_id', this.options.clientId);\n\t\tentryUrl.searchParams.append('redirect_uri', this.options.redirectUri);\n\n\t\tconst response = await this.httpClient.request<string | Record<string, string>>(\n\t\t\t`${this.options.issuer}/provider/flow/entry?${entryUrl.searchParams.toString()}`,\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tif (response.status === 400) {\n\t\t\t\tconst data = await response.json();\n\t\t\t\tlet message = 'Entry request failed with status 400';\n\n\t\t\t\tif (typeof data === 'object') {\n\t\t\t\t\tif (data.error) {\n\t\t\t\t\t\tmessage = `${data.error}: ${data.error_description}`;\n\t\t\t\t\t} else if (data.errorKey) {\n\t\t\t\t\t\tmessage = data.errorKey;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthrow new Error(message);\n\t\t\t}\n\n\t\t\tthrow new Error(`Entry request failed with status ${response.status}`);\n\t\t}\n\n\t\tconst sessionId = new URL(await response.text()).searchParams.get('session_id');\n\n\t\tif (!sessionId) {\n\t\t\tthrow new Error('Session ID not found in entry response');\n\t\t}\n\n\t\treturn sessionId;\n\t}\n\n\t/**\n\t * Handles the callback after login or registration via a redirect.\n\t * @param {string} [url] The URL to handle the callback from. Defaults to the current window location.\n\t * @returns {Promise<void>} A promise that resolves when the callback is handled.\n\t */\n\tasync handleCallback(url?: string): Promise<void> {\n\t\tif (typeof this.options.callbackHandler !== 'function') {\n\t\t\tthrow new Error('Callback handler is not defined. Please provide a valid callback handler function in the SDK options.');\n\t\t}\n\n\t\tif (!url) {\n\t\t\turl = globalThis.window?.location.href;\n\t\t}\n\n\t\tawait this.tokenExchange((await this.options.callbackHandler(url, this.options.responseMode || 'fragment')) as Record<string, string>);\n\t}\n}\n"],"names":["NativeFlow","BaseFlow","options","storage","httpClient","redirectUrlHandler","redirectCallbackHandler","params","NativeFlowHandler","url","_a","entryUrl","response","data","message","sessionId"],"mappings":"ybAKO,MAAMA,UAAmBC,EAAAA,QAAmC,CAClE,YAAYC,EAAqBC,EAAqBC,EAA2B,CAC3EF,EAAQ,aACZA,EAAQ,WAAaG,EAAAA,oBAEjBH,EAAQ,kBACZA,EAAQ,gBAAkBI,EAAAA,yBAG3B,MAAMJ,EAASC,EAASC,CAAU,CAAA,CAQnC,MAAMG,EAAuB,GAAuB,CACnD,YAAK,cAAc,iBAAkB,EAAE,EAEhC,IAAIC,EAAAA,kBAAkB,KAAMD,CAAM,CAAA,CAQ1C,SAASA,EAAuB,GAAuB,CACtD,OAAAA,EAAO,OAAS,SAET,KAAK,MAAMA,CAAM,CAAA,CAQzB,MAAM,MAAME,EAA+B,OACrCA,IACJA,GAAMC,EAAA,WAAW,SAAX,YAAAA,EAAmB,SAAS,MAGnC,MAAMC,EAAW,IAAI,IAAIF,CAAG,EAC5BE,EAAS,aAAa,OAAO,MAAO,KAAK,EACzCA,EAAS,aAAa,OAAO,YAAa,KAAK,QAAQ,QAAQ,EAC/DA,EAAS,aAAa,OAAO,eAAgB,KAAK,QAAQ,WAAW,EAErE,MAAMC,EAAW,MAAM,KAAK,WAAW,QACtC,GAAG,KAAK,QAAQ,MAAM,wBAAwBD,EAAS,aAAa,UAAU,EAAA,EAG/E,GAAI,CAACC,EAAS,GAAI,CACjB,GAAIA,EAAS,SAAW,IAAK,CAC5B,MAAMC,EAAO,MAAMD,EAAS,KAAA,EAC5B,IAAIE,EAAU,uCAEd,MAAI,OAAOD,GAAS,WACfA,EAAK,MACRC,EAAU,GAAGD,EAAK,KAAK,KAAKA,EAAK,iBAAiB,GACxCA,EAAK,WACfC,EAAUD,EAAK,WAIX,IAAI,MAAMC,CAAO,CAAA,CAGxB,MAAM,IAAI,MAAM,oCAAoCF,EAAS,MAAM,EAAE,CAAA,CAGtE,MAAMG,EAAY,IAAI,IAAI,MAAMH,EAAS,MAAM,EAAE,aAAa,IAAI,YAAY,EAE9E,GAAI,CAACG,EACJ,MAAM,IAAI,MAAM,wCAAwC,EAGzD,OAAOA,CAAA,CAQR,MAAM,eAAeN,EAA6B,OACjD,GAAI,OAAO,KAAK,QAAQ,iBAAoB,WAC3C,MAAM,IAAI,MAAM,uGAAuG,EAGnHA,IACJA,GAAMC,EAAA,WAAW,SAAX,YAAAA,EAAmB,SAAS,MAGnC,MAAM,KAAK,cAAe,MAAM,KAAK,QAAQ,gBAAgBD,EAAK,KAAK,QAAQ,cAAgB,UAAU,CAA4B,CAAA,CAEvI"}
@@ -15,6 +15,12 @@ export declare class NativeFlow extends BaseFlow<SDKOptions, NativeParams> {
15
15
  * @returns {NativeFlowHandler} Returns with a native login handler.
16
16
  */
17
17
  register(params?: NativeParams): NativeFlowHandler;
18
+ /**
19
+ * Initiates the entry process via a redirect.
20
+ * @param {string} url Optional URL to use for the entry process. If not provided, the current window location will be used.
21
+ * @returns {Promise<string>} A promise that resolves to the session ID.
22
+ */
23
+ entry(url?: string): Promise<string>;
18
24
  /**
19
25
  * Handles the callback after login or registration via a redirect.
20
26
  * @param {string} [url] The URL to handle the callback from. Defaults to the current window location.
@@ -1,2 +1,2 @@
1
- import{redirectUrlHandler as a,redirectCallbackHandler as i}from"../utils/handlers.mjs";import{NativeFlowHandler as l}from"../utils/NativeFlowHandler.mjs";import{BaseFlow as o}from"./BaseFlow.mjs";import"../utils/State.mjs";import"../utils/crypto.mjs";import"../utils/base64Url.mjs";import"../utils/date.mjs";import"../utils/errors.mjs";import"../utils/jwt.mjs";import"../utils/Metadata.mjs";import"../utils/Session.mjs";class g extends o{constructor(r,e,t){r.urlHandler||(r.urlHandler=a),r.callbackHandler||(r.callbackHandler=i),super(r,e,t)}login(r={}){return this.dispatchEvent("loginInitiated",[]),new l(this,r)}register(r={}){return r.prompt="create",this.login(r)}async handleCallback(r){var e;if(typeof this.options.callbackHandler!="function")throw new Error("Callback handler is not defined. Please provide a valid callback handler function in the SDK options.");r||(r=(e=globalThis.window)==null?void 0:e.location.href),await this.tokenExchange(await this.options.callbackHandler(r,this.options.responseMode||"fragment"))}}export{g as NativeFlow};
1
+ import{redirectUrlHandler as s,redirectCallbackHandler as l}from"../utils/handlers.mjs";import{NativeFlowHandler as c}from"../utils/NativeFlowHandler.mjs";import{BaseFlow as d}from"./BaseFlow.mjs";import"../utils/State.mjs";import"../utils/crypto.mjs";import"../utils/base64Url.mjs";import"../utils/date.mjs";import"../utils/errors.mjs";import"../utils/jwt.mjs";import"../utils/Metadata.mjs";import"../utils/Session.mjs";class v extends d{constructor(r,e,t){r.urlHandler||(r.urlHandler=s),r.callbackHandler||(r.callbackHandler=l),super(r,e,t)}login(r={}){return this.dispatchEvent("loginInitiated",[]),new c(this,r)}register(r={}){return r.prompt="create",this.login(r)}async entry(r){var n;r||(r=(n=globalThis.window)==null?void 0:n.location.href);const e=new URL(r);e.searchParams.append("sdk","web"),e.searchParams.append("client_id",this.options.clientId),e.searchParams.append("redirect_uri",this.options.redirectUri);const t=await this.httpClient.request(`${this.options.issuer}/provider/flow/entry?${e.searchParams.toString()}`);if(!t.ok){if(t.status===400){const i=await t.json();let a="Entry request failed with status 400";throw typeof i=="object"&&(i.error?a=`${i.error}: ${i.error_description}`:i.errorKey&&(a=i.errorKey)),new Error(a)}throw new Error(`Entry request failed with status ${t.status}`)}const o=new URL(await t.text()).searchParams.get("session_id");if(!o)throw new Error("Session ID not found in entry response");return o}async handleCallback(r){var e;if(typeof this.options.callbackHandler!="function")throw new Error("Callback handler is not defined. Please provide a valid callback handler function in the SDK options.");r||(r=(e=globalThis.window)==null?void 0:e.location.href),await this.tokenExchange(await this.options.callbackHandler(r,this.options.responseMode||"fragment"))}}export{v as NativeFlow};
2
2
  //# sourceMappingURL=NativeFlow.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"NativeFlow.mjs","sources":["../../src/flows/NativeFlow.ts"],"sourcesContent":["import type { SDKOptions, NativeParams, SDKStorage, SDKHttpClient } from '../types';\nimport { redirectUrlHandler, redirectCallbackHandler } from '../utils/handlers';\nimport { NativeFlowHandler } from '../utils/NativeFlowHandler';\nimport { BaseFlow } from './BaseFlow';\n\nexport class NativeFlow extends BaseFlow<SDKOptions, NativeParams> {\n\tconstructor(options: SDKOptions, storage: SDKStorage, httpClient: SDKHttpClient) {\n\t\tif (!options.urlHandler) {\n\t\t\toptions.urlHandler = redirectUrlHandler;\n\t\t}\n\t\tif (!options.callbackHandler) {\n\t\t\toptions.callbackHandler = redirectCallbackHandler;\n\t\t}\n\n\t\tsuper(options, storage, httpClient);\n\t}\n\n\t/**\n\t * Initiates the login process via native UI.\n\t * @param {NativeParams} [params={}] Optional parameters for native configuration.\n\t * @returns {NativeFlowHandler} Returns with a native login handler.\n\t */\n\tlogin(params: NativeParams = {}): NativeFlowHandler {\n\t\tthis.dispatchEvent('loginInitiated', []);\n\n\t\treturn new NativeFlowHandler(this, params);\n\t}\n\n\t/**\n\t * Initiates the registration process via native UI.\n\t * @param {NativeParams} [params={}] Optional parameters for native configuration.\n\t * @returns {NativeFlowHandler} Returns with a native login handler.\n\t */\n\tregister(params: NativeParams = {}): NativeFlowHandler {\n\t\tparams.prompt = 'create';\n\n\t\treturn this.login(params);\n\t}\n\n\t/**\n\t * Handles the callback after login or registration via a redirect.\n\t * @param {string} [url] The URL to handle the callback from. Defaults to the current window location.\n\t * @returns {Promise<void>} A promise that resolves when the callback is handled.\n\t */\n\tasync handleCallback(url?: string): Promise<void> {\n\t\tif (typeof this.options.callbackHandler !== 'function') {\n\t\t\tthrow new Error('Callback handler is not defined. Please provide a valid callback handler function in the SDK options.');\n\t\t}\n\n\t\tif (!url) {\n\t\t\turl = globalThis.window?.location.href;\n\t\t}\n\n\t\tawait this.tokenExchange((await this.options.callbackHandler(url, this.options.responseMode || 'fragment')) as Record<string, string>);\n\t}\n}\n"],"names":["NativeFlow","BaseFlow","options","storage","httpClient","redirectUrlHandler","redirectCallbackHandler","params","NativeFlowHandler","url","_a"],"mappings":"qaAKO,MAAMA,UAAmBC,CAAmC,CAClE,YAAYC,EAAqBC,EAAqBC,EAA2B,CAC3EF,EAAQ,aACZA,EAAQ,WAAaG,GAEjBH,EAAQ,kBACZA,EAAQ,gBAAkBI,GAG3B,MAAMJ,EAASC,EAASC,CAAU,CAAA,CAQnC,MAAMG,EAAuB,GAAuB,CACnD,YAAK,cAAc,iBAAkB,EAAE,EAEhC,IAAIC,EAAkB,KAAMD,CAAM,CAAA,CAQ1C,SAASA,EAAuB,GAAuB,CACtD,OAAAA,EAAO,OAAS,SAET,KAAK,MAAMA,CAAM,CAAA,CAQzB,MAAM,eAAeE,EAA6B,OACjD,GAAI,OAAO,KAAK,QAAQ,iBAAoB,WAC3C,MAAM,IAAI,MAAM,uGAAuG,EAGnHA,IACJA,GAAMC,EAAA,WAAW,SAAX,YAAAA,EAAmB,SAAS,MAGnC,MAAM,KAAK,cAAe,MAAM,KAAK,QAAQ,gBAAgBD,EAAK,KAAK,QAAQ,cAAgB,UAAU,CAA4B,CAAA,CAEvI"}
1
+ {"version":3,"file":"NativeFlow.mjs","sources":["../../src/flows/NativeFlow.ts"],"sourcesContent":["import type { SDKOptions, NativeParams, SDKStorage, SDKHttpClient } from '../types';\nimport { redirectUrlHandler, redirectCallbackHandler } from '../utils/handlers';\nimport { NativeFlowHandler } from '../utils/NativeFlowHandler';\nimport { BaseFlow } from './BaseFlow';\n\nexport class NativeFlow extends BaseFlow<SDKOptions, NativeParams> {\n\tconstructor(options: SDKOptions, storage: SDKStorage, httpClient: SDKHttpClient) {\n\t\tif (!options.urlHandler) {\n\t\t\toptions.urlHandler = redirectUrlHandler;\n\t\t}\n\t\tif (!options.callbackHandler) {\n\t\t\toptions.callbackHandler = redirectCallbackHandler;\n\t\t}\n\n\t\tsuper(options, storage, httpClient);\n\t}\n\n\t/**\n\t * Initiates the login process via native UI.\n\t * @param {NativeParams} [params={}] Optional parameters for native configuration.\n\t * @returns {NativeFlowHandler} Returns with a native login handler.\n\t */\n\tlogin(params: NativeParams = {}): NativeFlowHandler {\n\t\tthis.dispatchEvent('loginInitiated', []);\n\n\t\treturn new NativeFlowHandler(this, params);\n\t}\n\n\t/**\n\t * Initiates the registration process via native UI.\n\t * @param {NativeParams} [params={}] Optional parameters for native configuration.\n\t * @returns {NativeFlowHandler} Returns with a native login handler.\n\t */\n\tregister(params: NativeParams = {}): NativeFlowHandler {\n\t\tparams.prompt = 'create';\n\n\t\treturn this.login(params);\n\t}\n\n\t/**\n\t * Initiates the entry process via a redirect.\n\t * @param {string} url Optional URL to use for the entry process. If not provided, the current window location will be used.\n\t * @returns {Promise<string>} A promise that resolves to the session ID.\n\t */\n\tasync entry(url?: string): Promise<string> {\n\t\tif (!url) {\n\t\t\turl = globalThis.window?.location.href;\n\t\t}\n\n\t\tconst entryUrl = new URL(url);\n\t\tentryUrl.searchParams.append('sdk', 'web');\n\t\tentryUrl.searchParams.append('client_id', this.options.clientId);\n\t\tentryUrl.searchParams.append('redirect_uri', this.options.redirectUri);\n\n\t\tconst response = await this.httpClient.request<string | Record<string, string>>(\n\t\t\t`${this.options.issuer}/provider/flow/entry?${entryUrl.searchParams.toString()}`,\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tif (response.status === 400) {\n\t\t\t\tconst data = await response.json();\n\t\t\t\tlet message = 'Entry request failed with status 400';\n\n\t\t\t\tif (typeof data === 'object') {\n\t\t\t\t\tif (data.error) {\n\t\t\t\t\t\tmessage = `${data.error}: ${data.error_description}`;\n\t\t\t\t\t} else if (data.errorKey) {\n\t\t\t\t\t\tmessage = data.errorKey;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthrow new Error(message);\n\t\t\t}\n\n\t\t\tthrow new Error(`Entry request failed with status ${response.status}`);\n\t\t}\n\n\t\tconst sessionId = new URL(await response.text()).searchParams.get('session_id');\n\n\t\tif (!sessionId) {\n\t\t\tthrow new Error('Session ID not found in entry response');\n\t\t}\n\n\t\treturn sessionId;\n\t}\n\n\t/**\n\t * Handles the callback after login or registration via a redirect.\n\t * @param {string} [url] The URL to handle the callback from. Defaults to the current window location.\n\t * @returns {Promise<void>} A promise that resolves when the callback is handled.\n\t */\n\tasync handleCallback(url?: string): Promise<void> {\n\t\tif (typeof this.options.callbackHandler !== 'function') {\n\t\t\tthrow new Error('Callback handler is not defined. Please provide a valid callback handler function in the SDK options.');\n\t\t}\n\n\t\tif (!url) {\n\t\t\turl = globalThis.window?.location.href;\n\t\t}\n\n\t\tawait this.tokenExchange((await this.options.callbackHandler(url, this.options.responseMode || 'fragment')) as Record<string, string>);\n\t}\n}\n"],"names":["NativeFlow","BaseFlow","options","storage","httpClient","redirectUrlHandler","redirectCallbackHandler","params","NativeFlowHandler","url","_a","entryUrl","response","data","message","sessionId"],"mappings":"qaAKO,MAAMA,UAAmBC,CAAmC,CAClE,YAAYC,EAAqBC,EAAqBC,EAA2B,CAC3EF,EAAQ,aACZA,EAAQ,WAAaG,GAEjBH,EAAQ,kBACZA,EAAQ,gBAAkBI,GAG3B,MAAMJ,EAASC,EAASC,CAAU,CAAA,CAQnC,MAAMG,EAAuB,GAAuB,CACnD,YAAK,cAAc,iBAAkB,EAAE,EAEhC,IAAIC,EAAkB,KAAMD,CAAM,CAAA,CAQ1C,SAASA,EAAuB,GAAuB,CACtD,OAAAA,EAAO,OAAS,SAET,KAAK,MAAMA,CAAM,CAAA,CAQzB,MAAM,MAAME,EAA+B,OACrCA,IACJA,GAAMC,EAAA,WAAW,SAAX,YAAAA,EAAmB,SAAS,MAGnC,MAAMC,EAAW,IAAI,IAAIF,CAAG,EAC5BE,EAAS,aAAa,OAAO,MAAO,KAAK,EACzCA,EAAS,aAAa,OAAO,YAAa,KAAK,QAAQ,QAAQ,EAC/DA,EAAS,aAAa,OAAO,eAAgB,KAAK,QAAQ,WAAW,EAErE,MAAMC,EAAW,MAAM,KAAK,WAAW,QACtC,GAAG,KAAK,QAAQ,MAAM,wBAAwBD,EAAS,aAAa,UAAU,EAAA,EAG/E,GAAI,CAACC,EAAS,GAAI,CACjB,GAAIA,EAAS,SAAW,IAAK,CAC5B,MAAMC,EAAO,MAAMD,EAAS,KAAA,EAC5B,IAAIE,EAAU,uCAEd,MAAI,OAAOD,GAAS,WACfA,EAAK,MACRC,EAAU,GAAGD,EAAK,KAAK,KAAKA,EAAK,iBAAiB,GACxCA,EAAK,WACfC,EAAUD,EAAK,WAIX,IAAI,MAAMC,CAAO,CAAA,CAGxB,MAAM,IAAI,MAAM,oCAAoCF,EAAS,MAAM,EAAE,CAAA,CAGtE,MAAMG,EAAY,IAAI,IAAI,MAAMH,EAAS,MAAM,EAAE,aAAa,IAAI,YAAY,EAE9E,GAAI,CAACG,EACJ,MAAM,IAAI,MAAM,wCAAwC,EAGzD,OAAOA,CAAA,CAQR,MAAM,eAAeN,EAA6B,OACjD,GAAI,OAAO,KAAK,QAAQ,iBAAoB,WAC3C,MAAM,IAAI,MAAM,uGAAuG,EAGnHA,IACJA,GAAMC,EAAA,WAAW,SAAX,YAAAA,EAAmB,SAAS,MAGnC,MAAM,KAAK,cAAe,MAAM,KAAK,QAAQ,gBAAgBD,EAAK,KAAK,QAAQ,cAAgB,UAAU,CAA4B,CAAA,CAEvI"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("../utils/handlers.cjs"),i=require("../utils/State.cjs"),l=require("./BaseFlow.cjs");require("../utils/crypto.cjs");require("../utils/base64Url.cjs");require("../utils/date.cjs");require("../utils/jwt.cjs");require("../utils/Metadata.cjs");require("../utils/Session.cjs");class o extends l.BaseFlow{constructor(e,a,t){e.urlHandler||(e.urlHandler=r.popupUrlHandler),e.callbackHandler||(e.callbackHandler=r.popupCallbackHandler),super(e,a,t)}async login(e={}){if(typeof this.options.urlHandler!="function")throw new Error("URL handler is not defined. Please provide a valid URL handler function in the SDK options.");const a=await i.State.create(),t=await this.getAuthorizationUrl(e);t.searchParams.append("state",a.id),t.searchParams.append("code_challenge",a.codeChallenge),t.searchParams.append("nonce",a.nonce),t.searchParams.append("display","popup"),await this.storage.set(`sty.${a.id}`,JSON.stringify(a)),this.dispatchEvent("loginInitiated",[]);const n=await this.options.urlHandler(t.toString(),e);await this.tokenExchange(n)}async register(e={}){e.prompt="create",await this.login(e)}async handleCallback(){if(typeof this.options.callbackHandler!="function")throw new Error("Callback handler is not defined. Please provide a valid callback handler function in the SDK options.");await this.options.callbackHandler(this.options.responseMode||"fragment")}}exports.PopupFlow=o;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("../utils/handlers.cjs"),i=require("../utils/State.cjs"),o=require("./BaseFlow.cjs");require("../utils/crypto.cjs");require("../utils/base64Url.cjs");require("../utils/date.cjs");require("../utils/jwt.cjs");require("../utils/Metadata.cjs");require("../utils/Session.cjs");class l extends o.BaseFlow{constructor(e,t,a){e.urlHandler||(e.urlHandler=n.popupUrlHandler),e.callbackHandler||(e.callbackHandler=n.popupCallbackHandler),super(e,t,a)}async login(e={}){if(typeof this.options.urlHandler!="function")throw new Error("URL handler is not defined. Please provide a valid URL handler function in the SDK options.");const t=await i.State.create(),a=await this.getAuthorizationUrl(e);a.searchParams.append("state",t.id),a.searchParams.append("code_challenge",t.codeChallenge),a.searchParams.append("nonce",t.nonce),a.searchParams.append("display","popup"),await this.storage.set(`sty.${t.id}`,JSON.stringify(t)),this.dispatchEvent("loginInitiated",[]);const r=await this.options.urlHandler(a.toString(),e);await this.tokenExchange(r)}async register(e={}){e.prompt="create",await this.login(e)}async entry(e){var a;if(typeof this.options.urlHandler!="function")throw new Error("URL handler is not defined. Please provide a valid URL handler function in the SDK options.");e||(e=(a=globalThis.window)==null?void 0:a.location.href);const t=new URL(e);await this.options.urlHandler(`${this.options.issuer}/provider/entry?${t.searchParams.toString()}`)}async handleCallback(){if(typeof this.options.callbackHandler!="function")throw new Error("Callback handler is not defined. Please provide a valid callback handler function in the SDK options.");await this.options.callbackHandler(this.options.responseMode||"fragment")}}exports.PopupFlow=l;
2
2
  //# sourceMappingURL=PopupFlow.cjs.map