| 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<MemoryUsageInfo | null>(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 | |
| } | |