@plyaz/auth 1.0.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 (113) hide show
  1. package/.github/pull_request_template.md +71 -0
  2. package/.github/workflows/deploy.yml +9 -0
  3. package/.github/workflows/publish.yml +14 -0
  4. package/.github/workflows/security.yml +20 -0
  5. package/README.md +89 -0
  6. package/commits.txt +5 -0
  7. package/dist/common/index.cjs +48 -0
  8. package/dist/common/index.cjs.map +1 -0
  9. package/dist/common/index.mjs +43 -0
  10. package/dist/common/index.mjs.map +1 -0
  11. package/dist/index.cjs +20411 -0
  12. package/dist/index.cjs.map +1 -0
  13. package/dist/index.mjs +5139 -0
  14. package/dist/index.mjs.map +1 -0
  15. package/eslint.config.mjs +13 -0
  16. package/index.html +13 -0
  17. package/package.json +141 -0
  18. package/src/adapters/auth-adapter-factory.ts +26 -0
  19. package/src/adapters/auth-adapter.mapper.ts +53 -0
  20. package/src/adapters/base-auth.adapter.ts +119 -0
  21. package/src/adapters/clerk/clerk.adapter.ts +204 -0
  22. package/src/adapters/custom/custom.adapter.ts +119 -0
  23. package/src/adapters/index.ts +4 -0
  24. package/src/adapters/next-auth/authOptions.ts +81 -0
  25. package/src/adapters/next-auth/next-auth.adapter.ts +211 -0
  26. package/src/api/client.ts +37 -0
  27. package/src/audit/audit.logger.ts +52 -0
  28. package/src/client/components/ProtectedRoute.tsx +37 -0
  29. package/src/client/hooks/useAuth.ts +128 -0
  30. package/src/client/hooks/useConnectedAccounts.ts +108 -0
  31. package/src/client/hooks/usePermissions.ts +36 -0
  32. package/src/client/hooks/useRBAC.ts +36 -0
  33. package/src/client/hooks/useSession.ts +18 -0
  34. package/src/client/providers/AuthProvider.tsx +104 -0
  35. package/src/client/store/auth.store.ts +306 -0
  36. package/src/client/utils/storage.ts +70 -0
  37. package/src/common/constants/oauth-providers.ts +49 -0
  38. package/src/common/errors/auth.errors.ts +64 -0
  39. package/src/common/errors/specific-auth-errors.ts +201 -0
  40. package/src/common/index.ts +19 -0
  41. package/src/common/regex/index.ts +27 -0
  42. package/src/common/types/auth.types.ts +641 -0
  43. package/src/common/types/index.ts +297 -0
  44. package/src/common/utils/index.ts +84 -0
  45. package/src/core/blacklist/token.blacklist.ts +60 -0
  46. package/src/core/index.ts +2 -0
  47. package/src/core/jwt/jwt.manager.ts +131 -0
  48. package/src/core/session/session.manager.ts +56 -0
  49. package/src/db/repositories/connected-account.repository.ts +415 -0
  50. package/src/db/repositories/role.repository.ts +519 -0
  51. package/src/db/repositories/session.repository.ts +308 -0
  52. package/src/db/repositories/user.repository.ts +320 -0
  53. package/src/flows/index.ts +2 -0
  54. package/src/flows/sign-in.flow.ts +106 -0
  55. package/src/flows/sign-up.flow.ts +121 -0
  56. package/src/index.ts +54 -0
  57. package/src/libs/clerk.helper.ts +36 -0
  58. package/src/libs/supabase.helper.ts +255 -0
  59. package/src/libs/supabaseClient.ts +6 -0
  60. package/src/providers/base/auth-provider.interface.ts +42 -0
  61. package/src/providers/base/index.ts +1 -0
  62. package/src/providers/index.ts +2 -0
  63. package/src/providers/oauth/facebook.provider.ts +97 -0
  64. package/src/providers/oauth/github.provider.ts +148 -0
  65. package/src/providers/oauth/google.provider.ts +126 -0
  66. package/src/providers/oauth/index.ts +3 -0
  67. package/src/rbac/dynamic-roles.ts +552 -0
  68. package/src/rbac/index.ts +4 -0
  69. package/src/rbac/permission-checker.ts +464 -0
  70. package/src/rbac/role-hierarchy.ts +545 -0
  71. package/src/rbac/role.manager.ts +75 -0
  72. package/src/security/csrf/csrf.protection.ts +37 -0
  73. package/src/security/index.ts +3 -0
  74. package/src/security/rate-limiting/auth/auth.controller.ts +12 -0
  75. package/src/security/rate-limiting/auth/rate-limiting.interface.ts +67 -0
  76. package/src/security/rate-limiting/auth.module.ts +32 -0
  77. package/src/server/auth.module.ts +158 -0
  78. package/src/server/decorators/auth.decorator.ts +43 -0
  79. package/src/server/decorators/auth.decorators.ts +31 -0
  80. package/src/server/decorators/current-user.decorator.ts +49 -0
  81. package/src/server/decorators/permission.decorator.ts +49 -0
  82. package/src/server/guards/auth.guard.ts +56 -0
  83. package/src/server/guards/custom-throttler.guard.ts +46 -0
  84. package/src/server/guards/permissions.guard.ts +115 -0
  85. package/src/server/guards/roles.guard.ts +31 -0
  86. package/src/server/middleware/auth.middleware.ts +46 -0
  87. package/src/server/middleware/index.ts +2 -0
  88. package/src/server/middleware/middleware.ts +11 -0
  89. package/src/server/middleware/session.middleware.ts +255 -0
  90. package/src/server/services/account.service.ts +269 -0
  91. package/src/server/services/auth.service.ts +79 -0
  92. package/src/server/services/brute-force.service.ts +98 -0
  93. package/src/server/services/index.ts +15 -0
  94. package/src/server/services/rate-limiter.service.ts +60 -0
  95. package/src/server/services/session.service.ts +287 -0
  96. package/src/server/services/token.service.ts +262 -0
  97. package/src/session/cookie-store.ts +255 -0
  98. package/src/session/enhanced-session-manager.ts +406 -0
  99. package/src/session/index.ts +14 -0
  100. package/src/session/memory-store.ts +320 -0
  101. package/src/session/redis-store.ts +443 -0
  102. package/src/strategies/oauth.strategy.ts +128 -0
  103. package/src/strategies/traditional-auth.strategy.ts +116 -0
  104. package/src/tokens/index.ts +4 -0
  105. package/src/tokens/refresh-token-manager.ts +448 -0
  106. package/src/tokens/token-validator.ts +311 -0
  107. package/tsconfig.build.json +28 -0
  108. package/tsconfig.json +38 -0
  109. package/tsup.config.mjs +28 -0
  110. package/vitest.config.mjs +16 -0
  111. package/vitest.setup.d.ts +2 -0
  112. package/vitest.setup.d.ts.map +1 -0
  113. package/vitest.setup.ts +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/utils/index.ts","../src/core/jwt/jwt.manager.ts","../src/core/session/session.manager.ts","../src/rbac/role.manager.ts","../src/rbac/permission-checker.ts","../src/rbac/role-hierarchy.ts","../src/rbac/dynamic-roles.ts","../src/server/guards/custom-throttler.guard.ts","../src/security/rate-limiting/auth/auth.controller.ts","../src/server/services/auth.service.ts","../src/server/services/session.service.ts","../src/server/services/token.service.ts","../src/server/services/account.service.ts","../src/server/services/brute-force.service.ts","../src/server/services/rate-limiter.service.ts","../src/security/rate-limiting/auth.module.ts","../src/security/csrf/csrf.protection.ts","../src/audit/audit.logger.ts","../src/session/cookie-store.ts","../src/session/memory-store.ts","../src/session/redis-store.ts","../src/session/enhanced-session-manager.ts","../src/adapters/base-auth.adapter.ts","../src/libs/supabaseClient.ts","../src/libs/supabase.helper.ts","../src/adapters/clerk/clerk.adapter.ts","../src/adapters/next-auth/next-auth.adapter.ts","../src/adapters/custom/custom.adapter.ts","../src/strategies/traditional-auth.strategy.ts","../src/strategies/oauth.strategy.ts","../src/providers/base/auth-provider.interface.ts","../src/providers/oauth/facebook.provider.ts","../src/providers/oauth/github.provider.ts","../src/providers/oauth/google.provider.ts","../src/flows/sign-in.flow.ts","../src/flows/sign-up.flow.ts","../src/server/guards/auth.guard.ts","../src/server/guards/roles.guard.ts","../src/server/guards/permissions.guard.ts","../src/server/decorators/auth.decorator.ts","../src/server/decorators/auth.decorators.ts","../src/server/decorators/current-user.decorator.ts","../src/server/decorators/permission.decorator.ts","../src/server/middleware/session.middleware.ts","../src/server/middleware/auth.middleware.ts","../src/client/store/auth.store.ts","../src/client/providers/AuthProvider.tsx","../src/client/hooks/useAuth.ts","../src/client/hooks/useSession.ts","../src/client/hooks/useRBAC.ts","../src/client/hooks/useConnectedAccounts.ts","../src/client/hooks/usePermissions.ts","../src/client/components/ProtectedRoute.tsx"],"names":["NUMERIX","roleNode","_init","Injectable","AUTH_EVENTS","Logger","BadRequestException","randomBytes","DatabasePackageError","user","Buffer","thirty","AuthenticationError","UseGuards","SetMetadata","CurrentUser","createParamDecorator","Permissions","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @fileoverview Common utility functions for @plyaz/auth\n * @module @plyaz/auth/common/utils\n */\n\nimport { NUMERIX } from \"@plyaz/config\";\n\n/**\n * Generate a random string of specified length using alphanumeric characters\n * @param length - Length of the random string (default: 32)\n * @returns Random alphanumeric string\n * @example\n * ```typescript\n * const randomId = generateRandomString(16); // \"a1B2c3D4e5F6g7H8\"\n * ```\n */\nexport function generateRandomString(length: number = 32): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\n/**\n * Generate a cryptographically secure random ID with timestamp prefix\n * @returns Unique identifier with timestamp and random suffix\n * @example\n * ```typescript\n * const id = generateSecureId(); // \"1703123456789_a1B2c3D4e5F6g7H8\"\n * ```\n */\nexport function generateSecureId(): string {\n return `${Date.now()}_${generateRandomString(NUMERIX.SIXTEEN)}`;\n}\n\n/**\n * Sleep for specified milliseconds (async delay)\n * @param ms - Milliseconds to sleep\n * @returns Promise that resolves after the delay\n * @example\n * ```typescript\n * await sleep(1000); // Wait 1 second\n * ```\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => globalThis.setTimeout(resolve, ms));\n}\n\n/**\n * Mask sensitive data fields for safe logging\n * @param data - Object containing potentially sensitive data\n * @param sensitiveFields - Array of field names to mask (default: ['password', 'token', 'secret'])\n * @returns Object with sensitive fields masked\n * @example\n * ```typescript\n * const masked = maskSensitiveData({ email: 'user@example.com', password: 'secret123' });\n * // Result: { email: 'user@example.com', password: 'secr*****' }\n * ```\n */\nexport function maskSensitiveData(\n data: unknown,\n sensitiveFields: string[] = ['password', 'token', 'secret']\n): unknown {\n if (typeof data !== 'object' || data === null) {\n return data;\n }\n\n // Type assertion to allow indexing by string\n const masked: Record<string, string> = { ...(data as Record<string, string>) };\n const four = 4;\n for (const field of sensitiveFields) {\n if (field in masked) {\n const value = masked[field];\n if (typeof value === 'string' && value.length > 0) {\n masked[field] = value.substring(0, four) + '*'.repeat(Math.max(0, value.length - four));\n }\n }\n }\n \n return masked;\n}\n\n","import { sign, verify, type JwtPayload, type SignOptions } from \"jsonwebtoken\";\nimport type { AuthTokens } from '@plyaz/types';\nimport { NUMERIX } from \"@plyaz/config\";\n\n// Define the token payload interface\nexport interface TokenPayload extends JwtPayload {\n sub: string;\n type: \"access\" | \"refresh\" | \"verification\";\n}\n\n// Define the StringValue type to match what jsonwebtoken expects\n// Define the StringValue type to match what jsonwebtoken expects\ntype StringValue = `${number}s` | `${number}m` | `${number}h` | `${number}d`;\n\n\nexport class JwtManager {\n private config: {\n privateKey: string;\n publicKey: string;\n issuer: string;\n audience: string;\n };\n private algorithm: \"RS256\" | \"HS256\" | \"ES256\" | \"HS512\";\n\n constructor(\n config: typeof JwtManager.prototype.config,\n algorithm: \"RS256\" | \"HS256\" | \"ES256\" | \"HS512\"\n ) {\n this.config = config;\n this.algorithm = algorithm;\n }\n\n // -------------------\n // Generic Token Generator\n // -------------------\n private generateToken(\n payload: Omit<TokenPayload, \"iss\" | \"aud\" | \"iat\" | \"exp\">,\n expiresIn: string | number = \"1h\"\n ): string {\n const signOptions: SignOptions = {\n algorithm: this.algorithm,\n expiresIn: expiresIn as StringValue | number,\n issuer: this.config.issuer,\n audience: this.config.audience,\n };\n\n return sign(payload, this.config.privateKey, signOptions);\n }\n\n generateTokens(\n user: { id: string },\n accessTokenExpiry: string | number = \"1h\",\n refreshTokenExpiry: string | number = \"7d\"\n ): AuthTokens {\n const accessToken = this.generateToken({ sub: user.id, type: \"access\" }, accessTokenExpiry);\n const refreshToken = this.generateToken({ sub: user.id, type: \"refresh\" }, refreshTokenExpiry);\n\n // Calculate the actual expiration time in seconds\n let expiresIn: number;\n if (typeof accessTokenExpiry === 'string') {\n // Parse time strings like \"1h\", \"30m\", etc.\n const match = accessTokenExpiry.match(/^(\\d+)([smhd])$/);\n if (match) {\n const value = globalThis.parseInt(match[1], NUMERIX.TEN);\n const unit = match[2];\n const multipliers: Record<string, number> = { s: 1, m: 60, h: 3600, d: 86400 };\n expiresIn = value * multipliers[unit];\n } else {\n expiresIn = NUMERIX.THIRTY_SIX_HUNDERD; // Default to 1 hour\n }\n } else {\n expiresIn = accessTokenExpiry;\n }\n\n return { \n accessToken, \n refreshToken,\n expiresIn,\n tokenType: \"Bearer\"\n };\n }\n\n // Generate access token\n generateAccessToken(userId: string, expiresIn: string | number = \"1h\"): string {\n return this.generateToken({ sub: userId, type: \"access\" }, expiresIn);\n }\n\n // Generate refresh token\n generateRefreshToken(userId: string, expiresIn: string | number = \"7d\"): string {\n return this.generateToken({ sub: userId, type: \"refresh\" }, expiresIn);\n }\n\n // Generate verification token (email confirmation)\n generateVerificationToken(userId: string, expiresIn: string | number = \"24h\"): string {\n return this.generateToken({ sub: userId, type: \"verification\" }, expiresIn);\n }\n\n // -------------------\n // Token Verification\n // -------------------\n private verifyToken(token: string, tokenType: \"access\" | \"refresh\" | \"verification\"): TokenPayload {\n const decoded = verify(token, this.config.publicKey, {\n algorithms: [this.algorithm],\n issuer: this.config.issuer,\n audience: this.config.audience,\n });\n\n if (typeof decoded === \"string\") throw new Error(`Invalid ${tokenType} token payload`);\n \n const payload = decoded as JwtPayload;\n \n // Verify the token type\n if (payload.type !== tokenType) {\n throw new Error(`Invalid token type. Expected ${tokenType}, got ${payload.type}`);\n }\n \n return payload as TokenPayload;\n }\n\n verifyAccessToken(token: string): TokenPayload {\n return this.verifyToken(token, \"access\");\n }\n\n verifyRefreshToken(token: string): TokenPayload {\n return this.verifyToken(token, \"refresh\");\n }\n\n verifyVerificationToken(token: string): TokenPayload {\n return this.verifyToken(token, \"verification\");\n }\n}","\nimport type { Session, SessionRepository, SessionConfig, CreateSessionData } from '@plyaz/types';\n\n\n\nexport class SessionManager {\n constructor(\n private sessionRepo: SessionRepository,\n private config: SessionConfig\n ) {}\n\n async createSession(userId: string, deviceInfo: Record<string,unknown>): Promise<Session> {\n await this.enforceSessionLimits(userId);\n \n const sessionData: CreateSessionData = {\n userId,\n provider: 'default',\n expiresAt: new Date(Date.now() + this.config.sessionTTL),\n metadata:deviceInfo,\n };\n\n return this.sessionRepo.create(sessionData);\n }\n\n async getSession(sessionId: string): Promise<Session | null> {\n const session = await this.sessionRepo.findById(sessionId);\n if (!session || session.expiresAt < new Date()) {\n return null;\n }\n return session;\n }\n\n async updateLastActive(sessionId: string): Promise<void> {\n await this.sessionRepo.updateLastActive(sessionId);\n }\n\n async invalidateSession(sessionId: string): Promise<void> {\n await this.sessionRepo.delete(sessionId);\n }\n\n async invalidateAllUserSessions(userId: string): Promise<void> {\n await this.sessionRepo.deleteByUserId(userId);\n }\n\n private async enforceSessionLimits(userId: string): Promise<void> {\n const sessions = await this.sessionRepo.findByUserId(userId);\n if (sessions.length >= this.config.maxConcurrentSessions) {\n const oldestSession = sessions.sort((a, b) => \n a.lastActivityAt.getTime() - b.lastActivityAt.getTime()\n )[0];\n await this.sessionRepo.delete(oldestSession.id);\n }\n }\n\n \n}","import type { RoleConfig, UserRepository } from '@plyaz/types';\n\n\n// export interface RoleConfig {\n// hierarchyEnabled: boolean;\n// cacheEnabled: boolean;\n// cacheTTL: number;\n// }\n\nexport class RoleManager {\n private roleCache = new Map<string, { roles: string[]; expires: number }>();\n\n constructor(\n private userRepo: UserRepository,\n private config: RoleConfig\n ) {}\n\n async assignRole(userId: string, role: string, assignedBy?: string): Promise<void> {\n await this.userRepo.assignRole(userId, role, assignedBy);\n this.invalidateCache(userId);\n }\n\n async removeRole(userId: string, role: string): Promise<void> {\n await this.userRepo.removeRole(userId, role);\n this.invalidateCache(userId);\n }\n\n async getUserRoles(userId: string): Promise<string[]> {\n if (this.config.cacheEnabled) {\n const cached = this.roleCache.get(userId);\n if (cached && cached.expires > Date.now()) {\n return cached.roles;\n }\n }\n\n const roles = await this.userRepo.getUserRoles(userId);\n \n if (this.config.cacheEnabled) {\n this.roleCache.set(userId, {\n roles,\n expires: Date.now() + this.config.cacheTTL\n });\n }\n\n return roles;\n }\n\n async hasRole(userId: string, role: string): Promise<boolean> {\n const roles = await this.getUserRoles(userId);\n return roles.includes(role);\n }\n\n async hasAnyRole(userId: string, roles: string[]): Promise<boolean> {\n const userRoles = await this.getUserRoles(userId);\n return roles.some(role => userRoles.includes(role));\n }\n\n async hasPermission(userId: string, permission: string): Promise<boolean> {\n const roles = await this.getUserRoles(userId);\n return this.userRepo.checkPermission(roles, permission);\n }\n\n private invalidateCache(userId: string): void {\n this.roleCache.delete(userId);\n }\n\n cleanup(): void {\n const now = Date.now();\n for (const [userId, data] of this.roleCache.entries()) {\n if (data.expires < now) {\n this.roleCache.delete(userId);\n }\n }\n }\n}","/**\n * @fileoverview Permission checker for @plyaz/auth\n * @module @plyaz/auth/rbac/permission-checker\n * \n * @description\n * Provides permission validation logic for role-based access control.\n * Handles permission checking with conditions, resource-based permissions,\n * and hierarchical role inheritance. Used by guards and services to\n * enforce authorization policies.\n * \n * @example\n * ```typescript\n * import { PermissionChecker } from '@plyaz/auth';\n * \n * const checker = new PermissionChecker();\n * const hasPermission = await checker.checkPermission(\n * userId, \n * 'campaigns', \n * 'create',\n * { ownerId: userId }\n * );\n * ```\n */\n\nimport { NUMERIX } from \"@plyaz/config\";\nimport type { Permission, PermissionCheckerConfig, PermissionCheckResult, PermissionContext, Role } from \"@plyaz/types\";\n\n/**\n * Permission checker implementation\n * Validates user permissions with context and conditions\n */\n// RoleRepository interface based on PermissionChecker usage\nexport interface RoleRepository {\n /**\n * Get all roles assigned to a user\n * @param userId - User identifier\n * @returns Array of Role objects\n */\n getUserRoles(userId: string): Promise<Role[]>;\n\n /**\n * Get all permissions assigned to a role\n * @param roleId - Role identifier\n * @returns Array of Permission objects\n */\n getRolePermissions(roleId: string): Promise<Permission[]>;\n}\n\n\n// UserRepository interface based on PermissionChecker usage\nexport interface UserRepository {\n /**\n * Get all roles assigned to a user\n * @param userId - User identifier\n * @returns Array of Role objects\n */\n getUserRoles(userId: string): Promise<Role[]>;\n}\n\n\nexport class PermissionChecker {\n private readonly config: PermissionCheckerConfig;\n private readonly permissionCache = new Map<string, { result: PermissionCheckResult; expires: number }>();\n\n constructor(\n config: Partial<PermissionCheckerConfig> = {},\n private userRepository?: UserRepository,\n private roleRepository?:RoleRepository \n ) {\n this.config = {\n enableCaching: true,\n cacheTTL: 300, // 5 minutes\n enableAuditLog: true,\n ...config\n };\n }\n\n /**\n * Check if user has permission for resource and action\n * @param userId - User identifier\n * @param resource - Resource name (e.g., 'campaigns', 'users')\n * @param action - Action name (e.g., 'create', 'read', 'update', 'delete')\n * @param context - Permission context for conditional checks\n * @returns Permission check result\n */\n async checkPermission(\n userId: string,\n resource: string,\n action: string,\n context: PermissionContext = {}\n ): Promise<PermissionCheckResult> {\n // Check cache first\n if (this.config.enableCaching) {\n const cacheKey = this.getCacheKey(userId, resource, action, context);\n const cached = this.permissionCache.get(cacheKey);\n \n if (cached && cached.expires > Date.now()) {\n return cached.result;\n }\n }\n\n // Get user permissions\n const userPermissions = await this.getUserPermissions(userId);\n \n // Check direct permissions\n const directResult = this.checkDirectPermission(userPermissions, resource, action, context);\n \n if (directResult.granted) {\n return this.cacheAndReturn(userId, resource, action, context, directResult);\n }\n\n // Check role-based permissions\n const roleResult = await this.checkRoleBasedPermission(userId, resource, action, context);\n \n if (roleResult.granted) {\n return this.cacheAndReturn(userId, resource, action, context, roleResult);\n }\n\n // Check wildcard permissions\n const wildcardResult = this.checkWildcardPermission(userPermissions, resource, action, context);\n \n if (wildcardResult.granted) {\n return this.cacheAndReturn(userId, resource, action, context, wildcardResult);\n }\n\n // Permission denied\n const deniedResult: PermissionCheckResult = {\n granted: false,\n reason: `No permission found for ${resource}:${action}`\n };\n\n return this.cacheAndReturn(userId, resource, action, context, deniedResult);\n }\n\n /**\n * Check multiple permissions at once\n * @param userId - User identifier\n * @param permissions - Array of permission checks\n * @returns Array of permission check results\n */\n async checkMultiplePermissions(\n userId: string,\n permissions: Array<{ resource: string; action: string; context?: PermissionContext }>\n ): Promise<PermissionCheckResult[]> {\n const results: PermissionCheckResult[] = [];\n \n for (const permission of permissions) {\n const result = await this.checkPermission(\n userId,\n permission.resource,\n permission.action,\n permission.context ?? {}\n );\n results.push(result);\n }\n \n return results;\n }\n\n /**\n * Check if user has any of the specified permissions\n * @param userId - User identifier\n * @param permissions - Array of permission checks\n * @returns True if user has at least one permission\n */\n async hasAnyPermission(\n userId: string,\n permissions: Array<{ resource: string; action: string; context?: PermissionContext }>\n ): Promise<boolean> {\n const results = await this.checkMultiplePermissions(userId, permissions);\n return results.some(result => result.granted);\n }\n\n /**\n * Check if user has all specified permissions\n * @param userId - User identifier\n * @param permissions - Array of permission checks\n * @returns True if user has all permissions\n */\n async hasAllPermissions(\n userId: string,\n permissions: Array<{ resource: string; action: string; context?: PermissionContext }>\n ): Promise<boolean> {\n const results = await this.checkMultiplePermissions(userId, permissions);\n return results.every(result => result.granted);\n }\n\n /**\n * Get all permissions for a user\n * @param userId - User identifier\n * @returns Array of user permissions\n */\n async getUserPermissions(userId: string): Promise<Permission[]> {\n if (!this.userRepository) {\n throw new Error('UserRepository not configured');\n }\n \n \n const userRoles = await this.getUserRoles(userId);\n const permissions: Permission[] = [];\n \n for (const role of userRoles) {\n const rolePermissions = await this.getRolePermissions(role.id);\n permissions.push(...rolePermissions);\n }\n \n return permissions;\n }\n\n /**\n * Clear permission cache for user\n * @param userId - User identifier\n */\n clearUserCache(userId: string): void {\n for (const [key] of this.permissionCache.entries()) {\n if (key.startsWith(`${userId}:`)) {\n this.permissionCache.delete(key);\n }\n }\n }\n\n /**\n * Clear all permission cache\n */\n clearAllCache(): void {\n this.permissionCache.clear();\n }\n\n /**\n * Get cache statistics\n * @returns Cache statistics\n */\n getCacheStats(): { size: number; hitRate: number } {\n return {\n size: this.permissionCache.size,\n hitRate: 0\n };\n }\n\n /**\n * Check direct user permissions\n * @param permissions - User permissions\n * @param resource - Resource name\n * @param action - Action name\n * @param context - Permission context\n * @returns Permission check result\n * @private\n */\n private checkDirectPermission(\n permissions: Permission[],\n resource: string,\n action: string,\n context: PermissionContext\n ): PermissionCheckResult {\n for (const permission of permissions) {\n if (permission.resource === resource && permission.action === action) {\n // Check conditions if present\n if (permission.conditions && Object.keys(permission.conditions).length > 0) {\n const conditionsMet = this.evaluateConditions(permission.conditions, context);\n \n // eslint-disable-next-line max-depth\n if (conditionsMet) {\n return {\n granted: true,\n reason: 'Direct permission with conditions met',\n matchedPermission: permission,\n conditions: permission.conditions\n };\n }\n } else {\n return {\n granted: true,\n reason: 'Direct permission without conditions',\n matchedPermission: permission\n };\n }\n }\n }\n\n return {\n granted: false,\n reason: 'No direct permission found'\n };\n }\n\n /**\n * Check role-based permissions\n * @param userId - User identifier\n * @param resource - Resource name\n * @param action - Action name\n * @param context - Permission context\n * @returns Permission check result\n * @private\n */\n private async checkRoleBasedPermission(\n userId: string,\n resource: string,\n action: string,\n context: PermissionContext\n ): Promise<PermissionCheckResult> {\n if (!this.roleRepository) {\n return { granted: false, reason: 'RoleRepository not configured' };\n }\n \n const userRoles = await this.getUserRoles(userId);\n \n for (const role of userRoles) {\n const rolePermissions = await this.getRolePermissions(role.id);\n const result = this.checkDirectPermission(rolePermissions, resource, action, context);\n \n if (result.granted) {\n return {\n ...result,\n reason: `Role-based permission from role: ${role.name}`\n };\n }\n }\n\n return {\n granted: false,\n reason: 'No role-based permission found'\n };\n }\n\n /**\n * Check wildcard permissions\n * @param permissions - User permissions\n * @param resource - Resource name\n * @param action - Action name\n * @param context - Permission context\n * @returns Permission check result\n * @private\n */\n private checkWildcardPermission(\n permissions: Permission[],\n resource: string,\n action: string,\n context: PermissionContext\n ): PermissionCheckResult {\n // Check for wildcard permissions like \"campaigns:*\" or \"*:read\"\n for (const permission of permissions) {\n const resourceMatch = permission.resource === '*' || permission.resource === resource;\n const actionMatch = permission.action === '*' || permission.action === action;\n \n if (resourceMatch && actionMatch) {\n // Check conditions if present\n if (permission.conditions && Object.keys(permission.conditions).length > 0) {\n const conditionsMet = this.evaluateConditions(permission.conditions, context);\n \n // eslint-disable-next-line max-depth\n if (conditionsMet) {\n return {\n granted: true,\n reason: 'Wildcard permission with conditions met',\n matchedPermission: permission,\n conditions: permission.conditions\n };\n }\n } else {\n return {\n granted: true,\n reason: 'Wildcard permission without conditions',\n matchedPermission: permission\n };\n }\n }\n }\n\n return {\n granted: false,\n reason: 'No wildcard permission found'\n };\n }\n\n /**\n * Evaluate permission conditions\n * @param conditions - Permission conditions\n * @param context - Permission context\n * @returns True if conditions are met\n * @private\n */\n private evaluateConditions(conditions: Record<string, unknown>, context: PermissionContext): boolean {\n for (const [key, expectedValue] of Object.entries(conditions)) {\n const contextValue = context[key];\n \n if (contextValue !== expectedValue) {\n return false;\n }\n }\n \n return true;\n }\n\n /**\n * Get user roles\n * @param userId - User identifier\n * @returns Array of user roles\n * @private\n */\n private async getUserRoles(userId: string): Promise<Role[]> {\n if (!this.userRepository) {\n return [];\n }\n \n return await this.userRepository.getUserRoles(userId);\n }\n\n /**\n * Get role permissions\n * @param roleId - Role identifier\n * @returns Array of role permissions\n * @private\n */\n private async getRolePermissions(roleId: string): Promise<Permission[]> {\n if (!this.roleRepository) {\n return [];\n }\n \n return await this.roleRepository.getRolePermissions(roleId);\n }\n\n /**\n * Generate cache key\n * @param userId - User identifier\n * @param resource - Resource name\n * @param action - Action name\n * @param context - Permission context\n * @returns Cache key\n * @private\n */\n private getCacheKey(userId: string, resource: string, action: string, context: PermissionContext): string {\n const contextHash = JSON.stringify(context);\n return `${userId}:${resource}:${action}:${contextHash}`;\n }\n\n /**\n * Cache result and return\n * @param userId - User identifier\n * @param resource - Resource name\n * @param action - Action name\n * @param context - Permission context\n * @param result - Permission check result\n * @returns Permission check result\n * @private\n */\n // eslint-disable-next-line max-params\n private cacheAndReturn(\n userId: string,\n resource: string,\n action: string,\n context: PermissionContext,\n result: PermissionCheckResult\n ): PermissionCheckResult {\n if (this.config.enableCaching) {\n const cacheKey = this.getCacheKey(userId, resource, action, context);\n this.permissionCache.set(cacheKey, {\n result,\n expires: Date.now() + this.config.cacheTTL * NUMERIX.THOUSAND\n });\n }\n\n return result;\n }\n}","/**\n * @fileoverview Role hierarchy manager for @plyaz/auth\n * @module @plyaz/auth/rbac/role-hierarchy\n *\n * @description\n * Manages role hierarchy and inheritance for role-based access control.\n * Handles role precedence, permission inheritance, and hierarchical\n * role validation. Enables complex organizational structures with\n * inherited permissions and role-based delegation.\n *\n * @example\n * ```typescript\n * import { RoleHierarchy } from '@plyaz/auth';\n *\n * const hierarchy = new RoleHierarchy();\n * await hierarchy.addRole('admin', 100);\n * await hierarchy.addRole('moderator', 50);\n *\n * const hasPermission = await hierarchy.checkInheritedPermission(\n * 'admin', 'moderator'\n * );\n * ```\n */\n\nimport type { Role, RoleHierarchyConfig, RoleNode } from \"@plyaz/types\";\n\n// /**\n// * Role hierarchy node\n// */\n// export interface RoleNode {\n// /** Role information */\n// role: Role;\n// /** Parent roles (higher hierarchy) */\n// parents: Set<string>;\n// /** Child roles (lower hierarchy) */\n// children: Set<string>;\n// /** Direct permissions */\n// permissions: Set<string>;\n// /** Inherited permissions (computed) */\n// inheritedPermissions?: Set<string>;\n// }\n\n// /**\n// * Role hierarchy configuration\n// */\n// export interface RoleHierarchyConfig {\n// /** Enable permission inheritance */\n// enableInheritance: boolean;\n// /** Maximum hierarchy depth */\n// maxDepth: number;\n// /** Enable circular dependency detection */\n// detectCircular: boolean;\n// /** Cache inherited permissions */\n// cacheInheritance: boolean;\n// }\n\n/**\n * Role hierarchy manager implementation\n * Manages role relationships and permission inheritance\n */\nexport class RoleHierarchy {\n private readonly config: RoleHierarchyConfig;\n private readonly roles = new Map<string, RoleNode>();\n private readonly hierarchyCache = new Map<string, Set<string>>();\n\n constructor(config: Partial<RoleHierarchyConfig> = {}) {\n this.config = {\n enableInheritance: true,\n maxDepth: 10,\n detectCircular: true,\n cacheInheritance: true,\n ...config,\n };\n }\n\n /**\n * Add role to hierarchy\n * @param role - Role to add\n * @returns Promise that resolves when role is added\n */\n async addRole(role: Role): Promise<void> {\n const roleNode: RoleNode = {\n role,\n parents: new Set(),\n children: new Set(),\n permissions: new Set(),\n };\n\n this.roles.set(role.id, roleNode);\n\n // Clear cache when hierarchy changes\n if (this.config.cacheInheritance) {\n this.hierarchyCache.clear();\n }\n }\n\n /**\n * Remove role from hierarchy\n * @param roleId - Role identifier\n * @returns Promise that resolves when role is removed\n */\n async removeRole(roleId: string): Promise<void> {\n const roleNode = this.roles.get(roleId);\n\n if (!roleNode) {\n return;\n }\n\n // Remove from parent-child relationships\n for (const parentId of roleNode.parents) {\n const parent = this.roles.get(parentId);\n if (parent) {\n parent.children.delete(roleId);\n }\n }\n\n for (const childId of roleNode.children) {\n const child = this.roles.get(childId);\n if (child) {\n child.parents.delete(roleId);\n }\n }\n\n this.roles.delete(roleId);\n\n // Clear cache when hierarchy changes\n if (this.config.cacheInheritance) {\n this.hierarchyCache.clear();\n }\n }\n\n /**\n * Add parent-child relationship between roles\n * @param childRoleId - Child role identifier\n * @param parentRoleId - Parent role identifier\n * @returns Promise that resolves when relationship is added\n */\n async addRoleRelationship(\n childRoleId: string,\n parentRoleId: string\n ): Promise<void> {\n const childRole = this.roles.get(childRoleId);\n const parentRole = this.roles.get(parentRoleId);\n\n if (!childRole || !parentRole) {\n throw new Error(\"Role not found\");\n }\n\n // Check for circular dependencies\n if (\n this.config.detectCircular &&\n (await this.wouldCreateCircular(childRoleId, parentRoleId))\n ) {\n throw new Error(\"Adding relationship would create circular dependency\");\n }\n\n // Check hierarchy depth\n const depth = await this.calculateDepth(parentRoleId);\n if (depth >= this.config.maxDepth) {\n throw new Error(\"Maximum hierarchy depth exceeded\");\n }\n\n // Add relationship\n childRole.parents.add(parentRoleId);\n parentRole.children.add(childRoleId);\n\n // Clear cache when hierarchy changes\n if (this.config.cacheInheritance) {\n this.hierarchyCache.clear();\n }\n }\n\n /**\n * Remove parent-child relationship between roles\n * @param childRoleId - Child role identifier\n * @param parentRoleId - Parent role identifier\n * @returns Promise that resolves when relationship is removed\n */\n async removeRoleRelationship(\n childRoleId: string,\n parentRoleId: string\n ): Promise<void> {\n const childRole = this.roles.get(childRoleId);\n const parentRole = this.roles.get(parentRoleId);\n\n if (childRole) {\n childRole.parents.delete(parentRoleId);\n }\n\n if (parentRole) {\n parentRole.children.delete(childRoleId);\n }\n\n // Clear cache when hierarchy changes\n if (this.config.cacheInheritance) {\n this.hierarchyCache.clear();\n }\n }\n\n /**\n * Check if role inherits from another role\n * @param roleId - Role identifier\n * @param ancestorRoleId - Ancestor role identifier\n * @returns True if role inherits from ancestor\n */\n async inheritsFrom(roleId: string, ancestorRoleId: string): Promise<boolean> {\n if (roleId === ancestorRoleId) {\n return true;\n }\n\n const ancestors = await this.getAncestors(roleId);\n return ancestors.has(ancestorRoleId);\n }\n\n /**\n * Get all ancestor roles (roles this role inherits from)\n * @param roleId - Role identifier\n * @returns Set of ancestor role IDs\n */\n async getAncestors(roleId: string): Promise<Set<string>> {\n if (this.config.cacheInheritance) {\n const cached = this.hierarchyCache.get(`ancestors:${roleId}`);\n if (cached) {\n return cached;\n }\n }\n\n const ancestors = new Set<string>();\n const visited = new Set<string>();\n\n await this.collectAncestors(roleId, ancestors, visited);\n\n if (this.config.cacheInheritance) {\n this.hierarchyCache.set(`ancestors:${roleId}`, ancestors);\n }\n\n return ancestors;\n }\n\n /**\n * Get all descendant roles (roles that inherit from this role)\n * @param roleId - Role identifier\n * @returns Set of descendant role IDs\n */\n async getDescendants(roleId: string): Promise<Set<string>> {\n if (this.config.cacheInheritance) {\n const cached = this.hierarchyCache.get(`descendants:${roleId}`);\n if (cached) {\n return cached;\n }\n }\n\n const descendants = new Set<string>();\n const visited = new Set<string>();\n\n await this.collectDescendants(roleId, descendants, visited);\n\n if (this.config.cacheInheritance) {\n this.hierarchyCache.set(`descendants:${roleId}`, descendants);\n }\n\n return descendants;\n }\n\n /**\n * Get effective permissions for role (including inherited)\n * @param roleId - Role identifier\n * @returns Set of permission IDs\n */\n async getEffectivePermissions(roleId: string): Promise<Set<string>> {\n if (!this.config.enableInheritance) {\n const roleNode = this.roles.get(roleId);\n return roleNode ? roleNode.permissions : new Set();\n }\n\n if (this.config.cacheInheritance) {\n const cached = this.hierarchyCache.get(`permissions:${roleId}`);\n if (cached) {\n return cached;\n }\n }\n\n const effectivePermissions = new Set<string>();\n const roleNode = this.roles.get(roleId);\n\n if (!roleNode) {\n return effectivePermissions;\n }\n\n // Add direct permissions\n for (const permission of roleNode.permissions) {\n effectivePermissions.add(permission);\n }\n\n // Add inherited permissions\n const ancestors = await this.getAncestors(roleId);\n for (const ancestorId of ancestors) {\n const ancestorNode = this.roles.get(ancestorId);\n if (ancestorNode) {\n for (const permission of ancestorNode.permissions) {\n effectivePermissions.add(permission);\n }\n }\n }\n\n if (this.config.cacheInheritance) {\n this.hierarchyCache.set(`permissions:${roleId}`, effectivePermissions);\n }\n\n return effectivePermissions;\n }\n\n /**\n * Validate hierarchy integrity\n * @returns Validation result with any issues found\n */\n async validateHierarchy(): Promise<{\n valid: boolean;\n issues: string[];\n }> {\n const issues: string[] = [];\n\n // Check for circular dependencies\n if (this.config.detectCircular) {\n for (const roleId of this.roles.keys()) {\n if (await this.hasCircularDependency(roleId)) {\n issues.push(`Circular dependency detected involving role: ${roleId}`);\n }\n }\n }\n\n // Check hierarchy depth\n for (const roleId of this.roles.keys()) {\n const depth = await this.calculateDepth(roleId);\n if (depth > this.config.maxDepth) {\n issues.push(`Role ${roleId} exceeds maximum hierarchy depth: ${depth}`);\n }\n }\n\n // Check for orphaned relationships\n for (const [roleId, roleNode] of this.roles.entries()) {\n for (const parentId of roleNode.parents) {\n if (!this.roles.has(parentId)) {\n issues.push(\n `Role ${roleId} references non-existent parent: ${parentId}`\n );\n }\n }\n\n for (const childId of roleNode.children) {\n if (!this.roles.has(childId)) {\n issues.push(\n `Role ${roleId} references non-existent child: ${childId}`\n );\n }\n }\n }\n\n return {\n valid: issues.length === 0,\n issues,\n };\n }\n\n /**\n * Clear hierarchy cache\n */\n clearCache(): void {\n this.hierarchyCache.clear();\n }\n\n /**\n * Get hierarchy statistics\n * @returns Hierarchy statistics\n */\n getStats(): {\n totalRoles: number;\n maxDepth: number;\n rootRoles: number;\n leafRoles: number;\n } {\n let maxDepth = 0;\n let rootRoles = 0;\n let leafRoles = 0;\n\n for (const roleNode of this.roles.values()) {\n if (roleNode.parents.size === 0) {\n rootRoles++;\n }\n\n if (roleNode.children.size === 0) {\n leafRoles++;\n }\n }\n\n return {\n totalRoles: this.roles.size,\n maxDepth,\n rootRoles,\n leafRoles,\n };\n }\n\n /**\n * Collect ancestors recursively\n * @param roleId - Role identifier\n * @param ancestors - Set to collect ancestors\n * @param visited - Set to track visited roles\n * @private\n */\n private async collectAncestors(\n roleId: string,\n ancestors: Set<string>,\n visited: Set<string>\n ): Promise<void> {\n if (visited.has(roleId)) {\n return;\n }\n\n visited.add(roleId);\n const roleNode = this.roles.get(roleId);\n\n if (!roleNode) {\n return;\n }\n\n for (const parentId of roleNode.parents) {\n ancestors.add(parentId);\n await this.collectAncestors(parentId, ancestors, visited);\n }\n }\n\n /**\n * Collect descendants recursively\n * @param roleId - Role identifier\n * @param descendants - Set to collect descendants\n * @param visited - Set to track visited roles\n * @private\n */\n private async collectDescendants(\n roleId: string,\n descendants: Set<string>,\n visited: Set<string>\n ): Promise<void> {\n if (visited.has(roleId)) {\n return;\n }\n\n visited.add(roleId);\n const roleNode = this.roles.get(roleId);\n\n if (!roleNode) {\n return;\n }\n\n for (const childId of roleNode.children) {\n descendants.add(childId);\n await this.collectDescendants(childId, descendants, visited);\n }\n }\n\n /**\n * Check if adding relationship would create circular dependency\n * @param childRoleId - Child role identifier\n * @param parentRoleId - Parent role identifier\n * @returns True if would create circular dependency\n * @private\n */\n private async wouldCreateCircular(\n childRoleId: string,\n parentRoleId: string\n ): Promise<boolean> {\n // If parent inherits from child, adding this relationship would create a circle\n return await this.inheritsFrom(parentRoleId, childRoleId);\n }\n\n /**\n * Check for circular dependency starting from role\n * @param roleId - Role identifier\n * @returns True if circular dependency exists\n * @private\n */\n private async hasCircularDependency(roleId: string): Promise<boolean> {\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n\n return await this.detectCircularRecursive(roleId, visited, recursionStack);\n }\n\n /**\n * Detect circular dependency recursively\n * @param roleId - Current role identifier\n * @param visited - Set of visited roles\n * @param recursionStack - Current recursion stack\n * @returns True if circular dependency found\n * @private\n */\n private async detectCircularRecursive(\n roleId: string,\n visited: Set<string>,\n recursionStack: Set<string>\n ): Promise<boolean> {\n visited.add(roleId);\n recursionStack.add(roleId);\n\n const roleNode = this.roles.get(roleId);\n if (!roleNode) {\n recursionStack.delete(roleId);\n return false;\n }\n\n for (const parentId of roleNode.parents) {\n if (!visited.has(parentId)) {\n if (\n await this.detectCircularRecursive(parentId, visited, recursionStack)\n ) {\n return true;\n }\n } else if (recursionStack.has(parentId)) {\n return true; // Circular dependency found\n }\n }\n\n recursionStack.delete(roleId);\n return false;\n }\n\n /**\n * Calculate hierarchy depth for role\n * @param roleId - Role identifier\n * @returns Hierarchy depth\n * @private\n */\n private async calculateDepth(roleId: string): Promise<number> {\n const ancestors = await this.getAncestors(roleId);\n return ancestors.size;\n }\n\n /**\n * Build role tree recursively\n * @param roleId - Role identifier\n * @returns Role tree node\n * @private\n */\n}\n","/**\n * @fileoverview Dynamic roles manager for @plyaz/auth\n * @module @plyaz/auth/rbac/dynamic-roles\n * \n * @description\n * Manages runtime role assignment and modification for role-based access control.\n * Handles temporary roles, conditional role assignment, and role expiration.\n * Enables flexible role management without requiring database schema changes.\n * \n * @example\n * ```typescript\n * import { DynamicRoles } from '@plyaz/auth';\n * \n * const dynamicRoles = new DynamicRoles();\n * \n * // Assign temporary role\n * await dynamicRoles.assignTemporaryRole(\n * userId, \n * 'campaign_moderator', \n * { campaignId: '123' },\n * new Date(Date.now() + 24 * 60 * 60 * 1000) // 24 hours\n * );\n * ```\n */\n\nimport { NUMERIX } from '@plyaz/config';\nimport { AUTH_EVENTS } from '@plyaz/types';\n\n/**\n * Dynamic role assignment\n */\nexport interface DynamicRoleAssignment {\n /** Assignment ID */\n id: string;\n /** User ID */\n userId: string;\n /** Role ID or name */\n roleId: string;\n /** Assignment conditions */\n conditions?: Record<string, string>;\n /** Assignment expiration */\n expiresAt?: Date;\n /** Assignment reason */\n reason?: string;\n /** Assigned by user ID */\n assignedBy?: string;\n /** Assignment metadata */\n metadata?: Record<string, string>;\n /** Created at */\n createdAt: Date;\n /** Is active */\n isActive: boolean;\n}\n\n/**\n * Role condition evaluator function\n */\nexport type RoleConditionEvaluator = (\n userId: string,\n conditions: Record<string, string>,\n context?: Record<string, string>\n) => Promise<boolean>;\n\n/**\n * Dynamic roles configuration\n */\nexport interface DynamicRolesConfig {\n /** Enable role expiration */\n enableExpiration: boolean;\n /** Default role TTL in seconds */\n defaultTTL: number;\n /** Enable condition evaluation */\n enableConditions: boolean;\n /** Maximum assignments per user */\n maxAssignmentsPerUser: number;\n /** Enable audit logging */\n enableAuditLog: boolean;\n}\n\n/**\n * Dynamic roles manager implementation\n * Manages runtime role assignments with conditions and expiration\n */\nexport class DynamicRoles {\n private readonly config: DynamicRolesConfig;\n private readonly assignments = new Map<string, DynamicRoleAssignment>();\n private readonly userAssignments = new Map<string, Set<string>>();\n private readonly conditionEvaluators = new Map<string, RoleConditionEvaluator>();\n private cleanupTimer?: globalThis.NodeJS.Timeout;\n\n constructor(config: Partial<DynamicRolesConfig> = {}) {\n this.config = {\n enableExpiration: true,\n defaultTTL: 86400, // 24 hours\n enableConditions: true,\n maxAssignmentsPerUser: 50,\n enableAuditLog: true,\n ...config\n };\n\n // Start cleanup timer if expiration is enabled\n if (this.config.enableExpiration) {\n this.startCleanupTimer();\n }\n }\n\n /**\n * Assign role to user\n * @param userId - User identifier\n * @param roleId - Role identifier\n * @param conditions - Assignment conditions\n * @param expiresAt - Assignment expiration\n * @param assignedBy - Assigning user ID\n * @param reason - Assignment reason\n * @returns Assignment ID\n */\n // eslint-disable-next-line max-params\n async assignRole(\n userId: string,\n roleId: string,\n conditions?: Record<string, string>,\n expiresAt?: Date,\n assignedBy?: string,\n reason?: string\n ): Promise<string> {\n // Check assignment limits\n await this.enforceAssignmentLimits(userId);\n\n // Generate assignment ID\n const assignmentId = this.generateAssignmentId();\n\n // Create assignment\n const assignment: DynamicRoleAssignment = {\n id: assignmentId,\n userId,\n roleId,\n conditions,\n expiresAt: expiresAt ?? (this.config.enableExpiration ? \n new Date(Date.now() + this.config.defaultTTL * NUMERIX.THOUSAND) : undefined),\n reason,\n assignedBy,\n createdAt: new Date(),\n isActive: true\n };\n\n // Store assignment\n this.assignments.set(assignmentId, assignment);\n\n // Track user assignments\n if (!this.userAssignments.has(userId)) {\n this.userAssignments.set(userId, new Set());\n }\n this.userAssignments.get(userId)!.add(assignmentId);\n\n // Emit event\n if (this.config.enableAuditLog) {\n this.emitRoleAssignedEvent(assignment);\n }\n\n return assignmentId;\n }\n\n /**\n * Assign temporary role to user\n * @param userId - User identifier\n * @param roleId - Role identifier\n * @param conditions - Assignment conditions\n * @param duration - Duration in seconds\n * @param assignedBy - Assigning user ID\n * @param reason - Assignment reason\n * @returns Assignment ID\n */\n // eslint-disable-next-line max-params\n async assignTemporaryRole(\n userId: string,\n roleId: string,\n conditions?: Record<string, string>,\n duration: number = this.config.defaultTTL,\n assignedBy?: string,\n reason?: string\n ): Promise<string> {\n const expiresAt = new Date(Date.now() + duration * NUMERIX.THOUSAND);\n \n return await this.assignRole(\n userId,\n roleId,\n conditions,\n expiresAt,\n assignedBy,\n reason ?? 'Temporary assignment'\n );\n }\n\n /**\n * Revoke role assignment\n * @param assignmentId - Assignment identifier\n * @param revokedBy - Revoking user ID\n * @param reason - Revocation reason\n */\n async revokeAssignment(\n assignmentId: string,\n revokedBy?: string,\n reason?: string\n ): Promise<void> {\n const assignment = this.assignments.get(assignmentId);\n \n if (!assignment?.isActive) {\n return;\n }\n\n // Deactivate assignment\n assignment.isActive = false;\n assignment.metadata = {\n ...assignment.metadata,\n\n };\n\n // Remove from user assignments tracking\n const userAssignmentSet = this.userAssignments.get(assignment.userId);\n if (userAssignmentSet) {\n userAssignmentSet.delete(assignmentId);\n if (userAssignmentSet.size === 0) {\n this.userAssignments.delete(assignment.userId);\n }\n }\n\n // Emit event\n if (this.config.enableAuditLog) {\n this.emitRoleRevokedEvent(assignment, revokedBy, reason);\n }\n }\n\n /**\n * Revoke all role assignments for user\n * @param userId - User identifier\n * @param revokedBy - Revoking user ID\n * @param reason - Revocation reason\n */\n async revokeAllUserAssignments(\n userId: string,\n revokedBy?: string,\n reason?: string\n ): Promise<void> {\n const userAssignmentSet = this.userAssignments.get(userId);\n \n if (!userAssignmentSet) {\n return;\n }\n\n const assignmentIds = Array.from(userAssignmentSet);\n \n for (const assignmentId of assignmentIds) {\n await this.revokeAssignment(assignmentId, revokedBy, reason);\n }\n }\n\n /**\n * Get active roles for user\n * @param userId - User identifier\n * @param context - Evaluation context for conditions\n * @returns Array of active role IDs\n */\n async getUserRoles(userId: string, context?: Record<string, string>): Promise<string[]> {\n const userAssignmentSet = this.userAssignments.get(userId);\n \n if (!userAssignmentSet) {\n return [];\n }\n\n const activeRoles: string[] = [];\n const now = new Date();\n\n for (const assignmentId of userAssignmentSet) {\n const assignment = this.assignments.get(assignmentId);\n \n if (!assignment?.isActive) {\n continue;\n }\n\n // Check expiration\n if (assignment.expiresAt && assignment.expiresAt < now) {\n await this.revokeAssignment(assignmentId, undefined, 'Expired');\n continue;\n }\n\n // Check conditions\n if (this.config.enableConditions && assignment.conditions) {\n const conditionsMet = await this.evaluateConditions(\n userId,\n assignment.conditions,\n context\n );\n \n if (!conditionsMet) {\n continue;\n }\n }\n\n activeRoles.push(assignment.roleId);\n }\n\n return activeRoles;\n }\n\n /**\n * Check if user has specific role\n * @param userId - User identifier\n * @param roleId - Role identifier\n * @param context - Evaluation context for conditions\n * @returns True if user has role\n */\n async hasRole(userId: string, roleId: string, context?: Record<string, string>): Promise<boolean> {\n const userRoles = await this.getUserRoles(userId, context);\n return userRoles.includes(roleId);\n }\n\n /**\n * Get assignment details\n * @param assignmentId - Assignment identifier\n * @returns Assignment details or null\n */\n getAssignment(assignmentId: string): DynamicRoleAssignment | null {\n return this.assignments.get(assignmentId) ?? null;\n }\n\n /**\n * Get all assignments for user\n * @param userId - User identifier\n * @param includeInactive - Include inactive assignments\n * @returns Array of assignments\n */\n getUserAssignments(userId: string, includeInactive = false): DynamicRoleAssignment[] {\n const userAssignmentSet = this.userAssignments.get(userId);\n \n if (!userAssignmentSet) {\n return [];\n }\n\n const assignments: DynamicRoleAssignment[] = [];\n\n for (const assignmentId of userAssignmentSet) {\n const assignment = this.assignments.get(assignmentId);\n \n if (assignment && (includeInactive || assignment.isActive)) {\n assignments.push(assignment);\n }\n }\n\n return assignments;\n }\n\n /**\n * Register condition evaluator\n * @param conditionType - Condition type name\n * @param evaluator - Evaluator function\n */\n registerConditionEvaluator(conditionType: string, evaluator: RoleConditionEvaluator): void {\n this.conditionEvaluators.set(conditionType, evaluator);\n }\n\n /**\n * Extend assignment expiration\n * @param assignmentId - Assignment identifier\n * @param newExpiresAt - New expiration date\n */\n async extendAssignment(assignmentId: string, newExpiresAt: Date): Promise<void> {\n const assignment = this.assignments.get(assignmentId);\n \n if (!assignment?.isActive) {\n throw new Error('Assignment not found or inactive');\n }\n\n assignment.expiresAt = newExpiresAt;\n assignment.metadata = {\n ...assignment.metadata,\n extendedAt: new Date().toString()\n };\n }\n\n /**\n * Clean up expired assignments\n * @returns Number of cleaned assignments\n */\n async cleanupExpiredAssignments(): Promise<number> {\n let cleanedCount = 0;\n const now = new Date();\n const expiredAssignments: string[] = [];\n\n for (const [assignmentId, assignment] of this.assignments.entries()) {\n if (assignment.isActive && assignment.expiresAt && assignment.expiresAt < now) {\n expiredAssignments.push(assignmentId);\n }\n }\n\n for (const assignmentId of expiredAssignments) {\n await this.revokeAssignment(assignmentId, undefined, 'Expired');\n cleanedCount++;\n }\n\n return cleanedCount;\n }\n\n /**\n * Get assignment statistics\n * @returns Assignment statistics\n */\n getStats(): {\n totalAssignments: number;\n activeAssignments: number;\n expiredAssignments: number;\n usersWithAssignments: number;\n } {\n let activeCount = 0;\n let expiredCount = 0;\n const now = new Date();\n\n for (const assignment of this.assignments.values()) {\n if (assignment.isActive) {\n if (assignment.expiresAt && assignment.expiresAt < now) {\n expiredCount++;\n } else {\n activeCount++;\n }\n }\n }\n\n return {\n totalAssignments: this.assignments.size,\n activeAssignments: activeCount,\n expiredAssignments: expiredCount,\n usersWithAssignments: this.userAssignments.size\n };\n }\n\n /**\n * Destroy dynamic roles manager\n */\n destroy(): void {\n if (this.cleanupTimer) {\n globalThis.clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n\n this.assignments.clear();\n this.userAssignments.clear();\n this.conditionEvaluators.clear();\n }\n\n /**\n * Evaluate assignment conditions\n * @param userId - User identifier\n * @param conditions - Assignment conditions\n * @param context - Evaluation context\n * @returns True if conditions are met\n * @private\n */\n private async evaluateConditions(\n userId: string,\n conditions: Record<string, string>,\n context?: Record<string, string>\n ): Promise<boolean> {\n for (const [conditionType, conditionValue] of Object.entries(conditions)) {\n const evaluator = this.conditionEvaluators.get(conditionType);\n \n if (evaluator) {\n const result = await evaluator(userId, { [conditionType]: conditionValue }, context);\n if (!result) {\n return false;\n }\n } else {\n // Default evaluation: simple equality check with context\n if (context && context[conditionType] !== conditionValue) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Enforce assignment limits per user\n * @param userId - User identifier\n * @private\n */\n private async enforceAssignmentLimits(userId: string): Promise<void> {\n const userAssignments = this.getUserAssignments(userId, false);\n \n if (userAssignments.length >= this.config.maxAssignmentsPerUser) {\n throw new Error(`Maximum assignments per user exceeded: ${this.config.maxAssignmentsPerUser}`);\n }\n }\n\n /**\n * Generate unique assignment ID\n * @returns Assignment identifier\n * @private\n */\n private generateAssignmentId(): string {\n return `dyn_${Date.now()}_${Math.random().toString(NUMERIX.THIRTY_SIX).substr(NUMERIX.TWO, NUMERIX.NINE)}`;\n }\n\n /**\n * Start cleanup timer for expired assignments\n * @private\n */\n private startCleanupTimer(): void {\n // Run cleanup every 5 minutes\n this.cleanupTimer = globalThis.setInterval(async () => {\n await this.cleanupExpiredAssignments();\n }, NUMERIX.FIVE * NUMERIX.SIXTY * NUMERIX.THOUSAND);\n }\n\n /**\n * Emit role assigned event\n * @param assignment - Role assignment\n * @private\n */\n private emitRoleAssignedEvent(assignment: DynamicRoleAssignment): void {\n // Mock event emission - in real implementation would use event system\n globalThis.console.log(`Event: ${AUTH_EVENTS.ROLE_ASSIGNED}`, {\n userId: assignment.userId,\n roleId: assignment.roleId,\n assignmentId: assignment.id,\n assignedBy: assignment.assignedBy,\n timestamp: assignment.createdAt\n });\n }\n\n /**\n * Emit role revoked event\n * @param assignment - Role assignment\n * @param revokedBy - Revoking user ID\n * @param reason - Revocation reason\n * @private\n */\n private emitRoleRevokedEvent(\n assignment: DynamicRoleAssignment,\n revokedBy?: string,\n reason?: string\n ): void {\n // Mock event emission - in real implementation would use event system\n globalThis.console.log(`Event: ${AUTH_EVENTS.ROLE_REVOKED}`, {\n userId: assignment.userId,\n roleId: assignment.roleId,\n assignmentId: assignment.id,\n revokedBy,\n reason,\n timestamp: new Date()\n });\n }\n}","import type {\n CanActivate,\n ExecutionContext} from \"@nestjs/common\";\nimport {\n Injectable,\n BadRequestException,\n} from \"@nestjs/common\";\nimport type { RateLimiterService } from \"../services/rate-limiter.service\";\n\n@Injectable()\nexport class RateLimiterGuard implements CanActivate {\n constructor(private readonly rateLimiterService: RateLimiterService) {}\n\n async canActivate(context: ExecutionContext): Promise<boolean> {\n const req = context.switchToHttp().getRequest();\n\n // Get IP address from headers or socket\n const ip =\n req.headers[\"x-forwarded-for\"]?.split(\",\")[0] ??\n req.ip ??\n req.socket?.remoteAddress;\n const identifier = `${ip}`;\n\n // Construct route key, e.g., \"POST /auth/signin\"\n const routeKey = `${req.method} ${req.route.path}`;\n\n // Get rate limit options for this route\n const options = this.rateLimiterService.getOption(routeKey);\n\n // If no rate limit configured, allow request\n if (options === undefined) return true;\n\n // Check if the request is rate limited\n const isLimited = await this.rateLimiterService.isRateLimited(\n identifier,\n options\n );\n\n if (isLimited)\n throw new BadRequestException(\n \"Too many requests, please try again later\"\n );\n\n return true;\n }\n}\n","\nimport { Controller, UseGuards } from \"@nestjs/common\";\nimport { RateLimiterGuard } from \"../../../server/guards/custom-throttler.guard\";\n\n\n@Controller(\"auth\")\nexport class AuthController {\n @UseGuards(RateLimiterGuard)\n testAuthEndPoint() : {message:string} {\n return { message: 'Test endpoint works' };\n }\n}\n","import { Injectable } from '@nestjs/common';\n\nimport type { SessionManager } from '../../core/session/session.manager';\nimport type { TraditionalAuthStrategy } from '../../strategies/traditional-auth.strategy';\nimport type { OAuthStrategy, OAuthProfile } from '../../strategies/oauth.strategy';\nimport type { UserRepository } from '../../db/repositories/user.repository';\nimport type { User, AuthTokens } from '../../common/types/auth.types';\nimport type { Session } from '@plyaz/types';\nimport type { JwtManager } from '@/core/jwt/jwt.manager';\n\n\n@Injectable()\nexport class AuthService {\n // eslint-disable-next-line max-params\n constructor(\n private jwtManager:JwtManager,\n private sessionManager: SessionManager,\n private traditionalAuth: TraditionalAuthStrategy,\n private oauthAuth: OAuthStrategy,\n private userRepo: UserRepository\n ) {}\n\n async signIn(email: string, password: string, deviceInfo: Record<string,unknown>): Promise<{ user: User; tokens: AuthTokens; session: Session }> {\n const user = await this.traditionalAuth.authenticate(email, password);\n const session = await this.sessionManager.createSession(user.id, deviceInfo);\n const tokens = this.jwtManager.generateTokens(user);\n \n await this.userRepo.updateLastLogin(user.id);\n \n return { user, tokens: { ...tokens, refreshToken: tokens.refreshToken ?? '' }, session };\n }\n\n async signUp(userData: Partial<User>, password: string): Promise<User> {\n const passwordHash = await this.traditionalAuth.hashPassword(password);\n \n return this.userRepo.create({\n email: userData.email!,\n displayName: userData.displayName!,\n passwordHash,\n authProvider: 'email',\n isActive: true,\n ...userData,\n });\n }\n\n async signOut(sessionId: string): Promise<void> {\n await this.sessionManager.invalidateSession(sessionId);\n }\n\n async signOutAll(userId: string): Promise<void> {\n await this.sessionManager.invalidateAllUserSessions(userId);\n }\n\n async refreshToken(refreshToken: string): Promise<AuthTokens> {\n const payload = this.jwtManager.verifyRefreshToken(refreshToken);\n const user = await this.userRepo.findById(payload.sub);\n \n if (!user?.isActive) {\n throw new Error('Invalid refresh token');\n }\n\n const tokens = this.jwtManager.generateTokens(user);\n return { ...tokens, refreshToken: tokens.refreshToken ?? '' };\n }\n\n async validateUser(userId: string): Promise<User | null> {\n return this.userRepo.findById(userId);\n }\n\n async oauthSignIn(profile: OAuthProfile, accessToken: string, refreshToken?: string, deviceInfo?: Record<string,unknown>): Promise<{ user: User; tokens: AuthTokens; session: Session }> {\n const user = await this.oauthAuth.authenticate(profile, accessToken, refreshToken);\n const session = await this.sessionManager.createSession(user.id, deviceInfo ?? {});\n const tokens = this.jwtManager.generateTokens(user);\n \n await this.userRepo.updateLastLogin(user.id);\n \n return { user, tokens: { ...tokens, refreshToken: tokens.refreshToken ?? '' }, session };\n }\n}","/**\n * @fileoverview Session service for @plyaz/auth\n * @module @plyaz/auth/server/services/session-service\n * \n * @description\n * NestJS service for session management operations. Provides high-level\n * session operations for controllers and other services. Wraps the\n * EnhancedSessionManager with NestJS dependency injection and logging.\n * \n * @example\n * ```typescript\n * import { SessionService } from '@plyaz/auth';\n * \n * @Controller('auth')\n * export class AuthController {\n * constructor(private sessionService: SessionService) {}\n * \n * @Post('logout-all')\n * async logoutAll(@CurrentUser() user) {\n * await this.sessionService.invalidateAllUserSessions(user.id);\n * }\n * }\n * ```\n */\n\nimport { Injectable, Logger } from '@nestjs/common';\nimport type { EnhancedSessionManager, UserContext, SessionCreationData } from '../../session/enhanced-session-manager';\n\nimport type { Session, SessionData } from '@plyaz/types';\nimport { AUTH_EVENTS } from '@plyaz/types';\n\n/**\n * Session service implementation\n * Provides session management operations for NestJS applications\n */\n@Injectable()\nexport class SessionService {\n private readonly logger = new Logger(SessionService.name);\n\n constructor(private sessionManager: EnhancedSessionManager) {}\n\n /**\n * Create a new session\n * @param userContext - User context information\n * @param sessionData - Session creation data\n * @returns Created session\n */\n async createSession(userContext: UserContext, sessionData: SessionCreationData = {}): Promise<Session> {\n this.logger.debug(`Creating session for user: ${userContext.userId}`);\n \n try {\n const session = await this.sessionManager.createSession(userContext, sessionData);\n \n this.logger.log(`Session created: ${session.id} for user: ${userContext.userId}`);\n this.emitEvent(AUTH_EVENTS.SESSION_CREATED, {\n userId: userContext.userId,\n sessionId: session.id,\n timestamp: new Date()\n });\n \n return session;\n } catch (error) {\n this.logger.error(`Failed to create session for user: ${userContext.userId}`, error);\n throw error;\n }\n }\n\n /**\n * Get session by ID\n * @param sessionId - Session identifier\n * @returns Session or null if not found\n */\n async getSession(sessionId: string): Promise<Session | null> {\n this.logger.debug(`Getting session: ${sessionId}`);\n \n try {\n return await this.sessionManager.getSession(sessionId);\n } catch (error) {\n this.logger.error(`Failed to get session: ${sessionId}`, error);\n throw error;\n }\n }\n\n /**\n * Validate session\n * @param sessionId - Session identifier\n * @returns True if session is valid\n */\n async validateSession(sessionId: string): Promise<boolean> {\n this.logger.debug(`Validating session: ${sessionId}`);\n \n try {\n const isValid = await this.sessionManager.validateSession(sessionId);\n \n if (!isValid) {\n this.logger.warn(`Invalid session: ${sessionId}`);\n }\n \n return isValid;\n } catch (error) {\n this.logger.error(`Failed to validate session: ${sessionId}`, error);\n return false;\n }\n }\n\n /**\n * Refresh session\n * @param sessionId - Session identifier\n * @returns Refreshed session\n */\n async refreshSession(sessionId: string): Promise<Session> {\n this.logger.debug(`Refreshing session: ${sessionId}`);\n \n try {\n const session = await this.sessionManager.refreshSession(sessionId);\n \n this.logger.log(`Session refreshed: ${sessionId}`);\n this.emitEvent(AUTH_EVENTS.SESSION_REFRESHED, {\n userId: session.userId,\n sessionId: session.id,\n timestamp: new Date()\n });\n \n return session;\n } catch (error) {\n this.logger.error(`Failed to refresh session: ${sessionId}`, error);\n throw error;\n }\n }\n\n /**\n * Update session data\n * @param sessionId - Session identifier\n * @param updates - Partial session updates\n * @returns Updated session\n */\n async updateSession(sessionId: string, updates:Partial<SessionData>): Promise<Session> {\n this.logger.debug(`Updating session: ${sessionId}`);\n \n try {\n return await this.sessionManager.updateSession(sessionId, updates);\n } catch (error) {\n this.logger.error(`Failed to update session: ${sessionId}`, error);\n throw error;\n }\n }\n\n /**\n * Delete session\n * @param sessionId - Session identifier\n */\n async deleteSession(sessionId: string): Promise<void> {\n this.logger.debug(`Deleting session: ${sessionId}`);\n \n try {\n await this.sessionManager.deleteSession(sessionId);\n \n this.logger.log(`Session deleted: ${sessionId}`);\n this.emitEvent(AUTH_EVENTS.SESSION_INVALIDATED, {\n sessionId,\n timestamp: new Date()\n });\n } catch (error) {\n this.logger.error(`Failed to delete session: ${sessionId}`, error);\n throw error;\n }\n }\n\n /**\n * Invalidate all sessions for a user\n * @param userId - User identifier\n */\n async invalidateAllUserSessions(userId: string): Promise<void> {\n this.logger.debug(`Invalidating all sessions for user: ${userId}`);\n \n try {\n await this.sessionManager.invalidateAllUserSessions(userId);\n \n this.logger.log(`All sessions invalidated for user: ${userId}`);\n this.emitEvent(AUTH_EVENTS.SESSION_INVALIDATED, {\n userId,\n timestamp: new Date()\n });\n } catch (error) {\n this.logger.error(`Failed to invalidate all sessions for user: ${userId}`, error);\n throw error;\n }\n }\n\n /**\n * Detect concurrent sessions for a user\n * @param userId - User identifier\n * @returns Array of active sessions\n */\n async detectConcurrentSessions(userId: string): Promise<Session[]> {\n this.logger.debug(`Detecting concurrent sessions for user: ${userId}`);\n \n try {\n return await this.sessionManager.detectConcurrentSessions(userId);\n } catch (error) {\n this.logger.error(`Failed to detect concurrent sessions for user: ${userId}`, error);\n throw error;\n }\n }\n\n /**\n * Generate CSRF token for session\n * @param sessionId - Session identifier\n * @returns CSRF token\n */\n async generateCsrfToken(sessionId: string): Promise<string> {\n this.logger.debug(`Generating CSRF token for session: ${sessionId}`);\n \n try {\n return await this.sessionManager.generateCsrfToken(sessionId);\n } catch (error) {\n this.logger.error(`Failed to generate CSRF token for session: ${sessionId}`, error);\n throw error;\n }\n }\n\n /**\n * Validate CSRF token for session\n * @param sessionId - Session identifier\n * @param token - CSRF token to validate\n * @returns True if token is valid\n */\n async validateCsrfToken(sessionId: string, token: string): Promise<boolean> {\n this.logger.debug(`Validating CSRF token for session: ${sessionId}`);\n \n try {\n const isValid = await this.sessionManager.validateCsrfToken(sessionId, token);\n \n if (!isValid) {\n this.logger.warn(`Invalid CSRF token for session: ${sessionId}`);\n }\n \n return isValid;\n } catch (error) {\n this.logger.error(`Failed to validate CSRF token for session: ${sessionId}`, error);\n return false;\n }\n }\n\n /**\n * Check if session needs refresh\n * @param sessionId - Session identifier\n * @returns True if session should be refreshed\n */\n async shouldRefreshSession(sessionId: string): Promise<boolean> {\n try {\n return await this.sessionManager.shouldRefreshSession(sessionId);\n } catch (error) {\n this.logger.error(`Failed to check if session needs refresh: ${sessionId}`, error);\n return false;\n }\n }\n\n /**\n * Get session statistics\n * @returns Session statistics\n */\n async getSessionStats(): Promise<{\n totalSessions: number;\n activeUsers: number;\n }> {\n this.logger.debug('Getting session statistics');\n \n try {\n return await this.sessionManager.getSessionStats();\n } catch (error) {\n this.logger.error('Failed to get session statistics', error);\n throw error;\n }\n }\n\n /**\n * Emit event (mock implementation)\n * @param eventType - Event type\n * @param payload - Event payload\n * @private\n */\n private emitEvent(eventType: string, payload:unknown): void {\n // Mock event emission - in real implementation would use event system\n this.logger.debug(`Event: ${eventType}`, payload);\n }\n}","/**\n * @fileoverview Token service for @plyaz/auth\n * @module @plyaz/auth/server/services/token-service\n * \n * @description\n * NestJS service for token management operations. Provides high-level\n * token operations including validation, refresh, and revocation.\n * Wraps TokenValidator and RefreshTokenManager with NestJS integration.\n * \n * @example\n * ```typescript\n * import { TokenService } from '@plyaz/auth';\n * \n * @Injectable()\n * export class AuthService {\n * constructor(private tokenService: TokenService) {}\n * \n * async validateRequest(token: string) {\n * return await this.tokenService.validateAccessToken(token);\n * }\n * }\n * ```\n */\n\nimport { Injectable, Logger } from '@nestjs/common';\nimport type { TokenValidator, ValidatedTokenPayload, TokenValidationResult } from '../../tokens/token-validator';\nimport type { RefreshTokenManager, TokenPair } from '../../tokens/refresh-token-manager';\n\n/**\n * Token service implementation\n * Provides token management operations for NestJS applications\n */\n@Injectable()\nexport class TokenService {\n private readonly logger = new Logger(TokenService.name);\n\n constructor(\n private tokenValidator: TokenValidator,\n private refreshTokenManager: RefreshTokenManager\n ) {}\n\n /**\n * Validate access token\n * @param token - Access token to validate\n * @returns Validation result with payload or error\n */\n async validateAccessToken(token: string): Promise<TokenValidationResult> {\n this.logger.debug('Validating access token');\n \n try {\n const result = await this.tokenValidator.validateAccessToken(token);\n \n if (!result.valid) {\n this.logger.warn(`Access token validation failed: ${result.error?.message}`);\n }\n \n return result;\n } catch (error) {\n this.logger.error('Failed to validate access token', error);\n return {\n valid: false,\n error: {\n code: 'VALIDATION_ERROR',\n message: 'Token validation failed'\n }\n };\n }\n }\n\n /**\n * Validate refresh token\n * @param token - Refresh token to validate\n * @returns Validation result with payload or error\n */\n async validateRefreshToken(token: string): Promise<TokenValidationResult> {\n this.logger.debug('Validating refresh token');\n \n try {\n const result = await this.tokenValidator.validateRefreshToken(token);\n \n if (!result.valid) {\n this.logger.warn(`Refresh token validation failed: ${result.error?.message}`);\n }\n \n return result;\n } catch (error) {\n this.logger.error('Failed to validate refresh token', error);\n return {\n valid: false,\n error: {\n code: 'VALIDATION_ERROR',\n message: 'Token validation failed'\n }\n };\n }\n }\n\n /**\n * Generate new token pair\n * @param userId - User identifier\n * @param sessionId - Session identifier\n * @param userRoles - User roles for access token\n * @param userPermissions - User permissions for access token\n * @returns Token pair\n */\n async generateTokenPair(\n userId: string,\n sessionId: string,\n userRoles?: string[],\n userPermissions?: string[]\n ): Promise<TokenPair> {\n this.logger.debug(`Generating token pair for user: ${userId}`);\n \n try {\n const tokenPair = await this.refreshTokenManager.generateTokenPair(\n userId,\n sessionId,\n userRoles,\n userPermissions\n );\n \n this.logger.log(`Token pair generated for user: ${userId}`);\n return tokenPair;\n } catch (error) {\n this.logger.error(`Failed to generate token pair for user: ${userId}`, error);\n throw error;\n }\n }\n\n /**\n * Refresh token pair using refresh token\n * @param refreshToken - Current refresh token\n * @param userRoles - Updated user roles\n * @param userPermissions - Updated user permissions\n * @returns New token pair\n */\n async refreshTokenPair(\n refreshToken: string,\n userRoles?: string[],\n userPermissions?: string[]\n ): Promise<TokenPair> {\n this.logger.debug('Refreshing token pair');\n \n try {\n const tokenPair = await this.refreshTokenManager.refreshTokenPair(\n refreshToken,\n userRoles,\n userPermissions\n );\n \n this.logger.log('Token pair refreshed successfully');\n return tokenPair;\n } catch (error) {\n this.logger.error('Failed to refresh token pair', error);\n throw error;\n }\n }\n\n /**\n * Revoke refresh token\n * @param refreshToken - Refresh token to revoke\n */\n async revokeRefreshToken(refreshToken: string): Promise<void> {\n this.logger.debug('Revoking refresh token');\n \n try {\n await this.refreshTokenManager.revokeRefreshToken(refreshToken);\n this.logger.log('Refresh token revoked successfully');\n } catch (error) {\n this.logger.error('Failed to revoke refresh token', error);\n throw error;\n }\n }\n\n /**\n * Revoke all refresh tokens for a user\n * @param userId - User identifier\n */\n async revokeAllUserTokens(userId: string): Promise<void> {\n this.logger.debug(`Revoking all tokens for user: ${userId}`);\n \n try {\n await this.refreshTokenManager.revokeAllUserTokens(userId);\n this.logger.log(`All tokens revoked for user: ${userId}`);\n } catch (error) {\n this.logger.error(`Failed to revoke all tokens for user: ${userId}`, error);\n throw error;\n }\n }\n\n /**\n * Revoke all refresh tokens for a session\n * @param sessionId - Session identifier\n */\n async revokeSessionTokens(sessionId: string): Promise<void> {\n this.logger.debug(`Revoking tokens for session: ${sessionId}`);\n \n try {\n await this.refreshTokenManager.revokeSessionTokens(sessionId);\n this.logger.log(`Tokens revoked for session: ${sessionId}`);\n } catch (error) {\n this.logger.error(`Failed to revoke tokens for session: ${sessionId}`, error);\n throw error;\n }\n }\n\n /**\n * Extract token payload without validation\n * @param token - JWT token\n * @returns Decoded payload or null\n */\n extractTokenPayload(token: string): ValidatedTokenPayload | null {\n try {\n return this.tokenValidator.extractPayload(token);\n } catch (error) {\n this.logger.error('Failed to extract token payload', error);\n return null;\n }\n }\n\n /**\n * Check if token is expired\n * @param token - JWT token\n * @returns True if token is expired\n */\n isTokenExpired(token: string): boolean {\n try {\n return this.tokenValidator.isTokenExpired(token);\n } catch (error) {\n this.logger.error('Failed to check token expiration', error);\n return true;\n }\n }\n\n /**\n * Get token expiration time\n * @param token - JWT token\n * @returns Expiration date or null\n */\n getTokenExpiration(token: string): Date | null {\n try {\n return this.tokenValidator.getTokenExpiration(token);\n } catch (error) {\n this.logger.error('Failed to get token expiration', error);\n return null;\n }\n }\n\n /**\n * Get time until token expires\n * @param token - JWT token\n * @returns Seconds until expiration or null\n */\n getTimeUntilExpiration(token: string): number | null {\n try {\n return this.tokenValidator.getTimeUntilExpiration(token);\n } catch (error) {\n this.logger.error('Failed to get time until expiration', error);\n return null;\n }\n }\n}","/**\n * @fileoverview Account service for @plyaz/auth\n * @module @plyaz/auth/server/services/account-service\n * \n * @description\n * NestJS service for connected account management operations.\n * Provides high-level operations for linking/unlinking provider accounts,\n * managing primary accounts, and handling account-related business logic.\n * \n * @example\n * ```typescript\n * import { AccountService } from '@plyaz/auth';\n * \n * @Controller('accounts')\n * export class AccountsController {\n * constructor(private accountService: AccountService) {}\n * \n * @Post('link')\n * async linkAccount(@Body() data, @CurrentUser() user) {\n * return await this.accountService.link(user.id, data.provider, data);\n * }\n * }\n * ```\n */\n\nimport { Injectable, Logger } from '@nestjs/common';\nimport type { ConnectedAccountRepository } from '../../db/repositories/connected-account.repository';\n\nimport type { ConnectedAccount } from '@plyaz/types';\nimport { AUTH_EVENTS } from '@plyaz/types';\n\n/**\n * Account service implementation\n * Provides connected account management operations for NestJS applications\n */\n@Injectable()\nexport class AccountService {\n private readonly logger = new Logger(AccountService.name);\n\n constructor(private accountRepository: ConnectedAccountRepository) {}\n\n /**\n * Link account to user\n * INSERT new connected account and emit account.linked event\n * @param userId - User identifier\n * @param provider - Provider name\n * @param providerData - Provider account data\n * @returns Created connected account\n */\n\n async link(userId: string, provider: string, providerData: ConnectedAccount): Promise<ConnectedAccount> {\n this.logger.debug(`Linking ${provider} account for user: ${userId}`);\n \n try {\n \n\n // Link the account\n const connectedAccount = await this.accountRepository.linkAccount(\n userId,\n provider,\n providerData\n );\n \n this.logger.log(`${provider} account linked for user: ${userId}`);\n this.emitEvent(AUTH_EVENTS.ACCOUNT_LINKED, {\n userId,\n provider,\n accountId: connectedAccount.id,\n timestamp: new Date()\n });\n \n return connectedAccount;\n } catch (error) {\n this.logger.error(`Failed to link ${provider} account for user: ${userId}`, error);\n throw error;\n }\n }\n\n /**\n * Unlink account from user\n * DELETE connected account with validation and emit account.unlinked event\n * @param userId - User identifier\n * @param accountId - Account identifier\n */\n async unlink(userId: string, accountId: string): Promise<void> {\n this.logger.debug(`Unlinking account ${accountId} for user: ${userId}`);\n \n try {\n // Get account details\n const account = await this.accountRepository.findById(accountId);\n if (!account) {\n // throw new UserNotFoundError('Connected account not found');\n }\n\n // Verify account belongs to user\n if (account?.userId !== userId) {\n throw new Error('Account does not belong to user');\n }\n\n // Unlink the account (includes validation for last auth method)\n await this.accountRepository.unlinkAccount(accountId);\n \n this.logger.log(`Account ${accountId} unlinked for user: ${userId}`);\n this.emitEvent(AUTH_EVENTS.ACCOUNT_UNLINKED, {\n userId,\n provider: account?.provider,\n accountId,\n timestamp: new Date()\n });\n } catch (error) {\n this.logger.error(`Failed to unlink account ${accountId} for user: ${userId}`, error);\n throw error;\n }\n }\n\n /**\n * Get all connected accounts for user\n * @param userId - User identifier\n * @returns Array of connected accounts\n */\n async getAll(userId: string): Promise<ConnectedAccount[]> {\n this.logger.debug(`Getting all accounts for user: ${userId}`);\n \n try {\n return await this.accountRepository.findByUserId(userId);\n } catch (error) {\n this.logger.error(`Failed to get accounts for user: ${userId}`, error);\n throw error;\n }\n }\n\n /**\n * Set primary connected account\n * @param userId - User identifier\n * @param accountId - Account identifier to set as primary\n */\n async setPrimary(userId: string, accountId: string): Promise<void> {\n this.logger.debug(`Setting primary account ${accountId} for user: ${userId}`);\n \n try {\n // Verify account belongs to user\n const account = await this.accountRepository.findById(accountId);\n if (account?.userId !== userId) {\n throw new Error('Account not found or does not belong to user');\n }\n\n // Set as primary\n await this.accountRepository.setPrimary(userId, accountId);\n \n this.logger.log(`Primary account set to ${accountId} for user: ${userId}`);\n } catch (error) {\n this.logger.error(`Failed to set primary account ${accountId} for user: ${userId}`, error);\n throw error;\n }\n }\n\n /**\n * Get primary connected account for user\n * @param userId - User identifier\n * @returns Primary connected account or null\n */\n async getPrimary(userId: string): Promise<ConnectedAccount | null> {\n this.logger.debug(`Getting primary account for user: ${userId}`);\n \n try {\n return await this.accountRepository.findPrimary(userId);\n } catch (error) {\n this.logger.error(`Failed to get primary account for user: ${userId}`, error);\n throw error;\n }\n }\n\n /**\n * Find account by provider credentials\n * @param provider - Provider name\n * @param providerAccountId - Provider account ID\n * @returns Connected account or null\n */\n async findByProvider(provider: string, providerAccountId: string): Promise<ConnectedAccount | null> {\n this.logger.debug(`Finding account by provider: ${provider}, ID: ${providerAccountId}`);\n \n try {\n return await this.accountRepository.findByProvider(provider, providerAccountId);\n } catch (error) {\n this.logger.error(`Failed to find account by provider: ${provider}`, error);\n throw error;\n }\n }\n\n /**\n * Update account tokens\n * @param accountId - Account identifier\n * @param accessToken - New access token\n * @param refreshToken - New refresh token (optional)\n */\n async updateTokens(accountId: string, accessToken: string, refreshToken?: string): Promise<void> {\n this.logger.debug(`Updating tokens for account: ${accountId}`);\n \n try {\n await this.accountRepository.updateTokens(accountId, accessToken, refreshToken);\n this.logger.log(`Tokens updated for account: ${accountId}`);\n } catch (error) {\n this.logger.error(`Failed to update tokens for account: ${accountId}`, error);\n throw error;\n }\n }\n\n /**\n * Get account by ID\n * @param accountId - Account identifier\n * @returns Connected account or null\n */\n async getById(accountId: string): Promise<ConnectedAccount | null> {\n this.logger.debug(`Getting account by ID: ${accountId}`);\n \n try {\n return await this.accountRepository.findById(accountId);\n } catch (error) {\n this.logger.error(`Failed to get account by ID: ${accountId}`, error);\n throw error;\n }\n }\n\n /**\n * Check if user has account with provider\n * @param userId - User identifier\n * @param provider - Provider name\n * @returns True if user has account with provider\n */\n async hasProviderAccount(userId: string, provider: string): Promise<boolean> {\n this.logger.debug(`Checking if user ${userId} has ${provider} account`);\n \n try {\n const accounts = await this.accountRepository.findByUserId(userId);\n return accounts.some(account => account.provider === provider && account.isActive);\n } catch (error) {\n this.logger.error(`Failed to check provider account for user: ${userId}`, error);\n return false;\n }\n }\n\n /**\n * Get account count for user\n * @param userId - User identifier\n * @returns Number of connected accounts\n */\n async getAccountCount(userId: string): Promise<number> {\n this.logger.debug(`Getting account count for user: ${userId}`);\n \n try {\n const accounts = await this.accountRepository.findByUserId(userId);\n return accounts.filter(account => account.isActive).length;\n } catch (error) {\n this.logger.error(`Failed to get account count for user: ${userId}`, error);\n return 0;\n }\n }\n\n /**\n * Emit event (mock implementation)\n * @param eventType - Event type\n * @param payload - Event payload\n * @private\n */\n private emitEvent(eventType: string, payload: unknown): void {\n // Mock event emission - in real implementation would use event system\n this.logger.debug(`Event: ${eventType}`, payload);\n }\n}","// src/security/rate-limiting/auth/brute-force.service.ts\nimport { Injectable, BadRequestException } from \"@nestjs/common\";\nimport { NUMERIX } from \"@plyaz/config\";\nimport type { Redis } from \"ioredis\";\n\nconst thirty = 30;\n@Injectable()\nexport class BruteForceService {\n private static readonly USER_HARD_LIMIT = 6;\n\n private static readonly USER_HARD_BLOCK_MS = thirty * NUMERIX.SIXTY * NUMERIX.THOUSAND; // 30 min\n private static readonly USER_PROGRESSIVE_DELAYS: Record<number, number> = { 4: 5000, 5: 5000 };\n\n private static readonly IP_HARD_LIMIT = 10;\n private static readonly IP_HARD_BLOCK_MS = NUMERIX.SIXTY * NUMERIX.SIXTY * NUMERIX.THOUSAND; // 1 hour\n\n private static readonly PROVIDER_HARD_LIMIT = 5;\n private static readonly PROVIDER_HARD_BLOCK_MS = thirty * NUMERIX.SIXTY * NUMERIX.THOUSAND; // 30 min\n\n constructor(private readonly redis: Redis) {}\n\n async trackFailedLogin(\n userId: string,\n ip: string,\n providerId?: string\n ): Promise<void> {\n // User-level progressive delay + hard block\n await this.trackEntity(\n `bf:user:${userId}`,\n `bf:user:block:${userId}`,\n BruteForceService.USER_HARD_LIMIT,\n BruteForceService.USER_HARD_BLOCK_MS,\n BruteForceService.USER_PROGRESSIVE_DELAYS\n );\n\n // IP-level block\n await this.trackEntity(\n `bf:ip:${ip}`,\n `bf:ip:block:${ip}`,\n BruteForceService.IP_HARD_LIMIT,\n BruteForceService.IP_HARD_BLOCK_MS\n );\n\n // Provider-level block (optional)\n if (providerId) {\n await this.trackEntity(\n `bf:provider:${providerId}`,\n `bf:provider:block:${providerId}`,\n BruteForceService.PROVIDER_HARD_LIMIT,\n BruteForceService.PROVIDER_HARD_BLOCK_MS\n );\n }\n }\n\n // eslint-disable-next-line max-params\n private async trackEntity(\n entityKey: string,\n blockKey: string,\n limit: number,\n blockMs: number,\n progressiveDelays?: Record<number, number>\n ): Promise<void> {\n const blockedUntil = await this.redis.get(blockKey);\n if (blockedUntil && Date.now() < Number(blockedUntil)) {\n throw new BadRequestException(\n \"Account temporarily blocked due to repeated failed attempts.\"\n );\n }\n\n const failures = await this.redis.incr(entityKey);\n if (failures === 1) await this.redis.pexpire(entityKey, blockMs);\n\n if (progressiveDelays?.[failures]) {\n await new Promise<void>((resolve) => {\n globalThis.setTimeout(resolve, progressiveDelays[failures]);\n });\n}\n\n\n if (failures >= limit) {\n await this.redis.set(blockKey, Date.now() + blockMs, \"PX\", blockMs);\n await this.redis.del(entityKey); // reset failures\n throw new BadRequestException(\n \"Account locked due to too many failed login attempts.\"\n );\n }\n }\n\n async reset(userId: string, ip: string, providerId?: string): Promise<void> {\n await this.redis.del(`bf:user:${userId}`, `bf:user:block:${userId}`);\n await this.redis.del(`bf:ip:${ip}`, `bf:ip:block:${ip}`);\n if (providerId)\n await this.redis.del(\n `bf:provider:${providerId}`,\n `bf:provider:block:${providerId}`\n );\n }\n}\n","import { Injectable } from \"@nestjs/common\";\nimport type { Redis } from \"ioredis\";\n\nexport interface RateLimiterOptions {\n windowMs: number; // time window in milliseconds\n limit: number; // max requests allowed in the window\n blockMs?: number; // optional block duration in milliseconds\n}\n\n@Injectable()\nexport class RateLimiterService {\n constructor(private readonly redis: Redis) {}\n\n getOption(routeKey: string): RateLimiterOptions {\n globalThis.console.log(routeKey)\n // Example placeholder, replace with your actual logic\n throw new Error(\"Method not implemented.\");\n }\n\n async isRateLimited(\n identifier: string,\n options: RateLimiterOptions\n ): Promise<boolean> {\n const rateKey = `rate:${identifier}`;\n const blockKey = `block:${identifier}`;\n\n // Check if user is already blocked\n const blockedUntil = await this.redis.get(blockKey);\n if (blockedUntil && Date.now() < Number(blockedUntil)) {\n return true;\n }\n\n // Increase request count\n const requests = await this.redis.incr(rateKey);\n\n // Set window expiry on first request\n if (requests === 1) {\n await this.redis.pexpire(rateKey, options.windowMs);\n }\n\n // Block user if limit exceeded\n if (requests > options.limit && options.blockMs) {\n const blockUntil = Date.now() + options.blockMs;\n\n await this.redis.set(blockKey, blockUntil.toString(), \"PX\", options.blockMs);\n await this.redis.del(rateKey); // reset counter\n\n return true;\n }\n\n return false;\n }\n\n async reset(identifier: string): Promise<void> {\n const rateKey = `rate:${identifier}`;\n const blockKey = `block:${identifier}`;\n\n await this.redis.del(rateKey, blockKey);\n }\n}\n","import { Module } from \"@nestjs/common\";\nimport { ThrottlerModule } from \"@nestjs/throttler\";\nimport { Redis } from \"ioredis\";\nimport { ThrottlerStorageRedisService } from \"@nest-lab/throttler-storage-redis\";\nimport { AuthController } from \"./auth/auth.controller\";\nimport { RateLimiterGuard } from \"../../server/guards/custom-throttler.guard\";\nimport { BruteForceService, RateLimiterService } from \"../../server/services\";\n\n\n@Module({\n imports: [\n ThrottlerModule.forRootAsync({\n useFactory: () => ({\n storage: new ThrottlerStorageRedisService(\n new Redis({\n host: \"localhost\",\n port: 6379,\n })\n ),\n throttlers: [\n {\n ttl: 60000,\n limit: 10,\n },\n ],\n }),\n }),\n ],\n controllers: [AuthController],\n providers: [RateLimiterGuard, RateLimiterService, BruteForceService],\n})\nexport class AuthModule {}\n","import { NUMERIX } from '@plyaz/config';\nimport { randomBytes } from 'crypto';\n\nexport class CSRFProtection {\n private tokens = new Map<string, { token: string; expires: number }>();\n\n generateToken(sessionId: string): string {\n const thirtyTwo = 32;\n const token = randomBytes(thirtyTwo).toString('hex');\n const expires = Date.now() + (NUMERIX.SIXTY * NUMERIX.SIXTY * NUMERIX.THOUSAND); // 1 hour\n \n this.tokens.set(sessionId, { token, expires });\n return token;\n }\n\n validateToken(sessionId: string, token: string): boolean {\n const stored = this.tokens.get(sessionId);\n if (!stored || stored.expires < Date.now()) {\n this.tokens.delete(sessionId);\n return false;\n }\n \n return stored.token === token;\n }\n\n removeToken(sessionId: string): void {\n this.tokens.delete(sessionId);\n }\n\n cleanup(): void {\n const now = Date.now();\n for (const [sessionId, data] of this.tokens.entries()) {\n if (data.expires < now) {\n this.tokens.delete(sessionId);\n }\n }\n }}\n","export interface AuditEvent {\n userId?: string;\n action: string;\n resource: string;\n resourceId?: string;\n ipAddress?: string;\n userAgent?: string;\n metadata?: Record<string, string>;\n timestamp: Date;\n}\n\nexport class AuditLogger {\n private events: AuditEvent[] = [];\n\n async log(event: Omit<AuditEvent, 'timestamp'>): Promise<void> {\n const auditEvent: AuditEvent = {\n ...event,\n timestamp: new Date()\n };\n\n this.events.push(auditEvent);\n \n // This would write to audit.audit_logs table\n globalThis.console.log('AUDIT:', JSON.stringify(auditEvent));\n }\n\n async logAuthEvent(action: string, userId?: string, metadata?: Record<string, string>): Promise<void> {\n await this.log({\n userId,\n action,\n resource: 'authentication',\n metadata\n });\n }\n\n async logPermissionEvent(action: string, userId: string, resource: string, resourceId?: string): Promise<void> {\n await this.log({\n userId,\n action,\n resource,\n resourceId\n });\n }\n\n getEvents(): AuditEvent[] {\n return [...this.events];\n }\n\n clearEvents(): void {\n this.events = [];\n }\n}","/**\n * @fileoverview Cookie-based session store for @plyaz/auth\n * @module @plyaz/auth/session/cookie-store\n * \n * @description\n * Implements session storage using HTTP cookies. Provides stateless session\n * management by storing session data directly in encrypted cookies.\n * Suitable for applications that don't require server-side session storage\n * or need to minimize server memory usage.\n * \n * @example\n * ```typescript\n * import { CookieStore } from '@plyaz/auth';\n * \n * const store = new CookieStore({\n * secretKey: 'your-secret-key',\n * cookieName: 'session',\n * secure: true\n * });\n * \n * await store.set('session_123', sessionData, 3600);\n * ```\n */\n\nimport { NUMERIX } from '@plyaz/config';\nimport type { SessionData, SessionStore, SessionStoreConfig } from '@plyaz/types';\nimport { createCipher, createDecipher } from 'crypto';\n\n/**\n * Cookie store configuration\n */\nexport interface CookieStoreConfig extends Partial<SessionStoreConfig> {\n /** Secret key for encryption */\n secretKey: string;\n /** Cookie name */\n cookieName: string;\n /** Cookie domain */\n domain?: string;\n /** Cookie path */\n path?: string;\n /** Secure flag (HTTPS only) */\n secure?: boolean;\n /** HttpOnly flag */\n httpOnly?: boolean;\n /** SameSite policy */\n sameSite?: 'strict' | 'lax' | 'none';\n}\n\n/**\n * Cookie-based session store implementation\n * Stores session data in encrypted HTTP cookies\n */\nexport class CookieStore implements SessionStore {\n private readonly config: Required<CookieStoreConfig>;\n private readonly sessions = new Map<string, SessionData>();\n\n constructor(config: CookieStoreConfig) {\n this.config = {\n defaultTTL: 3600,\n maxSessionsPerUser: 5,\n cleanupInterval: 300,\n keyPrefix: 'session:',\n domain: '',\n path: '/',\n secure: true,\n httpOnly: true,\n sameSite: 'lax',\n ...config\n };\n }\n\n /**\n * Store session data in cookie\n * @param sessionId - Session identifier\n * @param data - Session data to store\n * @param ttlSeconds - Time to live in seconds\n */\n async set(sessionId: string, data: SessionData, ttlSeconds: number): Promise<void> {\n // Store in memory for this implementation\n // In real implementation, this would set HTTP cookie\n this.sessions.set(sessionId, {\n ...data,\n expiresAt: new Date(Date.now() + ttlSeconds * NUMERIX.THOUSAND)\n });\n\n // Simulate cookie setting\n this.setCookie(sessionId, data, ttlSeconds);\n }\n\n /**\n * Retrieve session data from cookie\n * @param sessionId - Session identifier\n * @returns Session data or null if not found/expired\n */\n async get(sessionId: string): Promise<SessionData | null> {\n const data = this.sessions.get(sessionId);\n \n if (!data) {\n return null;\n }\n\n // Check expiration\n if (data.expiresAt < new Date()) {\n await this.delete(sessionId);\n return null;\n }\n\n return data;\n }\n\n /**\n * Delete session cookie\n * @param sessionId - Session identifier\n */\n async delete(sessionId: string): Promise<void> {\n this.sessions.delete(sessionId);\n // In real implementation, this would clear the cookie\n this.clearCookie(sessionId);\n }\n\n /**\n * Delete all sessions for a user\n * @param userId - User identifier\n * @returns Number of deleted sessions\n */\n async deleteByUserId(userId: string): Promise<number> {\n let deletedCount = 0;\n \n for (const [sessionId, data] of this.sessions.entries()) {\n if (data.userId === userId) {\n await this.delete(sessionId);\n deletedCount++;\n }\n }\n \n return deletedCount;\n }\n\n /**\n * Update session activity timestamp\n * @param sessionId - Session identifier\n */\n async updateActivity(sessionId: string): Promise<void> {\n const data = this.sessions.get(sessionId);\n if (data) {\n data.lastActivityAt = new Date();\n this.sessions.set(sessionId, data);\n }\n }\n\n /**\n * Check if session exists and is valid\n * @param sessionId - Session identifier\n * @returns True if session exists and is valid\n */\n async exists(sessionId: string): Promise<boolean> {\n const data = await this.get(sessionId);\n return data !== null;\n }\n\n /**\n * Get all active sessions for a user\n * @param userId - User identifier\n * @returns Array of session data\n */\n async getByUserId(userId: string): Promise<SessionData[]> {\n const userSessions: SessionData[] = [];\n \n for (const data of this.sessions.values()) {\n if (data.userId === userId && data.expiresAt > new Date()) {\n userSessions.push(data);\n }\n }\n \n return userSessions;\n }\n\n /**\n * Clean up expired sessions\n * @returns Number of cleaned sessions\n */\n async cleanup(): Promise<number> {\n let cleanedCount = 0;\n const now = new Date();\n \n for (const [sessionId, data] of this.sessions.entries()) {\n if (data.expiresAt < now) {\n await this.delete(sessionId);\n cleanedCount++;\n }\n }\n \n return cleanedCount;\n }\n\n /**\n * Get session count for a user\n * @param userId - User identifier\n * @returns Session count\n */\n async getSessionCount(userId: string): Promise<number> {\n const sessions = await this.getByUserId(userId);\n return sessions.length;\n }\n\n /**\n * Encrypt session data for cookie storage\n * @param data - Session data to encrypt\n * @returns Encrypted string\n * @private\n */\n private encrypt(data: string): string {\n const cipher = createCipher('aes-256-cbc', this.config.secretKey);\n let encrypted = cipher.update(data, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n return encrypted;\n }\n\n /**\n * Decrypt session data from cookie\n * @param encryptedData - Encrypted session data\n * @returns Decrypted string\n * @private\n */\n private decrypt(encryptedData: string): string {\n const decipher = createDecipher('aes-256-cbc', this.config.secretKey);\n let decrypted = decipher.update(encryptedData, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n return decrypted;\n }\n\n /**\n * Set HTTP cookie (mock implementation)\n * @param sessionId - Session identifier\n * @param data - Session data\n * @param ttlSeconds - Time to live in seconds\n * @private\n */\n private setCookie(sessionId: string, data: SessionData, ttlSeconds: number): void {\n // Mock implementation - in real app this would use response.cookie()\n const encryptedData = this.encrypt(JSON.stringify(data));\n globalThis.console.log(`Setting cookie: ${this.config.cookieName}=${encryptedData}; Max-Age=${ttlSeconds}`);\n }\n\n /**\n * Clear HTTP cookie (mock implementation)\n * @param sessionId - Session identifier\n * @private\n */\n private clearCookie(sessionId:string): void {\n globalThis.console.log('session_id',sessionId)\n // Mock implementation - in real app this would use response.clearCookie()\n \n }\n}","/**\n * @fileoverview Memory-based session store for @plyaz/auth\n * @module @plyaz/auth/session/memory-store\n * \n * @description\n * Implements session storage using in-memory storage. Provides fast session\n * access but sessions are lost on server restart. Suitable for development,\n * testing, or single-instance applications where session persistence across\n * restarts is not required.\n * \n * @example\n * ```typescript\n * import { MemoryStore } from '@plyaz/auth';\n * \n * const store = new MemoryStore({\n * maxSessionsPerUser: 10,\n * cleanupInterval: 300\n * });\n * \n * await store.set('session_123', sessionData, 3600);\n * ```\n */\n\nimport { NUMERIX } from \"@plyaz/config\";\nimport type { SessionData, SessionStore, SessionStoreConfig } from \"@plyaz/types\";\n\n\n/**\n * Memory store configuration\n */\nexport interface MemoryStoreConfig extends Partial<SessionStoreConfig> {\n /** Enable automatic cleanup */\n autoCleanup?: boolean;\n}\n\n/**\n * Memory-based session store implementation\n * Stores session data in server memory (Map)\n */\nexport class MemoryStore implements SessionStore {\n private readonly config: Required<MemoryStoreConfig>;\n private readonly sessions = new Map<string, SessionData>();\n private readonly userSessions = new Map<string, Set<string>>();\n private cleanupTimer?:string;\n\n constructor(config: MemoryStoreConfig = {}) {\n this.config = {\n defaultTTL: 3600,\n maxSessionsPerUser: 5,\n cleanupInterval: 300,\n keyPrefix: 'session:',\n autoCleanup: true,\n ...config\n };\n\n // Start automatic cleanup if enabled\n if (this.config.autoCleanup) {\n this.startCleanupTimer();\n }\n }\n\n /**\n * Store session data in memory\n * @param sessionId - Session identifier\n * @param data - Session data to store\n * @param ttlSeconds - Time to live in seconds\n */\n async set(sessionId: string, data: SessionData, ttlSeconds: number): Promise<void> {\n const sessionData: SessionData = {\n ...data,\n expiresAt: new Date(Date.now() + ttlSeconds * NUMERIX.THOUSAND)\n };\n\n // Enforce session limits per user\n await this.enforceSessionLimits(data.userId);\n\n // Store session\n this.sessions.set(sessionId, sessionData);\n\n // Track user sessions\n if (!this.userSessions.has(data.userId)) {\n this.userSessions.set(data.userId, new Set());\n }\n this.userSessions.get(data.userId)!.add(sessionId);\n }\n\n /**\n * Retrieve session data from memory\n * @param sessionId - Session identifier\n * @returns Session data or null if not found/expired\n */\n async get(sessionId: string): Promise<SessionData | null> {\n const data = this.sessions.get(sessionId);\n \n if (!data) {\n return null;\n }\n\n // Check expiration\n if (data.expiresAt < new Date()) {\n await this.delete(sessionId);\n return null;\n }\n\n return data;\n }\n\n /**\n * Delete session from memory\n * @param sessionId - Session identifier\n */\n async delete(sessionId: string): Promise<void> {\n const data = this.sessions.get(sessionId);\n \n if (data) {\n // Remove from sessions\n this.sessions.delete(sessionId);\n \n // Remove from user sessions tracking\n const userSessionSet = this.userSessions.get(data.userId);\n if (userSessionSet) {\n userSessionSet.delete(sessionId);\n if (userSessionSet.size === 0) {\n this.userSessions.delete(data.userId);\n }\n }\n }\n }\n\n /**\n * Delete all sessions for a user\n * @param userId - User identifier\n * @returns Number of deleted sessions\n */\n async deleteByUserId(userId: string): Promise<number> {\n const userSessionSet = this.userSessions.get(userId);\n \n if (!userSessionSet) {\n return 0;\n }\n\n const sessionIds = Array.from(userSessionSet);\n let deletedCount = 0;\n\n for (const sessionId of sessionIds) {\n if (this.sessions.has(sessionId)) {\n this.sessions.delete(sessionId);\n deletedCount++;\n }\n }\n\n // Clear user session tracking\n this.userSessions.delete(userId);\n \n return deletedCount;\n }\n\n /**\n * Update session activity timestamp\n * @param sessionId - Session identifier\n */\n async updateActivity(sessionId: string): Promise<void> {\n const data = this.sessions.get(sessionId);\n if (data) {\n data.lastActivityAt = new Date();\n this.sessions.set(sessionId, data);\n }\n }\n\n /**\n * Check if session exists and is valid\n * @param sessionId - Session identifier\n * @returns True if session exists and is valid\n */\n async exists(sessionId: string): Promise<boolean> {\n const data = await this.get(sessionId);\n return data !== null;\n }\n\n /**\n * Get all active sessions for a user\n * @param userId - User identifier\n * @returns Array of session data\n */\n async getByUserId(userId: string): Promise<SessionData[]> {\n const userSessionSet = this.userSessions.get(userId);\n \n if (!userSessionSet) {\n return [];\n }\n\n const userSessions: SessionData[] = [];\n const now = new Date();\n\n for (const sessionId of userSessionSet) {\n const data = this.sessions.get(sessionId);\n if (data && data.expiresAt > now) {\n userSessions.push(data);\n }\n }\n\n return userSessions;\n }\n\n /**\n * Clean up expired sessions\n * @returns Number of cleaned sessions\n */\n async cleanup(): Promise<number> {\n let cleanedCount = 0;\n const now = new Date();\n const expiredSessions: string[] = [];\n\n // Find expired sessions\n for (const [sessionId, data] of this.sessions.entries()) {\n if (data.expiresAt < now) {\n expiredSessions.push(sessionId);\n }\n }\n\n // Delete expired sessions\n for (const sessionId of expiredSessions) {\n await this.delete(sessionId);\n cleanedCount++;\n }\n\n return cleanedCount;\n }\n\n /**\n * Get session count for a user\n * @param userId - User identifier\n * @returns Session count\n */\n async getSessionCount(userId: string): Promise<number> {\n const sessions = await this.getByUserId(userId);\n return sessions.length;\n }\n\n /**\n * Get total number of active sessions\n * @returns Total session count\n */\n getTotalSessionCount(): number {\n return this.sessions.size;\n }\n\n /**\n * Get memory usage statistics\n * @returns Memory usage information\n */\n getStats(): {\n totalSessions: number;\n totalUsers: number;\n memoryUsage: number;\n } {\n return {\n totalSessions: this.sessions.size,\n totalUsers: this.userSessions.size,\n memoryUsage: this.estimateMemoryUsage()\n };\n }\n\n /**\n * Destroy the store and cleanup resources\n */\n destroy(): void {\n if (this.cleanupTimer) {\n\n this.cleanupTimer = undefined;\n }\n \n this.sessions.clear();\n this.userSessions.clear();\n }\n\n /**\n * Enforce session limits per user\n * @param userId - User identifier\n * @private\n */\n private async enforceSessionLimits(userId: string): Promise<void> {\n const userSessions = await this.getByUserId(userId);\n \n if (userSessions.length >= this.config.maxSessionsPerUser) {\n // Sort by last activity (oldest first)\n userSessions.sort((a, b) => a.lastActivityAt.getTime() - b.lastActivityAt.getTime());\n \n // Remove oldest sessions to make room\n const sessionsToRemove = userSessions.length - this.config.maxSessionsPerUser + 1;\n for (let i = 0; i < sessionsToRemove; i++) {\n await this.delete(userSessions[i].id);\n }\n }\n }\n\n /**\n * Start automatic cleanup timer\n * @private\n */\n private startCleanupTimer(): void {\n \n }\n\n /**\n * Estimate memory usage (rough calculation)\n * @returns Estimated memory usage in bytes\n * @private\n */\n private estimateMemoryUsage(): number {\n let totalSize = 0;\n \n for (const [sessionId, data] of this.sessions.entries()) {\n totalSize += sessionId.length * NUMERIX.TWO; // UTF-16 encoding\n totalSize += JSON.stringify(data).length * NUMERIX.TWO;\n }\n \n return totalSize;\n }\n}","/**\n * @fileoverview Redis-based session store for @plyaz/auth\n * @module @plyaz/auth/session/redis-store\n * \n * @description\n * Implements session storage using Redis. Provides persistent, scalable\n * session management with automatic expiration and clustering support.\n * Suitable for production applications requiring session persistence\n * across server restarts and horizontal scaling.\n * \n * @example\n * ```typescript\n * import { RedisStore } from '@plyaz/auth';\n * \n * const store = new RedisStore({\n * host: 'localhost',\n * port: 6379,\n * keyPrefix: 'auth:session:'\n * });\n * \n * await store.set('session_123', sessionData, 3600);\n * ```\n */\n\nimport { NUMERIX } from \"@plyaz/config\";\nimport type { SessionData, SessionStore, SessionStoreConfig } from \"@plyaz/types\";\n\n\n/**\n * Redis connection configuration\n */\nexport interface RedisConfig {\n /** Redis host */\n host: string;\n /** Redis port */\n port: number;\n /** Redis password */\n password?: string;\n /** Redis database number */\n db?: number;\n /** Connection timeout in milliseconds */\n connectTimeout?: number;\n /** Command timeout in milliseconds */\n commandTimeout?: number;\n /** Enable TLS */\n tls?: boolean;\n}\n\n/**\n * Redis store configuration\n */\nexport interface RedisStoreConfig extends Partial<SessionStoreConfig> {\n /** Redis connection configuration */\n redis: RedisConfig;\n /** Enable compression for large sessions */\n compression?: boolean;\n /** Serialization format */\n serialization?: 'json' | 'msgpack';\n}\n\n/**\n * Mock Redis client interface for development\n * In production, this would be replaced with actual Redis client (ioredis, node-redis, etc.)\n */\ninterface MockRedisClient {\n set(key: string, value: string, ex: number): Promise<string>;\n get(key: string): Promise<string | null>;\n del(key: string): Promise<number>;\n keys(pattern: string): Promise<string[]>;\n expire(key: string, seconds: number): Promise<number>;\n exists(key: string): Promise<number>;\n scan(cursor: string, match?: string, count?: number): Promise<[string, string[]]>;\n}\n\n/**\n * Redis-based session store implementation\n * Stores session data in Redis with automatic expiration\n */\nexport class RedisStore implements SessionStore {\n private readonly config: Required<RedisStoreConfig>;\n private readonly client: MockRedisClient;\n private readonly userSessionsKey = 'user_sessions:';\n\n constructor(config: RedisStoreConfig) {\n this.config = {\n defaultTTL: 3600,\n maxSessionsPerUser: 5,\n cleanupInterval: 300,\n keyPrefix: 'session:',\n compression: false,\n serialization: 'json',\n ...config\n };\n\n // Initialize mock Redis client\n // In production, this would be: new Redis(config.redis)\n this.client = this.createMockRedisClient();\n }\n\n /**\n * Store session data in Redis\n * @param sessionId - Session identifier\n * @param data - Session data to store\n * @param ttlSeconds - Time to live in seconds\n */\n async set(sessionId: string, data: SessionData, ttlSeconds: number): Promise<void> {\n const key = this.getSessionKey(sessionId);\n const userSessionsKey = this.getUserSessionsKey(data.userId);\n \n // Enforce session limits per user\n await this.enforceSessionLimits(data.userId);\n\n // Serialize session data\n const serializedData = this.serialize(data);\n \n // Store session with expiration\n await this.client.set(key, serializedData, ttlSeconds);\n \n // Track user sessions (with longer TTL for cleanup)\n const userSessionsTTL = Math.max(ttlSeconds, this.config.defaultTTL);\n await this.client.set(`${userSessionsKey}${sessionId}`, '1', userSessionsTTL);\n }\n\n /**\n * Retrieve session data from Redis\n * @param sessionId - Session identifier\n * @returns Session data or null if not found/expired\n */\n async get(sessionId: string): Promise<SessionData | null> {\n const key = this.getSessionKey(sessionId);\n const serializedData = await this.client.get(key);\n \n if (!serializedData) {\n return null;\n }\n\n try {\n const data = this.deserialize(serializedData);\n \n // Double-check expiration (Redis should handle this, but be safe)\n if (data.expiresAt < new Date()) {\n await this.delete(sessionId);\n return null;\n }\n \n return data;\n } catch (error) {\n // If deserialization fails, delete the corrupted session\n globalThis.console.log(\"error\",error)\n await this.delete(sessionId);\n return null ;\n }\n }\n\n /**\n * Delete session from Redis\n * @param sessionId - Session identifier\n */\n async delete(sessionId: string): Promise<void> {\n const key = this.getSessionKey(sessionId);\n \n // Get session data to find user ID\n const data = await this.get(sessionId);\n \n // Delete session\n await this.client.del(key);\n \n // Remove from user sessions tracking\n if (data) {\n const userSessionKey = `${this.getUserSessionsKey(data.userId)}${sessionId}`;\n await this.client.del(userSessionKey);\n }\n }\n\n /**\n * Delete all sessions for a user\n * @param userId - User identifier\n * @returns Number of deleted sessions\n */\n async deleteByUserId(userId: string): Promise<number> {\n const userSessionsPattern = `${this.getUserSessionsKey(userId)}*`;\n const userSessionKeys = await this.client.keys(userSessionsPattern);\n \n let deletedCount = 0;\n \n for (const userSessionKey of userSessionKeys) {\n // Extract session ID from key\n const sessionId = userSessionKey.replace(this.getUserSessionsKey(userId), '');\n const sessionKey = this.getSessionKey(sessionId);\n \n // Delete both session and user session tracking\n const sessionDeleted = await this.client.del(sessionKey);\n await this.client.del(userSessionKey);\n \n if (sessionDeleted > 0) {\n deletedCount++;\n }\n }\n \n return deletedCount;\n }\n\n /**\n * Update session activity timestamp\n * @param sessionId - Session identifier\n */\n async updateActivity(sessionId: string): Promise<void> {\n const data = await this.get(sessionId);\n \n if (data) {\n data.lastActivityAt = new Date();\n \n // Calculate remaining TTL\n const remainingTTL = Math.max(0, Math.floor((data.expiresAt.getTime() - Date.now()) / NUMERIX.THOUSAND));\n \n if (remainingTTL > 0) {\n await this.set(sessionId, data, remainingTTL);\n }\n }\n }\n\n /**\n * Check if session exists in Redis\n * @param sessionId - Session identifier\n * @returns True if session exists\n */\n async exists(sessionId: string): Promise<boolean> {\n const key = this.getSessionKey(sessionId);\n const exists = await this.client.exists(key);\n return exists > 0;\n }\n\n /**\n * Get all active sessions for a user\n * @param userId - User identifier\n * @returns Array of session data\n */\n async getByUserId(userId: string): Promise<SessionData[]> {\n const userSessionsPattern = `${this.getUserSessionsKey(userId)}*`;\n const userSessionKeys = await this.client.keys(userSessionsPattern);\n \n const sessions: SessionData[] = [];\n \n for (const userSessionKey of userSessionKeys) {\n // Extract session ID from key\n const sessionId = userSessionKey.replace(this.getUserSessionsKey(userId), '');\n const sessionData = await this.get(sessionId);\n \n if (sessionData) {\n sessions.push(sessionData);\n }\n }\n \n return sessions;\n }\n\n /**\n * Clean up expired sessions (Redis handles this automatically, but useful for stats)\n * @returns Number of cleaned sessions (always 0 for Redis due to auto-expiration)\n */\n async cleanup(): Promise<number> {\n // Redis automatically expires keys, so this is mainly for compatibility\n // Could be used to clean up orphaned user session tracking keys\n return 0;\n }\n\n /**\n * Get session count for a user\n * @param userId - User identifier\n * @returns Session count\n */\n async getSessionCount(userId: string): Promise<number> {\n const sessions = await this.getByUserId(userId);\n return sessions.length;\n }\n\n /**\n * Get Redis connection statistics\n * @returns Connection and usage statistics\n */\n async getStats(): Promise<{\n connected: boolean;\n totalSessions: number;\n memoryUsage: string;\n }> {\n // Mock implementation - in production would use Redis INFO command\n return {\n connected: true,\n totalSessions: 0, // Would use DBSIZE or scan\n memoryUsage: '0MB'\n };\n }\n\n /**\n * Close Redis connection\n */\n async disconnect(): Promise<void> {\n // Mock implementation - in production would close Redis connection\n globalThis.console.log('Redis connection closed');\n }\n\n /**\n * Get session key with prefix\n * @param sessionId - Session identifier\n * @returns Prefixed session key\n * @private\n */\n private getSessionKey(sessionId: string): string {\n return `${this.config.keyPrefix}${sessionId}`;\n }\n\n /**\n * Get user sessions tracking key\n * @param userId - User identifier\n * @returns User sessions key prefix\n * @private\n */\n private getUserSessionsKey(userId: string): string {\n return `${this.config.keyPrefix}${this.userSessionsKey}${userId}:`;\n }\n\n /**\n * Serialize session data\n * @param data - Session data to serialize\n * @returns Serialized string\n * @private\n */\n private serialize(data: SessionData): string {\n if (this.config.serialization === 'json') {\n return JSON.stringify(data);\n }\n \n // In production, could use msgpack for better compression\n return JSON.stringify(data);\n }\n\n /**\n * Deserialize session data\n * @param serializedData - Serialized session data\n * @returns Parsed session data\n * @private\n */\n private deserialize(serializedData: string): SessionData {\n const data = JSON.parse(serializedData);\n \n // Convert date strings back to Date objects\n return {\n ...data,\n expiresAt: new Date(data.expiresAt),\n createdAt: new Date(data.createdAt),\n lastActivityAt: new Date(data.lastActivityAt)\n };\n }\n\n /**\n * Enforce session limits per user\n * @param userId - User identifier\n * @private\n */\n private async enforceSessionLimits(userId: string): Promise<void> {\n const userSessions = await this.getByUserId(userId);\n \n if (userSessions.length >= this.config.maxSessionsPerUser) {\n // Sort by last activity (oldest first)\n userSessions.sort((a, b) => a.lastActivityAt.getTime() - b.lastActivityAt.getTime());\n \n // Remove oldest sessions to make room\n const sessionsToRemove = userSessions.length - this.config.maxSessionsPerUser + 1;\n for (let i = 0; i < sessionsToRemove; i++) {\n await this.delete(userSessions[i].id);\n }\n }\n }\n\n /**\n * Create mock Redis client for development\n * @returns Mock Redis client\n * @private\n */\n private createMockRedisClient(): MockRedisClient {\n const storage = new Map<string, { value: string; expires: number }>();\n \n return {\n async set(key: string, value: string, ex: number): Promise<string> {\n storage.set(key, {\n value,\n expires: Date.now() + ex * NUMERIX.THOUSAND\n });\n return 'OK';\n },\n \n async get(key: string): Promise<string | null> {\n const item = storage.get(key);\n if (!item) return null;\n \n if (item.expires < Date.now()) {\n storage.delete(key);\n return null;\n }\n \n return item.value;\n },\n \n async del(key: string): Promise<number> {\n const existed = storage.has(key);\n storage.delete(key);\n return existed ? 1 : 0;\n },\n \n async keys(pattern: string): Promise<string[]> {\n const regex = new RegExp(pattern.replace('*', '.*'));\n return Array.from(storage.keys()).filter(key => regex.test(key));\n },\n \n async expire(key: string, seconds: number): Promise<number> {\n const item = storage.get(key);\n if (!item) return 0;\n \n item.expires = Date.now() + seconds * NUMERIX.THOUSAND;\n storage.set(key, item);\n return 1;\n },\n \n async exists(key: string): Promise<number> {\n const item = storage.get(key);\n if (!item) return 0;\n \n if (item.expires < Date.now()) {\n storage.delete(key);\n return 0;\n }\n \n return 1;\n },\n \n async scan(cursor: string, match?: string, count?: number): Promise<[string, string[]]> {\n // Simplified scan implementation\n const keys = match ? await this.keys(match) : Array.from(storage.keys());\n return ['0', keys.slice(0, count ?? NUMERIX.TEN)];\n }\n };\n }\n}","/**\n * @fileoverview Enhanced session manager for @plyaz/auth\n * @module @plyaz/auth/session/enhanced-session-manager\n * \n * @description\n * Enhanced session manager that implements all documented session management\n * methods. Provides comprehensive session lifecycle management including\n * CSRF token generation, concurrent session detection, and session validation.\n * Uses pluggable session stores for flexible storage backends.\n * \n * @example\n * ```typescript\n * import { EnhancedSessionManager, MemoryStore } from '@plyaz/auth';\n * \n * const sessionManager = new EnhancedSessionManager({\n * store: new MemoryStore(),\n * sessionTTL: 3600,\n * maxConcurrentSessions: 5\n * });\n * \n * const session = await sessionManager.createSession(userContext, sessionData);\n * ```\n */\n\n\nimport type { Session, SessionData, SessionStore } from '@plyaz/types';\nimport { randomBytes } from 'crypto';\nimport { CSRFProtection } from '../security';\nimport { NUMERIX } from '@plyaz/config';\n\n/**\n * User context for session creation\n */\nexport interface UserContext {\n /** User ID */\n userId: string;\n /** User email */\n email?: string;\n /** User roles */\n roles?: string[];\n /** Additional user metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Session creation data\n */\nexport interface SessionCreationData {\n /** IP address */\n ipAddress?: string;\n /** User agent string */\n userAgent?: string;\n /** Device information */\n deviceInfo?: Record<string, unknown>;\n /** Additional session metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Enhanced session manager configuration\n */\nexport interface EnhancedSessionManagerConfig {\n /** Session store implementation */\n store: SessionStore;\n /** Default session TTL in seconds */\n sessionTTL: number;\n /** Maximum concurrent sessions per user */\n maxConcurrentSessions: number;\n /** Enable CSRF protection */\n enableCSRF: boolean;\n /** CSRF token TTL in seconds */\n csrfTTL: number;\n /** Enable session refresh */\n enableRefresh: boolean;\n /** Session refresh threshold (seconds before expiry) */\n refreshThreshold: number;\n}\n\n/**\n * Enhanced session manager implementation\n * Provides comprehensive session management with all documented methods\n */\nexport class EnhancedSessionManager {\n private readonly config: EnhancedSessionManagerConfig;\n private readonly store: SessionStore;\n private readonly csrfProtection: CSRFProtection;\n\n constructor(config: Partial<EnhancedSessionManagerConfig> & { store: SessionStore }) {\n this.config = {\n sessionTTL: 3600,\n maxConcurrentSessions: 5,\n enableCSRF: true,\n csrfTTL: 3600,\n enableRefresh: true,\n refreshThreshold: 300, // 5 minutes\n ...config\n };\n\n this.store = config.store;\n this.csrfProtection = new CSRFProtection();\n }\n\n /**\n * Create a new session\n * Generate session ID, store data, set expiry, generate CSRF token\n * @param userContext - User context information\n * @param sessionData - Session creation data\n * @returns Created session\n */\n async createSession(userContext: UserContext, sessionData: SessionCreationData = {}): Promise<Session> {\n // Generate unique session ID\n const sessionId = this.generateSessionId();\n \n // Enforce session limits\n await this.enforceSessionLimits(userContext.userId);\n\n // Create session data\n const now = new Date();\n const expiresAt = new Date(now.getTime() + this.config.sessionTTL * NUMERIX.THOUSAND);\n \n const session: SessionData = {\n id: sessionId,\n userId: userContext.userId,\n expiresAt,\n createdAt: now,\n lastActivityAt: now,\n ipAddress: sessionData.ipAddress,\n userAgent: sessionData.userAgent,\n metadata: {\n ...sessionData.metadata,\n deviceInfo: sessionData.deviceInfo,\n userRoles: userContext.roles,\n userEmail: userContext.email\n }\n };\n\n // Store session\n await this.store.set(sessionId, session, this.config.sessionTTL);\n\n // Generate CSRF token if enabled\n let csrfToken: string | undefined;\n if (this.config.enableCSRF) {\n csrfToken = this.csrfProtection.generateToken(sessionId);\n }\n\n return {\n id: sessionId,\n userId: userContext.userId,\n provider: 'enhanced-session-manager',\n providerSessionId: sessionId,\n expiresAt,\n createdAt: now,\n lastActivityAt: now,\n ipAddress: sessionData.ipAddress,\n userAgent: sessionData.userAgent,\n metadata: {\n ...session.metadata,\n csrfToken\n }\n };\n }\n\n /**\n * Retrieve session by ID\n * @param sessionId - Session identifier\n * @returns Session or null if not found\n */\n async getSession(sessionId: string): Promise<Session | null> {\n const sessionData = await this.store.get(sessionId);\n \n if (!sessionData) {\n return null;\n }\n\n return this.mapSessionDataToSession(sessionData);\n }\n\n /**\n * Update session data\n * @param sessionId - Session identifier\n * @param updates - Partial session updates\n * @returns Updated session\n */\n async updateSession(sessionId: string, updates: Partial<SessionData>): Promise<Session> {\n const existingSession = await this.store.get(sessionId);\n \n if (!existingSession) {\n throw new Error('Session not found');\n }\n\n // Merge updates\n const updatedSession: SessionData = {\n ...existingSession,\n ...updates,\n lastActivityAt: new Date()\n };\n\n // Calculate remaining TTL\n const remainingTTL = Math.max(0, Math.floor((updatedSession.expiresAt.getTime() - Date.now()) / NUMERIX.THOUSAND));\n \n if (remainingTTL <= 0) {\n throw new Error('Session has expired');\n }\n\n // Store updated session\n await this.store.set(sessionId, updatedSession, remainingTTL);\n\n return this.mapSessionDataToSession(updatedSession);\n }\n\n /**\n * Delete session\n * @param sessionId - Session identifier\n */\n async deleteSession(sessionId: string): Promise<void> {\n await this.store.delete(sessionId);\n \n // Remove CSRF token if enabled\n if (this.config.enableCSRF) {\n this.csrfProtection.removeToken(sessionId);\n }\n }\n\n /**\n * Refresh session (extend expiry)\n * @param sessionId - Session identifier\n * @returns Refreshed session\n */\n async refreshSession(sessionId: string): Promise<Session> {\n const sessionData = await this.store.get(sessionId);\n \n if (!sessionData) {\n throw new Error('Session not found');\n }\n\n // Extend expiry\n const now = new Date();\n const newExpiresAt = new Date(now.getTime() + this.config.sessionTTL * NUMERIX.THOUSAND);\n \n const refreshedSession: SessionData = {\n ...sessionData,\n expiresAt: newExpiresAt,\n lastActivityAt: now\n };\n\n // Store refreshed session\n await this.store.set(sessionId, refreshedSession, this.config.sessionTTL);\n\n return this.mapSessionDataToSession(refreshedSession);\n }\n\n /**\n * Validate session\n * @param sessionId - Session identifier\n * @returns True if session is valid\n */\n async validateSession(sessionId: string): Promise<boolean> {\n const sessionData = await this.store.get(sessionId);\n \n if (!sessionData) {\n return false;\n }\n\n // Check expiration\n if (sessionData.expiresAt < new Date()) {\n await this.deleteSession(sessionId);\n return false;\n }\n\n // Update activity\n await this.store.updateActivity(sessionId);\n\n return true;\n }\n\n /**\n * Invalidate all sessions for a user (logout all devices)\n * @param userId - User identifier\n */\n async invalidateAllUserSessions(userId: string): Promise<void> {\n await this.store.deleteByUserId(userId);\n }\n\n /**\n * Detect concurrent sessions for a user\n * @param userId - User identifier\n * @returns Array of active sessions\n */\n async detectConcurrentSessions(userId: string): Promise<Session[]> {\n const sessionDataArray = await this.store.getByUserId(userId);\n \n return sessionDataArray.map(sessionData => this.mapSessionDataToSession(sessionData));\n }\n\n /**\n * Apply maximum session policy for a user\n * @param userId - User identifier\n */\n async enforceSessionLimits(userId: string): Promise<void> {\n const userSessions = await this.store.getByUserId(userId);\n \n if (userSessions.length >= this.config.maxConcurrentSessions) {\n // Sort by last activity (oldest first)\n userSessions.sort((a, b) => a.lastActivityAt.getTime() - b.lastActivityAt.getTime());\n \n // Remove oldest sessions to make room\n const sessionsToRemove = userSessions.length - this.config.maxConcurrentSessions + 1;\n for (let i = 0; i < sessionsToRemove; i++) {\n await this.deleteSession(userSessions[i].id);\n }\n }\n }\n\n /**\n * Generate CSRF token for session\n * @param sessionId - Session identifier\n * @returns CSRF token\n */\n async generateCsrfToken(sessionId: string): Promise<string> {\n if (!this.config.enableCSRF) {\n throw new Error('CSRF protection is disabled');\n }\n\n return this.csrfProtection.generateToken(sessionId);\n }\n\n /**\n * Validate CSRF token for session\n * @param sessionId - Session identifier\n * @param token - CSRF token to validate\n * @returns True if token is valid\n */\n async validateCsrfToken(sessionId: string, token: string): Promise<boolean> {\n if (!this.config.enableCSRF) {\n return true; // CSRF disabled, always valid\n }\n\n return this.csrfProtection.validateToken(sessionId, token);\n }\n\n /**\n * Check if session needs refresh\n * @param sessionId - Session identifier\n * @returns True if session should be refreshed\n */\n async shouldRefreshSession(sessionId: string): Promise<boolean> {\n if (!this.config.enableRefresh) {\n return false;\n }\n\n const sessionData = await this.store.get(sessionId);\n \n if (!sessionData) {\n return false;\n }\n\n const timeUntilExpiry = sessionData.expiresAt.getTime() - Date.now();\n return timeUntilExpiry <= this.config.refreshThreshold * NUMERIX.THOUSAND;\n }\n\n /**\n * Get session statistics\n * @returns Session statistics\n */\n async getSessionStats(): Promise<{\n totalSessions: number;\n activeUsers: number;\n }> {\n // This would require additional tracking in a real implementation\n return {\n totalSessions: 0, // Would need to scan all sessions\n activeUsers: 0 // Would need to count unique user IDs\n };\n }\n\n /**\n * Generate cryptographically secure session ID\n * @returns Session ID\n * @private\n */\n private generateSessionId(): string {\n const randomBytesNumber = 32;\n return randomBytes(randomBytesNumber).toString('hex');\n }\n\n /**\n * Map session data to session interface\n * @param sessionData - Session data from store\n * @returns Session interface\n * @private\n */\n private mapSessionDataToSession(sessionData: SessionData): Session {\n return {\n id: sessionData.id,\n userId: sessionData.userId,\n provider: 'enhanced-session-manager',\n providerSessionId: sessionData.id,\n expiresAt: sessionData.expiresAt,\n createdAt: sessionData.createdAt,\n lastActivityAt: sessionData.lastActivityAt,\n ipAddress: sessionData.ipAddress,\n userAgent: sessionData.userAgent,\n metadata: sessionData.metadata\n };\n }\n}","import type { AuthAdapterUser, AUTHPROVIDER, AuthProviderAdapter, AuthSession, ConnectedAccount, Tokens } from \"@plyaz/types\";\n\n\n/**\n * BaseAuthProviderAdapter\n *\n * Abstract base class for all authentication provider adapters.\n * Provides the standard contract for implementing any auth provider\n * (e.g., Clerk, NextAuth, Custom).\n *\n * All concrete adapters must implement these methods to ensure\n * consistency across the system.\n */\nexport abstract class BaseAuthProviderAdapter implements AuthProviderAdapter {\n /**\n * Sign in an existing user.\n *\n * @param provider - Authentication provider identifier\n * @param credentials - Provider-specific credentials\n * @returns Auth result containing user, session, and tokens\n */\n abstract signIn(\n provider: AUTHPROVIDER,\n credentials?: unknown\n ): Promise<{ user: AuthAdapterUser; session: AuthSession; tokens: Tokens }>;\n\n /**\n * Sign up a new user.\n *\n * @param provider - Authentication provider identifier\n * @param credentials - Provider-specific credentials\n * @param data - Optional additional user data\n * @returns Auth result or void if handled externally\n */\n abstract signUp(\n provider: AUTHPROVIDER,\n credentials: unknown,\n data?: unknown\n ): Promise<{ user: AuthAdapterUser; session: AuthSession; tokens: Tokens }> | Promise<void>;\n\n /**\n * Sign out a user session.\n *\n * @param sessionId - Session identifier\n */\n abstract signOut(sessionId: string): Promise<void>;\n\n /**\n * Retrieve a session by its identifier.\n *\n * @param sessionId - Session identifier\n * @returns Session or null if not found or expired\n */\n abstract getSession(sessionId: string): Promise<AuthSession | null>;\n\n /**\n * Validate a session.\n *\n * @param sessionId - Session identifier\n * @returns True if session is valid, otherwise false\n */\n abstract validateSession(sessionId: string): Promise<boolean>;\n\n /**\n * Refresh an existing session using a refresh token.\n *\n * @param refreshToken - Refresh token\n * @returns New session and tokens, or void if not supported\n */\n abstract refreshSession(\n refreshToken: string\n ): Promise<{ session: AuthSession; tokens: Tokens } | void>;\n\n /**\n * Generate an OAuth authorization URL.\n *\n * @param provider - OAuth provider\n * @param redirectUri - Redirect URI after authentication\n * @returns Authorization URL or void if handled externally\n */\n abstract getOAuthUrl(\n provider: AUTHPROVIDER,\n redirectUri: string\n ): Promise<string | void>;\n\n /**\n * Handle OAuth callback after provider authentication.\n *\n * @param provider - OAuth provider\n * @param code - Authorization code returned by provider\n * @returns Provider account data or void if handled externally\n */\n abstract handleOAuthCallback(\n provider: AUTHPROVIDER,\n code: string\n ): Promise<{ providerAccountId: string; profile: unknown } | void>;\n\n /**\n * Link an external provider account to an existing user.\n *\n * @param userId - Local user identifier\n * @param provider - Authentication provider\n * @param data - Connected account metadata\n * @returns Linked connected account or void if handled externally\n */\n abstract linkAccount(\n userId: string,\n provider: AUTHPROVIDER,\n data: ConnectedAccount\n ): Promise<ConnectedAccount | void>;\n\n /**\n * Unlink an external provider account from a user.\n *\n * @param userId - Local user identifier\n * @param accountId - Connected account identifier\n */\n abstract unlinkAccount(userId: string, accountId: string): Promise<void>;\n}\n","import { createClient } from '@supabase/supabase-js';\n\nexport const supabase = createClient(\n globalThis.process.env.NEXT_PUBLIC_SUPABASE_URL!,\n globalThis.process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!\n);","import type { AUTHPROVIDER, AuthUser, ConnectedAccount, Session } from '@plyaz/types';\n\n\nimport bcrypt from 'bcryptjs';\nimport { randomBytes } from 'crypto';\nimport { supabase } from './supabaseClient';\nimport { NUMERIX } from '@plyaz/config';\n\nexport interface DeviceInfo {\n ip: string;\n browser: string;\n os: string;\n userAgent: string;\n}\n\n/**\n * Create a new user\n */\nexport async function createUser(\n email: string,\n authProvider: string,\n data?: Partial<AuthUser>,\n password?: string\n): Promise<AuthUser> {\n const passwordHash = password ? await bcrypt.hash(password, NUMERIX.TEN) : undefined;\n\n const { data: user, error } = await supabase\n .from('users')\n .insert({\n email,\n auth_provider: authProvider,\n first_name: data?.firstName,\n last_name: data?.lastName,\n display_name: data?.displayName ?? email,\n avatar_url: data?.avatarUrl,\n phone_number: data?.phoneNumber,\n is_active: true,\n is_verified: authProvider !== 'email', // email signups need verification\n roles: data?.roles ?? [],\n password_hash: passwordHash,\n })\n .select('*')\n .single();\n\n if (error || !user) throw new Error(error?.message ?? 'Failed to create user');\n return user;\n}\n\n/**\n * Find user by email + provider\n */\nexport async function findUserByEmailProvider(\n email: string,\n provider: string\n): Promise<AuthUser | null> {\n const { data, error } = await supabase\n .from('users')\n .select('*')\n .eq('email', email)\n .eq('auth_provider', provider)\n .single();\n\n if (error || !data) return null;\n return data;\n}\n\n/**\n * Update last login timestamp\n */\nexport async function updateLastLogin(userId: string):Promise<void>{\n await supabase\n .from('users')\n .update({ last_login_at: new Date() })\n .eq('id', userId);\n}\n\n/**\n * Create a new session\n */\nexport async function createUserSession(\n userId: string,\n deviceInfo: DeviceInfo\n): Promise<Session & { accessToken: string }> {\n const thirtyTwo = 32;\n const accessToken = randomBytes(thirtyTwo).toString('hex');\n const tokenHash = await bcrypt.hash(accessToken, NUMERIX.TEN);\n const expiresAt = new Date(Date.now() + NUMERIX.THOUSAND * NUMERIX.SIXTY * NUMERIX.SIXTY * NUMERIX.TWENTY_FOUR); // 24h\n\n const { data, error } = await supabase\n .from('sessions')\n .insert({\n user_id: userId,\n token_hash: tokenHash,\n device_info: deviceInfo,\n expires_at: expiresAt,\n last_active_at: new Date(),\n })\n .select('*')\n .single();\n\n if (error || !data) throw new Error(error?.message ?? 'Failed to create session');\n\n return {\n id: data.id,\n userId: data.user_id,\n expiresAt: data.expires_at,\n provider: data.provider,\n createdAt: data.created_at,\n lastActivityAt: data.last_active_at,\n accessToken\n };\n}\n\n/**\n * Get a session by ID\n */\nexport async function getSession(sessionId: string): Promise<Session | null> {\n const { data, error } = await supabase\n .from('sessions')\n .select('*')\n .eq('id', sessionId)\n .single();\n\n if (error || !data) return null;\n\n return {\n id: data.id,\n userId: data.user_id,\n expiresAt: data.expires_at,\n provider: data.provider,\n createdAt: data.created_at,\n lastActivityAt: data.last_active_at\n };\n}\n\n/**\n * Validate session (exists + not expired)\n */\nexport async function validateSessionDB(sessionId: string): Promise<boolean> {\n const { data } = await supabase\n .from('sessions')\n .select('id')\n .eq('id', sessionId)\n .gte('expires_at', new Date())\n .single();\n\n return !!data;\n}\n\n/**\n * Delete session\n */\nexport async function deleteSession(sessionId: string):Promise<void> {\n await supabase.from('sessions').delete().eq('id', sessionId);\n}\n\n/**\n * Refresh session\n */\nexport async function refreshSessionDB(sessionId: string): Promise<Session & { accessToken: string }> {\n const thirtyTwo = 32;\n const accessToken = randomBytes(thirtyTwo).toString('hex');\n const tokenHash = await bcrypt.hash(accessToken, NUMERIX.TEN);\n const expiresAt = new Date(Date.now() + NUMERIX.THOUSAND * NUMERIX.SIXTY * NUMERIX.SIXTY * NUMERIX.TWENTY_FOUR); // 24h\n\n const { data, error } = await supabase\n .from('sessions')\n .update({\n token_hash: tokenHash,\n expires_at: expiresAt,\n last_active_at: new Date(),\n })\n .eq('id', sessionId)\n .select('*')\n .single();\n\n if (error || !data) throw new Error(error?.message ?? 'Failed to refresh session');\n\n return {\n id: data.id,\n userId: data.user_id,\n expiresAt: data.expires_at,\n provider: data.provider,\n createdAt: data.created_at,\n lastActivityAt: data.last_active_at,\n accessToken\n };\n}\n\n\nexport async function linkConnectedAccount(\n userId: string,\n provider:AUTHPROVIDER,\n data: ConnectedAccount\n) :Promise<ConnectedAccount>{\n const { data: account, error } = await supabase\n .from('connected_accounts')\n .insert({\n user_id: userId,\n provider_type: data.providerType,\n provider: provider,\n provider_account_id: data.providerAccountId,\n provider_email: data.providerEmail,\n provider_username: data.providerUsername,\n provider_display_name: data.providerDisplayName,\n provider_avatar_url: data.providerAvatarUrl,\n provider_profile_url: data.providerProfileUrl,\n provider_metadata: data.providerMetadata ?? {},\n wallet_address: data.walletAddress,\n chain_id: data.chainId,\n access_token_encrypted: data.accessTokenEncrypted,\n refresh_token_encrypted: data.refreshTokenEncrypted,\n token_expires_at: data.tokenExpiresAt,\n token_scope: data.tokenScope,\n is_primary: data.isPrimary ?? false,\n is_verified: data.isVerified ?? true,\n is_active: data.isActive ?? true,\n linked_ip_address: data.linkedIpAddress,\n linked_user_agent: data.linkedUserAgent,\n })\n .select('*')\n .single();\n\n if (error) throw new Error(error.message);\n return account;\n}\n\n/**\n * Unlink a provider account from a user\n */\nexport async function unlinkConnectedAccount(\n userId: string,\n accountId: string\n):Promise<void>{\n const { error } = await supabase\n .from('connected_accounts')\n .delete()\n .eq('user_id', userId)\n .eq('id', accountId);\n\n if (error) throw new Error(error.message);\n}\n\n/**\n * Get all linked accounts for a user\n */\nexport async function getLinkedAccounts(userId: string):Promise<ConnectedAccount[] >{\n const { data, error } = await supabase\n .from('connected_accounts')\n .select('*')\n .eq('user_id', userId);\n\n if (error) throw new Error(error.message);\n return data || [];\n}","/* eslint-disable no-unused-vars */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n\nimport { clerkClient } from \"@clerk/nextjs/server\";\nimport type { AuthCredentials, AUTHPROVIDER, ConnectedAccount, DeviceInfo } from \"@plyaz/types\";\nimport type { AuthUser } from \"@supabase/supabase-js\";\nimport { DatabasePackageError } from \"@plyaz/errors\";\nimport { BaseAuthProviderAdapter } from \"../base-auth.adapter\";\nimport { createUser } from \"../../libs/supabase.helper\";\nimport { supabase } from \"../../libs/supabaseClient\";\n\n\n/**\n * ClerkAdapter\n *\n * Auth provider adapter implementation for Clerk.\n * This adapter delegates authentication and session management to Clerk,\n * while ensuring local user and account synchronization with Supabase.\n *\n * Responsibilities:\n * - Authenticate users via Clerk\n * - Sync Clerk users with local Supabase tables\n * - Maintain compatibility with the unified AuthProviderAdapter interface\n */\n\nexport class ClerkAdapter extends BaseAuthProviderAdapter {\n /**\n * Sign in a user using Clerk.\n *\n * Fetches the Clerk user, syncs it with Supabase, and returns\n * a standardized auth response.\n *\n * @param provider - Auth provider name (unused, Clerk-specific)\n * @param credentials - Clerk credentials containing user ID\n * @param deviceInfo - Optional device metadata\n * @returns Auth result including user, session, and tokens\n */\n async signIn(\n provider: string,\n credentials: Credential,\n ): Promise<{\n user: { id: string; email: string };\n session: { id: string; userId: string; expiresAt: Date };\n tokens: { accessToken: string };\n }> {\n const client = await clerkClient();\n const user = await client.users.getUser(credentials.id);\n await migrateClerkConnection(user.id);\n return {\n user: { id: user.id, email: user.emailAddresses[0].emailAddress },\n session: { id: \"clerk-session\", userId: user.id, expiresAt: new Date() },\n tokens: { accessToken: \"managed-by-clerk\" },\n };\n }\n\n /**\n * Sign up a new user.\n *\n * User creation is delegated to Clerk, while this method\n * ensures a corresponding Supabase user exists.\n *\n * @param provider - Auth provider identifier\n * @param credentials - Signup credentials\n * @param data - Optional additional user data\n * @param deviceInfo - Optional device metadata\n */\n\n async signUp(\n provider: string,\n credentials: AuthCredentials,\n data?: Partial<AuthUser>\n ) {\n await createUser(\n credentials.email,\n provider,\n data,\n credentials.password\n );\n\n }\n /**\n * Sign out a user.\n *\n * Session handling is fully managed by Clerk.\n *\n * @param sessionId - Session identifier\n */\n async signOut(sessionId: string) {}\n\n /**\n * Retrieve a session by ID.\n *\n * Clerk manages sessions externally, so this always returns null.\n *\n * @param sessionId - Session identifier\n * @returns null\n */\n async getSession(sessionId: string) {\n return null;\n }\n\n /**\n * Validate a session.\n *\n * Clerk handles session validation internally.\n *\n * @param sessionId - Session identifier\n * @returns true\n */\n\n async validateSession(sessionId: string) {\n return true;\n }\n /**\n * Refresh a session.\n *\n * Not supported because Clerk manages token refresh.\n *\n * @param sessionId - Session identifier\n * @throws DatabasePackageError\n */\n\n async refreshSession(sessionId: string) {\n throw new DatabasePackageError(\"Not supported\");\n }\n /**\n * Generate an OAuth authorization URL.\n *\n * OAuth flow is handled by Clerk UI.\n *\n * @param provider - OAuth provider\n * @param redirectUri - Redirect URI\n * @throws DatabasePackageError\n */\n\n async getOAuthUrl(provider: string, redirectUri: string) {\n throw new DatabasePackageError(\"Handled by Clerk\");\n }\n /**\n * Handle OAuth callback.\n *\n * OAuth callbacks are handled by Clerk.\n *\n * @param provider - OAuth provider\n * @param code - Authorization code\n * @throws DatabasePackageError\n */\n\n async handleOAuthCallback(provider: string, code: string) {\n throw new DatabasePackageError(\"Handled by Clerk\");\n }\n\n async linkAccount(\n userId: string,\n provider: AUTHPROVIDER,\n data: ConnectedAccount\n ) {\n throw new DatabasePackageError(\"Handled by Clerk\");\n }\n async unlinkAccount(userId: string, accountId: string) {\n throw new DatabasePackageError(\"Handled by Clerk\");\n }\n async getLinkedAccounts(userId: string) {\n throw new DatabasePackageError(\"Handled by Clerk\");\n }\n}\n\n/**\n * Sync Clerk user → Supabase users + connected_accounts\n * Safe to call on every sign-in\n */\nexport async function migrateClerkConnection(clerkUserId: string) {\n const { data: existingUser, error: userFetchError } = await supabase\n .from(\"users\")\n .select(\"id\")\n .eq(\"clerk_user_id\", clerkUserId)\n .single();\n\n if (userFetchError && userFetchError.code !== \"PGRST116\") {\n throw userFetchError;\n }\n\n\n if (!existingUser) {\n throw new DatabasePackageError(\"User Not Found\");\n }\n\n const { error: accountError } = await supabase\n .from(\"connected_accounts\")\n .upsert({\n provider: \"clerk\",\n provider_account_id: clerkUserId,\n });\n\n if (accountError) {\n throw accountError;\n }\n\n return {\n provider: \"clerk\",\n providerAccountId: clerkUserId,\n };\n}\n","/* eslint-disable no-unused-vars */\n\nimport { DatabasePackageError } from \"@plyaz/errors\";\nimport type {\n AuthAdapterUser,\n AuthDeviceInfo,\n AUTHPROVIDER,\n AuthProviderAdapter as BaseAuthProvider,\n AuthSession,\n AuthUser,\n ConnectedAccount,\n Credentials,\n Tokens,\n} from \"@plyaz/types\";\n\nimport type { DeviceInfo } from \"../../libs/supabase.helper\";\n\nimport {\n createUser,\n createUserSession,\n findUserByEmailProvider,\n getLinkedAccounts,\n linkConnectedAccount,\n unlinkConnectedAccount,\n} from \"../../libs/supabase.helper\";\n\n/**\n * Extends base provider WITHOUT changing behavior\n */\nexport interface AuthProviderAdapter extends BaseAuthProvider {\n signIn(\n credentials: unknown\n ): Promise<{\n user: AuthAdapterUser;\n session: AuthSession;\n tokens: Tokens;\n }>;\n}\n\nexport class NextAuthAdapter implements AuthProviderAdapter {\n // -------------------\n // Identity\n // -------------------\n async signIn(\n provider: AUTHPROVIDER,\n credentials?: Credentials,\n deviceInfo?: AuthDeviceInfo\n ): Promise<{\n user: AuthAdapterUser;\n session: AuthSession;\n tokens: Tokens;\n }> {\n const userFindByEmail = await findUserByEmailProvider(\n credentials?.email ?? \"\",\n provider\n );\n\n if (!userFindByEmail) {\n return {\n user: { id: \"\", email: \"\" },\n session: { id: \"\", userId: \"\", expiresAt: new Date() },\n tokens: { accessToken: \"\" },\n };\n }\n\n const accounts = await getLinkedAccounts(userFindByEmail.id);\n\n if (accounts.length === 0) {\n return {\n user: { id: userFindByEmail.id, email: userFindByEmail.email },\n session: { id: \"\", userId: \"\", expiresAt: new Date() },\n tokens: { accessToken: \"\" },\n };\n }\n\n const rawSession = await createUserSession(\n accounts[0].id,\n deviceInfo ?? {\n ip: \"\",\n browser: \"\",\n os: \"\",\n userAgent: \"\",\n }\n );\n\n const session: AuthSession = {\n id: rawSession.id,\n userId: rawSession.userId,\n expiresAt: rawSession.expiresAt,\n };\n\n return {\n user: {\n id: accounts[0].id,\n email: accounts[0].providerEmail ?? '',\n },\n session,\n tokens: { accessToken: \"jwt-token\" },\n };\n }\n\n async signUp(\n provider: AUTHPROVIDER,\n credentials: Credentials,\n data?: AuthUser,\n deviceInfo?: DeviceInfo\n ): Promise<{\n user: AuthUser;\n session: AuthSession;\n tokens: Tokens;\n }> {\n const userFindByEmail = await findUserByEmailProvider(\n data?.email ?? \"\",\n provider\n );\n\n if (userFindByEmail) {\n throw new Error(\"User already registered\");\n }\n\n const user = await createUser(\n credentials.email,\n provider,\n data,\n credentials.password\n );\n\n if (!user) {\n throw new DatabasePackageError(\"Something went wrong\");\n }\n\n const rawSession = await createUserSession(\n user.id,\n deviceInfo ?? {\n ip: \"\",\n browser: \"\",\n os: \"\",\n userAgent: \"\",\n }\n );\n\n const session: AuthSession = {\n id: rawSession.id,\n userId: rawSession.userId,\n expiresAt: rawSession.expiresAt,\n };\n\n return {\n user,\n session,\n tokens: { accessToken: \"jwt-token\" },\n };\n }\n\n async signOut(_sessionId: string): Promise<void> {\n throw new DatabasePackageError(\"signOut handled by NextAuth\");\n }\n\n // -------------------\n // Session\n // -------------------\n async getSession(_sessionId: string): Promise<AuthSession | null> {\n return null;\n }\n\n async validateSession(_sessionId: string): Promise<boolean> {\n return true;\n }\n\n async refreshSession(\n _refreshToken: string\n ): Promise<{ session: AuthSession; tokens: Tokens }> {\n throw new DatabasePackageError(\"RefreshSession handled by NextAuth\");\n }\n\n // -------------------\n // Providers\n // -------------------\n async getOAuthUrl(\n _provider: AUTHPROVIDER,\n _redirectUri: string\n ): Promise<string> {\n throw new DatabasePackageError(\"OAuth handled by NextAuth\");\n }\n\n async handleOAuthCallback(\n _provider: AUTHPROVIDER,\n _code: string\n ): Promise<{ providerAccountId: string; profile: unknown }> {\n throw new DatabasePackageError(\"OAuth callback handled by NextAuth\");\n }\n\n // -------------------\n // Connected Accounts\n // -------------------\n async linkAccount(\n userId: string,\n provider: AUTHPROVIDER,\n data: ConnectedAccount\n ): Promise<ConnectedAccount> {\n return linkConnectedAccount(userId, provider, data);\n }\n\n async unlinkAccount(userId: string, accountId: string): Promise<void> {\n await unlinkConnectedAccount(userId, accountId);\n }\n\n async getLinkedAccounts(userId: string): Promise<ConnectedAccount[]> {\n return getLinkedAccounts(userId);\n }\n}\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n// custom.adapter.ts\nimport type { AuthDeviceInfo, AUTHPROVIDER, AuthUser, ConnectedAccount, AuthCredentials } from \"@plyaz/types\";\n\nimport {\n createUser,\n findUserByEmailProvider,\n updateLastLogin,\n createUserSession,\n getSession,\n validateSessionDB,\n deleteSession,\n refreshSessionDB,\n linkConnectedAccount,\n unlinkConnectedAccount,\n getLinkedAccounts,\n} from \"../../libs/supabase.helper\";\nimport { DatabasePackageError } from \"@plyaz/errors\";\nimport { BaseAuthProviderAdapter } from \"../base-auth.adapter\";\n\nexport class CustomAdapter extends BaseAuthProviderAdapter {\n async signIn(\n provider: string,\n credentials: AuthCredentials,\n deviceInfo?: AuthDeviceInfo\n ) {\n const user = await findUserByEmailProvider(credentials.email, provider);\n if (!user) throw new Error(\"User not found\");\n if (!user.isActive || user.isSuspended)\n throw new Error(\"User not active or suspended\");\n\n await updateLastLogin(user.id);\n\n const session = await createUserSession(\n user.id,\n deviceInfo ?? {\n ip: \"\",\n browser: \"\",\n os: \"\",\n userAgent: \"\",\n }\n );\n\n return { user, session, tokens: { accessToken: session.accessToken } };\n }\n\n async signUp(\n provider: string,\n credentials: AuthCredentials,\n data?: Partial<AuthUser>,\n deviceInfo?: AuthDeviceInfo\n ) {\n const userFindByEmail = await findUserByEmailProvider(data?.email ?? \"\", provider);\n if (userFindByEmail) {\n throw new DatabasePackageError(\"User already register\");\n }\n const user = await createUser(\n credentials.email,\n provider,\n data,\n credentials.password\n );\n\n const session = await createUserSession(\n user.id,\n deviceInfo ?? {\n ip: \"\",\n browser: \"\",\n os: \"\",\n userAgent: \"\",\n }\n );\n\n return { user, session, tokens: { accessToken: session.accessToken } };\n }\n\n async signOut(sessionId: string) {\n await deleteSession(sessionId);\n }\n\n async getSession(sessionId: string) {\n return await getSession(sessionId);\n }\n\n async validateSession(sessionId: string) {\n return await validateSessionDB(sessionId);\n }\n\n async refreshSession(sessionId: string) {\n const session = await refreshSessionDB(sessionId);\n return { session, tokens: { accessToken: session.accessToken } };\n }\n\n async getOAuthUrl(provider: string, redirectUri: string) {\n return `https://provider/oauth?redirect_uri=${redirectUri}`;\n }\n\n async handleOAuthCallback(provider: string, code: string) {\n globalThis.console.log(provider,code)\n return { providerAccountId: \"id\", profile: {} };\n }\n\n async linkAccount(\n userId: string,\n provider: AUTHPROVIDER,\n data: ConnectedAccount\n ) : Promise<ConnectedAccount | void> {\n return await linkConnectedAccount(userId, provider, data);\n }\n\n async unlinkAccount(userId: string, accountId: string) {\n await unlinkConnectedAccount(userId, accountId);\n }\n\n async getLinkedAccounts(userId: string) {\n return await getLinkedAccounts(userId);\n }\n}\n","import { randomBytes, pbkdf2Sync } from 'crypto';\nimport type { UserRepository } from '../db/repositories/user.repository';\nimport type { SessionManager } from '../core/session/session.manager';\nimport type { AuthTokens, AuthUser, Session } from '@plyaz/types';\nimport { AuthenticationError } from '@plyaz/errors';\nimport { NUMERIX } from '@plyaz/config';\nimport type { JwtManager } from '@/core/jwt/jwt.manager';\n\nexport class TraditionalAuthStrategy {\n constructor(\n private userRepo: UserRepository,\n private jwtManager: JwtManager,\n private sessionManager: SessionManager\n ) {}\n\n async authenticate(email: string, password: string): Promise<AuthUser> {\n const user = await this.userRepo.findByEmail(email);\n if (!user?.passwordHash) {\n throw new AuthenticationError('AUTH_INVALID_CREDENTIALS');\n }\n\n const isValid = await this.verifyPassword(password, user.passwordHash);\n if (!isValid) {\n throw new AuthenticationError('AUTH_INVALID_CREDENTIALS');\n }\n\n if (!user.isActive) {\n throw new AuthenticationError('AUTH_ACCOUNT_LOCKED');\n }\n\n if (user.isSuspended) {\n throw new AuthenticationError('AUTH_ACCOUNT_SUSPENDED');\n }\n\n return user;\n }\n\n async hashPassword(password: string): Promise<string> {\n const SALT_LENGTH = 32;\n const HASH_LENGTH = 64;\n const salt = randomBytes(SALT_LENGTH).toString('hex');\n const hash = pbkdf2Sync(password, salt, NUMERIX.THOUSAND, HASH_LENGTH, 'sha512').toString('hex');\n return `pbkdf2$${salt}$${hash}`;\n }\n\n async verifyPassword(password: string, hash: string): Promise<boolean> {\n const HASH_LENGTH = 64;\n if (hash.startsWith('pbkdf2$')) {\n const [, salt, storedHash] = hash.split('$');\n const computedHash = pbkdf2Sync(password, salt, NUMERIX.THOUSAND, HASH_LENGTH, 'sha512').toString('hex');\n return computedHash === storedHash;\n }\n return false;\n }\n\n async signUp(data: {\n email: string;\n password: string;\n displayName: string;\n firstName?: string;\n lastName?: string;\n }): Promise<{ user: AuthUser; session: Session; tokens: AuthTokens }> {\n // Check if user already exists\n const existingUser = await this.userRepo.findByEmail(data.email);\n if (existingUser) {\n throw new AuthenticationError('AUTH_INVALID_CREDENTIALS');\n }\n\n // Hash password\n const passwordHash = await this.hashPassword(data.password);\n\n // Create user\n const user = await this.userRepo.create({\n email: data.email,\n displayName: data.displayName,\n firstName: data.firstName,\n lastName: data.lastName,\n passwordHash,\n authProvider: 'EMAIL',\n isActive: true,\n isVerified: false\n } );\n\n // Create session\n const session = await this.sessionManager.createSession(user.id, {\n provider: 'EMAIL',\n userAgent: 'test',\n ipAddress: '127.0.0.1'\n });\n\n // Generate tokens\n const tokens = this.jwtManager.generateTokens(user);\n \n return { user, session, tokens };\n }\n\n async signIn(data: {\n email: string;\n password: string;\n }): Promise<{ user: AuthUser; session: Session; tokens: AuthTokens }> {\n // Authenticate user\n const user = await this.authenticate(data.email, data.password);\n\n // Create session\n const session = await this.sessionManager.createSession(user.id, {\n provider: 'EMAIL',\n userAgent: 'test',\n ipAddress: '127.0.0.1'\n });\n\n // Generate tokens\n const tokens = this.jwtManager.generateTokens(user);\n\n return { user, session, tokens };\n }\n}","import type { UserRepository } from \"../db/repositories/user.repository\";\nimport type { ConnectedAccountRepository } from \"../db/repositories/connected-account.repository\";\nimport type { AuthUser, ConnectedAccount } from \"@plyaz/types\";\n\n\nexport interface OAuthProfile {\n id: string;\n email: string;\n name: string;\n avatar?: string;\n provider: string;\n}\n\nexport class OAuthStrategy {\n constructor(\n private userRepo: UserRepository,\n private connectedAccountRepo: ConnectedAccountRepository\n ) {}\n\n async authenticate(\n profile: OAuthProfile,\n accessToken: string,\n refreshToken?: string\n ): Promise<AuthUser> {\n let connectedAccount = await this.connectedAccountRepo.findByProviderAndId(\n profile.provider,\n profile.id\n );\n\n if (connectedAccount) {\n await this.updateTokens(connectedAccount.id, accessToken, refreshToken);\n const user = await this.userRepo.findById(connectedAccount.userId);\n if (!user) throw new Error(\"User not found\");\n return user;\n }\n\n let user = await this.userRepo.findByEmail(profile.email);\n user ??= await this.createUserFromProfile(profile);\n if (!user) throw new Error(\"Failed to create user\");\n\n connectedAccount = await this.createConnectedAccount(\n user.id,\n profile,\n accessToken,\n refreshToken\n );\n\n return user;\n }\n\n private async createUserFromProfile(profile: OAuthProfile): Promise<AuthUser> {\n return this.userRepo.create({\n email: profile.email,\n displayName: profile.name,\n authProvider: \"GOOGLE\",\n isActive: true,\n isVerified: true,\n });\n }\n\n private async createConnectedAccount(\n userId: string,\n profile: OAuthProfile,\n accessToken: string,\n refreshToken?: string\n ): Promise<ConnectedAccount> {\n return this.connectedAccountRepo.create({\n userId,\n providerType: \"OAUTH\",\n provider: profile.provider,\n providerAccountId: profile.id,\n providerEmail: profile.email,\n providerDisplayName: profile.name,\n providerAvatarUrl: profile.avatar,\n accessTokenEncrypted: accessToken,\n refreshTokenEncrypted: refreshToken,\n isVerified: true,\n });\n }\n\n private async updateTokens(\n accountId: string,\n accessToken: string,\n refreshToken?: string\n ): Promise<void> {\n await this.connectedAccountRepo.update(accountId, {\n accessTokenEncrypted: accessToken,\n refreshTokenEncrypted: refreshToken,\n });\n }\n\n // getAuthorizationUrl(provider: string, redirectUri: string, state?: string): string {\n // const baseUrls = {\n // google: 'https://accounts.google.com/o/oauth2/v2/auth',\n // facebook: 'https://www.facebook.com/v18.0/dialog/oauth',\n // github: 'https://github.com/login/oauth/authorize'\n // };\n\n // const baseUrl = baseUrls[provider as keyof typeof baseUrls] || `https://oauth.${provider}.com/authorize`;\n // const params = new URLSearchParams({\n // response_type: 'code',\n // client_id: 'your_client_id',\n // redirect_uri: redirectUri,\n // scope: 'email profile',\n // ...(state && { state })\n // });\n\n // return `${baseUrl}?${params.toString()}`;\n // }\n\n async linkAccount(\n userId: string,\n provider: string,\n profileData: {id:string,email:string,avatar:string,name:string}\n ): Promise<ConnectedAccount> {\n return this.connectedAccountRepo.create({\n userId,\n providerType: \"OAUTH\",\n provider,\n providerAccountId: profileData.id,\n providerEmail: profileData.email,\n providerDisplayName: profileData.name,\n providerAvatarUrl: profileData.avatar,\n isVerified: true,\n isPrimary: false,\n });\n }\n}\n","/**\n * @fileoverview Base authentication provider interface\n * @module @plyaz/auth/providers/base/auth-provider\n */\n\nimport type { AuthTokens, AuthUser } from \"@plyaz/types\";\n\n\n\nexport interface AuthProviderConfig {\n clientId: string;\n clientSecret: string;\n redirectUri: string;\n scopes?: string[];\n}\n\nexport interface AuthProvider {\n readonly name: string;\n readonly type: 'oauth' | 'traditional' | 'web3';\n \n initialize(config: AuthProviderConfig): Promise<void>;\n authenticate(credentials: {code:string}): Promise<{ user: AuthUser; tokens: AuthTokens }>;\n refreshToken(refreshToken: string): Promise<AuthTokens>;\n revokeToken(token: string): Promise<void>;\n getUserProfile(accessToken: string): Promise<AuthUser>;\n}\n\nexport abstract class BaseAuthProvider implements AuthProvider {\n abstract readonly name: string;\n abstract readonly type: 'oauth' | 'traditional' | 'web3';\n \n protected config?: AuthProviderConfig;\n \n async initialize(config: AuthProviderConfig): Promise<void> {\n this.config = config;\n }\n \n abstract authenticate(credentials: {code:string}): Promise<{ user: AuthUser; tokens: AuthTokens }>;\n abstract refreshToken(refreshToken: string): Promise<AuthTokens>;\n abstract revokeToken(token: string): Promise<void>;\n abstract getUserProfile(accessToken: string): Promise<AuthUser>;\n}","/**\n * @fileoverview Facebook OAuth provider implementation\n * @module @plyaz/auth/providers/oauth/facebook\n */\n\nimport type { AuthTokens, AuthUser } from \"@plyaz/types\";\nimport { BaseAuthProvider } from \"../base\";\nimport type { ExpireAuthToken } from \"./google.provider\";\nimport { NUMERIX } from \"@plyaz/config\";\n\n\nexport class FacebookProvider extends BaseAuthProvider {\n readonly name = 'facebook';\n readonly type = 'oauth' as const;\n\n async authenticate(credentials:{code:string}): Promise<{ user: AuthUser; tokens: AuthTokens }> {\n const tokenResponse = await this.exchangeCodeForTokens(credentials.code) as { access_token: string; refresh_token: string; expires_in: number };\n const userProfile = await this.getUserProfile(tokenResponse.access_token);\n \n const tokens: ExpireAuthToken = {\n accessToken: tokenResponse.access_token,\n refreshToken: tokenResponse.refresh_token,\n expiresAt: new Date(Date.now() + tokenResponse.expires_in * NUMERIX.THOUSAND),\n expiresIn: 0,\n tokenType: \"\",\n };\n\n return { user: userProfile, tokens };\n }\n\n async refreshToken(refreshToken: string): Promise<ExpireAuthToken> {\n const response = await globalThis.fetch('https://graph.facebook.com/v18.0/oauth/access_token', {\n method: 'GET',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n });\n\n const data = await response.json() as { access_token: string; expires_in: number };\n \n return {\n accessToken: data.access_token,\n refreshToken: refreshToken,\n expiresAt: new Date(Date.now() + data.expires_in * NUMERIX.THOUSAND),\n expiresIn: 0,\n tokenType: \"\",\n };\n }\n\n async revokeToken(token: string): Promise<void> {\n await globalThis.fetch(`https://graph.facebook.com/v18.0/me/permissions?access_token=${token}`, {\n method: 'DELETE'\n });\n }\n\n async getUserProfile(accessToken: string): Promise<AuthUser> {\n const response = await globalThis.fetch(`https://graph.facebook.com/v18.0/me?fields=id,name,email,picture&access_token=${accessToken}`);\n const profile = await response.json() as { id: string; email: string; name: string; picture?: { data?: { url: string } } };\n \n return {\n id: profile.id,\n email: profile.email,\n firstName: profile.name?.split(' ')[0],\n lastName: profile.name?.split(' ').slice(1).join(' '),\n displayName: profile.name,\n avatarUrl: profile.picture?.data?.url,\n authProvider: 'FACEBOOK',\n isActive: true,\n isVerified: true,\n createdAt: new Date(),\n updatedAt: new Date()\n } as AuthUser;\n }\n\n getAuthUrl(): string {\n if (!this.config) {\n throw new Error('Provider not initialized');\n }\n \n const params = new URLSearchParams({\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n response_type: 'code',\n scope: this.config.scopes?.join(',') ?? 'email,public_profile',\n });\n \n return `https://www.facebook.com/v18.0/dialog/oauth?${params.toString()}`;\n }\n\n private async exchangeCodeForTokens(code: string) : Promise<unknown>{\n const response = await globalThis.fetch('https://graph.facebook.com/v18.0/oauth/access_token', {\n method: 'GET',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n });\n globalThis.console.log(code)\n\n return await response.json();\n }\n}","/**\n * @fileoverview GitHub OAuth provider implementation\n * @module @plyaz/auth/providers/oauth/github\n */\n\nimport type { AuthTokens, AuthUser } from \"@plyaz/types\";\nimport { BaseAuthProvider } from \"../base\";\nimport type { ExpireAuthToken } from \"./google.provider\";\nimport { NUMERIX } from \"@plyaz/config\";\nimport { Buffer } from 'buffer';\n\n\nexport class GitHubProvider extends BaseAuthProvider {\n readonly name = \"github\";\n readonly type = \"oauth\" as const;\n\n async authenticate(credentials: {\n code: string;\n }): Promise<{ user: AuthUser; tokens: AuthTokens }> {\n const tokenResponse = (await this.exchangeCodeForTokens(\n credentials.code\n )) as { access_token: string; refresh_token?: string; expires_in?: number };\n const userProfile = await this.getUserProfile(tokenResponse.access_token);\n\n const tokens: ExpireAuthToken = {\n accessToken: tokenResponse.access_token,\n refreshToken: tokenResponse.refresh_token ?? \"\",\n expiresAt: new Date(\n Date.now() + (tokenResponse.expires_in ?? NUMERIX.THIRTY_SIX_HUNDERD) * NUMERIX.THOUSAND\n ),\n expiresIn: 0,\n tokenType: \"\",\n };\n\n return { user: userProfile, tokens };\n }\n\n async refreshToken(refreshToken: string): Promise<ExpireAuthToken> {\n const response = await globalThis.fetch(\n \"https://github.com/login/oauth/access_token\",\n {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: new URLSearchParams({\n client_id: this.config!.clientId,\n client_secret: this.config!.clientSecret,\n refresh_token: refreshToken,\n grant_type: \"refresh_token\",\n }),\n }\n );\n\n const data = (await response.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n };\n\n return {\n accessToken: data.access_token,\n refreshToken: data.refresh_token ?? refreshToken,\n expiresAt: new Date(Date.now() + (data.expires_in ?? NUMERIX.THIRTY_SIX_HUNDERD) * NUMERIX.THOUSAND),\n expiresIn: 0,\n tokenType: \"\",\n };\n }\n\n async revokeToken(token: string): Promise<void> {\n await globalThis.fetch(\n `https://api.github.com/applications/${this.config!.clientId}/token`,\n {\n method: \"DELETE\",\n headers: {\n Authorization: `Basic ${Buffer.from(\n `${this.config!.clientId}:${this.config!.clientSecret}`\n ).toString(\"base64\")}`,\n },\n body: JSON.stringify({ access_token: token }),\n }\n );\n }\n\n async getUserProfile(accessToken: string): Promise<AuthUser> {\n const response = await globalThis.fetch(\"https://api.github.com/user\", {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n const profile = (await response.json()) as {\n id: number;\n email: string;\n name?: string;\n login: string;\n avatar_url: string;\n };\n\n return {\n id: profile.id.toString(),\n email: profile.email,\n firstName: profile.name?.split(\" \")[0],\n lastName: profile.name?.split(\" \").slice(1).join(\" \"),\n displayName: profile.name ?? profile.login,\n avatarUrl: profile.avatar_url,\n authProvider: \"GITHUB\",\n isActive: true,\n isVerified: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n } as AuthUser;\n }\n\n getAuthUrl(): string {\n if (!this.config) {\n throw new Error(\"Provider not initialized\");\n }\n\n const params = new URLSearchParams({\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n scope: this.config.scopes?.join(\" \") ?? \"user:email\",\n });\n\n return `https://github.com/login/oauth/authorize?${params.toString()}`;\n }\n\n private async exchangeCodeForTokens(code: string):Promise<unknown> {\n const response = await globalThis.fetch(\n \"https://github.com/login/oauth/access_token\",\n {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: new URLSearchParams({\n client_id: this.config!.clientId,\n client_secret: this.config!.clientSecret,\n code,\n redirect_uri: this.config!.redirectUri,\n }),\n }\n );\n\n return await response.json();\n }\n}\n","/**\n * @fileoverview Google OAuth provider implementation\n * @module @plyaz/auth/providers/oauth/google\n */\n\nimport type { AuthUser, AuthTokens } from \"@plyaz/types\";\nimport { BaseAuthProvider } from \"../base\";\nimport { NUMERIX } from \"@plyaz/config\";\n// Ensure AuthTokens includes expiresAt: Date in its definition\n\nexport interface ExpireAuthToken extends AuthTokens {\n expiresAt: Date;\n}\nexport class GoogleProvider extends BaseAuthProvider {\n readonly name = \"google\";\n readonly type = \"oauth\" as const;\n\n async authenticate(credentials: {\n code: string;\n }): Promise<{ user: AuthUser; tokens: AuthTokens }> {\n const tokenResponse = (await this.exchangeCodeForTokens(\n credentials.code\n )) as {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n };\n const userProfile = await this.getUserProfile(tokenResponse.access_token);\n\n const tokens: ExpireAuthToken = {\n accessToken: tokenResponse.access_token,\n refreshToken: tokenResponse.refresh_token,\n expiresAt: new Date(Date.now() + tokenResponse.expires_in * NUMERIX.THOUSAND),\n expiresIn: 0,\n tokenType: \"\",\n };\n\n return { user: userProfile, tokens };\n }\n\n async refreshToken(refreshToken: string): Promise<ExpireAuthToken> {\n const response = await globalThis.fetch(\"https://oauth2.googleapis.com/token\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n client_id: this.config!.clientId,\n client_secret: this.config!.clientSecret,\n refresh_token: refreshToken,\n grant_type: \"refresh_token\",\n }),\n });\n\n const data = await response.json();\n\n return {\n accessToken: data.access_token,\n refreshToken: data.refresh_token ?? refreshToken,\n expiresAt: new Date(Date.now() + data.expires_in * NUMERIX.THOUSAND),\n expiresIn: 0,\n tokenType: \"\",\n };\n }\n\n async revokeToken(token: string): Promise<void> {\n await globalThis.fetch(`https://oauth2.googleapis.com/revoke?token=${token}`, {\n method: \"POST\",\n });\n }\n\n async getUserProfile(accessToken: string): Promise<AuthUser> {\n const response = await globalThis.fetch(\n \"https://www.googleapis.com/oauth2/v2/userinfo\",\n {\n headers: { Authorization: `Bearer ${accessToken}` },\n }\n );\n\n const profile = await response.json();\n\n return {\n id: profile.id,\n email: profile.email,\n firstName: profile.given_name,\n lastName: profile.family_name,\n displayName:\n profile.name ?? `${profile.given_name} ${profile.family_name}`,\n avatarUrl: profile.picture,\n authProvider: \"GOOGLE\",\n isActive: true,\n isVerified: profile.verified_email,\n createdAt: new Date(),\n updatedAt: new Date(),\n } as AuthUser;\n }\n\n private async exchangeCodeForTokens(code: string):Promise<unknown> {\n const response = await globalThis.fetch(\"https://oauth2.googleapis.com/token\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n client_id: this.config!.clientId,\n client_secret: this.config!.clientSecret,\n code,\n grant_type: \"authorization_code\",\n redirect_uri: this.config!.redirectUri,\n }),\n });\n\n return await response.json();\n }\n\n getAuthUrl(): string {\n if (!this.config) {\n throw new Error(\"Provider not initialized\");\n }\n\n const params = new URLSearchParams({\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n response_type: \"code\",\n scope: this.config.scopes?.join(\" \") ?? \"openid email profile\",\n });\n\n return `https://accounts.google.com/oauth/authorize?${params.toString()}`;\n }\n}\n","/**\n * @fileoverview Sign-in authentication flow\n * @module @plyaz/auth/flows/sign-in\n */\n\nimport { NUMERIX } from \"@plyaz/config\";\nimport type { AuthTokens, AuthUser } from \"@plyaz/types\";\n\nexport interface SignInCredentials {\n email: string;\n password: string;\n rememberMe?: boolean;\n}\n\nexport interface SignInResult {\n user: AuthUser;\n tokens: AuthTokens;\n requiresMFA?: boolean;\n mfaToken?: string;\n}\n\n/** User repository type based on usage */\nexport interface UserRepositorySignin {\n findByEmail(email: string): Promise<AuthUser | null>;\n findById(userId: string): Promise<AuthUser | null>;\n}\n\n/** JWT manager type based on usage */\nexport interface JWTManagerSignin {\n generateTokens(userId: string): Promise<AuthTokens>;\n verifyToken(token: string): Promise<{ userId: string }>;\n}\n\n/** Session manager type based on usage */\nexport interface SessionManagerSignin {\n createSession(session: { userId: string; expiresAt: Date; metadata?: Record<string, true> }): Promise<void>;\n}\n\n/** Password service type based on usage */\nexport interface PasswordServiceSignin {\n verify(password: string, passwordHash: string | undefined): Promise<boolean>;\n}\n\nexport class SignInFlow {\n constructor(\n private userRepository: UserRepositorySignin,\n private jwtManager: JWTManagerSignin,\n private sessionManager: SessionManagerSignin,\n private passwordService: PasswordServiceSignin\n ) {}\n\n async execute(credentials: SignInCredentials): Promise<SignInResult> {\n const isValid = await this.validateCredentials(credentials.email, credentials.password);\n if (!isValid) {\n throw new Error('Invalid credentials');\n }\n\n const user = await this.userRepository.findByEmail(credentials.email);\n if (!user) {\n throw new Error('User not found');\n }\n\n const tokens = await this.jwtManager.generateTokens(user.id);\n \n if (credentials.rememberMe) {\n const thirty = 30;\n await this.sessionManager.createSession({\n userId: user.id,\n expiresAt: new Date(Date.now() + thirty * NUMERIX.TWENTY_FOUR * NUMERIX.SIXTY * NUMERIX.SIXTY * NUMERIX.THOUSAND), // 30 days\n metadata: { rememberMe: true }\n });\n }\n\n return { user, tokens };\n }\n\n async validateCredentials(email: string, password: string): Promise<boolean> {\n const user = await this.userRepository.findByEmail(email);\n if (!user) return false;\n \n return await this.passwordService.verify(password, user.passwordHash);\n }\n\n async handleMFA(mfaToken: string, code: string): Promise<SignInResult> {\n const payload = await this.jwtManager.verifyToken(mfaToken);\n const user = await this.userRepository.findById(payload.userId);\n \n if (!user) {\n throw new Error('User not found');\n }\n\n const isValidCode = await this.verifyMFACode(user.id, code);\n if (!isValidCode) {\n throw new Error('Invalid MFA code');\n }\n\n const tokens = await this.jwtManager.generateTokens(user.id);\n return { user, tokens };\n }\n\n private async verifyMFACode(userId: string, code: string): Promise<boolean> { \n globalThis.console.log(userId,code)\n\n return true; // Placeholder\n }\n}\n","/**\n * @fileoverview Sign-up authentication flow\n * @module @plyaz/auth/flows/sign-up\n */\n\nimport type { AuthTokens, AuthUser } from '@plyaz/types';\n\nexport interface SignUpData {\n email: string;\n password: string;\n firstName?: string;\n lastName?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface SignUpResult {\n user: AuthUser;\n tokens: AuthTokens;\n requiresVerification?: boolean;\n}\n\n/** User repository type based on usage */\nexport interface UserRepositorySignUp {\n findByEmail(email: string): Promise<AuthUser | null>;\n create(data: {\n email: string;\n passwordHash: string;\n firstName?: string;\n lastName?: string;\n metadata?: Record<string, string >;\n emailVerified: boolean;\n }): Promise<AuthUser>;\n findById(userId: string): Promise<AuthUser>;\n updateEmailVerification(userId: string, verified: boolean): Promise<AuthUser | null>;\n}\n\n/** JWT manager type based on usage */\nexport interface JWTManagerSignUp {\n generateTokens(userId: string): Promise<AuthTokens>;\n generateVerificationToken(userId: string): Promise<string>;\n verifyToken(token: string): Promise<{ userId: string }>;\n}\n\n/** Password service type based on usage */\nexport interface PasswordServiceSignUp {\n hash(password: string): Promise<string>;\n}\n\n/** Email service type based on usage */\nexport interface EmailService {\n sendVerificationEmail(args: { to: string; token: string; userId: string }): Promise<void>;\n}\n\nexport class SignUpFlow {\n constructor(\n private userRepository: UserRepositorySignUp,\n private jwtManager: JWTManagerSignUp,\n private passwordService: PasswordServiceSignUp,\n private emailService: EmailService\n ) {}\n\n async execute(data: SignUpData): Promise<SignUpResult> {\n const emailExists = await this.userRepository.findByEmail(data.email);\n if (emailExists) {\n throw new Error('Email already exists');\n }\n\n const isValidEmail = await this.validateEmail(data.email);\n if (!isValidEmail) {\n throw new Error('Invalid email format');\n }\n\n const passwordHash = await this.passwordService.hash(data.password);\n \n const user = await this.userRepository.create({\n email: data.email,\n passwordHash,\n firstName: data.firstName,\n lastName: data.lastName,\n metadata: data.metadata,\n emailVerified: false\n });\n\n const tokens = await this.jwtManager.generateTokens(user.id);\n \n await this.sendVerificationEmail(user.id);\n\n return { \n user, \n tokens, \n requiresVerification: true \n };\n }\n\n async validateEmail(email: string): Promise<boolean> {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n }\n\n async sendVerificationEmail(userId: string): Promise<void> {\n const verificationToken = await this.jwtManager.generateVerificationToken(userId);\n const user = await this.userRepository.findById(userId);\n \n await this.emailService.sendVerificationEmail({\n to: user.email,\n token: verificationToken,\n userId\n });\n }\n\n async verifyEmail(token: string): Promise<AuthUser> {\n const payload = await this.jwtManager.verifyToken(token);\n const user = await this.userRepository.updateEmailVerification(payload.userId, true);\n \n if (!user) {\n throw new Error('User not found');\n }\n\n return user;\n }\n}\n","import type { CanActivate, ExecutionContext } from '@nestjs/common';\nimport { Injectable } from '@nestjs/common';\nimport type { Reflector } from '@nestjs/core';\n\nimport type { SessionManager } from '../../core/session/session.manager';\nimport { AuthenticationError } from '@plyaz/errors';\nimport type { JwtManager } from '@/core';\n\n@Injectable()\nexport class AuthGuard implements CanActivate {\n constructor(\n private jwtManager: JwtManager,\n private sessionManager: SessionManager,\n private reflector: Reflector\n ) {}\n\n // Explicit return type for canActivate\n async canActivate(context: ExecutionContext): Promise<boolean> {\n const isPublic: boolean | undefined = this.reflector.get<boolean>('isPublic', context.getHandler());\n if (isPublic) return true;\n\n const request = context.switchToHttp().getRequest();\n const token: string | null = this.extractToken(request);\n if (!token) throw new AuthenticationError('AUTH_TOKEN_INVALID');\n\n try {\n const payload = this.jwtManager.verifyAccessToken(token);\n const session = await this.sessionManager.getSession(payload.sessionId);\n\n if (!session) throw new AuthenticationError('AUTH_SESSION_EXPIRED');\n\n await this.sessionManager.updateLastActive(session.id);\n\n // Attach user and session to request\n request.user = payload;\n request.session = session;\n\n return true;\n } catch (error: unknown) {\n if (error instanceof Error) {\n if (error.name === 'TokenExpiredError') {\n throw new AuthenticationError('AUTH_TOKEN_EXPIRED');\n }\n }\n throw new AuthenticationError('AUTH_TOKEN_INVALID');\n }\n }\n\n // Explicit return type for private helper\n private extractToken(request: { headers: { authorization?: string } }): string | null {\n const authHeader = request.headers.authorization;\n if (!authHeader?.startsWith('Bearer ')) return null;\n const seven = 7;\n return authHeader.substring(seven);\n }\n}\n","import type { CanActivate, ExecutionContext } from '@nestjs/common';\nimport { Injectable } from '@nestjs/common';\nimport type { Reflector } from '@nestjs/core';\nimport type { RoleManager } from '../../rbac/role.manager';\nimport { AuthenticationError } from '@plyaz/errors';\n\n\n@Injectable()\nexport class RolesGuard implements CanActivate {\n constructor(\n private roleManager: RoleManager,\n private reflector: Reflector\n ) {}\n\n async canActivate(context: ExecutionContext): Promise<boolean> {\n const requiredRoles = this.reflector.get<string[]>('roles', context.getHandler());\n if (!requiredRoles) return true;\n\n const request = context.switchToHttp().getRequest();\n const user = request.user;\n \n if (!user) throw new AuthenticationError('AUTH_INVALID_CREDENTIALS');\n\n const hasRole = await this.roleManager.hasAnyRole(user.sub, requiredRoles);\n if (!hasRole) {\n throw new AuthenticationError('AUTH_ROLE_REQUIRED');\n }\n\n return true;\n }\n}","import { Injectable, type CanActivate, type ExecutionContext } from '@nestjs/common';\n\nimport type { Reflector } from '@nestjs/core';\nimport type { PermissionChecker } from '../../rbac/permission-checker';\nimport { AuthenticationError } from '@plyaz/errors';\n\n/**\n * Typed request interface including user and request data\n */\ninterface TypedRequest {\n user?: {\n sub?: string;\n userId?: string;\n };\n params?: Record<string, string>;\n query?: Record<string, string>;\n body?: Record<string, string>;\n permissionResult?: unknown;\n}\n\n/**\n * Permission metadata interface\n */\ninterface PermissionMetadata {\n resource: string;\n action: string;\n conditions?: Record<string, string>;\n}\n\n@Injectable()\nexport class PermissionsGuard implements CanActivate {\n constructor(\n private readonly reflector: Reflector,\n private readonly permissionChecker: PermissionChecker\n ) {}\n\n async canActivate(context: ExecutionContext): Promise<boolean> {\n const request: TypedRequest = context.switchToHttp().getRequest();\n const permissionMetadata = this.getPermissionMetadata(context);\n\n if (!permissionMetadata) return true; // no permission required\n\n const user = request.user;\n if (!user) {\n throw new AuthenticationError(\n 'AUTH_INVALID_CREDENTIALS'\n );\n }\n\n const permissionContext = this.buildPermissionContext(request, permissionMetadata);\n\n const result = await this.permissionChecker.checkPermission(\n user.sub ?? user.userId ?? '',\n permissionMetadata.resource,\n permissionMetadata.action,\n permissionContext\n );\n\n if (!result.granted) {\n throw new AuthenticationError(\n 'AUTH_INSUFFICIENT_PERMISSIONS'\n );\n }\n\n request.permissionResult = result; // attach for handler usage\n\n return true;\n }\n\n private getPermissionMetadata(context: ExecutionContext): PermissionMetadata | null {\n const permissionData = this.reflector.get<[string, string] | PermissionMetadata>(\n 'permission',\n context.getHandler()\n );\n\n if (!permissionData) return null;\n\n if (Array.isArray(permissionData)) {\n return { resource: permissionData[0], action: permissionData[1] };\n }\n\n return permissionData;\n }\n\n private buildPermissionContext(\n request: TypedRequest,\n metadata: PermissionMetadata\n ): Record<string, string> {\n const context: Record<string, string> = {};\n\n if (request.user) {\n context.ownerId = request.user.sub ?? request.user.userId ?? '';\n }\n\n if (request.params) Object.assign(context, request.params);\n\n if (request.query) {\n const relevantQueryParams = ['organizationId', 'teamId', 'projectId'];\n for (const param of relevantQueryParams) {\n if (request.query[param]) context[param] = request.query[param];\n }\n }\n\n if (request.body) {\n const relevantBodyFields = ['ownerId', 'organizationId', 'teamId', 'projectId'];\n for (const field of relevantBodyFields) {\n if (request.body[field]) context[field] = request.body[field];\n }\n }\n\n if (metadata.conditions) Object.assign(context, metadata.conditions);\n\n return context;\n }\n}\n","/**\n * @fileoverview @Auth() and @Public() decorators\n * @module @plyaz/auth/server/decorators\n */\n\nimport { applyDecorators, SetMetadata, UseGuards } from '@nestjs/common';\nimport { AuthGuard } from '../guards/auth.guard';\n\nexport const IS_PUBLIC_KEY = 'isPublic';\n\n/**\n * Decorator to require authentication for endpoint\n * Combines @UseGuards(AuthGuard) for convenience\n * \n * @example\n * ```typescript\n * @Get('protected')\n * @Auth()\n * getProtectedData(@CurrentUser() user: User) {\n * return { message: 'This is protected data' };\n * }\n * ```\n */\nexport const Auth = (): MethodDecorator & ClassDecorator => \n applyDecorators(\n UseGuards(AuthGuard),\n );\n\n/**\n * Decorator to mark endpoint as public (skip authentication)\n * \n * @example\n * ```typescript\n * @Get('health')\n * @Public()\n * getHealth() {\n * return { status: 'ok' };\n * }\n * ```\n */\n\nexport const Public = (): MethodDecorator & ClassDecorator => \n SetMetadata(IS_PUBLIC_KEY, true);","import type { ExecutionContext } from '@nestjs/common';\nimport { SetMetadata, createParamDecorator } from '@nestjs/common';\n\n// Public decorator\nexport const Public = (): MethodDecorator & ClassDecorator =>\n SetMetadata('isPublic', true);\n\n// Roles decorator\nexport const Roles = (...roles: string[]): MethodDecorator & ClassDecorator =>\n SetMetadata('roles', roles);\n\n// Permissions decorator\nexport const Permissions = (...permissions: string[]): MethodDecorator & ClassDecorator =>\n SetMetadata('permissions', permissions);\nexport const CurrentUser = createParamDecorator(\n (data: unknown, ctx: ExecutionContext) => {\n const request = ctx.switchToHttp().getRequest();\n return request.user;\n },\n);\n\nexport const CurrentSession = createParamDecorator(\n (data: unknown, ctx: ExecutionContext) => {\n const request = ctx.switchToHttp().getRequest();\n return request.session;\n },\n);\n\nexport const Auth = ():void => {\n \n};","/**\n * @fileoverview @CurrentUser() parameter decorator\n * @module @plyaz/auth/server/decorators\n */\n\nimport type { ExecutionContext } from '@nestjs/common';\nimport { createParamDecorator } from '@nestjs/common';\nimport type { User } from '@/common/types/auth.types';\n\n/**\n * Parameter decorator to inject authenticated user into controller methods\n * \n * @example\n * ```typescript\n * @Get('profile')\n * @Auth()\n * getProfile(@CurrentUser() user: User) {\n * return { id: user.id, email: user.email };\n * }\n * ```\n */\nexport const CurrentUser = createParamDecorator(\n (data: keyof User | undefined, ctx: ExecutionContext): User => {\n const request = ctx.switchToHttp().getRequest();\n const user = request.user;\n\n // Return specific property if requested\n return data ? user?.[data] : user;\n },\n);\n\n/**\n * Get access token from request\n * \n * @example\n * ```typescript\n * @Post('logout')\n * @Auth()\n * async logout(@CurrentToken() token: string) {\n * await this.authService.signOut(token);\n * }\n * ```\n */\nexport const CurrentToken = createParamDecorator(\n (data: unknown, ctx: ExecutionContext): string => {\n const request = ctx.switchToHttp().getRequest();\n return request.accessToken;\n },\n);","import { SetMetadata } from '@nestjs/common';\n\n/**\n * Permission decorator metadata key\n */\nexport const PERMISSION_KEY = 'permission';\n\n/**\n * Permission decorator for setting required permissions\n * @param resource - Resource name (e.g., 'campaigns', 'users', 'organizations')\n * @param action - Action name (e.g., 'create', 'read', 'update', 'delete')\n * @param conditions - Optional conditions for the permission\n * @returns Method & Class decorator\n */\nexport const Permission = (\n resource: string,\n action: string,\n conditions?: Record<string, string>\n): MethodDecorator & ClassDecorator => {\n const permissionData = conditions \n ? { resource, action, conditions }\n : [resource, action];\n \n return SetMetadata(PERMISSION_KEY, permissionData);\n};\n\n/**\n * Permissions decorator for setting multiple required permissions\n * User must have ALL specified permissions\n * @param permissions - Array of permission objects\n * @returns Method & Class decorator\n */\nexport const Permissions = (\n permissions: Array<{ resource: string; action: string; conditions?: Record<string, string> }>\n): MethodDecorator & ClassDecorator => {\n return SetMetadata('permissions', permissions);\n};\n\n/**\n * AnyPermission decorator for setting alternative permissions\n * User must have ANY of the specified permissions\n * @param permissions - Array of permission objects\n * @returns Method & Class decorator\n */\nexport const AnyPermission = (\n permissions: Array<{ resource: string; action: string; conditions?: Record<string, string> }>\n): MethodDecorator & ClassDecorator => {\n return SetMetadata('anyPermission', permissions);\n};\n","/**\n * @fileoverview Session middleware for @plyaz/auth\n * @module @plyaz/auth/server/middleware/session-middleware\n *\n * @description\n * NestJS middleware for session refresh management. Checks if access token\n * is close to expiry and auto-refreshes if refresh token is valid.\n * Sets new tokens in response cookies for seamless user experience.\n *\n * @example\n * ```typescript\n * import { SessionMiddleware } from '@plyaz/auth';\n *\n * @Module({\n * providers: [SessionMiddleware]\n * })\n * export class AppModule implements NestModule {\n * configure(consumer: MiddlewareConsumer) {\n * consumer.apply(SessionMiddleware).forRoutes('*');\n * }\n * }\n * ```\n */\n\nimport type { NestMiddleware } from \"@nestjs/common\";\nimport { Injectable, Logger } from \"@nestjs/common\";\nimport type { Request, Response, NextFunction } from \"express\";\nimport type { TokenService } from \"../services/token.service\";\nimport type { SessionService } from \"../services/session.service\";\nimport { NUMERIX } from \"@plyaz/config\";\n\n/**\n * Session middleware configuration\n */\ninterface SessionMiddlewareConfig {\n /** Refresh threshold in seconds (default: 300 = 5 minutes) */\n refreshThreshold: number;\n /** Cookie options for tokens */\n cookieOptions: {\n httpOnly: boolean;\n secure: boolean;\n sameSite: \"strict\" | \"lax\" | \"none\";\n path: string;\n };\n}\n\n/**\n * Session middleware implementation\n * Manages session refresh and token rotation\n */\n@Injectable()\nexport class SessionMiddleware implements NestMiddleware {\n private readonly logger = new Logger(SessionMiddleware.name);\n private readonly config: SessionMiddlewareConfig;\n\n constructor(\n private tokenService: TokenService,\n private sessionService: SessionService\n ) {\n this.config = {\n refreshThreshold: 300, // 5 minutes\n cookieOptions: {\n httpOnly: true,\n secure: globalThis.process.env.NODE_ENV === \"production\",\n sameSite: \"lax\",\n path: \"/\",\n },\n };\n }\n\n /**\n * Middleware function to handle session refresh\n * @param req - HTTP request\n * @param res - HTTP response\n * @param next - Next function\n */\n async use(req: Request, res: Response, next: NextFunction): Promise<void> {\n try {\n const accessToken = this.extractAccessToken(req);\n const refreshToken = this.extractRefreshToken(req);\n\n if (!accessToken || !refreshToken) {\n // No tokens present, continue without refresh\n return next();\n }\n\n // Check if access token needs refresh\n const shouldRefresh = await this.shouldRefreshToken(accessToken);\n\n if (shouldRefresh) {\n await this.refreshTokens(req, res, refreshToken);\n }\n\n next();\n } catch (error) {\n this.logger.error(\"Session middleware error\", error);\n // Don't block the request on refresh errors\n next();\n }\n }\n\n /**\n * Check if token should be refreshed\n * @param accessToken - Access token to check\n * @returns True if token should be refreshed\n * @private\n */\n private async shouldRefreshToken(accessToken: string): Promise<boolean> {\n try {\n const timeUntilExpiry =\n this.tokenService.getTimeUntilExpiration(accessToken);\n\n if (timeUntilExpiry === null) {\n return false; // Invalid token, don't refresh\n }\n\n // Refresh if token expires within threshold\n return timeUntilExpiry <= this.config.refreshThreshold;\n } catch (error) {\n this.logger.debug(\"Error checking token expiry\", error);\n return false;\n }\n }\n\n /**\n * Refresh tokens and update cookies\n * @param req - HTTP request\n * @param res - HTTP response\n * @param refreshToken - Refresh token\n * @private\n */\n private async refreshTokens(\n req: Request,\n res: Response,\n refreshToken: string\n ): Promise<void> {\n try {\n this.logger.debug(\"Refreshing tokens\");\n\n // Validate refresh token first\n const validationResult =\n await this.tokenService.validateRefreshToken(refreshToken);\n\n if (!validationResult.valid) {\n this.logger.warn(\"Invalid refresh token, clearing cookies\");\n this.clearTokenCookies(res);\n return;\n }\n\n // Get user roles and permissions for new tokens\n const payload = validationResult.payload;\n const userRoles = payload?.roles;\n const userPermissions = payload?.permissions;\n\n // Generate new token pair\n const tokenPair = await this.tokenService.refreshTokenPair(\n refreshToken,\n userRoles,\n userPermissions\n );\n\n // Set new tokens in cookies\n this.setTokenCookies(res, tokenPair.accessToken, tokenPair.refreshToken);\n\n // Update request with new access token for downstream handlers\n this.updateRequestToken(req, tokenPair.accessToken);\n\n this.logger.log(\"Tokens refreshed successfully\");\n } catch (error) {\n this.logger.error(\"Failed to refresh tokens\", error);\n // Clear invalid tokens\n this.clearTokenCookies(res);\n }\n }\n\n /**\n * Extract access token from request\n * @param req - HTTP request\n * @returns Access token or null\n * @private\n */\n private extractAccessToken(req: Request): string | null {\n // Check Authorization header first\n const authHeader = req.headers.authorization;\n if (authHeader?.startsWith(\"Bearer \")) {\n const seven = 7;\n return authHeader.substring(seven);\n }\n\n // Check cookies\n return req.cookies?.accessToken ?? null;\n }\n\n /**\n * Extract refresh token from request\n * @param req - HTTP request\n * @returns Refresh token or null\n * @private\n */\n private extractRefreshToken(req: Request): string | null {\n return req.cookies?.refreshToken ?? null;\n }\n\n /**\n * Set token cookies in response\n * @param res - HTTP response\n * @param accessToken - Access token\n * @param refreshToken - Refresh token\n * @private\n */\n private setTokenCookies(\n res: Response,\n accessToken: string,\n refreshToken: string\n ): void {\n const fifteen = 15;\n // Set access token cookie (shorter expiry)\n res.cookie(\"accessToken\", accessToken, {\n ...this.config.cookieOptions,\n maxAge: fifteen * NUMERIX.SIXTY * NUMERIX.THOUSAND, // 15 minutes\n });\n const seven = 7;\n // Set refresh token cookie (longer expiry)\n res.cookie(\"refreshToken\", refreshToken, {\n ...this.config.cookieOptions,\n maxAge:\n seven *\n NUMERIX.TWENTY_FOUR *\n NUMERIX.SIXTY *\n NUMERIX.SIXTY *\n NUMERIX.THOUSAND, // 7 days\n });\n }\n\n /**\n * Clear token cookies from response\n * @param res - HTTP response\n * @private\n */\n private clearTokenCookies(res: Response): void {\n res.clearCookie(\"accessToken\", this.config.cookieOptions);\n res.clearCookie(\"refreshToken\", this.config.cookieOptions);\n }\n\n /**\n * Update request with new access token\n * @param req - HTTP request\n * @param accessToken - New access token\n * @private\n */\n private updateRequestToken(req: Request, accessToken: string): void {\n // Update Authorization header for downstream handlers\n req.headers.authorization = `Bearer ${accessToken}`;\n }\n}\n","import type { NestMiddleware } from \"@nestjs/common\";\nimport { Injectable } from \"@nestjs/common\";\nimport type { Request, Response, NextFunction } from \"express\";\n\n/**\n * Extends the Express Request object to include `sessionId`.\n */\nexport interface AuthRequest extends Request {\n /** Optional session ID extracted from cookies or headers */\n sessionId?: string;\n}\n\n/**\n * Middleware to extract the session ID from incoming requests.\n *\n * This middleware does **not validate** the session. \n * It only reads the session ID from:\n * - Cookies (`session_id`) \n * - Headers (`x-session-id`) \n * and attaches it to `req.sessionId` for use in guards or controllers.\n *\n * @example\n * // Access sessionId in a controller or guard\n * const sessionId = req.sessionId;\n */\n@Injectable()\nexport class AuthMiddleware implements NestMiddleware {\n /**\n * Extracts session ID from cookies or headers and attaches it to the request object.\n *\n * @param req - Express request object\n * @param res - Express response object\n * @param next - Function to pass control to the next middleware\n */\n use(req: AuthRequest, res: Response, next: NextFunction):void {\n // Read session cookie (or header)\n const sessionId = req.cookies?.session_id ?? req.headers[\"x-session-id\"];\n\n // Just attach it — NO validation\n if (sessionId) {\n req.sessionId = String(sessionId);\n }\n\n next();\n }\n}\n","\nimport type { AuthAdapterUser, AuthCredentials, AUTHPROVIDER, AuthSession, AuthTokens,AuthUser,ConnectedAccount, Session, Tokens, } from \"@plyaz/types\";\nimport { create } from \"zustand\";\nimport { persist, subscribeWithSelector } from \"zustand/middleware\";\nimport type { AuthPermissions } from \"../hooks/useAuth\";\n\n\ninterface AuthState {\n // User & Authentication\n user: AuthPermissions | null;\n tokens: AuthTokens | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n\n // Session Management\n session: Session | null;\n sessionExpiry: Date | null;\n\n // Connected Accounts\n connectedAccounts: ConnectedAccount[];\n\n // Permissions & Roles\n permissions: string[];\n roles: string[];\n\n // UI State\n lastActivity: Date | null;\n rememberMe: boolean;\n\n // Error State\n error: string | null;\n}\n\n\n\nexport interface AuthActions {\n // User Management\n setUser: (user: AuthUser | null) => void;\n updateUser: (updates: Partial<AuthUser>) => void;\n\n // Token Management\n setTokens: (tokens: AuthTokens | null) => void;\n refreshTokens: () => Promise<void>;\n\n // Session Management\n setSession: (session: Session | null) => void;\n updateLastActivity: () => void;\n\n // Connected Accounts\n setConnectedAccounts: (accounts: ConnectedAccount[]) => void;\n addConnectedAccount: (account: ConnectedAccount) => void;\n removeConnectedAccount: (accountId: string) => void;\n\n // Permissions & Roles\n setPermissions: (permissions: string[]) => void;\n setRoles: (roles: string[]) => void;\n hasPermission: (permission: string) => boolean;\n hasRole: (role: string) => boolean;\n \n // Authentication Actions\n signIn: (provider?: AUTHPROVIDER, credentials?: AuthCredentials) => Promise<{\n user: AuthAdapterUser;\n session: AuthSession;\n tokens: Tokens;\n }>;\n signUp: (provider: AUTHPROVIDER, data?: unknown) => Promise<void>;\n signOut: () => Promise<void>;\n\n // State Management\n setLoading: (loading: boolean) => void;\n setError: (error: string | null) => void;\n clearError: () => void;\n\n // Utility\n reset: () => void;\n}\n\nconst initialState: AuthState = {\n user: null,\n tokens: null,\n isAuthenticated: false,\n isLoading: true,\n session: null,\n sessionExpiry: null,\n connectedAccounts: [],\n permissions: [],\n roles: [],\n lastActivity: null,\n rememberMe: false,\n error: null,\n};\n\nexport const useAuthStore = create<AuthState & AuthActions>()(\n subscribeWithSelector(\n persist(\n // eslint-disable-next-line max-lines-per-function\n (set, get) => ({\n ...initialState,\n\n // User Management\n setUser: (user) =>\n set({\n user,\n isAuthenticated: !!user,\n error: null,\n }),\n\n updateUser: (updates) => {\n const { user } = get();\n if (user) {\n set({ user: { ...user, ...updates } });\n }\n },\n\n // Token Management\n setTokens: (tokens) => set({ tokens }),\n\n refreshTokens: async () => {\n const { tokens } = get();\n if (!tokens?.refreshToken) return;\n\n try {\n const response = await globalThis.fetch(\"/api/auth/refresh\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ refreshToken: tokens.refreshToken }),\n });\n\n if (response.ok) {\n const newTokens = (await response.json()) as AuthTokens;\n set({ tokens: newTokens });\n } else {\n // Refresh failed, sign out\n await get().signOut();\n }\n } catch (error: unknown) {\n globalThis.console.log(error)\n await get().signOut();\n }\n },\n\n // Session Management\n setSession: (session) =>\n set({\n session,\n sessionExpiry: session?.expiresAt\n ? new Date(session.expiresAt)\n : null,\n }),\n\n updateLastActivity: () => set({ lastActivity: new Date() }),\n\n // Connected Accounts\n setConnectedAccounts: (connectedAccounts) => set({ connectedAccounts }),\n\n addConnectedAccount: (account) => {\n const { connectedAccounts } = get();\n set({ connectedAccounts: [...connectedAccounts, account] });\n },\n\n removeConnectedAccount: (accountId) => {\n const { connectedAccounts } = get();\n set({\n connectedAccounts: connectedAccounts.filter(\n (acc) => acc.id !== accountId\n ),\n });\n },\n\n // Permissions & Roles\n setPermissions: (permissions) => set({ permissions }),\n setRoles: (roles) => set({ roles }),\n\n hasPermission: (permission) => {\n const { permissions } = get();\n return permissions.includes(permission);\n },\n\n hasRole: (role) => {\n const { roles } = get();\n return roles.includes(role);\n },\n\n // Authentication Actions\n signUp: async (provider, data?: unknown) => {\n set({ isLoading: true, error: null });\n try {\n const endpoint = provider\n ? `/api/auth/signup/${provider}`\n : \"/api/auth/signup\";\n const response = await globalThis.fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n const errorData = (await response.json()) as { message?: string };\n throw new Error(errorData.message ?? \"Sign up failed\");\n }\n\n const responseData = (await response.json()) as {\n user: AuthUser;\n tokens: AuthTokens;\n session: Session;\n };\n const { user, tokens, session } = responseData;\n set({\n user,\n tokens,\n session,\n isAuthenticated: true,\n lastActivity: new Date(),\n });\n } catch (error: unknown) {\n const errorMessage =\n error instanceof Error ? error.message : \"Sign up failed\";\n set({ error: errorMessage });\n } finally {\n set({ isLoading: false });\n }\n },\n signIn: async (provider, credentials) => {\n set({ isLoading: true, error: null });\n try {\n const endpoint = provider\n ? `/api/auth/signin/${provider}`\n : \"/api/auth/signin\";\n const response = await globalThis.fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(credentials),\n });\n\n if (!response.ok) {\n const errorData = (await response.json()) as { message?: string };\n throw new Error(errorData.message ?? \"Sign in failed\");\n }\n\n const data = (await response.json()) as {\n user: AuthUser;\n tokens: AuthTokens;\n session: Session;\n };\n const { user, tokens, session } = data;\n \n // Update the store state\n set({\n user,\n tokens,\n session,\n isAuthenticated: true,\n lastActivity: new Date(),\n });\n \n // Return the expected object with proper types\n return {\n user: user as AuthAdapterUser, // Cast to match expected type\n session: session as AuthSession, // Cast to match expected type\n tokens: tokens as Tokens, // Cast to match expected type\n };\n } catch (error: unknown) {\n const errorMessage =\n error instanceof Error ? error.message : \"Sign in failed\";\n set({ error: errorMessage });\n // Re-throw the error to maintain the Promise rejection\n throw error;\n } finally {\n set({ isLoading: false });\n }\n},\n\n signOut: async () => {\n set({ isLoading: true });\n try {\n await globalThis.fetch(\"/api/auth/signout\", { method: \"POST\" });\n set(initialState);\n } catch (error: unknown) {\n const errorMessage =\n error instanceof Error ? error.message : \"Sign out failed\";\n set({ error: errorMessage });\n } finally {\n set({ isLoading: false });\n }\n },\n\n // State Management\n setLoading: (isLoading) => set({ isLoading }),\n setError: (error) => set({ error }),\n clearError: () => set({ error: null }),\n\n // Utility\n reset: () => set(initialState),\n }),\n {\n name: \"auth-storage\",\n partialize: (state) => ({\n user: state.user,\n tokens: state.tokens,\n rememberMe: state.rememberMe,\n connectedAccounts: state.connectedAccounts,\n }),\n }\n )\n )\n);\n","import type { ReactNode } from \"react\";\nimport { createContext } from \"react\";\nimport type { UseAuthReturn } from \"../hooks/useAuth\";\nimport { useAuthStore } from \"../store/auth.store\";\nimport type { \n AuthCredentials, \n AUTHPROVIDER, \n ConnectedAccount, \n AuthAdapterUser,\n AuthSession,\n Tokens\n} from \"@plyaz/types\";\n\n/**\n * React context for authentication.\n * Provides user, loading, error states and authentication functions.\n */\nexport const AuthContext = createContext<UseAuthReturn | null>(null);\n\n/**\n * AuthProvider component that wraps your app.\n * Uses Zustand store for all authentication state and actions.\n *\n * @param children React children components\n */\nexport function AuthProvider({ children }: { children: ReactNode }): ReactNode {\n const store = useAuthStore();\n\n // Wrap actions in a helper to handle loading and errors\n const handleAuthAction = async <T,>(\n action: () => Promise<T>\n ): Promise<T> => {\n store.setLoading(true);\n store.setError(null);\n\n try {\n const result = await action();\n return result;\n } catch (err: unknown) {\n const errorMessage =\n err instanceof Error ? err.message : \"Authentication failed\";\n store.setError(errorMessage);\n throw err;\n } finally {\n store.setLoading(false);\n }\n };\n\n // Create the auth context value\n const authValue = {\n user: store.user,\n isAuthenticated: store.isAuthenticated,\n isLoading: store.isLoading,\n error: store.error,\n\n // Auth API actions wrapped with handleAuthAction\n signIn: async (provider?: AUTHPROVIDER, credentials?: AuthCredentials): Promise<{\n user: AuthAdapterUser;\n session: AuthSession;\n tokens: Tokens;\n }> => {\n return handleAuthAction(() => store.signIn(provider, credentials));\n },\n\n signUp: async (provider: AUTHPROVIDER, credentials:unknown, data?:unknown) => {\n return handleAuthAction(() => store.signUp(provider, data));\n },\n\n signOut: async (): Promise<void> => {\n return handleAuthAction(() => store.signOut());\n },\n\n linkAccount: async (userId:string,provider:AUTHPROVIDER,data:ConnectedAccount): Promise<void |ConnectedAccount> => {\n return handleAuthAction(async () => {\n // Create a minimal ConnectedAccount object with only required properties\n const connectedAccount: ConnectedAccount = {\n \n ...data,\n userId,\n provider,\n providerType: \"\",\n providerAccountId: \"\",\n isPrimary: false,\n isVerified: false,\n isActive: false,\n linkedAt: new Date(),\n createdAt: new Date(),\n updatedAt: new Date()\n };\n store.addConnectedAccount(connectedAccount);\n });\n },\n\n unlinkAccount: async (id: string): Promise<void> => {\n return handleAuthAction(async () => store.removeConnectedAccount(id));\n },\n };\n\n return (\n <AuthContext.Provider value={authValue}>\n {children}\n </AuthContext.Provider>\n );\n}","import { useAuthStore } from \"../store/auth.store\";\nimport type {\n AuthAdapterUser,\n AuthCredentials,\n AUTHPROVIDER,\n AuthSession,\n AuthUser,\n Tokens,\n\n ConnectedAccount,\n} from \"@plyaz/types\";\n\nexport interface Permission {\n resource: string;\n action: string;\n conditions: Record<string, string>;\n}\n\nexport interface AuthPermissions extends AuthUser {\n permissions?: Permission[];\n isActive: boolean;\n isVerified: boolean;\n}\n\nexport interface UseAuthReturn {\n user: AuthPermissions | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n error: string | null;\n signIn: (provider?: AUTHPROVIDER, credentials?: AuthCredentials) => Promise<{\n user: AuthAdapterUser;\n session: AuthSession;\n tokens: Tokens;\n }>;\n signUp: (provider: AUTHPROVIDER, data?: unknown) => Promise<void>;\n signOut: () => Promise<void>;\n linkAccount: (\n userId:string,provider:AUTHPROVIDER,data:ConnectedAccount\n ) => Promise<void | ConnectedAccount>;\n unlinkAccount: (accountId: string) => Promise<void>;\n}\n\nexport function useAuth(): UseAuthReturn {\n const store = useAuthStore();\n\n /**\n * Handles authentication actions with consistent loading and error states\n *\n * @param {Function} action - Async function to execute\n * @returns {Promise<void>}\n * @private\n */\n\n const handleAuthAction = async <T,>(\n action: () => Promise<T>\n ): Promise<T> => {\n store.setLoading(true);\n store.setError(null);\n\n try {\n const result = await action();\n return result;\n } \n catch (err: unknown) {\n const errorMessage =\n err instanceof Error ? err.message : \"Authentication failed\";\n\n store.setError(errorMessage);\n throw err;\n}\n\n finally {\n store.setLoading(false);\n }\n };\n\n return {\n user: store.user,\n isAuthenticated: store.isAuthenticated,\n isLoading: store.isLoading,\n error: store.error,\n signIn: async (\n provider?: AUTHPROVIDER,\n credentials?: AuthCredentials\n ): Promise<{\n user: AuthAdapterUser;\n session: AuthSession;\n tokens: Tokens;\n }> => {\n return handleAuthAction(() => store.signIn(provider, credentials));\n },\n\n signUp: async (provider: AUTHPROVIDER, data?: unknown): Promise<void> => {\n return handleAuthAction(() => store.signUp(provider, data));\n },\n\n signOut: async (): Promise<void> => {\n return handleAuthAction(() => store.signOut());\n },\n\n linkAccount: async (\n userId:string,provider:AUTHPROVIDER,data:ConnectedAccount\n ): Promise<void> => {\n return handleAuthAction(async () => {\n // Construct a ConnectedAccount object; adjust fields as needed\n const connectedAccount: ConnectedAccount = {\n \n ...data,\n userId,\n provider,\n providerType: \"\",\n providerAccountId: \"\",\n isPrimary: false,\n isVerified: false,\n isActive: false,\n linkedAt: new Date(),\n createdAt: new Date(),\n updatedAt: new Date()\n };\n store.addConnectedAccount(connectedAccount);\n });\n },\n\n unlinkAccount: async (accountId: string): Promise<void> => {\n return handleAuthAction(async () => store.removeConnectedAccount(accountId));\n },\n };\n}","import type { Session } from \"@plyaz/types\";\nimport { useAuthStore } from \"../store/auth.store\";\n\nexport function useSession() : {\n session: Session | null;\n isValid: boolean;\n expiresAt: Date | null;\n refresh: () => Promise<void>;\n} {\n const store = useAuthStore();\n\n return {\n session: store.session,\n isValid: !!store.session,\n expiresAt: store.sessionExpiry,\n refresh: store.refreshTokens,\n };\n}\n","import { useAuth } from './useAuth';\n\nexport interface UseRBACReturn {\n hasRole: (role: string) => boolean;\n hasAnyRole: (roles: string[]) => boolean;\n hasAllRoles: (roles: string[]) => boolean;\n userRoles: string[];\n isAdmin: boolean;\n isModerator: boolean;\n}\n\nexport const useRBAC = (): UseRBACReturn => {\n const { user } = useAuth();\n const userRoles = user?.roles ?? [];\n\n const hasRole = (role: string): boolean => {\n return userRoles.includes(role);\n };\n\n const hasAnyRole = (roles: string[]): boolean => {\n return roles.some(role => userRoles.includes(role));\n };\n\n const hasAllRoles = (roles: string[]): boolean => {\n return roles.every(role => userRoles.includes(role));\n };\n\n return {\n hasRole,\n hasAnyRole,\n hasAllRoles,\n userRoles,\n isAdmin: hasRole('ADMIN'),\n isModerator: hasRole('MODERATOR')\n };\n};","/**\n * @fileoverview Connected accounts management hook\n * @module @plyaz/auth/client/hooks/useConnectedAccounts\n */\n\nimport { useState, useEffect } from 'react';\nimport { useAuth } from './useAuth';\nimport type { AuthCredentials, ConnectedAccount } from '@plyaz/types';\n\nexport interface UseConnectedAccountsReturn {\n accounts: ConnectedAccount[];\n isLoading: boolean;\n linkAccount: (provider: string, credentials: AuthCredentials) => Promise<void>;\n unlinkAccount: (accountId: string) => Promise<void>;\n setPrimaryAccount: (accountId: string) => Promise<void>;\n refreshAccounts: () => Promise<void>;\n}\n\nexport const useConnectedAccounts = (): UseConnectedAccountsReturn => {\n const [accounts, setAccounts] = useState<ConnectedAccount[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const { user } = useAuth();\n\n const linkAccount = async (provider: string, credentials:AuthCredentials):Promise<void> => {\n if (!user) throw new Error('User not authenticated');\n \n setIsLoading(true);\n try {\n const response = await globalThis.fetch('/api/auth/accounts/link', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ provider, credentials })\n });\n \n if (!response.ok) throw new Error('Failed to link account');\n \n const newAccount = await response.json() as ConnectedAccount;\n setAccounts(prev => [...prev, newAccount]);\n } finally {\n setIsLoading(false);\n }\n };\n\n const unlinkAccount = async (accountId: string):Promise<void> => {\n setIsLoading(true);\n try {\n const response = await globalThis.fetch(`/api/auth/accounts/${accountId}/unlink`, {\n method: 'DELETE'\n });\n \n if (!response.ok) throw new Error('Failed to unlink account');\n \n setAccounts(prev => prev.filter(acc => acc.id !== accountId));\n } finally {\n setIsLoading(false);\n }\n };\n\n const setPrimaryAccount = async (accountId: string):Promise<void> => {\n setIsLoading(true);\n try {\n const response = await globalThis.fetch(`/api/auth/accounts/${accountId}/primary`, {\n method: 'PUT'\n });\n \n if (!response.ok) throw new Error('Failed to set primary account');\n \n setAccounts(prev => prev.map(acc => ({\n ...acc,\n isPrimary: acc.id === accountId\n })));\n } finally {\n setIsLoading(false);\n }\n };\n\n const refreshAccounts = async ():Promise<void>=> {\n if (!user) return;\n \n setIsLoading(true);\n try {\n const response = await globalThis.fetch('/api/auth/accounts');\n if (response.ok) {\n const data = await response.json() as ConnectedAccount[];\n setAccounts(data);\n }\n } finally {\n setIsLoading(false);\n }\n };\n\n useEffect(() => {\n void (async():Promise<void> => {\n await refreshAccounts();\n})();\n\n \n }, [user]);\n\n return {\n accounts,\n isLoading,\n linkAccount,\n unlinkAccount,\n setPrimaryAccount,\n refreshAccounts,\n };\n};","/**\n * @fileoverview Permissions management hook\n * @module @plyaz/auth/client/hooks/usePermissions\n */\n\nimport type { Permission} from \"./useAuth\";\nimport { useAuth } from \"./useAuth\";\n\nexport interface UsePermissionsReturn {\n permissions: Permission[];\n hasPermission: (permission: Permission) => boolean;\n hasAnyPermission: (permissions: Permission[]) => boolean;\n hasAllPermissions: (permissions: Permission[]) => boolean;\n}\n\nexport const usePermissions = (): UsePermissionsReturn => {\n const { user } = useAuth();\n\n const permissions = user?.permissions ?? [];\n\n const hasPermission = (permission: Permission): boolean =>\n permissions.includes(permission);\n\n const hasAnyPermission = (perms: Permission[]): boolean =>\n perms.some((perm) => permissions.includes(perm));\n\n const hasAllPermissions = (perms: Permission[]): boolean =>\n perms.every((perm) => permissions.includes(perm));\n\n return {\n permissions,\n hasPermission,\n hasAnyPermission,\n hasAllPermissions,\n };\n};\n","import type { ReactNode } from 'react';\nimport React from 'react';\nimport { useAuth } from '../hooks/useAuth';\n\ninterface ProtectedRouteProps {\n children: ReactNode;\n fallback?: ReactNode;\n requiredRoles?: string[];\n}\n\nexport const ProtectedRoute: React.FC<ProtectedRouteProps> = ({ \n children, \n fallback = <div>Please sign in to access this page</div>,\n requiredRoles = []\n// eslint-disable-next-line complexity\n}) => {\n const { isAuthenticated, user, isLoading } = useAuth();\n\n if (isLoading) {\n return <div>Loading...</div>;\n }\n\n if (!isAuthenticated) {\n return <>{fallback}</>;\n }\n\n if (requiredRoles.length > 0 && user) {\n const userRoles = user.roles ?? [];\n const hasRequiredRole = requiredRoles.some(role => userRoles.includes(role));\n \n if (!hasRequiredRole) {\n return <div>Access denied. Required roles: {requiredRoles.join(', ')}</div>;\n }\n }\n\n return <>{children}</>;\n};"]}