sgcWebSockets 2026.6: gRPC, serwer OpenAPI, Kafka i natywny TLS

· Wydania

sgcWebSockets 2026.6 to jedno z największych wydań w historii biblioteki. Przynosi trzy zupełnie nowe klienty (natywny klient gRPC, klient Apache Kafka oraz samodzielny serwer OpenAPI 3), dwa natywne dla systemu operacyjnego backendy TLS, które pozwalają wdrażać aplikacje mobilne i desktopowe bez OpenSSL, silnik wykrywania botów w zaporze działający wyłącznie w trybie klasyfikacji, transport stdio dla MCP dla agentów AI, zestaw postkwantowych prymitywów kryptograficznych oraz szeroką falę wzmocnień bezpieczeństwa obejmującą serwery WebSocket i HTTP.

Ten wpis to przewodnik po najważniejszych nowościach, z krótkim fragmentem kodu w Delphi dla każdej z nich oraz odnośnikiem do dedykowanego artykułu, w którym każda funkcja została opisana szczegółowo.

Klient gRPC działający na HTTP/2

Nowy TsgcGRPCClient to natywny klient gRPC zbudowany na istniejącym TsgcHTTP2Client, który nie wymaga wdrażania żadnego zewnętrznego środowiska uruchomieniowego gRPC. Obsługuje cztery wzorce RPC (unarny, strumieniowanie po stronie serwera, strumieniowanie po stronie klienta oraz strumieniowanie dwukierunkowe), opcje kanału dla kompresji i typu zawartości, domyślne metadane i metadane na poziomie wywołania, terminy wykonania, automatyczne ponawianie z wykładniczym wycofywaniem, równoważenie obciążenia po stronie klienta (Pick First i Round Robin), gRPC Health Checking, Server Reflection, interceptory oraz metryki OpenTelemetry.

uses
  sgcHTTP2, sgcGRPC_Client, sgcGRPC_Classes, sgcGRPC_Types;

var
  HTTP2: TsgcHTTP2Client;
  GRPC: TsgcGRPCClient;
  oResponse: TsgcGRPCResponse;
begin
  HTTP2 := TsgcHTTP2Client.Create(nil);
  HTTP2.Host := 'grpc.example.com';
  HTTP2.Port := 443;
  HTTP2.TLS  := True;

  GRPC := TsgcGRPCClient.Create(nil);
  GRPC.Client := HTTP2;

  // metadata is sent on every call (auth, tracing...)
  GRPC.DefaultMetadata.Add('authorization', 'Bearer eyJ...');

  // unary call: the request is your serialized protobuf message as TBytes
  oResponse := GRPC.Call('helloworld.Greeter', 'SayHello', RequestBytes);
  if oResponse.StatusCode = grpcOK then
    Memo1.Text := oResponse.DataString
  else
    ShowMessage('gRPC error: ' + oResponse.StatusMessage);
end;

Oprócz generycznego klienta, 2026.6 dostarcza typowane interfejsy gRPC dla ośmiu usług Google Cloud, z których każda zawiera klasy żądań i odpowiedzi protobuf oraz uwierzytelnianie JWT za pomocą konta usługi: Pub/Sub, Speech-to-Text, Translation, Vision, Natural Language, Cloud Storage, BigQuery Storage i Vertex AI. Pełny przewodnik: Klient gRPC dla Delphi.

Samodzielny serwer OpenAPI 3

TsgcWSAPIServer_OpenAPI zamienia specyfikację OpenAPI 3 w działający serwer REST. Wczytaj specyfikację (lub wygeneruj ją z klasy Delphi za pomocą atrybutów RTTI), podłącz ją do TsgcWebSocketHTTPServer, a otrzymasz routing, walidację żądań, Swagger UI i CORS od ręki. Błędy walidacji automatycznie zwracają problem+json zgodny z RFC 7807.

uses
  sgcWebSocket, sgcWebSocket_Classes,
  sgcWebSocket_Server_API_OpenAPI,
  sgcHTTP_OpenAPI_Server;

var
  WSServer: TsgcWebSocketHTTPServer;
  FOpenAPI: TsgcWSAPIServer_OpenAPI;
