閉じたブラウザにDelphiから届く

· コンポーネント
閉じたブラウザにDelphiから届く

アプリケーションから何かを知らされるのを待っているユーザーには三種類います。ページを見ているユーザー、会社のプロキシがWebSocketを通さないユーザー、そして二時間前にブラウザを閉じてしまったユーザーです。sgcWebSockets 2026.10はこの三つすべてに対応します。

WebSocketを通さないプロキシ

Server-Sent Eventsは普通のHTTPです。開いたままのGETリクエストと、テキストのストリームです。経路上の何もこれに異議を唱えられません。sgcHTMLエンジンは今や、WebSocketの代わりにこの方法で更新を運ぶことができ、どちらを使うかをページ自身に決めさせることもできます。

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

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

htAutoを使うと、ページはWebSocketを開き、それができないときは自分でイベントストリームにフォールバックします。リプレイバッファのおかげで、一瞬切断されていた読者は、離れていた間に見逃した更新を、穴を空けることなく受け取れます。

強調しておく価値がある点は、これが通常のHTTPサーバーでも動くということです。ページへの更新のプッシュに、WebSocketサーバーはもはやまったく必要ありません。

ブラウザを閉じたユーザー

Web Pushは、あなたのページを開いていないブラウザにも、実行すらされていないブラウザにも届きます。ページが購読し、あなたのアプリケーションはその購読情報を自分のデータの保管先に保存し、一回の呼び出しで通知を送信します。

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');

ライブラリはプロトコルを担当します。暗号化されたペイロード、VAPID署名、TTL、そして緊急度ヘッダーです。あなたのアプリケーションは三つのイベントを通じて保存を担当します。購読情報をどこに置くかは、あなたにしか決められないことだからです。プッシュサービスが失効させた購読は、OnSubscriptionExpiredを通じて戻ってくるので、それを破棄できます。

両者のどちらかを決めるコンポーネント

二つのチャネルを持っていても、何かがそれらの間で選ばなければ意味がありません。通知コンポーネントは今それを行います。ページを見ているユーザーはページの中で通知を受け取り、見ていないユーザーは、アプリケーションがそれを許可すると言えばweb pushを受け取ります。通知は一つ、呼び出しも一つで、ユーザーが二度知らされることはありません。

そしてそれを取り囲む二つのコンポーネント

通知受信箱。未読バッジ付きのベルと、一人のユーザーの通知一覧、既読と消去の機能があり、見逃した通知が失われた通知にならずに済みます。

通知設定テーブル。各種類の通知がどのように届くかを、人がチェックする場所です。誰もが後回しにしがちな部分であり、プッシュされることを望んでいなかった人たちとのトラブルからあなたを守ってくれる部分でもあります。

どちらもすべてのエディションで、WebSocket経由でもServer-Sent Events経由でも動作します。

エディション

Server-Sent Events、受信箱、設定テーブルはsgcHTMLの一部です。Web Push自体、つまり閉じたブラウザに届く部分にはSGC_WEBPUSHが必要で、これはEnterpriseとAll-Accessのエディションです。

アップグレード

ここにある機能はすべてデフォルトで無効になっています。既存のページは、Transportを設定するか、WebPushを割り当てるか、二つの新しいコンポーネントのどちらかをフォームにドロップするまで、既存のWebSocketトランスポートを維持し、同じマークアップをレンダリングし続けます。

次に読む

動画で見る

この内容についての短い動画eSeGeCeチャンネルにあります。

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