Skip to content

Commit fe4808e

Browse files
authored
fix(hip-3-pusher): SEDA client optimization, pusher error fix, dev dependency fix (#3486)
1 parent bb5c2e8 commit fe4808e

6 files changed

Lines changed: 33 additions & 20 deletions

File tree

apps/hip-3-pusher/src/pusher/hermes_listener.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import websockets
66
from loguru import logger
7-
from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_fixed
7+
from tenacity import retry, retry_if_exception_type, wait_fixed
88
from websockets import ClientConnection
99

1010
from pusher.config import STALE_TIMEOUT_SECONDS, Config

apps/hip-3-pusher/src/pusher/hyperliquid_listener.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
import websockets
2929
from loguru import logger
30-
from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_fixed
30+
from tenacity import retry, retry_if_exception_type, wait_fixed
3131

3232
from pusher.config import STALE_TIMEOUT_SECONDS, Config
3333
from pusher.exception import StaleConnectionError

apps/hip-3-pusher/src/pusher/kms_signer.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from pathlib import Path
2-
from typing import Any
2+
from typing import TYPE_CHECKING, Any
33

44
import boto3
55
from cryptography.hazmat.primitives import serialization
@@ -19,7 +19,11 @@
1919
l1_payload,
2020
)
2121
from loguru import logger
22-
from mypy_boto3_kms import KMSClient
22+
23+
if TYPE_CHECKING:
24+
from mypy_boto3_kms import KMSClient
25+
else:
26+
KMSClient = Any
2327

2428
from pusher.config import Config
2529
from pusher.exception import PushError

apps/hip-3-pusher/src/pusher/lazer_listener.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import websockets
66
from loguru import logger
7-
from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_fixed
7+
from tenacity import retry, retry_if_exception_type, wait_fixed
88
from websockets import ClientConnection
99

1010
from pusher.config import STALE_TIMEOUT_SECONDS, Config

apps/hip-3-pusher/src/pusher/publisher.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,11 @@ async def publish(self) -> None:
176176
external_perp_pxs=external_perp_pxs,
177177
)
178178
self._handle_response(push_response, list(oracle_pxs.keys()))
179-
except PushError:
180-
# since rate limiting is expected, don't necessarily log
179+
except PushError as e:
180+
logger.exception("Push API call failed: {}", repr(e))
181+
self._update_attempts_total(
182+
"error", PushErrorReason.INTERNAL_ERROR, list(oracle_pxs.keys())
183+
)
181184
pass
182185
except Exception as e:
183186
logger.exception("Unexpected exception in push request: {}", repr(e))

apps/hip-3-pusher/src/pusher/seda_listener.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -115,21 +115,23 @@ async def run(self) -> None:
115115
logger.info("No SEDA feeds needed")
116116
return
117117

118-
await asyncio.gather(
119-
*[
120-
self._run_single(feed_name, self.feeds[feed_name])
121-
for feed_name in self.feeds
122-
]
123-
)
118+
async with httpx.AsyncClient(timeout=self.poll_timeout) as client:
119+
await asyncio.gather(
120+
*[
121+
self._run_single(client, feed_name, self.feeds[feed_name])
122+
for feed_name in self.feeds
123+
]
124+
)
124125

125-
async def _run_single(self, feed_name: str, feed_config: SedaFeedConfig) -> None:
126+
async def _run_single(
127+
self, client: httpx.AsyncClient, feed_name: str, feed_config: SedaFeedConfig
128+
) -> None:
126129
"""Run continuous polling loop for a single feed."""
127-
async with httpx.AsyncClient(timeout=self.poll_timeout) as client:
128-
while True:
129-
result = await self.poll_single_feed(client, feed_name, feed_config)
130-
await asyncio.sleep(
131-
self.poll_interval if result["ok"] else self.poll_failure_interval
132-
)
130+
while True:
131+
result = await self.poll_single_feed(client, feed_name, feed_config)
132+
await asyncio.sleep(
133+
self.poll_interval if result["ok"] else self.poll_failure_interval
134+
)
133135

134136
async def poll_single_feed(
135137
self,
@@ -172,6 +174,7 @@ async def _poll(
172174
data: dict[str, Any],
173175
) -> PollResult:
174176
"""Execute HTTP POST request to SEDA API."""
177+
resp: httpx.Response | None = None
175178
try:
176179
resp = await client.post(
177180
self.url, headers=headers, params=params, json=data
@@ -182,6 +185,9 @@ async def _poll(
182185
return {"ok": False, "status": e.response.status_code, "error": repr(e)}
183186
except Exception as e:
184187
return {"ok": False, "status": None, "error": repr(e)}
188+
finally:
189+
if resp is not None:
190+
await resp.aclose()
185191

186192
def _parse_seda_message(self, feed_name: str, message: dict[str, Any]) -> None:
187193
"""Parse SEDA response and store prices in state."""

0 commit comments

Comments
 (0)