rubywebsocketsinatraem-websocket

Send messages on different channels using sinatra-websocket


Is there a way to send messages on different channels using the sinatra-websocket gem?

Basically I'm trying to replace Pusher with sinatra-websocket. Here's what I'm doing with Pusher:

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

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

What would be the equivalent of that syntax in this sinatra-websocket snippet?

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 

Solution

  • Found an answer to this posted 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
    

    It's still quite verbose. I guess Pusher abstracts away all this through their API.