import { ClobSdk, PriceSizePolyMsg, TradePolyMsg, WelcomeMsg } from './clobSocket'; import WebSocket from 'ws'; // 模拟浏览器环境 // 因为 ClobSdk 主要是为前端设计的,这里需要在 Node.js 环境中注入 WebSocket 全局对象 (global as any).WebSocket = WebSocket; (global as any).window = undefined; // 确保在构造函数中命中回退路径 (fallback path) // 配置 // 从环境变量中获取配置,TOKEN_IDS 为逗号分隔的 Yes/No token ID const TOKEN_IDS = process.env.TOKEN_IDS ? process.env.TOKEN_IDS.split(',').map((s) => s.trim()).filter(Boolean) : ['token_yes', 'token_no'] const WS_URL = process.env.WS_URL || "ws://localhost:8888/clob/ws"; console.log(`正在启动 CLOB WebSocket 测试客户端...`); console.log(`目标 URL: ${WS_URL}`); console.log(`Token IDs: ${TOKEN_IDS.join(', ')}`); // 初始化 SDK const sdk = new ClobSdk(TOKEN_IDS, { url: WS_URL, autoReconnect: true, // 启用自动重连 reconnectInterval: 2000 // 重连间隔 2 秒 }); // 注册回调函数 // 1. 连接建立事件 sdk.onConnect(() => { console.log('✅ 已连接到 WebSocket 服务器'); }); // 2. Welcome 消息 (连接成功后服务器发送的第一条消息) sdk.onWelcome((msg: WelcomeMsg) => { console.log('👋 收到 Welcome 消息:', msg); }); // 3. 全量订单簿快照 (PriceSizeAll) // 当订阅成功时,通常会收到一次全量快照 sdk.onPriceSizeAll((msg: PriceSizePolyMsg) => { console.log('\n📚 收到全量订单簿快照:'); console.log(` 市场: ${msg.m}`); console.log(` 时间戳: ${msg.t}`); console.log(` 买单 (Buys): ${JSON.stringify(msg.b)}`); console.log(` 卖单 (Sells): ${JSON.stringify(msg.s)}`); }); // 4. 增量更新 (PriceSizeDelta) // 当订单簿发生变化时,会收到增量更新 sdk.onPriceSizeDelta((msg: PriceSizePolyMsg) => { console.log('\n🔄 收到订单簿增量更新:'); console.log(` 市场: ${msg.m}`); console.log(` 时间戳: ${msg.t}`); if (msg.b) console.log(` 买单更新: ${JSON.stringify(msg.b)}`); if (msg.s) console.log(` 卖单更新: ${JSON.stringify(msg.s)}`); }); // 5. 成交记录 (Trade Execution) // 当发生撮合交易时触发 sdk.onTrade((msg: TradePolyMsg) => { console.log('\n💰 交易成交:'); console.log(` 市场: ${msg.m}`); console.log(` 价格: ${msg.p}`); console.log(` 数量: ${msg.s}`); console.log(` 方向: ${msg.side}`); }); // 6. 错误处理 sdk.onError((err: Event) => { console.error('❌ WebSocket 错误:', err); }); // 7. 断开连接 sdk.onDisconnect((event: CloseEvent) => { console.log(`⚠️ 连接断开: 代码 ${event.code}`); }); // 开始连接 sdk.connect(); // 保持进程运行 (防止 Node.js 脚本立即退出) process.stdin.resume(); // 处理退出信号 (Ctrl+C) process.on('SIGINT', () => { console.log('\n正在断开连接...'); sdk.disconnect(); process.exit(); });