@parsrun/auth 0.1.39 → 0.2.1
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.
- package/dist/adapters/hono.d.ts +3 -3
- package/dist/adapters/index.d.ts +3 -3
- package/dist/{base-BKyR8rcE.d.ts → base-BI-SilX-.d.ts} +20 -0
- package/dist/{index-C3kz9XqE.d.ts → index-DC7A0IbX.d.ts} +1 -1
- package/dist/{index-DOGcetyD.d.ts → index-kATaLVps.d.ts} +44 -2
- package/dist/index.d.ts +11 -5
- package/dist/index.js +292 -5
- package/dist/index.js.map +1 -1
- package/dist/providers/index.d.ts +2 -2
- package/dist/providers/otp/index.d.ts +2 -2
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/core/tenant-manager.ts","../src/core/tenant-resolver.ts","../src/core/invitation.ts","../src/core/auth-engine.ts","../src/providers/oauth/google.ts","../src/providers/oauth/github.ts","../src/providers/oauth/microsoft.ts","../src/providers/oauth/apple.ts","../src/providers/oauth/index.ts","../src/providers/magic-link/index.ts","../src/providers/totp/index.ts","../src/providers/webauthn/index.ts","../src/providers/password/index.ts","../src/adapters/drizzle/index.ts","../src/services/email/resend-provider.ts","../src/services/email/templates/otp.ts","../src/services/email/templates/verification.ts","../src/services/email/templates/magic-link.ts","../src/services/email/index.ts","../src/services/sms/netgsm-provider.ts","../src/services/sms/index.ts","../src/services/email-verification/index.ts","../src/index.ts"],"names":["base64UrlEncode","base64UrlDecode","DEFAULT_CONFIG"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Pars Auth Configuration\n * Passwordless-first, provider-based authentication\n */\n\nimport type { StorageConfig } from './storage/types.js';\n\n/**\n * Session configuration\n */\nexport interface SessionConfig {\n /** Access token expiry in seconds (default: 900 = 15 minutes) */\n accessTokenExpiry?: number;\n /** Refresh token expiry in seconds (default: 604800 = 7 days) */\n refreshTokenExpiry?: number;\n /** Enable sliding window for refresh tokens (default: true) */\n slidingWindow?: boolean;\n /** Maximum concurrent sessions per user (default: 5) */\n maxSessions?: number;\n /** Invalidate all sessions on password change (default: true) */\n invalidateOnPasswordChange?: boolean;\n}\n\n/**\n * JWT configuration\n */\nexport interface JwtConfig {\n /** JWT signing algorithm (default: HS256) */\n algorithm?: 'HS256' | 'HS384' | 'HS512' | 'RS256' | 'RS384' | 'RS512' | 'ES256' | 'ES384' | 'ES512';\n /** JWT issuer claim */\n issuer?: string;\n /** JWT audience claim */\n audience?: string | string[];\n}\n\n/**\n * Cookie configuration\n */\nexport interface CookieConfig {\n /** Cookie name prefix (default: 'pars') */\n prefix?: string;\n /** Cookie domain */\n domain?: string;\n /** Cookie path (default: '/') */\n path?: string;\n /** Use secure cookies (default: true in production) */\n secure?: boolean;\n /** SameSite attribute (default: 'lax') */\n sameSite?: 'strict' | 'lax' | 'none';\n /** HttpOnly for refresh token (default: true) */\n httpOnly?: boolean;\n}\n\n/**\n * CSRF configuration\n */\nexport interface CsrfConfig {\n /** Enable CSRF protection (default: true) */\n enabled?: boolean;\n /** CSRF header name (default: 'x-csrf-token') */\n headerName?: string;\n /** CSRF cookie name (default: 'csrf') */\n cookieName?: string;\n}\n\n/**\n * Tenant resolution strategy\n */\nexport type TenantResolutionStrategy =\n | 'subdomain' // tenant.example.com\n | 'header' // X-Tenant-ID header\n | 'path' // /tenant/api/...\n | 'query' // ?tenant=...\n | 'custom'; // Custom resolver function\n\n/**\n * Multi-tenant configuration\n */\nexport interface TenantConfig {\n /** Enable multi-tenancy (default: true) */\n enabled?: boolean;\n /** Tenant resolution strategy (default: 'header') */\n strategy?: TenantResolutionStrategy;\n /** Header name for tenant ID (default: 'x-tenant-id') */\n headerName?: string;\n /** Custom tenant resolver */\n resolver?: (request: Request) => Promise<string | null>;\n}\n\n/**\n * OAuth provider configuration\n */\nexport interface OAuthProviderConfig {\n /** Enable this provider */\n enabled?: boolean;\n /** OAuth client ID */\n clientId: string;\n /** OAuth client secret */\n clientSecret: string;\n /** OAuth scopes */\n scopes?: string[];\n /** Callback URL (default: baseUrl + /auth/callback/:provider) */\n callbackUrl?: string;\n}\n\n/**\n * OTP (One-Time Password) configuration\n */\nexport interface OtpConfig {\n /** Enable OTP authentication (default: true) */\n enabled?: boolean;\n\n /** Email OTP configuration */\n email?: {\n /** Enable email OTP (default: true) */\n enabled?: boolean;\n /** OTP expiry in seconds (default: 600 = 10 minutes) */\n expiresIn?: number;\n /** OTP code length (default: 6) */\n length?: number;\n /** Maximum verification attempts (default: 3) */\n maxAttempts?: number;\n /** Rate limit: max requests per window (default: 5) */\n rateLimit?: number;\n /** Rate limit window in seconds (default: 900 = 15 minutes) */\n rateLimitWindow?: number;\n /** Email sending function */\n send: (to: string, code: string) => Promise<void>;\n };\n\n /** SMS OTP configuration */\n sms?: {\n /** Enable SMS OTP (default: false) */\n enabled?: boolean;\n /** OTP expiry in seconds (default: 300 = 5 minutes) */\n expiresIn?: number;\n /** OTP code length (default: 6) */\n length?: number;\n /** Maximum verification attempts (default: 3) */\n maxAttempts?: number;\n /** Rate limit: max requests per window (default: 3) */\n rateLimit?: number;\n /** Rate limit window in seconds (default: 900 = 15 minutes) */\n rateLimitWindow?: number;\n /** SMS sending function */\n send: (to: string, code: string) => Promise<void>;\n };\n}\n\n/**\n * Magic Link configuration\n */\nexport interface MagicLinkConfig {\n /** Enable magic link authentication (default: false) */\n enabled?: boolean;\n /** Link expiry in seconds (default: 900 = 15 minutes) */\n expiresIn?: number;\n /** Email sending function */\n send: (to: string, url: string) => Promise<void>;\n}\n\n/**\n * TOTP (Time-based One-Time Password) configuration for 2FA\n */\nexport interface TotpConfig {\n /** Enable TOTP 2FA (default: false) */\n enabled?: boolean;\n /** TOTP issuer name (shown in authenticator apps) */\n issuer?: string;\n /** Number of backup codes to generate (default: 10) */\n backupCodesCount?: number;\n}\n\n/**\n * WebAuthn/Passkey configuration\n */\nexport interface WebAuthnConfig {\n /** Enable WebAuthn (default: false) */\n enabled?: boolean;\n /** Relying party name (your app name) */\n rpName: string;\n /** Relying party ID (your domain) */\n rpId: string;\n /** Allowed origins */\n origins?: string[];\n}\n\n/**\n * Password configuration (DISABLED BY DEFAULT)\n */\nexport interface PasswordConfig {\n /**\n * Enable password authentication\n * @default false - Passwordless is recommended\n */\n enabled?: boolean;\n /** Minimum password length (default: 8) */\n minLength?: number;\n /** Require uppercase letters (default: false) */\n requireUppercase?: boolean;\n /** Require lowercase letters (default: false) */\n requireLowercase?: boolean;\n /** Require numbers (default: false) */\n requireNumbers?: boolean;\n /** Require special characters (default: false) */\n requireSymbols?: boolean;\n /** Check against common passwords (default: true) */\n checkCommonPasswords?: boolean;\n}\n\n/**\n * Security configuration\n */\nexport interface SecurityConfig {\n /** Rate limiting configuration */\n rateLimit?: {\n /** Enable rate limiting (default: true) */\n enabled?: boolean;\n /** Login attempts per window (default: 5) */\n loginAttempts?: number;\n /** Window size in seconds (default: 900 = 15 minutes) */\n windowSize?: number;\n };\n /** Account lockout configuration */\n lockout?: {\n /** Enable account lockout (default: true) */\n enabled?: boolean;\n /** Failed attempts before lockout (default: 5) */\n maxAttempts?: number;\n /** Lockout duration in seconds (default: 900 = 15 minutes) */\n duration?: number;\n };\n /** CSRF configuration */\n csrf?: CsrfConfig;\n}\n\n/**\n * Auth callbacks for extensibility\n */\nexport interface AuthCallbacks {\n /** Called after successful sign up */\n onSignUp?: (user: { id: string; email?: string | null }) => Promise<void>;\n /** Called after successful sign in */\n onSignIn?: (user: { id: string; email?: string | null }, session: { id: string }) => Promise<void>;\n /** Called after sign out */\n onSignOut?: (userId: string, sessionId: string) => Promise<void>;\n /** Called when a new session is created */\n onSessionCreated?: (session: { id: string; userId: string }) => Promise<void>;\n /** Validate sign in (return false to reject) */\n validateSignIn?: (user: { id: string; email?: string | null }) => Promise<boolean>;\n}\n\n/**\n * Database adapter interface\n * Implement this to connect Pars Auth to your database\n */\nexport interface AuthAdapter {\n // User operations\n findUserById(id: string): Promise<AdapterUser | null>;\n findUserByEmail(email: string): Promise<AdapterUser | null>;\n findUserByPhone(phone: string): Promise<AdapterUser | null>;\n createUser(data: CreateUserInput): Promise<AdapterUser>;\n updateUser(id: string, data: Partial<AdapterUser>): Promise<AdapterUser>;\n deleteUser(id: string): Promise<void>;\n\n // Session operations\n findSessionById(id: string): Promise<AdapterSession | null>;\n findSessionsByUserId(userId: string): Promise<AdapterSession[]>;\n createSession(data: CreateSessionInput): Promise<AdapterSession>;\n updateSession(id: string, data: Partial<AdapterSession>): Promise<AdapterSession>;\n deleteSession(id: string): Promise<void>;\n deleteSessionsByUserId(userId: string): Promise<void>;\n\n // Auth method operations (for OAuth, etc.)\n findAuthMethod(provider: string, providerId: string): Promise<AdapterAuthMethod | null>;\n findAuthMethodsByUserId(userId: string): Promise<AdapterAuthMethod[]>;\n createAuthMethod(data: CreateAuthMethodInput): Promise<AdapterAuthMethod>;\n deleteAuthMethod(id: string): Promise<void>;\n\n // Tenant operations (optional for multi-tenant)\n findTenantById?(id: string): Promise<AdapterTenant | null>;\n findTenantBySlug?(slug: string): Promise<AdapterTenant | null>;\n\n // Membership operations (optional for multi-tenant)\n findMembership?(userId: string, tenantId: string): Promise<AdapterMembership | null>;\n findMembershipsByUserId?(userId: string): Promise<AdapterMembership[]>;\n createMembership?(data: CreateMembershipInput): Promise<AdapterMembership>;\n updateMembership?(id: string, data: Partial<AdapterMembership>): Promise<AdapterMembership>;\n deleteMembership?(id: string): Promise<void>;\n}\n\n// Adapter types\nexport interface AdapterUser {\n id: string;\n email?: string | null;\n phone?: string | null;\n emailVerified?: boolean;\n phoneVerified?: boolean;\n name?: string | null;\n avatar?: string | null;\n twoFactorEnabled?: boolean;\n status: 'active' | 'inactive' | 'suspended';\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface AdapterSession {\n id: string;\n userId: string;\n tenantId?: string | null;\n expiresAt: Date;\n refreshExpiresAt?: Date | null;\n deviceType?: string | null;\n deviceName?: string | null;\n userAgent?: string | null;\n ipAddress?: string | null;\n status: 'active' | 'expired' | 'revoked';\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface AdapterAuthMethod {\n id: string;\n userId: string;\n provider: string;\n providerId: string;\n verified: boolean;\n metadata?: Record<string, unknown>;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface AdapterTenant {\n id: string;\n name: string;\n slug: string;\n status: 'active' | 'suspended' | 'inactive';\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface AdapterMembership {\n id: string;\n userId: string;\n tenantId: string;\n role: string;\n permissions?: string[];\n status: 'active' | 'inactive' | 'pending';\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface CreateUserInput {\n email?: string;\n phone?: string;\n name?: string;\n avatar?: string;\n emailVerified?: boolean;\n phoneVerified?: boolean;\n}\n\nexport interface CreateSessionInput {\n userId: string;\n tenantId?: string;\n expiresAt: Date;\n refreshExpiresAt?: Date;\n deviceType?: string;\n deviceName?: string;\n userAgent?: string;\n ipAddress?: string;\n}\n\nexport interface CreateAuthMethodInput {\n userId: string;\n provider: string;\n providerId: string;\n verified?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateMembershipInput {\n userId: string;\n tenantId: string;\n role: string;\n permissions?: string[];\n}\n\n/**\n * Main Pars Auth Configuration\n */\nexport interface ParsAuthConfig {\n /**\n * Secret key for signing tokens (required)\n * Use a strong, random string of at least 32 characters\n */\n secret: string;\n\n /**\n * Base URL of your application\n * Used for OAuth callbacks, magic links, etc.\n */\n baseUrl?: string;\n\n /**\n * Storage configuration for OTP, rate limiting, etc.\n * Auto-detects runtime if not specified\n */\n storage?: StorageConfig;\n\n /**\n * Authentication providers\n */\n providers?: {\n /** OTP configuration (enabled by default) */\n otp?: OtpConfig;\n /** Magic Link configuration */\n magicLink?: MagicLinkConfig;\n /** OAuth providers */\n oauth?: {\n google?: OAuthProviderConfig;\n github?: OAuthProviderConfig;\n microsoft?: OAuthProviderConfig;\n apple?: OAuthProviderConfig;\n /** Custom OAuth providers */\n custom?: Record<string, OAuthProviderConfig>;\n };\n /** TOTP 2FA configuration */\n totp?: TotpConfig;\n /** WebAuthn/Passkey configuration */\n webauthn?: WebAuthnConfig;\n /**\n * Password configuration\n * @default { enabled: false }\n */\n password?: PasswordConfig;\n };\n\n /** Session configuration */\n session?: SessionConfig;\n\n /** JWT configuration */\n jwt?: JwtConfig;\n\n /** Cookie configuration */\n cookies?: CookieConfig;\n\n /** Security configuration */\n security?: SecurityConfig;\n\n /** Multi-tenant configuration */\n tenant?: TenantConfig;\n\n /** Database adapter (required) */\n adapter: AuthAdapter;\n\n /** Lifecycle callbacks */\n callbacks?: AuthCallbacks;\n}\n\n/**\n * Default configuration (passwordless-first)\n */\nexport const defaultConfig: Partial<ParsAuthConfig> = {\n providers: {\n otp: {\n enabled: true,\n email: {\n enabled: true,\n expiresIn: 600,\n length: 6,\n maxAttempts: 3,\n rateLimit: 5,\n rateLimitWindow: 900,\n // send function must be provided by user\n send: async () => {\n throw new Error('[Pars Auth] Email OTP send function not configured');\n },\n },\n sms: {\n enabled: false,\n expiresIn: 300,\n length: 6,\n maxAttempts: 3,\n rateLimit: 3,\n rateLimitWindow: 900,\n send: async () => {\n throw new Error('[Pars Auth] SMS OTP send function not configured');\n },\n },\n },\n password: {\n enabled: false, // EXPLICITLY DISABLED BY DEFAULT\n },\n },\n session: {\n accessTokenExpiry: 900, // 15 minutes\n refreshTokenExpiry: 604800, // 7 days\n slidingWindow: true,\n maxSessions: 5,\n invalidateOnPasswordChange: true,\n },\n jwt: {\n algorithm: 'HS256',\n },\n cookies: {\n prefix: 'pars',\n path: '/',\n sameSite: 'lax',\n httpOnly: true,\n },\n security: {\n rateLimit: {\n enabled: true,\n loginAttempts: 5,\n windowSize: 900,\n },\n lockout: {\n enabled: true,\n maxAttempts: 5,\n duration: 900,\n },\n csrf: {\n enabled: true,\n headerName: 'x-csrf-token',\n cookieName: 'csrf',\n },\n },\n tenant: {\n enabled: true,\n strategy: 'header',\n headerName: 'x-tenant-id',\n },\n};\n\n/**\n * Merge user config with defaults\n */\nexport function mergeConfig(config: ParsAuthConfig): Required<ParsAuthConfig> {\n return {\n secret: config.secret,\n baseUrl: config.baseUrl ?? '',\n storage: config.storage ?? {},\n providers: {\n ...defaultConfig.providers,\n ...config.providers,\n otp: {\n ...defaultConfig.providers?.otp,\n ...config.providers?.otp,\n email: {\n ...defaultConfig.providers?.otp?.email,\n ...config.providers?.otp?.email,\n },\n sms: {\n ...defaultConfig.providers?.otp?.sms,\n ...config.providers?.otp?.sms,\n },\n },\n password: {\n ...defaultConfig.providers?.password,\n ...config.providers?.password,\n },\n },\n session: { ...defaultConfig.session, ...config.session } as Required<SessionConfig>,\n jwt: { ...defaultConfig.jwt, ...config.jwt } as Required<JwtConfig>,\n cookies: { ...defaultConfig.cookies, ...config.cookies } as Required<CookieConfig>,\n security: {\n ...defaultConfig.security,\n ...config.security,\n rateLimit: { ...defaultConfig.security?.rateLimit, ...config.security?.rateLimit },\n lockout: { ...defaultConfig.security?.lockout, ...config.security?.lockout },\n csrf: { ...defaultConfig.security?.csrf, ...config.security?.csrf },\n } as Required<SecurityConfig>,\n tenant: { ...defaultConfig.tenant, ...config.tenant } as Required<TenantConfig>,\n adapter: config.adapter,\n callbacks: config.callbacks ?? {},\n } as Required<ParsAuthConfig>;\n}\n\n/**\n * Validate configuration\n */\nexport function validateConfig(config: ParsAuthConfig): void {\n if (!config.secret) {\n throw new Error('[Pars Auth] Secret is required');\n }\n\n if (config.secret.length < 32) {\n console.warn(\n '[Pars Auth] Secret should be at least 32 characters for security'\n );\n }\n\n if (!config.adapter) {\n throw new Error('[Pars Auth] Database adapter is required');\n }\n\n // Warn if password is enabled\n if (config.providers?.password?.enabled) {\n console.warn(\n '[Pars Auth] Password authentication is enabled. Consider using passwordless authentication (OTP, Magic Link, WebAuthn) for better security.'\n );\n }\n\n // Check OTP send function\n if (\n config.providers?.otp?.email?.enabled !== false &&\n !config.providers?.otp?.email?.send\n ) {\n console.warn(\n '[Pars Auth] Email OTP is enabled but send function is not configured'\n );\n }\n}\n","/**\n * Tenant Manager\n * CRUD operations for tenants and memberships\n */\n\nimport type { AuthAdapter, AdapterTenant, AdapterMembership } from '../config.js';\n\n/**\n * Tenant creation input\n */\nexport interface CreateTenantInput {\n /** Tenant name */\n name: string;\n /** URL-friendly slug (auto-generated if not provided) */\n slug?: string;\n /** Owner user ID */\n ownerId: string;\n /** Owner role name (default: 'owner') */\n ownerRole?: string;\n /** Initial status (default: 'active') */\n status?: 'active' | 'suspended' | 'inactive';\n}\n\n/**\n * Tenant update input\n */\nexport interface UpdateTenantInput {\n /** Tenant name */\n name?: string;\n /** Status */\n status?: 'active' | 'suspended' | 'inactive';\n}\n\n/**\n * Membership creation input\n */\nexport interface AddMemberInput {\n /** User ID to add */\n userId: string;\n /** Tenant ID */\n tenantId: string;\n /** Role name */\n role: string;\n /** Initial permissions */\n permissions?: string[];\n /** Status (default: 'active') */\n status?: 'active' | 'inactive' | 'pending';\n}\n\n/**\n * Membership update input\n */\nexport interface UpdateMemberInput {\n /** New role */\n role?: string;\n /** New permissions */\n permissions?: string[];\n /** New status */\n status?: 'active' | 'inactive' | 'pending';\n}\n\n/**\n * Tenant with members\n */\nexport interface TenantWithMembers extends AdapterTenant {\n members: AdapterMembership[];\n memberCount: number;\n}\n\n/**\n * User's tenant memberships with tenant details\n */\nexport interface UserTenantMembership extends AdapterMembership {\n tenant?: AdapterTenant;\n}\n\n/**\n * Tenant Manager\n */\nexport class TenantManager {\n private adapter: AuthAdapter;\n\n constructor(adapter: AuthAdapter) {\n this.adapter = adapter;\n }\n\n // ============================================\n // Tenant Operations\n // ============================================\n\n /**\n * Create a new tenant with owner\n */\n async createTenant(input: CreateTenantInput): Promise<{\n tenant: AdapterTenant;\n membership: AdapterMembership;\n }> {\n // Check if adapter supports tenant operations\n if (!this.adapter.findTenantById) {\n throw new Error('Tenant operations not supported by adapter');\n }\n\n // Generate slug if not provided\n const slug = input.slug ?? this.generateSlug(input.name);\n\n // Check if slug is unique\n const existingTenant = await this.adapter.findTenantBySlug?.(slug);\n if (existingTenant) {\n throw new Error(`Tenant with slug '${slug}' already exists`);\n }\n\n // Create tenant - need to use adapter directly\n // Since adapter doesn't have createTenant, we need to extend it\n // For now, throw an informative error\n throw new Error(\n 'createTenant not implemented in adapter. ' +\n 'Please implement createTenant in your adapter or use direct database access.'\n );\n }\n\n /**\n * Get tenant by ID\n */\n async getTenantById(id: string): Promise<AdapterTenant | null> {\n if (!this.adapter.findTenantById) {\n return null;\n }\n return this.adapter.findTenantById(id);\n }\n\n /**\n * Get tenant by slug\n */\n async getTenantBySlug(slug: string): Promise<AdapterTenant | null> {\n if (!this.adapter.findTenantBySlug) {\n return null;\n }\n return this.adapter.findTenantBySlug(slug);\n }\n\n /**\n * Check if user is member of tenant\n */\n async isMember(userId: string, tenantId: string): Promise<boolean> {\n if (!this.adapter.findMembership) {\n return false;\n }\n\n const membership = await this.adapter.findMembership(userId, tenantId);\n return membership !== null && membership.status === 'active';\n }\n\n /**\n * Check if user has specific role in tenant\n */\n async hasRole(userId: string, tenantId: string, role: string): Promise<boolean> {\n if (!this.adapter.findMembership) {\n return false;\n }\n\n const membership = await this.adapter.findMembership(userId, tenantId);\n return membership !== null && membership.role === role && membership.status === 'active';\n }\n\n /**\n * Check if user is owner of tenant\n */\n async isOwner(userId: string, tenantId: string): Promise<boolean> {\n return this.hasRole(userId, tenantId, 'owner');\n }\n\n /**\n * Check if user is admin of tenant (owner or admin)\n */\n async isAdmin(userId: string, tenantId: string): Promise<boolean> {\n if (!this.adapter.findMembership) {\n return false;\n }\n\n const membership = await this.adapter.findMembership(userId, tenantId);\n if (!membership || membership.status !== 'active') {\n return false;\n }\n\n return membership.role === 'owner' || membership.role === 'admin';\n }\n\n // ============================================\n // Membership Operations\n // ============================================\n\n /**\n * Add a member to tenant\n */\n async addMember(input: AddMemberInput): Promise<AdapterMembership> {\n if (!this.adapter.createMembership) {\n throw new Error('Membership operations not supported by adapter');\n }\n\n // Check if already a member\n const existing = await this.adapter.findMembership?.(input.userId, input.tenantId);\n if (existing) {\n throw new Error('User is already a member of this tenant');\n }\n\n return this.adapter.createMembership({\n userId: input.userId,\n tenantId: input.tenantId,\n role: input.role,\n permissions: input.permissions,\n });\n }\n\n /**\n * Update member role/permissions\n */\n async updateMember(\n userId: string,\n tenantId: string,\n updates: UpdateMemberInput\n ): Promise<AdapterMembership> {\n if (!this.adapter.findMembership || !this.adapter.updateMembership) {\n throw new Error('Membership operations not supported by adapter');\n }\n\n const membership = await this.adapter.findMembership(userId, tenantId);\n if (!membership) {\n throw new Error('Membership not found');\n }\n\n return this.adapter.updateMembership(membership.id, updates);\n }\n\n /**\n * Remove member from tenant\n */\n async removeMember(userId: string, tenantId: string): Promise<void> {\n if (!this.adapter.findMembership || !this.adapter.deleteMembership) {\n throw new Error('Membership operations not supported by adapter');\n }\n\n const membership = await this.adapter.findMembership(userId, tenantId);\n if (!membership) {\n throw new Error('Membership not found');\n }\n\n // Prevent removing the last owner\n if (membership.role === 'owner') {\n const allMemberships = await this.getMembersByTenant(tenantId);\n const owners = allMemberships.filter(m => m.role === 'owner');\n if (owners.length <= 1) {\n throw new Error('Cannot remove the last owner of a tenant');\n }\n }\n\n await this.adapter.deleteMembership(membership.id);\n }\n\n /**\n * Get membership for user in tenant\n */\n async getMembership(userId: string, tenantId: string): Promise<AdapterMembership | null> {\n if (!this.adapter.findMembership) {\n return null;\n }\n return this.adapter.findMembership(userId, tenantId);\n }\n\n /**\n * Get all tenants for a user\n */\n async getUserTenants(userId: string): Promise<UserTenantMembership[]> {\n if (!this.adapter.findMembershipsByUserId) {\n return [];\n }\n\n const memberships = await this.adapter.findMembershipsByUserId(userId);\n\n // Enrich with tenant details\n const enriched = await Promise.all(\n memberships.map(async (membership) => {\n const tenant = await this.adapter.findTenantById?.(membership.tenantId);\n return {\n ...membership,\n tenant: tenant ?? undefined,\n };\n })\n );\n\n return enriched;\n }\n\n /**\n * Get all members of a tenant\n * Note: This requires iterating through users, which is not efficient\n * Consider adding findMembershipsByTenantId to the adapter\n */\n async getMembersByTenant(_tenantId: string): Promise<AdapterMembership[]> {\n // This is a placeholder - the adapter should implement this\n // For now, return empty array\n console.warn(\n 'getMembersByTenant: Consider implementing findMembershipsByTenantId in adapter'\n );\n return [];\n }\n\n /**\n * Transfer ownership to another member\n */\n async transferOwnership(\n tenantId: string,\n currentOwnerId: string,\n newOwnerId: string\n ): Promise<void> {\n if (!this.adapter.findMembership || !this.adapter.updateMembership) {\n throw new Error('Membership operations not supported by adapter');\n }\n\n // Verify current owner\n const currentOwnership = await this.adapter.findMembership(currentOwnerId, tenantId);\n if (!currentOwnership || currentOwnership.role !== 'owner') {\n throw new Error('Current user is not the owner');\n }\n\n // Verify new owner is a member\n const newOwnership = await this.adapter.findMembership(newOwnerId, tenantId);\n if (!newOwnership) {\n throw new Error('New owner must be an existing member');\n }\n\n // Update roles\n await this.adapter.updateMembership(newOwnership.id, { role: 'owner' });\n await this.adapter.updateMembership(currentOwnership.id, { role: 'admin' });\n }\n\n // ============================================\n // Tenant Switching\n // ============================================\n\n /**\n * Validate tenant switch\n * Returns the tenant if switch is allowed\n */\n async validateTenantSwitch(\n userId: string,\n targetTenantId: string\n ): Promise<{ tenant: AdapterTenant; membership: AdapterMembership }> {\n // Get tenant\n const tenant = await this.getTenantById(targetTenantId);\n if (!tenant) {\n throw new Error('Tenant not found');\n }\n\n // Check tenant status\n if (tenant.status !== 'active') {\n throw new Error('Tenant is not active');\n }\n\n // Check membership\n const membership = await this.getMembership(userId, targetTenantId);\n if (!membership) {\n throw new Error('User is not a member of this tenant');\n }\n\n if (membership.status !== 'active') {\n throw new Error('Membership is not active');\n }\n\n return { tenant, membership };\n }\n\n /**\n * Get default tenant for user\n * Returns the first active tenant membership\n */\n async getDefaultTenant(userId: string): Promise<UserTenantMembership | null> {\n const tenants = await this.getUserTenants(userId);\n\n // Find first active tenant\n const active = tenants.find(\n t => t.status === 'active' && t.tenant?.status === 'active'\n );\n\n return active ?? null;\n }\n\n // ============================================\n // Utility Methods\n // ============================================\n\n /**\n * Generate URL-friendly slug from name\n */\n private generateSlug(name: string): string {\n return name\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n }\n\n /**\n * Generate unique tenant slug\n */\n async generateUniqueSlug(name: string): Promise<string> {\n const baseSlug = this.generateSlug(name);\n let slug = baseSlug;\n let counter = 1;\n\n while (await this.adapter.findTenantBySlug?.(slug)) {\n slug = `${baseSlug}-${counter}`;\n counter++;\n }\n\n return slug;\n }\n}\n\n/**\n * Create a tenant manager\n */\nexport function createTenantManager(adapter: AuthAdapter): TenantManager {\n return new TenantManager(adapter);\n}\n","/**\n * Tenant Resolution\n * Extracts tenant from incoming requests using configurable strategies\n */\n\nimport type { TenantResolutionStrategy } from '../config.js';\n\n/**\n * Tenant resolver configuration\n */\nexport interface TenantResolverConfig {\n /** Resolution strategy */\n strategy: TenantResolutionStrategy;\n /** Header name for 'header' strategy (default: 'x-tenant-id') */\n headerName?: string;\n /** Path prefix for 'path' strategy (default: '/t/') */\n pathPrefix?: string;\n /** Query parameter name for 'query' strategy (default: 'tenant') */\n queryParam?: string;\n /** Custom resolver function for 'custom' strategy */\n resolver?: (request: Request) => Promise<string | null>;\n /** Fallback tenant ID when none is resolved */\n fallbackTenantId?: string;\n /** Whether tenant is required (default: false) */\n required?: boolean;\n}\n\n/**\n * Tenant resolution result\n */\nexport interface TenantResolutionResult {\n /** Resolved tenant ID */\n tenantId: string | null;\n /** Resolution method used */\n resolvedFrom: 'subdomain' | 'header' | 'path' | 'query' | 'custom' | 'fallback' | null;\n /** Original value before resolution */\n originalValue?: string;\n}\n\n/**\n * Tenant Resolver\n * Extracts tenant identifier from requests using various strategies\n */\nexport class TenantResolver {\n private config: Required<Omit<TenantResolverConfig, 'resolver' | 'fallbackTenantId'>> &\n Pick<TenantResolverConfig, 'resolver' | 'fallbackTenantId'>;\n\n constructor(config: TenantResolverConfig) {\n this.config = {\n headerName: 'x-tenant-id',\n pathPrefix: '/t/',\n queryParam: 'tenant',\n required: false,\n ...config,\n };\n }\n\n /**\n * Resolve tenant from request\n */\n async resolve(request: Request): Promise<TenantResolutionResult> {\n const { strategy } = this.config;\n\n let result: TenantResolutionResult = {\n tenantId: null,\n resolvedFrom: null,\n };\n\n switch (strategy) {\n case 'subdomain':\n result = this.resolveFromSubdomain(request);\n break;\n case 'header':\n result = this.resolveFromHeader(request);\n break;\n case 'path':\n result = this.resolveFromPath(request);\n break;\n case 'query':\n result = this.resolveFromQuery(request);\n break;\n case 'custom':\n result = await this.resolveFromCustom(request);\n break;\n }\n\n // Apply fallback if no tenant found\n if (!result.tenantId && this.config.fallbackTenantId) {\n result = {\n tenantId: this.config.fallbackTenantId,\n resolvedFrom: 'fallback',\n };\n }\n\n return result;\n }\n\n /**\n * Resolve tenant from subdomain\n * e.g., acme.example.com -> 'acme'\n */\n private resolveFromSubdomain(request: Request): TenantResolutionResult {\n const url = new URL(request.url);\n const host = url.hostname;\n\n // Split by dots and get first part\n const parts = host.split('.');\n\n // Need at least 3 parts for subdomain (tenant.example.com)\n // Or 2 parts for localhost (tenant.localhost)\n if (parts.length >= 3 || (parts.length === 2 && parts[1] === 'localhost')) {\n const subdomain = parts[0]!;\n\n // Skip common non-tenant subdomains\n const skipSubdomains = ['www', 'api', 'app', 'admin', 'mail', 'ftp'];\n if (!skipSubdomains.includes(subdomain.toLowerCase())) {\n return {\n tenantId: subdomain,\n resolvedFrom: 'subdomain',\n originalValue: subdomain,\n };\n }\n }\n\n return { tenantId: null, resolvedFrom: null };\n }\n\n /**\n * Resolve tenant from header\n * e.g., X-Tenant-ID: acme\n */\n private resolveFromHeader(request: Request): TenantResolutionResult {\n const headerValue = request.headers.get(this.config.headerName);\n\n if (headerValue) {\n return {\n tenantId: headerValue,\n resolvedFrom: 'header',\n originalValue: headerValue,\n };\n }\n\n return { tenantId: null, resolvedFrom: null };\n }\n\n /**\n * Resolve tenant from URL path\n * e.g., /t/acme/api/users -> 'acme'\n */\n private resolveFromPath(request: Request): TenantResolutionResult {\n const url = new URL(request.url);\n const pathname = url.pathname;\n const prefix = this.config.pathPrefix;\n\n if (pathname.startsWith(prefix)) {\n const rest = pathname.slice(prefix.length);\n const slashIndex = rest.indexOf('/');\n const tenantSlug = slashIndex > 0 ? rest.slice(0, slashIndex) : rest;\n\n if (tenantSlug) {\n return {\n tenantId: tenantSlug,\n resolvedFrom: 'path',\n originalValue: tenantSlug,\n };\n }\n }\n\n return { tenantId: null, resolvedFrom: null };\n }\n\n /**\n * Resolve tenant from query parameter\n * e.g., /api/users?tenant=acme -> 'acme'\n */\n private resolveFromQuery(request: Request): TenantResolutionResult {\n const url = new URL(request.url);\n const tenantId = url.searchParams.get(this.config.queryParam);\n\n if (tenantId) {\n return {\n tenantId,\n resolvedFrom: 'query',\n originalValue: tenantId,\n };\n }\n\n return { tenantId: null, resolvedFrom: null };\n }\n\n /**\n * Resolve tenant using custom resolver\n */\n private async resolveFromCustom(request: Request): Promise<TenantResolutionResult> {\n if (!this.config.resolver) {\n return { tenantId: null, resolvedFrom: null };\n }\n\n const tenantId = await this.config.resolver(request);\n\n if (tenantId) {\n return {\n tenantId,\n resolvedFrom: 'custom',\n originalValue: tenantId,\n };\n }\n\n return { tenantId: null, resolvedFrom: null };\n }\n\n /**\n * Check if tenant is required but not found\n */\n isRequired(): boolean {\n return this.config.required;\n }\n\n /**\n * Get the path without tenant prefix (for path strategy)\n */\n stripTenantFromPath(pathname: string): string {\n if (this.config.strategy !== 'path') {\n return pathname;\n }\n\n const prefix = this.config.pathPrefix;\n if (pathname.startsWith(prefix)) {\n const rest = pathname.slice(prefix.length);\n const slashIndex = rest.indexOf('/');\n if (slashIndex > 0) {\n return rest.slice(slashIndex);\n }\n return '/';\n }\n\n return pathname;\n }\n}\n\n/**\n * Create a tenant resolver\n */\nexport function createTenantResolver(config: TenantResolverConfig): TenantResolver {\n return new TenantResolver(config);\n}\n\n/**\n * Multi-strategy tenant resolver\n * Tries multiple strategies in order until one succeeds\n */\nexport class MultiStrategyTenantResolver {\n private resolvers: TenantResolver[];\n private fallbackTenantId?: string;\n\n constructor(\n strategies: TenantResolverConfig[],\n options?: { fallbackTenantId?: string }\n ) {\n this.resolvers = strategies.map(s => new TenantResolver(s));\n this.fallbackTenantId = options?.fallbackTenantId;\n }\n\n /**\n * Resolve tenant trying each strategy in order\n */\n async resolve(request: Request): Promise<TenantResolutionResult> {\n for (const resolver of this.resolvers) {\n const result = await resolver.resolve(request);\n if (result.tenantId) {\n return result;\n }\n }\n\n // Apply fallback if no tenant found\n if (this.fallbackTenantId) {\n return {\n tenantId: this.fallbackTenantId,\n resolvedFrom: 'fallback',\n };\n }\n\n return { tenantId: null, resolvedFrom: null };\n }\n}\n\n/**\n * Create a multi-strategy tenant resolver\n */\nexport function createMultiStrategyResolver(\n strategies: TenantResolverConfig[],\n options?: { fallbackTenantId?: string }\n): MultiStrategyTenantResolver {\n return new MultiStrategyTenantResolver(strategies, options);\n}\n","/**\n * Invitation System\n * Handles tenant invitations and membership requests\n */\n\nimport type { KVStorage } from '../storage/types.js';\nimport type { AuthAdapter, AdapterMembership, AdapterTenant } from '../config.js';\nimport { generateRandomHex, sha256Hex } from '../utils/crypto.js';\n\n/**\n * Invitation configuration\n */\nexport interface InvitationConfig {\n /** Base URL for invitation links */\n baseUrl: string;\n /** Invitation callback path (default: /auth/invitation) */\n callbackPath?: string;\n /** Token expiration in seconds (default: 604800 = 7 days) */\n expiresIn?: number;\n /** Token length in bytes (default: 32) */\n tokenLength?: number;\n}\n\n/**\n * Invitation record stored in KV\n */\nexport interface InvitationRecord {\n /** Unique invitation ID */\n id: string;\n /** Invited email address */\n email: string;\n /** Target tenant ID */\n tenantId: string;\n /** Role to assign */\n role: string;\n /** Permissions to assign */\n permissions?: string[];\n /** Who sent the invitation */\n invitedBy: string;\n /** Token hash for verification */\n tokenHash: string;\n /** Expiration timestamp */\n expiresAt: string;\n /** Status */\n status: 'pending' | 'accepted' | 'expired' | 'cancelled';\n /** When invitation was accepted */\n acceptedAt?: string;\n /** User ID who accepted (if different from invited email) */\n acceptedBy?: string;\n /** Created timestamp */\n createdAt: string;\n /** Custom message */\n message?: string;\n}\n\n/**\n * Send invitation input\n */\nexport interface SendInvitationInput {\n /** Email to invite */\n email: string;\n /** Tenant ID */\n tenantId: string;\n /** Role to assign */\n role: string;\n /** Permissions to assign */\n permissions?: string[];\n /** User ID sending the invitation */\n invitedBy: string;\n /** Optional message to include */\n message?: string;\n}\n\n/**\n * Send invitation result\n */\nexport interface SendInvitationResult {\n success: boolean;\n invitation?: InvitationRecord;\n invitationUrl?: string;\n token?: string;\n error?: string;\n}\n\n/**\n * Accept invitation input\n */\nexport interface AcceptInvitationInput {\n /** Invitation token */\n token: string;\n /** User ID accepting the invitation */\n userId: string;\n}\n\n/**\n * Accept invitation result\n */\nexport interface AcceptInvitationResult {\n success: boolean;\n membership?: AdapterMembership;\n tenant?: AdapterTenant;\n error?: string;\n}\n\n/**\n * Invitation status check result\n */\nexport interface InvitationStatusResult {\n valid: boolean;\n invitation?: InvitationRecord;\n tenant?: AdapterTenant;\n error?: string;\n}\n\n/**\n * Invitation Service\n */\nexport class InvitationService {\n private storage: KVStorage;\n private adapter: AuthAdapter;\n private config: Required<InvitationConfig>;\n\n constructor(\n storage: KVStorage,\n adapter: AuthAdapter,\n config: InvitationConfig\n ) {\n this.storage = storage;\n this.adapter = adapter;\n this.config = {\n callbackPath: '/auth/invitation',\n expiresIn: 604800, // 7 days\n tokenLength: 32,\n ...config,\n };\n }\n\n /**\n * Send an invitation to join a tenant\n */\n async sendInvitation(input: SendInvitationInput): Promise<SendInvitationResult> {\n const normalizedEmail = input.email.toLowerCase().trim();\n\n // Check if user is already a member\n const existingUser = await this.adapter.findUserByEmail(normalizedEmail);\n if (existingUser) {\n const membership = await this.adapter.findMembership?.(existingUser.id, input.tenantId);\n if (membership && membership.status === 'active') {\n return { success: false, error: 'User is already a member of this tenant' };\n }\n }\n\n // Check for existing pending invitation\n const existingInvitation = await this.getInvitationByEmail(normalizedEmail, input.tenantId);\n if (existingInvitation && existingInvitation.status === 'pending') {\n // Cancel old invitation\n await this.cancelInvitation(existingInvitation.id);\n }\n\n // Generate secure token\n const token = await generateRandomHex(this.config.tokenLength);\n const tokenHash = await sha256Hex(token);\n const id = await generateRandomHex(16);\n\n // Calculate expiration\n const expiresAt = new Date(Date.now() + this.config.expiresIn * 1000);\n\n // Create invitation record\n const invitation: InvitationRecord = {\n id,\n email: normalizedEmail,\n tenantId: input.tenantId,\n role: input.role,\n permissions: input.permissions,\n invitedBy: input.invitedBy,\n tokenHash,\n expiresAt: expiresAt.toISOString(),\n status: 'pending',\n createdAt: new Date().toISOString(),\n message: input.message,\n };\n\n // Store invitation\n await this.storage.set(\n `invitation:hash:${tokenHash}`,\n invitation,\n this.config.expiresIn\n );\n await this.storage.set(\n `invitation:id:${id}`,\n invitation,\n this.config.expiresIn\n );\n await this.storage.set(\n `invitation:email:${normalizedEmail}:${input.tenantId}`,\n id,\n this.config.expiresIn\n );\n\n // Build invitation URL\n const params = new URLSearchParams({ token });\n const invitationUrl = `${this.config.baseUrl}${this.config.callbackPath}?${params}`;\n\n return {\n success: true,\n invitation,\n invitationUrl,\n token,\n };\n }\n\n /**\n * Accept an invitation\n */\n async acceptInvitation(input: AcceptInvitationInput): Promise<AcceptInvitationResult> {\n const tokenHash = await sha256Hex(input.token);\n\n // Get invitation\n const invitation = await this.storage.get<InvitationRecord>(`invitation:hash:${tokenHash}`);\n\n if (!invitation) {\n return { success: false, error: 'Invalid or expired invitation' };\n }\n\n if (invitation.status !== 'pending') {\n return { success: false, error: `Invitation is ${invitation.status}` };\n }\n\n if (new Date(invitation.expiresAt) < new Date()) {\n // Mark as expired\n invitation.status = 'expired';\n await this.updateInvitation(invitation);\n return { success: false, error: 'Invitation has expired' };\n }\n\n // Check if user is already a member\n const existingMembership = await this.adapter.findMembership?.(\n input.userId,\n invitation.tenantId\n );\n if (existingMembership && existingMembership.status === 'active') {\n return { success: false, error: 'You are already a member of this tenant' };\n }\n\n // Create or update membership\n let membership: AdapterMembership;\n if (existingMembership) {\n // Reactivate existing membership\n membership = await this.adapter.updateMembership!(existingMembership.id, {\n role: invitation.role,\n permissions: invitation.permissions,\n status: 'active',\n });\n } else {\n // Create new membership\n membership = await this.adapter.createMembership!({\n userId: input.userId,\n tenantId: invitation.tenantId,\n role: invitation.role,\n permissions: invitation.permissions,\n });\n }\n\n // Mark invitation as accepted\n invitation.status = 'accepted';\n invitation.acceptedAt = new Date().toISOString();\n invitation.acceptedBy = input.userId;\n await this.updateInvitation(invitation);\n\n // Get tenant info\n const tenant = await this.adapter.findTenantById?.(invitation.tenantId);\n\n return {\n success: true,\n membership,\n tenant: tenant ?? undefined,\n };\n }\n\n /**\n * Check invitation status\n */\n async checkInvitation(token: string): Promise<InvitationStatusResult> {\n const tokenHash = await sha256Hex(token);\n\n const invitation = await this.storage.get<InvitationRecord>(`invitation:hash:${tokenHash}`);\n\n if (!invitation) {\n return { valid: false, error: 'Invalid or expired invitation' };\n }\n\n if (invitation.status !== 'pending') {\n return { valid: false, error: `Invitation is ${invitation.status}`, invitation };\n }\n\n if (new Date(invitation.expiresAt) < new Date()) {\n invitation.status = 'expired';\n await this.updateInvitation(invitation);\n return { valid: false, error: 'Invitation has expired', invitation };\n }\n\n // Get tenant info\n const tenant = await this.adapter.findTenantById?.(invitation.tenantId);\n\n return {\n valid: true,\n invitation,\n tenant: tenant ?? undefined,\n };\n }\n\n /**\n * Cancel an invitation\n */\n async cancelInvitation(invitationId: string): Promise<boolean> {\n const invitation = await this.storage.get<InvitationRecord>(`invitation:id:${invitationId}`);\n\n if (!invitation) {\n return false;\n }\n\n if (invitation.status !== 'pending') {\n return false;\n }\n\n invitation.status = 'cancelled';\n await this.updateInvitation(invitation);\n\n return true;\n }\n\n /**\n * Get invitation by ID\n */\n async getInvitationById(id: string): Promise<InvitationRecord | null> {\n return this.storage.get<InvitationRecord>(`invitation:id:${id}`);\n }\n\n /**\n * Get invitation by email and tenant\n */\n async getInvitationByEmail(\n email: string,\n tenantId: string\n ): Promise<InvitationRecord | null> {\n const normalizedEmail = email.toLowerCase().trim();\n const invitationId = await this.storage.get<string>(\n `invitation:email:${normalizedEmail}:${tenantId}`\n );\n\n if (!invitationId) {\n return null;\n }\n\n return this.getInvitationById(invitationId);\n }\n\n /**\n * Resend invitation (generates new token)\n */\n async resendInvitation(\n invitationId: string,\n invitedBy: string\n ): Promise<SendInvitationResult> {\n const invitation = await this.getInvitationById(invitationId);\n\n if (!invitation) {\n return { success: false, error: 'Invitation not found' };\n }\n\n if (invitation.status !== 'pending') {\n return { success: false, error: `Cannot resend ${invitation.status} invitation` };\n }\n\n // Cancel old invitation and create new one\n await this.cancelInvitation(invitationId);\n\n return this.sendInvitation({\n email: invitation.email,\n tenantId: invitation.tenantId,\n role: invitation.role,\n permissions: invitation.permissions,\n invitedBy,\n message: invitation.message,\n });\n }\n\n /**\n * Get pending invitations for a tenant\n * Note: This requires listing keys which may not be efficient for all storage backends\n */\n async getPendingInvitations(_tenantId: string): Promise<InvitationRecord[]> {\n // This is a placeholder - ideally the storage should support this\n // For now, return empty array\n console.warn(\n 'getPendingInvitations: Consider implementing list operation in storage'\n );\n return [];\n }\n\n /**\n * Update invitation record\n */\n private async updateInvitation(invitation: InvitationRecord): Promise<void> {\n const ttl = Math.max(\n 0,\n Math.floor((new Date(invitation.expiresAt).getTime() - Date.now()) / 1000)\n );\n\n await this.storage.set(`invitation:id:${invitation.id}`, invitation, ttl || 300);\n await this.storage.set(\n `invitation:hash:${invitation.tokenHash}`,\n invitation,\n ttl || 300\n );\n }\n}\n\n/**\n * Create invitation service\n */\nexport function createInvitationService(\n storage: KVStorage,\n adapter: AuthAdapter,\n config: InvitationConfig\n): InvitationService {\n return new InvitationService(storage, adapter, config);\n}\n","/**\n * Pars Auth Engine\n * Main orchestrator for authentication\n */\n\nimport type { KVStorage } from '../storage/types.js';\nimport type {\n ParsAuthConfig,\n AuthAdapter,\n AdapterUser,\n AdapterSession,\n AdapterMembership,\n AdapterTenant,\n AuthCallbacks,\n} from '../config.js';\nimport { mergeConfig, validateConfig } from '../config.js';\nimport { createStorage } from '../storage/index.js';\nimport { ProviderRegistry, type ProviderInfo } from '../providers/index.js';\nimport { OTPProvider, type RequestOTPInput, type RequestOTPResult } from '../providers/otp/index.js';\nimport {\n JwtManager,\n SessionBlocklist,\n type TokenPair,\n type JwtPayload,\n} from '../session/index.js';\nimport { TenantManager, createTenantManager } from './tenant-manager.js';\nimport { TenantResolver, createTenantResolver, type TenantResolutionResult } from './tenant-resolver.js';\nimport { InvitationService, createInvitationService, type SendInvitationResult, type AcceptInvitationResult } from './invitation.js';\n\n/**\n * Auth context passed to handlers\n */\nexport interface AuthContext {\n userId?: string;\n sessionId?: string;\n tenantId?: string;\n payload?: JwtPayload;\n}\n\n/**\n * Sign in input\n */\nexport interface SignInInput {\n /** Provider name (e.g., 'otp', 'password', 'google') */\n provider: string;\n /** Identifier (email, phone, etc.) */\n identifier: string;\n /** Credential (OTP code, password, etc.) */\n credential?: string;\n /** Provider-specific data */\n data?: Record<string, unknown>;\n /** Request metadata */\n metadata?: {\n ipAddress?: string;\n userAgent?: string;\n deviceType?: string;\n deviceName?: string;\n tenantId?: string;\n };\n}\n\n/**\n * Sign in result\n */\nexport interface SignInResult {\n success: boolean;\n user?: AdapterUser;\n session?: AdapterSession;\n tokens?: TokenPair;\n requiresTwoFactor?: boolean;\n twoFactorChallengeId?: string;\n error?: string;\n errorCode?: string;\n}\n\n/**\n * Sign up input\n */\nexport interface SignUpInput {\n /** Email address */\n email?: string;\n /** Phone number */\n phone?: string;\n /** Display name */\n name?: string;\n /** Avatar URL */\n avatar?: string;\n /** Request metadata */\n metadata?: {\n ipAddress?: string;\n userAgent?: string;\n tenantId?: string;\n };\n}\n\n/**\n * Sign up result\n */\nexport interface SignUpResult {\n success: boolean;\n user?: AdapterUser;\n session?: AdapterSession;\n tokens?: TokenPair;\n requiresVerification?: boolean;\n error?: string;\n errorCode?: string;\n}\n\n/**\n * Verify token result\n */\nexport interface VerifyTokenResult {\n valid: boolean;\n payload?: JwtPayload;\n error?: string;\n}\n\n/**\n * Refresh token result\n */\nexport interface RefreshTokenResult {\n success: boolean;\n tokens?: TokenPair;\n error?: string;\n}\n\n/**\n * Session info\n */\nexport interface SessionInfo {\n id: string;\n userId: string;\n tenantId?: string;\n deviceType?: string;\n deviceName?: string;\n ipAddress?: string;\n createdAt: Date;\n expiresAt: Date;\n isCurrent: boolean;\n}\n\n/**\n * Pars Auth Engine\n */\nexport class ParsAuthEngine {\n private config: Required<ParsAuthConfig>;\n private storage!: KVStorage;\n private providers: ProviderRegistry;\n private jwtManager: JwtManager;\n private sessionBlocklist!: SessionBlocklist;\n private adapter: AuthAdapter;\n private callbacks: AuthCallbacks;\n private initialized = false;\n\n // Multi-tenant components\n private tenantManager!: TenantManager;\n private tenantResolver?: TenantResolver;\n private invitationService?: InvitationService;\n\n constructor(config: ParsAuthConfig) {\n // Validate and merge config\n validateConfig(config);\n this.config = mergeConfig(config);\n\n this.adapter = config.adapter;\n this.callbacks = config.callbacks ?? {};\n\n // Initialize provider registry\n this.providers = new ProviderRegistry();\n\n // Initialize JWT manager\n const sessionConfig = this.config.session;\n const jwtIssuer = this.config.jwt.issuer;\n const issuer = Array.isArray(jwtIssuer) ? jwtIssuer[0] ?? 'pars-auth' : jwtIssuer ?? 'pars-auth';\n const jwtAudience = this.config.jwt.audience;\n const audience = Array.isArray(jwtAudience) ? jwtAudience[0] ?? 'pars-client' : jwtAudience ?? 'pars-client';\n this.jwtManager = new JwtManager({\n secret: this.config.secret,\n issuer,\n audience,\n accessTokenTTL: `${sessionConfig.accessTokenExpiry}s`,\n refreshTokenTTL: `${sessionConfig.refreshTokenExpiry}s`,\n });\n }\n\n /**\n * Initialize the auth engine (async operations)\n * Must be called before using the engine\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Initialize storage\n this.storage = await createStorage(this.config.storage);\n\n // Initialize blocklist\n this.sessionBlocklist = new SessionBlocklist(this.storage);\n\n // Register OTP provider if enabled\n if (this.config.providers.otp?.enabled !== false) {\n const otpProvider = new OTPProvider(this.storage, this.config.providers.otp!);\n this.providers.register(otpProvider);\n }\n\n // Register other providers here as they are implemented\n // Magic Link, OAuth, Password, etc.\n\n // Initialize multi-tenant components\n this.tenantManager = createTenantManager(this.adapter);\n\n // Initialize tenant resolver if tenant config is provided\n if (this.config.tenant?.enabled !== false) {\n this.tenantResolver = createTenantResolver({\n strategy: this.config.tenant.strategy ?? 'header',\n headerName: this.config.tenant.headerName ?? 'x-tenant-id',\n });\n }\n\n // Initialize invitation service if baseUrl is provided\n if (this.config.baseUrl) {\n this.invitationService = createInvitationService(\n this.storage,\n this.adapter,\n { baseUrl: this.config.baseUrl }\n );\n }\n\n this.initialized = true;\n }\n\n /**\n * Ensure engine is initialized\n */\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error('[Pars Auth] Engine not initialized. Call initialize() first.');\n }\n }\n\n /**\n * Get all registered providers\n */\n getProviders(): ProviderInfo[] {\n return this.providers.getEnabled().map((p) => p.getInfo());\n }\n\n /**\n * Check if a provider is enabled\n */\n isProviderEnabled(name: string): boolean {\n const provider = this.providers.get(name);\n return provider?.enabled ?? false;\n }\n\n /**\n * Request OTP (for OTP provider)\n */\n async requestOTP(input: RequestOTPInput): Promise<RequestOTPResult> {\n this.ensureInitialized();\n\n const otpProvider = this.providers.get('otp') as OTPProvider | undefined;\n if (!otpProvider) {\n return {\n success: false,\n error: 'OTP provider not enabled',\n };\n }\n\n return otpProvider.requestOTP(input);\n }\n\n /**\n * Sign in with any provider\n */\n async signIn(input: SignInInput): Promise<SignInResult> {\n this.ensureInitialized();\n\n const { provider: providerName, identifier, credential, data, metadata } = input;\n\n // Get provider\n const provider = this.providers.get(providerName);\n if (!provider) {\n return {\n success: false,\n error: `Provider '${providerName}' not found`,\n errorCode: 'PROVIDER_NOT_FOUND',\n };\n }\n\n if (!provider.enabled) {\n return {\n success: false,\n error: `Provider '${providerName}' is not enabled`,\n errorCode: 'PROVIDER_DISABLED',\n };\n }\n\n // Authenticate with provider\n const authResult = await provider.authenticate({\n identifier,\n credential: credential ?? '',\n data,\n });\n\n if (!authResult.success) {\n return {\n success: false,\n error: authResult.error,\n errorCode: authResult.errorCode,\n };\n }\n\n // Find or create user\n let user = await this.findUserByIdentifier(identifier, providerName);\n\n if (!user) {\n // Auto-create user if verified via OTP\n if (providerName === 'otp') {\n const otpType = data?.['type'] as 'email' | 'sms' | undefined;\n const createResult = await this.signUp({\n email: otpType === 'email' || !otpType ? identifier : undefined,\n phone: otpType === 'sms' ? identifier : undefined,\n metadata,\n });\n\n if (!createResult.success) {\n return {\n success: false,\n error: createResult.error,\n errorCode: createResult.errorCode,\n };\n }\n\n user = createResult.user!;\n } else {\n return {\n success: false,\n error: 'User not found',\n errorCode: 'USER_NOT_FOUND',\n };\n }\n }\n\n // Validate sign in via callback\n if (this.callbacks.validateSignIn) {\n const allowed = await this.callbacks.validateSignIn(user);\n if (!allowed) {\n return {\n success: false,\n error: 'Sign in not allowed',\n errorCode: 'SIGN_IN_REJECTED',\n };\n }\n }\n\n // Check if 2FA is required\n if (user.twoFactorEnabled && providerName !== 'totp') {\n // TODO: Implement 2FA challenge flow\n return {\n success: true,\n user,\n requiresTwoFactor: true,\n twoFactorChallengeId: '', // Generate challenge ID\n };\n }\n\n // Create session\n const session = await this.createSession(user.id, metadata);\n if (!session) {\n return {\n success: false,\n error: 'Failed to create session',\n errorCode: 'SESSION_CREATE_FAILED',\n };\n }\n\n // Generate tokens\n const tokens = await this.jwtManager.generateTokenPair({\n userId: user.id,\n tenantId: metadata?.tenantId,\n sessionId: session.id,\n });\n\n // Call callback\n if (this.callbacks.onSignIn) {\n await this.callbacks.onSignIn(user, session);\n }\n\n return {\n success: true,\n user,\n session,\n tokens,\n };\n }\n\n /**\n * Sign up a new user\n */\n async signUp(input: SignUpInput): Promise<SignUpResult> {\n this.ensureInitialized();\n\n const { email, phone, name, avatar, metadata } = input;\n\n if (!email && !phone) {\n return {\n success: false,\n error: 'Email or phone is required',\n errorCode: 'INVALID_INPUT',\n };\n }\n\n // Check if user already exists\n if (email) {\n const existing = await this.adapter.findUserByEmail(email);\n if (existing) {\n return {\n success: false,\n error: 'User with this email already exists',\n errorCode: 'USER_EXISTS',\n };\n }\n }\n\n if (phone) {\n const existing = await this.adapter.findUserByPhone(phone);\n if (existing) {\n return {\n success: false,\n error: 'User with this phone already exists',\n errorCode: 'USER_EXISTS',\n };\n }\n }\n\n // Create user\n const user = await this.adapter.createUser({\n email,\n phone,\n name,\n avatar,\n emailVerified: !!email, // OTP verification counts as email verification\n phoneVerified: !!phone,\n });\n\n // Create session\n const session = await this.createSession(user.id, metadata);\n\n // Generate tokens\n const tokens = session\n ? await this.jwtManager.generateTokenPair({\n userId: user.id,\n tenantId: metadata?.tenantId,\n sessionId: session.id,\n })\n : undefined;\n\n // Call callback\n if (this.callbacks.onSignUp) {\n await this.callbacks.onSignUp(user);\n }\n\n return {\n success: true,\n user,\n session: session ?? undefined,\n tokens,\n };\n }\n\n /**\n * Sign out (revoke session)\n */\n async signOut(\n sessionId: string,\n options?: { revokeAll?: boolean; userId?: string }\n ): Promise<void> {\n this.ensureInitialized();\n\n if (options?.revokeAll && options?.userId) {\n // Revoke all sessions for user\n const sessions = await this.adapter.findSessionsByUserId(options.userId);\n await this.adapter.deleteSessionsByUserId(options.userId);\n\n // Add all to blocklist\n const tokenExpiry = new Date(\n Date.now() + this.config.session.refreshTokenExpiry! * 1000\n );\n await this.sessionBlocklist.blockAllUserSessions(\n options.userId,\n sessions.map((s) => s.id),\n tokenExpiry,\n 'Sign out all'\n );\n\n // Call callback for each\n if (this.callbacks.onSignOut) {\n for (const session of sessions) {\n await this.callbacks.onSignOut(options.userId, session.id);\n }\n }\n } else {\n // Revoke single session\n const session = await this.adapter.findSessionById(sessionId);\n if (session) {\n await this.adapter.deleteSession(sessionId);\n\n // Add to blocklist until refresh token expires\n const tokenExpiry = new Date(\n Date.now() + this.config.session.refreshTokenExpiry! * 1000\n );\n await this.sessionBlocklist.blockSession(sessionId, tokenExpiry, {\n reason: 'Sign out',\n userId: session.userId,\n });\n\n // Call callback\n if (this.callbacks.onSignOut) {\n await this.callbacks.onSignOut(session.userId, sessionId);\n }\n }\n }\n }\n\n /**\n * Verify access token\n */\n async verifyAccessToken(token: string): Promise<VerifyTokenResult> {\n this.ensureInitialized();\n\n try {\n const payload = await this.jwtManager.verifyAccessToken(token);\n\n // Check if session is blocked\n if (payload.sid) {\n const isBlocked = await this.sessionBlocklist.isBlocked(payload.sid);\n if (isBlocked) {\n return {\n valid: false,\n error: 'Session has been revoked',\n };\n }\n }\n\n return {\n valid: true,\n payload,\n };\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Invalid token',\n };\n }\n }\n\n /**\n * Refresh tokens\n */\n async refreshTokens(refreshToken: string): Promise<RefreshTokenResult> {\n this.ensureInitialized();\n\n try {\n // Verify refresh token\n const { userId, sessionId, tenantId } =\n await this.jwtManager.verifyRefreshToken(refreshToken);\n\n // Check if session is blocked\n if (sessionId) {\n const isBlocked = await this.sessionBlocklist.isBlocked(sessionId);\n if (isBlocked) {\n return {\n success: false,\n error: 'Session has been revoked',\n };\n }\n }\n\n // Check if session exists and is active\n if (sessionId) {\n const session = await this.adapter.findSessionById(sessionId);\n if (!session || session.status !== 'active') {\n return {\n success: false,\n error: 'Session not found or inactive',\n };\n }\n\n // Update session if sliding window is enabled\n if (this.config.session.slidingWindow) {\n const newExpiresAt = new Date(\n Date.now() + this.config.session.refreshTokenExpiry! * 1000\n );\n await this.adapter.updateSession(sessionId, {\n expiresAt: newExpiresAt,\n });\n }\n }\n\n // Generate new token pair\n const tokens = await this.jwtManager.generateTokenPair({\n userId,\n tenantId,\n sessionId,\n });\n\n return {\n success: true,\n tokens,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Invalid refresh token',\n };\n }\n }\n\n /**\n * Get user sessions\n */\n async getSessions(\n userId: string,\n currentSessionId?: string\n ): Promise<SessionInfo[]> {\n this.ensureInitialized();\n\n const sessions = await this.adapter.findSessionsByUserId(userId);\n\n return sessions\n .filter((s) => s.status === 'active')\n .map((s) => ({\n id: s.id,\n userId: s.userId,\n tenantId: s.tenantId ?? undefined,\n deviceType: s.deviceType ?? undefined,\n deviceName: s.deviceName ?? undefined,\n ipAddress: s.ipAddress ?? undefined,\n createdAt: s.createdAt,\n expiresAt: s.expiresAt,\n isCurrent: s.id === currentSessionId,\n }));\n }\n\n /**\n * Revoke a specific session\n */\n async revokeSession(sessionId: string): Promise<void> {\n await this.signOut(sessionId);\n }\n\n /**\n * Revoke all sessions for a user\n */\n async revokeAllSessions(userId: string): Promise<void> {\n await this.signOut('', { revokeAll: true, userId });\n }\n\n /**\n * Get the underlying storage instance\n */\n getStorage(): KVStorage {\n this.ensureInitialized();\n return this.storage;\n }\n\n /**\n * Get the JWT manager\n */\n getJwtManager(): JwtManager {\n return this.jwtManager;\n }\n\n /**\n * Get the database adapter\n */\n getAdapter(): AuthAdapter {\n return this.adapter;\n }\n\n /**\n * Get configuration\n */\n getConfig(): Required<ParsAuthConfig> {\n return this.config;\n }\n\n /**\n * Find user by identifier based on provider\n */\n private async findUserByIdentifier(\n identifier: string,\n provider: string\n ): Promise<AdapterUser | null> {\n switch (provider) {\n case 'otp':\n // Could be email or phone, try both\n const userByEmail = await this.adapter.findUserByEmail(identifier);\n if (userByEmail) return userByEmail;\n return this.adapter.findUserByPhone(identifier);\n\n case 'password':\n return this.adapter.findUserByEmail(identifier);\n\n default:\n // For OAuth and others, look up by auth method\n const authMethod = await this.adapter.findAuthMethod(provider, identifier);\n if (authMethod) {\n return this.adapter.findUserById(authMethod.userId);\n }\n return null;\n }\n }\n\n /**\n * Create a new session\n */\n private async createSession(\n userId: string,\n metadata?: {\n ipAddress?: string;\n userAgent?: string;\n deviceType?: string;\n deviceName?: string;\n tenantId?: string;\n }\n ): Promise<AdapterSession | null> {\n // Check max sessions limit\n const existingSessions = await this.adapter.findSessionsByUserId(userId);\n const activeSessions = existingSessions.filter((s) => s.status === 'active');\n\n if (activeSessions.length >= this.config.session.maxSessions!) {\n // Remove oldest session\n const oldest = activeSessions.sort(\n (a, b) => a.createdAt.getTime() - b.createdAt.getTime()\n )[0];\n if (oldest) {\n await this.adapter.deleteSession(oldest.id);\n // Block the old session\n await this.sessionBlocklist.blockSession(\n oldest.id,\n new Date(Date.now() + this.config.session.refreshTokenExpiry! * 1000),\n { reason: 'Session limit reached', userId }\n );\n }\n }\n\n const expiresAt = new Date(\n Date.now() + this.config.session.accessTokenExpiry! * 1000\n );\n const refreshExpiresAt = new Date(\n Date.now() + this.config.session.refreshTokenExpiry! * 1000\n );\n\n const session = await this.adapter.createSession({\n userId,\n tenantId: metadata?.tenantId,\n expiresAt,\n refreshExpiresAt,\n deviceType: metadata?.deviceType,\n deviceName: metadata?.deviceName,\n userAgent: metadata?.userAgent,\n ipAddress: metadata?.ipAddress,\n });\n\n // Call callback\n if (this.callbacks.onSessionCreated) {\n await this.callbacks.onSessionCreated({ id: session.id, userId });\n }\n\n return session;\n }\n\n // ============================================\n // MULTI-TENANT OPERATIONS\n // ============================================\n\n /**\n * Resolve tenant from request\n */\n async resolveTenant(request: Request): Promise<TenantResolutionResult> {\n this.ensureInitialized();\n\n if (!this.tenantResolver) {\n return { tenantId: null, resolvedFrom: null };\n }\n\n return this.tenantResolver.resolve(request);\n }\n\n /**\n * Switch current session to a different tenant\n */\n async switchTenant(\n sessionId: string,\n targetTenantId: string\n ): Promise<{ success: boolean; tokens?: TokenPair; error?: string }> {\n this.ensureInitialized();\n\n // Get current session\n const session = await this.adapter.findSessionById(sessionId);\n if (!session) {\n return { success: false, error: 'Session not found' };\n }\n\n // Validate tenant switch\n try {\n await this.tenantManager.validateTenantSwitch(session.userId, targetTenantId);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Tenant switch not allowed',\n };\n }\n\n // Update session with new tenant\n await this.adapter.updateSession(sessionId, {\n tenantId: targetTenantId,\n });\n\n // Generate new tokens with new tenant context\n const tokens = await this.jwtManager.generateTokenPair({\n userId: session.userId,\n tenantId: targetTenantId,\n sessionId: session.id,\n });\n\n return { success: true, tokens };\n }\n\n /**\n * Get all tenants for current user\n */\n async getUserTenants(userId: string): Promise<Array<{\n tenant: AdapterTenant;\n membership: AdapterMembership;\n }>> {\n this.ensureInitialized();\n\n const memberships = await this.tenantManager.getUserTenants(userId);\n\n return memberships\n .filter((m) => m.tenant && m.status === 'active')\n .map((m) => ({\n tenant: m.tenant!,\n membership: m,\n }));\n }\n\n /**\n * Check if user is member of tenant\n */\n async isTenantMember(userId: string, tenantId: string): Promise<boolean> {\n this.ensureInitialized();\n return this.tenantManager.isMember(userId, tenantId);\n }\n\n /**\n * Check if user has role in tenant\n */\n async hasRoleInTenant(\n userId: string,\n tenantId: string,\n role: string\n ): Promise<boolean> {\n this.ensureInitialized();\n return this.tenantManager.hasRole(userId, tenantId, role);\n }\n\n /**\n * Get user's membership in a tenant\n */\n async getTenantMembership(\n userId: string,\n tenantId: string\n ): Promise<AdapterMembership | null> {\n this.ensureInitialized();\n return this.tenantManager.getMembership(userId, tenantId);\n }\n\n /**\n * Add member to tenant\n */\n async addTenantMember(input: {\n userId: string;\n tenantId: string;\n role: string;\n permissions?: string[];\n }): Promise<AdapterMembership> {\n this.ensureInitialized();\n return this.tenantManager.addMember(input);\n }\n\n /**\n * Update member's role/permissions in tenant\n */\n async updateTenantMember(\n userId: string,\n tenantId: string,\n updates: { role?: string; permissions?: string[]; status?: 'active' | 'inactive' }\n ): Promise<AdapterMembership> {\n this.ensureInitialized();\n return this.tenantManager.updateMember(userId, tenantId, updates);\n }\n\n /**\n * Remove member from tenant\n */\n async removeTenantMember(userId: string, tenantId: string): Promise<void> {\n this.ensureInitialized();\n return this.tenantManager.removeMember(userId, tenantId);\n }\n\n /**\n * Send invitation to join tenant\n */\n async inviteToTenant(input: {\n email: string;\n tenantId: string;\n role: string;\n permissions?: string[];\n invitedBy: string;\n message?: string;\n }): Promise<SendInvitationResult> {\n this.ensureInitialized();\n\n if (!this.invitationService) {\n return { success: false, error: 'Invitation service not configured. Set baseUrl in config.' };\n }\n\n return this.invitationService.sendInvitation(input);\n }\n\n /**\n * Accept an invitation\n */\n async acceptInvitation(\n token: string,\n userId: string\n ): Promise<AcceptInvitationResult> {\n this.ensureInitialized();\n\n if (!this.invitationService) {\n return { success: false, error: 'Invitation service not configured' };\n }\n\n return this.invitationService.acceptInvitation({ token, userId });\n }\n\n /**\n * Check invitation status\n */\n async checkInvitation(token: string): Promise<{\n valid: boolean;\n tenantName?: string;\n role?: string;\n email?: string;\n error?: string;\n }> {\n this.ensureInitialized();\n\n if (!this.invitationService) {\n return { valid: false, error: 'Invitation service not configured' };\n }\n\n const result = await this.invitationService.checkInvitation(token);\n\n if (!result.valid) {\n return { valid: false, error: result.error };\n }\n\n return {\n valid: true,\n tenantName: result.tenant?.name,\n role: result.invitation?.role,\n email: result.invitation?.email,\n };\n }\n\n /**\n * Get tenant manager instance\n */\n getTenantManager(): TenantManager {\n this.ensureInitialized();\n return this.tenantManager;\n }\n\n /**\n * Get invitation service instance\n */\n getInvitationService(): InvitationService | undefined {\n this.ensureInitialized();\n return this.invitationService;\n }\n\n /**\n * Get tenant resolver instance\n */\n getTenantResolver(): TenantResolver | undefined {\n return this.tenantResolver;\n }\n}\n\n/**\n * Create a Pars Auth Engine instance\n */\nexport function createAuthEngine(config: ParsAuthConfig): ParsAuthEngine {\n return new ParsAuthEngine(config);\n}\n","/**\n * Google OAuth Provider\n */\n\nimport type { OAuthProvider, OAuthUserInfo, OAuthTokens, GoogleConfig } from './types.js';\n\nexport class GoogleProvider implements OAuthProvider {\n readonly name = 'google';\n private config: GoogleConfig;\n\n constructor(config: GoogleConfig) {\n this.config = config;\n }\n\n async getAuthorizationUrl(state: string, codeChallenge?: string): Promise<string> {\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 state,\n access_type: 'offline',\n prompt: 'consent',\n });\n\n if (codeChallenge) {\n params.set('code_challenge', codeChallenge);\n params.set('code_challenge_method', 'S256');\n }\n\n return `https://accounts.google.com/o/oauth2/v2/auth?${params}`;\n }\n\n async exchangeCode(code: string, codeVerifier?: string): Promise<OAuthTokens> {\n const params: Record<string, string> = {\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 if (codeVerifier) {\n params['code_verifier'] = codeVerifier;\n }\n\n const response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams(params),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google token exchange failed: ${error}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n accessToken: data['access_token'] as string,\n refreshToken: data['refresh_token'] as string | undefined,\n expiresIn: data['expires_in'] as number | undefined,\n idToken: data['id_token'] as string | undefined,\n tokenType: data['token_type'] as string | undefined,\n scope: data['scope'] as string | undefined,\n };\n }\n\n async getUserInfo(accessToken: string): Promise<OAuthUserInfo> {\n const response = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch Google user info');\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n id: data['sub'] as string,\n email: data['email'] as string,\n name: data['name'] as string | undefined,\n avatarUrl: data['picture'] as string | undefined,\n emailVerified: (data['email_verified'] as boolean) ?? false,\n raw: data,\n };\n }\n\n async refreshToken(refreshToken: string): Promise<OAuthTokens> {\n const response = await 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 if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google token refresh failed: ${error}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n accessToken: data['access_token'] as string,\n refreshToken: (data['refresh_token'] as string | undefined) ?? refreshToken,\n expiresIn: data['expires_in'] as number | undefined,\n idToken: data['id_token'] as string | undefined,\n tokenType: data['token_type'] as string | undefined,\n scope: data['scope'] as string | undefined,\n };\n }\n}\n","/**\n * GitHub OAuth Provider\n */\n\nimport type { OAuthProvider, OAuthUserInfo, OAuthTokens, GitHubConfig } from './types.js';\n\nexport class GitHubProvider implements OAuthProvider {\n readonly name = 'github';\n private config: GitHubConfig;\n\n constructor(config: GitHubConfig) {\n this.config = config;\n }\n\n async getAuthorizationUrl(state: string, _codeChallenge?: string): Promise<string> {\n const params = new URLSearchParams({\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n scope: this.config.scopes?.join(' ') ?? 'read:user user:email',\n state,\n });\n\n return `https://github.com/login/oauth/authorize?${params}`;\n }\n\n async exchangeCode(code: string, _codeVerifier?: string): Promise<OAuthTokens> {\n const response = await fetch('https://github.com/login/oauth/access_token', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify({\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n code,\n redirect_uri: this.config.redirectUri,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`GitHub token exchange failed: ${error}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (data['error']) {\n throw new Error(`GitHub OAuth error: ${data['error_description'] ?? data['error']}`);\n }\n\n return {\n accessToken: data['access_token'] as string,\n tokenType: data['token_type'] as string | undefined,\n scope: data['scope'] as string | undefined,\n };\n }\n\n async getUserInfo(accessToken: string): Promise<OAuthUserInfo> {\n // Get user profile\n const userResponse = await fetch('https://api.github.com/user', {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n Accept: 'application/vnd.github.v3+json',\n },\n });\n\n if (!userResponse.ok) {\n throw new Error('Failed to fetch GitHub user info');\n }\n\n const userData = (await userResponse.json()) as Record<string, unknown>;\n\n // Get user emails (may need user:email scope)\n let email = userData['email'] as string | null;\n let emailVerified = false;\n\n if (!email) {\n try {\n const emailsResponse = await fetch('https://api.github.com/user/emails', {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n Accept: 'application/vnd.github.v3+json',\n },\n });\n\n if (emailsResponse.ok) {\n const emails = (await emailsResponse.json()) as Array<{\n email: string;\n primary: boolean;\n verified: boolean;\n }>;\n\n const primaryEmail = emails.find((e) => e.primary && e.verified);\n if (primaryEmail) {\n email = primaryEmail.email;\n emailVerified = primaryEmail.verified;\n }\n }\n } catch {\n // Email fetch failed, continue without\n }\n }\n\n return {\n id: String(userData['id']),\n email: email ?? '',\n name: (userData['name'] as string) ?? (userData['login'] as string),\n avatarUrl: userData['avatar_url'] as string | undefined,\n emailVerified,\n raw: userData,\n };\n }\n}\n","/**\n * Microsoft OAuth Provider\n */\n\nimport type { OAuthProvider, OAuthUserInfo, OAuthTokens, MicrosoftConfig } from './types.js';\n\nexport class MicrosoftProvider implements OAuthProvider {\n readonly name = 'microsoft';\n private config: MicrosoftConfig;\n private baseUrl: string;\n\n constructor(config: MicrosoftConfig) {\n this.config = config;\n // Use tenant-specific or common endpoint\n const tenant = config.tenantId ?? 'common';\n this.baseUrl = `https://login.microsoftonline.com/${tenant}/oauth2/v2.0`;\n }\n\n async getAuthorizationUrl(state: string, codeChallenge?: string): Promise<string> {\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 User.Read',\n state,\n response_mode: 'query',\n });\n\n if (codeChallenge) {\n params.set('code_challenge', codeChallenge);\n params.set('code_challenge_method', 'S256');\n }\n\n return `${this.baseUrl}/authorize?${params}`;\n }\n\n async exchangeCode(code: string, codeVerifier?: string): Promise<OAuthTokens> {\n const params: Record<string, string> = {\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 if (codeVerifier) {\n params['code_verifier'] = codeVerifier;\n }\n\n const response = await fetch(`${this.baseUrl}/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams(params),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Microsoft token exchange failed: ${error}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n accessToken: data['access_token'] as string,\n refreshToken: data['refresh_token'] as string | undefined,\n expiresIn: data['expires_in'] as number | undefined,\n idToken: data['id_token'] as string | undefined,\n tokenType: data['token_type'] as string | undefined,\n scope: data['scope'] as string | undefined,\n };\n }\n\n async getUserInfo(accessToken: string): Promise<OAuthUserInfo> {\n const response = await fetch('https://graph.microsoft.com/v1.0/me', {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch Microsoft user info');\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n id: data['id'] as string,\n email: (data['mail'] as string) ?? (data['userPrincipalName'] as string),\n name: data['displayName'] as string | undefined,\n avatarUrl: undefined, // Would need separate call to get photo\n emailVerified: true, // Microsoft accounts are verified\n raw: data,\n };\n }\n\n async refreshToken(refreshToken: string): Promise<OAuthTokens> {\n const response = await fetch(`${this.baseUrl}/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 scope: this.config.scopes?.join(' ') ?? 'openid email profile User.Read',\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Microsoft token refresh failed: ${error}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n accessToken: data['access_token'] as string,\n refreshToken: (data['refresh_token'] as string | undefined) ?? refreshToken,\n expiresIn: data['expires_in'] as number | undefined,\n idToken: data['id_token'] as string | undefined,\n tokenType: data['token_type'] as string | undefined,\n scope: data['scope'] as string | undefined,\n };\n }\n}\n","/**\n * Apple OAuth Provider\n * Uses Sign in with Apple\n */\n\nimport type { OAuthProvider, OAuthUserInfo, OAuthTokens, AppleConfig } from './types.js';\n\nexport class AppleProvider implements OAuthProvider {\n readonly name = 'apple';\n private config: AppleConfig;\n\n constructor(config: AppleConfig) {\n this.config = config;\n }\n\n async getAuthorizationUrl(state: string, _codeChallenge?: string): Promise<string> {\n const params = new URLSearchParams({\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n response_type: 'code id_token',\n response_mode: 'form_post',\n scope: this.config.scopes?.join(' ') ?? 'name email',\n state,\n });\n\n return `https://appleid.apple.com/auth/authorize?${params}`;\n }\n\n async exchangeCode(code: string, _codeVerifier?: string): Promise<OAuthTokens> {\n const clientSecret = await this.generateClientSecret();\n\n const params = new URLSearchParams({\n client_id: this.config.clientId,\n client_secret: clientSecret,\n code,\n grant_type: 'authorization_code',\n redirect_uri: this.config.redirectUri,\n });\n\n const response = await fetch('https://appleid.apple.com/auth/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: params,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Apple token exchange failed: ${error}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n accessToken: data['access_token'] as string,\n refreshToken: data['refresh_token'] as string | undefined,\n expiresIn: data['expires_in'] as number | undefined,\n idToken: data['id_token'] as string | undefined,\n tokenType: data['token_type'] as string | undefined,\n };\n }\n\n async getUserInfo(accessToken: string): Promise<OAuthUserInfo> {\n // Apple doesn't have a userinfo endpoint\n // User info is in the id_token which should be decoded\n // For now, we'll just return a minimal response\n // In practice, the id_token should be passed and decoded\n\n // This is a placeholder - real implementation should decode the id_token\n return {\n id: '',\n email: '',\n emailVerified: false,\n raw: { accessToken },\n };\n }\n\n /**\n * Parse user info from id_token and form post data\n * Apple sends user info only on first authorization\n */\n parseUserFromCallback(\n idToken: string,\n userData?: { name?: { firstName?: string; lastName?: string }; email?: string }\n ): OAuthUserInfo {\n // Decode JWT payload (without verification - should be done server-side)\n const parts = idToken.split('.');\n if (parts.length !== 3) {\n throw new Error('Invalid id_token format');\n }\n\n const payload = JSON.parse(\n Buffer.from(parts[1]!, 'base64url').toString('utf-8')\n ) as Record<string, unknown>;\n\n const name = userData?.name\n ? [userData.name.firstName, userData.name.lastName].filter(Boolean).join(' ')\n : undefined;\n\n return {\n id: payload['sub'] as string,\n email: (userData?.email ?? payload['email']) as string,\n name,\n emailVerified: payload['email_verified'] === 'true' || payload['email_verified'] === true,\n raw: payload,\n };\n }\n\n /**\n * Generate client secret JWT for Apple\n * Apple requires a JWT signed with your private key\n */\n private async generateClientSecret(): Promise<string> {\n const now = Math.floor(Date.now() / 1000);\n const expiry = now + 86400 * 180; // 180 days\n\n const header = {\n alg: 'ES256',\n kid: this.config.keyId,\n typ: 'JWT',\n };\n\n const payload = {\n iss: this.config.teamId,\n iat: now,\n exp: expiry,\n aud: 'https://appleid.apple.com',\n sub: this.config.clientId,\n };\n\n // Import the private key\n const privateKey = await crypto.subtle.importKey(\n 'pkcs8',\n this.pemToArrayBuffer(this.config.privateKey),\n { name: 'ECDSA', namedCurve: 'P-256' },\n false,\n ['sign']\n );\n\n // Create JWT\n const headerB64 = this.base64UrlEncode(JSON.stringify(header));\n const payloadB64 = this.base64UrlEncode(JSON.stringify(payload));\n const signingInput = `${headerB64}.${payloadB64}`;\n\n const signature = await crypto.subtle.sign(\n { name: 'ECDSA', hash: 'SHA-256' },\n privateKey,\n new TextEncoder().encode(signingInput)\n );\n\n const signatureB64 = this.base64UrlEncode(\n String.fromCharCode(...new Uint8Array(signature))\n );\n\n return `${signingInput}.${signatureB64}`;\n }\n\n private pemToArrayBuffer(pem: string): ArrayBuffer {\n const pemContents = pem\n .replace(/-----BEGIN PRIVATE KEY-----/, '')\n .replace(/-----END PRIVATE KEY-----/, '')\n .replace(/\\s/g, '');\n\n const binaryString = atob(pemContents);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n }\n\n private base64UrlEncode(str: string): string {\n return btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n }\n}\n","/**\n * OAuth Provider\n * Manages OAuth2 authentication flows with PKCE support\n */\n\nimport type { KVStorage } from '../../storage/types.js';\nimport type {\n OAuthProvider,\n OAuthProviderName,\n OAuthUserInfo,\n OAuthTokens,\n OAuthState,\n GoogleConfig,\n GitHubConfig,\n MicrosoftConfig,\n AppleConfig,\n} from './types.js';\nimport { GoogleProvider } from './google.js';\nimport { GitHubProvider } from './github.js';\nimport { MicrosoftProvider } from './microsoft.js';\nimport { AppleProvider } from './apple.js';\n\n// Re-export types and providers\nexport * from './types.js';\nexport { GoogleProvider } from './google.js';\nexport { GitHubProvider } from './github.js';\nexport { MicrosoftProvider } from './microsoft.js';\nexport { AppleProvider } from './apple.js';\n\n/**\n * OAuth configuration\n */\nexport interface OAuthConfig {\n google?: GoogleConfig;\n github?: GitHubConfig;\n microsoft?: MicrosoftConfig;\n apple?: AppleConfig;\n}\n\n/**\n * OAuth flow result\n */\nexport interface OAuthFlowResult {\n authorizationUrl: string;\n state: string;\n}\n\n/**\n * OAuth callback result\n */\nexport interface OAuthCallbackResult {\n userInfo: OAuthUserInfo;\n tokens: OAuthTokens;\n tenantId?: string;\n redirectUrl?: string;\n}\n\n/**\n * Generate PKCE code verifier and challenge\n */\nexport async function generatePKCE(): Promise<{\n codeVerifier: string;\n codeChallenge: string;\n}> {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n const codeVerifier = btoa(String.fromCharCode(...array))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const digest = await crypto.subtle.digest('SHA-256', data);\n const codeChallenge = btoa(String.fromCharCode(...new Uint8Array(digest)))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n\n return { codeVerifier, codeChallenge };\n}\n\n/**\n * Generate secure random state\n */\nexport function generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return btoa(String.fromCharCode(...array))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\n/**\n * OAuth Manager\n * Handles OAuth flows with state management via KVStorage\n */\nexport class OAuthManager {\n private storage: KVStorage;\n private providers: Map<string, OAuthProvider> = new Map();\n private stateExpirySeconds: number;\n\n constructor(\n storage: KVStorage,\n config: OAuthConfig,\n options?: { stateExpirySeconds?: number }\n ) {\n this.storage = storage;\n this.stateExpirySeconds = options?.stateExpirySeconds ?? 600; // 10 minutes\n\n // Initialize configured providers\n if (config.google) {\n this.providers.set('google', new GoogleProvider(config.google));\n }\n if (config.github) {\n this.providers.set('github', new GitHubProvider(config.github));\n }\n if (config.microsoft) {\n this.providers.set('microsoft', new MicrosoftProvider(config.microsoft));\n }\n if (config.apple) {\n this.providers.set('apple', new AppleProvider(config.apple));\n }\n }\n\n /**\n * Get available providers\n */\n getAvailableProviders(): OAuthProviderName[] {\n return Array.from(this.providers.keys()) as OAuthProviderName[];\n }\n\n /**\n * Check if a provider is configured\n */\n hasProvider(name: string): boolean {\n return this.providers.has(name);\n }\n\n /**\n * Get a provider by name\n */\n getProvider(name: string): OAuthProvider | undefined {\n return this.providers.get(name);\n }\n\n /**\n * Start OAuth flow - returns authorization URL\n */\n async startFlow(\n providerName: OAuthProviderName,\n options?: { tenantId?: string; redirectUrl?: string }\n ): Promise<OAuthFlowResult> {\n const provider = this.providers.get(providerName);\n if (!provider) {\n throw new Error(`OAuth provider '${providerName}' not configured`);\n }\n\n const state = generateState();\n const { codeVerifier, codeChallenge } = await generatePKCE();\n\n // Store state\n const stateData: OAuthState = {\n state,\n provider: providerName,\n codeVerifier,\n tenantId: options?.tenantId,\n redirectUrl: options?.redirectUrl,\n expiresAt: new Date(Date.now() + this.stateExpirySeconds * 1000),\n };\n\n await this.storage.set(\n `oauth:state:${state}`,\n stateData,\n this.stateExpirySeconds\n );\n\n const authorizationUrl = await provider.getAuthorizationUrl(state, codeChallenge);\n\n return { authorizationUrl, state };\n }\n\n /**\n * Handle OAuth callback\n */\n async handleCallback(\n providerName: OAuthProviderName,\n code: string,\n state: string\n ): Promise<OAuthCallbackResult> {\n const provider = this.providers.get(providerName);\n if (!provider) {\n throw new Error(`OAuth provider '${providerName}' not configured`);\n }\n\n // Retrieve and validate state\n const storedState = await this.storage.get<OAuthState>(`oauth:state:${state}`);\n\n if (!storedState) {\n throw new Error('Invalid OAuth state');\n }\n\n if (storedState.expiresAt < new Date()) {\n await this.storage.delete(`oauth:state:${state}`);\n throw new Error('OAuth state expired');\n }\n\n if (storedState.provider !== providerName) {\n throw new Error('Provider mismatch');\n }\n\n // Exchange code for tokens\n const tokens = await provider.exchangeCode(code, storedState.codeVerifier);\n\n // Get user info\n const userInfo = await provider.getUserInfo(tokens.accessToken);\n\n // Clean up used state\n await this.storage.delete(`oauth:state:${state}`);\n\n return {\n userInfo,\n tokens,\n tenantId: storedState.tenantId,\n redirectUrl: storedState.redirectUrl,\n };\n }\n\n /**\n * Refresh OAuth tokens (if supported by provider)\n */\n async refreshTokens(\n providerName: OAuthProviderName,\n refreshToken: string\n ): Promise<OAuthTokens> {\n const provider = this.providers.get(providerName);\n if (!provider) {\n throw new Error(`OAuth provider '${providerName}' not configured`);\n }\n\n // Check if provider supports token refresh\n if (!provider.refreshToken) {\n throw new Error(`Token refresh not supported for ${providerName}`);\n }\n\n return provider.refreshToken(refreshToken);\n }\n\n /**\n * Check if provider supports token refresh\n */\n supportsRefresh(providerName: OAuthProviderName): boolean {\n const provider = this.providers.get(providerName);\n return provider ? typeof provider.refreshToken === 'function' : false;\n }\n}\n\n/**\n * Create OAuth manager\n */\nexport function createOAuthManager(\n storage: KVStorage,\n config: OAuthConfig,\n options?: { stateExpirySeconds?: number }\n): OAuthManager {\n return new OAuthManager(storage, config, options);\n}\n","/**\n * Magic Link Provider\n * Passwordless email authentication via secure links\n */\n\nimport type { KVStorage } from '../../storage/types.js';\nimport type { AuthProvider, AuthInput, AuthResult, ProviderInfo } from '../base.js';\nimport { generateRandomHex, sha256Hex } from '../../utils/crypto.js';\n\n/**\n * Magic Link configuration\n */\nexport interface MagicLinkConfig {\n /** Base URL for magic links (e.g., https://app.example.com) */\n baseUrl: string;\n /** Path for callback (default: /auth/magic-link/callback) */\n callbackPath?: string;\n /** Token expiration in seconds (default: 900 = 15 minutes) */\n expiresIn?: number;\n /** Token length in bytes (default: 32) */\n tokenLength?: number;\n /** Email sender function */\n send: (email: string, url: string, expiresIn: number) => Promise<void>;\n}\n\n/**\n * Magic link token record\n */\ninterface MagicLinkToken {\n email: string;\n tokenHash: string;\n tenantId?: string;\n redirectUrl?: string;\n expiresAt: string;\n usedAt?: string;\n}\n\n/**\n * Send magic link result\n */\nexport interface SendMagicLinkResult {\n success: boolean;\n expiresAt?: Date;\n error?: string;\n}\n\n/**\n * Verify magic link result\n */\nexport interface VerifyMagicLinkResult {\n success: boolean;\n email?: string;\n tenantId?: string;\n redirectUrl?: string;\n error?: string;\n}\n\n/**\n * Magic Link Provider\n */\nexport class MagicLinkProvider implements AuthProvider {\n readonly name = 'magic-link';\n readonly type = 'magic-link' as const;\n\n private storage: KVStorage;\n private config: Required<Omit<MagicLinkConfig, 'send'>> & { send: MagicLinkConfig['send'] };\n private _enabled: boolean;\n\n constructor(storage: KVStorage, config: MagicLinkConfig) {\n this.storage = storage;\n this.config = {\n callbackPath: '/auth/magic-link/callback',\n expiresIn: 900, // 15 minutes\n tokenLength: 32,\n ...config,\n };\n this._enabled = true;\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n /**\n * Send magic link to email\n */\n async sendMagicLink(\n email: string,\n options?: { tenantId?: string; redirectUrl?: string }\n ): Promise<SendMagicLinkResult> {\n // Normalize email\n const normalizedEmail = email.toLowerCase().trim();\n\n // Generate token\n const token = await generateRandomHex(this.config.tokenLength);\n const tokenHash = await sha256Hex(token);\n\n // Calculate expiration\n const expiresAt = new Date(Date.now() + this.config.expiresIn * 1000);\n\n // Clean up old tokens for this email\n await this.storage.delete(`magic:email:${normalizedEmail}`);\n\n // Store token\n const tokenData: MagicLinkToken = {\n email: normalizedEmail,\n tokenHash,\n tenantId: options?.tenantId,\n redirectUrl: options?.redirectUrl,\n expiresAt: expiresAt.toISOString(),\n };\n\n await this.storage.set(\n `magic:token:${tokenHash}`,\n tokenData,\n this.config.expiresIn\n );\n\n // Also store by email for cleanup\n await this.storage.set(\n `magic:email:${normalizedEmail}`,\n tokenHash,\n this.config.expiresIn\n );\n\n // Build magic link URL\n const params = new URLSearchParams({ token });\n if (options?.redirectUrl) {\n params.set('redirect', options.redirectUrl);\n }\n const magicLink = `${this.config.baseUrl}${this.config.callbackPath}?${params}`;\n\n // Send email\n try {\n await this.config.send(normalizedEmail, magicLink, this.config.expiresIn);\n return { success: true, expiresAt };\n } catch (error) {\n // Clean up on send failure\n await this.storage.delete(`magic:token:${tokenHash}`);\n await this.storage.delete(`magic:email:${normalizedEmail}`);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to send email',\n };\n }\n }\n\n /**\n * Verify magic link token\n */\n async verifyMagicLink(token: string): Promise<VerifyMagicLinkResult> {\n const tokenHash = await sha256Hex(token);\n\n // Find token\n const tokenData = await this.storage.get<MagicLinkToken>(`magic:token:${tokenHash}`);\n\n if (!tokenData) {\n return { success: false, error: 'Invalid or expired magic link' };\n }\n\n if (tokenData.usedAt) {\n return { success: false, error: 'Magic link already used' };\n }\n\n if (new Date(tokenData.expiresAt) < new Date()) {\n await this.storage.delete(`magic:token:${tokenHash}`);\n return { success: false, error: 'Magic link expired' };\n }\n\n // Mark as used\n tokenData.usedAt = new Date().toISOString();\n await this.storage.set(`magic:token:${tokenHash}`, tokenData, 60); // Keep for 1 minute for audit\n\n // Clean up email lookup\n await this.storage.delete(`magic:email:${tokenData.email}`);\n\n return {\n success: true,\n email: tokenData.email,\n tenantId: tokenData.tenantId,\n redirectUrl: tokenData.redirectUrl,\n };\n }\n\n /**\n * Authenticate with magic link token (implements AuthProvider)\n */\n async authenticate(input: AuthInput): Promise<AuthResult> {\n const { credential } = input;\n\n if (!credential) {\n return {\n success: false,\n error: 'Token is required',\n errorCode: 'INVALID_INPUT',\n };\n }\n\n const result = await this.verifyMagicLink(credential);\n\n if (!result.success) {\n return {\n success: false,\n error: result.error,\n errorCode: 'INVALID_TOKEN',\n };\n }\n\n return {\n success: true,\n // Auth engine will handle user lookup/creation based on email\n };\n }\n\n /**\n * Get provider info\n */\n getInfo(): ProviderInfo {\n return {\n name: this.name,\n type: this.type,\n enabled: this.enabled,\n displayName: 'Magic Link',\n };\n }\n\n /**\n * Request magic link (for use in auth routes)\n */\n async requestMagicLink(\n email: string,\n options?: { tenantId?: string; redirectUrl?: string }\n ): Promise<SendMagicLinkResult> {\n return this.sendMagicLink(email, options);\n }\n}\n\n/**\n * Create Magic Link provider\n */\nexport function createMagicLinkProvider(\n storage: KVStorage,\n config: MagicLinkConfig\n): MagicLinkProvider {\n return new MagicLinkProvider(storage, config);\n}\n","/**\n * TOTP Provider (Time-based One-Time Password)\n * RFC 6238 compliant, Google Authenticator compatible\n */\n\nimport type { KVStorage } from '../../storage/types.js';\nimport type { TwoFactorProvider, TwoFactorSetupResult, ProviderInfo, AuthInput, AuthResult } from '../base.js';\nimport { generateRandomHex } from '../../utils/crypto.js';\n\n/**\n * TOTP Configuration\n */\nexport interface TOTPConfig {\n /** Issuer name (your app name) */\n issuer: string;\n /** Hash algorithm (default: SHA1 for compatibility) */\n algorithm?: 'SHA1' | 'SHA256' | 'SHA512';\n /** Number of digits (default: 6) */\n digits?: 6 | 8;\n /** Time period in seconds (default: 30) */\n period?: number;\n /** Time window for drift tolerance (default: 1) */\n window?: number;\n /** Number of backup codes (default: 10) */\n backupCodeCount?: number;\n /** Encryption key for storing secrets */\n encryptionKey?: string;\n}\n\n/**\n * TOTP secret record\n */\ninterface TOTPSecret {\n userId: string;\n encryptedSecret: string;\n backupCodes: string;\n verified: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * TOTP setup result\n */\nexport interface TOTPSetupData {\n /** Base32 encoded secret */\n secret: string;\n /** QR code URL */\n qrCodeUrl: string;\n /** Backup codes */\n backupCodes: string[];\n /** otpauth:// URI */\n otpauthUri: string;\n}\n\n/**\n * TOTP verify result\n */\nexport interface TOTPVerifyResult {\n valid: boolean;\n usedBackupCode?: boolean;\n}\n\nconst DEFAULT_CONFIG = {\n algorithm: 'SHA1' as const,\n digits: 6 as const,\n period: 30,\n window: 1,\n backupCodeCount: 10,\n};\n\n/**\n * Convert bytes to base32\n */\nfunction bytesToBase32(bytes: Uint8Array): string {\n const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n let result = '';\n let bits = 0;\n let value = 0;\n\n for (const byte of bytes) {\n value = (value << 8) | byte;\n bits += 8;\n\n while (bits >= 5) {\n result += alphabet[(value >>> (bits - 5)) & 31];\n bits -= 5;\n }\n }\n\n if (bits > 0) {\n result += alphabet[(value << (5 - bits)) & 31];\n }\n\n return result;\n}\n\n/**\n * Convert base32 to bytes\n */\nfunction base32ToBytes(base32: string): Uint8Array {\n const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n const cleaned = base32.toUpperCase().replace(/[^A-Z2-7]/g, '');\n\n const bytes: number[] = [];\n let bits = 0;\n let value = 0;\n\n for (const char of cleaned) {\n const index = alphabet.indexOf(char);\n if (index === -1) continue;\n\n value = (value << 5) | index;\n bits += 5;\n\n if (bits >= 8) {\n bytes.push((value >>> (bits - 8)) & 255);\n bits -= 8;\n }\n }\n\n return new Uint8Array(bytes);\n}\n\n/**\n * HMAC-based One-Time Password\n */\nasync function hotp(\n secret: Uint8Array,\n counter: bigint,\n algorithm: string,\n digits: number\n): Promise<string> {\n // Convert counter to 8-byte big-endian\n const counterBytes = new Uint8Array(8);\n const view = new DataView(counterBytes.buffer);\n view.setBigUint64(0, counter, false);\n\n // Map algorithm names\n const hashName = algorithm === 'SHA1' ? 'SHA-1' : `SHA-${algorithm.slice(3)}`;\n\n // Import key for HMAC\n const key = await crypto.subtle.importKey(\n 'raw',\n secret,\n { name: 'HMAC', hash: hashName },\n false,\n ['sign']\n );\n\n // Generate HMAC\n const signature = await crypto.subtle.sign('HMAC', key, counterBytes);\n const hmac = new Uint8Array(signature);\n\n // Dynamic truncation\n const offset = hmac[hmac.length - 1]! & 0x0f;\n const binary =\n ((hmac[offset]! & 0x7f) << 24) |\n ((hmac[offset + 1]! & 0xff) << 16) |\n ((hmac[offset + 2]! & 0xff) << 8) |\n (hmac[offset + 3]! & 0xff);\n\n // Generate OTP\n const otp = binary % Math.pow(10, digits);\n return otp.toString().padStart(digits, '0');\n}\n\n/**\n * Generate TOTP for current time\n */\nasync function generateTOTP(\n secret: Uint8Array,\n algorithm: string,\n digits: number,\n period: number\n): Promise<string> {\n const counter = BigInt(Math.floor(Date.now() / 1000 / period));\n return hotp(secret, counter, algorithm, digits);\n}\n\n/**\n * Verify TOTP with time window\n */\nasync function verifyTOTP(\n token: string,\n secret: Uint8Array,\n algorithm: string,\n digits: number,\n period: number,\n window: number\n): Promise<boolean> {\n const now = Math.floor(Date.now() / 1000 / period);\n\n for (let i = -window; i <= window; i++) {\n const counter = BigInt(now + i);\n const expected = await hotp(secret, counter, algorithm, digits);\n if (token === expected) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Generate backup codes\n */\nasync function generateBackupCodes(count: number): Promise<string[]> {\n const codes: string[] = [];\n for (let i = 0; i < count; i++) {\n const hex = await generateRandomHex(4);\n // Format as XXXX-XXXX\n codes.push(`${hex.slice(0, 4).toUpperCase()}-${hex.slice(4, 8).toUpperCase()}`);\n }\n return codes;\n}\n\n/**\n * Simple AES-GCM encryption for secrets\n */\nasync function encryptSecret(secret: string, keyString: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(secret);\n const keyData = encoder.encode(keyString.padEnd(32, '0').slice(0, 32));\n\n const key = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'AES-GCM' },\n false,\n ['encrypt']\n );\n\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encrypted = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, data);\n\n const result = new Uint8Array(iv.length + encrypted.byteLength);\n result.set(iv);\n result.set(new Uint8Array(encrypted), iv.length);\n\n return btoa(String.fromCharCode(...result));\n}\n\n/**\n * Decrypt secret\n */\nasync function decryptSecret(encrypted: string, keyString: string): Promise<string> {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(keyString.padEnd(32, '0').slice(0, 32));\n\n const data = Uint8Array.from(atob(encrypted), (c) => c.charCodeAt(0));\n const iv = data.slice(0, 12);\n const ciphertext = data.slice(12);\n\n const key = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'AES-GCM' },\n false,\n ['decrypt']\n );\n\n const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, ciphertext);\n\n return new TextDecoder().decode(decrypted);\n}\n\n/**\n * TOTP Provider\n */\nexport class TOTPProvider implements TwoFactorProvider {\n readonly name = 'totp';\n readonly type = 'totp' as const;\n\n private storage: KVStorage;\n private config: Required<TOTPConfig>;\n private _enabled: boolean = true;\n\n constructor(storage: KVStorage, config: TOTPConfig) {\n this.storage = storage;\n this.config = {\n ...DEFAULT_CONFIG,\n encryptionKey: 'change-me-in-production',\n ...config,\n };\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n /**\n * Setup TOTP for a user\n * Note: Use setupWithEmail for full setup including QR code URL\n */\n async setup(userId: string): Promise<TwoFactorSetupResult> {\n return this.setupWithEmail(userId, userId);\n }\n\n /**\n * Setup TOTP for a user with email for QR code label\n */\n async setupWithEmail(userId: string, userEmail: string): Promise<TwoFactorSetupResult & { qrCodeUrl: string; otpauthUri: string }> {\n // Generate secret (160 bits = 20 bytes for SHA1)\n const secretBytes = crypto.getRandomValues(new Uint8Array(20));\n const secret = bytesToBase32(secretBytes);\n\n // Generate backup codes\n const backupCodes = await generateBackupCodes(this.config.backupCodeCount);\n\n // Create otpauth URI\n const otpauthUri = this.createOtpauthUri(secret, userEmail);\n\n // Create QR code URL (using Google Charts API)\n const qrCodeUrl = `https://chart.googleapis.com/chart?chs=200x200&chld=M|0&cht=qr&chl=${encodeURIComponent(otpauthUri)}`;\n\n // Encrypt and store\n const encryptedSecret = await encryptSecret(secret, this.config.encryptionKey);\n const encryptedBackupCodes = await encryptSecret(\n JSON.stringify(backupCodes),\n this.config.encryptionKey\n );\n\n const totpData: TOTPSecret = {\n userId,\n encryptedSecret,\n backupCodes: encryptedBackupCodes,\n verified: false,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n await this.storage.set(`totp:user:${userId}`, totpData);\n\n return {\n secret,\n qrCode: qrCodeUrl,\n backupCodes,\n qrCodeUrl,\n otpauthUri,\n };\n }\n\n /**\n * Verify TOTP and activate 2FA (for TwoFactorProvider interface)\n */\n async verifySetup(userId: string, token: string): Promise<boolean> {\n const totpData = await this.storage.get<TOTPSecret>(`totp:user:${userId}`);\n\n if (!totpData) {\n throw new Error('TOTP not set up for this user');\n }\n\n const secret = await decryptSecret(totpData.encryptedSecret, this.config.encryptionKey);\n const secretBytes = base32ToBytes(secret);\n\n const valid = await verifyTOTP(\n token,\n secretBytes,\n this.config.algorithm,\n this.config.digits,\n this.config.period,\n this.config.window\n );\n\n if (valid) {\n totpData.verified = true;\n totpData.updatedAt = new Date().toISOString();\n await this.storage.set(`totp:user:${userId}`, totpData);\n return true;\n }\n\n return false;\n }\n\n /**\n * Verify TOTP during login (for TwoFactorProvider interface)\n */\n async verifyLogin(userId: string, code: string): Promise<boolean> {\n const result = await this.verifyCode(userId, code);\n return result.valid;\n }\n\n /**\n * Authenticate (for AuthProvider interface)\n */\n async authenticate(_input: AuthInput): Promise<AuthResult> {\n // TOTP is used as 2FA, not primary authentication\n return {\n success: false,\n error: 'TOTP is used for two-factor authentication, not primary auth',\n errorCode: 'USE_TWO_FACTOR_METHODS',\n };\n }\n\n /**\n * Verify TOTP token\n */\n async verifyCode(userId: string, token: string): Promise<TOTPVerifyResult> {\n const totpData = await this.storage.get<TOTPSecret>(`totp:user:${userId}`);\n\n if (!totpData || !totpData.verified) {\n throw new Error('TOTP not enabled for this user');\n }\n\n // Try TOTP first\n const secret = await decryptSecret(totpData.encryptedSecret, this.config.encryptionKey);\n const secretBytes = base32ToBytes(secret);\n\n const validTOTP = await verifyTOTP(\n token,\n secretBytes,\n this.config.algorithm,\n this.config.digits,\n this.config.period,\n this.config.window\n );\n\n if (validTOTP) {\n return { valid: true, usedBackupCode: false };\n }\n\n // Try backup codes\n const backupCodesJson = await decryptSecret(\n totpData.backupCodes,\n this.config.encryptionKey\n );\n const backupCodes: string[] = JSON.parse(backupCodesJson);\n\n const normalizedToken = token.toUpperCase().replace(/[^A-Z0-9]/g, '');\n const backupIndex = backupCodes.findIndex(\n (code) => code.replace('-', '') === normalizedToken\n );\n\n if (backupIndex !== -1) {\n // Remove used backup code\n backupCodes.splice(backupIndex, 1);\n const encryptedBackupCodes = await encryptSecret(\n JSON.stringify(backupCodes),\n this.config.encryptionKey\n );\n\n totpData.backupCodes = encryptedBackupCodes;\n totpData.updatedAt = new Date().toISOString();\n await this.storage.set(`totp:user:${userId}`, totpData);\n\n return { valid: true, usedBackupCode: true };\n }\n\n return { valid: false };\n }\n\n /**\n * Disable TOTP for user\n */\n async disable(userId: string): Promise<void> {\n await this.storage.delete(`totp:user:${userId}`);\n }\n\n /**\n * Regenerate backup codes\n */\n async regenerateBackupCodes(userId: string): Promise<string[]> {\n const totpData = await this.storage.get<TOTPSecret>(`totp:user:${userId}`);\n\n if (!totpData || !totpData.verified) {\n throw new Error('TOTP not enabled for this user');\n }\n\n const backupCodes = await generateBackupCodes(this.config.backupCodeCount);\n const encryptedBackupCodes = await encryptSecret(\n JSON.stringify(backupCodes),\n this.config.encryptionKey\n );\n\n totpData.backupCodes = encryptedBackupCodes;\n totpData.updatedAt = new Date().toISOString();\n await this.storage.set(`totp:user:${userId}`, totpData);\n\n return backupCodes;\n }\n\n /**\n * Get remaining backup codes count\n */\n async getBackupCodesCount(userId: string): Promise<number> {\n const totpData = await this.storage.get<TOTPSecret>(`totp:user:${userId}`);\n\n if (!totpData) {\n return 0;\n }\n\n const backupCodesJson = await decryptSecret(\n totpData.backupCodes,\n this.config.encryptionKey\n );\n const backupCodes: string[] = JSON.parse(backupCodesJson);\n\n return backupCodes.length;\n }\n\n /**\n * Check if TOTP is enabled for user\n */\n async isEnabled(userId: string): Promise<boolean> {\n const totpData = await this.storage.get<TOTPSecret>(`totp:user:${userId}`);\n return !!totpData?.verified;\n }\n\n /**\n * Generate current TOTP (for testing)\n */\n async generateCurrent(userId: string): Promise<string> {\n const totpData = await this.storage.get<TOTPSecret>(`totp:user:${userId}`);\n\n if (!totpData) {\n throw new Error('TOTP not set up for this user');\n }\n\n const secret = await decryptSecret(totpData.encryptedSecret, this.config.encryptionKey);\n const secretBytes = base32ToBytes(secret);\n\n return generateTOTP(\n secretBytes,\n this.config.algorithm,\n this.config.digits,\n this.config.period\n );\n }\n\n /**\n * Get provider info\n */\n getInfo(): ProviderInfo {\n return {\n name: this.name,\n type: this.type,\n enabled: this.enabled,\n displayName: 'Authenticator App',\n };\n }\n\n /**\n * Create otpauth URI for QR code\n */\n private createOtpauthUri(secret: string, userEmail: string): string {\n const params = new URLSearchParams({\n secret,\n issuer: this.config.issuer,\n algorithm: this.config.algorithm,\n digits: String(this.config.digits),\n period: String(this.config.period),\n });\n\n const label = encodeURIComponent(`${this.config.issuer}:${userEmail}`);\n return `otpauth://totp/${label}?${params}`;\n }\n}\n\n/**\n * Create TOTP provider\n */\nexport function createTOTPProvider(storage: KVStorage, config: TOTPConfig): TOTPProvider {\n return new TOTPProvider(storage, config);\n}\n","/**\n * WebAuthn Provider (Passkeys)\n * FIDO2 passwordless authentication\n */\n\nimport type { KVStorage } from '../../storage/types.js';\nimport type { TwoFactorProvider, TwoFactorSetupResult, ProviderInfo, AuthInput, AuthResult } from '../base.js';\n\n/**\n * WebAuthn Configuration\n */\nexport interface WebAuthnConfig {\n /** Relying Party name (your app name) */\n rpName: string;\n /** Relying Party ID (domain without protocol) */\n rpId: string;\n /** Full origin (e.g., https://example.com) */\n origin: string;\n /** Timeout in milliseconds (default: 60000) */\n timeout?: number;\n /** Attestation preference (default: none) */\n attestation?: 'none' | 'indirect' | 'direct';\n /** User verification preference (default: preferred) */\n userVerification?: 'required' | 'preferred' | 'discouraged';\n}\n\n/**\n * Registration options returned to client\n */\nexport interface RegistrationOptions {\n challenge: string;\n rp: { name: string; id: string };\n user: { id: string; name: string; displayName: string };\n pubKeyCredParams: Array<{ type: 'public-key'; alg: number }>;\n timeout: number;\n attestation: 'none' | 'indirect' | 'direct';\n authenticatorSelection: {\n authenticatorAttachment?: 'platform' | 'cross-platform';\n residentKey: 'required' | 'preferred' | 'discouraged';\n userVerification: 'required' | 'preferred' | 'discouraged';\n };\n excludeCredentials: Array<{ id: string; type: 'public-key'; transports?: string[] }>;\n}\n\n/**\n * Authentication options returned to client\n */\nexport interface AuthenticationOptions {\n challenge: string;\n timeout: number;\n rpId: string;\n allowCredentials: Array<{ id: string; type: 'public-key'; transports?: string[] }>;\n userVerification: 'required' | 'preferred' | 'discouraged';\n}\n\n/**\n * Registration response from client\n */\nexport interface RegistrationResponse {\n id: string;\n rawId: string;\n type: 'public-key';\n response: {\n clientDataJSON: string;\n attestationObject: string;\n transports?: string[];\n };\n}\n\n/**\n * Authentication response from client\n */\nexport interface AuthenticationResponse {\n id: string;\n rawId: string;\n type: 'public-key';\n response: {\n clientDataJSON: string;\n authenticatorData: string;\n signature: string;\n userHandle?: string;\n };\n}\n\n/**\n * Client data JSON structure\n */\nexport interface ClientDataJSON {\n type: 'webauthn.create' | 'webauthn.get';\n challenge: string;\n origin: string;\n crossOrigin?: boolean;\n}\n\n/**\n * Authenticator data structure\n */\nexport interface AuthenticatorData {\n rpIdHash: Uint8Array;\n flags: {\n userPresent: boolean;\n userVerified: boolean;\n attestedCredentialData: boolean;\n extensionDataIncluded?: boolean;\n };\n signCount: number;\n attestedCredentialData?: {\n aaguid: Uint8Array;\n credentialId: Uint8Array;\n publicKey: Uint8Array;\n };\n}\n\n/**\n * Stored credential (exported as WebAuthnCredential)\n */\nexport interface WebAuthnCredential {\n id: string;\n credentialId: string;\n userId: string;\n publicKey: string;\n counter: number;\n transports: string[];\n name: string;\n deviceType?: string;\n createdAt: string;\n lastUsedAt?: string;\n}\n\n/**\n * Pending challenge\n */\ninterface PendingChallenge {\n challenge: string;\n userId?: string;\n type: 'registration' | 'authentication';\n expiresAt: string;\n}\n\n/**\n * Base64URL encode\n */\nfunction base64UrlEncode(bytes: Uint8Array): string {\n return btoa(String.fromCharCode(...bytes))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\n/**\n * Base64URL decode\n */\nfunction base64UrlDecode(str: string): Uint8Array {\n const base64 = str.replace(/-/g, '+').replace(/_/g, '/');\n const padding = '='.repeat((4 - (base64.length % 4)) % 4);\n const binary = atob(base64 + padding);\n return Uint8Array.from(binary, (c) => c.charCodeAt(0));\n}\n\n/**\n * Generate secure random challenge\n */\nfunction generateChallenge(): string {\n const bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n return base64UrlEncode(bytes);\n}\n\n/**\n * Parse authenticator data (simplified)\n */\nfunction parseAuthenticatorData(data: Uint8Array): {\n rpIdHash: Uint8Array;\n flags: {\n userPresent: boolean;\n userVerified: boolean;\n attestedCredentialData: boolean;\n };\n signCount: number;\n attestedCredentialData?: {\n aaguid: Uint8Array;\n credentialId: Uint8Array;\n publicKey: Uint8Array;\n };\n} {\n const rpIdHash = data.slice(0, 32);\n const flagsByte = data[32]!;\n const flags = {\n userPresent: (flagsByte & 0x01) !== 0,\n userVerified: (flagsByte & 0x04) !== 0,\n attestedCredentialData: (flagsByte & 0x40) !== 0,\n };\n\n const signCount = new DataView(data.buffer, data.byteOffset + 33, 4).getUint32(0, false);\n\n let attestedCredentialData;\n if (flags.attestedCredentialData && data.length > 37) {\n const aaguid = data.slice(37, 53);\n const credentialIdLength = new DataView(data.buffer, data.byteOffset + 53, 2).getUint16(0, false);\n const credentialId = data.slice(55, 55 + credentialIdLength);\n const publicKey = data.slice(55 + credentialIdLength);\n\n attestedCredentialData = { aaguid, credentialId, publicKey };\n }\n\n return { rpIdHash, flags, signCount, attestedCredentialData };\n}\n\n/**\n * Simple CBOR map parser for attestation object\n */\nfunction parseCBORMap(data: Uint8Array): Record<string, Uint8Array> {\n const result: Record<string, Uint8Array> = {};\n let offset = 0;\n\n // Expect map (0xa0 - 0xbf)\n const initial = data[offset++]!;\n if ((initial & 0xe0) !== 0xa0) {\n throw new Error('Expected CBOR map');\n }\n\n const mapSize = initial & 0x1f;\n\n for (let i = 0; i < mapSize; i++) {\n // Read key (text string)\n const keyInitial = data[offset++]!;\n const keyLength = keyInitial & 0x1f;\n const key = new TextDecoder().decode(data.slice(offset, offset + keyLength));\n offset += keyLength;\n\n // Read value (byte string)\n const valueInitial = data[offset++]!;\n let valueLength: number;\n\n if ((valueInitial & 0x1f) < 24) {\n valueLength = valueInitial & 0x1f;\n } else if ((valueInitial & 0x1f) === 24) {\n valueLength = data[offset++]!;\n } else if ((valueInitial & 0x1f) === 25) {\n valueLength = (data[offset++]! << 8) | data[offset++]!;\n } else {\n throw new Error('Unsupported CBOR value length');\n }\n\n result[key] = data.slice(offset, offset + valueLength);\n offset += valueLength;\n }\n\n return result;\n}\n\n/**\n * Compare array buffers\n */\nfunction arrayBufferEqual(a: ArrayBuffer, b: ArrayBuffer): boolean {\n if (a.byteLength !== b.byteLength) return false;\n const viewA = new Uint8Array(a);\n const viewB = new Uint8Array(b);\n for (let i = 0; i < viewA.length; i++) {\n if (viewA[i] !== viewB[i]) return false;\n }\n return true;\n}\n\n/**\n * WebAuthn Provider\n */\nexport class WebAuthnProvider implements TwoFactorProvider {\n readonly name = 'webauthn';\n readonly type = 'webauthn' as const;\n\n private storage: KVStorage;\n private config: Required<WebAuthnConfig>;\n private _enabled: boolean = true;\n\n constructor(storage: KVStorage, config: WebAuthnConfig) {\n this.storage = storage;\n this.config = {\n timeout: 60000,\n attestation: 'none',\n userVerification: 'preferred',\n ...config,\n };\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n /**\n * Generate registration options\n */\n async generateRegistrationOptions(\n userId: string,\n userName: string,\n userDisplayName: string,\n authenticatorType?: 'platform' | 'cross-platform'\n ): Promise<RegistrationOptions> {\n const challenge = generateChallenge();\n\n // Get existing credentials to exclude\n const existingCredentials = await this.getUserCredentials(userId);\n\n // Store challenge\n const challengeData: PendingChallenge = {\n challenge,\n userId,\n type: 'registration',\n expiresAt: new Date(Date.now() + this.config.timeout).toISOString(),\n };\n await this.storage.set(`webauthn:challenge:${challenge}`, challengeData, this.config.timeout / 1000);\n\n return {\n challenge,\n rp: {\n name: this.config.rpName,\n id: this.config.rpId,\n },\n user: {\n id: base64UrlEncode(new TextEncoder().encode(userId)),\n name: userName,\n displayName: userDisplayName,\n },\n pubKeyCredParams: [\n { type: 'public-key', alg: -7 }, // ES256\n { type: 'public-key', alg: -257 }, // RS256\n ],\n timeout: this.config.timeout,\n attestation: this.config.attestation,\n authenticatorSelection: {\n authenticatorAttachment: authenticatorType,\n residentKey: 'preferred',\n userVerification: this.config.userVerification,\n },\n excludeCredentials: existingCredentials.map((cred) => ({\n id: cred.credentialId,\n type: 'public-key' as const,\n transports: cred.transports,\n })),\n };\n }\n\n /**\n * Verify registration response\n */\n async verifyRegistration(\n response: RegistrationResponse,\n challenge: string,\n credentialName?: string\n ): Promise<{ success: boolean; credentialId?: string; error?: string }> {\n // Get and verify challenge\n const pending = await this.storage.get<PendingChallenge>(`webauthn:challenge:${challenge}`);\n if (!pending || new Date(pending.expiresAt) < new Date()) {\n return { success: false, error: 'Invalid or expired challenge' };\n }\n\n const userId = pending.userId;\n if (!userId) {\n return { success: false, error: 'No user ID in challenge' };\n }\n\n // Parse client data\n const clientDataJSON = base64UrlDecode(response.response.clientDataJSON);\n const clientData = JSON.parse(new TextDecoder().decode(clientDataJSON)) as Record<string, unknown>;\n\n // Verify client data\n if (clientData['type'] !== 'webauthn.create') {\n return { success: false, error: 'Invalid client data type' };\n }\n\n if (clientData['challenge'] !== challenge) {\n return { success: false, error: 'Challenge mismatch' };\n }\n\n if (clientData['origin'] !== this.config.origin) {\n return { success: false, error: 'Origin mismatch' };\n }\n\n // Parse attestation object\n const attestationObject = base64UrlDecode(response.response.attestationObject);\n let authData: Uint8Array;\n\n try {\n const attestation = parseCBORMap(attestationObject);\n authData = attestation['authData']!;\n } catch {\n return { success: false, error: 'Failed to parse attestation object' };\n }\n\n // Parse authenticator data\n const parsedAuthData = parseAuthenticatorData(authData);\n\n // Verify RP ID hash\n const expectedRpIdHash = await crypto.subtle.digest(\n 'SHA-256',\n new TextEncoder().encode(this.config.rpId)\n );\n if (!arrayBufferEqual(parsedAuthData.rpIdHash.buffer as ArrayBuffer, expectedRpIdHash)) {\n return { success: false, error: 'RP ID hash mismatch' };\n }\n\n // Verify user presence\n if (!parsedAuthData.flags.userPresent) {\n return { success: false, error: 'User not present' };\n }\n\n // Get credential data\n if (!parsedAuthData.attestedCredentialData) {\n return { success: false, error: 'No credential data' };\n }\n\n const { credentialId, publicKey } = parsedAuthData.attestedCredentialData;\n const credentialIdBase64 = base64UrlEncode(credentialId);\n const publicKeyBase64 = base64UrlEncode(publicKey);\n\n // Check if credential already exists\n const existing = await this.storage.get<WebAuthnCredential>(`webauthn:cred:${credentialIdBase64}`);\n if (existing) {\n return { success: false, error: 'Credential already registered' };\n }\n\n // Store credential\n const credential: WebAuthnCredential = {\n id: crypto.randomUUID(),\n credentialId: credentialIdBase64,\n userId,\n publicKey: publicKeyBase64,\n counter: parsedAuthData.signCount,\n transports: response.response.transports ?? [],\n name: credentialName ?? 'Passkey',\n createdAt: new Date().toISOString(),\n };\n\n await this.storage.set(`webauthn:cred:${credentialIdBase64}`, credential);\n\n // Add to user's credential list\n const userCredIds = await this.storage.get<string[]>(`webauthn:user:${userId}`) ?? [];\n userCredIds.push(credentialIdBase64);\n await this.storage.set(`webauthn:user:${userId}`, userCredIds);\n\n // Clean up challenge\n await this.storage.delete(`webauthn:challenge:${challenge}`);\n\n return { success: true, credentialId: credentialIdBase64 };\n }\n\n /**\n * Generate authentication options\n */\n async generateAuthenticationOptions(userId?: string): Promise<AuthenticationOptions> {\n const challenge = generateChallenge();\n\n // Store challenge\n const challengeData: PendingChallenge = {\n challenge,\n userId,\n type: 'authentication',\n expiresAt: new Date(Date.now() + this.config.timeout).toISOString(),\n };\n await this.storage.set(`webauthn:challenge:${challenge}`, challengeData, this.config.timeout / 1000);\n\n let allowCredentials: AuthenticationOptions['allowCredentials'] = [];\n\n if (userId) {\n const userCredentials = await this.getUserCredentials(userId);\n allowCredentials = userCredentials.map((cred) => ({\n id: cred.credentialId,\n type: 'public-key' as const,\n transports: cred.transports,\n }));\n }\n\n return {\n challenge,\n timeout: this.config.timeout,\n rpId: this.config.rpId,\n allowCredentials,\n userVerification: this.config.userVerification,\n };\n }\n\n /**\n * Verify authentication response\n */\n async verifyAuthentication(\n response: AuthenticationResponse,\n challenge: string\n ): Promise<{ success: boolean; userId?: string; credentialId?: string; error?: string }> {\n // Get and verify challenge\n const pending = await this.storage.get<PendingChallenge>(`webauthn:challenge:${challenge}`);\n if (!pending || new Date(pending.expiresAt) < new Date()) {\n return { success: false, error: 'Invalid or expired challenge' };\n }\n\n // Get credential\n const credential = await this.storage.get<WebAuthnCredential>(`webauthn:cred:${response.id}`);\n if (!credential) {\n return { success: false, error: 'Credential not found' };\n }\n\n // Parse client data\n const clientDataJSON = base64UrlDecode(response.response.clientDataJSON);\n const clientData = JSON.parse(new TextDecoder().decode(clientDataJSON)) as Record<string, unknown>;\n\n // Verify client data\n if (clientData['type'] !== 'webauthn.get') {\n return { success: false, error: 'Invalid client data type' };\n }\n\n if (clientData['challenge'] !== challenge) {\n return { success: false, error: 'Challenge mismatch' };\n }\n\n if (clientData['origin'] !== this.config.origin) {\n return { success: false, error: 'Origin mismatch' };\n }\n\n // Parse authenticator data\n const authenticatorData = base64UrlDecode(response.response.authenticatorData);\n const parsedAuthData = parseAuthenticatorData(authenticatorData);\n\n // Verify RP ID hash\n const expectedRpIdHash = await crypto.subtle.digest(\n 'SHA-256',\n new TextEncoder().encode(this.config.rpId)\n );\n if (!arrayBufferEqual(parsedAuthData.rpIdHash.buffer as ArrayBuffer, expectedRpIdHash)) {\n return { success: false, error: 'RP ID hash mismatch' };\n }\n\n // Verify user presence\n if (!parsedAuthData.flags.userPresent) {\n return { success: false, error: 'User not present' };\n }\n\n // Verify counter (replay protection)\n if (parsedAuthData.signCount > 0 && parsedAuthData.signCount <= credential.counter) {\n return { success: false, error: 'Possible credential cloning detected' };\n }\n\n // Update counter and last used\n credential.counter = parsedAuthData.signCount;\n credential.lastUsedAt = new Date().toISOString();\n await this.storage.set(`webauthn:cred:${response.id}`, credential);\n\n // Clean up challenge\n await this.storage.delete(`webauthn:challenge:${challenge}`);\n\n return {\n success: true,\n userId: credential.userId,\n credentialId: credential.credentialId,\n };\n }\n\n /**\n * Get user's credentials\n */\n async getUserCredentials(userId: string): Promise<WebAuthnCredential[]> {\n const credIds = await this.storage.get<string[]>(`webauthn:user:${userId}`) ?? [];\n const credentials: WebAuthnCredential[] = [];\n\n for (const credId of credIds) {\n const cred = await this.storage.get<WebAuthnCredential>(`webauthn:cred:${credId}`);\n if (cred) {\n credentials.push(cred);\n }\n }\n\n return credentials;\n }\n\n /**\n * Remove a credential\n */\n async removeCredential(userId: string, credentialId: string): Promise<boolean> {\n const credential = await this.storage.get<WebAuthnCredential>(`webauthn:cred:${credentialId}`);\n if (!credential || credential.userId !== userId) {\n return false;\n }\n\n await this.storage.delete(`webauthn:cred:${credentialId}`);\n\n // Remove from user's list\n const credIds = await this.storage.get<string[]>(`webauthn:user:${userId}`) ?? [];\n const filtered = credIds.filter((id) => id !== credentialId);\n await this.storage.set(`webauthn:user:${userId}`, filtered);\n\n return true;\n }\n\n /**\n * Check if user has any passkeys\n */\n async hasPasskeys(userId: string): Promise<boolean> {\n const credentials = await this.getUserCredentials(userId);\n return credentials.length > 0;\n }\n\n /**\n * Setup (for TwoFactorProvider interface)\n */\n async setup(userId: string): Promise<TwoFactorSetupResult> {\n const options = await this.generateRegistrationOptions(userId, userId, userId);\n return {\n secret: options.challenge,\n qrCode: '', // Not applicable for WebAuthn\n backupCodes: [],\n challenge: options.challenge,\n };\n }\n\n /**\n * Verify setup (for TwoFactorProvider interface)\n */\n async verifySetup(userId: string, _code: string): Promise<boolean> {\n // For WebAuthn, the registration is already stored on success\n const credentials = await this.getUserCredentials(userId);\n return credentials.length > 0;\n }\n\n /**\n * Verify login (for TwoFactorProvider interface)\n */\n async verifyLogin(userId: string, _code: string): Promise<boolean> {\n // For WebAuthn, verification happens through verifyAuthentication\n const credentials = await this.getUserCredentials(userId);\n return credentials.length > 0;\n }\n\n /**\n * Disable 2FA for user\n */\n async disable(userId: string): Promise<void> {\n const credentials = await this.getUserCredentials(userId);\n for (const cred of credentials) {\n await this.removeCredential(userId, cred.credentialId);\n }\n }\n\n /**\n * Authenticate (for AuthProvider interface)\n */\n async authenticate(_input: AuthInput): Promise<AuthResult> {\n // WebAuthn authentication is handled through generateAuthenticationOptions/verifyAuthentication\n return {\n success: false,\n error: 'Use generateAuthenticationOptions and verifyAuthentication for WebAuthn authentication',\n errorCode: 'USE_WEBAUTHN_METHODS',\n };\n }\n\n /**\n * Get provider info\n */\n getInfo(): ProviderInfo {\n return {\n name: this.name,\n type: this.type,\n enabled: this.enabled,\n displayName: 'Passkey',\n };\n }\n}\n\n/**\n * Create WebAuthn provider\n */\nexport function createWebAuthnProvider(storage: KVStorage, config: WebAuthnConfig): WebAuthnProvider {\n return new WebAuthnProvider(storage, config);\n}\n","/**\n * Password Provider\n * Traditional password-based authentication\n * DISABLED BY DEFAULT - use passwordless methods when possible\n */\n\nimport type { KVStorage } from '../../storage/types.js';\nimport type { AuthProvider, AuthInput, AuthResult, ProviderInfo } from '../base.js';\n\n/**\n * Password configuration\n */\nexport interface PasswordConfig {\n /** Minimum password length (default: 8) */\n minLength?: number;\n /** Maximum password length (default: 128) */\n maxLength?: number;\n /** Require uppercase letter (default: true) */\n requireUppercase?: boolean;\n /** Require lowercase letter (default: true) */\n requireLowercase?: boolean;\n /** Require number (default: true) */\n requireNumber?: boolean;\n /** Require special character (default: false) */\n requireSpecial?: boolean;\n /** Bcrypt cost factor (default: 12) */\n bcryptCost?: number;\n /** Password hash function (for custom implementations) */\n hashPassword?: (password: string) => Promise<string>;\n /** Password verify function (for custom implementations) */\n verifyPassword?: (password: string, hash: string) => Promise<boolean>;\n}\n\n/**\n * Password validation result\n */\nexport interface PasswordValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Password strength levels\n */\nexport type PasswordStrength = 'weak' | 'fair' | 'strong' | 'very-strong';\n\nconst DEFAULT_CONFIG: Required<Omit<PasswordConfig, 'hashPassword' | 'verifyPassword'>> = {\n minLength: 8,\n maxLength: 128,\n requireUppercase: true,\n requireLowercase: true,\n requireNumber: true,\n requireSpecial: false,\n bcryptCost: 12,\n};\n\n/**\n * Password Provider\n * WARNING: This provider is disabled by default.\n * Consider using passwordless authentication (OTP, Magic Link, OAuth) for better security.\n */\nexport class PasswordProvider implements AuthProvider {\n readonly name = 'password';\n readonly type = 'password' as const;\n\n private storage: KVStorage;\n private config: Required<Omit<PasswordConfig, 'hashPassword' | 'verifyPassword'>> & {\n hashPassword?: PasswordConfig['hashPassword'];\n verifyPassword?: PasswordConfig['verifyPassword'];\n };\n private _enabled: boolean;\n\n constructor(storage: KVStorage, config?: PasswordConfig) {\n this.storage = storage;\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n };\n // DISABLED BY DEFAULT - must be explicitly enabled\n this._enabled = false;\n\n // Warn about password usage\n console.warn(\n '[Pars Auth] Password provider initialized. ' +\n 'Consider using passwordless authentication for better security.'\n );\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n /**\n * Enable the password provider\n * Must be explicitly called to enable password authentication\n */\n enable(): void {\n this._enabled = true;\n console.warn(\n '[Pars Auth] Password provider enabled. ' +\n 'Ensure you have proper security measures in place (rate limiting, account lockout, etc.)'\n );\n }\n\n /**\n * Disable the password provider\n */\n disable(): void {\n this._enabled = false;\n }\n\n /**\n * Validate password against policy\n */\n validatePassword(password: string): PasswordValidationResult {\n const errors: string[] = [];\n\n if (password.length < this.config.minLength) {\n errors.push(`Password must be at least ${this.config.minLength} characters`);\n }\n\n if (password.length > this.config.maxLength) {\n errors.push(`Password must be at most ${this.config.maxLength} characters`);\n }\n\n if (this.config.requireUppercase && !/[A-Z]/.test(password)) {\n errors.push('Password must contain at least one uppercase letter');\n }\n\n if (this.config.requireLowercase && !/[a-z]/.test(password)) {\n errors.push('Password must contain at least one lowercase letter');\n }\n\n if (this.config.requireNumber && !/\\d/.test(password)) {\n errors.push('Password must contain at least one number');\n }\n\n if (this.config.requireSpecial && !/[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(password)) {\n errors.push('Password must contain at least one special character');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Check password strength\n */\n checkStrength(password: string): PasswordStrength {\n let score = 0;\n\n // Length score\n if (password.length >= 8) score++;\n if (password.length >= 12) score++;\n if (password.length >= 16) score++;\n\n // Character variety score\n if (/[a-z]/.test(password)) score++;\n if (/[A-Z]/.test(password)) score++;\n if (/\\d/.test(password)) score++;\n if (/[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(password)) score++;\n\n // Bonus for mixed characters\n if (/(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)/.test(password)) score++;\n\n if (score <= 3) return 'weak';\n if (score <= 5) return 'fair';\n if (score <= 7) return 'strong';\n return 'very-strong';\n }\n\n /**\n * Hash a password\n * Uses Web Crypto API for PBKDF2 (bcrypt alternative for edge runtime)\n */\n async hashPassword(password: string): Promise<string> {\n // Use custom hash function if provided\n if (this.config.hashPassword) {\n return this.config.hashPassword(password);\n }\n\n // Use PBKDF2 with Web Crypto API (edge-compatible)\n const encoder = new TextEncoder();\n const salt = crypto.getRandomValues(new Uint8Array(16));\n\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n );\n\n const iterations = 100000 * (this.config.bcryptCost / 10);\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256',\n },\n keyMaterial,\n 256\n );\n\n const hashArray = new Uint8Array(derivedBits);\n\n // Format: $pbkdf2-sha256$iterations$salt$hash\n const saltB64 = btoa(String.fromCharCode(...salt));\n const hashB64 = btoa(String.fromCharCode(...hashArray));\n\n return `$pbkdf2-sha256$${iterations}$${saltB64}$${hashB64}`;\n }\n\n /**\n * Verify a password against a hash\n */\n async verifyPassword(password: string, hash: string): Promise<boolean> {\n // Use custom verify function if provided\n if (this.config.verifyPassword) {\n return this.config.verifyPassword(password, hash);\n }\n\n // Parse PBKDF2 hash\n const parts = hash.split('$');\n if (parts.length !== 5 || parts[1] !== 'pbkdf2-sha256') {\n return false;\n }\n\n const iterations = parseInt(parts[2]!, 10);\n const salt = Uint8Array.from(atob(parts[3]!), (c) => c.charCodeAt(0));\n const storedHash = Uint8Array.from(atob(parts[4]!), (c) => c.charCodeAt(0));\n\n const encoder = new TextEncoder();\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n );\n\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256',\n },\n keyMaterial,\n 256\n );\n\n const computedHash = new Uint8Array(derivedBits);\n\n // Constant-time comparison\n return this.constantTimeEquals(storedHash, computedHash);\n }\n\n /**\n * Authenticate with password (implements AuthProvider)\n */\n async authenticate(input: AuthInput): Promise<AuthResult> {\n if (!this._enabled) {\n return {\n success: false,\n error: 'Password authentication is disabled',\n errorCode: 'PROVIDER_DISABLED',\n };\n }\n\n const { identifier, credential } = input;\n\n if (!identifier || !credential) {\n return {\n success: false,\n error: 'Email and password are required',\n errorCode: 'INVALID_INPUT',\n };\n }\n\n // Password verification should be done by the auth engine\n // which has access to the user's stored password hash\n // This provider just validates the input format\n\n const validation = this.validatePassword(credential);\n if (!validation.valid) {\n return {\n success: false,\n error: validation.errors.join(', '),\n errorCode: 'INVALID_PASSWORD',\n };\n }\n\n return {\n success: true,\n // Auth engine will handle user lookup and password verification\n };\n }\n\n /**\n * Store password hash for a user\n */\n async setPassword(userId: string, password: string): Promise<{ success: boolean; errors?: string[] }> {\n const validation = this.validatePassword(password);\n if (!validation.valid) {\n return { success: false, errors: validation.errors };\n }\n\n const hash = await this.hashPassword(password);\n await this.storage.set(`password:user:${userId}`, {\n hash,\n updatedAt: new Date().toISOString(),\n });\n\n return { success: true };\n }\n\n /**\n * Verify password for a user\n */\n async verifyUserPassword(userId: string, password: string): Promise<boolean> {\n const data = await this.storage.get<{ hash: string }>(`password:user:${userId}`);\n if (!data) {\n return false;\n }\n\n return this.verifyPassword(password, data.hash);\n }\n\n /**\n * Check if user has password set\n */\n async hasPassword(userId: string): Promise<boolean> {\n return this.storage.has(`password:user:${userId}`);\n }\n\n /**\n * Remove password for a user (switch to passwordless)\n */\n async removePassword(userId: string): Promise<void> {\n await this.storage.delete(`password:user:${userId}`);\n }\n\n /**\n * Get provider info\n */\n getInfo(): ProviderInfo {\n return {\n name: this.name,\n type: this.type,\n enabled: this.enabled,\n displayName: 'Password',\n };\n }\n\n /**\n * Constant-time comparison to prevent timing attacks\n */\n private constantTimeEquals(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a[i]! ^ b[i]!;\n }\n\n return result === 0;\n }\n}\n\n/**\n * Create Password provider\n */\nexport function createPasswordProvider(storage: KVStorage, config?: PasswordConfig): PasswordProvider {\n return new PasswordProvider(storage, config);\n}\n","/**\n * Drizzle ORM Adapter for @parsrun/auth\n * Implements AuthAdapter interface using Drizzle ORM with PostgreSQL\n */\n\nimport { eq, and, desc, isNull } from 'drizzle-orm';\nimport type {\n AuthAdapter,\n AdapterUser,\n AdapterSession,\n AdapterAuthMethod,\n AdapterTenant,\n AdapterMembership,\n CreateUserInput,\n CreateSessionInput,\n CreateAuthMethodInput,\n CreateMembershipInput,\n} from '../../config.js';\nimport type {\n DrizzleDatabase,\n DrizzleAuthSchema,\n DrizzleUser,\n DrizzleSession,\n DrizzleAuthMethod,\n DrizzleTenant,\n DrizzleTenantMembership,\n} from './types.js';\n\n// Re-export types\nexport * from './types.js';\n\n/**\n * Drizzle adapter configuration\n */\nexport interface DrizzleAdapterConfig {\n /** Drizzle database instance */\n db: DrizzleDatabase;\n /** Database schema with auth tables */\n schema: DrizzleAuthSchema;\n /** Enable soft deletes (default: true) */\n softDelete?: boolean;\n /** Enable audit logging (default: false) */\n enableAuditLog?: boolean;\n}\n\n/**\n * Convert Drizzle user to adapter user\n */\nfunction toAdapterUser(user: DrizzleUser, authMethod?: DrizzleAuthMethod): AdapterUser {\n return {\n id: user.id,\n email: authMethod?.provider === 'email' ? authMethod.providerId : null,\n phone: authMethod?.provider === 'phone' ? authMethod.providerId : null,\n name: user.displayName ?? null,\n avatar: user.avatarUrl ?? null,\n emailVerified: user.emailVerified,\n phoneVerified: user.phoneVerified,\n twoFactorEnabled: user.twoFactorEnabled,\n status: user.status as AdapterUser['status'],\n createdAt: user.insertedAt,\n updatedAt: user.updatedAt,\n };\n}\n\n/**\n * Convert Drizzle session to adapter session\n */\nfunction toAdapterSession(session: DrizzleSession): AdapterSession {\n return {\n id: session.id,\n userId: session.userId,\n tenantId: session.currentTenantId ?? null,\n expiresAt: session.expiresAt,\n refreshExpiresAt: session.refreshExpiresAt ?? null,\n deviceType: session.deviceType ?? null,\n deviceName: session.deviceName ?? null,\n userAgent: session.userAgent ?? null,\n ipAddress: session.ipAddress ?? null,\n status: session.status as AdapterSession['status'],\n createdAt: session.insertedAt,\n updatedAt: session.updatedAt,\n };\n}\n\n/**\n * Convert Drizzle auth method to adapter auth method\n */\nfunction toAdapterAuthMethod(method: DrizzleAuthMethod): AdapterAuthMethod {\n return {\n id: method.id,\n userId: method.userId,\n provider: method.provider,\n providerId: method.providerId,\n verified: method.verified,\n metadata: method.metadata ?? undefined,\n createdAt: method.insertedAt,\n updatedAt: method.updatedAt,\n };\n}\n\n/**\n * Convert Drizzle tenant to adapter tenant\n */\nfunction toAdapterTenant(tenant: DrizzleTenant): AdapterTenant {\n return {\n id: tenant.id,\n name: tenant.name,\n slug: tenant.slug,\n status: tenant.status as AdapterTenant['status'],\n createdAt: tenant.insertedAt,\n updatedAt: tenant.updatedAt,\n };\n}\n\n/**\n * Convert Drizzle membership to adapter membership\n */\nfunction toAdapterMembership(membership: DrizzleTenantMembership, roleName?: string): AdapterMembership {\n return {\n id: membership.id,\n userId: membership.userId,\n tenantId: membership.tenantId,\n role: roleName ?? 'member',\n permissions: membership.permissions ? Object.keys(membership.permissions) : undefined,\n status: membership.status as AdapterMembership['status'],\n createdAt: membership.insertedAt,\n updatedAt: membership.updatedAt,\n };\n}\n\n/**\n * Create Drizzle adapter\n */\nexport function createDrizzleAdapter(config: DrizzleAdapterConfig): AuthAdapter {\n const { db, schema, softDelete = true } = config;\n const { users, sessions, authMethods, tenants, tenantMemberships, roles } = schema;\n\n return {\n // ============================================\n // User Operations\n // ============================================\n\n async createUser(input: CreateUserInput): Promise<AdapterUser> {\n const [user] = await db\n .insert(users)\n .values({\n displayName: input.name,\n avatarUrl: input.avatar,\n emailVerified: input.emailVerified ?? false,\n phoneVerified: input.phoneVerified ?? false,\n twoFactorEnabled: false,\n status: 'active',\n metadata: {},\n })\n .returning();\n\n // Create auth method if email or phone provided\n let authMethod: DrizzleAuthMethod | undefined;\n if (input.email) {\n [authMethod] = await db\n .insert(authMethods)\n .values({\n userId: user.id,\n provider: 'email',\n providerId: input.email.toLowerCase(),\n verified: input.emailVerified ?? false,\n })\n .returning();\n } else if (input.phone) {\n [authMethod] = await db\n .insert(authMethods)\n .values({\n userId: user.id,\n provider: 'phone',\n providerId: input.phone,\n verified: input.phoneVerified ?? false,\n })\n .returning();\n }\n\n return toAdapterUser(user, authMethod);\n },\n\n async findUserById(id: string): Promise<AdapterUser | null> {\n const [result] = await db\n .select()\n .from(users)\n .where(and(eq(users.id, id), softDelete ? isNull(users.deletedAt) : undefined))\n .limit(1);\n\n if (!result) return null;\n\n // Get primary auth method\n const [authMethod] = await db\n .select()\n .from(authMethods)\n .where(and(eq(authMethods.userId, id), isNull(authMethods.deletedAt)))\n .limit(1);\n\n return toAdapterUser(result, authMethod);\n },\n\n async findUserByEmail(email: string): Promise<AdapterUser | null> {\n const normalizedEmail = email.toLowerCase().trim();\n\n const [result] = await db\n .select({\n user: users,\n authMethod: authMethods,\n })\n .from(authMethods)\n .innerJoin(users, eq(authMethods.userId, users.id))\n .where(\n and(\n eq(authMethods.provider, 'email'),\n eq(authMethods.providerId, normalizedEmail),\n softDelete ? isNull(users.deletedAt) : undefined\n )\n )\n .limit(1);\n\n if (!result) return null;\n\n return toAdapterUser(result.user, result.authMethod);\n },\n\n async findUserByPhone(phone: string): Promise<AdapterUser | null> {\n const [result] = await db\n .select({\n user: users,\n authMethod: authMethods,\n })\n .from(authMethods)\n .innerJoin(users, eq(authMethods.userId, users.id))\n .where(\n and(\n eq(authMethods.provider, 'phone'),\n eq(authMethods.providerId, phone),\n softDelete ? isNull(users.deletedAt) : undefined\n )\n )\n .limit(1);\n\n if (!result) return null;\n\n return toAdapterUser(result.user, result.authMethod);\n },\n\n async updateUser(\n id: string,\n data: Partial<AdapterUser>\n ): Promise<AdapterUser> {\n const updateData: Record<string, unknown> = {\n updatedAt: new Date(),\n };\n\n if (data.name !== undefined) updateData['displayName'] = data.name;\n if (data.avatar !== undefined) updateData['avatarUrl'] = data.avatar;\n if (data.emailVerified !== undefined) updateData['emailVerified'] = data.emailVerified;\n if (data.phoneVerified !== undefined) updateData['phoneVerified'] = data.phoneVerified;\n if (data.twoFactorEnabled !== undefined) updateData['twoFactorEnabled'] = data.twoFactorEnabled;\n if (data.status !== undefined) updateData['status'] = data.status;\n\n const [user] = await db.update(users).set(updateData).where(eq(users.id, id)).returning();\n\n const [authMethod] = await db\n .select()\n .from(authMethods)\n .where(eq(authMethods.userId, id))\n .limit(1);\n\n return toAdapterUser(user, authMethod);\n },\n\n async deleteUser(id: string): Promise<void> {\n if (softDelete) {\n await db.update(users).set({ deletedAt: new Date() }).where(eq(users.id, id));\n } else {\n await db.delete(users).where(eq(users.id, id));\n }\n },\n\n // ============================================\n // Session Operations\n // ============================================\n\n async createSession(input: CreateSessionInput): Promise<AdapterSession> {\n const [session] = await db\n .insert(sessions)\n .values({\n userId: input.userId,\n currentTenantId: input.tenantId,\n expiresAt: input.expiresAt,\n refreshExpiresAt: input.refreshExpiresAt,\n deviceType: input.deviceType,\n deviceName: input.deviceName,\n userAgent: input.userAgent,\n ipAddress: input.ipAddress,\n status: 'active',\n csrfTokenHash: '',\n lastActivityAt: new Date(),\n })\n .returning();\n\n return toAdapterSession(session);\n },\n\n async findSessionById(id: string): Promise<AdapterSession | null> {\n const [session] = await db\n .select()\n .from(sessions)\n .where(and(eq(sessions.id, id), eq(sessions.status, 'active')))\n .limit(1);\n\n if (!session) return null;\n\n return toAdapterSession(session);\n },\n\n async findSessionsByUserId(userId: string): Promise<AdapterSession[]> {\n const result = await db\n .select()\n .from(sessions)\n .where(and(eq(sessions.userId, userId), eq(sessions.status, 'active')))\n .orderBy(desc(sessions.lastActivityAt));\n\n return result.map(toAdapterSession);\n },\n\n async updateSession(\n id: string,\n data: Partial<AdapterSession>\n ): Promise<AdapterSession> {\n const updateData: Record<string, unknown> = {\n updatedAt: new Date(),\n };\n\n if (data.tenantId !== undefined) updateData['currentTenantId'] = data.tenantId;\n if (data.expiresAt !== undefined) updateData['expiresAt'] = data.expiresAt;\n if (data.refreshExpiresAt !== undefined) updateData['refreshExpiresAt'] = data.refreshExpiresAt;\n if (data.status !== undefined) updateData['status'] = data.status;\n\n const [session] = await db\n .update(sessions)\n .set(updateData)\n .where(eq(sessions.id, id))\n .returning();\n\n return toAdapterSession(session);\n },\n\n async deleteSession(id: string): Promise<void> {\n await db\n .update(sessions)\n .set({ status: 'revoked', revokedAt: new Date() })\n .where(eq(sessions.id, id));\n },\n\n async deleteSessionsByUserId(userId: string): Promise<void> {\n await db\n .update(sessions)\n .set({ status: 'revoked', revokedAt: new Date() })\n .where(eq(sessions.userId, userId));\n },\n\n // ============================================\n // Auth Method Operations\n // ============================================\n\n async createAuthMethod(input: CreateAuthMethodInput): Promise<AdapterAuthMethod> {\n const [method] = await db\n .insert(authMethods)\n .values({\n userId: input.userId,\n provider: input.provider,\n providerId: input.providerId,\n verified: input.verified ?? false,\n metadata: input.metadata ?? {},\n })\n .returning();\n\n return toAdapterAuthMethod(method);\n },\n\n async findAuthMethod(provider: string, providerId: string): Promise<AdapterAuthMethod | null> {\n const [method] = await db\n .select()\n .from(authMethods)\n .where(\n and(\n eq(authMethods.provider, provider),\n eq(authMethods.providerId, providerId),\n softDelete ? isNull(authMethods.deletedAt) : undefined\n )\n )\n .limit(1);\n\n if (!method) return null;\n\n return toAdapterAuthMethod(method);\n },\n\n async findAuthMethodsByUserId(userId: string): Promise<AdapterAuthMethod[]> {\n const result = await db\n .select()\n .from(authMethods)\n .where(\n and(eq(authMethods.userId, userId), softDelete ? isNull(authMethods.deletedAt) : undefined)\n );\n\n return result.map(toAdapterAuthMethod);\n },\n\n async deleteAuthMethod(id: string): Promise<void> {\n if (softDelete) {\n await db.update(authMethods).set({ deletedAt: new Date() }).where(eq(authMethods.id, id));\n } else {\n await db.delete(authMethods).where(eq(authMethods.id, id));\n }\n },\n\n // ============================================\n // Tenant Operations (Optional)\n // ============================================\n\n async findTenantById(id: string): Promise<AdapterTenant | null> {\n if (!tenants) return null;\n\n const [tenant] = await db\n .select()\n .from(tenants)\n .where(and(eq(tenants.id, id), softDelete ? isNull(tenants.deletedAt) : undefined))\n .limit(1);\n\n if (!tenant) return null;\n\n return toAdapterTenant(tenant);\n },\n\n async findTenantBySlug(slug: string): Promise<AdapterTenant | null> {\n if (!tenants) return null;\n\n const [tenant] = await db\n .select()\n .from(tenants)\n .where(and(eq(tenants.slug, slug), softDelete ? isNull(tenants.deletedAt) : undefined))\n .limit(1);\n\n if (!tenant) return null;\n\n return toAdapterTenant(tenant);\n },\n\n // ============================================\n // Membership Operations (Optional)\n // ============================================\n\n async findMembership(userId: string, tenantId: string): Promise<AdapterMembership | null> {\n if (!tenantMemberships) return null;\n\n const [membership] = await db\n .select()\n .from(tenantMemberships)\n .where(\n and(\n eq(tenantMemberships.userId, userId),\n eq(tenantMemberships.tenantId, tenantId),\n softDelete ? isNull(tenantMemberships.deletedAt) : undefined\n )\n )\n .limit(1);\n\n if (!membership) return null;\n\n // Get role name if roles table exists\n let roleName: string | undefined;\n if (roles && membership.roleId) {\n const [role] = await db\n .select()\n .from(roles)\n .where(eq(roles.id, membership.roleId))\n .limit(1);\n roleName = role?.name;\n }\n\n return toAdapterMembership(membership, roleName);\n },\n\n async findMembershipsByUserId(userId: string): Promise<AdapterMembership[]> {\n if (!tenantMemberships) return [];\n\n const result = await db\n .select()\n .from(tenantMemberships)\n .where(\n and(\n eq(tenantMemberships.userId, userId),\n eq(tenantMemberships.status, 'active'),\n softDelete ? isNull(tenantMemberships.deletedAt) : undefined\n )\n );\n\n // Get role names if roles table exists\n const membershipsWithRoles = await Promise.all(\n result.map(async (membership: DrizzleTenantMembership) => {\n let roleName: string | undefined;\n if (roles && membership.roleId) {\n const [role] = await db\n .select()\n .from(roles)\n .where(eq(roles.id, membership.roleId))\n .limit(1);\n roleName = role?.name;\n }\n return toAdapterMembership(membership, roleName);\n })\n );\n\n return membershipsWithRoles;\n },\n\n async createMembership(input: CreateMembershipInput): Promise<AdapterMembership> {\n if (!tenantMemberships) {\n throw new Error('Tenant memberships table not configured');\n }\n\n // Find role by name if roles table exists\n let roleId: string | undefined;\n if (roles && input.role) {\n const [role] = await db\n .select()\n .from(roles)\n .where(eq(roles.name, input.role))\n .limit(1);\n roleId = role?.id;\n }\n\n const [membership] = await db\n .insert(tenantMemberships)\n .values({\n userId: input.userId,\n tenantId: input.tenantId,\n roleId: roleId ?? null,\n status: 'active',\n permissions: input.permissions ? Object.fromEntries(input.permissions.map(p => [p, true])) : {},\n accessLevel: 'full',\n resourceRestrictions: {},\n joinedAt: new Date(),\n })\n .returning();\n\n return toAdapterMembership(membership, input.role);\n },\n\n async updateMembership(\n id: string,\n data: Partial<AdapterMembership>\n ): Promise<AdapterMembership> {\n if (!tenantMemberships) {\n throw new Error('Tenant memberships table not configured');\n }\n\n const updateData: Record<string, unknown> = {\n updatedAt: new Date(),\n };\n\n // Find role by name if updating role\n if (data.role !== undefined && roles) {\n const [role] = await db\n .select()\n .from(roles)\n .where(eq(roles.name, data.role))\n .limit(1);\n updateData['roleId'] = role?.id ?? null;\n }\n\n if (data.status !== undefined) updateData['status'] = data.status;\n if (data.permissions !== undefined) {\n updateData['permissions'] = Object.fromEntries(data.permissions.map(p => [p, true]));\n }\n\n const [membership] = await db\n .update(tenantMemberships)\n .set(updateData)\n .where(eq(tenantMemberships.id, id))\n .returning();\n\n // Get role name\n let roleName: string | undefined;\n if (roles && membership.roleId) {\n const [role] = await db\n .select()\n .from(roles)\n .where(eq(roles.id, membership.roleId))\n .limit(1);\n roleName = role?.name;\n }\n\n return toAdapterMembership(membership, roleName);\n },\n\n async deleteMembership(id: string): Promise<void> {\n if (!tenantMemberships) return;\n\n if (softDelete) {\n await db\n .update(tenantMemberships)\n .set({ deletedAt: new Date(), status: 'inactive' })\n .where(eq(tenantMemberships.id, id));\n } else {\n await db.delete(tenantMemberships).where(eq(tenantMemberships.id, id));\n }\n },\n };\n}\n","/**\n * Resend Email Provider\n * Uses Resend API for sending emails\n */\n\nimport type { EmailProvider, EmailOptions, EmailResult } from './types.js';\n\n/**\n * Resend provider configuration\n */\nexport interface ResendProviderConfig {\n /** Resend API key */\n apiKey: string;\n /** Default from email */\n fromEmail?: string;\n /** Default from name */\n fromName?: string;\n /** Resend API base URL (default: https://api.resend.com) */\n baseUrl?: string;\n}\n\n/**\n * Resend Email Provider\n */\nexport class ResendEmailProvider implements EmailProvider {\n private apiKey: string;\n private fromEmail: string;\n private fromName: string;\n private baseUrl: string;\n\n constructor(config: ResendProviderConfig) {\n this.apiKey = config.apiKey;\n this.fromEmail = config.fromEmail ?? 'noreply@example.com';\n this.fromName = config.fromName ?? 'App';\n this.baseUrl = config.baseUrl ?? 'https://api.resend.com';\n }\n\n /**\n * Send email via Resend API\n */\n async sendEmail(options: EmailOptions): Promise<EmailResult> {\n const from = options.from ?? `${this.fromName} <${this.fromEmail}>`;\n\n try {\n const response = await fetch(`${this.baseUrl}/emails`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n from,\n to: [options.to],\n subject: options.subject,\n html: options.html,\n text: options.text,\n reply_to: options.replyTo,\n cc: options.cc,\n bcc: options.bcc,\n headers: options.headers,\n attachments: options.attachments?.map((a) => ({\n filename: a.filename,\n content: typeof a.content === 'string' ? a.content : a.content.toString('base64'),\n content_type: a.contentType,\n })),\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as Record<string, unknown>;\n return {\n success: false,\n error: (errorData['message'] as string) ?? `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n const data = await response.json() as Record<string, unknown>;\n\n return {\n success: true,\n messageId: data['id'] as string,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n}\n\n/**\n * Create Resend email provider\n */\nexport function createResendProvider(config: ResendProviderConfig): ResendEmailProvider {\n return new ResendEmailProvider(config);\n}\n","/**\n * OTP Email Template\n */\n\ninterface OTPTemplateOptions {\n code: string;\n expiresInMinutes: number;\n userName?: string;\n appName: string;\n}\n\n/**\n * Generate OTP email HTML\n */\nexport function generateOTPEmailHTML(options: OTPTemplateOptions): string {\n const { code, expiresInMinutes, userName, appName } = options;\n const greeting = userName ? `Hi ${userName}` : 'Hello';\n\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Your Verification Code</title>\n</head>\n<body style=\"margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background-color: #f8fafc;\">\n <div style=\"max-width: 600px; margin: 0 auto; padding: 20px;\">\n <div style=\"background: white; border-radius: 12px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.07); overflow: hidden;\">\n <!-- Header -->\n <div style=\"background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; text-align: center; padding: 40px 20px;\">\n <h1 style=\"margin: 0; font-size: 24px; font-weight: 600;\">${appName}</h1>\n <p style=\"margin: 10px 0 0; opacity: 0.9;\">Verification Code</p>\n </div>\n\n <!-- Content -->\n <div style=\"padding: 40px 30px;\">\n <p style=\"font-size: 16px; margin-bottom: 20px;\">${greeting},</p>\n <p style=\"color: #4a5568;\">Use the following code to verify your identity:</p>\n\n <!-- Code Box -->\n <div style=\"text-align: center; margin: 30px 0;\">\n <div style=\"background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%); border: 2px dashed #cbd5e0; border-radius: 12px; padding: 25px; display: inline-block;\">\n <span style=\"font-size: 36px; font-weight: 700; color: #4c51bf; letter-spacing: 8px; font-family: 'Monaco', 'Menlo', monospace;\">\n ${code}\n </span>\n </div>\n </div>\n\n <!-- Expiry Warning -->\n <div style=\"background: #fef7e0; border: 1px solid #f6e05e; border-radius: 8px; padding: 12px; margin: 20px 0; color: #744210; text-align: center; font-weight: 500;\">\n ⏱️ This code expires in ${expiresInMinutes} minutes\n </div>\n\n <!-- Security Notice -->\n <div style=\"background: #fed7d7; border: 1px solid #fc8181; border-radius: 8px; padding: 12px; margin: 20px 0; color: #c53030; font-size: 14px;\">\n 🔒 Never share this code with anyone. ${appName} will never ask for your code.\n </div>\n\n <p style=\"color: #718096; font-size: 14px; margin-top: 30px;\">\n If you didn't request this code, you can safely ignore this email.\n </p>\n </div>\n\n <!-- Footer -->\n <div style=\"background: #f7fafc; padding: 20px 30px; text-align: center; border-top: 1px solid #e2e8f0;\">\n <p style=\"color: #a0aec0; font-size: 12px; margin: 0;\">\n © ${new Date().getFullYear()} ${appName}. All rights reserved.\n </p>\n </div>\n </div>\n </div>\n</body>\n</html>\n`;\n}\n\n/**\n * Generate OTP email plain text\n */\nexport function generateOTPEmailText(options: OTPTemplateOptions): string {\n const { code, expiresInMinutes, userName, appName } = options;\n const greeting = userName ? `Hi ${userName}` : 'Hello';\n\n return `${greeting},\n\nYour ${appName} verification code is: ${code}\n\nThis code expires in ${expiresInMinutes} minutes.\n\nNever share this code with anyone. ${appName} will never ask for your code.\n\nIf you didn't request this code, you can safely ignore this email.\n\n- The ${appName} Team`;\n}\n","/**\n * Email Verification Template\n */\n\ninterface VerificationTemplateOptions {\n verificationUrl: string;\n userName?: string;\n expiresInHours: number;\n appName: string;\n}\n\n/**\n * Generate verification email HTML\n */\nexport function generateVerificationEmailHTML(options: VerificationTemplateOptions): string {\n const { verificationUrl, userName, expiresInHours, appName } = options;\n const greeting = userName ? `Hi ${userName}` : 'Hello';\n\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Verify Your Email</title>\n</head>\n<body style=\"margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background-color: #f8fafc;\">\n <div style=\"max-width: 600px; margin: 0 auto; padding: 20px;\">\n <div style=\"background: white; border-radius: 12px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.07); overflow: hidden;\">\n <!-- Header -->\n <div style=\"background: linear-gradient(135deg, #10b981 0%, #059669 100%); color: white; text-align: center; padding: 40px 20px;\">\n <h1 style=\"margin: 0; font-size: 24px; font-weight: 600;\">${appName}</h1>\n <p style=\"margin: 10px 0 0; opacity: 0.9;\">Email Verification</p>\n </div>\n\n <!-- Content -->\n <div style=\"padding: 40px 30px;\">\n <p style=\"font-size: 16px; margin-bottom: 20px;\">${greeting},</p>\n <p style=\"color: #4a5568;\">Please verify your email address by clicking the button below:</p>\n\n <!-- Button -->\n <div style=\"text-align: center; margin: 30px 0;\">\n <a href=\"${verificationUrl}\" style=\"display: inline-block; padding: 14px 32px; background: linear-gradient(135deg, #10b981 0%, #059669 100%); color: white; text-decoration: none; border-radius: 8px; font-weight: 600; font-size: 16px;\">\n Verify Email Address\n </a>\n </div>\n\n <!-- Expiry Notice -->\n <div style=\"background: #fef7e0; border: 1px solid #f6e05e; border-radius: 8px; padding: 12px; margin: 20px 0; color: #744210; text-align: center;\">\n ⏱️ This link expires in ${expiresInHours} hour${expiresInHours > 1 ? 's' : ''}\n </div>\n\n <!-- Alternative Link -->\n <p style=\"color: #718096; font-size: 14px; margin-top: 20px;\">\n If the button doesn't work, copy and paste this link into your browser:\n </p>\n <p style=\"background: #f7fafc; padding: 12px; border-radius: 6px; word-break: break-all; font-size: 12px; color: #4a5568;\">\n ${verificationUrl}\n </p>\n\n <p style=\"color: #718096; font-size: 14px; margin-top: 30px;\">\n If you didn't create an account, you can safely ignore this email.\n </p>\n </div>\n\n <!-- Footer -->\n <div style=\"background: #f7fafc; padding: 20px 30px; text-align: center; border-top: 1px solid #e2e8f0;\">\n <p style=\"color: #a0aec0; font-size: 12px; margin: 0;\">\n © ${new Date().getFullYear()} ${appName}. All rights reserved.\n </p>\n </div>\n </div>\n </div>\n</body>\n</html>\n`;\n}\n\n/**\n * Generate verification email plain text\n */\nexport function generateVerificationEmailText(options: VerificationTemplateOptions): string {\n const { verificationUrl, userName, expiresInHours, appName } = options;\n const greeting = userName ? `Hi ${userName}` : 'Hello';\n\n return `${greeting},\n\nPlease verify your email address by clicking the link below:\n\n${verificationUrl}\n\nThis link expires in ${expiresInHours} hour${expiresInHours > 1 ? 's' : ''}.\n\nIf you didn't create an account, you can safely ignore this email.\n\n- The ${appName} Team`;\n}\n","/**\n * Magic Link Email Template\n */\n\ninterface MagicLinkTemplateOptions {\n magicLinkUrl: string;\n expiresInMinutes: number;\n userName?: string;\n appName: string;\n}\n\n/**\n * Generate magic link email HTML\n */\nexport function generateMagicLinkEmailHTML(options: MagicLinkTemplateOptions): string {\n const { magicLinkUrl, expiresInMinutes, userName, appName } = options;\n const greeting = userName ? `Hi ${userName}` : 'Hello';\n\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Sign in to ${appName}</title>\n</head>\n<body style=\"margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background-color: #f8fafc;\">\n <div style=\"max-width: 600px; margin: 0 auto; padding: 20px;\">\n <div style=\"background: white; border-radius: 12px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.07); overflow: hidden;\">\n <!-- Header -->\n <div style=\"background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%); color: white; text-align: center; padding: 40px 20px;\">\n <h1 style=\"margin: 0; font-size: 24px; font-weight: 600;\">${appName}</h1>\n <p style=\"margin: 10px 0 0; opacity: 0.9;\">Sign In Link</p>\n </div>\n\n <!-- Content -->\n <div style=\"padding: 40px 30px;\">\n <p style=\"font-size: 16px; margin-bottom: 20px;\">${greeting},</p>\n <p style=\"color: #4a5568;\">Click the button below to sign in to your account:</p>\n\n <!-- Button -->\n <div style=\"text-align: center; margin: 30px 0;\">\n <a href=\"${magicLinkUrl}\" style=\"display: inline-block; padding: 14px 32px; background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%); color: white; text-decoration: none; border-radius: 8px; font-weight: 600; font-size: 16px;\">\n Sign In to ${appName}\n </a>\n </div>\n\n <!-- Expiry Notice -->\n <div style=\"background: #fef7e0; border: 1px solid #f6e05e; border-radius: 8px; padding: 12px; margin: 20px 0; color: #744210; text-align: center;\">\n ⏱️ This link expires in ${expiresInMinutes} minutes\n </div>\n\n <!-- Security Notice -->\n <div style=\"background: #e0e7ff; border: 1px solid #818cf8; border-radius: 8px; padding: 12px; margin: 20px 0; color: #3730a3; font-size: 14px;\">\n 🔒 This is a single-use link. After you click it, you'll be signed in automatically.\n </div>\n\n <!-- Alternative Link -->\n <p style=\"color: #718096; font-size: 14px; margin-top: 20px;\">\n If the button doesn't work, copy and paste this link into your browser:\n </p>\n <p style=\"background: #f7fafc; padding: 12px; border-radius: 6px; word-break: break-all; font-size: 12px; color: #4a5568;\">\n ${magicLinkUrl}\n </p>\n\n <p style=\"color: #718096; font-size: 14px; margin-top: 30px;\">\n If you didn't request this sign-in link, you can safely ignore this email.\n </p>\n </div>\n\n <!-- Footer -->\n <div style=\"background: #f7fafc; padding: 20px 30px; text-align: center; border-top: 1px solid #e2e8f0;\">\n <p style=\"color: #a0aec0; font-size: 12px; margin: 0;\">\n © ${new Date().getFullYear()} ${appName}. All rights reserved.\n </p>\n </div>\n </div>\n </div>\n</body>\n</html>\n`;\n}\n\n/**\n * Generate magic link email plain text\n */\nexport function generateMagicLinkEmailText(options: MagicLinkTemplateOptions): string {\n const { magicLinkUrl, expiresInMinutes, userName, appName } = options;\n const greeting = userName ? `Hi ${userName}` : 'Hello';\n\n return `${greeting},\n\nClick the link below to sign in to your ${appName} account:\n\n${magicLinkUrl}\n\nThis link expires in ${expiresInMinutes} minutes.\n\nThis is a single-use link. After you click it, you'll be signed in automatically.\n\nIf you didn't request this sign-in link, you can safely ignore this email.\n\n- The ${appName} Team`;\n}\n","/**\n * Email Service\n * Provides email sending functionality with templates\n */\n\nimport type {\n EmailProvider,\n EmailOptions,\n EmailResult,\n EmailServiceConfig,\n OTPEmailOptions,\n VerificationEmailOptions,\n WelcomeEmailOptions,\n MagicLinkEmailOptions,\n PasswordResetEmailOptions,\n InvitationEmailOptions,\n} from './types.js';\nimport { ResendEmailProvider } from './resend-provider.js';\nimport { generateOTPEmailHTML, generateOTPEmailText } from './templates/otp.js';\nimport { generateVerificationEmailHTML, generateVerificationEmailText } from './templates/verification.js';\nimport { generateMagicLinkEmailHTML, generateMagicLinkEmailText } from './templates/magic-link.js';\n\n// Re-export types and providers\nexport * from './types.js';\nexport { ResendEmailProvider, createResendProvider } from './resend-provider.js';\n\n/**\n * Email Service\n * Singleton service for sending emails\n */\nexport class EmailService {\n private provider: EmailProvider;\n private fromEmail: string;\n private fromName: string;\n private devMode: boolean;\n\n constructor(config: EmailServiceConfig) {\n this.devMode = config.devMode ?? process.env['NODE_ENV'] !== 'production';\n this.fromEmail = config.fromEmail ?? process.env['EMAIL_FROM_ADDRESS'] ?? 'noreply@example.com';\n this.fromName = config.fromName ?? process.env['EMAIL_FROM_NAME'] ?? 'App';\n\n if (config.provider) {\n this.provider = config.provider;\n } else {\n const apiKey = config.apiKey ?? process.env['RESEND_API_KEY'] ?? process.env['EMAIL_API_KEY'];\n if (!apiKey) {\n throw new Error('Email API key is required (RESEND_API_KEY or EMAIL_API_KEY)');\n }\n this.provider = new ResendEmailProvider({\n apiKey,\n fromEmail: this.fromEmail,\n fromName: this.fromName,\n });\n }\n }\n\n /**\n * Send email\n */\n async sendEmail(options: EmailOptions): Promise<EmailResult> {\n // Development mode: log instead of send\n if (this.devMode) {\n console.log('📧 EMAIL (Development Mode):');\n console.log('To:', options.to);\n console.log('Subject:', options.subject);\n console.log('From:', options.from ?? `${this.fromName} <${this.fromEmail}>`);\n console.log('Content:', options.html?.substring(0, 200) ?? options.text?.substring(0, 200));\n console.log('─'.repeat(50));\n return { success: true, messageId: 'dev-mode-' + Date.now() };\n }\n\n return this.provider.sendEmail(options);\n }\n\n /**\n * Send OTP verification email\n */\n async sendOTPEmail(options: OTPEmailOptions): Promise<EmailResult> {\n const { email, code, expiresInMinutes = 10, userName, appName = this.fromName } = options;\n\n return this.sendEmail({\n to: email,\n subject: `Your ${appName} Verification Code`,\n html: generateOTPEmailHTML({ code, expiresInMinutes, userName, appName }),\n text: generateOTPEmailText({ code, expiresInMinutes, userName, appName }),\n });\n }\n\n /**\n * Send email verification email\n */\n async sendVerificationEmail(options: VerificationEmailOptions): Promise<EmailResult> {\n const { email, verificationUrl, userName, expiresInHours = 24, appName = this.fromName } = options;\n\n return this.sendEmail({\n to: email,\n subject: `Verify your ${appName} email`,\n html: generateVerificationEmailHTML({ verificationUrl, userName, expiresInHours, appName }),\n text: generateVerificationEmailText({ verificationUrl, userName, expiresInHours, appName }),\n });\n }\n\n /**\n * Send magic link email\n */\n async sendMagicLinkEmail(options: MagicLinkEmailOptions): Promise<EmailResult> {\n const { email, magicLinkUrl, expiresInMinutes = 15, userName, appName = this.fromName } = options;\n\n return this.sendEmail({\n to: email,\n subject: `Sign in to ${appName}`,\n html: generateMagicLinkEmailHTML({ magicLinkUrl, expiresInMinutes, userName, appName }),\n text: generateMagicLinkEmailText({ magicLinkUrl, expiresInMinutes, userName, appName }),\n });\n }\n\n /**\n * Send welcome email\n */\n async sendWelcomeEmail(options: WelcomeEmailOptions): Promise<EmailResult> {\n const { email, userName, appName = this.fromName, loginUrl } = options;\n\n const greeting = userName ? `Hi ${userName}` : 'Welcome';\n\n return this.sendEmail({\n to: email,\n subject: `Welcome to ${appName}!`,\n html: `\n <div style=\"font-family: sans-serif; max-width: 600px; margin: 0 auto;\">\n <h1>${greeting},</h1>\n <p>Thank you for joining ${appName}!</p>\n <p>We're excited to have you on board.</p>\n ${loginUrl ? `<p><a href=\"${loginUrl}\" style=\"display: inline-block; padding: 12px 24px; background: #4F46E5; color: white; text-decoration: none; border-radius: 6px;\">Get Started</a></p>` : ''}\n <p>Best regards,<br>The ${appName} Team</p>\n </div>\n `,\n text: `${greeting},\\n\\nThank you for joining ${appName}!\\n\\nWe're excited to have you on board.\\n\\n${loginUrl ? `Get Started: ${loginUrl}\\n\\n` : ''}Best regards,\\nThe ${appName} Team`,\n });\n }\n\n /**\n * Send password reset email\n */\n async sendPasswordResetEmail(options: PasswordResetEmailOptions): Promise<EmailResult> {\n const { email, resetUrl, expiresInHours = 1, userName, appName = this.fromName } = options;\n\n const greeting = userName ? `Hi ${userName}` : 'Hello';\n\n return this.sendEmail({\n to: email,\n subject: `Reset your ${appName} password`,\n html: `\n <div style=\"font-family: sans-serif; max-width: 600px; margin: 0 auto;\">\n <h1>${greeting},</h1>\n <p>We received a request to reset your password.</p>\n <p>Click the button below to reset it. This link expires in ${expiresInHours} hour${expiresInHours > 1 ? 's' : ''}.</p>\n <p><a href=\"${resetUrl}\" style=\"display: inline-block; padding: 12px 24px; background: #4F46E5; color: white; text-decoration: none; border-radius: 6px;\">Reset Password</a></p>\n <p style=\"color: #666; font-size: 14px;\">If you didn't request this, you can safely ignore this email.</p>\n <p>Best regards,<br>The ${appName} Team</p>\n </div>\n `,\n text: `${greeting},\\n\\nWe received a request to reset your password.\\n\\nClick the link below to reset it. This link expires in ${expiresInHours} hour${expiresInHours > 1 ? 's' : ''}.\\n\\n${resetUrl}\\n\\nIf you didn't request this, you can safely ignore this email.\\n\\nBest regards,\\nThe ${appName} Team`,\n });\n }\n\n /**\n * Send invitation email\n */\n async sendInvitationEmail(options: InvitationEmailOptions): Promise<EmailResult> {\n const {\n email,\n invitationUrl,\n inviterName,\n organizationName,\n roleName,\n expiresInDays = 7,\n appName = this.fromName,\n } = options;\n\n const roleText = roleName ? ` as a ${roleName}` : '';\n\n return this.sendEmail({\n to: email,\n subject: `You're invited to join ${organizationName} on ${appName}`,\n html: `\n <div style=\"font-family: sans-serif; max-width: 600px; margin: 0 auto;\">\n <h1>You're Invited!</h1>\n <p>${inviterName} has invited you to join <strong>${organizationName}</strong>${roleText}.</p>\n <p>Click the button below to accept the invitation. This link expires in ${expiresInDays} day${expiresInDays > 1 ? 's' : ''}.</p>\n <p><a href=\"${invitationUrl}\" style=\"display: inline-block; padding: 12px 24px; background: #4F46E5; color: white; text-decoration: none; border-radius: 6px;\">Accept Invitation</a></p>\n <p style=\"color: #666; font-size: 14px;\">If you don't want to join, you can safely ignore this email.</p>\n <p>Best regards,<br>The ${appName} Team</p>\n </div>\n `,\n text: `You're Invited!\\n\\n${inviterName} has invited you to join ${organizationName}${roleText}.\\n\\nClick the link below to accept the invitation. This link expires in ${expiresInDays} day${expiresInDays > 1 ? 's' : ''}.\\n\\n${invitationUrl}\\n\\nIf you don't want to join, you can safely ignore this email.\\n\\nBest regards,\\nThe ${appName} Team`,\n });\n }\n}\n\n/**\n * Create email service\n */\nexport function createEmailService(config: EmailServiceConfig): EmailService {\n return new EmailService(config);\n}\n","/**\n * NetGSM SMS Provider\n * Turkish SMS gateway provider\n */\n\nimport type { SMSProvider, SMSOptions, SMSResult } from './index.js';\n\n/**\n * NetGSM configuration\n */\nexport interface NetGSMConfig {\n /** NetGSM username */\n username: string;\n /** NetGSM password */\n password: string;\n /** SMS header/sender ID */\n header: string;\n /** NetGSM API URL (default: https://api.netgsm.com.tr/sms/send/otp) */\n apiUrl?: string;\n}\n\n/**\n * NetGSM SMS Provider\n */\nexport class NetGSMProvider implements SMSProvider {\n private config: Required<NetGSMConfig>;\n\n constructor(config: NetGSMConfig) {\n this.config = {\n apiUrl: 'https://api.netgsm.com.tr/sms/send/otp',\n ...config,\n };\n }\n\n /**\n * Send SMS via NetGSM API\n */\n async sendSMS(options: SMSOptions): Promise<SMSResult> {\n try {\n // Build XML payload for NetGSM API\n const xmlData = `<?xml version='1.0' encoding='iso-8859-9'?>\n<mainbody>\n <header>\n <usercode>${this.escapeXml(this.config.username)}</usercode>\n <password>${this.escapeXml(this.config.password)}</password>\n <msgheader>${this.escapeXml(options.from ?? this.config.header)}</msgheader>\n <encoding>TR</encoding>\n </header>\n <body>\n <msg><![CDATA[${options.message}]]></msg>\n <no>${this.sanitizePhoneNumber(options.to)}</no>\n </body>\n</mainbody>`;\n\n // Send request to NetGSM API\n const response = await fetch(this.config.apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/xml',\n },\n body: xmlData,\n });\n\n if (!response.ok) {\n return {\n success: false,\n error: `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n // Parse XML response\n const responseText = await response.text();\n const result = this.parseResponse(responseText);\n\n if (result.success) {\n return {\n success: true,\n messageId: result.code,\n };\n }\n\n return {\n success: false,\n error: `NetGSM error code: ${result.code} - ${this.getErrorMessage(result.code ?? '')}`,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Parse NetGSM XML response\n */\n private parseResponse(xml: string): { success: boolean; code?: string } {\n try {\n // Simple XML parsing for <code> element\n const codeMatch = xml.match(/<code>(.*?)<\\/code>/);\n if (!codeMatch) {\n // Try alternative format (plain text response)\n const trimmed = xml.trim();\n if (trimmed.length < 20 && /^\\d+$/.test(trimmed)) {\n // Response is just a code\n if (trimmed === '00' || trimmed === '0') {\n return { success: true, code: trimmed };\n }\n return { success: false, code: trimmed };\n }\n return { success: false };\n }\n\n const code = codeMatch[1]!.trim();\n\n // NetGSM returns \"00\" or \"0\" for success\n if (code === '00' || code === '0' || code.length > 10) {\n return { success: true, code };\n }\n\n return { success: false, code };\n } catch {\n return { success: false };\n }\n }\n\n /**\n * Get human-readable error message\n */\n private getErrorMessage(code: string): string {\n const errors: Record<string, string> = {\n '20': 'Message text is missing',\n '30': 'Invalid credentials',\n '40': 'Sender ID not approved',\n '50': 'Invalid recipient number',\n '51': 'Duplicate recipient',\n '60': 'OTP sending blocked',\n '70': 'Incorrect parameter format',\n '80': 'Query limit exceeded',\n '85': 'Same content sent too frequently',\n };\n\n return errors[code] ?? 'Unknown error';\n }\n\n /**\n * Escape XML special characters\n */\n private escapeXml(unsafe: string): string {\n return unsafe\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n /**\n * Sanitize phone number\n */\n private sanitizePhoneNumber(phone: string): string {\n // Remove spaces, dashes, parentheses\n let cleaned = phone.replace(/[\\s\\-\\(\\)]/g, '');\n\n // Remove leading + if present\n if (cleaned.startsWith('+')) {\n cleaned = cleaned.substring(1);\n }\n\n // If Turkish number without country code, add it\n if (cleaned.startsWith('5') && cleaned.length === 10) {\n cleaned = '90' + cleaned;\n }\n\n return cleaned;\n }\n}\n\n/**\n * Create NetGSM provider\n */\nexport function createNetGSMProvider(config: NetGSMConfig): NetGSMProvider {\n return new NetGSMProvider(config);\n}\n","/**\n * SMS Service\n * Provides SMS sending functionality\n */\n\n/**\n * SMS provider interface\n */\nexport interface SMSProvider {\n /** Send an SMS */\n sendSMS(options: SMSOptions): Promise<SMSResult>;\n}\n\n/**\n * SMS options\n */\nexport interface SMSOptions {\n /** Recipient phone number (E.164 format) */\n to: string;\n /** Message content */\n message: string;\n /** Sender ID (alphanumeric, max 11 chars) */\n from?: string;\n}\n\n/**\n * SMS send result\n */\nexport interface SMSResult {\n success: boolean;\n messageId?: string;\n error?: string;\n}\n\n/**\n * SMS service configuration\n */\nexport interface SMSServiceConfig {\n /** SMS provider instance */\n provider?: SMSProvider;\n /** Default sender ID */\n senderId?: string;\n /** Development mode (logs SMS instead of sending) */\n devMode?: boolean;\n}\n\n/**\n * OTP SMS options\n */\nexport interface OTPSMSOptions {\n /** Recipient phone number */\n phone: string;\n /** OTP code */\n code: string;\n /** Expiration in minutes (default: 10) */\n expiresInMinutes?: number;\n /** App name */\n appName?: string;\n}\n\n/**\n * SMS Service\n */\nexport class SMSService {\n private provider: SMSProvider | null;\n private senderId: string;\n private devMode: boolean;\n\n constructor(config: SMSServiceConfig) {\n this.devMode = config.devMode ?? process.env['NODE_ENV'] !== 'production';\n this.senderId = config.senderId ?? process.env['SMS_SENDER_ID'] ?? 'App';\n this.provider = config.provider ?? null;\n }\n\n /**\n * Send SMS\n */\n async sendSMS(options: SMSOptions): Promise<SMSResult> {\n // Development mode: log instead of send\n if (this.devMode) {\n console.log('📱 SMS (Development Mode):');\n console.log('To:', options.to);\n console.log('From:', options.from ?? this.senderId);\n console.log('Message:', options.message);\n console.log('─'.repeat(50));\n return { success: true, messageId: 'dev-mode-' + Date.now() };\n }\n\n if (!this.provider) {\n return { success: false, error: 'SMS provider not configured' };\n }\n\n return this.provider.sendSMS({\n ...options,\n from: options.from ?? this.senderId,\n });\n }\n\n /**\n * Send OTP SMS\n */\n async sendOTPSMS(options: OTPSMSOptions): Promise<SMSResult> {\n const { phone, code, expiresInMinutes = 10, appName = this.senderId } = options;\n\n const message = `Your ${appName} verification code is: ${code}. Valid for ${expiresInMinutes} minutes.`;\n\n return this.sendSMS({\n to: phone,\n message,\n });\n }\n}\n\n/**\n * Create SMS service\n */\nexport function createSMSService(config: SMSServiceConfig): SMSService {\n return new SMSService(config);\n}\n\n// Export providers\nexport { NetGSMProvider, createNetGSMProvider } from './netgsm-provider.js';\nexport type { NetGSMConfig } from './netgsm-provider.js';\n","/**\n * Email Verification Service\n * Handles email verification tokens and status\n */\n\nimport type { KVStorage } from '../../storage/types.js';\nimport { generateRandomHex, sha256Hex } from '../../utils/crypto.js';\n\n/**\n * Email verification configuration\n */\nexport interface EmailVerificationConfig {\n /** Base URL for verification links */\n baseUrl: string;\n /** Verification callback path (default: /auth/verify-email) */\n callbackPath?: string;\n /** Token expiration in seconds (default: 86400 = 24 hours) */\n expiresIn?: number;\n /** Token length in bytes (default: 32) */\n tokenLength?: number;\n}\n\n/**\n * Verification token record\n */\ninterface VerificationToken {\n email: string;\n tokenHash: string;\n expiresAt: string;\n usedAt?: string;\n createdBy?: string;\n}\n\n/**\n * Request verification result\n */\nexport interface RequestVerificationResult {\n success: boolean;\n token?: string;\n verificationUrl?: string;\n expiresAt?: Date;\n error?: string;\n}\n\n/**\n * Verify email result\n */\nexport interface VerifyEmailResult {\n success: boolean;\n email?: string;\n error?: string;\n}\n\n/**\n * Verification status\n */\nexport interface VerificationStatus {\n email: string;\n verified: boolean;\n pendingVerification: boolean;\n expiresAt?: Date;\n}\n\n/**\n * Email Verification Service\n */\nexport class EmailVerificationService {\n private storage: KVStorage;\n private config: Required<EmailVerificationConfig>;\n\n constructor(storage: KVStorage, config: EmailVerificationConfig) {\n this.storage = storage;\n this.config = {\n callbackPath: '/auth/verify-email',\n expiresIn: 86400, // 24 hours\n tokenLength: 32,\n ...config,\n };\n }\n\n /**\n * Create verification token for an email\n */\n async createVerificationToken(\n email: string,\n options?: { createdBy?: string }\n ): Promise<RequestVerificationResult> {\n const normalizedEmail = email.toLowerCase().trim();\n\n // Generate secure token\n const token = await generateRandomHex(this.config.tokenLength);\n const tokenHash = await sha256Hex(token);\n\n // Calculate expiration\n const expiresAt = new Date(Date.now() + this.config.expiresIn * 1000);\n\n // Clean up old tokens for this email\n await this.deleteTokensByEmail(normalizedEmail);\n\n // Store token\n const tokenData: VerificationToken = {\n email: normalizedEmail,\n tokenHash,\n expiresAt: expiresAt.toISOString(),\n createdBy: options?.createdBy,\n };\n\n await this.storage.set(`email-verify:hash:${tokenHash}`, tokenData, this.config.expiresIn);\n await this.storage.set(`email-verify:email:${normalizedEmail}`, tokenHash, this.config.expiresIn);\n\n // Build verification URL\n const params = new URLSearchParams({ token });\n const verificationUrl = `${this.config.baseUrl}${this.config.callbackPath}?${params}`;\n\n return {\n success: true,\n token,\n verificationUrl,\n expiresAt,\n };\n }\n\n /**\n * Verify an email token\n */\n async verifyToken(token: string): Promise<VerifyEmailResult> {\n const tokenHash = await sha256Hex(token);\n\n // Find token\n const tokenData = await this.storage.get<VerificationToken>(`email-verify:hash:${tokenHash}`);\n\n if (!tokenData) {\n return { success: false, error: 'Invalid or expired verification token' };\n }\n\n if (tokenData.usedAt) {\n return { success: false, error: 'Verification token already used' };\n }\n\n if (new Date(tokenData.expiresAt) < new Date()) {\n await this.deleteToken(tokenHash);\n return { success: false, error: 'Verification token expired' };\n }\n\n // Mark token as used\n tokenData.usedAt = new Date().toISOString();\n await this.storage.set(`email-verify:hash:${tokenHash}`, tokenData, 300); // Keep for 5 min for audit\n\n // Clean up email lookup\n await this.storage.delete(`email-verify:email:${tokenData.email}`);\n\n return {\n success: true,\n email: tokenData.email,\n };\n }\n\n /**\n * Check verification status for an email\n */\n async getStatus(email: string): Promise<VerificationStatus> {\n const normalizedEmail = email.toLowerCase().trim();\n\n // Check for pending verification\n const tokenHash = await this.storage.get<string>(`email-verify:email:${normalizedEmail}`);\n\n if (tokenHash) {\n const tokenData = await this.storage.get<VerificationToken>(`email-verify:hash:${tokenHash}`);\n if (tokenData && !tokenData.usedAt) {\n return {\n email: normalizedEmail,\n verified: false,\n pendingVerification: true,\n expiresAt: new Date(tokenData.expiresAt),\n };\n }\n }\n\n return {\n email: normalizedEmail,\n verified: false,\n pendingVerification: false,\n };\n }\n\n /**\n * Resend verification email\n * Returns a new token for the same email\n */\n async resendVerification(\n email: string,\n options?: { createdBy?: string }\n ): Promise<RequestVerificationResult> {\n return this.createVerificationToken(email, options);\n }\n\n /**\n * Cancel pending verification\n */\n async cancelVerification(email: string): Promise<void> {\n const normalizedEmail = email.toLowerCase().trim();\n await this.deleteTokensByEmail(normalizedEmail);\n }\n\n /**\n * Delete token by hash\n */\n private async deleteToken(tokenHash: string): Promise<void> {\n const tokenData = await this.storage.get<VerificationToken>(`email-verify:hash:${tokenHash}`);\n if (tokenData) {\n await this.storage.delete(`email-verify:email:${tokenData.email}`);\n }\n await this.storage.delete(`email-verify:hash:${tokenHash}`);\n }\n\n /**\n * Delete all tokens for an email\n */\n private async deleteTokensByEmail(email: string): Promise<void> {\n const tokenHash = await this.storage.get<string>(`email-verify:email:${email}`);\n if (tokenHash) {\n await this.storage.delete(`email-verify:hash:${tokenHash}`);\n }\n await this.storage.delete(`email-verify:email:${email}`);\n }\n}\n\n/**\n * Create email verification service\n */\nexport function createEmailVerificationService(\n storage: KVStorage,\n config: EmailVerificationConfig\n): EmailVerificationService {\n return new EmailVerificationService(storage, config);\n}\n","/**\n * @module\n * Passwordless-first authentication for Pars.\n * A provider-based, multi-runtime authentication library.\n *\n * @example\n * ```typescript\n * import { createAuth } from '@parsrun/auth';\n *\n * const auth = createAuth({\n * secret: process.env.AUTH_SECRET,\n * adapter: myDatabaseAdapter,\n * providers: {\n * otp: {\n * email: {\n * send: async (to, code) => {\n * await sendEmail(to, `Your code is: ${code}`);\n * },\n * },\n * },\n * },\n * });\n *\n * await auth.initialize();\n *\n * // Request OTP\n * await auth.requestOTP({ identifier: 'user@example.com', type: 'email' });\n *\n * // Sign in with OTP\n * const result = await auth.signIn({\n * provider: 'otp',\n * identifier: 'user@example.com',\n * credential: '123456',\n * data: { type: 'email' },\n * });\n * ```\n */\n\nimport type { ParsAuthConfig } from './config.js';\nimport { ParsAuthEngine, createAuthEngine } from './core/index.js';\n\n// ============================================\n// MAIN EXPORTS\n// ============================================\n\n/**\n * Create a Pars Auth instance\n *\n * @param config - Auth configuration\n * @returns ParsAuth instance (must call initialize() before use)\n *\n * @example\n * ```typescript\n * const auth = createAuth({\n * secret: 'your-secret-key',\n * adapter: drizzleAdapter(db),\n * providers: {\n * otp: {\n * email: {\n * send: async (to, code) => sendEmail(to, code),\n * },\n * },\n * },\n * });\n *\n * await auth.initialize();\n * ```\n */\nexport function createAuth(config: ParsAuthConfig): ParsAuthEngine {\n return createAuthEngine(config);\n}\n\n// Re-export the auth engine class\nexport { ParsAuthEngine } from './core/index.js';\n\n// ============================================\n// CONFIG EXPORTS\n// ============================================\n\nexport {\n type ParsAuthConfig,\n type SessionConfig,\n type JwtConfig,\n type CookieConfig,\n type CsrfConfig,\n type TenantConfig,\n type TenantResolutionStrategy,\n type OtpConfig,\n type MagicLinkConfig,\n type TotpConfig,\n type WebAuthnConfig,\n type PasswordConfig,\n type OAuthProviderConfig,\n type SecurityConfig,\n type AuthCallbacks,\n type AuthAdapter,\n type AdapterUser,\n type AdapterSession,\n type AdapterAuthMethod,\n type AdapterTenant,\n type AdapterMembership,\n type CreateUserInput,\n type CreateSessionInput,\n type CreateAuthMethodInput,\n type CreateMembershipInput,\n defaultConfig,\n mergeConfig,\n validateConfig,\n} from './config.js';\n\n// ============================================\n// CORE EXPORTS\n// ============================================\n\nexport {\n type AuthContext,\n type SignInInput,\n type SignInResult,\n type SignUpInput,\n type SignUpResult,\n type VerifyTokenResult,\n type RefreshTokenResult,\n type SessionInfo,\n} from './core/index.js';\n\n// ============================================\n// MULTI-TENANT EXPORTS\n// ============================================\n\n// Tenant Resolution\nexport {\n TenantResolver,\n MultiStrategyTenantResolver,\n createTenantResolver,\n createMultiStrategyResolver,\n type TenantResolverConfig,\n type TenantResolutionResult,\n} from './core/index.js';\n\n// Tenant Management\nexport {\n TenantManager,\n createTenantManager,\n type CreateTenantInput,\n type UpdateTenantInput,\n type AddMemberInput,\n type UpdateMemberInput,\n type TenantWithMembers,\n type UserTenantMembership,\n} from './core/index.js';\n\n// Invitation System\nexport {\n InvitationService,\n createInvitationService,\n type InvitationConfig,\n type InvitationRecord,\n type SendInvitationInput,\n type SendInvitationResult,\n type AcceptInvitationInput,\n type AcceptInvitationResult,\n type InvitationStatusResult,\n} from './core/index.js';\n\n// ============================================\n// PROVIDER EXPORTS\n// ============================================\n\nexport {\n ProviderRegistry,\n type AuthProvider,\n type ProviderType,\n type ProviderInfo,\n type AuthInput,\n type AuthResult,\n type VerifyInput,\n type VerifyResult,\n type OAuthProvider,\n type OAuthUserInfo,\n type TwoFactorProvider,\n type TwoFactorSetupResult,\n} from './providers/index.js';\n\n// OTP Provider\nexport {\n OTPProvider,\n OTPManager,\n createOTPProvider,\n createOTPManager,\n type RequestOTPInput,\n type RequestOTPResult,\n type OTPConfig,\n} from './providers/otp/index.js';\n\n// OTP Manager types (from otp-manager)\nexport type {\n OTPRecord,\n StoreOTPResult,\n VerifyOTPResult,\n RateLimitCheck,\n} from './providers/otp/otp-manager.js';\n\n// OAuth Provider\nexport {\n OAuthManager,\n GoogleProvider,\n GitHubProvider,\n MicrosoftProvider,\n AppleProvider,\n createOAuthManager,\n generatePKCE,\n generateState,\n type OAuthConfig,\n type OAuthFlowResult,\n type OAuthCallbackResult,\n type OAuthUserInfo as OAuthUser,\n type OAuthTokens,\n type OAuthState,\n type OAuthProviderName,\n type GoogleConfig,\n type GitHubConfig,\n type MicrosoftConfig,\n type AppleConfig,\n} from './providers/oauth/index.js';\n\n// Magic Link Provider\nexport {\n MagicLinkProvider,\n createMagicLinkProvider,\n type MagicLinkConfig as MagicLinkProviderConfig,\n type SendMagicLinkResult,\n type VerifyMagicLinkResult,\n} from './providers/magic-link/index.js';\n\n// TOTP Provider (2FA)\nexport {\n TOTPProvider,\n createTOTPProvider,\n type TOTPConfig as TOTPProviderConfig,\n type TOTPSetupData,\n type TOTPVerifyResult,\n} from './providers/totp/index.js';\n\n// WebAuthn Provider (Passkeys)\nexport {\n WebAuthnProvider,\n createWebAuthnProvider,\n type WebAuthnConfig as WebAuthnProviderConfig,\n type RegistrationOptions,\n type AuthenticationOptions,\n type WebAuthnCredential,\n type ClientDataJSON,\n type AuthenticatorData,\n} from './providers/webauthn/index.js';\n\n// Password Provider (DISABLED BY DEFAULT)\nexport {\n PasswordProvider,\n createPasswordProvider,\n type PasswordConfig as PasswordProviderConfig,\n type PasswordValidationResult,\n type PasswordStrength,\n} from './providers/password/index.js';\n\n// ============================================\n// SESSION EXPORTS\n// ============================================\n\nexport {\n JwtManager,\n JwtError,\n SessionBlocklist,\n TokenBlocklist,\n createJwtManager,\n createSessionBlocklist,\n createTokenBlocklist,\n extractBearerToken,\n parseDuration,\n type JwtConfig as JwtManagerConfig,\n type JwtPayload,\n type TokenPair,\n type KeyRotationResult,\n type BlocklistConfig,\n} from './session/index.js';\n\n// ============================================\n// STORAGE EXPORTS\n// ============================================\n\nexport {\n createStorage,\n createStorageSync,\n MemoryStorage,\n createMemoryStorage,\n StorageKeys,\n type KVStorage,\n type StorageType,\n type StorageConfig,\n type RedisConfig,\n type CloudflareKVConfig,\n type DenoKVConfig,\n type MemoryConfig,\n} from './storage/index.js';\n\n// ============================================\n// SECURITY EXPORTS\n// ============================================\n\nexport {\n RateLimiter,\n createRateLimiter,\n RateLimitPresets,\n CsrfManager,\n createCsrfManager,\n CsrfUtils,\n LockoutManager,\n createLockoutManager,\n DefaultLockoutConfig,\n type RateLimitConfig,\n type RateLimitResult,\n type CsrfConfig as CsrfManagerConfig,\n type CsrfTokenPair,\n type LockoutConfig,\n type LockoutStatus,\n // Authorization\n AuthorizationGuard,\n createAuthorizationGuard,\n authorize,\n Permissions,\n Roles,\n type AuthorizationContext,\n type TenantMembershipInfo,\n type AuthorizationResult,\n type AuthorizationRequirements,\n type PermissionPattern,\n} from './security/index.js';\n\n// ============================================\n// UTILITY EXPORTS\n// ============================================\n\nexport {\n detectRuntime,\n isNode,\n isDeno,\n isCloudflare,\n isBun,\n isEdge,\n getEnv,\n type Runtime,\n} from './utils/runtime.js';\n\n// Crypto utilities\nexport {\n generateRandomHex,\n generateRandomBase64Url,\n randomInt,\n sha256,\n sha256Hex,\n timingSafeEqual,\n timingSafeEqualBytes,\n base64UrlEncode,\n base64UrlDecode,\n hexToBytes,\n bytesToHex,\n} from './utils/crypto.js';\n\n// ============================================\n// ADAPTER EXPORTS\n// ============================================\n\nexport {\n createAuthMiddleware,\n createOptionalAuthMiddleware,\n createAuthRoutes,\n createHonoAuth,\n createAuthCookies,\n createLogoutCookies,\n // Authorization middleware helpers\n requireRole,\n requirePermission,\n requireAnyPermission,\n requireTenant,\n requireTenantAccess,\n requireAdmin,\n requireOwnerOrPermission,\n requireAll,\n requireAny,\n type AuthVariables,\n type HonoAdapterConfig,\n type AuthContext as AdapterAuthContext,\n type CookieOptions,\n type AuthResponse,\n} from './adapters/index.js';\n\n// Drizzle Adapter\nexport {\n createDrizzleAdapter,\n type DrizzleAdapterConfig,\n type DrizzleAuthSchema,\n type DrizzleDatabase,\n type DrizzleUser,\n type DrizzleSession,\n type DrizzleAuthMethod,\n type DrizzleTenant,\n type DrizzleTenantMembership,\n type DrizzleRole,\n type DrizzleEmailVerificationToken,\n} from './adapters/drizzle/index.js';\n\n// ============================================\n// SERVICES EXPORTS\n// ============================================\n\n// Email Service\nexport {\n EmailService,\n createEmailService,\n ResendEmailProvider,\n createResendProvider,\n type EmailProvider,\n type EmailOptions,\n type EmailResult,\n type EmailServiceConfig,\n type OTPEmailOptions,\n type VerificationEmailOptions,\n type WelcomeEmailOptions,\n type MagicLinkEmailOptions,\n type PasswordResetEmailOptions,\n type InvitationEmailOptions,\n type EmailAttachment,\n} from './services/email/index.js';\n\n// SMS Service\nexport {\n SMSService,\n createSMSService,\n NetGSMProvider,\n createNetGSMProvider,\n type SMSProvider,\n type SMSOptions,\n type SMSResult,\n type SMSServiceConfig,\n type OTPSMSOptions,\n type NetGSMConfig,\n} from './services/sms/index.js';\n\n// Email Verification Service\nexport {\n EmailVerificationService,\n createEmailVerificationService,\n type EmailVerificationConfig,\n type RequestVerificationResult,\n type VerifyEmailResult,\n type VerificationStatus,\n} from './services/email-verification/index.js';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/core/tenant-manager.ts","../src/core/tenant-resolver.ts","../src/core/invitation.ts","../src/core/auth-engine.ts","../src/providers/oauth/google.ts","../src/providers/oauth/github.ts","../src/providers/oauth/microsoft.ts","../src/providers/oauth/apple.ts","../src/providers/oauth/index.ts","../src/providers/magic-link/index.ts","../src/providers/totp/index.ts","../src/providers/webauthn/index.ts","../src/providers/password/index.ts","../src/adapters/drizzle/index.ts","../src/services/email/resend-provider.ts","../src/services/email/templates/otp.ts","../src/services/email/templates/verification.ts","../src/services/email/templates/magic-link.ts","../src/services/email/index.ts","../src/services/sms/netgsm-provider.ts","../src/services/sms/index.ts","../src/services/email-verification/index.ts","../src/index.ts"],"names":["base64UrlEncode","base64UrlDecode","DEFAULT_CONFIG"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Pars Auth Configuration\n * Passwordless-first, provider-based authentication\n */\n\nimport type { StorageConfig } from './storage/types.js';\n\n/**\n * Session configuration\n */\nexport interface SessionConfig {\n /** Access token expiry in seconds (default: 900 = 15 minutes) */\n accessTokenExpiry?: number;\n /** Refresh token expiry in seconds (default: 604800 = 7 days) */\n refreshTokenExpiry?: number;\n /** Enable sliding window for refresh tokens (default: true) */\n slidingWindow?: boolean;\n /** Maximum concurrent sessions per user (default: 5) */\n maxSessions?: number;\n /** Invalidate all sessions on password change (default: true) */\n invalidateOnPasswordChange?: boolean;\n}\n\n/**\n * JWT configuration\n */\nexport interface JwtConfig {\n /** JWT signing algorithm (default: HS256) */\n algorithm?: 'HS256' | 'HS384' | 'HS512' | 'RS256' | 'RS384' | 'RS512' | 'ES256' | 'ES384' | 'ES512';\n /** JWT issuer claim */\n issuer?: string;\n /** JWT audience claim */\n audience?: string | string[];\n}\n\n/**\n * Cookie configuration\n */\nexport interface CookieConfig {\n /** Cookie name prefix (default: 'pars') */\n prefix?: string;\n /** Cookie domain */\n domain?: string;\n /** Cookie path (default: '/') */\n path?: string;\n /** Use secure cookies (default: true in production) */\n secure?: boolean;\n /** SameSite attribute (default: 'lax') */\n sameSite?: 'strict' | 'lax' | 'none';\n /** HttpOnly for refresh token (default: true) */\n httpOnly?: boolean;\n}\n\n/**\n * CSRF configuration\n */\nexport interface CsrfConfig {\n /** Enable CSRF protection (default: true) */\n enabled?: boolean;\n /** CSRF header name (default: 'x-csrf-token') */\n headerName?: string;\n /** CSRF cookie name (default: 'csrf') */\n cookieName?: string;\n}\n\n/**\n * Tenant resolution strategy\n */\nexport type TenantResolutionStrategy =\n | 'subdomain' // tenant.example.com\n | 'header' // X-Tenant-ID header\n | 'path' // /tenant/api/...\n | 'query' // ?tenant=...\n | 'custom'; // Custom resolver function\n\n/**\n * Multi-tenant configuration\n */\nexport interface TenantConfig {\n /** Enable multi-tenancy (default: true) */\n enabled?: boolean;\n /** Tenant resolution strategy (default: 'header') */\n strategy?: TenantResolutionStrategy;\n /** Header name for tenant ID (default: 'x-tenant-id') */\n headerName?: string;\n /** Custom tenant resolver */\n resolver?: (request: Request) => Promise<string | null>;\n}\n\n/**\n * OAuth provider configuration\n */\nexport interface OAuthProviderConfig {\n /** Enable this provider */\n enabled?: boolean;\n /** OAuth client ID */\n clientId: string;\n /** OAuth client secret */\n clientSecret: string;\n /** OAuth scopes */\n scopes?: string[];\n /** Callback URL (default: baseUrl + /auth/callback/:provider) */\n callbackUrl?: string;\n}\n\n/**\n * OTP (One-Time Password) configuration\n */\nexport interface OtpConfig {\n /** Enable OTP authentication (default: true) */\n enabled?: boolean;\n\n /** Email OTP configuration */\n email?: {\n /** Enable email OTP (default: true) */\n enabled?: boolean;\n /** OTP expiry in seconds (default: 600 = 10 minutes) */\n expiresIn?: number;\n /** OTP code length (default: 6) */\n length?: number;\n /** Maximum verification attempts (default: 3) */\n maxAttempts?: number;\n /** Rate limit: max requests per window (default: 5) */\n rateLimit?: number;\n /** Rate limit window in seconds (default: 900 = 15 minutes) */\n rateLimitWindow?: number;\n /** Email sending function */\n send: (to: string, code: string) => Promise<void>;\n };\n\n /** SMS OTP configuration */\n sms?: {\n /** Enable SMS OTP (default: false) */\n enabled?: boolean;\n /** OTP expiry in seconds (default: 300 = 5 minutes) */\n expiresIn?: number;\n /** OTP code length (default: 6) */\n length?: number;\n /** Maximum verification attempts (default: 3) */\n maxAttempts?: number;\n /** Rate limit: max requests per window (default: 3) */\n rateLimit?: number;\n /** Rate limit window in seconds (default: 900 = 15 minutes) */\n rateLimitWindow?: number;\n /** SMS sending function */\n send: (to: string, code: string) => Promise<void>;\n };\n}\n\n/**\n * Magic Link configuration\n */\nexport interface MagicLinkConfig {\n /** Enable magic link authentication (default: false) */\n enabled?: boolean;\n /** Link expiry in seconds (default: 900 = 15 minutes) */\n expiresIn?: number;\n /** Email sending function */\n send: (to: string, url: string) => Promise<void>;\n}\n\n/**\n * TOTP (Time-based One-Time Password) configuration for 2FA\n */\nexport interface TotpConfig {\n /** Enable TOTP 2FA (default: false) */\n enabled?: boolean;\n /** TOTP issuer name (shown in authenticator apps) */\n issuer?: string;\n /** Number of backup codes to generate (default: 10) */\n backupCodesCount?: number;\n}\n\n/**\n * WebAuthn/Passkey configuration\n */\nexport interface WebAuthnConfig {\n /** Enable WebAuthn (default: false) */\n enabled?: boolean;\n /** Relying party name (your app name) */\n rpName: string;\n /** Relying party ID (your domain) */\n rpId: string;\n /** Allowed origins */\n origins?: string[];\n}\n\n/**\n * Password configuration (DISABLED BY DEFAULT)\n */\nexport interface PasswordConfig {\n /**\n * Enable password authentication\n * @default false - Passwordless is recommended\n */\n enabled?: boolean;\n /** Minimum password length (default: 8) */\n minLength?: number;\n /** Require uppercase letters (default: false) */\n requireUppercase?: boolean;\n /** Require lowercase letters (default: false) */\n requireLowercase?: boolean;\n /** Require numbers (default: false) */\n requireNumbers?: boolean;\n /** Require special characters (default: false) */\n requireSymbols?: boolean;\n /** Check against common passwords (default: true) */\n checkCommonPasswords?: boolean;\n}\n\n/**\n * Security configuration\n */\nexport interface SecurityConfig {\n /** Rate limiting configuration */\n rateLimit?: {\n /** Enable rate limiting (default: true) */\n enabled?: boolean;\n /** Login attempts per window (default: 5) */\n loginAttempts?: number;\n /** Window size in seconds (default: 900 = 15 minutes) */\n windowSize?: number;\n };\n /** Account lockout configuration */\n lockout?: {\n /** Enable account lockout (default: true) */\n enabled?: boolean;\n /** Failed attempts before lockout (default: 5) */\n maxAttempts?: number;\n /** Lockout duration in seconds (default: 900 = 15 minutes) */\n duration?: number;\n };\n /** CSRF configuration */\n csrf?: CsrfConfig;\n}\n\n/**\n * Auth callbacks for extensibility\n */\nexport interface AuthCallbacks {\n /** Called after successful sign up */\n onSignUp?: (user: { id: string; email?: string | null }) => Promise<void>;\n /** Called after successful sign in */\n onSignIn?: (user: { id: string; email?: string | null }, session: { id: string }) => Promise<void>;\n /** Called after sign out */\n onSignOut?: (userId: string, sessionId: string) => Promise<void>;\n /** Called when a new session is created */\n onSessionCreated?: (session: { id: string; userId: string }) => Promise<void>;\n /** Validate sign in (return false to reject) */\n validateSignIn?: (user: { id: string; email?: string | null }) => Promise<boolean>;\n}\n\n/**\n * Database adapter interface\n * Implement this to connect Pars Auth to your database\n */\nexport interface AuthAdapter {\n // User operations\n findUserById(id: string): Promise<AdapterUser | null>;\n findUserByEmail(email: string): Promise<AdapterUser | null>;\n findUserByPhone(phone: string): Promise<AdapterUser | null>;\n createUser(data: CreateUserInput): Promise<AdapterUser>;\n updateUser(id: string, data: Partial<AdapterUser>): Promise<AdapterUser>;\n deleteUser(id: string): Promise<void>;\n\n // Session operations\n findSessionById(id: string): Promise<AdapterSession | null>;\n findSessionsByUserId(userId: string): Promise<AdapterSession[]>;\n createSession(data: CreateSessionInput): Promise<AdapterSession>;\n updateSession(id: string, data: Partial<AdapterSession>): Promise<AdapterSession>;\n deleteSession(id: string): Promise<void>;\n deleteSessionsByUserId(userId: string): Promise<void>;\n\n // Auth method operations (for OAuth, etc.)\n findAuthMethod(provider: string, providerId: string): Promise<AdapterAuthMethod | null>;\n findAuthMethodsByUserId(userId: string): Promise<AdapterAuthMethod[]>;\n createAuthMethod(data: CreateAuthMethodInput): Promise<AdapterAuthMethod>;\n deleteAuthMethod(id: string): Promise<void>;\n\n // Tenant operations (optional for multi-tenant)\n findTenantById?(id: string): Promise<AdapterTenant | null>;\n findTenantBySlug?(slug: string): Promise<AdapterTenant | null>;\n createTenant?(data: CreateTenantInput): Promise<AdapterTenant>;\n updateTenant?(id: string, data: Partial<AdapterTenant>): Promise<AdapterTenant>;\n deleteTenant?(id: string): Promise<void>;\n\n // Tenant hierarchy operations (optional)\n findTenantsByParentId?(parentId: string | null): Promise<AdapterTenant[]>;\n findTenantsByPath?(pathPrefix: string): Promise<AdapterTenant[]>;\n updateTenantPath?(tenantId: string, path: string, depth: number): Promise<void>;\n\n // Membership operations (optional for multi-tenant)\n findMembership?(userId: string, tenantId: string): Promise<AdapterMembership | null>;\n findMembershipsByUserId?(userId: string): Promise<AdapterMembership[]>;\n createMembership?(data: CreateMembershipInput): Promise<AdapterMembership>;\n updateMembership?(id: string, data: Partial<AdapterMembership>): Promise<AdapterMembership>;\n deleteMembership?(id: string): Promise<void>;\n}\n\n// Adapter types\nexport interface AdapterUser {\n id: string;\n email?: string | null;\n phone?: string | null;\n emailVerified?: boolean;\n phoneVerified?: boolean;\n name?: string | null;\n avatar?: string | null;\n twoFactorEnabled?: boolean;\n status: 'active' | 'inactive' | 'suspended';\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface AdapterSession {\n id: string;\n userId: string;\n tenantId?: string | null;\n expiresAt: Date;\n refreshExpiresAt?: Date | null;\n deviceType?: string | null;\n deviceName?: string | null;\n userAgent?: string | null;\n ipAddress?: string | null;\n status: 'active' | 'expired' | 'revoked';\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface AdapterAuthMethod {\n id: string;\n userId: string;\n provider: string;\n providerId: string;\n verified: boolean;\n metadata?: Record<string, unknown>;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface AdapterTenant {\n id: string;\n name: string;\n slug: string;\n status: 'active' | 'suspended' | 'inactive';\n /** Parent tenant ID for hierarchical tenants */\n parentId?: string | null;\n /** Materialized path for efficient ancestor/descendant queries (e.g., \"/root-id/parent-id/id/\") */\n path?: string | null;\n /** Hierarchy depth (0 = root tenant) */\n depth?: number | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface AdapterMembership {\n id: string;\n userId: string;\n tenantId: string;\n role: string;\n permissions?: string[];\n status: 'active' | 'inactive' | 'pending';\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface CreateUserInput {\n email?: string;\n phone?: string;\n name?: string;\n avatar?: string;\n emailVerified?: boolean;\n phoneVerified?: boolean;\n}\n\nexport interface CreateSessionInput {\n userId: string;\n tenantId?: string;\n expiresAt: Date;\n refreshExpiresAt?: Date;\n deviceType?: string;\n deviceName?: string;\n userAgent?: string;\n ipAddress?: string;\n}\n\nexport interface CreateAuthMethodInput {\n userId: string;\n provider: string;\n providerId: string;\n verified?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateMembershipInput {\n userId: string;\n tenantId: string;\n role: string;\n permissions?: string[];\n}\n\nexport interface CreateTenantInput {\n name: string;\n slug: string;\n status?: 'active' | 'suspended' | 'inactive';\n parentId?: string | null;\n path?: string | null;\n depth?: number | null;\n}\n\n/**\n * Main Pars Auth Configuration\n */\nexport interface ParsAuthConfig {\n /**\n * Secret key for signing tokens (required)\n * Use a strong, random string of at least 32 characters\n */\n secret: string;\n\n /**\n * Base URL of your application\n * Used for OAuth callbacks, magic links, etc.\n */\n baseUrl?: string;\n\n /**\n * Storage configuration for OTP, rate limiting, etc.\n * Auto-detects runtime if not specified\n */\n storage?: StorageConfig;\n\n /**\n * Authentication providers\n */\n providers?: {\n /** OTP configuration (enabled by default) */\n otp?: OtpConfig;\n /** Magic Link configuration */\n magicLink?: MagicLinkConfig;\n /** OAuth providers */\n oauth?: {\n google?: OAuthProviderConfig;\n github?: OAuthProviderConfig;\n microsoft?: OAuthProviderConfig;\n apple?: OAuthProviderConfig;\n /** Custom OAuth providers */\n custom?: Record<string, OAuthProviderConfig>;\n };\n /** TOTP 2FA configuration */\n totp?: TotpConfig;\n /** WebAuthn/Passkey configuration */\n webauthn?: WebAuthnConfig;\n /**\n * Password configuration\n * @default { enabled: false }\n */\n password?: PasswordConfig;\n };\n\n /** Session configuration */\n session?: SessionConfig;\n\n /** JWT configuration */\n jwt?: JwtConfig;\n\n /** Cookie configuration */\n cookies?: CookieConfig;\n\n /** Security configuration */\n security?: SecurityConfig;\n\n /** Multi-tenant configuration */\n tenant?: TenantConfig;\n\n /** Database adapter (required) */\n adapter: AuthAdapter;\n\n /** Lifecycle callbacks */\n callbacks?: AuthCallbacks;\n}\n\n/**\n * Default configuration (passwordless-first)\n */\nexport const defaultConfig: Partial<ParsAuthConfig> = {\n providers: {\n otp: {\n enabled: true,\n email: {\n enabled: true,\n expiresIn: 600,\n length: 6,\n maxAttempts: 3,\n rateLimit: 5,\n rateLimitWindow: 900,\n // send function must be provided by user\n send: async () => {\n throw new Error('[Pars Auth] Email OTP send function not configured');\n },\n },\n sms: {\n enabled: false,\n expiresIn: 300,\n length: 6,\n maxAttempts: 3,\n rateLimit: 3,\n rateLimitWindow: 900,\n send: async () => {\n throw new Error('[Pars Auth] SMS OTP send function not configured');\n },\n },\n },\n password: {\n enabled: false, // EXPLICITLY DISABLED BY DEFAULT\n },\n },\n session: {\n accessTokenExpiry: 900, // 15 minutes\n refreshTokenExpiry: 604800, // 7 days\n slidingWindow: true,\n maxSessions: 5,\n invalidateOnPasswordChange: true,\n },\n jwt: {\n algorithm: 'HS256',\n },\n cookies: {\n prefix: 'pars',\n path: '/',\n sameSite: 'lax',\n httpOnly: true,\n },\n security: {\n rateLimit: {\n enabled: true,\n loginAttempts: 5,\n windowSize: 900,\n },\n lockout: {\n enabled: true,\n maxAttempts: 5,\n duration: 900,\n },\n csrf: {\n enabled: true,\n headerName: 'x-csrf-token',\n cookieName: 'csrf',\n },\n },\n tenant: {\n enabled: true,\n strategy: 'header',\n headerName: 'x-tenant-id',\n },\n};\n\n/**\n * Merge user config with defaults\n */\nexport function mergeConfig(config: ParsAuthConfig): Required<ParsAuthConfig> {\n return {\n secret: config.secret,\n baseUrl: config.baseUrl ?? '',\n storage: config.storage ?? {},\n providers: {\n ...defaultConfig.providers,\n ...config.providers,\n otp: {\n ...defaultConfig.providers?.otp,\n ...config.providers?.otp,\n email: {\n ...defaultConfig.providers?.otp?.email,\n ...config.providers?.otp?.email,\n },\n sms: {\n ...defaultConfig.providers?.otp?.sms,\n ...config.providers?.otp?.sms,\n },\n },\n password: {\n ...defaultConfig.providers?.password,\n ...config.providers?.password,\n },\n },\n session: { ...defaultConfig.session, ...config.session } as Required<SessionConfig>,\n jwt: { ...defaultConfig.jwt, ...config.jwt } as Required<JwtConfig>,\n cookies: { ...defaultConfig.cookies, ...config.cookies } as Required<CookieConfig>,\n security: {\n ...defaultConfig.security,\n ...config.security,\n rateLimit: { ...defaultConfig.security?.rateLimit, ...config.security?.rateLimit },\n lockout: { ...defaultConfig.security?.lockout, ...config.security?.lockout },\n csrf: { ...defaultConfig.security?.csrf, ...config.security?.csrf },\n } as Required<SecurityConfig>,\n tenant: { ...defaultConfig.tenant, ...config.tenant } as Required<TenantConfig>,\n adapter: config.adapter,\n callbacks: config.callbacks ?? {},\n } as Required<ParsAuthConfig>;\n}\n\n/**\n * Validate configuration\n */\nexport function validateConfig(config: ParsAuthConfig): void {\n if (!config.secret) {\n throw new Error('[Pars Auth] Secret is required');\n }\n\n if (config.secret.length < 32) {\n console.warn(\n '[Pars Auth] Secret should be at least 32 characters for security'\n );\n }\n\n if (!config.adapter) {\n throw new Error('[Pars Auth] Database adapter is required');\n }\n\n // Warn if password is enabled\n if (config.providers?.password?.enabled) {\n console.warn(\n '[Pars Auth] Password authentication is enabled. Consider using passwordless authentication (OTP, Magic Link, WebAuthn) for better security.'\n );\n }\n\n // Check OTP send function\n if (\n config.providers?.otp?.email?.enabled !== false &&\n !config.providers?.otp?.email?.send\n ) {\n console.warn(\n '[Pars Auth] Email OTP is enabled but send function is not configured'\n );\n }\n}\n","/**\n * Tenant Manager\n * CRUD operations for tenants and memberships\n */\n\nimport type { AuthAdapter, AdapterTenant, AdapterMembership } from '../config.js';\n\n/**\n * Tenant creation input\n */\nexport interface CreateTenantInput {\n /** Tenant name */\n name: string;\n /** URL-friendly slug (auto-generated if not provided) */\n slug?: string;\n /** Owner user ID */\n ownerId: string;\n /** Owner role name (default: 'owner') */\n ownerRole?: string;\n /** Initial status (default: 'active') */\n status?: 'active' | 'suspended' | 'inactive';\n /** Parent tenant ID for creating child tenants */\n parentId?: string;\n}\n\n/**\n * Tenant update input\n */\nexport interface UpdateTenantInput {\n /** Tenant name */\n name?: string;\n /** Status */\n status?: 'active' | 'suspended' | 'inactive';\n}\n\n/**\n * Membership creation input\n */\nexport interface AddMemberInput {\n /** User ID to add */\n userId: string;\n /** Tenant ID */\n tenantId: string;\n /** Role name */\n role: string;\n /** Initial permissions */\n permissions?: string[];\n /** Status (default: 'active') */\n status?: 'active' | 'inactive' | 'pending';\n}\n\n/**\n * Membership update input\n */\nexport interface UpdateMemberInput {\n /** New role */\n role?: string;\n /** New permissions */\n permissions?: string[];\n /** New status */\n status?: 'active' | 'inactive' | 'pending';\n}\n\n/**\n * Tenant with members\n */\nexport interface TenantWithMembers extends AdapterTenant {\n members: AdapterMembership[];\n memberCount: number;\n}\n\n/**\n * User's tenant memberships with tenant details\n */\nexport interface UserTenantMembership extends AdapterMembership {\n tenant?: AdapterTenant;\n}\n\n/**\n * Tenant Manager\n */\nexport class TenantManager {\n private adapter: AuthAdapter;\n\n constructor(adapter: AuthAdapter) {\n this.adapter = adapter;\n }\n\n // ============================================\n // Tenant Operations\n // ============================================\n\n /**\n * Create a new tenant with owner\n */\n async createTenant(input: CreateTenantInput): Promise<{\n tenant: AdapterTenant;\n membership: AdapterMembership;\n }> {\n // Check if adapter supports tenant operations\n if (!this.adapter.findTenantById || !this.adapter.createTenant) {\n throw new Error('Tenant operations not supported by adapter');\n }\n\n if (!this.adapter.createMembership) {\n throw new Error('Membership operations not supported by adapter');\n }\n\n // Generate slug if not provided\n const slug = input.slug ?? this.generateSlug(input.name);\n\n // Check if slug is unique\n const existingTenant = await this.adapter.findTenantBySlug?.(slug);\n if (existingTenant) {\n throw new Error(`Tenant with slug '${slug}' already exists`);\n }\n\n // Calculate path and depth for hierarchy\n let parentId: string | null = null;\n let path: string | null = null;\n let depth: number = 0;\n\n if (input.parentId) {\n const parent = await this.adapter.findTenantById(input.parentId);\n if (!parent) {\n throw new Error(`Parent tenant '${input.parentId}' not found`);\n }\n parentId = input.parentId;\n depth = (parent.depth ?? 0) + 1;\n // Path will be updated after we get the tenant ID\n }\n\n // Create tenant\n const tenant = await this.adapter.createTenant({\n name: input.name,\n slug,\n status: input.status ?? 'active',\n parentId,\n path: null, // Will be updated after creation\n depth,\n });\n\n // Calculate and update path with tenant ID\n if (input.parentId) {\n const parent = await this.adapter.findTenantById(input.parentId);\n const parentPath = parent?.path ?? `/${input.parentId}/`;\n path = `${parentPath.replace(/\\/$/, '')}/${tenant.id}/`;\n } else {\n path = `/${tenant.id}/`;\n }\n\n // Update tenant with path\n if (this.adapter.updateTenantPath) {\n await this.adapter.updateTenantPath(tenant.id, path, depth);\n tenant.path = path;\n tenant.depth = depth;\n }\n\n // Create owner membership\n const membership = await this.adapter.createMembership({\n userId: input.ownerId,\n tenantId: tenant.id,\n role: input.ownerRole ?? 'owner',\n });\n\n return { tenant, membership };\n }\n\n /**\n * Get tenant by ID\n */\n async getTenantById(id: string): Promise<AdapterTenant | null> {\n if (!this.adapter.findTenantById) {\n return null;\n }\n return this.adapter.findTenantById(id);\n }\n\n /**\n * Get tenant by slug\n */\n async getTenantBySlug(slug: string): Promise<AdapterTenant | null> {\n if (!this.adapter.findTenantBySlug) {\n return null;\n }\n return this.adapter.findTenantBySlug(slug);\n }\n\n // ============================================\n // Tenant Hierarchy Operations\n // ============================================\n\n /**\n * Get direct children of a tenant\n */\n async getChildren(tenantId: string): Promise<AdapterTenant[]> {\n if (!this.adapter.findTenantsByParentId) {\n return [];\n }\n return this.adapter.findTenantsByParentId(tenantId);\n }\n\n /**\n * Get parent of a tenant\n */\n async getParent(tenantId: string): Promise<AdapterTenant | null> {\n if (!this.adapter.findTenantById) {\n return null;\n }\n\n const tenant = await this.adapter.findTenantById(tenantId);\n if (!tenant || !tenant.parentId) {\n return null;\n }\n\n return this.adapter.findTenantById(tenant.parentId);\n }\n\n /**\n * Get all ancestors of a tenant (from immediate parent to root)\n */\n async getAncestors(tenantId: string): Promise<AdapterTenant[]> {\n if (!this.adapter.findTenantById) {\n return [];\n }\n\n const tenant = await this.adapter.findTenantById(tenantId);\n if (!tenant || !tenant.path) {\n return [];\n }\n\n // Parse path to get ancestor IDs: \"/root/parent/child/\" -> [\"root\", \"parent\"]\n const pathParts = tenant.path.split('/').filter(Boolean);\n // Remove current tenant ID (last element)\n const ancestorIds = pathParts.slice(0, -1);\n\n // Fetch ancestors in order (root to immediate parent)\n const ancestors: AdapterTenant[] = [];\n for (const ancestorId of ancestorIds) {\n const ancestor = await this.adapter.findTenantById(ancestorId);\n if (ancestor) {\n ancestors.push(ancestor);\n }\n }\n\n return ancestors;\n }\n\n /**\n * Get all descendants of a tenant (all levels)\n */\n async getDescendants(tenantId: string): Promise<AdapterTenant[]> {\n if (!this.adapter.findTenantById || !this.adapter.findTenantsByPath) {\n return [];\n }\n\n const tenant = await this.adapter.findTenantById(tenantId);\n if (!tenant) {\n return [];\n }\n\n // Use path for efficient descendant query\n const path = tenant.path ?? `/${tenantId}/`;\n const allDescendants = await this.adapter.findTenantsByPath(path);\n\n // Filter out the tenant itself\n return allDescendants.filter(t => t.id !== tenantId);\n }\n\n /**\n * Get siblings of a tenant (same parent)\n */\n async getSiblings(tenantId: string): Promise<AdapterTenant[]> {\n if (!this.adapter.findTenantById || !this.adapter.findTenantsByParentId) {\n return [];\n }\n\n const tenant = await this.adapter.findTenantById(tenantId);\n if (!tenant) {\n return [];\n }\n\n // Get all tenants with the same parent\n const siblings = await this.adapter.findTenantsByParentId(tenant.parentId ?? null);\n\n // Filter out the tenant itself\n return siblings.filter(t => t.id !== tenantId);\n }\n\n /**\n * Get root tenant of a hierarchy\n */\n async getRootTenant(tenantId: string): Promise<AdapterTenant | null> {\n if (!this.adapter.findTenantById) {\n return null;\n }\n\n const tenant = await this.adapter.findTenantById(tenantId);\n if (!tenant) {\n return null;\n }\n\n // If no parent, this is the root\n if (!tenant.parentId) {\n return tenant;\n }\n\n // Get root from path\n if (tenant.path) {\n const pathParts = tenant.path.split('/').filter(Boolean);\n const rootId = pathParts[0];\n if (rootId) {\n return this.adapter.findTenantById(rootId);\n }\n }\n\n // Fallback: traverse up the hierarchy\n let current = tenant;\n while (current.parentId) {\n const parent = await this.adapter.findTenantById(current.parentId);\n if (!parent) break;\n current = parent;\n }\n\n return current;\n }\n\n /**\n * Move a tenant to a new parent\n */\n async moveToParent(tenantId: string, newParentId: string | null): Promise<void> {\n if (!this.adapter.findTenantById || !this.adapter.updateTenant || !this.adapter.updateTenantPath) {\n throw new Error('Tenant hierarchy operations not supported by adapter');\n }\n\n const tenant = await this.adapter.findTenantById(tenantId);\n if (!tenant) {\n throw new Error('Tenant not found');\n }\n\n // Prevent circular reference\n if (newParentId) {\n const isDescendant = await this.isDescendantOf(newParentId, tenantId);\n if (isDescendant) {\n throw new Error('Cannot move tenant to its own descendant');\n }\n }\n\n // Get descendants BEFORE updating path (they still have old paths)\n const oldPath = tenant.path ?? `/${tenantId}/`;\n const descendants = await this.getDescendants(tenantId);\n\n // Calculate new path and depth\n let newPath: string;\n let newDepth: number;\n\n if (newParentId) {\n const newParent = await this.adapter.findTenantById(newParentId);\n if (!newParent) {\n throw new Error('New parent tenant not found');\n }\n const parentPath = newParent.path ?? `/${newParentId}/`;\n newPath = `${parentPath.replace(/\\/$/, '')}/${tenantId}/`;\n newDepth = (newParent.depth ?? 0) + 1;\n } else {\n newPath = `/${tenantId}/`;\n newDepth = 0;\n }\n\n // Update tenant\n await this.adapter.updateTenant(tenantId, { parentId: newParentId });\n await this.adapter.updateTenantPath(tenantId, newPath, newDepth);\n\n for (const descendant of descendants) {\n if (descendant.path) {\n const descendantNewPath = descendant.path.replace(oldPath, newPath);\n const descendantNewDepth = (descendant.depth ?? 0) - (tenant.depth ?? 0) + newDepth;\n await this.adapter.updateTenantPath(descendant.id, descendantNewPath, descendantNewDepth);\n }\n }\n }\n\n /**\n * Check if a tenant is an ancestor of another tenant\n */\n async isAncestorOf(ancestorId: string, descendantId: string): Promise<boolean> {\n if (!this.adapter.findTenantById) {\n return false;\n }\n\n const descendant = await this.adapter.findTenantById(descendantId);\n if (!descendant || !descendant.path) {\n return false;\n }\n\n // Check if ancestor ID is in the descendant's path\n return descendant.path.includes(`/${ancestorId}/`);\n }\n\n /**\n * Check if a tenant is a descendant of another tenant\n */\n async isDescendantOf(descendantId: string, ancestorId: string): Promise<boolean> {\n return this.isAncestorOf(ancestorId, descendantId);\n }\n\n /**\n * Get all root tenants (tenants without parent)\n */\n async getRootTenants(): Promise<AdapterTenant[]> {\n if (!this.adapter.findTenantsByParentId) {\n return [];\n }\n return this.adapter.findTenantsByParentId(null);\n }\n\n // ============================================\n // Membership Operations\n // ============================================\n\n /**\n * Check if user is member of tenant\n */\n async isMember(userId: string, tenantId: string): Promise<boolean> {\n if (!this.adapter.findMembership) {\n return false;\n }\n\n const membership = await this.adapter.findMembership(userId, tenantId);\n return membership !== null && membership.status === 'active';\n }\n\n /**\n * Check if user has specific role in tenant\n */\n async hasRole(userId: string, tenantId: string, role: string): Promise<boolean> {\n if (!this.adapter.findMembership) {\n return false;\n }\n\n const membership = await this.adapter.findMembership(userId, tenantId);\n return membership !== null && membership.role === role && membership.status === 'active';\n }\n\n /**\n * Check if user is owner of tenant\n */\n async isOwner(userId: string, tenantId: string): Promise<boolean> {\n return this.hasRole(userId, tenantId, 'owner');\n }\n\n /**\n * Check if user is admin of tenant (owner or admin)\n */\n async isAdmin(userId: string, tenantId: string): Promise<boolean> {\n if (!this.adapter.findMembership) {\n return false;\n }\n\n const membership = await this.adapter.findMembership(userId, tenantId);\n if (!membership || membership.status !== 'active') {\n return false;\n }\n\n return membership.role === 'owner' || membership.role === 'admin';\n }\n\n // ============================================\n // Membership Operations\n // ============================================\n\n /**\n * Add a member to tenant\n */\n async addMember(input: AddMemberInput): Promise<AdapterMembership> {\n if (!this.adapter.createMembership) {\n throw new Error('Membership operations not supported by adapter');\n }\n\n // Check if already a member\n const existing = await this.adapter.findMembership?.(input.userId, input.tenantId);\n if (existing) {\n throw new Error('User is already a member of this tenant');\n }\n\n return this.adapter.createMembership({\n userId: input.userId,\n tenantId: input.tenantId,\n role: input.role,\n permissions: input.permissions,\n });\n }\n\n /**\n * Update member role/permissions\n */\n async updateMember(\n userId: string,\n tenantId: string,\n updates: UpdateMemberInput\n ): Promise<AdapterMembership> {\n if (!this.adapter.findMembership || !this.adapter.updateMembership) {\n throw new Error('Membership operations not supported by adapter');\n }\n\n const membership = await this.adapter.findMembership(userId, tenantId);\n if (!membership) {\n throw new Error('Membership not found');\n }\n\n return this.adapter.updateMembership(membership.id, updates);\n }\n\n /**\n * Remove member from tenant\n */\n async removeMember(userId: string, tenantId: string): Promise<void> {\n if (!this.adapter.findMembership || !this.adapter.deleteMembership) {\n throw new Error('Membership operations not supported by adapter');\n }\n\n const membership = await this.adapter.findMembership(userId, tenantId);\n if (!membership) {\n throw new Error('Membership not found');\n }\n\n // Prevent removing the last owner\n if (membership.role === 'owner') {\n const allMemberships = await this.getMembersByTenant(tenantId);\n const owners = allMemberships.filter(m => m.role === 'owner');\n if (owners.length <= 1) {\n throw new Error('Cannot remove the last owner of a tenant');\n }\n }\n\n await this.adapter.deleteMembership(membership.id);\n }\n\n /**\n * Get membership for user in tenant\n */\n async getMembership(userId: string, tenantId: string): Promise<AdapterMembership | null> {\n if (!this.adapter.findMembership) {\n return null;\n }\n return this.adapter.findMembership(userId, tenantId);\n }\n\n /**\n * Get all tenants for a user\n */\n async getUserTenants(userId: string): Promise<UserTenantMembership[]> {\n if (!this.adapter.findMembershipsByUserId) {\n return [];\n }\n\n const memberships = await this.adapter.findMembershipsByUserId(userId);\n\n // Enrich with tenant details\n const enriched = await Promise.all(\n memberships.map(async (membership) => {\n const tenant = await this.adapter.findTenantById?.(membership.tenantId);\n return {\n ...membership,\n tenant: tenant ?? undefined,\n };\n })\n );\n\n return enriched;\n }\n\n /**\n * Get all members of a tenant\n * Note: This requires iterating through users, which is not efficient\n * Consider adding findMembershipsByTenantId to the adapter\n */\n async getMembersByTenant(_tenantId: string): Promise<AdapterMembership[]> {\n // This is a placeholder - the adapter should implement this\n // For now, return empty array\n console.warn(\n 'getMembersByTenant: Consider implementing findMembershipsByTenantId in adapter'\n );\n return [];\n }\n\n /**\n * Transfer ownership to another member\n */\n async transferOwnership(\n tenantId: string,\n currentOwnerId: string,\n newOwnerId: string\n ): Promise<void> {\n if (!this.adapter.findMembership || !this.adapter.updateMembership) {\n throw new Error('Membership operations not supported by adapter');\n }\n\n // Verify current owner\n const currentOwnership = await this.adapter.findMembership(currentOwnerId, tenantId);\n if (!currentOwnership || currentOwnership.role !== 'owner') {\n throw new Error('Current user is not the owner');\n }\n\n // Verify new owner is a member\n const newOwnership = await this.adapter.findMembership(newOwnerId, tenantId);\n if (!newOwnership) {\n throw new Error('New owner must be an existing member');\n }\n\n // Update roles\n await this.adapter.updateMembership(newOwnership.id, { role: 'owner' });\n await this.adapter.updateMembership(currentOwnership.id, { role: 'admin' });\n }\n\n // ============================================\n // Tenant Switching\n // ============================================\n\n /**\n * Validate tenant switch\n * Returns the tenant if switch is allowed\n */\n async validateTenantSwitch(\n userId: string,\n targetTenantId: string\n ): Promise<{ tenant: AdapterTenant; membership: AdapterMembership }> {\n // Get tenant\n const tenant = await this.getTenantById(targetTenantId);\n if (!tenant) {\n throw new Error('Tenant not found');\n }\n\n // Check tenant status\n if (tenant.status !== 'active') {\n throw new Error('Tenant is not active');\n }\n\n // Check membership\n const membership = await this.getMembership(userId, targetTenantId);\n if (!membership) {\n throw new Error('User is not a member of this tenant');\n }\n\n if (membership.status !== 'active') {\n throw new Error('Membership is not active');\n }\n\n return { tenant, membership };\n }\n\n /**\n * Get default tenant for user\n * Returns the first active tenant membership\n */\n async getDefaultTenant(userId: string): Promise<UserTenantMembership | null> {\n const tenants = await this.getUserTenants(userId);\n\n // Find first active tenant\n const active = tenants.find(\n t => t.status === 'active' && t.tenant?.status === 'active'\n );\n\n return active ?? null;\n }\n\n // ============================================\n // Utility Methods\n // ============================================\n\n /**\n * Generate URL-friendly slug from name\n */\n private generateSlug(name: string): string {\n return name\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n }\n\n /**\n * Generate unique tenant slug\n */\n async generateUniqueSlug(name: string): Promise<string> {\n const baseSlug = this.generateSlug(name);\n let slug = baseSlug;\n let counter = 1;\n\n while (await this.adapter.findTenantBySlug?.(slug)) {\n slug = `${baseSlug}-${counter}`;\n counter++;\n }\n\n return slug;\n }\n}\n\n/**\n * Create a tenant manager\n */\nexport function createTenantManager(adapter: AuthAdapter): TenantManager {\n return new TenantManager(adapter);\n}\n","/**\n * Tenant Resolution\n * Extracts tenant from incoming requests using configurable strategies\n */\n\nimport type { TenantResolutionStrategy } from '../config.js';\n\n/**\n * Tenant resolver configuration\n */\nexport interface TenantResolverConfig {\n /** Resolution strategy */\n strategy: TenantResolutionStrategy;\n /** Header name for 'header' strategy (default: 'x-tenant-id') */\n headerName?: string;\n /** Path prefix for 'path' strategy (default: '/t/') */\n pathPrefix?: string;\n /** Query parameter name for 'query' strategy (default: 'tenant') */\n queryParam?: string;\n /** Custom resolver function for 'custom' strategy */\n resolver?: (request: Request) => Promise<string | null>;\n /** Fallback tenant ID when none is resolved */\n fallbackTenantId?: string;\n /** Whether tenant is required (default: false) */\n required?: boolean;\n}\n\n/**\n * Tenant resolution result\n */\nexport interface TenantResolutionResult {\n /** Resolved tenant ID */\n tenantId: string | null;\n /** Resolution method used */\n resolvedFrom: 'subdomain' | 'header' | 'path' | 'query' | 'custom' | 'fallback' | null;\n /** Original value before resolution */\n originalValue?: string;\n}\n\n/**\n * Tenant Resolver\n * Extracts tenant identifier from requests using various strategies\n */\nexport class TenantResolver {\n private config: Required<Omit<TenantResolverConfig, 'resolver' | 'fallbackTenantId'>> &\n Pick<TenantResolverConfig, 'resolver' | 'fallbackTenantId'>;\n\n constructor(config: TenantResolverConfig) {\n this.config = {\n headerName: 'x-tenant-id',\n pathPrefix: '/t/',\n queryParam: 'tenant',\n required: false,\n ...config,\n };\n }\n\n /**\n * Resolve tenant from request\n */\n async resolve(request: Request): Promise<TenantResolutionResult> {\n const { strategy } = this.config;\n\n let result: TenantResolutionResult = {\n tenantId: null,\n resolvedFrom: null,\n };\n\n switch (strategy) {\n case 'subdomain':\n result = this.resolveFromSubdomain(request);\n break;\n case 'header':\n result = this.resolveFromHeader(request);\n break;\n case 'path':\n result = this.resolveFromPath(request);\n break;\n case 'query':\n result = this.resolveFromQuery(request);\n break;\n case 'custom':\n result = await this.resolveFromCustom(request);\n break;\n }\n\n // Apply fallback if no tenant found\n if (!result.tenantId && this.config.fallbackTenantId) {\n result = {\n tenantId: this.config.fallbackTenantId,\n resolvedFrom: 'fallback',\n };\n }\n\n return result;\n }\n\n /**\n * Resolve tenant from subdomain\n * e.g., acme.example.com -> 'acme'\n */\n private resolveFromSubdomain(request: Request): TenantResolutionResult {\n const url = new URL(request.url);\n const host = url.hostname;\n\n // Split by dots and get first part\n const parts = host.split('.');\n\n // Need at least 3 parts for subdomain (tenant.example.com)\n // Or 2 parts for localhost (tenant.localhost)\n if (parts.length >= 3 || (parts.length === 2 && parts[1] === 'localhost')) {\n const subdomain = parts[0]!;\n\n // Skip common non-tenant subdomains\n const skipSubdomains = ['www', 'api', 'app', 'admin', 'mail', 'ftp'];\n if (!skipSubdomains.includes(subdomain.toLowerCase())) {\n return {\n tenantId: subdomain,\n resolvedFrom: 'subdomain',\n originalValue: subdomain,\n };\n }\n }\n\n return { tenantId: null, resolvedFrom: null };\n }\n\n /**\n * Resolve tenant from header\n * e.g., X-Tenant-ID: acme\n */\n private resolveFromHeader(request: Request): TenantResolutionResult {\n const headerValue = request.headers.get(this.config.headerName);\n\n if (headerValue) {\n return {\n tenantId: headerValue,\n resolvedFrom: 'header',\n originalValue: headerValue,\n };\n }\n\n return { tenantId: null, resolvedFrom: null };\n }\n\n /**\n * Resolve tenant from URL path\n * e.g., /t/acme/api/users -> 'acme'\n */\n private resolveFromPath(request: Request): TenantResolutionResult {\n const url = new URL(request.url);\n const pathname = url.pathname;\n const prefix = this.config.pathPrefix;\n\n if (pathname.startsWith(prefix)) {\n const rest = pathname.slice(prefix.length);\n const slashIndex = rest.indexOf('/');\n const tenantSlug = slashIndex > 0 ? rest.slice(0, slashIndex) : rest;\n\n if (tenantSlug) {\n return {\n tenantId: tenantSlug,\n resolvedFrom: 'path',\n originalValue: tenantSlug,\n };\n }\n }\n\n return { tenantId: null, resolvedFrom: null };\n }\n\n /**\n * Resolve tenant from query parameter\n * e.g., /api/users?tenant=acme -> 'acme'\n */\n private resolveFromQuery(request: Request): TenantResolutionResult {\n const url = new URL(request.url);\n const tenantId = url.searchParams.get(this.config.queryParam);\n\n if (tenantId) {\n return {\n tenantId,\n resolvedFrom: 'query',\n originalValue: tenantId,\n };\n }\n\n return { tenantId: null, resolvedFrom: null };\n }\n\n /**\n * Resolve tenant using custom resolver\n */\n private async resolveFromCustom(request: Request): Promise<TenantResolutionResult> {\n if (!this.config.resolver) {\n return { tenantId: null, resolvedFrom: null };\n }\n\n const tenantId = await this.config.resolver(request);\n\n if (tenantId) {\n return {\n tenantId,\n resolvedFrom: 'custom',\n originalValue: tenantId,\n };\n }\n\n return { tenantId: null, resolvedFrom: null };\n }\n\n /**\n * Check if tenant is required but not found\n */\n isRequired(): boolean {\n return this.config.required;\n }\n\n /**\n * Get the path without tenant prefix (for path strategy)\n */\n stripTenantFromPath(pathname: string): string {\n if (this.config.strategy !== 'path') {\n return pathname;\n }\n\n const prefix = this.config.pathPrefix;\n if (pathname.startsWith(prefix)) {\n const rest = pathname.slice(prefix.length);\n const slashIndex = rest.indexOf('/');\n if (slashIndex > 0) {\n return rest.slice(slashIndex);\n }\n return '/';\n }\n\n return pathname;\n }\n}\n\n/**\n * Create a tenant resolver\n */\nexport function createTenantResolver(config: TenantResolverConfig): TenantResolver {\n return new TenantResolver(config);\n}\n\n/**\n * Multi-strategy tenant resolver\n * Tries multiple strategies in order until one succeeds\n */\nexport class MultiStrategyTenantResolver {\n private resolvers: TenantResolver[];\n private fallbackTenantId?: string;\n\n constructor(\n strategies: TenantResolverConfig[],\n options?: { fallbackTenantId?: string }\n ) {\n this.resolvers = strategies.map(s => new TenantResolver(s));\n this.fallbackTenantId = options?.fallbackTenantId;\n }\n\n /**\n * Resolve tenant trying each strategy in order\n */\n async resolve(request: Request): Promise<TenantResolutionResult> {\n for (const resolver of this.resolvers) {\n const result = await resolver.resolve(request);\n if (result.tenantId) {\n return result;\n }\n }\n\n // Apply fallback if no tenant found\n if (this.fallbackTenantId) {\n return {\n tenantId: this.fallbackTenantId,\n resolvedFrom: 'fallback',\n };\n }\n\n return { tenantId: null, resolvedFrom: null };\n }\n}\n\n/**\n * Create a multi-strategy tenant resolver\n */\nexport function createMultiStrategyResolver(\n strategies: TenantResolverConfig[],\n options?: { fallbackTenantId?: string }\n): MultiStrategyTenantResolver {\n return new MultiStrategyTenantResolver(strategies, options);\n}\n","/**\n * Invitation System\n * Handles tenant invitations and membership requests\n */\n\nimport type { KVStorage } from '../storage/types.js';\nimport type { AuthAdapter, AdapterMembership, AdapterTenant } from '../config.js';\nimport { generateRandomHex, sha256Hex } from '../utils/crypto.js';\n\n/**\n * Invitation configuration\n */\nexport interface InvitationConfig {\n /** Base URL for invitation links */\n baseUrl: string;\n /** Invitation callback path (default: /auth/invitation) */\n callbackPath?: string;\n /** Token expiration in seconds (default: 604800 = 7 days) */\n expiresIn?: number;\n /** Token length in bytes (default: 32) */\n tokenLength?: number;\n}\n\n/**\n * Invitation record stored in KV\n */\nexport interface InvitationRecord {\n /** Unique invitation ID */\n id: string;\n /** Invited email address */\n email: string;\n /** Target tenant ID */\n tenantId: string;\n /** Role to assign */\n role: string;\n /** Permissions to assign */\n permissions?: string[];\n /** Who sent the invitation */\n invitedBy: string;\n /** Token hash for verification */\n tokenHash: string;\n /** Expiration timestamp */\n expiresAt: string;\n /** Status */\n status: 'pending' | 'accepted' | 'expired' | 'cancelled';\n /** When invitation was accepted */\n acceptedAt?: string;\n /** User ID who accepted (if different from invited email) */\n acceptedBy?: string;\n /** Created timestamp */\n createdAt: string;\n /** Custom message */\n message?: string;\n}\n\n/**\n * Send invitation input\n */\nexport interface SendInvitationInput {\n /** Email to invite */\n email: string;\n /** Tenant ID */\n tenantId: string;\n /** Role to assign */\n role: string;\n /** Permissions to assign */\n permissions?: string[];\n /** User ID sending the invitation */\n invitedBy: string;\n /** Optional message to include */\n message?: string;\n}\n\n/**\n * Send invitation result\n */\nexport interface SendInvitationResult {\n success: boolean;\n invitation?: InvitationRecord;\n invitationUrl?: string;\n token?: string;\n error?: string;\n}\n\n/**\n * Accept invitation input\n */\nexport interface AcceptInvitationInput {\n /** Invitation token */\n token: string;\n /** User ID accepting the invitation */\n userId: string;\n}\n\n/**\n * Accept invitation result\n */\nexport interface AcceptInvitationResult {\n success: boolean;\n membership?: AdapterMembership;\n tenant?: AdapterTenant;\n error?: string;\n}\n\n/**\n * Invitation status check result\n */\nexport interface InvitationStatusResult {\n valid: boolean;\n invitation?: InvitationRecord;\n tenant?: AdapterTenant;\n error?: string;\n}\n\n/**\n * Invitation Service\n */\nexport class InvitationService {\n private storage: KVStorage;\n private adapter: AuthAdapter;\n private config: Required<InvitationConfig>;\n\n constructor(\n storage: KVStorage,\n adapter: AuthAdapter,\n config: InvitationConfig\n ) {\n this.storage = storage;\n this.adapter = adapter;\n this.config = {\n callbackPath: '/auth/invitation',\n expiresIn: 604800, // 7 days\n tokenLength: 32,\n ...config,\n };\n }\n\n /**\n * Send an invitation to join a tenant\n */\n async sendInvitation(input: SendInvitationInput): Promise<SendInvitationResult> {\n const normalizedEmail = input.email.toLowerCase().trim();\n\n // Check if user is already a member\n const existingUser = await this.adapter.findUserByEmail(normalizedEmail);\n if (existingUser) {\n const membership = await this.adapter.findMembership?.(existingUser.id, input.tenantId);\n if (membership && membership.status === 'active') {\n return { success: false, error: 'User is already a member of this tenant' };\n }\n }\n\n // Check for existing pending invitation\n const existingInvitation = await this.getInvitationByEmail(normalizedEmail, input.tenantId);\n if (existingInvitation && existingInvitation.status === 'pending') {\n // Cancel old invitation\n await this.cancelInvitation(existingInvitation.id);\n }\n\n // Generate secure token\n const token = await generateRandomHex(this.config.tokenLength);\n const tokenHash = await sha256Hex(token);\n const id = await generateRandomHex(16);\n\n // Calculate expiration\n const expiresAt = new Date(Date.now() + this.config.expiresIn * 1000);\n\n // Create invitation record\n const invitation: InvitationRecord = {\n id,\n email: normalizedEmail,\n tenantId: input.tenantId,\n role: input.role,\n permissions: input.permissions,\n invitedBy: input.invitedBy,\n tokenHash,\n expiresAt: expiresAt.toISOString(),\n status: 'pending',\n createdAt: new Date().toISOString(),\n message: input.message,\n };\n\n // Store invitation\n await this.storage.set(\n `invitation:hash:${tokenHash}`,\n invitation,\n this.config.expiresIn\n );\n await this.storage.set(\n `invitation:id:${id}`,\n invitation,\n this.config.expiresIn\n );\n await this.storage.set(\n `invitation:email:${normalizedEmail}:${input.tenantId}`,\n id,\n this.config.expiresIn\n );\n\n // Build invitation URL\n const params = new URLSearchParams({ token });\n const invitationUrl = `${this.config.baseUrl}${this.config.callbackPath}?${params}`;\n\n return {\n success: true,\n invitation,\n invitationUrl,\n token,\n };\n }\n\n /**\n * Accept an invitation\n */\n async acceptInvitation(input: AcceptInvitationInput): Promise<AcceptInvitationResult> {\n const tokenHash = await sha256Hex(input.token);\n\n // Get invitation\n const invitation = await this.storage.get<InvitationRecord>(`invitation:hash:${tokenHash}`);\n\n if (!invitation) {\n return { success: false, error: 'Invalid or expired invitation' };\n }\n\n if (invitation.status !== 'pending') {\n return { success: false, error: `Invitation is ${invitation.status}` };\n }\n\n if (new Date(invitation.expiresAt) < new Date()) {\n // Mark as expired\n invitation.status = 'expired';\n await this.updateInvitation(invitation);\n return { success: false, error: 'Invitation has expired' };\n }\n\n // Check if user is already a member\n const existingMembership = await this.adapter.findMembership?.(\n input.userId,\n invitation.tenantId\n );\n if (existingMembership && existingMembership.status === 'active') {\n return { success: false, error: 'You are already a member of this tenant' };\n }\n\n // Create or update membership\n let membership: AdapterMembership;\n if (existingMembership) {\n // Reactivate existing membership\n membership = await this.adapter.updateMembership!(existingMembership.id, {\n role: invitation.role,\n permissions: invitation.permissions,\n status: 'active',\n });\n } else {\n // Create new membership\n membership = await this.adapter.createMembership!({\n userId: input.userId,\n tenantId: invitation.tenantId,\n role: invitation.role,\n permissions: invitation.permissions,\n });\n }\n\n // Mark invitation as accepted\n invitation.status = 'accepted';\n invitation.acceptedAt = new Date().toISOString();\n invitation.acceptedBy = input.userId;\n await this.updateInvitation(invitation);\n\n // Get tenant info\n const tenant = await this.adapter.findTenantById?.(invitation.tenantId);\n\n return {\n success: true,\n membership,\n tenant: tenant ?? undefined,\n };\n }\n\n /**\n * Check invitation status\n */\n async checkInvitation(token: string): Promise<InvitationStatusResult> {\n const tokenHash = await sha256Hex(token);\n\n const invitation = await this.storage.get<InvitationRecord>(`invitation:hash:${tokenHash}`);\n\n if (!invitation) {\n return { valid: false, error: 'Invalid or expired invitation' };\n }\n\n if (invitation.status !== 'pending') {\n return { valid: false, error: `Invitation is ${invitation.status}`, invitation };\n }\n\n if (new Date(invitation.expiresAt) < new Date()) {\n invitation.status = 'expired';\n await this.updateInvitation(invitation);\n return { valid: false, error: 'Invitation has expired', invitation };\n }\n\n // Get tenant info\n const tenant = await this.adapter.findTenantById?.(invitation.tenantId);\n\n return {\n valid: true,\n invitation,\n tenant: tenant ?? undefined,\n };\n }\n\n /**\n * Cancel an invitation\n */\n async cancelInvitation(invitationId: string): Promise<boolean> {\n const invitation = await this.storage.get<InvitationRecord>(`invitation:id:${invitationId}`);\n\n if (!invitation) {\n return false;\n }\n\n if (invitation.status !== 'pending') {\n return false;\n }\n\n invitation.status = 'cancelled';\n await this.updateInvitation(invitation);\n\n return true;\n }\n\n /**\n * Get invitation by ID\n */\n async getInvitationById(id: string): Promise<InvitationRecord | null> {\n return this.storage.get<InvitationRecord>(`invitation:id:${id}`);\n }\n\n /**\n * Get invitation by email and tenant\n */\n async getInvitationByEmail(\n email: string,\n tenantId: string\n ): Promise<InvitationRecord | null> {\n const normalizedEmail = email.toLowerCase().trim();\n const invitationId = await this.storage.get<string>(\n `invitation:email:${normalizedEmail}:${tenantId}`\n );\n\n if (!invitationId) {\n return null;\n }\n\n return this.getInvitationById(invitationId);\n }\n\n /**\n * Resend invitation (generates new token)\n */\n async resendInvitation(\n invitationId: string,\n invitedBy: string\n ): Promise<SendInvitationResult> {\n const invitation = await this.getInvitationById(invitationId);\n\n if (!invitation) {\n return { success: false, error: 'Invitation not found' };\n }\n\n if (invitation.status !== 'pending') {\n return { success: false, error: `Cannot resend ${invitation.status} invitation` };\n }\n\n // Cancel old invitation and create new one\n await this.cancelInvitation(invitationId);\n\n return this.sendInvitation({\n email: invitation.email,\n tenantId: invitation.tenantId,\n role: invitation.role,\n permissions: invitation.permissions,\n invitedBy,\n message: invitation.message,\n });\n }\n\n /**\n * Get pending invitations for a tenant\n * Note: This requires listing keys which may not be efficient for all storage backends\n */\n async getPendingInvitations(_tenantId: string): Promise<InvitationRecord[]> {\n // This is a placeholder - ideally the storage should support this\n // For now, return empty array\n console.warn(\n 'getPendingInvitations: Consider implementing list operation in storage'\n );\n return [];\n }\n\n /**\n * Update invitation record\n */\n private async updateInvitation(invitation: InvitationRecord): Promise<void> {\n const ttl = Math.max(\n 0,\n Math.floor((new Date(invitation.expiresAt).getTime() - Date.now()) / 1000)\n );\n\n await this.storage.set(`invitation:id:${invitation.id}`, invitation, ttl || 300);\n await this.storage.set(\n `invitation:hash:${invitation.tokenHash}`,\n invitation,\n ttl || 300\n );\n }\n}\n\n/**\n * Create invitation service\n */\nexport function createInvitationService(\n storage: KVStorage,\n adapter: AuthAdapter,\n config: InvitationConfig\n): InvitationService {\n return new InvitationService(storage, adapter, config);\n}\n","/**\n * Pars Auth Engine\n * Main orchestrator for authentication\n */\n\nimport type { KVStorage } from '../storage/types.js';\nimport type {\n ParsAuthConfig,\n AuthAdapter,\n AdapterUser,\n AdapterSession,\n AdapterMembership,\n AdapterTenant,\n AuthCallbacks,\n} from '../config.js';\nimport { mergeConfig, validateConfig } from '../config.js';\nimport { createStorage } from '../storage/index.js';\nimport { ProviderRegistry, type ProviderInfo } from '../providers/index.js';\nimport { OTPProvider, type RequestOTPInput, type RequestOTPResult } from '../providers/otp/index.js';\nimport {\n JwtManager,\n SessionBlocklist,\n type TokenPair,\n type JwtPayload,\n} from '../session/index.js';\nimport { TenantManager, createTenantManager } from './tenant-manager.js';\nimport { TenantResolver, createTenantResolver, type TenantResolutionResult } from './tenant-resolver.js';\nimport { InvitationService, createInvitationService, type SendInvitationResult, type AcceptInvitationResult } from './invitation.js';\n\n/**\n * Auth context passed to handlers\n */\nexport interface AuthContext {\n userId?: string;\n sessionId?: string;\n tenantId?: string;\n payload?: JwtPayload;\n}\n\n/**\n * Sign in input\n */\nexport interface SignInInput {\n /** Provider name (e.g., 'otp', 'password', 'google') */\n provider: string;\n /** Identifier (email, phone, etc.) */\n identifier: string;\n /** Credential (OTP code, password, etc.) */\n credential?: string;\n /** Provider-specific data */\n data?: Record<string, unknown>;\n /** Request metadata */\n metadata?: {\n ipAddress?: string;\n userAgent?: string;\n deviceType?: string;\n deviceName?: string;\n tenantId?: string;\n };\n}\n\n/**\n * Sign in result\n */\nexport interface SignInResult {\n success: boolean;\n user?: AdapterUser;\n session?: AdapterSession;\n tokens?: TokenPair;\n requiresTwoFactor?: boolean;\n twoFactorChallengeId?: string;\n error?: string;\n errorCode?: string;\n}\n\n/**\n * Sign up input\n */\nexport interface SignUpInput {\n /** Email address */\n email?: string;\n /** Phone number */\n phone?: string;\n /** Display name */\n name?: string;\n /** Avatar URL */\n avatar?: string;\n /** Request metadata */\n metadata?: {\n ipAddress?: string;\n userAgent?: string;\n tenantId?: string;\n };\n}\n\n/**\n * Sign up result\n */\nexport interface SignUpResult {\n success: boolean;\n user?: AdapterUser;\n session?: AdapterSession;\n tokens?: TokenPair;\n requiresVerification?: boolean;\n error?: string;\n errorCode?: string;\n}\n\n/**\n * Verify token result\n */\nexport interface VerifyTokenResult {\n valid: boolean;\n payload?: JwtPayload;\n error?: string;\n}\n\n/**\n * Refresh token result\n */\nexport interface RefreshTokenResult {\n success: boolean;\n tokens?: TokenPair;\n error?: string;\n}\n\n/**\n * Session info\n */\nexport interface SessionInfo {\n id: string;\n userId: string;\n tenantId?: string;\n deviceType?: string;\n deviceName?: string;\n ipAddress?: string;\n createdAt: Date;\n expiresAt: Date;\n isCurrent: boolean;\n}\n\n/**\n * Pars Auth Engine\n */\nexport class ParsAuthEngine {\n private config: Required<ParsAuthConfig>;\n private storage!: KVStorage;\n private providers: ProviderRegistry;\n private jwtManager: JwtManager;\n private sessionBlocklist!: SessionBlocklist;\n private adapter: AuthAdapter;\n private callbacks: AuthCallbacks;\n private initialized = false;\n\n // Multi-tenant components\n private tenantManager!: TenantManager;\n private tenantResolver?: TenantResolver;\n private invitationService?: InvitationService;\n\n constructor(config: ParsAuthConfig) {\n // Validate and merge config\n validateConfig(config);\n this.config = mergeConfig(config);\n\n this.adapter = config.adapter;\n this.callbacks = config.callbacks ?? {};\n\n // Initialize provider registry\n this.providers = new ProviderRegistry();\n\n // Initialize JWT manager\n const sessionConfig = this.config.session;\n const jwtIssuer = this.config.jwt.issuer;\n const issuer = Array.isArray(jwtIssuer) ? jwtIssuer[0] ?? 'pars-auth' : jwtIssuer ?? 'pars-auth';\n const jwtAudience = this.config.jwt.audience;\n const audience = Array.isArray(jwtAudience) ? jwtAudience[0] ?? 'pars-client' : jwtAudience ?? 'pars-client';\n this.jwtManager = new JwtManager({\n secret: this.config.secret,\n issuer,\n audience,\n accessTokenTTL: `${sessionConfig.accessTokenExpiry}s`,\n refreshTokenTTL: `${sessionConfig.refreshTokenExpiry}s`,\n });\n }\n\n /**\n * Initialize the auth engine (async operations)\n * Must be called before using the engine\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Initialize storage\n this.storage = await createStorage(this.config.storage);\n\n // Initialize blocklist\n this.sessionBlocklist = new SessionBlocklist(this.storage);\n\n // Register OTP provider if enabled\n if (this.config.providers.otp?.enabled !== false) {\n const otpProvider = new OTPProvider(this.storage, this.config.providers.otp!);\n this.providers.register(otpProvider);\n }\n\n // Register other providers here as they are implemented\n // Magic Link, OAuth, Password, etc.\n\n // Initialize multi-tenant components\n this.tenantManager = createTenantManager(this.adapter);\n\n // Initialize tenant resolver if tenant config is provided\n if (this.config.tenant?.enabled !== false) {\n this.tenantResolver = createTenantResolver({\n strategy: this.config.tenant.strategy ?? 'header',\n headerName: this.config.tenant.headerName ?? 'x-tenant-id',\n });\n }\n\n // Initialize invitation service if baseUrl is provided\n if (this.config.baseUrl) {\n this.invitationService = createInvitationService(\n this.storage,\n this.adapter,\n { baseUrl: this.config.baseUrl }\n );\n }\n\n this.initialized = true;\n }\n\n /**\n * Ensure engine is initialized\n */\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error('[Pars Auth] Engine not initialized. Call initialize() first.');\n }\n }\n\n /**\n * Get all registered providers\n */\n getProviders(): ProviderInfo[] {\n return this.providers.getEnabled().map((p) => p.getInfo());\n }\n\n /**\n * Check if a provider is enabled\n */\n isProviderEnabled(name: string): boolean {\n const provider = this.providers.get(name);\n return provider?.enabled ?? false;\n }\n\n /**\n * Request OTP (for OTP provider)\n */\n async requestOTP(input: RequestOTPInput): Promise<RequestOTPResult> {\n this.ensureInitialized();\n\n const otpProvider = this.providers.get('otp') as OTPProvider | undefined;\n if (!otpProvider) {\n return {\n success: false,\n error: 'OTP provider not enabled',\n };\n }\n\n return otpProvider.requestOTP(input);\n }\n\n /**\n * Sign in with any provider\n */\n async signIn(input: SignInInput): Promise<SignInResult> {\n this.ensureInitialized();\n\n const { provider: providerName, identifier, credential, data, metadata } = input;\n\n // Get provider\n const provider = this.providers.get(providerName);\n if (!provider) {\n return {\n success: false,\n error: `Provider '${providerName}' not found`,\n errorCode: 'PROVIDER_NOT_FOUND',\n };\n }\n\n if (!provider.enabled) {\n return {\n success: false,\n error: `Provider '${providerName}' is not enabled`,\n errorCode: 'PROVIDER_DISABLED',\n };\n }\n\n // Authenticate with provider\n const authResult = await provider.authenticate({\n identifier,\n credential: credential ?? '',\n data,\n });\n\n if (!authResult.success) {\n return {\n success: false,\n error: authResult.error,\n errorCode: authResult.errorCode,\n };\n }\n\n // Find or create user\n let user = await this.findUserByIdentifier(identifier, providerName);\n\n if (!user) {\n // Auto-create user if verified via OTP\n if (providerName === 'otp') {\n const otpType = data?.['type'] as 'email' | 'sms' | undefined;\n const createResult = await this.signUp({\n email: otpType === 'email' || !otpType ? identifier : undefined,\n phone: otpType === 'sms' ? identifier : undefined,\n metadata,\n });\n\n if (!createResult.success) {\n return {\n success: false,\n error: createResult.error,\n errorCode: createResult.errorCode,\n };\n }\n\n user = createResult.user!;\n } else {\n return {\n success: false,\n error: 'User not found',\n errorCode: 'USER_NOT_FOUND',\n };\n }\n }\n\n // Validate sign in via callback\n if (this.callbacks.validateSignIn) {\n const allowed = await this.callbacks.validateSignIn(user);\n if (!allowed) {\n return {\n success: false,\n error: 'Sign in not allowed',\n errorCode: 'SIGN_IN_REJECTED',\n };\n }\n }\n\n // Check if 2FA is required\n if (user.twoFactorEnabled && providerName !== 'totp') {\n // TODO: Implement 2FA challenge flow\n return {\n success: true,\n user,\n requiresTwoFactor: true,\n twoFactorChallengeId: '', // Generate challenge ID\n };\n }\n\n // Create session\n const session = await this.createSession(user.id, metadata);\n if (!session) {\n return {\n success: false,\n error: 'Failed to create session',\n errorCode: 'SESSION_CREATE_FAILED',\n };\n }\n\n // Generate tokens\n const tokens = await this.jwtManager.generateTokenPair({\n userId: user.id,\n tenantId: metadata?.tenantId,\n sessionId: session.id,\n });\n\n // Call callback\n if (this.callbacks.onSignIn) {\n await this.callbacks.onSignIn(user, session);\n }\n\n return {\n success: true,\n user,\n session,\n tokens,\n };\n }\n\n /**\n * Sign up a new user\n */\n async signUp(input: SignUpInput): Promise<SignUpResult> {\n this.ensureInitialized();\n\n const { email, phone, name, avatar, metadata } = input;\n\n if (!email && !phone) {\n return {\n success: false,\n error: 'Email or phone is required',\n errorCode: 'INVALID_INPUT',\n };\n }\n\n // Check if user already exists\n if (email) {\n const existing = await this.adapter.findUserByEmail(email);\n if (existing) {\n return {\n success: false,\n error: 'User with this email already exists',\n errorCode: 'USER_EXISTS',\n };\n }\n }\n\n if (phone) {\n const existing = await this.adapter.findUserByPhone(phone);\n if (existing) {\n return {\n success: false,\n error: 'User with this phone already exists',\n errorCode: 'USER_EXISTS',\n };\n }\n }\n\n // Create user\n const user = await this.adapter.createUser({\n email,\n phone,\n name,\n avatar,\n emailVerified: !!email, // OTP verification counts as email verification\n phoneVerified: !!phone,\n });\n\n // Create session\n const session = await this.createSession(user.id, metadata);\n\n // Generate tokens\n const tokens = session\n ? await this.jwtManager.generateTokenPair({\n userId: user.id,\n tenantId: metadata?.tenantId,\n sessionId: session.id,\n })\n : undefined;\n\n // Call callback\n if (this.callbacks.onSignUp) {\n await this.callbacks.onSignUp(user);\n }\n\n return {\n success: true,\n user,\n session: session ?? undefined,\n tokens,\n };\n }\n\n /**\n * Sign out (revoke session)\n */\n async signOut(\n sessionId: string,\n options?: { revokeAll?: boolean; userId?: string }\n ): Promise<void> {\n this.ensureInitialized();\n\n if (options?.revokeAll && options?.userId) {\n // Revoke all sessions for user\n const sessions = await this.adapter.findSessionsByUserId(options.userId);\n await this.adapter.deleteSessionsByUserId(options.userId);\n\n // Add all to blocklist\n const tokenExpiry = new Date(\n Date.now() + this.config.session.refreshTokenExpiry! * 1000\n );\n await this.sessionBlocklist.blockAllUserSessions(\n options.userId,\n sessions.map((s) => s.id),\n tokenExpiry,\n 'Sign out all'\n );\n\n // Call callback for each\n if (this.callbacks.onSignOut) {\n for (const session of sessions) {\n await this.callbacks.onSignOut(options.userId, session.id);\n }\n }\n } else {\n // Revoke single session\n const session = await this.adapter.findSessionById(sessionId);\n if (session) {\n await this.adapter.deleteSession(sessionId);\n\n // Add to blocklist until refresh token expires\n const tokenExpiry = new Date(\n Date.now() + this.config.session.refreshTokenExpiry! * 1000\n );\n await this.sessionBlocklist.blockSession(sessionId, tokenExpiry, {\n reason: 'Sign out',\n userId: session.userId,\n });\n\n // Call callback\n if (this.callbacks.onSignOut) {\n await this.callbacks.onSignOut(session.userId, sessionId);\n }\n }\n }\n }\n\n /**\n * Verify access token\n */\n async verifyAccessToken(token: string): Promise<VerifyTokenResult> {\n this.ensureInitialized();\n\n try {\n const payload = await this.jwtManager.verifyAccessToken(token);\n\n // Check if session is blocked\n if (payload.sid) {\n const isBlocked = await this.sessionBlocklist.isBlocked(payload.sid);\n if (isBlocked) {\n return {\n valid: false,\n error: 'Session has been revoked',\n };\n }\n }\n\n return {\n valid: true,\n payload,\n };\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Invalid token',\n };\n }\n }\n\n /**\n * Refresh tokens\n */\n async refreshTokens(refreshToken: string): Promise<RefreshTokenResult> {\n this.ensureInitialized();\n\n try {\n // Verify refresh token\n const { userId, sessionId, tenantId } =\n await this.jwtManager.verifyRefreshToken(refreshToken);\n\n // Check if session is blocked\n if (sessionId) {\n const isBlocked = await this.sessionBlocklist.isBlocked(sessionId);\n if (isBlocked) {\n return {\n success: false,\n error: 'Session has been revoked',\n };\n }\n }\n\n // Check if session exists and is active\n if (sessionId) {\n const session = await this.adapter.findSessionById(sessionId);\n if (!session || session.status !== 'active') {\n return {\n success: false,\n error: 'Session not found or inactive',\n };\n }\n\n // Update session if sliding window is enabled\n if (this.config.session.slidingWindow) {\n const newExpiresAt = new Date(\n Date.now() + this.config.session.refreshTokenExpiry! * 1000\n );\n await this.adapter.updateSession(sessionId, {\n expiresAt: newExpiresAt,\n });\n }\n }\n\n // Generate new token pair\n const tokens = await this.jwtManager.generateTokenPair({\n userId,\n tenantId,\n sessionId,\n });\n\n return {\n success: true,\n tokens,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Invalid refresh token',\n };\n }\n }\n\n /**\n * Get user sessions\n */\n async getSessions(\n userId: string,\n currentSessionId?: string\n ): Promise<SessionInfo[]> {\n this.ensureInitialized();\n\n const sessions = await this.adapter.findSessionsByUserId(userId);\n\n return sessions\n .filter((s) => s.status === 'active')\n .map((s) => ({\n id: s.id,\n userId: s.userId,\n tenantId: s.tenantId ?? undefined,\n deviceType: s.deviceType ?? undefined,\n deviceName: s.deviceName ?? undefined,\n ipAddress: s.ipAddress ?? undefined,\n createdAt: s.createdAt,\n expiresAt: s.expiresAt,\n isCurrent: s.id === currentSessionId,\n }));\n }\n\n /**\n * Revoke a specific session\n */\n async revokeSession(sessionId: string): Promise<void> {\n await this.signOut(sessionId);\n }\n\n /**\n * Revoke all sessions for a user\n */\n async revokeAllSessions(userId: string): Promise<void> {\n await this.signOut('', { revokeAll: true, userId });\n }\n\n /**\n * Get the underlying storage instance\n */\n getStorage(): KVStorage {\n this.ensureInitialized();\n return this.storage;\n }\n\n /**\n * Get the JWT manager\n */\n getJwtManager(): JwtManager {\n return this.jwtManager;\n }\n\n /**\n * Get the database adapter\n */\n getAdapter(): AuthAdapter {\n return this.adapter;\n }\n\n /**\n * Get configuration\n */\n getConfig(): Required<ParsAuthConfig> {\n return this.config;\n }\n\n /**\n * Find user by identifier based on provider\n */\n private async findUserByIdentifier(\n identifier: string,\n provider: string\n ): Promise<AdapterUser | null> {\n switch (provider) {\n case 'otp':\n // Could be email or phone, try both\n const userByEmail = await this.adapter.findUserByEmail(identifier);\n if (userByEmail) return userByEmail;\n return this.adapter.findUserByPhone(identifier);\n\n case 'password':\n return this.adapter.findUserByEmail(identifier);\n\n default:\n // For OAuth and others, look up by auth method\n const authMethod = await this.adapter.findAuthMethod(provider, identifier);\n if (authMethod) {\n return this.adapter.findUserById(authMethod.userId);\n }\n return null;\n }\n }\n\n /**\n * Create a new session\n */\n private async createSession(\n userId: string,\n metadata?: {\n ipAddress?: string;\n userAgent?: string;\n deviceType?: string;\n deviceName?: string;\n tenantId?: string;\n }\n ): Promise<AdapterSession | null> {\n // Check max sessions limit\n const existingSessions = await this.adapter.findSessionsByUserId(userId);\n const activeSessions = existingSessions.filter((s) => s.status === 'active');\n\n if (activeSessions.length >= this.config.session.maxSessions!) {\n // Remove oldest session\n const oldest = activeSessions.sort(\n (a, b) => a.createdAt.getTime() - b.createdAt.getTime()\n )[0];\n if (oldest) {\n await this.adapter.deleteSession(oldest.id);\n // Block the old session\n await this.sessionBlocklist.blockSession(\n oldest.id,\n new Date(Date.now() + this.config.session.refreshTokenExpiry! * 1000),\n { reason: 'Session limit reached', userId }\n );\n }\n }\n\n const expiresAt = new Date(\n Date.now() + this.config.session.accessTokenExpiry! * 1000\n );\n const refreshExpiresAt = new Date(\n Date.now() + this.config.session.refreshTokenExpiry! * 1000\n );\n\n const session = await this.adapter.createSession({\n userId,\n tenantId: metadata?.tenantId,\n expiresAt,\n refreshExpiresAt,\n deviceType: metadata?.deviceType,\n deviceName: metadata?.deviceName,\n userAgent: metadata?.userAgent,\n ipAddress: metadata?.ipAddress,\n });\n\n // Call callback\n if (this.callbacks.onSessionCreated) {\n await this.callbacks.onSessionCreated({ id: session.id, userId });\n }\n\n return session;\n }\n\n // ============================================\n // MULTI-TENANT OPERATIONS\n // ============================================\n\n /**\n * Resolve tenant from request\n */\n async resolveTenant(request: Request): Promise<TenantResolutionResult> {\n this.ensureInitialized();\n\n if (!this.tenantResolver) {\n return { tenantId: null, resolvedFrom: null };\n }\n\n return this.tenantResolver.resolve(request);\n }\n\n /**\n * Switch current session to a different tenant\n */\n async switchTenant(\n sessionId: string,\n targetTenantId: string\n ): Promise<{ success: boolean; tokens?: TokenPair; error?: string }> {\n this.ensureInitialized();\n\n // Get current session\n const session = await this.adapter.findSessionById(sessionId);\n if (!session) {\n return { success: false, error: 'Session not found' };\n }\n\n // Validate tenant switch\n try {\n await this.tenantManager.validateTenantSwitch(session.userId, targetTenantId);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Tenant switch not allowed',\n };\n }\n\n // Update session with new tenant\n await this.adapter.updateSession(sessionId, {\n tenantId: targetTenantId,\n });\n\n // Generate new tokens with new tenant context\n const tokens = await this.jwtManager.generateTokenPair({\n userId: session.userId,\n tenantId: targetTenantId,\n sessionId: session.id,\n });\n\n return { success: true, tokens };\n }\n\n /**\n * Get all tenants for current user\n */\n async getUserTenants(userId: string): Promise<Array<{\n tenant: AdapterTenant;\n membership: AdapterMembership;\n }>> {\n this.ensureInitialized();\n\n const memberships = await this.tenantManager.getUserTenants(userId);\n\n return memberships\n .filter((m) => m.tenant && m.status === 'active')\n .map((m) => ({\n tenant: m.tenant!,\n membership: m,\n }));\n }\n\n /**\n * Check if user is member of tenant\n */\n async isTenantMember(userId: string, tenantId: string): Promise<boolean> {\n this.ensureInitialized();\n return this.tenantManager.isMember(userId, tenantId);\n }\n\n /**\n * Check if user has role in tenant\n */\n async hasRoleInTenant(\n userId: string,\n tenantId: string,\n role: string\n ): Promise<boolean> {\n this.ensureInitialized();\n return this.tenantManager.hasRole(userId, tenantId, role);\n }\n\n /**\n * Get user's membership in a tenant\n */\n async getTenantMembership(\n userId: string,\n tenantId: string\n ): Promise<AdapterMembership | null> {\n this.ensureInitialized();\n return this.tenantManager.getMembership(userId, tenantId);\n }\n\n /**\n * Add member to tenant\n */\n async addTenantMember(input: {\n userId: string;\n tenantId: string;\n role: string;\n permissions?: string[];\n }): Promise<AdapterMembership> {\n this.ensureInitialized();\n return this.tenantManager.addMember(input);\n }\n\n /**\n * Update member's role/permissions in tenant\n */\n async updateTenantMember(\n userId: string,\n tenantId: string,\n updates: { role?: string; permissions?: string[]; status?: 'active' | 'inactive' }\n ): Promise<AdapterMembership> {\n this.ensureInitialized();\n return this.tenantManager.updateMember(userId, tenantId, updates);\n }\n\n /**\n * Remove member from tenant\n */\n async removeTenantMember(userId: string, tenantId: string): Promise<void> {\n this.ensureInitialized();\n return this.tenantManager.removeMember(userId, tenantId);\n }\n\n /**\n * Send invitation to join tenant\n */\n async inviteToTenant(input: {\n email: string;\n tenantId: string;\n role: string;\n permissions?: string[];\n invitedBy: string;\n message?: string;\n }): Promise<SendInvitationResult> {\n this.ensureInitialized();\n\n if (!this.invitationService) {\n return { success: false, error: 'Invitation service not configured. Set baseUrl in config.' };\n }\n\n return this.invitationService.sendInvitation(input);\n }\n\n /**\n * Accept an invitation\n */\n async acceptInvitation(\n token: string,\n userId: string\n ): Promise<AcceptInvitationResult> {\n this.ensureInitialized();\n\n if (!this.invitationService) {\n return { success: false, error: 'Invitation service not configured' };\n }\n\n return this.invitationService.acceptInvitation({ token, userId });\n }\n\n /**\n * Check invitation status\n */\n async checkInvitation(token: string): Promise<{\n valid: boolean;\n tenantName?: string;\n role?: string;\n email?: string;\n error?: string;\n }> {\n this.ensureInitialized();\n\n if (!this.invitationService) {\n return { valid: false, error: 'Invitation service not configured' };\n }\n\n const result = await this.invitationService.checkInvitation(token);\n\n if (!result.valid) {\n return { valid: false, error: result.error };\n }\n\n return {\n valid: true,\n tenantName: result.tenant?.name,\n role: result.invitation?.role,\n email: result.invitation?.email,\n };\n }\n\n /**\n * Get tenant manager instance\n */\n getTenantManager(): TenantManager {\n this.ensureInitialized();\n return this.tenantManager;\n }\n\n /**\n * Get invitation service instance\n */\n getInvitationService(): InvitationService | undefined {\n this.ensureInitialized();\n return this.invitationService;\n }\n\n /**\n * Get tenant resolver instance\n */\n getTenantResolver(): TenantResolver | undefined {\n return this.tenantResolver;\n }\n}\n\n/**\n * Create a Pars Auth Engine instance\n */\nexport function createAuthEngine(config: ParsAuthConfig): ParsAuthEngine {\n return new ParsAuthEngine(config);\n}\n","/**\n * Google OAuth Provider\n */\n\nimport type { OAuthProvider, OAuthUserInfo, OAuthTokens, GoogleConfig } from './types.js';\n\nexport class GoogleProvider implements OAuthProvider {\n readonly name = 'google';\n private config: GoogleConfig;\n\n constructor(config: GoogleConfig) {\n this.config = config;\n }\n\n async getAuthorizationUrl(state: string, codeChallenge?: string): Promise<string> {\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 state,\n access_type: 'offline',\n prompt: 'consent',\n });\n\n if (codeChallenge) {\n params.set('code_challenge', codeChallenge);\n params.set('code_challenge_method', 'S256');\n }\n\n return `https://accounts.google.com/o/oauth2/v2/auth?${params}`;\n }\n\n async exchangeCode(code: string, codeVerifier?: string): Promise<OAuthTokens> {\n const params: Record<string, string> = {\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 if (codeVerifier) {\n params['code_verifier'] = codeVerifier;\n }\n\n const response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams(params),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google token exchange failed: ${error}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n accessToken: data['access_token'] as string,\n refreshToken: data['refresh_token'] as string | undefined,\n expiresIn: data['expires_in'] as number | undefined,\n idToken: data['id_token'] as string | undefined,\n tokenType: data['token_type'] as string | undefined,\n scope: data['scope'] as string | undefined,\n };\n }\n\n async getUserInfo(accessToken: string): Promise<OAuthUserInfo> {\n const response = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch Google user info');\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n id: data['sub'] as string,\n email: data['email'] as string,\n name: data['name'] as string | undefined,\n avatarUrl: data['picture'] as string | undefined,\n emailVerified: (data['email_verified'] as boolean) ?? false,\n raw: data,\n };\n }\n\n async refreshToken(refreshToken: string): Promise<OAuthTokens> {\n const response = await 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 if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google token refresh failed: ${error}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n accessToken: data['access_token'] as string,\n refreshToken: (data['refresh_token'] as string | undefined) ?? refreshToken,\n expiresIn: data['expires_in'] as number | undefined,\n idToken: data['id_token'] as string | undefined,\n tokenType: data['token_type'] as string | undefined,\n scope: data['scope'] as string | undefined,\n };\n }\n}\n","/**\n * GitHub OAuth Provider\n */\n\nimport type { OAuthProvider, OAuthUserInfo, OAuthTokens, GitHubConfig } from './types.js';\n\nexport class GitHubProvider implements OAuthProvider {\n readonly name = 'github';\n private config: GitHubConfig;\n\n constructor(config: GitHubConfig) {\n this.config = config;\n }\n\n async getAuthorizationUrl(state: string, _codeChallenge?: string): Promise<string> {\n const params = new URLSearchParams({\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n scope: this.config.scopes?.join(' ') ?? 'read:user user:email',\n state,\n });\n\n return `https://github.com/login/oauth/authorize?${params}`;\n }\n\n async exchangeCode(code: string, _codeVerifier?: string): Promise<OAuthTokens> {\n const response = await fetch('https://github.com/login/oauth/access_token', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify({\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n code,\n redirect_uri: this.config.redirectUri,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`GitHub token exchange failed: ${error}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (data['error']) {\n throw new Error(`GitHub OAuth error: ${data['error_description'] ?? data['error']}`);\n }\n\n return {\n accessToken: data['access_token'] as string,\n tokenType: data['token_type'] as string | undefined,\n scope: data['scope'] as string | undefined,\n };\n }\n\n async getUserInfo(accessToken: string): Promise<OAuthUserInfo> {\n // Get user profile\n const userResponse = await fetch('https://api.github.com/user', {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n Accept: 'application/vnd.github.v3+json',\n },\n });\n\n if (!userResponse.ok) {\n throw new Error('Failed to fetch GitHub user info');\n }\n\n const userData = (await userResponse.json()) as Record<string, unknown>;\n\n // Get user emails (may need user:email scope)\n let email = userData['email'] as string | null;\n let emailVerified = false;\n\n if (!email) {\n try {\n const emailsResponse = await fetch('https://api.github.com/user/emails', {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n Accept: 'application/vnd.github.v3+json',\n },\n });\n\n if (emailsResponse.ok) {\n const emails = (await emailsResponse.json()) as Array<{\n email: string;\n primary: boolean;\n verified: boolean;\n }>;\n\n const primaryEmail = emails.find((e) => e.primary && e.verified);\n if (primaryEmail) {\n email = primaryEmail.email;\n emailVerified = primaryEmail.verified;\n }\n }\n } catch {\n // Email fetch failed, continue without\n }\n }\n\n return {\n id: String(userData['id']),\n email: email ?? '',\n name: (userData['name'] as string) ?? (userData['login'] as string),\n avatarUrl: userData['avatar_url'] as string | undefined,\n emailVerified,\n raw: userData,\n };\n }\n}\n","/**\n * Microsoft OAuth Provider\n */\n\nimport type { OAuthProvider, OAuthUserInfo, OAuthTokens, MicrosoftConfig } from './types.js';\n\nexport class MicrosoftProvider implements OAuthProvider {\n readonly name = 'microsoft';\n private config: MicrosoftConfig;\n private baseUrl: string;\n\n constructor(config: MicrosoftConfig) {\n this.config = config;\n // Use tenant-specific or common endpoint\n const tenant = config.tenantId ?? 'common';\n this.baseUrl = `https://login.microsoftonline.com/${tenant}/oauth2/v2.0`;\n }\n\n async getAuthorizationUrl(state: string, codeChallenge?: string): Promise<string> {\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 User.Read',\n state,\n response_mode: 'query',\n });\n\n if (codeChallenge) {\n params.set('code_challenge', codeChallenge);\n params.set('code_challenge_method', 'S256');\n }\n\n return `${this.baseUrl}/authorize?${params}`;\n }\n\n async exchangeCode(code: string, codeVerifier?: string): Promise<OAuthTokens> {\n const params: Record<string, string> = {\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 if (codeVerifier) {\n params['code_verifier'] = codeVerifier;\n }\n\n const response = await fetch(`${this.baseUrl}/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams(params),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Microsoft token exchange failed: ${error}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n accessToken: data['access_token'] as string,\n refreshToken: data['refresh_token'] as string | undefined,\n expiresIn: data['expires_in'] as number | undefined,\n idToken: data['id_token'] as string | undefined,\n tokenType: data['token_type'] as string | undefined,\n scope: data['scope'] as string | undefined,\n };\n }\n\n async getUserInfo(accessToken: string): Promise<OAuthUserInfo> {\n const response = await fetch('https://graph.microsoft.com/v1.0/me', {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch Microsoft user info');\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n id: data['id'] as string,\n email: (data['mail'] as string) ?? (data['userPrincipalName'] as string),\n name: data['displayName'] as string | undefined,\n avatarUrl: undefined, // Would need separate call to get photo\n emailVerified: true, // Microsoft accounts are verified\n raw: data,\n };\n }\n\n async refreshToken(refreshToken: string): Promise<OAuthTokens> {\n const response = await fetch(`${this.baseUrl}/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 scope: this.config.scopes?.join(' ') ?? 'openid email profile User.Read',\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Microsoft token refresh failed: ${error}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n accessToken: data['access_token'] as string,\n refreshToken: (data['refresh_token'] as string | undefined) ?? refreshToken,\n expiresIn: data['expires_in'] as number | undefined,\n idToken: data['id_token'] as string | undefined,\n tokenType: data['token_type'] as string | undefined,\n scope: data['scope'] as string | undefined,\n };\n }\n}\n","/**\n * Apple OAuth Provider\n * Uses Sign in with Apple\n */\n\nimport type { OAuthProvider, OAuthUserInfo, OAuthTokens, AppleConfig } from './types.js';\n\nexport class AppleProvider implements OAuthProvider {\n readonly name = 'apple';\n private config: AppleConfig;\n\n constructor(config: AppleConfig) {\n this.config = config;\n }\n\n async getAuthorizationUrl(state: string, _codeChallenge?: string): Promise<string> {\n const params = new URLSearchParams({\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n response_type: 'code id_token',\n response_mode: 'form_post',\n scope: this.config.scopes?.join(' ') ?? 'name email',\n state,\n });\n\n return `https://appleid.apple.com/auth/authorize?${params}`;\n }\n\n async exchangeCode(code: string, _codeVerifier?: string): Promise<OAuthTokens> {\n const clientSecret = await this.generateClientSecret();\n\n const params = new URLSearchParams({\n client_id: this.config.clientId,\n client_secret: clientSecret,\n code,\n grant_type: 'authorization_code',\n redirect_uri: this.config.redirectUri,\n });\n\n const response = await fetch('https://appleid.apple.com/auth/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: params,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Apple token exchange failed: ${error}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n accessToken: data['access_token'] as string,\n refreshToken: data['refresh_token'] as string | undefined,\n expiresIn: data['expires_in'] as number | undefined,\n idToken: data['id_token'] as string | undefined,\n tokenType: data['token_type'] as string | undefined,\n };\n }\n\n async getUserInfo(accessToken: string): Promise<OAuthUserInfo> {\n // Apple doesn't have a userinfo endpoint\n // User info is in the id_token which should be decoded\n // For now, we'll just return a minimal response\n // In practice, the id_token should be passed and decoded\n\n // This is a placeholder - real implementation should decode the id_token\n return {\n id: '',\n email: '',\n emailVerified: false,\n raw: { accessToken },\n };\n }\n\n /**\n * Parse user info from id_token and form post data\n * Apple sends user info only on first authorization\n */\n parseUserFromCallback(\n idToken: string,\n userData?: { name?: { firstName?: string; lastName?: string }; email?: string }\n ): OAuthUserInfo {\n // Decode JWT payload (without verification - should be done server-side)\n const parts = idToken.split('.');\n if (parts.length !== 3) {\n throw new Error('Invalid id_token format');\n }\n\n const payload = JSON.parse(\n Buffer.from(parts[1]!, 'base64url').toString('utf-8')\n ) as Record<string, unknown>;\n\n const name = userData?.name\n ? [userData.name.firstName, userData.name.lastName].filter(Boolean).join(' ')\n : undefined;\n\n return {\n id: payload['sub'] as string,\n email: (userData?.email ?? payload['email']) as string,\n name,\n emailVerified: payload['email_verified'] === 'true' || payload['email_verified'] === true,\n raw: payload,\n };\n }\n\n /**\n * Generate client secret JWT for Apple\n * Apple requires a JWT signed with your private key\n */\n private async generateClientSecret(): Promise<string> {\n const now = Math.floor(Date.now() / 1000);\n const expiry = now + 86400 * 180; // 180 days\n\n const header = {\n alg: 'ES256',\n kid: this.config.keyId,\n typ: 'JWT',\n };\n\n const payload = {\n iss: this.config.teamId,\n iat: now,\n exp: expiry,\n aud: 'https://appleid.apple.com',\n sub: this.config.clientId,\n };\n\n // Import the private key\n const privateKey = await crypto.subtle.importKey(\n 'pkcs8',\n this.pemToArrayBuffer(this.config.privateKey),\n { name: 'ECDSA', namedCurve: 'P-256' },\n false,\n ['sign']\n );\n\n // Create JWT\n const headerB64 = this.base64UrlEncode(JSON.stringify(header));\n const payloadB64 = this.base64UrlEncode(JSON.stringify(payload));\n const signingInput = `${headerB64}.${payloadB64}`;\n\n const signature = await crypto.subtle.sign(\n { name: 'ECDSA', hash: 'SHA-256' },\n privateKey,\n new TextEncoder().encode(signingInput)\n );\n\n const signatureB64 = this.base64UrlEncode(\n String.fromCharCode(...new Uint8Array(signature))\n );\n\n return `${signingInput}.${signatureB64}`;\n }\n\n private pemToArrayBuffer(pem: string): ArrayBuffer {\n const pemContents = pem\n .replace(/-----BEGIN PRIVATE KEY-----/, '')\n .replace(/-----END PRIVATE KEY-----/, '')\n .replace(/\\s/g, '');\n\n const binaryString = atob(pemContents);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n }\n\n private base64UrlEncode(str: string): string {\n return btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n }\n}\n","/**\n * OAuth Provider\n * Manages OAuth2 authentication flows with PKCE support\n */\n\nimport type { KVStorage } from '../../storage/types.js';\nimport type {\n OAuthProvider,\n OAuthProviderName,\n OAuthUserInfo,\n OAuthTokens,\n OAuthState,\n GoogleConfig,\n GitHubConfig,\n MicrosoftConfig,\n AppleConfig,\n} from './types.js';\nimport { GoogleProvider } from './google.js';\nimport { GitHubProvider } from './github.js';\nimport { MicrosoftProvider } from './microsoft.js';\nimport { AppleProvider } from './apple.js';\n\n// Re-export types and providers\nexport * from './types.js';\nexport { GoogleProvider } from './google.js';\nexport { GitHubProvider } from './github.js';\nexport { MicrosoftProvider } from './microsoft.js';\nexport { AppleProvider } from './apple.js';\n\n/**\n * OAuth configuration\n */\nexport interface OAuthConfig {\n google?: GoogleConfig;\n github?: GitHubConfig;\n microsoft?: MicrosoftConfig;\n apple?: AppleConfig;\n}\n\n/**\n * OAuth flow result\n */\nexport interface OAuthFlowResult {\n authorizationUrl: string;\n state: string;\n}\n\n/**\n * OAuth callback result\n */\nexport interface OAuthCallbackResult {\n userInfo: OAuthUserInfo;\n tokens: OAuthTokens;\n tenantId?: string;\n redirectUrl?: string;\n}\n\n/**\n * Generate PKCE code verifier and challenge\n */\nexport async function generatePKCE(): Promise<{\n codeVerifier: string;\n codeChallenge: string;\n}> {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n const codeVerifier = btoa(String.fromCharCode(...array))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const digest = await crypto.subtle.digest('SHA-256', data);\n const codeChallenge = btoa(String.fromCharCode(...new Uint8Array(digest)))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n\n return { codeVerifier, codeChallenge };\n}\n\n/**\n * Generate secure random state\n */\nexport function generateState(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return btoa(String.fromCharCode(...array))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\n/**\n * OAuth Manager\n * Handles OAuth flows with state management via KVStorage\n */\nexport class OAuthManager {\n private storage: KVStorage;\n private providers: Map<string, OAuthProvider> = new Map();\n private stateExpirySeconds: number;\n\n constructor(\n storage: KVStorage,\n config: OAuthConfig,\n options?: { stateExpirySeconds?: number }\n ) {\n this.storage = storage;\n this.stateExpirySeconds = options?.stateExpirySeconds ?? 600; // 10 minutes\n\n // Initialize configured providers\n if (config.google) {\n this.providers.set('google', new GoogleProvider(config.google));\n }\n if (config.github) {\n this.providers.set('github', new GitHubProvider(config.github));\n }\n if (config.microsoft) {\n this.providers.set('microsoft', new MicrosoftProvider(config.microsoft));\n }\n if (config.apple) {\n this.providers.set('apple', new AppleProvider(config.apple));\n }\n }\n\n /**\n * Get available providers\n */\n getAvailableProviders(): OAuthProviderName[] {\n return Array.from(this.providers.keys()) as OAuthProviderName[];\n }\n\n /**\n * Check if a provider is configured\n */\n hasProvider(name: string): boolean {\n return this.providers.has(name);\n }\n\n /**\n * Get a provider by name\n */\n getProvider(name: string): OAuthProvider | undefined {\n return this.providers.get(name);\n }\n\n /**\n * Start OAuth flow - returns authorization URL\n */\n async startFlow(\n providerName: OAuthProviderName,\n options?: { tenantId?: string; redirectUrl?: string }\n ): Promise<OAuthFlowResult> {\n const provider = this.providers.get(providerName);\n if (!provider) {\n throw new Error(`OAuth provider '${providerName}' not configured`);\n }\n\n const state = generateState();\n const { codeVerifier, codeChallenge } = await generatePKCE();\n\n // Store state\n const stateData: OAuthState = {\n state,\n provider: providerName,\n codeVerifier,\n tenantId: options?.tenantId,\n redirectUrl: options?.redirectUrl,\n expiresAt: new Date(Date.now() + this.stateExpirySeconds * 1000),\n };\n\n await this.storage.set(\n `oauth:state:${state}`,\n stateData,\n this.stateExpirySeconds\n );\n\n const authorizationUrl = await provider.getAuthorizationUrl(state, codeChallenge);\n\n return { authorizationUrl, state };\n }\n\n /**\n * Handle OAuth callback\n */\n async handleCallback(\n providerName: OAuthProviderName,\n code: string,\n state: string\n ): Promise<OAuthCallbackResult> {\n const provider = this.providers.get(providerName);\n if (!provider) {\n throw new Error(`OAuth provider '${providerName}' not configured`);\n }\n\n // Retrieve and validate state\n const storedState = await this.storage.get<OAuthState>(`oauth:state:${state}`);\n\n if (!storedState) {\n throw new Error('Invalid OAuth state');\n }\n\n if (storedState.expiresAt < new Date()) {\n await this.storage.delete(`oauth:state:${state}`);\n throw new Error('OAuth state expired');\n }\n\n if (storedState.provider !== providerName) {\n throw new Error('Provider mismatch');\n }\n\n // Exchange code for tokens\n const tokens = await provider.exchangeCode(code, storedState.codeVerifier);\n\n // Get user info\n const userInfo = await provider.getUserInfo(tokens.accessToken);\n\n // Clean up used state\n await this.storage.delete(`oauth:state:${state}`);\n\n return {\n userInfo,\n tokens,\n tenantId: storedState.tenantId,\n redirectUrl: storedState.redirectUrl,\n };\n }\n\n /**\n * Refresh OAuth tokens (if supported by provider)\n */\n async refreshTokens(\n providerName: OAuthProviderName,\n refreshToken: string\n ): Promise<OAuthTokens> {\n const provider = this.providers.get(providerName);\n if (!provider) {\n throw new Error(`OAuth provider '${providerName}' not configured`);\n }\n\n // Check if provider supports token refresh\n if (!provider.refreshToken) {\n throw new Error(`Token refresh not supported for ${providerName}`);\n }\n\n return provider.refreshToken(refreshToken);\n }\n\n /**\n * Check if provider supports token refresh\n */\n supportsRefresh(providerName: OAuthProviderName): boolean {\n const provider = this.providers.get(providerName);\n return provider ? typeof provider.refreshToken === 'function' : false;\n }\n}\n\n/**\n * Create OAuth manager\n */\nexport function createOAuthManager(\n storage: KVStorage,\n config: OAuthConfig,\n options?: { stateExpirySeconds?: number }\n): OAuthManager {\n return new OAuthManager(storage, config, options);\n}\n","/**\n * Magic Link Provider\n * Passwordless email authentication via secure links\n */\n\nimport type { KVStorage } from '../../storage/types.js';\nimport type { AuthProvider, AuthInput, AuthResult, ProviderInfo } from '../base.js';\nimport { generateRandomHex, sha256Hex } from '../../utils/crypto.js';\n\n/**\n * Magic Link configuration\n */\nexport interface MagicLinkConfig {\n /** Base URL for magic links (e.g., https://app.example.com) */\n baseUrl: string;\n /** Path for callback (default: /auth/magic-link/callback) */\n callbackPath?: string;\n /** Token expiration in seconds (default: 900 = 15 minutes) */\n expiresIn?: number;\n /** Token length in bytes (default: 32) */\n tokenLength?: number;\n /** Email sender function */\n send: (email: string, url: string, expiresIn: number) => Promise<void>;\n}\n\n/**\n * Magic link token record\n */\ninterface MagicLinkToken {\n email: string;\n tokenHash: string;\n tenantId?: string;\n redirectUrl?: string;\n expiresAt: string;\n usedAt?: string;\n}\n\n/**\n * Send magic link result\n */\nexport interface SendMagicLinkResult {\n success: boolean;\n expiresAt?: Date;\n error?: string;\n}\n\n/**\n * Verify magic link result\n */\nexport interface VerifyMagicLinkResult {\n success: boolean;\n email?: string;\n tenantId?: string;\n redirectUrl?: string;\n error?: string;\n}\n\n/**\n * Magic Link Provider\n */\nexport class MagicLinkProvider implements AuthProvider {\n readonly name = 'magic-link';\n readonly type = 'magic-link' as const;\n\n private storage: KVStorage;\n private config: Required<Omit<MagicLinkConfig, 'send'>> & { send: MagicLinkConfig['send'] };\n private _enabled: boolean;\n\n constructor(storage: KVStorage, config: MagicLinkConfig) {\n this.storage = storage;\n this.config = {\n callbackPath: '/auth/magic-link/callback',\n expiresIn: 900, // 15 minutes\n tokenLength: 32,\n ...config,\n };\n this._enabled = true;\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n /**\n * Send magic link to email\n */\n async sendMagicLink(\n email: string,\n options?: { tenantId?: string; redirectUrl?: string }\n ): Promise<SendMagicLinkResult> {\n // Normalize email\n const normalizedEmail = email.toLowerCase().trim();\n\n // Generate token\n const token = await generateRandomHex(this.config.tokenLength);\n const tokenHash = await sha256Hex(token);\n\n // Calculate expiration\n const expiresAt = new Date(Date.now() + this.config.expiresIn * 1000);\n\n // Clean up old tokens for this email\n await this.storage.delete(`magic:email:${normalizedEmail}`);\n\n // Store token\n const tokenData: MagicLinkToken = {\n email: normalizedEmail,\n tokenHash,\n tenantId: options?.tenantId,\n redirectUrl: options?.redirectUrl,\n expiresAt: expiresAt.toISOString(),\n };\n\n await this.storage.set(\n `magic:token:${tokenHash}`,\n tokenData,\n this.config.expiresIn\n );\n\n // Also store by email for cleanup\n await this.storage.set(\n `magic:email:${normalizedEmail}`,\n tokenHash,\n this.config.expiresIn\n );\n\n // Build magic link URL\n const params = new URLSearchParams({ token });\n if (options?.redirectUrl) {\n params.set('redirect', options.redirectUrl);\n }\n const magicLink = `${this.config.baseUrl}${this.config.callbackPath}?${params}`;\n\n // Send email\n try {\n await this.config.send(normalizedEmail, magicLink, this.config.expiresIn);\n return { success: true, expiresAt };\n } catch (error) {\n // Clean up on send failure\n await this.storage.delete(`magic:token:${tokenHash}`);\n await this.storage.delete(`magic:email:${normalizedEmail}`);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to send email',\n };\n }\n }\n\n /**\n * Verify magic link token\n */\n async verifyMagicLink(token: string): Promise<VerifyMagicLinkResult> {\n const tokenHash = await sha256Hex(token);\n\n // Find token\n const tokenData = await this.storage.get<MagicLinkToken>(`magic:token:${tokenHash}`);\n\n if (!tokenData) {\n return { success: false, error: 'Invalid or expired magic link' };\n }\n\n if (tokenData.usedAt) {\n return { success: false, error: 'Magic link already used' };\n }\n\n if (new Date(tokenData.expiresAt) < new Date()) {\n await this.storage.delete(`magic:token:${tokenHash}`);\n return { success: false, error: 'Magic link expired' };\n }\n\n // Mark as used\n tokenData.usedAt = new Date().toISOString();\n await this.storage.set(`magic:token:${tokenHash}`, tokenData, 60); // Keep for 1 minute for audit\n\n // Clean up email lookup\n await this.storage.delete(`magic:email:${tokenData.email}`);\n\n return {\n success: true,\n email: tokenData.email,\n tenantId: tokenData.tenantId,\n redirectUrl: tokenData.redirectUrl,\n };\n }\n\n /**\n * Authenticate with magic link token (implements AuthProvider)\n */\n async authenticate(input: AuthInput): Promise<AuthResult> {\n const { credential } = input;\n\n if (!credential) {\n return {\n success: false,\n error: 'Token is required',\n errorCode: 'INVALID_INPUT',\n };\n }\n\n const result = await this.verifyMagicLink(credential);\n\n if (!result.success) {\n return {\n success: false,\n error: result.error,\n errorCode: 'INVALID_TOKEN',\n };\n }\n\n return {\n success: true,\n // Auth engine will handle user lookup/creation based on email\n };\n }\n\n /**\n * Get provider info\n */\n getInfo(): ProviderInfo {\n return {\n name: this.name,\n type: this.type,\n enabled: this.enabled,\n displayName: 'Magic Link',\n };\n }\n\n /**\n * Request magic link (for use in auth routes)\n */\n async requestMagicLink(\n email: string,\n options?: { tenantId?: string; redirectUrl?: string }\n ): Promise<SendMagicLinkResult> {\n return this.sendMagicLink(email, options);\n }\n}\n\n/**\n * Create Magic Link provider\n */\nexport function createMagicLinkProvider(\n storage: KVStorage,\n config: MagicLinkConfig\n): MagicLinkProvider {\n return new MagicLinkProvider(storage, config);\n}\n","/**\n * TOTP Provider (Time-based One-Time Password)\n * RFC 6238 compliant, Google Authenticator compatible\n */\n\nimport type { KVStorage } from '../../storage/types.js';\nimport type { TwoFactorProvider, TwoFactorSetupResult, ProviderInfo, AuthInput, AuthResult } from '../base.js';\nimport { generateRandomHex } from '../../utils/crypto.js';\n\n/**\n * TOTP Configuration\n */\nexport interface TOTPConfig {\n /** Issuer name (your app name) */\n issuer: string;\n /** Hash algorithm (default: SHA1 for compatibility) */\n algorithm?: 'SHA1' | 'SHA256' | 'SHA512';\n /** Number of digits (default: 6) */\n digits?: 6 | 8;\n /** Time period in seconds (default: 30) */\n period?: number;\n /** Time window for drift tolerance (default: 1) */\n window?: number;\n /** Number of backup codes (default: 10) */\n backupCodeCount?: number;\n /** Encryption key for storing secrets */\n encryptionKey?: string;\n}\n\n/**\n * TOTP secret record\n */\ninterface TOTPSecret {\n userId: string;\n encryptedSecret: string;\n backupCodes: string;\n verified: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * TOTP setup result\n */\nexport interface TOTPSetupData {\n /** Base32 encoded secret */\n secret: string;\n /** QR code URL */\n qrCodeUrl: string;\n /** Backup codes */\n backupCodes: string[];\n /** otpauth:// URI */\n otpauthUri: string;\n}\n\n/**\n * TOTP verify result\n */\nexport interface TOTPVerifyResult {\n valid: boolean;\n usedBackupCode?: boolean;\n}\n\nconst DEFAULT_CONFIG = {\n algorithm: 'SHA1' as const,\n digits: 6 as const,\n period: 30,\n window: 1,\n backupCodeCount: 10,\n};\n\n/**\n * Convert bytes to base32\n */\nfunction bytesToBase32(bytes: Uint8Array): string {\n const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n let result = '';\n let bits = 0;\n let value = 0;\n\n for (const byte of bytes) {\n value = (value << 8) | byte;\n bits += 8;\n\n while (bits >= 5) {\n result += alphabet[(value >>> (bits - 5)) & 31];\n bits -= 5;\n }\n }\n\n if (bits > 0) {\n result += alphabet[(value << (5 - bits)) & 31];\n }\n\n return result;\n}\n\n/**\n * Convert base32 to bytes\n */\nfunction base32ToBytes(base32: string): Uint8Array {\n const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n const cleaned = base32.toUpperCase().replace(/[^A-Z2-7]/g, '');\n\n const bytes: number[] = [];\n let bits = 0;\n let value = 0;\n\n for (const char of cleaned) {\n const index = alphabet.indexOf(char);\n if (index === -1) continue;\n\n value = (value << 5) | index;\n bits += 5;\n\n if (bits >= 8) {\n bytes.push((value >>> (bits - 8)) & 255);\n bits -= 8;\n }\n }\n\n return new Uint8Array(bytes);\n}\n\n/**\n * HMAC-based One-Time Password\n */\nasync function hotp(\n secret: Uint8Array,\n counter: bigint,\n algorithm: string,\n digits: number\n): Promise<string> {\n // Convert counter to 8-byte big-endian\n const counterBytes = new Uint8Array(8);\n const view = new DataView(counterBytes.buffer);\n view.setBigUint64(0, counter, false);\n\n // Map algorithm names\n const hashName = algorithm === 'SHA1' ? 'SHA-1' : `SHA-${algorithm.slice(3)}`;\n\n // Import key for HMAC\n const key = await crypto.subtle.importKey(\n 'raw',\n secret,\n { name: 'HMAC', hash: hashName },\n false,\n ['sign']\n );\n\n // Generate HMAC\n const signature = await crypto.subtle.sign('HMAC', key, counterBytes);\n const hmac = new Uint8Array(signature);\n\n // Dynamic truncation\n const offset = hmac[hmac.length - 1]! & 0x0f;\n const binary =\n ((hmac[offset]! & 0x7f) << 24) |\n ((hmac[offset + 1]! & 0xff) << 16) |\n ((hmac[offset + 2]! & 0xff) << 8) |\n (hmac[offset + 3]! & 0xff);\n\n // Generate OTP\n const otp = binary % Math.pow(10, digits);\n return otp.toString().padStart(digits, '0');\n}\n\n/**\n * Generate TOTP for current time\n */\nasync function generateTOTP(\n secret: Uint8Array,\n algorithm: string,\n digits: number,\n period: number\n): Promise<string> {\n const counter = BigInt(Math.floor(Date.now() / 1000 / period));\n return hotp(secret, counter, algorithm, digits);\n}\n\n/**\n * Verify TOTP with time window\n */\nasync function verifyTOTP(\n token: string,\n secret: Uint8Array,\n algorithm: string,\n digits: number,\n period: number,\n window: number\n): Promise<boolean> {\n const now = Math.floor(Date.now() / 1000 / period);\n\n for (let i = -window; i <= window; i++) {\n const counter = BigInt(now + i);\n const expected = await hotp(secret, counter, algorithm, digits);\n if (token === expected) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Generate backup codes\n */\nasync function generateBackupCodes(count: number): Promise<string[]> {\n const codes: string[] = [];\n for (let i = 0; i < count; i++) {\n const hex = await generateRandomHex(4);\n // Format as XXXX-XXXX\n codes.push(`${hex.slice(0, 4).toUpperCase()}-${hex.slice(4, 8).toUpperCase()}`);\n }\n return codes;\n}\n\n/**\n * Simple AES-GCM encryption for secrets\n */\nasync function encryptSecret(secret: string, keyString: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(secret);\n const keyData = encoder.encode(keyString.padEnd(32, '0').slice(0, 32));\n\n const key = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'AES-GCM' },\n false,\n ['encrypt']\n );\n\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encrypted = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, data);\n\n const result = new Uint8Array(iv.length + encrypted.byteLength);\n result.set(iv);\n result.set(new Uint8Array(encrypted), iv.length);\n\n return btoa(String.fromCharCode(...result));\n}\n\n/**\n * Decrypt secret\n */\nasync function decryptSecret(encrypted: string, keyString: string): Promise<string> {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(keyString.padEnd(32, '0').slice(0, 32));\n\n const data = Uint8Array.from(atob(encrypted), (c) => c.charCodeAt(0));\n const iv = data.slice(0, 12);\n const ciphertext = data.slice(12);\n\n const key = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'AES-GCM' },\n false,\n ['decrypt']\n );\n\n const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, ciphertext);\n\n return new TextDecoder().decode(decrypted);\n}\n\n/**\n * TOTP Provider\n */\nexport class TOTPProvider implements TwoFactorProvider {\n readonly name = 'totp';\n readonly type = 'totp' as const;\n\n private storage: KVStorage;\n private config: Required<TOTPConfig>;\n private _enabled: boolean = true;\n\n constructor(storage: KVStorage, config: TOTPConfig) {\n this.storage = storage;\n this.config = {\n ...DEFAULT_CONFIG,\n encryptionKey: 'change-me-in-production',\n ...config,\n };\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n /**\n * Setup TOTP for a user\n * Note: Use setupWithEmail for full setup including QR code URL\n */\n async setup(userId: string): Promise<TwoFactorSetupResult> {\n return this.setupWithEmail(userId, userId);\n }\n\n /**\n * Setup TOTP for a user with email for QR code label\n */\n async setupWithEmail(userId: string, userEmail: string): Promise<TwoFactorSetupResult & { qrCodeUrl: string; otpauthUri: string }> {\n // Generate secret (160 bits = 20 bytes for SHA1)\n const secretBytes = crypto.getRandomValues(new Uint8Array(20));\n const secret = bytesToBase32(secretBytes);\n\n // Generate backup codes\n const backupCodes = await generateBackupCodes(this.config.backupCodeCount);\n\n // Create otpauth URI\n const otpauthUri = this.createOtpauthUri(secret, userEmail);\n\n // Create QR code URL (using Google Charts API)\n const qrCodeUrl = `https://chart.googleapis.com/chart?chs=200x200&chld=M|0&cht=qr&chl=${encodeURIComponent(otpauthUri)}`;\n\n // Encrypt and store\n const encryptedSecret = await encryptSecret(secret, this.config.encryptionKey);\n const encryptedBackupCodes = await encryptSecret(\n JSON.stringify(backupCodes),\n this.config.encryptionKey\n );\n\n const totpData: TOTPSecret = {\n userId,\n encryptedSecret,\n backupCodes: encryptedBackupCodes,\n verified: false,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n await this.storage.set(`totp:user:${userId}`, totpData);\n\n return {\n secret,\n qrCode: qrCodeUrl,\n backupCodes,\n qrCodeUrl,\n otpauthUri,\n };\n }\n\n /**\n * Verify TOTP and activate 2FA (for TwoFactorProvider interface)\n */\n async verifySetup(userId: string, token: string): Promise<boolean> {\n const totpData = await this.storage.get<TOTPSecret>(`totp:user:${userId}`);\n\n if (!totpData) {\n throw new Error('TOTP not set up for this user');\n }\n\n const secret = await decryptSecret(totpData.encryptedSecret, this.config.encryptionKey);\n const secretBytes = base32ToBytes(secret);\n\n const valid = await verifyTOTP(\n token,\n secretBytes,\n this.config.algorithm,\n this.config.digits,\n this.config.period,\n this.config.window\n );\n\n if (valid) {\n totpData.verified = true;\n totpData.updatedAt = new Date().toISOString();\n await this.storage.set(`totp:user:${userId}`, totpData);\n return true;\n }\n\n return false;\n }\n\n /**\n * Verify TOTP during login (for TwoFactorProvider interface)\n */\n async verifyLogin(userId: string, code: string): Promise<boolean> {\n const result = await this.verifyCode(userId, code);\n return result.valid;\n }\n\n /**\n * Authenticate (for AuthProvider interface)\n */\n async authenticate(_input: AuthInput): Promise<AuthResult> {\n // TOTP is used as 2FA, not primary authentication\n return {\n success: false,\n error: 'TOTP is used for two-factor authentication, not primary auth',\n errorCode: 'USE_TWO_FACTOR_METHODS',\n };\n }\n\n /**\n * Verify TOTP token\n */\n async verifyCode(userId: string, token: string): Promise<TOTPVerifyResult> {\n const totpData = await this.storage.get<TOTPSecret>(`totp:user:${userId}`);\n\n if (!totpData || !totpData.verified) {\n throw new Error('TOTP not enabled for this user');\n }\n\n // Try TOTP first\n const secret = await decryptSecret(totpData.encryptedSecret, this.config.encryptionKey);\n const secretBytes = base32ToBytes(secret);\n\n const validTOTP = await verifyTOTP(\n token,\n secretBytes,\n this.config.algorithm,\n this.config.digits,\n this.config.period,\n this.config.window\n );\n\n if (validTOTP) {\n return { valid: true, usedBackupCode: false };\n }\n\n // Try backup codes\n const backupCodesJson = await decryptSecret(\n totpData.backupCodes,\n this.config.encryptionKey\n );\n const backupCodes: string[] = JSON.parse(backupCodesJson);\n\n const normalizedToken = token.toUpperCase().replace(/[^A-Z0-9]/g, '');\n const backupIndex = backupCodes.findIndex(\n (code) => code.replace('-', '') === normalizedToken\n );\n\n if (backupIndex !== -1) {\n // Remove used backup code\n backupCodes.splice(backupIndex, 1);\n const encryptedBackupCodes = await encryptSecret(\n JSON.stringify(backupCodes),\n this.config.encryptionKey\n );\n\n totpData.backupCodes = encryptedBackupCodes;\n totpData.updatedAt = new Date().toISOString();\n await this.storage.set(`totp:user:${userId}`, totpData);\n\n return { valid: true, usedBackupCode: true };\n }\n\n return { valid: false };\n }\n\n /**\n * Disable TOTP for user\n */\n async disable(userId: string): Promise<void> {\n await this.storage.delete(`totp:user:${userId}`);\n }\n\n /**\n * Regenerate backup codes\n */\n async regenerateBackupCodes(userId: string): Promise<string[]> {\n const totpData = await this.storage.get<TOTPSecret>(`totp:user:${userId}`);\n\n if (!totpData || !totpData.verified) {\n throw new Error('TOTP not enabled for this user');\n }\n\n const backupCodes = await generateBackupCodes(this.config.backupCodeCount);\n const encryptedBackupCodes = await encryptSecret(\n JSON.stringify(backupCodes),\n this.config.encryptionKey\n );\n\n totpData.backupCodes = encryptedBackupCodes;\n totpData.updatedAt = new Date().toISOString();\n await this.storage.set(`totp:user:${userId}`, totpData);\n\n return backupCodes;\n }\n\n /**\n * Get remaining backup codes count\n */\n async getBackupCodesCount(userId: string): Promise<number> {\n const totpData = await this.storage.get<TOTPSecret>(`totp:user:${userId}`);\n\n if (!totpData) {\n return 0;\n }\n\n const backupCodesJson = await decryptSecret(\n totpData.backupCodes,\n this.config.encryptionKey\n );\n const backupCodes: string[] = JSON.parse(backupCodesJson);\n\n return backupCodes.length;\n }\n\n /**\n * Check if TOTP is enabled for user\n */\n async isEnabled(userId: string): Promise<boolean> {\n const totpData = await this.storage.get<TOTPSecret>(`totp:user:${userId}`);\n return !!totpData?.verified;\n }\n\n /**\n * Generate current TOTP (for testing)\n */\n async generateCurrent(userId: string): Promise<string> {\n const totpData = await this.storage.get<TOTPSecret>(`totp:user:${userId}`);\n\n if (!totpData) {\n throw new Error('TOTP not set up for this user');\n }\n\n const secret = await decryptSecret(totpData.encryptedSecret, this.config.encryptionKey);\n const secretBytes = base32ToBytes(secret);\n\n return generateTOTP(\n secretBytes,\n this.config.algorithm,\n this.config.digits,\n this.config.period\n );\n }\n\n /**\n * Get provider info\n */\n getInfo(): ProviderInfo {\n return {\n name: this.name,\n type: this.type,\n enabled: this.enabled,\n displayName: 'Authenticator App',\n };\n }\n\n /**\n * Create otpauth URI for QR code\n */\n private createOtpauthUri(secret: string, userEmail: string): string {\n const params = new URLSearchParams({\n secret,\n issuer: this.config.issuer,\n algorithm: this.config.algorithm,\n digits: String(this.config.digits),\n period: String(this.config.period),\n });\n\n const label = encodeURIComponent(`${this.config.issuer}:${userEmail}`);\n return `otpauth://totp/${label}?${params}`;\n }\n}\n\n/**\n * Create TOTP provider\n */\nexport function createTOTPProvider(storage: KVStorage, config: TOTPConfig): TOTPProvider {\n return new TOTPProvider(storage, config);\n}\n","/**\n * WebAuthn Provider (Passkeys)\n * FIDO2 passwordless authentication\n */\n\nimport type { KVStorage } from '../../storage/types.js';\nimport type { TwoFactorProvider, TwoFactorSetupResult, ProviderInfo, AuthInput, AuthResult } from '../base.js';\n\n/**\n * WebAuthn Configuration\n */\nexport interface WebAuthnConfig {\n /** Relying Party name (your app name) */\n rpName: string;\n /** Relying Party ID (domain without protocol) */\n rpId: string;\n /** Full origin (e.g., https://example.com) */\n origin: string;\n /** Timeout in milliseconds (default: 60000) */\n timeout?: number;\n /** Attestation preference (default: none) */\n attestation?: 'none' | 'indirect' | 'direct';\n /** User verification preference (default: preferred) */\n userVerification?: 'required' | 'preferred' | 'discouraged';\n}\n\n/**\n * Registration options returned to client\n */\nexport interface RegistrationOptions {\n challenge: string;\n rp: { name: string; id: string };\n user: { id: string; name: string; displayName: string };\n pubKeyCredParams: Array<{ type: 'public-key'; alg: number }>;\n timeout: number;\n attestation: 'none' | 'indirect' | 'direct';\n authenticatorSelection: {\n authenticatorAttachment?: 'platform' | 'cross-platform';\n residentKey: 'required' | 'preferred' | 'discouraged';\n userVerification: 'required' | 'preferred' | 'discouraged';\n };\n excludeCredentials: Array<{ id: string; type: 'public-key'; transports?: string[] }>;\n}\n\n/**\n * Authentication options returned to client\n */\nexport interface AuthenticationOptions {\n challenge: string;\n timeout: number;\n rpId: string;\n allowCredentials: Array<{ id: string; type: 'public-key'; transports?: string[] }>;\n userVerification: 'required' | 'preferred' | 'discouraged';\n}\n\n/**\n * Registration response from client\n */\nexport interface RegistrationResponse {\n id: string;\n rawId: string;\n type: 'public-key';\n response: {\n clientDataJSON: string;\n attestationObject: string;\n transports?: string[];\n };\n}\n\n/**\n * Authentication response from client\n */\nexport interface AuthenticationResponse {\n id: string;\n rawId: string;\n type: 'public-key';\n response: {\n clientDataJSON: string;\n authenticatorData: string;\n signature: string;\n userHandle?: string;\n };\n}\n\n/**\n * Client data JSON structure\n */\nexport interface ClientDataJSON {\n type: 'webauthn.create' | 'webauthn.get';\n challenge: string;\n origin: string;\n crossOrigin?: boolean;\n}\n\n/**\n * Authenticator data structure\n */\nexport interface AuthenticatorData {\n rpIdHash: Uint8Array;\n flags: {\n userPresent: boolean;\n userVerified: boolean;\n attestedCredentialData: boolean;\n extensionDataIncluded?: boolean;\n };\n signCount: number;\n attestedCredentialData?: {\n aaguid: Uint8Array;\n credentialId: Uint8Array;\n publicKey: Uint8Array;\n };\n}\n\n/**\n * Stored credential (exported as WebAuthnCredential)\n */\nexport interface WebAuthnCredential {\n id: string;\n credentialId: string;\n userId: string;\n publicKey: string;\n counter: number;\n transports: string[];\n name: string;\n deviceType?: string;\n createdAt: string;\n lastUsedAt?: string;\n}\n\n/**\n * Pending challenge\n */\ninterface PendingChallenge {\n challenge: string;\n userId?: string;\n type: 'registration' | 'authentication';\n expiresAt: string;\n}\n\n/**\n * Base64URL encode\n */\nfunction base64UrlEncode(bytes: Uint8Array): string {\n return btoa(String.fromCharCode(...bytes))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\n/**\n * Base64URL decode\n */\nfunction base64UrlDecode(str: string): Uint8Array {\n const base64 = str.replace(/-/g, '+').replace(/_/g, '/');\n const padding = '='.repeat((4 - (base64.length % 4)) % 4);\n const binary = atob(base64 + padding);\n return Uint8Array.from(binary, (c) => c.charCodeAt(0));\n}\n\n/**\n * Generate secure random challenge\n */\nfunction generateChallenge(): string {\n const bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n return base64UrlEncode(bytes);\n}\n\n/**\n * Parse authenticator data (simplified)\n */\nfunction parseAuthenticatorData(data: Uint8Array): {\n rpIdHash: Uint8Array;\n flags: {\n userPresent: boolean;\n userVerified: boolean;\n attestedCredentialData: boolean;\n };\n signCount: number;\n attestedCredentialData?: {\n aaguid: Uint8Array;\n credentialId: Uint8Array;\n publicKey: Uint8Array;\n };\n} {\n const rpIdHash = data.slice(0, 32);\n const flagsByte = data[32]!;\n const flags = {\n userPresent: (flagsByte & 0x01) !== 0,\n userVerified: (flagsByte & 0x04) !== 0,\n attestedCredentialData: (flagsByte & 0x40) !== 0,\n };\n\n const signCount = new DataView(data.buffer, data.byteOffset + 33, 4).getUint32(0, false);\n\n let attestedCredentialData;\n if (flags.attestedCredentialData && data.length > 37) {\n const aaguid = data.slice(37, 53);\n const credentialIdLength = new DataView(data.buffer, data.byteOffset + 53, 2).getUint16(0, false);\n const credentialId = data.slice(55, 55 + credentialIdLength);\n const publicKey = data.slice(55 + credentialIdLength);\n\n attestedCredentialData = { aaguid, credentialId, publicKey };\n }\n\n return { rpIdHash, flags, signCount, attestedCredentialData };\n}\n\n/**\n * Simple CBOR map parser for attestation object\n */\nfunction parseCBORMap(data: Uint8Array): Record<string, Uint8Array> {\n const result: Record<string, Uint8Array> = {};\n let offset = 0;\n\n // Expect map (0xa0 - 0xbf)\n const initial = data[offset++]!;\n if ((initial & 0xe0) !== 0xa0) {\n throw new Error('Expected CBOR map');\n }\n\n const mapSize = initial & 0x1f;\n\n for (let i = 0; i < mapSize; i++) {\n // Read key (text string)\n const keyInitial = data[offset++]!;\n const keyLength = keyInitial & 0x1f;\n const key = new TextDecoder().decode(data.slice(offset, offset + keyLength));\n offset += keyLength;\n\n // Read value (byte string)\n const valueInitial = data[offset++]!;\n let valueLength: number;\n\n if ((valueInitial & 0x1f) < 24) {\n valueLength = valueInitial & 0x1f;\n } else if ((valueInitial & 0x1f) === 24) {\n valueLength = data[offset++]!;\n } else if ((valueInitial & 0x1f) === 25) {\n valueLength = (data[offset++]! << 8) | data[offset++]!;\n } else {\n throw new Error('Unsupported CBOR value length');\n }\n\n result[key] = data.slice(offset, offset + valueLength);\n offset += valueLength;\n }\n\n return result;\n}\n\n/**\n * Compare array buffers\n */\nfunction arrayBufferEqual(a: ArrayBuffer, b: ArrayBuffer): boolean {\n if (a.byteLength !== b.byteLength) return false;\n const viewA = new Uint8Array(a);\n const viewB = new Uint8Array(b);\n for (let i = 0; i < viewA.length; i++) {\n if (viewA[i] !== viewB[i]) return false;\n }\n return true;\n}\n\n/**\n * WebAuthn Provider\n */\nexport class WebAuthnProvider implements TwoFactorProvider {\n readonly name = 'webauthn';\n readonly type = 'webauthn' as const;\n\n private storage: KVStorage;\n private config: Required<WebAuthnConfig>;\n private _enabled: boolean = true;\n\n constructor(storage: KVStorage, config: WebAuthnConfig) {\n this.storage = storage;\n this.config = {\n timeout: 60000,\n attestation: 'none',\n userVerification: 'preferred',\n ...config,\n };\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n /**\n * Generate registration options\n */\n async generateRegistrationOptions(\n userId: string,\n userName: string,\n userDisplayName: string,\n authenticatorType?: 'platform' | 'cross-platform'\n ): Promise<RegistrationOptions> {\n const challenge = generateChallenge();\n\n // Get existing credentials to exclude\n const existingCredentials = await this.getUserCredentials(userId);\n\n // Store challenge\n const challengeData: PendingChallenge = {\n challenge,\n userId,\n type: 'registration',\n expiresAt: new Date(Date.now() + this.config.timeout).toISOString(),\n };\n await this.storage.set(`webauthn:challenge:${challenge}`, challengeData, this.config.timeout / 1000);\n\n return {\n challenge,\n rp: {\n name: this.config.rpName,\n id: this.config.rpId,\n },\n user: {\n id: base64UrlEncode(new TextEncoder().encode(userId)),\n name: userName,\n displayName: userDisplayName,\n },\n pubKeyCredParams: [\n { type: 'public-key', alg: -7 }, // ES256\n { type: 'public-key', alg: -257 }, // RS256\n ],\n timeout: this.config.timeout,\n attestation: this.config.attestation,\n authenticatorSelection: {\n authenticatorAttachment: authenticatorType,\n residentKey: 'preferred',\n userVerification: this.config.userVerification,\n },\n excludeCredentials: existingCredentials.map((cred) => ({\n id: cred.credentialId,\n type: 'public-key' as const,\n transports: cred.transports,\n })),\n };\n }\n\n /**\n * Verify registration response\n */\n async verifyRegistration(\n response: RegistrationResponse,\n challenge: string,\n credentialName?: string\n ): Promise<{ success: boolean; credentialId?: string; error?: string }> {\n // Get and verify challenge\n const pending = await this.storage.get<PendingChallenge>(`webauthn:challenge:${challenge}`);\n if (!pending || new Date(pending.expiresAt) < new Date()) {\n return { success: false, error: 'Invalid or expired challenge' };\n }\n\n const userId = pending.userId;\n if (!userId) {\n return { success: false, error: 'No user ID in challenge' };\n }\n\n // Parse client data\n const clientDataJSON = base64UrlDecode(response.response.clientDataJSON);\n const clientData = JSON.parse(new TextDecoder().decode(clientDataJSON)) as Record<string, unknown>;\n\n // Verify client data\n if (clientData['type'] !== 'webauthn.create') {\n return { success: false, error: 'Invalid client data type' };\n }\n\n if (clientData['challenge'] !== challenge) {\n return { success: false, error: 'Challenge mismatch' };\n }\n\n if (clientData['origin'] !== this.config.origin) {\n return { success: false, error: 'Origin mismatch' };\n }\n\n // Parse attestation object\n const attestationObject = base64UrlDecode(response.response.attestationObject);\n let authData: Uint8Array;\n\n try {\n const attestation = parseCBORMap(attestationObject);\n authData = attestation['authData']!;\n } catch {\n return { success: false, error: 'Failed to parse attestation object' };\n }\n\n // Parse authenticator data\n const parsedAuthData = parseAuthenticatorData(authData);\n\n // Verify RP ID hash\n const expectedRpIdHash = await crypto.subtle.digest(\n 'SHA-256',\n new TextEncoder().encode(this.config.rpId)\n );\n if (!arrayBufferEqual(parsedAuthData.rpIdHash.buffer as ArrayBuffer, expectedRpIdHash)) {\n return { success: false, error: 'RP ID hash mismatch' };\n }\n\n // Verify user presence\n if (!parsedAuthData.flags.userPresent) {\n return { success: false, error: 'User not present' };\n }\n\n // Get credential data\n if (!parsedAuthData.attestedCredentialData) {\n return { success: false, error: 'No credential data' };\n }\n\n const { credentialId, publicKey } = parsedAuthData.attestedCredentialData;\n const credentialIdBase64 = base64UrlEncode(credentialId);\n const publicKeyBase64 = base64UrlEncode(publicKey);\n\n // Check if credential already exists\n const existing = await this.storage.get<WebAuthnCredential>(`webauthn:cred:${credentialIdBase64}`);\n if (existing) {\n return { success: false, error: 'Credential already registered' };\n }\n\n // Store credential\n const credential: WebAuthnCredential = {\n id: crypto.randomUUID(),\n credentialId: credentialIdBase64,\n userId,\n publicKey: publicKeyBase64,\n counter: parsedAuthData.signCount,\n transports: response.response.transports ?? [],\n name: credentialName ?? 'Passkey',\n createdAt: new Date().toISOString(),\n };\n\n await this.storage.set(`webauthn:cred:${credentialIdBase64}`, credential);\n\n // Add to user's credential list\n const userCredIds = await this.storage.get<string[]>(`webauthn:user:${userId}`) ?? [];\n userCredIds.push(credentialIdBase64);\n await this.storage.set(`webauthn:user:${userId}`, userCredIds);\n\n // Clean up challenge\n await this.storage.delete(`webauthn:challenge:${challenge}`);\n\n return { success: true, credentialId: credentialIdBase64 };\n }\n\n /**\n * Generate authentication options\n */\n async generateAuthenticationOptions(userId?: string): Promise<AuthenticationOptions> {\n const challenge = generateChallenge();\n\n // Store challenge\n const challengeData: PendingChallenge = {\n challenge,\n userId,\n type: 'authentication',\n expiresAt: new Date(Date.now() + this.config.timeout).toISOString(),\n };\n await this.storage.set(`webauthn:challenge:${challenge}`, challengeData, this.config.timeout / 1000);\n\n let allowCredentials: AuthenticationOptions['allowCredentials'] = [];\n\n if (userId) {\n const userCredentials = await this.getUserCredentials(userId);\n allowCredentials = userCredentials.map((cred) => ({\n id: cred.credentialId,\n type: 'public-key' as const,\n transports: cred.transports,\n }));\n }\n\n return {\n challenge,\n timeout: this.config.timeout,\n rpId: this.config.rpId,\n allowCredentials,\n userVerification: this.config.userVerification,\n };\n }\n\n /**\n * Verify authentication response\n */\n async verifyAuthentication(\n response: AuthenticationResponse,\n challenge: string\n ): Promise<{ success: boolean; userId?: string; credentialId?: string; error?: string }> {\n // Get and verify challenge\n const pending = await this.storage.get<PendingChallenge>(`webauthn:challenge:${challenge}`);\n if (!pending || new Date(pending.expiresAt) < new Date()) {\n return { success: false, error: 'Invalid or expired challenge' };\n }\n\n // Get credential\n const credential = await this.storage.get<WebAuthnCredential>(`webauthn:cred:${response.id}`);\n if (!credential) {\n return { success: false, error: 'Credential not found' };\n }\n\n // Parse client data\n const clientDataJSON = base64UrlDecode(response.response.clientDataJSON);\n const clientData = JSON.parse(new TextDecoder().decode(clientDataJSON)) as Record<string, unknown>;\n\n // Verify client data\n if (clientData['type'] !== 'webauthn.get') {\n return { success: false, error: 'Invalid client data type' };\n }\n\n if (clientData['challenge'] !== challenge) {\n return { success: false, error: 'Challenge mismatch' };\n }\n\n if (clientData['origin'] !== this.config.origin) {\n return { success: false, error: 'Origin mismatch' };\n }\n\n // Parse authenticator data\n const authenticatorData = base64UrlDecode(response.response.authenticatorData);\n const parsedAuthData = parseAuthenticatorData(authenticatorData);\n\n // Verify RP ID hash\n const expectedRpIdHash = await crypto.subtle.digest(\n 'SHA-256',\n new TextEncoder().encode(this.config.rpId)\n );\n if (!arrayBufferEqual(parsedAuthData.rpIdHash.buffer as ArrayBuffer, expectedRpIdHash)) {\n return { success: false, error: 'RP ID hash mismatch' };\n }\n\n // Verify user presence\n if (!parsedAuthData.flags.userPresent) {\n return { success: false, error: 'User not present' };\n }\n\n // Verify counter (replay protection)\n if (parsedAuthData.signCount > 0 && parsedAuthData.signCount <= credential.counter) {\n return { success: false, error: 'Possible credential cloning detected' };\n }\n\n // Update counter and last used\n credential.counter = parsedAuthData.signCount;\n credential.lastUsedAt = new Date().toISOString();\n await this.storage.set(`webauthn:cred:${response.id}`, credential);\n\n // Clean up challenge\n await this.storage.delete(`webauthn:challenge:${challenge}`);\n\n return {\n success: true,\n userId: credential.userId,\n credentialId: credential.credentialId,\n };\n }\n\n /**\n * Get user's credentials\n */\n async getUserCredentials(userId: string): Promise<WebAuthnCredential[]> {\n const credIds = await this.storage.get<string[]>(`webauthn:user:${userId}`) ?? [];\n const credentials: WebAuthnCredential[] = [];\n\n for (const credId of credIds) {\n const cred = await this.storage.get<WebAuthnCredential>(`webauthn:cred:${credId}`);\n if (cred) {\n credentials.push(cred);\n }\n }\n\n return credentials;\n }\n\n /**\n * Remove a credential\n */\n async removeCredential(userId: string, credentialId: string): Promise<boolean> {\n const credential = await this.storage.get<WebAuthnCredential>(`webauthn:cred:${credentialId}`);\n if (!credential || credential.userId !== userId) {\n return false;\n }\n\n await this.storage.delete(`webauthn:cred:${credentialId}`);\n\n // Remove from user's list\n const credIds = await this.storage.get<string[]>(`webauthn:user:${userId}`) ?? [];\n const filtered = credIds.filter((id) => id !== credentialId);\n await this.storage.set(`webauthn:user:${userId}`, filtered);\n\n return true;\n }\n\n /**\n * Check if user has any passkeys\n */\n async hasPasskeys(userId: string): Promise<boolean> {\n const credentials = await this.getUserCredentials(userId);\n return credentials.length > 0;\n }\n\n /**\n * Setup (for TwoFactorProvider interface)\n */\n async setup(userId: string): Promise<TwoFactorSetupResult> {\n const options = await this.generateRegistrationOptions(userId, userId, userId);\n return {\n secret: options.challenge,\n qrCode: '', // Not applicable for WebAuthn\n backupCodes: [],\n challenge: options.challenge,\n };\n }\n\n /**\n * Verify setup (for TwoFactorProvider interface)\n */\n async verifySetup(userId: string, _code: string): Promise<boolean> {\n // For WebAuthn, the registration is already stored on success\n const credentials = await this.getUserCredentials(userId);\n return credentials.length > 0;\n }\n\n /**\n * Verify login (for TwoFactorProvider interface)\n */\n async verifyLogin(userId: string, _code: string): Promise<boolean> {\n // For WebAuthn, verification happens through verifyAuthentication\n const credentials = await this.getUserCredentials(userId);\n return credentials.length > 0;\n }\n\n /**\n * Disable 2FA for user\n */\n async disable(userId: string): Promise<void> {\n const credentials = await this.getUserCredentials(userId);\n for (const cred of credentials) {\n await this.removeCredential(userId, cred.credentialId);\n }\n }\n\n /**\n * Authenticate (for AuthProvider interface)\n */\n async authenticate(_input: AuthInput): Promise<AuthResult> {\n // WebAuthn authentication is handled through generateAuthenticationOptions/verifyAuthentication\n return {\n success: false,\n error: 'Use generateAuthenticationOptions and verifyAuthentication for WebAuthn authentication',\n errorCode: 'USE_WEBAUTHN_METHODS',\n };\n }\n\n /**\n * Get provider info\n */\n getInfo(): ProviderInfo {\n return {\n name: this.name,\n type: this.type,\n enabled: this.enabled,\n displayName: 'Passkey',\n };\n }\n}\n\n/**\n * Create WebAuthn provider\n */\nexport function createWebAuthnProvider(storage: KVStorage, config: WebAuthnConfig): WebAuthnProvider {\n return new WebAuthnProvider(storage, config);\n}\n","/**\n * Password Provider\n * Traditional password-based authentication\n * DISABLED BY DEFAULT - use passwordless methods when possible\n */\n\nimport type { KVStorage } from '../../storage/types.js';\nimport type { AuthProvider, AuthInput, AuthResult, ProviderInfo } from '../base.js';\n\n/**\n * Password configuration\n */\nexport interface PasswordConfig {\n /** Minimum password length (default: 8) */\n minLength?: number;\n /** Maximum password length (default: 128) */\n maxLength?: number;\n /** Require uppercase letter (default: true) */\n requireUppercase?: boolean;\n /** Require lowercase letter (default: true) */\n requireLowercase?: boolean;\n /** Require number (default: true) */\n requireNumber?: boolean;\n /** Require special character (default: false) */\n requireSpecial?: boolean;\n /** Bcrypt cost factor (default: 12) */\n bcryptCost?: number;\n /** Password hash function (for custom implementations) */\n hashPassword?: (password: string) => Promise<string>;\n /** Password verify function (for custom implementations) */\n verifyPassword?: (password: string, hash: string) => Promise<boolean>;\n}\n\n/**\n * Password validation result\n */\nexport interface PasswordValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Password strength levels\n */\nexport type PasswordStrength = 'weak' | 'fair' | 'strong' | 'very-strong';\n\nconst DEFAULT_CONFIG: Required<Omit<PasswordConfig, 'hashPassword' | 'verifyPassword'>> = {\n minLength: 8,\n maxLength: 128,\n requireUppercase: true,\n requireLowercase: true,\n requireNumber: true,\n requireSpecial: false,\n bcryptCost: 12,\n};\n\n/**\n * Password Provider\n * WARNING: This provider is disabled by default.\n * Consider using passwordless authentication (OTP, Magic Link, OAuth) for better security.\n */\nexport class PasswordProvider implements AuthProvider {\n readonly name = 'password';\n readonly type = 'password' as const;\n\n private storage: KVStorage;\n private config: Required<Omit<PasswordConfig, 'hashPassword' | 'verifyPassword'>> & {\n hashPassword?: PasswordConfig['hashPassword'];\n verifyPassword?: PasswordConfig['verifyPassword'];\n };\n private _enabled: boolean;\n\n constructor(storage: KVStorage, config?: PasswordConfig) {\n this.storage = storage;\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n };\n // DISABLED BY DEFAULT - must be explicitly enabled\n this._enabled = false;\n\n // Warn about password usage\n console.warn(\n '[Pars Auth] Password provider initialized. ' +\n 'Consider using passwordless authentication for better security.'\n );\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n /**\n * Enable the password provider\n * Must be explicitly called to enable password authentication\n */\n enable(): void {\n this._enabled = true;\n console.warn(\n '[Pars Auth] Password provider enabled. ' +\n 'Ensure you have proper security measures in place (rate limiting, account lockout, etc.)'\n );\n }\n\n /**\n * Disable the password provider\n */\n disable(): void {\n this._enabled = false;\n }\n\n /**\n * Validate password against policy\n */\n validatePassword(password: string): PasswordValidationResult {\n const errors: string[] = [];\n\n if (password.length < this.config.minLength) {\n errors.push(`Password must be at least ${this.config.minLength} characters`);\n }\n\n if (password.length > this.config.maxLength) {\n errors.push(`Password must be at most ${this.config.maxLength} characters`);\n }\n\n if (this.config.requireUppercase && !/[A-Z]/.test(password)) {\n errors.push('Password must contain at least one uppercase letter');\n }\n\n if (this.config.requireLowercase && !/[a-z]/.test(password)) {\n errors.push('Password must contain at least one lowercase letter');\n }\n\n if (this.config.requireNumber && !/\\d/.test(password)) {\n errors.push('Password must contain at least one number');\n }\n\n if (this.config.requireSpecial && !/[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(password)) {\n errors.push('Password must contain at least one special character');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Check password strength\n */\n checkStrength(password: string): PasswordStrength {\n let score = 0;\n\n // Length score\n if (password.length >= 8) score++;\n if (password.length >= 12) score++;\n if (password.length >= 16) score++;\n\n // Character variety score\n if (/[a-z]/.test(password)) score++;\n if (/[A-Z]/.test(password)) score++;\n if (/\\d/.test(password)) score++;\n if (/[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(password)) score++;\n\n // Bonus for mixed characters\n if (/(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)/.test(password)) score++;\n\n if (score <= 3) return 'weak';\n if (score <= 5) return 'fair';\n if (score <= 7) return 'strong';\n return 'very-strong';\n }\n\n /**\n * Hash a password\n * Uses Web Crypto API for PBKDF2 (bcrypt alternative for edge runtime)\n */\n async hashPassword(password: string): Promise<string> {\n // Use custom hash function if provided\n if (this.config.hashPassword) {\n return this.config.hashPassword(password);\n }\n\n // Use PBKDF2 with Web Crypto API (edge-compatible)\n const encoder = new TextEncoder();\n const salt = crypto.getRandomValues(new Uint8Array(16));\n\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n );\n\n const iterations = 100000 * (this.config.bcryptCost / 10);\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256',\n },\n keyMaterial,\n 256\n );\n\n const hashArray = new Uint8Array(derivedBits);\n\n // Format: $pbkdf2-sha256$iterations$salt$hash\n const saltB64 = btoa(String.fromCharCode(...salt));\n const hashB64 = btoa(String.fromCharCode(...hashArray));\n\n return `$pbkdf2-sha256$${iterations}$${saltB64}$${hashB64}`;\n }\n\n /**\n * Verify a password against a hash\n */\n async verifyPassword(password: string, hash: string): Promise<boolean> {\n // Use custom verify function if provided\n if (this.config.verifyPassword) {\n return this.config.verifyPassword(password, hash);\n }\n\n // Parse PBKDF2 hash\n const parts = hash.split('$');\n if (parts.length !== 5 || parts[1] !== 'pbkdf2-sha256') {\n return false;\n }\n\n const iterations = parseInt(parts[2]!, 10);\n const salt = Uint8Array.from(atob(parts[3]!), (c) => c.charCodeAt(0));\n const storedHash = Uint8Array.from(atob(parts[4]!), (c) => c.charCodeAt(0));\n\n const encoder = new TextEncoder();\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(password),\n 'PBKDF2',\n false,\n ['deriveBits']\n );\n\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: 'SHA-256',\n },\n keyMaterial,\n 256\n );\n\n const computedHash = new Uint8Array(derivedBits);\n\n // Constant-time comparison\n return this.constantTimeEquals(storedHash, computedHash);\n }\n\n /**\n * Authenticate with password (implements AuthProvider)\n */\n async authenticate(input: AuthInput): Promise<AuthResult> {\n if (!this._enabled) {\n return {\n success: false,\n error: 'Password authentication is disabled',\n errorCode: 'PROVIDER_DISABLED',\n };\n }\n\n const { identifier, credential } = input;\n\n if (!identifier || !credential) {\n return {\n success: false,\n error: 'Email and password are required',\n errorCode: 'INVALID_INPUT',\n };\n }\n\n // Password verification should be done by the auth engine\n // which has access to the user's stored password hash\n // This provider just validates the input format\n\n const validation = this.validatePassword(credential);\n if (!validation.valid) {\n return {\n success: false,\n error: validation.errors.join(', '),\n errorCode: 'INVALID_PASSWORD',\n };\n }\n\n return {\n success: true,\n // Auth engine will handle user lookup and password verification\n };\n }\n\n /**\n * Store password hash for a user\n */\n async setPassword(userId: string, password: string): Promise<{ success: boolean; errors?: string[] }> {\n const validation = this.validatePassword(password);\n if (!validation.valid) {\n return { success: false, errors: validation.errors };\n }\n\n const hash = await this.hashPassword(password);\n await this.storage.set(`password:user:${userId}`, {\n hash,\n updatedAt: new Date().toISOString(),\n });\n\n return { success: true };\n }\n\n /**\n * Verify password for a user\n */\n async verifyUserPassword(userId: string, password: string): Promise<boolean> {\n const data = await this.storage.get<{ hash: string }>(`password:user:${userId}`);\n if (!data) {\n return false;\n }\n\n return this.verifyPassword(password, data.hash);\n }\n\n /**\n * Check if user has password set\n */\n async hasPassword(userId: string): Promise<boolean> {\n return this.storage.has(`password:user:${userId}`);\n }\n\n /**\n * Remove password for a user (switch to passwordless)\n */\n async removePassword(userId: string): Promise<void> {\n await this.storage.delete(`password:user:${userId}`);\n }\n\n /**\n * Get provider info\n */\n getInfo(): ProviderInfo {\n return {\n name: this.name,\n type: this.type,\n enabled: this.enabled,\n displayName: 'Password',\n };\n }\n\n /**\n * Constant-time comparison to prevent timing attacks\n */\n private constantTimeEquals(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a[i]! ^ b[i]!;\n }\n\n return result === 0;\n }\n}\n\n/**\n * Create Password provider\n */\nexport function createPasswordProvider(storage: KVStorage, config?: PasswordConfig): PasswordProvider {\n return new PasswordProvider(storage, config);\n}\n","/**\n * Drizzle ORM Adapter for @parsrun/auth\n * Implements AuthAdapter interface using Drizzle ORM with PostgreSQL\n */\n\nimport { eq, and, desc, isNull, like } from 'drizzle-orm';\nimport type {\n AuthAdapter,\n AdapterUser,\n AdapterSession,\n AdapterAuthMethod,\n AdapterTenant,\n AdapterMembership,\n CreateUserInput,\n CreateSessionInput,\n CreateAuthMethodInput,\n CreateMembershipInput,\n CreateTenantInput,\n} from '../../config.js';\nimport type {\n DrizzleDatabase,\n DrizzleAuthSchema,\n DrizzleUser,\n DrizzleSession,\n DrizzleAuthMethod,\n DrizzleTenant,\n DrizzleTenantMembership,\n} from './types.js';\n\n// Re-export types\nexport * from './types.js';\n\n/**\n * Drizzle adapter configuration\n */\nexport interface DrizzleAdapterConfig {\n /** Drizzle database instance */\n db: DrizzleDatabase;\n /** Database schema with auth tables */\n schema: DrizzleAuthSchema;\n /** Enable soft deletes (default: true) */\n softDelete?: boolean;\n /** Enable audit logging (default: false) */\n enableAuditLog?: boolean;\n}\n\n/**\n * Convert Drizzle user to adapter user\n */\nfunction toAdapterUser(user: DrizzleUser, authMethod?: DrizzleAuthMethod): AdapterUser {\n return {\n id: user.id,\n email: authMethod?.provider === 'email' ? authMethod.providerId : null,\n phone: authMethod?.provider === 'phone' ? authMethod.providerId : null,\n name: user.displayName ?? null,\n avatar: user.avatarUrl ?? null,\n emailVerified: user.emailVerified,\n phoneVerified: user.phoneVerified,\n twoFactorEnabled: user.twoFactorEnabled,\n status: user.status as AdapterUser['status'],\n createdAt: user.insertedAt,\n updatedAt: user.updatedAt,\n };\n}\n\n/**\n * Convert Drizzle session to adapter session\n */\nfunction toAdapterSession(session: DrizzleSession): AdapterSession {\n return {\n id: session.id,\n userId: session.userId,\n tenantId: session.currentTenantId ?? null,\n expiresAt: session.expiresAt,\n refreshExpiresAt: session.refreshExpiresAt ?? null,\n deviceType: session.deviceType ?? null,\n deviceName: session.deviceName ?? null,\n userAgent: session.userAgent ?? null,\n ipAddress: session.ipAddress ?? null,\n status: session.status as AdapterSession['status'],\n createdAt: session.insertedAt,\n updatedAt: session.updatedAt,\n };\n}\n\n/**\n * Convert Drizzle auth method to adapter auth method\n */\nfunction toAdapterAuthMethod(method: DrizzleAuthMethod): AdapterAuthMethod {\n return {\n id: method.id,\n userId: method.userId,\n provider: method.provider,\n providerId: method.providerId,\n verified: method.verified,\n metadata: method.metadata ?? undefined,\n createdAt: method.insertedAt,\n updatedAt: method.updatedAt,\n };\n}\n\n/**\n * Convert Drizzle tenant to adapter tenant\n */\nfunction toAdapterTenant(tenant: DrizzleTenant): AdapterTenant {\n return {\n id: tenant.id,\n name: tenant.name,\n slug: tenant.slug,\n status: tenant.status as AdapterTenant['status'],\n parentId: tenant.parentId,\n path: tenant.path,\n depth: tenant.depth,\n createdAt: tenant.insertedAt,\n updatedAt: tenant.updatedAt,\n };\n}\n\n/**\n * Convert Drizzle membership to adapter membership\n */\nfunction toAdapterMembership(membership: DrizzleTenantMembership, roleName?: string): AdapterMembership {\n return {\n id: membership.id,\n userId: membership.userId,\n tenantId: membership.tenantId,\n role: roleName ?? 'member',\n permissions: membership.permissions ? Object.keys(membership.permissions) : undefined,\n status: membership.status as AdapterMembership['status'],\n createdAt: membership.insertedAt,\n updatedAt: membership.updatedAt,\n };\n}\n\n/**\n * Create Drizzle adapter\n */\nexport function createDrizzleAdapter(config: DrizzleAdapterConfig): AuthAdapter {\n const { db, schema, softDelete = true } = config;\n const { users, sessions, authMethods, tenants, tenantMemberships, roles } = schema;\n\n return {\n // ============================================\n // User Operations\n // ============================================\n\n async createUser(input: CreateUserInput): Promise<AdapterUser> {\n const [user] = await db\n .insert(users)\n .values({\n displayName: input.name,\n avatarUrl: input.avatar,\n emailVerified: input.emailVerified ?? false,\n phoneVerified: input.phoneVerified ?? false,\n twoFactorEnabled: false,\n status: 'active',\n metadata: {},\n })\n .returning();\n\n // Create auth method if email or phone provided\n let authMethod: DrizzleAuthMethod | undefined;\n if (input.email) {\n [authMethod] = await db\n .insert(authMethods)\n .values({\n userId: user.id,\n provider: 'email',\n providerId: input.email.toLowerCase(),\n verified: input.emailVerified ?? false,\n })\n .returning();\n } else if (input.phone) {\n [authMethod] = await db\n .insert(authMethods)\n .values({\n userId: user.id,\n provider: 'phone',\n providerId: input.phone,\n verified: input.phoneVerified ?? false,\n })\n .returning();\n }\n\n return toAdapterUser(user, authMethod);\n },\n\n async findUserById(id: string): Promise<AdapterUser | null> {\n const [result] = await db\n .select()\n .from(users)\n .where(and(eq(users.id, id), softDelete ? isNull(users.deletedAt) : undefined))\n .limit(1);\n\n if (!result) return null;\n\n // Get primary auth method\n const [authMethod] = await db\n .select()\n .from(authMethods)\n .where(and(eq(authMethods.userId, id), isNull(authMethods.deletedAt)))\n .limit(1);\n\n return toAdapterUser(result, authMethod);\n },\n\n async findUserByEmail(email: string): Promise<AdapterUser | null> {\n const normalizedEmail = email.toLowerCase().trim();\n\n const [result] = await db\n .select({\n user: users,\n authMethod: authMethods,\n })\n .from(authMethods)\n .innerJoin(users, eq(authMethods.userId, users.id))\n .where(\n and(\n eq(authMethods.provider, 'email'),\n eq(authMethods.providerId, normalizedEmail),\n softDelete ? isNull(users.deletedAt) : undefined\n )\n )\n .limit(1);\n\n if (!result) return null;\n\n return toAdapterUser(result.user, result.authMethod);\n },\n\n async findUserByPhone(phone: string): Promise<AdapterUser | null> {\n const [result] = await db\n .select({\n user: users,\n authMethod: authMethods,\n })\n .from(authMethods)\n .innerJoin(users, eq(authMethods.userId, users.id))\n .where(\n and(\n eq(authMethods.provider, 'phone'),\n eq(authMethods.providerId, phone),\n softDelete ? isNull(users.deletedAt) : undefined\n )\n )\n .limit(1);\n\n if (!result) return null;\n\n return toAdapterUser(result.user, result.authMethod);\n },\n\n async updateUser(\n id: string,\n data: Partial<AdapterUser>\n ): Promise<AdapterUser> {\n const updateData: Record<string, unknown> = {\n updatedAt: new Date(),\n };\n\n if (data.name !== undefined) updateData['displayName'] = data.name;\n if (data.avatar !== undefined) updateData['avatarUrl'] = data.avatar;\n if (data.emailVerified !== undefined) updateData['emailVerified'] = data.emailVerified;\n if (data.phoneVerified !== undefined) updateData['phoneVerified'] = data.phoneVerified;\n if (data.twoFactorEnabled !== undefined) updateData['twoFactorEnabled'] = data.twoFactorEnabled;\n if (data.status !== undefined) updateData['status'] = data.status;\n\n const [user] = await db.update(users).set(updateData).where(eq(users.id, id)).returning();\n\n const [authMethod] = await db\n .select()\n .from(authMethods)\n .where(eq(authMethods.userId, id))\n .limit(1);\n\n return toAdapterUser(user, authMethod);\n },\n\n async deleteUser(id: string): Promise<void> {\n if (softDelete) {\n await db.update(users).set({ deletedAt: new Date() }).where(eq(users.id, id));\n } else {\n await db.delete(users).where(eq(users.id, id));\n }\n },\n\n // ============================================\n // Session Operations\n // ============================================\n\n async createSession(input: CreateSessionInput): Promise<AdapterSession> {\n const [session] = await db\n .insert(sessions)\n .values({\n userId: input.userId,\n currentTenantId: input.tenantId,\n expiresAt: input.expiresAt,\n refreshExpiresAt: input.refreshExpiresAt,\n deviceType: input.deviceType,\n deviceName: input.deviceName,\n userAgent: input.userAgent,\n ipAddress: input.ipAddress,\n status: 'active',\n csrfTokenHash: '',\n lastActivityAt: new Date(),\n })\n .returning();\n\n return toAdapterSession(session);\n },\n\n async findSessionById(id: string): Promise<AdapterSession | null> {\n const [session] = await db\n .select()\n .from(sessions)\n .where(and(eq(sessions.id, id), eq(sessions.status, 'active')))\n .limit(1);\n\n if (!session) return null;\n\n return toAdapterSession(session);\n },\n\n async findSessionsByUserId(userId: string): Promise<AdapterSession[]> {\n const result = await db\n .select()\n .from(sessions)\n .where(and(eq(sessions.userId, userId), eq(sessions.status, 'active')))\n .orderBy(desc(sessions.lastActivityAt));\n\n return result.map(toAdapterSession);\n },\n\n async updateSession(\n id: string,\n data: Partial<AdapterSession>\n ): Promise<AdapterSession> {\n const updateData: Record<string, unknown> = {\n updatedAt: new Date(),\n };\n\n if (data.tenantId !== undefined) updateData['currentTenantId'] = data.tenantId;\n if (data.expiresAt !== undefined) updateData['expiresAt'] = data.expiresAt;\n if (data.refreshExpiresAt !== undefined) updateData['refreshExpiresAt'] = data.refreshExpiresAt;\n if (data.status !== undefined) updateData['status'] = data.status;\n\n const [session] = await db\n .update(sessions)\n .set(updateData)\n .where(eq(sessions.id, id))\n .returning();\n\n return toAdapterSession(session);\n },\n\n async deleteSession(id: string): Promise<void> {\n await db\n .update(sessions)\n .set({ status: 'revoked', revokedAt: new Date() })\n .where(eq(sessions.id, id));\n },\n\n async deleteSessionsByUserId(userId: string): Promise<void> {\n await db\n .update(sessions)\n .set({ status: 'revoked', revokedAt: new Date() })\n .where(eq(sessions.userId, userId));\n },\n\n // ============================================\n // Auth Method Operations\n // ============================================\n\n async createAuthMethod(input: CreateAuthMethodInput): Promise<AdapterAuthMethod> {\n const [method] = await db\n .insert(authMethods)\n .values({\n userId: input.userId,\n provider: input.provider,\n providerId: input.providerId,\n verified: input.verified ?? false,\n metadata: input.metadata ?? {},\n })\n .returning();\n\n return toAdapterAuthMethod(method);\n },\n\n async findAuthMethod(provider: string, providerId: string): Promise<AdapterAuthMethod | null> {\n const [method] = await db\n .select()\n .from(authMethods)\n .where(\n and(\n eq(authMethods.provider, provider),\n eq(authMethods.providerId, providerId),\n softDelete ? isNull(authMethods.deletedAt) : undefined\n )\n )\n .limit(1);\n\n if (!method) return null;\n\n return toAdapterAuthMethod(method);\n },\n\n async findAuthMethodsByUserId(userId: string): Promise<AdapterAuthMethod[]> {\n const result = await db\n .select()\n .from(authMethods)\n .where(\n and(eq(authMethods.userId, userId), softDelete ? isNull(authMethods.deletedAt) : undefined)\n );\n\n return result.map(toAdapterAuthMethod);\n },\n\n async deleteAuthMethod(id: string): Promise<void> {\n if (softDelete) {\n await db.update(authMethods).set({ deletedAt: new Date() }).where(eq(authMethods.id, id));\n } else {\n await db.delete(authMethods).where(eq(authMethods.id, id));\n }\n },\n\n // ============================================\n // Tenant Operations (Optional)\n // ============================================\n\n async findTenantById(id: string): Promise<AdapterTenant | null> {\n if (!tenants) return null;\n\n const [tenant] = await db\n .select()\n .from(tenants)\n .where(and(eq(tenants.id, id), softDelete ? isNull(tenants.deletedAt) : undefined))\n .limit(1);\n\n if (!tenant) return null;\n\n return toAdapterTenant(tenant);\n },\n\n async findTenantBySlug(slug: string): Promise<AdapterTenant | null> {\n if (!tenants) return null;\n\n const [tenant] = await db\n .select()\n .from(tenants)\n .where(and(eq(tenants.slug, slug), softDelete ? isNull(tenants.deletedAt) : undefined))\n .limit(1);\n\n if (!tenant) return null;\n\n return toAdapterTenant(tenant);\n },\n\n async createTenant(input: CreateTenantInput): Promise<AdapterTenant> {\n if (!tenants) {\n throw new Error('Tenants table not configured');\n }\n\n const [tenant] = await db\n .insert(tenants)\n .values({\n name: input.name,\n slug: input.slug,\n status: input.status ?? 'active',\n parentId: input.parentId ?? null,\n path: input.path ?? null,\n depth: input.depth ?? null,\n subscriptionPlan: 'free',\n settings: {},\n })\n .returning();\n\n return toAdapterTenant(tenant);\n },\n\n async updateTenant(id: string, data: Partial<AdapterTenant>): Promise<AdapterTenant> {\n if (!tenants) {\n throw new Error('Tenants table not configured');\n }\n\n const updateData: Record<string, unknown> = {\n updatedAt: new Date(),\n };\n\n if (data.name !== undefined) updateData['name'] = data.name;\n if (data.slug !== undefined) updateData['slug'] = data.slug;\n if (data.status !== undefined) updateData['status'] = data.status;\n if (data.parentId !== undefined) updateData['parentId'] = data.parentId;\n if (data.path !== undefined) updateData['path'] = data.path;\n if (data.depth !== undefined) updateData['depth'] = data.depth;\n\n const [tenant] = await db\n .update(tenants)\n .set(updateData)\n .where(eq(tenants.id, id))\n .returning();\n\n return toAdapterTenant(tenant);\n },\n\n async deleteTenant(id: string): Promise<void> {\n if (!tenants) return;\n\n if (softDelete) {\n await db.update(tenants).set({ deletedAt: new Date() }).where(eq(tenants.id, id));\n } else {\n await db.delete(tenants).where(eq(tenants.id, id));\n }\n },\n\n // ============================================\n // Tenant Hierarchy Operations (Optional)\n // ============================================\n\n async findTenantsByParentId(parentId: string | null): Promise<AdapterTenant[]> {\n if (!tenants) return [];\n\n const result = await db\n .select()\n .from(tenants)\n .where(\n and(\n parentId === null ? isNull(tenants.parentId) : eq(tenants.parentId, parentId),\n softDelete ? isNull(tenants.deletedAt) : undefined\n )\n );\n\n return result.map(toAdapterTenant);\n },\n\n async findTenantsByPath(pathPrefix: string): Promise<AdapterTenant[]> {\n if (!tenants) return [];\n\n const result = await db\n .select()\n .from(tenants)\n .where(\n and(\n like(tenants.path, `${pathPrefix}%`),\n softDelete ? isNull(tenants.deletedAt) : undefined\n )\n );\n\n return result.map(toAdapterTenant);\n },\n\n async updateTenantPath(tenantId: string, path: string, depth: number): Promise<void> {\n if (!tenants) return;\n\n await db\n .update(tenants)\n .set({ path, depth, updatedAt: new Date() })\n .where(eq(tenants.id, tenantId));\n },\n\n // ============================================\n // Membership Operations (Optional)\n // ============================================\n\n async findMembership(userId: string, tenantId: string): Promise<AdapterMembership | null> {\n if (!tenantMemberships) return null;\n\n const [membership] = await db\n .select()\n .from(tenantMemberships)\n .where(\n and(\n eq(tenantMemberships.userId, userId),\n eq(tenantMemberships.tenantId, tenantId),\n softDelete ? isNull(tenantMemberships.deletedAt) : undefined\n )\n )\n .limit(1);\n\n if (!membership) return null;\n\n // Get role name if roles table exists\n let roleName: string | undefined;\n if (roles && membership.roleId) {\n const [role] = await db\n .select()\n .from(roles)\n .where(eq(roles.id, membership.roleId))\n .limit(1);\n roleName = role?.name;\n }\n\n return toAdapterMembership(membership, roleName);\n },\n\n async findMembershipsByUserId(userId: string): Promise<AdapterMembership[]> {\n if (!tenantMemberships) return [];\n\n const result = await db\n .select()\n .from(tenantMemberships)\n .where(\n and(\n eq(tenantMemberships.userId, userId),\n eq(tenantMemberships.status, 'active'),\n softDelete ? isNull(tenantMemberships.deletedAt) : undefined\n )\n );\n\n // Get role names if roles table exists\n const membershipsWithRoles = await Promise.all(\n result.map(async (membership: DrizzleTenantMembership) => {\n let roleName: string | undefined;\n if (roles && membership.roleId) {\n const [role] = await db\n .select()\n .from(roles)\n .where(eq(roles.id, membership.roleId))\n .limit(1);\n roleName = role?.name;\n }\n return toAdapterMembership(membership, roleName);\n })\n );\n\n return membershipsWithRoles;\n },\n\n async createMembership(input: CreateMembershipInput): Promise<AdapterMembership> {\n if (!tenantMemberships) {\n throw new Error('Tenant memberships table not configured');\n }\n\n // Find role by name if roles table exists\n let roleId: string | undefined;\n if (roles && input.role) {\n const [role] = await db\n .select()\n .from(roles)\n .where(eq(roles.name, input.role))\n .limit(1);\n roleId = role?.id;\n }\n\n const [membership] = await db\n .insert(tenantMemberships)\n .values({\n userId: input.userId,\n tenantId: input.tenantId,\n roleId: roleId ?? null,\n status: 'active',\n permissions: input.permissions ? Object.fromEntries(input.permissions.map(p => [p, true])) : {},\n accessLevel: 'full',\n resourceRestrictions: {},\n joinedAt: new Date(),\n })\n .returning();\n\n return toAdapterMembership(membership, input.role);\n },\n\n async updateMembership(\n id: string,\n data: Partial<AdapterMembership>\n ): Promise<AdapterMembership> {\n if (!tenantMemberships) {\n throw new Error('Tenant memberships table not configured');\n }\n\n const updateData: Record<string, unknown> = {\n updatedAt: new Date(),\n };\n\n // Find role by name if updating role\n if (data.role !== undefined && roles) {\n const [role] = await db\n .select()\n .from(roles)\n .where(eq(roles.name, data.role))\n .limit(1);\n updateData['roleId'] = role?.id ?? null;\n }\n\n if (data.status !== undefined) updateData['status'] = data.status;\n if (data.permissions !== undefined) {\n updateData['permissions'] = Object.fromEntries(data.permissions.map(p => [p, true]));\n }\n\n const [membership] = await db\n .update(tenantMemberships)\n .set(updateData)\n .where(eq(tenantMemberships.id, id))\n .returning();\n\n // Get role name\n let roleName: string | undefined;\n if (roles && membership.roleId) {\n const [role] = await db\n .select()\n .from(roles)\n .where(eq(roles.id, membership.roleId))\n .limit(1);\n roleName = role?.name;\n }\n\n return toAdapterMembership(membership, roleName);\n },\n\n async deleteMembership(id: string): Promise<void> {\n if (!tenantMemberships) return;\n\n if (softDelete) {\n await db\n .update(tenantMemberships)\n .set({ deletedAt: new Date(), status: 'inactive' })\n .where(eq(tenantMemberships.id, id));\n } else {\n await db.delete(tenantMemberships).where(eq(tenantMemberships.id, id));\n }\n },\n };\n}\n","/**\n * Resend Email Provider\n * Uses Resend API for sending emails\n */\n\nimport type { EmailProvider, EmailOptions, EmailResult } from './types.js';\n\n/**\n * Resend provider configuration\n */\nexport interface ResendProviderConfig {\n /** Resend API key */\n apiKey: string;\n /** Default from email */\n fromEmail?: string;\n /** Default from name */\n fromName?: string;\n /** Resend API base URL (default: https://api.resend.com) */\n baseUrl?: string;\n}\n\n/**\n * Resend Email Provider\n */\nexport class ResendEmailProvider implements EmailProvider {\n private apiKey: string;\n private fromEmail: string;\n private fromName: string;\n private baseUrl: string;\n\n constructor(config: ResendProviderConfig) {\n this.apiKey = config.apiKey;\n this.fromEmail = config.fromEmail ?? 'noreply@example.com';\n this.fromName = config.fromName ?? 'App';\n this.baseUrl = config.baseUrl ?? 'https://api.resend.com';\n }\n\n /**\n * Send email via Resend API\n */\n async sendEmail(options: EmailOptions): Promise<EmailResult> {\n const from = options.from ?? `${this.fromName} <${this.fromEmail}>`;\n\n try {\n const response = await fetch(`${this.baseUrl}/emails`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n from,\n to: [options.to],\n subject: options.subject,\n html: options.html,\n text: options.text,\n reply_to: options.replyTo,\n cc: options.cc,\n bcc: options.bcc,\n headers: options.headers,\n attachments: options.attachments?.map((a) => ({\n filename: a.filename,\n content: typeof a.content === 'string' ? a.content : a.content.toString('base64'),\n content_type: a.contentType,\n })),\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as Record<string, unknown>;\n return {\n success: false,\n error: (errorData['message'] as string) ?? `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n const data = await response.json() as Record<string, unknown>;\n\n return {\n success: true,\n messageId: data['id'] as string,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n}\n\n/**\n * Create Resend email provider\n */\nexport function createResendProvider(config: ResendProviderConfig): ResendEmailProvider {\n return new ResendEmailProvider(config);\n}\n","/**\n * OTP Email Template\n */\n\ninterface OTPTemplateOptions {\n code: string;\n expiresInMinutes: number;\n userName?: string;\n appName: string;\n}\n\n/**\n * Generate OTP email HTML\n */\nexport function generateOTPEmailHTML(options: OTPTemplateOptions): string {\n const { code, expiresInMinutes, userName, appName } = options;\n const greeting = userName ? `Hi ${userName}` : 'Hello';\n\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Your Verification Code</title>\n</head>\n<body style=\"margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background-color: #f8fafc;\">\n <div style=\"max-width: 600px; margin: 0 auto; padding: 20px;\">\n <div style=\"background: white; border-radius: 12px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.07); overflow: hidden;\">\n <!-- Header -->\n <div style=\"background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; text-align: center; padding: 40px 20px;\">\n <h1 style=\"margin: 0; font-size: 24px; font-weight: 600;\">${appName}</h1>\n <p style=\"margin: 10px 0 0; opacity: 0.9;\">Verification Code</p>\n </div>\n\n <!-- Content -->\n <div style=\"padding: 40px 30px;\">\n <p style=\"font-size: 16px; margin-bottom: 20px;\">${greeting},</p>\n <p style=\"color: #4a5568;\">Use the following code to verify your identity:</p>\n\n <!-- Code Box -->\n <div style=\"text-align: center; margin: 30px 0;\">\n <div style=\"background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%); border: 2px dashed #cbd5e0; border-radius: 12px; padding: 25px; display: inline-block;\">\n <span style=\"font-size: 36px; font-weight: 700; color: #4c51bf; letter-spacing: 8px; font-family: 'Monaco', 'Menlo', monospace;\">\n ${code}\n </span>\n </div>\n </div>\n\n <!-- Expiry Warning -->\n <div style=\"background: #fef7e0; border: 1px solid #f6e05e; border-radius: 8px; padding: 12px; margin: 20px 0; color: #744210; text-align: center; font-weight: 500;\">\n ⏱️ This code expires in ${expiresInMinutes} minutes\n </div>\n\n <!-- Security Notice -->\n <div style=\"background: #fed7d7; border: 1px solid #fc8181; border-radius: 8px; padding: 12px; margin: 20px 0; color: #c53030; font-size: 14px;\">\n 🔒 Never share this code with anyone. ${appName} will never ask for your code.\n </div>\n\n <p style=\"color: #718096; font-size: 14px; margin-top: 30px;\">\n If you didn't request this code, you can safely ignore this email.\n </p>\n </div>\n\n <!-- Footer -->\n <div style=\"background: #f7fafc; padding: 20px 30px; text-align: center; border-top: 1px solid #e2e8f0;\">\n <p style=\"color: #a0aec0; font-size: 12px; margin: 0;\">\n © ${new Date().getFullYear()} ${appName}. All rights reserved.\n </p>\n </div>\n </div>\n </div>\n</body>\n</html>\n`;\n}\n\n/**\n * Generate OTP email plain text\n */\nexport function generateOTPEmailText(options: OTPTemplateOptions): string {\n const { code, expiresInMinutes, userName, appName } = options;\n const greeting = userName ? `Hi ${userName}` : 'Hello';\n\n return `${greeting},\n\nYour ${appName} verification code is: ${code}\n\nThis code expires in ${expiresInMinutes} minutes.\n\nNever share this code with anyone. ${appName} will never ask for your code.\n\nIf you didn't request this code, you can safely ignore this email.\n\n- The ${appName} Team`;\n}\n","/**\n * Email Verification Template\n */\n\ninterface VerificationTemplateOptions {\n verificationUrl: string;\n userName?: string;\n expiresInHours: number;\n appName: string;\n}\n\n/**\n * Generate verification email HTML\n */\nexport function generateVerificationEmailHTML(options: VerificationTemplateOptions): string {\n const { verificationUrl, userName, expiresInHours, appName } = options;\n const greeting = userName ? `Hi ${userName}` : 'Hello';\n\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Verify Your Email</title>\n</head>\n<body style=\"margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background-color: #f8fafc;\">\n <div style=\"max-width: 600px; margin: 0 auto; padding: 20px;\">\n <div style=\"background: white; border-radius: 12px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.07); overflow: hidden;\">\n <!-- Header -->\n <div style=\"background: linear-gradient(135deg, #10b981 0%, #059669 100%); color: white; text-align: center; padding: 40px 20px;\">\n <h1 style=\"margin: 0; font-size: 24px; font-weight: 600;\">${appName}</h1>\n <p style=\"margin: 10px 0 0; opacity: 0.9;\">Email Verification</p>\n </div>\n\n <!-- Content -->\n <div style=\"padding: 40px 30px;\">\n <p style=\"font-size: 16px; margin-bottom: 20px;\">${greeting},</p>\n <p style=\"color: #4a5568;\">Please verify your email address by clicking the button below:</p>\n\n <!-- Button -->\n <div style=\"text-align: center; margin: 30px 0;\">\n <a href=\"${verificationUrl}\" style=\"display: inline-block; padding: 14px 32px; background: linear-gradient(135deg, #10b981 0%, #059669 100%); color: white; text-decoration: none; border-radius: 8px; font-weight: 600; font-size: 16px;\">\n Verify Email Address\n </a>\n </div>\n\n <!-- Expiry Notice -->\n <div style=\"background: #fef7e0; border: 1px solid #f6e05e; border-radius: 8px; padding: 12px; margin: 20px 0; color: #744210; text-align: center;\">\n ⏱️ This link expires in ${expiresInHours} hour${expiresInHours > 1 ? 's' : ''}\n </div>\n\n <!-- Alternative Link -->\n <p style=\"color: #718096; font-size: 14px; margin-top: 20px;\">\n If the button doesn't work, copy and paste this link into your browser:\n </p>\n <p style=\"background: #f7fafc; padding: 12px; border-radius: 6px; word-break: break-all; font-size: 12px; color: #4a5568;\">\n ${verificationUrl}\n </p>\n\n <p style=\"color: #718096; font-size: 14px; margin-top: 30px;\">\n If you didn't create an account, you can safely ignore this email.\n </p>\n </div>\n\n <!-- Footer -->\n <div style=\"background: #f7fafc; padding: 20px 30px; text-align: center; border-top: 1px solid #e2e8f0;\">\n <p style=\"color: #a0aec0; font-size: 12px; margin: 0;\">\n © ${new Date().getFullYear()} ${appName}. All rights reserved.\n </p>\n </div>\n </div>\n </div>\n</body>\n</html>\n`;\n}\n\n/**\n * Generate verification email plain text\n */\nexport function generateVerificationEmailText(options: VerificationTemplateOptions): string {\n const { verificationUrl, userName, expiresInHours, appName } = options;\n const greeting = userName ? `Hi ${userName}` : 'Hello';\n\n return `${greeting},\n\nPlease verify your email address by clicking the link below:\n\n${verificationUrl}\n\nThis link expires in ${expiresInHours} hour${expiresInHours > 1 ? 's' : ''}.\n\nIf you didn't create an account, you can safely ignore this email.\n\n- The ${appName} Team`;\n}\n","/**\n * Magic Link Email Template\n */\n\ninterface MagicLinkTemplateOptions {\n magicLinkUrl: string;\n expiresInMinutes: number;\n userName?: string;\n appName: string;\n}\n\n/**\n * Generate magic link email HTML\n */\nexport function generateMagicLinkEmailHTML(options: MagicLinkTemplateOptions): string {\n const { magicLinkUrl, expiresInMinutes, userName, appName } = options;\n const greeting = userName ? `Hi ${userName}` : 'Hello';\n\n return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Sign in to ${appName}</title>\n</head>\n<body style=\"margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background-color: #f8fafc;\">\n <div style=\"max-width: 600px; margin: 0 auto; padding: 20px;\">\n <div style=\"background: white; border-radius: 12px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.07); overflow: hidden;\">\n <!-- Header -->\n <div style=\"background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%); color: white; text-align: center; padding: 40px 20px;\">\n <h1 style=\"margin: 0; font-size: 24px; font-weight: 600;\">${appName}</h1>\n <p style=\"margin: 10px 0 0; opacity: 0.9;\">Sign In Link</p>\n </div>\n\n <!-- Content -->\n <div style=\"padding: 40px 30px;\">\n <p style=\"font-size: 16px; margin-bottom: 20px;\">${greeting},</p>\n <p style=\"color: #4a5568;\">Click the button below to sign in to your account:</p>\n\n <!-- Button -->\n <div style=\"text-align: center; margin: 30px 0;\">\n <a href=\"${magicLinkUrl}\" style=\"display: inline-block; padding: 14px 32px; background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%); color: white; text-decoration: none; border-radius: 8px; font-weight: 600; font-size: 16px;\">\n Sign In to ${appName}\n </a>\n </div>\n\n <!-- Expiry Notice -->\n <div style=\"background: #fef7e0; border: 1px solid #f6e05e; border-radius: 8px; padding: 12px; margin: 20px 0; color: #744210; text-align: center;\">\n ⏱️ This link expires in ${expiresInMinutes} minutes\n </div>\n\n <!-- Security Notice -->\n <div style=\"background: #e0e7ff; border: 1px solid #818cf8; border-radius: 8px; padding: 12px; margin: 20px 0; color: #3730a3; font-size: 14px;\">\n 🔒 This is a single-use link. After you click it, you'll be signed in automatically.\n </div>\n\n <!-- Alternative Link -->\n <p style=\"color: #718096; font-size: 14px; margin-top: 20px;\">\n If the button doesn't work, copy and paste this link into your browser:\n </p>\n <p style=\"background: #f7fafc; padding: 12px; border-radius: 6px; word-break: break-all; font-size: 12px; color: #4a5568;\">\n ${magicLinkUrl}\n </p>\n\n <p style=\"color: #718096; font-size: 14px; margin-top: 30px;\">\n If you didn't request this sign-in link, you can safely ignore this email.\n </p>\n </div>\n\n <!-- Footer -->\n <div style=\"background: #f7fafc; padding: 20px 30px; text-align: center; border-top: 1px solid #e2e8f0;\">\n <p style=\"color: #a0aec0; font-size: 12px; margin: 0;\">\n © ${new Date().getFullYear()} ${appName}. All rights reserved.\n </p>\n </div>\n </div>\n </div>\n</body>\n</html>\n`;\n}\n\n/**\n * Generate magic link email plain text\n */\nexport function generateMagicLinkEmailText(options: MagicLinkTemplateOptions): string {\n const { magicLinkUrl, expiresInMinutes, userName, appName } = options;\n const greeting = userName ? `Hi ${userName}` : 'Hello';\n\n return `${greeting},\n\nClick the link below to sign in to your ${appName} account:\n\n${magicLinkUrl}\n\nThis link expires in ${expiresInMinutes} minutes.\n\nThis is a single-use link. After you click it, you'll be signed in automatically.\n\nIf you didn't request this sign-in link, you can safely ignore this email.\n\n- The ${appName} Team`;\n}\n","/**\n * Email Service\n * Provides email sending functionality with templates\n */\n\nimport type {\n EmailProvider,\n EmailOptions,\n EmailResult,\n EmailServiceConfig,\n OTPEmailOptions,\n VerificationEmailOptions,\n WelcomeEmailOptions,\n MagicLinkEmailOptions,\n PasswordResetEmailOptions,\n InvitationEmailOptions,\n} from './types.js';\nimport { ResendEmailProvider } from './resend-provider.js';\nimport { generateOTPEmailHTML, generateOTPEmailText } from './templates/otp.js';\nimport { generateVerificationEmailHTML, generateVerificationEmailText } from './templates/verification.js';\nimport { generateMagicLinkEmailHTML, generateMagicLinkEmailText } from './templates/magic-link.js';\n\n// Re-export types and providers\nexport * from './types.js';\nexport { ResendEmailProvider, createResendProvider } from './resend-provider.js';\n\n/**\n * Email Service\n * Singleton service for sending emails\n */\nexport class EmailService {\n private provider: EmailProvider;\n private fromEmail: string;\n private fromName: string;\n private devMode: boolean;\n\n constructor(config: EmailServiceConfig) {\n this.devMode = config.devMode ?? process.env['NODE_ENV'] !== 'production';\n this.fromEmail = config.fromEmail ?? process.env['EMAIL_FROM_ADDRESS'] ?? 'noreply@example.com';\n this.fromName = config.fromName ?? process.env['EMAIL_FROM_NAME'] ?? 'App';\n\n if (config.provider) {\n this.provider = config.provider;\n } else {\n const apiKey = config.apiKey ?? process.env['RESEND_API_KEY'] ?? process.env['EMAIL_API_KEY'];\n if (!apiKey) {\n throw new Error('Email API key is required (RESEND_API_KEY or EMAIL_API_KEY)');\n }\n this.provider = new ResendEmailProvider({\n apiKey,\n fromEmail: this.fromEmail,\n fromName: this.fromName,\n });\n }\n }\n\n /**\n * Send email\n */\n async sendEmail(options: EmailOptions): Promise<EmailResult> {\n // Development mode: log instead of send\n if (this.devMode) {\n console.log('📧 EMAIL (Development Mode):');\n console.log('To:', options.to);\n console.log('Subject:', options.subject);\n console.log('From:', options.from ?? `${this.fromName} <${this.fromEmail}>`);\n console.log('Content:', options.html?.substring(0, 200) ?? options.text?.substring(0, 200));\n console.log('─'.repeat(50));\n return { success: true, messageId: 'dev-mode-' + Date.now() };\n }\n\n return this.provider.sendEmail(options);\n }\n\n /**\n * Send OTP verification email\n */\n async sendOTPEmail(options: OTPEmailOptions): Promise<EmailResult> {\n const { email, code, expiresInMinutes = 10, userName, appName = this.fromName } = options;\n\n return this.sendEmail({\n to: email,\n subject: `Your ${appName} Verification Code`,\n html: generateOTPEmailHTML({ code, expiresInMinutes, userName, appName }),\n text: generateOTPEmailText({ code, expiresInMinutes, userName, appName }),\n });\n }\n\n /**\n * Send email verification email\n */\n async sendVerificationEmail(options: VerificationEmailOptions): Promise<EmailResult> {\n const { email, verificationUrl, userName, expiresInHours = 24, appName = this.fromName } = options;\n\n return this.sendEmail({\n to: email,\n subject: `Verify your ${appName} email`,\n html: generateVerificationEmailHTML({ verificationUrl, userName, expiresInHours, appName }),\n text: generateVerificationEmailText({ verificationUrl, userName, expiresInHours, appName }),\n });\n }\n\n /**\n * Send magic link email\n */\n async sendMagicLinkEmail(options: MagicLinkEmailOptions): Promise<EmailResult> {\n const { email, magicLinkUrl, expiresInMinutes = 15, userName, appName = this.fromName } = options;\n\n return this.sendEmail({\n to: email,\n subject: `Sign in to ${appName}`,\n html: generateMagicLinkEmailHTML({ magicLinkUrl, expiresInMinutes, userName, appName }),\n text: generateMagicLinkEmailText({ magicLinkUrl, expiresInMinutes, userName, appName }),\n });\n }\n\n /**\n * Send welcome email\n */\n async sendWelcomeEmail(options: WelcomeEmailOptions): Promise<EmailResult> {\n const { email, userName, appName = this.fromName, loginUrl } = options;\n\n const greeting = userName ? `Hi ${userName}` : 'Welcome';\n\n return this.sendEmail({\n to: email,\n subject: `Welcome to ${appName}!`,\n html: `\n <div style=\"font-family: sans-serif; max-width: 600px; margin: 0 auto;\">\n <h1>${greeting},</h1>\n <p>Thank you for joining ${appName}!</p>\n <p>We're excited to have you on board.</p>\n ${loginUrl ? `<p><a href=\"${loginUrl}\" style=\"display: inline-block; padding: 12px 24px; background: #4F46E5; color: white; text-decoration: none; border-radius: 6px;\">Get Started</a></p>` : ''}\n <p>Best regards,<br>The ${appName} Team</p>\n </div>\n `,\n text: `${greeting},\\n\\nThank you for joining ${appName}!\\n\\nWe're excited to have you on board.\\n\\n${loginUrl ? `Get Started: ${loginUrl}\\n\\n` : ''}Best regards,\\nThe ${appName} Team`,\n });\n }\n\n /**\n * Send password reset email\n */\n async sendPasswordResetEmail(options: PasswordResetEmailOptions): Promise<EmailResult> {\n const { email, resetUrl, expiresInHours = 1, userName, appName = this.fromName } = options;\n\n const greeting = userName ? `Hi ${userName}` : 'Hello';\n\n return this.sendEmail({\n to: email,\n subject: `Reset your ${appName} password`,\n html: `\n <div style=\"font-family: sans-serif; max-width: 600px; margin: 0 auto;\">\n <h1>${greeting},</h1>\n <p>We received a request to reset your password.</p>\n <p>Click the button below to reset it. This link expires in ${expiresInHours} hour${expiresInHours > 1 ? 's' : ''}.</p>\n <p><a href=\"${resetUrl}\" style=\"display: inline-block; padding: 12px 24px; background: #4F46E5; color: white; text-decoration: none; border-radius: 6px;\">Reset Password</a></p>\n <p style=\"color: #666; font-size: 14px;\">If you didn't request this, you can safely ignore this email.</p>\n <p>Best regards,<br>The ${appName} Team</p>\n </div>\n `,\n text: `${greeting},\\n\\nWe received a request to reset your password.\\n\\nClick the link below to reset it. This link expires in ${expiresInHours} hour${expiresInHours > 1 ? 's' : ''}.\\n\\n${resetUrl}\\n\\nIf you didn't request this, you can safely ignore this email.\\n\\nBest regards,\\nThe ${appName} Team`,\n });\n }\n\n /**\n * Send invitation email\n */\n async sendInvitationEmail(options: InvitationEmailOptions): Promise<EmailResult> {\n const {\n email,\n invitationUrl,\n inviterName,\n organizationName,\n roleName,\n expiresInDays = 7,\n appName = this.fromName,\n } = options;\n\n const roleText = roleName ? ` as a ${roleName}` : '';\n\n return this.sendEmail({\n to: email,\n subject: `You're invited to join ${organizationName} on ${appName}`,\n html: `\n <div style=\"font-family: sans-serif; max-width: 600px; margin: 0 auto;\">\n <h1>You're Invited!</h1>\n <p>${inviterName} has invited you to join <strong>${organizationName}</strong>${roleText}.</p>\n <p>Click the button below to accept the invitation. This link expires in ${expiresInDays} day${expiresInDays > 1 ? 's' : ''}.</p>\n <p><a href=\"${invitationUrl}\" style=\"display: inline-block; padding: 12px 24px; background: #4F46E5; color: white; text-decoration: none; border-radius: 6px;\">Accept Invitation</a></p>\n <p style=\"color: #666; font-size: 14px;\">If you don't want to join, you can safely ignore this email.</p>\n <p>Best regards,<br>The ${appName} Team</p>\n </div>\n `,\n text: `You're Invited!\\n\\n${inviterName} has invited you to join ${organizationName}${roleText}.\\n\\nClick the link below to accept the invitation. This link expires in ${expiresInDays} day${expiresInDays > 1 ? 's' : ''}.\\n\\n${invitationUrl}\\n\\nIf you don't want to join, you can safely ignore this email.\\n\\nBest regards,\\nThe ${appName} Team`,\n });\n }\n}\n\n/**\n * Create email service\n */\nexport function createEmailService(config: EmailServiceConfig): EmailService {\n return new EmailService(config);\n}\n","/**\n * NetGSM SMS Provider\n * Turkish SMS gateway provider\n */\n\nimport type { SMSProvider, SMSOptions, SMSResult } from './index.js';\n\n/**\n * NetGSM configuration\n */\nexport interface NetGSMConfig {\n /** NetGSM username */\n username: string;\n /** NetGSM password */\n password: string;\n /** SMS header/sender ID */\n header: string;\n /** NetGSM API URL (default: https://api.netgsm.com.tr/sms/send/otp) */\n apiUrl?: string;\n}\n\n/**\n * NetGSM SMS Provider\n */\nexport class NetGSMProvider implements SMSProvider {\n private config: Required<NetGSMConfig>;\n\n constructor(config: NetGSMConfig) {\n this.config = {\n apiUrl: 'https://api.netgsm.com.tr/sms/send/otp',\n ...config,\n };\n }\n\n /**\n * Send SMS via NetGSM API\n */\n async sendSMS(options: SMSOptions): Promise<SMSResult> {\n try {\n // Build XML payload for NetGSM API\n const xmlData = `<?xml version='1.0' encoding='iso-8859-9'?>\n<mainbody>\n <header>\n <usercode>${this.escapeXml(this.config.username)}</usercode>\n <password>${this.escapeXml(this.config.password)}</password>\n <msgheader>${this.escapeXml(options.from ?? this.config.header)}</msgheader>\n <encoding>TR</encoding>\n </header>\n <body>\n <msg><![CDATA[${options.message}]]></msg>\n <no>${this.sanitizePhoneNumber(options.to)}</no>\n </body>\n</mainbody>`;\n\n // Send request to NetGSM API\n const response = await fetch(this.config.apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/xml',\n },\n body: xmlData,\n });\n\n if (!response.ok) {\n return {\n success: false,\n error: `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n // Parse XML response\n const responseText = await response.text();\n const result = this.parseResponse(responseText);\n\n if (result.success) {\n return {\n success: true,\n messageId: result.code,\n };\n }\n\n return {\n success: false,\n error: `NetGSM error code: ${result.code} - ${this.getErrorMessage(result.code ?? '')}`,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Parse NetGSM XML response\n */\n private parseResponse(xml: string): { success: boolean; code?: string } {\n try {\n // Simple XML parsing for <code> element\n const codeMatch = xml.match(/<code>(.*?)<\\/code>/);\n if (!codeMatch) {\n // Try alternative format (plain text response)\n const trimmed = xml.trim();\n if (trimmed.length < 20 && /^\\d+$/.test(trimmed)) {\n // Response is just a code\n if (trimmed === '00' || trimmed === '0') {\n return { success: true, code: trimmed };\n }\n return { success: false, code: trimmed };\n }\n return { success: false };\n }\n\n const code = codeMatch[1]!.trim();\n\n // NetGSM returns \"00\" or \"0\" for success\n if (code === '00' || code === '0' || code.length > 10) {\n return { success: true, code };\n }\n\n return { success: false, code };\n } catch {\n return { success: false };\n }\n }\n\n /**\n * Get human-readable error message\n */\n private getErrorMessage(code: string): string {\n const errors: Record<string, string> = {\n '20': 'Message text is missing',\n '30': 'Invalid credentials',\n '40': 'Sender ID not approved',\n '50': 'Invalid recipient number',\n '51': 'Duplicate recipient',\n '60': 'OTP sending blocked',\n '70': 'Incorrect parameter format',\n '80': 'Query limit exceeded',\n '85': 'Same content sent too frequently',\n };\n\n return errors[code] ?? 'Unknown error';\n }\n\n /**\n * Escape XML special characters\n */\n private escapeXml(unsafe: string): string {\n return unsafe\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n /**\n * Sanitize phone number\n */\n private sanitizePhoneNumber(phone: string): string {\n // Remove spaces, dashes, parentheses\n let cleaned = phone.replace(/[\\s\\-\\(\\)]/g, '');\n\n // Remove leading + if present\n if (cleaned.startsWith('+')) {\n cleaned = cleaned.substring(1);\n }\n\n // If Turkish number without country code, add it\n if (cleaned.startsWith('5') && cleaned.length === 10) {\n cleaned = '90' + cleaned;\n }\n\n return cleaned;\n }\n}\n\n/**\n * Create NetGSM provider\n */\nexport function createNetGSMProvider(config: NetGSMConfig): NetGSMProvider {\n return new NetGSMProvider(config);\n}\n","/**\n * SMS Service\n * Provides SMS sending functionality\n */\n\n/**\n * SMS provider interface\n */\nexport interface SMSProvider {\n /** Send an SMS */\n sendSMS(options: SMSOptions): Promise<SMSResult>;\n}\n\n/**\n * SMS options\n */\nexport interface SMSOptions {\n /** Recipient phone number (E.164 format) */\n to: string;\n /** Message content */\n message: string;\n /** Sender ID (alphanumeric, max 11 chars) */\n from?: string;\n}\n\n/**\n * SMS send result\n */\nexport interface SMSResult {\n success: boolean;\n messageId?: string;\n error?: string;\n}\n\n/**\n * SMS service configuration\n */\nexport interface SMSServiceConfig {\n /** SMS provider instance */\n provider?: SMSProvider;\n /** Default sender ID */\n senderId?: string;\n /** Development mode (logs SMS instead of sending) */\n devMode?: boolean;\n}\n\n/**\n * OTP SMS options\n */\nexport interface OTPSMSOptions {\n /** Recipient phone number */\n phone: string;\n /** OTP code */\n code: string;\n /** Expiration in minutes (default: 10) */\n expiresInMinutes?: number;\n /** App name */\n appName?: string;\n}\n\n/**\n * SMS Service\n */\nexport class SMSService {\n private provider: SMSProvider | null;\n private senderId: string;\n private devMode: boolean;\n\n constructor(config: SMSServiceConfig) {\n this.devMode = config.devMode ?? process.env['NODE_ENV'] !== 'production';\n this.senderId = config.senderId ?? process.env['SMS_SENDER_ID'] ?? 'App';\n this.provider = config.provider ?? null;\n }\n\n /**\n * Send SMS\n */\n async sendSMS(options: SMSOptions): Promise<SMSResult> {\n // Development mode: log instead of send\n if (this.devMode) {\n console.log('📱 SMS (Development Mode):');\n console.log('To:', options.to);\n console.log('From:', options.from ?? this.senderId);\n console.log('Message:', options.message);\n console.log('─'.repeat(50));\n return { success: true, messageId: 'dev-mode-' + Date.now() };\n }\n\n if (!this.provider) {\n return { success: false, error: 'SMS provider not configured' };\n }\n\n return this.provider.sendSMS({\n ...options,\n from: options.from ?? this.senderId,\n });\n }\n\n /**\n * Send OTP SMS\n */\n async sendOTPSMS(options: OTPSMSOptions): Promise<SMSResult> {\n const { phone, code, expiresInMinutes = 10, appName = this.senderId } = options;\n\n const message = `Your ${appName} verification code is: ${code}. Valid for ${expiresInMinutes} minutes.`;\n\n return this.sendSMS({\n to: phone,\n message,\n });\n }\n}\n\n/**\n * Create SMS service\n */\nexport function createSMSService(config: SMSServiceConfig): SMSService {\n return new SMSService(config);\n}\n\n// Export providers\nexport { NetGSMProvider, createNetGSMProvider } from './netgsm-provider.js';\nexport type { NetGSMConfig } from './netgsm-provider.js';\n","/**\n * Email Verification Service\n * Handles email verification tokens and status\n */\n\nimport type { KVStorage } from '../../storage/types.js';\nimport { generateRandomHex, sha256Hex } from '../../utils/crypto.js';\n\n/**\n * Email verification configuration\n */\nexport interface EmailVerificationConfig {\n /** Base URL for verification links */\n baseUrl: string;\n /** Verification callback path (default: /auth/verify-email) */\n callbackPath?: string;\n /** Token expiration in seconds (default: 86400 = 24 hours) */\n expiresIn?: number;\n /** Token length in bytes (default: 32) */\n tokenLength?: number;\n}\n\n/**\n * Verification token record\n */\ninterface VerificationToken {\n email: string;\n tokenHash: string;\n expiresAt: string;\n usedAt?: string;\n createdBy?: string;\n}\n\n/**\n * Request verification result\n */\nexport interface RequestVerificationResult {\n success: boolean;\n token?: string;\n verificationUrl?: string;\n expiresAt?: Date;\n error?: string;\n}\n\n/**\n * Verify email result\n */\nexport interface VerifyEmailResult {\n success: boolean;\n email?: string;\n error?: string;\n}\n\n/**\n * Verification status\n */\nexport interface VerificationStatus {\n email: string;\n verified: boolean;\n pendingVerification: boolean;\n expiresAt?: Date;\n}\n\n/**\n * Email Verification Service\n */\nexport class EmailVerificationService {\n private storage: KVStorage;\n private config: Required<EmailVerificationConfig>;\n\n constructor(storage: KVStorage, config: EmailVerificationConfig) {\n this.storage = storage;\n this.config = {\n callbackPath: '/auth/verify-email',\n expiresIn: 86400, // 24 hours\n tokenLength: 32,\n ...config,\n };\n }\n\n /**\n * Create verification token for an email\n */\n async createVerificationToken(\n email: string,\n options?: { createdBy?: string }\n ): Promise<RequestVerificationResult> {\n const normalizedEmail = email.toLowerCase().trim();\n\n // Generate secure token\n const token = await generateRandomHex(this.config.tokenLength);\n const tokenHash = await sha256Hex(token);\n\n // Calculate expiration\n const expiresAt = new Date(Date.now() + this.config.expiresIn * 1000);\n\n // Clean up old tokens for this email\n await this.deleteTokensByEmail(normalizedEmail);\n\n // Store token\n const tokenData: VerificationToken = {\n email: normalizedEmail,\n tokenHash,\n expiresAt: expiresAt.toISOString(),\n createdBy: options?.createdBy,\n };\n\n await this.storage.set(`email-verify:hash:${tokenHash}`, tokenData, this.config.expiresIn);\n await this.storage.set(`email-verify:email:${normalizedEmail}`, tokenHash, this.config.expiresIn);\n\n // Build verification URL\n const params = new URLSearchParams({ token });\n const verificationUrl = `${this.config.baseUrl}${this.config.callbackPath}?${params}`;\n\n return {\n success: true,\n token,\n verificationUrl,\n expiresAt,\n };\n }\n\n /**\n * Verify an email token\n */\n async verifyToken(token: string): Promise<VerifyEmailResult> {\n const tokenHash = await sha256Hex(token);\n\n // Find token\n const tokenData = await this.storage.get<VerificationToken>(`email-verify:hash:${tokenHash}`);\n\n if (!tokenData) {\n return { success: false, error: 'Invalid or expired verification token' };\n }\n\n if (tokenData.usedAt) {\n return { success: false, error: 'Verification token already used' };\n }\n\n if (new Date(tokenData.expiresAt) < new Date()) {\n await this.deleteToken(tokenHash);\n return { success: false, error: 'Verification token expired' };\n }\n\n // Mark token as used\n tokenData.usedAt = new Date().toISOString();\n await this.storage.set(`email-verify:hash:${tokenHash}`, tokenData, 300); // Keep for 5 min for audit\n\n // Clean up email lookup\n await this.storage.delete(`email-verify:email:${tokenData.email}`);\n\n return {\n success: true,\n email: tokenData.email,\n };\n }\n\n /**\n * Check verification status for an email\n */\n async getStatus(email: string): Promise<VerificationStatus> {\n const normalizedEmail = email.toLowerCase().trim();\n\n // Check for pending verification\n const tokenHash = await this.storage.get<string>(`email-verify:email:${normalizedEmail}`);\n\n if (tokenHash) {\n const tokenData = await this.storage.get<VerificationToken>(`email-verify:hash:${tokenHash}`);\n if (tokenData && !tokenData.usedAt) {\n return {\n email: normalizedEmail,\n verified: false,\n pendingVerification: true,\n expiresAt: new Date(tokenData.expiresAt),\n };\n }\n }\n\n return {\n email: normalizedEmail,\n verified: false,\n pendingVerification: false,\n };\n }\n\n /**\n * Resend verification email\n * Returns a new token for the same email\n */\n async resendVerification(\n email: string,\n options?: { createdBy?: string }\n ): Promise<RequestVerificationResult> {\n return this.createVerificationToken(email, options);\n }\n\n /**\n * Cancel pending verification\n */\n async cancelVerification(email: string): Promise<void> {\n const normalizedEmail = email.toLowerCase().trim();\n await this.deleteTokensByEmail(normalizedEmail);\n }\n\n /**\n * Delete token by hash\n */\n private async deleteToken(tokenHash: string): Promise<void> {\n const tokenData = await this.storage.get<VerificationToken>(`email-verify:hash:${tokenHash}`);\n if (tokenData) {\n await this.storage.delete(`email-verify:email:${tokenData.email}`);\n }\n await this.storage.delete(`email-verify:hash:${tokenHash}`);\n }\n\n /**\n * Delete all tokens for an email\n */\n private async deleteTokensByEmail(email: string): Promise<void> {\n const tokenHash = await this.storage.get<string>(`email-verify:email:${email}`);\n if (tokenHash) {\n await this.storage.delete(`email-verify:hash:${tokenHash}`);\n }\n await this.storage.delete(`email-verify:email:${email}`);\n }\n}\n\n/**\n * Create email verification service\n */\nexport function createEmailVerificationService(\n storage: KVStorage,\n config: EmailVerificationConfig\n): EmailVerificationService {\n return new EmailVerificationService(storage, config);\n}\n","/**\n * @module\n * Passwordless-first authentication for Pars.\n * A provider-based, multi-runtime authentication library.\n *\n * @example\n * ```typescript\n * import { createAuth } from '@parsrun/auth';\n *\n * const auth = createAuth({\n * secret: process.env.AUTH_SECRET,\n * adapter: myDatabaseAdapter,\n * providers: {\n * otp: {\n * email: {\n * send: async (to, code) => {\n * await sendEmail(to, `Your code is: ${code}`);\n * },\n * },\n * },\n * },\n * });\n *\n * await auth.initialize();\n *\n * // Request OTP\n * await auth.requestOTP({ identifier: 'user@example.com', type: 'email' });\n *\n * // Sign in with OTP\n * const result = await auth.signIn({\n * provider: 'otp',\n * identifier: 'user@example.com',\n * credential: '123456',\n * data: { type: 'email' },\n * });\n * ```\n */\n\nimport type { ParsAuthConfig } from './config.js';\nimport { ParsAuthEngine, createAuthEngine } from './core/index.js';\n\n// ============================================\n// MAIN EXPORTS\n// ============================================\n\n/**\n * Create a Pars Auth instance\n *\n * @param config - Auth configuration\n * @returns ParsAuth instance (must call initialize() before use)\n *\n * @example\n * ```typescript\n * const auth = createAuth({\n * secret: 'your-secret-key',\n * adapter: drizzleAdapter(db),\n * providers: {\n * otp: {\n * email: {\n * send: async (to, code) => sendEmail(to, code),\n * },\n * },\n * },\n * });\n *\n * await auth.initialize();\n * ```\n */\nexport function createAuth(config: ParsAuthConfig): ParsAuthEngine {\n return createAuthEngine(config);\n}\n\n// Re-export the auth engine class\nexport { ParsAuthEngine } from './core/index.js';\n\n// ============================================\n// CONFIG EXPORTS\n// ============================================\n\nexport {\n type ParsAuthConfig,\n type SessionConfig,\n type JwtConfig,\n type CookieConfig,\n type CsrfConfig,\n type TenantConfig,\n type TenantResolutionStrategy,\n type OtpConfig,\n type MagicLinkConfig,\n type TotpConfig,\n type WebAuthnConfig,\n type PasswordConfig,\n type OAuthProviderConfig,\n type SecurityConfig,\n type AuthCallbacks,\n type AuthAdapter,\n type AdapterUser,\n type AdapterSession,\n type AdapterAuthMethod,\n type AdapterTenant,\n type AdapterMembership,\n type CreateUserInput,\n type CreateSessionInput,\n type CreateAuthMethodInput,\n type CreateMembershipInput,\n defaultConfig,\n mergeConfig,\n validateConfig,\n} from './config.js';\n\n// ============================================\n// CORE EXPORTS\n// ============================================\n\nexport {\n type AuthContext,\n type SignInInput,\n type SignInResult,\n type SignUpInput,\n type SignUpResult,\n type VerifyTokenResult,\n type RefreshTokenResult,\n type SessionInfo,\n} from './core/index.js';\n\n// ============================================\n// MULTI-TENANT EXPORTS\n// ============================================\n\n// Tenant Resolution\nexport {\n TenantResolver,\n MultiStrategyTenantResolver,\n createTenantResolver,\n createMultiStrategyResolver,\n type TenantResolverConfig,\n type TenantResolutionResult,\n} from './core/index.js';\n\n// Tenant Management\nexport {\n TenantManager,\n createTenantManager,\n type CreateTenantInput,\n type UpdateTenantInput,\n type AddMemberInput,\n type UpdateMemberInput,\n type TenantWithMembers,\n type UserTenantMembership,\n} from './core/index.js';\n\n// Invitation System\nexport {\n InvitationService,\n createInvitationService,\n type InvitationConfig,\n type InvitationRecord,\n type SendInvitationInput,\n type SendInvitationResult,\n type AcceptInvitationInput,\n type AcceptInvitationResult,\n type InvitationStatusResult,\n} from './core/index.js';\n\n// ============================================\n// PROVIDER EXPORTS\n// ============================================\n\nexport {\n ProviderRegistry,\n type AuthProvider,\n type ProviderType,\n type ProviderInfo,\n type AuthInput,\n type AuthResult,\n type VerifyInput,\n type VerifyResult,\n type OAuthProvider,\n type OAuthUserInfo,\n type TwoFactorProvider,\n type TwoFactorSetupResult,\n} from './providers/index.js';\n\n// OTP Provider\nexport {\n OTPProvider,\n OTPManager,\n createOTPProvider,\n createOTPManager,\n type RequestOTPInput,\n type RequestOTPResult,\n type OTPConfig,\n} from './providers/otp/index.js';\n\n// OTP Manager types (from otp-manager)\nexport type {\n OTPRecord,\n StoreOTPResult,\n VerifyOTPResult,\n RateLimitCheck,\n} from './providers/otp/otp-manager.js';\n\n// OAuth Provider\nexport {\n OAuthManager,\n GoogleProvider,\n GitHubProvider,\n MicrosoftProvider,\n AppleProvider,\n createOAuthManager,\n generatePKCE,\n generateState,\n type OAuthConfig,\n type OAuthFlowResult,\n type OAuthCallbackResult,\n type OAuthUserInfo as OAuthUser,\n type OAuthTokens,\n type OAuthState,\n type OAuthProviderName,\n type GoogleConfig,\n type GitHubConfig,\n type MicrosoftConfig,\n type AppleConfig,\n} from './providers/oauth/index.js';\n\n// Magic Link Provider\nexport {\n MagicLinkProvider,\n createMagicLinkProvider,\n type MagicLinkConfig as MagicLinkProviderConfig,\n type SendMagicLinkResult,\n type VerifyMagicLinkResult,\n} from './providers/magic-link/index.js';\n\n// TOTP Provider (2FA)\nexport {\n TOTPProvider,\n createTOTPProvider,\n type TOTPConfig as TOTPProviderConfig,\n type TOTPSetupData,\n type TOTPVerifyResult,\n} from './providers/totp/index.js';\n\n// WebAuthn Provider (Passkeys)\nexport {\n WebAuthnProvider,\n createWebAuthnProvider,\n type WebAuthnConfig as WebAuthnProviderConfig,\n type RegistrationOptions,\n type AuthenticationOptions,\n type WebAuthnCredential,\n type ClientDataJSON,\n type AuthenticatorData,\n} from './providers/webauthn/index.js';\n\n// Password Provider (DISABLED BY DEFAULT)\nexport {\n PasswordProvider,\n createPasswordProvider,\n type PasswordConfig as PasswordProviderConfig,\n type PasswordValidationResult,\n type PasswordStrength,\n} from './providers/password/index.js';\n\n// ============================================\n// SESSION EXPORTS\n// ============================================\n\nexport {\n JwtManager,\n JwtError,\n SessionBlocklist,\n TokenBlocklist,\n createJwtManager,\n createSessionBlocklist,\n createTokenBlocklist,\n extractBearerToken,\n parseDuration,\n type JwtConfig as JwtManagerConfig,\n type JwtPayload,\n type TokenPair,\n type KeyRotationResult,\n type BlocklistConfig,\n} from './session/index.js';\n\n// ============================================\n// STORAGE EXPORTS\n// ============================================\n\nexport {\n createStorage,\n createStorageSync,\n MemoryStorage,\n createMemoryStorage,\n StorageKeys,\n type KVStorage,\n type StorageType,\n type StorageConfig,\n type RedisConfig,\n type CloudflareKVConfig,\n type DenoKVConfig,\n type MemoryConfig,\n} from './storage/index.js';\n\n// ============================================\n// SECURITY EXPORTS\n// ============================================\n\nexport {\n RateLimiter,\n createRateLimiter,\n RateLimitPresets,\n CsrfManager,\n createCsrfManager,\n CsrfUtils,\n LockoutManager,\n createLockoutManager,\n DefaultLockoutConfig,\n type RateLimitConfig,\n type RateLimitResult,\n type CsrfConfig as CsrfManagerConfig,\n type CsrfTokenPair,\n type LockoutConfig,\n type LockoutStatus,\n // Authorization\n AuthorizationGuard,\n createAuthorizationGuard,\n authorize,\n Permissions,\n Roles,\n type AuthorizationContext,\n type TenantMembershipInfo,\n type AuthorizationResult,\n type AuthorizationRequirements,\n type PermissionPattern,\n} from './security/index.js';\n\n// ============================================\n// UTILITY EXPORTS\n// ============================================\n\nexport {\n detectRuntime,\n isNode,\n isDeno,\n isCloudflare,\n isBun,\n isEdge,\n getEnv,\n type Runtime,\n} from './utils/runtime.js';\n\n// Crypto utilities\nexport {\n generateRandomHex,\n generateRandomBase64Url,\n randomInt,\n sha256,\n sha256Hex,\n timingSafeEqual,\n timingSafeEqualBytes,\n base64UrlEncode,\n base64UrlDecode,\n hexToBytes,\n bytesToHex,\n} from './utils/crypto.js';\n\n// ============================================\n// ADAPTER EXPORTS\n// ============================================\n\nexport {\n createAuthMiddleware,\n createOptionalAuthMiddleware,\n createAuthRoutes,\n createHonoAuth,\n createAuthCookies,\n createLogoutCookies,\n // Authorization middleware helpers\n requireRole,\n requirePermission,\n requireAnyPermission,\n requireTenant,\n requireTenantAccess,\n requireAdmin,\n requireOwnerOrPermission,\n requireAll,\n requireAny,\n type AuthVariables,\n type HonoAdapterConfig,\n type AuthContext as AdapterAuthContext,\n type CookieOptions,\n type AuthResponse,\n} from './adapters/index.js';\n\n// Drizzle Adapter\nexport {\n createDrizzleAdapter,\n type DrizzleAdapterConfig,\n type DrizzleAuthSchema,\n type DrizzleDatabase,\n type DrizzleUser,\n type DrizzleSession,\n type DrizzleAuthMethod,\n type DrizzleTenant,\n type DrizzleTenantMembership,\n type DrizzleRole,\n type DrizzleEmailVerificationToken,\n} from './adapters/drizzle/index.js';\n\n// ============================================\n// SERVICES EXPORTS\n// ============================================\n\n// Email Service\nexport {\n EmailService,\n createEmailService,\n ResendEmailProvider,\n createResendProvider,\n type EmailProvider,\n type EmailOptions,\n type EmailResult,\n type EmailServiceConfig,\n type OTPEmailOptions,\n type VerificationEmailOptions,\n type WelcomeEmailOptions,\n type MagicLinkEmailOptions,\n type PasswordResetEmailOptions,\n type InvitationEmailOptions,\n type EmailAttachment,\n} from './services/email/index.js';\n\n// SMS Service\nexport {\n SMSService,\n createSMSService,\n NetGSMProvider,\n createNetGSMProvider,\n type SMSProvider,\n type SMSOptions,\n type SMSResult,\n type SMSServiceConfig,\n type OTPSMSOptions,\n type NetGSMConfig,\n} from './services/sms/index.js';\n\n// Email Verification Service\nexport {\n EmailVerificationService,\n createEmailVerificationService,\n type EmailVerificationConfig,\n type RequestVerificationResult,\n type VerifyEmailResult,\n type VerificationStatus,\n} from './services/email-verification/index.js';\n"]}
|