Sinatra Hijackerと
(Rack Hijacking API)の紹介
MinoriTokuda
Sinatra Hijacker
•Rack Hijacking API を利用して
SinatraからWebSocketを扱うプ
ラグイン
Rackとは
• RubyのWebアプリケーションとWebサーバをつ
なぐAPIおよびライブラリ群
• 以下の3つの仕様を持つ
1. Rackアプリケーションはcallメソッドをもつ
2. Rackサーバーはリクエストをパースした変数を
引数としてcallメソッドを呼び出す
3. callメソッドはレスポンスを配列形式で返す
シンプルに表すと・・・
status, header, body = @app.callenv
Rack Hijacking API
• Rack アプリの呼び出し前後でソケットを横取り
するAPI
• API呼び出し元にソケット通信の処理をすべて
委譲する完全ハイジャックと、ボディ部分への
処理を指定する部分ハイジャックがある
• Rack 1.5.0 で追加
コードで表すと・・・
• 完全ハイジャック
def call env
env[„rack.hijack‟].call
socket = env[„rack.hijack_io]
#IOオブジェクトが取り出される
・・・
コードで表すと・・・
• 部分ハイジャック
def call env
・・・
header[„rack.hijack‟] = ->io {
sleep 10
io.write „hogehoge‟
}
[status, header, body]
end
Sinatra Hijacker
• Sinatraのプラグインとして実装
• TubesockというライブラリでWebSocketをハン
ドリングしている
• get/post などと同様にwebsocketというメソッド
にブロックを渡すことで、websocketプロトコル
でアクセスされた場合の処理を記述
使用例
• プラグインなのでregisterしてください
class App <Sinatra::Base
register Sinatra::Hijacker
websocket „/ws‟ do
ws.onmessage{|msg|ws.send_data “hello #{msg}!”}
end
end
今後
• Sinatraのルーティングを利用するため中でリク
エストメソッドを書きかえている(イケテナ
イ)
• Tubesockの動作と現行のHijackAPI対応サーバ
(Pumaなど)とはあんまり相性がよくない
• Rackミドルウェアとして実装したい
• socket.ioみたいに long polling とwebsocketを自
動で切り替えるようにしたい
etc…
ありがとうございました
https://github.com/minoritea/sinatra-hijacker

Sinatra hijacker