Skip to content

Commit 48e7eff

Browse files
authored
Merge pull request #106 from brionmario/next-user-components
2 parents 274e6b9 + 7e8ea1c commit 48e7eff

37 files changed

+425
-328
lines changed

.changeset/fair-spiders-dream.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
'@asgardeo/javascript': patch
3+
'@asgardeo/nextjs': patch
4+
'@asgardeo/react': patch
5+
'@asgardeo/node': patch
6+
---
7+
8+
Fix `getAccessToken` imperative usage

packages/javascript/src/AsgardeoJavaScriptClient.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import {AllOrganizationsApiResponse} from './models/organization';
2020
import {AsgardeoClient, SignInOptions, SignOutOptions, SignUpOptions} from './models/client';
2121
import {Config} from './models/config';
22+
import {Storage} from './models/store';
2223
import {EmbeddedFlowExecuteRequestPayload, EmbeddedFlowExecuteResponse} from './models/embedded-flow';
2324
import {EmbeddedSignInFlowHandleRequestPayload} from './models/embedded-signin-flow';
2425
import {TokenResponse} from './models/token';
@@ -34,7 +35,7 @@ import {User, UserProfile} from './models/user';
3435
abstract class AsgardeoJavaScriptClient<T = Config> implements AsgardeoClient<T> {
3536
abstract switchOrganization(organization: Organization, sessionId?: string): Promise<TokenResponse | Response>;
3637

37-
abstract initialize(config: T): Promise<boolean>;
38+
abstract initialize(config: T, storage?: Storage): Promise<boolean>;
3839

3940
abstract getUser(options?: any): Promise<User>;
4041

packages/javascript/src/__legacy__/client.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -590,9 +590,9 @@ export class AsgardeoAuthClient<T> {
590590
*
591591
* @preserve
592592
*/
593-
public async getDecodedIdToken(userId?: string): Promise<IdToken> {
594-
const idToken: string = (await this._storageManager.getSessionData(userId)).id_token;
595-
const payload: IdToken = this._cryptoHelper.decodeIdToken(idToken);
593+
public async getDecodedIdToken(userId?: string, idToken?: string): Promise<IdToken> {
594+
const _idToken: string = (await this._storageManager.getSessionData(userId)).id_token;
595+
const payload: IdToken = this._cryptoHelper.decodeIdToken(_idToken ?? idToken);
596596

597597
return payload;
598598
}

packages/javascript/src/models/client.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {EmbeddedSignInFlowHandleRequestPayload} from './embedded-signin-flow';
2626
import {Organization} from './organization';
2727
import {User, UserProfile} from './user';
2828
import {TokenResponse} from './token';
29+
import {Storage} from './store';
2930

3031
export type SignInOptions = Record<string, unknown>;
3132
export type SignOutOptions = Record<string, unknown>;
@@ -87,9 +88,10 @@ export interface AsgardeoClient<T> {
8788
* Initializes the authentication client with provided configuration.
8889
*
8990
* @param config - SDK Client instance configuration options.
91+
* @param storage - Optional storage instance to persist data (e.g., session, user profile).
9092
* @returns Promise resolving to boolean indicating success.
9193
*/
92-
initialize(config: T): Promise<boolean>;
94+
initialize(config: T, storage?: Storage): Promise<boolean>;
9395

9496
/**
9597
* Checks if the client is currently loading.

packages/javascript/src/utils/logger.ts

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,7 @@
1919
/**
2020
* Log levels enum
2121
*/
22-
export enum LogLevel {
23-
DEBUG = 0,
24-
INFO = 1,
25-
WARN = 2,
26-
ERROR = 3,
27-
SILENT = 4,
28-
}
22+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
2923

3024
/**
3125
* Logger configuration interface
@@ -49,7 +43,7 @@ const PREFIX: string = '🛡️ Asgardeo';
4943
* Default logger configuration
5044
*/
5145
const DEFAULT_CONFIG: LoggerConfig = {
52-
level: LogLevel.INFO,
46+
level: 'info',
5347
prefix: `${PREFIX}`,
5448
timestamps: true,
5549
showLevel: true,
@@ -140,13 +134,13 @@ class Logger {
140134
*/
141135
private getLevelString(level: LogLevel): string {
142136
switch (level) {
143-
case LogLevel.DEBUG:
137+
case 'debug':
144138
return 'DEBUG';
145-
case LogLevel.INFO:
139+
case 'info':
146140
return 'INFO';
147-
case LogLevel.WARN:
141+
case 'warn':
148142
return 'WARN';
149-
case LogLevel.ERROR:
143+
case 'error':
150144
return 'ERROR';
151145
default:
152146
return 'UNKNOWN';
@@ -175,16 +169,16 @@ class Logger {
175169
let coloredLevel: string;
176170

177171
switch (level) {
178-
case LogLevel.DEBUG:
172+
case 'debug':
179173
coloredLevel = `${COLORS.gray}[${levelStr}]${COLORS.reset}`;
180174
break;
181-
case LogLevel.INFO:
175+
case 'info':
182176
coloredLevel = `${COLORS.blue}[${levelStr}]${COLORS.reset}`;
183177
break;
184-
case LogLevel.WARN:
178+
case 'warn':
185179
coloredLevel = `${COLORS.yellow}[${levelStr}]${COLORS.reset}`;
186180
break;
187-
case LogLevel.ERROR:
181+
case 'error':
188182
coloredLevel = `${COLORS.red}[${levelStr}]${COLORS.reset}`;
189183
break;
190184
default:
@@ -248,16 +242,16 @@ class Logger {
248242
parts.push(`%c[${levelStr}]`);
249243

250244
switch (level) {
251-
case LogLevel.DEBUG:
245+
case 'debug':
252246
styles.push(BROWSER_STYLES.debug);
253247
break;
254-
case LogLevel.INFO:
248+
case 'info':
255249
styles.push(BROWSER_STYLES.info);
256250
break;
257-
case LogLevel.WARN:
251+
case 'warn':
258252
styles.push(BROWSER_STYLES.warn);
259253
break;
260-
case LogLevel.ERROR:
254+
case 'error':
261255
styles.push(BROWSER_STYLES.error);
262256
break;
263257
default:
@@ -272,16 +266,16 @@ class Logger {
272266

273267
// Use appropriate console method
274268
switch (level) {
275-
case LogLevel.DEBUG:
269+
case 'debug':
276270
console.debug(formattedMessage, ...styles, ...args);
277271
break;
278-
case LogLevel.INFO:
272+
case 'info':
279273
console.info(formattedMessage, ...styles, ...args);
280274
break;
281-
case LogLevel.WARN:
275+
case 'warn':
282276
console.warn(formattedMessage, ...styles, ...args);
283277
break;
284-
case LogLevel.ERROR:
278+
case 'error':
285279
console.error(formattedMessage, ...styles, ...args);
286280
break;
287281
default:
@@ -297,16 +291,16 @@ class Logger {
297291

298292
// Use appropriate console method
299293
switch (level) {
300-
case LogLevel.DEBUG:
294+
case 'debug':
301295
console.debug(formattedMessage, ...args);
302296
break;
303-
case LogLevel.INFO:
297+
case 'info':
304298
console.info(formattedMessage, ...args);
305299
break;
306-
case LogLevel.WARN:
300+
case 'warn':
307301
console.warn(formattedMessage, ...args);
308302
break;
309-
case LogLevel.ERROR:
303+
case 'error':
310304
console.error(formattedMessage, ...args);
311305
break;
312306
default:
@@ -318,28 +312,28 @@ class Logger {
318312
* Log debug message
319313
*/
320314
debug(message: string, ...args: any[]): void {
321-
this.logMessage(LogLevel.DEBUG, message, ...args);
315+
this.logMessage('debug', message, ...args);
322316
}
323317

324318
/**
325319
* Log info message
326320
*/
327321
info(message: string, ...args: any[]): void {
328-
this.logMessage(LogLevel.INFO, message, ...args);
322+
this.logMessage('info', message, ...args);
329323
}
330324

331325
/**
332326
* Log warning message
333327
*/
334328
warn(message: string, ...args: any[]): void {
335-
this.logMessage(LogLevel.WARN, message, ...args);
329+
this.logMessage('warn', message, ...args);
336330
}
337331

338332
/**
339333
* Log error message
340334
*/
341335
error(message: string, ...args: any[]): void {
342-
this.logMessage(LogLevel.ERROR, message, ...args);
336+
this.logMessage('error', message, ...args);
343337
}
344338

345339
/**
@@ -411,7 +405,7 @@ export const createComponentLogger = (component: string) => {
411405
export const createPackageLogger = (packageName: string) => {
412406
return createLogger({
413407
prefix: `${PREFIX} - ${packageName}`,
414-
level: LogLevel.INFO,
408+
level: 'info',
415409
timestamps: true,
416410
showLevel: true,
417411
});

packages/nextjs/esbuild.config.mjs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,21 @@ import {build} from 'esbuild';
2020

2121
const commonOptions = {
2222
bundle: false,
23-
entryPoints: ['src/index.ts'],
23+
entryPoints: ['src/index.ts', 'src/server/index.ts'],
2424
platform: 'node',
2525
target: ['node18'],
2626
};
2727

2828
await build({
2929
...commonOptions,
3030
format: 'esm',
31-
outfile: 'dist/index.js',
31+
outdir: 'dist/esm',
3232
sourcemap: true,
3333
});
3434

3535
await build({
3636
...commonOptions,
3737
format: 'cjs',
38-
outfile: 'dist/cjs/index.js',
38+
outdir: 'dist/cjs',
3939
sourcemap: true,
4040
});

packages/nextjs/package.json

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,19 @@
1515
"author": "WSO2",
1616
"license": "Apache-2.0",
1717
"type": "module",
18-
"main": "dist/index.js",
19-
"module": "dist/index.js",
18+
"main": "dist/esm/index.js",
19+
"module": "dist/esm/index.js",
2020
"commonjs": "dist/cjs/index.js",
2121
"exports": {
2222
".": {
23-
"import": "./dist/index.js",
23+
"types": "./dist/types/index.d.ts",
24+
"import": "./dist/esm/index.js",
2425
"require": "./dist/cjs/index.js"
26+
},
27+
"./server": {
28+
"types": "./dist/types/server/index.d.ts",
29+
"import": "./dist/esm/server/index.js",
30+
"require": "./dist/cjs/server/index.js"
2531
}
2632
},
2733
"files": [
@@ -36,7 +42,7 @@
3642
"directory": "packages/next"
3743
},
3844
"scripts": {
39-
"build": "pnpm clean && node esbuild.config.mjs && tsc -p tsconfig.lib.json --outDir dist",
45+
"build": "pnpm clean && node esbuild.config.mjs && tsc -p tsconfig.lib.json --outDir dist/esm",
4046
"clean": "rimraf dist",
4147
"fix:lint": "eslint . --ext .js,.jsx,.ts,.tsx,.cjs,.mjs",
4248
"lint": "eslint . --ext .js,.jsx,.ts,.tsx,.cjs,.mjs",

packages/nextjs/src/AsgardeoNextClient.ts

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import {
5151
AllOrganizationsApiResponse,
5252
extractUserClaimsFromIdToken,
5353
TokenResponse,
54+
Storage,
5455
} from '@asgardeo/node';
5556
import {AsgardeoNextConfig} from './models/config';
5657
import getSessionId from './server/actions/getSessionId';
@@ -99,7 +100,7 @@ class AsgardeoNextClient<T extends AsgardeoNextConfig = AsgardeoNextConfig> exte
99100
}
100101
}
101102

102-
override async initialize(config: T): Promise<boolean> {
103+
override async initialize(config: T, storage?: Storage): Promise<boolean> {
103104
if (this.isInitialized) {
104105
return Promise.resolve(true);
105106
}
@@ -126,18 +127,21 @@ class AsgardeoNextClient<T extends AsgardeoNextConfig = AsgardeoNextConfig> exte
126127

127128
const origin: string = await getClientOrigin();
128129

129-
return this.asgardeo.initialize({
130-
organizationHandle: resolvedOrganizationHandle,
131-
baseUrl,
132-
clientId,
133-
clientSecret,
134-
signInUrl,
135-
signUpUrl,
136-
afterSignInUrl: afterSignInUrl ?? origin,
137-
afterSignOutUrl: afterSignOutUrl ?? origin,
138-
enablePKCE: false,
139-
...rest,
140-
} as any);
130+
return this.asgardeo.initialize(
131+
{
132+
organizationHandle: resolvedOrganizationHandle,
133+
baseUrl,
134+
clientId,
135+
clientSecret,
136+
signInUrl,
137+
signUpUrl,
138+
afterSignInUrl: afterSignInUrl ?? origin,
139+
afterSignOutUrl: afterSignOutUrl ?? origin,
140+
enablePKCE: false,
141+
...rest,
142+
} as any,
143+
storage,
144+
);
141145
}
142146

143147
override async getUser(userId?: string): Promise<User> {
@@ -377,27 +381,33 @@ class AsgardeoNextClient<T extends AsgardeoNextConfig = AsgardeoNextConfig> exte
377381
return this.asgardeo.isSignedIn(sessionId as string);
378382
}
379383

380-
getAccessToken(sessionId?: string): Promise<string> {
381-
if (!sessionId) {
382-
return Promise.reject(new Error('Session ID is required to get access token'));
384+
/**
385+
* Gets the access token from the session cookie if no sessionId is provided,
386+
* otherwise falls back to legacy client method.
387+
*/
388+
async getAccessToken(sessionId?: string): Promise<string> {
389+
const {default: getAccessToken} = await import('./server/actions/getAccessToken');
390+
const token = await getAccessToken();
391+
392+
if (typeof token !== 'string' || !token) {
393+
throw new Error('Access token not found');
394+
throw new AsgardeoRuntimeError(
395+
'Failed to get access token.',
396+
'AsgardeoNextClient-getAccessToken-RuntimeError-003',
397+
'nextjs',
398+
'An error occurred while obtaining the access token. Please check your configuration and network connection.',
399+
);
383400
}
384401

385-
return this.asgardeo.getAccessToken(sessionId as string).then(
386-
token => {
387-
return token;
388-
},
389-
error => {
390-
throw error;
391-
},
392-
);
402+
return token;
393403
}
394404

395405
/**
396406
* Get the decoded ID token for a session
397407
*/
398-
async getDecodedIdToken(sessionId?: string): Promise<IdToken> {
408+
async getDecodedIdToken(sessionId?: string, idToken?: string): Promise<IdToken> {
399409
await this.ensureInitialized();
400-
return this.asgardeo.getDecodedIdToken(sessionId as string);
410+
return this.asgardeo.getDecodedIdToken(sessionId as string, idToken);
401411
}
402412

403413
override getConfiguration(): T {

0 commit comments

Comments
 (0)