sgcWebSockets 2026.5 — Rate Limiter, Circuit Breaker, API Keys, MCP OAuth & snellere IOCP

· Releases

sgcWebSockets 2026.5 is een stevige release. Drie nieuwe infrastructuurcomponenten maken van de WebSocket- / HTTP-server een productieklare API-gateway: een volwaardige rate limiter, een client-side circuit breaker en een API key manager met volledige lifecycle-ondersteuning. Aan de protocolzijde is er een nieuwe Forex.com-client gebouwd op een generieke Lightstreamer TLCP 2.5-implementatie, krijgt de MCP Server een ingebouwde OAuth 2.1-flow zodat hij rechtstreeks kan verbinden met browsergebaseerde MCP-clients zoals claude.ai, en boeken de IOCP (Windows) en EPOLL (Linux) I/O-engines zes meetbare prestatieverbeteringen. Ook nieuw is een vroege post-quantum primitief: sgcKEM_CreateMLKEM768Keys voor het genereren van ML-KEM-768 sleutelparen.

Deze post loopt door de hoogtepunten met plak-klare Delphi-snippets voor de nieuwe componenten.

TsgcWSRateLimiter — kant-en-klare API rate limiting

Plaats een TsgcWSRateLimiter naast je server en je hebt token-bucket, sliding-window of fixed-window rate limiting per IP, per API key, per gebruiker of per endpoint-patroon, plus dagelijkse/maandelijkse quota en burst-bescherming. Het component is thread-safe en bewaart de status op schijf (zodat een herstart van de server niet elke client een verse bonus geeft).

uses
  sgcWebSocket_Server_RateLimiter;

var
  oRL: TsgcWSRateLimiter;
  oResult: TsgcRateLimitResult;
begin
  oRL := TsgcWSRateLimiter.Create(nil);
  try
    oRL.TokenBucket.Enabled    := True;
    oRL.TokenBucket.Capacity   := 100;     // burst size
    oRL.TokenBucket.RefillRate := 10;      // tokens / interval
    oRL.TokenBucket.RefillIntervalMs := 1000;

    oRL.PerIP.Enabled       := True;
    oRL.PerIP.MaxRequests   := 60;
    oRL.PerIP.WindowSec     := 60;

    // Consume one token for the current request
    oResult := oRL.Consume('ip:' + vClientIP);
    if not oResult.Allowed then
      RespondHTTP(429, 'Retry-After: ' + IntToStr(oResult.RetryAfterSec));
  finally
    oRL.Free;
  end;
end;

De regel-resolver loopt door PerEndpoint (met wildcard-matching), daarna PerAPIKey, PerUser en uiteindelijk PerIP. Met de events OnThrottled, OnQuotaExceeded en OnStateChange kun je elke beslissing loggen of overschrijven.

Demo: Demos\04.WebSocket_Other_Samples\14.RateLimiter — draait een flood-generende client tegen een server die live statistieken en weigeringsredenen publiceert.

TsgcWSCircuitBreaker — client-side foutisolatie

Wanneer een upstream API (api.openai.com, een betaalgateway, een interne microservice) faalt of traag wordt, kosten hangende TCP-timeouts je verbindingen, threads en geld. TsgcWSCircuitBreaker implementeert het klassieke drie-statenpatroon (closed / open / half-open) bovenop elke subklasse van TsgcHTTPAPI_client, met een rollend tijdvenster, detectie van trage calls, optionele fallback-antwoorden en per-endpoint overrides.

uses
  sgcWebSocket_CircuitBreaker;

var
  oCB: TsgcWSCircuitBreaker;
begin
  oCB := TsgcWSCircuitBreaker.Create(nil);
  try
    oCB.Thresholds.FailureCount        := 5;
    oCB.Thresholds.FailureRatePercent  := 50;
    oCB.Thresholds.SlowCallDurationMs  := 2000;
    oCB.Thresholds.SlowCallRatePercent := 80;
    oCB.TimeWindow.RollingWindowSec    := 60;
    oCB.Recovery.CooldownSec           := 30;
    oCB.Recovery.HalfOpenTrialCalls    := 3;

    oCB.Fallback.Enabled        := True;
    oCB.Fallback.UseLastSuccess := True;

    if oCB.IsCallAllowed('openai') then
    try
      vResponse := oOpenAI.ChatCompletion(...);
      oCB.RecordSuccess('openai');
    except
      on E: Exception do
      begin
        oCB.RecordFailure('openai', E.ClassName);
        raise;
      end;
    end
    else
      vResponse := 'service temporarily unavailable';
  finally
    oCB.Free;
  end;
