Documentation

Sockets

Browse documentation

Read this page as HTML, Markdown, or structured JSON—or open the published Markdown with an AI assistant. Gemini receives the prompt through your clipboard because its signed-out page does not reliably prefill URL text; paste when the new tab opens. External assistants need the public site URL.

Sockets

Introduction

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.

Example Usage

A socket can be generated by calling amber g socket Chat

Crystal
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

Add a new Route

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.

Crystal
Amber::Server.configure do |app|
  pipeline :web do
    # pipelines...
  end

  routes :web do
    # other routes,,,
    websocket "/chat", ChatSocket
  end
end

Send messages from controllers (or anywhere else)

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.

Crystal
class HomeController < ApplicationController
  def index
    ChatSocket.broadcast("message", "chat_room:123", "message_new", {"message" => "A new visitor!"})
    render("index.slang")
  end
end