import { Request, Response } from 'express'; import { DyNTS_SingletonServiceBase } from '../../_services/base/singleton.service-base'; import { DyNTS_RateLimit_Config } from './_models/rate-limit-config.interface'; import { DyNTS_RateLimit_Policy } from './_models/rate-limit-policy.interface'; /** * Sliding-window HTTP rate-limit middleware — opt-in service-szel, a meglevo * `DyNTS_Endpoint_Params.preProcesses` mechanizmus mellol mukodik. * * **Hasznalat (host app):** * ```ts * const rateLimit = DyNTS_RateLimit_Middleware.getInstance(); * rateLimit.configure({ * defaultLimit: 100, // 100 req/perc default * defaultWindowMs: 60_000, * keyExtractor: (req) => req.headers['x-api-key'] as string || req.ip, * }); * * new DyNTS_Endpoint_Params({ * ..., * preProcesses: [rateLimit.check, ...other], * }); * * // subscription-tier-up: per-kulcs egyedi limit * rateLimit.setPolicyForKey('subscriber-tier-key-123', { * limit: 1000, * windowMs: 60_000, * }); * ``` * * **Viselkedes:** * - Sliding-window algoritmus: minden request egy timestamp; a window-on * kivuli timestamp-ek nem szamolnak. Tobb pontos mint a fix-bucket * (boundary-burst nincs). * - In-memory storage — single-instance MVP-nek megfelelo. Multi-instance * prod-hoz Redis-backed extension kell (lasd a kozelebb dokumentumaltot). * - Limit lepes: 429 DyFM_Error + `X-RateLimit-*` + `Retry-After` header-ek. * * **Storage:** `Map` ahol storageKey = `${subject}|${endpoint}`. * Periodikus GC takaritja a inaktiv kulcsokat. * * **Singleton:** `getInstance()`-szel hivd. A `.check` mezo binding-elve van * `this`-re, igy direkt atadhato `preProcesses`-be ujracsomagolas nelkul. */ export declare class DyNTS_RateLimit_Middleware extends DyNTS_SingletonServiceBase { static getInstance(): DyNTS_RateLimit_Middleware; private defaultLimit; private defaultWindowMs; private responseHeaders; private keyExtractor; private endpointGrouper; /** request-log: storageKey → timestamp-tomb (Date.now() ms). */ private requestLog; /** Per-kulcs egyedi policy-k. */ private keyPolicies; /** Per-endpoint(-csoport) egyedi policy-k (a `endpointGrouper` outputjara kulcsolva). */ private endpointPolicies; /** GC timer handle. */ private gcTimer; /** * Konfig override. Hianyzo mezok a default-okat orzik. Hivhato barmikor — * a `check()` a friss config-ot olvassa. */ configure(config: DyNTS_RateLimit_Config): void; /** * Aktualis konfig olvasasa (diagnosztika celokra). */ getConfig(): { defaultLimit: number; defaultWindowMs: number; responseHeaders: boolean; activeKeyPolicies: number; activeEndpointPolicies: number; trackedStorageKeys: number; }; /** * Per-kulcs egyedi policy beallitas (pl. subscription-tier alapjan). * A `key`-nek pontosan azzal a stringgel kell egyeznie, amit a `keyExtractor` * visszaad. */ setPolicyForKey(key: string, policy: DyNTS_RateLimit_Policy): void; /** * Per-kulcs policy torlese (visszaall a default-ra). */ clearPolicyForKey(key: string): void; /** * Per-endpoint(-csoport) egyedi policy beallitas. Az `endpoint`-nek pontosan * azzal a stringgel kell egyeznie, amit az `endpointGrouper` visszaad (default: `req.path`). * Akkor hasznos, ha egy endpointnak a globalis default-tol eltero limit kell — pl. egy * webhook nagy burst-toleranciat igenyel (a legit, distributed forgalom ne bukjon), mig * egy admin-endpoint szuk limitet. Precedencia: per-kulcs policy > per-endpoint policy > default. */ setPolicyForEndpoint(endpoint: string, policy: DyNTS_RateLimit_Policy): void; /** * Per-endpoint policy torlese (visszaall a default-ra). */ clearPolicyForEndpoint(endpoint: string): void; /** * Pre-process function — atadhato `DyNTS_Endpoint_Params.preProcesses`-be. * * Throws: * - 429 ha az aktualis request meghaladna a limit-et a sliding window-on * * Side-effect: ha `responseHeaders === true`, beallitja az `X-RateLimit-Limit`, * `X-RateLimit-Remaining`, `X-RateLimit-Reset` header-eket; 429 eseten * a `Retry-After` header-t is. */ readonly check: (req: Request, res: Response) => Promise; /** * Default key-extractor: x-forwarded-for vagy req.ip vagy 'unknown'. * Csak akkor hasznalt, ha a host nem allit be sajat extractort a configure-ben. */ private defaultKeyExtractor; /** * GC timer inditasa (idempotent). Periodikusan eltavolitja az inaktiv * storage-key-eket a request-log-bol — memory-leak prevention. */ private startGcTimer; /** * GC sweep — minden storage-key-rol levagja a regi timestamp-eket, es * eltavolitja az ureseket. Hivhato kulonosen test-bol. */ runGc(): void; /** * GC timer leallitasa (graceful shutdown vagy test-cleanup). */ stopGcTimer(): void; /** * Test-only: visszaallitja a default config-ot + uriti a state-et, hogy a * specfajlok ne szivarogjak at egymas state-jet. Production code NE hivja. */ _resetForTesting(): void; } //# sourceMappingURL=rate-limit.middleware.d.ts.map