feat: adjust keepAlive token

This commit is contained in:
GitPusher99 2024-03-28 16:08:13 +08:00
parent 12604fe17e
commit 7bcf16207a

View File

@ -7,7 +7,7 @@ import { CookieJar } from "tough-cookie";
const logger = pino(); const logger = pino();
interface AudioInfo { export interface AudioInfo {
id: string; id: string;
title?: string; title?: string;
image_url?: string; image_url?: string;
@ -63,21 +63,15 @@ class SunoApi {
} }
public async init(): Promise<SunoApi> { public async init(): Promise<SunoApi> {
const token = await this.getAuthToken(); await this.getAuthToken();
this.client.interceptors.request.use(function (config) { await this.keepAlive();
config.headers['Authorization'] = `Bearer ${token}`
return config;
})
return this; return this;
} }
private async getAuthToken(): Promise<string> { private async getAuthToken() {
// 获取会话ID的URL // 获取会话ID的URL
const getSessionUrl = `${SunoApi.CLERK_BASE_URL}/v1/client?_clerk_js_version=4.70.5`; const getSessionUrl = `${SunoApi.CLERK_BASE_URL}/v1/client?_clerk_js_version=4.70.5`;
// 交换令牌的URL模板
const exchangeTokenUrlTemplate = `${SunoApi.CLERK_BASE_URL}/v1/client/sessions/{sid}/tokens/api?_clerk_js_version=4.70.0`;
// 获取会话ID // 获取会话ID
const sessionResponse = await this.client.get(getSessionUrl); const sessionResponse = await this.client.get(getSessionUrl);
const sid = sessionResponse.data.response['last_active_session_id']; const sid = sessionResponse.data.response['last_active_session_id'];
@ -86,14 +80,9 @@ class SunoApi {
} }
// 保存会话ID以备后用 // 保存会话ID以备后用
this.sid = sid; this.sid = sid;
// 使用会话ID获取JWT令牌
const exchangeTokenUrl = exchangeTokenUrlTemplate.replace('{sid}', sid);
const tokenResponse = await this.client.post(exchangeTokenUrl);
return tokenResponse.data['jwt'];
} }
public async KeepAlive(): Promise<void> { public async keepAlive(isWait?: boolean): Promise<void> {
if (!this.sid) { if (!this.sid) {
throw new Error("Session ID is not set. Cannot renew token."); throw new Error("Session ID is not set. Cannot renew token.");
} }
@ -102,7 +91,9 @@ class SunoApi {
// 续订会话令牌 // 续订会话令牌
const renewResponse = await this.client.post(renewUrl); const renewResponse = await this.client.post(renewUrl);
logger.info("KeepAlive...\n"); logger.info("KeepAlive...\n");
if (isWait) {
await sleep(1, 2); await sleep(1, 2);
}
const newToken = renewResponse.data['jwt']; const newToken = renewResponse.data['jwt'];
// 更新请求头中的Authorization字段使用新的JWT令牌 // 更新请求头中的Authorization字段使用新的JWT令牌
this.client.interceptors.request.use(function (config) { this.client.interceptors.request.use(function (config) {
@ -216,11 +207,11 @@ class SunoApi {
} }
lastResponse = response; lastResponse = response;
await sleep(3, 6); await sleep(3, 6);
await this.KeepAlive(); await this.keepAlive(true);
} }
return lastResponse; return lastResponse;
} else { } else {
await this.KeepAlive(); await this.keepAlive(true);
return response.data['clips'].map((audio: any) => ({ return response.data['clips'].map((audio: any) => ({
id: audio.id, id: audio.id,
title: audio.title, title: audio.title,