ai.matey.react.stream 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 AI Matey Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * AI Matey React Stream
4
+ *
5
+ * React streaming utilities and components.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.toAsyncIterable = exports.fromAsyncIterable = exports.mergeStreams = exports.transformStream = exports.parseSSEStream = exports.createTextStream = exports.TypeWriter = exports.StreamText = exports.useStreamState = exports.useStreamContext = exports.StreamProvider = void 0;
11
+ // Context and Provider
12
+ var stream_context_js_1 = require("./stream-context.js");
13
+ Object.defineProperty(exports, "StreamProvider", { enumerable: true, get: function () { return stream_context_js_1.StreamProvider; } });
14
+ Object.defineProperty(exports, "useStreamContext", { enumerable: true, get: function () { return stream_context_js_1.useStreamContext; } });
15
+ Object.defineProperty(exports, "useStreamState", { enumerable: true, get: function () { return stream_context_js_1.useStreamState; } });
16
+ // Components
17
+ var stream_text_js_1 = require("./stream-text.js");
18
+ Object.defineProperty(exports, "StreamText", { enumerable: true, get: function () { return stream_text_js_1.StreamText; } });
19
+ Object.defineProperty(exports, "TypeWriter", { enumerable: true, get: function () { return stream_text_js_1.TypeWriter; } });
20
+ // Utilities
21
+ var stream_utils_js_1 = require("./stream-utils.js");
22
+ Object.defineProperty(exports, "createTextStream", { enumerable: true, get: function () { return stream_utils_js_1.createTextStream; } });
23
+ Object.defineProperty(exports, "parseSSEStream", { enumerable: true, get: function () { return stream_utils_js_1.parseSSEStream; } });
24
+ Object.defineProperty(exports, "transformStream", { enumerable: true, get: function () { return stream_utils_js_1.transformStream; } });
25
+ Object.defineProperty(exports, "mergeStreams", { enumerable: true, get: function () { return stream_utils_js_1.mergeStreams; } });
26
+ Object.defineProperty(exports, "fromAsyncIterable", { enumerable: true, get: function () { return stream_utils_js_1.fromAsyncIterable; } });
27
+ Object.defineProperty(exports, "toAsyncIterable", { enumerable: true, get: function () { return stream_utils_js_1.toAsyncIterable; } });
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,uBAAuB;AACvB,yDAAuF;AAA9E,mHAAA,cAAc,OAAA;AAAE,qHAAA,gBAAgB,OAAA;AAAE,mHAAA,cAAc,OAAA;AAEzD,aAAa;AACb,mDAA0D;AAAjD,4GAAA,UAAU,OAAA;AAAE,4GAAA,UAAU,OAAA;AAE/B,YAAY;AACZ,qDAO2B;AANzB,mHAAA,gBAAgB,OAAA;AAChB,iHAAA,cAAc,OAAA;AACd,kHAAA,eAAe,OAAA;AACf,+GAAA,YAAY,OAAA;AACZ,oHAAA,iBAAiB,OAAA;AACjB,kHAAA,eAAe,OAAA"}
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StreamProvider = StreamProvider;
4
+ exports.useStreamContext = useStreamContext;
5
+ exports.useStreamState = useStreamState;
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ /**
8
+ * Stream Context and Provider
9
+ *
10
+ * React context for sharing streaming state across components.
11
+ *
12
+ * @module
13
+ */
14
+ const react_1 = require("react");
15
+ /**
16
+ * Stream context.
17
+ */
18
+ const StreamContext = (0, react_1.createContext)(null);
19
+ /**
20
+ * StreamProvider - Context provider for managing multiple streams.
21
+ *
22
+ * Provides centralized stream state management across components.
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * import { StreamProvider, useStreamContext } from 'ai.matey.react.stream';
27
+ *
28
+ * function App() {
29
+ * return (
30
+ * <StreamProvider maxStreams={10}>
31
+ * <ChatComponent />
32
+ * </StreamProvider>
33
+ * );
34
+ * }
35
+ *
36
+ * function ChatComponent() {
37
+ * const { startStream, appendToStream, completeStream } = useStreamContext();
38
+ *
39
+ * const handleNewMessage = async () => {
40
+ * const streamId = 'message-1';
41
+ * startStream(streamId);
42
+ * // ... fetch and stream
43
+ * for await (const chunk of response) {
44
+ * appendToStream(streamId, chunk);
45
+ * }
46
+ * completeStream(streamId);
47
+ * };
48
+ *
49
+ * return <button onClick={handleNewMessage}>Send</button>;
50
+ * }
51
+ * ```
52
+ */
53
+ function StreamProvider({ children, maxStreams = 100 }) {
54
+ const [streams, setStreams] = (0, react_1.useState)(new Map());
55
+ const streamsRef = (0, react_1.useRef)(streams);
56
+ // Keep ref in sync
57
+ streamsRef.current = streams;
58
+ /**
59
+ * Get a specific stream.
60
+ */
61
+ const getStream = (0, react_1.useCallback)((id) => {
62
+ return streamsRef.current.get(id);
63
+ }, []);
64
+ /**
65
+ * Start a new stream.
66
+ */
67
+ const startStream = (0, react_1.useCallback)((id, metadata) => {
68
+ setStreams((prev) => {
69
+ const newMap = new Map(prev);
70
+ // Enforce max streams limit
71
+ if (newMap.size >= maxStreams && !newMap.has(id)) {
72
+ // Remove oldest completed stream
73
+ for (const [streamId, state] of newMap) {
74
+ if (!state.isStreaming) {
75
+ newMap.delete(streamId);
76
+ break;
77
+ }
78
+ }
79
+ }
80
+ newMap.set(id, {
81
+ id,
82
+ text: '',
83
+ isStreaming: true,
84
+ error: undefined,
85
+ metadata,
86
+ });
87
+ return newMap;
88
+ });
89
+ }, [maxStreams]);
90
+ /**
91
+ * Update stream text (replace).
92
+ */
93
+ const updateStream = (0, react_1.useCallback)((id, text) => {
94
+ setStreams((prev) => {
95
+ const state = prev.get(id);
96
+ if (!state)
97
+ return prev;
98
+ const newMap = new Map(prev);
99
+ newMap.set(id, { ...state, text });
100
+ return newMap;
101
+ });
102
+ }, []);
103
+ /**
104
+ * Append to stream text.
105
+ */
106
+ const appendToStream = (0, react_1.useCallback)((id, chunk) => {
107
+ setStreams((prev) => {
108
+ const state = prev.get(id);
109
+ if (!state)
110
+ return prev;
111
+ const newMap = new Map(prev);
112
+ newMap.set(id, { ...state, text: state.text + chunk });
113
+ return newMap;
114
+ });
115
+ }, []);
116
+ /**
117
+ * Complete a stream.
118
+ */
119
+ const completeStream = (0, react_1.useCallback)((id) => {
120
+ setStreams((prev) => {
121
+ const state = prev.get(id);
122
+ if (!state)
123
+ return prev;
124
+ const newMap = new Map(prev);
125
+ newMap.set(id, { ...state, isStreaming: false });
126
+ return newMap;
127
+ });
128
+ }, []);
129
+ /**
130
+ * Set stream error.
131
+ */
132
+ const setStreamError = (0, react_1.useCallback)((id, error) => {
133
+ setStreams((prev) => {
134
+ const state = prev.get(id);
135
+ if (!state)
136
+ return prev;
137
+ const newMap = new Map(prev);
138
+ newMap.set(id, { ...state, isStreaming: false, error });
139
+ return newMap;
140
+ });
141
+ }, []);
142
+ /**
143
+ * Remove a stream.
144
+ */
145
+ const removeStream = (0, react_1.useCallback)((id) => {
146
+ setStreams((prev) => {
147
+ const newMap = new Map(prev);
148
+ newMap.delete(id);
149
+ return newMap;
150
+ });
151
+ }, []);
152
+ /**
153
+ * Clear all streams.
154
+ */
155
+ const clearAllStreams = (0, react_1.useCallback)(() => {
156
+ setStreams(new Map());
157
+ }, []);
158
+ const value = {
159
+ streams,
160
+ getStream,
161
+ startStream,
162
+ updateStream,
163
+ appendToStream,
164
+ completeStream,
165
+ setStreamError,
166
+ removeStream,
167
+ clearAllStreams,
168
+ };
169
+ return (0, jsx_runtime_1.jsx)(StreamContext.Provider, { value: value, children: children });
170
+ }
171
+ /**
172
+ * useStreamContext - Access the stream context.
173
+ *
174
+ * @throws {Error} If used outside of StreamProvider
175
+ */
176
+ function useStreamContext() {
177
+ const context = (0, react_1.useContext)(StreamContext);
178
+ if (!context) {
179
+ throw new Error('useStreamContext must be used within a StreamProvider');
180
+ }
181
+ return context;
182
+ }
183
+ /**
184
+ * useStreamState - Get state for a specific stream.
185
+ *
186
+ * @param id - Stream ID
187
+ * @returns Stream state or undefined
188
+ */
189
+ function useStreamState(id) {
190
+ const { streams } = useStreamContext();
191
+ return streams.get(id);
192
+ }
193
+ //# sourceMappingURL=stream-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-context.js","sourceRoot":"","sources":["../../src/stream-context.tsx"],"names":[],"mappings":";;AAmGA,wCAsIC;AAOD,4CAQC;AAQD,wCAGC;;AAnQD;;;;;;GAMG;AAEH,iCAAiG;AA0CjG;;GAEG;AACH,MAAM,aAAa,GAAG,IAAA,qBAAa,EAA4B,IAAI,CAAC,CAAC;AAYrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,SAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,UAAU,GAAG,GAAG,EAAuB;IAChF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAA2B,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,IAAA,cAAM,EAA2B,OAAO,CAAC,CAAC;IAE7D,mBAAmB;IACnB,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAE7B;;OAEG;IACH,MAAM,SAAS,GAAG,IAAA,mBAAW,EAAC,CAAC,EAAU,EAA2B,EAAE;QACpE,OAAO,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,WAAW,GAAG,IAAA,mBAAW,EAC7B,CAAC,EAAU,EAAE,QAAkC,EAAE,EAAE;QACjD,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAE7B,4BAA4B;YAC5B,IAAI,MAAM,CAAC,IAAI,IAAI,UAAU,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACjD,iCAAiC;gBACjC,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;wBACvB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;wBACxB,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE;gBACb,EAAE;gBACF,IAAI,EAAE,EAAE;gBACR,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,SAAS;gBAChB,QAAQ;aACT,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,UAAU,CAAC,CACb,CAAC;IAEF;;OAEG;IACH,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,CAAC,EAAU,EAAE,IAAY,EAAE,EAAE;QAC5D,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YAExB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACnC,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,cAAc,GAAG,IAAA,mBAAW,EAAC,CAAC,EAAU,EAAE,KAAa,EAAE,EAAE;QAC/D,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YAExB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC;YACvD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,cAAc,GAAG,IAAA,mBAAW,EAAC,CAAC,EAAU,EAAE,EAAE;QAChD,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YAExB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YACjD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,cAAc,GAAG,IAAA,mBAAW,EAAC,CAAC,EAAU,EAAE,KAAY,EAAE,EAAE;QAC9D,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YAExB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACxD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,CAAC,EAAU,EAAE,EAAE;QAC9C,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,eAAe,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QACvC,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACxB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAuB;QAChC,OAAO;QACP,SAAS;QACT,WAAW;QACX,YAAY;QACZ,cAAc;QACd,cAAc;QACd,cAAc;QACd,YAAY;QACZ,eAAe;KAChB,CAAC;IAEF,OAAO,uBAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA0B,CAAC;AACnF,CAAC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB;IAC9B,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,aAAa,CAAC,CAAC;IAE1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,EAAU;IACvC,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAAC;IACvC,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StreamText = StreamText;
4
+ exports.TypeWriter = TypeWriter;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ /**
7
+ * StreamText Component
8
+ *
9
+ * React component for rendering streaming text with typing effect.
10
+ *
11
+ * @module
12
+ */
13
+ const react_1 = require("react");
14
+ /**
15
+ * StreamText - Display streaming text with optional cursor.
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * import { StreamText } from 'ai.matey.react.stream';
20
+ *
21
+ * function ChatMessage({ text, isStreaming }) {
22
+ * return (
23
+ * <StreamText
24
+ * text={text}
25
+ * isStreaming={isStreaming}
26
+ * showCursor={true}
27
+ * />
28
+ * );
29
+ * }
30
+ * ```
31
+ */
32
+ function StreamText({ text, isStreaming = false, showCursor = true, cursor = '▋', cursorBlinkInterval = 500, className, renderText, children, }) {
33
+ const [cursorVisible, setCursorVisible] = (0, react_1.useState)(true);
34
+ // Blink cursor while streaming
35
+ (0, react_1.useEffect)(() => {
36
+ if (!isStreaming || !showCursor) {
37
+ setCursorVisible(false);
38
+ return;
39
+ }
40
+ setCursorVisible(true);
41
+ const interval = setInterval(() => {
42
+ setCursorVisible((prev) => !prev);
43
+ }, cursorBlinkInterval);
44
+ return () => clearInterval(interval);
45
+ }, [isStreaming, showCursor, cursorBlinkInterval]);
46
+ // Render text content
47
+ const textContent = (0, react_1.useMemo)(() => {
48
+ if (renderText) {
49
+ return renderText(text);
50
+ }
51
+ return text;
52
+ }, [text, renderText]);
53
+ return ((0, jsx_runtime_1.jsxs)("span", { className: className, children: [textContent, isStreaming && showCursor && cursorVisible && ((0, jsx_runtime_1.jsx)("span", { className: "streaming-cursor", "aria-hidden": "true", children: cursor })), children] }));
54
+ }
55
+ /**
56
+ * TypeWriter - Display text with typewriter effect.
57
+ *
58
+ * Simulates typing effect for non-streaming text.
59
+ *
60
+ * @example
61
+ * ```tsx
62
+ * import { TypeWriter } from 'ai.matey.react.stream';
63
+ *
64
+ * function WelcomeMessage() {
65
+ * return (
66
+ * <TypeWriter
67
+ * text="Welcome to AI Matey!"
68
+ * speed={50}
69
+ * onComplete={() => console.log('Done typing')}
70
+ * />
71
+ * );
72
+ * }
73
+ * ```
74
+ */
75
+ function TypeWriter({ text, speed = 30, delay = 0, onComplete, className, showCursor = true, cursor = '▋', }) {
76
+ const [displayedText, setDisplayedText] = (0, react_1.useState)('');
77
+ const [isTyping, setIsTyping] = (0, react_1.useState)(false);
78
+ (0, react_1.useEffect)(() => {
79
+ setDisplayedText('');
80
+ setIsTyping(false);
81
+ if (!text)
82
+ return;
83
+ // Start delay
84
+ const delayTimeout = setTimeout(() => {
85
+ setIsTyping(true);
86
+ let currentIndex = 0;
87
+ const typeInterval = setInterval(() => {
88
+ if (currentIndex < text.length) {
89
+ setDisplayedText(text.slice(0, currentIndex + 1));
90
+ currentIndex++;
91
+ }
92
+ else {
93
+ clearInterval(typeInterval);
94
+ setIsTyping(false);
95
+ onComplete?.();
96
+ }
97
+ }, speed);
98
+ return () => clearInterval(typeInterval);
99
+ }, delay);
100
+ return () => clearTimeout(delayTimeout);
101
+ }, [text, speed, delay, onComplete]);
102
+ return ((0, jsx_runtime_1.jsx)(StreamText, { text: displayedText, isStreaming: isTyping, showCursor: showCursor, cursor: cursor, className: className }));
103
+ }
104
+ //# sourceMappingURL=stream-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-text.js","sourceRoot":"","sources":["../../src/stream-text.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ /**
3
+ * Stream Utilities
4
+ *
5
+ * Helper functions for working with streams in React.
6
+ *
7
+ * @module
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.createTextStream = createTextStream;
11
+ exports.parseSSEStream = parseSSEStream;
12
+ exports.transformStream = transformStream;
13
+ exports.mergeStreams = mergeStreams;
14
+ exports.fromAsyncIterable = fromAsyncIterable;
15
+ exports.toAsyncIterable = toAsyncIterable;
16
+ /**
17
+ * Create a controlled text stream from a fetch response.
18
+ *
19
+ * @param response - Fetch response with streaming body
20
+ * @param options - Stream options
21
+ * @returns Promise resolving to full text
22
+ */
23
+ async function createTextStream(response, options = {}) {
24
+ const { onChunk, onComplete, onError, signal } = options;
25
+ if (!response.body) {
26
+ throw new Error('Response body is null');
27
+ }
28
+ try {
29
+ const reader = response.body.getReader();
30
+ const decoder = new TextDecoder();
31
+ let fullText = '';
32
+ while (true) {
33
+ if (signal?.aborted) {
34
+ reader.cancel();
35
+ break;
36
+ }
37
+ const { done, value } = await reader.read();
38
+ if (done) {
39
+ break;
40
+ }
41
+ const chunk = decoder.decode(value, { stream: true });
42
+ fullText += chunk;
43
+ onChunk?.(chunk);
44
+ }
45
+ onComplete?.(fullText);
46
+ return fullText;
47
+ }
48
+ catch (error) {
49
+ const err = error instanceof Error ? error : new Error(String(error));
50
+ onError?.(err);
51
+ throw err;
52
+ }
53
+ }
54
+ /**
55
+ * Parse Server-Sent Events (SSE) stream.
56
+ *
57
+ * @param response - Fetch response with SSE body
58
+ * @param options - Stream options
59
+ * @returns Async generator yielding parsed events
60
+ */
61
+ async function* parseSSEStream(response, options = {}) {
62
+ const { signal } = options;
63
+ if (!response.body) {
64
+ throw new Error('Response body is null');
65
+ }
66
+ const reader = response.body.getReader();
67
+ const decoder = new TextDecoder();
68
+ let buffer = '';
69
+ try {
70
+ while (true) {
71
+ if (signal?.aborted) {
72
+ reader.cancel();
73
+ break;
74
+ }
75
+ const { done, value } = await reader.read();
76
+ if (done) {
77
+ break;
78
+ }
79
+ buffer += decoder.decode(value, { stream: true });
80
+ // Split by double newlines (SSE event delimiter)
81
+ const events = buffer.split('\n\n');
82
+ buffer = events.pop() || '';
83
+ for (const eventText of events) {
84
+ const event = parseSSEEvent(eventText);
85
+ if (event) {
86
+ yield event;
87
+ }
88
+ }
89
+ }
90
+ // Process any remaining buffer
91
+ if (buffer.trim()) {
92
+ const event = parseSSEEvent(buffer);
93
+ if (event) {
94
+ yield event;
95
+ }
96
+ }
97
+ }
98
+ finally {
99
+ reader.releaseLock();
100
+ }
101
+ }
102
+ /**
103
+ * Parse a single SSE event.
104
+ */
105
+ function parseSSEEvent(text) {
106
+ const lines = text.split('\n');
107
+ const event = { data: '' };
108
+ const dataLines = [];
109
+ for (const line of lines) {
110
+ if (line.startsWith('event:')) {
111
+ event.event = line.slice(6).trim();
112
+ }
113
+ else if (line.startsWith('data:')) {
114
+ dataLines.push(line.slice(5).trim());
115
+ }
116
+ else if (line.startsWith('id:')) {
117
+ event.id = line.slice(3).trim();
118
+ }
119
+ else if (line.startsWith('retry:')) {
120
+ const retry = parseInt(line.slice(6).trim(), 10);
121
+ if (!isNaN(retry)) {
122
+ event.retry = retry;
123
+ }
124
+ }
125
+ }
126
+ if (dataLines.length === 0) {
127
+ return null;
128
+ }
129
+ event.data = dataLines.join('\n');
130
+ return event;
131
+ }
132
+ /**
133
+ * Transform a ReadableStream with a function.
134
+ *
135
+ * @param stream - Source stream
136
+ * @param transform - Transform function
137
+ * @returns Transformed stream
138
+ */
139
+ function transformStream(stream, transform) {
140
+ const reader = stream.getReader();
141
+ return new ReadableStream({
142
+ async pull(controller) {
143
+ const { done, value } = await reader.read();
144
+ if (done) {
145
+ controller.close();
146
+ return;
147
+ }
148
+ const transformed = await transform(value);
149
+ controller.enqueue(transformed);
150
+ },
151
+ cancel() {
152
+ reader.cancel();
153
+ },
154
+ });
155
+ }
156
+ /**
157
+ * Merge multiple streams into one.
158
+ *
159
+ * @param streams - Streams to merge
160
+ * @returns Merged stream
161
+ */
162
+ function mergeStreams(...streams) {
163
+ const readers = streams.map((s) => s.getReader());
164
+ let activeReaders = readers.length;
165
+ return new ReadableStream({
166
+ async pull(controller) {
167
+ const results = await Promise.all(readers.map(async (reader, index) => {
168
+ try {
169
+ const { done, value } = await reader.read();
170
+ return { index, done, value };
171
+ }
172
+ catch (error) {
173
+ return { index, done: true, value: undefined, error };
174
+ }
175
+ }));
176
+ for (const result of results) {
177
+ if (result.done) {
178
+ activeReaders--;
179
+ }
180
+ else if (result.value !== undefined) {
181
+ controller.enqueue(result.value);
182
+ }
183
+ }
184
+ if (activeReaders === 0) {
185
+ controller.close();
186
+ }
187
+ },
188
+ cancel() {
189
+ readers.forEach((reader) => reader.cancel());
190
+ },
191
+ });
192
+ }
193
+ /**
194
+ * Create a stream from an async iterable.
195
+ *
196
+ * @param iterable - Async iterable source
197
+ * @returns ReadableStream
198
+ */
199
+ function fromAsyncIterable(iterable) {
200
+ const iterator = iterable[Symbol.asyncIterator]();
201
+ return new ReadableStream({
202
+ async pull(controller) {
203
+ const { done, value } = await iterator.next();
204
+ if (done) {
205
+ controller.close();
206
+ return;
207
+ }
208
+ controller.enqueue(value);
209
+ },
210
+ cancel() {
211
+ iterator.return?.();
212
+ },
213
+ });
214
+ }
215
+ /**
216
+ * Convert a ReadableStream to an async iterable.
217
+ *
218
+ * @param stream - ReadableStream source
219
+ * @returns Async iterable
220
+ */
221
+ async function* toAsyncIterable(stream) {
222
+ const reader = stream.getReader();
223
+ try {
224
+ while (true) {
225
+ const { done, value } = await reader.read();
226
+ if (done) {
227
+ break;
228
+ }
229
+ yield value;
230
+ }
231
+ }
232
+ finally {
233
+ reader.releaseLock();
234
+ }
235
+ }
236
+ //# sourceMappingURL=stream-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-utils.js","sourceRoot":"","sources":["../../src/stream-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * AI Matey React Stream
3
+ *
4
+ * React streaming utilities and components.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ // Context and Provider
9
+ export { StreamProvider, useStreamContext, useStreamState } from './stream-context.js';
10
+ // Components
11
+ export { StreamText, TypeWriter } from './stream-text.js';
12
+ // Utilities
13
+ export { createTextStream, parseSSEStream, transformStream, mergeStreams, fromAsyncIterable, toAsyncIterable, } from './stream-utils.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,uBAAuB;AACvB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEvF,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE1D,YAAY;AACZ,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,eAAe,GAChB,MAAM,mBAAmB,CAAC"}