实现内置虎牙扫码登录与绑定 Connector
This commit is contained in:
@@ -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: {
|
||||
|
||||
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user