import { useState } from 'react' import { useInterval } from 'usehooks-ts' export type MemoryUsageStatus = 'normal' | 'high' | 'critical' export type MemoryUsageInfo = { heapUsed: number status: MemoryUsageStatus } const HIGH_MEMORY_THRESHOLD = 1.5 * 1024 * 1024 * 1024 // 1.5GB in bytes const CRITICAL_MEMORY_THRESHOLD = 2.5 * 1024 * 1024 * 1024 // 2.5GB in bytes /** * Hook to monitor Node.js process memory usage. * Polls every 10 seconds; returns null while status is 'normal'. */ export function useMemoryUsage(): MemoryUsageInfo | null { const [memoryUsage, setMemoryUsage] = useState(null) useInterval(() => { const heapUsed = process.memoryUsage().heapUsed const status: MemoryUsageStatus = heapUsed >= CRITICAL_MEMORY_THRESHOLD ? 'critical' : heapUsed >= HIGH_MEMORY_THRESHOLD ? 'high' : 'normal' setMemoryUsage(prev => { // Bail when status is 'normal' — nothing is shown, so heapUsed is // irrelevant and we avoid re-rendering the whole Notifications subtree // every 10 seconds for the 99%+ of users who never reach 1.5GB. if (status === 'normal') return prev === null ? prev : null return { heapUsed, status } }) }, 10_000) return memoryUsage }