@strivacity/sdk-core 2.2.0 → 3.0.0-rc.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 (52) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +6 -2
  3. package/dist/flows/BaseFlow.cjs.map +1 -1
  4. package/dist/flows/BaseFlow.d.ts +1 -1
  5. package/dist/flows/BaseFlow.mjs.map +1 -1
  6. package/dist/flows/EmbeddedFlow.cjs +2 -0
  7. package/dist/flows/EmbeddedFlow.cjs.map +1 -0
  8. package/dist/flows/EmbeddedFlow.d.ts +25 -0
  9. package/dist/flows/EmbeddedFlow.mjs +2 -0
  10. package/dist/flows/EmbeddedFlow.mjs.map +1 -0
  11. package/dist/flows/NativeFlow.cjs +1 -1
  12. package/dist/flows/NativeFlow.cjs.map +1 -1
  13. package/dist/flows/NativeFlow.d.ts +1 -1
  14. package/dist/flows/NativeFlow.mjs +1 -1
  15. package/dist/flows/NativeFlow.mjs.map +1 -1
  16. package/dist/flows/PopupFlow.cjs +1 -1
  17. package/dist/flows/PopupFlow.cjs.map +1 -1
  18. package/dist/flows/PopupFlow.mjs +1 -1
  19. package/dist/flows/PopupFlow.mjs.map +1 -1
  20. package/dist/flows/RedirectFlow.cjs +1 -1
  21. package/dist/flows/RedirectFlow.cjs.map +1 -1
  22. package/dist/flows/RedirectFlow.mjs +1 -1
  23. package/dist/flows/RedirectFlow.mjs.map +1 -1
  24. package/dist/index.cjs +1 -1
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.ts +8 -4
  27. package/dist/index.mjs +1 -1
  28. package/dist/index.mjs.map +1 -1
  29. package/dist/types.cjs.map +1 -1
  30. package/dist/types.d.ts +42 -1
  31. package/dist/types.mjs.map +1 -1
  32. package/dist/utils/EmbeddedFlowHandler.cjs +2 -0
  33. package/dist/utils/EmbeddedFlowHandler.cjs.map +1 -0
  34. package/dist/utils/EmbeddedFlowHandler.d.ts +61 -0
  35. package/dist/utils/EmbeddedFlowHandler.mjs +2 -0
  36. package/dist/utils/EmbeddedFlowHandler.mjs.map +1 -0
  37. package/dist/utils/NativeFlowHandler.cjs +1 -1
  38. package/dist/utils/NativeFlowHandler.cjs.map +1 -1
  39. package/dist/utils/NativeFlowHandler.d.ts +1 -1
  40. package/dist/utils/NativeFlowHandler.mjs +1 -1
  41. package/dist/utils/NativeFlowHandler.mjs.map +1 -1
  42. package/dist/utils/errors.cjs +1 -1
  43. package/dist/utils/errors.cjs.map +1 -1
  44. package/dist/utils/errors.d.ts +12 -0
  45. package/dist/utils/errors.mjs +1 -1
  46. package/dist/utils/errors.mjs.map +1 -1
  47. package/dist/utils/handlers.cjs +1 -1
  48. package/dist/utils/handlers.cjs.map +1 -1
  49. package/dist/utils/handlers.d.ts +2 -1
  50. package/dist/utils/handlers.mjs +1 -1
  51. package/dist/utils/handlers.mjs.map +1 -1
  52. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,30 @@
