[34] 
[DFN[[RUBYB[プッシュサービス][push service]]]]は、
[[アプリケーションサーバー]]から[[利用者エージェント]]への[[プッシュメッセージ]]を媒介する[[サーバー]]です。

* 仕様書

[REFS[
- [1] [CITE@en[RFC 8030 - Generic Event Delivery Using HTTP Push]], [TIME[2020-03-09 00:13:33 +09:00]] <https://tools.ietf.org/html/rfc8030>
- [27] [CITE@en[RFC 8292 - Voluntary Application Server Identification (VAPID) for Web Push]], [TIME[2020-03-09 00:13:41 +09:00]] <https://tools.ietf.org/html/rfc8292#section-4.1>
- [32] [CITE@en-US[Push API]], [TIME[2020-02-04 16:21:34 +09:00]] <https://w3c.github.io/push-api/#dfn-push-subscription>
- [33] [CITE@en-US[Push API]], [TIME[2020-02-04 16:21:34 +09:00]] <https://w3c.github.io/push-api/#dfn-push-service>
]REFS]

* 意味

[2] 
[[Web Push]]
の[DFN[[RUBYB[プッシュサービス][push service]]]]は、
[[プッシュメッセージ]]を[[利用者エージェント]]に配送する[[サービス]]です。
[SRC[>>1 1.1.]]

[35] 
[[Push API]]
の[DFN[[RUBYB[プッシュサービス][push service]]]]は、
[[アプリケーションサーバー]]が
[[Webアプリケーション]]に[[プッシュメッセージ]]を送信できるようにするシステムです。
[[プッシュサービス]]は、
その供給する[[プッシュ購読]]に関する[[プッシュエンドポイント]](群)を供給するものです。
[SRC[>>33]]


* プロトコル

[4] 
[[プッシュサービス]]は、
[[RFC 2818]] [[HTTPS]] を使い、
[[RFC 7525]] の推奨に従わなければ[MUST[なりません]]。
[SRC[>>1 3., 8.]]

[6] 
[[プッシュサービス]]は、
[[HTTPS]] と同じ[[既定のポート番号]] [N[443]]
を使います。
[SRC[>>1 3.]]

[5] 
[[プッシュサービス]]は、
[[IANA]] に登録されている [[TCP]] システムポート [DFN[[N[1001]]]]
を
[[HTTP代替サービス]]として[[広告]]して[MAY[構いません]]。
[SRC[>>1 3.]]

[7] 
[N[443]] は到達性が高いですが、
[[middlebox]]
では一般的な [[Web]] 閲覧用に低い [[idle timeout]]
に設定されがちです。
[[Web Push]] の場合、これでは[[接続]]を維持するため無駄な通信が必要で、
電力消費につながり好ましくありません。
[[mjddlebox]]
は代替ポート [N[1001]]
を低頻度の通信に適した [[idle timeout]]
に設定できるというわけです。
[[middlebox]] は [[RFC 5382]] [[REQ-5]]
すなわち
[[established connection idle-timeout]] は2時間4分より小さくては[MUST[ならない]]、
に従う[SHOULD[べきです]]。
[SRC[>>1 3.]]

-*-*-

[25] 負荷対策のため [[HTTP代替サービス]]を使い、
同じ [[URL]] のまま他の[[サーバー]]にアクセスを求めることもできます。
その場合、
[[利用者エージェント]]は新たな[[接続]]を確立してから元の[[接続]]に
[CODE[GOAWAY]]
を送信し、[RUBYB[[[華麗]]][graceful]]に移行できます。
[SRC[>>1 7.1.]]

* 発見

[37] [[プッシュサービス]]の[[エンドポイント]] ([[資源]])
はいくつかありますが、[[プッシュサービス資源]]以外は、
直接、間接に[[プッシュサービス資源]]から得られるものです。
そこでまず[[プッシュサービス資源]]の [[URL]]
を知る必要があります。


[8] 
[[プッシュサービス資源]]の [[URL]]
は、[[利用者エージェント]]が保持しています [SRC[>>1 2.1.]]。
[[利用者エージェント]]は、
性能その他の要件に見合う[[プッシュサービス]]に選択を制限して[MAY[構いません]]
[SRC[>>33]]。

[38] 
一般的には、
[[Webブラウザー事業者]]が[[プッシュサービス]]を運営していて、
[[Webブラウザー]]には当該[[プッシュサービス]]を利用する設定が組み込まれています。
[[利用者]]や[[アプリケーション]]がこれを変更することはできません。

[40] 
[[プッシュサービス]]は、
[[VAPID]] を必須とするか否かを選択できます。
[[利用者エージェント]]は事前にこれを知っておく必要があります。
[SEE[ [[subscribe]] ]]


* エンドポイント

[10] 
[[プッシュサービス]]には次の[[資源]]が規定されています。

[FIG(middle list)[ [11] [[プッシュサービス]]
- [[プッシュサービス資源]]
- [[プッシュメッセージ購読資源]]
- [[プッシュメッセージ購読集合資源]]
- [[プッシュメッセージ資源]]
- [[受領証購読資源]]
]FIG]

* プッシュサービス資源

[3] [[プッシュサービス]]は、
[DFN[[RUBYB[プッシュサービス資源][push service resource]]]]を持ちます。
[RUBYB[プッシュサービス][push service]][[資源]]は、
[[プッシュメッセージ購読]]を作成するために使います
[SRC[>>1 2.1.]]。

[9] 
[[利用者エージェント]]は、
[[プッシュサービス資源]]に [CODE[POST]]
[[要求]]を送信して、
[[プッシュ購読]]を作成できます。
[SEE[ [[プッシュ購読の作成]] ]]


* API

[SEE[ [CODE[PushManager]] ]]


* メモ
