From 2c7b4f1c785da2f33efdb4b06f657e59c87f9098 Mon Sep 17 00:00:00 2001 From: grimhilt Date: Sat, 6 May 2023 12:31:13 +0200 Subject: [PATCH] fix live sync mail --- back/mails/imap/Mailbox.ts | 96 ++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 56 deletions(-) diff --git a/back/mails/imap/Mailbox.ts b/back/mails/imap/Mailbox.ts index 763aa23..0265800 100644 --- a/back/mails/imap/Mailbox.ts +++ b/back/mails/imap/Mailbox.ts @@ -35,19 +35,17 @@ export default class Mailbox { // get mailbox from the database this.box = (await getMailbox(this.id))[0]; const isReadOnly = false; - this.imap.openBox(this.boxName, isReadOnly, async (err, box) => { + this.imap.openBox(this.boxName, isReadOnly, (err, box) => { if (err) logger.err(err); // sync messages and flags - // this.initSync(box); - const mails = []; - await this.mailFetcher(6000, 7000, mails); - console.log(mails); + this.initSync(box); + // wait for new mails this.imap.on("mail", (numNewMsgs: number) => { if (!this.syncing) { // if not syncing restart a sync - this.syncManager(this.box.uidnext, this.box.uidnext + numNewMsgs); + this.syncManager(this.box.uidnext - 1, this.box.uidnext + numNewMsgs - 1); } else { // else save number of message to sync latter this.msgToSync += numNewMsgs; @@ -74,7 +72,6 @@ export default class Mailbox { } async initSync(box: Box) { - console.log(box.uidnext); // sync mail only if has new messages if (this.box.uidnext < box.uidnext) { this.syncManager(this.box.uidnext, box.uidnext); @@ -107,58 +104,47 @@ export default class Mailbox { syncManager = async (savedUid: number, currentUid: number) => { this.syncing = true; logger.log(`Fetching from ${savedUid} to ${currentUid} uid`); - // todo why cannot take currentUid ? - this.imap.search([`${savedUid}:*`], async (err, uids) => { - if (err) { - logger.err(err); - throw err; - } - console.log(`Found ${uids.length} messages`); - const nbMessageToSync = uids.length; + const nbMessageToSync = currentUid - savedUid; + let STEP = nbMessageToSync > 300 ? Math.floor(nbMessageToSync / 7) : nbMessageToSync; + let mails: AttrsWithEnvelope[] = []; - let STEP = nbMessageToSync > 100 ? Math.floor(nbMessageToSync / 10) : nbMessageToSync; - let mails: AttrsWithEnvelope[] = []; - - for (let i = 0; i < nbMessageToSync; i += STEP) { - mails = []; - try { - // fetch mails - let secondUid = savedUid + STEP < currentUid ? savedUid + STEP : currentUid; - await this.mailFetcher(savedUid, secondUid, mails); - logger.log(`Fetched ${STEP} uids (${mails.length} messages)`); - // save same in the database - for (let k = 0; k < mails.length; k++) { - try { - const messageId = await saveMessage(mails[k], this.id, this.imap); - const register = new RegisterMessageInApp(messageId, mails[k], this.id); - await register.save(); - } catch (error) { - logger.err("Failed to save a message: " + error); - } + for (let i = 0; i < nbMessageToSync; i += STEP) { + mails = []; + try { + // fetch mails + let secondUid = savedUid + STEP < currentUid ? savedUid + STEP : currentUid; + await this.mailFetcher(savedUid, secondUid, mails) + logger.log(`Fetched ${STEP} uids (${mails.length} messages)`); + // save same in the database + for (let k = 0; k < mails.length; k++) { + try { + const messageId = await saveMessage(mails[k], this.id, this.imap); + const register = new RegisterMessageInApp(messageId, mails[k], this.id); + await register.save(); + } catch (error) { + logger.err("Failed to save a message: " + error); } - savedUid = secondUid; - this.box.uidnext = savedUid; - - updateMailbox(this.id, savedUid); - } catch (error) { - logger.err("Failed to sync message " + error); } - logger.log( - `Saved messages ${i + STEP > nbMessageToSync ? nbMessageToSync : i + STEP}/${nbMessageToSync}`, - ); - } + savedUid = secondUid; + this.box.uidnext += savedUid; - // if has receive new msg during last sync then start a new sync - if (this.msgToSync > 0) { - const currentUid = this.box.uidnext; - this.box.uidnext += this.msgToSync; - // reset value to allow to detect new incoming message while syncing - this.msgToSync = 0; - await this.syncManager(currentUid, this.box.uidnext); + updateMailbox(this.id, savedUid); + } catch (error) { + logger.err("Failed to sync message " + error); } - this.syncing = false; - logger.log(`Finished syncing messages`); - }); + logger.log(`Saved messages ${i + STEP > nbMessageToSync ? nbMessageToSync : i + STEP}/${nbMessageToSync}`); + } + + // if has receive new msg during last sync then start a new sync + if (this.msgToSync > 0) { + const currentUid = this.box.uidnext; + this.box.uidnext += this.msgToSync; + // reset value to allow to detect new incoming message while syncing + this.msgToSync = 0; + await this.syncManager(currentUid, this.box.uidnext); + } + this.syncing = false; + logger.log(`Finished syncing messages`); }; async mailFetcher(startUid: number, endUid: number, mails: Attrs[]): Promise { @@ -169,8 +155,6 @@ export default class Mailbox { }); f.on("message", (msg, seqno) => { - console.log("seqno" + seqno); - msg.once("attributes", (attrs: AttrsWithEnvelope) => { mails.push(attrs); });