Skip to content

Instantly share code, notes, and snippets.

@NicolasPennie
Last active July 29, 2024 00:31
Show Gist options
  • Save NicolasPennie/55e9f99e19e5dd9c44e78be3a5096f89 to your computer and use it in GitHub Desktop.
Save NicolasPennie/55e9f99e19e5dd9c44e78be3a5096f89 to your computer and use it in GitHub Desktop.
gRPC Ping Example (TypeScript)
import Client, {
CommitmentLevel,
SubscribeRequest,
SubscribeRequestFilterAccountsFilter,
} from "@triton-one/yellowstone-grpc";
const GRPC_URL = "insert_here";
const X_TOKEN = "insert_here";
async function main() {
// Open connection.
const client = new Client(GRPC_URL, X_TOKEN, {
"grpc.max_receive_message_length": 64 * 1024 * 1024, // 64MiB
});
// Subscribe for events
const stream = await client.subscribe();
// Create `error` / `end` handler
const streamClosed = new Promise<void>((resolve, reject) => {
stream.on("error", (error) => {
reject(error);
stream.end();
});
stream.on("end", () => {
resolve();
});
stream.on("close", () => {
resolve();
});
});
// Handle updates
stream.on("data", (data) => {
let ts = new Date();
if (data.filters[0] == "slot") {
console.log(
`${ts.toUTCString()}: Received slot update: ${data.slot.slot}`
);
} else if (data.pong) {
console.log(`${ts.toUTCString()}: Processed ping response!`);
}
});
// Example subscribe request.
// Listen to all slot updates.
const slotRequest: SubscribeRequest = {
slots: {
slot: { filterByCommitment: true },
},
commitment: CommitmentLevel.CONFIRMED,
// Required, but unused arguments
accounts: {},
accountsDataSlice: [],
transactions: {},
transactionsStatus: {},
blocks: {},
blocksMeta: {},
entry: {},
};
// Send subscribe request
await new Promise<void>((resolve, reject) => {
stream.write(slotRequest, (err) => {
if (err === null || err === undefined) {
resolve();
} else {
reject(err);
}
});
}).catch((reason) => {
console.error(reason);
throw reason;
});
// Send pings every 5s to keep the connection open
const pingRequest: SubscribeRequest = {
ping: { id: 1 },
// Required, but unused arguments
accounts: {},
accountsDataSlice: [],
transactions: {},
transactionsStatus: {},
blocks: {},
blocksMeta: {},
entry: {},
slots: {},
};
setInterval(async () => {
await new Promise<void>((resolve, reject) => {
stream.write(pingRequest, (err) => {
if (err === null || err === undefined) {
resolve();
} else {
reject(err);
}
});
}).catch((reason) => {
console.error(reason);
throw reason;
});
}, 5000);
await streamClosed;
}
main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment