Documentation

Channels

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.

Channels

Introduction

All messages are routed through channels, and channel topics are where clients subscribe to listen for new messages. Channels define 3 public methods that can be used:

  • handle_joined - Called when a user joins a channel.
  • handle_message - Called when a user sends a message to a channel. A common message handler will simply rebroadcast the message to the other subscribers with rebroadcast! method.
  • handle_leave - Called when a user leaves the channel.

Example Usage

A channel can be generated by calling amber g channel ChatRoom.

Crystal
class ChatRoomChannel < Amber::Websockets::Channel

  # optional
  # Authorization can happen here  
  def handle_joined(client_socket, message)
    # channel join related functionality
    # if client_socket.session[:user_id] != message["payload"]["user_id"]
    #   client_socket.disconnect!
    # end
  end

  # required
  def handle_message(client_socket, msg)
    rebroadcast!(msg)
  end

  # optional
  def handle_leave(client_socket)
    # channel leave functionality    
  end
end

What happens when a user joins?

The handle_joined method is invoked when a user lands on a web page that has a new Amber.Socket established through the JavaScript on it. This method allows you to run any logic needed to authorize who should be connected to a channel. This is also a great way to send out a #{name} has joined the chat! message to all those currently listening to the channel.

How are messages broadcasted?

Whenever a user sends a message that is broadcasted through the JavaScript channel.push function, the handle_message method is invoked. Here the message is then rebroadcasted to all those who are connected to the channel. The message is then transmitted through the channel.on('message_new') listener in the JavaScript. Before the message gets broadcast, here is where you would want to insert records into your database, if you wanted to keep a history of messages sent or received.

What happens when a user leaves?

When a user leaves the web page that currently has an established socket connection, the connection breaks and triggers a message to be sent on the servers side. The handle_leave method handles this in the channels class. Here is where a message such as #{name} has left the chat! could be sent out to all connected clients.