Skip to content

Commit cfd87be

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

File tree

5 files changed

+48
-27
lines changed

5 files changed

+48
-27
lines changed

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/LDClientImpl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ export default class LDClientImpl implements LDClient, LDClientIdentifyResult {
132132

133133
this._flagManager.on((context, flagKeys, type) => {
134134
this._handleInspectionChanged(flagKeys, type);
135-
const ldContext = context ? Context.toLDContext(context) : null;
135+
const ldContext = Context.toLDContext(context);
136136
this.emitter.emit('change', ldContext, flagKeys);
137137
flagKeys.forEach((it) => {
138138
this.emitter.emit(`change:${it}`, ldContext);

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 & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,6 @@ export type FlagChangeType = 'init' | 'patch' | 'override';
2020
* will call a variation method for flag values which you require.
2121
*/
2222
export type FlagsChangeCallback = (
23-
// REVIEWER: This is probably not desired, but I think there are some updates
24-
// such as overrides that do not really have a context? Unless I am misunderstanding
25-
// what context is exactly. Being able to support a null context may also help
26-
// with distinguishing between being in the emphemeral state between the start of
27-
// initialization and the end of identification and having an invalid context?
2823
context: Context,
2924
flagKeys: Array<string>,
3025
type: FlagChangeType,
@@ -46,14 +41,20 @@ export default class FlagUpdater {
4641
this._logger = logger;
4742
}
4843

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-
});
44+
handleFlagChanges(keys: string[], type: FlagChangeType): void {
45+
if (this._activeContext) {
46+
this._changeCallbacks.forEach((callback) => {
47+
try {
48+
callback(this._activeContext!, keys, type);
49+
} catch (err) {
50+
/* intentionally empty */
51+
}
52+
});
53+
} else {
54+
this._logger.warn(
55+
'Received a change event wihtout an active context. Changes will not be propagated.',
56+
);
57+
}
5758
}
5859

5960
init(context: Context, newFlags: { [key: string]: ItemDescriptor }) {
@@ -62,7 +63,7 @@ export default class FlagUpdater {
6263
this._flagStore.init(newFlags);
6364
const changed = calculateChangedKeys(oldFlags, newFlags);
6465
if (changed.length > 0) {
65-
this.handleFlagChanges(context, changed, 'init');
66+
this.handleFlagChanges(changed, 'init');
6667
}
6768
}
6869

@@ -87,7 +88,7 @@ export default class FlagUpdater {
8788
}
8889

8990
this._flagStore.insertOrUpdate(key, item);
90-
this.handleFlagChanges(this._activeContext!, [key], 'patch');
91+
this.handleFlagChanges([key], 'patch');
9192
return true;
9293
}
9394

0 commit comments

Comments
 (0)