@@ -34,6 +34,7 @@ goog.module.declareLegacyNamespace();
34
34
const ClientReadableStream = goog . require ( 'grpc.web.ClientReadableStream' ) ;
35
35
const ErrorCode = goog . require ( 'goog.net.ErrorCode' ) ;
36
36
const EventType = goog . require ( 'goog.net.EventType' ) ;
37
+ const GrpcWebError = goog . require ( 'grpc.web.Error' ) ;
37
38
const GrpcWebStreamParser = goog . require ( 'grpc.web.GrpcWebStreamParser' ) ;
38
39
const StatusCode = goog . require ( 'grpc.web.StatusCode' ) ;
39
40
const XhrIo = goog . require ( 'goog.net.XhrIo' ) ;
@@ -103,7 +104,7 @@ class GrpcWebClientReadableStream {
103
104
/**
104
105
* @const
105
106
* @private
106
- * @type {!Array<function(...):? > } The list of error callbacks
107
+ * @type {!Array<function(!GrpcWebError) > } The list of error callbacks
107
108
*/
108
109
this . onErrorCallbacks_ = [ ] ;
109
110
@@ -150,6 +151,11 @@ class GrpcWebClientReadableStream {
150
151
var byteSource = new Uint8Array (
151
152
/** @type {!ArrayBuffer } */ ( self . xhr_ . getResponse ( ) ) ) ;
152
153
} else {
154
+ self . handleError_ ( {
155
+ code : StatusCode . UNKNOWN ,
156
+ message : 'Unknown Content-type received.' ,
157
+ metadata : { } ,
158
+ } ) ;
153
159
return ;
154
160
}
155
161
var messages = self . parser_ . parse ( byteSource ) ;
@@ -184,11 +190,11 @@ class GrpcWebClientReadableStream {
184
190
grpcStatusMessage = trailers [ GRPC_STATUS_MESSAGE ] ;
185
191
delete trailers [ GRPC_STATUS_MESSAGE ] ;
186
192
}
187
- self . sendStatusCallbacks_ ( /** @type { !Status } */ ( {
193
+ self . handleError_ ( {
188
194
code : Number ( grpcStatusCode ) ,
189
- details : grpcStatusMessage ,
195
+ message : decodeURIComponent ( grpcStatusMessage ) ,
190
196
metadata : trailers ,
191
- } ) ) ;
197
+ } ) ;
192
198
}
193
199
}
194
200
}
@@ -227,9 +233,10 @@ class GrpcWebClientReadableStream {
227
233
if ( grpcStatusCode == StatusCode . ABORTED && self . aborted_ ) {
228
234
return ;
229
235
}
230
- self . sendErrorCallbacks_ ( {
236
+ self . handleError_ ( {
231
237
code : grpcStatusCode ,
232
- message : ErrorCode . getDebugMessage ( lastErrorCode )
238
+ message : ErrorCode . getDebugMessage ( lastErrorCode ) ,
239
+ metadata : { } ,
233
240
} ) ;
234
241
return ;
235
242
}
@@ -243,20 +250,13 @@ class GrpcWebClientReadableStream {
243
250
grpcStatusMessage = self . xhr_ . getResponseHeader ( GRPC_STATUS_MESSAGE ) ;
244
251
}
245
252
if ( Number ( grpcStatusCode ) != StatusCode . OK ) {
246
- self . sendErrorCallbacks_ ( {
253
+ self . handleError_ ( {
247
254
code : Number ( grpcStatusCode ) ,
248
255
message : grpcStatusMessage ,
249
256
metadata : responseHeaders
250
257
} ) ;
251
258
errorEmitted = true ;
252
259
}
253
- if ( ! errorEmitted ) {
254
- self . sendStatusCallbacks_ ( /** @type {!Status } */ ( {
255
- code : Number ( grpcStatusCode ) ,
256
- details : grpcStatusMessage ,
257
- metadata : responseHeaders
258
- } ) ) ;
259
- }
260
260
}
261
261
262
262
if ( ! errorEmitted ) {
@@ -353,6 +353,23 @@ class GrpcWebClientReadableStream {
353
353
return headers ;
354
354
}
355
355
356
+ /**
357
+ * A central place to handle errors
358
+ *
359
+ * @private
360
+ * @param {!GrpcWebError } error The error object
361
+ */
362
+ handleError_ ( error ) {
363
+ if ( error . code != StatusCode . OK ) {
364
+ this . sendErrorCallbacks_ ( error ) ;
365
+ }
366
+ this . sendStatusCallbacks_ ( /** @type {!Status } */ ( {
367
+ code : error . code ,
368
+ details : decodeURIComponent ( error . message || '' ) ,
369
+ metadata : error . metadata
370
+ } ) ) ;
371
+ }
372
+
356
373
/**
357
374
* @private
358
375
* @param {!RESPONSE } data The data to send back
@@ -385,7 +402,7 @@ class GrpcWebClientReadableStream {
385
402
386
403
/**
387
404
* @private
388
- * @param {? } error The error to send back
405
+ * @param {!GrpcWebError } error The error to send back
389
406
*/
390
407
sendErrorCallbacks_ ( error ) {
391
408
for ( var i = 0 ; i < this . onErrorCallbacks_ . length ; i ++ ) {
0 commit comments