@@ -680,25 +680,56 @@ class Extensions extends Disposable {
680
680
}
681
681
}
682
682
// Detect extensions that do not have a corresponding gallery entry.
683
- // This indicates that it was likely removed from the gallery
684
683
if ( flagExtensionsMissingFromGallery ) {
684
+ const extensionsToQuery = [ ] ;
685
685
for ( const extension of this . local ) {
686
- if ( ! extension . identifier . uuid ) {
686
+ // Extension is already paired with a gallery object
687
+ if ( extension . gallery ) {
687
688
continue ;
688
689
}
689
- if ( ! flagExtensionsMissingFromGallery . some ( f => areSameExtensions ( f , extension . identifier ) ) ) {
690
+ // Already flagged as missing from gallery
691
+ if ( extension . missingFromGallery ) {
690
692
continue ;
691
693
}
692
- if ( galleryExtensions . find ( g => areSameExtensions ( g . identifier , extension . identifier ) ) ) {
694
+ // A UUID indicates extension originated from gallery
695
+ if ( ! extension . identifier . uuid ) {
693
696
continue ;
694
697
}
695
- const [ gallery ] = await this . galleryService . getExtensions ( [ { ...extension . identifier , version : extension . version } ] , CancellationToken . None ) ;
696
- if ( gallery ) {
697
- extension . gallery = gallery ;
698
- } else {
699
- extension . missingFromGallery = true ;
698
+ // Extension is not present in the set we are concerned about
699
+ if ( ! flagExtensionsMissingFromGallery . some ( f => areSameExtensions ( f , extension . identifier ) ) ) {
700
+ continue ;
700
701
}
701
- this . _onChange . fire ( { extension } ) ;
702
+ extensionsToQuery . push ( extension ) ;
703
+ }
704
+ if ( extensionsToQuery . length ) {
705
+ const queryResult = await this . galleryService . getExtensions ( extensionsToQuery . map ( e => ( { ...e . identifier , version : e . version } ) ) , CancellationToken . None ) ;
706
+ const queriedIds : string [ ] = [ ] ;
707
+ const missingIds : string [ ] = [ ] ;
708
+ for ( const extension of extensionsToQuery ) {
709
+ queriedIds . push ( extension . identifier . id ) ;
710
+ const gallery = queryResult . find ( g => areSameExtensions ( g . identifier , extension . identifier ) ) ;
711
+ if ( gallery ) {
712
+ extension . gallery = gallery ;
713
+ } else {
714
+ extension . missingFromGallery = true ;
715
+ missingIds . push ( extension . identifier . id ) ;
716
+ }
717
+ this . _onChange . fire ( { extension } ) ;
718
+ }
719
+ type MissingFromGalleryClassification = {
720
+ owner : 'joshspicer' ;
721
+ comment : 'Report when installed extensions are no longer available in the gallery' ;
722
+ queriedIds : { classification : 'SystemMetaData' ; purpose : 'FeatureInsight' ; comment : 'Extensions queried as potentially missing from gallery' } ;
723
+ missingIds : { classification : 'SystemMetaData' ; purpose : 'FeatureInsight' ; comment : 'Extensions determined missing from gallery' } ;
724
+ } ;
725
+ type MissingFromGalleryEvent = {
726
+ readonly queriedIds : TelemetryTrustedValue < string > ;
727
+ readonly missingIds : TelemetryTrustedValue < string > ;
728
+ } ;
729
+ this . telemetryService . publicLog2 < MissingFromGalleryEvent , MissingFromGalleryClassification > ( 'extensions:missingFromGallery' , {
730
+ queriedIds : new TelemetryTrustedValue ( queriedIds . join ( ';' ) ) ,
731
+ missingIds : new TelemetryTrustedValue ( missingIds . join ( ';' ) )
732
+ } ) ;
702
733
}
703
734
}
704
735
}
0 commit comments