Atteindre un navigateur fermé, depuis Delphi

· Composants
Atteindre un navigateur fermé, depuis Delphi

Il y a trois types d'utilisateurs qui attendent que votre application leur dise quelque chose : celui qui regarde la page, celui dont le proxy d'entreprise ne laisse pas passer un WebSocket, et celui qui a fermé le navigateur il y a deux heures. sgcWebSockets 2026.10 couvre les trois.

Le proxy qui ne laisse pas passer un WebSocket

Les Server-Sent Events sont du HTTP classique : un GET qui reste ouvert et un flux de texte. Rien sur le chemin ne peut s'y opposer. Le moteur sgcHTML peut désormais transporter ses mises à jour de cette façon plutôt que via un WebSocket, et on peut laisser la page décider elle-même :

FEngine.SSE.Enabled := True;
FEngine.SSE.Endpoint := '/events';
FEngine.SSE.PostEndpoint := '/events/send';
FEngine.SSE.ReplaySize := 100;

FTemplate.Transport := htAuto;   { htWebSocket, htSSE or htAuto }

Avec htAuto, la page ouvre un WebSocket et bascule d'elle-même vers le flux d'événements quand elle ne le peut pas. Le tampon de relecture fait qu'un lecteur déconnecté un instant reçoit les mises à jour manquées pendant son absence, au lieu d'un trou.

Le point qui mérite d'être souligné : cela fonctionne avec le serveur HTTP classique. Pousser des mises à jour vers une page ne nécessite plus du tout le serveur WebSocket.

L'utilisateur qui a fermé le navigateur

Web Push atteint un navigateur qui n'est pas sur votre page, et même un qui n'est pas en cours d'exécution. La page s'abonne, votre application stocke l'abonnement où qu'elle garde ses données, et un seul appel envoie la notification :

uses
  sgcHTML_WebPush;

FWebPush := TsgcHTMLWebPush.Create(Self);
FWebPush.Enabled := True;
FWebPush.VAPIDPublicKey := ReadSetting('vapid.public');
FWebPush.VAPIDPrivateKey := ReadSetting('vapid.private');
FWebPush.Subject := 'mailto:info@example.com';
FWebPush.OnSaveSubscription := DoSaveSubscription;
FWebPush.OnLoadSubscriptions := DoLoadSubscriptions;
FWebPush.OnDeleteSubscription := DoDeleteSubscription;

FEngine.WebPush := FWebPush;

FWebPush.Send('user-42', 'Order 1042 shipped',
  'It left the warehouse this morning.', '/orders/1042');

La bibliothèque possède le protocole : la charge utile chiffrée, la signature VAPID, le TTL et l'en-tête d'urgence. Votre application possède le stockage, via trois événements, parce que l'endroit où vivent les abonnements est une décision que vous seul pouvez prendre. Un abonnement que le service de push a retiré revient via OnSubscriptionExpired pour que vous puissiez le supprimer.

Le composant qui choisit entre les deux

Avoir deux canaux n'est utile que si quelque chose choisit entre eux. Le composant de notification le fait désormais : un utilisateur qui regarde la page reçoit la notification dans la page, et un qui ne la regarde pas reçoit un web push, quand l'application dit que c'est autorisé. Une notification, un appel, et l'utilisateur n'est pas prévenu deux fois.

Et les deux composants qui l'entourent

Une boîte de réception de notifications. Une cloche avec un badge de non-lus et les notifications d'un utilisateur, avec lecture et effacement, de sorte qu'une notification manquée ne soit pas une notification perdue.

Une table de préférences de notification. Où une personne coche comment chaque type de notification l'atteint. C'est la partie que tout le monde repousse, et celle qui vous évite des ennuis avec des personnes qui n'ont pas demandé à recevoir des push.

Les deux fonctionnent sur toutes les éditions, via WebSocket ou via Server-Sent Events.

Éditions

Les Server-Sent Events, la boîte de réception et la table de préférences font partie de sgcHTML. Web Push lui-même, la partie qui atteint un navigateur fermé, nécessite SGC_WEBPUSH, qui correspond aux éditions Enterprise et All-Access.

Mise à niveau

Tout ceci est désactivé par défaut. Une page existante conserve son transport WebSocket et affiche le même balisage jusqu'à ce que vous définissiez Transport, assigniez un WebPush ou déposiez l'un des deux nouveaux composants sur une fiche.

À lire aussi

Voir la vidéo

Il existe une courte vidéo à ce sujet sur la chaîne eSeGeCe.

Des questions, un retour ou besoin d'aide pour la migration ? Contactez-nous — vous recevrez une réponse des personnes qui ont écrit le code.