fire a "pushsubscription" event

プッシュメッセージ購読

仕様書

意味

[3] プッシュメッセージ購読 (push message subscription) は、 利用者エージェントとプッシュサービスの間で確立されたメッセージ配送文脈 (message delivery context) であって、 アプリケーションサーバーと共有されるものです。 プッシュメッセージはすべてあるプッシュメッセージ購読と関連付けられています。 >>2 1.1. プッシュサービス資源により作成されます。

[74] プッシュ購読 (push subscription) は、 利用者エージェントとプッシュサービスの間に、 Webアプリケーションにかわって確立されたメッセージ配送文脈です。 >>73

[4] プッシュメッセージ購読集合の要素です。

[5] RFC 8030 が message subscription、 subscription とだけ言っているものも、 プッシュメッセージ購読を意味すると思われます。

[14] プッシュ購読 (アプリケーションサーバー)
プッシュエンドポイント
絶対URL。 作成時に利用者エージェントから得たもの。
購読満期時刻
ミリ秒Unix timeまたは null。 作成時に利用者エージェントから得たもの。
aes128gcm 用鍵ペア
公開鍵のみ。 利用者エージェントから得たもの。 公開鍵と秘密鍵。
authentication secret
利用者エージェントから得たもの。
特定アプリケーションサーバーに制限されている
プッシュ購読作成時に VAPID 用のアプリケーションサーバーの公開鍵が指定されたかどうか。
VAPID 用鍵ペア
公開鍵、秘密鍵。 作成時までに生成したもの。
[15] プッシュ購読 (プッシュサービス)
プッシュエンドポイント
絶対URL。作成時に生成したもの。
購読満期時刻
ミリ秒Unix timeまたは null。 作成時に決定したもの。
特定アプリケーションサーバーに制限されている
プッシュ購読作成時に VAPID 用のアプリケーションサーバーの公開鍵が指定されたかどうか。
VAPID 用鍵ペア
公開鍵のみ。 作成時に利用者エージェントから提供されたもの。
プッシュメッセージ購読資源
絶対URL。作成時に生成したもの。
プッシュメッセージ購読集合
所属するプッシュメッセージ購読集合または null。 作成時に決定したもの。
[75] プッシュ購読 (利用者エージェント)
サービスワーカー登録
プッシュ購読は、 サービスワーカー登録に関連付けられます。 サービスワーカー登録は、高々1つプッシュ購読を持ちます。 >>73 破棄されて存在しなくなることがあります。
プッシュエンドポイント
絶対URL。
購読満期時刻
ミリ秒Unix timeまたは null。
aes128gcm 用鍵ペア
作成時に設定された鍵ペア。 >>73 公開鍵と秘密鍵。
authentication secret
作成時に設定された authentication secret。 >>73
options
作成時に作成された PushSubscriptionOptions。 userVisibleOnly を持つ。
非活性化済み
push拒絶履歴
プッシュメッセージの受信
VAPID 用鍵ペア
公開鍵のみ (= options の applicationServerKey)。 作成時にアプリケーションから提供されたもの。
プッシュメッセージ購読資源
絶対URL。作成時にプッシュサービスから通知されたもの。
プッシュメッセージ購読集合
所属するプッシュメッセージ購読集合または null。 作成時にプッシュサービスから通知されたもの。

[125] PushSubscription インターフェイスは、 プッシュ購読を表します。 文書環境とワーカー環境に晒されます。 SecureContext のみ利用可能です。 >>123

[126] PushSubscription インターフェイス

[134] PushSubscription インターフェイスの getKey メソッド >>123 は、 次のようにしなければなりません。

  1. [135] 名前を、 第1引数を PushEncryptionKeyName と解釈した結果に設定します。 >>123
  2. [157] 鍵を、 文脈オブジェクト、名前について鍵を取得した結果に設定します。
  3. [158] 鍵の ArrayBuffer を返します。

[159] PushEncryptionKeyName は、 p256dh か auth です。 >>123

[156] 鍵の取得は、 プッシュ購読、名前について、 次のようにします。 >>123

  1. [136] 名前が p256dh の場合、
    1. [141] 鍵を、 文脈オブジェクトの鍵ペアの公開鍵を X9.62 uncompressed format で符号化したものに設定します。
  2. [137] 名前が auth の場合、
    1. [142] 鍵を、 文脈オブジェクトの authentication secret に設定します。
  3. [143] 鍵を返します。
