Phoenixは、WebSocketを提供するためにChannelという機構を持っています。少し探せば色々参考になるコードもあるのですが、テストコードも書いてみたのでここに備忘録としてのせておきます。
Pathの設定
Phoenix v1.2 の時点では、以下の通り endpoint.ex 内でWebSocketのコネクションを成功させるパスとその処理先を決めます。
https://github.com/KazuCocoa/my_chat_ex/blob/master/lib/my_chat_ex/endpoint.ex#L4
例えば、
socket "/socket", MyChatEx.UserSocket socket "/socket/other", MyChatEx.OtherSocket
とした時、 /socket にWebSocketで接続を確立するとその処理先は MyChatEx.UserSocket、 /socket/other に対しては MyChatEx.OtherSocket が処理先になります。
WebSocketの確立では、transportの指定が必要です。このtransportの指定により、Phoenix Frameworkでは処理対象がWebSocketか、Long pollingかを判定します。
これは、 user_socket.ex におけるChannel Routesの指定箇所で合わせて処理されます。具体的には、以下のようにwebsocketを指定します。
transport :websocket, Phoenix.Transports.WebSocket
これにより、最終的には以下のパスが構築され、このパスへのWebSocketの通信がそのまま MyChatEx.UserSocket などの処理へ通されます。
http://localhost:4000/socket/websocket ws://localhost:4000/socket/websocket
このパスは、たとえばChromeのinspectionにより確認可能です。
Channel
Channelにおける内部処理は use Phoenix.Channel によるコールバックの実装で最低限は実現可能になります。同期的に通信する応答や、非同期で行う通信など。
Channelに対する認証
このChannelには、認証をかけることが容易に出来ます。これをうまく使うと、WebSocketの確立なども認証されていないものは弾く、という処理が容易に可能です。
Test code
Channelに対するテストコードは以下
最後に
Elixir x Phoenixにて、このようなWebSocket実装などをBEAM VM上に構築できるというのは良いですね。それに特化した形でフレームワークのサポートもしていますし。