feat(framework): config 原生同步身份来源(window.settings/app_* 逐字对齐)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-28 16:36:13 +08:00
co-authored by Claude Opus 4.8
parent 510c074627
commit 119a457c59
2 changed files with 69 additions and 0 deletions
@@ -0,0 +1,40 @@
import type { ChannelIdentity, IdentitySource } from '../identity.ts';
/** 原生注入宿主(≈ window)。settings 由原生注入;全局 app_* 为 uAgent_3 路径回退。 */
export interface NativeHost {
settings?: {
getothername?(name: string): string | number;
getchannelName?(): string | number;
getmarketname?(): string | number;
};
[global: string]: unknown; // app_agent / app_market 等
}
function tryRead(primary: () => unknown, fallback: () => unknown): unknown {
try {
const v = primary();
if (v !== undefined && v !== null && v !== '') return v;
} catch { /* 原生桥不存在,走回退 */ }
try { return fallback(); } catch { return undefined; }
}
function has(v: unknown): boolean { return v !== undefined && v !== null && v !== ''; }
/**
* 原生模式:同步读取渠道身份。逐字对齐原 05_Func.js:
* agent → window.settings.getothername('agent') | window.app_agent
* channel → window.settings.getchannelName()
* market → window.settings.getmarketname() | window.app_market
*/
export function nativeSettingsSource(win: NativeHost): IdentitySource {
return () => {
const out: Partial<ChannelIdentity> = {};
const agentid = tryRead(() => win.settings?.getothername?.('agent'), () => win['app_agent']);
if (has(agentid)) out.agentid = agentid as string | number;
const channelid = tryRead(() => win.settings?.getchannelName?.(), () => undefined);
if (has(channelid)) out.channelid = channelid as string | number;
const marketid = tryRead(() => win.settings?.getmarketname?.(), () => win['app_market']);
if (has(marketid)) out.marketid = marketid as string | number;
return out;
};
}