mirror of
https://github.com/Studio-Saelix/sencho.git
synced 2026-08-19 14:56:27 +00:00
fix(licensing): backward-compatible tier/variant enforcement and self-healing variant detection (#385)
Accept legacy tier ('pro') and variant ('personal', 'team') names from older
remote nodes, normalizing them to current values ('paid', 'skipper', 'admiral')
in authMiddleware. This fixes distributed license enforcement failing between
v0.38.3 and v0.38.0 nodes due to the tier rename in v0.38.1.
Also fixes:
- Self-healing getVariant() that cross-checks stored variant_type against
product/variant name metadata on every call, correcting stale cached values
from previous buggy resolution logic
- Unguarded API responses in ResourcesView causing potential t.map crashes
- Fleet update status now polls on a 120s interval (was only fetched on mount)
- fetchRemoteMeta failures now logged for diagnosability
This commit is contained in:
@@ -707,9 +707,10 @@ export function FleetView({ onNavigateToNode }: FleetViewProps) {
|
||||
// Paid tier: auto-refresh every 30s
|
||||
useEffect(() => {
|
||||
if (!isPaid) return;
|
||||
const interval = setInterval(() => fetchOverview(), 30000);
|
||||
return () => clearInterval(interval);
|
||||
}, [isPaid, fetchOverview]);
|
||||
const overviewInterval = setInterval(fetchOverview, 30000);
|
||||
const updateInterval = setInterval(fetchUpdateStatus, 120000);
|
||||
return () => { clearInterval(overviewInterval); clearInterval(updateInterval); };
|
||||
}, [isPaid, fetchOverview, fetchUpdateStatus]);
|
||||
|
||||
// Fast poll (5s) when any node is actively updating — uses ref to avoid interval thrashing
|
||||
const hasUpdatingRef = useRef(false);
|
||||
|
||||
@@ -387,13 +387,17 @@ export default function ResourcesView() {
|
||||
apiFetch('/system/orphans'),
|
||||
]);
|
||||
|
||||
setUsage(await usageRes.json());
|
||||
const resources = await resourcesRes.json();
|
||||
setImages(resources.images ?? []);
|
||||
setVolumes(resources.volumes ?? []);
|
||||
setNetworks(resources.networks ?? []);
|
||||
setOrphans(await orphansRes.json());
|
||||
setSelectedOrphans([]);
|
||||
if (usageRes.ok) setUsage(await usageRes.json());
|
||||
if (resourcesRes.ok) {
|
||||
const resources = await resourcesRes.json();
|
||||
setImages(resources.images ?? []);
|
||||
setVolumes(resources.volumes ?? []);
|
||||
setNetworks(resources.networks ?? []);
|
||||
}
|
||||
if (orphansRes.ok) {
|
||||
setOrphans(await orphansRes.json());
|
||||
setSelectedOrphans([]);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Failed to fetch data', err);
|
||||
toast.error('Failed to load resources data');
|
||||
|
||||
Reference in New Issue
Block a user