-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathstream_websocket_all.ts
More file actions
117 lines (96 loc) · 3.66 KB
/
stream_websocket_all.ts
File metadata and controls
117 lines (96 loc) · 3.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/usr/bin/env npx ts-node
// @ts-nocheck
/**
* WebSocket Streaming - Complete Reference
*
* This example demonstrates ALL WebSocket subscription types:
* - Market Data: trades, l2_book, book_updates, all_mids, candle, bbo
* - User Data: open_orders, user_fills, user_fundings, clearinghouse_state
* - TWAP: twap, twap_states, user_twap_slice_fills
* - System: events, notification
*
* Usage:
* export ENDPOINT="https://your-endpoint.example.com/TOKEN"
* npx ts-node stream_websocket_all.ts
*/
import { HyperliquidSDK } from '@quicknode/hyperliquid-sdk';
const ENDPOINT = process.env.ENDPOINT;
const USER = process.env.USER_ADDRESS || "0x0000000000000000000000000000000000000000";
if (!ENDPOINT) {
console.log("WebSocket Complete Reference");
console.log("=".repeat(60));
console.log();
console.log("Usage:");
console.log(" export ENDPOINT='https://your-endpoint.example.com/TOKEN'");
console.log(" export USER_ADDRESS='0x...' # Optional, for user data streams");
console.log(" npx ts-node stream_websocket_all.ts");
process.exit(1);
}
function timestamp(): string {
return new Date().toISOString().slice(11, 23);
}
// Global counters
const counts: Record<string, number> = {};
function makeCallback(name: string, maxPrints = 3) {
counts[name] = 0;
return (data: any) => {
counts[name]++;
if (counts[name] <= maxPrints) {
const channel = data.channel || "unknown";
console.log(`[${timestamp()}] ${name.toUpperCase()}: ${channel} (#${counts[name]})`);
// Print first few fields of data
const innerData = data.data || data;
if (typeof innerData === "object" && !Array.isArray(innerData)) {
const keys = Object.keys(innerData).slice(0, 3);
console.log(` Fields: ${keys.join(", ")}`);
} else if (Array.isArray(innerData)) {
console.log(` Items: ${innerData.length}`);
}
}
};
}
async function demoMarketData() {
console.log("\n" + "=".repeat(60));
console.log("MARKET DATA STREAMS");
console.log("=".repeat(60));
console.log();
console.log("Available streams:");
console.log(" - trades(coins, callback)");
console.log(" - bookUpdates(coins, callback)");
console.log(" - l2Book(coin, callback)");
console.log(" - allMids(callback)");
console.log(" - candle(coin, interval, callback)");
console.log(" - bbo(coin, callback)");
console.log();
// Create SDK client
const sdk = new HyperliquidSDK(ENDPOINT!);
// trades: Real-time executed trades
sdk.stream.trades(["BTC", "ETH"], makeCallback("trades"));
// book_updates: Incremental order book changes
sdk.stream.bookUpdates(["BTC"], makeCallback("book_updates"));
// l2_book: Full L2 order book snapshots
sdk.stream.l2Book("BTC", makeCallback("l2_book"));
console.log("Starting market data streams for 10 seconds...");
console.log("-".repeat(60));
await sdk.stream.start();
await new Promise(resolve => setTimeout(resolve, 10000));
sdk.stream.stop();
console.log("\nMarket data summary:");
for (const [name, count] of Object.entries(counts)) {
console.log(` ${name}: ${count} messages`);
}
}
async function main() {
console.log("WebSocket Streaming - Complete Reference");
console.log("=".repeat(60));
await demoMarketData();
console.log("\n" + "=".repeat(60));
console.log("Done!");
console.log();
console.log("Other available streams (not shown):");
console.log(" Market: allMids, candle, bbo, activeAssetCtx");
console.log(" User: openOrders, userFills, userFundings, clearinghouseState");
console.log(" TWAP: twap, twapStates, userTwapSliceFills");
console.log(" System: events, notification, writerActions");
}
main().catch(console.error);