AI SummaryHeuristic scoring (no AI key configured).
Install
Copy this and paste it into Claude Code, Cursor, or any AI assistant:
I want to install the "river.ts" skill in my project. Please run this command in my terminal: # Install skill into the correct directory mkdir -p .claude/skills/river.ts && curl --retry 3 --retry-delay 2 --retry-all-errors -o .claude/skills/river.ts/SKILL.md "https://raw.githubusercontent.com/Bewinxed/river.ts/main/SKILL.md" Then restart Claude Code (or reload the window in Cursor) so the skill is picked up.
Description
Easy, Composable, and type-safe Server-Sent Events (SSE) & Websocket Messages
Quick Reference
river.ts provides three main components: • RiverEvents - Type-safe event schema builder • RiverEmitter - Server-side SSE streaming • RiverClient - Client-side SSE consumption • RiverSocketAdapter - WebSocket message handling with request/response support
Event Definition
Define events using the builder pattern: `typescript import { RiverEvents } from 'river.ts'; const events = new RiverEvents() .defineEvent('message', { message: 'Hello' }) .defineEvent('data', { data: {} as { id: number; name: string } }) .defineEvent('stream', { data: [] as string[], stream: true, chunkSize: 100 }) // Request/response pattern with explicit response type .defineEvent('rpc.call', { data: {} as { method: string; params: unknown }, response: {} as { result: unknown; error?: string } }) .build(); ` Reserved event types: close, error - do not define these.
Server-Side SSE (RiverEmitter)
`typescript import { RiverEmitter } from 'river.ts/server'; const emitter = RiverEmitter.init(events); // Create SSE stream for HTTP response const stream = emitter.stream({ callback: async (emit, clientId) => { await emit('message', { message: 'Connected' }); await emit('data', { data: { id: 1, name: 'test' } }); }, clientId: 'optional-custom-id', ondisconnect: (clientId) => console.log(${clientId} disconnected) }); return new Response(stream, { headers: emitter.headers() }); // Broadcast to all clients await emitter.broadcast('message', { message: 'Update' }); // Send to specific client await emitter.sendToClient('client-id', 'data', { data: { id: 2, name: 'specific' } }); `
Client-Side SSE (RiverClient)
`typescript import { RiverClient } from 'river.ts/client'; const client = RiverClient.init(events, { reconnect: true }); client .prepare('http://localhost:3000/events', { method: 'GET' }) .on('message', (data) => console.log(data.message)) .on('data', (data) => console.log(data.id, data.name)) .stream(); // Close connection client.close(); `
Discussion
Health Signals
My Fox Den
Community Rating
Sign in to rate this booster