end;

Op Delphi 2009+ is er ook een one-liner wrapper beschikbaar: oCB.Execute('openai', procedure begin oOpenAI.ChatCompletion(...) end); — succes- / faalregistratie gebeurt automatisch.

Demo: Demos\04.WebSocket_Other_Samples\15.CircuitBreaker.

TsgcWSAPIKeyManager — key lifecycle in één component

De meeste "WebSocket API"-servers hebben API keys nodig: uitgeven, valideren, intrekken, roteren. TsgcWSAPIKeyManager verpakt de volledige lifecycle met scope-gebaseerde autorisatie, optionele hashing in rust, vervaldatum, een audit log en een ingebouwde rotatie-respijtperiode zodat oude keys nog blijven werken gedurende een configureerbaar venster na rotatie.

uses
  sgcWebSocket_Server_APIKeyManager;

var
  oKM: TsgcWSAPIKeyManager;
  vKey, vNewKey: string;
begin
  oKM := TsgcWSAPIKeyManager.Create(nil);
  try
    oKM.Generation.Length := 40;
    oKM.Generation.Prefix := 'sgc_';
    oKM.Hashing.Enabled   := True;        // store SHA-256 hash, not the plaintext
    oKM.Rotation.GracePeriodSec := 86400; // old key valid for 24h after rotation
    oKM.Expiration.DefaultTTLSec := 30 * 86400;

    // Issue a key for tenant "acme" with read+write scopes, expiring in 7 days
    vKey := oKM.IssueKey('acme', ['read', 'write'], 7 * 86400);

    // Validate the key on each request, optionally requiring a scope
    if not oKM.ValidateKey(vKey, 'read', vClientIP) then
      RespondHTTP(401, 'invalid api key');

    // Rotate a key (returns the new plaintext; old key remains valid for GracePeriodSec)
    oKM.RotateKey(vKey, vNewKey);
  finally
    oKM.Free;
  end;
end;

Het component kan de key rechtstreeks uit de binnenkomende HTTP-headers of querystring lezen met IsRequestAuthorized, zodat je de extractie niet zelf hoeft te bedraden.

Demo: Demos\04.WebSocket_Other_Samples\16.APIKeyManager.

Forex.com client + generieke Lightstreamer

De nieuwe TsgcWSAPI_Forex-client biedt gecombineerde REST- + streamingtoegang tot Forex.com (login, ping, market watch, posities, orders, trade history, simulate trade). Hij is gebouwd op een gloednieuw TsgcWSPClient_Lightstreamer-component, een generieke Lightstreamer TLCP 2.5-client die create_session, bind_session, control (subscribe / unsubscribe) en de LOOP auto-rebind + subscription replay na reconnect implementeert. De Lightstreamer-client is op zichzelf herbruikbaar, zodat dezelfde code-basis werkt met IG Markets en elke andere op Lightstreamer gebaseerde feed.

uses sgcHTTP_API_Forex;

var oFX: TsgcWSAPI_Forex;
begin
  oFX := TsgcWSAPI_Forex.Create(nil);
  oFX.UserName  := 'demo-user';
  oFX.Password  := 'secret';
  oFX.AppKey    := 'your-app-key';
  oFX.Login;
  oFX.SubscribePrices(['EUR/USD', 'GBP/USD', 'XAU/USD']);
  oFX.OnPriceUpdate := procedure(const aSymbol: string; aBid, aAsk: Double)
                      begin
                        ShowMessage(Format('%s %.5f / %.5f', [aSymbol, aBid, aAsk]));
                      end;
end;

Een volledige GUI-demo staat in Demos\05.Crypto\22.Forex — login, connectiviteitsping, live market watch, posities, actieve orders, trade history, stop- / limietgeschiedenis en simulate trade, met credentials persistent opgeslagen in sgcForexDemo.ini.

MCP Server — OAuth 2.1 voor browsergebaseerde MCP-clients

De MCP Server kan nu rechtstreeks praten met browsergebaseerde MCP-connectors (zoals claude.ai) zonder een externe autorisatieserver. Hij publiceert automatisch de vier OAuth discovery- / registratie-endpoints die de MCP-browser-connectorspec vereist, draait een PKCE-S256-autorisatieflow met een HTML-toestemmingsscherm en geeft refresh tokens uit:

