diff --git a/ImapManager.js b/ImapManager.js index e2297ee..a2c45ad 100644 --- a/ImapManager.js +++ b/ImapManager.js @@ -132,18 +132,13 @@ class ImapManager await new Promise((resolve, reject) => { - let error; - let checkFinish = () => { if (fetchState.parsed <= 0 && wait) { // Если сообщение окончания придёт до окончания обработки - // последней порции, тогда ждём окончания обработки - if (error) - reject(error); - else - resolve(); + // последней порции, тогда не резолвим, а ждём окончания обработки + resolve(); } }; @@ -162,7 +157,7 @@ class ImapManager { this.onMessage(fetchState, msg, seqnum, processor) .then(checkFinish) - .catch(e => { error = e; checkFinish(); }); + .catch(e => reject(e)); }); f.once('end', () => @@ -176,7 +171,7 @@ class ImapManager { processor(fetchState.pending, fetchState) .then(saveLast) - .catch(e => { error = e; saveLast(); }); + .catch(e => reject(e)); } }); }); @@ -207,7 +202,6 @@ class ImapManager { let m = fetchState.pending; fetchState.pending = []; - let err; let result = await processor(m, fetchState); if (result) { @@ -220,10 +214,6 @@ class ImapManager fetchState.srv._parser._ignoreReadable = false; process.nextTick(fetchState.srv._parser._cbReadable); } - if (err) - { - throw err; - } } } diff --git a/Syncer.js b/Syncer.js index 50a5306..ed3ef6b 100644 --- a/Syncer.js +++ b/Syncer.js @@ -163,7 +163,7 @@ class Syncer accountId = row.id; } let srv = await this.getSyncConnection(accountId); - let boxes = await new Promise((r, e) => srv.getBoxes(r)); + let boxes = await new Promise((res, err) => srv.getBoxes((e, r) => e ? err(e) : res(r))); for (let k in boxes) { let boxKind = (boxes[k].special_use_attrib || '').replace('\\', '').toLowerCase(); @@ -230,7 +230,7 @@ class Syncer async fullResync(srv, boxId, maxUid, missing, total) { - let flags = await SQL.select('messages', 'uid, flags', { folder_id: boxId }); + let flags = await SQL.select(this.pg, 'messages', 'uid, flags', { folder_id: boxId }); flags = flags.reduce((o, row) => { o[row.uid] = row.flags; return o; }, {}); let updateFlags = []; @@ -312,7 +312,8 @@ class Syncer srv.on('vanish', onVanish); await this.imap.runFetch( srv, '1:'+maxUid, { modifiers: { changedsince: changedSince+' VANISHED' } }, - async (messages, state) => this.queueQuickFlags(messages, boxId, state), { updateFlags: updateFlags } + async (messages, state) => this.queueQuickFlags(messages, boxId, state), + { updateFlags: updateFlags } ); srv.removeListener('vanish', onVanish); let checkedMissing = await this.updateFlags(boxId, updateFlags, missing && true); @@ -397,8 +398,9 @@ class Syncer let parser = new MailParser({ streamAttachments: false, defaultCharset: 'windows-1251' }); return await new Promise((r, j) => { - parse.once('end', r); + parser.once('end', r); parser.write(msg); + parser.end(); }); } @@ -408,7 +410,9 @@ class Syncer for (let i = 0; i < struct.length; i++) { if (struct[i] instanceof Array) + { this.extractAttachments(struct[i], attachments); + } else if (struct[i].disposition && struct[i].disposition.type == 'attachment') { attachments.push([ @@ -432,6 +436,7 @@ class Syncer catch (e) { await this.pg.query('ROLLBACK'); + throw e; } } @@ -492,7 +497,7 @@ class Syncer { threadId = await SQL.select( this.pg, 'messages', 'MAX(thread_id)', - { 'refs @> array[?]': msgrow.messageid }, null, SQL.MS_VALUE + { 'refs @> array[?]::varchar(1000)[]': msgrow.messageid }, null, SQL.MS_VALUE ); if (threadId) {