プッシュ API

W3C 作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2025/WD-push-api-20250925/
最新公開バージョン:
https://www.w3.org/TR/push-api/
最新編集者ドラフト:
https://w3c.github.io/push-api/
履歴:
https://www.w3.org/standards/history/push-api/
コミット履歴
編集者:
Marcos Caceres (Apple Inc.)
Kagami Rosylight (Mozilla財団)
以前の編集者:
Peter Beverloo (Google) - まで
Martin Thomson (Mozilla財団) - まで
Bryan Sullivan (AT&T) - まで
Eduardo Fullea (Telefonica) - まで
Michaël van Ouwerkerk (Google) - まで
フィードバック:
GitHub w3c/push-api (プルリクエスト, 新しいIssue, オープンIssue)

概要

Push APIは、プッシュメッセージプッシュサービスを介してウェブアプリケーションに送信することを可能にします。アプリケーションサーバーは、ウェブアプリケーションやユーザーエージェントが非アクティブな場合でも、いつでもプッシュメッセージを送信できます。プッシュサービスは、ユーザーエージェントへの信頼性と効率的な配信を保証します。プッシュメッセージは、ウェブアプリケーションのオリジンで実行されているService Workerに配信され、そのメッセージの情報を使ってローカル状態の更新やユーザーへの通知の表示ができます。

本仕様は、Web Push プロトコルと共に使用するために設計されています。このプロトコルは、アプリケーションサーバーユーザーエージェントプッシュサービスとどのように連携するかを説明しています。

この文書のステータス

このセクションは、この文書が公開された時点でのステータスについて説明します。現在のW3C 公開文書とこの技術レポートの最新改訂版は、 W3C 標準・草案一覧で確認できます。

この文書は、Web Applications Working Groupによって、勧告トラックを用いて作業草案として公開されました。

作業草案として公開されることは、W3Cおよびそのメンバーによる承認を意味するものではありません。

この文書は草案であり、今後随時更新、差し替え、または他の文書によって廃止される可能性があります。進行中の作業以外のものとしてこの文書を引用するのは適切ではありません。

この文書は、 W3C 特許ポリシーの下で運営されているグループによって作成されました。 W3Cは、 当該グループが提供する成果物に関連する特許開示の公開リストを管理しています。 このページには特許開示の方法についても記載されています。該当する特許を知っている個人は、 必須クレームを含むと考えられる場合、 W3C特許ポリシー第6節に従って情報を開示する義務があります。

この文書は 2025年8月18日 W3Cプロセス文書に従って管理されています。

1. はじめに

このセクションは規範的ではありません。

Push APIは、ウェブアプリケーションがユーザーエージェントと非同期に通信することを可能にします。これにより、アプリケーションサーバーは、ユーザーエージェントに、情報が判明した時点で即座に時間に敏感な情報を提供できるようになり、ユーザーがウェブアプリケーションを開くのを待つ必要がなくなります。

ここで定義されているように、プッシュサービスは、いつでもプッシュメッセージの配信をサポートします。

特に、プッシュメッセージは、ウェブアプリケーションが現在ブラウザーウィンドウでアクティブでなくても配信されます。これは、ユーザーがウェブアプリケーションを閉じた場合でも、プッシュメッセージを受信した際にウェブアプリケーションが再起動できることが有益となるユースケースに関連します。例えば、プッシュメッセージは、着信WebRTC通話をユーザーに通知するために利用される場合があります。

プッシュメッセージは、ユーザーエージェントが一時的にオフラインの場合にも送信できます。これをサポートするため、プッシュサービスユーザーエージェント向けにメッセージを保持し、ユーザーエージェントが利用可能になるまで待機します。これにより、ユーザーがオフラインの間にウェブアプリケーションが変更を検知した場合でも、ユーザーエージェントに迅速に関連情報を提供できます。プッシュメッセージは、プッシュサービスによって、ユーザーエージェントが到達可能になるまで保持され、配信されます。

Push APIはまた、ユーザーエージェントがウェブアプリケーションをアクティブに利用している間にプッシュメッセージの確実な配信を保証します。例えば、ユーザーがウェブアプリケーションを積極的に利用している場合や、ウェブアプリケーションがアクティブなワーカー、フレーム、バックグラウンドウィンドウを通じてアプリケーションサーバーと通信している場合などです。ただし、これはPush APIの主なユースケースではありません。ウェブアプリケーションは、頻度の低いメッセージのためにPush APIを選択し、アプリケーションサーバーとの常時通信を維持する必要を回避することができます。

プッシュメッセージングは、ユーザーエージェントとウェブアプリケーションの間に既にアクティブな通信チャネルが存在しない場合に最適です。プッシュメッセージの送信は、Fetch APIや [WebSockets] など、より直接的な通信手段と比較して、はるかに多くのリソースを必要とします。プッシュメッセージは通常、直接通信よりも高いレイテンシーがあり、利用に制限がかかる場合もあります。多くのプッシュサービスは、送信できるプッシュメッセージのサイズや数に制限を設けています。

2. 依存関係

Web Pushプロトコル [RFC8030]は、ユーザーエージェントまたはアプリケーションサーバープッシュサービス間の通信を可能にするプロトコルを説明しています。代替プロトコルをこのプロトコルの代わりに利用することもできますが、本仕様はこのプロトコルの利用を前提としています。代替プロトコルは互換性のあるセマンティクスを提供することが期待されます。

Content-Encoding HTTPヘッダーは、[RFC7231]の3.1.2.2節で説明されており、プッシュメッセージのペイロードに適用されたコンテンツコーディングを示します。

3. 概念

3.1 アプリケーションサーバー

アプリケーションサーバーという用語は、ウェブアプリケーションのサーバー側コンポーネントを指します。

3.2 プッシュメッセージ

プッシュメッセージは、アプリケーションサーバーからウェブアプリケーションに送信されるデータです。

プッシュメッセージは、そのメッセージが送信されたアクティブワーカーに配信されます。このワーカーは、プッシュ購読に関連付けられています。サービスワーカーが現在起動していない場合は、配信のためにワーカーが起動されます。

3.3 宣言的プッシュメッセージ

宣言的プッシュメッセージは、ユーザーエージェントが理解できるJSONドキュメントをデータにもつ プッシュメッセージです。ユーザーエージェントは、受信した プッシュメッセージごとに宣言的プッシュメッセージであるかどうかを 宣言的プッシュメッセージパーサーを使って判定します。

宣言的プッシュメッセージを利用することで、Service Worker を介さずに通知を作成・表示できます。ただし、アプリケーションサーバーの意図で Service Worker を介することもできます。そのような場合、プッシュメッセージの宣言的性質は、たとえばストレージ圧迫などで Service Worker が退去された場合のバックアップとして機能します。また、通知データの伝達によりオブジェクト指向的な手法を提供します。

{
  "web_push": 8030,
  "notification": {
    "title": "Ada emailed ‘London’",
    "lang": "en-US",
    "dir": "ltr",
    "body": "Did you hear about the tube strikes?",
    "navigate": "https://email.example/message/12"
  }
}

3.3.1 メンバー

宣言的プッシュメッセージは、以下のメンバーを持ちます。

