sgcWebSockets 2026.6: gRPC、OpenAPIサーバー、Kafka、ネイティブTLS

· リリース

sgcWebSockets 2026.6 は、このライブラリの歴史の中でも最大級のリリースの一つです。3 つの新しいクライアント(ネイティブ gRPC クライアント、Apache Kafka クライアント、スタンドアロンの OpenAPI 3 サーバー)、モバイルおよびデスクトップアプリを OpenSSL なしで出荷できる 2 つのネイティブな OS の TLS バックエンド、ファイアウォール内の分類専用の ボット検出エンジン、AI エージェント向けの MCP stdio トランスポート、一連のポスト量子暗号プリミティブ、そして WebSocket / HTTP サーバー全体にわたる広範なセキュリティ強化が含まれています。

この記事は、各機能の短い Delphi のスニペットと、その機能が詳しく解説されている専用記事へのリンクを添えた、ハイライトのガイドツアーです。

HTTP/2 上の gRPC クライアント

新しい TsgcGRPCClient は、既存の TsgcHTTP2Client 上に構築されたネイティブ gRPC クライアントで、外部の gRPC ランタイムをデプロイする必要はありません。4 つの RPC パターン(ユナリ、サーバーストリーミング、クライアントストリーミング、双方向ストリーミング)、圧縮と content-type のためのチャネルオプション、デフォルトおよび呼び出しごとのメタデータ、デッドライン、指数バックオフによる自動リトライ、クライアントサイドのロードバランシング(Pick First と Round Robin)、gRPC Health Checking、Server Reflection、インターセプター、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;

この汎用クライアントに加えて、2026.6 では 8 つの Google Cloud サービス向けの型付き gRPC インターフェースを同梱しています。それぞれに protobuf のリクエスト / レスポンスクラスとサービスアカウント JWT 認証が付属します。Pub/Sub、Speech-to-Text、Translation、Vision、Natural Language、Cloud Storage、BigQuery Storage、Vertex AI です。詳しい解説はこちら: gRPC Client for Delphi

スタンドアロンの OpenAPI 3 サーバー

TsgcWSAPIServer_OpenAPI は、OpenAPI 3 仕様を実行中の REST サーバーに変えます。仕様を読み込み(または RTTI 属性を介して Delphi クラスから生成し)、それを TsgcWebSocketHTTPServer にアタッチすれば、ルーティング、リクエスト検証、Swagger UI、CORS がそのまま利用できます。検証に失敗すると、RFC 7807 の problem+json が自動的に返されます。

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;

詳しくはこちら: OpenAPI Server for Delphi

Apache Kafka クライアント

TsgcWSPClient_Kafka は、Java や librdkafka に依存せず、生の TCP 上でバイナリの Kafka ワイヤープロトコルを話すネイティブな Apache Kafka クライアントです。メッセージのプロデュースとコンシューム、サブスクライブとポーリング、コンシューマーグループ、トピック、オフセットの管理が行えます。

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;

詳しくはこちら: Apache Kafka Client for Delphi

Android と Apple のネイティブ TLS、OpenSSL のデプロイ不要

2 つの新しい TLS バックエンドは、OpenSSL の代わりに OS を通じてハンドシェイクを実行します。そのため、アプリは Android で libssl.so / libcrypto.so を、iOS と macOS で .dylib を出荷する必要がありません。どちらも TLSOptions.IOHandler を通じてプラットフォームごとに選択でき、すでに使い慣れた同じ TLSOptions API(カスタム CA、クライアント証明書、ALPN)を再利用します。

AndroidiohAndroidTLS)は、JNI 経由でプラットフォームの javax.net.ssl.SSLEngine を通じて TLS を実行し、ホスト名検証付きで Android のシステムトラストストアに対して検証を行い、TLS 1.3 をネゴシエートし、Android 10 以降で ALPN をサポートします。RAD Studio XE8+ が必要です。

uses
  sgcWebSocket, sgcWebSocket_Types;

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

AppleiohAppleTLS)は、macOS 10.14+ および iOS 12+ では TLS 1.3 のために Network.framework を自動選択し、古いシステムでは Secure Transport(TLS 1.2)にフォールバックします。SNI とホスト名検証付きでシステムトラストストアを使用し、カスタム検証のための OnAppleTLSVerifyPeer イベントを公開します。RAD Studio XE6+ が必要です。

uses
  sgcWebSocket, sgcWebSocket_Types;

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

詳しくはこちら: Native Android TLS および Native Apple TLS

ファイアウォールのボット検出

TsgcWebSocketFirewall に、IP ベースのボット検出モジュールが追加されました。既知ボットの CIDR リスト、データセンターの ASN レンジ、フォワード確認逆引き DNS(FCrDNS)、DNSBL ルックアップを用いて、クライアントを検証済みの検索エンジンクローラー、データセンターレンジ、ブロックリスト掲載アドレスのいずれかとして分類します。これは分類専用です。結果は新しい OnBotDetected イベントと GetBotClassification メソッドを通じて公開されるため、ファイアウォールが代わりに接続をブロックするのではなく、その結果をどう扱うかはあなたが決定します。

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

