diff options
Diffstat (limited to 'services/docker/mail-server/aws-sendmail/deliver.ts')
-rw-r--r-- | services/docker/mail-server/aws-sendmail/deliver.ts | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/services/docker/mail-server/aws-sendmail/deliver.ts b/services/docker/mail-server/aws-sendmail/deliver.ts index 7035d8c..e0c6e1c 100644 --- a/services/docker/mail-server/aws-sendmail/deliver.ts +++ b/services/docker/mail-server/aws-sendmail/deliver.ts @@ -1,51 +1,61 @@ +import { Mail } from "./mail.ts"; + class MailDeliverError extends Error { constructor( message: string, options: ErrorOptions, - public readonly rawMail: string, + public readonly mail: Mail, ) { super(message, options); } } -export class MailDeliverContext { - constructor(public rawMail: string) {} -} - -type MailDeliverHook<Context> = (context: Context) => Promise<void>; +type MailDeliverHook = (mail: Mail) => Promise<void>; -export abstract class MailDeliverer<out TContext extends MailDeliverContext = MailDeliverContext> { - preHooks: MailDeliverHook<MailDeliverContext>[] = []; - postHooks: MailDeliverHook<MailDeliverContext>[] = []; +export abstract class MailDeliverer { + preHooks: MailDeliverHook[] = []; + postHooks: MailDeliverHook[] = []; constructor(public readonly destination: string) {} - protected abstract doPrepare(rawMail: string): Promise<TContext>; - protected abstract doDeliver(context: TContext): Promise<void>; + protected doPrepare(_mail: Mail): Promise<void> { + return Promise.resolve(); + } + protected abstract doDeliver(mail: Mail): Promise<void>; + protected doFinalize(_mail: Mail): Promise<void> { + return Promise.resolve(); + } + + async deliverRaw(raw: string): Promise<void> { + const mail = new Mail(raw); + await this.deliver(mail); + } - async deliver(rawMail: string): Promise<void> { - const context = await this.doPrepare(rawMail); + async deliver(mail: Mail): Promise<void> { + this.doPrepare(mail); for (const hook of this.preHooks) { - await hook(context); + await hook(mail); } - await this.doDeliver(context); + await this.doDeliver(mail); for (const hook of this.postHooks) { - await hook(context); + await hook(mail); } + + await this.doFinalize(mail); } protected throwError( reason: string, - rawMail: string, + mail: Mail, cause?: unknown, ): never { throw new MailDeliverError( `Failed to deliver mail to ${this.destination}: ${reason}`, { cause }, - rawMail, + mail, ); } } |