Skip to content

Commit 8b6f8d9

Browse files
committed
fix: issues from rebase
1 parent 60d8969 commit 8b6f8d9

4 files changed

Lines changed: 47 additions & 21 deletions

File tree

packages/sdk/browser/src/BrowserClient.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import {
1616
LDHeaders,
1717
LDIdentifyResult,
1818
LDPluginEnvironmentMetadata,
19-
LDTimeoutError,
2019
Platform,
2120
safeRegisterDebugOverridePlugins,
2221
} from '@launchdarkly/js-client-sdk-common';

packages/shared/sdk-client/__tests__/flag-manager/FlagManager.test.ts

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,15 +118,22 @@ describe('FlagManager override tests', () => {
118118
expect(flagManager.get('test-flag')?.flag.value).toBe('override-value');
119119
});
120120

121-
it('setOverride triggers flag change callback', () => {
121+
it('setOverride triggers flag change callback', async () => {
122+
const context = Context.fromLDContext({ kind: 'user', key: 'user-key' });
123+
const flags = {
124+
'test-flag': makeMockItemDescriptor(1, 'store-value'),
125+
};
126+
127+
await flagManager.init(context, flags);
128+
122129
const mockCallback: FlagsChangeCallback = jest.fn();
123130
flagManager.on(mockCallback);
124131

125132
const debugOverride = flagManager.getDebugOverride();
126133
debugOverride?.setOverride('test-flag', 'override-value');
127134

128135
expect(mockCallback).toHaveBeenCalledTimes(1);
129-
expect(mockCallback).toHaveBeenCalledWith(null, ['test-flag'], 'override');
136+
expect(mockCallback).toHaveBeenCalledWith(context, ['test-flag'], 'override');
130137
});
131138

132139
it('removeOverride does nothing when override does not exist', () => {
@@ -151,7 +158,14 @@ describe('FlagManager override tests', () => {
151158
expect(flagManager.get('test-flag')?.flag.value).toBe('store-value');
152159
});
153160

154-
it('removeOverride triggers flag change callback', () => {
161+
it('removeOverride triggers flag change callback', async () => {
162+
const context = Context.fromLDContext({ kind: 'user', key: 'user-key' });
163+
const flags = {
164+
'test-flag': makeMockItemDescriptor(1, 'store-value'),
165+
};
166+
167+
await flagManager.init(context, flags);
168+
155169
const mockCallback: FlagsChangeCallback = jest.fn();
156170
flagManager.on(mockCallback);
157171

@@ -160,8 +174,8 @@ describe('FlagManager override tests', () => {
160174
debugOverride?.removeOverride('test-flag');
161175

162176
expect(mockCallback).toHaveBeenCalledTimes(2);
163-
expect(mockCallback).toHaveBeenNthCalledWith(1, null, ['test-flag'], 'override');
164-
expect(mockCallback).toHaveBeenNthCalledWith(2, null, ['test-flag'], 'override');
177+
expect(mockCallback).toHaveBeenNthCalledWith(1, context, ['test-flag'], 'override');
178+
expect(mockCallback).toHaveBeenNthCalledWith(2, context, ['test-flag'], 'override');
165179
});
166180

167181
it('clearAllOverrides removes all overrides', () => {
@@ -176,18 +190,25 @@ describe('FlagManager override tests', () => {
176190
expect(Object.keys(flagManager.getAllOverrides())).toHaveLength(0);
177191
});
178192

179-
it('clearAllOverrides triggers flag change callback for all flags', () => {
193+
it('clearAllOverrides triggers flag change callback for all flags', async () => {
180194
const mockCallback: FlagsChangeCallback = jest.fn();
181195
flagManager.on(mockCallback);
182196

183197
const debugOverride = flagManager.getDebugOverride();
198+
const context = Context.fromLDContext({ kind: 'user', key: 'user-key' });
199+
const flags = {
200+
'test-flag': makeMockItemDescriptor(1, 'store-value'),
201+
};
202+
203+
await flagManager.init(context, flags);
204+
184205
debugOverride?.setOverride('flag1', 'value1');
185206
debugOverride?.setOverride('flag2', 'value2');
186207
(mockCallback as jest.Mock).mockClear();
187208

188209
debugOverride?.clearAllOverrides();
189210
expect(mockCallback).toHaveBeenCalledTimes(1);
190-
expect(mockCallback).toHaveBeenCalledWith(null, ['flag1', 'flag2'], 'override');
211+
expect(mockCallback).toHaveBeenCalledWith(context, ['flag1', 'flag2'], 'override');
191212
});
192213

193214
it('getAllOverrides returns all overrides as ItemDescriptors', () => {

packages/shared/sdk-client/src/flag-manager/FlagManager.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ export default class DefaultFlagManager implements FlagManager {
239239
this._overrides = {};
240240
}
241241
this._overrides[key] = value;
242-
this._flagUpdater.handleFlagChanges(null, [key], 'override');
242+
this._flagUpdater.handleFlagChanges([key], 'override');
243243
}
244244

245245
removeOverride(flagKey: string) {
@@ -254,14 +254,14 @@ export default class DefaultFlagManager implements FlagManager {
254254
this._overrides = undefined;
255255
}
256256

257-
this._flagUpdater.handleFlagChanges(null, [flagKey], 'override');
257+
this._flagUpdater.handleFlagChanges([flagKey], 'override');
258258
}
259259

260260
clearAllOverrides() {
261261
if (this._overrides) {
262262
const clearedOverrides = { ...this._overrides };
263263
this._overrides = undefined; // Reset to undefined
264-
this._flagUpdater.handleFlagChanges(null, Object.keys(clearedOverrides), 'override');
264+
this._flagUpdater.handleFlagChanges(Object.keys(clearedOverrides), 'override');
265265
}
266266
}
267267

packages/shared/sdk-client/src/flag-manager/FlagUpdater.ts

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,20 @@ export default class FlagUpdater {
4646
this._logger = logger;
4747
}
4848

49-
handleFlagChanges(context: Context, keys: string[], type: FlagChangeType): void {
50-
this._changeCallbacks.forEach((callback) => {
51-
try {
52-
callback(context, keys, type);
53-
} catch (err) {
54-
/* intentionally empty */
55-
}
56-
});
49+
handleFlagChanges(keys: string[], type: FlagChangeType): void {
50+
if (this._activeContext) {
51+
this._changeCallbacks.forEach((callback) => {
52+
try {
53+
callback(this._activeContext!, keys, type);
54+
} catch (err) {
55+
/* intentionally empty */
56+
}
57+
});
58+
} else {
59+
this._logger.warn(
60+
'Received a change event wihtout an active context. Changes will not be propagated.',
61+
);
62+
}
5763
}
5864

5965
init(context: Context, newFlags: { [key: string]: ItemDescriptor }) {
@@ -62,7 +68,7 @@ export default class FlagUpdater {
6268
this._flagStore.init(newFlags);
6369
const changed = calculateChangedKeys(oldFlags, newFlags);
6470
if (changed.length > 0) {
65-
this.handleFlagChanges(context, changed, 'init');
71+
this.handleFlagChanges(changed, 'init');
6672
}
6773
}
6874

@@ -87,7 +93,7 @@ export default class FlagUpdater {
8793
}
8894

8995
this._flagStore.insertOrUpdate(key, item);
90-
this.handleFlagChanges(this._activeContext!, [key], 'patch');
96+
this.handleFlagChanges([key], 'patch');
9197
return true;
9298
}
9399

0 commit comments

Comments
 (0)