Last active
July 29, 2024 00:31
-
-
Save NicolasPennie/55e9f99e19e5dd9c44e78be3a5096f89 to your computer and use it in GitHub Desktop.
gRPC Ping Example (TypeScript)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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