diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-04-30 00:20:23 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-05-14 17:14:29 +0800 |
commit | 8930bb11fce19c773201b4f499d99c1c3c28efa6 (patch) | |
tree | 5ad13f3fc5fc7c6bd914aad39e0ffc824cc0d612 /services/docker/mail-server/aws-sendmail/aws/service.ts | |
parent | 8ba08870fdb3bafa7b8739c4f1c57a70b8780143 (diff) | |
download | crupest-mail.tar.gz crupest-mail.tar.bz2 crupest-mail.zip |
HALF WORK!: 2025-5-14 2mail
Diffstat (limited to 'services/docker/mail-server/aws-sendmail/aws/service.ts')
-rw-r--r-- | services/docker/mail-server/aws-sendmail/aws/service.ts | 48 |
1 files changed, 48 insertions, 0 deletions
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<void>; +} + +interface Setup { + receiveCallback: (mail: Mail) => Promise<void>; + 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."); + } +} |