UNPKG

@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
"use strict"; 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