Skip to content

Commit cdadca0

Browse files
committed
Final cleanup for keywords functionality
1 parent 2795664 commit cdadca0

7 files changed

Lines changed: 80 additions & 81 deletions

File tree

lib/api/messages.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2783,7 +2783,7 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
27832783
.concat('unseen' in result.value ? (result.value.unseen ? [] : '\\Seen') : [])
27842784
.concat('flagged' in result.value ? (result.value.flagged ? '\\Flagged' : []) : [])
27852785
.concat('draft' in result.value ? (result.value.draft ? '\\Draft' : []) : [])
2786-
.concat(result.value.keywords || []),
2786+
.concat(result.value.keywords ?? []),
27872787
raw,
27882788
referencedMessage: referencedMessage || false
27892789
});

lib/api/updates.js

Lines changed: 61 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -254,75 +254,78 @@ function loadJournalStream(db, req, res, user, lastEventId, done) {
254254
let changedKeywords = new Set();
255255
let flaggedChanged = false;
256256

257-
let emitFlaggedCounter = next => {
257+
let emitFlaggedCounter = async next => {
258258
if (!flaggedChanged) {
259259
return next();
260260
}
261261

262-
Promise.all([tools.getFlaggedCounter(db, user), tools.getFlaggedCounter(db, user, 'unseen')])
263-
.then(([total, unseen]) => {
264-
res.write(
265-
formatJournalData({
266-
command: 'FLAGGED_COUNTER',
267-
_id: lastEventId,
268-
total,
269-
unseen
270-
})
271-
);
272-
next();
273-
})
274-
.catch(() => next());
262+
try {
263+
const [total, unseen] = await Promise.all([tools.getFlaggedCounter(db, user), tools.getFlaggedCounter(db, user, 'unseen')]);
264+
res.write(
265+
formatJournalData({
266+
command: 'FLAGGED_COUNTER',
267+
_id: lastEventId,
268+
total,
269+
unseen
270+
})
271+
);
272+
} catch {
273+
// ignore
274+
}
275+
next();
275276
};
276277

277-
let emitKeywordCounters = next => {
278+
let emitKeywordCounters = async next => {
278279
if (!changedKeywords.size) {
279280
return next();
280281
}
281282

282-
const userKey = user.toString();
283-
Promise.all(
284-
[...changedKeywords].map(async keyword => {
285-
const isCached = await db.redis.exists(`kw:total:${userKey}:${keyword}`);
286-
return isCached ? keyword : null;
287-
})
288-
)
289-
.then(async results => {
290-
const toEmit = results.filter(Boolean);
291-
if (!toEmit.length) {
292-
return next();
293-
}
283+
try {
284+
const userKey = user.toString();
285+
const cachedResults = await Promise.all(
286+
[...changedKeywords].map(async keyword => {
287+
const isCached = await db.redis.exists(`kw:total:${userKey}:${keyword}`);
288+
return isCached ? keyword : null;
289+
})
290+
);
291+
292+
const toEmit = cachedResults.filter(Boolean);
293+
if (!toEmit.length) {
294+
return next();
295+
}
294296

295-
const keywordResults = await Promise.all(
296-
toEmit.map(async keyword => {
297-
let total, unseen;
298-
try {
299-
total = await tools.getKeywordCounter(db, user, keyword);
300-
} catch {
301-
total = 0;
302-
}
303-
try {
304-
unseen = await tools.getKeywordCounter(db, user, keyword, 'unseen');
305-
} catch {
306-
unseen = 0;
307-
}
308-
return { keyword, total, unseen };
297+
const keywordResults = await Promise.all(
298+
toEmit.map(async keyword => {
299+
let total, unseen;
300+
try {
301+
total = await tools.getKeywordCounter(db, user, keyword);
302+
} catch {
303+
total = 0;
304+
}
305+
try {
306+
unseen = await tools.getKeywordCounter(db, user, keyword, 'unseen');
307+
} catch {
308+
unseen = 0;
309+
}
310+
return { keyword, total, unseen };
311+
})
312+
);
313+
314+
for (const { keyword, total, unseen } of keywordResults) {
315+
res.write(
316+
formatJournalData({
317+
command: 'KEYWORD_COUNTERS',
318+
_id: lastEventId,
319+
keyword,
320+
total,
321+
unseen
309322
})
310323
);
311-
312-
for (const { keyword, total, unseen } of keywordResults) {
313-
res.write(
314-
formatJournalData({
315-
command: 'KEYWORD_COUNTERS',
316-
_id: lastEventId,
317-
keyword,
318-
total,
319-
unseen
320-
})
321-
);
322-
}
323-
next();
324-
})
325-
.catch(() => next());
324+
}
325+
} catch {
326+
// ignore
327+
}
328+
next();
326329
};
327330

328331
let cursor = db.database.collection('journal').find(query).sort({ _id: 1 });
@@ -414,7 +417,7 @@ function loadJournalStream(db, req, res, user, lastEventId, done) {
414417
break;
415418
}
416419

417-
let checkKeywordsAndContinue = () => {
420+
let writeEntryAndContinue = () => {
418421
try {
419422
let data = formatJournalData(e);
420423
res.write(data);
@@ -439,7 +442,7 @@ function loadJournalStream(db, req, res, user, lastEventId, done) {
439442
}
440443
}
441444

442-
checkKeywordsAndContinue();
445+
writeEntryAndContinue();
443446
});
444447
};
445448

lib/filter-handler.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -284,8 +284,8 @@ class FilterHandler {
284284
}
285285

286286
if (key === 'keywords') {
287-
let existingKeywords = filterActions.get('keywords') || [];
288-
let newKeywords = filterData.action[key] || [];
287+
let existingKeywords = filterActions.get('keywords') ?? [];
288+
let newKeywords = filterData.action[key] ?? [];
289289
filterActions.set('keywords', [...new Set([...existingKeywords, ...newKeywords])]);
290290
return;
291291
}
@@ -655,11 +655,11 @@ class FilterHandler {
655655
break;
656656
case 'keywords':
657657
if (Array.isArray(value) && value.length) {
658-
value.forEach(keyword => {
658+
for (let keyword of value) {
659659
if (!flags.includes(keyword)) {
660660
flags.push(keyword);
661661
}
662-
});
662+
}
663663
filterResults.push({ keywords: value });
664664
}
665665
break;

lib/handlers/on-copy.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ async function copyHandler(server, messageHandler, connection, mailbox, update,
348348
message: messageData._id,
349349
unseen: messageData.unseen,
350350
flagged: messageData.flagged,
351+
keywords: tools.extractKeywords(messageData.flags),
351352
idate: messageData.idate,
352353
thread: messageData.thread
353354
};

lib/handlers/on-store.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ module.exports = server => (mailbox, update, session, callback) => {
350350

351351
const currentKeywords = extractKeywords(message.flags);
352352
const addedKeywords = currentKeywords.filter(keyword => !oldKeywords.has(keyword));
353-
const removedKeywords = Array.from(oldKeywords).filter(keyword => !currentKeywords.includes(keyword));
353+
const removedKeywords = [...oldKeywords].filter(keyword => !currentKeywords.includes(keyword));
354354
const messageIsFlagged = message.flags.includes('\\Flagged');
355355

356356
const notifyEntry = {

lib/imap-notifier.js

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -398,11 +398,6 @@ class ImapNotifier extends EventEmitter {
398398
}
399399
}
400400

401-
getTrackedEntryKeywords(entryKeywords) {
402-
const keywords = entryKeywords ?? [];
403-
return [...new Set(keywords.filter(keyword => keyword && !consts.SYSTEM_FLAGS.has(keyword)))];
404-
}
405-
406401
addKeywordDelta(deltas, keyword, total, unseen) {
407402
if (!deltas.has(keyword)) {
408403
deltas.set(keyword, { total: 0, unseen: 0 });
@@ -422,31 +417,31 @@ class ImapNotifier extends EventEmitter {
422417

423418
switch (entry.command) {
424419
case 'EXISTS':
425-
for (let keyword of this.getTrackedEntryKeywords(entry.keywords)) {
420+
for (let keyword of tools.extractKeywords(entry.keywords)) {
426421
this.addKeywordDelta(deltas, keyword, 1, entry.unseen ? 1 : 0);
427422
}
428423
break;
429424

430425
case 'EXPUNGE':
431-
for (let keyword of this.getTrackedEntryKeywords(entry.keywords)) {
426+
for (let keyword of tools.extractKeywords(entry.keywords)) {
432427
this.addKeywordDelta(deltas, keyword, -1, entry.unseen ? -1 : 0);
433428
}
434429
break;
435430

436431
case 'FETCH': {
437432
const messageUnseen = !(entry.flags ?? []).includes('\\Seen');
438433

439-
for (let keyword of this.getTrackedEntryKeywords(entry.addedKeywords)) {
434+
for (let keyword of tools.extractKeywords(entry.addedKeywords)) {
440435
this.addKeywordDelta(deltas, keyword, 1, messageUnseen ? 1 : 0);
441436
}
442437

443-
for (let keyword of this.getTrackedEntryKeywords(entry.removedKeywords)) {
438+
for (let keyword of tools.extractKeywords(entry.removedKeywords)) {
444439
this.addKeywordDelta(deltas, keyword, -1, messageUnseen ? -1 : 0);
445440
}
446441

447442
if (entry.unseenChange) {
448443
const unseenStep = messageUnseen ? 1 : -1;
449-
for (let keyword of this.getTrackedEntryKeywords(entry.flags)) {
444+
for (let keyword of tools.extractKeywords(entry.flags)) {
450445
this.addKeywordDelta(deltas, keyword, 0, unseenStep);
451446
}
452447
}

lib/message-handler.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1757,7 +1757,7 @@ class MessageHandler {
17571757
break;
17581758

17591759
case 'draft':
1760-
updates.flagged = changes.draft;
1760+
updates.draft = changes.draft;
17611761
if (changes.draft) {
17621762
addFlags.push('\\Draft');
17631763
} else {
@@ -1931,13 +1931,13 @@ class MessageHandler {
19311931

19321932
const oldKeywords = new Set(tools.extractKeywords(messageData.flags));
19331933
const newKeywords = new Set(tools.extractKeywords(updatedMessageData.flags));
1934-
const messageWasSeen = (messageData.flags || []).includes('\\Seen');
1935-
const messageIsSeen = (updatedMessageData.flags || []).includes('\\Seen');
1936-
const messageWasFlagged = (messageData.flags || []).includes('\\Flagged');
1937-
const messageIsFlagged = (updatedMessageData.flags || []).includes('\\Flagged');
1934+
const messageWasSeen = (messageData.flags ?? []).includes('\\Seen');
1935+
const messageIsSeen = (updatedMessageData.flags ?? []).includes('\\Seen');
1936+
const messageWasFlagged = (messageData.flags ?? []).includes('\\Flagged');
1937+
const messageIsFlagged = (updatedMessageData.flags ?? []).includes('\\Flagged');
19381938

1939-
const addedKeywords = Array.from(newKeywords).filter(keyword => !oldKeywords.has(keyword));
1940-
const removedKeywords = Array.from(oldKeywords).filter(keyword => !newKeywords.has(keyword));
1939+
const addedKeywords = [...newKeywords].filter(keyword => !oldKeywords.has(keyword));
1940+
const removedKeywords = [...oldKeywords].filter(keyword => !newKeywords.has(keyword));
19411941

19421942
updatedCount++;
19431943

0 commit comments

Comments
 (0)