feat(framework): config resolveBootstrap 接入 mode + release 锁死 URL 覆盖

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-28 18:13:15 +08:00
co-authored by Claude Opus 4.8
parent 8cbc488e0c
commit 2c2e487d8f
2 changed files with 67 additions and 28 deletions
@@ -14,47 +14,73 @@ const throwingFetcher: ConfigFetcher = {
const REMOTE: RemoteConfig = { data: { player_server_tcp: '5.5.5.5:5000' } };
test('profile=local:用 profile.server 直连,不抓远程', async () => {
test('debug + profile=local:用 profile.server 直连,不抓远程', async () => {
const fetcher = fetcherReturning(REMOTE);
const r = await resolveBootstrap({ win: {}, search: '?profile=local', fetcher, isNative: false });
const r = await resolveBootstrap({ mode: 'debug', win: {}, search: '?profile=local', fetcher, isNative: false });
assert.deepEqual(r.servers, ['ws://127.0.0.1:3088']);
assert.equal(r.rawConfig, null);
assert.equal(fetcher.calls.length, 0);
});
test('prod + H5:抓远程配置产出 servers,identity 来自 defaults', async () => {
test('debug + prod + H5:抓远程配置产出 servers,identity 来自 defaults', async () => {
const fetcher = fetcherReturning(REMOTE);
const r = await resolveBootstrap({ win: {}, search: '', fetcher, isNative: false });
const r = await resolveBootstrap({ mode: 'debug', win: {}, search: '', fetcher, isNative: false });
assert.deepEqual(r.servers, ['ws://5.5.5.5:5000']);
assert.equal(r.identity.agentid, BUILD_IDENTITY.agentid);
assert.equal(r.identity.gameid, BUILD_IDENTITY.gameid);
assert.equal(fetcher.calls.length, 1);
});
test('H5 显式 URL query 覆盖身份(最高优先级)', async () => {
test('debug + H5 显式 URL query 覆盖身份(最高优先级)', async () => {
const fetcher = fetcherReturning(REMOTE);
const r = await resolveBootstrap({ win: {}, search: '?agentid=999&channelid=C9', fetcher, isNative: false });
const r = await resolveBootstrap({ mode: 'debug', win: {}, search: '?agentid=999&channelid=C9', fetcher, isNative: false });
assert.equal(r.identity.agentid, '999');
assert.equal(r.identity.channelid, 'C9');
});
test('原生模式:identity 来自 window.settings', async () => {
test('debug + 原生模式:identity 来自 window.settings', async () => {
const fetcher = fetcherReturning(REMOTE);
const win = { settings: { getothername: () => 'NA', getchannelName: () => 'NC', getmarketname: () => 3 } };
const r = await resolveBootstrap({ win, search: '', fetcher, isNative: true });
const r = await resolveBootstrap({ mode: 'debug', win, search: '', fetcher, isNative: true });
assert.equal(r.identity.agentid, 'NA');
assert.equal(r.identity.channelid, 'NC');
assert.equal(r.identity.marketid, 3);
});
test('远程失败 + 有 fallbackServers → 降级使用', async () => {
const r = await resolveBootstrap({ win: {}, search: '', fetcher: throwingFetcher, isNative: false, fallbackServers: ['ws://fb:1'] });
test('debug + 远程失败 + 有 fallbackServers → 降级使用', async () => {
const r = await resolveBootstrap({ mode: 'debug', win: {}, search: '', fetcher: throwingFetcher, isNative: false, fallbackServers: ['ws://fb:1'] });
assert.deepEqual(r.servers, ['ws://fb:1']);
});
test('远程失败 + 无 fallback → 抛 ConfigFetchError', async () => {
test('debug + 远程失败 + 无 fallback → 抛 ConfigFetchError', async () => {
await assert.rejects(
resolveBootstrap({ win: {}, search: '', fetcher: throwingFetcher, isNative: false }),
resolveBootstrap({ mode: 'debug', win: {}, search: '', fetcher: throwingFetcher, isNative: false }),
/远程配置抓取失败/,
);
});
test('debug 结果含 mode/isDebugger', async () => {
const fetcher = fetcherReturning(REMOTE);
const r = await resolveBootstrap({ mode: 'debug', win: {}, search: '', fetcher, isNative: false });
assert.equal(r.mode, 'debug');
assert.equal(r.isDebugger, true);
});
test('release:忽略所有 URL 覆盖,强制 prod,identity 不被 URL 改', async () => {
const fetcher = fetcherReturning(REMOTE);
const r = await resolveBootstrap({ mode: 'release', win: {}, search: '?profile=local&agentid=999', fetcher, isNative: false });
assert.equal(r.profile.name, 'prod');
assert.deepEqual(r.servers, ['ws://5.5.5.5:5000']); // 走远程,不是 local 直连
assert.equal(r.identity.agentid, BUILD_IDENTITY.agentid); // 999 无效
assert.equal(r.isDebugger, false);
assert.equal(r.mode, 'release');
assert.equal(fetcher.calls.length, 1);
});
test('release:原生身份仍生效(URL 的 999 无效)', async () => {
const fetcher = fetcherReturning(REMOTE);
const win = { settings: { getothername: () => 'NA', getchannelName: () => 'NC', getmarketname: () => 3 } };
const r = await resolveBootstrap({ mode: 'release', win, search: '?agentid=999', fetcher, isNative: true });
assert.equal(r.identity.agentid, 'NA');
assert.equal(r.identity.channelid, 'NC');
});