# FR-193 — `DyNTS_MemoryGuard` (bedrock OOM korai-figyelmeztetés)

**Csomag:** `@futdevpro/nts-dynamo` · **Dátum:** 2026-06-15

## Probléma

A Node heap-OOM (`--max-old-space-size` túllépés — pl. egy óriási `JSON.parse`, mint az
Overseernél a CCAP több-tíz-MB-os `cdpReport`-ja) a process-t **azonnal megöli**. A
`process.on('uncaughtException')` NEM kapja el — a crash pillanatában már **nincs mód a
hibát rögzíteni**. Eredmény: a szerver „csak eltűnik", nyom nélkül, és a kézi diagnózis
nehéz. Az EGYETLEN megbízható idő a rögzítésre a crash **ELŐTT** van.

## Megoldás — `DyNTS_MemoryGuard`

Bedrock, self-installing heap-watchdog **minden nts-szerverhez**. Periodikusan figyeli a
heap-kihasználtságot, és a `--max-old-space-size` plafonhoz közeledve **tartós rekordot**
hagy — mielőtt a fatal OOM bekövetkezne.

- **Megfigyel:** `v8.getHeapStatistics().heap_size_limit` (a valódi plafon) vs
  `process.memoryUsage().heapUsed`, default 10s-enként.
- **Rögzít:** küszöb-átlépéskor `DyFM_Log` + `DyNTS_GlobalService.globalErrorHandler`
  (az Errors-rendszer + Discord, ha bekötve). `warning` → `DyFM_ErrorLevel.warning`,
  `critical` → `.critical`. Plusz egy in-memory ring-buffer (`getHistory()`) +
  `getStatus()` (állapot + csúcsok) egy esetleges status-endpointhoz.
- **Hiszterézis:** eseményt CSAK állapot-váltáskor jelez (normal→warning→critical), és a
  `recoveryMargin`-nyit a warning alá esve jelez `recovered`-et → nincs küszöb-körüli spam.
- **NEM csinál:** nem állítja le/újraindítja a process-t (az a konténer `restart:` policy
  dolga), és nem próbálja elkapni a fatal OOM-ot (nem lehet). Tisztán megfigyelés +
  rögzítés + opcionális `onCritical` hook (amivel a fogyasztó terhet dobhat).
- **Biztonság:** minden út `try/catch`-elt — egy figyelő-réteg SOHA nem dönthet be egy
  szervert. A timer `unref()`-elt (nem tartja életben a process-t).

## Használat

**Automatikus (default-on):** a base `App` startup feltelepíti, ha
`DyNTS_global_settings.memoryGuard.enabled === true` (alapértelmezés szerint igen). Tehát
**minden nts-szerver megkapja** az nts-dynamo bump után — kód nélkül.

**Explicit / testreszabott:**
```ts
import { DyNTS_MemoryGuard } from '@futdevpro/nts-dynamo';

DyNTS_MemoryGuard.getInstance().install({
  heapWarningThreshold: 80,
  heapCriticalThreshold: 92,
  onCritical: (e) => { /* pl. terhelés-dobás / külső riasztás */ },
});
```

**Konfiguráció** (`DyNTS_global_settings.memoryGuard`, defaultok):
| mező | default | jelentés |
|------|---------|----------|
| `enabled` | `true` | a base App feltelepíti |
| `pollIntervalMs` | `10000` | poll-gyakoriság |
| `heapWarningThreshold` | `85` | warning a heap-plafon %-ában |
| `heapCriticalThreshold` | `95` | critical % |
| `recoveryMargin` | `10` | a warning alatti margó a `recovered`-hez |
| `maxHistoryCount` | `100` | megőrzött események |

## Az OOM-self-healing nagyobb képe

Ez a **„rögzítés" rétege** (record). A **„restart" rétege** a konténer-szintű
`restart: on-failure:N` + `mem_limit` (compose, fdp-devops) — együtt adják a teljes
self-healinget: a guard nyomot hagy a near-OOM-ról, a restart-policy auto-helyreállít a
crash után. A **forrás-prevenció** (a túl nagy payload parse-olásának elkerülése) külön
réteg (runner-oldali report-cap / body-limit).

## Fájlok
- `src/_services/core/memory-guard.service.ts` + `.spec.ts` (11 spec)
- `src/_models/interfaces/global-settings.interface.ts` (`memoryGuard` mező)
- `src/_collections/global-settings.const.ts` (defaultok, enabled:true)
- `src/_services/server/app.server.ts` (guarded auto-install a startup-ban)
- `src/index.ts` (fő-export)
