[local-sync] Run message processor for one message at a time

This avoids issues that arise when we process two messages on the same thread concurrently!
This commit is contained in:
Ben Gotow 2016-11-30 17:26:23 -08:00
parent 94722f27ab
commit 3d79f9b8be

View file

@ -3,27 +3,29 @@ const extractFiles = require('./extract-files')
const extractContacts = require('./extract-contacts') const extractContacts = require('./extract-contacts')
const LocalDatabaseConnector = require('../shared/local-database-connector') const LocalDatabaseConnector = require('../shared/local-database-connector')
const Queue = require('promise-queue');
const queue = new Queue(1, Infinity);
function processNewMessage(message, imapMessage) { function processNewMessage(message, imapMessage) {
process.nextTick(() => { queue.add(async () => {
const {accountId} = message const {accountId} = message;
const logger = global.Logger.forAccount({id: accountId}).child({message}) const logger = global.Logger.forAccount({id: accountId}).child({message})
LocalDatabaseConnector.forAccount(accountId).then((db) => { const db = await LocalDatabaseConnector.forAccount(accountId);
detectThread({db, message})
.then((thread) => { try {
message.threadId = thread.id const thread = await detectThread({db, message});
return db.Message.create(message) message.threadId = thread.id;
}) await db.Message.create(message);
.then(() => extractFiles({db, message, imapMessage})) await extractFiles({db, message, imapMessage});
.then(() => extractContacts({db, message})) await extractContacts({db, message});
.then(() => { logger.info({
logger.info({ message_id: message.id,
message_id: message.id, uid: message.folderImapUID,
uid: message.folderImapUID, }, `MessageProcessor: Created and processed message`);
}, `MessageProcessor: Created and processed message`) } catch (err) {
}) logger.error(err, `MessageProcessor: Failed`);
.catch((err) => logger.error(err, `MessageProcessor: Failed`)) }
}) });
})
} }
module.exports = {processNewMessage} module.exports = {processNewMessage}