sgcWebSockets 2026.5 es una versión con mucho contenido. Tres nuevos componentes de infraestructura convierten el servidor WebSocket / HTTP en una pasarela de API de nivel de producción: un limitador de tasa con todas las prestaciones, un disyuntor del lado del cliente y un gestor de claves API con soporte completo del ciclo de vida. En el lado del protocolo hay un nuevo cliente de Forex.com construido sobre una implementación genérica de Lightstreamer TLCP 2.5, el servidor MCP incorpora un flujo OAuth 2.1 integrado para poder conectarse directamente a clientes MCP basados en navegador como claude.ai, y los motores de E/S IOCP (Windows) y EPOLL (Linux) ganan seis mejoras de rendimiento medibles. También hay una primitiva poscuántica temprana: sgcKEM_CreateMLKEM768Keys para generación de pares de claves ML-KEM-768.
Este artículo recorre los aspectos más destacados con fragmentos Delphi listos para pegar para los nuevos componentes.
TsgcWSRateLimiter — limitación de tasa de API lista para usar
Coloque un TsgcWSRateLimiter junto a su servidor y tendrá limitación de tasa por cubeta de tokens, ventana deslizante o ventana fija por IP, por clave API, por usuario o por patrón de endpoint, además de cuotas diarias/mensuales y protección contra ráfagas. El componente es seguro para hilos y persiste el estado en disco (de modo que un reinicio del servidor no concede a cada cliente un nuevo cupo).
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;
El resolvedor de reglas recorre PerEndpoint (con coincidencia por comodín), después PerAPIKey, PerUser y finalmente PerIP. Los eventos OnThrottled, OnQuotaExceeded y OnStateChange le permiten registrar o anular cada decisión.
Demo: Demos\04.WebSocket_Other_Samples\14.RateLimiter — ejecuta un cliente generador de inundación contra un servidor que publica estadísticas en vivo y motivos de rechazo.
TsgcWSCircuitBreaker — aislamiento de fallos del lado del cliente
Cuando una API ascendente (api.openai.com, una pasarela de pagos, un microservicio interno) empieza a fallar o a ir lenta, quedarse colgado en tiempos de espera TCP le cuesta conexiones, hilos y dinero. TsgcWSCircuitBreaker implementa el clásico patrón de tres estados (cerrado / abierto / semiabierto) sobre cualquier subclase de TsgcHTTPAPI_client, con una ventana temporal deslizante, detección de llamadas lentas, respuestas de respaldo opcionales y anulaciones por endpoint.
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;
En Delphi 2009+ también está disponible un envoltorio de una sola línea: oCB.Execute('openai', procedure begin oOpenAI.ChatCompletion(...) end); — el registro de éxito / fallo se realiza automáticamente.
Demo: Demos\04.WebSocket_Other_Samples\15.CircuitBreaker.
TsgcWSAPIKeyManager — ciclo de vida de claves en un solo componente
La mayoría de los servidores de "WebSocket API" necesitan claves API: emitir, validar, revocar, rotar. TsgcWSAPIKeyManager envuelve el ciclo de vida completo con autorización basada en ámbitos, hash opcional en reposo, expiración, un registro de auditoría y un período de gracia de rotación integrado para que las claves antiguas sigan funcionando durante una ventana configurable tras la rotación.
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;
El componente puede leer la clave directamente desde las cabeceras HTTP entrantes o desde la cadena de consulta con IsRequestAuthorized, de modo que no tiene que cablear la extracción usted mismo.
Demo: Demos\04.WebSocket_Other_Samples\16.APIKeyManager.
Cliente Forex.com + Lightstreamer genérico
El nuevo cliente TsgcWSAPI_Forex ofrece acceso REST + streaming unificado a Forex.com (inicio de sesión, ping, vigilancia de mercado, posiciones, órdenes, historial de operaciones, simulación de operaciones). Está construido sobre un nuevo componente TsgcWSPClient_Lightstreamer, un cliente genérico de Lightstreamer TLCP 2.5 que implementa create_session, bind_session, control (subscribe / unsubscribe) y la reconexión automática LOOP + reproducción de suscripciones tras la reconexión. El cliente de Lightstreamer es reutilizable por sí mismo, de modo que la misma base de código funciona con IG Markets y cualquier otro feed respaldado por Lightstreamer.
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;
Una demo GUI completa vive en Demos\05.Crypto\22.Forex — inicio de sesión, ping de conectividad, vigilancia de mercado en vivo, posiciones, órdenes activas, historial de operaciones, historial de stop / limit y simulación de operaciones, con las credenciales persistidas en sgcForexDemo.ini.
Servidor MCP — OAuth 2.1 para clientes MCP basados en navegador
El servidor MCP ahora puede hablar directamente con conectores MCP basados en navegador (como claude.ai) sin un servidor de autorización externo. Publica automáticamente los cuatro endpoints de descubrimiento / registro de OAuth requeridos por la especificación de conector MCP de navegador, ejecuta un flujo de autorización PKCE-S256 con una pantalla de consentimiento HTML y emite tokens de refresco:
GET /.well-known/oauth-authorization-server— metadatos RFC 8414.GET /.well-known/oauth-protected-resource— metadatos de recurso protegido RFC 9728.POST /oauth/register— registro dinámico de clientes RFC 7591.GET /oauth/authorize— formulario HTML de consentimiento.POST /oauth/token— PKCE S256 + tokens de refresco.
CORS se gestiona en línea: el preflight OPTIONS devuelve 204 con todas las cabeceras Access-Control-* antes de la autenticación, cada respuesta lleva una Access-Control-Allow-Origin que refleja el origen de la solicitud y una cabecera HSTS Strict-Transport-Security: max-age=31536000.
IOCP y EPOLL: seis mejoras de ajuste
Los motores de E/S IOCP de Windows y EPOLL de Linux recibieron una ronda enfocada de trabajo de rendimiento y ajuste.
IOCP (Windows)
ThreadAffinity(por defectoFalse) enTsgcIndy_IO_Engine— ancla los hilos del motor por turno rotatorio a núcleos lógicos medianteSetThreadAffinityMask. Reduce el tráfico de caché entre núcleos en sistemas con muchos núcleos.Metrics— un nuevo registroTsgcIndy_IO_EngineMetrics(AcceptsPosted,AcceptsCompleted,ReadsPosted,ReadsCompleted,ActiveConnections,BytesRead,BytesWritten) actualizado bajo una sección crítica. Se acabaron las suposiciones.SendBufferSize,ReceiveBufferSize,TCPNoDelayenTsgcIndy_IOHandler_IO_IOCP— aplicados enAfterAcceptmediantesetsockopt, de modo que el ajuste por conexión ya no requiere un manejadorOnConnectpersonalizado.TsgcPerIoDataPoolcapacidad aumentada de 256 a 2048, evitando el respaldo al montón deGetMem/FreeMembajo alta concurrencia de conexiones. +15–18% de rendimiento WebSocket en pruebas de loopback.
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— ajustan el bucle de aceptación y la protección contra slow-loris.- Contrapresión de escritura impulsada por EPOLLOUT — cuando
send()devuelveEAGAINen una escritura parcial, los bytes restantes se capturan en un búfer pendiente por conexión y el socket se rearma conEPOLLIN|EPOLLOUT. El reactor descarga la cola en el siguiente eventoEPOLLOUTen lugar de descartar los bytes o bloquear al trabajador.
Compartido
El grupo de trabajadores IOCP / EPOLL solía hacer sleep(1) en cada iteración incluso justo después de procesar una tarea — limitando efectivamente cada trabajador a ~1.000 ops/s incluso cuando la cola estaba llena. La pausa ahora se omite mientras haya trabajo esperando, eliminando el límite.
HTTP.sys: modo de alto rendimiento opcional
El servidor HTTP.sys gana una propiedad FineTune con un selector OperatingMode. El valor por defecto ompClassic preserva el comportamiento existente. El nuevo modo ompHighPerf implementa el patrón MSDN de N-trabajadores × M-recepciones-asíncronas-prepublicadas — la arquitectura recomendada para despliegues HTTP.sys de alto rendimiento — tras una sola propiedad:
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 y THttpServerResponse también se han ampliado con campos adicionales que cubren detalles que antes solo estaban disponibles mediante análisis manual.
Primitiva poscuántica: ML-KEM-768
Una adición pequeña pero con visión de futuro: sgcKEM_CreateMLKEM768Keys genera un par de claves ML-KEM-768 (FIPS 203 / Kyber-768) tanto en formato PEM como en bytes en bruto. ML-KEM es el KEM poscuántico estandarizado por NIST y en la hoja de ruta del IETF para TLS 1.3 híbrido (X25519MLKEM768). Esto desbloquea la experimentación con handshakes preparados para PQ antes de la próxima base OpenSSL 3.5 / 3.6.
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;
Correcciones de fiabilidad y conformidad
El lote de correcciones de errores cierra una larga lista de incidencias de MCP, HTTP.sys, IOCP y HTTP/2. Aspectos destacados:
- Servidor MCP — las credenciales ausentes o no válidas ahora devuelven
401 Unauthorizedcon una cabeceraWWW-Authenticate: Bearerque apunta a los metadatos del recurso protegido, en lugar de500 Internal Server Error. Necesario para el descubrimiento OAuth por parte de clientes MCP basados en navegador. - Servidor MCP — las solicitudes
OPTIONSya no llegan al analizador JSON-RPC (antes devolvían500 "Invalid jsonrpc Value"). El preflight CORS ahora se gestiona antes de la autenticación y antes del analizador de cuerpo MCP. - Servidor MCP — las descripciones de herramientas, los mensajes de prompts y los contenidos de recursos que contienen caracteres no ASCII ya no rompen la conexión (el cuerpo JSON ahora coincide con el
charset=utf-8declarado). - Servidor MCP — los campos
namedetool/prompt/resource/root/template/ completion-ref y completion-argument que contienen caracteres no ASCII ahora se emiten y leen correctamente como escapes JSON\uXXXXen lugar de puntos de código UTF-16 en bruto. - Cuerpo de solicitud API HTTP —
TsgcWSComponent_Server.DoHTTPRequestAPIsolía llamar aReadStringFromStreamsin especificar una codificación, recurriendo por defecto a ASCII y sustituyendo cada byte no ASCII por?antes de que los manejadores de eventos lo vieran. Corregido. - Servidor HTTP.sys — fuga de contexto en
ERROR_MORE_DATAenTsgcHTTPServerAPI.DoExecute. El bucle de aceptación ahora aumenta el búfer y reintentaHttpReceiveHttpRequestcon el mismo id de solicitud, y libera los contextos huérfanos en todas las rutas de error. - Servidor HTTP.sys —
TsgcWSConnectionServer_HTTPAPI.DoSendHTTP_Responseya no estableceHTTP_SEND_RESPONSE_FLAG_MORE_DATAen la respuesta final. - IOCP IOHandler —
TsgcIndy_IO_Engine_IOCP_Base.DoStopThreadsestaba llamando aWaitForMultipleObjectssobre una matriz de IDs de hiloDWORD(FThreadsId) en lugar de HANDLEs de hilo. Corregido. - IOCP IOHandler — las operaciones de E/S pendientes en los sockets ahora se cancelan al apagar y al cerrar por socket.
- IOCP IOHandler — la frágil sonda
Overlapped.Internal = STATUS_PENDINGenDoFreePerIoDatase reemplaza con un indicador explícitoCompleted: BooleanenTsgcPerIoData. - HTTP/2 WebBrokerBridge — Invalid pointer operation en
sgcFree(oResponse)enTsgcWSHTTPServer.OnHTTP2RequestEventcuando DataSnap REST manejaba una tramaHEADERS-only de HTTP/2.
Actualización
2026.5 es una actualización directa para proyectos 2026.4 existentes. No se realizaron cambios de interfaz en los componentes existentes; los nuevos componentes de limitación de tasa / disyuntor / clave API son aditivos y opcionales. El modo de alto rendimiento de HTTP.sys está protegido tras FineTune.OperatingMode := ompHighPerf — el código existente permanece en la ruta clásica.
Los clientes con una suscripción activa pueden descargar la nueva compilación desde el área de clientes. Los usuarios de la versión de prueba pueden obtener el instalador actualizado en esegece.com/products/sgcwebsockets/sgcwebsockets-download.
¿Preguntas, comentarios o ayuda con la migración? Póngase en contacto — obtendrá una respuesta de las personas que escribieron el código.