web_push (必須)

整数値で、必ず8030でなければなりません。宣言的プッシュメッセージと他のJSON文書を区別するために使用されます。

notification (必須)

以下のメンバーを持つJSONオブジェクトです。すべてNotifications APIの機能と類似していますが、一部はより厳密な型になっています。titleを除き、全てのメンバーはNotificationOptions 辞書由来であり、同期して管理されます。[NOTIFICATIONS]

title (必須)

文字列。

dir

"auto"、"ltr"、または"rtl"。

lang

言語タグを保持する文字列。

body

文字列。

navigate (必須)

URLを保持する文字列。

tag

文字列。

image

URLを保持する文字列。

icon

URLを保持する文字列。

badge

URLを保持する文字列。

vibrate

32ビット符号なし整数の配列。

timestamp

64ビット符号なし整数

renotify

真偽値(boolean)。

silent

真偽値(boolean)。

requireInteraction

真偽値(boolean)。

一貫性のため、NotificationOptions 辞書と合わせてrequire_interactionではなくrequireInteractionとなっています。

data

任意のJSON値。

actions

以下のメンバーを持つJSONオブジェクトの配列で、すべてNotificationAction 辞書由来であり、同期して管理されます。

action (必須)

文字列。

title (必須)

文字列。

navigate (必須)

URLを保持する文字列。

icon

URLを保持する文字列。

mutable

真偽値(boolean)。true の場合、Service Worker(存在する場合)にNotification オブジェクトを含むpushイベントがdispatchされます。 そのNotificationオブジェクトは宣言的プッシュメッセージで記述されたものです。

3.3.2 パーサー

宣言的プッシュメッセージパーサー結果は、タプルであり、 notification通知)と mutable(真偽値)で構成されます。

宣言的プッシュメッセージパーサーは、byte sequence bytesorigin originURL baseURLEpochTimeStamp fallbackTimestampを引数として、これらの手順を実行します。結果は失敗か、宣言的プッシュメッセージパーサー結果です。

  1. messageを、JSONバイト列をInfra値にパースした結果とします。例外が発生した場合は失敗を返します。

  2. messagemapでない場合は失敗を返します。

  3. message["web_push"]が存在しない、または8030でない場合は失敗を返します。

  4. message["notification"]が存在しない場合は失敗を返します。

  5. notificationInputmessage["notification"]とします。

  6. notificationInputmapでない場合は失敗を返します。

  7. notificationInput["title"]が存在しない、または文字列でない場合は失敗を返します。

  8. notificationInput["navigate"]が存在しない、または文字列でない場合は失敗を返します。

  9. notificationTitlenotificationInput["title"]とします。

  10. notificationOptionsNotificationOptions 辞書の新しいインスタンスとします。

  11. notificationInput["dir"]が存在し、"auto"、"ltr"、"rtl"のいずれかの場合、 notificationOptions["dir"] にnotificationInput["dir"]をセットします。

  12. notificationInput["lang"]が存在し、文字列の場合は notificationOptions["lang"] に notificationInput["lang"]をセットします。

  13. notificationInput["body"]が存在し、文字列の場合は notificationOptions["body"] に notificationInput["body"]をセットします。

  14. notificationOptions["navigate"] に notificationInput["navigate"](変換済み)をセットします。

  15. notificationInput["tag"]が存在し、文字列の場合は notificationOptions["tag"] に notificationInput["tag"]をセットします。

  16. notificationInput["image"]が存在し、文字列の場合は notificationOptions["image"] に notificationInput["image"](変換済み)をセットします。

  17. notificationInput["icon"]が存在し、文字列の場合は notificationOptions["icon"] に notificationInput["icon"](変換済み)をセットします。

  18. notificationInput["badge"]が存在し、文字列の場合は notificationOptions["badge"] に notificationInput["badge"](変換済み)をセットします。

  19. notificationInput["vibrate"]が存在し、各item32ビット符号なし整数listの場合は notificationOptions["vibrate"] に notificationInput["vibrate"]をセットします。

  20. notificationInput["timestamp"]が存在し、64ビット符号なし整数の場合は notificationOptions["timestamp"] に notificationInput["timestamp"]をセットします。

  21. notificationInput["renotify"]が存在し、真偽値の場合は notificationOptions["renotify"] に notificationInput["renotify"]をセットします。

  22. notificationInput["silent"]が存在し、真偽値の場合は notificationOptions["silent"] に notificationInput["silent"]をセットします。

  23. notificationInput["requireInteraction"]が存在し、真偽値の場合は notificationOptions["requireInteraction"] に notificationInput["requireInteraction"]をセットします。

  24. notificationInput["data"]が存在する場合は notificationOptions["data"] に Infra値をJSON互換JavaScript値に変換した結果をセットします。

  25. notificationInput["actions"]が存在し、listの場合:

    1. notificationActionsを空リスト « » とします。

    2. actionInput について notificationInput["actions"]を反復します:

      1. actionInput["action"]が存在しない、または文字列でない場合はcontinueします。

      2. actionInput["title"]が存在しない、または文字列でない場合はcontinueします。

      3. actionInput["navigate"]が存在しない、または文字列でない場合はcontinueします。

      4. actionNavigateactionInput["navigate"] (変換済み)とします。

      5. notificationActionNotificationAction 辞書 «[ "action" → actionInput["action"], "title" → actionInput["title"], "navigate" → actionNavigate ]»とします。

      6. actionInput["icon"]が存在し、文字列の場合は notificationAction["icon"] に actionInput["icon"](変換済み)をセットします。

      7. AppendnotificationActionnotificationActionsへ追加します。

    3. notificationOptions["actions"] に notificationActionsをセットします。

  26. notification通知の作成により notificationTitle, notificationOptions, origin, baseURL, fallbackTimestampを指定して生成します。例外が発生した場合は失敗を返します。

  27. notificationナビゲーションURLがnullの場合は失敗を返します。

  28. notificationactionsのいずれかのナビゲーションURLがnullの場合は失敗を返します。

  29. mutableをfalseとします。

  30. message["mutable"]が存在し、真偽値の場合は mutablemessage["mutable"]をセットします。

  31. (notification, mutable) を返します。

3.4 プッシュ購読

プッシュサブスクリプションは、ウェブアプリケーションの代理として ユーザーエージェントプッシュサービスの間で確立されるメッセージ配信のコンテキストです。

プッシュサブスクリプションには、スコープが関連付けられています。これはURLです。

プッシュサブスクリプションは、そのスコープパスリストでサイズが1、かつスコープパス[0]が空文字列である場合、ウィンドウアクセシブルスコープを持つとみなされます。

Note

すなわち、パス成分の URLは「/」としてシリアライズされます。

プッシュサブスクリプションには、プッシュエンドポイントが関連付けられています。これは 絶対に プッシュサービスによって公開される絶対URLであり、 アプリケーションサーバープッシュメッセージを送信できる場所です。プッシュエンドポイント一意に プッシュサブスクリプションを識別する必要があります。

