Mailspring/app/internal_packages/participant-profile/lib/participant-profile-store.es6
2017-09-26 11:33:08 -07:00

82 lines
1.7 KiB
JavaScript

import { Utils } from 'nylas-exports';
import NylasStore from 'nylas-store';
import ClearbitDataSource from './clearbit-data-source';
const contactCache = {};
const CACHE_SIZE = 100;
const contactCacheKeyIndex = [];
// TODO: Put cache into localstorage
class ParticipantProfileStore extends NylasStore {
constructor() {
super();
this.cacheExpiry = 1000 * 60 * 60 * 24; // 1 day
this.dataSource = new ClearbitDataSource();
}
activate() {}
deactivate() {
// no op
}
dataForContact(contact) {
if (!contact) {
return {};
}
if (Utils.likelyNonHumanEmail(contact.email)) {
return {};
}
if (this.inCache(contact)) {
const data = this.getCache(contact);
if (data.cacheDate) {
return data;
}
return {};
}
this.dataSource
.find({ email: contact.email })
.then(data => {
if (data && data.email === contact.email) {
this.setCache(contact, data);
this.trigger();
}
})
.catch((err = {}) => {
if (err.statusCode !== 404) {
throw err;
}
});
return {};
}
getCache(contact) {
return contactCache[contact.email];
}
inCache(contact) {
const cache = contactCache[contact.email];
if (!cache) {
return false;
}
if (!cache.cacheDate || Date.now() - cache.cacheDate > this.cacheExpiry) {
return false;
}
return true;
}
setCache(contact, value) {
contactCache[contact.email] = value;
contactCacheKeyIndex.push(contact.email);
if (contactCacheKeyIndex.length > CACHE_SIZE) {
delete contactCache[contactCacheKeyIndex.shift()];
}
return value;
}
}
export default new ParticipantProfileStore();