begin
  WSServer := TsgcWebSocketHTTPServer.Create(nil);
  WSServer.Port := 8080;

  FOpenAPI := TsgcWSAPIServer_OpenAPI.Create(nil);
  FOpenAPI.OnRequest := OnOpenAPIRequest;
  FOpenAPI.OnValidationError := OnOpenAPIValidationError;

  FOpenAPI.OpenAPIOptions.Endpoint.ServeSpec := True;
  FOpenAPI.OpenAPIOptions.Endpoint.ServeSwaggerUI := True;
  FOpenAPI.OpenAPIOptions.CORS.Enabled := True;
  FOpenAPI.OpenAPIOptions.Validation.ValidateRequest := True;

  FOpenAPI.LoadFromFile('petstore.json');
  FOpenAPI.Server := WSServer;

  WSServer.Active := True;
  // Swagger UI:   http://localhost:8080/docs
  // Raw spec:     http://localhost:8080/openapi.json
end;

Czytaj więcej: Serwer OpenAPI dla Delphi.

Klient Apache Kafka

TsgcWSPClient_Kafka to natywny klient Apache Kafka, który posługuje się binarnym protokołem sieciowym Kafka po surowym TCP, bez zależności od Javy lub librdkafka. Produkuj i konsumuj komunikaty, subskrybuj i odpytuj oraz zarządzaj grupami konsumentów, tematami i offsetami.

uses
  sgcWebSocket, sgcWebSocket_Protocols, sgcKafka_Classes;

var
  oClient: TsgcWebSocketClient;
  oKafka: TsgcWSPClient_Kafka;
begin
  oClient := TsgcWebSocketClient.Create(nil);
  oClient.Specifications.RFC6455 := False; // raw TCP, native Kafka protocol
  oClient.Host := '127.0.0.1';
  oClient.Port := 9092;

  oKafka := TsgcWSPClient_Kafka.Create(nil);
  oKafka.Client := oClient;
  oKafka.KafkaOptions.ClientId := 'my-delphi-app';
  oKafka.OnKafkaConnect := OnKafkaConnect;
  oKafka.OnKafkaMessage := OnKafkaMessage;
  oKafka.OnKafkaProduce := OnKafkaProduce;

  oClient.Active := True; // connect to the broker
end;

Czytaj więcej: Klient Apache Kafka dla Delphi.

Natywny TLS na Android i Apple, bez wdrażania OpenSSL

Dwa nowe backendy TLS wykonują handshake przez system operacyjny zamiast OpenSSL, dzięki czemu Twoja aplikacja nie dostarcza żadnego libssl.so / libcrypto.so na Androidzie ani żadnego .dylib na iOS i macOS. Oba są wybierane dla danej platformy poprzez TLSOptions.IOHandler i wykorzystują to samo API TLSOptions, którego już używasz (własny CA, certyfikat klienta, ALPN).

Android (iohAndroidTLS) wykonuje TLS poprzez platformowy javax.net.ssl.SSLEngine za pomocą JNI, weryfikuje względem systemowego magazynu zaufania Androida wraz z weryfikacją nazwy hosta, negocjuje TLS 1.3 i obsługuje ALPN na Androidzie 10 i nowszych. Wymaga RAD Studio XE8+.

uses
  sgcWebSocket, sgcWebSocket_Types;

WSClient.TLS := True;
WSClient.TLSOptions.IOHandler := iohAndroidTLS;
WSClient.URL := 'wss://www.esegece.com:2053';
WSClient.Active := True;

Apple (iohAppleTLS) automatycznie wybiera Network.framework dla TLS 1.3 na macOS 10.14+ oraz iOS 12+, a na starszych systemach przechodzi na Secure Transport (TLS 1.2). Korzysta z systemowego magazynu zaufania z SNI i weryfikacją nazwy hosta oraz udostępnia zdarzenie OnAppleTLSVerifyPeer do własnej walidacji. Wymaga RAD Studio XE6+.

uses
  sgcWebSocket, sgcWebSocket_Types;

WSClient.TLS := True;
WSClient.TLSOptions.IOHandler := iohAppleTLS;
WSClient.URL := 'wss://www.esegece.com:2053';
WSClient.Active := True;

