@@ -12,6 +12,7 @@ import {
1212    isFeatureFlag , 
1313    isSecretReference , 
1414    GetSnapshotOptions , 
15+     ListConfigurationSettingsForSnapshotOptions , 
1516    GetSnapshotResponse , 
1617    KnownSnapshotComposition 
1718}  from  "@azure/app-configuration" ; 
@@ -490,71 +491,50 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
490491     */ 
491492    async  #loadConfigurationSettings( loadFeatureFlag : boolean  =  false ) : Promise < ConfigurationSetting [ ] >  { 
492493        const  selectors  =  loadFeatureFlag  ? this . #ffSelectors : this . #kvSelectors; 
493-         const  funcToExecute  =  async  ( client )  =>  { 
494-             // Use a Map to deduplicate configuration settings by key. When multiple selectors return settings with the same key, 
495-             // the configuration setting loaded by the later selector in the iteration order will override the one from the earlier selector. 
496-             const  loadedSettings : Map < string ,  ConfigurationSetting >  =  new  Map < string ,  ConfigurationSetting > ( ) ; 
497-             // deep copy selectors to avoid modification if current client fails 
498-             const  selectorsToUpdate : PagedSettingsWatcher [ ]  =  JSON . parse ( 
499-                 JSON . stringify ( selectors ) 
500-             ) ; 
501494
502-             for  ( const  selector  of  selectorsToUpdate )  { 
503-                 if  ( selector . snapshotName  ===  undefined )  { 
504-                     const  listOptions : ListConfigurationSettingsOptions  =  { 
505-                         keyFilter : selector . keyFilter , 
506-                         labelFilter : selector . labelFilter , 
507-                         tagsFilter : selector . tagFilters 
508-                     } ; 
509-                     const  pageWatchers : SettingWatcher [ ]  =  [ ] ; 
510-                     const  pageIterator  =  listConfigurationSettingsWithTrace ( 
511-                         this . #requestTraceOptions, 
512-                         client , 
513-                         listOptions 
514-                     ) . byPage ( ) ; 
515- 
516-                     for  await  ( const  page  of  pageIterator )  { 
517-                         pageWatchers . push ( {  etag : page . etag  } ) ; 
518-                         for  ( const  setting  of  page . items )  { 
519-                             if  ( loadFeatureFlag  ===  isFeatureFlag ( setting ) )  { 
520-                                 loadedSettings . set ( setting . key ,  setting ) ; 
521-                             } 
522-                         } 
523-                     } 
524-                     selector . pageWatchers  =  pageWatchers ; 
525-                 }  else  {  // snapshot selector 
526-                     const  snapshot  =  await  this . #getSnapshot( selector . snapshotName ) ; 
527-                     if  ( snapshot  ===  undefined )  { 
528-                         throw  new  InvalidOperationError ( `Could not find snapshot with name ${ selector . snapshotName }  .` ) ; 
529-                     } 
530-                     if  ( snapshot . compositionType  !=  KnownSnapshotComposition . Key )  { 
531-                         throw  new  InvalidOperationError ( `Composition type for the selected snapshot with name ${ selector . snapshotName }   must be 'key'.` ) ; 
532-                     } 
533-                     const  pageIterator  =  listConfigurationSettingsForSnapshotWithTrace ( 
534-                         this . #requestTraceOptions, 
535-                         client , 
536-                         selector . snapshotName 
537-                     ) . byPage ( ) ; 
538- 
539-                     for  await  ( const  page  of  pageIterator )  { 
540-                         for  ( const  setting  of  page . items )  { 
541-                             if  ( loadFeatureFlag  ===  isFeatureFlag ( setting ) )  { 
542-                                 loadedSettings . set ( setting . key ,  setting ) ; 
543-                             } 
544-                         } 
545-                     } 
495+         // Use a Map to deduplicate configuration settings by key. When multiple selectors return settings with the same key, 
496+         // the configuration setting loaded by the later selector in the iteration order will override the one from the earlier selector. 
497+         const  loadedSettings : Map < string ,  ConfigurationSetting >  =  new  Map < string ,  ConfigurationSetting > ( ) ; 
498+         // deep copy selectors to avoid modification if current client fails 
499+         const  selectorsToUpdate : PagedSettingsWatcher [ ]  =  JSON . parse ( 
500+             JSON . stringify ( selectors ) 
501+         ) ; 
502+ 
503+         for  ( const  selector  of  selectorsToUpdate )  { 
504+             let  settings : ConfigurationSetting [ ]  =  [ ] ; 
505+             if  ( selector . snapshotName  ===  undefined )  { 
506+                 const  listOptions : ListConfigurationSettingsOptions  =  { 
507+                     keyFilter : selector . keyFilter , 
508+                     labelFilter : selector . labelFilter , 
509+                     tagsFilter : selector . tagFilters 
510+                 } ; 
511+                 const  {  items,  pageWatchers }  =  await  this . #listConfigurationSettings( listOptions ) ; 
512+                 selector . pageWatchers  =  pageWatchers ; 
513+                 settings  =  items ; 
514+             }  else  {  // snapshot selector 
515+                 const  snapshot  =  await  this . #getSnapshot( selector . snapshotName ) ; 
516+                 if  ( snapshot  ===  undefined )  { 
517+                     throw  new  InvalidOperationError ( `Could not find snapshot with name ${ selector . snapshotName }  .` ) ; 
518+                 } 
519+                 if  ( snapshot . compositionType  !=  KnownSnapshotComposition . Key )  { 
520+                     throw  new  InvalidOperationError ( `Composition type for the selected snapshot with name ${ selector . snapshotName }   must be 'key'.` ) ; 
546521                } 
522+                 settings  =  await  this . #listConfigurationSettingsForSnapshot( selector . snapshotName ) ; 
547523            } 
548524
549-             if   ( loadFeatureFlag )  { 
550-                 this . #ffSelectors  =   selectorsToUpdate ; 
551-             }   else   { 
552-                 this . #kvSelectors  =   selectorsToUpdate ; 
525+             for   ( const   setting   of   settings )  { 
526+                 if   ( loadFeatureFlag   ===   isFeatureFlag ( setting ) )   { 
527+                      loadedSettings . set ( setting . key ,   setting ) ; 
528+                 } 
553529            } 
554-             return  Array . from ( loadedSettings . values ( ) ) ; 
555-         } ; 
530+         } 
556531
557-         return  await  this . #executeWithFailoverPolicy( funcToExecute )  as  ConfigurationSetting [ ] ; 
532+         if  ( loadFeatureFlag )  { 
533+             this . #ffSelectors =  selectorsToUpdate ; 
534+         }  else  { 
535+             this . #kvSelectors =  selectorsToUpdate ; 
536+         } 
537+         return  Array . from ( loadedSettings . values ( ) ) ; 
558538    } 
559539
560540    /** 
@@ -762,13 +742,13 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
762742    /** 
763743     * Gets a configuration setting by key and label.If the setting is not found, return undefine instead of throwing an error. 
764744     */ 
765-     async  #getConfigurationSetting( configurationSettingId : ConfigurationSettingId ,  customOptions ?: GetConfigurationSettingOptions ) : Promise < GetConfigurationSettingResponse  |  undefined >  { 
745+     async  #getConfigurationSetting( configurationSettingId : ConfigurationSettingId ,  getOptions ?: GetConfigurationSettingOptions ) : Promise < GetConfigurationSettingResponse  |  undefined >  { 
766746        const  funcToExecute  =  async  ( client )  =>  { 
767747            return  getConfigurationSettingWithTrace ( 
768748                this . #requestTraceOptions, 
769749                client , 
770750                configurationSettingId , 
771-                 customOptions 
751+                 getOptions 
772752            ) ; 
773753        } ; 
774754
@@ -785,13 +765,33 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
785765        return  response ; 
786766    } 
787767
788-     async  #getSnapshot( snapshotName : string ,  customOptions ?: GetSnapshotOptions ) : Promise < GetSnapshotResponse  |  undefined >  { 
768+     async  #listConfigurationSettings( listOptions : ListConfigurationSettingsOptions ) : Promise < {  items : ConfigurationSetting [ ] ;  pageWatchers : SettingWatcher [ ]  } >  { 
769+         const  funcToExecute  =  async  ( client )  =>  { 
770+             const  pageWatchers : SettingWatcher [ ]  =  [ ] ; 
771+             const  pageIterator  =  listConfigurationSettingsWithTrace ( 
772+                 this . #requestTraceOptions, 
773+                 client , 
774+                 listOptions 
775+             ) . byPage ( ) ; 
776+ 
777+             const  items : ConfigurationSetting [ ]  =  [ ] ; 
778+             for  await  ( const  page  of  pageIterator )  { 
779+                 pageWatchers . push ( {  etag : page . etag  } ) ; 
780+                 items . push ( ...page . items ) ; 
781+             } 
782+             return  {  items,  pageWatchers } ; 
783+         } ; 
784+ 
785+         return  await  this . #executeWithFailoverPolicy( funcToExecute ) ; 
786+     } 
787+ 
788+     async  #getSnapshot( snapshotName : string ,  getOptions ?: GetSnapshotOptions ) : Promise < GetSnapshotResponse  |  undefined >  { 
789789        const  funcToExecute  =  async  ( client )  =>  { 
790790            return  getSnapshotWithTrace ( 
791791                this . #requestTraceOptions, 
792792                client , 
793793                snapshotName , 
794-                 customOptions 
794+                 getOptions 
795795            ) ; 
796796        } ; 
797797
@@ -808,6 +808,25 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
808808        return  response ; 
809809    } 
810810
811+     async  #listConfigurationSettingsForSnapshot( snapshotName : string ,  listOptions ?: ListConfigurationSettingsForSnapshotOptions ) : Promise < ConfigurationSetting [ ] >  { 
812+         const  funcToExecute  =  async  ( client )  =>  { 
813+             const  pageIterator  =  listConfigurationSettingsForSnapshotWithTrace ( 
814+                 this . #requestTraceOptions, 
815+                 client , 
816+                 snapshotName , 
817+                 listOptions 
818+             ) . byPage ( ) ; 
819+ 
820+             const  items : ConfigurationSetting [ ]  =  [ ] ; 
821+             for  await  ( const  page  of  pageIterator )  { 
822+                 items . push ( ...page . items ) ; 
823+             } 
824+             return  items ; 
825+         } ; 
826+ 
827+         return  await  this . #executeWithFailoverPolicy( funcToExecute ) ; 
828+     } 
829+ 
811830    // Only operations related to Azure App Configuration should be executed with failover policy. 
812831    async  #executeWithFailoverPolicy( funcToExecute : ( client : AppConfigurationClient )  =>  Promise < any > ) : Promise < any >  { 
813832        let  clientWrappers  =  await  this . #clientManager. getClients ( ) ; 
@@ -883,7 +902,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
883902    #setAIConfigurationTracing( setting : ConfigurationSetting < string > ) : void   { 
884903        if  ( this . #requestTracingEnabled &&  this . #aiConfigurationTracing !==  undefined )  { 
885904            const  contentType  =  parseContentType ( setting . contentType ) ; 
886-             // content type: "application/json; profile=\"https://azconfig.io/mime-profiles/ai\"""  
905+             // content type: "application/json; profile=\"https://azconfig.io/mime-profiles/ai\"" 
887906            if  ( isJsonContentType ( contentType )  && 
888907                ! isFeatureFlagContentType ( contentType )  && 
889908                ! isSecretReferenceContentType ( contentType ) )  { 
0 commit comments