初始化提交:go比特版本精简
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
'use strict';
|
||||
|
||||
const assert = require('assert');
|
||||
const axios = require('axios');
|
||||
const { _private } = require('../src/services/openai_oauth_service');
|
||||
|
||||
function jwt(payload) {
|
||||
const header = Buffer.from(JSON.stringify({ alg: 'none' })).toString('base64url');
|
||||
const body = Buffer.from(JSON.stringify(payload)).toString('base64url');
|
||||
return `${header}.${body}.signature`;
|
||||
}
|
||||
|
||||
(async () => {
|
||||
const legacy = _private.parseOpenAIProxyDescriptor('proxy.example.com:1080@user:pass');
|
||||
assert.deepStrictEqual(legacy.protocols, ['socks5', 'http']);
|
||||
assert.strictEqual(legacy.host, 'proxy.example.com');
|
||||
assert.strictEqual(legacy.username, 'user');
|
||||
|
||||
const explicitHttp = _private.parseOpenAIProxyDescriptor('http://user:pass@proxy.example.com:8080');
|
||||
assert.deepStrictEqual(explicitHttp.protocols, ['http']);
|
||||
assert.match(_private.buildOpenAIProxyUrl(explicitHttp, 'http'), /^http:\/\/user:pass@/);
|
||||
|
||||
const originalRequest = axios.request;
|
||||
const calls = [];
|
||||
axios.request = async config => {
|
||||
const agentType = config.httpsAgent && config.httpsAgent.constructor.name;
|
||||
calls.push({ url: config.url, agentType });
|
||||
if (config.url === _private.CHATGPT_USAGE_URL) {
|
||||
return {
|
||||
status: 200,
|
||||
data: JSON.stringify({
|
||||
account_id: 'account-1',
|
||||
plan_type: 'pro',
|
||||
rate_limit: { primary_window: { used_percent: 42 } },
|
||||
}),
|
||||
};
|
||||
}
|
||||
return { status: 403, data: JSON.stringify({ detail: 'blocked in mock' }) };
|
||||
};
|
||||
|
||||
try {
|
||||
const logs = [];
|
||||
const authJson = {
|
||||
access_token: jwt({
|
||||
exp: Math.floor(Date.now() / 1000) + 3600,
|
||||
'https://api.openai.com/auth': {
|
||||
chatgpt_account_id: 'account-1',
|
||||
chatgpt_plan_type: 'pro',
|
||||
},
|
||||
}),
|
||||
plan_type: 'pro',
|
||||
tokens: { account_id: 'account-1' },
|
||||
};
|
||||
const result = await _private.queryAndEnrichOpenAIAuthJsonDirect(
|
||||
authJson,
|
||||
'proxy.example.com:1080:user:pass',
|
||||
message => logs.push(message),
|
||||
);
|
||||
assert.strictEqual(result.success, true);
|
||||
assert.strictEqual(result.authJson.plan_type, 'pro');
|
||||
assert.strictEqual(result.authJson.usage.rate_limit.primary_window.used_percent, 42);
|
||||
assert(calls.length >= 3);
|
||||
assert(calls.every(call => call.agentType === 'SocksProxyAgent'));
|
||||
assert(logs.some(message => message.includes('后台接口连接方式:HTTP经SOCKS5隧道')));
|
||||
|
||||
calls.length = 0;
|
||||
const directLogs = [];
|
||||
const directResult = await _private.queryAndEnrichOpenAIAuthJsonDirect(
|
||||
authJson,
|
||||
'',
|
||||
message => directLogs.push(message),
|
||||
{ connectionMode: 'direct' },
|
||||
);
|
||||
assert.strictEqual(directResult.success, true);
|
||||
assert(calls.length >= 3);
|
||||
assert(calls.every(call => call.agentType === undefined));
|
||||
assert(directLogs.some(message => message.includes('后台接口连接方式:直连')));
|
||||
|
||||
const oldAccessToken = jwt({
|
||||
exp: Math.floor(Date.now() / 1000) + 3600,
|
||||
email: 'fallback.user@gmail.com',
|
||||
'https://api.openai.com/auth': { chatgpt_account_id: 'account-fallback' },
|
||||
});
|
||||
const newAccessToken = jwt({
|
||||
exp: Math.floor(Date.now() / 1000) + 7200,
|
||||
email: 'fallback.user@gmail.com',
|
||||
'https://api.openai.com/auth': { chatgpt_account_id: 'account-fallback' },
|
||||
});
|
||||
const fallbackCalls = [];
|
||||
axios.request = async config => {
|
||||
fallbackCalls.push(config);
|
||||
if (/\/api\/auth\/session\?refresh=true/.test(config.url)) {
|
||||
return {
|
||||
status: 200,
|
||||
data: JSON.stringify({
|
||||
user: { email: 'fallbackuser@gmail.com' },
|
||||
accessToken: newAccessToken,
|
||||
expires: new Date(Date.now() + 7200000).toISOString(),
|
||||
}),
|
||||
};
|
||||
}
|
||||
if (config.headers.Authorization === `Bearer ${oldAccessToken}`) {
|
||||
return { status: 401, data: JSON.stringify({ detail: 'expired' }) };
|
||||
}
|
||||
if (config.url === _private.CHATGPT_USAGE_URL) {
|
||||
return {
|
||||
status: 200,
|
||||
data: JSON.stringify({
|
||||
account_id: 'account-fallback',
|
||||
plan_type: 'plus',
|
||||
rate_limit: { primary_window: { used_percent: 12 } },
|
||||
}),
|
||||
};
|
||||
}
|
||||
if (/\/subscriptions\?/.test(config.url)) {
|
||||
return { status: 200, data: JSON.stringify({ plan_type: 'plus' }) };
|
||||
}
|
||||
return {
|
||||
status: 200,
|
||||
data: JSON.stringify({
|
||||
accounts: {
|
||||
'account-fallback': {
|
||||
account: { account_id: 'account-fallback', plan_type: 'plus', is_default: true },
|
||||
},
|
||||
},
|
||||
}),
|
||||
};
|
||||
};
|
||||
const fallbackSession = JSON.stringify({
|
||||
user: { email: 'fallback.user@gmail.com' },
|
||||
accessToken: oldAccessToken,
|
||||
sessionToken: 'saved-session-token',
|
||||
});
|
||||
const fallbackResult = await _private.queryAndEnrichOpenAIAuthJsonDirect(
|
||||
{},
|
||||
'',
|
||||
() => {},
|
||||
{
|
||||
connectionMode: 'direct',
|
||||
sessionText: fallbackSession,
|
||||
expectedEmail: 'Fallback.User@gmail.com',
|
||||
},
|
||||
);
|
||||
assert.strictEqual(fallbackResult.success, true, '没有授权 JSON 时仍应使用 Session 完成查询');
|
||||
assert.strictEqual(fallbackResult.authJson.access_token, newAccessToken);
|
||||
assert.strictEqual(JSON.parse(fallbackResult.sessionText).accessToken, newAccessToken);
|
||||
assert.strictEqual(JSON.parse(fallbackResult.sessionText).sessionToken, 'saved-session-token');
|
||||
assert(fallbackCalls.some(call => /\/api\/auth\/session\?refresh=true/.test(call.url)));
|
||||
} finally {
|
||||
axios.request = originalRequest;
|
||||
}
|
||||
|
||||
console.log('openai_plan_proxy_request.test.js: PASS');
|
||||
})().catch(error => {
|
||||
console.error(error);
|
||||
process.exitCode = 1;
|
||||
});
|
||||
Reference in New Issue
Block a user