From 87fb25c703cfc3c63525cabb4f4b7ca27cc3ac98 Mon Sep 17 00:00:00 2001 From: neo773 <62795688+neo773@users.noreply.github.com> Date: Sat, 10 Jan 2026 19:56:07 +0530 Subject: [PATCH] IMAP edge cases (#17065) Fixes IMAP edge case. We had a maximum call stack reached crash if the array was very large for some folders. Plus some minor perf improvement. https://twenty-v7.sentry.io/issues/6997180505/events/652c69da1be944aab1c87ac2e6a06c30/ --- .../imap/providers/imap-client.provider.ts | 10 ---------- .../services/imap-find-sent-folder.service.ts | 20 ++++++------------- .../services/imap-get-message-list.service.ts | 2 +- .../imap/utils/create-sync-cursor.util.ts | 13 +++++++----- .../imap/utils/parse-message-id.util.ts | 5 +++-- .../utils/sanitize-string.util.ts | 4 +++- 6 files changed, 21 insertions(+), 33 deletions(-) diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/providers/imap-client.provider.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/providers/imap-client.provider.ts index 22ad47e50d..94d534b4c0 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/providers/imap-client.provider.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/providers/imap-client.provider.ts @@ -123,16 +123,6 @@ export class ImapClientProvider { `Connected to IMAP server for ${connectedAccount.handle}`, ); - try { - const mailboxes = await client.list(); - - this.logger.log( - `Available mailboxes for ${connectedAccount.handle}: ${mailboxes.map((m) => m.path).join(', ')}`, - ); - } catch (error) { - this.logger.warn(`Failed to list mailboxes: ${error.message}`); - } - return client; } catch (error) { if (timeoutId) { diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/services/imap-find-sent-folder.service.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/services/imap-find-sent-folder.service.ts index 91711af64a..31fba9a038 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/services/imap-find-sent-folder.service.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/services/imap-find-sent-folder.service.ts @@ -140,23 +140,15 @@ export class ImapFindSentFolderService { folderPath: string, ): Promise { try { - const lock = await client.getMailboxLock(folderPath); + const status = await client.status(folderPath, { + messages: true, + }); - try { - const status = await client.status(folderPath, { - messages: true, - }); + const messageCount = status?.messages; - const messageCount = status?.messages; + this.logger.debug(`Folder "${folderPath}" has ${messageCount} messages`); - this.logger.debug( - `Folder "${folderPath}" has ${messageCount} messages`, - ); - - return isNumber(messageCount) ? messageCount : 0; - } finally { - lock.release(); - } + return isNumber(messageCount) ? messageCount : 0; } catch (error) { this.logger.warn( `Error checking folder "${folderPath}": ${error.message}`, diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/services/imap-get-message-list.service.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/services/imap-get-message-list.service.ts index ea890b285a..a4698cd5a9 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/services/imap-get-message-list.service.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/services/imap-get-message-list.service.ts @@ -110,7 +110,7 @@ export class ImapGetMessageListService { ); const nextCursor = createSyncCursor( - messageUids.map((uid) => ({ uid })), + messageUids, previousCursor, mailboxState, ); diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/utils/create-sync-cursor.util.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/utils/create-sync-cursor.util.ts index 1711052a41..f91fa8ad3f 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/utils/create-sync-cursor.util.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/utils/create-sync-cursor.util.ts @@ -2,17 +2,20 @@ import { type MailboxState } from './extract-mailbox-state.util'; import { type ImapSyncCursor } from './parse-sync-cursor.util'; export const createSyncCursor = ( - messages: { uid: number }[], + messageUids: number[], previousCursor: ImapSyncCursor | null, mailboxState: MailboxState, ): ImapSyncCursor => { const { uidValidity, highestModSeq } = mailboxState; const lastSeenUid = previousCursor?.highestUid ?? 0; - const highestUid = - messages.length > 0 - ? Math.max(...messages.map((message) => message.uid)) - : lastSeenUid; + let highestUid = lastSeenUid; + + for (let i = 0; i < messageUids.length; i++) { + if (messageUids[i] > highestUid) { + highestUid = messageUids[i]; + } + } return { highestUid, diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/utils/parse-message-id.util.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/utils/parse-message-id.util.ts index afcd04661d..1384128dd0 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/utils/parse-message-id.util.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/imap/utils/parse-message-id.util.ts @@ -3,9 +3,10 @@ export type ParsedMessageId = { uid: number; }; +const MESSAGE_ID_REGEX = /^(.+):(\d+)$/; + export function parseMessageId(messageId: string): ParsedMessageId | null { - const regex = /^(.+):(\d+)$/; - const match = regex.exec(messageId); + const match = MESSAGE_ID_REGEX.exec(messageId); if (!match) { return null; diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/utils/sanitize-string.util.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/utils/sanitize-string.util.ts index 4c80fff56d..f38eede5a2 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/utils/sanitize-string.util.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/utils/sanitize-string.util.ts @@ -1,6 +1,8 @@ +const NULL_CHAR_REGEX = /\0/g; + /** * Removes null characters (\0) from a string to prevent unexpected errors */ export const sanitizeString = (str: string) => { - return str.replace(/\0/g, ''); + return str.replace(NULL_CHAR_REGEX, ''); };