实现内置虎牙扫码登录与绑定 Connector

This commit is contained in:
yml2213
2026-11-09 17:11:01 +08:00
parent b0b8e983ba
commit a9937ef8c6
41 changed files with 4246 additions and 152 deletions
+6
View File
@@ -62,9 +62,15 @@ export function createDefaultRuntimeConfig(projectRoot: string): RuntimeConfig {
},
semiAuto: {
defaultConnectorMode: 'embedded',
connectorBaseUrl: '',
connectorApiKey: '',
connectorTimeoutMs: 15_000,
huya: {
bindActId: 9271,
outerActId: '17096',
roomPid: '1199650619883',
},
},
admin: {
+4
View File
@@ -54,6 +54,10 @@ export const ENV_OVERRIDES: readonly EnvOverride[] = [
stringEnv('SEMI_AUTO_CONNECTOR_BASE_URL', ['semiAuto', 'connectorBaseUrl']),
stringEnv('SEMI_AUTO_CONNECTOR_API_KEY', ['semiAuto', 'connectorApiKey']),
integerEnv('SEMI_AUTO_CONNECTOR_TIMEOUT_MS', ['semiAuto', 'connectorTimeoutMs']),
stringEnv('SEMI_AUTO_DEFAULT_CONNECTOR_MODE', ['semiAuto', 'defaultConnectorMode']),
integerEnv('HUYA_BIND_ACT_ID', ['semiAuto', 'huya', 'bindActId']),
stringEnv('HUYA_OUTER_ACT_ID', ['semiAuto', 'huya', 'outerActId']),
stringEnv('HUYA_ROOM_PID', ['semiAuto', 'huya', 'roomPid']),
stringEnv('ADMIN_SESSION_SECRET', ['admin', 'sessionSecret']),
// 兼容旧变量:固定 TTL 时代按“绝对上限”理解,空闲窗口仍用新默认值并被绝对上限钳制。
integerEnv('ADMIN_SESSION_TTL_HOURS', ['admin', 'sessionAbsoluteTtlHours']),
@@ -126,6 +126,22 @@ test('validateRuntimeConfig accepts zero claim token TTL for permanent links', (
assert.deepEqual(issues, [])
})
test('validateRuntimeConfig rejects unknown semi-auto connector mode', () => {
const issues = validateRuntimeConfig(
createRuntimeConfig({
semiAuto: {
defaultConnectorMode: 'remote',
},
}),
{ env: { NODE_ENV: 'development' } },
)
assert.deepEqual(
issues.map((issue) => issue.path),
['semiAuto.defaultConnectorMode'],
)
})
test('assertRuntimeConfigValid throws a readable validation error', () => {
assert.throws(
() => {
@@ -187,6 +203,17 @@ function createRuntimeConfig(overrides: Record<string, unknown> = {}): RuntimeCo
claimBaseUrl: 'https://order.example.test/#/claim',
tokenTtlHours: 24,
},
semiAuto: {
defaultConnectorMode: 'embedded',
connectorBaseUrl: '',
connectorApiKey: '',
connectorTimeoutMs: 15000,
huya: {
bindActId: 9271,
outerActId: '17096',
roomPid: '1199650619883',
},
},
admin: {
sessionSecret: '0123456789abcdef0123456789abcdef',
sessionIdleTtlHours: 24,
@@ -78,6 +78,13 @@ export function validateRuntimeConfig(
{ min: 0 },
)
validateOptionalHttpUrl(issues, 'semiAuto.connectorBaseUrl', config.semiAuto?.connectorBaseUrl)
const connectorMode = String(config.semiAuto?.defaultConnectorMode || '').trim()
if (!['embedded', 'external', 'mock'].includes(connectorMode)) {
issues.push({
path: 'semiAuto.defaultConnectorMode',
message: '仅支持 embedded、external 或 mock',
})
}
requireOptionalInteger(
issues,
'semiAuto.connectorTimeoutMs',