Skip to content

Commit 110b4c2

Browse files
committed
Use monitonic clock for scheduling poll iterations in Auto Poll mode for improved precision and resistance to system/user clock adjustments
1 parent 4f9f441 commit 110b4c2

File tree

2 files changed

+7
-3
lines changed

2 files changed

+7
-3
lines changed

src/AutoPollConfigService.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { IConfigFetcher } from "./ConfigFetcher";
44
import type { IConfigService, RefreshResult } from "./ConfigServiceBase";
55
import { ClientCacheState, ConfigServiceBase } from "./ConfigServiceBase";
66
import type { ProjectConfig } from "./ProjectConfig";
7-
import { AbortToken, delay } from "./Utils";
7+
import { AbortToken, delay, getMonotonicTimeMs } from "./Utils";
88

99
export const POLL_EXPIRATION_TOLERANCE_MS = 500;
1010

@@ -136,14 +136,14 @@ export class AutoPollConfigService extends ConfigServiceBase<AutoPollOptions> im
136136
let isFirstIteration = true;
137137
while (!stopToken.aborted) {
138138
try {
139-
const scheduledNextTimeMs = new Date().getTime() + this.pollIntervalMs;
139+
const scheduledNextTimeMs = getMonotonicTimeMs() + this.pollIntervalMs;
140140
try {
141141
await this.refreshWorkerLogic(isFirstIteration, initialCacheSyncUp);
142142
} catch (err) {
143143
this.options.logger.autoPollConfigServiceErrorDuringPolling(err);
144144
}
145145

146-
const realNextTimeMs = scheduledNextTimeMs - new Date().getTime();
146+
const realNextTimeMs = scheduledNextTimeMs - getMonotonicTimeMs();
147147
if (realNextTimeMs > 0) {
148148
await delay(realNextTimeMs, stopToken);
149149
}

src/Utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ export function delay(delayMs: number, abortToken?: AbortToken | null): Promise<
4646
});
4747
}
4848

49+
export const getMonotonicTimeMs = typeof performance !== "undefined" && typeof performance.now === "function"
50+
? () => performance.now()
51+
: () => new Date().getTime();
52+
4953
export function errorToString(err: any, includeStackTrace = false): string {
5054
return err instanceof Error
5155
? includeStackTrace && err.stack ? err.stack : err.toString()

0 commit comments

Comments
 (0)