CORS wordt inline afgehandeld: OPTIONS-preflight retourneert 204 met volledige Access-Control-*-headers voór authenticatie, elk antwoord draagt een Access-Control-Allow-Origin-reflectie van de request-origin en een Strict-Transport-Security: max-age=31536000 HSTS-header.

IOCP en EPOLL: zes tuning-winsten

De Windows IOCP- en Linux EPOLL-I/O-engines kregen een gerichte ronde aan prestatie- en tunability-werk.

IOCP (Windows)

oServer.Bindings.Add.Port := 443;
oServer.IOHandler := TsgcIndy_IOHandler_IO_IOCP.Create(oServer);
with TsgcIndy_IOHandler_IO_IOCP(oServer.IOHandler) do
begin
  SendBufferSize    := 256 * 1024;
  ReceiveBufferSize := 256 * 1024;
  TCPNoDelay        := True;
  Engine.ThreadAffinity := True;
end;

EPOLL (Linux)

Gedeeld

De IOCP- / EPOLL-workerpool deed vroeger sleep(1) bij elke iteratie inclusief direct na het verwerken van een taak — wat elke worker effectief beperkte tot ~1.000 ops/s zelfs wanneer de queue vol was. De sleep wordt nu overgeslagen zolang er werk wacht, waardoor de limiet vervalt.

HTTP.sys: opt-in high-performance mode

De HTTP.sys-server krijgt een FineTune-property met een OperatingMode-selector. De standaard ompClassic behoudt het bestaande gedrag. De nieuwe ompHighPerf-mode implementeert het MSDN N-workers × M-pre-posted-async-receives patroon — de aanbevolen architectuur voor HTTP.sys-deployments met hoge doorvoer — achter één enkele property:

oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.HTTP2Options.SecureOptions.HTTPAPI := True;   // use HTTP.sys
oServer.FineTune.OperatingMode := ompHighPerf;
oServer.FineTune.WorkerCount   := 8;
oServer.FineTune.PrePostedReceivesPerWorker := 16;
oServer.Active := True;

THttpServerRequest en THttpServerResponse zijn ook uitgebreid met extra velden die details dekken die voorheen alleen via handmatige parsing beschikbaar waren.

Post-quantum primitief: ML-KEM-768

Een kleine maar vooruitziende toevoeging: sgcKEM_CreateMLKEM768Keys genereert een ML-KEM-768 (FIPS 203 / Kyber-768) sleutelpaar in zowel PEM- als raw-bytes-vorm. ML-KEM is de post-quantum KEM die door NIST is gestandaardiseerd en staat op de IETF-roadmap voor hybride TLS 1.3 (X25519MLKEM768). Dit ontgrendelt experimenten met PQ-klaar handshakes vooruitlopend op de aankomende OpenSSL 3.5 / 3.6 baseline.

uses sgcKEM;

var vPubPEM, vPrivPEM: string; vPubRaw, vPrivRaw: TBytes;
begin
  sgcKEM_CreateMLKEM768Keys(vPubPEM, vPrivPEM, vPubRaw, vPrivRaw);
  TFile.WriteAllText('mlkem768_pub.pem', vPubPEM);
  TFile.WriteAllText('mlkem768_priv.pem', vPrivPEM);
end;

Betrouwbaarheids- en conformiteitsfixes

De bug-fix batch sluit een lange lijst MCP-, HTTP.sys-, IOCP- en HTTP/2-issues. Hoogtepunten:

Upgraden

2026.5 is een drop-in upgrade voor bestaande 2026.4-projecten. Aan bestaande componenten zijn geen interfacewijzigingen aangebracht; de nieuwe rate-limit- / circuit-breaker- / API-key-componenten zijn additief en opt-in. De HTTP.sys high-performance mode zit achter FineTune.OperatingMode := ompHighPerf — bestaande code blijft op het klassieke pad.

Klanten met een actief abonnement kunnen de nieuwe build downloaden uit de klantenzone. Trial-gebruikers kunnen het bijgewerkte installatieprogramma ophalen via esegece.com/products/sgcwebsockets/sgcwebsockets-download.

Vragen, feedback of migratiehulp? Neem contact op — je krijgt een antwoord van de mensen die de code hebben geschreven.