alepha@docs:~/docs/reference/primitives$
cat $channel.md2 min read
#$channel
#Import
typescript
1import { $channel } from "alepha/websocket";
#Overview
Channel primitive options / export interface ChannelPrimitiveOptions< TClient extends TWSObject, TServer extends TWSObject,
{ /**
- WebSocket endpoint path (e.g., "/ws/chat") */ path: string;
/**
- Optional description for documentation */ description?: string;
/**
- Message schemas for bidirectional communication
/
schema: {
/*
- Optional room ID schema validation
- Default: t.text() (any string)
- Can be enforced at application level: t.uuid(), t.regex(/^[a-f0-9-]{36}$/) */ roomId?: TString;
bash
/**
* Messages from server to client
* This is what clients will receive
*/
in: TClient;
/**
* Messages from client to server
* This is what the server will receive
*/
out: TServer;
}; }
/** Defines a WebSocket channel with specified client and server message schemas.
Channels must be defined as class properties to be registered in the Alepha context. They define the "vocabulary" for communication - the schema for messages flowing in both directions (server→client and client→server).
#Options
| Option | Type | Required | Description |
|---|---|---|---|
path |
string |
Yes | WebSocket endpoint path (e.g., "/ws/chat") |
description |
string |
No | Optional description for documentation |
schema |
Object |
Yes | Message schemas for bidirectional communication |
roomId |
TString |
No | Optional room ID schema validation Default: t.text() (any string) Can be enforced at application level: t.uuid(), t.regex(/^[a-f0-9-]{36}$/) |
in |
TClient |
Yes | Messages from server to client This is what clients will receive |
out |
TServer |
Yes | Messages from client to server This is what the server will receive |
#Examples
Server-side with $websocket
typescript
1class ChatController { 2 // Channel must be defined inside a class 3 chatChannel = $channel({ 4 path: "/ws/chat", 5 description: "Real-time chat channel", 6 schema: { 7 // Server → Client messages 8 in: t.union([ 9 t.object({10 type: t.const("append"),11 content: t.text(),12 username: t.text()13 }),14 t.object({15 type: t.const("system"),16 message: t.text()17 })18 ]),19 // Client → Server messages20 out: t.object({21 content: t.text()22 })23 }24 });25 26 chat = $websocket({27 channel: this.chatChannel,28 handler: async ({ message, reply }) => {29 await reply({30 message: { type: "append", content: message.content, username: "user" }31 });32 }33 });34}
Browser-side with useRoom
typescript
1// Define channel in a class for browser context 2class ChatClient { 3 chatChannel = $channel({ 4 path: "/ws/chat", 5 schema: { in: inSchema, out: outSchema } 6 }); 7} 8 9// Use in React component10function Chat() {11 const client = useInject(ChatClient);12 const chat = useRoom({ roomId: "lobby", channel: client.chatChannel, handler: ... }, []);13}