sgcWebSockets 2026.10

· Releases
sgcWebSockets 2026.10

sgcWebSockets 2026.10 is uit. Drie lijnen lopen erdoorheen: sgcHTML heeft de onderdelen gekregen die een zakelijke webapplicatie nodig heeft en die je niet meer met de hand hoeft te schrijven, de cryptografie is post-quantum geworden zonder ook maar één externe library toe te voegen, en een nieuwe reeks Enterprise-authenticatiecomponenten neemt het inlogscherm over.

Webapplicaties: het saaie werk, klaar

Sessies, login en CSRF. De nieuwe component TsgcHTMLAuth en de bijbehorende session stores houden de cookie bij, beantwoorden de login- en logoutaanvragen, sluiten inactieve sessies af en beperken mislukte inlogpogingen. Het CSRF-token reist mee in een meta tag, htmx voegt het vanzelf toe aan elk verzoek, en de server wijst een post af die het niet meestuurt.

FAuth := TsgcHTMLAuth.Create(Self);
FAuth.SessionStore := TsgcHTMLSessionStore_Memory.Create(Self);
FAuth.CookieName := 'app_session';
FEngine.Auth := FAuth;

Routes die lezen als routes. Padparameters, een methodefilter, en toegang tot de headers, de cookies en de body:

with FRouter.Routes.Add do
begin
  Path := '/customers/{id}/edit';
  Methods := [hrmGet, hrmPost];
  RequireLogin := True;
  RequireRoles := 'admin,sales';
end;

Pagina's die je kunt testen. DispatchDirect beantwoordt een verzoek zonder dat er een socket achter zit, en een nieuwe unit leest de gegenereerde HTML, vindt elementen op id, klasse, tag of attribuut en vergelijkt een pagina met een opgeslagen kopie, zodat een onbedoelde wijziging in de markup wordt opgemerkt door een test in plaats van door een klant.

Navigatie die aanvoelt als een applicatie. Pagina's veranderen zonder volledige herlaadbeurt en behouden de scrollpositie en wat de gebruiker aan het typen was, met een laadbalk, een dialoogvenster wanneer de verbinding wegvalt en een melding wanneer een verzoek mislukt. Dit alles standaard uitgeschakeld.

De vier hoofdfuncties

Elk van deze heeft een eigen artikel, aan het einde gelinkt, dus hier alleen wat het is:

Push, op twee manieren

Server sent events kunnen nu de updates dragen in plaats van een WebSocket, met herhaling van wat er gemist is terwijl de verbinding verbroken was, en het werkt met de gewone HTTP-server. Web Push bereikt een browser die gesloten is. Er komen een berichten-inbox en een voorkeurentabel bij, en het notificatiecomponent bepaalt welk kanaal een bepaalde gebruiker krijgt.

Een EventSource-client voor Delphi

De nieuwe TsgcSSEClient consumeert elke Server-Sent Events-stream en wordt in elke editie meegeleverd. Hij herverbindt zelfstandig en stuurt Last-Event-ID, zodat de server hervat waar de stream stopte. Het door de server verzonden retry:-veld wordt gerespecteerd, OnEvent geeft je het event-type, de data en het id, en ReconnectOptions voegt backoff en jitter toe. TLS, proxy en authenticatie worden ingesteld in OnBeforeConnect, dat je de door het component gebruikte HTTP-client geeft.

FSSE := TsgcSSEClient.Create(Self);
FSSE.URL := 'https://example.com/events';
FSSE.ReconnectOptions.Backoff := True;
FSSE.ReconnectOptions.MaxInterval := 30000;
FSSE.ReconnectOptions.Jitter := 0.2;
FSSE.OnEvent := DoSSEEvent;
FSSE.Open;

procedure TForm1.DoSSEEvent(Sender: TObject; const aEvent: TsgcSSEEvent);
begin
  Memo1.Lines.Add(aEvent.EventType + ': ' + aEvent.Data);
end;

De parser erachter, TsgcSSEParser, is publiek. Voer hem de bytes van elke text/event-stream in stukken van willekeurige grootte, precies wat een LLM-streamingresponse of een MCP Streamable HTTP-antwoord is.

