@@ -146,73 +146,77 @@ const Fetch = {
146
146
return null as T ;
147
147
}
148
148
149
- const reader = response . body ! . getReader ( ) ;
150
- const decoder = new TextDecoder ( ) ;
151
149
let text = '' ;
152
- let isStreaming = context . hasRequestedStream ;
153
- let stream : TransformStream | null = isStreaming ? new TransformStream ( ) : null ;
154
- let writer = stream ?. writable . getWriter ( ) ;
155
-
156
- if ( isStreaming ) {
157
- // Listen for the abort event on the AbortSignal
158
- context . request . signal ?. addEventListener ( 'abort' , ( ) => {
159
- if ( ! isStreaming ) {
160
- return ;
161
- }
162
- void stream ! . writable . abort ( 'Request Aborted' ) ;
163
- void stream ! . readable . cancel ( 'Request Aborted' ) ;
164
- } ) ;
165
- context . setStream ( stream ! . readable ) ;
166
- }
167
-
168
- // eslint-disable-next-line no-constant-condition
169
- while ( true ) {
170
- // we manually read the stream instead of using `response.json()`
171
- // or `response.text()` because if we need to stream the body
172
- // we need to be able to pass the stream along efficiently.
173
- const { done, value } = await reader . read ( ) ;
174
- if ( done ) {
175
- if ( isStreaming ) {
176
- isStreaming = false ;
177
- await writer ! . ready ;
178
- await writer ! . close ( ) ;
179
- }
180
- break ;
181
- }
182
- text += decoder . decode ( value , { stream : true } ) ;
150
+ // if we are in a mirage context, we cannot support streaming
151
+ if ( IS_MAYBE_MIRAGE ( ) ) {
152
+ text = await response . text ( ) ;
153
+ } else {
154
+ const reader = response . body ! . getReader ( ) ;
155
+ const decoder = new TextDecoder ( ) ;
156
+ let isStreaming = context . hasRequestedStream ;
157
+ let stream : TransformStream | null = isStreaming ? new TransformStream ( ) : null ;
158
+ let writer = stream ?. writable . getWriter ( ) ;
183
159
184
- // if we are streaming, we want to pass the stream along
185
160
if ( isStreaming ) {
186
- await writer ! . ready ;
187
- await writer ! . write ( value ) ;
188
- } else if ( context . hasRequestedStream ) {
189
- const encode = new TextEncoder ( ) ;
190
- isStreaming = true ;
191
- stream = new TransformStream ( ) ;
192
161
// Listen for the abort event on the AbortSignal
193
- // eslint-disable-next-line @typescript-eslint/no-loop-func
194
162
context . request . signal ?. addEventListener ( 'abort' , ( ) => {
195
163
if ( ! isStreaming ) {
196
164
return ;
197
165
}
198
166
void stream ! . writable . abort ( 'Request Aborted' ) ;
199
167
void stream ! . readable . cancel ( 'Request Aborted' ) ;
200
168
} ) ;
201
- context . setStream ( stream . readable ) ;
202
- writer = stream . writable . getWriter ( ) ;
203
- await writer . ready ;
204
- await writer . write ( encode . encode ( text ) ) ;
205
- await writer . ready ;
206
- await writer . write ( value ) ;
169
+ context . setStream ( stream ! . readable ) ;
207
170
}
208
- }
209
171
210
- if ( isStreaming ) {
211
- isStreaming = false ;
212
- await writer ! . ready ;
213
- await writer ! . close ( ) ;
214
- }
172
+ // eslint-disable-next-line no-constant-condition
173
+ while ( true ) {
174
+ // we manually read the stream instead of using `response.json()`
175
+ // or `response.text()` because if we need to stream the body
176
+ // we need to be able to pass the stream along efficiently.
177
+ const { done, value } = await reader . read ( ) ;
178
+ if ( done ) {
179
+ if ( isStreaming ) {
180
+ isStreaming = false ;
181
+ await writer ! . ready ;
182
+ await writer ! . close ( ) ;
183
+ }
184
+ break ;
185
+ }
186
+ text += decoder . decode ( value , { stream : true } ) ;
215
187
188
+ // if we are streaming, we want to pass the stream along
189
+ if ( isStreaming ) {
190
+ await writer ! . ready ;
191
+ await writer ! . write ( value ) ;
192
+ } else if ( context . hasRequestedStream ) {
193
+ const encode = new TextEncoder ( ) ;
194
+ isStreaming = true ;
195
+ stream = new TransformStream ( ) ;
196
+ // Listen for the abort event on the AbortSignal
197
+ // eslint-disable-next-line @typescript-eslint/no-loop-func
198
+ context . request . signal ?. addEventListener ( 'abort' , ( ) => {
199
+ if ( ! isStreaming ) {
200
+ return ;
201
+ }
202
+ void stream ! . writable . abort ( 'Request Aborted' ) ;
203
+ void stream ! . readable . cancel ( 'Request Aborted' ) ;
204
+ } ) ;
205
+ context . setStream ( stream . readable ) ;
206
+ writer = stream . writable . getWriter ( ) ;
207
+ await writer . ready ;
208
+ await writer . write ( encode . encode ( text ) ) ;
209
+ await writer . ready ;
210
+ await writer . write ( value ) ;
211
+ }
212
+ }
213
+
214
+ if ( isStreaming ) {
215
+ isStreaming = false ;
216
+ await writer ! . ready ;
217
+ await writer ! . close ( ) ;
218
+ }
219
+ }
216
220
// if we are an error, we will want to throw
217
221
if ( isError ) {
218
222
let errorPayload : object | undefined ;
0 commit comments