3

この例のように、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 チャネルにアクセスするにはどうすればよいですか?

4

1 に答える 1

3

コメントで何について話しているのか他の人が知らない場合のために、私が提案した方法でクラス インスタンス変数を使用する例を次に示します。これは実行されますが、期待どおりに動作するかどうかはわかりません:

require 'em-websocket'
require 'sinatra'
require 'haml'

module Example

  def self.em_channel
    @em_channel ||= EM::Channel.new
  end

  EventMachine.run do

    class App < Sinatra::Base
      configure do
        enable :inline_templates
      end

      get '/' do
        haml :index
      end

      get '/test' do
        Example.em_channel.push "Test request hit endpoint"
        status 200
      end
    end


    EventMachine::WebSocket.start :host => '0.0.0.0', :port => 8080 do |socket|
      socket.onopen do
        sid = Example.em_channel.subscribe { |msg| socket.send msg }
        Example.em_channel.push "Subscriber ID #{sid} connected!"

        socket.onmessage do |msg|
          Example.em_channel.push "Subscriber <#{sid}> sent message: #{msg}"
        end

        socket.onclose do
          Example.em_channel.unsubscribe(sid)
        end
      end
    end

    App.run!
  end
end

__END__

@@ layout
%html
  = yield

@@ index
%div.title Hello world.
于 2012-12-30T10:42:33.320 に答える