Skip to content

Commit 23d14aa

Browse files
beeme1mrtoddbaert
andauthored
feat: add named provider metadata accessor (#715)
## This PR - adds an accessor for named provider metadata ### Related Issues Fixes #714 ### Notes The default metadata is returned if the name doesn't match a registered provider. This is another example where provider namespace would work well. It doesn't make sense to call this "named client" since we are only interested in the client. --------- Signed-off-by: Michael Beemer <[email protected]> Co-authored-by: Todd Baert <[email protected]>
1 parent 954bd61 commit 23d14aa

File tree

3 files changed

+50
-8
lines changed

3 files changed

+50
-8
lines changed

packages/client/test/open-feature.spec.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@ describe('OpenFeature', () => {
3939
describe('Requirement 1.1.2.1', () => {
4040
it('should throw because the provider is not intended for the client', () => {
4141
const provider = mockProvider({ runsOn: 'server' });
42-
expect(() => OpenFeature.setProvider(provider)).toThrowError(
43-
"Provider 'mock-events-success' is intended for use on the server."
42+
expect(() => OpenFeature.setProvider(provider)).toThrow(
43+
"Provider 'mock-events-success' is intended for use on the server.",
4444
);
4545
});
4646
it('should succeed because the provider is intended for the client', () => {
4747
const provider = mockProvider({ runsOn: 'client' });
48-
expect(() => OpenFeature.setProvider(provider)).not.toThrowError();
48+
expect(() => OpenFeature.setProvider(provider)).not.toThrow();
4949
});
5050
});
5151

@@ -132,6 +132,22 @@ describe('OpenFeature', () => {
132132
OpenFeature.setProvider('client2', { ...provider1 });
133133
expect(provider1.onClose).toHaveBeenCalledTimes(1);
134134
});
135+
136+
it('should return the default provider metadata when passing an unregistered client name', async () => {
137+
const mockProvider = { metadata: { name: 'test' } } as unknown as Provider;
138+
OpenFeature.setProvider(mockProvider);
139+
const metadata = OpenFeature.getProviderMetadata('unused');
140+
expect(metadata.name === mockProvider.metadata.name).toBeTruthy();
141+
});
142+
143+
it('should return the named provider metadata when passing a registered client name', async () => {
144+
const mockProvider = { metadata: { name: 'mock' } } as unknown as Provider;
145+
const mockNamedProvider = { metadata: { name: 'named-mock' } } as unknown as Provider;
146+
OpenFeature.setProvider(mockProvider);
147+
OpenFeature.setProvider('mocked', mockNamedProvider);
148+
const metadata = OpenFeature.getProviderMetadata('mocked');
149+
expect(metadata.name === mockNamedProvider.metadata.name).toBeTruthy();
150+
});
135151
});
136152

137153
describe('Requirement 1.1.4', () => {

packages/server/test/open-feature.spec.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@ describe('OpenFeature', () => {
3939
describe('Requirement 1.1.2.1', () => {
4040
it('should throw because the provider is not intended for the server', () => {
4141
const provider = mockProvider({ runsOn: 'client' });
42-
expect(() => OpenFeature.setProvider(provider)).toThrowError(
43-
"Provider 'mock-events-success' is intended for use on the client."
42+
expect(() => OpenFeature.setProvider(provider)).toThrow(
43+
"Provider 'mock-events-success' is intended for use on the client.",
4444
);
4545
});
4646
it('should succeed because the provider is intended for the server', () => {
4747
const provider = mockProvider({ runsOn: 'server' });
48-
expect(() => OpenFeature.setProvider(provider)).not.toThrowError();
48+
expect(() => OpenFeature.setProvider(provider)).not.toThrow();
4949
});
5050
});
5151

@@ -132,6 +132,22 @@ describe('OpenFeature', () => {
132132
OpenFeature.setProvider('client2', { ...provider1 });
133133
expect(provider1.onClose).toHaveBeenCalledTimes(1);
134134
});
135+
136+
it('should return the default provider metadata when passing an unregistered client name', async () => {
137+
const mockProvider = { metadata: { name: 'test' } } as unknown as Provider;
138+
OpenFeature.setProvider(mockProvider);
139+
const metadata = OpenFeature.getProviderMetadata('unused');
140+
expect(metadata.name === mockProvider.metadata.name).toBeTruthy();
141+
});
142+
143+
it('should return the named provider metadata when passing a registered client name', async () => {
144+
const mockProvider = { metadata: { name: 'mock' } } as unknown as Provider;
145+
const mockNamedProvider = { metadata: { name: 'named-mock' } } as unknown as Provider;
146+
OpenFeature.setProvider(mockProvider);
147+
OpenFeature.setProvider('mocked', mockNamedProvider);
148+
const metadata = OpenFeature.getProviderMetadata('mocked');
149+
expect(metadata.name === mockNamedProvider.metadata.name).toBeTruthy();
150+
});
135151
});
136152

137153
describe('Requirement 1.1.4', () => {

packages/shared/src/open-feature.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,21 @@ export abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonProv
5050
}
5151

5252
/**
53-
* Get metadata about registered provider.
53+
* Get metadata about the default provider.
5454
* @returns {ProviderMetadata} Provider Metadata
5555
*/
5656
get providerMetadata(): ProviderMetadata {
57-
return this._defaultProvider.metadata;
57+
return this.getProviderMetadata();
58+
}
59+
60+
/**
61+
* Get metadata about a registered provider using the client name.
62+
* An unbound or empty client name will return metadata from the default provider.
63+
* @param {string} [clientName] The name to identify the client
64+
* @returns {ProviderMetadata} Provider Metadata
65+
*/
66+
getProviderMetadata(clientName?: string): ProviderMetadata {
67+
return this.getProviderForClient(clientName).metadata;
5868
}
5969

6070
/**

0 commit comments

Comments
 (0)