mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-12 02:02:13 +03:00
Wire Openference as a first-party OAuth gateway (PKCE, rotating refresh) and an API-key catalog entry on api.openference.com, with live model discovery, connection testing, free-tier badges, and regression tests. Co-authored-by: Anh Tran <anhlead@outlook.com>
93 lines
2.7 KiB
TypeScript
93 lines
2.7 KiB
TypeScript
// @ts-nocheck
|
|
import { OAUTH_ENDPOINTS } from "../../../config/constants.ts";
|
|
import { runWithProxyContext } from "../../../utils/proxyFetch.ts";
|
|
import { buildFormParams } from "../shared.ts";
|
|
|
|
/**
|
|
* Specialized refresh for Openference OAuth tokens.
|
|
* Openference uses rotating (one-time-use) oar_* refresh tokens.
|
|
*/
|
|
export async function refreshOpenferenceToken(refreshToken, log, proxyConfig: unknown = null) {
|
|
try {
|
|
const response = await runWithProxyContext(proxyConfig, () =>
|
|
fetch(OAUTH_ENDPOINTS.openference.token, {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
Accept: "application/json",
|
|
},
|
|
body: buildFormParams({
|
|
grant_type: "refresh_token",
|
|
refresh_token: refreshToken,
|
|
client_id: OAUTH_ENDPOINTS.openference.clientId,
|
|
}),
|
|
})
|
|
);
|
|
|
|
if (!response.ok) {
|
|
const errorText = await response.text();
|
|
|
|
let errorCode = null;
|
|
try {
|
|
const parsed = JSON.parse(errorText);
|
|
errorCode =
|
|
parsed?.error?.code || (typeof parsed?.error === "string" ? parsed.error : null);
|
|
} catch {
|
|
// not JSON, ignore
|
|
}
|
|
|
|
if (
|
|
errorCode === "invalid_grant" ||
|
|
errorCode === "token_expired" ||
|
|
errorCode === "invalid_token"
|
|
) {
|
|
log?.error?.(
|
|
"TOKEN_REFRESH",
|
|
"Openference refresh token already used or invalid. Re-authentication required.",
|
|
{
|
|
status: response.status,
|
|
errorCode,
|
|
}
|
|
);
|
|
return { error: "unrecoverable_refresh_error", code: errorCode };
|
|
}
|
|
|
|
if (response.status === 401) {
|
|
const code = errorCode || "unauthorized";
|
|
log?.error?.(
|
|
"TOKEN_REFRESH",
|
|
"Openference OAuth token endpoint returned 401. Re-authentication required.",
|
|
{
|
|
status: response.status,
|
|
errorCode: code,
|
|
}
|
|
);
|
|
return { error: "unrecoverable_refresh_error", code };
|
|
}
|
|
|
|
log?.error?.("TOKEN_REFRESH", "Failed to refresh Openference token", {
|
|
status: response.status,
|
|
error: errorText,
|
|
});
|
|
return null;
|
|
}
|
|
|
|
const tokens = await response.json();
|
|
|
|
log?.info?.("TOKEN_REFRESH", "Successfully refreshed Openference token", {
|
|
hasNewAccessToken: !!tokens.access_token,
|
|
hasNewRefreshToken: !!tokens.refresh_token,
|
|
expiresIn: tokens.expires_in,
|
|
});
|
|
|
|
return {
|
|
accessToken: tokens.access_token,
|
|
refreshToken: tokens.refresh_token || refreshToken,
|
|
expiresIn: tokens.expires_in,
|
|
};
|
|
} catch (error) {
|
|
log?.error?.("TOKEN_REFRESH", `Network error refreshing Openference token: ${error.message}`);
|
|
return null;
|
|
}
|
|
}
|