aboutsummaryrefslogtreecommitdiff
path: root/services/docker/mail-server/aws-sendmail/aws
diff options
context:
space:
mode:
Diffstat (limited to 'services/docker/mail-server/aws-sendmail/aws')
-rw-r--r--services/docker/mail-server/aws-sendmail/aws/app.ts22
-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.ts48
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.");
+ }
+}