/
562.txt
281 lines (227 loc) · 9.49 KB
/
562.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
[21]
[DFN[[RUBYB[プッシュメッセージ][push message]]]]は、
[[プッシュ配信]]されるメッセージです。
* 仕様書
[REFS[
- [1] [CITE@en[RFC 8030 - Generic Event Delivery Using HTTP Push]], [TIME[2020-03-09 00:13:33 +09:00]] <https://tools.ietf.org/html/rfc8030>
- [20] [CITE@en-US[Push API]], [TIME[2020-02-04 16:21:34 +09:00]] <https://w3c.github.io/push-api/#dfn-push-message>
- [24] [CITE@en-US[Push API]], [TIME[2020-02-04 16:21:34 +09:00]] <https://w3c.github.io/push-api/#dom-pushmanager-supportedcontentencodings>
- [28] [CITE@en-US[Push API]], [TIME[2020-02-04 16:21:34 +09:00]] <https://w3c.github.io/push-api/#pushmessagedata-interface>
- [23] [CITE@en-US[Push API]], [TIME[2020-02-04 16:21:34 +09:00]] <https://w3c.github.io/push-api/#events>
]REFS]
* 意味
[2]
[[Web Push]] の定義では、
[DFN[[RUBYB[プッシュメッセージ][push message]]]]は、
[[アプリケーションサーバー]]から[[利用者エージェント]]へと[[プッシュサービス]]を介して送られる[[メッセージ]]です。
[SRC[>>1 1.1.]]
[22]
[[Push API]] の定義では、
[DFN[[RUBYB[プッシュメッセージ][push message]]]]は[[アプリケーションサーバー]]から
[[Webアプリケーション]]に送信されるデータです。
[SRC[>>20]]
[3]
[[RFC 8030]] がただ「message」とのみ書いているときでも、多くは[[プッシュメッセージ]]とみられます。
[4]
[DFN[[RUBYB[プッシュメッセージ資源][push message resource]]]]は、
[[プッシュサービス]]が、
配送を受理した[[プッシュメッセージ]]を識別するべく作成するものです。
[[利用者エージェント]]による[[プッシュメッセージ]]の受領肯定で、
削除されます。
[SRC[>>1 2.1.]]
* 特性
[5] [[プッシュメッセージ]]の本体は、
[[HTTPメッセージ]]の[[本体]]で与えられたデータです。
[[Web Push Protocol]] としては制限はないようです。
[[Push API]]
が使う[[内容符号化]] [CODE[aes128gcm]]
は[[暗号化]]された[[バイト列]]としています。
[18] [[Web Push Protocol]]
を使う[[応用][アプリケーション (プッシュ)]]は、
[[末端対末端]]で[[機密性]]、
[[一貫性]]、
データ起源[[認証]]を提供する機構を用いなければ[MUST[なりません]]。
[[Push API]]
は
[CODE[aes128gcm]]
でこれを実現しています。
[SRC[>>1 8.1.]]
[[利用者エージェント]]は
[CODE[aes128gcm]]
に対応しなければ[MUST[なりません]]
[SRC[>>24]]。
互換性のため、以前の [[I-D]] で定義されていた版にも対応して[MAY[構いません]]
[SRC[>>24]]
(が、いずれ廃止される想定とみられます)。
[25]
[CODE[PushManager]]
[[インターフェイス]]の
[DFN[[CODE[supportedContentEncodings]]]]
[[属性]] [SRC[>>24]] は、
次のようにしなければ[MUST[なりません]]。
[FIG(steps)[
= [26]
[CODE[SameObject]]:
[[プッシュメッセージ]]の [[payload]]
の[[暗号化]]に使える[[内容符号化]]の
[CODE[[[FrozenArray]]<[[DOMString]]>]]
を返します [SRC[>>24]]。
]FIG]
-*-*-
[27] [DFN[[CODE[PushMessageData]]]]
[[インターフェイス]] [SRC[>>28]]
は、
[[プッシュメッセージ]]のデータを表します。
[[サービスワーカー環境]]に[[晒され]]ます
[SRC[>>28]]。
[CODE[SecureContext]] のみ利用可能です [SRC[>>28]]。
[30] 状態として[F[バイト群][bytes (PushMessageData)]]を持ちます。
[FIG(list short)[ [29] [CODE[PushMessageData]] の[[メンバー]]
- [CODE[arrayBuffer][bytes (PushMessageData)]]
- [CODE[json][bytes (PushMessageData)]]
- [CODE[text][bytes (PushMessageData)]]
- [CODE[blob][bytes (PushMessageData)]]
]FIG]
[31]
[CODE[PushEvent]] [[インターフェイス]]の
[DFN[[CODE[data][PushMessageData]]]]
[[属性]]の[[取得器]] [SRC[>>23]] は、
次のようにしなければ[MUST[なりません]]。
[FIG(steps)[
= [32] [[文脈オブジェクト]]の
[F[[CODE[data][PushMessageData]]]]
を返します [SRC[>>23]]。
]FIG]
[33]
[CODE[PushEventInit]] [[辞書]]の
[DFN[[CODE[data][PushMessageData]]]]
メンバー [SRC[>>23]] は、
[CODE[PushEvent]]
[[インターフェイス]]の
[CODE[data][PushMessageData]]
に対応します。値は
[CODE[PushMessageDataInit]] とされています [SRC[>>23]]
が、他に
[CODE[null]]
もあり得るようです。
既定値は
[CODE[null]] です。
[36]
[CODE[PushEvent]]
[[インターフェイス]]の[[イベント構築手順群]]の
[CODE[data][PushMessageData]]
の処理は、
[VAR[辞書]]と[VAR[イベント]]について、
次のようにします。
[SRC[>>23]]
[FIG(steps)[
= [37] [VAR[辞書]]の [F[[CODE[data][PushMessageData]]]] が [CODE[null]] でない場合、
== [41] [VAR[イベント]]の
[F[[CODE[data][PushMessageData]]]]
を、
新しい [CODE[PushMessageData]]
に設定します。
[FIG(list members)[ [42] [CODE[PushMessageData]]
: [F[バイト列][bytes (PushMessageData)]] :
[[extract a byte sequence]]
を[VAR[辞書]]の
[F[[CODE[data][PushMessageData]]]]
について実行した結果
]FIG]
]FIG]
[34]
[DFN[[CODE[PushMessageDataInit]]]]
は、
[CODE[BufferSource]]
または
[CODE[USVString]]
に
[[typedef]]
されています。
[SRC[>>23]]
[35]
[VAR[オブジェクト]]について
[DFN[extract a byte sequence]]
するには、
次のようにします。
[SRC[>>28]]
[FIG(steps)[
= [18] [VAR[オブジェクト]]が [CODE[BufferSource]] の場合、
== [19] [VAR[オブジェクト]]の内容の複製を返します。
= [20] [VAR[オブジェクト]]が [CODE[USVString]] の場合、
== [21] [VAR[オブジェクト]]を [[UTF-8符号化]]した結果を返します。
]FIG]
-*-*-
[6] [[プッシュメッセージ]]には、
有効期限があります。
[SEE[ [[TTL:]] ]]
期限到来後未配送の[[プッシュメッセージ]]は捨てられます。
[[プッシュメッセージ資源]]も削除されるかもしれません。
[7] [[プッシュメッセージ]]には、
緊急度があります。
[SEE[ [[Urgency:]] ]]
* 作成
[10] [[プッシュメッセージ]]は、
[[アプリケーションサーバー]]が[[プッシュサービス]]の[[プッシュ資源]]へと送信することで作成されます。
受理した[[プッシュサービス]]は、対応する[[プッシュメッセージ資源]]を作成します。
[19] [[プッシュメッセージ資源]]の [[URL]]
は、
[[プライバシー]]のため、
[[プッシュメッセージ購読]]間の関係性を含むものであっては[MUST[なりません]]。
関連付けられた[[プッシュメッセージ購読]]との関係や、
同じ[[プッシュメッセージ購読]]の他の[[プッシュメッセージ]]との関係を示すものであるのは[MAY[構いません]]。
[[利用者]]や[[装置]]の情報を含めては[MUST[なりません]]。
同じ[[プッシュメッセージ購読]]に関連付けられた[[プッシュメッセージ資源]]の
[[URL]] から[[利用者エージェント]]との関係を知れるものであっては[MUST[なりません]]。
[SRC[>>1 8.2.]]
* 受信
[8] [[プッシュメッセージ]]は、
[[プッシュサービス]]から[[利用者エージェント]]へと、
[[プッシュメッセージ購読]]や[[プッシュメッセージ購読集合]]の[[要求]]に対する
[[server push]] で配送されます。
[SEE[ [[プッシュメッセージの受信]] ]]
[9] [[プッシュメッセージ]]の[[利用者エージェント]]の送信では、
[[プッシュメッセージ資源]]が使われます。
[[受領証]]の[[アプリケーションサーバー]]への送信では、
同じ[[プッシュメッセージ資源]]が使われます。
両者は同じ [[URL]] の [CODE[GET]]
でありながら、内容も意味も違います。
[17]
理論上、
[[server push]] の[[意味論]]的には、
[[プッシュメッセージ資源]]を直接 [CODE[GET]]
することでも同じようにアクセスできるはずですが、
このような特殊な構造になっている以上、
[[server push]] 以外の方法で使うことは考えられていないのでしょう。
* 受領
[11]
[[利用者エージェント]]は、
[[プッシュメッセージ]]を最低1回は配送されたことを示す、
受領肯定を表明しなければ[MUST[なりません]]。
[SRC[>>1 6.2.]]
[12]
[[利用者エージェント]]は、
[[プッシュメッセージ資源]]に
[CODE[DELETE]]
[[要求]]を送らなければ[MUST[なりません]]
[SRC[>>1 6.2.]]。
[16]
[CODE[DELETE]]
に対して[[プッシュサービス]]が送るべき[[応答]]は、特に規定されていません。
[CODE[200]] や [CODE[204]]
が適当でしょうか。
[CODE[DELETE]] が既に行われている場合などのエラー処理も特に規定がありません。
[14]
[[プッシュサービス]]は、
十分な時間内に肯定を受信しない場合、
未配送とみなします。
[CODE[TTL:]] 到来まで配送を試み続ける[SHOULD[べきです]]。
[SRC[>>1 6.2.]]
[15]
[[プッシュサービス]]は、
それ以前でも事情に鑑み適宜再配送を中断して[MAY[構いません]]。
[SRC[>>1 6.2.]]
[13]
受領されたかどうか、
[[プッシュサービス]]は[[受領証購読]]に適宜通知する必要があります。
* メモ