|
5 | 5 |
|
6 | 6 | from __future__ import annotations |
7 | 7 |
|
| 8 | +import asyncio |
8 | 9 | import logging |
9 | 10 | from datetime import datetime, timezone |
10 | 11 | from decimal import Decimal, InvalidOperation |
11 | | -from typing import Awaitable, cast |
| 12 | +from typing import Any, Awaitable, Callable, cast |
12 | 13 |
|
13 | 14 | import grpc |
14 | 15 |
|
@@ -91,6 +92,31 @@ def validate_decimal_places(value: Decimal, decimal_places: int, name: str) -> N |
91 | 92 | ) from exc |
92 | 93 |
|
93 | 94 |
|
| 95 | +async def grpc_call_with_timeout( |
| 96 | + call: Callable[..., Awaitable[Any]], *args: Any, timeout: float = 300, **kwargs: Any |
| 97 | +) -> Any: |
| 98 | + """ |
| 99 | + Call a gRPC function with a timeout (in seconds). |
| 100 | +
|
| 101 | + Args: |
| 102 | + call: The gRPC method to be called. |
| 103 | + *args: Positional arguments for the gRPC call. |
| 104 | + timeout: Timeout duration in seconds. Defaults to 300. |
| 105 | + **kwargs: Keyword arguments for the gRPC call. |
| 106 | +
|
| 107 | + Returns: |
| 108 | + The result of the gRPC call. |
| 109 | +
|
| 110 | + Raises: |
| 111 | + asyncio.TimeoutError: If the call exceeds the timeout. |
| 112 | + """ |
| 113 | + try: |
| 114 | + return await asyncio.wait_for(call(*args, **kwargs), timeout=timeout) |
| 115 | + except asyncio.TimeoutError: |
| 116 | + _logger.error("Timeout while calling %s", call) |
| 117 | + raise |
| 118 | + |
| 119 | + |
94 | 120 | class Client(BaseApiClient[ElectricityTradingServiceStub]): |
95 | 121 | """Electricity trading client.""" |
96 | 122 |
|
@@ -503,10 +529,10 @@ async def create_gridpool_order( |
503 | 529 | try: |
504 | 530 | response = await cast( |
505 | 531 | Awaitable[electricity_trading_pb2.CreateGridpoolOrderResponse], |
506 | | - self.stub.CreateGridpoolOrder( |
| 532 | + grpc_call_with_timeout( |
| 533 | + self.stub.CreateGridpoolOrder, |
507 | 534 | electricity_trading_pb2.CreateGridpoolOrderRequest( |
508 | | - gridpool_id=gridpool_id, |
509 | | - order=order.to_pb(), |
| 535 | + gridpool_id=gridpool_id, order=order.to_pb() |
510 | 536 | ), |
511 | 537 | metadata=self._metadata, |
512 | 538 | ), |
@@ -615,7 +641,8 @@ async def update_gridpool_order( |
615 | 641 | try: |
616 | 642 | response = await cast( |
617 | 643 | Awaitable[electricity_trading_pb2.UpdateGridpoolOrderResponse], |
618 | | - self.stub.UpdateGridpoolOrder( |
| 644 | + grpc_call_with_timeout( |
| 645 | + self.stub.UpdateGridpoolOrder, |
619 | 646 | electricity_trading_pb2.UpdateGridpoolOrderRequest( |
620 | 647 | gridpool_id=gridpool_id, |
621 | 648 | order_id=order_id, |
@@ -650,7 +677,8 @@ async def cancel_gridpool_order( |
650 | 677 | try: |
651 | 678 | response = await cast( |
652 | 679 | Awaitable[electricity_trading_pb2.CancelGridpoolOrderResponse], |
653 | | - self.stub.CancelGridpoolOrder( |
| 680 | + grpc_call_with_timeout( |
| 681 | + self.stub.CancelGridpoolOrder, |
654 | 682 | electricity_trading_pb2.CancelGridpoolOrderRequest( |
655 | 683 | gridpool_id=gridpool_id, order_id=order_id |
656 | 684 | ), |
@@ -678,7 +706,8 @@ async def cancel_all_gridpool_orders(self, gridpool_id: int) -> int: |
678 | 706 | try: |
679 | 707 | response = await cast( |
680 | 708 | Awaitable[electricity_trading_pb2.CancelAllGridpoolOrdersResponse], |
681 | | - self.stub.CancelAllGridpoolOrders( |
| 709 | + grpc_call_with_timeout( |
| 710 | + self.stub.CancelAllGridpoolOrders, |
682 | 711 | electricity_trading_pb2.CancelAllGridpoolOrdersRequest( |
683 | 712 | gridpool_id=gridpool_id |
684 | 713 | ), |
@@ -710,7 +739,8 @@ async def get_gridpool_order(self, gridpool_id: int, order_id: int) -> OrderDeta |
710 | 739 | try: |
711 | 740 | response = await cast( |
712 | 741 | Awaitable[electricity_trading_pb2.GetGridpoolOrderResponse], |
713 | | - self.stub.GetGridpoolOrder( |
| 742 | + grpc_call_with_timeout( |
| 743 | + self.stub.GetGridpoolOrder, |
714 | 744 | electricity_trading_pb2.GetGridpoolOrderRequest( |
715 | 745 | gridpool_id=gridpool_id, order_id=order_id |
716 | 746 | ), |
@@ -770,7 +800,8 @@ async def list_gridpool_orders( |
770 | 800 | try: |
771 | 801 | response = await cast( |
772 | 802 | Awaitable[electricity_trading_pb2.ListGridpoolOrdersResponse], |
773 | | - self.stub.ListGridpoolOrders( |
| 803 | + grpc_call_with_timeout( |
| 804 | + self.stub.ListGridpoolOrders, |
774 | 805 | electricity_trading_pb2.ListGridpoolOrdersRequest( |
775 | 806 | gridpool_id=gridpool_id, |
776 | 807 | filter=gridpool_order_filer.to_pb(), |
@@ -842,7 +873,8 @@ async def list_gridpool_trades( |
842 | 873 | try: |
843 | 874 | response = await cast( |
844 | 875 | Awaitable[electricity_trading_pb2.ListGridpoolTradesResponse], |
845 | | - self.stub.ListGridpoolTrades( |
| 876 | + grpc_call_with_timeout( |
| 877 | + self.stub.ListGridpoolTrades, |
846 | 878 | electricity_trading_pb2.ListGridpoolTradesRequest( |
847 | 879 | gridpool_id=gridpool_id, |
848 | 880 | filter=gridpool_trade_filter.to_pb(), |
@@ -899,7 +931,8 @@ async def list_public_trades( |
899 | 931 | try: |
900 | 932 | response = await cast( |
901 | 933 | Awaitable[electricity_trading_pb2.ListPublicTradesResponse], |
902 | | - self.stub.ListPublicTrades( |
| 934 | + grpc_call_with_timeout( |
| 935 | + self.stub.ListPublicTrades, |
903 | 936 | electricity_trading_pb2.ListPublicTradesRequest( |
904 | 937 | filter=public_trade_filter.to_pb(), |
905 | 938 | pagination_params=pagination_params.to_proto(), |
|
0 commit comments