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もつけると遅延されなくなる。

IEはまだ使えないっぽいらしい

Android端末とかも対応する範囲は限られそう。

http://caniuse.com/eventsource

訂正: OperaOpera Mobileの勘違いでした。

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以降で改訂ということは、それ以前のブラウザだと、上の書き方じゃないと動かなかったりすることあるのかな。。。