2026-02-25 14:46:10 +08:00

92 lines
2.9 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
});