Push API

W3C作業草案

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

概要

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

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

この文書のステータス

このセクションは、公開時点での 文書のステータスを説明します。現行のW3C 公開物およびこの技術レポートの最新改訂版は W3C標準・草案インデックスで参照できます。

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

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

この文書はドラフトであり、今後更新・置換・廃止される可能性があります。他の文書として引用するのは不適切です。進行中の作業としてのみ引用してください。

この文書は W3C 特許ポリシー の下で活動するグループによって作成されました。 W3C関連する特許開示の公開リスト を維持しています。そこには特許開示の方法も記載されています。ある個人が必須クレームを含むと考える特許を実際に知っている場合、 W3C特許ポリシー第6節に従い情報開示が必要です。

この文書は 2023年11月3日 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ドキュメントデータを持つプッシュメッセージです。ユーザーエージェントは、各受信プッシュメッセージを機会的に解析し、宣言的プッシュメッセージかどうかを宣言的プッシュメッセージパーサーを用いて判定します。

宣言的プッシュメッセージは、サービスワーカーの関与なしで通知の作成・表示を可能にします。ただし、アプリケーションサーバーが望めばサービスワーカーも関与可能です。その場合、プッシュメッセージの宣言的性質は、例えばストレージのプレッシャー等でサービスワーカーが破棄された場合のバックアップとして機能します。また、通知データの送信によりオブジェクト指向的なアプローチを提供します。

{
  "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

真偽値。

silent

真偽値。

requireInteraction

真偽値。

NotificationOptions 辞書との一貫性のためrequire_interactionとは名付けられていません。

data

任意のJSON値。

actions

以下のメンバーを持つJSONオブジェクトの配列で、すべてNotificationAction 辞書から派生しており、同時に管理されます。

action(必須)

文字列。

title(必須)

文字列。

navigate(必須)

URLを保持する文字列。

icon

URLを保持する文字列。

mutable

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

3.3.2 パーサー

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

宣言的プッシュメッセージパーサーは、バイト列 bytesオリジン originURL baseURLEpochTimeStamp fallbackTimestampを受け取り、以下の手順を実行します。失敗または宣言的プッシュメッセージパーサー結果を返します。

  1. messageを、バイト列からInfra値へのJSON解析bytesに対して行った結果とします。例外が発生した場合、失敗を返します。

  2. messageマップでない場合、失敗を返します。

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

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

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

  6. notificationInputマップでない場合、失敗を返します。

  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"]が存在しリストであり、 各要素32ビット符号なし整数の場合、 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値に変換notificationInput["data"]に対して実行した結果を設定します。

  25. notificationInput["actions"]が存在しリストの場合:

    1. notificationActionsを« »とします。

    2. actionInputnotificationInput["actions"]からイテレートします:

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

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

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

      4. actionNavigateactionInput["navigate"]を変換したものとします。

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

      6. actionInput["icon"]が存在し、文字列の場合、 notificationAction["icon"] にactionInput["icon"]を変換して設定します。

      7. 追加 notificationActionnotificationActionsに追加します。

    3. notificationOptions["actions"] にnotificationActionsを設定します。

  26. notificationを、通知の作成notificationTitlenotificationOptionsoriginbaseURLfallbackTimestampで実行した結果とします。例外が発生した場合、失敗を返します。

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

  28. notificationactionsに含まれる任意の通知アクションナビゲーションURLがnullの場合、失敗を返します。

  29. mutableをfalseとします。

  30. message["mutable"]が存在しし、 message["mutable"]が真偽値の場合、mutablemessage["mutable"]に設定します。

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

3.4 プッシュ購読

プッシュ購読は、ウェブアプリケーションのためにユーザーエージェントプッシュサービスの間に確立されるメッセージ配信コンテキストです。各プッシュ購読サービスワーカー登録に関連付けられ、サービスワーカー登録には最大1つのプッシュ購読のみが関連付けられます。

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

プッシュ購読には、購読有効期限が関連付けられる場合があります。設定されている場合、これは1970年1月1日00:00:00 UTCからのミリ秒単位の時刻で、購読が無効化される時刻です。ユーザーエージェントは購読の有効期限前に購読更新を試みるべきです。

プッシュ購読には、P-256 ECDH鍵ペアと認証シークレットの内部スロットがあり、[RFC8291]に準拠しています。これらのスロットはプッシュ購読作成時に必ず設定される必要があります。

ユーザーエージェントが何らかの理由で鍵を変更する必要がある場合、"pushsubscriptionchange"イベントを、関連するサービスワーカー登録registration)、旧鍵を持つPushSubscriptionインスタンス(oldSubscription)、新鍵を持つPushSubscriptionインスタンス(newSubscription)で発火する必要があります。

