import { IPasswordHasher } from './IPasswordHasher' export class CombinedPasswordHasher implements IPasswordHasher { private hashers: { [name: string]: IPasswordHasher } constructor( private defaultHasherName: string, defaultHasher: IPasswordHasher, additionalHashers?: { [name: string]: IPasswordHasher } ) { this.hashers = { [this.defaultHasherName]: defaultHasher, ...(additionalHashers || {}), } } public async hash(password: string): Promise { return this.defaultHasherName + ':' + (await this.hashers[this.defaultHasherName].hash(password)) } public verify(password: string, passwordHash: string): Promise { const passwordHashName = passwordHash.split(':')[0] const passwordHashTail = passwordHash .split(':') .slice(1) .join(':') return this.hashers[passwordHashName].verify(password, passwordHashTail) } }