test_websocket_account_subscription.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import { PacificaProxyClient } from './src/exchanges/pacifica/PacificaProxyClient.js'
  2. import { logger } from './src/utils/logger.js'
  3. /**
  4. * 测试WebSocket账户信息订阅功能
  5. * 验证账户余额和仓位的实时订阅
  6. */
  7. async function testWebSocketAccountSubscription() {
  8. console.log('🚀 开始WebSocket账户信息订阅测试...\n')
  9. const testAccounts = [
  10. {
  11. name: 'pacifica-1',
  12. account: process.env.PACIFICA_ACCOUNT_1,
  13. privateKey: process.env.PACIFICA_PRIVATE_KEY_1,
  14. },
  15. {
  16. name: 'pacifica-2',
  17. account: process.env.PACIFICA_ACCOUNT_2,
  18. privateKey: process.env.PACIFICA_PRIVATE_KEY_2,
  19. }
  20. ]
  21. for (const testAccount of testAccounts) {
  22. if (!testAccount.account || !testAccount.privateKey) {
  23. console.log(`⚠️ 跳过 ${testAccount.name}:环境变量未配置`)
  24. continue
  25. }
  26. console.log(`\n📊 测试账户: ${testAccount.name}`)
  27. console.log(` 账户ID: ${testAccount.account.substring(0, 8)}...`)
  28. const client = new PacificaProxyClient({
  29. account: testAccount.account,
  30. privateKey: testAccount.privateKey,
  31. })
  32. try {
  33. // 启用WebSocket模式
  34. console.log('🔧 启用WebSocket模式...')
  35. client.setWebSocketEnabled(true)
  36. // 初始化WebSocket连接
  37. console.log('📡 初始化WebSocket连接...')
  38. await client.initializeWebSocket()
  39. console.log(`✅ WebSocket连接状态: ${client.isWebSocketConnected()}`)
  40. // 测试WebSocket账户余额订阅
  41. console.log('\n💰 测试账户余额WebSocket订阅...')
  42. const startTime = Date.now()
  43. try {
  44. const balanceResult = await client.getBalances()
  45. const duration = Date.now() - startTime
  46. if (balanceResult.success) {
  47. console.log(`✅ 余额订阅成功! 耗时: ${duration}ms`)
  48. console.log('📊 余额数据:', {
  49. balance: balanceResult.data?.balance || balanceResult.data?.b,
  50. available: balanceResult.data?.available || balanceResult.data?.as,
  51. equity: balanceResult.data?.equity || balanceResult.data?.ae,
  52. marginUsed: balanceResult.data?.marginUsed || balanceResult.data?.mu,
  53. pendingBalance: balanceResult.data?.pendingBalance || balanceResult.data?.pb,
  54. })
  55. } else {
  56. console.log(`❌ 余额订阅失败: ${balanceResult.error}`)
  57. }
  58. } catch (error: any) {
  59. console.log(`❌ 余额订阅异常: ${error.message}`)
  60. }
  61. // 测试WebSocket账户仓位订阅
  62. console.log('\n📊 测试账户仓位WebSocket订阅...')
  63. const posStartTime = Date.now()
  64. try {
  65. const positionsResult = await client.getPositions()
  66. const posDuration = Date.now() - posStartTime
  67. if (positionsResult.success) {
  68. console.log(`✅ 仓位订阅成功! 耗时: ${posDuration}ms`)
  69. console.log('📊 仓位数据:', {
  70. type: typeof positionsResult.data,
  71. length: Array.isArray(positionsResult.data) ? positionsResult.data.length : 'N/A',
  72. sample: positionsResult.data,
  73. })
  74. } else {
  75. console.log(`❌ 仓位订阅失败: ${positionsResult.error}`)
  76. }
  77. } catch (error: any) {
  78. console.log(`❌ 仓位订阅异常: ${error.message}`)
  79. }
  80. // 连接状态检查
  81. console.log('\n🔍 连接状态检查:')
  82. console.log(` WebSocket连接: ${client.isWebSocketConnected() ? '✅ 已连接' : '❌ 断开'}`)
  83. console.log(` 消息队列长度: ${client.getWebSocketQueueLength()}`)
  84. } catch (error: any) {
  85. console.error(`❌ ${testAccount.name} 测试失败:`, error.message)
  86. } finally {
  87. // 清理资源
  88. try {
  89. await client.close()
  90. console.log(`🧹 ${testAccount.name} 资源清理完成`)
  91. } catch (error: any) {
  92. console.log(`⚠️ ${testAccount.name} 资源清理时发生错误:`, error.message)
  93. }
  94. }
  95. }
  96. console.log('\n✅ WebSocket账户信息订阅测试完成!')
  97. }
  98. // 代理状态检查
  99. async function checkProxyStatus() {
  100. console.log('🔍 代理状态检查:')
  101. const proxyConfig = {
  102. enabled: process.env.PROXY_ENABLED === 'true',
  103. host: process.env.PROXY_HOST,
  104. port: process.env.PROXY_PORT,
  105. user: process.env.ASTER_PROXY_USER,
  106. hasSessionPrefix: !!process.env.ASTER_PROXY_SESSION_PREFIX,
  107. hasSessionSuffix: !!process.env.ASTER_PROXY_SESSION_SUFFIX,
  108. }
  109. console.log(' 配置状态:')
  110. console.log(` 代理启用: ${proxyConfig.enabled ? '✅' : '❌'}`)
  111. console.log(` 代理主机: ${proxyConfig.host || '未配置'}`)
  112. console.log(` 代理端口: ${proxyConfig.port || '未配置'}`)
  113. console.log(` 代理用户: ${proxyConfig.user ? proxyConfig.user.substring(0, 4) + '***' : '未配置'}`)
  114. console.log(` 会话前缀: ${proxyConfig.hasSessionPrefix ? '✅' : '❌'}`)
  115. console.log(` 会话后缀: ${proxyConfig.hasSessionSuffix ? '✅' : '❌'}`)
  116. console.log(' 账户配置:')
  117. console.log(` 账户1: ${process.env.PACIFICA_ACCOUNT_1 ? process.env.PACIFICA_ACCOUNT_1.substring(0, 8) + '...' : '未配置'}`)
  118. console.log(` 账户2: ${process.env.PACIFICA_ACCOUNT_2 ? process.env.PACIFICA_ACCOUNT_2.substring(0, 8) + '...' : '未配置'}`)
  119. if (proxyConfig.enabled && proxyConfig.host && proxyConfig.user) {
  120. console.log(' ✅ 代理配置完整,支持WebSocket账户订阅测试')
  121. } else {
  122. console.log(' ⚠️ 代理配置不完整,WebSocket可能直连')
  123. }
  124. }
  125. // 运行测试
  126. if (import.meta.url === `file://${process.argv[1]}`) {
  127. Promise.resolve()
  128. .then(() => checkProxyStatus())
  129. .then(() => testWebSocketAccountSubscription())
  130. .catch(error => {
  131. console.error('🚨 测试失败:', error)
  132. process.exit(1)
  133. })
  134. }
  135. export { testWebSocketAccountSubscription }