// chain_subscribeNewHeads.js
import dotenv from 'dotenv';
dotenv.config();
import WebSocket from 'ws';
const WS_URL = process.env.PEAQ_WS_URL;
const ws = new WebSocket(WS_URL);
let subscriptionId = null;
const SUBSCRIBE_REQUEST_ID = 1;
const UNSUBSCRIBE_REQUEST_ID = 2;
ws.on('open', () => {
console.log("WebSocket connected");
// Send a subscription request using the stable method "chain_subscribeNewHeads"
const subscribePayload = {
jsonrpc: "2.0",
method: "chain_subscribeNewHeads",
params: [],
id: SUBSCRIBE_REQUEST_ID,
};
console.log("Sending subscription payload:", JSON.stringify(subscribePayload));
ws.send(JSON.stringify(subscribePayload));
});
ws.on('message', (message) => {
try {
const data = JSON.parse(message);
console.log("Received message:", JSON.stringify(data, null, 2));
// Handle the subscription response (id: 1)
if (data.id === SUBSCRIBE_REQUEST_ID && data.result) {
subscriptionId = data.result;
console.log("Subscribed to new heads with ID:", subscriptionId);
}
// Handle incoming notifications for new block headers
// Some nodes may return notifications under the method "chain_newHead" or the generic "subscription"
else if ((data.method === 'chain_newHead' || data.method === 'subscription') &&
data.params &&
data.params.subscription === subscriptionId) {
console.log("New Block Header received:");
console.log(data.params.result);
}
} catch (e) {
console.error("Error parsing message:", message);
}
});
ws.on('error', (error) => {
console.error("WebSocket error:", error);
});
ws.on('close', () => {
console.log("WebSocket connection closed");
});
// Graceful shutdown: send an unsubscribe request and close the socket
process.on('SIGINT', () => {
console.log("\nGracefully shutting down...");
if (subscriptionId) {
const unsubscribePayload = {
jsonrpc: "2.0",
method: "chain_unsubscribeNewHeads",
params: [subscriptionId],
id: UNSUBSCRIBE_REQUEST_ID,
};
console.log("Sending unsubscribe payload:", JSON.stringify(unsubscribePayload));
ws.send(JSON.stringify(unsubscribePayload), () => {
ws.close();
process.exit();
});
} else {
ws.close();
process.exit();
}
});
console.log("Listening for new block headers on the peaq network (chain_subscribeNewHeads) using ws...");