@@ -549,6 +549,7 @@ pub struct OpenAIEventMappedStream<O>
549
549
#[ pin]
550
550
stream : Filter < EventSource , future:: Ready < bool > , fn ( & Result < Event , reqwest_eventsource:: Error > ) -> future:: Ready < bool > > ,
551
551
event_mapper : Box < dyn Fn ( eventsource_stream:: Event ) -> Result < O , OpenAIError > + Send + ' static > ,
552
+ done : bool ,
552
553
_phantom_data : PhantomData < O > ,
553
554
}
554
555
@@ -562,6 +563,7 @@ impl<O> OpenAIEventMappedStream<O>
562
563
// filter out the first event which is always Event::Open
563
564
future:: ready ( !( result. is_ok ( ) && result. as_ref ( ) . unwrap ( ) . eq ( & Event :: Open ) ) )
564
565
) ,
566
+ done : false ,
565
567
event_mapper : Box :: new ( event_mapper) ,
566
568
_phantom_data : PhantomData ,
567
569
}
@@ -574,8 +576,12 @@ impl<O> Stream for OpenAIEventMappedStream<O>
574
576
{
575
577
type Item = Result < O , OpenAIError > ;
576
578
579
+ // TODO: test this
577
580
fn poll_next ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Option < Self :: Item > > {
578
581
let this = self . project ( ) ;
582
+ if * this. done {
583
+ return Poll :: Ready ( None ) ;
584
+ }
579
585
let stream: Pin < & mut _ > = this. stream ;
580
586
match stream. poll_next ( cx) {
581
587
Poll :: Ready ( response) => {
@@ -586,13 +592,19 @@ impl<O> Stream for OpenAIEventMappedStream<O>
586
592
Event :: Open => unreachable ! ( ) , // it has been filtered out
587
593
Event :: Message ( message) => {
588
594
if message. data == "[DONE]" {
589
- Poll :: Ready ( None ) // end of the stream, defined by OpenAI
590
- } else {
591
- todo ! ( )
595
+ * this. done = true ;
596
+ }
597
+ let response = ( this. event_mapper ) ( message) ;
598
+ match response {
599
+ Ok ( output) => Poll :: Ready ( Some ( Ok ( output) ) ) ,
600
+ Err ( _) => Poll :: Ready ( None )
592
601
}
593
602
}
594
603
}
595
- Err ( e) => Poll :: Ready ( Some ( Err ( OpenAIError :: StreamError ( e. to_string ( ) ) ) ) )
604
+ Err ( e) => {
605
+ * this. done = true ;
606
+ Poll :: Ready ( Some ( Err ( OpenAIError :: StreamError ( e. to_string ( ) ) ) ) )
607
+ }
596
608
}
597
609
}
598
610
}
0 commit comments