[138] 仕様書では将来的な名前の拡張が想定されており、また aes128gcm を使わない場合も一応想定されているので、 仕様書の記述はここで示したものより抽象的な形になっています。 すなわち、非対称鍵ペアなら公開鍵を直列化したもの、 対称鍵ならそれを直列化したもので、 該当なければ null です >>123。 秘密鍵にアクセスする方法はありません。

[131] PushSubscription インターフェイスの options 属性の取得器は、 次のようにしなければなりません >>123。

  1. [132] 文脈オブジェクトの options を返します。

[133] プッシュ購読の作成時に設定されます。

[114] PushSubscriptionOptions インターフェイスは、 文書環境とワーカー環境に晒されています。 SecureContext のみ利用可能です。 >>113 対応する辞書 PushSubscriptionOptionsInit >>118 があります。 PushSubscriptionOptionsInit はプッシュ購読の追加のオプションを表します >>118。 利用者エージェントは、 利用者に express permission を求める時にこれを考慮できます >>118, >>105。 考慮するオプションについては、 プッシュメッセージ受信時にこれを適用するべきです >>118。 プッシュ購読作成後にオプションを変更する方法はなく、 unsubscribe して subscribe しなおすほかありません >>118。

[115] PushSubscriptionOptions / PushSubscriptionOptionsInit

[122] 利用者エージェントのオプションへの対応は任意選択です。 対応しないオプションは晒してはなりません >>118。

[124] が相互運用性のため主要な Webブラウザーの実装を真似るしかありません。

[116] PushSubscriptionOptions インターフェイスの userVisibleOnly 属性の取得器 >>113 は、 次のようにしなければなりません。

  1. [117] 文脈オブジェクトの userVisibleOnly を返します >>113。 boolean です >>113。

[119] PushSubscriptionOptionsInit 辞書の userVisibleOnly は、 boolean で、既定値は偽です。 >>118

[120] userVisible が真のとき、 当該プッシュ購読は、 利用者に表示されるプッシュメッセージのみに使われることを表します。 利用者に表示とは、例えば Web Notification のようなものをいいます。 >>118 偽のとき、そうとは限らないことを表します。 プッシュメッセージを表示といっても、 その内容がそのまま Webブラウザーにより自動的に表示されるのではなく、 アプリケーションが適宜処理する必要はあります。


[152] PushSubscription インターフェイスの toJSON メソッドは、 次のようにしなければなりません。 >>123

  1. [153] json を、 新しい PushSubscriptionJSON 辞書に設定します。
    [154] PushSubscriptionJSON
    endpoint
    文脈オブジェクトのプッシュエンドポイント。
    expirationTime
    文脈オブジェクトの購読満期時刻。 DOMTimeStamp または null。
    keys
    新しい record
    record
    auth
    文脈オブジェクト、 auth について鍵を取得した結果を、 RFC 4648 詰めなし base64url 符号化したもの
    p256dh
    文脈オブジェクト、 p256dh について鍵を取得した結果を、 RFC 4648 詰めなし base64url 符号化したもの
    値があるもののみ、名前順に整列
  2. [155] json を返します。

[32] プッシュメッセージ購読集合 (push message subscription set) は、 利用者エージェントとプッシュサービスの間で確立されるメッセージ配送文脈 (message delivery context) であって、 複数のプッシュメッセージ購読を集めて集合としたものです。 >>2 1.1.

[33] RFC は「subscription set」と省略して表記することもあるようです。

[34] プッシュメッセージ購読を集めて集合化することで、 プッシュサービスと利用者エージェントにとって効率化できます。 >>2 4.1.

[35] プッシュサービス資源を使ったプッシュメッセージ購読作成時に、 利用者エージェントは要求でプッシュメッセージ購読集合を指定し、 そこに作成したプッシュメッセージ購読を所属させることができます。

[36] プッシュサービス資源を使ったプッシュメッセージ購読作成時に、 プッシュサービスは応答でプッシュメッセージ購読集合を示すことができます。