プッシュ購読の作成は、PushSubscriptionOptionsInit optionsDictionaryを受け取って以下の手順で実行されます:

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

3.4.1 購読の更新

ユーザーエージェントまたはプッシュサービスは、購読更新をいつでも行うことができます(例えば、一定期間経過後など)。

この場合、ユーザーエージェントは、現在のプッシュ購読作成時に提供されたPushSubscriptionOptionsプッシュ購読の作成手順を実行する必要があります。新しいプッシュ購読は元の購読とは異なる鍵ペアを持つ必要があります。

成功した場合、ユーザーエージェント必ず"pushsubscriptionchange"イベントを発火し、サービスワーカー登録プッシュ購読に関連付けられたもの)をregistration、初期のPushSubscriptionインスタンス(プッシュ購読を表す)をoldSubscription、新しいPushSubscriptionインスタンス(新しいプッシュ購読を表す)をnewSubscriptionとして指定します。

アプリケーションサーバーへの変更伝播のための猶予を与えるため、ユーザーエージェントは、更新後も短期間以前のプッシュ購読へのメッセージ受信を続ける場合があります。更新後にメッセージを受信したら、すべての古いプッシュ購読無効化される必要があります。

ユーザーエージェントプッシュ購読の更新に失敗した場合、定期的にリフレッシュを再試行するべきです。プッシュ購読が有効期限切れなどで利用できなくなった場合、ユーザーエージェント必ず"pushsubscriptionchange"イベントを発火し、サービスワーカー登録プッシュ購読に関連付けられているもの)をregistration、無効化されるPushSubscriptionインスタンス(プッシュ購読を表す)をoldSubscriptionnewSubscriptionにはnullを指定します。

3.4.2 購読の無効化

プッシュ購読無効化されると、ユーザーエージェントプッシュサービスは、その詳細の保存済みコピーを削除しなければなりません。その後、このプッシュ購読へのプッシュメッセージは配信してはなりません。

プッシュ購読は、関連付けられたサービスワーカー登録が登録解除されたときに無効化されますが、プッシュ購読はそれ以前に無効化される場合もあります。

プッシュ購読サービスワーカー登録がクリアされると削除されます。

3.5 プッシュサービス

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

ユーザーエージェントは、プッシュサービスに接続し、プッシュ購読を作成します。ユーザーエージェントは、利用可能なプッシュサービスの選択肢を制限する場合があります。これには、サービスの可用性(特定の国や職場ネットワークのファイアウォールによるブロックなど)、信頼性、バッテリー寿命への影響、特定のプッシュサービスへのメタデータ誘導や回避に関する契約などの性能関連の理由が含まれます。

3.6 権限

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

Permissions仕様との統合のため、本仕様は PushPermissionDescriptor 権限記述子型を定義します。

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

userVisibleOnlyuserVisibleOnlyと同じ意味を持ちます。

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

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

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

プッシュメッセージがウェブアプリケーションと同じオリジンを持つアプリケーションサーバーから送信された保証はありません。アプリケーションサーバーは、プッシュ購読の利用に必要な詳細を第三者と自由に共有可能です。

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

ユーザーエージェントは、ユーザーの明示的な許可なしにPush APIアクセスをウェブアプリケーションに提供してはなりません。ユーザーエージェントは、subscribe()メソッドの各呼び出し時にユーザーインターフェースを通じて許可の同意を取得する必要があります(すでに許可が保存されている場合や事前に信頼関係がある場合を除く)。現在のブラウジングセッションを超えて許可が保持される場合、それは取り消し可能でなければなりません。

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

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

