mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-08-29 12:09:20 +03:00
Improved cache handling
This commit is contained in:
parent
29854311f9
commit
cf12960507
12 changed files with 153 additions and 145 deletions
|
|
@ -62,7 +62,7 @@ export const
|
|||
* @returns {?FolderModel}
|
||||
*/
|
||||
getFolderFromCacheList = folderFullName =>
|
||||
FOLDERS_CACHE[folderFullName] ? FOLDERS_CACHE[folderFullName] : null,
|
||||
FOLDERS_CACHE[folderFullName] || null,
|
||||
|
||||
/**
|
||||
* @param {string} folderFullName
|
||||
|
|
|
|||
|
|
@ -9,11 +9,16 @@ import { SettingsUserStore } from 'Stores/User/Settings';
|
|||
import { FolderUserStore } from 'Stores/User/Folder';
|
||||
import { MessagelistUserStore } from 'Stores/User/Messagelist';
|
||||
import { getNotification } from 'Common/Translator';
|
||||
import { Settings, } from 'Common/Globals';
|
||||
import { Settings } from 'Common/Globals';
|
||||
import { serverRequest } from 'Common/Links';
|
||||
|
||||
import Remote from 'Remote/User/Fetch';
|
||||
|
||||
import { b64EncodeJSONSafe } from 'Common/Utils';
|
||||
import { SettingsGet } from 'Common/Globals';
|
||||
import { SUB_QUERY_PREFIX } from 'Common/Links';
|
||||
import { AppUserStore } from 'Stores/User/App';
|
||||
|
||||
export const
|
||||
|
||||
sortFolders = folders => {
|
||||
|
|
@ -28,34 +33,41 @@ sortFolders = folders => {
|
|||
},
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} folder
|
||||
* @param {Array=} list = []
|
||||
* @param {object} params
|
||||
*/
|
||||
fetchFolderInformation = (fCallback, folder, list = []) => {
|
||||
let fetch = !arrayLength(list);
|
||||
const uids = [],
|
||||
folderFromCache = getFolderFromCacheList(folder);
|
||||
messageList = params => {
|
||||
const
|
||||
// folder = getFolderFromCacheList(params.folder.fullName),
|
||||
folder = getFolderFromCacheList(params.folder),
|
||||
folderHash = folder?.hash || '';
|
||||
|
||||
if (!fetch) {
|
||||
list.forEach(messageListItem => {
|
||||
MessageFlagsCache.getFor(folder, messageListItem.uid) || uids.push(messageListItem.uid);
|
||||
messageListItem.threads.forEach(uid => {
|
||||
MessageFlagsCache.getFor(folder, uid) || uids.push(uid);
|
||||
});
|
||||
});
|
||||
fetch = uids.length;
|
||||
params = Object.assign({
|
||||
offset: 0,
|
||||
limit: SettingsUserStore.messagesPerPage(),
|
||||
search: '',
|
||||
uidNext: folder?.uidNext || 0, // Used to check for new messages
|
||||
sort: FolderUserStore.sortMode()
|
||||
}, params);
|
||||
if (AppUserStore.threadsAllowed() && SettingsUserStore.useThreads()) {
|
||||
params.useThreads = 1;
|
||||
} else {
|
||||
params.threadUid = 0;
|
||||
}
|
||||
|
||||
if (fetch) {
|
||||
Remote.request('FolderInformation', fCallback, {
|
||||
Folder: folder,
|
||||
FlagsUids: uids,
|
||||
UidNext: folderFromCache?.uidNext || 0 // Used to check for new messages
|
||||
});
|
||||
} else if (SettingsUserStore.useThreads()) {
|
||||
MessagelistUserStore.reloadFlagsAndCachedMessage();
|
||||
let sGetAdd = '';
|
||||
if (folderHash) {
|
||||
params.hash = folderHash + '-' + SettingsGet('AccountHash');
|
||||
sGetAdd = 'MessageList/' + SUB_QUERY_PREFIX + '/' + b64EncodeJSONSafe(params);
|
||||
params = {};
|
||||
}
|
||||
|
||||
Remote.abort('MessageList');
|
||||
Remote.request('MessageList',
|
||||
null,
|
||||
params,
|
||||
60000, // 60 seconds before aborting
|
||||
sGetAdd
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
@ -127,8 +139,22 @@ refreshFoldersInterval = 300000,
|
|||
*/
|
||||
folderInformation = (folder, list) => {
|
||||
if (folder?.trim()) {
|
||||
fetchFolderInformation(
|
||||
(iError, data) => {
|
||||
let fetch = !arrayLength(list);
|
||||
const uids = [],
|
||||
folderFromCache = getFolderFromCacheList(folder);
|
||||
|
||||
if (!fetch) {
|
||||
list.forEach(messageListItem => {
|
||||
MessageFlagsCache.getFor(folder, messageListItem.uid) || uids.push(messageListItem.uid);
|
||||
messageListItem.threads.forEach(uid => {
|
||||
MessageFlagsCache.getFor(folder, uid) || uids.push(uid);
|
||||
});
|
||||
});
|
||||
fetch = uids.length;
|
||||
}
|
||||
|
||||
if (fetch) {
|
||||
Remote.request('FolderInformation', (iError, data) => {
|
||||
if (!iError && data.Result) {
|
||||
const result = data.Result,
|
||||
folderFromCache = getFolderFromCacheList(result.Folder);
|
||||
|
|
@ -159,15 +185,20 @@ folderInformation = (folder, list) => {
|
|||
if (folderFromCache.fullName === FolderUserStore.currentFolderFullName()) {
|
||||
MessagelistUserStore.reload();
|
||||
} else if (getFolderInboxName() === folderFromCache.fullName) {
|
||||
Remote.messageList(null, {Folder: getFolderInboxName()}, true);
|
||||
// messageList({folder: getFolderFromCacheList(getFolderInboxName())});
|
||||
messageList({folder: getFolderInboxName()});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
folder,
|
||||
list
|
||||
);
|
||||
}, {
|
||||
Folder: folder,
|
||||
FlagsUids: uids,
|
||||
UidNext: folderFromCache?.uidNext || 0 // Used to check for new messages
|
||||
});
|
||||
} else if (SettingsUserStore.useThreads()) {
|
||||
MessagelistUserStore.reloadFlagsAndCachedMessage();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -130,11 +130,6 @@ export class AbstractFetchRemote
|
|||
sGetAdd ? null : (params || {}),
|
||||
undefined === iTimeout ? 30000 : pInt(iTimeout),
|
||||
data => {
|
||||
let cached = false;
|
||||
if (data?.Time) {
|
||||
cached = pInt(data.Time) > Date.now() - start;
|
||||
}
|
||||
|
||||
let iError = 0;
|
||||
if (sAction && oRequests[sAction]) {
|
||||
abort(sAction, 0, 1);
|
||||
|
|
@ -157,9 +152,12 @@ export class AbstractFetchRemote
|
|||
fCallback && fCallback(
|
||||
iError,
|
||||
data,
|
||||
cached,
|
||||
sAction,
|
||||
params
|
||||
/**
|
||||
* Responses like "304 Not Modified" are returned as "200 OK"
|
||||
* This is an attempt to detect if the request comes from cache.
|
||||
* But when client has wrong date/time, it will fail.
|
||||
*/
|
||||
data?.epoch && data.epoch < Math.floor(start / 1000) - 60
|
||||
);
|
||||
}
|
||||
)
|
||||
|
|
@ -203,8 +201,8 @@ export class AbstractFetchRemote
|
|||
}
|
||||
/*
|
||||
let isCached = false, type = '';
|
||||
if (data?.Time) {
|
||||
isCached = pInt(data.Time) > microtime() - start;
|
||||
if (data?.epoch) {
|
||||
isCached = data.epoch > microtime() - start;
|
||||
}
|
||||
// backward capability
|
||||
switch (true) {
|
||||
|
|
|
|||
|
|
@ -9,57 +9,11 @@ import { SUB_QUERY_PREFIX } from 'Common/Links';
|
|||
|
||||
import { AppUserStore } from 'Stores/User/App';
|
||||
import { SettingsUserStore } from 'Stores/User/Settings';
|
||||
import { FolderUserStore } from 'Stores/User/Folder';
|
||||
|
||||
import { AbstractFetchRemote } from 'Remote/AbstractFetch';
|
||||
|
||||
class RemoteUserFetch extends AbstractFetchRemote {
|
||||
|
||||
/**
|
||||
* @param {Function} fCallback
|
||||
* @param {object} params
|
||||
* @param {boolean=} bSilent = false
|
||||
*/
|
||||
messageList(fCallback, params, bSilent = false) {
|
||||
const
|
||||
sFolderFullName = pString(params.Folder),
|
||||
folder = getFolderFromCacheList(sFolderFullName),
|
||||
folderHash = folder?.hash || '';
|
||||
|
||||
params = Object.assign({
|
||||
offset: 0,
|
||||
limit: SettingsUserStore.messagesPerPage(),
|
||||
search: '',
|
||||
uidNext: folder?.uidNext || 0, // Used to check for new messages
|
||||
sort: FolderUserStore.sortMode(),
|
||||
Hash: folderHash + SettingsGet('AccountHash')
|
||||
}, params);
|
||||
params.Folder = sFolderFullName;
|
||||
if (AppUserStore.threadsAllowed() && SettingsUserStore.useThreads()) {
|
||||
params.useThreads = 1;
|
||||
} else {
|
||||
params.threadUid = 0;
|
||||
}
|
||||
|
||||
let sGetAdd = '';
|
||||
|
||||
if (folderHash && (!params.search || !params.search.includes('is:'))) {
|
||||
sGetAdd = 'MessageList/' +
|
||||
SUB_QUERY_PREFIX +
|
||||
'/' +
|
||||
b64EncodeJSONSafe(params);
|
||||
params = {};
|
||||
}
|
||||
|
||||
bSilent || this.abort('MessageList');
|
||||
this.request('MessageList',
|
||||
fCallback,
|
||||
params,
|
||||
60000, // 60 seconds before aborting
|
||||
sGetAdd
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sFolderFullName
|
||||
|
|
|
|||
|
|
@ -293,7 +293,8 @@ MessagelistUserStore.reload = (bDropPagePosition = false, bDropCurrentFolderCach
|
|||
MessagelistUserStore.loading(false);
|
||||
},
|
||||
{
|
||||
Folder: FolderUserStore.currentFolderFullName(),
|
||||
// folder: FolderUserStore.currentFolder() ? self.currentFolder().fullName : ''),
|
||||
folder: FolderUserStore.currentFolderFullName(),
|
||||
offset: iOffset,
|
||||
limit: SettingsUserStore.messagesPerPage(),
|
||||
search: MessagelistUserStore.listSearch(),
|
||||
|
|
|
|||
|
|
@ -210,7 +210,15 @@ export class DomainPopupView extends AbstractViewPopup {
|
|||
createOrAddCommand() {
|
||||
this.saving(true);
|
||||
Remote.request('AdminDomainSave',
|
||||
this.onDomainCreateOrSaveResponse.bind(this),
|
||||
iError => {
|
||||
this.saving(false);
|
||||
if (iError) {
|
||||
this.savingError(getNotification(iError));
|
||||
} else {
|
||||
DomainAdminStore.fetch();
|
||||
this.close();
|
||||
}
|
||||
},
|
||||
Object.assign(domainToParams(this), {
|
||||
Create: this.edit() ? 0 : 1
|
||||
})
|
||||
|
|
@ -263,16 +271,6 @@ export class DomainPopupView extends AbstractViewPopup {
|
|||
});
|
||||
}
|
||||
|
||||
onDomainCreateOrSaveResponse(iError) {
|
||||
this.saving(false);
|
||||
if (iError) {
|
||||
this.savingError(getNotification(iError));
|
||||
} else {
|
||||
DomainAdminStore.fetch();
|
||||
this.close();
|
||||
}
|
||||
}
|
||||
|
||||
clearTesting() {
|
||||
this.testing(false);
|
||||
this.testingDone(false);
|
||||
|
|
|
|||
24
dev/sieve.js
24
dev/sieve.js
|
|
@ -55,13 +55,11 @@ window.Sieve = {
|
|||
deleteScript: script => {
|
||||
serverError(false);
|
||||
Remote.request('FiltersScriptDelete',
|
||||
(iError, data) => {
|
||||
if (iError) {
|
||||
setError(data?.ErrorMessageAdditional || getNotification(iError));
|
||||
} else {
|
||||
scripts.remove(script);
|
||||
}
|
||||
},
|
||||
(iError, data) =>
|
||||
iError
|
||||
? setError(data?.ErrorMessageAdditional || getNotification(iError))
|
||||
: scripts.remove(script)
|
||||
,
|
||||
{name:script.name()}
|
||||
);
|
||||
},
|
||||
|
|
@ -69,13 +67,11 @@ window.Sieve = {
|
|||
setActiveScript(name) {
|
||||
serverError(false);
|
||||
Remote.request('FiltersScriptActivate',
|
||||
(iError, data) => {
|
||||
if (iError) {
|
||||
setError(data?.ErrorMessageAdditional || iError)
|
||||
} else {
|
||||
scripts.forEach(script => script.active(script.name() === name));
|
||||
}
|
||||
},
|
||||
(iError, data) =>
|
||||
iError
|
||||
? setError(data?.ErrorMessageAdditional || iError)
|
||||
: scripts.forEach(script => script.active(script.name() === name))
|
||||
,
|
||||
{name:name}
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue