Peercast Streamというものを作りました。
Peercastのコメントをリアルタイムっぽく表示するツールを作りました。
http://peercast.in/
実装はEventSourceを使っているのでIEでは動きません。Firefox/Chrome/Safariで動作確認。道具はnginx reverse proxy + sinatra + 手製のしたらば掲示板クローラーです
sinatraはstreamingを簡単に実装するための仕組みがあってこれ使うとだいぶ楽でした。具体的なstreaming部分の実装はこんな感じ。↓
これで接続しっぱなしの状態のコネクションが作成される
get '/stream', provides: 'text/event-stream' do stream :keep_open do |out| settings.connections << out out << "data: connected\n\n" out.callback { settings.connections.delete(out) } end end
あとは別の場所で、settings.connectionsの配列にはいってるIOObject?に書き込みをすれば送信されます。書き込みをしてる側のコードはこんな感じ。
msg = "data: #{res.date_at.strftime("%T")} #{res.body.gsub(/\n/, "")} (#{res.channel.name.gsub(/\n/, "")})\n\n" puts msg settings.connections.each{ |out| out << msg }
わかりにくいかも
nginxはproxyするときにデフォルトだとバッファリングしてしまうみたいでEventsourceのstreamingと相性がわるいのかよくわからないですがうまく動作しなかったので以下の設定を追加しバッファリングしないようにしました。(あんま深く追いかけてない)
proxy_buffering off; proxy_redirect off;
このコード全体は、peercastの同人イベント? "きゃすけっと" で公開しようかなーと思ってます。以上です。