پخش کینباز زمان واقعی با Node.JS WebSocket و TypeScript بومی

Coinbase (و Coinbase Pro) یک فید WebSocket را برای پخش داده های بازار زنده ارائه می دهد. در این آموزش ما روی تیک زدن کانال که داده های قیمت گذاری زمان واقعی (مانند قیمت ، پیشنهاد ، سؤال ، حجم و غیره) را برای جفت های معاملات انتخاب شده باز می گرداند. با استفاده از API و TypeScript در WebSocket ساخته شده گره ، یک راه حل قوی ایجاد خواهیم کرد که خطاها ، اتصال مجدد و خاموشی های برازنده را انجام می دهد.
توجه:
- نقطه پایانی Coinbase WebSocket:
wss://ws-feed.pro.coinbase.com
- برخلاف جریان ترکیبی Binance که داده ها را در یک می بندد
{stream, data}
شی ، Coinbase شما را ملزم به ارسال پیام JSON اشتراک می کند و پیام هایی را با خواص مانند منتشر می کندtype
باproduct_id
، و زمینه های داده را تیک بزنید.در این آموزش ، ما برای سه محصول در کانال Ticker مشترک می شویم: BTC-USD ، ETH-USD و BNB-USD.
1. بررسی اجمالی
هنگام عضویت در کانال Ticker Coinbase ، یک پیام اشتراک با فرمت JSON مانند:
{
"type": "subscribe",
"channels": [
{
"name": "ticker",
"product_ids": ["BTC-USD", "ETH-USD", "BNB-USD"]
}
]
}
پس از مشترک شدن ، سرور پیام هایی با ساختاری مشابه با:
{
"type": "ticker",
"sequence": 123456789,
"product_id": "BTC-USD",
"price": "50000.12",
"open_24h": "49000.00",
"volume_24h": "1200.3456",
"low_24h": "48000.00",
"high_24h": "51000.00",
"side": "buy", // "buy" or "sell"
"time": "2021-12-01T12:34:56.789Z",
"trade_id": 12345,
"last_size": "0.01"
}
این داده ها به روزرسانی های زمان واقعی در مورد وضعیت بازار محصول را ارائه می دهد. ما از این داده ها برای شبیه سازی به روزرسانی های پردازش “Ticker” (مشابه جزئیات OHLCV) استفاده خواهیم کرد.
2. تنظیم محیط
-
پیش نیازها:
- node.js v20+ (برای استفاده از پایدار ساخته شده – در API WebSocket)
- شرح
-
اولیه سازی پروژه:
npm init -y
npm install --save-dev typescript @types/node
npx tsc --init
- هیچ کتابخانه ای خارجی WebSocket مورد نیاز نیست از آنجا که ما از API ساخته شده در WebSocket در WebSocket استفاده می کنیم.
3. اجرای در TypeScript
در زیر نمونه کد کامل است. این مثال خواهد بود:
- اتصال WebSocket به Coinbase ایجاد کنید.
- برای BTC-USD ، ETH-USD و BNB-USD یک پیام اشتراک را به کانال Ticker ارسال کنید.
- به پیام های ورودی گوش دهید و داده های JSON را تجزیه کنید.
- خطای و وقایع را با اتصال مجدد خودکار انجام دهید.
- با پایان یافتن روند ، با لطف خاموش می شود.
// List of Coinbase products to subscribe to.
const products = ["BTC-USD", "ETH-USD", "BNB-USD"];
const WS_URL = "wss://ws-feed.pro.coinbase.com";
let ws: WebSocket | null = null;
let reconnectTimeout: NodeJS.Timeout | null = null;
/**
* Connect (or reconnect) to Coinbase’s WebSocket feed.
*/
function connect() {
ws = new WebSocket(WS_URL);
ws.onopen = () => {
console.log("Connected to Coinbase WebSocket API");
// Send the subscription message upon connection.
const subscribeMessage = {
type: "subscribe",
channels: [
{
name: "ticker",
product_ids: products,
},
],
};
ws?.send(JSON.stringify(subscribeMessage));
};
ws.onmessage = (event: MessageEvent) => {
try {
const message = JSON.parse(event.data.toString());
// Coinbase emits many types of messages (e.g. subscriptions, heartbeats).
// We are interested in "ticker" messages which provide real‑time pricing updates.
if (message.type === "ticker") {
const {
product_id,
price,
open_24h,
volume_24h,
low_24h,
high_24h,
side,
time,
trade_id,
last_size,
} = message;
console.log(
`Ticker update for ${product_id} at ${time}: Price=${price}, Open=${open_24h}, ` +
`High=${high_24h}, Low=${low_24h}, Volume=${volume_24h}, Last Size=${last_size}, Side=${side}`
);
// Process the ticker data as needed.
} else {
// Optionally log non-ticker messages or handle them accordingly.
// console.log("Received message:", message);
}
} catch (err) {
console.error("Error parsing incoming message:", err);
}
};
ws.onerror = (event: Event) => {
console.error("WebSocket error occurred:", event);
cleanupAndReconnect();
};
ws.onclose = (event: CloseEvent) => {
console.warn(
`WebSocket closed. Code: ${event.code}, Reason: ${event.reason}`
);
// For Coinbase, a normal closure should be code 1000.
if (event.code !== 1000) {
console.log("Attempting to reconnect in 5 seconds...");
reconnectTimeout = setTimeout(connect, 5000);
}
};
}
/**
* Clean up the current connection and schedule a reconnection.
*/
function cleanupAndReconnect() {
if (ws) {
// Remove event handlers.
ws.onopen = null;
ws.onmessage = null;
ws.onerror = null;
ws.onclose = null;
// Close the connection if it is OPEN or CONNECTING.
if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
ws.close(1001, "Reconnecting"); // Code 1001: Going Away.
}
}
if (reconnectTimeout) {
clearTimeout(reconnectTimeout);
}
reconnectTimeout = setTimeout(connect, 5000);
}
connect();
/**
* Gracefully shut down the WebSocket connection on process termination.
*/
function shutdown() {
console.log("Shutting down gracefully...");
if (reconnectTimeout) {
clearTimeout(reconnectTimeout);
}
if (ws && ws.readyState === WebSocket.OPEN) {
// Send an unsubscribe message if needed before closing.
const unsubscribeMessage = {
type: "unsubscribe",
channels: [
{
name: "ticker",
product_ids: products,
},
],
};
ws.send(JSON.stringify(unsubscribeMessage));
ws.close(1000, "Process terminated"); // Code 1000: Normal Closure.
}
process.exit(0);
}
process.on("SIGINT", shutdown);
process.on("SIGTERM", shutdown);
// Optional: Dynamic Subscription Management
// If you wish to subscribe or unsubscribe from additional products dynamically, you can send:
//
// // To subscribe to a new product, for example, LTC-USD:
// ws.send(
// JSON.stringify({
// type: "subscribe",
// channels: [{ name: "ticker", product_ids: ["LTC-USD"] }]
// })
// );
//
// // To unsubscribe from a product:
// ws.send(
// JSON.stringify({
// type: "unsubscribe",
// channels: [{ name: "ticker", product_ids: ["LTC-USD"] }]
// })
// );
4 توضیحات
ما یک اتصال WebSocket به wss://ws-feed.pro.coinbase.com
با استفاده از API بومی گره. پس از باز شدن اتصال ، ما یک پیام اشتراک با فرمت JSON را برای محصولات خود به کانال Ticker ارسال می کنیم. سپس Coinbase پیام های تیک تیک زمان واقعی را برای محصولات مشترک منتشر می کند.
-
دستگیرندگان رویداد:
-
onopen
: گزارش هایی که اتصال برقرار شده و پیام اشتراک را ارسال می کند. -
onmessage
: پیام های دریافتی پارس. کنترل کننده به طور خاص پیام های نوع را بررسی می کند"ticker"
که حاوی اطلاعاتی مانند قیمت ، 24 ساعته بالا ، کم ، حجم و غیره است. -
onerror
وادonclose
: مدیریت خطا/قطع. در صورت بسته شدن غیر طبیعی (کد برابر با 1000) ، ما یک اتصال مجدد را پس از 5 ثانیه برنامه ریزی می کنیم.
-
-
خاموشی برازنده:
ما به
SIGINT
وتSIGTERM
برای عدم اشتراک گذاری (در صورت تمایل) به طرز دلپذیر و بستن اتصال قبل از خاتمه دادن به فرآیند. -
مدیریت اشتراک پویا (اختیاری):
Coinbase با استفاده از پیام های JSON از اشتراک های پویا پشتیبانی می کند. این تسهیلات به شما امکان می دهد بدون بازگشایی اتصال ، اشتراک ها را در زمان اجرا اضافه یا حذف کنید.
5. خلاصه
در این آموزش ، ما نشان دادیم که چگونه:
- با استفاده از API بومی WebSocket Node در یک محیط TypeScript به فید Coinbase WebSocket وصل شوید.
- برای محصولات انتخاب شده در کانال Ticker مشترک شوید (BTC-USD ، ETH-USD و BNB-USD).
- پیام های ورودی را که شامل داده های بازار واقعی است ، پردازش کنید.
- خطاها را انجام دهید ، به صورت خودکار در مورد تعطیلی غیر منتظره ارتباط برقرار کنید و از خاتمه فرآیند پاکسازی کنید.
- به صورت اختیاری مدیریت اشتراک پویا را انجام دهید.
این تنظیم قوی پایه و اساس کاملی برای هر برنامه ای که به داده های بازار واقعی نیاز دارد از Coinbase تشکیل می دهد. برنامه نویسی مبارک!