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 | |
| parent | 8ba08870fdb3bafa7b8739c4f1c57a70b8780143 (diff) | |
| download | crupest-8930bb11fce19c773201b4f499d99c1c3c28efa6.tar.gz crupest-8930bb11fce19c773201b4f499d99c1c3c28efa6.tar.bz2 crupest-8930bb11fce19c773201b4f499d99c1c3c28efa6.zip | |
HALF WORK!: 2025-5-14 2
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."); +  } +} | 
