@ledsun blog

無味の味は佳境に入らざればすなわち知れず

Async::WebSocket gemの素振り その3

Async::WebSocket gemの素振り その2 - @ledsun blog でAsync::WebSocketのプリミティブな使い方をしてみたものの、ブロックの動きがイマイチ上手く追えません。 もっとシンプルになるようにWebSocketサーバーを改造します。

require 'async/websocket/adapters/http'
require "protocol/rack/request"
require "protocol/rack/adapter"

class App
  def self.call(env)
    req = ::Protocol::Rack::Request[env]

    res = Async::WebSocket::Adapters::HTTP.open(req) do |conn|
      # Echo back!
      while message = conn.read
        conn.write message
      end
    end

    Protocol::Rack::Adapter.make_response(env, res)
  end
end

run App

ここからAsync::WebSocketのメソッドを展開していけば、もう少し動きがイメージできそうな気がします。

Clientのコードや動作確認方法は前回と一緒です。

#!/usr/bin/env ruby
# frozen_string_literal: true

require "async"
require "async/http"
require "async/websocket"

URL = "ws://localhost:8000/"

Async do |task|
  endpoint = Async::HTTP::Endpoint.parse URL,
                                         alpn_protocols: Async::HTTP::Protocol::HTTP11.names

  connection = Async::WebSocket::Client.connect(endpoint)
  message = Protocol::WebSocket::TextMessage.generate("Hello World!")
  connection.write message
  connection.flush

  recive_message = connection.read
  puts message.parse

  connection.close
end
bundle exec falcon serve --bind "http://localhost:8000"
./client.rb