Skip to content

Commit 47d1634

Browse files
authored
feat!: use bundled event emitter type (#389)
⚠️ This change only impacts the experimental web-sdk. This includes an aliased, bundled version of `EventEmitter` so we have full control over that API/implementation, and consumers don't need the `events` dep for browsers. We currently bundle [events](https://www.npmjs.com/package/events) (a browser polyfill for the node events API) into this package, but a provider author who wants to implement events in their provider would need to install that package as well. This removes the need for that. Interested in others' thoughts. --------- Signed-off-by: Todd Baert <[email protected]>
1 parent eb00fb0 commit 47d1634

File tree

5 files changed

+20
-10
lines changed

5 files changed

+20
-10
lines changed

packages/client/src/client.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
ResolutionDetails,
1616
StandardResolutionReasons
1717
} from '@openfeature/shared';
18-
import { EventEmitter } from 'events';
18+
import { OpenFeatureEventEmitter } from '.';
1919
import { OpenFeature } from './open-feature';
2020
import { Client, FlagEvaluationOptions, Hook, Provider } from './types';
2121

@@ -40,7 +40,7 @@ export class OpenFeatureClient implements Client {
4040
// and so we don't have to make these public properties on the API class.
4141
private readonly providerAccessor: () => Provider,
4242
private readonly providerReady: () => boolean,
43-
apiEvents: () => EventEmitter,
43+
apiEvents: () => OpenFeatureEventEmitter,
4444
private readonly globalLogger: () => Logger,
4545
options: OpenFeatureClientOptions,
4646
) {

packages/client/src/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
1+
import { EventEmitter } from 'events';
2+
// this must precede other exports
3+
export { EventEmitter as OpenFeatureEventEmitter };
24
export * from './client';
35
export * from './no-op-provider';
46
export * from './open-feature';

packages/client/src/open-feature.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ApiEvents, EvaluationContext, FlagValue, Logger, OpenFeatureCommonAPI, ProviderEvents, ProviderMetadata, SafeLogger } from '@openfeature/shared';
2-
import { EventEmitter } from 'events';
2+
import { OpenFeatureEventEmitter } from '.';
33
import { OpenFeatureClient } from './client';
44
import { NOOP_PROVIDER } from './no-op-provider';
55
import { Client, Hook, Provider } from './types';
@@ -14,7 +14,7 @@ const _globalThis = globalThis as OpenFeatureGlobal;
1414

1515
export class OpenFeatureAPI extends OpenFeatureCommonAPI {
1616

17-
private _apiEvents = new EventEmitter();
17+
private _apiEvents = new OpenFeatureEventEmitter();
1818
private _providerReady = false;
1919
protected _hooks: Hook[] = [];
2020
protected _provider: Provider = NOOP_PROVIDER;
@@ -83,7 +83,7 @@ export class OpenFeatureAPI extends OpenFeatureCommonAPI {
8383
this._providerReady = false;
8484

8585
if (!this._provider.events) {
86-
this._provider.events = new EventEmitter();
86+
this._provider.events = new OpenFeatureEventEmitter();
8787
}
8888

8989
if (typeof this._provider?.initialize === 'function') {

packages/client/src/types.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
ProviderMetadata,
1717
ResolutionDetails,
1818
} from '@openfeature/shared';
19-
import EventEmitter from 'events';
19+
import { OpenFeatureEventEmitter } from '.';
2020

2121
/**
2222
* Interface that providers must implement to resolve flag values for their particular
@@ -36,9 +36,10 @@ export interface Provider extends CommonProvider {
3636

3737
/**
3838
* An event emitter for ProviderEvents.
39+
*
3940
* @see ProviderEvents
4041
*/
41-
events?: EventEmitter;
42+
events?: OpenFeatureEventEmitter;
4243

4344
/**
4445
* A handler function to reconcile changes when the static context.

rollup.config.mjs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,17 @@ export default {
1010
file: './dist/types.d.ts',
1111
format: 'es', // module format doesn't really matter here since output i
1212
},
13+
external: [
14+
// function indicating which deps should be considered external: non-external deps will have their types bundled
15+
(id) => {
16+
// bundle 'events' types
17+
return id !== 'events'
18+
}
19+
],
1320
plugins: [
1421
alias({
1522
entries: [{ find: '@openfeature/shared', replacement: '../shared/dist/types.d.ts' }],
1623
}),
17-
dts({tsconfig: './tsconfig.json'}),
18-
]
24+
dts({tsconfig: './tsconfig.json', respectExternal: true}),
25+
],
1926
};

0 commit comments

Comments
 (0)