読者です 読者をやめる 読者になる 読者になる

珈琲駆動開発

RubyとRailsがおおい

Websocket-railsはどう動くのか

Rails Ruby JavaScript

なんか仕組み的な

ざっくりだと、「クライアント側のJavaScriptと、サーバーサイドのevent.rbがイベントを送受信しあう」って感じ。

まずWebsocketについて

以下を読めばだいたいわかります。他の抽象的な理論ばかりでなくHTTPのヘッダの内容からもWebsocketの実態を見てるので非常に分かりやすい。

http://south37.hatenablog.com/entry/2014/09/07/WebSocket%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%AA%BF%E3%81%B9%E3%81%A6%E3%81%BF%E3%81%9F%E3%80%82

Websocketのリクエストの実態はHTTPに準拠しつつ拡張したものだと認識して間違いはなさそう。

WebsoccketRails

websocket-railsが何をやっているのかは、以下を一度読んでおくのがいいかなと思います。分かりやすかったです :ok_woman:

http://www.school.ctc-g.co.jp/columns/masuidrive/masuidrive14.html

ソースはこちら。

https://github.com/websocket-rails/websocket-rails/tree/master/lib/websocket_rails

WebsocketRails::BaseController

WebsocketRails::BaseController(を継承したコントローラ)でのメソッドが決まってます。

Screenshot 2015-11-20 21.07.25.png

引用: http://www.school.ctc-g.co.jp/columns/masuidrive/masuidrive14.html

イベントのマッピング

events.rbは、URL/HTTPメソッドとアクションをマッピングするroutes.rbに似たような役割です。イベント名とアクションをマッピングして結びつけるのがevents.rbの役割です。

e.g.

WebsocketRails::EventMap.describe do
  # ...
  # websocket_chatイベントのマッピング
 subscribe :websocket_chat, to: WebsocketChatController, with_method: :message_recieve

end

以下のような形式で、WebsocketRails::EventMap.describeメソッドの引数のブロック内でDSLっぽく書けます。ノリがroutes.rbに似てますね。

subscribe #{イベント名}, to: #{コントローラとかアクション}

クライアントサイドの実装

アクションをchat#indexとすると、以下みたいに普通のRailsのcontrollerを生成するノリでいけます。

$ rails g controller chat index
   create app/controllers/chat_controller.rb
   route get 'chat/index'
   invoke  erb
   create app/views/chat
   create app/views/chat/index.html.erb

Websocket-railsでは、通常のWebsocketのAPIとは別にAPIが提供されているので、そちらをJavaScriptから叩いていく感じになります。メソッドは以下。

Screenshot 2015-11-20 21.19.44.png

引用: http://www.school.ctc-g.co.jp/columns/masuidrive/masuidrive14.html

bindして監視、triggerでdataを送信、って感じかな。

WebSocketでの接続先は常に「ws://ドメイン名/websocket」になっている。どのような処理でもURLは変わらずに、イベント名によってマッピング先を変更するという仕組みらしい。