権限が取り消された場合、ユーザーエージェントは、その権限で作成された購読について、任意で"pushsubscriptionchange"イベントを発火してもよいです。その際、サービスワーカー登録プッシュ購読に関連する)をregistrationPushSubscriptionインスタンス(プッシュ購読を表す)をoldSubscriptionnewSubscriptionにはnullを指定します。ユーザーエージェント必ず 影響を受ける購読を並列で無効化しなければなりません。

サービスワーカー登録が登録解除された場合、関連するプッシュ購読は必ず無効化されなければなりません。

プッシュエンドポイントは、プッシュサービス以外の主体(ユーザーのデバイス・識別・位置情報など)によってユーザーに関する情報を導出できるようにしてはなりません。詳細な要件は [RFC8030] のPrivacy Considerationsを参照してください。

無効化されたプッシュ購読プッシュエンドポイントは、新しいプッシュ購読に再利用してはなりません。これにより、ユーザーが削除できない永続的識別子の作成や、あるプッシュ購読の詳細を利用して別のプッシュ購読にメッセージを送信することを防ぎます。

ユーザーエージェントは、Push APIがセキュアコンテキストでのみ利用可能となるよう実装しなければなりません。これにより、プッシュ購読データの取得を目的とした中間者攻撃からユーザーをより保護できます。ブラウザは開発目的のみこのルールを無視する場合があります。

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();
  // アプリケーションサーバーに必要なpush購読の詳細が利用可能となり、例えば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. ServiceWorkerRegistration インターフェースへの拡張

Service Worker仕様はServiceWorkerRegistration インターフェース [SERVICE-WORKERS]を定義しており、本仕様はそれを拡張します。

WebIDL[SecureContext]
partial interface ServiceWorkerRegistration {
  readonly attribute PushManager pushManager;
};

pushManager属性はPushManagerを公開し、この属性が公開される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 = {});
};

supportedContentEncodings属性は、プッシュメッセージのペイロード暗号化に使用可能な対応コンテンツコーディングの配列を公開します。コンテンツコーディングは、プッシュサービスからプッシュメッセージ送信要求時にContent-Encodingヘッダフィールドで示されます。

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

7.1 subscribe() メソッド

subscribe()メソッドが呼び出された場合、以下の手順を実行しなければなりません:

  1. promise新しいpromiseとします。
  2. globalthis関連グローバルオブジェクトとします。
  3. promiseを返し、並列で続行します。
    : 検証順序はユーザーエージェントごとに異なる場合があります
  4. options引数のuserVisibleOnlyfalseで、ユーザーエージェントがtrueを要求する場合、グローバルタスクをキューし、ネットワーキングタスクソースglobalを使い、reject promise "NotAllowedError" DOMException
  5. options引数がapplicationServerKey メンバーの非null値を含まず、プッシュサービスが必須の場合、グローバルタスクをキューし、ネットワーキングタスクソースglobalを使い、reject promise "NotSupportedError" DOMException
  6. options引数がapplicationServerKey 属性の非null値を含む場合、以下のサブステップを実行:
    1. optionsapplicationServerKeyDOMStringの場合、base64urlエンコーディング [RFC7515]でデコードし、そのオクテット列を含むArrayBufferにセットする。
    2. デコード失敗時、グローバルタスクをキューし、ネットワーキングタスクソースglobalを使い、reject promise "InvalidCharacterError" DOMException でステップ終了。
    3. optionsapplicationServerKey がP-256曲線上の有効な点か確認。有効でない場合、グローバルタスクをキューし、ネットワーキングタスクソースglobalを使い、reject promise "InvalidAccessError" DOMException でステップ終了。
  7. registrationthisの関連サービスワーカー登録とする。
  8. registrationアクティブワーカーがnullの場合、グローバルタスクをキューし、ネットワーキングタスクソースglobalを使い、reject promise "InvalidStateError" DOMExceptionでステップ終了。
  9. permission"push"の使用許可を要求の結果とする。
  10. permissionが"denied"の場合、グローバルタスクをキューし、ユーザーインタラクションタスクソースglobalを使い、reject promise "NotAllowedError" DOMExceptionでステップ終了。
  11. registrationプッシュ購読がある場合:
    1. subscriptionregistrationプッシュ購読の取得結果とする。エラーがあれば、グローバルタスクをキューし、ネットワーキングタスクソースglobalを使い、reject promise "AbortError" DOMException でステップ終了。
    2. options引数とsubscriptionoptions属性を比較。BufferSource値は参照でなく内容の等価性で比較する。
    3. optionsの任意の属性がsubscriptionに保存された値と異なる場合、グローバルタスクをキューし、ネットワーキングタスクソースglobalを使い、reject promise "InvalidStateError" DOMException でステップ終了。
    4. リクエスト完了時、グローバルタスクをキューし、ネットワーキングタスクソースglobalを使い、resolve promise subscriptionでステップ終了。
  12. subscriptionを、optionsプッシュ購読の作成を試みた結果とする。購読の作成時に例外を投げる場合は、グローバルタスクをキューし、ネットワーキングタスクソースglobalを使い、reject promiseをその例外で拒否して、以降の手順を終了する。
  13. それ以外の場合、グローバルタスクをキューし、ネットワーキングタスクソースglobalを使い、resolve promise 新しいsubscriptionPushSubscription詳細で。

