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:
GET /.well-known/oauth-authorization-server— RFC 8414 metadata.GET /.well-known/oauth-protected-resource— RFC 9728 protected-resource metadata.POST /oauth/register— RFC 7591 dynamische client-registratie.GET /oauth/authorize— HTML-toestemmingsformulier.POST /oauth/token— PKCE S256 + refresh tokens.
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)
ThreadAffinity(standaardFalse) opTsgcIndy_IO_Engine— engine-threads round-robin vastpinnen aan logische cores viaSetThreadAffinityMask. Vermindert cross-core cacheverkeer op systemen met veel cores.Metrics— een nieuwTsgcIndy_IO_EngineMetrics-record (AcceptsPosted,AcceptsCompleted,ReadsPosted,ReadsCompleted,ActiveConnections,BytesRead,BytesWritten) bijgewerkt onder een critical section. Niet langer gokken.SendBufferSize,ReceiveBufferSize,TCPNoDelayopTsgcIndy_IOHandler_IO_IOCP— toegepast inAfterAcceptviasetsockopt, zodat per-connectie tuning niet langer een customOnConnect-handler vereist.TsgcPerIoDataPool-capaciteit verhoogd van 256 naar 2048, waardoor deGetMem/FreeMemheap-fallback bij hoge gelijktijdige connecties wordt vermeden. +15–18% WebSocket-doorvoer in loopback-benchmarks.
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)
AcceptBatchSize,WaitTimeoutMS,HandshakeTimeoutMS— tune de accept loop en de slow-loris-bescherming.- EPOLLOUT-gestuurde schrijf-backpressure — wanneer
send()EAGAINretourneert bij een gedeeltelijke write, worden de resterende bytes vastgelegd in een per-connectie pending buffer en wordt de socket opnieuw scherpgesteld metEPOLLIN|EPOLLOUT. De reactor flusht de staart bij de volgendeEPOLLOUT-gebeurtenis in plaats van de bytes weg te gooien of de worker te blokkeren.
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:
- MCP Server — ontbrekende of ongeldige credentials retourneren nu
401 Unauthorizedmet eenWWW-Authenticate: Bearer-header die wijst naar de protected-resource metadata, in plaats van500 Internal Server Error. Vereist voor OAuth discovery door browsergebaseerde MCP-clients. - MCP Server —
OPTIONS-requests raken niet langer de JSON-RPC parser (retourneerde voorheen500 "Invalid jsonrpc Value"). CORS-preflight wordt nu afgehandeld voór authenticatie en voór de MCP-body parser. - MCP Server — tool-beschrijvingen, prompt-berichten en resource-inhoud die niet-ASCII tekens bevatten breken de verbinding niet langer (de JSON-body komt nu overeen met de gedeclareerde
charset=utf-8). - MCP Server —
tool- /prompt- /resource- /root- /template- / completion-ref- en completion-argument-name-velden die niet-ASCII tekens bevatten worden nu correct uitgezonden en gelezen als JSON\uXXXX-escapes in plaats van ruwe UTF-16 code points. - HTTP API request body —
TsgcWSComponent_Server.DoHTTPRequestAPIriepReadStringFromStreamaan zonder een encoding op te geven, waarbij standaard ASCII werd gebruikt en elke niet-ASCII byte werd vervangen door?voordat event handlers het zagen. Fixed. - HTTP.sys Server — context-leak op
ERROR_MORE_DATAinTsgcHTTPServerAPI.DoExecute. De accept-loop laat nu de buffer groeien en probeertHttpReceiveHttpRequestopnieuw op dezelfde request-id, en geeft verweesde contexten vrij op alle foutpaden. - HTTP.sys Server —
TsgcWSConnectionServer_HTTPAPI.DoSendHTTP_Responsezet niet langerHTTP_SEND_RESPONSE_FLAG_MORE_DATAop het laatste antwoord. - IOCP IOHandler —
TsgcIndy_IO_Engine_IOCP_Base.DoStopThreadsriepWaitForMultipleObjectsaan op een array vanDWORDthread-IDs (FThreadsId) in plaats van thread-HANDLEs. Fixed. - IOCP IOHandler — openstaande I/O-operaties op sockets worden nu geannuleerd bij shutdown en bij per-socket close.
- IOCP IOHandler — de fragiele
Overlapped.Internal = STATUS_PENDING-probe inDoFreePerIoDatais vervangen door een explicieteCompleted: Boolean-flag opTsgcPerIoData. - HTTP/2 WebBrokerBridge — Invalid pointer operation bij
sgcFree(oResponse)inTsgcWSHTTPServer.OnHTTP2RequestEventwanneer DataSnap REST een HTTP/2-HEADERS-only frame afhandelde.
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.