このリリースでは、ファイアウォールに完全な IPv6 ももたらされます。/128 までのブラックリストおよびホワイトリストの CIDR マッチング、GeoLite2 の IPv6 国別ブロック、IPv6 ボットレンジ、ip6.arpa 逆引き DNS / DNSBL です。IPv6 CIDR が 32 ビットの演算で評価され(そのためすべての IPv6 クライアントにマッチしてしまう)長年存在していたバグも修正されました。詳しくはこちら: Bot Detection in the Firewall

MCP stdio トランスポート

Model Context Protocol のサーバーとクライアントは、新しい TsgcAI_MCP_Server_Stdio ホストを通じて標準入出力上で実行できるようになりました。これにより、お使いの Delphi MCP サーバーを、Claude Code のような AI エージェントがローカルのサブプロセスとして起動できます。ツールは 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.

詳しくはこちら: MCP stdio Transport for Server and Client

デフォルトで強化

2026.6 では、サーバー内の一連のサービス拒否(DoS)およびプロトコル適合性の問題を解消し、新しい制限を安全なデフォルト値を持つプロパティとして公開します。

WebSocket サーバーは、MaxMessageSize(デフォルト 64 MB、0 = 無制限)でメッセージのメモリを制限するようになり、サイズ超過のメッセージ、際限のないフラグメンテーション、permessage-deflate の「zip 爆弾」をクローズ 1009 で拒否します。新しい SecurityOptions.EnforceWebSocketVersionSecurityOptions.ValidateWebSocketKey は RFC 6455 のハンドシェイクを検証し、どちらもデフォルトで有効です。

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;

HTTP サーバーには、MaxRequestBodySize(デフォルト 64 MB)と StrictRequestParsing(デフォルト True、Content-Length と Transfer-Encoding の両方を持つリクエストを拒否)が追加されました。静的ファイル配信におけるパストラバーサルが修正され、HTTP/2 Rapid Reset(CVE-2023-44487)は接続ごとの RST_STREAM および制御フレーム制限で緩和され、DocumentRoot のファイルはメモリに完全に読み込まれる代わりに共有の TFileStream を使ってディスクからストリーミングされるようになりました。そのため、ファイルサイズや接続数にかかわらず、サーバーの RAM 使用量は一定に保たれます。

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

詳しくはこちら: Hardening the WebSocket Server および Hardening the HTTP Server

ポスト量子および AEAD 暗号

ハイブリッドなポスト量子ハンドシェイクを構築するアプリケーションのために、2026.6 では ML-KEM-768 のカプセル化とデカプセル化(sgcKEM_MLKEM768_Encapsulate / Decapsulate、OpenSSL 3.5+)に加えて、同じ TBytes API の形状を共有する P-256 上の古典的な ECDH-as-KEM(sgcKEM_ECDH_P256_Encapsulate / Decapsulate)を追加しました。これにより、コードを変更することなく古典的 KEM とポスト量子 KEM を切り替えられます。

新しい sgcSSL_AEAD ユニットは、AES-128-GCM、AES-256-GCM、ChaCha20-Poly1305 向けの汎用 AEAD プリミティブ(sgcAEAD_Encrypt / sgcAEAD_Decrypt)を、呼び出し側が指定する 12 バイトのナンスと任意の AAD とともに提供します。sgcAEAD_EncryptPrefixed / sgcAEAD_DecryptPrefixed ラッパーは、Bouncy Castle GCM、JOSE A256GCM、libsodium、および大半の HPKE 形式のプロトコルで使われる自己完結型の「nonce(12) || ciphertext || tag(16)」ブロブを生成・消費します。

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

eSeGeCe アカウントに新しい REST API が追加され、ログインして、サブスクリプションで利用権のあるファイルを一覧表示・ダウンロードできるようになりました。スクリプトや CI から直接実行できます。OpenAPI 3.0 で記述されており、sgcOpenAPI 上に構築されたすぐに使える Delphi クライアントを同梱しています。

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

詳しくはこちら: Automate Your Downloads with the Account API

このリリースのその他

アップグレード

2026.6 は、既存の 2026.x プロジェクトに対するドロップインアップグレードです。サーバー強化は安全なデフォルト値で出荷されるため、注意すべき唯一の点は 64 MB のデフォルトの MaxMessageSize / MaxRequestBodySize です。アプリケーションが正当により大きなペイロードをやり取りする場合は、以前の動作に合わせて制限を引き上げて(または無制限にするために 0 に設定して)ください。

有効なサブスクリプションをお持ちのお客様は、新しいビルドをカスタマーエリアから、または esegece.com/products/websockets/download からダウンロードできます。

ご質問、フィードバック、移行のサポートが必要ですか?お問い合わせください。コードを書いた本人から返信が届きます。