@@ -47,31 +47,15 @@ def __init__(
4747 """
4848 self .api_key = api_key
4949 self .is_testnet = is_testnet
50+ self .max_retries = max (max_retries , 0 )
5051
51- self ._timeout = kwargs ['_timeout' ] if ('_timeout' in kwargs ) else timeout
52- self ._max_retries = kwargs ['_max_retries' ] if ('_max_retries' in kwargs ) else (
53- max_retries
54- if max_retries >= 0 else
55- 0
56- )
57- self ._headers = kwargs ['_headers' ] if ('_headers' in kwargs ) else (
58- headers
59- if headers else
60- ({"Authorization" : f"Bearer { api_key } " } if api_key else {})
61- )
62- self ._base_url = kwargs ['_base_url' ] if ('_base_url' in kwargs ) else (
63- base_url
64- if base_url else
65- "https://tonapi.io/" if not is_testnet else "https://testnet.tonapi.io/"
66- )
67- self ._websocket_url = kwargs ['_websocket_url' ] if ('_websocket_url' in kwargs ) else (
68- websocket_url
69- if websocket_url else
70- "wss://tonapi.io/v2/websocket"
71- )
72-
73- self ._debug = kwargs ['_debug' ] if ('_debug' in kwargs ) else debug
74- self ._logger = kwargs ['_logger' ] if ('_logger' in kwargs ) else setup_logging (self ._debug )
52+ self .headers = headers or {"Authorization" : f"Bearer { self .api_key } " }
53+ self .base_url = base_url or "https://tonapi.io/" if not is_testnet else "https://testnet.tonapi.io/"
54+ self .websocket_url = websocket_url or "wss://tonapi.io/v2/websocket"
55+
56+ self .timeout = timeout
57+ self .debug = debug
58+ self .logger = setup_logging (self .debug )
7559
7660 @staticmethod
7761 async def __read_content (response : aiohttp .ClientResponse ) -> Dict [str , Any ]:
@@ -115,7 +99,7 @@ async def __raise_for_status(self, response: aiohttp.ClientResponse) -> None:
11599 error_text = await self .__read_content (response )
116100 error_class = error_map .get (response .status , TONAPIError )
117101
118- self ._logger .error (f"Error response received: { error_text } " )
102+ self .logger .error (f"Error response received: { error_text } " )
119103 raise error_class (error_text )
120104
121105 async def _subscribe (
@@ -129,12 +113,12 @@ async def _subscribe(
129113 :param method: The API method to subscribe to.
130114 :param params: Optional parameters for the API method.
131115 """
132- url = self ._base_url + method
133- self ._logger .debug (f"Subscribing to SSE with URL: { url } and params: { params } " )
116+ url = self .base_url + method
117+ self .logger .debug (f"Subscribing to SSE with URL: { url } and params: { params } " )
134118
135119 try :
136- async with aiohttp .ClientSession (headers = self ._headers ) as session :
137- async with session .get (url , params = params or {}, timeout = self ._timeout ) as response :
120+ async with aiohttp .ClientSession (headers = self .headers ) as session :
121+ async with session .get (url , params = params or {}, timeout = self .timeout ) as response :
138122 await self .__raise_for_status (response )
139123
140124 async for line in response .content :
@@ -146,19 +130,19 @@ async def _subscribe(
146130 try :
147131 key , value = line_string .split (": " , 1 )
148132 except ValueError :
149- self ._logger .debug (f"Skipped line due to ValueError: { line_string } " )
133+ self .logger .debug (f"Skipped line due to ValueError: { line_string } " )
150134 continue
151135
152136 if value == "heartbeat" :
153- self ._logger .debug ("Received heartbeat" )
137+ self .logger .debug ("Received heartbeat" )
154138 continue
155139 if key == "data" :
156- self ._logger .debug (f"Received SSE data: { value } " )
140+ self .logger .debug (f"Received SSE data: { value } " )
157141 data = json .loads (value )
158142 yield data
159143
160144 except aiohttp .ClientError as e :
161- self ._logger .error (f"Error subscribing to SSE: { e } " )
145+ self .logger .error (f"Error subscribing to SSE: { e } " )
162146 raise TONAPIError (e )
163147
164148 async def _subscribe_websocket (
@@ -179,37 +163,37 @@ async def _subscribe_websocket(
179163 "method" : method ,
180164 "params" : params ,
181165 }
182- self ._logger .debug (f"Subscribing to WebSocket with payload: { payload } " )
166+ self .logger .debug (f"Subscribing to WebSocket with payload: { payload } " )
183167
184168 try :
185169 async with aiohttp .ClientSession () as session :
186- async with session .ws_connect (self ._websocket_url ) as ws :
170+ async with session .ws_connect (self .websocket_url ) as ws :
187171 await ws .send_json (payload )
188172
189173 async for msg in ws :
190174 if isinstance (msg , aiohttp .WSMessage ):
191175 if msg .type == aiohttp .WSMsgType .TEXT :
192176 message_json = json .loads (msg .data )
193- self ._logger .debug (f"Received WebSocket message: { message_json } " )
177+ self .logger .debug (f"Received WebSocket message: { message_json } " )
194178 if "params" in message_json :
195179 params = message_json ["params" ]
196- self ._logger .debug (f"Received WebSocket params: { params } " )
180+ self .logger .debug (f"Received WebSocket params: { params } " )
197181 yield params
198182 elif "result" in message_json :
199183 result = message_json ["result" ]
200184 if not result .startswith ("success" ):
201185 raise TONAPIError (result )
202186 elif msg .type == aiohttp .WSMsgType .CLOSED :
203- self ._logger .warning ("WebSocket connection closed" )
187+ self .logger .warning ("WebSocket connection closed" )
204188 break
205189 elif msg .type == aiohttp .WSMsgType .ERROR :
206- self ._logger .error (f"WebSocket error: { ws .exception ()} " )
190+ self .logger .error (f"WebSocket error: { ws .exception ()} " )
207191 raise TONAPIError (f"WebSocket error: { ws .exception ()} " )
208192 else :
209193 raise TONAPIError (f"Unexpected WebSocket message type" )
210194
211195 except aiohttp .ClientError as e :
212- self ._logger .error (f"WebSocket connection failed: { e } " )
196+ self .logger .error (f"WebSocket connection failed: { e } " )
213197 raise TONAPIError (e )
214198 finally :
215199 if not ws .closed :
@@ -233,18 +217,18 @@ async def _request(
233217 :param body: Optional request body data.
234218 :return: The response content as a dictionary.
235219 """
236- url = self ._base_url + path
237- headers = {** self ._headers , ** (headers or {})}
220+ url = self .base_url + path
221+ headers = {** self .headers , ** (headers or {})}
238222 if params :
239223 params = {k : str (v ).lower () if isinstance (v , bool ) else v for k , v in params .items ()}
240224
241- self ._logger .debug (f"Request { method } : { url } " )
242- self ._logger .debug (f"Headers: { headers } , Params: { params } , Body: { body } " )
225+ self .logger .debug (f"Request { method } : { url } " )
226+ self .logger .debug (f"Headers: { headers } , Params: { params } , Body: { body } " )
243227
244- timeout = aiohttp .ClientTimeout (total = self ._timeout )
228+ timeout = aiohttp .ClientTimeout (total = self .timeout )
245229
246230 async with aiohttp .ClientSession (timeout = timeout ) as session :
247- for attempt in range (self ._max_retries + 1 ):
231+ for attempt in range (self .max_retries + 1 ):
248232 try :
249233 async with session .request (
250234 method = method ,
@@ -256,8 +240,8 @@ async def _request(
256240 await self .__raise_for_status (response )
257241 return await self .__read_content (response )
258242 except aiohttp .ClientResponseError as e :
259- self ._logger .error (f"Request failed (attempt { attempt } ): { e } " )
260- if attempt < self ._max_retries :
243+ self .logger .error (f"Request failed (attempt { attempt } ): { e } " )
244+ if attempt < self .max_retries :
261245 await asyncio .sleep (1 )
262246 else :
263247 raise TONAPIError (e )
0 commit comments