@@ -32,17 +32,28 @@ type streamReader[T streamable] struct {
32
32
}
33
33
34
34
func (stream * streamReader [T ]) Recv () (response T , err error ) {
35
- if stream .isFinished {
36
- err = io . EOF
35
+ rawLine , err := stream .RecvRaw ()
36
+ if err != nil {
37
37
return
38
38
}
39
39
40
- response , err = stream .processLines ()
41
- return
40
+ err = stream .unmarshaler .Unmarshal (rawLine , & response )
41
+ if err != nil {
42
+ return
43
+ }
44
+ return response , nil
45
+ }
46
+
47
+ func (stream * streamReader [T ]) RecvRaw () ([]byte , error ) {
48
+ if stream .isFinished {
49
+ return nil , io .EOF
50
+ }
51
+
52
+ return stream .processLines ()
42
53
}
43
54
44
55
//nolint:gocognit
45
- func (stream * streamReader [T ]) processLines () (T , error ) {
56
+ func (stream * streamReader [T ]) processLines () ([] byte , error ) {
46
57
var (
47
58
emptyMessagesCount uint
48
59
hasErrorPrefix bool
@@ -53,9 +64,9 @@ func (stream *streamReader[T]) processLines() (T, error) {
53
64
if readErr != nil || hasErrorPrefix {
54
65
respErr := stream .unmarshalError ()
55
66
if respErr != nil {
56
- return * new ( T ) , fmt .Errorf ("error, %w" , respErr .Error )
67
+ return nil , fmt .Errorf ("error, %w" , respErr .Error )
57
68
}
58
- return * new ( T ) , readErr
69
+ return nil , readErr
59
70
}
60
71
61
72
noSpaceLine := bytes .TrimSpace (rawLine )
@@ -68,11 +79,11 @@ func (stream *streamReader[T]) processLines() (T, error) {
68
79
}
69
80
writeErr := stream .errAccumulator .Write (noSpaceLine )
70
81
if writeErr != nil {
71
- return * new ( T ) , writeErr
82
+ return nil , writeErr
72
83
}
73
84
emptyMessagesCount ++
74
85
if emptyMessagesCount > stream .emptyMessagesLimit {
75
- return * new ( T ) , ErrTooManyEmptyStreamMessages
86
+ return nil , ErrTooManyEmptyStreamMessages
76
87
}
77
88
78
89
continue
@@ -81,16 +92,10 @@ func (stream *streamReader[T]) processLines() (T, error) {
81
92
noPrefixLine := bytes .TrimPrefix (noSpaceLine , headerData )
82
93
if string (noPrefixLine ) == "[DONE]" {
83
94
stream .isFinished = true
84
- return * new (T ), io .EOF
85
- }
86
-
87
- var response T
88
- unmarshalErr := stream .unmarshaler .Unmarshal (noPrefixLine , & response )
89
- if unmarshalErr != nil {
90
- return * new (T ), unmarshalErr
95
+ return nil , io .EOF
91
96
}
92
97
93
- return response , nil
98
+ return noPrefixLine , nil
94
99
}
95
100
}
96
101
0 commit comments