@@ -104,21 +104,28 @@ export abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonProv
104
104
return this ;
105
105
}
106
106
107
- const clientEmitter = this . getAndCacheEventEmitterForClient ( clientName ) ;
107
+ // get the named emitter, or if this is the default provider, get all event emitters not associated with a provider
108
+ const emitters = clientName ? [ this . _clientEvents . get ( clientName ) ] : this . getUnboundEmitters ( ) ;
108
109
109
110
if ( typeof provider . initialize === 'function' ) {
110
111
provider
111
112
. initialize ?.( this . _context )
112
113
?. then ( ( ) => {
113
- clientEmitter . emit ( ProviderEvents . Ready , { clientName } ) ;
114
+ emitters . forEach ( ( emitter ) => {
115
+ emitter ?. emit ( ProviderEvents . Ready , { clientName } ) ;
116
+ } ) ;
114
117
this . _events ?. emit ( ProviderEvents . Ready , { clientName } ) ;
115
118
} )
116
119
?. catch ( ( error ) => {
117
- clientEmitter . emit ( ProviderEvents . Error , { clientName, message : error . message } ) ;
120
+ emitters . forEach ( ( emitter ) => {
121
+ emitter ?. emit ( ProviderEvents . Error , { clientName, message : error . message } ) ;
122
+ } ) ;
118
123
this . _events ?. emit ( ProviderEvents . Error , { clientName, message : error . message } ) ;
119
124
} ) ;
120
125
} else {
121
- clientEmitter . emit ( ProviderEvents . Ready , { clientName } ) ;
126
+ emitters . forEach ( ( emitter ) => {
127
+ emitter ?. emit ( ProviderEvents . Ready , { clientName } ) ;
128
+ } ) ;
122
129
this . _events ?. emit ( ProviderEvents . Ready , { clientName } ) ;
123
130
}
124
131
@@ -128,7 +135,7 @@ export abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonProv
128
135
this . _defaultProvider = provider ;
129
136
}
130
137
131
- this . transferListeners ( oldProvider , provider , clientName , clientEmitter ) ;
138
+ this . transferListeners ( oldProvider , provider , clientName , emitters ) ;
132
139
133
140
// Do not close a provider that is bound to any client
134
141
if ( ! [ ...this . _clientProviders . values ( ) , this . _defaultProvider ] . includes ( oldProvider ) ) {
@@ -167,11 +174,18 @@ export abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonProv
167
174
return newEmitter ;
168
175
}
169
176
177
+ private getUnboundEmitters ( ) : OpenFeatureEventEmitter [ ] {
178
+ const namedProviders = [ ...this . _clientProviders . keys ( ) ] ;
179
+ const eventEmitterNames = [ ...this . _clientEvents . keys ( ) ] . filter ( key => key ) as string [ ] ;
180
+ const unboundEmitterNames = eventEmitterNames . filter ( name => ! namedProviders . includes ( name ) ) ;
181
+ return unboundEmitterNames . map ( name => this . _clientEvents . get ( name ) ! ) ;
182
+ }
183
+
170
184
private transferListeners (
171
185
oldProvider : P ,
172
186
newProvider : P ,
173
187
clientName : string | undefined ,
174
- clientEmitter : OpenFeatureEventEmitter
188
+ emitters : ( OpenFeatureEventEmitter | undefined ) [ ]
175
189
) {
176
190
this . _clientEventHandlers
177
191
. get ( clientName )
@@ -182,7 +196,9 @@ export abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonProv
182
196
( eventType ) => {
183
197
const handler = async ( details ?: EventDetails ) => {
184
198
// on each event type, fire the associated handlers
185
- clientEmitter . emit ( eventType , { ...details , clientName } ) ;
199
+ emitters . forEach ( emitter => {
200
+ emitter ?. emit ( eventType , { ...details , clientName } ) ;
201
+ } ) ;
186
202
this . _events . emit ( eventType , { ...details , clientName } ) ;
187
203
} ;
188
204
0 commit comments