プロトコル

[8] まず、利用者エージェントは、 新しいプッシュメッセージ購読を作成します。 >>2 2. 作成にはプッシュサービス資源を使います。

[13] 作成したプッシュメッセージ購読は、 アプリケーション依存の方法で、 アプリケーションサーバーへ配布します。 >>2 2., 4. 特にプッシュ資源の URL の配布は、 秘密の保護や、アプリケーションサーバーの認証を講じて漏らさないようにしなければなりません。 >>2 4.

[9] アプリケーションサーバーは、 プッシュメッセージ購読に対し、 プッシュ資源を使って、 利用者エージェントに配送するプッシュメッセージを、 プッシュサービスへと送信します。 >>2 2., 2.1., 5.

[10] 利用者エージェントは、 プッシュメッセージ購読を使って、 到着プッシュメッセージがないかプッシュサービスを監視 (monitor) します。 >>2 2.

[11] プッシュメッセージ購読はアプリケーションに、 1対1で配布して使うことが期待されています。 しかしこれはプロトコル上の制約ではなく、 1つのアプリケーションが複数のプッシュメッセージ購読を作ることもできますし、 複数のアプリケーションが1つのプッシュメッセージ購読を共有することもできます。 ただ、共有するとセキュリティーやプライバシーの問題になりかねないことには要注意です。 >>2 2.

プッシュエンドポイント

[18] プッシュ購読は、 プッシュエンドポイント (push endpoint) >>77 を持ちます。 プッシュ資源 (push resource) (リンク関係型 urn:ietf:params:push) >>2 2. と呼ばれるのも同じものです。 (資源はエンドポイントと実質同じ意味の IETF 語です。厳密にはそれぞれを参照。)

[16] プッシュ資源はプッシュ購読と1対1対応関係があり >>2 2.1.、 プッシュサービス資源がプッシュ購読を作成したとき、 同時にプッシュサービス上に作成されます。 プッシュ購読が削除されるとき、同時に削除されます。

[76] プッシュエンドポイント (プッシュ資源の URL) は、 プッシュサービスが晒した絶対URLであって、 アプリケーションサーバーがプッシュメッセージの送信先とできるものでなければなりません。 プッシュエンドポイントは、 プッシュ購読を固有に識別するものでなければなりません。 >>77 https: URL でなければなりません。 プッシュサービス

[59] プライバシーのため、 プッシュエンドポイントは特定利用者エージェントへの通信と関係付けられるものであってはなりません。 利用者や装置に関する情報を含めてはなりません。 複数のプッシュエンドポイントから相互の関係を知れるものであってはなりません。 同じ利用者エージェントのプッシュエンドポイントから利用者エージェントとの関係を知れるものであってはなりません。 >>2 8.2. 非活性化済みのプッシュエンドポイントを再利用してはなりません >>105。

[127] PushSubscription インターフェイスの endpoint 属性の取得器は、 次のようにしなければなりません >>123。

  1. [128] 文脈オブジェクトのプッシュエンドポイントを返します。 USVString です。

[19] プッシュエンドポイントは次のように使われます。


[26] プッシュエンドポイントの URL の実例 (実例を基にした架空の例)

プッシュメッセージ購読資源とプッシュメッセージ購読集合資源

[6] 購読資源 (subscription resource) 、 プッシュメッセージ購読資源 (push message subscription resource) は、 プッシュメッセージ購読からプッシュメッセージを受信したり、 プッシュメッセージ購読を削除したりするため使います。 >>2 2., 2.1. 利用者エージェントにのみ使えるものです。 >>2 2.1.

[37] プッシュメッセージ購読集合資源 (push message subscription set resource) (リンク関係型 urn:ietf:params:push:set) は、 プッシュメッセージ購読の集成に対する読み取りや削除のアクセスを提供します。 利用者エージェントは、 集合中すべてのプッシュメッセージ購読のプッシュメッセージを受信できます。 >>2 2.1.

[21] プッシュメッセージ購読資源はプッシュ資源と1対1対応関係を持ちます。 >>2 2.1. プッシュメッセージ購読集合資源は、 利用者エージェント単位で複数のプッシュメッセージ購読資源を集約したようなものです。

