structured reload trigger

This commit is contained in:
Jan Prochazka
2022-12-25 15:35:56 +01:00
parent 1eea117062
commit 783f26b500
8 changed files with 73 additions and 64 deletions

View File

@@ -1,5 +1,6 @@
import { apiOn } from './api';
import getAsArray from './getAsArray';
import stableStringify from 'json-stable-stringify';
const cachedByKey = {};
const cachedPromisesByKey = {};
@@ -15,10 +16,11 @@ function cacheGet(key) {
function addCacheKeyToReloadTrigger(cacheKey, reloadTrigger) {
for (const item of getAsArray(reloadTrigger)) {
if (!(item in cachedKeysByReloadTrigger)) {
cachedKeysByReloadTrigger[item] = [];
const itemString = stableStringify(item);
if (!(itemString in cachedKeysByReloadTrigger)) {
cachedKeysByReloadTrigger[itemString] = [];
}
cachedKeysByReloadTrigger[item].push(cacheKey);
cachedKeysByReloadTrigger[itemString].push(cacheKey);
}
}
@@ -32,7 +34,8 @@ function cacheSet(cacheKey, value, reloadTrigger, generation) {
function cacheClean(reloadTrigger) {
cacheGeneration += 1;
for (const item of getAsArray(reloadTrigger)) {
const keys = cachedKeysByReloadTrigger[item];
const itemString = stableStringify(item);
const keys = cachedKeysByReloadTrigger[itemString];
if (keys) {
for (const key of keys) {
delete cachedByKey[key];
@@ -40,7 +43,7 @@ function cacheClean(reloadTrigger) {
cacheGenerationByKey[key] = cacheGeneration;
}
}
delete cachedKeysByReloadTrigger[item];
delete cachedKeysByReloadTrigger[itemString];
}
}
@@ -87,20 +90,24 @@ export async function loadCachedValue(reloadTrigger, cacheKey, func) {
export async function subscribeCacheChange(reloadTrigger, cacheKey, reloadHandler) {
for (const item of getAsArray(reloadTrigger)) {
if (!subscriptionsByReloadTrigger[item]) {
subscriptionsByReloadTrigger[item] = [];
const itemString = stableStringify(item);
if (!subscriptionsByReloadTrigger[itemString]) {
subscriptionsByReloadTrigger[itemString] = [];
}
subscriptionsByReloadTrigger[item].push(reloadHandler);
subscriptionsByReloadTrigger[itemString].push(reloadHandler);
}
}
export async function unsubscribeCacheChange(reloadTrigger, cacheKey, reloadHandler) {
for (const item of getAsArray(reloadTrigger)) {
if (subscriptionsByReloadTrigger[item]) {
subscriptionsByReloadTrigger[item] = subscriptionsByReloadTrigger[item].filter(x => x != reloadHandler);
const itemString = stableStringify(item);
if (subscriptionsByReloadTrigger[itemString]) {
subscriptionsByReloadTrigger[itemString] = subscriptionsByReloadTrigger[itemString].filter(
x => x != reloadHandler
);
}
if (subscriptionsByReloadTrigger[item].length == 0) {
delete subscriptionsByReloadTrigger[item];
if (subscriptionsByReloadTrigger[itemString].length == 0) {
delete subscriptionsByReloadTrigger[itemString];
}
}
}
@@ -110,8 +117,9 @@ export function dispatchCacheChange(reloadTrigger) {
cacheClean(reloadTrigger);
for (const item of getAsArray(reloadTrigger)) {
if (subscriptionsByReloadTrigger[item]) {
for (const handler of subscriptionsByReloadTrigger[item]) {
const itemString = stableStringify(item);
if (subscriptionsByReloadTrigger[itemString]) {
for (const handler of subscriptionsByReloadTrigger[itemString]) {
handler();
}
}

View File

@@ -9,7 +9,7 @@ import { apiCall, apiOff, apiOn } from './api';
const databaseInfoLoader = ({ conid, database }) => ({
url: 'database-connections/structure',
params: { conid, database },
reloadTrigger: `database-structure-changed-${conid}-${database}`,
reloadTrigger: { key: `database-structure-changed`, conid, database },
transform: extendDatabaseInfo,
});
@@ -28,31 +28,31 @@ const databaseInfoLoader = ({ conid, database }) => ({
const connectionInfoLoader = ({ conid }) => ({
url: 'connections/get',
params: { conid },
reloadTrigger: 'connection-list-changed',
reloadTrigger: { key: 'connection-list-changed' },
});
const configLoader = () => ({
url: 'config/get',
params: {},
reloadTrigger: 'config-changed',
reloadTrigger: { key: 'config-changed' },
});
const settingsLoader = () => ({
url: 'config/get-settings',
params: {},
reloadTrigger: 'settings-changed',
reloadTrigger: { key: 'settings-changed' },
});
const platformInfoLoader = () => ({
url: 'config/platform-info',
params: {},
reloadTrigger: 'platform-info-changed',
reloadTrigger: { key: 'platform-info-changed' },
});
const favoritesLoader = () => ({
url: 'files/favorites',
params: {},
reloadTrigger: 'files-changed-favorites',
reloadTrigger: { key: 'files-changed-favorites' },
});
// const sqlObjectListLoader = ({ conid, database }) => ({
@@ -64,13 +64,13 @@ const favoritesLoader = () => ({
const databaseStatusLoader = ({ conid, database }) => ({
url: 'database-connections/status',
params: { conid, database },
reloadTrigger: `database-status-changed-${conid}-${database}`,
reloadTrigger: { key: `database-status-changed`, conid, database },
});
const databaseListLoader = ({ conid }) => ({
url: 'server-connections/list-databases',
params: { conid },
reloadTrigger: `database-list-changed-${conid}`,
reloadTrigger: { key: `database-list-changed`, conid },
onLoaded: value => {
if (value?.length > 0) setLocalStorage(`database_list_${conid}`, value);
},
@@ -85,37 +85,37 @@ const databaseListLoader = ({ conid }) => ({
const serverVersionLoader = ({ conid }) => ({
url: 'server-connections/version',
params: { conid },
reloadTrigger: `server-version-changed-${conid}`,
reloadTrigger: { key: `server-version-changed`, conid },
});
const databaseServerVersionLoader = ({ conid, database }) => ({
url: 'database-connections/server-version',
params: { conid, database },
reloadTrigger: `database-server-version-changed-${conid}-${database}`,
reloadTrigger: { key: `database-server-version-changed`, conid, database },
});
const archiveFoldersLoader = () => ({
url: 'archive/folders',
params: {},
reloadTrigger: `archive-folders-changed`,
reloadTrigger: { key: `archive-folders-changed` },
});
const archiveFilesLoader = ({ folder }) => ({
url: 'archive/files',
params: { folder },
reloadTrigger: `archive-files-changed-${folder}`,
reloadTrigger: { key: `archive-files-changed`, folder },
});
const appFoldersLoader = () => ({
url: 'apps/folders',
params: {},
reloadTrigger: `app-folders-changed`,
reloadTrigger: { key: `app-folders-changed` },
});
const appFilesLoader = ({ folder }) => ({
url: 'apps/files',
params: { folder },
reloadTrigger: `app-files-changed-${folder}`,
reloadTrigger: { key: `app-files-changed`, app: folder },
});
// const dbAppsLoader = ({ conid, database }) => ({
@@ -127,41 +127,41 @@ const appFilesLoader = ({ folder }) => ({
const usedAppsLoader = ({ conid, database }) => ({
url: 'apps/get-used-apps',
params: {},
reloadTrigger: `used-apps-changed`,
reloadTrigger: { key: `used-apps-changed` },
});
const serverStatusLoader = () => ({
url: 'server-connections/server-status',
params: {},
reloadTrigger: `server-status-changed`,
reloadTrigger: { key: `server-status-changed` },
});
const connectionListLoader = () => ({
url: 'connections/list',
params: {},
reloadTrigger: `connection-list-changed`,
reloadTrigger: { key: `connection-list-changed` },
});
const installedPluginsLoader = () => ({
url: 'plugins/installed',
params: {},
reloadTrigger: `installed-plugins-changed`,
reloadTrigger: { key: `installed-plugins-changed` },
});
const filesLoader = ({ folder }) => ({
url: 'files/list',
params: { folder },
reloadTrigger: `files-changed-${folder}`,
reloadTrigger: { key: `files-changed`, folder },
});
const allFilesLoader = () => ({
url: 'files/list-all',
params: {},
reloadTrigger: `all-files-changed`,
reloadTrigger: { key: `all-files-changed` },
});
const authTypesLoader = ({ engine }) => ({
url: 'plugins/auth-types',
params: { engine },
reloadTrigger: `installed-plugins-changed`,
reloadTrigger: { key: `installed-plugins-changed` },
errorValue: null,
});