| 
29 | 29 | from frequenz.client.base.streaming import GrpcStreamBroadcaster  | 
30 | 30 | from frequenz.client.common.pagination import Params  | 
31 | 31 | from google.protobuf import field_mask_pb2, struct_pb2  | 
 | 32 | +from google.protobuf.timestamp_pb2 import Timestamp  | 
32 | 33 | 
 
  | 
33 | 34 | from ._types import (  | 
34 | 35 |     DeliveryArea,  | 
@@ -345,62 +346,6 @@ def gridpool_trades_stream(  | 
345 | 346 |                 raise  | 
346 | 347 |         return self._gridpool_trades_streams[stream_key]  | 
347 | 348 | 
 
  | 
348 |  | -    def public_trades_stream(  | 
349 |  | -        # pylint: disable=too-many-arguments, too-many-positional-arguments  | 
350 |  | -        self,  | 
351 |  | -        states: list[TradeState] | None = None,  | 
352 |  | -        delivery_period: DeliveryPeriod | None = None,  | 
353 |  | -        buy_delivery_area: DeliveryArea | None = None,  | 
354 |  | -        sell_delivery_area: DeliveryArea | None = None,  | 
355 |  | -    ) -> GrpcStreamBroadcaster[  | 
356 |  | -        electricity_trading_pb2.ReceivePublicTradesStreamResponse, PublicTrade  | 
357 |  | -    ]:  | 
358 |  | -        """  | 
359 |  | -        Stream public trades.  | 
360 |  | -
  | 
361 |  | -        Args:  | 
362 |  | -            states: List of order states to filter for.  | 
363 |  | -            delivery_period: Delivery period to filter for.  | 
364 |  | -            buy_delivery_area: Buy delivery area to filter for.  | 
365 |  | -            sell_delivery_area: Sell delivery area to filter for.  | 
366 |  | -
  | 
367 |  | -        Returns:  | 
368 |  | -            Async generator of orders.  | 
369 |  | -
  | 
370 |  | -        Raises:  | 
371 |  | -            grpc.RpcError: If an error occurs while streaming public trades.  | 
372 |  | -        """  | 
373 |  | -        self.validate_params(delivery_period=delivery_period)  | 
374 |  | - | 
375 |  | -        public_trade_filter = PublicTradeFilter(  | 
376 |  | -            states=states,  | 
377 |  | -            delivery_period=delivery_period,  | 
378 |  | -            buy_delivery_area=buy_delivery_area,  | 
379 |  | -            sell_delivery_area=sell_delivery_area,  | 
380 |  | -        )  | 
381 |  | - | 
382 |  | -        if (  | 
383 |  | -            public_trade_filter not in self._public_trades_streams  | 
384 |  | -            or not self._public_trades_streams[public_trade_filter].is_running  | 
385 |  | -        ):  | 
386 |  | -            try:  | 
387 |  | -                self._public_trades_streams[public_trade_filter] = (  | 
388 |  | -                    GrpcStreamBroadcaster(  | 
389 |  | -                        f"electricity-trading-{public_trade_filter}",  | 
390 |  | -                        lambda: self.stub.ReceivePublicTradesStream(  | 
391 |  | -                            electricity_trading_pb2.ReceivePublicTradesStreamRequest(  | 
392 |  | -                                filter=public_trade_filter.to_pb(),  | 
393 |  | -                            ),  | 
394 |  | -                            metadata=self._metadata,  | 
395 |  | -                        ),  | 
396 |  | -                        lambda response: PublicTrade.from_pb(response.public_trade),  | 
397 |  | -                    )  | 
398 |  | -                )  | 
399 |  | -            except grpc.RpcError as e:  | 
400 |  | -                _logger.exception("Error occurred while streaming public trades: %s", e)  | 
401 |  | -                raise  | 
402 |  | -        return self._public_trades_streams[public_trade_filter]  | 
403 |  | - | 
404 | 349 |     def validate_params(  | 
405 | 350 |         # pylint: disable=too-many-arguments, too-many-positional-arguments, too-many-branches  | 
406 | 351 |         self,  | 
@@ -943,71 +888,76 @@ async def list_gridpool_trades(  | 
943 | 888 |                 _logger.exception("Error occurred while listing gridpool trades: %s", e)  | 
944 | 889 |                 raise  | 
945 | 890 | 
 
  | 
946 |  | -    async def list_public_trades(  | 
 | 891 | +    def receive_public_trades(  | 
947 | 892 |         # pylint: disable=too-many-arguments, too-many-positional-arguments  | 
948 | 893 |         self,  | 
949 | 894 |         states: list[TradeState] | None = None,  | 
950 | 895 |         delivery_period: DeliveryPeriod | None = None,  | 
951 | 896 |         buy_delivery_area: DeliveryArea | None = None,  | 
952 | 897 |         sell_delivery_area: DeliveryArea | None = None,  | 
953 |  | -        page_size: int | None = None,  | 
954 |  | -        timeout: timedelta | None = None,  | 
955 |  | -    ) -> AsyncIterator[PublicTrade]:  | 
 | 898 | +        start_time: datetime | None = None,  | 
 | 899 | +        end_time: datetime | None = None,  | 
 | 900 | +    ) -> GrpcStreamBroadcaster[  | 
 | 901 | +        electricity_trading_pb2.ReceivePublicTradesStreamResponse, PublicTrade  | 
 | 902 | +    ]:  | 
956 | 903 |         """  | 
957 |  | -        List all executed public orders with optional filters and pagination.  | 
 | 904 | +        Stream public trades with optional filters and time range.  | 
958 | 905 | 
  | 
959 | 906 |         Args:  | 
960 |  | -            states: List of order states to filter by.  | 
961 |  | -            delivery_period: The delivery period to filter by.  | 
962 |  | -            buy_delivery_area: The buy delivery area to filter by.  | 
963 |  | -            sell_delivery_area: The sell delivery area to filter by.  | 
964 |  | -            page_size: The number of public trades to return per page.  | 
965 |  | -            timeout: Timeout duration, defaults to None.  | 
 | 907 | +            states: List of order states to filter for.  | 
 | 908 | +            delivery_period: Delivery period to filter for.  | 
 | 909 | +            buy_delivery_area: Buy delivery area to filter for.  | 
 | 910 | +            sell_delivery_area: Sell delivery area to filter for.  | 
 | 911 | +            start_time: The starting timestamp to stream trades from. If None, streams from now.  | 
 | 912 | +            end_time: The ending timestamp to stop streaming trades. If None, streams indefinitely.  | 
966 | 913 | 
  | 
967 |  | -        Yields:  | 
968 |  | -            The list of public trades for each page.  | 
 | 914 | +        Returns:  | 
 | 915 | +            Async generator of orders.  | 
969 | 916 | 
  | 
970 | 917 |         Raises:  | 
971 |  | -            grpc.RpcError: If an error occurs while listing public trades.  | 
 | 918 | +            grpc.RpcError: If an error occurs while streaming public trades.  | 
972 | 919 |         """  | 
 | 920 | + | 
 | 921 | +        def dt_to_pb_timestamp(dt: datetime) -> Timestamp:  | 
 | 922 | +            ts = Timestamp()  | 
 | 923 | +            ts.FromDatetime(dt)  | 
 | 924 | +            return ts  | 
 | 925 | + | 
 | 926 | +        self.validate_params(delivery_period=delivery_period)  | 
 | 927 | + | 
973 | 928 |         public_trade_filter = PublicTradeFilter(  | 
974 | 929 |             states=states,  | 
975 | 930 |             delivery_period=delivery_period,  | 
976 | 931 |             buy_delivery_area=buy_delivery_area,  | 
977 | 932 |             sell_delivery_area=sell_delivery_area,  | 
978 | 933 |         )  | 
979 | 934 | 
 
  | 
980 |  | -        request = electricity_trading_pb2.ListPublicTradesRequest(  | 
981 |  | -            filter=public_trade_filter.to_pb(),  | 
982 |  | -            pagination_params=(  | 
983 |  | -                Params(page_size=page_size).to_proto() if page_size else None  | 
984 |  | -            ),  | 
985 |  | -        )  | 
986 |  | - | 
987 |  | -        while True:  | 
 | 935 | +        if (  | 
 | 936 | +            public_trade_filter not in self._public_trades_streams  | 
 | 937 | +            or not self._public_trades_streams[public_trade_filter].is_running  | 
 | 938 | +        ):  | 
988 | 939 |             try:  | 
989 |  | -                response = await cast(  | 
990 |  | -                    Awaitable[electricity_trading_pb2.ListPublicTradesResponse],  | 
991 |  | -                    grpc_call_with_timeout(  | 
992 |  | -                        self.stub.ListPublicTrades,  | 
993 |  | -                        request,  | 
994 |  | -                        metadata=self._metadata,  | 
995 |  | -                        timeout=timeout,  | 
996 |  | -                    ),  | 
997 |  | -                )  | 
998 |  | - | 
999 |  | -                for public_trade in response.public_trades:  | 
1000 |  | -                    yield PublicTrade.from_pb(public_trade)  | 
1001 |  | - | 
1002 |  | -                if response.pagination_info.next_page_token:  | 
1003 |  | -                    request.pagination_params.CopyFrom(  | 
1004 |  | -                        PaginationParams(  | 
1005 |  | -                            page_token=response.pagination_info.next_page_token  | 
1006 |  | -                        )  | 
 | 940 | +                self._public_trades_streams[public_trade_filter] = (  | 
 | 941 | +                    GrpcStreamBroadcaster(  | 
 | 942 | +                        f"electricity-trading-{public_trade_filter}",  | 
 | 943 | +                        lambda: self.stub.ReceivePublicTradesStream(  | 
 | 944 | +                            electricity_trading_pb2.ReceivePublicTradesStreamRequest(  | 
 | 945 | +                                filter=public_trade_filter.to_pb(),  | 
 | 946 | +                                start_time=(  | 
 | 947 | +                                    dt_to_pb_timestamp(start_time)  | 
 | 948 | +                                    if start_time  | 
 | 949 | +                                    else None  | 
 | 950 | +                                ),  | 
 | 951 | +                                end_time=(  | 
 | 952 | +                                    dt_to_pb_timestamp(end_time) if end_time else None  | 
 | 953 | +                                ),  | 
 | 954 | +                            ),  | 
 | 955 | +                            metadata=self._metadata,  | 
 | 956 | +                        ),  | 
 | 957 | +                        lambda response: PublicTrade.from_pb(response.public_trade),  | 
1007 | 958 |                     )  | 
1008 |  | -                else:  | 
1009 |  | -                    break  | 
1010 |  | - | 
 | 959 | +                )  | 
1011 | 960 |             except grpc.RpcError as e:  | 
1012 |  | -                _logger.exception("Error occurred while listing public trades: %s", e)  | 
 | 961 | +                _logger.exception("Error occurred while streaming public trades: %s", e)  | 
1013 | 962 |                 raise  | 
 | 963 | +        return self._public_trades_streams[public_trade_filter]  | 
0 commit comments