Server-Sent Events覚え書き
なかなか書く機会はなかったのだけど、ふと使えそう!、という場面があったので、Server-Sent Eventsを書いてみたのでメモ。
レスポンスのContent-Typeはtext/event-stream
dataを組み立てる際は、改行(\r, \n, \r\n)をエスケープする。 http://www.w3.org/TR/eventsource/#parsing-an-event-stream
http://dev.ariel-networks.com/wp/archives/4168
任意に改行を入れられると、任意のイベントを定義されてしまうので、何らかの入力を元に出力するときには、改行コードのエスケープが必要。
UTF-8であること、という制約もあり、とりあえずはJSONにしておくのが扱いやすくてよさげ。
JSONにするときに改行はエンコードしてくれないことがあるっぽいので、そこを処理するか、改行で分割してからJSONにするのが良いっぽい。
idを指定しておくと、retry時にLast-Event-Idヘッダにどこまで受信したか教えつつリクエストしてくれる
reconnect/retryが仕様化されているのが非常にすばらですね。
bufferingされると少し遅延がある
frontにnginxがいて、proxy_bufferingがonのとき(デフォルトなのでだいたいのとき)は、X-Accel-Bufferingをoffもつけると遅延されなくなる。
HTML Media Captureの記述の仕方
webでHTML Media Captureについてググると、上の方にでてくるコンテンツはわりと、
<input type="file" accept="image/*;capture=camera" />
とか、
<input type="file" accept="image/*" capture="camera" />
とか書いてあったりするのだけど、http://www.w3.org/TR/html-media-capture/ を見たら、
partial interface HTMLInputElement { attribute boolean capture; };
のようになっていて、capture属性はbooleanになっているなー、ということで、
<input type="file" name="image" accept="image/*" capture>
のように書くらしい。
なんでだろーと思って調べてみたら、
http://www.w3.org/TR/2012/WD-html-media-capture-20120712/
のときの仕様だと、上の方の書き方で、最新のものだと、captureがbooleanになるらしい。
20120712以降で改訂ということは、それ以前のブラウザだと、上の書き方じゃないと動かなかったりすることあるのかな。。。