プッシュサブスクリプション関連する サブスクリプション有効期限を持つ場合があります。設定されている場合、それは1970年1月1日00:00:00 UTCからのミリ秒単位の時刻であり、その時点でサブスクリプションが非アクティブ化されます。ユーザーエージェントできるだけサブスクリプションが期限切れになる前にリフレッシュを試みるべきです。

プッシュサブスクリプションは、P-256 ECDH鍵ペアおよび認証シークレットの内部スロットを持ちます。これらは [RFC8291] に従い、必ずプッシュサブスクリプションの作成時に格納されます。

ユーザーエージェントが何らかの理由でプッシュサブスクリプションの鍵を変更する必要がある場合、 かつプッシュサブスクリプション関連サービスワーカー登録がnullでない場合、 必ずリフレッシュを行う必要があります。

プッシュサブスクリプションを作成するには、PushSubscriptionOptionsInit optionsDictionaryを与えられたとき:

  1. subscriptionに新しいPushSubscriptionを作成する。
  2. optionsに新しく作成されたPushSubscriptionOptionsオブジェクトを割り当て、その属性をoptionsDictionaryの対応するメンバーと値で初期化する。
  3. subscriptionoptions属性にoptionsを設定する。
  4. 新しいP-256ECDH鍵ペアを生成する [ANSI-X9-62]。 秘密鍵はsubscriptionの内部スロットに格納され、この値はアプリケーションに公開されてはなりません。 公開鍵も内部スロットに格納され、getKey()メソッドを p256dh引数で呼び出すことで取得できる。
  5. 新しい認証シークレット([RFC8291]で定義されるオクテット列)を生成する。 この認証シークレットはsubscriptionの内部スロットに格納される。 この鍵はgetKey()メソッドを auth引数で呼び出すことで取得できる。
  6. 新しいプッシュサブスクリプションを要求する。 applicationServerKey属性が設定されている場合は、optionsの値を含める。 例外が発生した場合は再スローする。
  7. プッシュサブスクリプション要求が正常に完了した場合:
    1. subscriptionendpoint属性に プッシュサブスクリプションプッシュエンドポイントを設定する。
    2. プッシュサブスクリプションから提供された場合、 subscriptionexpirationTimeを設定する。
  8. subscriptionを返す。

3.4.1 サービスワーカー登録との関係

プッシュサブスクリプション関連サービスワーカー登録は、 サービスワーカー登録スコープURLが、 等しい場合のプッシュサブスクリプションスコープであればその登録、そうでなければnullです。

逆に、サービスワーカー登録関連プッシュサブスクリプションは、 プッシュサブスクリプションスコープ等しい場合の サービスワーカー登録スコープURLであればそのサブスクリプション、そうでなければnullです。

3.4.2 購読の更新

ユーザーエージェントまたはプッシュサービスは、いつでも、たとえば一定期間が経過した場合などに、リフレッシュを選択して、関連サービスワーカー登録がnullでないプッシュサブスクリプションをリフレッシュすることができます。

この場合、ユーザーエージェントは、現在のプッシュサブスクリプションの作成時に指定されたPushSubscriptionOptionsを用いて、プッシュサブスクリプションを作成する手順を実行し、新しいプッシュサブスクリプションスコープを元のサブスクリプションのスコープに設定しなければなりません。 新しいプッシュサブスクリプションは必ず元のサブスクリプションとは異なる鍵ペアを持たなければなりません。

正常に完了した場合、ユーザーエージェントは、プッシュサブスクリプションに関連付けられたサービスワーカー登録registration、初期のプッシュサブスクリプションを表すPushSubscriptionインスタンスをoldSubscription、新しいプッシュサブスクリプションを表すPushSubscriptionインスタンスをnewSubscriptionとして、"pushsubscriptionchange"イベントを発火しなければなりません。

変更内容をアプリケーションサーバーに反映させるための猶予期間を設けるため、ユーザーエージェントは、リフレッシュ後も短期間、古いプッシュサブスクリプションに対するメッセージの受信を許可してもよいです。リフレッシュされたプッシュサブスクリプションに対してメッセージが受信されると、すべての古いプッシュサブスクリプション必ず非アクティブ化されなければなりません。

ユーザーエージェントプッシュサブスクリプションのリフレッシュに失敗した場合、定期的にリフレッシュを再試行するべきです。たとえば有効期限が切れるなどして、プッシュサブスクリプションが利用できなくなった場合、ユーザーエージェントは、プッシュサブスクリプションに関連付けられたサービスワーカー登録registration、非アクティブ化されるプッシュサブスクリプションを表すPushSubscriptionインスタンスをoldSubscriptionnewSubscriptionとしてnullを指定し、"pushsubscriptionchange"イベントを発火しなければなりません。

3.4.3 購読の非アクティブ化

プッシュサブスクリプション非アクティブ化された場合、 ユーザーエージェントおよびプッシュサービスは、 保存されているその詳細のコピーを必ず削除しなければなりません。 その後、このプッシュサブスクリプションへの プッシュメッセージ絶対に配信されてはなりません。

ウィンドウアクセシブルスコープを持たない プッシュサブスクリプションは、 関連付けられたサービスワーカー登録が登録解除されたとき 必ず非アクティブ化されなければなりませんが、 プッシュサブスクリプションはより早い段階で 非アクティブ化されてもかまいません。

Note

ウィンドウアクセシブルスコープを持たない プッシュサブスクリプションは、 サービスワーカー登録がクリアされたときに削除されます。

3.5 プッシュサービス

プッシュサービスという用語は、 アプリケーションサーバーが ウェブアプリケーションにプッシュメッセージを送信できるようにする仕組みを指します。 プッシュサービスは、その配信対象となるプッシュサブスクリプションのための プッシュエンドポイントエンドポイントを提供します。

ユーザーエージェントは、 プッシュサービスに接続し、 プッシュサブスクリプションを作成します。 ユーザーエージェントは 利用可能なプッシュサービスの選択肢を 制限してもよいです。 その理由としては、サービスの可用性(特定の国や職場のネットワークなどでサービスがファイアウォールによってブロックされているかどうかも含む)、 信頼性、バッテリー寿命への影響、特定のプッシュサービスに メタデータの流れを誘導する、または回避するための契約など、パフォーマンス関連の懸念が挙げられます。

3.6 許可

Push APIは、強力な機能であり、 名前 "push" によって識別されます。

Permissions仕様との統合のため、 この仕様は PushPermissionDescriptor permission descriptor type を定義します。

WebIDLdictionary PushPermissionDescriptor : PermissionDescriptor {
  boolean userVisibleOnly = false;
};

userVisibleOnlyは、 userVisibleOnly と同じ意味です。

{name: "push", userVisibleOnly: false} は、 {name: "push", userVisibleOnly: true} よりも 強いです。

4. セキュリティおよびプライバシーに関する考慮事項

プッシュメッセージの内容は暗号化されています [RFC8291]。しかし、プッシュサービスは、 アプリケーションサーバーユーザーエージェントプッシュサブスクリプション経由で送信した メッセージのメタデータには依然としてアクセスできます。これにはメッセージのタイミング、頻度、サイズが含まれます。 プッシュサービスを変更する以外に(ユーザーエージェントが許可しない場合があります)、 既知の対策はメッセージサイズをパディングで大きく見せることのみです。

