|
5 | 5 | } from "@pythnetwork/hermes-client";
|
6 | 6 | import { PriceInfo, IPriceListener, PriceItem } from "./interface";
|
7 | 7 | import { Logger } from "pino";
|
| 8 | +import { sleep } from "./utils"; |
8 | 9 |
|
9 | 10 | type TimestampInMs = number & { readonly _: unique symbol };
|
10 | 11 |
|
@@ -34,6 +35,24 @@ export class PythPriceListener implements IPriceListener {
|
34 | 35 | // This method should be awaited on and once it finishes it has the latest value
|
35 | 36 | // for the given price feeds (if they exist).
|
36 | 37 | async start() {
|
| 38 | + this.startListening(); |
| 39 | + |
| 40 | + // Store health check interval reference |
| 41 | + this.healthCheckInterval = setInterval(() => { |
| 42 | + if ( |
| 43 | + this.lastUpdated === undefined || |
| 44 | + this.lastUpdated < Date.now() - 30 * 1000 |
| 45 | + ) { |
| 46 | + throw new Error("Hermes Price feeds are not updating."); |
| 47 | + } |
| 48 | + }, 5000); |
| 49 | + } |
| 50 | + |
| 51 | + async startListening() { |
| 52 | + this.logger.info( |
| 53 | + `Starting to listen for price updates from Hermes for ${this.priceIds.length} price feeds.`, |
| 54 | + ); |
| 55 | + |
37 | 56 | const eventSource = await this.hermesClient.getPriceUpdatesStream(
|
38 | 57 | this.priceIds,
|
39 | 58 | {
|
@@ -71,20 +90,12 @@ export class PythPriceListener implements IPriceListener {
|
71 | 90 | });
|
72 | 91 | };
|
73 | 92 |
|
74 |
| - eventSource.onerror = (error: Event) => { |
| 93 | + eventSource.onerror = async (error: Event) => { |
75 | 94 | console.error("Error receiving updates from Hermes:", error);
|
76 | 95 | eventSource.close();
|
| 96 | + await sleep(5000); // Wait a bit before trying to reconnect |
| 97 | + this.startListening(); // Attempt to restart the listener |
77 | 98 | };
|
78 |
| - |
79 |
| - // Store health check interval reference |
80 |
| - this.healthCheckInterval = setInterval(() => { |
81 |
| - if ( |
82 |
| - this.lastUpdated === undefined || |
83 |
| - this.lastUpdated < Date.now() - 30 * 1000 |
84 |
| - ) { |
85 |
| - throw new Error("Hermes Price feeds are not updating."); |
86 |
| - } |
87 |
| - }, 5000); |
88 | 99 | }
|
89 | 100 |
|
90 | 101 | getLatestPriceInfo(priceId: HexString): PriceInfo | undefined {
|
|
0 commit comments