elegant_account_injection.ts 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. #!/usr/bin/env tsx
  2. /**
  3. * 优雅账户注入示例
  4. * 演示新的 AccountRegistry 智能账户发现和注册系统
  5. */
  6. import { AccountRegistry } from '../src/accounts/AccountRegistry.js'
  7. import { AutoDiscoveryProvider } from '../src/accounts/providers/AutoDiscoveryProvider.js'
  8. async function elegantAccountInjectionDemo() {
  9. console.log('✨ 优雅账户注入系统演示')
  10. console.log('='.repeat(60))
  11. try {
  12. // 1. 创建账户注册表
  13. console.log('\n🏗️ 第一步: 初始化账户注册表...')
  14. const registry = new AccountRegistry({
  15. discovery: {
  16. strategy: 'auto',
  17. providers: ['auto-discovery', 'env', 'config'],
  18. autoRefresh: true,
  19. refreshInterval: 300000, // 5分钟
  20. },
  21. validation: {
  22. strictMode: false, // 宽松模式,允许部分账户失败
  23. requiredFields: ['exchange', 'credentials'],
  24. timeout: 10000,
  25. },
  26. lifecycle: {
  27. retryAttempts: 3,
  28. retryDelay: 2000,
  29. healthCheckInterval: 60000,
  30. },
  31. })
  32. // 2. 注册智能发现提供者
  33. console.log('📡 注册智能发现提供者...')
  34. registry.registerProvider(new AutoDiscoveryProvider())
  35. // 3. 监听注册表事件
  36. setupRegistryEventListeners(registry)
  37. // 4. 自动发现所有可用账户
  38. console.log('\n🔍 第二步: 智能发现可用账户...')
  39. const discoveredAccounts = await registry.discover()
  40. console.log(`✅ 发现 ${discoveredAccounts.length} 个账户:`)
  41. discoveredAccounts.forEach((account, index) => {
  42. const status = account.config.enabled ? '✅' : '❌'
  43. const source = account.metadata.source
  44. const tags = account.metadata.tags.join(', ')
  45. console.log(` ${index + 1}. ${status} ${account.name}`)
  46. console.log(` ID: ${account.id}`)
  47. console.log(` 交易所: ${account.exchange}`)
  48. console.log(` 来源: ${source}`)
  49. console.log(` 标签: ${tags}`)
  50. console.log(` 优先级: ${account.config.priority}`)
  51. console.log(
  52. ` 限额: $${account.config.limits.maxPosition.toLocaleString()} / $${account.config.limits.maxDailyVolume.toLocaleString()}`,
  53. )
  54. console.log()
  55. })
  56. // 5. 批量注册所有账户
  57. console.log('🚀 第三步: 批量注册账户实例...')
  58. const { successful, failed } = await registry.registerAll()
  59. console.log(`\n📊 注册结果:`)
  60. console.log(` ✅ 成功: ${successful.length} 个`)
  61. console.log(` ❌ 失败: ${failed.length} 个`)
  62. // 显示成功注册的账户
  63. if (successful.length > 0) {
  64. console.log('\n✅ 成功注册的账户:')
  65. successful.forEach((instance, index) => {
  66. console.log(` ${index + 1}. ${instance.descriptor.name}`)
  67. console.log(` 状态: ${instance.status}`)
  68. console.log(` 交易所: ${instance.descriptor.exchange}`)
  69. console.log(` 最后健康检查: ${instance.lastHealthCheck?.toLocaleTimeString() || 'N/A'}`)
  70. console.log()
  71. })
  72. }
  73. // 显示失败的账户
  74. if (failed.length > 0) {
  75. console.log('\n❌ 注册失败的账户:')
  76. failed.forEach((failure, index) => {
  77. console.log(` ${index + 1}. ${failure.descriptor.name}`)
  78. console.log(` 原因: ${failure.error.message}`)
  79. console.log()
  80. })
  81. }
  82. // 6. 按交易所分组显示
  83. console.log('🏦 第四步: 按交易所分组查看...')
  84. const exchanges = ['pacifica', 'aster', 'binance']
  85. for (const exchange of exchanges) {
  86. const instances = registry.getInstancesByExchange(exchange)
  87. if (instances.length > 0) {
  88. console.log(`\n📈 ${exchange.toUpperCase()} (${instances.length} 个账户):`)
  89. instances.forEach((instance, index) => {
  90. const status = instance.status === 'active' ? '🟢' : '🔴'
  91. console.log(` ${status} ${instance.descriptor.name} (优先级: ${instance.descriptor.config.priority})`)
  92. })
  93. }
  94. }
  95. // 7. 执行健康检查
  96. console.log('\n🏥 第五步: 执行健康检查...')
  97. const healthReport = await registry.performHealthCheck()
  98. console.log(`📊 健康检查报告:`)
  99. console.log(` 总账户数: ${healthReport.total}`)
  100. console.log(` 健康账户: ${healthReport.healthy}`)
  101. console.log(` 不健康账户: ${healthReport.unhealthy}`)
  102. console.log(` 健康率: ${((healthReport.healthy / healthReport.total) * 100).toFixed(1)}%`)
  103. if (healthReport.unhealthy > 0) {
  104. console.log('\n⚠️ 不健康的账户:')
  105. healthReport.details
  106. .filter(detail => detail.status === 'unhealthy')
  107. .forEach(detail => {
  108. const instance = registry.getInstance(detail.id)
  109. console.log(` 🔴 ${instance?.descriptor.name}: ${instance?.lastError || 'Unknown error'}`)
  110. })
  111. }
  112. // 8. 演示动态管理
  113. console.log('\n🔄 第六步: 动态管理演示...')
  114. // 展示可用的管理操作
  115. console.log('可用的管理操作:')
  116. console.log(' • registry.getActiveInstances() - 获取活跃账户')
  117. console.log(' • registry.getInstancesByExchange() - 按交易所获取')
  118. console.log(' • registry.getInstance(id) - 获取特定账户')
  119. console.log(' • registry.unregister(id) - 移除账户')
  120. console.log(' • registry.performHealthCheck() - 健康检查')
  121. // 获取活跃实例示例
  122. const activeInstances = registry.getActiveInstances()
  123. console.log(`\n🟢 当前活跃账户: ${activeInstances.length} 个`)
  124. // 展示智能特性
  125. console.log('\n✨ 智能特性展示:')
  126. console.log(' ✅ 自动发现环境变量中的账户配置')
  127. console.log(' ✅ 支持多账户命名约定 (EXCHANGE_FIELD_1, EXCHANGE_FIELD_2)')
  128. console.log(' ✅ 支持角色约定 (MAIN, HEDGE, BACKUP, TEST)')
  129. console.log(' ✅ 自动凭证验证和连接测试')
  130. console.log(' ✅ 优雅的错误处理和降级')
  131. console.log(' ✅ 实时健康监控')
  132. console.log(' ✅ 事件驱动的状态通知')
  133. console.log('\n🎉 优雅账户注入演示完成!')
  134. // 清理资源
  135. console.log('\n🧹 清理资源...')
  136. const activeIds = activeInstances.map(i => i.descriptor.id)
  137. for (const id of activeIds) {
  138. await registry.unregister(id)
  139. }
  140. console.log('✅ 资源清理完成')
  141. } catch (error) {
  142. console.error('❌ 演示失败:', error)
  143. }
  144. }
  145. /**
  146. * 设置注册表事件监听
  147. */
  148. function setupRegistryEventListeners(registry: AccountRegistry) {
  149. console.log('👂 设置事件监听器...')
  150. registry.on('accounts_discovered', data => {
  151. console.log(`🔍 ${data.provider} 发现 ${data.count} 个账户`)
  152. })
  153. registry.on('discovery_error', data => {
  154. console.log(`⚠️ ${data.provider} 发现失败: ${data.error.message}`)
  155. })
  156. registry.on('discovery_completed', data => {
  157. console.log(`📋 账户发现完成: 总计 ${data.total} 个`)
  158. Object.entries(data.byExchange).forEach(([exchange, count]) => {
  159. console.log(` ${exchange}: ${count} 个`)
  160. })
  161. })
  162. registry.on('account_validated', data => {
  163. console.log(`✅ 账户验证通过: ${data.descriptor.name}`)
  164. })
  165. registry.on('account_validation_failed', data => {
  166. console.log(`❌ 账户验证失败: ${data.descriptor.name}`)
  167. })
  168. registry.on('account_registered', data => {
  169. console.log(`🎯 账户注册成功: ${data.instance.descriptor.name}`)
  170. })
  171. registry.on('account_registration_failed', data => {
  172. console.log(`💥 账户注册失败: ${data.descriptor.name} - ${data.error.message}`)
  173. })
  174. registry.on('batch_registration_completed', data => {
  175. console.log(`📦 批量注册完成: ${data.successful}/${data.total} 成功`)
  176. })
  177. registry.on('health_check_completed', data => {
  178. console.log(`🏥 健康检查完成: ${data.healthy}/${data.total} 健康`)
  179. })
  180. registry.on('provider_registered', data => {
  181. console.log(`🔌 提供者注册: ${data.provider}`)
  182. })
  183. registry.on('account_unregistered', data => {
  184. console.log(`🗑️ 账户已移除: ${data.descriptor.name}`)
  185. })
  186. }
  187. /**
  188. * 显示环境变量设置示例
  189. */
  190. function showEnvironmentExamples() {
  191. console.log('\n💡 环境变量设置示例:')
  192. console.log(`
  193. # 1. 单账户模式
  194. export PACIFICA_PRIVATE_KEY="your_private_key"
  195. export PACIFICA_ACCOUNT="your_account_id"
  196. # 2. 多账户模式 (支持 1-10)
  197. export PACIFICA_PRIVATE_KEY_1="main_account_key"
  198. export PACIFICA_ACCOUNT_1="main_account_id"
  199. export PACIFICA_PRIVATE_KEY_2="hedge_account_key"
  200. export PACIFICA_ACCOUNT_2="hedge_account_id"
  201. # 3. 角色约定模式
  202. export PACIFICA_PRIVATE_KEY_MAIN="main_account_key"
  203. export PACIFICA_ACCOUNT_MAIN="main_account_id"
  204. export PACIFICA_PRIVATE_KEY_HEDGE="hedge_account_key"
  205. export PACIFICA_ACCOUNT_HEDGE="hedge_account_id"
  206. export PACIFICA_PRIVATE_KEY_BACKUP="backup_account_key"
  207. export PACIFICA_ACCOUNT_BACKUP="backup_account_id"
  208. # 4. 配置选项
  209. export PACIFICA_MAIN_ENABLED=true
  210. export PACIFICA_MAIN_TRADING=true
  211. export PACIFICA_MAIN_HEDGING=true
  212. export PACIFICA_MAX_POSITION_MAIN=20000
  213. export PACIFICA_MAX_DAILY_VOLUME_MAIN=200000
  214. `)
  215. }
  216. // 运行演示
  217. if (import.meta.url === `file://${process.argv[1]}`) {
  218. if (process.argv.includes('--help') || process.argv.includes('-h')) {
  219. showEnvironmentExamples()
  220. } else {
  221. elegantAccountInjectionDemo()
  222. }
  223. }