プッシュメッセージがウェブアプリケーションと同じオリジンの アプリケーションサーバーから送信されたことは保証できません。 アプリケーションサーバープッシュサブスクリプションを利用するために必要な詳細情報を 第三者と自身の裁量で共有可能です。

以下の要件は、可能な限りユーザーのプライバシーとセキュリティを保護することを目的としており、その目標を満たすことを前提に、アプリケーションサーバーとユーザーの通信の完全性を保護することも目的としています。

Push APIは、開発者が提供するイベントハンドラを実行するために、Service Workerの登録に関連付けられたService Workerを起動する必要がある場合があります。これにより、ネットワークトラフィックなどのリソース消費が発生し、ユーザーエージェントは、そのリソース消費をPushサブスクリプションを作成したウェブアプリケーションに帰属させるべきです

ユーザーエージェントは、許可取得または許可状態の判定時に、PushSubscriptionOptionsを考慮してもよい

許可が取り消された場合、ユーザーエージェントは、その許可で作成されたサブスクリプションに対して、発火してもよい"pushsubscriptionchange"イベントを、service worker registrationregistrationPushSubscriptionインスタンスでoldSubscriptionnullnewSubscriptionとして発火することができる。ユーザーエージェントは、該当するサブスクリプションを並行して無効化しなければならない無効化する。

Pushエンドポイントは、ユーザーのデバイス、ID、位置情報などの情報がPushサービス以外の主体によって導出されることを許可してはならない。正確な要件については [RFC8030] のプライバシーに関する考慮点を参照のこと。

無効化されたPushサブスクリプションPushエンドポイントは、新しいPushサブスクリプションに再利用してはならない。これにより、ユーザーが削除できない永続的な識別子の作成を防ぐことができる。さらに、一つのPushサブスクリプションの詳細を使って別のPushサブスクリプションPushメッセージを送信することも防止できる。

5. プッシュフレームワーク

このセクションは規範的ではありません。

プッシュメッセージは、アプリケーションサーバーからウェブアプリケーションへ以下の手順で送信されます:

この全体的なフレームワークによって、アプリケーションサーバーは、Service Workerをイベントに応じて起動できます。イベントに関する情報は プッシュメッセージに含めることができ、ウェブアプリケーションは追加のネットワークリクエストをしなくても適切に反応できます。

以下のコードと図は Push API の仮想的な利用例を示します。

5.1

このセクションは規範的ではありません。

// https://example.com/serviceworker.js
this.onpush = event => {
  console.log(event.data);
  // ここから IndexedDB へデータを書き込んだり、開いているウィンドウへ送信したり、通知を表示したりできます。
}

// https://example.com/webapp.js
// 非同期関数内...
try {
  const serviceWorkerRegistration = await navigator.serviceWorker.register(
    "serviceworker.js"
  );
  const pushSubscription = await serviceWorkerRegistration.pushManager.subscribe();
  // アプリケーションサーバーが必要とするプッシュ購読の詳細
  // を取得できたので、例えば XMLHttpRequest で送信できます。
  console.log(pushSubscription.endpoint);
  console.log(pushSubscription.getKey("p256dh"));
  console.log(pushSubscription.getKey("auth"));
} catch (err) {
  // 本番環境では、エラー情報をアプリケーションサーバーへ報告するのも有用です。
  console.log(error);
}

5.2 シーケンス図

このセクションは規範的ではありません。

購読、プッシュメッセージ配信、購読解除の例のイベントフロー
1 購読、プッシュメッセージ配信、購読解除の例のイベントフロー

5.3 プッシュサービスの利用

PushSubscription に含まれるフィールドは、 アプリケーションサーバープッシュメッセージを送信するために必要なすべての情報です。Push API と互換性のあるプッシュサービスは プッシュエンドポイントWeb Push プロトコルに準拠)を提供します。これらのパラメータ・属性は以下の通りです:

6. PushManagerAttribute ミックスイン

この仕様は Window および ServiceWorkerRegistration オブジェクトを PushManagerAttribute ミックスインによって拡張します。 [HTML] [SERVICE-WORKERS]

WebIDL[SecureContext]
interface mixin PushManagerAttribute {
  readonly attribute PushManager pushManager;
};
Window includes PushManagerAttribute;
ServiceWorkerRegistration includes PushManagerAttribute;

Window および ServiceWorkerRegistration オブジェクトは、関連する PushManager オブジェクトを持ちます。

pushManager のgetter手順は、this の関連する PushManager オブジェクトを返します。

Window オブジェクトでは、PushManagerservice worker registration は null です。

ServiceWorkerRegistration オブジェクトでは、PushManagerservice worker registration は、 サービスワーカー登録によって表される ServiceWorkerRegistration オブジェクトです。

7. PushManager インターフェース

PushManager インターフェイスは、プッシュサービスへのアクセス操作を定義します。

WebIDL[Exposed=(Window,Worker), SecureContext]
interface PushManager {
  [SameObject] static readonly attribute FrozenArray<DOMString> supportedContentEncodings;

  Promise<PushSubscription> subscribe(optional PushSubscriptionOptionsInit options = {});
  Promise<PushSubscription?> getSubscription();
  Promise<PermissionState> permissionState(optional PushSubscriptionOptionsInit options = {});
};

PushManager には、関連する サービスワーカー登録があり、null または サービスワーカー登録です。

supportedContentEncodings 属性は、プッシュメッセージのペイロード暗号化に使用できるサポートされているコンテンツコーディングのシーケンスを公開します。コンテンツコーディングは、プッシュサービスからプッシュメッセージの送信を要求する際に、Content-Encodingヘッダーで示されます。

ユーザーエージェントは、[RFC8291]で定義される aes128gcm コンテンツコーディングを必ずサポートしなければならず、互換性のために以前のドラフトで定義されたコンテンツコーディングをサポートしてもよいです。

7.1 subscribe() メソッド