getSubscriptionメソッドが呼び出された場合、以下の手順を実行しなければなりません:

  1. promise新しいpromiseとします。
  2. promiseを返し、以下の手順を非同期で継続します。
  3. Service Workerが購読されていない場合、promiseをnullで解決。
  4. プッシュ購読を関連するService Workerから取得。
  5. エラーがあれば、promiseDOMException(名前は"AbortError")で拒否し、手順終了。
  6. リクエスト完了時、promisePushSubscription 取得したプッシュ購読の詳細で解決。

permissionState()メソッドが呼び出された場合、以下の手順を実行しなければなりません:

  1. promise新しいpromiseとします。
  2. promiseを返し、以下の手順を非同期で継続します。
  3. descriptorを新しいPermissionDescriptor とし、name を"push"で初期化。
  4. statedescriptor権限状態とその結果とします。
  5. promisestateで解決。

プッシュサービスの使用権限は永続的であり、有効な権限が存在すれば後続の購読で再確認不要です。

権限取得が必要な場合は、 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] 附属書A(65オクテット、先頭は0x04オクテット)で示される非圧縮形式。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. key変数に新規インスタンス化したArrayBufferを初期化します。
  4. 内部スロットが非対称鍵ペアを含む場合、keyの内容を鍵ペアの公開鍵の直列化値で設定します。直列化方式は名前を定義する仕様で定められます。例:[RFC8291]では"p256dh"公開鍵は[ANSI-X9-62]附属書A(65オクテット、先頭は0x04)で定義される非圧縮形式で符号化されます。
  5. それ以外の場合、内部スロットが対称鍵を含むなら、keyの内容をスロットの値のコピーで設定します。例:authパラメータはユーザーエージェントアプリケーションサーバーから送信されるメッセージの認証に使うオクテット列です。
  6. keyを返します。

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

unsubscribe()メソッドが呼び出された場合、以下の手順を実行しなければなりません:

  1. promise新しいpromiseとします。
  2. promiseを返し、以下の手順を非同期で継続します。
  3. プッシュ購読がすでに無効化されている場合、promisefalseで解決し、手順終了。
  4. 以下の手順を並列で実行:
    1. プッシュ購読を無効化します。ユーザーエージェントは以降このプッシュ購読に対するプッシュメッセージを配信してはなりません。

      ユーザーエージェントがネットワーク障害等でプッシュサービス購読無効化の要求ができなかった場合、適切な期間再試行すべきです。

  5. promisetrueで解決します。

