fix(oauth): allow per-connection refresh lead-time override via providerSpecificData.refreshLeadMs (#4818)

Integrated into release/v3.8.37 — cherry-picked defining commit onto release tip; CHANGELOG re-merged; tests green.
This commit is contained in:
Diego Rodrigues de Sa e Souza
2026-06-25 23:30:24 -03:00
committed by GitHub
parent 0ad8f8bfdb
commit ad5dc9faa3
3 changed files with 42 additions and 3 deletions

View File

@@ -50,9 +50,22 @@ export const REFRESH_LEAD_MS: Record<string, number> = {
/**
* Get the proactive refresh lead time (ms) for a given provider.
* Falls back to TOKEN_EXPIRY_BUFFER_MS (5 min) when not explicitly listed.
*
* Precedence:
* 1. A per-connection override in `providerSpecificData.refreshLeadMs`
* (must be a positive finite number), so an operator can tune the lead
* time for a single connection without touching the provider defaults.
* 2. The provider default from REFRESH_LEAD_MS.
* 3. TOKEN_EXPIRY_BUFFER_MS (5 min) when nothing else applies.
*/
export function getRefreshLeadMs(provider: string): number {
export function getRefreshLeadMs(
provider: string,
providerSpecificData?: { refreshLeadMs?: unknown } | null
): number {
const override = providerSpecificData?.refreshLeadMs;
if (typeof override === "number" && Number.isFinite(override) && override > 0) {
return override;
}
return REFRESH_LEAD_MS[provider] ?? TOKEN_EXPIRY_BUFFER_MS;
}

View File

@@ -174,7 +174,7 @@ export async function checkAndRefreshToken(provider: string, credentials: any) {
if (updatedCredentials.expiresAt) {
const expiresAt = new Date(updatedCredentials.expiresAt).getTime();
const now = Date.now();
const refreshLead = _getRefreshLeadMs(provider);
const refreshLead = _getRefreshLeadMs(provider, updatedCredentials.providerSpecificData);
if (expiresAt - now < refreshLead) {
log.info("TOKEN_REFRESH", "Token expiring soon, refreshing proactively", {

View File

@@ -17,6 +17,32 @@ describe("tokenRefresh helpers", () => {
assert.equal(mod.getRefreshLeadMs("unknown-provider"), mod.TOKEN_EXPIRY_BUFFER_MS);
assert.equal(mod.getRefreshLeadMs(""), mod.TOKEN_EXPIRY_BUFFER_MS);
});
it("honors a positive per-connection refreshLeadMs override", () => {
// Override beats both the provider default and the fallback buffer.
assert.equal(mod.getRefreshLeadMs("codex", { refreshLeadMs: 90_000 }), 90_000);
assert.equal(
mod.getRefreshLeadMs("unknown-provider", { refreshLeadMs: 12_345 }),
12_345
);
});
it("ignores invalid or non-positive override values", () => {
// Falls through to provider default / buffer when the override is unusable.
assert.equal(mod.getRefreshLeadMs("codex", null), 5 * 60 * 1000);
assert.equal(mod.getRefreshLeadMs("codex", {}), 5 * 60 * 1000);
assert.equal(mod.getRefreshLeadMs("codex", { refreshLeadMs: 0 }), 5 * 60 * 1000);
assert.equal(mod.getRefreshLeadMs("codex", { refreshLeadMs: -1 }), 5 * 60 * 1000);
assert.equal(
mod.getRefreshLeadMs("codex", { refreshLeadMs: "60000" as unknown as number }),
5 * 60 * 1000
);
assert.equal(mod.getRefreshLeadMs("codex", { refreshLeadMs: NaN }), 5 * 60 * 1000);
assert.equal(
mod.getRefreshLeadMs("unknown-provider", { refreshLeadMs: -5 }),
mod.TOKEN_EXPIRY_BUFFER_MS
);
});
});
describe("supportsTokenRefresh", () => {