Hay tres tipos de usuario esperando a que tu aplicación les diga algo: el que está mirando la página, aquel cuyo proxy corporativo no deja pasar un WebSocket, y el que cerró el navegador hace dos horas. sgcWebSockets 2026.10 cubre los tres.
El proxy que no deja pasar un WebSocket
Los Server-Sent Events son HTTP normal: un GET que permanece abierto y un flujo de texto. Nada en el camino puede objetar. El motor de sgcHTML ahora puede transportar sus actualizaciones así en lugar de por un WebSocket, y se le puede indicar a la página que decida por sí misma:
FEngine.SSE.Enabled := True;
FEngine.SSE.Endpoint := '/events';
FEngine.SSE.PostEndpoint := '/events/send';
FEngine.SSE.ReplaySize := 100;
FTemplate.Transport := htAuto; { htWebSocket, htSSE or htAuto }
Con htAuto la página abre un WebSocket y recurre por su cuenta al flujo de eventos cuando no puede. El búfer de repetición hace que un lector que estuvo desconectado un momento reciba las actualizaciones que se perdió mientras estaba fuera, en lugar de un hueco.
La parte que merece subrayarse: esto funciona con el servidor HTTP normal. Enviar actualizaciones a una página ya no requiere en absoluto el servidor WebSocket.
El usuario que cerró el navegador
Web Push llega a un navegador que no está en tu página, e incluso a uno que no se está ejecutando. La página se suscribe, tu aplicación guarda la suscripción donde quiera que guarde sus datos, y una sola llamada envía la notificación:
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 biblioteca es dueña del protocolo: la carga cifrada, la firma VAPID, el TTL y la cabecera de urgencia. Tu aplicación es dueña del almacenamiento, a través de tres eventos, porque dónde viven las suscripciones es una decisión que solo tú puedes tomar. Una suscripción que el servicio de push ha retirado vuelve a través de OnSubscriptionExpired para que puedas eliminarla.
El componente que decide entre ambos
Tener dos canales solo sirve si algo elige entre ellos. El componente de notificaciones ahora lo hace: un usuario que está mirando la página recibe la notificación en la página, y uno que no lo está recibe un web push, cuando la aplicación dice que está permitido. Una notificación, una llamada, y al usuario no se le avisa dos veces.
Y los dos componentes que lo rodean
Una bandeja de notificaciones. Una campana con una insignia de no leídas y las notificaciones de un usuario, con marcar como leída y vaciar, de modo que una notificación perdida no sea una notificación desaparecida.
Una tabla de preferencias de notificaciones. Donde una persona marca cómo le llega cada tipo de notificación. Es la parte que todo el mundo posterga, y la que te libra de problemas con quienes no pidieron que se les enviara nada.
Ambos funcionan en todas las ediciones, por WebSocket o por Server-Sent Events.
Ediciones
Los Server-Sent Events, la bandeja y la tabla de preferencias son parte de sgcHTML. El propio Web Push, la parte que llega a un navegador cerrado, necesita SGC_WEBPUSH, que son las ediciones Enterprise y All-Access.
Actualización
Todo esto está desactivado por defecto. Una página existente conserva su transporte WebSocket y renderiza el mismo marcado hasta que fijas Transport, asignas un WebPush o colocas uno de los dos componentes nuevos en un formulario.
Sigue leyendo
- Ejecuta tu aplicación Delphi dentro de ChatGPT y Claude
- Convierte una captura de pantalla en una página web Delphi
- sgcWebSockets 2026.10, todo lo demás de esta versión
Míralo en vídeo
Hay un vídeo breve de esto en el canal de eSeGeCe.
¿Preguntas, comentarios o ayuda con la migración? Ponte en contacto — recibirás respuesta de las mismas personas que escribieron el código.
