From 8930bb11fce19c773201b4f499d99c1c3c28efa6 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Wed, 30 Apr 2025 00:20:23 +0800 Subject: HALF WORK!: 2025-5-14 2 --- .../docker/mail-server/aws-sendmail/aws/service.ts | 48 ++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 services/docker/mail-server/aws-sendmail/aws/service.ts (limited to 'services/docker/mail-server/aws-sendmail/aws/service.ts') diff --git a/services/docker/mail-server/aws-sendmail/aws/service.ts b/services/docker/mail-server/aws-sendmail/aws/service.ts new file mode 100644 index 0000000..d0db7ae --- /dev/null +++ b/services/docker/mail-server/aws-sendmail/aws/service.ts @@ -0,0 +1,48 @@ +import { Mail } from "../mail.ts"; +import { AwsContext } from "./context.ts"; +import { AwsMailRetriever } from "./retriever.ts"; + +export interface AwsServiceSetupOptions { + receiveCallback: (mail: Mail) => Promise; +} + +interface Setup { + receiveCallback: (mail: Mail) => Promise; + retriever: AwsMailRetriever; + liveMailRecyclerAborter: AbortController; +} + +export class AwsService implements Disposable { + private _setup: Setup | null = null; + + constructor(private readonly aws: AwsContext) {} + + setup(options: AwsServiceSetupOptions): Disposable { + if (this._setup != null) { + // TODO: Better error. + throw new Error("Aws service has already been set up."); + } + const { receiveCallback } = options; + const liveMailRecyclerAborter = new AbortController(); + const retriever = new AwsMailRetriever(this.aws, receiveCallback); + + Deno.cron("live-mail-recycler", "0 */6 * * *", { + signal: liveMailRecyclerAborter.signal, + }, () => { + retriever.recycleLiveMails(); + }); + + this._setup = { + receiveCallback, + retriever, + liveMailRecyclerAborter, + }; + + return this; + } + + [Symbol.dispose]() { + if (this._setup == null) return; + this._setup.liveMailRecyclerAborter.abort("Aws service is being disposed."); + } +} -- cgit v1.2.3