diff options
Diffstat (limited to 'services/docker/mail-server/aws-sendmail/aws')
-rw-r--r-- | services/docker/mail-server/aws-sendmail/aws/app.ts | 22 | ||||
-rw-r--r-- | services/docker/mail-server/aws-sendmail/aws/retriever.ts (renamed from services/docker/mail-server/aws-sendmail/aws/retriver.ts) | 8 | ||||
-rw-r--r-- | services/docker/mail-server/aws-sendmail/aws/service.ts | 48 |
3 files changed, 70 insertions, 8 deletions
diff --git a/services/docker/mail-server/aws-sendmail/aws/app.ts b/services/docker/mail-server/aws-sendmail/aws/app.ts new file mode 100644 index 0000000..e25c92c --- /dev/null +++ b/services/docker/mail-server/aws-sendmail/aws/app.ts @@ -0,0 +1,22 @@ +import { Hono } from "https://jsr.io/@hono/hono/4.7.9/src/hono.ts"; +import { AppBase } from "../app.ts"; +import { MailDeliverer } from "../mail.ts"; +import { AwsContext } from "./context.ts"; +import { AwsMailDeliverer } from "./deliver.ts"; + +export class AwsRelayApp extends AppBase { + private readonly context = new AwsContext(); + private readonly deliverer = new AwsMailDeliverer(this.context); + + constructor() { + super(); + } + + protected override setupHono(_hono: Hono): Promise<void> { + + } + + protected override get outboundMailDeliverer(): MailDeliverer { + return this.deliverer; + } +} diff --git a/services/docker/mail-server/aws-sendmail/aws/retriver.ts b/services/docker/mail-server/aws-sendmail/aws/retriever.ts index b599c15..de577b0 100644 --- a/services/docker/mail-server/aws-sendmail/aws/retriver.ts +++ b/services/docker/mail-server/aws-sendmail/aws/retriever.ts @@ -17,7 +17,6 @@ export class AwsMailRetriever { readonly mailBucket = getConfig().getValue("awsMailBucket"); private readonly s3Client; - private readonly liveMailRecyclerAborter = new AbortController(); constructor( aws: AwsContext, @@ -27,13 +26,6 @@ export class AwsMailRetriever { this.s3Client = new S3Client({ region, credentials }); } - setupLiveMailRecycler() { - Deno.cron("live-mail-recycler", "0 */6 * * *", { - signal: this.liveMailRecyclerAborter.signal, - }, () => { - }); - } - async listLiveMails(): Promise<string[]> { const listCommand = new ListObjectsV2Command({ Bucket: this.mailBucket, 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."); + } +} |