使用sinatra-websocket在不同通道上发送消息

时间:2013-06-30 00:40:51

标签: ruby websocket sinatra em-websocket

有没有办法使用sinatra-websocket gem在不同的频道上发送消息?

基本上我正试图用sinatra-websocket取代Pusher。这就是我和Pusher一起做的事情:

Pusher["my_channel_A"].trigger('some_event_type', my_message)

Pusher["my_channel_B"].trigger('another_event_type', my_message)

这个sinatra-websocket片段中的语法相当于什么?

request.websocket do |ws|
  ws.onopen do
    ws.send("Hello World!")
    settings.sockets << ws
  end
  ws.onmessage do |msg|
    EM.next_tick { settings.sockets.each{|s| s.send(msg) } }
  end
  ws.onclose do
    warn("websocket closed")
    settings.sockets.delete(ws)
  end
end 

1 个答案:

答案 0 :(得分:1)

找到了此帖here的答案:

get '/socket/live/game/:id' do 
    if !request.websocket?
        puts "Not a websocket request"
    else
        request.websocket do |ws|
            channel = params[:id]
            @con = {channel: channel, socket: ws}
            ws.onopen do
                ws.send("Hello World!")
                settings.sockets << @con
            end
            ws.onmessage do |msg|
                return_array = []
                settings.sockets.each do |hash|
                    #puts hash
                    #puts hash['channel']
                    if hash[:channel] == channel
                        #puts hash[:socket]
                        return_array << hash
                        puts "Same channel"
                        puts return_array
                    else
                        puts hash[:channel]
                        puts channel
                        puts "Not in same channel"
                    end
                end
                EM.next_tick { return_array.each{|s| s[:socket].send(msg) } }
            end
            ws.onclose do
                warn("websocket closed")
                settings.sockets.each do |hash|
                    if hash[:socket] == ws
                        settings.sockets.delete(hash)
                        puts "deleted"
                    else
                        puts "not deleted"
                    end
                end
            end
        end
    end
end

它仍然相当冗长。我猜Pusher通过他们的API抽象出所有这些。