@stolostron/multicluster-sdk
Version:
Provides extensions and APIs that dynamic plugins can use to leverage multicluster capabilities provided by Red Hat Advanced Cluster Management.
123 lines • 4.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useFleetK8sWatchResourceStore = exports.getSocketMonitoringInterval = exports.getCacheEntryAge = exports.isCacheEntryFresh = exports.isCacheEntryValid = void 0;
/* Copyright Contributors to the Open Cluster Management project */
const zustand_1 = require("zustand");
const middleware_1 = require("zustand/middleware");
const CACHE_TTL = 30 * 1000; // 30 seconds
const CACHE_REMOVE_GRACE = 10 * 1000; // 10 seconds; wait a bit longer than TTL to remove cache entry so it is not removed between retrieval of initial value and start of watching
const isCacheEntryValid = (entry) => {
return !entry.result?.loadError && (!!entry.socket || (0, exports.isCacheEntryFresh)(entry));
};
exports.isCacheEntryValid = isCacheEntryValid;
const isCacheEntryFresh = (entry) => {
return (0, exports.getCacheEntryAge)(entry) < CACHE_TTL;
};
exports.isCacheEntryFresh = isCacheEntryFresh;
const getCacheEntryAge = (entry) => {
return Date.now() - entry.timestamp;
};
exports.getCacheEntryAge = getCacheEntryAge;
const getSocketMonitoringInterval = () => CACHE_TTL;
exports.getSocketMonitoringInterval = getSocketMonitoringInterval;
exports.useFleetK8sWatchResourceStore = (0, zustand_1.create)()((0, middleware_1.subscribeWithSelector)((set, get) => ({
cache: {},
setResult: (key, data, loaded, loadError, resourceVersion) => {
set((state) => {
const originalResult = state.cache[key] || {};
return {
cache: {
...state.cache,
[key]: {
...originalResult,
result: { data, loaded, loadError },
timestamp: Date.now(),
resourceVersion: resourceVersion ?? originalResult.resourceVersion,
},
},
};
});
},
setSocket: (key, socket) => {
set((state) => ({
cache: {
...state.cache,
[key]: {
...state.cache[key],
socket,
},
},
}));
},
incrementRefCount: (key) => {
set((state) => {
const entry = state.cache[key] || {};
const { refCount, timeout } = entry;
if (timeout) {
// cancel scheduled cache removal
clearTimeout(timeout);
}
return {
cache: {
...state.cache,
[key]: {
...entry,
refCount: (refCount || 0) + 1,
timeout: undefined,
},
},
};
});
},
decrementRefCount: (key) => {
set((state) => {
const entry = state.cache[key];
if (entry) {
const { socket, refCount } = entry;
const newRefCount = refCount > 0 ? refCount - 1 : 0;
if (newRefCount === 0 && socket) {
socket.close();
}
return {
cache: {
...state.cache,
[key]: {
...entry,
refCount: newRefCount,
socket: newRefCount > 0 ? socket : undefined,
timeout: newRefCount === 0
? setTimeout(() => state.removeEntry(key), CACHE_TTL + CACHE_REMOVE_GRACE) // schedule removal of entry
: undefined,
},
},
};
}
return state;
});
},
touchEntry: (key) => {
set((state) => ({
cache: {
...state.cache,
[key]: {
...state.cache[key],
timestamp: Date.now(),
},
},
}));
},
removeEntry: (key) => {
set((state) => {
const { [key]: removed, ...rest } = state.cache;
return {
cache: {
...rest,
},
};
});
},
getResult: (key) => get().cache[key]?.result,
getRefCount: (key) => get().cache[key]?.refCount,
getResourceVersion: (key) => get().cache[key]?.resourceVersion,
})));
//# sourceMappingURL=fleetK8sWatchResourceStore.js.map