branch:
connections-agent.ts
1500 bytesRaw
import { callable, type Connection, type ConnectionContext } from "agents";
import { PlaygroundAgent as Agent } from "../../shared/playground-agent";

export interface ConnectionsAgentState {
  messages: Array<{ message: string; timestamp: number }>;
}

export class ConnectionsAgent extends Agent<Env, ConnectionsAgentState> {
  initialState: ConnectionsAgentState = {
    messages: []
  };

  onConnect(connection: Connection, ctx: ConnectionContext) {
    super.onConnect(connection, ctx);
    this.broadcast(
      JSON.stringify({
        type: "connection_count",
        count: [...this.getConnections()].length
      })
    );
    console.log(`Client connected: ${connection.id}`);
  }

  onClose(connection: Connection) {
    super.onClose(connection);
    this.broadcast(
      JSON.stringify({
        type: "connection_count",
        count: [...this.getConnections()].length
      })
    );
    console.log(`Client disconnected: ${connection.id}`);
  }

  @callable({ description: "Get connection count" })
  getConnectionCount(): number {
    return [...this.getConnections()].length;
  }

  @callable({ description: "Broadcast a message to all clients" })
  broadcastMessage(message: string): void {
    const newMessage = { message, timestamp: Date.now() };
    this.setState({
      ...this.state,
      messages: [...this.state.messages.slice(-9), newMessage]
    });
    this.broadcast(
      JSON.stringify({
        type: "broadcast",
        ...newMessage
      })
    );
  }
}