toJSON()メソッドが呼び出された場合、以下の手順を実行しなければなりません:

  1. jsonを新しいPushSubscriptionJSON辞書とします。
  2. json["endpoint"]にendpoint属性取得の結果を設定します。
  3. json["expirationTime"]にexpirationTime属性取得の結果を設定します。
  4. keysrecord<DOMString, USVString>の新しい空インスタンスとします。
  5. PushSubscriptionの内部スロットにある鍵名ごとに、鍵名で昇順に:
    1. 内部スロットが非対称鍵ペアなら、bに鍵名iに対応する公開鍵を鍵名定義の符号化方式で符号化した値を設定(getKey()参照)。
    2. それ以外の場合、bgetKeyで返される値を設定。
    3. sbをURLセーフbase64符号化(パディングなし)[RFC4648]し、ユーザーエージェントbの値による分岐のない直列化方式を使う必要があります。
    4. keys[i]にsを設定。
  6. json["keys"]にkeysを設定。
  7. jsonを返します。

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

keysレコードには PushEncryptionKeyName の各エントリに対応するURLセーフbase64符号化表現([RFC4648])が含まれます。

PushSubscriptionのオプションは直列化されないことに注意してください。

8.1 PushEncryptionKeyName 列挙型

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

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

p256dh値は、[RFC8291]で説明されるP-256 ECDH Diffie-Hellman公開鍵取得に使用されます。

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()メソッドの手順は、内容がthisbytesである新しいBlobオブジェクトを返します。

bytes()メソッドの手順は、内容がthisbytesであるArrayBufferに裏付けられた新しいUint8Arrayを返します。ArrayBufferオブジェクトの作成時に例外が発生した場合は再スローします。

json()メソッドの手順は、JSONバイト列をJavaScript値に変換thisbytesに対して実行した結果を返します。

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

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

  1. bytesを空のバイト列とします。
  2. objectの型によって分岐:
    BufferSource
    bytesobjectの内容のコピーを設定。
    USVString
    bytesobjectutf-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;

PushEvent インターフェースまたは継承インターフェースのconstructor呼び出し時、通常のイベント構築手順に加え、以下の手順を実行します:

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

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

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

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

ユーザーエージェントプッシュサービスからプッシュメッセージを受信した際は、以下の手順を必ず実行します。

  1. registration該当するサービスワーカー登録とする。
  2. registrationが見つからない場合、手順を中止。
  3. subscriptionregistrationのアクティブなプッシュ購読とする。
  4. bytesをnullとする。
  5. プッシュメッセージがペイロードを含む場合:
    1. プッシュメッセージのペイロードをsubscriptionに関連付けられた鍵ペアの秘密鍵で復号し、[RFC8291]の手順に従う。bytesに復号結果のバイト列を設定。
    2. 何らかの理由でプッシュメッセージペイロードが復号できなかった場合、プッシュメッセージの受領確認を行い、手順を中止。

      pushイベントは、購読に関連付けられた鍵ペアで復号できなかったプッシュメッセージには発火しません。

  6. bytesがnullでない場合:

    1. baseURLregistrationスコープURLとする。

    2. originbaseURLオリジンとする。

    3. fallbackTimestamp現在の粗化ウォールタイムとする。

    4. declarativeResultを、宣言的プッシュメッセージパーサーbytes, origin, baseURL, fallbackTimestampで実行した結果とする。

    5. declarativeResultが失敗でない場合:

      1. notificationdeclarativeResultnotificationとする。

      2. notificationサービスワーカー登録registrationに設定。

      3. notificationShownをfalseとする。

      4. declarativeResultmutable がtrueの場合:

        1. resultpushイベントの発火registration, null, notificationの新しいNotificationオブジェクトで実行した結果とする。

        2. resultが失敗でない場合、notificationShownresultnotification shownに設定。

      5. notificationShownがfalseの場合、通知表示手順notificationで実行。

      6. プッシュメッセージの受領確認を行い、手順を終了。

  7. dataを、bytesがnullでなければbytesで初期化された新しいPushMessageDataオブジェクト、そうでなければnullとする。

  8. resultpushイベントの発火registration, data, nullで実行した結果とする。

  9. resultが失敗で、同じプッシュメッセージが複数回サービスワーカー登録に失敗して配信された場合、プッシュメッセージの受領確認を行う。

  10. resultが失敗でなければ、プッシュメッセージの受領確認を行う。

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

