Skip to content

Commit

Permalink
fix: only shutdown providers that are not attached to any client (#444)
Browse files Browse the repository at this point in the history
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
  • Loading branch information
lukas-reining and beeme1mr authored Jun 2, 2023
1 parent 5d55ea1 commit 7e469c4
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 2 deletions.
23 changes: 23 additions & 0 deletions packages/client/test/open-feature.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,29 @@ describe('OpenFeature', () => {

expect(namedClient.metadata.providerMetadata.name).toEqual(fakeProvider.metadata.name);
});

it('should close a provider if it is replaced and no other client uses it', async () => {
const provider1 = { ...MOCK_PROVIDER, onClose: jest.fn() };
const provider2 = { ...MOCK_PROVIDER, onClose: jest.fn() };

OpenFeature.setProvider('client1', provider1);
expect(provider1.onClose).not.toHaveBeenCalled();
OpenFeature.setProvider('client1', provider2);
expect(provider1.onClose).toHaveBeenCalledTimes(1);
});

it('should not close provider if it is used by another client', async () => {
const provider1 = { ...MOCK_PROVIDER, onClose: jest.fn() };

OpenFeature.setProvider('client1', provider1);
OpenFeature.setProvider('client2', provider1);

OpenFeature.setProvider('client1', { ...provider1 });
expect(provider1.onClose).not.toHaveBeenCalled();

OpenFeature.setProvider('client2', { ...provider1 });
expect(provider1.onClose).toHaveBeenCalledTimes(1);
});
});

describe('Requirement 1.1.4', () => {
Expand Down
23 changes: 23 additions & 0 deletions packages/server/test/open-feature.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,29 @@ describe('OpenFeature', () => {

expect(namedClient.metadata.providerMetadata.name).toEqual(fakeProvider.metadata.name);
});

it('should close a provider if it is replaced and no other client uses it', async () => {
const provider1 = { ...MOCK_PROVIDER, onClose: jest.fn() };
const provider2 = { ...MOCK_PROVIDER, onClose: jest.fn() };

OpenFeature.setProvider('client1', provider1);
expect(provider1.onClose).not.toHaveBeenCalled();
OpenFeature.setProvider('client1', provider2);
expect(provider1.onClose).toHaveBeenCalledTimes(1);
});

it('should not close provider if it is used by another client', async () => {
const provider1 = { ...MOCK_PROVIDER, onClose: jest.fn() };

OpenFeature.setProvider('client1', provider1);
OpenFeature.setProvider('client2', provider1);

OpenFeature.setProvider('client1', { ...provider1 });
expect(provider1.onClose).not.toHaveBeenCalled();

OpenFeature.setProvider('client2', { ...provider1 });
expect(provider1.onClose).toHaveBeenCalledTimes(1);
});
});

describe('Requirement 1.1.4', () => {
Expand Down
5 changes: 3 additions & 2 deletions packages/shared/src/open-feature.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,11 @@ export abstract class OpenFeatureCommonAPI<P extends CommonProvider = CommonProv

this.transferListeners(oldProvider, provider, clientName, clientEmitter);

// Do not close the default provider if a named client used the default provider
if (!clientName || (clientName && oldProvider !== this._defaultProvider)) {
// Do not close a provider that is bound to any client
if (![...this._clientProviders.values(), this._defaultProvider].includes(oldProvider)) {
oldProvider?.onClose?.();
}

return this;
}

Expand Down

0 comments on commit 7e469c4

Please sign in to comment.