diff options
author | Elizabeth Hunt <elizabeth.hunt@simponic.xyz> | 2024-12-15 01:57:28 -0800 |
---|---|---|
committer | Elizabeth Hunt <elizabeth.hunt@simponic.xyz> | 2024-12-15 02:05:18 -0800 |
commit | 4f1e974623f7e38693d3e202cd387c51f652b9d8 (patch) | |
tree | 947892a7f7608cb31424c8c37adea7c26a857bee /src/email.ts | |
parent | 53187bede7e871ceca8fe4fabd18822002eb9316 (diff) | |
download | uptime-4f1e974623f7e38693d3e202cd387c51f652b9d8.tar.gz uptime-4f1e974623f7e38693d3e202cd387c51f652b9d8.zip |
logout on end
Diffstat (limited to 'src/email.ts')
-rw-r--r-- | src/email.ts | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/email.ts b/src/email.ts index 6ad05a0..906b86d 100644 --- a/src/email.ts +++ b/src/email.ts @@ -14,7 +14,7 @@ interface ImapClientI { connect: () => Promise<void>; getMailboxLock: (mailbox: string) => Promise<MailboxLockObject>; messageDelete: (uids: number[], opts: Record<string, any>) => Promise<boolean>; - close: () => void; + logout: () => Promise<void>; } type Email = { @@ -26,13 +26,16 @@ type Email = { class ErrorWithLock extends Error { lock: O.Option<MailboxLockObject>; - constructor(message: string, lock?: MailboxLockObject) { + imap: O.Option<ImapClientI>; + constructor(message: string, lock?: MailboxLockObject, imap?: ImapClientI) { super(message); this.lock = O.fromNullable(lock); + this.imap = O.fromNullable(imap); } } -const ToErrorWithLock = (lock?: MailboxLockObject) => (error: unknown) => - new ErrorWithLock(error instanceof Error ? error.message : "Unknown error", lock); + +const ToErrorWithLock = (lock?: MailboxLockObject, imap?: ImapClientI) => (error: unknown) => + new ErrorWithLock(error instanceof Error ? error.message : "Unknown error", lock, imap); /** * Generate a unique email. @@ -203,19 +206,19 @@ export const perform = ( // act. TE.tap(({ email }) => pipe(getSendImpl(from)(email), TE.mapLeft(ToErrorWithLock()))), TE.bind("imap", () => pipe(getImapImpl(to), TE.mapLeft(ToErrorWithLock()))), - TE.bind("mailboxLock", ({ imap }) => TE.tryCatch(() => imap.getMailboxLock("INBOX"), ToErrorWithLock())), + TE.bind("mailboxLock", ({ imap }) => TE.tryCatch(() => imap.getMailboxLock("INBOX"), ToErrorWithLock(undefined, imap))), // "assert". TE.bind("uid", ({ imap, email, mailboxLock }) => pipe( findEmailUidInInboxImpl(imap, matchesEmailImpl(email), retries, interval), - TE.mapLeft(ToErrorWithLock(mailboxLock)) + TE.mapLeft(ToErrorWithLock(mailboxLock, imap)) ) ), // cleanup. TE.bind("deleted", ({ imap, uid, mailboxLock }) => TE.tryCatch( () => imap.messageDelete([uid], { uid: true }), - ToErrorWithLock(mailboxLock), + ToErrorWithLock(mailboxLock, imap), ), ), TE.fold( @@ -223,10 +226,15 @@ export const perform = ( if (O.isSome(e.lock)) { e.lock.value.release(); } + if (O.isSome(e.imap)) { + const imap = e.imap.value; + return pipe(TE.tryCatch(() => imap.logout(), toError), TE.flatMap(() => TE.left(e))); + } return TE.left(e); }, - ({ mailboxLock, deleted }) => { + ({ mailboxLock, deleted, imap }) => { mailboxLock.release(); + imap.logout(); return TE.right(deleted); } ) |