diff --git a/bfxapi/websocket/_BfxWebsocketInputs.py b/bfxapi/websocket/_BfxWebsocketInputs.py index fda6e19..85e29b0 100644 --- a/bfxapi/websocket/_BfxWebsocketInputs.py +++ b/bfxapi/websocket/_BfxWebsocketInputs.py @@ -2,7 +2,7 @@ from decimal import Decimal from datetime import datetime from typing import Union, Optional, List, Tuple -from .typings import JSON +from .types import JSON from .enums import OrderType, FundingOfferType def _strip(dictionary): diff --git a/bfxapi/websocket/handlers.py b/bfxapi/websocket/handlers.py index 83c1408..33c2654 100644 --- a/bfxapi/websocket/handlers.py +++ b/bfxapi/websocket/handlers.py @@ -1,3 +1,7 @@ +from typing import List + +from .types import * + from . import serializers from .enums import Channels from .exceptions import BfxWebsocketException @@ -174,13 +178,15 @@ class AuthenticatedChannelsHandler(object): raise BfxWebsocketException(f"Event of type <{type}> not found in self.__handlers.") def __notification(self, stream): + type, serializer = "notification", serializers._Notification(serializer=None) + if stream[1] == "on-req" or stream[1] == "ou-req" or stream[1] == "oc-req": - return self.event_emitter.emit(f"{stream[1]}-notification", serializers._Notification(serializer=serializers.Order).parse(*stream)) + type, serializer = f"{stream[1]}-notification", serializers._Notification[Order](serializer=serializers.Order) if stream[1] == "oc_multi-req": - return self.event_emitter.emit(f"{stream[1]}-notification", serializers._Notification(serializer=serializers.Order, iterate=True).parse(*stream)) + type, serializer = f"{stream[1]}-notification", serializers._Notification[List[Order]](serializer=serializers.Order, iterate=True) if stream[1] == "fon-req" or stream[1] == "foc-req": - return self.event_emitter.emit(f"{stream[1]}-notification", serializers._Notification(serializer=serializers.FundingOffer).parse(*stream)) + type, serializer = f"{stream[1]}-notification", serializers._Notification[FundingOffer](serializer=serializers.FundingOffer) - return self.event_emitter.emit("notification", serializers._Notification(serializer=None).parse(*stream)) \ No newline at end of file + return self.event_emitter.emit(type, serializer.parse(*stream)) \ No newline at end of file diff --git a/bfxapi/websocket/serializers.py b/bfxapi/websocket/serializers.py index a9dd805..6bd56c1 100644 --- a/bfxapi/websocket/serializers.py +++ b/bfxapi/websocket/serializers.py @@ -1,4 +1,4 @@ -from . import typings +from . import types from .. labeler import _Serializer @@ -6,7 +6,7 @@ from .. notification import _Notification #region Serializers definition for Websocket Public Channels -TradingPairTicker = _Serializer[typings.TradingPairTicker]("TradingPairTicker", labels=[ +TradingPairTicker = _Serializer[types.TradingPairTicker]("TradingPairTicker", labels=[ "BID", "BID_SIZE", "ASK", @@ -19,7 +19,7 @@ TradingPairTicker = _Serializer[typings.TradingPairTicker]("TradingPairTicker", "LOW" ]) -FundingCurrencyTicker = _Serializer[typings.FundingCurrencyTicker]("FundingCurrencyTicker", labels=[ +FundingCurrencyTicker = _Serializer[types.FundingCurrencyTicker]("FundingCurrencyTicker", labels=[ "FRR", "BID", "BID_PERIOD", @@ -38,14 +38,14 @@ FundingCurrencyTicker = _Serializer[typings.FundingCurrencyTicker]("FundingCurre "FRR_AMOUNT_AVAILABLE" ]) -TradingPairTrade = _Serializer[typings.TradingPairTrade]("TradingPairTrade", labels=[ +TradingPairTrade = _Serializer[types.TradingPairTrade]("TradingPairTrade", labels=[ "ID", "MTS", "AMOUNT", "PRICE" ]) -FundingCurrencyTrade = _Serializer[typings.FundingCurrencyTrade]("FundingCurrencyTrade", labels=[ +FundingCurrencyTrade = _Serializer[types.FundingCurrencyTrade]("FundingCurrencyTrade", labels=[ "ID", "MTS", "AMOUNT", @@ -53,33 +53,33 @@ FundingCurrencyTrade = _Serializer[typings.FundingCurrencyTrade]("FundingCurrenc "PERIOD" ]) -TradingPairBook = _Serializer[typings.TradingPairBook]("TradingPairBook", labels=[ +TradingPairBook = _Serializer[types.TradingPairBook]("TradingPairBook", labels=[ "PRICE", "COUNT", "AMOUNT" ]) -FundingCurrencyBook = _Serializer[typings.FundingCurrencyBook]("FundingCurrencyBook", labels=[ +FundingCurrencyBook = _Serializer[types.FundingCurrencyBook]("FundingCurrencyBook", labels=[ "RATE", "PERIOD", "COUNT", "AMOUNT" ]) -TradingPairRawBook = _Serializer[typings.TradingPairRawBook]("TradingPairRawBook", labels=[ +TradingPairRawBook = _Serializer[types.TradingPairRawBook]("TradingPairRawBook", labels=[ "ORDER_ID", "PRICE", "AMOUNT" ]) -FundingCurrencyRawBook = _Serializer[typings.FundingCurrencyRawBook]("FundingCurrencyRawBook", labels=[ +FundingCurrencyRawBook = _Serializer[types.FundingCurrencyRawBook]("FundingCurrencyRawBook", labels=[ "OFFER_ID", "PERIOD", "RATE", "AMOUNT" ]) -Candle = _Serializer[typings.Candle]("Candle", labels=[ +Candle = _Serializer[types.Candle]("Candle", labels=[ "MTS", "OPEN", "CLOSE", @@ -88,7 +88,7 @@ Candle = _Serializer[typings.Candle]("Candle", labels=[ "VOLUME" ]) -DerivativesStatus = _Serializer[typings.DerivativesStatus]("DerivativesStatus", labels=[ +DerivativesStatus = _Serializer[types.DerivativesStatus]("DerivativesStatus", labels=[ "TIME_MS", "_PLACEHOLDER", "DERIV_PRICE", @@ -118,7 +118,7 @@ DerivativesStatus = _Serializer[typings.DerivativesStatus]("DerivativesStatus", #region Serializers definition for Websocket Authenticated Channels -Order = _Serializer[typings.Order]("Order", labels=[ +Order = _Serializer[types.Order]("Order", labels=[ "ID", "GID", "CID", @@ -153,7 +153,7 @@ Order = _Serializer[typings.Order]("Order", labels=[ "META" ]) -Position = _Serializer[typings.Position]("Position", labels=[ +Position = _Serializer[types.Position]("Position", labels=[ "SYMBOL", "STATUS", "AMOUNT", @@ -176,7 +176,7 @@ Position = _Serializer[typings.Position]("Position", labels=[ "META" ]) -TradeExecuted = _Serializer[typings.TradeExecuted]("TradeExecuted", labels=[ +TradeExecuted = _Serializer[types.TradeExecuted]("TradeExecuted", labels=[ "ID", "SYMBOL", "MTS_CREATE", @@ -191,7 +191,7 @@ TradeExecuted = _Serializer[typings.TradeExecuted]("TradeExecuted", labels=[ "CID" ]) -TradeExecutionUpdate = _Serializer[typings.TradeExecutionUpdate]("TradeExecutionUpdate", labels=[ +TradeExecutionUpdate = _Serializer[types.TradeExecutionUpdate]("TradeExecutionUpdate", labels=[ "ID", "SYMBOL", "MTS_CREATE", @@ -206,7 +206,7 @@ TradeExecutionUpdate = _Serializer[typings.TradeExecutionUpdate]("TradeExecution "CID" ]) -FundingOffer = _Serializer[typings.FundingOffer]("FundingOffer", labels=[ +FundingOffer = _Serializer[types.FundingOffer]("FundingOffer", labels=[ "ID", "SYMBOL", "MTS_CREATED", @@ -230,7 +230,7 @@ FundingOffer = _Serializer[typings.FundingOffer]("FundingOffer", labels=[ "_PLACEHOLDER" ]) -FundingCredit = _Serializer[typings.FundingCredit]("FundingCredit", labels=[ +FundingCredit = _Serializer[types.FundingCredit]("FundingCredit", labels=[ "ID", "SYMBOL", "SIDE", @@ -255,7 +255,7 @@ FundingCredit = _Serializer[typings.FundingCredit]("FundingCredit", labels=[ "POSITION_PAIR" ]) -FundingLoan = _Serializer[typings.FundingLoan]("FundingLoan", labels=[ +FundingLoan = _Serializer[types.FundingLoan]("FundingLoan", labels=[ "ID", "SYMBOL", "SIDE", @@ -279,7 +279,7 @@ FundingLoan = _Serializer[typings.FundingLoan]("FundingLoan", labels=[ "NO_CLOSE" ]) -Wallet = _Serializer[typings.Wallet]("Wallet", labels=[ +Wallet = _Serializer[types.Wallet]("Wallet", labels=[ "WALLET_TYPE", "CURRENCY", "BALANCE", @@ -289,7 +289,7 @@ Wallet = _Serializer[typings.Wallet]("Wallet", labels=[ "META" ]) -BalanceInfo = _Serializer[typings.BalanceInfo]("BalanceInfo", labels=[ +BalanceInfo = _Serializer[types.BalanceInfo]("BalanceInfo", labels=[ "AUM", "AUM_NET", ]) diff --git a/bfxapi/websocket/typings.py b/bfxapi/websocket/types.py similarity index 83% rename from bfxapi/websocket/typings.py rename to bfxapi/websocket/types.py index ced6aaa..41838d5 100644 --- a/bfxapi/websocket/typings.py +++ b/bfxapi/websocket/types.py @@ -1,6 +1,10 @@ from typing import Type, Tuple, List, Dict, TypedDict, Union, Optional, Any -from .. notification import Notification +from dataclasses import dataclass + +from ..labeler import _Type + +from ..notification import Notification JSON = Union[Dict[str, "JSON"], List["JSON"], bool, int, float, str, Type[None]] @@ -48,7 +52,8 @@ class Subscriptions: #region Type hinting for Websocket Public Channels -class TradingPairTicker(TypedDict): +@dataclass +class TradingPairTicker(_Type): BID: float BID_SIZE: float ASK: float @@ -60,7 +65,8 @@ class TradingPairTicker(TypedDict): HIGH: float LOW: float -class FundingCurrencyTicker(TypedDict): +@dataclass +class FundingCurrencyTicker(_Type): FRR: float BID: float BID_PERIOD: int @@ -76,42 +82,49 @@ class FundingCurrencyTicker(TypedDict): LOW: float FRR_AMOUNT_AVAILABLE: float -class TradingPairTrade(TypedDict): +@dataclass +class TradingPairTrade(_Type): ID: int MTS: int AMOUNT: float PRICE: float -class FundingCurrencyTrade(TypedDict): +@dataclass +class FundingCurrencyTrade(_Type): ID: int MTS: int AMOUNT: float RATE: float PERIOD: int -class TradingPairBook(TypedDict): +@dataclass +class TradingPairBook(_Type): PRICE: float COUNT: int AMOUNT: float - -class FundingCurrencyBook(TypedDict): + +@dataclass +class FundingCurrencyBook(_Type): RATE: float PERIOD: int COUNT: int AMOUNT: float - -class TradingPairRawBook(TypedDict): + +@dataclass +class TradingPairRawBook(_Type): ORDER_ID: int PRICE: float AMOUNT: float - -class FundingCurrencyRawBook(TypedDict): + +@dataclass +class FundingCurrencyRawBook(_Type): OFFER_ID: int PERIOD: int RATE: float AMOUNT: float -class Candle(TypedDict): +@dataclass +class Candle(_Type): MTS: int OPEN: float CLOSE: float @@ -119,7 +132,8 @@ class Candle(TypedDict): LOW: float VOLUME: float -class DerivativesStatus(TypedDict): +@dataclass +class DerivativesStatus(_Type): TIME_MS: int DERIV_PRICE: float SPOT_PRICE: float @@ -136,8 +150,8 @@ class DerivativesStatus(TypedDict): #endregion #region Type hinting for Websocket Authenticated Channels - -class Order(TypedDict): +@dataclass +class Order(_Type): ID: int GID: int CID: int @@ -161,7 +175,8 @@ class Order(TypedDict): ROUTING: str META: JSON -class Position(TypedDict): +@dataclass +class Position(_Type): SYMBOL: str STATUS: str AMOUNT: float @@ -180,7 +195,8 @@ class Position(TypedDict): COLLATERAL_MIN: float META: JSON -class TradeExecuted(TypedDict): +@dataclass +class TradeExecuted(_Type): ID: int SYMBOL: str MTS_CREATE: int @@ -192,7 +208,8 @@ class TradeExecuted(TypedDict): MAKER:int CID: int -class TradeExecutionUpdate(TypedDict): +@dataclass +class TradeExecutionUpdate(_Type): ID: int SYMBOL: str MTS_CREATE: int @@ -206,7 +223,8 @@ class TradeExecutionUpdate(TypedDict): FEE_CURRENCY: str CID: int -class FundingOffer(TypedDict): +@dataclass +class FundingOffer(_Type): ID: int SYMBOL: str MTS_CREATED: int @@ -222,7 +240,8 @@ class FundingOffer(TypedDict): HIDDEN: int RENEW: int -class FundingCredit(TypedDict): +@dataclass +class FundingCredit(_Type): ID: int SYMBOL: str SIDE: int @@ -242,7 +261,8 @@ class FundingCredit(TypedDict): NO_CLOSE: int POSITION_PAIR: str -class FundingLoan(TypedDict): +@dataclass +class FundingLoan(_Type): ID: int SYMBOL: str SIDE: int @@ -261,7 +281,8 @@ class FundingLoan(TypedDict): RATE_REAL: float NO_CLOSE: int -class Wallet(TypedDict): +@dataclass +class Wallet(_Type): WALLET_TYPE: str CURRENCY: str BALANCE: float @@ -270,7 +291,8 @@ class Wallet(TypedDict): DESCRIPTION: str META: JSON -class BalanceInfo(TypedDict): +@dataclass +class BalanceInfo(_Type): AUM: float AUM_NET: float