1

有没有办法使用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 
4

1 回答 1

1

在这里找到了一个答案:

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 抽象出所有这些。

于 2013-10-26T05:23:15.143 回答