|
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 TYPE_CHECKING, Any, Awaitable, cast |
| 12 | +from typing import TYPE_CHECKING, 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): |
95 | 121 | """Electricity trading client.""" |
96 | 122 |
|
@@ -512,10 +538,10 @@ async def create_gridpool_order( |
512 | 538 | try: |
513 | 539 | response = await cast( |
514 | 540 | Awaitable[electricity_trading_pb2.CreateGridpoolOrderResponse], |
515 | | - self.stub.CreateGridpoolOrder( |
| 541 | + grpc_call_with_timeout( |
| 542 | + self.stub.CreateGridpoolOrder, |
516 | 543 | electricity_trading_pb2.CreateGridpoolOrderRequest( |
517 | | - gridpool_id=gridpool_id, |
518 | | - order=order.to_pb(), |
| 544 | + gridpool_id=gridpool_id, order=order.to_pb() |
519 | 545 | ), |
520 | 546 | metadata=self._metadata, |
521 | 547 | ), |
@@ -624,7 +650,8 @@ async def update_gridpool_order( |
624 | 650 | try: |
625 | 651 | response = await cast( |
626 | 652 | Awaitable[electricity_trading_pb2.UpdateGridpoolOrderResponse], |
627 | | - self.stub.UpdateGridpoolOrder( |
| 653 | + grpc_call_with_timeout( |
| 654 | + self.stub.UpdateGridpoolOrder, |
628 | 655 | electricity_trading_pb2.UpdateGridpoolOrderRequest( |
629 | 656 | gridpool_id=gridpool_id, |
630 | 657 | order_id=order_id, |
@@ -659,7 +686,8 @@ async def cancel_gridpool_order( |
659 | 686 | try: |
660 | 687 | response = await cast( |
661 | 688 | Awaitable[electricity_trading_pb2.CancelGridpoolOrderResponse], |
662 | | - self.stub.CancelGridpoolOrder( |
| 689 | + grpc_call_with_timeout( |
| 690 | + self.stub.CancelGridpoolOrder, |
663 | 691 | electricity_trading_pb2.CancelGridpoolOrderRequest( |
664 | 692 | gridpool_id=gridpool_id, order_id=order_id |
665 | 693 | ), |
@@ -687,7 +715,8 @@ async def cancel_all_gridpool_orders(self, gridpool_id: int) -> int: |
687 | 715 | try: |
688 | 716 | response = await cast( |
689 | 717 | Awaitable[electricity_trading_pb2.CancelAllGridpoolOrdersResponse], |
690 | | - self.stub.CancelAllGridpoolOrders( |
| 718 | + grpc_call_with_timeout( |
| 719 | + self.stub.CancelAllGridpoolOrders, |
691 | 720 | electricity_trading_pb2.CancelAllGridpoolOrdersRequest( |
692 | 721 | gridpool_id=gridpool_id |
693 | 722 | ), |
@@ -719,7 +748,8 @@ async def get_gridpool_order(self, gridpool_id: int, order_id: int) -> OrderDeta |
719 | 748 | try: |
720 | 749 | response = await cast( |
721 | 750 | Awaitable[electricity_trading_pb2.GetGridpoolOrderResponse], |
722 | | - self.stub.GetGridpoolOrder( |
| 751 | + grpc_call_with_timeout( |
| 752 | + self.stub.GetGridpoolOrder, |
723 | 753 | electricity_trading_pb2.GetGridpoolOrderRequest( |
724 | 754 | gridpool_id=gridpool_id, order_id=order_id |
725 | 755 | ), |
@@ -779,7 +809,8 @@ async def list_gridpool_orders( |
779 | 809 | try: |
780 | 810 | response = await cast( |
781 | 811 | Awaitable[electricity_trading_pb2.ListGridpoolOrdersResponse], |
782 | | - self.stub.ListGridpoolOrders( |
| 812 | + grpc_call_with_timeout( |
| 813 | + self.stub.ListGridpoolOrders, |
783 | 814 | electricity_trading_pb2.ListGridpoolOrdersRequest( |
784 | 815 | gridpool_id=gridpool_id, |
785 | 816 | filter=gridpool_order_filer.to_pb(), |
@@ -851,7 +882,8 @@ async def list_gridpool_trades( |
851 | 882 | try: |
852 | 883 | response = await cast( |
853 | 884 | Awaitable[electricity_trading_pb2.ListGridpoolTradesResponse], |
854 | | - self.stub.ListGridpoolTrades( |
| 885 | + grpc_call_with_timeout( |
| 886 | + self.stub.ListGridpoolTrades, |
855 | 887 | electricity_trading_pb2.ListGridpoolTradesRequest( |
856 | 888 | gridpool_id=gridpool_id, |
857 | 889 | filter=gridpool_trade_filter.to_pb(), |
@@ -908,7 +940,8 @@ async def list_public_trades( |
908 | 940 | try: |
909 | 941 | response = await cast( |
910 | 942 | Awaitable[electricity_trading_pb2.ListPublicTradesResponse], |
911 | | - self.stub.ListPublicTrades( |
| 943 | + grpc_call_with_timeout( |
| 944 | + self.stub.ListPublicTrades, |
912 | 945 | electricity_trading_pb2.ListPublicTradesRequest( |
913 | 946 | filter=public_trade_filter.to_pb(), |
914 | 947 | pagination_params=pagination_params.to_proto(), |
|
0 commit comments