@@ -45,7 +45,7 @@ import { EdsState } from './xds-stream-state/eds-state';
45
45
import { CdsState } from './xds-stream-state/cds-state' ;
46
46
import { RdsState } from './xds-stream-state/rds-state' ;
47
47
import { LdsState } from './xds-stream-state/lds-state' ;
48
- import { Watcher } from './xds-stream-state/xds-stream-state' ;
48
+ import { HandleResponseResult , ResourcePair , Watcher } from './xds-stream-state/xds-stream-state' ;
49
49
import { ClusterLoadAssignment__Output } from './generated/envoy/config/endpoint/v3/ClusterLoadAssignment' ;
50
50
import { Cluster__Output } from './generated/envoy/config/cluster/v3/Cluster' ;
51
51
import { RouteConfiguration__Output } from './generated/envoy/config/route/v3/RouteConfiguration' ;
@@ -242,11 +242,14 @@ function getResponseMessages<T extends AdsTypeUrl>(
242
242
targetTypeUrl : T ,
243
243
allowedTypeUrls : string [ ] ,
244
244
resources : Any__Output [ ]
245
- ) : AdsOutputType < T > [ ] {
246
- const result : AdsOutputType < T > [ ] = [ ] ;
245
+ ) : ResourcePair < AdsOutputType < T > > [ ] {
246
+ const result : ResourcePair < AdsOutputType < T > > [ ] = [ ] ;
247
247
for ( const resource of resources ) {
248
248
if ( allowedTypeUrls . includes ( resource . type_url ) ) {
249
- result . push ( decodeSingleResource ( targetTypeUrl , resource . value ) ) ;
249
+ result . push ( {
250
+ resource : decodeSingleResource ( targetTypeUrl , resource . value ) ,
251
+ raw : resource
252
+ } ) ;
250
253
} else {
251
254
throw new Error (
252
255
`ADS Error: Invalid resource type ${ resource . type_url } , expected ${ allowedTypeUrls } `
@@ -450,8 +453,10 @@ export class XdsClient {
450
453
}
451
454
452
455
private handleAdsResponse ( message : DiscoveryResponse__Output ) {
453
- let errorString : string | null ;
454
- let serviceKind : AdsServiceKind ;
456
+ let handleResponseResult : {
457
+ result : HandleResponseResult ;
458
+ serviceKind : AdsServiceKind ;
459
+ } | null = null ;
455
460
let isV2 : boolean ;
456
461
switch ( message . type_url ) {
457
462
case EDS_TYPE_URL_V2 :
@@ -463,56 +468,71 @@ export class XdsClient {
463
468
default :
464
469
isV2 = false ;
465
470
}
466
- switch ( message . type_url ) {
467
- case EDS_TYPE_URL_V2 :
468
- case EDS_TYPE_URL_V3 :
469
- errorString = this . adsState . eds . handleResponses (
470
- getResponseMessages ( EDS_TYPE_URL_V3 , [ EDS_TYPE_URL_V2 , EDS_TYPE_URL_V3 ] , message . resources ) ,
471
- isV2
472
- ) ;
473
- serviceKind = 'eds' ;
474
- break ;
475
- case CDS_TYPE_URL_V2 :
476
- case CDS_TYPE_URL_V3 :
477
- errorString = this . adsState . cds . handleResponses (
478
- getResponseMessages ( CDS_TYPE_URL_V3 , [ CDS_TYPE_URL_V2 , CDS_TYPE_URL_V3 ] , message . resources ) ,
479
- isV2
480
- ) ;
481
- serviceKind = 'cds' ;
482
- break ;
483
- case RDS_TYPE_URL_V2 :
484
- case RDS_TYPE_URL_V3 :
485
- errorString = this . adsState . rds . handleResponses (
486
- getResponseMessages ( RDS_TYPE_URL_V3 , [ RDS_TYPE_URL_V2 , RDS_TYPE_URL_V3 ] , message . resources ) ,
487
- isV2
488
- ) ;
489
- serviceKind = 'rds' ;
490
- break ;
491
- case LDS_TYPE_URL_V2 :
492
- case LDS_TYPE_URL_V3 :
493
- errorString = this . adsState . lds . handleResponses (
494
- getResponseMessages ( LDS_TYPE_URL_V3 , [ LDS_TYPE_URL_V2 , LDS_TYPE_URL_V3 ] , message . resources ) ,
495
- isV2
496
- ) ;
497
- serviceKind = 'lds' ;
498
- break ;
499
- default :
500
- errorString = `Unknown type_url ${ message . type_url } ` ;
501
- // This is not used in this branch, but setting it makes the types easier to handle
502
- serviceKind = 'eds' ;
471
+ try {
472
+ switch ( message . type_url ) {
473
+ case EDS_TYPE_URL_V2 :
474
+ case EDS_TYPE_URL_V3 :
475
+ handleResponseResult = {
476
+ result : this . adsState . eds . handleResponses (
477
+ getResponseMessages ( EDS_TYPE_URL_V3 , [ EDS_TYPE_URL_V2 , EDS_TYPE_URL_V3 ] , message . resources ) ,
478
+ isV2
479
+ ) ,
480
+ serviceKind : 'eds'
481
+ } ;
482
+ break ;
483
+ case CDS_TYPE_URL_V2 :
484
+ case CDS_TYPE_URL_V3 :
485
+ handleResponseResult = {
486
+ result : this . adsState . cds . handleResponses (
487
+ getResponseMessages ( CDS_TYPE_URL_V3 , [ CDS_TYPE_URL_V2 , CDS_TYPE_URL_V3 ] , message . resources ) ,
488
+ isV2
489
+ ) ,
490
+ serviceKind : 'cds'
491
+ } ;
492
+ break ;
493
+ case RDS_TYPE_URL_V2 :
494
+ case RDS_TYPE_URL_V3 :
495
+ handleResponseResult = {
496
+ result : this . adsState . rds . handleResponses (
497
+ getResponseMessages ( RDS_TYPE_URL_V3 , [ RDS_TYPE_URL_V2 , RDS_TYPE_URL_V3 ] , message . resources ) ,
498
+ isV2
499
+ ) ,
500
+ serviceKind : 'rds'
501
+ } ;
502
+ break ;
503
+ case LDS_TYPE_URL_V2 :
504
+ case LDS_TYPE_URL_V3 :
505
+ handleResponseResult = {
506
+ result : this . adsState . lds . handleResponses (
507
+ getResponseMessages ( LDS_TYPE_URL_V3 , [ LDS_TYPE_URL_V2 , LDS_TYPE_URL_V3 ] , message . resources ) ,
508
+ isV2
509
+ ) ,
510
+ serviceKind : 'lds'
511
+ }
512
+ break ;
513
+ }
514
+ } catch ( e ) {
515
+ trace ( 'Nacking message with protobuf parsing error: ' + e . message ) ;
516
+ this . nack ( message . type_url , e . message ) ;
503
517
}
504
- if ( errorString === null ) {
505
- trace ( 'Acking message with type URL ' + message . type_url ) ;
506
- /* errorString can only be null in one of the first 4 cases, which
507
- * implies that message.type_url is one of the 4 known type URLs, which
508
- * means that this type assertion is valid. */
509
- const typeUrl = message . type_url as AdsTypeUrl ;
510
- this . adsState [ serviceKind ] . nonce = message . nonce ;
511
- this . adsState [ serviceKind ] . versionInfo = message . version_info ;
512
- this . ack ( serviceKind ) ;
518
+ if ( handleResponseResult === null ) {
519
+ // Null handleResponseResult means that the type_url was unrecognized
520
+ trace ( 'Nacking message with unknown type URL ' + message . type_url ) ;
521
+ this . nack ( message . type_url , `Unknown type_url ${ message . type_url } ` ) ;
513
522
} else {
514
- trace ( 'Nacking message with type URL ' + message . type_url + ': "' + errorString + '"' ) ;
515
- this . nack ( message . type_url , errorString ) ;
523
+ if ( handleResponseResult . result . rejected . length > 0 ) {
524
+ // rejected.length > 0 means that at least one message validation failed
525
+ const errorString = `${ handleResponseResult . serviceKind . toUpperCase ( ) } Error: ${ handleResponseResult . result . rejected [ 0 ] . error } ` ;
526
+ trace ( 'Nacking message with type URL ' + message . type_url + ': ' + errorString ) ;
527
+ this . nack ( message . type_url , errorString ) ;
528
+ } else {
529
+ // If we get here, all message validation succeeded
530
+ trace ( 'Acking message with type URL ' + message . type_url ) ;
531
+ const serviceKind = handleResponseResult . serviceKind ;
532
+ this . adsState [ serviceKind ] . nonce = message . nonce ;
533
+ this . adsState [ serviceKind ] . versionInfo = message . version_info ;
534
+ this . ack ( serviceKind ) ;
535
+ }
516
536
}
517
537
}
518
538
0 commit comments