ws.send(JSON.stringify({
action: 'subscribe',
streams: ['BTCUSDT@order_book_update']
}));
const buffer = [];
ws.onmessage = (msg) => {
const data = JSON.parse(msg.data);
if (data.action === 'order_book_update') {
buffer.push(data.result);
}
};
const snapshot = await fetch('/api/v1/futures/open-api/orderbook/BTCUSDT?depth=100&with_id=true');
const { bids, asks, id: snapshotId } = snapshot.data;
const orderbook = {
bids: new Map(bids.map(([p, q]) => [p, q])),
asks: new Map(asks.map(([p, q]) => [p, q])),
lastUpdateId: snapshotId
};
for (const update of buffer) {
if (update.u < snapshotId + 1) continue;
if (update.U > snapshotId + 1) {
rebuildOrderbook();
break;
}
applyUpdate(update);
}
function applyUpdate(update) {
for (const [price, qty] of update.b) {
if (qty === '0') orderbook.bids.delete(price);
else orderbook.bids.set(price, qty);
}
for (const [price, qty] of update.a) {
if (qty === '0') orderbook.asks.delete(price);
else orderbook.asks.set(price, qty);
}
orderbook.lastUpdateId = update.u;
}