Czytaj więcej: Natywny TLS dla Androida oraz Natywny TLS dla Apple.

Wykrywanie botów w zaporze

TsgcWebSocketFirewall zyskuje moduł wykrywania botów oparty na adresach IP, który klasyfikuje klienta jako zweryfikowanego robota wyszukiwarki, zakres centrum danych lub adres z listy blokowanych, wykorzystując listy CIDR znanych botów, zakresy ASN centrów danych, potwierdzony do przodu odwrotny DNS (FCrDNS) oraz zapytania DNSBL. Działa wyłącznie w trybie klasyfikacji: wynik jest udostępniany przez nowe zdarzenie OnBotDetected oraz metodę GetBotClassification, więc to Ty decydujesz, co z nim zrobić, zamiast pozwalać zaporze blokować połączenia za Ciebie.

TsgcBotClassification = (bcUnknown, bcVerifiedCrawler, bcDatacenter,
  bcSuspectedBot, bcBlocklisted, bcHuman);

To wydanie przynosi również pełną obsługę IPv6 w zaporze: dopasowywanie CIDR czarnej i białej listy aż do /128, blokady krajów IPv6 z GeoLite2, zakresy botów IPv6 oraz odwrotny DNS / DNSBL w ip6.arpa. Naprawiono długotrwały błąd, w którym CIDR IPv6 był obliczany przy użyciu arytmetyki 32-bitowej (i przez to dopasowywał każdego klienta IPv6). Czytaj więcej: Wykrywanie botów w zaporze.

Transport stdio dla MCP

Serwer i klient Model Context Protocol mogą teraz działać przez standardowe wejście/wyjście dzięki nowemu hostowi TsgcAI_MCP_Server_Stdio, więc Twój serwer MCP w Delphi może być uruchamiany jako lokalny podproces przez agentów AI, takich jak Claude Code. Narzędzia są rejestrowane dokładnie tak samo jak na serwerze HTTP.

uses
  SysUtils, sgcAI_MCP_Server, sgcAI_MCP_Classes, sgcAI_MCP_Types;

var
  oServer: TsgcAI_MCP_Server_Stdio;
  oTool: TsgcAI_MCP_Tool;
begin
  oServer := TsgcAI_MCP_Server_Stdio.Create(nil);
  try
    oServer.ServerInfo.Name := 'MyDelphiServer';
    oServer.ServerInfo.Version := '1.0';

    oTool := oServer.MCPServer.Tools.AddTool('add', 'Adds two numbers');
    oTool.InputSchema.Properties.AddProperty('a', True, aimcpjtNumber);
    oTool.InputSchema.Properties.AddProperty('b', True, aimcpjtNumber);

    oServer.MCPServer.OnMCPRequestTool := OnRequestTool;

    // read JSON-RPC from stdin, write responses to stdout, blocks until EOF
    oServer.Run;
  finally
    oServer.Free;
  end;
end.

Czytaj więcej: Transport stdio dla MCP po stronie serwera i klienta.

Wzmocniony domyślnie

2026.6 zamyka partię problemów związanych z odmową usługi oraz zgodnością protokołów w serwerach i udostępnia nowe limity jako właściwości z bezpiecznymi wartościami domyślnymi.

Serwery WebSocket ograniczają teraz pamięć komunikatów za pomocą MaxMessageSize (domyślnie 64 MB, 0 = bez ograniczeń), odrzucając zbyt duże komunikaty, niekończącą się fragmentację oraz "bomby zip" permessage-deflate kodem zamknięcia 1009. Nowe SecurityOptions.EnforceWebSocketVersion oraz SecurityOptions.ValidateWebSocketKey weryfikują handshake RFC 6455, oba włączone domyślnie.

oServer := TsgcWebSocketServer.Create(nil);
oServer.Port := 80;
// accept messages up to 16 MB, reject anything larger with close 1009
oServer.MaxMessageSize := 16 * 1024 * 1024;
oServer.Active := True;