pushイベントの発火は、サービスワーカー登録registrationPushMessageDataオブジェクトまたはnulldatanotificationまたはnullnotificationで、以下の手順を実行。失敗またはpushイベント結果を返す。

  1. notificationResultをnullとする。

  2. registrationshowNotification()の正常呼び出し有無をfalseに設定。

  3. 「push」という機能的イベントを発火し、PushEventregistration上で以下のプロパティとともに使用します:

    data
    data
    notification
    notification

    その後、dispatchedEventで以下の手順を並列で実行:

    1. dispatchedEvent延長ライフタイムpromiseすべてが解決されるまで待機。

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

    3. 正常に解決された場合、notificationResultregistrationshowNotification()の正常呼び出し有無に設定。

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

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

  6. Assert: notificationResult真偽値である。

  7. (notificationResult)を返す。

プッシュメッセージの受領確認は、pushMessage に対し、[RFC8030]に従い受領確認を行うことを意味します。

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

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

10.4 pushsubscriptionchange イベント

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

pushsubscriptionchangeイベントの発火は、サービスワーカー登録registrationnewSubscriptionoldSubscriptionで、ユーザーエージェント"pushsubscriptionchange"という機能的イベントを発火 し、PushSubscriptionChangeEventregistration上で以下のプロパティを指定します:

newSubscription
newSubscription
oldSubscription
oldSubscription

新しいプッシュ購読の詳細をアプリケーションサーバーに送信する際は、[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メンバーは、pushsubscriptionchangeイベント呼び出しごとに有効なプッシュ購読を示します。新しいプッシュ購読が確立できない場合(例:ウェブアプリケーションが明示的な許可を失ったなど)は値はnullになります。

oldSubscriptionメンバーは、もはや利用すべきでないプッシュ購読を示します。ユーザーエージェントが完全な詳細を提供できない場合(例:データベースの部分的な破損など)は値は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]
partial interface ServiceWorkerRegistration {
  readonly attribute PushManager pushManager;
};

[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現行標準. Anne van Kesteren. WHATWG. 現行標準. URL: https://dom.spec.whatwg.org/
[DSS]
FIPS PUB 186-5: Digital Signature Standard (DSS). 米国商務省/NIST. 2023年2月3日. 国家標準. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf
[ecmascript]
ECMAScript言語仕様. Ecma International. URL: https://tc39.es/ecma262/multipage/
[encoding]
Encoding現行標準. Anne van Kesteren. WHATWG. 現行標準. 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現行標準. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra現行標準. Anne van Kesteren; Domenic Denicola. WHATWG. 現行標準. URL: https://infra.spec.whatwg.org/
[NOTIFICATIONS]
Notifications API現行標準. Anne van Kesteren. WHATWG. 現行標準. 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月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC4648]
The Base16, Base32, and Base64 Data Encodings. S. Josefsson. IETF. 2006年10月. Proposed Standard. 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月. Proposed Standard. URL: https://httpwg.org/specs/rfc7231.html
[RFC7515]
JSON Web Signature (JWS). M. Jones; J. Bradley; N. Sakimura. IETF. 2015年5月. Proposed Standard. 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月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8030
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. 2017年5月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC8291]
Message Encryption for Web Push. M. Thomson. IETF. 2017年11月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8291
[RFC8292]
Voluntary Application Server Identification (VAPID) for Web Push. M. Thomson; P. Beverloo. IETF. 2017年11月. Proposed Standard. 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現行標準. Anne van Kesteren. WHATWG. 現行標準. URL: https://url.spec.whatwg.org/
[WEBIDL]
Web IDL現行標準. Edgar Chen; Timothy Gu. WHATWG. 現行標準. URL: https://webidl.spec.whatwg.org/

C.2 参考情報

[Fetch]
Fetch現行標準. Anne van Kesteren. WHATWG. 現行標準. 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現行標準. Adam Rice. WHATWG. 現行標準. URL: https://websockets.spec.whatwg.org/