<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><section><h1>仕様書</h1><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <cite xml:lang="en">RFC 8030 - Generic Event Delivery Using HTTP Push</cite>, <time>2020-03-09 00:13:33 +09:00</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://tools.ietf.org/html/rfc8030">https://tools.ietf.org/html/rfc8030</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="20" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[20]</anchor-end> <cite xml:lang="en-US">Push API</cite>, <time>2020-02-04 16:21:34 +09:00</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://w3c.github.io/push-api/#dfn-push-message">https://w3c.github.io/push-api/#dfn-push-message</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="160" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[160]</anchor-end> <cite xml:lang="en-US">Push API</cite>, <time>2020-02-04 16:21:34 +09:00</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://w3c.github.io/push-api/#events">https://w3c.github.io/push-api/#events</anchor-external><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> <cite xml:lang="en-US">Push API</cite>, <time>2020-02-04 16:21:34 +09:00</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://w3c.github.io/push-api/#receiving-a-push-message">https://w3c.github.io/push-api/#receiving-a-push-message</anchor-external></li></ul></li></ul></refs></section><section><h1>アプリケーションサーバーからプッシュサービスへ</h1><p><sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>プッシュメッセージの送信</anchor> </sw-see></p></section><section><h1>プッシュサービスから利用者エージェントへ</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="48" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[48]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ購読</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ購読集合</anchor>の両方がある場合、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ購読集合</anchor>を使って<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>を監視する<SHOULD xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">べきです</SHOULD>。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal> 6.1.</src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="30" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[30]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ購読資源</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ購読集合</anchor>に対し、
<code>GET</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>を送信して新しい<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>の配送を要求します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal> 6., 6.1.</src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="38" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[38]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>に
<code>Urgency:</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>を指定できます。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>Urgency:</anchor> </sw-see></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="43" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[43]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>は、
<code>Prefer:</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>に
<code>wait<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Prefer: wait</title></code>
を値 <code>0</code>
で指定 (<code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Prefer: wait</anchor>=0</code>) して、
即座に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>を送信するように求めることができます。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal> 6., 6.1.</src></p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="39" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[39]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュサービス</anchor>は
<code>Urgency:</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>を処理しなければなりません。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>Urgency:</anchor> </sw-see></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="53" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[53]</anchor-end> 
対象の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ購読</anchor>または<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ購読集合</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">満期</anchor>となった場合、
<code>404</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor>を返さなければ<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal> 7.3., 7.3.1.</src></p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="31" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[31]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュサービス</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>に対して<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor>しません。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP/2 server push</anchor>
によって<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>の内容を送信します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal> 6., 6.1.</src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="40" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[40]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュサービス</anchor>は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>ごとに、
<code>PUSH_PROMISE</code>
で
<code>GET</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>に送信します。
この <code>GET</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ資源</anchor>を取得するものです。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal> 6., 6.1.</src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="41" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[41]</anchor-end> 
それに対する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPヘッダー</anchor>で、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ購読</anchor>に対応する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュ資源</anchor>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL</anchor> を、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リンク関係型</anchor>
<code>urn:ietf:params:push</code>
で示す<SHOULD xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">べきです</SHOULD>。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal> 6.</src>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ購読集合</anchor>では、
示さなければ<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal> 6.1.</src>
<code>Link:</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>に指定できます。
これを使って<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ購読</anchor>を区別できます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="42" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[42]</anchor-end> その<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答本体</anchor>には、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーションサーバー</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュ資源</anchor>に送信した直近の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体本体</anchor>を指定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal> 6., 6.1.</src>
(と規定されていますが、直近のというのは意味がよくわかりません。
当該<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>を送るべきでしょう。)</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="44" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[44]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュサービス</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>の
<code>Prefer:</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>で
<code>wait<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Prefer: wait</title></code>
が
<code>0</code>
に設定されていた場合、
未配送の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>をすべて
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">server  push</anchor>
しなければ<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal> 6., 6.1.</src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="45" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[45]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュサービス</anchor>は、
<code>204</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor>を送信し、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">server push</anchor>
を送信しないことで、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>の不存在を示すことができます。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal> 6., 6.1.</src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="46" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[46]</anchor-end> このような規定の理由は名言されていませんが、
<code>wait=0<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Prefer: wait</title></code>
が指定されていない限り、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュサービス</anchor>は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>送信のタイミングを調整してよいということと思われます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="47" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[47]</anchor-end> 
特に明言されていないので、
<code>204</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor>を返しても、そのまま<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストリーム</anchor>を残し
(<code>END_STREAM</code> を送信せず)
随時 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">server push</anchor>
してもよいとみられます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="49" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[49]</anchor-end> 
仕様書では明文規定がありませんが、
例示によると、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュサービス</anchor>は適当なタイミングで最後に
<code>200</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor>を送り<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストリーム</anchor>を閉じてよいようです。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal> 6., 6.1.</src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="58" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[58]</anchor-end> 並行送信数を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>は
<code>SETTINGS_MAX_CONCURRENT_STREAMS</code> 
で指定することが<MAY xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">でき</MAY>、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュサービス</anchor>はこれに従い抑制<MAY xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">できます</MAY>。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal> 7.5.</src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="121" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[121]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>は、受信した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>について、
適用されるオプション指定との整合性を検査するべきです。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>PushSubscriptionOptions</anchor> </sw-see></p></section><section><h1>利用者エージェントからサービスワーカーへ</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="23" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[23]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュ購読</anchor>に関連付けられた<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">活性ワーカー</anchor>に配送されます。
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サービスワーカー</anchor>が動作中でなければ、起動されます。)
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="20" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;20</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュ購読</anchor><var>プッシュ購読</var>から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor><var>プッシュメッセージ</var>を受信したら、
次のようにしなければ<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;5</anchor-internal></src>。</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> 
<var>登録</var>を、
<var>プッシュ購読</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サービスワーカー登録</f>に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> <var>登録</var>が <code>null</code> の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> <var>データ</var>を、
<code>null</code>
に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> <var>プッシュメッセージ</var>が <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">payload</anchor> を持つ場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> <var>平文</var>を、
<var>プッシュメッセージ</var>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">payload</anchor>
を<var>プッシュ購読</var>について
<code>aes128gcm</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">復号</anchor>した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> <var>平文</var>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> <var>プッシュメッセージ</var>について受領肯定します。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>プッシュメッセージ資源</anchor> </sw-see></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> ここで停止します。<note xmlns="urn:x-suika-fam-cx:markup:ietf:html:3:draft:00:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> <var>プッシュメッセージ</var>は捨てられます。
<code>push<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">onpush</title></code>
を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">発火</anchor>しては<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。</p></note></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> 
<var>データ</var>を、新しい <code>PushMessageData</code> に設定します。<figure class="list members"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="18" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[18]</anchor-end> <code>PushMessageData</code></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト群<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">bytes (PushMessageData)</title></f></dt><dd><var>平文</var></dd></dl></figure></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[19]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">fire a functional event</anchor> します。<figure class="list members"><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">イベント型</f></dt><dd><code>push<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">onpush</title></code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">イベントインターフェイス</f></dt><dd><code>PushEvent</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">イベント対象</f></dt><dd><var>登録</var></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">data<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">PushMessageData</title></code></f></dt><dd><var>データ</var></dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">extended lifetime promises</anchor> がすべて<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">解決</anchor>された後の処理</dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="21" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[21]</anchor-end> すべてが成功裏に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">解決</anchor>されていた場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="22" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[22]</anchor-end> <var>プッシュメッセージ</var>を受領肯定します。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>プッシュメッセージ資源</anchor> </sw-see></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="24" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[24]</anchor-end> それ以外の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[25]</anchor-end> <var>プッシュメッセージ</var>と同じものが既に何度も配送されていて拒絶されていた場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[26]</anchor-end> <var>プッシュメッセージ</var>を受領肯定します。<note xmlns="urn:x-suika-fam-cx:markup:ietf:html:3:draft:00:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="27" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[27]</anchor-end> この場合、配送に失敗したにも関わらず、
成功したと通知されることになります。
何度も無限に再送されるのを防ぐためです。
それ以前に何度か拒絶されるのを許容する<SHOULD xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">べきです</SHOULD>。
最低3回は認めることが<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">推奨<rt xmlns="http://www.w3.org/1999/xhtml">recommend</rt></rubyb>されます。</p></note></li></ol></li></ol></li></ol></figure></dd></dl></figure></li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="161" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[161]</anchor-end> 
<code>ServiceWorkerGlobalScope</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インターフェイス</anchor>の
<dfn><code>onpush</code></dfn>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">属性</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">イベントハンドラーIDL属性</anchor>です。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="160" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;160</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="162" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[162]</anchor-end> 
<dfn><code>push<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">onpush</title></code></dfn>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">イベント</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュ購読</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>を受信したことを示します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="160" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;160</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> 
<code>PushEvent</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インターフェイス</anchor>は、
<code>ExtendableEvent</code>
を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">継承</anchor>しており、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サービスワーカー環境</anchor>に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">晒され</anchor>ます。
<code>SecureContext</code> でのみ利用可能です。
<dfn><code>PushEventInit</code></dfn>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">辞書</anchor>は、
<code>PushEvent</code>
に対応する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">辞書</anchor>で、
<code>ExtendableEventInit</code>
を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">継承</anchor>しています。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="160" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;160</anchor-internal></src></p><figure class="list short"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <code>PushEvent</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インターフェイスメンバー</anchor>、<code>PushEventInit</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">辞書メンバー</anchor></figcaption><ul><li><code>ExtendableEvent</code>, <code>ExtendableEventInit</code> を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">継承</anchor></li><li><code>data<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">PushMessageData</title></code></li></ul></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> 
<code>PushEvent</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">コンストラクター</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">イベントコンストラクター</anchor>ですが、
<code>data<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">PushMessageData</title></code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">属性</anchor>の処理があります。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="160" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;160</anchor-internal></src></p></section><section><h1>メモ</h1></section></body></html>