Skip to content

Commit d5897f4

Browse files
committed
refactor(node-sdk): simplify throttled refresh scheduling
1 parent 29c5567 commit d5897f4

3 files changed

Lines changed: 39 additions & 28 deletions

File tree

packages/node-sdk/src/client.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,17 @@ type FlagOverrideLayer = {
7777
overrides: FlagOverridesFn;
7878
};
7979

80+
function scheduleTrailingRefreshWithTimeout(
81+
delayMs: number,
82+
callback: () => void,
83+
) {
84+
const timer = setTimeout(callback, delayMs);
85+
timer.unref?.();
86+
return () => {
87+
clearTimeout(timer);
88+
};
89+
}
90+
8091
function normalizeFlagOverrides(
8192
overrides: FlagOverridesFn | FlagOverrides | undefined,
8293
): FlagOverridesFn {
@@ -540,15 +551,7 @@ export class ReflagClient {
540551
scheduleTrailingRefresh:
541552
flagsSyncMode === "in-request"
542553
? undefined
543-
: (delayMs, callback) => {
544-
const timer = setTimeout(callback, delayMs);
545-
timer.unref?.();
546-
return {
547-
cancel: () => {
548-
clearTimeout(timer);
549-
},
550-
};
551-
},
554+
: scheduleTrailingRefreshWithTimeout,
552555
},
553556
);
554557

packages/node-sdk/src/flags-cache.ts

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@ type FlagsCacheRefreshResult = {
77
flagStateVersion?: number;
88
};
99

10-
type FlagsCacheScheduledRefresh = {
11-
cancel: () => void;
10+
type CancelScheduledRefresh = () => void;
11+
12+
type ScheduledRefresh = {
13+
cancel: CancelScheduledRefresh;
14+
promise: Promise<void>;
15+
resolve: () => void;
1216
};
1317

1418
type FlagsCacheOptions = {
@@ -17,7 +21,7 @@ type FlagsCacheOptions = {
1721
scheduleTrailingRefresh?: (
1822
delayMs: number,
1923
callback: () => void,
20-
) => FlagsCacheScheduledRefresh;
24+
) => CancelScheduledRefresh;
2125
};
2226

2327
/**
@@ -35,9 +39,7 @@ export class FlagsCache {
3539
private value: CachedFlagDefinition[] | undefined;
3640
private flagStateVersion: number | undefined;
3741
private refreshPromise: Promise<void> | undefined;
38-
private scheduledRefresh: FlagsCacheScheduledRefresh | undefined;
39-
private scheduledRefreshPromise: Promise<void> | undefined;
40-
private resolveScheduledRefreshPromise: (() => void) | undefined;
42+
private scheduledRefresh: ScheduledRefresh | undefined;
4143
private lastRefreshAt: number | undefined;
4244
private lastRefreshStartedAt: number | undefined;
4345
private destroyed = false;
@@ -183,30 +185,38 @@ export class FlagsCache {
183185
}
184186

185187
private settleScheduledRefresh() {
188+
const scheduledRefresh = this.scheduledRefresh;
186189
this.scheduledRefresh = undefined;
187-
this.scheduledRefreshPromise = undefined;
188-
this.resolveScheduledRefreshPromise?.();
189-
this.resolveScheduledRefreshPromise = undefined;
190+
scheduledRefresh?.resolve();
190191
}
191192

192193
private cancelScheduledRefresh() {
193-
this.scheduledRefresh?.cancel();
194-
this.settleScheduledRefresh();
194+
const scheduledRefresh = this.scheduledRefresh;
195+
this.scheduledRefresh = undefined;
196+
scheduledRefresh?.cancel();
197+
scheduledRefresh?.resolve();
195198
}
196199

197200
private ensureScheduledRefresh(delayMs: number) {
198201
if (!this.scheduleTrailingRefresh || this.scheduledRefresh) {
199202
return;
200203
}
201204

202-
this.scheduledRefreshPromise = new Promise<void>((resolve) => {
203-
this.resolveScheduledRefreshPromise = resolve;
205+
let resolve!: () => void;
206+
const promise = new Promise<void>((innerResolve) => {
207+
resolve = innerResolve;
204208
});
205209

206-
this.scheduledRefresh = this.scheduleTrailingRefresh(delayMs, () => {
210+
const cancel = this.scheduleTrailingRefresh(delayMs, () => {
207211
this.settleScheduledRefresh();
208212
this.ensureRefreshStartedOrScheduled();
209213
});
214+
215+
this.scheduledRefresh = {
216+
cancel,
217+
promise,
218+
resolve,
219+
};
210220
}
211221

212222
private ensureRefreshStartedOrScheduled() {
@@ -259,7 +269,7 @@ export class FlagsCache {
259269

260270
private async waitForQueuedWork() {
261271
while (!this.destroyed) {
262-
const workPromise = this.refreshPromise ?? this.scheduledRefreshPromise;
272+
const workPromise = this.refreshPromise ?? this.scheduledRefresh?.promise;
263273
if (!workPromise) {
264274
return;
265275
}

packages/node-sdk/test/flags-cache.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@ function createDeferred<T>() {
1919

2020
function scheduleTrailingRefresh(delayMs: number, callback: () => void) {
2121
const timer = setTimeout(callback, delayMs);
22-
return {
23-
cancel: () => {
24-
clearTimeout(timer);
25-
},
22+
return () => {
23+
clearTimeout(timer);
2624
};
2725
}
2826

0 commit comments

Comments
 (0)