subscribe() メソッドの手順は以下のとおりです:

  1. promise新しい promiseとする。
  2. globalthis関連グローバルオブジェクトとする。
  3. scope を null にする。
  4. registration を null にする。
  5. もし thisサービスワーカー登録 が null なら:
    1. scope に、"/" と global関連 DocumentURL基本URLパーサーを実行した結果を設定する。
  6. それ以外の場合:
    1. Assert: thisサービスワーカー登録サービスワーカー登録である。
    2. registrationthisサービスワーカー登録を設定する。
  7. 以下の手順を並行して実行する:
    Note: 検証順序はユーザーエージェントによって異なる場合があります
    1. もし scope が失敗または URLで、そのschemeが"https"でない場合、グローバルタスクをキューに入れるnetworking task sourceを使い、globalpromiseをreject、例外は"NotAllowedError" DOMException)。
    2. もし options 引数の userVisibleOnlyfalse であり、ユーザーエージェントが true を要求する場合、グローバルタスクをキューに入れて promise を NotAllowedError で reject。
    3. もし options 引数が applicationServerKey メンバーに非null値を含まず、プッシュサービスがそれを要求する場合、グローバルタスクをキューに入れて promise を NotSupportedError で reject。
    4. もし options 引数に applicationServerKey 属性に非null値があれば:
      1. もし optionsapplicationServerKeyDOMString なら、その値を base64url デコードして ArrayBuffer にする。失敗したら InvalidCharacterError で reject。
      2. デコード失敗時、グローバルタスクをキューに入れて promise を InvalidCharacterError で reject。
      3. optionsapplicationServerKey が P-256 曲線上の有効な点か確認し、無効なら InvalidAccessError で reject。
    5. subscription を null にする。
    6. もし scope が非nullの場合:
      1. もし プッシュサブスクリプションで、ウィンドウアクセシブルスコープscopescope と等しいものがあれば、subscription にそのプッシュサブスクリプションを設定する。
    7. それ以外の場合:
      1. Assert: registration が非null。
      2. もし registrationactive worker が null なら、グローバルタスクをキューに入れて promise を InvalidStateError で reject。
      3. もし registration関連プッシュサブスクリプション が非nullなら、subscription にそれを設定する。
      4. scoperegistrationscope URLを設定する。
    8. permission"push" の利用許可を要求した結果とする。
    9. もし permission が "denied" なら、グローバルタスクをキューに入れて promise を NotAllowedError で reject。
    10. もし subscription が非nullなら:
      1. もし subscription にエラーがあれば、グローバルタスクをキューに入れて promise を AbortError で reject。
      2. options 引数の値と subscriptionoptions 属性を比較し、BufferSource型は値の等価性比較。
      3. もし options のいずれかの属性値が subscription の保存値と異なれば、グローバルタスクをキューに入れて promise を InvalidStateError で reject。
      4. グローバルタスクをキューに入れて promisesubscription で resolve、手順終了。
    11. Assert: subscription は null かつ scope は URL。
    12. subscriptionプッシュサブスクリプションを作成options付き)した結果を設定。例外が発生した場合はその例外で promise を reject。
    13. subscriptionscopescope を設定する。
    14. グローバルタスクをキューに入れて promisePushSubscriptionsubscription対応)で resolve。
  8. promise を返す。

getSubscription() メソッドの手順は以下のとおりです:

  1. promise新しい promiseとする。
  2. globalthis関連グローバルオブジェクトとする。
  3. windowScope を null にする。
  4. registration を null にする。
  5. もし thisサービスワーカー登録 が null なら、windowScope に "/" と global の関連 Document の URL を使って基本URLパーサーの結果を設定。
  6. それ以外の場合:
    1. Assert: thisサービスワーカー登録サービスワーカー登録である。
    2. registrationthisサービスワーカー登録を設定する。
  7. 以下の手順を並行して実行する:
    1. subscription を null にする。
    2. もし windowScope が非nullなら:
      1. もし プッシュサブスクリプションscopewindowScope のものがあれば、subscription にそのプッシュサブスクリプションを設定する。
    3. それ以外の場合:
      1. Assert: registration が非null。
      2. もし registration関連プッシュサブスクリプション が非nullなら、subscription にそれを設定する。
    4. もし subscription が null なら、promise を null で resolve。
    5. もし subscription にエラーがあれば、promiseDOMException(名前は "AbortError")で reject、手順終了。
    6. promisePushSubscriptionsubscription対応)で resolve。
  8. promise を返す。

permissionState() メソッドは呼び出されたとき、以下の手順を必ず実行します:

  1. promise新しい promiseで作成。
  2. promise を返し、以降の手順は非同期で継続。
  3. descriptor を新しい PermissionDescriptor にし、name を "push" で初期化。
  4. statedescriptorpermission stateとして取得。
  5. promisestate で resolve。

プッシュサービスの利用許可は永続可能であり、有効な許可があれば以降のサブスクリプションで再確認不要です。

許可を求める必要がある場合は、subscribe() メソッドを呼び出して取得します。

7.2 PushSubscriptionOptions インターフェース

WebIDL[Exposed=(Window,Worker), SecureContext]
interface PushSubscriptionOptions {
  readonly attribute boolean userVisibleOnly;
  [SameObject] readonly attribute ArrayBuffer? applicationServerKey;
};

userVisibleOnly 属性は、取得時に初期化値を返します。

applicationServerKey 属性は、取得時に初期化値を返します。

存在する場合、applicationServerKey の値は 必ず P-256楕円曲線 [DSS] 上の点であり、 [ANSI-X9-62] Annex A で記載された非圧縮形式(先頭0x04オクテット、合計65オクテット)でエンコードされていなければなりません。 DOMString として提供する場合は、 必ず base64urlエンコード [RFC7515] でエンコードしてください。

ユーザーエージェントは applicationServerKeyが存在しない場合で、プッシュサービスが運用上要求する場合、購読試行を拒否してもよいです。

applicationServerKey は、メッセージ暗号化で使われる値とは必ず異なる値でなければなりません [RFC8291]。

7.3 PushSubscriptionOptionsInit 辞書

WebIDLdictionary PushSubscriptionOptionsInit {
  boolean userVisibleOnly = false;
  (BufferSource or DOMString)? applicationServerKey = null;
};

userVisibleOnly メンバーは true に設定すると、プッシュ購読が、 Web通知の表示などユーザーに可視化される効果を持つ プッシュメッセージのためだけに使われることを示します。 [NOTIFICATIONS]

PushSubscriptionOptionsInitプッシュ購読に関連する追加オプションを表します。ユーザーエージェントこれらのオプションを考慮してもよいです。オプションを考慮した場合、 ユーザーエージェント受信したプッシュメッセージに対して強制すべきです。

これらのオプションは任意であり、ユーザーエージェント一部だけサポートしてもよいです。ユーザーエージェントサポートしていないオプションを公開してはなりません

一度設定されたオプションは プッシュ購読で変更できません。既存の プッシュ購読unsubscribe により解除し、 新しいオプションを用いた プッシュ購読を作成できます。

applicationServerKey メンバーは、 ユーザーエージェントプッシュサービスプッシュサブスクリプションを確立する際に使用されます。 applicationServerKey オプションには、 アプリケーションサーバー用の楕円曲線公開鍵が含まれます。 この鍵は、アプリケーションサーバーが このプッシュサブスクリプションプッシュメッセージを送信する際に自身を認証するために使用します([RFC8292]参照)。 プッシュサービスは、 対応する秘密鍵で認証トークンが生成されていない限り、 プッシュメッセージを拒否します。

8. PushSubscription インターフェース

PushSubscription オブジェクトは、プッシュ購読を表します。

WebIDL[Exposed=(Window,Worker), SecureContext]
interface PushSubscription {
  readonly attribute USVString endpoint;
  readonly attribute EpochTimeStamp? expirationTime;
  [SameObject] readonly attribute PushSubscriptionOptions options;
  ArrayBuffer? getKey(PushEncryptionKeyName name);
  Promise<boolean> unsubscribe();

  PushSubscriptionJSON toJSON();
};

dictionary PushSubscriptionJSON {
  USVString endpoint;
  EpochTimeStamp? expirationTime = null;
  record<DOMString, USVString> keys;
};

endpoint属性の取得時、ユーザーエージェント必ず プッシュエンドポイントを返します。 これは、プッシュ購読に関連付けられています。 ユーザーエージェントは 入力依存分岐のない(つまり定数時間の)シリアライズ手法を使用しなければなりません

