この例のように、EventMachine で実行されている単純な Sinatra アプリがあります。
アプリは機能しています。Sinatra で定義しているルートが、作成された EventMachine チャネルを使用して websocket にアクセスできるようにしたいと思います。私は単純に次のことを試しましたが、もちろんSinatra App内では@channel
変数が定義されていないため、これは機能しません。
require 'em-websocket'
require 'sinatra'
EventMachine.run do
@channel = EM::Channel.new
class App < Sinatra::Base
get '/' do
erb :index
end
post '/test' do
@channel.push "Post request hit endpoint"
status 200
end
end
EventMachine::WebSocket.start :host => '0.0.0.0', :port => 8080 do |socket|
socket.onopen do
sid = @channel.subscribe { |msg| socket.send msg }
@channel.push "Subscriber ID #{sid} connected!"
socket.onmessage do |msg|
@channel.push "Subscriber <#{sid}> sent message: #{msg}"
end
socket.onclose do
@channel.unsubscribe(sid)
end
end
end
App.run! :port => 3000
end
Sinatra アプリ内で開いている EventMachine チャネルにアクセスするにはどうすればよいですか?