aboutsummaryrefslogtreecommitdiff
path: root/services/docker/mail-server/aws-sendmail/deliver.ts
diff options
context:
space:
mode:
Diffstat (limited to 'services/docker/mail-server/aws-sendmail/deliver.ts')
-rw-r--r--services/docker/mail-server/aws-sendmail/deliver.ts46
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,
);
}
}