expirationTime属性の取得時、ユーザーエージェント必ず プッシュ購読に関連付けられている購読有効期限を返します。 存在しない場合はnullを返します。

options属性の取得時、ユーザーエージェント必ず PushSubscriptionOptionsオブジェクトを返します。 これは、プッシュ購読に関連付けられたオプションを表します。

getKey()メソッドは、暗号化および認証に使用できる鍵データを取得します。 getKey()が呼び出された際、以下の処理が行われます:

  1. name引数で指定された鍵に対応する内部スロットを探します。
  2. スロットが見つからなかった場合、nullを返します。
  3. 新しく生成したArrayBufferインスタンスでkeyを初期化します。
  4. 内部スロットに非対称鍵ペアが含まれている場合は、keyの内容を鍵ペアの公開鍵のシリアライズ値に設定します。 シリアライズ形式は鍵名を定義する仕様に従います。 例えば [RFC8291] では "p256dh" 公開鍵は [ANSI-X9-62] Annex A で定義される非圧縮形式(先頭が0x04オクテット、65オクテット)でエンコードされます。
  5. それ以外の場合、内部スロットに対称鍵が含まれている場合は、その値のコピーをkeyに設定します。 例えば、auth パラメータは ユーザーエージェントアプリケーションサーバーから送信されたメッセージの認証に使うオクテット列です。
  6. keyを返します。

"p256dh" および "auth" という鍵名は 必ずサポートしなければならず、それらの値は [RFC8291] に従い ユーザーエージェントが受信したプッシュメッセージの復号に必要なものと一致しなければなりません

unsubscribe() メソッドは呼び出された際、以下の手順を必ず実行します:

  1. promise新しい promiseとします。
  2. promise を返し、以下の手順を非同期で続行します。
  3. プッシュ購読がすでに非アクティブ化されている場合は、promisefalseで解決し、手順終了。
  4. 以下の手順を並行して実行します:
    1. Deactivate the push subscriptionuser agentは、MUST NOT push subscriptionのために、これ以上のpush messagesを配信してはなりません。

      もしuser agentが、例えばネットワークの故障のために、push servicedeactivateをリクエストできなかった場合、push subscriptionを、妥当な時間の間、push serviceへのリクエストを再試行SHOULD

  5. promisetrueで解決します。

toJSON() メソッドは呼び出された際、以下の手順を必ず実行します:

  1. json を新しい PushSubscriptionJSON 辞書とします。
  2. json["endpoint"] に endpoint属性の取得結果を設定します。
  3. json["expirationTime"] に expirationTime属性の取得結果を設定します。
  4. keys を空の record<DOMString, USVString>インスタンスとして初期化します。
  5. 内部スロット上の鍵名に対応する各識別子i(名前順)について:
    1. 内部スロットが非対称鍵ペアの場合、鍵名iに対応する公開鍵のエンコード値bを取得します(鍵名定義のエンコーディング、getKey()参照)。
    2. それ以外の場合、getKeyで返される値bを取得します。
    3. bをURLセーフbase64(パディングなし)[RFC4648]でsにエンコードします。ユーザーエージェントは値bに基づいた分岐のないシリアライズ手法を使用しなければなりません
    4. keys[i] = sとします。
  6. json["keys"] に keysを設定します。
  7. jsonを返します。

PushSubscriptionJSON 辞書は、 JSON型としての PushSubscriptionを表します。ECMAScriptでは JSON.stringify() 関数で文字列に変換できます。

keys レコードは、サポートされる各 PushEncryptionKeyName エントリーに対して、その値のURLセーフbase64エンコード表現 [RFC4648] を含みます。

PushSubscription のオプションはシリアライズされないことに注意してください。

8.1 PushEncryptionKeyName 列挙体

プッシュメッセージ暗号化に利用される鍵は、 getKey()メソッドや PushSubscriptionのシリアライザを通じて ウェブアプリケーションに提供されます。各鍵は PushEncryptionKeyName 列挙体の値で命名されます。

WebIDLenum PushEncryptionKeyName {
  "p256dh",
  "auth"
};

p256dh 値は [RFC8291]で記述されるP-256 ECDH ディフィー・ヘルマン公開鍵の取得に使います。

auth 値は [RFC8291]で記述される認証用シークレットの取得に使います。

9. PushMessageData インターフェース

WebIDL[Exposed=ServiceWorker, SecureContext]
interface PushMessageData {
  ArrayBuffer arrayBuffer();
  Blob blob();
  Uint8Array bytes();
  any json();
  USVString text();
};

PushMessageData オブジェクトは、作成時に設定される bytesバイト列)を持ちます。

arrayBuffer() メソッドは、ArrayBuffer を返します。その内容は thisbytes です。ArrayBuffer オブジェクトの生成時に例外が発生した場合は再スローします。

blob() メソッドは、新しい Blob オブジェクトを返します。その内容は thisbytes です。

bytes() メソッドは、新しい Uint8Array を返します。これは ArrayBuffer によってバックされており、内容は thisbytes です。ArrayBuffer オブジェクトの生成時に例外が発生した場合は再スローします。

json() メソッドは、JSONバイト列をJavaScript値にパースthisbytes に対して実行した結果を返します。

text() メソッドは、UTF-8デコードthisbytes に対して実行した結果を返します。

バイト列を抽出するには、objectに対して以下の手順を実行します:

  1. bytes を空のバイト列で初期化する。
  2. object の型によって分岐する:
    BufferSource
    bytesobject の内容のコピーを設定する。
    USVString
    bytesutf-8エンコードの結果を設定する。
  3. bytes を返す。

10. イベント

10.1 ServiceWorkerGlobalScope インターフェースへの拡張

Service Worker仕様は、ServiceWorkerGlobalScope インターフェースを定義しています [SERVICE-WORKERS]。この仕様はこれを拡張します。

WebIDL[Exposed=ServiceWorker, SecureContext]
partial interface ServiceWorkerGlobalScope {
  attribute EventHandler onpush;
  attribute EventHandler onpushsubscriptionchange;
};

onpush 属性は イベントハンドラIDL属性であり、 対応する イベントハンドライベントタイプは "push" です。 "push" イベントは プッシュメッセージプッシュ購読に対して受信されたことを示します。

onpushsubscriptionchange 属性は イベントハンドラIDL属性であり、 対応する イベントハンドライベントタイプは "pushsubscriptionchange" です。

10.2 PushEvent インターフェース

WebIDL[Exposed=ServiceWorker, SecureContext]
interface PushEvent : ExtendableEvent {
  constructor(DOMString type, optional PushEventInit eventInitDict = {});
  readonly attribute PushMessageData? data;
  readonly attribute Notification? notification;
};

dictionary PushEventInit : ExtendableEventInit {
  PushMessageDataInit? data = null;
  Notification? notification = null;
};

typedef (BufferSource or USVString) PushMessageDataInit;