[22] プッシュメッセージ購読資源とプッシュメッセージ購読集合資源は、 次のように使われます。

作成

[112] アプリケーションは、 subscribe メソッドによって新しいプッシュ購読を作成できます。 既に作成済みの場合、 subscribe メソッドや getSubscription メソッドによって、 プッシュ購読を取得できます。 プッシュ購読の作成

プッシュメッセージ送受信

[25] プッシュ購読を使って、 プッシュメッセージを送信したり、 受信したりできます。 プッシュメッセージの送信

削除

[89] プッシュ購読やプッシュメッセージ購読集合は、 無効化されることがあります。 満期 (寿命 (lifetime) 到来) による場合、 利用者エージェントの指示による場合 (>>55)、 その他プッシュサービスの事情による場合があり得ます。 >>2 2., 7.3., 7.3.1.

[56] プッシュメッセージ購読が満期になったり削除されたりした場合、 プッシュメッセージ購読集合からも削除しなければなりません。 >>2 7.3.1.

[57] プッシュメッセージ購読集合が満期になったり削除されたりした場合、 所属するプッシュメッセージ購読もすべて満期・削除しなければなりません。 >>2 7.3.1.

[12] 利用者エージェントやアプリケーションサーバーは、 これに対応する準備が必要です。 >>2 2., 7.3.

[88] プッシュ購読は、 購読満期時刻 (subscription expiration time) を持つことができます。 その場合、 ミリ秒Unix timeであって、 プッシュ購読が非活性化される時刻を表すものでなければなりません。 >>78

[129] PushSubscription の expirationTime 属性の取得器は、 次のようにしなければなりません >>123。

  1. [130] 文脈オブジェクトの購読満期時刻を返します。 DOMTimeStamp です。 なければ null を返します。

[55] 利用者エージェントは、 プッシュメッセージ購読資源に DELETE 要求を送信して、 削除を要求できます >>2 7.3.。 その場合所属するプッシュメッセージ購読集合からも削除されます。 同様にプッシュメッセージ購読集合資源に DELETE 要求を送信して、 削除を要求できます >>2 7.3.1.。 その場合所属するすべてのプッシュメッセージ購読が同時に削除されます。


[91] 利用者エージェントやプッシュサービスは、 いつでも、例えば一定時間経過後、 プッシュ購読を更新 (refresh) することができます。 >>90

[99] 利用者エージェントは、 プッシュ購読を更新できない場合、 定期的にこれを再試行するべきです。 >>90

[79] 利用者エージェントは、 プッシュ購読の購読満期時刻の到来前に、 プッシュ購読の更新を試みるべきです。 >>78

[92] 利用者エージェントは、旧プッシュ購読の更新時、 次のようにしなければなりません。 >>90

  1. [93] プッシュ購読を、 旧プッシュ購読の options について、 プッシュ購読を作成した結果に設定します。 非同期的に待ちます。

    [94] 旧プッシュ購読とプッシュ購読は、 別の鍵ペアでなければなりません。

  2. [95] pushsubscriptionchangeイベントを発火します。
    登録
    プッシュ購読のサービスワーカー登録
    旧購読
    旧プッシュ購読
    新購読
    プッシュ購読
  3. [96] 利用者エージェント依存の時間、 最大でプッシュ購読がプッシュメッセージを受け取るまで、 待ちます。

    [97] アプリケーションサーバーの移行を待つべく、 しばらく旧プッシュ購読を受け付け続けて構いません。

  4. [98] 旧プッシュ購読を非活性化します。

[100] 利用者エージェントは、 満期その他の理由でプッシュ購読プッシュ購読が最早利用できないとき、 次のようにしなければなりません。 >>90

  1. [101] pushsubscriptionchangeイベントを発火します。
    登録
    プッシュ購読のサービスワーカー登録
    旧購読
    プッシュ購読
    新購読
    null

[106] 利用者は permission を失効できます。 permission 利用者エージェントは、 失効時、 当該 permission により作られたプッシュ購読プッシュ購読を次のようにしなければなりません。 >>105

  1. [108] 並列に、
    1. [109] プッシュ購読を非活性化します。
  2. [107] pushsubscriptionchangeイベントを発火して構いません。
    登録
    プッシュ購読のサービスワーカー登録
    旧購読
    プッシュ購読
    新購読
    null

