import type { IOAuthStore } from '../stores/oauth-store.interface'; import type { OAuthSession, OAuthUserProfile, } from '../interfaces/oauth-common.interface'; // Re-export common interfaces export type { OAuthSession, OAuthUserProfile }; // Define a minimal placeholder for TypeORM options so the type remains // available without requiring the optional `@nestjs/typeorm` package. // Consumers who use the TypeORM store should install the package to get // the full type definitions. type TypeOrmModuleOptions = Record; export interface OAuthProviderConfig { name: string; displayName?: string; strategy: any; // Passport Strategy constructor strategyOptions: (options: { serverUrl: string; clientId: string; clientSecret: string; callbackPath?: string; // Optional custom callback path }) => any; scope?: string[]; profileMapper: (profile: any) => OAuthUserProfile; } // Store configuration union type export type StoreConfiguration = | { type: 'typeorm'; options: TypeOrmModuleOptions } | { type: 'custom'; store: IOAuthStore } | { type: 'memory' } | undefined; // Default to memory store export interface OAuthEndpointConfiguration { wellKnownAuthorizationServerMetadata?: string; // Default: '/.well-known/oauth-authorization-server' wellKnownProtectedResourceMetadata?: string | string[]; // Default: '/.well-known/oauth-protected-resource' register?: string; // Default: '/register' authorize?: string; // Default: '/authorize' callback?: string; // Default: '/callback' token?: string; // Default: '/token' revoke?: string; // Default: '/revoke' } export interface OAuthEndpointDisableOptions { wellKnownAuthorizationServerMetadata?: boolean; wellKnownProtectedResourceMetadata?: boolean; } export interface OAuthUserModuleOptions { provider: OAuthProviderConfig; // Required OAuth Provider Credentials clientId: string; clientSecret: string; // Required JWT Configuration jwtSecret: string; // Server Configuration serverUrl?: string; resource?: string; // should be the endpoint clients connect to, e.g.: 'https://localhost:3000/mcp' // JWT Configuration jwtIssuer?: string; jwtAudience?: string; jwtAccessTokenExpiresIn?: string; jwtRefreshTokenExpiresIn?: string; enableRefreshTokens?: boolean; // Cookie Configuration cookieSecure?: boolean; cookieMaxAge?: number; // OAuth Session Configuration oauthSessionExpiresIn?: number; // in milliseconds authCodeExpiresIn?: number; // in milliseconds // Protected Resource Metadata Configuration protectedResourceMetadata?: { scopesSupported?: string[]; bearerMethodsSupported?: string[]; mcpVersionsSupported?: string[]; }; // Authorization Server Metadata Configuration authorizationServerMetadata?: { responseTypesSupported?: string[]; responseModesSupported?: string[]; grantTypesSupported?: string[]; tokenEndpointAuthMethodsSupported?: string[]; scopesSupported?: string[]; codeChallengeMethodsSupported?: string[]; }; // Storage Configuration - single property for all storage options storeConfiguration?: StoreConfiguration; apiPrefix?: string; // Endpoint Configuration endpoints?: OAuthEndpointConfiguration; disableEndpoints?: OAuthEndpointDisableOptions; } export interface OAuthModuleDefaults { serverUrl: string; resource: string; // Default resource URL jwtIssuer: string; jwtAudience: string; jwtAccessTokenExpiresIn: string; jwtRefreshTokenExpiresIn: string; enableRefreshTokens: boolean; cookieMaxAge: number; oauthSessionExpiresIn: number; authCodeExpiresIn: number; nodeEnv: string; apiPrefix: string; endpoints: OAuthEndpointConfiguration; disableEndpoints: OAuthEndpointDisableOptions; protectedResourceMetadata: { scopesSupported: string[]; bearerMethodsSupported: string[]; mcpVersionsSupported: string[]; }; authorizationServerMetadata: { responseTypesSupported: string[]; responseModesSupported: string[]; grantTypesSupported: string[]; tokenEndpointAuthMethodsSupported: string[]; scopesSupported: string[]; codeChallengeMethodsSupported: string[]; }; } // Resolved options after merging with defaults export type OAuthModuleOptions = Required< Pick< OAuthUserModuleOptions, 'provider' | 'clientId' | 'clientSecret' | 'jwtSecret' > > & Required & { // Optional fields that may remain undefined cookieSecure: boolean; storeConfiguration?: StoreConfiguration; };