/** * DyNTS Mongo reconnect-guard (2026-06-20) — TÚLÉLI a Mongo-konténer IP-VÁLTÁSÁT. * * PROBLÉMA (élőben, 2026-06-19): a MongoDB-driver a hostnevet (`mongodb`) connect-kor EGYSZER * resolválja és cache-eli az IP-t (pl. 172.18.0.20); standalone-nál disconnect után UGYANAZT az * IP-t pingeli, NEM re-resolve-ol. Ha a Mongo-konténert recreate-elik (új docker-network IP), a * driver örökre a HALOTT IP-n lóg → `connect ECONNREFUSED :29017` + `buffering timed out`, * és a service magától SOHA nem áll vissza (csak külső restart-tal). Ez a 2026-06-19 incidens fél * test-stacket levitt (auth/ftp/helocia/futdevpro/… mind a régi Mongo-IP-n ragadt). * * MEGOLDÁS: a guard figyeli a `mongoose.connection.readyState`-et; ha TARTÓSAN nem-connected * (a driver saját reconnect-grace-e UTÁN is), **TELJES `disconnect()` + `connect()`-et** csinál * → ÚJ MongoClient → ÚJ DNS-resolve → új IP → reconnect. Így minden DyNTS_App-service magától * túléli a Mongo IP-váltását, KÜLSŐ beavatkozás nélkül. Best-effort, sose dob; csak konténer-IP- * frissítés, NEM törli/írja az adatot. * * SAFE always-on: egy app újracsatlakozása a SAJÁT DB-jéhez korrekt, nem-destruktív viselkedés * (nincs az infra-restart-érzékenység, ami a külső watchdog-oknál — FR-229/237). Csak akkor * avatkozik be, ha readyState !== 1 a grace + cooldown letelte UTÁN is; healthy connection-t (===1) * SOHA nem bánt. * * A döntés-mag (`shouldForceMongoReconnect`) PURE + unit-tesztelt; a futtató injektált dep-ekkel * dolgozik (readyState-olvasás / reconnect / log) a tesztelhetőségért. */ /** A pure döntés inputja (minden numerikus → determinisztikus + tesztelhető). */ export interface MongoReconnectState { /** mongoose.connection.readyState: 0=disconnected, 1=connected, 2=connecting, 3=disconnecting. */ readyState: number; /** Mióta (ms) nem-connected a readyState (0, ha épp connected). */ msSinceUnhealthy: number; /** Grace: ennyi ideig hagyjuk a drivert SAJÁT magát visszahozni, mielőtt force-reconnectolnánk. */ unhealthyGraceMs: number; /** Épp folyamatban van-e már egy force-reconnect (ne torlódjon). */ reconnectInFlight: boolean; /** Mióta (ms) volt az utolsó force-reconnect (Infinity, ha még nem volt). */ msSinceLastReconnect: number; /** Két force-reconnect közti minimum (anti-thrash). */ reconnectCooldownMs: number; } /** A pure döntés eredménye. */ export interface MongoReconnectDecision { reconnect: boolean; reason: string; } /** * PURE döntés: kell-e force-reconnect. Healthy (===1) / connecting (===2) / in-flight / grace-en * vagy cooldown-on belül → NEM. Csak tartós nem-connected (disconnected/disconnecting) + grace és * cooldown letelt + nincs in-flight → IGEN. */ export declare function shouldForceMongoReconnect(s: MongoReconnectState): MongoReconnectDecision; /** Injektált függőségek a futtatóhoz (best-effort; a futtató sose dob). */ export interface MongoReconnectGuardDeps { /** A jelenlegi `mongoose.connection.readyState`. */ getReadyState: () => number; /** * Force-reconnect: `disconnect()` majd `connect(uri, opts)` — ÚJ MongoClient → ÚJ DNS-resolve. * Dobhat (a connect elbukhat, ha a Mongo épp tényleg down) — a futtató elkapja. */ reconnect: () => Promise; /** Log. */ log: (msg: string) => void; /** Tick-intervallum (ms). Default 10s. */ intervalMs?: number; /** Grace, amíg a driver saját reconnect-jét várjuk (ms). Default 30s. */ unhealthyGraceMs?: number; /** Cooldown két force-reconnect közt (ms). Default 20s. */ reconnectCooldownMs?: number; } /** * Elindítja a periodikus reconnect-guard-ot. A visszaadott függvény leállítja (teszt/teardown). * `.unref()` — nem tartja életben az event-loop-ot. */ export declare function startMongoReconnectGuard(deps: MongoReconnectGuardDeps): () => void; //# sourceMappingURL=mongo-reconnect-guard.util.d.ts.map