92 lines
2.9 KiB
TypeScript
92 lines
2.9 KiB
TypeScript
|
||
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();
|
||
});
|