1
+ ## 3.0.0-rc.0 (2026-02-18)
2
+
3
+ ### 🚀 Features
4
+
5
+ - ⚠️ EmbeddedFlow implemented ([a0e3ad8](https://github.com/Strivacity/sdk-js/commit/a0e3ad8))
6
+ - ⚠️ NativeFlow entry function now returns an object instead of a string ([9a8942d](https://github.com/Strivacity/sdk-js/commit/9a8942d))
7
+ - popupUrlHandler refactored ([886f6ea](https://github.com/Strivacity/sdk-js/commit/886f6ea))
8
+
9
+ ### ⚠️ Breaking Changes
10
+
11
+ - EmbeddedFlow implemented ([a0e3ad8](https://github.com/Strivacity/sdk-js/commit/a0e3ad8))
12
+ - NativeFlow entry function now returns an object instead of a string ([9a8942d](https://github.com/Strivacity/sdk-js/commit/9a8942d))
13
+
14
+ ### 🧱 Updated Dependencies
15
+
16
+ - Updated testing to 3.0.0-rc.0
17
+
18
+ ## 2.3.0 (2026-02-10)
19
+
20
+ ### 🚀 Features
21
+
22
+ - popupUrlHandler checkOrigin option added ([3d1d197](https://github.com/Strivacity/sdk-js/commit/3d1d197))
23
+
24
+ ### 🧱 Updated Dependencies
25
+
26
+ - Updated testing to 2.2.0
27
+
1
28
  ## 2.2.0 (2026-02-06)
2
29
 
3
30
  ### 🚀 Features
package/README.md CHANGED
@@ -39,7 +39,6 @@ The `initFlow` function initializes and returns an instance of either `PopupFlow
39
39
  **Type:** `SDKOptions & { mode?: 'popup' | 'redirect' | 'native' }`
40
40
 
41
41
  **Properties:**
42
-
43
42
  - `issuer` (string): The issuer URL of the OpenID Provider.
44
43
  - `clientId` (string): The client identifier for the application.
45
44
  - `redirectUri` (string): The URI to redirect to after authentication.
@@ -50,7 +49,6 @@ The `initFlow` function initializes and returns an instance of either `PopupFlow
50
49
  - `storage` (SDKStorageType): A custom storage implementation.
51
50
 
52
51
  **Mode:**
53
-
54
52
  - `popup`: Uses a popup window for authentication. Returns an instance of `PopupFlow`.
55
53
  - `redirect`: Uses a full-page redirect for authentication. Returns an instance of `RedirectFlow`.
56
54
  - `native`: Uses a native flow for authentication. Returns an instance of `NativeFlow`.
@@ -174,3 +172,9 @@ Subscribe to SDK events to handle authentication state changes.
174
172
 
175
173
  - `eventType` (string): The type of event to listen for
176
174
  - `callback` (function): The function to call when the event is fired
175
+
176
+ ## Migrating to v3.0
177
+
178
+ ### Entry API Major Changes
179
+
180
+ Strivacity SDK's `entry()` API now returns a structured object instead of a plain string. To see examples of these changes, check the apps folder in this repository.
@@ -1 +1 @@
1
- {"version":3,"file":"BaseFlow.cjs","sources":["../../src/flows/BaseFlow.ts"],"sourcesContent":["import type {\n\tIdTokenClaims,\n\tSDKOptions,\n\tSDKStorage,\n\tEventFunctions,\n\tExtraRequestArgs,\n\tLogoutParams,\n\tSDKHttpClient,\n\tHttpClientResponse,\n\tSDKLogging,\n} 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 * Logging utility for the SDK.\n\t */\n\tlogging?: SDKLogging;\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 * @param {SDKHttpClient} httpClient - HTTP client for making requests.\n\t * @param {SDKLogging} [logging] - Optional logging utility.\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, logging?: SDKLogging) {\n\t\tif (!options.issuer) {\n\t\t\tconst error = new Error('Missing option: issuer');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.clientId) {\n\t\t\tconst error = new Error('Missing option: clientId');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.redirectUri) {\n\t\t\tconst error = new Error('Missing option: redirectUri');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.urlHandler) {\n\t\t\tconst error = new Error('Missing option: urlHandler');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.callbackHandler) {\n\t\t\tconst error = new Error('Missing option: callbackHandler');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (options.scopes && !Array.isArray(options.scopes)) {\n\t\t\tconst error = new Error('Invalid option: scopes');\n\t\t\tlogging?.error('Invalid option provided', error);\n\t\t\tthrow error;\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.logging = logging;\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\t\tthis.logging?.debug('SDK initialized');\n\n\t\tif (!this.session) {\n\t\t\tthis.logging?.debug('No session found in storage');\n\t\t}\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\tthis.logging?.debug('Session loaded from storage');\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\tthis.logging?.debug('Access token has expired');\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\tthis.logging?.warn('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\t * @throws {Error} Throws an error if URL handler is not defined.\n\t */\n\tasync logout(params?: URLHandlerParams & LogoutParams): Promise<void> {\n\t\tif (typeof this.options.urlHandler !== 'function') {\n\t\t\tconst error = new Error('Missing option: urlHandler');\n\t\t\tthis.logging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tawait this.waitToInitialize();\n\n\t\tthis.logging?.debug('Attempting to logout');\n\n\t\tconst session = this.session;\n\n\t\tif (!session?.id_token) {\n\t\t\tthis.logging?.debug('Logout called without session');\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\t\tthis.logging?.debug('Logout initiated');\n\n\t\tawait this.options.urlHandler(url.toString(), params as URLHandlerParams);\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\tasync refresh(): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tthis.logging?.debug('Attempting to refresh session');\n\n\t\tif (typeof this.session?.refresh_token !== 'string') {\n\t\t\tthis.logging?.debug('Session refresh not possible - session not found');\n\t\t\treturn;\n\t\t}\n\n\t\tconst session = this.session;\n\n\t\ttry {\n\t\t\tconst response = await this.sendTokenRequest<Session>(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\tif (!response.ok) {\n\t\t\t\tconst data = await response.json();\n\t\t\t\tthrow new Error(`${data.error}: ${data.error_description}`);\n\t\t\t}\n\n\t\t\tObject.assign(this.session, await response.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\tthis.logging?.info('Session refreshed successfully');\n\t\t\t}\n\t\t} catch (error) {\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\tthis.logging?.info(`Session refresh failed - ${error}`);\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\tlet response: HttpClientResponse<Record<string, string>> | undefined;\n\n\t\t\tif (session?.refresh_token) {\n\t\t\t\tthis.logging?.debug('Attempting to revoke refresh token');\n\n\t\t\t\tresponse = await 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\tthis.logging?.debug('Attempting to revoke access token');\n\n\t\t\t\tresponse = await 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\n\t\t\tif (response && !response.ok) {\n\t\t\t\tconst data = await response.json();\n\t\t\t\tthrow new Error(`${data.error}: ${data.error_description}`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsuccess = false;\n\t\t\tthis.logging?.info(`Token revocation failed - ${error}`);\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\n\t\t\t\tif (success) {\n\t\t\t\t\tthis.logging?.info('Refresh token successfully revoked');\n\t\t\t\t}\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\n\t\t\t\tif (success) {\n\t\t\t\t\tthis.logging?.info('Access token successfully revoked');\n\t\t\t\t}\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.logging?.debug('Exchanging authorization code for tokens');\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\tconst error = new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t\tthis.logging?.error('Authorization error', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!this.session.code) {\n\t\t\tconst error = new Error('Invalid or missing code');\n\t\t\tthis.logging?.error('Authorization error', error);\n\t\t\tthrow error;\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\tconst error = new Error('Invalid or missing state');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst response = await this.sendTokenRequest<Session>(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\tif (!response.ok) {\n\t\t\tconst data = await response.json();\n\t\t\tconst error = new Error(`${data.error}: ${data.error_description}`);\n\t\t\tthis.logging?.error('Token exchange failed', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tObject.assign(this.session, await response.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\tconst error = new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (this.session.scope !== this.options.scopes?.join(' ')) {\n\t\t\tconst error = new Error('Invalid scope');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (this.session.claims?.nonce !== state.nonce) {\n\t\t\tconst error = new Error('Invalid nonce');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (this.session.claims?.iss !== (await this.metadata.issuer)) {\n\t\t\tconst error = new Error('Invalid iss');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\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\tconst error = new Error('Invalid aud');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\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\n\t\t\tif (this.logging) {\n\t\t\t\tthis.logging.xEventId = undefined;\n\t\t\t\tthis.logging.info('Login successful');\n\t\t\t}\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\t * @throws {Error} Throws an error if metadata retrieval fails.\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?.length) {\n\t\t\turl.searchParams.append('acr_values', params.acrValues.join(' '));\n\t\t}\n\t\tif (params.loginHint?.length) {\n\t\t\turl.searchParams.append('login_hint', params.loginHint);\n\t\t}\n\t\tif (params.uiLocales?.length) {\n\t\t\turl.searchParams.append('ui_locales', params.uiLocales.join(' '));\n\t\t}\n\t\tif (params.audiences?.length) {\n\t\t\turl.searchParams.append('audience', params.audiences.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<T>>} - A promise that resolves to the response from the request.\n\t */\n\tasync sendTokenRequest<T>(url: string, data: Record<string, string> = {}): Promise<HttpClientResponse<T>> {\n\t\treturn this.httpClient.request<T>(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","#initializationPromise","#isAuthenticatedPromise","#refreshInProgressState","timestamp","#checkAuthentication","options","storage","httpClient","logging","error","Metadata","#init","Session","isAuthenticated","params","session","url","response","data","jwt","success","state","serializedState","State","eventName","callbackFn","args","eventFn"],"mappings":"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"}
1
+ {"version":3,"file":"BaseFlow.cjs","sources":["../../src/flows/BaseFlow.ts"],"sourcesContent":["import type {\n\tIdTokenClaims,\n\tSDKOptions,\n\tSDKStorage,\n\tEventFunctions,\n\tExtraRequestArgs,\n\tLogoutParams,\n\tSDKHttpClient,\n\tHttpClientResponse,\n\tSDKLogging,\n} 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 * Logging utility for the SDK.\n\t */\n\tlogging?: SDKLogging;\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 * @param {SDKHttpClient} httpClient - HTTP client for making requests.\n\t * @param {SDKLogging} [logging] - Optional logging utility.\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, logging?: SDKLogging) {\n\t\tif (!options.issuer) {\n\t\t\tconst error = new Error('Missing option: issuer');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.clientId) {\n\t\t\tconst error = new Error('Missing option: clientId');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.redirectUri) {\n\t\t\tconst error = new Error('Missing option: redirectUri');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.urlHandler) {\n\t\t\tconst error = new Error('Missing option: urlHandler');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.callbackHandler) {\n\t\t\tconst error = new Error('Missing option: callbackHandler');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (options.scopes && !Array.isArray(options.scopes)) {\n\t\t\tconst error = new Error('Invalid option: scopes');\n\t\t\tlogging?.error('Invalid option provided', error);\n\t\t\tthrow error;\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.logging = logging;\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\t\tthis.logging?.debug('SDK initialized');\n\n\t\tif (!this.session) {\n\t\t\tthis.logging?.debug('No session found in storage');\n\t\t}\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\tthis.logging?.debug('Session loaded from storage');\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\tthis.logging?.debug('Access token has expired');\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\tthis.logging?.warn('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\t * @throws {Error} Throws an error if URL handler is not defined.\n\t */\n\tasync logout(params?: URLHandlerParams & LogoutParams): Promise<void> {\n\t\tif (typeof this.options.urlHandler !== 'function') {\n\t\t\tconst error = new Error('Missing option: urlHandler');\n\t\t\tthis.logging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tawait this.waitToInitialize();\n\n\t\tthis.logging?.debug('Attempting to logout');\n\n\t\tconst session = this.session;\n\n\t\tif (!session?.id_token) {\n\t\t\tthis.logging?.debug('Logout called without session');\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\t\tthis.logging?.debug('Logout initiated');\n\n\t\tawait this.options.urlHandler(url.toString(), params as URLHandlerParams);\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\tasync refresh(): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tthis.logging?.debug('Attempting to refresh session');\n\n\t\tif (typeof this.session?.refresh_token !== 'string') {\n\t\t\tthis.logging?.debug('Session refresh not possible - session not found');\n\t\t\treturn;\n\t\t}\n\n\t\tconst session = this.session;\n\n\t\ttry {\n\t\t\tconst response = await this.sendTokenRequest<Session>(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\tif (!response.ok) {\n\t\t\t\tconst data = await response.json();\n\t\t\t\tthrow new Error(`${data.error}: ${data.error_description}`);\n\t\t\t}\n\n\t\t\tObject.assign(this.session, await response.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\tthis.logging?.info('Session refreshed successfully');\n\t\t\t}\n\t\t} catch (error) {\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\tthis.logging?.info(`Session refresh failed - ${error}`);\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\tlet response: HttpClientResponse<Record<string, string>> | undefined;\n\n\t\t\tif (session?.refresh_token) {\n\t\t\t\tthis.logging?.debug('Attempting to revoke refresh token');\n\n\t\t\t\tresponse = await 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\tthis.logging?.debug('Attempting to revoke access token');\n\n\t\t\t\tresponse = await 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\n\t\t\tif (response && !response.ok) {\n\t\t\t\tconst data = await response.json();\n\t\t\t\tthrow new Error(`${data.error}: ${data.error_description}`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsuccess = false;\n\t\t\tthis.logging?.info(`Token revocation failed - ${error}`);\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\n\t\t\t\tif (success) {\n\t\t\t\t\tthis.logging?.info('Refresh token successfully revoked');\n\t\t\t\t}\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\n\t\t\t\tif (success) {\n\t\t\t\t\tthis.logging?.info('Access token successfully revoked');\n\t\t\t\t}\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.logging?.debug('Exchanging authorization code for tokens');\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\tconst error = new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t\tthis.logging?.error('Authorization error', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!this.session.code) {\n\t\t\tconst error = new Error('Invalid or missing code');\n\t\t\tthis.logging?.error('Authorization error', error);\n\t\t\tthrow error;\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\tconst error = new Error('Invalid or missing state');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst response = await this.sendTokenRequest<Session>(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\tif (!response.ok) {\n\t\t\tconst data = await response.json();\n\t\t\tconst error = new Error(`${data.error}: ${data.error_description}`);\n\t\t\tthis.logging?.error('Token exchange failed', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tObject.assign(this.session, await response.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\tconst error = new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (this.session.scope !== this.options.scopes?.join(' ')) {\n\t\t\tconst error = new Error('Invalid scope');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (this.session.claims?.nonce !== state.nonce) {\n\t\t\tconst error = new Error('Invalid nonce');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (this.session.claims?.iss !== (await this.metadata.issuer)) {\n\t\t\tconst error = new Error('Invalid iss');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\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\tconst error = new Error('Invalid aud');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\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\n\t\t\tif (this.logging) {\n\t\t\t\tthis.logging.xEventId = undefined;\n\t\t\t\tthis.logging.info('Login successful');\n\t\t\t}\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\t * @throws {Error} Throws an error if metadata retrieval fails.\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?.length) {\n\t\t\turl.searchParams.append('acr_values', params.acrValues.join(' '));\n\t\t}\n\t\tif (params.loginHint?.length) {\n\t\t\turl.searchParams.append('login_hint', params.loginHint);\n\t\t}\n\t\tif (params.uiLocales?.length) {\n\t\t\turl.searchParams.append('ui_locales', params.uiLocales.join(' '));\n\t\t}\n\t\tif (params.audiences?.length) {\n\t\t\turl.searchParams.append('audience', params.audiences.join(' '));\n\t\t}\n\n\t\treturn url;\n\t}\n\n\tasync 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<T>>} - A promise that resolves to the response from the request.\n\t */\n\tasync sendTokenRequest<T>(url: string, data: Record<string, string> = {}): Promise<HttpClientResponse<T>> {\n\t\treturn this.httpClient.request<T>(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","#initializationPromise","#isAuthenticatedPromise","#refreshInProgressState","timestamp","#checkAuthentication","options","storage","httpClient","logging","error","Metadata","#init","Session","isAuthenticated","params","session","url","response","data","jwt","success","state","serializedState","State","eventName","callbackFn","args","eventFn"],"mappings":"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"}
@@ -162,7 +162,7 @@ export declare abstract class BaseFlow<Options extends SDKOptions = SDKOptions,
162
162
  * @throws {Error} Throws an error if metadata retrieval fails.
163
163
  */
164
164
  getAuthorizationUrl(params?: ExtraRequestArgs): Promise<URL>;
165
- protected waitToInitialize(): Promise<void>;
165
+ waitToInitialize(): Promise<void>;
166
166
  /**
167
167
  * Sends a token request to the specified URL with the given data.
168
168
  *
@@ -1 +1 @@
1
- {"version":3,"file":"BaseFlow.mjs","sources":["../../src/flows/BaseFlow.ts"],"sourcesContent":["import type {\n\tIdTokenClaims,\n\tSDKOptions,\n\tSDKStorage,\n\tEventFunctions,\n\tExtraRequestArgs,\n\tLogoutParams,\n\tSDKHttpClient,\n\tHttpClientResponse,\n\tSDKLogging,\n} 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 * Logging utility for the SDK.\n\t */\n\tlogging?: SDKLogging;\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 * @param {SDKHttpClient} httpClient - HTTP client for making requests.\n\t * @param {SDKLogging} [logging] - Optional logging utility.\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, logging?: SDKLogging) {\n\t\tif (!options.issuer) {\n\t\t\tconst error = new Error('Missing option: issuer');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.clientId) {\n\t\t\tconst error = new Error('Missing option: clientId');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.redirectUri) {\n\t\t\tconst error = new Error('Missing option: redirectUri');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.urlHandler) {\n\t\t\tconst error = new Error('Missing option: urlHandler');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.callbackHandler) {\n\t\t\tconst error = new Error('Missing option: callbackHandler');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (options.scopes && !Array.isArray(options.scopes)) {\n\t\t\tconst error = new Error('Invalid option: scopes');\n\t\t\tlogging?.error('Invalid option provided', error);\n\t\t\tthrow error;\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.logging = logging;\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\t\tthis.logging?.debug('SDK initialized');\n\n\t\tif (!this.session) {\n\t\t\tthis.logging?.debug('No session found in storage');\n\t\t}\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\tthis.logging?.debug('Session loaded from storage');\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\tthis.logging?.debug('Access token has expired');\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\tthis.logging?.warn('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\t * @throws {Error} Throws an error if URL handler is not defined.\n\t */\n\tasync logout(params?: URLHandlerParams & LogoutParams): Promise<void> {\n\t\tif (typeof this.options.urlHandler !== 'function') {\n\t\t\tconst error = new Error('Missing option: urlHandler');\n\t\t\tthis.logging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tawait this.waitToInitialize();\n\n\t\tthis.logging?.debug('Attempting to logout');\n\n\t\tconst session = this.session;\n\n\t\tif (!session?.id_token) {\n\t\t\tthis.logging?.debug('Logout called without session');\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\t\tthis.logging?.debug('Logout initiated');\n\n\t\tawait this.options.urlHandler(url.toString(), params as URLHandlerParams);\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\tasync refresh(): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tthis.logging?.debug('Attempting to refresh session');\n\n\t\tif (typeof this.session?.refresh_token !== 'string') {\n\t\t\tthis.logging?.debug('Session refresh not possible - session not found');\n\t\t\treturn;\n\t\t}\n\n\t\tconst session = this.session;\n\n\t\ttry {\n\t\t\tconst response = await this.sendTokenRequest<Session>(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\tif (!response.ok) {\n\t\t\t\tconst data = await response.json();\n\t\t\t\tthrow new Error(`${data.error}: ${data.error_description}`);\n\t\t\t}\n\n\t\t\tObject.assign(this.session, await response.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\tthis.logging?.info('Session refreshed successfully');\n\t\t\t}\n\t\t} catch (error) {\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\tthis.logging?.info(`Session refresh failed - ${error}`);\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\tlet response: HttpClientResponse<Record<string, string>> | undefined;\n\n\t\t\tif (session?.refresh_token) {\n\t\t\t\tthis.logging?.debug('Attempting to revoke refresh token');\n\n\t\t\t\tresponse = await 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\tthis.logging?.debug('Attempting to revoke access token');\n\n\t\t\t\tresponse = await 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\n\t\t\tif (response && !response.ok) {\n\t\t\t\tconst data = await response.json();\n\t\t\t\tthrow new Error(`${data.error}: ${data.error_description}`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsuccess = false;\n\t\t\tthis.logging?.info(`Token revocation failed - ${error}`);\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\n\t\t\t\tif (success) {\n\t\t\t\t\tthis.logging?.info('Refresh token successfully revoked');\n\t\t\t\t}\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\n\t\t\t\tif (success) {\n\t\t\t\t\tthis.logging?.info('Access token successfully revoked');\n\t\t\t\t}\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.logging?.debug('Exchanging authorization code for tokens');\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\tconst error = new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t\tthis.logging?.error('Authorization error', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!this.session.code) {\n\t\t\tconst error = new Error('Invalid or missing code');\n\t\t\tthis.logging?.error('Authorization error', error);\n\t\t\tthrow error;\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\tconst error = new Error('Invalid or missing state');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst response = await this.sendTokenRequest<Session>(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\tif (!response.ok) {\n\t\t\tconst data = await response.json();\n\t\t\tconst error = new Error(`${data.error}: ${data.error_description}`);\n\t\t\tthis.logging?.error('Token exchange failed', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tObject.assign(this.session, await response.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\tconst error = new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (this.session.scope !== this.options.scopes?.join(' ')) {\n\t\t\tconst error = new Error('Invalid scope');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (this.session.claims?.nonce !== state.nonce) {\n\t\t\tconst error = new Error('Invalid nonce');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (this.session.claims?.iss !== (await this.metadata.issuer)) {\n\t\t\tconst error = new Error('Invalid iss');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\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\tconst error = new Error('Invalid aud');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\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\n\t\t\tif (this.logging) {\n\t\t\t\tthis.logging.xEventId = undefined;\n\t\t\t\tthis.logging.info('Login successful');\n\t\t\t}\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\t * @throws {Error} Throws an error if metadata retrieval fails.\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?.length) {\n\t\t\turl.searchParams.append('acr_values', params.acrValues.join(' '));\n\t\t}\n\t\tif (params.loginHint?.length) {\n\t\t\turl.searchParams.append('login_hint', params.loginHint);\n\t\t}\n\t\tif (params.uiLocales?.length) {\n\t\t\turl.searchParams.append('ui_locales', params.uiLocales.join(' '));\n\t\t}\n\t\tif (params.audiences?.length) {\n\t\t\turl.searchParams.append('audience', params.audiences.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<T>>} - A promise that resolves to the response from the request.\n\t */\n\tasync sendTokenRequest<T>(url: string, data: Record<string, string> = {}): Promise<HttpClientResponse<T>> {\n\t\treturn this.httpClient.request<T>(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","#initializationPromise","#isAuthenticatedPromise","#refreshInProgressState","timestamp","#checkAuthentication","options","storage","httpClient","logging","error","Metadata","#init","Session","isAuthenticated","params","session","url","response","data","jwt","success","state","serializedState","State","eventName","callbackFn","args","eventFn"],"mappings":"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"}
1
+ {"version":3,"file":"BaseFlow.mjs","sources":["../../src/flows/BaseFlow.ts"],"sourcesContent":["import type {\n\tIdTokenClaims,\n\tSDKOptions,\n\tSDKStorage,\n\tEventFunctions,\n\tExtraRequestArgs,\n\tLogoutParams,\n\tSDKHttpClient,\n\tHttpClientResponse,\n\tSDKLogging,\n} 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 * Logging utility for the SDK.\n\t */\n\tlogging?: SDKLogging;\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 * @param {SDKHttpClient} httpClient - HTTP client for making requests.\n\t * @param {SDKLogging} [logging] - Optional logging utility.\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, logging?: SDKLogging) {\n\t\tif (!options.issuer) {\n\t\t\tconst error = new Error('Missing option: issuer');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.clientId) {\n\t\t\tconst error = new Error('Missing option: clientId');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.redirectUri) {\n\t\t\tconst error = new Error('Missing option: redirectUri');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.urlHandler) {\n\t\t\tconst error = new Error('Missing option: urlHandler');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!options.callbackHandler) {\n\t\t\tconst error = new Error('Missing option: callbackHandler');\n\t\t\tlogging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (options.scopes && !Array.isArray(options.scopes)) {\n\t\t\tconst error = new Error('Invalid option: scopes');\n\t\t\tlogging?.error('Invalid option provided', error);\n\t\t\tthrow error;\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.logging = logging;\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\t\tthis.logging?.debug('SDK initialized');\n\n\t\tif (!this.session) {\n\t\t\tthis.logging?.debug('No session found in storage');\n\t\t}\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\tthis.logging?.debug('Session loaded from storage');\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\tthis.logging?.debug('Access token has expired');\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\tthis.logging?.warn('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\t * @throws {Error} Throws an error if URL handler is not defined.\n\t */\n\tasync logout(params?: URLHandlerParams & LogoutParams): Promise<void> {\n\t\tif (typeof this.options.urlHandler !== 'function') {\n\t\t\tconst error = new Error('Missing option: urlHandler');\n\t\t\tthis.logging?.error('Required option missing', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tawait this.waitToInitialize();\n\n\t\tthis.logging?.debug('Attempting to logout');\n\n\t\tconst session = this.session;\n\n\t\tif (!session?.id_token) {\n\t\t\tthis.logging?.debug('Logout called without session');\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\t\tthis.logging?.debug('Logout initiated');\n\n\t\tawait this.options.urlHandler(url.toString(), params as URLHandlerParams);\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\tasync refresh(): Promise<void> {\n\t\tawait this.waitToInitialize();\n\n\t\tthis.logging?.debug('Attempting to refresh session');\n\n\t\tif (typeof this.session?.refresh_token !== 'string') {\n\t\t\tthis.logging?.debug('Session refresh not possible - session not found');\n\t\t\treturn;\n\t\t}\n\n\t\tconst session = this.session;\n\n\t\ttry {\n\t\t\tconst response = await this.sendTokenRequest<Session>(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\tif (!response.ok) {\n\t\t\t\tconst data = await response.json();\n\t\t\t\tthrow new Error(`${data.error}: ${data.error_description}`);\n\t\t\t}\n\n\t\t\tObject.assign(this.session, await response.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\tthis.logging?.info('Session refreshed successfully');\n\t\t\t}\n\t\t} catch (error) {\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\tthis.logging?.info(`Session refresh failed - ${error}`);\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\tlet response: HttpClientResponse<Record<string, string>> | undefined;\n\n\t\t\tif (session?.refresh_token) {\n\t\t\t\tthis.logging?.debug('Attempting to revoke refresh token');\n\n\t\t\t\tresponse = await 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\tthis.logging?.debug('Attempting to revoke access token');\n\n\t\t\t\tresponse = await 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\n\t\t\tif (response && !response.ok) {\n\t\t\t\tconst data = await response.json();\n\t\t\t\tthrow new Error(`${data.error}: ${data.error_description}`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsuccess = false;\n\t\t\tthis.logging?.info(`Token revocation failed - ${error}`);\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\n\t\t\t\tif (success) {\n\t\t\t\t\tthis.logging?.info('Refresh token successfully revoked');\n\t\t\t\t}\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\n\t\t\t\tif (success) {\n\t\t\t\t\tthis.logging?.info('Access token successfully revoked');\n\t\t\t\t}\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.logging?.debug('Exchanging authorization code for tokens');\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\tconst error = new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t\tthis.logging?.error('Authorization error', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!this.session.code) {\n\t\t\tconst error = new Error('Invalid or missing code');\n\t\t\tthis.logging?.error('Authorization error', error);\n\t\t\tthrow error;\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\tconst error = new Error('Invalid or missing state');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst response = await this.sendTokenRequest<Session>(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\tif (!response.ok) {\n\t\t\tconst data = await response.json();\n\t\t\tconst error = new Error(`${data.error}: ${data.error_description}`);\n\t\t\tthis.logging?.error('Token exchange failed', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tObject.assign(this.session, await response.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\tconst error = new Error(`${this.session.error}: ${this.session.error_description}`);\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (this.session.scope !== this.options.scopes?.join(' ')) {\n\t\t\tconst error = new Error('Invalid scope');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (this.session.claims?.nonce !== state.nonce) {\n\t\t\tconst error = new Error('Invalid nonce');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (this.session.claims?.iss !== (await this.metadata.issuer)) {\n\t\t\tconst error = new Error('Invalid iss');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\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\tconst error = new Error('Invalid aud');\n\t\t\tthis.logging?.error('Validation failed', error);\n\t\t\tthrow error;\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\n\t\t\tif (this.logging) {\n\t\t\t\tthis.logging.xEventId = undefined;\n\t\t\t\tthis.logging.info('Login successful');\n\t\t\t}\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\t * @throws {Error} Throws an error if metadata retrieval fails.\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?.length) {\n\t\t\turl.searchParams.append('acr_values', params.acrValues.join(' '));\n\t\t}\n\t\tif (params.loginHint?.length) {\n\t\t\turl.searchParams.append('login_hint', params.loginHint);\n\t\t}\n\t\tif (params.uiLocales?.length) {\n\t\t\turl.searchParams.append('ui_locales', params.uiLocales.join(' '));\n\t\t}\n\t\tif (params.audiences?.length) {\n\t\t\turl.searchParams.append('audience', params.audiences.join(' '));\n\t\t}\n\n\t\treturn url;\n\t}\n\n\tasync 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<T>>} - A promise that resolves to the response from the request.\n\t */\n\tasync sendTokenRequest<T>(url: string, data: Record<string, string> = {}): Promise<HttpClientResponse<T>> {\n\t\treturn this.httpClient.request<T>(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","#initializationPromise","#isAuthenticatedPromise","#refreshInProgressState","timestamp","#checkAuthentication","options","storage","httpClient","logging","error","Metadata","#init","Session","isAuthenticated","params","session","url","response","data","jwt","success","state","serializedState","State","eventName","callbackFn","args","eventFn"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("../utils/handlers.cjs"),h=require("../utils/EmbeddedFlowHandler.cjs"),g=require("./BaseFlow.cjs");require("../utils/errors.cjs");require("../utils/State.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 u extends g.BaseFlow{constructor(r,e,s,i){r.urlHandler||(r.urlHandler=c.redirectUrlHandler),r.callbackHandler||(r.callbackHandler=c.redirectCallbackHandler),super(r,e,s,i),globalThis.sty||(globalThis.sty={}),globalThis.sty.oidcService=this}login(r={}){return this.dispatchEvent("loginInitiated",[]),new h.EmbeddedFlowHandler(this,r)}register(r={}){return r.prompt="create",this.login(r)}async entry(r){r||(r=globalThis.window?.location.href);const e=new URL(r);e.searchParams.append("sdk","web-embedded"),e.searchParams.append("client_id",this.options.clientId),e.searchParams.append("redirect_uri",this.options.redirectUri);const s=await this.httpClient.request(`${this.options.issuer}/provider/flow/entry?${e.searchParams.toString()}`);if(!s.ok){if(s.status===400){const o=await s.json();let n="Entry request failed with status 400";typeof o=="object"&&(o.error?n=`${o.error}: ${o.error_description}`:o.errorKey&&(n=o.errorKey));const d=new Error(n);throw this.logging?.error("Entry request error",d),d}const t=new Error(`Entry request failed with status ${s.status}`);throw this.logging?.error("Entry request error",t),t}let i;try{i=new URL(await s.text())}catch{i=new URL(s.url)}const a=i.searchParams.get("short_app_id"),l=i.searchParams.get("session_id");if(!a){const t=new Error('"short_app_id" is missing from the response');throw this.logging?.error("Entry response error",t),t}if(!l){const t=new Error('"session_id" is missing from the response');throw this.logging?.error("Entry response error",t),t}return{session_id:l,short_app_id:a}}async handleCallback(r){if(typeof this.options.callbackHandler!="function"){const e=new Error("Missing option: callbackHandler");throw this.logging?.error("Required option missing",e),e}r||(r=globalThis.window?.location.href),await this.tokenExchange(await this.options.callbackHandler(r,this.options.responseMode||"fragment"))}}exports.EmbeddedFlow=u;
2
+ //# sourceMappingURL=EmbeddedFlow.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddedFlow.cjs","sources":["../../src/flows/EmbeddedFlow.ts"],"sourcesContent":["import type { SDKOptions, SDKStorage, SDKHttpClient, SDKLogging, ExtraRequestArgs } from '../types';\nimport { redirectUrlHandler, redirectCallbackHandler } from '../utils/handlers';\nimport { EmbeddedFlowHandler } from '../utils/EmbeddedFlowHandler';\nimport { BaseFlow } from './BaseFlow';\n\nexport class EmbeddedFlow extends BaseFlow<SDKOptions, ExtraRequestArgs> {\n\tconstructor(options: SDKOptions, storage: SDKStorage, httpClient: SDKHttpClient, logging?: SDKLogging) {\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, logging);\n\n\t\tif (!globalThis.sty) {\n\t\t\tglobalThis.sty = {};\n\t\t}\n\n\t\t// NOTE: Register the OIDC service instance globally for use in the login component\n\t\tglobalThis.sty.oidcService = this;\n\t}\n\n\t/**\n\t * Initiates the login process via embedded UI.\n\t * @param {ExtraRequestArgs} [params={}] Optional parameters for the login request.\n\t * @returns {EmbeddedFlowHandler} Returns with an embedded login handler.\n\t */\n\toverride login(params: ExtraRequestArgs = {}): EmbeddedFlowHandler {\n\t\tthis.dispatchEvent('loginInitiated', []);\n\n\t\treturn new EmbeddedFlowHandler(this, params);\n\t}\n\n\toverride register(params: ExtraRequestArgs = {}) {\n\t\tparams.prompt = 'create';\n\n\t\treturn this.login(params);\n\t}\n\n\toverride async entry(url?: 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-embedded');\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\tconst error = new Error(message);\n\t\t\t\tthis.logging?.error('Entry request error', error);\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tconst error = new Error(`Entry request failed with status ${response.status}`);\n\t\t\tthis.logging?.error('Entry request error', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tlet uri: URL;\n\n\t\ttry {\n\t\t\turi = new URL(await response.text());\n\t\t} catch {\n\t\t\turi = new URL(response.url);\n\t\t}\n\n\t\tconst shortAppId = uri.searchParams.get('short_app_id');\n\t\tconst sessionId = uri.searchParams.get('session_id');\n\n\t\tif (!shortAppId) {\n\t\t\tconst error = new Error('\"short_app_id\" is missing from the response');\n\t\t\tthis.logging?.error('Entry response error', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!sessionId) {\n\t\t\tconst error = new Error('\"session_id\" is missing from the response');\n\t\t\tthis.logging?.error('Entry response error', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\treturn { session_id: sessionId, short_app_id: shortAppId };\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\t * @throws {Error} Throws an error if callback handler is not defined.\n\t */\n\tasync handleCallback(url?: string): Promise<void> {\n\t\tif (typeof this.options.callbackHandler !== 'function') {\n\t\t\tconst error = new Error('Missing option: callbackHandler');\n\t\t\tthis.logging?.error('Required option missing', error);\n\t\t\tthrow error;\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":["EmbeddedFlow","BaseFlow","options","storage","httpClient","logging","redirectUrlHandler","redirectCallbackHandler","params","EmbeddedFlowHandler","url","entryUrl","response","data","message","error","uri","shortAppId","sessionId"],"mappings":"2bAKO,MAAMA,UAAqBC,EAAAA,QAAuC,CACxE,YAAYC,EAAqBC,EAAqBC,EAA2BC,EAAsB,CACjGH,EAAQ,aACZA,EAAQ,WAAaI,EAAAA,oBAEjBJ,EAAQ,kBACZA,EAAQ,gBAAkBK,EAAAA,yBAG3B,MAAML,EAASC,EAASC,EAAYC,CAAO,EAEtC,WAAW,MACf,WAAW,IAAM,CAAA,GAIlB,WAAW,IAAI,YAAc,IAC9B,CAOS,MAAMG,EAA2B,GAAyB,CAClE,YAAK,cAAc,iBAAkB,EAAE,EAEhC,IAAIC,EAAAA,oBAAoB,KAAMD,CAAM,CAC5C,CAES,SAASA,EAA2B,GAAI,CAChD,OAAAA,EAAO,OAAS,SAET,KAAK,MAAMA,CAAM,CACzB,CAEA,MAAe,MAAME,EAAc,CAC7BA,IACJA,EAAM,WAAW,QAAQ,SAAS,MAGnC,MAAMC,EAAW,IAAI,IAAID,CAAG,EAC5BC,EAAS,aAAa,OAAO,MAAO,cAAc,EAClDA,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,uCAEV,OAAOD,GAAS,WACfA,EAAK,MACRC,EAAU,GAAGD,EAAK,KAAK,KAAKA,EAAK,iBAAiB,GACxCA,EAAK,WACfC,EAAUD,EAAK,WAIjB,MAAME,EAAQ,IAAI,MAAMD,CAAO,EAC/B,WAAK,SAAS,MAAM,sBAAuBC,CAAK,EAC1CA,CACP,CAEA,MAAMA,EAAQ,IAAI,MAAM,oCAAoCH,EAAS,MAAM,EAAE,EAC7E,WAAK,SAAS,MAAM,sBAAuBG,CAAK,EAC1CA,CACP,CAEA,IAAIC,EAEJ,GAAI,CACHA,EAAM,IAAI,IAAI,MAAMJ,EAAS,MAAM,CACpC,MAAQ,CACPI,EAAM,IAAI,IAAIJ,EAAS,GAAG,CAC3B,CAEA,MAAMK,EAAaD,EAAI,aAAa,IAAI,cAAc,EAChDE,EAAYF,EAAI,aAAa,IAAI,YAAY,EAEnD,GAAI,CAACC,EAAY,CAChB,MAAMF,EAAQ,IAAI,MAAM,6CAA6C,EACrE,WAAK,SAAS,MAAM,uBAAwBA,CAAK,EAC3CA,CACP,CACA,GAAI,CAACG,EAAW,CACf,MAAMH,EAAQ,IAAI,MAAM,2CAA2C,EACnE,WAAK,SAAS,MAAM,uBAAwBA,CAAK,EAC3CA,CACP,CAEA,MAAO,CAAE,WAAYG,EAAW,aAAcD,CAAA,CAC/C,CASA,MAAM,eAAeP,EAA6B,CACjD,GAAI,OAAO,KAAK,QAAQ,iBAAoB,WAAY,CACvD,MAAMK,EAAQ,IAAI,MAAM,iCAAiC,EACzD,WAAK,SAAS,MAAM,0BAA2BA,CAAK,EAC9CA,CACP,CAEKL,IACJA,EAAM,WAAW,QAAQ,SAAS,MAGnC,MAAM,KAAK,cAAe,MAAM,KAAK,QAAQ,gBAAgBA,EAAK,KAAK,QAAQ,cAAgB,UAAU,CAA4B,CACtI,CACD"}
@@ -0,0 +1,25 @@
1
+ import { SDKOptions, SDKStorage, SDKHttpClient, SDKLogging, ExtraRequestArgs } from '../types';
2
+ import { EmbeddedFlowHandler } from '../utils/EmbeddedFlowHandler';
3
+ import { BaseFlow } from './BaseFlow';
4
+ export declare class EmbeddedFlow extends BaseFlow<SDKOptions, ExtraRequestArgs> {
5
+ constructor(options: SDKOptions, storage: SDKStorage, httpClient: SDKHttpClient, logging?: SDKLogging);
6
+ /**
7
+ * Initiates the login process via embedded UI.
8
+ * @param {ExtraRequestArgs} [params={}] Optional parameters for the login request.
9
+ * @returns {EmbeddedFlowHandler} Returns with an embedded login handler.
10
+ */
11
+ login(params?: ExtraRequestArgs): EmbeddedFlowHandler;
12
+ register(params?: ExtraRequestArgs): EmbeddedFlowHandler;
13
+ entry(url?: string): Promise<{
14
+ session_id: string;
15
+ short_app_id: string;
16
+ }>;
17
+ /**
18
+ * Handles the callback after login or registration via a redirect.
19
+ * @param {string} [url] The URL to handle the callback from. Defaults to the current window location.
20
+ * @returns {Promise<void>} A promise that resolves when the callback is handled.
21
+ *
22
+ * @throws {Error} Throws an error if callback handler is not defined.
23
+ */
24
+ handleCallback(url?: string): Promise<void>;
25
+ }
@@ -0,0 +1,2 @@
1
+ import{redirectUrlHandler as d,redirectCallbackHandler as h}from"../utils/handlers.mjs";import{EmbeddedFlowHandler as p}from"../utils/EmbeddedFlowHandler.mjs";import{BaseFlow as g}from"./BaseFlow.mjs";import"../utils/errors.mjs";import"../utils/State.mjs";import"../utils/crypto.mjs";import"../utils/base64Url.mjs";import"../utils/date.mjs";import"../utils/jwt.mjs";import"../utils/Metadata.mjs";import"../utils/Session.mjs";class U extends g{constructor(r,e,t,o){r.urlHandler||(r.urlHandler=d),r.callbackHandler||(r.callbackHandler=h),super(r,e,t,o),globalThis.sty||(globalThis.sty={}),globalThis.sty.oidcService=this}login(r={}){return this.dispatchEvent("loginInitiated",[]),new p(this,r)}register(r={}){return r.prompt="create",this.login(r)}async entry(r){r||(r=globalThis.window?.location.href);const e=new URL(r);e.searchParams.append("sdk","web-embedded"),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 n="Entry request failed with status 400";typeof i=="object"&&(i.error?n=`${i.error}: ${i.error_description}`:i.errorKey&&(n=i.errorKey));const c=new Error(n);throw this.logging?.error("Entry request error",c),c}const s=new Error(`Entry request failed with status ${t.status}`);throw this.logging?.error("Entry request error",s),s}let o;try{o=new URL(await t.text())}catch{o=new URL(t.url)}const a=o.searchParams.get("short_app_id"),l=o.searchParams.get("session_id");if(!a){const s=new Error('"short_app_id" is missing from the response');throw this.logging?.error("Entry response error",s),s}if(!l){const s=new Error('"session_id" is missing from the response');throw this.logging?.error("Entry response error",s),s}return{session_id:l,short_app_id:a}}async handleCallback(r){if(typeof this.options.callbackHandler!="function"){const e=new Error("Missing option: callbackHandler");throw this.logging?.error("Required option missing",e),e}r||(r=globalThis.window?.location.href),await this.tokenExchange(await this.options.callbackHandler(r,this.options.responseMode||"fragment"))}}export{U as EmbeddedFlow};
2
+ //# sourceMappingURL=EmbeddedFlow.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddedFlow.mjs","sources":["../../src/flows/EmbeddedFlow.ts"],"sourcesContent":["import type { SDKOptions, SDKStorage, SDKHttpClient, SDKLogging, ExtraRequestArgs } from '../types';\nimport { redirectUrlHandler, redirectCallbackHandler } from '../utils/handlers';\nimport { EmbeddedFlowHandler } from '../utils/EmbeddedFlowHandler';\nimport { BaseFlow } from './BaseFlow';\n\nexport class EmbeddedFlow extends BaseFlow<SDKOptions, ExtraRequestArgs> {\n\tconstructor(options: SDKOptions, storage: SDKStorage, httpClient: SDKHttpClient, logging?: SDKLogging) {\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, logging);\n\n\t\tif (!globalThis.sty) {\n\t\t\tglobalThis.sty = {};\n\t\t}\n\n\t\t// NOTE: Register the OIDC service instance globally for use in the login component\n\t\tglobalThis.sty.oidcService = this;\n\t}\n\n\t/**\n\t * Initiates the login process via embedded UI.\n\t * @param {ExtraRequestArgs} [params={}] Optional parameters for the login request.\n\t * @returns {EmbeddedFlowHandler} Returns with an embedded login handler.\n\t */\n\toverride login(params: ExtraRequestArgs = {}): EmbeddedFlowHandler {\n\t\tthis.dispatchEvent('loginInitiated', []);\n\n\t\treturn new EmbeddedFlowHandler(this, params);\n\t}\n\n\toverride register(params: ExtraRequestArgs = {}) {\n\t\tparams.prompt = 'create';\n\n\t\treturn this.login(params);\n\t}\n\n\toverride async entry(url?: 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-embedded');\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\tconst error = new Error(message);\n\t\t\t\tthis.logging?.error('Entry request error', error);\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tconst error = new Error(`Entry request failed with status ${response.status}`);\n\t\t\tthis.logging?.error('Entry request error', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tlet uri: URL;\n\n\t\ttry {\n\t\t\turi = new URL(await response.text());\n\t\t} catch {\n\t\t\turi = new URL(response.url);\n\t\t}\n\n\t\tconst shortAppId = uri.searchParams.get('short_app_id');\n\t\tconst sessionId = uri.searchParams.get('session_id');\n\n\t\tif (!shortAppId) {\n\t\t\tconst error = new Error('\"short_app_id\" is missing from the response');\n\t\t\tthis.logging?.error('Entry response error', error);\n\t\t\tthrow error;\n\t\t}\n\t\tif (!sessionId) {\n\t\t\tconst error = new Error('\"session_id\" is missing from the response');\n\t\t\tthis.logging?.error('Entry response error', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\treturn { session_id: sessionId, short_app_id: shortAppId };\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\t * @throws {Error} Throws an error if callback handler is not defined.\n\t */\n\tasync handleCallback(url?: string): Promise<void> {\n\t\tif (typeof this.options.callbackHandler !== 'function') {\n\t\t\tconst error = new Error('Missing option: callbackHandler');\n\t\t\tthis.logging?.error('Required option missing', error);\n\t\t\tthrow error;\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":["EmbeddedFlow","BaseFlow","options","storage","httpClient","logging","redirectUrlHandler","redirectCallbackHandler","params","EmbeddedFlowHandler","url","entryUrl","response","data","message","error","uri","shortAppId","sessionId"],"mappings":"yaAKO,MAAMA,UAAqBC,CAAuC,CACxE,YAAYC,EAAqBC,EAAqBC,EAA2BC,EAAsB,CACjGH,EAAQ,aACZA,EAAQ,WAAaI,GAEjBJ,EAAQ,kBACZA,EAAQ,gBAAkBK,GAG3B,MAAML,EAASC,EAASC,EAAYC,CAAO,EAEtC,WAAW,MACf,WAAW,IAAM,CAAA,GAIlB,WAAW,IAAI,YAAc,IAC9B,CAOS,MAAMG,EAA2B,GAAyB,CAClE,YAAK,cAAc,iBAAkB,EAAE,EAEhC,IAAIC,EAAoB,KAAMD,CAAM,CAC5C,CAES,SAASA,EAA2B,GAAI,CAChD,OAAAA,EAAO,OAAS,SAET,KAAK,MAAMA,CAAM,CACzB,CAEA,MAAe,MAAME,EAAc,CAC7BA,IACJA,EAAM,WAAW,QAAQ,SAAS,MAGnC,MAAMC,EAAW,IAAI,IAAID,CAAG,EAC5BC,EAAS,aAAa,OAAO,MAAO,cAAc,EAClDA,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,uCAEV,OAAOD,GAAS,WACfA,EAAK,MACRC,EAAU,GAAGD,EAAK,KAAK,KAAKA,EAAK,iBAAiB,GACxCA,EAAK,WACfC,EAAUD,EAAK,WAIjB,MAAME,EAAQ,IAAI,MAAMD,CAAO,EAC/B,WAAK,SAAS,MAAM,sBAAuBC,CAAK,EAC1CA,CACP,CAEA,MAAMA,EAAQ,IAAI,MAAM,oCAAoCH,EAAS,MAAM,EAAE,EAC7E,WAAK,SAAS,MAAM,sBAAuBG,CAAK,EAC1CA,CACP,CAEA,IAAIC,EAEJ,GAAI,CACHA,EAAM,IAAI,IAAI,MAAMJ,EAAS,MAAM,CACpC,MAAQ,CACPI,EAAM,IAAI,IAAIJ,EAAS,GAAG,CAC3B,CAEA,MAAMK,EAAaD,EAAI,aAAa,IAAI,cAAc,EAChDE,EAAYF,EAAI,aAAa,IAAI,YAAY,EAEnD,GAAI,CAACC,EAAY,CAChB,MAAMF,EAAQ,IAAI,MAAM,6CAA6C,EACrE,WAAK,SAAS,MAAM,uBAAwBA,CAAK,EAC3CA,CACP,CACA,GAAI,CAACG,EAAW,CACf,MAAMH,EAAQ,IAAI,MAAM,2CAA2C,EACnE,WAAK,SAAS,MAAM,uBAAwBA,CAAK,EAC3CA,CACP,CAEA,MAAO,CAAE,WAAYG,EAAW,aAAcD,CAAA,CAC/C,CASA,MAAM,eAAeP,EAA6B,CACjD,GAAI,OAAO,KAAK,QAAQ,iBAAoB,WAAY,CACvD,MAAMK,EAAQ,IAAI,MAAM,iCAAiC,EACzD,WAAK,SAAS,MAAM,0BAA2BA,CAAK,EAC9CA,CACP,CAEKL,IACJA,EAAM,WAAW,QAAQ,SAAS,MAGnC,MAAM,KAAK,cAAe,MAAM,KAAK,QAAQ,gBAAgBA,EAAK,KAAK,QAAQ,cAAgB,UAAU,CAA4B,CACtI,CACD"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("../utils/handlers.cjs"),d=require("../utils/NativeFlowHandler.cjs"),h=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 u extends h.BaseFlow{constructor(r,e,t,s){r.urlHandler||(r.urlHandler=c.redirectUrlHandler),r.callbackHandler||(r.callbackHandler=c.redirectCallbackHandler),super(r,e,t,s)}login(r={}){return this.dispatchEvent("loginInitiated",[]),new d.NativeFlowHandler(this,r)}register(r={}){return r.prompt="create",this.login(r)}async entry(r){r||(r=globalThis.window?.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 o="Entry request failed with status 400";typeof i=="object"&&(i.error?o=`${i.error}: ${i.error_description}`:i.errorKey&&(o=i.errorKey));const l=new Error(o);throw this.logging?.error("Entry request error",l),l}const n=new Error(`Entry request failed with status ${t.status}`);throw this.logging?.error("Entry request error",n),n}let s;try{s=new URL(await t.text())}catch{s=new URL(t.url)}const a=s.searchParams.get("session_id");if(!a){const n=new Error("Session ID not found in entry response");throw this.logging?.error("Entry response error",n),n}return a}async handleCallback(r){if(typeof this.options.callbackHandler!="function"){const e=new Error("Missing option: callbackHandler");throw this.logging?.error("Required option missing",e),e}r||(r=globalThis.window?.location.href),await this.tokenExchange(await this.options.callbackHandler(r,this.options.responseMode||"fragment"))}}exports.NativeFlow=u;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("../utils/handlers.cjs"),d=require("../utils/NativeFlowHandler.cjs"),h=require("./BaseFlow.cjs");require("../utils/errors.cjs");require("../utils/State.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 u extends h.BaseFlow{constructor(r,e,t,s){r.urlHandler||(r.urlHandler=c.redirectUrlHandler),r.callbackHandler||(r.callbackHandler=c.redirectCallbackHandler),super(r,e,t,s)}login(r={}){return this.dispatchEvent("loginInitiated",[]),new d.NativeFlowHandler(this,r)}register(r={}){return r.prompt="create",this.login(r)}async entry(r){r||(r=globalThis.window?.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 o="Entry request failed with status 400";typeof i=="object"&&(i.error?o=`${i.error}: ${i.error_description}`:i.errorKey&&(o=i.errorKey));const l=new Error(o);throw this.logging?.error("Entry request error",l),l}const n=new Error(`Entry request failed with status ${t.status}`);throw this.logging?.error("Entry request error",n),n}let s;try{s=new URL(await t.text())}catch{s=new URL(t.url)}const a=s.searchParams.get("session_id");if(!a){const n=new Error("Session ID not found in entry response");throw this.logging?.error("Entry response error",n),n}return{session_id:a}}async handleCallback(r){if(typeof this.options.callbackHandler!="function"){const e=new Error("Missing option: callbackHandler");throw this.logging?.error("Required option missing",e),e}r||(r=globalThis.window?.location.href),await this.tokenExchange(await this.options.callbackHandler(r,this.options.responseMode||"fragment"))}}exports.NativeFlow=u;
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, SDKLogging } 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, logging?: SDKLogging) {\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, logging);\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\t * @throws {Error} Throws an error if the entry request fails or session ID is not found.\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\tconst error = new Error(message);\n\t\t\t\tthis.logging?.error('Entry request error', error);\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tconst error = new Error(`Entry request failed with status ${response.status}`);\n\t\t\tthis.logging?.error('Entry request error', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tlet uri: URL;\n\n\t\ttry {\n\t\t\turi = new URL(await response.text());\n\t\t} catch {\n\t\t\turi = new URL(response.url);\n\t\t}\n\n\t\tconst sessionId = uri.searchParams.get('session_id');\n\n\t\tif (!sessionId) {\n\t\t\tconst error = new Error('Session ID not found in entry response');\n\t\t\tthis.logging?.error('Entry response error', error);\n\t\t\tthrow error;\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\t * @throws {Error} Throws an error if callback handler is not defined.\n\t */\n\tasync handleCallback(url?: string): Promise<void> {\n\t\tif (typeof this.options.callbackHandler !== 'function') {\n\t\t\tconst error = new Error('Missing option: callbackHandler');\n\t\t\tthis.logging?.error('Required option missing', error);\n\t\t\tthrow error;\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","logging","redirectUrlHandler","redirectCallbackHandler","params","NativeFlowHandler","url","entryUrl","response","data","message","error","uri","sessionId"],"mappings":"ybAKO,MAAMA,UAAmBC,EAAAA,QAAmC,CAClE,YAAYC,EAAqBC,EAAqBC,EAA2BC,EAAsB,CACjGH,EAAQ,aACZA,EAAQ,WAAaI,EAAAA,oBAEjBJ,EAAQ,kBACZA,EAAQ,gBAAkBK,EAAAA,yBAG3B,MAAML,EAASC,EAASC,EAAYC,CAAO,CAC5C,CAOA,MAAMG,EAAuB,GAAuB,CACnD,YAAK,cAAc,iBAAkB,EAAE,EAEhC,IAAIC,EAAAA,kBAAkB,KAAMD,CAAM,CAC1C,CAOA,SAASA,EAAuB,GAAuB,CACtD,OAAAA,EAAO,OAAS,SAET,KAAK,MAAMA,CAAM,CACzB,CASA,MAAM,MAAME,EAA+B,CACrCA,IACJA,EAAM,WAAW,QAAQ,SAAS,MAGnC,MAAMC,EAAW,IAAI,IAAID,CAAG,EAC5BC,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,uCAEV,OAAOD,GAAS,WACfA,EAAK,MACRC,EAAU,GAAGD,EAAK,KAAK,KAAKA,EAAK,iBAAiB,GACxCA,EAAK,WACfC,EAAUD,EAAK,WAIjB,MAAME,EAAQ,IAAI,MAAMD,CAAO,EAC/B,WAAK,SAAS,MAAM,sBAAuBC,CAAK,EAC1CA,CACP,CAEA,MAAMA,EAAQ,IAAI,MAAM,oCAAoCH,EAAS,MAAM,EAAE,EAC7E,WAAK,SAAS,MAAM,sBAAuBG,CAAK,EAC1CA,CACP,CAEA,IAAIC,EAEJ,GAAI,CACHA,EAAM,IAAI,IAAI,MAAMJ,EAAS,MAAM,CACpC,MAAQ,CACPI,EAAM,IAAI,IAAIJ,EAAS,GAAG,CAC3B,CAEA,MAAMK,EAAYD,EAAI,aAAa,IAAI,YAAY,EAEnD,GAAI,CAACC,EAAW,CACf,MAAMF,EAAQ,IAAI,MAAM,wCAAwC,EAChE,WAAK,SAAS,MAAM,uBAAwBA,CAAK,EAC3CA,CACP,CAEA,OAAOE,CACR,CASA,MAAM,eAAeP,EAA6B,CACjD,GAAI,OAAO,KAAK,QAAQ,iBAAoB,WAAY,CACvD,MAAMK,EAAQ,IAAI,MAAM,iCAAiC,EACzD,WAAK,SAAS,MAAM,0BAA2BA,CAAK,EAC9CA,CACP,CAEKL,IACJA,EAAM,WAAW,QAAQ,SAAS,MAGnC,MAAM,KAAK,cAAe,MAAM,KAAK,QAAQ,gBAAgBA,EAAK,KAAK,QAAQ,cAAgB,UAAU,CAA4B,CACtI,CACD"}
1
+ {"version":3,"file":"NativeFlow.cjs","sources":["../../src/flows/NativeFlow.ts"],"sourcesContent":["import type { SDKOptions, NativeParams, SDKStorage, SDKHttpClient, SDKLogging } 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, logging?: SDKLogging) {\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, logging);\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\t * @throws {Error} Throws an error if the entry request fails or session ID is not found.\n\t */\n\tasync entry(url?: string): Promise<Record<string, 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\tconst error = new Error(message);\n\t\t\t\tthis.logging?.error('Entry request error', error);\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tconst error = new Error(`Entry request failed with status ${response.status}`);\n\t\t\tthis.logging?.error('Entry request error', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tlet uri: URL;\n\n\t\ttry {\n\t\t\turi = new URL(await response.text());\n\t\t} catch {\n\t\t\turi = new URL(response.url);\n\t\t}\n\n\t\tconst sessionId = uri.searchParams.get('session_id');\n\n\t\tif (!sessionId) {\n\t\t\tconst error = new Error('Session ID not found in entry response');\n\t\t\tthis.logging?.error('Entry response error', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\treturn { session_id: 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\t * @throws {Error} Throws an error if callback handler is not defined.\n\t */\n\tasync handleCallback(url?: string): Promise<void> {\n\t\tif (typeof this.options.callbackHandler !== 'function') {\n\t\t\tconst error = new Error('Missing option: callbackHandler');\n\t\t\tthis.logging?.error('Required option missing', error);\n\t\t\tthrow error;\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","logging","redirectUrlHandler","redirectCallbackHandler","params","NativeFlowHandler","url","entryUrl","response","data","message","error","uri","sessionId"],"mappings":"ybAKO,MAAMA,UAAmBC,EAAAA,QAAmC,CAClE,YAAYC,EAAqBC,EAAqBC,EAA2BC,EAAsB,CACjGH,EAAQ,aACZA,EAAQ,WAAaI,EAAAA,oBAEjBJ,EAAQ,kBACZA,EAAQ,gBAAkBK,EAAAA,yBAG3B,MAAML,EAASC,EAASC,EAAYC,CAAO,CAC5C,CAOA,MAAMG,EAAuB,GAAuB,CACnD,YAAK,cAAc,iBAAkB,EAAE,EAEhC,IAAIC,EAAAA,kBAAkB,KAAMD,CAAM,CAC1C,CAOA,SAASA,EAAuB,GAAuB,CACtD,OAAAA,EAAO,OAAS,SAET,KAAK,MAAMA,CAAM,CACzB,CASA,MAAM,MAAME,EAA+C,CACrDA,IACJA,EAAM,WAAW,QAAQ,SAAS,MAGnC,MAAMC,EAAW,IAAI,IAAID,CAAG,EAC5BC,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,uCAEV,OAAOD,GAAS,WACfA,EAAK,MACRC,EAAU,GAAGD,EAAK,KAAK,KAAKA,EAAK,iBAAiB,GACxCA,EAAK,WACfC,EAAUD,EAAK,WAIjB,MAAME,EAAQ,IAAI,MAAMD,CAAO,EAC/B,WAAK,SAAS,MAAM,sBAAuBC,CAAK,EAC1CA,CACP,CAEA,MAAMA,EAAQ,IAAI,MAAM,oCAAoCH,EAAS,MAAM,EAAE,EAC7E,WAAK,SAAS,MAAM,sBAAuBG,CAAK,EAC1CA,CACP,CAEA,IAAIC,EAEJ,GAAI,CACHA,EAAM,IAAI,IAAI,MAAMJ,EAAS,MAAM,CACpC,MAAQ,CACPI,EAAM,IAAI,IAAIJ,EAAS,GAAG,CAC3B,CAEA,MAAMK,EAAYD,EAAI,aAAa,IAAI,YAAY,EAEnD,GAAI,CAACC,EAAW,CACf,MAAMF,EAAQ,IAAI,MAAM,wCAAwC,EAChE,WAAK,SAAS,MAAM,uBAAwBA,CAAK,EAC3CA,CACP,CAEA,MAAO,CAAE,WAAYE,CAAA,CACtB,CASA,MAAM,eAAeP,EAA6B,CACjD,GAAI,OAAO,KAAK,QAAQ,iBAAoB,WAAY,CACvD,MAAMK,EAAQ,IAAI,MAAM,iCAAiC,EACzD,WAAK,SAAS,MAAM,0BAA2BA,CAAK,EAC9CA,CACP,CAEKL,IACJA,EAAM,WAAW,QAAQ,SAAS,MAGnC,MAAM,KAAK,cAAe,MAAM,KAAK,QAAQ,gBAAgBA,EAAK,KAAK,QAAQ,cAAgB,UAAU,CAA4B,CACtI,CACD"}
@@ -22,7 +22,7 @@ export declare class NativeFlow extends BaseFlow<SDKOptions, NativeParams> {
22
22
  *
23
23
  * @throws {Error} Throws an error if the entry request fails or session ID is not found.
24
24
  */
25
- entry(url?: string): Promise<string>;
25
+ entry(url?: string): Promise<Record<string, string>>;
26
26
  /**
27
27
  * Handles the callback after login or registration via a redirect.
28
28
  * @param {string} [url] The URL to handle the callback from. Defaults to the current window location.
@@ -1,2 +1,2 @@
1
- import{redirectUrlHandler as c,redirectCallbackHandler as d}from"../utils/handlers.mjs";import{NativeFlowHandler as h}from"../utils/NativeFlowHandler.mjs";import{BaseFlow as p}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 P extends p{constructor(r,e,t,i){r.urlHandler||(r.urlHandler=c),r.callbackHandler||(r.callbackHandler=d),super(r,e,t,i)}login(r={}){return this.dispatchEvent("loginInitiated",[]),new h(this,r)}register(r={}){return r.prompt="create",this.login(r)}async entry(r){r||(r=globalThis.window?.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 o=await t.json();let n="Entry request failed with status 400";typeof o=="object"&&(o.error?n=`${o.error}: ${o.error_description}`:o.errorKey&&(n=o.errorKey));const l=new Error(n);throw this.logging?.error("Entry request error",l),l}const s=new Error(`Entry request failed with status ${t.status}`);throw this.logging?.error("Entry request error",s),s}let i;try{i=new URL(await t.text())}catch{i=new URL(t.url)}const a=i.searchParams.get("session_id");if(!a){const s=new Error("Session ID not found in entry response");throw this.logging?.error("Entry response error",s),s}return a}async handleCallback(r){if(typeof this.options.callbackHandler!="function"){const e=new Error("Missing option: callbackHandler");throw this.logging?.error("Required option missing",e),e}r||(r=globalThis.window?.location.href),await this.tokenExchange(await this.options.callbackHandler(r,this.options.responseMode||"fragment"))}}export{P as NativeFlow};
1
+ import{redirectUrlHandler as c,redirectCallbackHandler as d}from"../utils/handlers.mjs";import{NativeFlowHandler as h}from"../utils/NativeFlowHandler.mjs";import{BaseFlow as p}from"./BaseFlow.mjs";import"../utils/errors.mjs";import"../utils/State.mjs";import"../utils/crypto.mjs";import"../utils/base64Url.mjs";import"../utils/date.mjs";import"../utils/jwt.mjs";import"../utils/Metadata.mjs";import"../utils/Session.mjs";class P extends p{constructor(r,e,t,o){r.urlHandler||(r.urlHandler=c),r.callbackHandler||(r.callbackHandler=d),super(r,e,t,o)}login(r={}){return this.dispatchEvent("loginInitiated",[]),new h(this,r)}register(r={}){return r.prompt="create",this.login(r)}async entry(r){r||(r=globalThis.window?.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 n="Entry request failed with status 400";typeof i=="object"&&(i.error?n=`${i.error}: ${i.error_description}`:i.errorKey&&(n=i.errorKey));const l=new Error(n);throw this.logging?.error("Entry request error",l),l}const s=new Error(`Entry request failed with status ${t.status}`);throw this.logging?.error("Entry request error",s),s}let o;try{o=new URL(await t.text())}catch{o=new URL(t.url)}const a=o.searchParams.get("session_id");if(!a){const s=new Error("Session ID not found in entry response");throw this.logging?.error("Entry response error",s),s}return{session_id:a}}async handleCallback(r){if(typeof this.options.callbackHandler!="function"){const e=new Error("Missing option: callbackHandler");throw this.logging?.error("Required option missing",e),e}r||(r=globalThis.window?.location.href),await this.tokenExchange(await this.options.callbackHandler(r,this.options.responseMode||"fragment"))}}export{P 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, SDKLogging } 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, logging?: SDKLogging) {\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, logging);\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\t * @throws {Error} Throws an error if the entry request fails or session ID is not found.\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\tconst error = new Error(message);\n\t\t\t\tthis.logging?.error('Entry request error', error);\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tconst error = new Error(`Entry request failed with status ${response.status}`);\n\t\t\tthis.logging?.error('Entry request error', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tlet uri: URL;\n\n\t\ttry {\n\t\t\turi = new URL(await response.text());\n\t\t} catch {\n\t\t\turi = new URL(response.url);\n\t\t}\n\n\t\tconst sessionId = uri.searchParams.get('session_id');\n\n\t\tif (!sessionId) {\n\t\t\tconst error = new Error('Session ID not found in entry response');\n\t\t\tthis.logging?.error('Entry response error', error);\n\t\t\tthrow error;\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\t * @throws {Error} Throws an error if callback handler is not defined.\n\t */\n\tasync handleCallback(url?: string): Promise<void> {\n\t\tif (typeof this.options.callbackHandler !== 'function') {\n\t\t\tconst error = new Error('Missing option: callbackHandler');\n\t\t\tthis.logging?.error('Required option missing', error);\n\t\t\tthrow error;\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","logging","redirectUrlHandler","redirectCallbackHandler","params","NativeFlowHandler","url","entryUrl","response","data","message","error","uri","sessionId"],"mappings":"qaAKO,MAAMA,UAAmBC,CAAmC,CAClE,YAAYC,EAAqBC,EAAqBC,EAA2BC,EAAsB,CACjGH,EAAQ,aACZA,EAAQ,WAAaI,GAEjBJ,EAAQ,kBACZA,EAAQ,gBAAkBK,GAG3B,MAAML,EAASC,EAASC,EAAYC,CAAO,CAC5C,CAOA,MAAMG,EAAuB,GAAuB,CACnD,YAAK,cAAc,iBAAkB,EAAE,EAEhC,IAAIC,EAAkB,KAAMD,CAAM,CAC1C,CAOA,SAASA,EAAuB,GAAuB,CACtD,OAAAA,EAAO,OAAS,SAET,KAAK,MAAMA,CAAM,CACzB,CASA,MAAM,MAAME,EAA+B,CACrCA,IACJA,EAAM,WAAW,QAAQ,SAAS,MAGnC,MAAMC,EAAW,IAAI,IAAID,CAAG,EAC5BC,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,uCAEV,OAAOD,GAAS,WACfA,EAAK,MACRC,EAAU,GAAGD,EAAK,KAAK,KAAKA,EAAK,iBAAiB,GACxCA,EAAK,WACfC,EAAUD,EAAK,WAIjB,MAAME,EAAQ,IAAI,MAAMD,CAAO,EAC/B,WAAK,SAAS,MAAM,sBAAuBC,CAAK,EAC1CA,CACP,CAEA,MAAMA,EAAQ,IAAI,MAAM,oCAAoCH,EAAS,MAAM,EAAE,EAC7E,WAAK,SAAS,MAAM,sBAAuBG,CAAK,EAC1CA,CACP,CAEA,IAAIC,EAEJ,GAAI,CACHA,EAAM,IAAI,IAAI,MAAMJ,EAAS,MAAM,CACpC,MAAQ,CACPI,EAAM,IAAI,IAAIJ,EAAS,GAAG,CAC3B,CAEA,MAAMK,EAAYD,EAAI,aAAa,IAAI,YAAY,EAEnD,GAAI,CAACC,EAAW,CACf,MAAMF,EAAQ,IAAI,MAAM,wCAAwC,EAChE,WAAK,SAAS,MAAM,uBAAwBA,CAAK,EAC3CA,CACP,CAEA,OAAOE,CACR,CASA,MAAM,eAAeP,EAA6B,CACjD,GAAI,OAAO,KAAK,QAAQ,iBAAoB,WAAY,CACvD,MAAMK,EAAQ,IAAI,MAAM,iCAAiC,EACzD,WAAK,SAAS,MAAM,0BAA2BA,CAAK,EAC9CA,CACP,CAEKL,IACJA,EAAM,WAAW,QAAQ,SAAS,MAGnC,MAAM,KAAK,cAAe,MAAM,KAAK,QAAQ,gBAAgBA,EAAK,KAAK,QAAQ,cAAgB,UAAU,CAA4B,CACtI,CACD"}
1
+ {"version":3,"file":"NativeFlow.mjs","sources":["../../src/flows/NativeFlow.ts"],"sourcesContent":["import type { SDKOptions, NativeParams, SDKStorage, SDKHttpClient, SDKLogging } 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, logging?: SDKLogging) {\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, logging);\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\t * @throws {Error} Throws an error if the entry request fails or session ID is not found.\n\t */\n\tasync entry(url?: string): Promise<Record<string, 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\tconst error = new Error(message);\n\t\t\t\tthis.logging?.error('Entry request error', error);\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tconst error = new Error(`Entry request failed with status ${response.status}`);\n\t\t\tthis.logging?.error('Entry request error', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tlet uri: URL;\n\n\t\ttry {\n\t\t\turi = new URL(await response.text());\n\t\t} catch {\n\t\t\turi = new URL(response.url);\n\t\t}\n\n\t\tconst sessionId = uri.searchParams.get('session_id');\n\n\t\tif (!sessionId) {\n\t\t\tconst error = new Error('Session ID not found in entry response');\n\t\t\tthis.logging?.error('Entry response error', error);\n\t\t\tthrow error;\n\t\t}\n\n\t\treturn { session_id: 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\t * @throws {Error} Throws an error if callback handler is not defined.\n\t */\n\tasync handleCallback(url?: string): Promise<void> {\n\t\tif (typeof this.options.callbackHandler !== 'function') {\n\t\t\tconst error = new Error('Missing option: callbackHandler');\n\t\t\tthis.logging?.error('Required option missing', error);\n\t\t\tthrow error;\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","logging","redirectUrlHandler","redirectCallbackHandler","params","NativeFlowHandler","url","entryUrl","response","data","message","error","uri","sessionId"],"mappings":"qaAKO,MAAMA,UAAmBC,CAAmC,CAClE,YAAYC,EAAqBC,EAAqBC,EAA2BC,EAAsB,CACjGH,EAAQ,aACZA,EAAQ,WAAaI,GAEjBJ,EAAQ,kBACZA,EAAQ,gBAAkBK,GAG3B,MAAML,EAASC,EAASC,EAAYC,CAAO,CAC5C,CAOA,MAAMG,EAAuB,GAAuB,CACnD,YAAK,cAAc,iBAAkB,EAAE,EAEhC,IAAIC,EAAkB,KAAMD,CAAM,CAC1C,CAOA,SAASA,EAAuB,GAAuB,CACtD,OAAAA,EAAO,OAAS,SAET,KAAK,MAAMA,CAAM,CACzB,CASA,MAAM,MAAME,EAA+C,CACrDA,IACJA,EAAM,WAAW,QAAQ,SAAS,MAGnC,MAAMC,EAAW,IAAI,IAAID,CAAG,EAC5BC,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,uCAEV,OAAOD,GAAS,WACfA,EAAK,MACRC,EAAU,GAAGD,EAAK,KAAK,KAAKA,EAAK,iBAAiB,GACxCA,EAAK,WACfC,EAAUD,EAAK,WAIjB,MAAME,EAAQ,IAAI,MAAMD,CAAO,EAC/B,WAAK,SAAS,MAAM,sBAAuBC,CAAK,EAC1CA,CACP,CAEA,MAAMA,EAAQ,IAAI,MAAM,oCAAoCH,EAAS,MAAM,EAAE,EAC7E,WAAK,SAAS,MAAM,sBAAuBG,CAAK,EAC1CA,CACP,CAEA,IAAIC,EAEJ,GAAI,CACHA,EAAM,IAAI,IAAI,MAAMJ,EAAS,MAAM,CACpC,MAAQ,CACPI,EAAM,IAAI,IAAIJ,EAAS,GAAG,CAC3B,CAEA,MAAMK,EAAYD,EAAI,aAAa,IAAI,YAAY,EAEnD,GAAI,CAACC,EAAW,CACf,MAAMF,EAAQ,IAAI,MAAM,wCAAwC,EAChE,WAAK,SAAS,MAAM,uBAAwBA,CAAK,EAC3CA,CACP,CAEA,MAAO,CAAE,WAAYE,CAAA,CACtB,CASA,MAAM,eAAeP,EAA6B,CACjD,GAAI,OAAO,KAAK,QAAQ,iBAAoB,WAAY,CACvD,MAAMK,EAAQ,IAAI,MAAM,iCAAiC,EACzD,WAAK,SAAS,MAAM,0BAA2BA,CAAK,EAC9CA,CACP,CAEKL,IACJA,EAAM,WAAW,QAAQ,SAAS,MAGnC,MAAM,KAAK,cAAe,MAAM,KAAK,QAAQ,gBAAgBA,EAAK,KAAK,QAAQ,cAAgB,UAAU,CAA4B,CACtI,CACD"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("../utils/handlers.cjs"),a=require("../utils/State.cjs"),s=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 s.BaseFlow{constructor(e,t,r,i){e.urlHandler||(e.urlHandler=o.popupUrlHandler),e.callbackHandler||(e.callbackHandler=o.popupCallbackHandler),super(e,t,r,i)}async login(e={}){if(typeof this.options.urlHandler!="function"){const n=new Error("Missing option: urlHandler");throw this.logging?.error("Required option missing",n),n}const t=await a.State.create(),r=await this.getAuthorizationUrl(e);r.searchParams.append("state",t.id),r.searchParams.append("code_challenge",t.codeChallenge),r.searchParams.append("nonce",t.nonce),r.searchParams.append("display","popup"),await this.storage.set(`sty.${t.id}`,JSON.stringify(t)),this.dispatchEvent("loginInitiated",[]),this.logging?.debug("Attempting to redirect for login");const i=await this.options.urlHandler(r.toString(),e);await this.tokenExchange(i)}async register(e={}){e.prompt="create",await this.login(e)}async entry(e){if(typeof this.options.urlHandler!="function"){const r=new Error("Missing option: urlHandler");throw this.logging?.error("Required option missing",r),r}e||(e=globalThis.window?.location.href);const t=new URL(e);this.logging?.debug("Attempting to redirect for entry"),await this.options.urlHandler(`${this.options.issuer}/provider/entry?${t.searchParams.toString()}`)}async handleCallback(){if(typeof this.options.callbackHandler!="function"){const e=new Error("Missing option: callbackHandler");throw this.logging?.error("Required option missing",e),e}await this.options.callbackHandler(this.options.responseMode||"fragment")}}exports.PopupFlow=l;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("../utils/handlers.cjs"),a=require("../utils/State.cjs"),s=require("./BaseFlow.cjs");require("../utils/errors.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 s.BaseFlow{constructor(e,t,r,i){e.urlHandler||(e.urlHandler=o.popupUrlHandler),e.callbackHandler||(e.callbackHandler=o.popupCallbackHandler),super(e,t,r,i)}async login(e={}){if(typeof this.options.urlHandler!="function"){const n=new Error("Missing option: urlHandler");throw this.logging?.error("Required option missing",n),n}const t=await a.State.create(),r=await this.getAuthorizationUrl(e);r.searchParams.append("state",t.id),r.searchParams.append("code_challenge",t.codeChallenge),r.searchParams.append("nonce",t.nonce),r.searchParams.append("display","popup"),await this.storage.set(`sty.${t.id}`,JSON.stringify(t)),this.dispatchEvent("loginInitiated",[]),this.logging?.debug("Attempting to redirect for login");const i=await this.options.urlHandler(r.toString(),e);await this.tokenExchange(i)}async register(e={}){e.prompt="create",await this.login(e)}async entry(e){if(typeof this.options.urlHandler!="function"){const r=new Error("Missing option: urlHandler");throw this.logging?.error("Required option missing",r),r}e||(e=globalThis.window?.location.href);const t=new URL(e);this.logging?.debug("Attempting to redirect for entry"),await this.options.urlHandler(`${this.options.issuer}/provider/entry?${t.searchParams.toString()}`)}async handleCallback(){if(typeof this.options.callbackHandler!="function"){const e=new Error("Missing option: callbackHandler");throw this.logging?.error("Required option missing",e),e}await this.options.callbackHandler(this.options.responseMode||"fragment")}}exports.PopupFlow=l;
2
2
  //# sourceMappingURL=PopupFlow.cjs.map