import * as crypto from 'crypto'; import { v4 as uuidv4 } from 'uuid'; interface TokenConfig { ACCESS_TOKEN_LENGTH: number; REFRESHER_TOKEN_LENGTH: number; } const tokenConfig: TokenConfig = { ACCESS_TOKEN_LENGTH: 64, REFRESHER_TOKEN_LENGTH: 128, }; class PasswordHandlers { generateRandomUUID(is_string: boolean = true): string { return is_string ? uuidv4().toString() : uuidv4(); } create_hashed_password(uuid: string, password: string): string { const data = `${uuid}:${password}`; return crypto.createHash('sha256').update(data).digest('hex'); } createSelectToken(accessToken: string, userUUID: string) { const data = `${accessToken}:${userUUID}`; return crypto.createHash('sha256').update(data).digest('hex'); } check_password( uuid: string, password: string, hashed_password: string, ): boolean { const created_hashed_password = this.create_hashed_password(uuid, password); return created_hashed_password === hashed_password; } generateAccessToken(): string { return this.generateToken(tokenConfig.ACCESS_TOKEN_LENGTH); } generateRefreshToken(): string { return this.generateToken(tokenConfig.REFRESHER_TOKEN_LENGTH); } generateToken(length: number): string { const letters = 'abcdefghijklmnopqrstuvwxyz'; const mergedLetters = [...letters, ...letters.toUpperCase().split('')]; let token = crypto.randomBytes(length).toString('base64url'); token = token .split('') .map((char) => mergedLetters.includes(char) ? char : mergedLetters[Math.floor(Math.random() * mergedLetters.length)], ) .join(''); return token; } } export { PasswordHandlers };