Skip to content
Skill

river.ts

by Bewinxed

AI Summary

Heuristic 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

0/2000
Loading comments...

Health Signals

MaintenanceCommitted 2mo ago
Active
Adoption100+ stars on GitHub
101 ★ · Growing
DocsMissing or thin
Undocumented

GitHub Signals

Stars101
Forks2
Issues0
Updated2mo ago
View on GitHub
OFL-1.1 License

My Fox Den

Community Rating

Sign in to rate this booster

Works With

Claude Code