Skip to content

Commit 18f5323

Browse files
committed
fix(imap): preserve fresh UID after UIDVALIDITY reset in state merge
1 parent 8ae5f88 commit 18f5323

File tree

1 file changed

+21
-7
lines changed
  • apps/sim/lib/webhooks/polling

1 file changed

+21
-7
lines changed

apps/sim/lib/webhooks/polling/imap.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -192,16 +192,30 @@ async function updateImapState(
192192
uidValidityByMailbox: Record<string, string>
193193
) {
194194
const existingUidByMailbox = config.lastProcessedUidByMailbox || {}
195-
const mergedUidByMailbox = { ...existingUidByMailbox }
195+
const prevUidValidity = config.uidValidityByMailbox || {}
196196

197-
for (const [mailbox, uid] of Object.entries(uidByMailbox)) {
198-
mergedUidByMailbox[mailbox] = Math.max(uid, mergedUidByMailbox[mailbox] || 0)
197+
const resetMailboxes = new Set(
198+
Object.entries(uidValidityByMailbox)
199+
.filter(
200+
([mailbox, validity]) =>
201+
prevUidValidity[mailbox] !== undefined && prevUidValidity[mailbox] !== validity
202+
)
203+
.map(([mailbox]) => mailbox)
204+
)
205+
206+
const mergedUidByMailbox: Record<string, number> = {}
207+
208+
for (const [mailbox, uid] of Object.entries(existingUidByMailbox)) {
209+
if (!resetMailboxes.has(mailbox)) {
210+
mergedUidByMailbox[mailbox] = uid
211+
}
199212
}
200213

201-
const prevUidValidity = config.uidValidityByMailbox || {}
202-
for (const [mailbox, validity] of Object.entries(uidValidityByMailbox)) {
203-
if (prevUidValidity[mailbox] !== undefined && prevUidValidity[mailbox] !== validity) {
204-
delete mergedUidByMailbox[mailbox]
214+
for (const [mailbox, uid] of Object.entries(uidByMailbox)) {
215+
if (resetMailboxes.has(mailbox)) {
216+
mergedUidByMailbox[mailbox] = uid
217+
} else {
218+
mergedUidByMailbox[mailbox] = Math.max(uid, mergedUidByMailbox[mailbox] || 0)
205219
}
206220
}
207221

0 commit comments

Comments
 (0)