constructorPushEvent インターフェース、または PushEvent インターフェースを継承するインターフェースが呼び出されたとき、通常の イベント構築手順に加えて以下の手順を実行します:

  1. eventInitDictdata メンバーが存在しない場合、イベントの data 属性を null に設定し、この手順を終了します。
  2. bバイト列を抽出するによって eventInitDict の "data" メンバーから得た結果とします。
  3. イベントの data 属性に、PushMessageData インスタンス(bytesb)を設定します。

data 属性は初期化時の値を返します。

notification 属性は初期化時の値を返します。

10.3 プッシュメッセージの受信

user agentpush serviceからpush messageを受信すると、 それはMUST次のステップを実行します。

  1. subscriptionを、push messageに対応するアクティブなpush subscriptionとします。

  2. registrationsubscriptionassociated service worker registrationとします。

  3. bytesをnullとします。

  4. もしpush messageがペイロードを含む場合:

    1. subscriptionに関連付けられたキーペアからの秘密鍵と[RFC8291]で説明されているプロセスを使用して、push messageのペイロードを復号化します。bytesを結果のbyte sequenceに設定します。

    2. もし、何らかの理由でpush messageのペイロードを復号化できなかった場合、acknowledge push messageし、これらのステップを中止します。

      Note

      pushイベントは、push messageに関連付けられたキーペアを使用して正常に復号化されなかったpush subscriptionに対しては発生しません。

  5. もしbytesがnullでない場合:

    1. baseURLsubscriptionscopeとします。

    2. originbaseURLoriginとします。

    3. fallbackTimestampcurrent coarsened wall timeとします。

    4. declarativeResultを、bytesoriginbaseURL、およびfallbackTimestampが与えられた場合のdeclarative push message parserを実行した結果とします。

    5. もしdeclarativeResultがfailureでない場合:

      1. notificationdeclarativeResultnotificationとします。

      2. notificationservice worker registrationregistrationに設定します。

      3. notificationShownをfalseとします。

      4. もしdeclarativeResultmutable がtrueで、registrationがnullでない場合:

        1. resultを、registration、null、およびnotificationを表す新しいNotification オブジェクトが与えられた場合のfiring a push eventの結果とします。

        2. もしresultがfailureでない場合、notificationShownresultnotification shownに設定します。

      5. もしnotificationShownがfalseの場合、notificationが与えられた場合のnotification show stepsを実行します。

      6. Acknowledge push messageし、これらのステップを中止します。

  6. もしregistrationがnullの場合、これらのステップを中止します。

  7. dataを、PushMessageDataオブジェクトとします。このオブジェクトのbytesは、もしbytesがnullでない場合はbytes、それ以外の場合はnullです。

  8. resultを、registrationdata、およびnullが与えられた場合のfiring a push eventの結果とします。

  9. もしresultがfailureで、同じpush messageservice worker registrationに複数回配信されたにもかかわらず成功しなかった場合、acknowledge push messageします。

  10. もしresultがfailureでない場合、acknowledge push messageします。

pushイベント結果は、 タプルであり、 notification shownboolean)を含みます。

pushイベントの発火は、 Service Worker登録 registrationPushMessageData オブジェクトまたは null datanotification または null notification を受け取り、以下の手順を実行します。失敗または pushイベント結果を返します。

  1. notificationResult を null で初期化します。

  2. registrationshowNotification()が正常に呼び出されたか を false に設定します。

  3. 機能的イベントの発火で "push" を PushEvent 型で registration に対して以下のプロパティで発火する:

    data
    data
    notification
    notification

    その後 dispatchedEvent を使って以下の手順を並列で実行:

    1. extend lifetime promises のすべてのpromiseが解決されるまで待機する。

    2. 正常に解決されなければ notificationResult を失敗に設定する。

    3. そうでなければ notificationResultregistrationshowNotification()が正常に呼び出されたか の値に設定する。

  4. notificationResult が null でなくなるまで待機する。

  5. notificationResult が失敗なら失敗を返す。

  6. Assert: notificationResultboolean である。

  7. (notificationResult) を返す。

プッシュメッセージを認識は、pushMessage を [RFC8030] に従い受信したことを認識することを意味します。

プッシュメッセージの認識は、 プッシュサービスが メッセージの配信を停止し、アプリケーションサーバーに成功を報告することになります。 これにより同じ プッシュメッセージプッシュサービスによって無限に再試行されるのを防ぎます。

認識はまた、アプリケーションサーバープッシュメッセージの 配信成功通知を誤って受け取る可能性があることも意味します。よって複数回の拒否を認めるべきであり、少なくとも3回の試行が推奨されます。

10.4 pushsubscriptionchange イベント

pushsubscriptionchange イベントは、 アプリケーションの制御外で プッシュ購読 が変更されたこと(例:更新、取り消し、喪失など)を示します。

"pushsubscriptionchange"イベントの発火は、 Service Worker登録 registrationnewSubscriptionoldSubscription を受け取り、 ユーザーエージェント機能的イベントの発火で "pushsubscriptionchange" を PushSubscriptionChangeEvent 型で registration に対して以下のプロパティで発火します:

newSubscription
newSubscription
oldSubscription
oldSubscription
Note

新しいpush subscriptionの詳細をapplication serverに送信する際は、[WEB-BACKGROUND-SYNC]のような、より信頼性の高い同期メカニズムを使用することを検討してください。ユーザーは、fetchが失敗する可能性のある信頼性の低いネットワーク状況にさらされる可能性があります。

10.4.1 PushSubscriptionChangeEvent インターフェース

WebIDL[Exposed=ServiceWorker, SecureContext]
interface PushSubscriptionChangeEvent : ExtendableEvent {
  constructor(DOMString type, optional PushSubscriptionChangeEventInit eventInitDict = {});
  readonly attribute PushSubscription? newSubscription;
  readonly attribute PushSubscription? oldSubscription;
};

newSubscription 属性は、取得時に初期化された値を返します。

oldSubscription 属性は、取得時に初期化された値を返します。

10.4.2 PushSubscriptionChangeEventInit インターフェース

WebIDLdictionary PushSubscriptionChangeEventInit : ExtendableEventInit {
  PushSubscription newSubscription = null;
  PushSubscription oldSubscription = null;
};

newSubscription メンバーは、push subscriptionの詳細を示します。これは、pushsubscriptionchange イベントの呼び出しごとに有効です。 この値は、たとえば、Webアプリケーションがexpress permissionを失ったために、新しいpush subscriptionを確立できなかった場合、 nullになります。

oldSubscription メンバーは、もはや使用SHOULD NOTでないpush subscriptionの詳細を示します。たとえば、部分的なデータベースの破損が原因で、user agentが詳細の完全なセットを提供できない場合、 値はnullになります。

11. アクセシビリティ

Push API は、プッシュサービスから受信したデータを提示する手段を自身では提供しません。代わりに、Push APIは他のAPI ― 主に Notifications API Standard ― に依存し、受信した情報をエンドユーザーに提示します。そのため、Push API自体にはアクセシビリティ要件はありません。ただし、[NOTIFICATIONS] などの仕様では、通知をアクセシブルな方法で提示するための指針が提供されています。

さらに、アクセシブルなインターフェースの提示には、プッシュメッセージで伝達できる以上の情報が必要になる場合があります。プッシュメッセージは少量のコンテンツや識別子の伝達に最適です。より大きなリソースはサーバーから取得する必要があります。

