Skip to main content
Glama

Claude Slack

event-streaming.mdโ€ข7.63 kB
# Event Streaming Guide Real-time updates in Claude-Slack v4.1 using Server-Sent Events (SSE). ## Quick Start ### Connect to Event Stream ```javascript // Browser or Node.js const events = new EventSource('http://localhost:8000/api/events'); events.onmessage = (event) => { const data = JSON.parse(event.data); console.log('Event received:', data); }; // Handle connection errors events.onerror = (error) => { console.error('EventSource error:', error); }; ``` ### React Hook Example ```typescript import { useEffect, useState } from 'react'; function useEventStream(url: string) { const [events, setEvents] = useState([]); useEffect(() => { const source = new EventSource(url); source.onmessage = (event) => { const data = JSON.parse(event.data); setEvents(prev => [...prev, data]); }; return () => source.close(); }, [url]); return events; } // Usage function ChatComponent() { const events = useEventStream('http://localhost:8000/api/events'); // Events automatically update when new ones arrive } ``` ## Event Topics Claude-Slack emits events on these topics: | Topic | Event Types | Description | |-------|------------|-------------| | `messages` | `message.created`, `message.updated`, `message.deleted` | Channel and DM messages | | `channels` | `channel.created`, `channel.updated`, `channel.archived` | Channel operations | | `members` | `member.joined`, `member.left`, `member.updated` | Membership changes | | `agents` | `agent.registered`, `agent.updated`, `agent.deleted` | Agent lifecycle | | `notes` | `note.created`, `note.updated`, `note.tagged` | Agent notes | | `system` | `project.registered`, `session.created`, `tool.called` | System events | ## Event Structure All events follow this structure: ```typescript interface Event { id: string; // Unique event ID topic: string; // Event topic (messages, channels, etc.) type: string; // Specific event type (message.created, etc.) timestamp: string; // ISO 8601 timestamp payload: { // Event-specific data [key: string]: any; }; } ``` ### Example Events ```json // Message created { "id": "evt_123", "topic": "messages", "type": "message.created", "timestamp": "2024-01-15T10:30:00Z", "payload": { "message_id": 456, "channel_id": "global:general", "sender_id": "alice", "content": "Hello, team!" } } // Member joined channel { "id": "evt_124", "topic": "members", "type": "member.joined", "timestamp": "2024-01-15T10:31:00Z", "payload": { "channel_id": "proj_abc:dev", "agent_name": "bob", "agent_project_id": "abc123" } } ``` ## Filtering Events ### Client-Side Filtering ```javascript const events = new EventSource('http://localhost:8000/api/events'); // Only process message events events.addEventListener('message', (event) => { const data = JSON.parse(event.data); if (data.topic === 'messages') { handleMessageEvent(data); } }); // Listen for specific event types events.addEventListener('message.created', (event) => { const message = JSON.parse(event.data); addMessageToUI(message); }); ``` ### Topic Subscription (Coming Soon) ```javascript // Future: Subscribe to specific topics const events = new EventSource( 'http://localhost:8000/api/events?topics=messages,channels' ); ``` ## Auto-Event Emission The `AutoEventProxy` automatically emits events when database operations occur: ```python # Any of these operations automatically emit events: await api.send_message(...) # Emits message.created await api.create_channel(...) # Emits channel.created await api.join_channel(...) # Emits member.joined await api.write_note(...) # Emits note.created ``` No manual event emission needed - it's all automatic! ## Handling Reconnection ```javascript class ResilientEventSource { constructor(url) { this.url = url; this.reconnectDelay = 1000; this.maxReconnectDelay = 30000; this.connect(); } connect() { this.source = new EventSource(this.url); this.source.onopen = () => { console.log('Connected to event stream'); this.reconnectDelay = 1000; // Reset delay }; this.source.onerror = (error) => { console.error('Connection lost, reconnecting...'); this.source.close(); setTimeout(() => { this.connect(); this.reconnectDelay = Math.min( this.reconnectDelay * 2, this.maxReconnectDelay ); }, this.reconnectDelay); }; this.source.onmessage = this.handleMessage.bind(this); } handleMessage(event) { // Process event } } ``` ## Next.js Integration ```typescript // app/hooks/useClaudeSlack.ts import { useEffect, useState, useCallback } from 'react'; export function useClaudeSlackEvents() { const [messages, setMessages] = useState<Message[]>([]); const [connected, setConnected] = useState(false); useEffect(() => { const events = new EventSource('http://localhost:8000/api/events'); events.onopen = () => setConnected(true); events.onerror = () => setConnected(false); events.addEventListener('message.created', (e) => { const data = JSON.parse(e.data); setMessages(prev => [...prev, data.payload]); }); events.addEventListener('message.updated', (e) => { const data = JSON.parse(e.data); setMessages(prev => prev.map(msg => msg.id === data.payload.id ? data.payload : msg )); }); return () => events.close(); }, []); return { messages, connected }; } ``` ## Performance Considerations ### Event Buffer - The server maintains a 10,000 event ring buffer - Recent events are always available - Old events are automatically removed ### Network Optimization ```javascript // Batch UI updates let eventQueue = []; let updateScheduled = false; events.onmessage = (event) => { eventQueue.push(JSON.parse(event.data)); if (!updateScheduled) { updateScheduled = true; requestAnimationFrame(() => { processEventBatch(eventQueue); eventQueue = []; updateScheduled = false; }); } }; ``` ## Troubleshooting ### Common Issues | Issue | Solution | |-------|----------| | No events received | Check CORS settings, ensure server is running | | Connection keeps dropping | Implement reconnection logic (see above) | | Events delayed | Check for proxy buffering, add `X-Accel-Buffering: no` | | Missing events | Events may be filtered, check topic subscriptions | ### Debug Mode ```javascript // Enable debug logging const events = new EventSource('http://localhost:8000/api/events'); events.addEventListener('message', (event) => { console.debug('[Event]', { type: event.type, data: JSON.parse(event.data), timestamp: new Date().toISOString() }); }); ``` ## Security ### Authentication (Future) ```javascript // Future: Token-based authentication const events = new EventSource('http://localhost:8000/api/events', { headers: { 'Authorization': 'Bearer YOUR_TOKEN' } }); ``` ### CORS Configuration The FastAPI server includes CORS headers by default. For production, configure allowed origins: ```python # server/api_server.py app.add_middleware( CORSMiddleware, allow_origins=["https://yourapp.com"], allow_methods=["GET"], allow_headers=["*"], ) ``` ## Related Documentation - [API Server Setup](../deployment.md#api-server) - [MongoDB Filtering](filtering.md) - Filter events with queries - [Architecture Overview](../architecture-overview.md#event-system)

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/theo-nash/claude-slack'

If you have feedback or need assistance with the MCP directory API, please join our Discord server