@juspay/neurolink
Version:
Universal AI Development Platform with working MCP integration, multi-provider support, voice (TTS/STT/realtime), and professional CLI. 58+ external MCP servers discoverable, multimodal file processing, RAG pipelines. Build, test, and deploy AI applicatio
125 lines • 5 kB
JavaScript
import { logger } from "../utils/logger.js";
import { tokenStore } from "../auth/tokenStore.js";
const REFRESH_URL = "https://api.anthropic.com/v1/oauth/token";
const REFRESH_URL_FALLBACK = "https://console.anthropic.com/v1/oauth/token";
const CLIENT_ID = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
const BUFFER_MS = 60 * 60 * 1000;
const USER_AGENT = "claude-cli/2.1.80 (external, cli)";
export function needsRefresh(account) {
return !!(account.expiresAt &&
account.expiresAt <= Date.now() + BUFFER_MS &&
account.refreshToken);
}
export async function refreshToken(account) {
if (!account.refreshToken) {
return { success: false, error: "No refresh token available" };
}
const formBody = new URLSearchParams({
grant_type: "refresh_token",
refresh_token: account.refreshToken,
client_id: CLIENT_ID,
}).toString();
const headers = {
"Content-Type": "application/x-www-form-urlencoded",
"User-Agent": USER_AGENT,
};
const urls = [REFRESH_URL, REFRESH_URL_FALLBACK];
for (const url of urls) {
try {
const resp = await fetch(url, {
method: "POST",
headers,
body: formBody,
signal: AbortSignal.timeout(10_000),
});
if (!resp.ok) {
const errorBody = await resp.text();
logger.warn(`[token-refresh] failed for ${account.label} at ${url}`, {
status: resp.status,
error: errorBody.slice(0, 500),
});
// If primary URL returned a non-ok status, try fallback
if (url === REFRESH_URL) {
continue;
}
return { success: false, error: errorBody, status: resp.status };
}
const data = (await resp.json());
const previousExpiresAt = account.expiresAt;
account.token = data.access_token;
account.expiresAt =
data.expires_in !== undefined
? Date.now() + data.expires_in * 1000
: previousExpiresAt && previousExpiresAt > Date.now()
? previousExpiresAt
: Date.now() + 55 * 60 * 1000;
if (data.refresh_token) {
account.refreshToken = data.refresh_token;
}
logger.debug(`[token-refresh] refreshed for ${account.label}`);
return { success: true };
}
catch (e) {
logger.warn(`[token-refresh] exception for ${account.label} at ${url}`, {
error: String(e),
});
// If primary URL threw, try fallback
if (url === REFRESH_URL) {
continue;
}
return { success: false, error: String(e) };
}
}
// Should not reach here, but guard against empty urls array
return { success: false, error: "No refresh URLs available" };
}
export async function persistTokens(target, account) {
if (typeof target !== "string" && "providerKey" in target) {
await persistTokenStoreAccount(target.providerKey, account);
return;
}
const credPath = typeof target === "string" ? target : target.credPath;
await persistLegacyCredentials(credPath, account);
}
async function persistLegacyCredentials(credPath, account) {
try {
const fs = await import("fs/promises");
const existing = JSON.parse(await fs.readFile(credPath, "utf8"));
existing.oauth = {
...existing.oauth,
accessToken: account.token,
expiresAt: account.expiresAt,
refreshToken: account.refreshToken,
};
existing.updatedAt = Date.now();
const tmpPath = credPath + ".tmp";
await fs.writeFile(tmpPath, JSON.stringify(existing, null, 2), {
mode: 0o600,
});
await fs.rename(tmpPath, credPath);
}
catch (err) {
logger.warn("[token-refresh] Failed to persist legacy credentials", {
error: err instanceof Error ? err.message : String(err),
});
}
}
async function persistTokenStoreAccount(providerKey, account) {
try {
const existing = await tokenStore.loadTokens(providerKey);
const merged = {
accessToken: account.token,
refreshToken: account.refreshToken ?? existing?.refreshToken,
expiresAt: account.expiresAt ?? existing?.expiresAt ?? Date.now() + 55 * 60 * 1000,
tokenType: existing?.tokenType ?? "Bearer",
...(existing?.scope ? { scope: existing.scope } : {}),
};
await tokenStore.saveTokens(providerKey, merged);
}
catch (err) {
logger.warn("[token-refresh] Failed to persist TokenStore credentials", {
error: err instanceof Error ? err.message : String(err),
});
}
}
//# sourceMappingURL=tokenRefresh.js.map