simple_env_demo.ts 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. #!/usr/bin/env tsx
  2. /**
  3. * 简化环境变量系统演示
  4. * 展示如何使用新的 SimpleEnv 和 Config 系统
  5. */
  6. import { SimpleEnv, EnvKeys, Config, SmartAccountDiscovery } from '../src/config/simpleEnv.js'
  7. async function simpleEnvDemo() {
  8. console.log('🌟 简化环境变量系统演示')
  9. console.log('='.repeat(50))
  10. try {
  11. // 1. 基础环境变量读取
  12. console.log('\n📋 第一步: 基础配置读取...')
  13. console.log(`环境: ${Config.nodeEnv()} ${Config.isDev() ? '(开发)' : '(生产)'}`)
  14. console.log(`日志级别: ${Config.logLevel()}`)
  15. // 2. 交易所配置读取
  16. console.log('\n🏦 第二步: 交易所配置读取...')
  17. // Aster 配置
  18. console.log('🎯 Aster DEX:')
  19. console.log(` WebSocket: ${Config.aster.wsUrl} (固定)`)
  20. console.log(` HTTP Base: ${Config.aster.httpBase} (固定)`)
  21. console.log(` 订阅交易对: ${Config.aster.subscribeSymbols.join(', ')} (固定)`)
  22. console.log(` 用户地址: ${Config.aster.orderUser() ? '已设置 ✅' : '未设置 ❌'}`)
  23. console.log(` API密钥: ${Config.aster.apiKey() ? '已设置 ✅' : '未设置 ❌'}`)
  24. // Pacifica 配置
  25. console.log('\n🌊 Pacifica DEX:')
  26. console.log(` Base URL: ${Config.pacifica.baseUrl} (固定)`)
  27. console.log(` WebSocket: ${Config.pacifica.wsUrl} (固定)`)
  28. console.log(` 交易对: ${Config.pacifica.symbol} (固定)`)
  29. console.log(` 测试订单: ${Config.pacifica.enableTestOrder() ? '启用' : '禁用'}`)
  30. console.log(` 测试数量: ${Config.pacifica.testQty()}`)
  31. console.log(` 账户: ${Config.pacifica.account() ? '已设置 ✅' : '未设置 ❌'}`)
  32. // 3. 智能账户发现
  33. console.log('\n🔍 第三步: 智能账户发现...')
  34. const discoveredAccounts = SmartAccountDiscovery.discoverAll()
  35. console.log(`📊 发现结果:`)
  36. console.log(` Pacifica: ${discoveredAccounts.pacifica.length} 个账户`)
  37. console.log(` Aster: ${discoveredAccounts.aster.length} 个账户`)
  38. console.log(` Binance: ${discoveredAccounts.binance.length} 个账户`)
  39. // 显示 Pacifica 账户详情
  40. if (discoveredAccounts.pacifica.length > 0) {
  41. console.log('\n🌊 Pacifica 账户详情:')
  42. discoveredAccounts.pacifica.forEach((account, index) => {
  43. console.log(` ${index + 1}. ${account.name}`)
  44. console.log(
  45. ` 账户: ${account.account.substring(0, 8)}...${account.account.substring(account.account.length - 4)}`,
  46. )
  47. console.log(
  48. ` 私钥: ${account.privateKey.substring(0, 8)}...${account.privateKey.substring(
  49. account.privateKey.length - 4,
  50. )}`,
  51. )
  52. })
  53. }
  54. // 显示 Aster 账户详情
  55. if (discoveredAccounts.aster.length > 0) {
  56. console.log('\n🎯 Aster 账户详情:')
  57. discoveredAccounts.aster.forEach((account, index) => {
  58. console.log(` ${index + 1}. ${account.name}`)
  59. console.log(` 用户: ${account.user.substring(0, 8)}...${account.user.substring(account.user.length - 4)}`)
  60. if (account.signer) {
  61. console.log(
  62. ` 签名者: ${account.signer.substring(0, 8)}...${account.signer.substring(account.signer.length - 4)}`,
  63. )
  64. }
  65. console.log(
  66. ` 私钥: ${account.privateKey.substring(0, 8)}...${account.privateKey.substring(
  67. account.privateKey.length - 4,
  68. )}`,
  69. )
  70. })
  71. }
  72. // 4. 高级环境变量操作
  73. console.log('\n🔧 第四步: 高级环境变量操作...')
  74. // 布尔值读取
  75. const testOrderEnabled = SimpleEnv.bool('PACIFICA_ENABLE_TEST_ORDER')
  76. console.log(`测试订单启用: ${testOrderEnabled}`)
  77. // 数组读取
  78. const symbols = SimpleEnv.array('ASTER_SUBSCRIBE_SYMBOLS')
  79. console.log(`订阅交易对数组: [${symbols.join(', ')}]`)
  80. // 数字读取
  81. const testQty = SimpleEnv.number('PACIFICA_TEST_QTY', 0.001)
  82. console.log(`测试数量: ${testQty}`)
  83. // 带前缀的环境变量读取
  84. const asterVars = SimpleEnv.getPrefix('ASTER_')
  85. console.log(`\nASTER_ 前缀变量数量: ${Object.keys(asterVars).length}`)
  86. // 5. 配置验证
  87. console.log('\n✅ 第五步: 配置验证...')
  88. const validation = validateConfiguration()
  89. if (validation.isValid) {
  90. console.log('🟢 配置验证通过')
  91. } else {
  92. console.log('🔴 配置验证失败:')
  93. validation.errors.forEach(error => console.log(` ❌ ${error}`))
  94. }
  95. if (validation.warnings.length > 0) {
  96. console.log('⚠️ 配置警告:')
  97. validation.warnings.forEach(warning => console.log(` ⚠️ ${warning}`))
  98. }
  99. // 6. 完整配置导出
  100. if (process.argv.includes('--show-all')) {
  101. console.log('\n📄 完整配置:')
  102. console.log(JSON.stringify(Config.getAll(), null, 2))
  103. }
  104. console.log('\n🎉 简化环境变量系统演示完成!')
  105. console.log('\n💡 主要优势:')
  106. console.log(' 🔹 统一的配置访问接口')
  107. console.log(' 🔹 自动类型转换 (布尔、数字、数组、JSON)')
  108. console.log(' 🔹 智能账户自动发现')
  109. console.log(' 🔹 缓存机制提升性能')
  110. console.log(' 🔹 预定义键避免字符串硬编码')
  111. console.log(' 🔹 简洁的 API 设计')
  112. } catch (error) {
  113. console.error('❌ 演示失败:', error)
  114. }
  115. }
  116. /**
  117. * 配置验证函数
  118. */
  119. function validateConfiguration(): {
  120. isValid: boolean
  121. errors: string[]
  122. warnings: string[]
  123. } {
  124. const result = {
  125. isValid: true,
  126. errors: [] as string[],
  127. warnings: [] as string[],
  128. }
  129. // 检查基础配置
  130. if (!Config.nodeEnv()) {
  131. result.errors.push('NODE_ENV 未设置')
  132. }
  133. // 检查 Aster 配置
  134. if (!Config.aster.orderUser()) {
  135. result.warnings.push('Aster 用户地址未设置')
  136. }
  137. if (!Config.aster.apiKey()) {
  138. result.warnings.push('Aster API 密钥未设置')
  139. }
  140. // 检查 Pacifica 配置
  141. if (!Config.pacifica.account()) {
  142. result.warnings.push('Pacifica 账户未设置')
  143. }
  144. if (!Config.pacifica.accountPrivateKey()) {
  145. result.warnings.push('Pacifica 账户私钥未设置')
  146. }
  147. // 检查发现的账户
  148. const discovered = SmartAccountDiscovery.discoverAll()
  149. const totalAccounts = discovered.pacifica.length + discovered.aster.length + discovered.binance.length
  150. if (totalAccounts === 0) {
  151. result.warnings.push('没有发现任何可用账户')
  152. }
  153. result.isValid = result.errors.length === 0
  154. return result
  155. }
  156. /**
  157. * 显示使用示例
  158. */
  159. function showUsageExamples() {
  160. console.log('\n💡 简化环境变量 API 使用示例:')
  161. console.log(`
  162. // 1. 基础用法
  163. import { SimpleEnv, Config } from '../src/config/simpleEnv'
  164. // 获取字符串
  165. const nodeEnv = SimpleEnv.get('NODE_ENV', 'development')
  166. // 获取必需值 (不存在则抛错)
  167. const requiredKey = SimpleEnv.require('REQUIRED_KEY')
  168. // 获取布尔值
  169. const isEnabled = SimpleEnv.bool('FEATURE_ENABLED', false)
  170. // 获取数字
  171. const port = SimpleEnv.number('PORT', 3000)
  172. // 获取数组
  173. const symbols = SimpleEnv.array('SYMBOLS', ['BTC', 'ETH'])
  174. // 2. 使用预定义配置
  175. console.log('环境:', Config.nodeEnv())
  176. console.log('是否开发:', Config.isDev())
  177. console.log('Aster URL:', Config.aster.wsUrl())
  178. console.log('Pacifica URL:', Config.pacifica.baseUrl())
  179. // 3. 智能账户发现
  180. import { SmartAccountDiscovery } from '../src/config/simpleEnv'
  181. const accounts = SmartAccountDiscovery.discoverAll()
  182. console.log('发现的账户:', accounts)
  183. `)
  184. }
  185. // 运行演示
  186. if (import.meta.url === `file://${process.argv[1]}`) {
  187. if (process.argv.includes('--help') || process.argv.includes('-h')) {
  188. showUsageExamples()
  189. } else {
  190. simpleEnvDemo()
  191. }
  192. }