[139] PushSubscription インターフェイスの unsubscribe メソッドは、 次のようにしなければなりません >>123。

  1. [140] 約束を、 新しい約束に設定します。
  2. [144] 約束を返します。

[145] 非同期的に、 次のようにしなければなりません >>123。

  1. [146] 文脈オブジェクトが非活性化済みの場合、
    1. [147] 約束を偽で解決し、 ここで停止します。
  2. [148] 約束を、真で解決します。
  3. [149] 文脈オブジェクトを非活性化します。

[102] 利用者エージェントやプッシュサービスは、 プッシュ購読が非活性化 (deactivated) されたとき、 その詳細情報を削除しなければなりません。 >>103 それ以後当該プッシュ購読に対するプッシュメッセージを配送してはなりません。 >>103, >>123

[150] 利用者エージェントは、 プッシュサービスに対するプッシュ購読の非活性化の要求が失敗した時、 十分な時間再試行するべきです。 >>123

[151] 仕様書はなぜか unsubscribe の場合にのみこれを規定していますが、 それ以外の事由でもそうなるべきはずです。

[104] サービスワーカー登録が登録解除されたとき、 プッシュ購読は非活性化しなければなりません >>105。 それより早く非活性化しても構いません。 >>103


[31] pushsubscriptionchange イベントは、 プッシュ購読がアプリケーションの預かり知らぬところで変更されたことを示します。 >>160

[163] ServiceWorkerGlobalScope インターフェイスの onpushsubscriptionchange 属性は、 イベントハンドラーIDL属性です。 >>160

[38] pushsubscriptionchangeイベントを発火 (fire the "pushsubscriptionchange" event) するには、 サービスワーカー登録登録、 プッシュ購読または null 旧購読、 プッシュ購読または null 新購読について、 次のようにしなければなりません。 >>160

  1. [39] fire a functional event します。
    イベント名
    pushsubscriptionchange
    イベントインターフェイス
    PushSubscriptionChangeEvent
    newSubscription
    新購読
    oldSubscription
    旧購読

[40] PushSubscriptionEvent インターフェイスは、 ExtendableEvent インターフェイスを継承したイベントインターフェイスです。 サービスワーカー環境に晒され、 SecureContext でのみ利用可能です。 イベントコンストラクターがあります。 PushSubscriptionEventInit 辞書は、 PushSubscriptionEvent インターフェイスに対応する辞書で、 ExtendableEventInit を継承しています。 >>160

[41] PushSubscriptionEvent インターフェイスメンバー, PushSubscriptionEventInit 辞書メンバー

[42] PushSubscriptionEvent インターフェイスの oldSubscription 属性の取得器 >>160 は、 次のようにしなければなりません。

  1. [43] 文脈オブジェクトの oldSubscription を返します。 PushSubscription または null です。 >>160

[44] PushSubscriptionEventInit の oldSubscription は、 PushSubscription または null です。 既定値は null です。 >>160

[48] oldSubscription で指定された PushSubscription は、それ以上使うべきではありません。 データベース破損など利用者エージェントが詳細を提供できないとき、 null となることがあります。 >>160

[45] PushSubscriptionEvent インターフェイスの newSubscription 属性の取得器 >>160 は、 次のようにしなければなりません。

  1. [46] 文脈オブジェクトの newSubscription を返します。 PushSubscription または null です。 >>160

[47] PushSubscriptionEventInit の newSubscription は、 PushSubscription または null です。 既定値は null です。 >>160


[82] 利用者エージェントは、 プッシュ購読プッシュ購読について、 何らかの理由で鍵を変更せざるを得ないとき、 次のようにしなければなりません。 >>73

  1. [84] 新プッシュ購読を、新しい鍵を使ったプッシュ購読に設定します。
  2. [85] pushsubscriptionchangeイベントを発火します。
    登録
    プッシュ購読のサービスワーカー登録
    旧購読
    プッシュ購読
    新購読
    新プッシュ購読

歴史

[1] Define exposure of the Push API interfaces (beverloo著, ) https://github.com/w3c/push-api/commit/350ee328178b1635f141412831892b16cb711305