pushsubscriptionchangeイベントを発火

プッシュメッセージ購読

仕様書

意味

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

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

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

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

[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
作成時に作成された PushSubscriptionOptionsuserVisibleOnly を持つ。
非活性化済み
push拒絶履歴
プッシュメッセージの受信
VAPID鍵ペア
公開鍵のみ (= optionsapplicationServerKey)。 作成時にアプリケーションから提供されたもの。
プッシュメッセージ購読資源
絶対URL。作成時にプッシュサービスから通知されたもの。
プッシュメッセージ購読集合
所属するプッシュメッセージ購読集合または null。 作成時にプッシュサービスから通知されたもの。

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

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

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

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

[159] PushEncryptionKeyName は、 p256dhauth です。 >>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 を返します >>113boolean です >>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] PushSubscriptionexpirationTime 属性取得器は、 次のようにしなければなりません >>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] PushSubscriptionEventInitoldSubscription は、 PushSubscription または null です。 既定値は null です。 >>160

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

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

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

[47] PushSubscriptionEventInitnewSubscription は、 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