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."); } }