email_challenge.ts (1408B)
1 import { Code } from "#core/domain/code.ts"; 2 import { CodeChallenge } from "#core/domain/code_challenge.ts"; 3 import { 4 EMAIL_CHALLENGE_ATTEMPT_LIMIT, 5 EMAIL_CHALLENGE_REQUEST_LIMIT, 6 EMAIL_CHALLENGE_TTL, 7 } from "#core/domain/constants.ts"; 8 import { Email } from "#core/domain/email.ts"; 9 import { Ephemeral } from "#core/domain/ephemeral.ts"; 10 import { DomainError } from "#core/domain/error.ts"; 11 import { Limiter } from "#core/domain/limiter.ts"; 12 13 export class EmailChallenge extends CodeChallenge { 14 constructor( 15 readonly address: Email, 16 verified?: boolean, 17 code?: Code, 18 codeExpire?: number, 19 request?: number, 20 requestExpire?: number, 21 attempt?: number, 22 attemptExpire?: number, 23 ) { 24 super( 25 EMAIL_CHALLENGE_TTL, 26 EMAIL_CHALLENGE_REQUEST_LIMIT, 27 EMAIL_CHALLENGE_ATTEMPT_LIMIT, 28 verified, 29 new Ephemeral(code, codeExpire), 30 new Limiter( 31 EMAIL_CHALLENGE_REQUEST_LIMIT, 32 EMAIL_CHALLENGE_TTL, 33 request, 34 requestExpire, 35 ), 36 new Limiter( 37 EMAIL_CHALLENGE_ATTEMPT_LIMIT, 38 EMAIL_CHALLENGE_TTL, 39 attempt, 40 attemptExpire, 41 ), 42 ); 43 } 44 45 public assertVerified() { 46 if (!this.verified) { 47 throw new UnverifiedEmail(); 48 } 49 } 50 } 51 52 export class UnverifiedEmail extends DomainError { 53 constructor(options?: ErrorOptions) { 54 super("Unverified email", options); 55 } 56 }