@@ -20,69 +20,3 @@ export function createScriptedSSEResponse(events: AgentEvent[]): Response {
2020 } ,
2121 } ) ;
2222}
23-
24- export async function * parseSSEStream (
25- stream : ReadableStream < Uint8Array >
26- ) : AsyncIterable < AgentEvent > {
27- const reader = stream . getReader ( ) ;
28- const decoder = new TextDecoder ( 'utf-8' ) ;
29- let buffer = '' ;
30-
31- try {
32- while ( true ) {
33- const { done, value } = await reader . read ( ) ;
34- if ( done ) {
35- break ;
36- }
37-
38- buffer += decoder . decode ( value , { stream : true } ) ;
39- buffer = buffer . replace ( / \r \n / g, '\n' ) . replace ( / \r / g, '\n' ) ;
40-
41- let blankIdx = buffer . indexOf ( '\n\n' ) ;
42- while ( blankIdx !== - 1 ) {
43- const rawEvent = buffer . slice ( 0 , blankIdx ) ;
44- buffer = buffer . slice ( blankIdx + 2 ) ;
45- const event = parseEvent ( rawEvent ) ;
46- if ( event ) {
47- yield event ;
48- }
49- blankIdx = buffer . indexOf ( '\n\n' ) ;
50- }
51- }
52- } finally {
53- reader . releaseLock ( ) ;
54- }
55- }
56-
57- function parseEvent ( raw : string ) : AgentEvent | null {
58- const dataLines : string [ ] = [ ] ;
59- for ( const line of raw . split ( '\n' ) ) {
60- if ( line === '' || line . startsWith ( ':' ) ) {
61- continue ;
62- }
63- const colon = line . indexOf ( ':' ) ;
64- const field = colon === - 1 ? line : line . slice ( 0 , colon ) ;
65- let value = colon === - 1 ? '' : line . slice ( colon + 1 ) ;
66- if ( value . startsWith ( ' ' ) ) {
67- value = value . slice ( 1 ) ;
68- }
69- if ( field === 'data' ) {
70- dataLines . push ( value ) ;
71- }
72- }
73-
74- if ( dataLines . length === 0 ) {
75- return null ;
76- }
77-
78- const data = dataLines . join ( '\n' ) ;
79- if ( data === '[DONE]' ) {
80- return null ;
81- }
82-
83- try {
84- return JSON . parse ( data ) as AgentEvent ;
85- } catch {
86- return null ;
87- }
88- }
0 commit comments