Skip to content

Instantly share code, notes, and snippets.

@solisoft
Last active August 13, 2017 05:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save solisoft/363f27281ddc5447874844932156377f to your computer and use it in GitHub Desktop.
Save solisoft/363f27281ddc5447874844932156377f to your computer and use it in GitHub Desktop.
multi rooms kemal websockets server
require "kemal"
require "json"
connected_sockets = {} of String => Array(HTTP::WebSocket)
connected_users = {} of String => Hash(String, JSON::Any)
def broadcast(data, sockets)
sockets.each do |socket|
socket.send data.to_json
end
end
def list_of_users(users, sockets)
broadcast({action: "list", users: users.values.uniq}, sockets)
end
# ws /
# manage multi rooms via the query string
# client sample (create room r1):
# ws = new WebSocket('ws://localhost:3000/?room=r1');
ws "/" do |socket, env|
room = env.params.query["room"] rescue "global"
connected_sockets[room] ||= [] of HTTP::WebSocket
connected_users[room] ||= Hash(String, JSON::Any).new
connected_sockets[room].push socket
socket.on_message do |message|
msg = JSON.parse(message)
if msg["action"] == "login"
connected_users[room]["#{socket.object_id}"] = msg["from"]
list_of_users(connected_users[room], connected_sockets[room])
end
if msg["action"] == "message"
broadcast(
{action: "message", data: msg},
connected_sockets[room]
)
end
end
socket.on_close do |_|
connected_users[room].reject!(socket.object_id.to_s)
connected_sockets[room].delete(socket)
end
end
Kemal.run
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment