ai.matey.react.stream
React components and utilities for streaming AI responses.
Part of the ai.matey monorepo.
Installation
npm install ai.matey.react.stream
Quick Start
import { StreamProvider, useStreamContext, StreamText } from 'ai.matey.react.stream';
function App() {
return (
<StreamProvider maxStreams={10}>
<ChatComponent />
</StreamProvider>
);
}
function ChatComponent() {
const { startStream, appendToStream, completeStream, getStream } = useStreamContext();
const [streamId, setStreamId] = useState<string | null>(null);
const handleSend = async () => {
const id = `msg-${Date.now()}`;
setStreamId(id);
startStream(id);
const response = await fetch('/api/chat', { method: 'POST' });
const reader = response.body?.getReader();
const decoder = new TextDecoder();
while (reader) {
const { done, value } = await reader.read();
if (done) break;
appendToStream(id, decoder.decode(value));
}
completeStream(id);
};
const stream = streamId ? getStream(streamId) : null;
return (
<div>
{stream && (
<StreamText
text={stream.text}
isStreaming={stream.isStreaming}
showCursor={true}
/>
)}
<button onClick={handleSend}>Send</button>
</div>
);
}
Exports
Components
StreamProvider - Context provider for stream state management
StreamText - Display streaming text with cursor
TypeWriter - Typewriter effect for static text
Hooks
useStreamContext - Access stream management functions
useStreamState - Get state for a specific stream
Utilities
createTextStream - Create controlled text stream from fetch response
parseSSEStream - Parse Server-Sent Events
transformStream - Transform stream data
mergeStreams - Merge multiple streams
fromAsyncIterable - Convert async iterable to stream
toAsyncIterable - Convert stream to async iterable
Types
StreamState, StreamContextValue, StreamProviderProps
StreamTextProps, TypeWriterProps
CreateTextStreamOptions, SSEEvent
API Reference
StreamProvider
Context provider for managing multiple concurrent streams.
<StreamProvider maxStreams={100}>
{children}
</StreamProvider>
Props:
maxStreams - Maximum streams to keep (default: 100, oldest completed removed when exceeded)
useStreamContext
Access stream management functions.
const {
streams,
getStream,
startStream,
updateStream,
appendToStream,
completeStream,
setStreamError,
removeStream,
clearAllStreams,
} = useStreamContext();
useStreamState
Get state for a specific stream by ID.
const stream = useStreamState('message-1');
StreamText
Display streaming text with optional blinking cursor.
<StreamText
text="Hello world"
isStreaming={true}
showCursor={true}
cursor="▋"
cursorBlinkInterval={500}
className="my-class"
renderText={(text) => <Markdown>{text}</Markdown>}
/>
TypeWriter
Simulate typing effect for non-streaming text.
<TypeWriter
text="Welcome to AI Matey!"
speed={30}
delay={500}
showCursor={true}
cursor="▋"
onComplete={() => console.log('Done!')}
/>
Stream Utilities
import {
createTextStream,
parseSSEStream,
fromAsyncIterable,
} from 'ai.matey.react.stream';
const text = await createTextStream(response, {
onChunk: (chunk) => console.log(chunk),
onComplete: (fullText) => console.log('Done:', fullText),
signal: abortController.signal,
});
for await (const event of parseSSEStream(response)) {
console.log(event.data);
}
License
MIT - see LICENSE for details.