| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- #!/usr/bin/env tsx
- /**
- * 优雅账户注入示例
- * 演示新的 AccountRegistry 智能账户发现和注册系统
- */
- import { AccountRegistry } from '../src/accounts/AccountRegistry.js'
- import { AutoDiscoveryProvider } from '../src/accounts/providers/AutoDiscoveryProvider.js'
- async function elegantAccountInjectionDemo() {
- console.log('✨ 优雅账户注入系统演示')
- console.log('='.repeat(60))
- try {
- // 1. 创建账户注册表
- console.log('\n🏗️ 第一步: 初始化账户注册表...')
- const registry = new AccountRegistry({
- discovery: {
- strategy: 'auto',
- providers: ['auto-discovery', 'env', 'config'],
- autoRefresh: true,
- refreshInterval: 300000, // 5分钟
- },
- validation: {
- strictMode: false, // 宽松模式,允许部分账户失败
- requiredFields: ['exchange', 'credentials'],
- timeout: 10000,
- },
- lifecycle: {
- retryAttempts: 3,
- retryDelay: 2000,
- healthCheckInterval: 60000,
- },
- })
- // 2. 注册智能发现提供者
- console.log('📡 注册智能发现提供者...')
- registry.registerProvider(new AutoDiscoveryProvider())
- // 3. 监听注册表事件
- setupRegistryEventListeners(registry)
- // 4. 自动发现所有可用账户
- console.log('\n🔍 第二步: 智能发现可用账户...')
- const discoveredAccounts = await registry.discover()
- console.log(`✅ 发现 ${discoveredAccounts.length} 个账户:`)
- discoveredAccounts.forEach((account, index) => {
- const status = account.config.enabled ? '✅' : '❌'
- const source = account.metadata.source
- const tags = account.metadata.tags.join(', ')
- console.log(` ${index + 1}. ${status} ${account.name}`)
- console.log(` ID: ${account.id}`)
- console.log(` 交易所: ${account.exchange}`)
- console.log(` 来源: ${source}`)
- console.log(` 标签: ${tags}`)
- console.log(` 优先级: ${account.config.priority}`)
- console.log(
- ` 限额: $${account.config.limits.maxPosition.toLocaleString()} / $${account.config.limits.maxDailyVolume.toLocaleString()}`,
- )
- console.log()
- })
- // 5. 批量注册所有账户
- console.log('🚀 第三步: 批量注册账户实例...')
- const { successful, failed } = await registry.registerAll()
- console.log(`\n📊 注册结果:`)
- console.log(` ✅ 成功: ${successful.length} 个`)
- console.log(` ❌ 失败: ${failed.length} 个`)
- // 显示成功注册的账户
- if (successful.length > 0) {
- console.log('\n✅ 成功注册的账户:')
- successful.forEach((instance, index) => {
- console.log(` ${index + 1}. ${instance.descriptor.name}`)
- console.log(` 状态: ${instance.status}`)
- console.log(` 交易所: ${instance.descriptor.exchange}`)
- console.log(` 最后健康检查: ${instance.lastHealthCheck?.toLocaleTimeString() || 'N/A'}`)
- console.log()
- })
- }
- // 显示失败的账户
- if (failed.length > 0) {
- console.log('\n❌ 注册失败的账户:')
- failed.forEach((failure, index) => {
- console.log(` ${index + 1}. ${failure.descriptor.name}`)
- console.log(` 原因: ${failure.error.message}`)
- console.log()
- })
- }
- // 6. 按交易所分组显示
- console.log('🏦 第四步: 按交易所分组查看...')
- const exchanges = ['pacifica', 'aster', 'binance']
- for (const exchange of exchanges) {
- const instances = registry.getInstancesByExchange(exchange)
- if (instances.length > 0) {
- console.log(`\n📈 ${exchange.toUpperCase()} (${instances.length} 个账户):`)
- instances.forEach((instance, index) => {
- const status = instance.status === 'active' ? '🟢' : '🔴'
- console.log(` ${status} ${instance.descriptor.name} (优先级: ${instance.descriptor.config.priority})`)
- })
- }
- }
- // 7. 执行健康检查
- console.log('\n🏥 第五步: 执行健康检查...')
- const healthReport = await registry.performHealthCheck()
- console.log(`📊 健康检查报告:`)
- console.log(` 总账户数: ${healthReport.total}`)
- console.log(` 健康账户: ${healthReport.healthy}`)
- console.log(` 不健康账户: ${healthReport.unhealthy}`)
- console.log(` 健康率: ${((healthReport.healthy / healthReport.total) * 100).toFixed(1)}%`)
- if (healthReport.unhealthy > 0) {
- console.log('\n⚠️ 不健康的账户:')
- healthReport.details
- .filter(detail => detail.status === 'unhealthy')
- .forEach(detail => {
- const instance = registry.getInstance(detail.id)
- console.log(` 🔴 ${instance?.descriptor.name}: ${instance?.lastError || 'Unknown error'}`)
- })
- }
- // 8. 演示动态管理
- console.log('\n🔄 第六步: 动态管理演示...')
- // 展示可用的管理操作
- console.log('可用的管理操作:')
- console.log(' • registry.getActiveInstances() - 获取活跃账户')
- console.log(' • registry.getInstancesByExchange() - 按交易所获取')
- console.log(' • registry.getInstance(id) - 获取特定账户')
- console.log(' • registry.unregister(id) - 移除账户')
- console.log(' • registry.performHealthCheck() - 健康检查')
- // 获取活跃实例示例
- const activeInstances = registry.getActiveInstances()
- console.log(`\n🟢 当前活跃账户: ${activeInstances.length} 个`)
- // 展示智能特性
- console.log('\n✨ 智能特性展示:')
- console.log(' ✅ 自动发现环境变量中的账户配置')
- console.log(' ✅ 支持多账户命名约定 (EXCHANGE_FIELD_1, EXCHANGE_FIELD_2)')
- console.log(' ✅ 支持角色约定 (MAIN, HEDGE, BACKUP, TEST)')
- console.log(' ✅ 自动凭证验证和连接测试')
- console.log(' ✅ 优雅的错误处理和降级')
- console.log(' ✅ 实时健康监控')
- console.log(' ✅ 事件驱动的状态通知')
- console.log('\n🎉 优雅账户注入演示完成!')
- // 清理资源
- console.log('\n🧹 清理资源...')
- const activeIds = activeInstances.map(i => i.descriptor.id)
- for (const id of activeIds) {
- await registry.unregister(id)
- }
- console.log('✅ 资源清理完成')
- } catch (error) {
- console.error('❌ 演示失败:', error)
- }
- }
- /**
- * 设置注册表事件监听
- */
- function setupRegistryEventListeners(registry: AccountRegistry) {
- console.log('👂 设置事件监听器...')
- registry.on('accounts_discovered', data => {
- console.log(`🔍 ${data.provider} 发现 ${data.count} 个账户`)
- })
- registry.on('discovery_error', data => {
- console.log(`⚠️ ${data.provider} 发现失败: ${data.error.message}`)
- })
- registry.on('discovery_completed', data => {
- console.log(`📋 账户发现完成: 总计 ${data.total} 个`)
- Object.entries(data.byExchange).forEach(([exchange, count]) => {
- console.log(` ${exchange}: ${count} 个`)
- })
- })
- registry.on('account_validated', data => {
- console.log(`✅ 账户验证通过: ${data.descriptor.name}`)
- })
- registry.on('account_validation_failed', data => {
- console.log(`❌ 账户验证失败: ${data.descriptor.name}`)
- })
- registry.on('account_registered', data => {
- console.log(`🎯 账户注册成功: ${data.instance.descriptor.name}`)
- })
- registry.on('account_registration_failed', data => {
- console.log(`💥 账户注册失败: ${data.descriptor.name} - ${data.error.message}`)
- })
- registry.on('batch_registration_completed', data => {
- console.log(`📦 批量注册完成: ${data.successful}/${data.total} 成功`)
- })
- registry.on('health_check_completed', data => {
- console.log(`🏥 健康检查完成: ${data.healthy}/${data.total} 健康`)
- })
- registry.on('provider_registered', data => {
- console.log(`🔌 提供者注册: ${data.provider}`)
- })
- registry.on('account_unregistered', data => {
- console.log(`🗑️ 账户已移除: ${data.descriptor.name}`)
- })
- }
- /**
- * 显示环境变量设置示例
- */
- function showEnvironmentExamples() {
- console.log('\n💡 环境变量设置示例:')
- console.log(`
- # 1. 单账户模式
- export PACIFICA_PRIVATE_KEY="your_private_key"
- export PACIFICA_ACCOUNT="your_account_id"
- # 2. 多账户模式 (支持 1-10)
- export PACIFICA_PRIVATE_KEY_1="main_account_key"
- export PACIFICA_ACCOUNT_1="main_account_id"
- export PACIFICA_PRIVATE_KEY_2="hedge_account_key"
- export PACIFICA_ACCOUNT_2="hedge_account_id"
- # 3. 角色约定模式
- export PACIFICA_PRIVATE_KEY_MAIN="main_account_key"
- export PACIFICA_ACCOUNT_MAIN="main_account_id"
- export PACIFICA_PRIVATE_KEY_HEDGE="hedge_account_key"
- export PACIFICA_ACCOUNT_HEDGE="hedge_account_id"
- export PACIFICA_PRIVATE_KEY_BACKUP="backup_account_key"
- export PACIFICA_ACCOUNT_BACKUP="backup_account_id"
- # 4. 配置选项
- export PACIFICA_MAIN_ENABLED=true
- export PACIFICA_MAIN_TRADING=true
- export PACIFICA_MAIN_HEDGING=true
- export PACIFICA_MAX_POSITION_MAIN=20000
- export PACIFICA_MAX_DAILY_VOLUME_MAIN=200000
- `)
- }
- // 运行演示
- if (import.meta.url === `file://${process.argv[1]}`) {
- if (process.argv.includes('--help') || process.argv.includes('-h')) {
- showEnvironmentExamples()
- } else {
- elegantAccountInjectionDemo()
- }
- }
|