FParser := TsgcSSEParser.Create;
FParser.OnEvent := DoSSEEvent;
FParser.Feed('event: delta' + #10 + 'data: {"text":"Hel"}' + #10#10);

Een nieuwe demo, Demos\20.HTTP_Protocol\17.SSE_Client_Component, laat het end-to-end zien.

AI: antwoorden waar je iets mee kunt

TsgcAIChat kan nu via de nieuwe methode ChatJSON vragen om JSON dat een door jou opgegeven schema volgt, bij OpenAI, Anthropic, Gemini, DeepSeek, Ollama, Grok en Mistral; de methode ontleedt het antwoord en vraagt nogmaals, met de parsefout erbij, wanneer het niet te lezen is. Het chatcomponent verstuurt en ontvangt nu ook afbeeldingen, en BaseUrl wordt nu door elke provider gerespecteerd en niet meer alleen door Ollama, zodat elk van hen naar een proxy of een lokale gateway kan worden gewezen.

Documentextractie: van PDF naar gevalideerde JSON

De nieuwe TsgcAIDocumentExtractor neemt een PDF of een afbeelding en een JSON-schema, en levert JSON terug die tegen dat schema is gecontroleerd. OpenAI, Anthropic en Gemini lezen de PDF rechtstreeks, de andere visionmodellen lezen afbeeldingen. De ingebouwde presets dekken facturen, bonnetjes en identiteitsdocumenten (dpInvoice, dpReceipt, dpIDCard), en elk veld krijgt een confidence mee, zodat OnLowConfidence je vertelt welke waarden onder MinConfidence een tweede blik verdienen. Wanneer het antwoord niet valideert, vraagt het component nogmaals, met de fouten erbij (ValidationRetries).

FExtractor := TsgcAIDocumentExtractor.Create(Self);
FExtractor.AIChat := AIChat1;
FExtractor.Preset := dpInvoice;
FExtractor.MinConfidence := 0.8;
FExtractor.OnLowConfidence := DoLowConfidence;

Memo1.Lines.Text := FExtractor.ExtractFile('invoice.pdf');
if FExtractor.LastResult.FieldConfidence('total') < 0.8 then
  ShowMessage('Check the total by hand');

Koppel een TsgcAIOCRTesseract, of een TsgcAIOCRWindows die de in Windows 10 en hoger ingebouwde OCR gebruikt zonder dat er iets geïnstalleerd hoeft te worden, en zet OCRMode op domFallback of domAlways, en de tekst wordt eerst lokaal herkend, zodat zelfs een tekst-only model dat op Ollama draait de extractie kan uitvoeren. Voor je eigen prompts krijgt TsgcAIChat er ChatWithDocument, ChatWithDocumentBase64, ChatWithAttachments en ChatJSONWithAttachments bij, die een of meerdere bestanden, gehouden in een TsgcAIChatAttachments-lijst, samen met het bericht versturen.

Een spraakagent die luistert, terugpraat en tools aanroept

De nieuwe TsgcAIVoiceAgent is één component dat luistert, detecteert wanneer de gebruiker zijn beurt heeft afgerond, met zijn eigen stem antwoordt en je tools aanroept, via OpenAI Realtime of Gemini Live. Het spreekt WebSocket, of WebRTC met OpenAI, en draait op Windows, Android en iOS. Beurten worden gedetecteerd via server-VAD, semantische VAD, een VAD aan de clientzijde of handmatig (vtdServerVAD, vtdSemanticVAD, vtdClientVAD, vtdManual). Met BargeIn kan de gebruiker onderbreken, waarna de agent stopt met praten en zijn antwoord afbreekt op het punt waar het werd onderbroken. OnTranscript levert live transcripties van zowel de gebruiker als de agent.

FAgent := TsgcAIVoiceAgent.Create(Self);
FAgent.Provider := vapOpenAI;
FAgent.OpenAIOptions.ApiKey := 'sk-...';
FAgent.Instructions := 'You are the shop assistant. Keep answers short.';
FAgent.TurnDetection.Mode := vtdSemanticVAD;
FAgent.BargeIn := True;

oTool := FAgent.Tools.Add;
oTool.Name := 'find_product';
oTool.Description := 'Looks up a product by name';
oTool.Parameters :=
  '{"type":"object","properties":{"name":{"type":"string"}}}';

FAgent.OnTranscript := DoTranscript;
FAgent.OnToolCall := DoToolCall;
FAgent.Start;

procedure TForm1.DoToolCall(Sender: TObject; const aCallId, aName,
  aArguments: string; var aResult: string; var aHandled: Boolean);
begin
  if aName = 'find_product' then
  begin
    aResult := FindProduct(aArguments);
    aHandled := True;
  end;
end;

Tools komen van OnToolCall, en wanneer een TsgcWSAPI_Client_MCP aan MCPClient wordt toegewezen, worden de tools van die MCP-server automatisch aan het model aangeboden. Voor telefonie schakelt Audio.Format over naar G.711 mu-law of A-law op 8 kHz (vafG711ULaw, vafG711ALaw). De spraakagent is beschikbaar van Delphi 7 tot Delphi 13 en voor .NET, en een nieuwe demo maakt er een spraakwinkelassistent van bovenop een TDataSet.

Cryptografie: post-quantum, in Object Pascal

ML-KEM (FIPS 203), ML-DSA (FIPS 204) en SLH-DSA (FIPS 205), hybride sleutelencapsulatie met X-Wing, post-quantum X.509-certificaten en certificaatautoriteiten, en JWT's ondertekend met ML-DSA. Dit alles geschreven in Object Pascal in het sgcCrypto-pakket, zonder externe library, gevalideerd tegen de bekende NIST-testvectoren.

Daarbovenop staat een native TLS 1.3- en TLS 1.2-engine, ook in puur Pascal: een client of een server spreekt TLS zonder OpenSSL en zonder SChannel, en onderhandelt daarbij over de hybride post-quantumgroepen van RFC 10024, met ALPN, S N I, clientcertificaten en optioneel gebruik van de vertrouwensopslag van het besturingssysteem. TLS 1.2 is er voor de peers die nog geen TLS 1.3 kunnen, met standaard forward-secret AES-GCM- en ChaCha20-Poly1305-suites, extended master secret en downgradebescherming, en TLSOptions.Version stelt de laagst toegestane versie in. De hybride groepen blijven voorbehouden aan TLS 1.3.

De klassieke kant is in dezelfde slag verstevigd: geblindeerde RSA in constante tijd, scalaire vermenigvuldiging op elliptische krommen in constante tijd en Ed25519, tabelvrije AES en GHASH, geïmporteerde privésleutels die tegen hun publieke helft worden gecontroleerd, en niet-minimale DER-handtekeningen die worden geweigerd.

Authenticatie: de login waar iedereen om vraagt

Een nieuwe reeks authenticatiecomponenten beantwoordt de vragen die elke klant over het inlogscherm stelt. Ze zitten in de edities Enterprise en All-Access en in de sgcAuth-pack, en dezelfde componenten horen bij sgcWebSockets .NET.

Reparaties die het noemen waard zijn

.NET

De .NET-library houdt gelijke tred: auth en sessies met een ClaimsPrincipal-brug voor ASP.NET Core, de router, de testhulpmiddelen, SPA-navigatie, het SSE-transport met een native endpoint, gestructureerde output, documentextractie met beide OCR-engines, de realtime spraakagent, het AI Data Pack, Web Push, MCP Apps, het CRUD-component met zijn adapters en de nieuwe TsgcSSEClient, allemaal met dezelfde API-namen als in Delphi.

Razor Tag Helpers voor ASP.NET Core. sgcHTML past nu in een MVC- of Razor Pages-applicatie zoals Telerik UI en DevExpress dat doen. Tag Helpers zoals <sgc-grid>, <sgc-form>, <sgc-autocomplete>, <sgc-dialog> en <sgc-chart>, en hun fluent tegenhangers onder Html.Sgc(), renderen Bootstrap 5 aan de serverkant en praten via htmx met je controllers, zonder JavaScript-framework. Het grid pagineert, sorteert, filtert, doorzoekt en exporteert naar XLSX en PDF over een IQueryable, zodat EF Core alles als SQL uitvoert:

<sgc-grid name="orders" key="Id" items="Model"
          asp-action="Read" asp-export-action="Export" export="xlsx,pdf"
          page-size="15" sortable="true" filterable="true"
          searchable="true" push-url="true">
    <sgc-column field="Reference" searchable="true" />
    <sgc-column field="Customer" searchable="true" />
    <sgc-column field="OrderDate" title="Date" format="{0:yyyy-MM-dd}" filter="range" />
    <sgc-column field="Total" format="{0:N2}" align="right" filter="range" />
</sgc-grid>

// OrdersController
public IActionResult Read(SgcDataRequest request) => this.SgcGrid(request, Rows());

Invoer bindt met asp-for en toont de ModelState-fouten, en this.SgcCloseDialog("edit-order", refresh: "orders") sluit een bewerkdialoog en laadt het grid opnieuw. Wat de anderen niet hebben is server push: een grafiek met live="true" tekent opnieuw in elke geopende browser wanneer een achtergrondservice hub.BroadcastChartAsync(...) aanroept, via de sgcHTML WebSocket en zonder SignalR-code. Het wordt geleverd in het NuGet-pakket esegece.sgcHTML.AspNetCore, inclusief de Community-editie, en de demo 22.RazorMvc is het bekende ordervoorbeeld daarmee opnieuw opgebouwd.

Upgraden

Alles wat nieuw is, is additief en standaard uitgeschakeld. Zet de nieuwe units erbij, herbouw je packages, en een bestaande applicatie gedraagt zich precies zoals daarvoor.

De volledige versies

Bekijk het

Er is een korte video hierover op het eSeGeCe-kanaal.

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