Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .changeset/fair-spiders-dream.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@asgardeo/javascript': patch
'@asgardeo/nextjs': patch
'@asgardeo/react': patch
'@asgardeo/node': patch
---

Fix `getAccessToken` imperative usage
3 changes: 2 additions & 1 deletion packages/javascript/src/AsgardeoJavaScriptClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import {AllOrganizationsApiResponse} from './models/organization';
import {AsgardeoClient, SignInOptions, SignOutOptions, SignUpOptions} from './models/client';
import {Config} from './models/config';
import {Storage} from './models/store';
import {EmbeddedFlowExecuteRequestPayload, EmbeddedFlowExecuteResponse} from './models/embedded-flow';
import {EmbeddedSignInFlowHandleRequestPayload} from './models/embedded-signin-flow';
import {TokenResponse} from './models/token';
Expand All @@ -34,7 +35,7 @@ import {User, UserProfile} from './models/user';
abstract class AsgardeoJavaScriptClient<T = Config> implements AsgardeoClient<T> {
abstract switchOrganization(organization: Organization, sessionId?: string): Promise<TokenResponse | Response>;

abstract initialize(config: T): Promise<boolean>;
abstract initialize(config: T, storage?: Storage): Promise<boolean>;

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

Expand Down
6 changes: 3 additions & 3 deletions packages/javascript/src/__legacy__/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -590,9 +590,9 @@ export class AsgardeoAuthClient<T> {
*
* @preserve
*/
public async getDecodedIdToken(userId?: string): Promise<IdToken> {
const idToken: string = (await this._storageManager.getSessionData(userId)).id_token;
const payload: IdToken = this._cryptoHelper.decodeIdToken(idToken);
public async getDecodedIdToken(userId?: string, idToken?: string): Promise<IdToken> {
const _idToken: string = (await this._storageManager.getSessionData(userId)).id_token;
const payload: IdToken = this._cryptoHelper.decodeIdToken(_idToken ?? idToken);

return payload;
}
Expand Down
4 changes: 3 additions & 1 deletion packages/javascript/src/models/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import {EmbeddedSignInFlowHandleRequestPayload} from './embedded-signin-flow';
import {Organization} from './organization';
import {User, UserProfile} from './user';
import {TokenResponse} from './token';
import {Storage} from './store';

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

/**
* Checks if the client is currently loading.
Expand Down
60 changes: 27 additions & 33 deletions packages/javascript/src/utils/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,7 @@
/**
* Log levels enum
*/
export enum LogLevel {
DEBUG = 0,
INFO = 1,
WARN = 2,
ERROR = 3,
SILENT = 4,
}
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';

/**
* Logger configuration interface
Expand All @@ -49,7 +43,7 @@ const PREFIX: string = '🛡️ Asgardeo';
* Default logger configuration
*/
const DEFAULT_CONFIG: LoggerConfig = {
level: LogLevel.INFO,
level: 'info',
prefix: `${PREFIX}`,
timestamps: true,
showLevel: true,
Expand Down Expand Up @@ -140,13 +134,13 @@ class Logger {
*/
private getLevelString(level: LogLevel): string {
switch (level) {
case LogLevel.DEBUG:
case 'debug':
return 'DEBUG';
case LogLevel.INFO:
case 'info':
return 'INFO';
case LogLevel.WARN:
case 'warn':
return 'WARN';
case LogLevel.ERROR:
case 'error':
return 'ERROR';
default:
return 'UNKNOWN';
Expand Down Expand Up @@ -175,16 +169,16 @@ class Logger {
let coloredLevel: string;

switch (level) {
case LogLevel.DEBUG:
case 'debug':
coloredLevel = `${COLORS.gray}[${levelStr}]${COLORS.reset}`;
break;
case LogLevel.INFO:
case 'info':
coloredLevel = `${COLORS.blue}[${levelStr}]${COLORS.reset}`;
break;
case LogLevel.WARN:
case 'warn':
coloredLevel = `${COLORS.yellow}[${levelStr}]${COLORS.reset}`;
break;
case LogLevel.ERROR:
case 'error':
coloredLevel = `${COLORS.red}[${levelStr}]${COLORS.reset}`;
break;
default:
Expand Down Expand Up @@ -248,16 +242,16 @@ class Logger {
parts.push(`%c[${levelStr}]`);

switch (level) {
case LogLevel.DEBUG:
case 'debug':
styles.push(BROWSER_STYLES.debug);
break;
case LogLevel.INFO:
case 'info':
styles.push(BROWSER_STYLES.info);
break;
case LogLevel.WARN:
case 'warn':
styles.push(BROWSER_STYLES.warn);
break;
case LogLevel.ERROR:
case 'error':
styles.push(BROWSER_STYLES.error);
break;
default:
Expand All @@ -272,16 +266,16 @@ class Logger {

// Use appropriate console method
switch (level) {
case LogLevel.DEBUG:
case 'debug':
console.debug(formattedMessage, ...styles, ...args);
break;
case LogLevel.INFO:
case 'info':
console.info(formattedMessage, ...styles, ...args);
break;
case LogLevel.WARN:
case 'warn':
console.warn(formattedMessage, ...styles, ...args);
break;
case LogLevel.ERROR:
case 'error':
console.error(formattedMessage, ...styles, ...args);
break;
default:
Expand All @@ -297,16 +291,16 @@ class Logger {

// Use appropriate console method
switch (level) {
case LogLevel.DEBUG:
case 'debug':
console.debug(formattedMessage, ...args);
break;
case LogLevel.INFO:
case 'info':
console.info(formattedMessage, ...args);
break;
case LogLevel.WARN:
case 'warn':
console.warn(formattedMessage, ...args);
break;
case LogLevel.ERROR:
case 'error':
console.error(formattedMessage, ...args);
break;
default:
Expand All @@ -318,28 +312,28 @@ class Logger {
* Log debug message
*/
debug(message: string, ...args: any[]): void {
this.logMessage(LogLevel.DEBUG, message, ...args);
this.logMessage('debug', message, ...args);
}

/**
* Log info message
*/
info(message: string, ...args: any[]): void {
this.logMessage(LogLevel.INFO, message, ...args);
this.logMessage('info', message, ...args);
}

/**
* Log warning message
*/
warn(message: string, ...args: any[]): void {
this.logMessage(LogLevel.WARN, message, ...args);
this.logMessage('warn', message, ...args);
}

/**
* Log error message
*/
error(message: string, ...args: any[]): void {
this.logMessage(LogLevel.ERROR, message, ...args);
this.logMessage('error', message, ...args);
}

/**
Expand Down Expand Up @@ -411,7 +405,7 @@ export const createComponentLogger = (component: string) => {
export const createPackageLogger = (packageName: string) => {
return createLogger({
prefix: `${PREFIX} - ${packageName}`,
level: LogLevel.INFO,
level: 'info',
timestamps: true,
showLevel: true,
});
Expand Down
6 changes: 3 additions & 3 deletions packages/nextjs/esbuild.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,21 @@ import {build} from 'esbuild';

const commonOptions = {
bundle: false,
entryPoints: ['src/index.ts'],
entryPoints: ['src/index.ts', 'src/server/index.ts'],
platform: 'node',
target: ['node18'],
};

await build({
...commonOptions,
format: 'esm',
outfile: 'dist/index.js',
outdir: 'dist/esm',
sourcemap: true,
});

await build({
...commonOptions,
format: 'cjs',
outfile: 'dist/cjs/index.js',
outdir: 'dist/cjs',
sourcemap: true,
});
14 changes: 10 additions & 4 deletions packages/nextjs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,19 @@
"author": "WSO2",
"license": "Apache-2.0",
"type": "module",
"main": "dist/index.js",
"module": "dist/index.js",
"main": "dist/esm/index.js",
"module": "dist/esm/index.js",
"commonjs": "dist/cjs/index.js",
"exports": {
".": {
"import": "./dist/index.js",
"types": "./dist/types/index.d.ts",
"import": "./dist/esm/index.js",
"require": "./dist/cjs/index.js"
},
"./server": {
"types": "./dist/types/server/index.d.ts",
"import": "./dist/esm/server/index.js",
"require": "./dist/cjs/server/index.js"
}
},
"files": [
Expand All @@ -36,7 +42,7 @@
"directory": "packages/next"
},
"scripts": {
"build": "pnpm clean && node esbuild.config.mjs && tsc -p tsconfig.lib.json --outDir dist",
"build": "pnpm clean && node esbuild.config.mjs && tsc -p tsconfig.lib.json --outDir dist/esm",
"clean": "rimraf dist",
"fix:lint": "eslint . --ext .js,.jsx,.ts,.tsx,.cjs,.mjs",
"lint": "eslint . --ext .js,.jsx,.ts,.tsx,.cjs,.mjs",
Expand Down
62 changes: 36 additions & 26 deletions packages/nextjs/src/AsgardeoNextClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ import {
AllOrganizationsApiResponse,
extractUserClaimsFromIdToken,
TokenResponse,
Storage,
} from '@asgardeo/node';
import {AsgardeoNextConfig} from './models/config';
import getSessionId from './server/actions/getSessionId';
Expand Down Expand Up @@ -99,7 +100,7 @@ class AsgardeoNextClient<T extends AsgardeoNextConfig = AsgardeoNextConfig> exte
}
}

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

const origin: string = await getClientOrigin();

return this.asgardeo.initialize({
organizationHandle: resolvedOrganizationHandle,
baseUrl,
clientId,
clientSecret,
signInUrl,
signUpUrl,
afterSignInUrl: afterSignInUrl ?? origin,
afterSignOutUrl: afterSignOutUrl ?? origin,
enablePKCE: false,
...rest,
} as any);
return this.asgardeo.initialize(
{
organizationHandle: resolvedOrganizationHandle,
baseUrl,
clientId,
clientSecret,
signInUrl,
signUpUrl,
afterSignInUrl: afterSignInUrl ?? origin,
afterSignOutUrl: afterSignOutUrl ?? origin,
enablePKCE: false,
...rest,
} as any,
storage,
);
}

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

getAccessToken(sessionId?: string): Promise<string> {
if (!sessionId) {
return Promise.reject(new Error('Session ID is required to get access token'));
/**
* Gets the access token from the session cookie if no sessionId is provided,
* otherwise falls back to legacy client method.
*/
async getAccessToken(sessionId?: string): Promise<string> {
const {default: getAccessToken} = await import('./server/actions/getAccessToken');
const token = await getAccessToken();

if (typeof token !== 'string' || !token) {
throw new Error('Access token not found');
throw new AsgardeoRuntimeError(
'Failed to get access token.',
'AsgardeoNextClient-getAccessToken-RuntimeError-003',
'nextjs',
'An error occurred while obtaining the access token. Please check your configuration and network connection.',
);
}

return this.asgardeo.getAccessToken(sessionId as string).then(
token => {
return token;
},
error => {
throw error;
},
);
return token;
}

/**
* Get the decoded ID token for a session
*/
async getDecodedIdToken(sessionId?: string): Promise<IdToken> {
async getDecodedIdToken(sessionId?: string, idToken?: string): Promise<IdToken> {
await this.ensureInitialized();
return this.asgardeo.getDecodedIdToken(sessionId as string);
return this.asgardeo.getDecodedIdToken(sessionId as string, idToken);
}

override getConfiguration(): T {
Expand Down
Loading
Loading