Skip to content

Commit c44b18e

Browse files
authored
fix: events on anon provider/client (#480)
* fix an issue where events would fail to run on the default provider anonymous client if the provider was changed --------- Signed-off-by: Todd Baert <[email protected]>
1 parent e15bf8c commit c44b18e

File tree

3 files changed

+82
-3
lines changed

3 files changed

+82
-3
lines changed

Diff for: packages/client/test/events.spec.ts

+38-1
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,44 @@ describe('Events', () => {
197197
OpenFeature.setProvider(clientId, provider);
198198
});
199199

200-
it('anonymous provider with named client should run', (done) => {
200+
it('anonymous provider with anonymous client should run non-init events', (done) => {
201+
const defaultProvider = new MockProvider({
202+
failOnInit: false,
203+
initialStatus: ProviderStatus.NOT_READY,
204+
name: 'default',
205+
});
206+
207+
// get a anon client
208+
const anonClient = OpenFeature.getClient();
209+
anonClient.addHandler(ProviderEvents.ConfigurationChanged, () => {
210+
done();
211+
});
212+
213+
// set the default provider
214+
OpenFeature.setProvider(defaultProvider);
215+
216+
// fire events
217+
defaultProvider.events?.emit(ProviderEvents.ConfigurationChanged);
218+
});
219+
220+
it('anonymous provider with anonymous client should run init events', (done) => {
221+
const defaultProvider = new MockProvider({
222+
failOnInit: false,
223+
initialStatus: ProviderStatus.NOT_READY,
224+
name: 'default',
225+
});
226+
227+
// get a anon client
228+
const anonClient = OpenFeature.getClient();
229+
anonClient.addHandler(ProviderEvents.Ready, () => {
230+
done();
231+
});
232+
233+
// set the default provider
234+
OpenFeature.setProvider(defaultProvider);
235+
});
236+
237+
it('anonymous provider with named client should run non-init events', (done) => {
201238
const defaultProvider = new MockProvider({
202239
failOnInit: false,
203240
initialStatus: ProviderStatus.NOT_READY,

Diff for: packages/server/test/events.spec.ts

+38-1
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,44 @@ describe('Events', () => {
200200
OpenFeature.setProvider(clientId, provider);
201201
});
202202

203-
it('anonymous provider with named client should run', (done) => {
203+
it('anonymous provider with anonymous client should run non-init events', (done) => {
204+
const defaultProvider = new MockProvider({
205+
failOnInit: false,
206+
initialStatus: ProviderStatus.NOT_READY,
207+
name: 'default',
208+
});
209+
210+
// get a anon client
211+
const anonClient = OpenFeature.getClient();
212+
anonClient.addHandler(ProviderEvents.ConfigurationChanged, () => {
213+
done();
214+
});
215+
216+
// set the default provider
217+
OpenFeature.setProvider(defaultProvider);
218+
219+
// fire events
220+
defaultProvider.events?.emit(ProviderEvents.ConfigurationChanged);
221+
});
222+
223+
it('anonymous provider with anonymous client should run init events', (done) => {
224+
const defaultProvider = new MockProvider({
225+
failOnInit: false,
226+
initialStatus: ProviderStatus.NOT_READY,
227+
name: 'default',
228+
});
229+
230+
// get a anon client
231+
const anonClient = OpenFeature.getClient();
232+
anonClient.addHandler(ProviderEvents.Ready, () => {
233+
done();
234+
});
235+
236+
// set the default provider
237+
OpenFeature.setProvider(defaultProvider);
238+
});
239+
240+
it('anonymous provider with named client should run non-init events', (done) => {
204241
const defaultProvider = new MockProvider({
205242
failOnInit: false,
206243
initialStatus: ProviderStatus.NOT_READY,

Diff for: packages/shared/src/open-feature.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,12 @@ export abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonProv
191191
const namedProviders = [...this._clientProviders.keys()];
192192
const eventEmitterNames = [...this._clientEvents.keys()].filter(isDefined);
193193
const unboundEmitterNames = eventEmitterNames.filter((name) => !namedProviders.includes(name));
194-
return unboundEmitterNames.map((name) => this._clientEvents.get(name)).filter(isDefined);
194+
return [
195+
// all unbound, named emitters
196+
...unboundEmitterNames.map((name) => this._clientEvents.get(name)),
197+
// the default emitter
198+
this._clientEvents.get(undefined)
199+
].filter(isDefined);
195200
}
196201

197202
private transferListeners(

0 commit comments

Comments
 (0)