Skip to content

Commit 28269a5

Browse files
committed
fix: named client events
* fixed issues where named client wouldnt get events from a default provider Signed-off-by: Todd Baert <[email protected]>
1 parent a8703ed commit 28269a5

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

packages/client/test/events.spec.ts

+23
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
EventDetails,
33
JsonValue,
4+
NOOP_PROVIDER,
45
OpenFeature,
56
OpenFeatureEventEmitter,
67
Provider,
@@ -76,6 +77,10 @@ describe('Events', () => {
7677
clientId = uuid();
7778
});
7879

80+
beforeEach(() => {
81+
OpenFeature.setProvider(NOOP_PROVIDER);
82+
});
83+
7984
describe('Requirement 5.1.1', () => {
8085
describe('provider implements events', () => {
8186
it('The provider defines a mechanism for signalling the occurrence of an event`PROVIDER_READY`', (done) => {
@@ -192,6 +197,24 @@ describe('Events', () => {
192197
OpenFeature.setProvider(clientId, provider);
193198
});
194199

200+
it('anonymous provider with named client should run', (done) => {
201+
const defaultProvider = new MockProvider({ failOnInit: false, initialStatus: ProviderStatus.NOT_READY, name: 'defauwlt' });
202+
const unboundName = 'some-new-unbound-name';
203+
204+
205+
// get a client using the default because it has not other mapping
206+
const unBoundClient = OpenFeature.getClient(unboundName);
207+
unBoundClient.addHandler(ProviderEvents.ConfigurationChanged, () => {
208+
done();
209+
});
210+
211+
// set the default provider
212+
OpenFeature.setProvider(defaultProvider);
213+
214+
// fire events
215+
defaultProvider.events?.emit(ProviderEvents.ConfigurationChanged);
216+
});
217+
195218
it('un-bound client event handlers still run after new provider set', (done) => {
196219
const defaultProvider = new MockProvider({ name: 'default' });
197220
const namedProvider = new MockProvider();

packages/shared/src/open-feature.ts

+14-4
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ export abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonProv
128128
this._defaultProvider = provider;
129129
}
130130

131-
this.transferListeners(oldProvider, provider, clientName, clientEmitter);
131+
this.transferListeners(oldProvider, provider, clientName);
132132

133133
// Do not close a provider that is bound to any client
134134
if (![...this._clientProviders.values(), this._defaultProvider].includes(oldProvider)) {
@@ -167,22 +167,32 @@ export abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonProv
167167
return newEmitter;
168168
}
169169

170+
private getUnboundEmitters(): OpenFeatureEventEmitter[] {
171+
const namedProviders = [...this._clientProviders.keys()];
172+
const eventEmitterNames = [...this._clientEvents.keys()].filter(k => !!k) as string[];
173+
const unboundEmitterNames = eventEmitterNames.filter(name => !namedProviders.includes(name));
174+
return unboundEmitterNames.map(name => this._clientEvents.get(name)!);
175+
}
176+
170177
private transferListeners(
171178
oldProvider: P,
172179
newProvider: P,
173-
clientName: string | undefined,
174-
clientEmitter: OpenFeatureEventEmitter
180+
clientName: string | undefined
175181
) {
176182
this._clientEventHandlers
177183
.get(clientName)
178184
?.forEach((eventHandler) => oldProvider.events?.removeHandler(...eventHandler));
179185

186+
const emittersToTransfer = !!clientName ? [this._clientEvents.get(clientName)!] : this.getUnboundEmitters();
187+
180188
// iterate over the event types
181189
const newClientHandlers = Object.values<ProviderEvents>(ProviderEvents).map<[ProviderEvents, EventHandler]>(
182190
(eventType) => {
183191
const handler = async (details?: EventDetails) => {
184192
// on each event type, fire the associated handlers
185-
clientEmitter.emit(eventType, { ...details, clientName });
193+
emittersToTransfer.forEach(emitter => {
194+
emitter.emit(eventType, { ...details, clientName });
195+
});
186196
this._events.emit(eventType, { ...details, clientName });
187197
};
188198

0 commit comments

Comments
 (0)