feat(framework): config 调试 serverOverride(全链路+游戏服连本地)

- DebugProfile 加 serverOverride:debug 抓远程配置走全链路后把连接地址覆盖为此
- staging profile 加 serverOverride=ws://127.0.0.1:3088(联调本地测试服)
- release 一律忽略 serverOverride,用远程解析结果
- 同步指南

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-28 20:08:59 +08:00
co-authored by Claude Opus 4.8
parent d461578d6e
commit 5132fddc4e
4 changed files with 25 additions and 5 deletions
@@ -72,7 +72,9 @@ export async function resolveBootstrap(opts: BootstrapOptions): Promise<Bootstra
throw new ConfigFetchError(`远程配置抓取失败: ${url}`);
}
const servers = resolveServers(config, identity);
const resolved = resolveServers(config, identity);
// debug 可把连接地址显式覆盖为本地测试服(仍走完整远程配置链路);release 一律用远程解析结果。
const servers = isDebug && profile.serverOverride ? [profile.serverOverride] : resolved;
if (!servers.length) {
throw new ConfigFetchError(`远程配置未给出可用服务器地址: ${url}`);
}
@@ -13,8 +13,9 @@ export interface DebugAccount {
export interface DebugProfile {
name: string;
server?: string; // 显式 ws 调试服地址(给定则跳过远程抓取)
server?: string; // 显式 ws 调试服地址(给定则跳过远程抓取,纯直连)
gameserver?: string; // 远程配置 txt URL(不含防缓存串)
serverOverride?: string; // debug:抓远程配置走全链路后,把连接地址覆盖为此(联调本地游戏服用)
identity?: Partial<ChannelIdentity>; // 调试用渠道身份覆盖
account?: DebugAccount; // 调试用登录账号(仅 debug 模式生效)
isDebugger?: boolean; // 收发包日志开关(替代旧 Game_Config.Debugger.isDebugger)
@@ -30,9 +31,10 @@ export const PROFILES: Record<string, DebugProfile> = {
staging: {
name: 'staging',
gameserver: STAGING_GAMESERVER,
serverOverride: 'ws://127.0.0.1:3088', // 走 staging 配置全链路,但游戏服连本地测试服
isDebugger: true,
// 调试登录账号:联调前替换为真实测试账号(openid 必填)。仅 debug 模式生效。
account: { openid: 'REPLACE_ME_test_openid', nickname: '测试号', avatar: '', sex: 0, province: '', city: '', unionid: '' },
account: { openid: 'REPLACE_ME_test_openid', nickname: '测试号', avatar: 'https://gips3.baidu.com/it/u=4028841722,3177937756&fm=3074&app=3074&f=PNG?w=2048&h=2048', sex: 0, province: 'testprovince', city: 'testcity', unionid: 'test_unionid' },
},
local: { name: 'local', server: 'ws://127.0.0.1:3088', isDebugger: true },
};
@@ -89,6 +89,20 @@ test('release:原生身份仍生效(URL 的 999 无效)', async () => {
assert.equal(r.identity.channelid, 'NC');
});
test('debug + serverOverride:走远程全链路但连接地址覆盖为本地', async () => {
const fetcher = fetcherReturning(REMOTE); // REMOTE.player_server_tcp = 5.5.5.5:5000
const r = await resolveBootstrap({ mode: 'debug', win: {}, search: '?profile=staging', fetcher, isNative: false });
assert.deepEqual(r.servers, [PROFILES.staging.serverOverride]); // 覆盖为 profile.serverOverride
assert.ok(r.rawConfig); // 远程配置仍抓取(全链路)
assert.equal(fetcher.calls.length, 1);
});
test('release:serverOverride 不生效(强制 prod,用远程解析地址)', async () => {
const fetcher = fetcherReturning(REMOTE);
const r = await resolveBootstrap({ mode: 'release', win: {}, search: '?profile=staging', fetcher, isNative: true });
assert.deepEqual(r.servers, ['ws://5.5.5.5:5000']); // prod 无 override,用远程解析
});
test('debug:account 来自当前 profile', async () => {
const fetcher = fetcherReturning(REMOTE);
const r = await resolveBootstrap({ mode: 'debug', win: {}, search: '?profile=staging', fetcher, isNative: false });