12. 適合性

この仕様のセクションで非規範的と明記されている部分に加え、全ての作成ガイドライン、図、例、注記は非規範的です。それ以外の全ては規範的です。

この文書における MAYMUSTMUST NOTSHOULDSHOULD NOT という用語は、 BCP 14 [RFC2119] [RFC8174] に記載された通り、ここに示すように全て大文字で現れた場合にのみ、その意味で解釈されます。

この仕様では、含まれるインターフェースを実装する単一の製品 ― ユーザーエージェント ― に適用される適合性基準を定義します。

A. IDL インデックス

WebIDLdictionary PushPermissionDescriptor : PermissionDescriptor {
  boolean userVisibleOnly = false;
};

[SecureContext]
interface mixin PushManagerAttribute {
  readonly attribute PushManager pushManager;
};
Window includes PushManagerAttribute;
ServiceWorkerRegistration includes PushManagerAttribute;

[Exposed=(Window,Worker), SecureContext]
interface PushManager {
  [SameObject] static readonly attribute FrozenArray<DOMString> supportedContentEncodings;

  Promise<PushSubscription> subscribe(optional PushSubscriptionOptionsInit options = {});
  Promise<PushSubscription?> getSubscription();
  Promise<PermissionState> permissionState(optional PushSubscriptionOptionsInit options = {});
};

[Exposed=(Window,Worker), SecureContext]
interface PushSubscriptionOptions {
  readonly attribute boolean userVisibleOnly;
  [SameObject] readonly attribute ArrayBuffer? applicationServerKey;
};

dictionary PushSubscriptionOptionsInit {
  boolean userVisibleOnly = false;
  (BufferSource or DOMString)? applicationServerKey = null;
};

[Exposed=(Window,Worker), SecureContext]
interface PushSubscription {
  readonly attribute USVString endpoint;
  readonly attribute EpochTimeStamp? expirationTime;
  [SameObject] readonly attribute PushSubscriptionOptions options;
  ArrayBuffer? getKey(PushEncryptionKeyName name);
  Promise<boolean> unsubscribe();

  PushSubscriptionJSON toJSON();
};

dictionary PushSubscriptionJSON {
  USVString endpoint;
  EpochTimeStamp? expirationTime = null;
  record<DOMString, USVString> keys;
};

enum PushEncryptionKeyName {
  "p256dh",
  "auth"
};

[Exposed=ServiceWorker, SecureContext]
interface PushMessageData {
  ArrayBuffer arrayBuffer();
  Blob blob();
  Uint8Array bytes();
  any json();
  USVString text();
};

[Exposed=ServiceWorker, SecureContext]
partial interface ServiceWorkerGlobalScope {
  attribute EventHandler onpush;
  attribute EventHandler onpushsubscriptionchange;
};

[Exposed=ServiceWorker, SecureContext]
interface PushEvent : ExtendableEvent {
  constructor(DOMString type, optional PushEventInit eventInitDict = {});
  readonly attribute PushMessageData? data;
  readonly attribute Notification? notification;
};

dictionary PushEventInit : ExtendableEventInit {
  PushMessageDataInit? data = null;
  Notification? notification = null;
};

typedef (BufferSource or USVString) PushMessageDataInit;

[Exposed=ServiceWorker, SecureContext]
interface PushSubscriptionChangeEvent : ExtendableEvent {
  constructor(DOMString type, optional PushSubscriptionChangeEventInit eventInitDict = {});
  readonly attribute PushSubscription? newSubscription;
  readonly attribute PushSubscription? oldSubscription;
};

dictionary PushSubscriptionChangeEventInit : ExtendableEventInit {
  PushSubscription newSubscription = null;
  PushSubscription oldSubscription = null;
};

B. 謝辞

編集者は、Firefox OS Pushメッセージソリューションを実装したMozillaおよびTelefónica Digitalのチーム、そして本ドキュメントに重要な技術的助言を提供した以下の方々に感謝の意を表します:Antonio Amaya、Miguel García Arribas、Ben Bangert、Kit Cambridge、José Manuel Cantera、JR Conlin、Albert Crespell、Matt Gaunt、Phil Jenvey、Guillermo López、Nikhil Marathe、John Mellor、Pınar Özlen、Fernando R. Sela、Shijun Sun、Doug Turner。

C. 参考文献

C.1 規格参考文献

[ANSI-X9-62]
Public Key Cryptography for the Financial Services Industry, The Elliptic Curve Digital Signature Algorithm (ECDSA). ANSI. 2005. URL: https://webstore.ansi.org/RecordDetail.aspx?sku=ANSI+X9.62%3a2005
[dom]
DOM Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
[DSS]
FIPS PUB 186-5: Digital Signature Standard (DSS). U.S. Department of Commerce/National Institute of Standards and Technology. 2023年2月3日. 国家標準. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf
[ecmascript]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/multipage/
[encoding]
Encoding Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://encoding.spec.whatwg.org/
[fileapi]
File API. Marijn Kruisselbrink. W3C. 2024年12月4日. W3C作業草案. URL: https://www.w3.org/TR/FileAPI/
[hr-time]
High Resolution Time. Yoav Weiss. W3C. 2024年11月7日. W3C作業草案. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[NOTIFICATIONS]
Notifications API Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://notifications.spec.whatwg.org/
[Permissions]
Permissions. Marcos Caceres; Mike Taylor. W3C. 2025年6月24日. W3C作業草案. URL: https://www.w3.org/TR/permissions/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. 1997年3月. 現行最良慣行. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC4648]
The Base16, Base32, and Base64 Data Encodings. S. Josefsson. IETF. 2006年10月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc4648
[RFC7231]
Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content. R. Fielding, Ed.; J. Reschke, Ed. IETF. 2014年6月. 提案標準. URL: https://httpwg.org/specs/rfc7231.html
[RFC7515]
JSON Web Signature (JWS). M. Jones; J. Bradley; N. Sakimura. IETF. 2015年5月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc7515
[RFC8030]
Generic Event Delivery Using HTTP Push. M. Thomson; E. Damaggio; B. Raymor, Ed. IETF. 2016年12月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc8030
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. 2017年5月. 現行最良慣行. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC8291]
Message Encryption for Web Push. M. Thomson. IETF. 2017年11月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc8291
[RFC8292]
Voluntary Application Server Identification (VAPID) for Web Push. M. Thomson; P. Beverloo. IETF. 2017年11月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc8292
[SERVICE-WORKERS]
Service Workers. Yoshisato Yanagisawa; Monica CHINTALA. W3C. 2025年3月6日. CRD. URL: https://www.w3.org/TR/service-workers/
[url]
URL Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://url.spec.whatwg.org/
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/

C.2 参考情報

[Fetch]
Fetch Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://fetch.spec.whatwg.org/
[WEB-BACKGROUND-SYNC]
Web Background Synchronization. W3C. Draft Community Group Report. URL: https://wicg.github.io/background-sync/spec/
[WebSockets]
WebSockets Standard. Adam Rice. WHATWG. Living Standard. URL: https://websockets.spec.whatwg.org/