Socket structs are the objects that are stored in memory per connection and retain the persistent communication.
Sockets define one public method on_connect which can contain functionality that should run when a user connects, including authentication. This methods should return a Bool. If true
the socket will remain open. If false
the socket will be closed immediately.
An Amber::WebSockets::ClientSocket
instance has both cookies
and session
getters and are available from within the on_connect
method.
Socket structs also map topics to the channels they will connect with.
A socket can be generated by calling amber g socket Chat
struct ChatSocket < Amber::WebSockets::ClientSocket
channel "chat_room:*", ChatRoomChannel
def on_connect
# self.session and self.cookies available here
# do authentication here like
# !self.session[:user_id].nil?
# returning true accept all connections
true
end
end
A new route needs to be added so that a handshake can be established with the server. Notice how after \chat
, the struct ChatSocket
that was created
above is mapped to that route.
Amber::Server.configure do |app|
pipeline :web do
# pipelines...
end
routes :web do
# other routes,,,
websocket "/chat", ChatSocket
end
end
Amber::WebSockets::ClientSocket
provides a public class method broadcast
for publishing messages to all subscribers of a topic from within controllers or anywhere else in your application.
class HomeController < ApplicationController
def index
ChatSocket.broadcast("message", "chat_room:123", "message_new", {"message" => "A new visitor!"})
render("index.slang")
end
end