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