From 6f49213b60f51a85109de66dc0d12a25668bca93 Mon Sep 17 00:00:00 2001 From: Brion Date: Mon, 29 Sep 2025 19:08:43 +0530 Subject: [PATCH 1/2] feat: add reInitialize method to Asgardeo client interfaces and implementations --- .../src/AsgardeoJavaScriptClient.ts | 2 ++ packages/javascript/src/models/client.ts | 11 ++++++++++ packages/nextjs/src/AsgardeoNextClient.ts | 19 +++++++++++++++++ packages/nextjs/src/server/asgardeo.ts | 7 +++++++ packages/react/src/AsgardeoReactClient.ts | 21 +++++++++++++++++++ .../src/contexts/Asgardeo/AsgardeoContext.ts | 12 +++++++++++ .../contexts/Asgardeo/AsgardeoProvider.tsx | 1 + 7 files changed, 73 insertions(+) diff --git a/packages/javascript/src/AsgardeoJavaScriptClient.ts b/packages/javascript/src/AsgardeoJavaScriptClient.ts index a732607e..aef6e370 100644 --- a/packages/javascript/src/AsgardeoJavaScriptClient.ts +++ b/packages/javascript/src/AsgardeoJavaScriptClient.ts @@ -37,6 +37,8 @@ abstract class AsgardeoJavaScriptClient implements AsgardeoClient abstract initialize(config: T, storage?: Storage): Promise; + abstract reInitialize(config: Partial): Promise; + abstract getUser(options?: any): Promise; abstract getAllOrganizations(options?: any, sessionId?: string): Promise; diff --git a/packages/javascript/src/models/client.ts b/packages/javascript/src/models/client.ts index 1ee1dfb8..f52ada30 100644 --- a/packages/javascript/src/models/client.ts +++ b/packages/javascript/src/models/client.ts @@ -97,6 +97,17 @@ export interface AsgardeoClient { */ initialize(config: T, storage?: Storage): Promise; + /** + * Re-initializes the client with a new configuration. + * + * @remarks + * This can be partial configuration to update only specific fields. + * + * @param config - New configuration to re-initialize the client with. + * @returns Promise resolving to boolean indicating success. + */ + reInitialize(config: Partial): Promise; + /** * Checks if the client is currently loading. * This can be used to determine if the client is in the process of initializing or fetching user data. diff --git a/packages/nextjs/src/AsgardeoNextClient.ts b/packages/nextjs/src/AsgardeoNextClient.ts index d31343bb..75675bce 100644 --- a/packages/nextjs/src/AsgardeoNextClient.ts +++ b/packages/nextjs/src/AsgardeoNextClient.ts @@ -145,6 +145,25 @@ class AsgardeoNextClient exte ); } + override async reInitialize(config: Partial): Promise { + let isInitialized: boolean = false; + + try { + await this.asgardeo.reInitialize(config as any); + + isInitialized = true; + } catch (error) { + throw new AsgardeoRuntimeError( + `Failed to re-initialize the client: ${error instanceof Error ? error.message : String(error)}`, + 'AsgardeoNextClient-reInitialize-RuntimeError-001', + 'nextjs', + 'An error occurred while re-initializing the client. Please check your configuration and network connection.', + ); + } + + return isInitialized; + } + override async getUser(userId?: string): Promise { await this.ensureInitialized(); const resolvedSessionId: string = userId || ((await getSessionId()) as string); diff --git a/packages/nextjs/src/server/asgardeo.ts b/packages/nextjs/src/server/asgardeo.ts index 063c32c5..7605a286 100644 --- a/packages/nextjs/src/server/asgardeo.ts +++ b/packages/nextjs/src/server/asgardeo.ts @@ -19,6 +19,7 @@ import {TokenExchangeRequestConfig} from '@asgardeo/node'; import AsgardeoNextClient from '../AsgardeoNextClient'; import getSessionIdAction from './actions/getSessionId'; +import {AsgardeoNextConfig} from '../models/config'; const asgardeo = async () => { const getAccessToken = async (sessionId: string) => { @@ -35,10 +36,16 @@ const asgardeo = async () => { return await client.exchangeToken(config, sessionId); }; + const reInitialize = async (config: Partial) => { + const client: AsgardeoNextClient = AsgardeoNextClient.getInstance(); + return await client.reInitialize(config); + }; + return { getAccessToken, getSessionId, exchangeToken, + reInitialize, }; }; diff --git a/packages/react/src/AsgardeoReactClient.ts b/packages/react/src/AsgardeoReactClient.ts index 39cbcf99..9108b0e6 100644 --- a/packages/react/src/AsgardeoReactClient.ts +++ b/packages/react/src/AsgardeoReactClient.ts @@ -106,6 +106,27 @@ class AsgardeoReactClient e }); } + override reInitialize(config: Partial): Promise { + return this.withLoading(async () => { + let isInitialized: boolean; + + try { + await this.asgardeo.reInitialize(config); + + isInitialized = true; + } catch (error) { + throw new AsgardeoRuntimeError( + `Failed to check if the client is initialized: ${error instanceof Error ? error.message : String(error)}`, + 'AsgardeoReactClient-reInitialize-RuntimeError-001', + 'react', + 'An error occurred while checking the initialization status of the client.', + ); + } + + return isInitialized; + }); + } + override async updateUserProfile(payload: any, userId?: string): Promise { throw new Error('Not implemented'); } diff --git a/packages/react/src/contexts/Asgardeo/AsgardeoContext.ts b/packages/react/src/contexts/Asgardeo/AsgardeoContext.ts index 9f3b423f..fe6964b2 100644 --- a/packages/react/src/contexts/Asgardeo/AsgardeoContext.ts +++ b/packages/react/src/contexts/Asgardeo/AsgardeoContext.ts @@ -121,6 +121,17 @@ export type AsgardeoContextProps = { * @returns A promise that resolves to the token response or the raw response. */ exchangeToken: (config: TokenExchangeRequestConfig) => Promise; + + /** + * Re-initializes the client with a new configuration. + * + * @remarks + * This can be partial configuration to update only specific fields. + * + * @param config - New configuration to re-initialize the client with. + * @returns Promise resolving to boolean indicating success. + */ + reInitialize: (config: Partial) => Promise; } & Pick; /** @@ -151,6 +162,7 @@ const AsgardeoContext: Context = createContext> = ({ request: asgardeo.request.bind(asgardeo), requestAll: asgardeo.requestAll.bind(asgardeo), }, + reInitialize: asgardeo.reInitialize.bind(asgardeo), signInOptions, getDecodedIdToken: asgardeo.getDecodedIdToken.bind(asgardeo), exchangeToken: asgardeo.exchangeToken.bind(asgardeo), From 0c3441609a7de33d336b96e1acbe2443e9ea4132 Mon Sep 17 00:00:00 2001 From: Brion Date: Mon, 29 Sep 2025 19:39:53 +0530 Subject: [PATCH 2/2] =?UTF-8?q?chore:=20add=20changeset=20=F0=9F=A6=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changeset/spicy-dots-swim.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/spicy-dots-swim.md diff --git a/.changeset/spicy-dots-swim.md b/.changeset/spicy-dots-swim.md new file mode 100644 index 00000000..dadaa9ce --- /dev/null +++ b/.changeset/spicy-dots-swim.md @@ -0,0 +1,7 @@ +--- +'@asgardeo/javascript': patch +'@asgardeo/nextjs': patch +'@asgardeo/react': patch +--- + +Expose `reInitialize` from `@asgardeo/react` & `@asgardeo/nextjs`