Serwer HTTP dodaje MaxRequestBodySize (domyślnie 64 MB) oraz StrictRequestParsing (domyślnie True, odrzucające żądanie, które niesie jednocześnie Content-Length i Transfer-Encoding). Naprawiono path traversal przy serwowaniu plików statycznych, złagodzono HTTP/2 Rapid Reset (CVE-2023-44487) za pomocą limitów RST_STREAM na połączenie oraz limitów ramek kontrolnych, a pliki DocumentRoot są teraz strumieniowane z dysku za pomocą współdzielonego TFileStream zamiast wczytywania ich w całości do pamięci, dzięki czemu zużycie RAM serwera pozostaje płaskie niezależnie od rozmiaru pliku czy liczby połączeń.

oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.Port := 80;
oServer.MaxRequestBodySize := 16 * 1024 * 1024;  // 16 MB, reject larger with 413
oServer.Active := True;

Czytaj więcej: Wzmacnianie serwera WebSocket oraz Wzmacnianie serwera HTTP.

Kryptografia postkwantowa i AEAD

Dla aplikacji budujących hybrydowe handshake'i postkwantowe, 2026.6 dodaje enkapsulację i dekapsulację ML-KEM-768 (sgcKEM_MLKEM768_Encapsulate / Decapsulate, OpenSSL 3.5+) obok klasycznego ECDH-jako-KEM nad P-256 (sgcKEM_ECDH_P256_Encapsulate / Decapsulate), który ma ten sam kształt API TBytes, więc możesz przełączać się między klasycznymi a postkwantowymi KEM-ami bez zmiany kodu.

Nowa jednostka sgcSSL_AEAD dostarcza generyczne prymitywy AEAD (sgcAEAD_Encrypt / sgcAEAD_Decrypt) dla AES-128-GCM, AES-256-GCM oraz ChaCha20-Poly1305, z 12-bajtowym nonce dostarczanym przez wywołującego oraz dowolnym AAD. Opakowania sgcAEAD_EncryptPrefixed / sgcAEAD_DecryptPrefixed tworzą i konsumują samowystarczalny blob "nonce(12) || ciphertext || tag(16)" używany przez Bouncy Castle GCM, JOSE A256GCM, libsodium oraz większość protokołów w stylu HPKE.

uses
  sgcSSL_AEAD;

var
  vKey, vPlain, vBlob, vOut: TBytes;
begin
  // vKey: 32 bytes from KEM Decapsulate + HKDF
  vBlob := sgcAEAD_EncryptPrefixed(aeadAES256GCM, vKey, vPlain, nil);
  vOut  := sgcAEAD_DecryptPrefixed(aeadAES256GCM, vKey, vBlob, nil);
end;

API pobierania dla konta

Nowe API REST w Twoim koncie eSeGeCe pozwala zalogować się, wylistować i pobrać pliki, do których uprawnia Cię subskrypcja, bezpośrednio ze skryptów lub CI. Jest opisane w OpenAPI 3.0 i dostarczane z gotowym do użycia klientem Delphi zbudowanym na sgcOpenAPI.

curl -X POST https://www.esegece.com/api/v1/login \
  -H "Content-Type: application/json" \
  -d '{"username":"YOUR_USERNAME","password":"YOUR_PASSWORD"}'

Czytaj więcej: Zautomatyzuj swoje pobierania dzięki API konta.

Również w tym wydaniu

Aktualizacja

2026.6 to aktualizacja typu drop-in dla istniejących projektów 2026.x. Wzmocnienia serwera są dostarczane z bezpiecznymi wartościami domyślnymi, więc jedyną rzeczą, na którą trzeba zwrócić uwagę, jest domyślne 64 MB dla MaxMessageSize / MaxRequestBodySize: jeśli Twoja aplikacja zgodnie z założeniami wymienia większe ładunki, podnieś limit (lub ustaw go na 0 dla braku ograniczeń), aby dopasować się do poprzedniego zachowania.

Klienci z aktywną subskrypcją mogą pobrać nową kompilację z obszaru klienta lub z esegece.com/products/websockets/download.

Pytania, opinie lub pomoc w migracji? Skontaktuj się z nami. Otrzymasz odpowiedź od ludzi, którzy napisali ten kod.