GNServer 0.0.0.0.36__tar.gz → 0.0.0.0.38__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/GNServer/GNServer/_app.py +5 -5
  2. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/GNServer/GNServer/_client.py +83 -17
  3. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/GNServer/GNServer/_func_params_validation.py +0 -1
  4. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/GNServer/GNServer.egg-info/PKG-INFO +1 -1
  5. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/PKG-INFO +1 -1
  6. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/setup.py +1 -1
  7. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/GNServer/GNServer/__init__.py +0 -0
  8. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/GNServer/GNServer/_cors_resolver.py +0 -0
  9. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/GNServer/GNServer/_crt.py +0 -0
  10. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/GNServer/GNServer/_routes.py +0 -0
  11. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/GNServer/GNServer/_template_resolver.py +0 -0
  12. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/GNServer/GNServer.egg-info/SOURCES.txt +0 -0
  13. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/GNServer/GNServer.egg-info/dependency_links.txt +0 -0
  14. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/GNServer/GNServer.egg-info/requires.txt +0 -0
  15. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/GNServer/GNServer.egg-info/top_level.txt +0 -0
  16. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/GNServer/LICENSE +0 -0
  17. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/GNServer/mmbConfig.json +0 -0
  18. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/LICENSE +0 -0
  19. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/MANIFEST.in +0 -0
  20. {gnserver-0.0.0.0.36 → gnserver-0.0.0.0.38}/setup.cfg +0 -0
@@ -44,9 +44,9 @@ logger = logging.getLogger("GNServer")
44
44
  logger.setLevel(logging.DEBUG)
45
45
 
46
46
  console = logging.StreamHandler()
47
- console.setLevel(logging.INFO)
47
+ console.setLevel(logging.DEBUG)
48
48
  console.setFormatter(logging.Formatter("[GNServer] %(name)s: %(levelname)s: %(message)s"))
49
-
49
+ logger.addHandler(console)
50
50
 
51
51
 
52
52
  def guess_type(filename: str) -> str:
@@ -238,8 +238,6 @@ class App:
238
238
  raw = qvals if len(qvals) > 1 else qvals[0]
239
239
  kw[qn] = _convert_value(raw, _ann(qn), str)
240
240
 
241
- if "request" in sig.parameters:
242
- kw["request"] = request
243
241
 
244
242
  params = set(sig.parameters.keys())
245
243
  kw = {k: v for k, v in kw.items() if k in params}
@@ -247,8 +245,10 @@ class App:
247
245
 
248
246
  rv = validate_params_by_key(kw, r.handler)
249
247
  if rv is not None:
250
- AllGNFastCommands.UnprocessableEntity({'dev_error': rv, 'user_error': f'Server request error {self.domain}'})
248
+ raise AllGNFastCommands.UnprocessableEntity({'dev_error': rv, 'user_error': f'Server request error {self.domain}'})
251
249
 
250
+ if "request" in sig.parameters:
251
+ kw["request"] = request
252
252
 
253
253
  if inspect.isasyncgenfunction(r.handler):
254
254
  return r.handler(**kw)
@@ -78,14 +78,55 @@ class GNExceptions:
78
78
  from KeyisBTools import TTLDict
79
79
  from KeyisBTools.cryptography.sign import s2
80
80
  from KeyisBTools.cryptography import m1
81
- from KeyisBTools.cryptography.bytes import hash
82
- from KeyisBTools.models.serialization import serialize, deserialize
81
+ from KeyisBTools.cryptography.bytes import hash, userFriendly
82
+ from KeyisBTools.models.serialization import serialize
83
+ from KeyisBTools.ranges.positionRange import in_range
83
84
  from gnobjects.net.objects import GNRequest, GNResponse, Url
84
85
 
85
86
  from ._crt import crt_client
86
87
 
87
88
 
88
89
 
90
+ _log_levels: dict[str, int] = {
91
+ "NOTSET": 0,
92
+ "DEBUG": 10,
93
+ "INFO": 20,
94
+ "WARNING": 30,
95
+ "ERROR": 40,
96
+ "CRITICAL": 50,
97
+ "notset": 0,
98
+ "debug": 10,
99
+ "info": 20,
100
+ "warning": 30,
101
+ "error": 40,
102
+ "critical": 50,
103
+ }
104
+
105
+ def devLog(request: GNRequest, point: str, level: int, log: str):
106
+ """
107
+ - NOTSET 0
108
+ - DEBUG 10
109
+ - INFO 20
110
+ - WARNING 30
111
+ - ERROR 40
112
+ - CRITICAL 50
113
+ """
114
+ if request.transportObject.routeProtocol.dev:
115
+ if hasattr(request, '_devDataLog'):
116
+ if request._devDataLogLevel <= level:
117
+ if in_range(point, request._devDataRange):
118
+
119
+ log = f'[{level}]({datetime.datetime.now()}): {log}'
120
+
121
+ request._devDataLog.append(log)
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+
89
130
 
90
131
  async def chain_async(first_item, rest: AsyncIterable) -> AsyncGenerator:
91
132
  yield first_item
@@ -112,10 +153,10 @@ class AsyncClient:
112
153
  if isinstance(server_key, bytes):
113
154
  self.__server_key = server_key
114
155
  else:
115
- if not os.path.exists(server_key):
116
- raise Exception(f'Path not found: {server_key}')
117
-
118
- self.__server_key = open(server_key, 'rb').read()
156
+ if os.path.exists(server_key):
157
+ self.__server_key = open(server_key, 'rb').read()
158
+ else:
159
+ self.__server_key = userFriendly.decode(server_key)
119
160
  else:
120
161
  self.__server_key = None
121
162
 
@@ -219,16 +260,17 @@ class AsyncClient:
219
260
  self.__response_callbacks[name] = callback
220
261
 
221
262
 
222
- async def connect(self, domain: str, restart_connection: bool = False, reconnect_wait: float = 10, keep_alive: bool = True) -> 'QuicClient':
223
- print('Запрос подключения')
263
+ async def connect(self, request: GNRequest, restart_connection: bool = False, reconnect_wait: float = 10, keep_alive: bool = True) -> 'QuicClient':
264
+ domain = request.url.hostname
265
+ devLog(request, '1.2.1', 10, f'Connect to {domain}: restart_connection={restart_connection}, reconnect_wait={reconnect_wait}, keep_alive={keep_alive}')
224
266
  if not restart_connection and domain in self._active_connections:
225
267
  c = self._active_connections[domain]
226
- print(f'Подключение уже было [{c.status}]')
268
+ devLog(request, '1.2.2', 10, f'Connection to {domain} found: status={c.status}')
227
269
  if c.status == 'connecting':
228
- print('ждем поделючения')
270
+ devLog(request, '1.2.3', 10, f'Waiting for connection to {domain}...')
229
271
  try:
230
272
  await asyncio.wait_for(c.connect_future, reconnect_wait)
231
- print('дождались')
273
+ devLog(request, '1.2.4', 10, f'Connected to {domain}: status={c.status}')
232
274
  if c.status == 'active':
233
275
  return c
234
276
  elif c.status == 'connecting': # если очень долго подключаемся, то кидаем ошибку
@@ -237,7 +279,7 @@ class AsyncClient:
237
279
  elif c.status == 'disconnect':
238
280
  raise GNExceptions.ConnectionError.client.connection
239
281
  except:
240
- print('Заново соеденяемся...')
282
+ devLog(request, '1.2.5', 10, f'Connection to {domain} failed or timed out.')
241
283
  await self.disconnect(domain)
242
284
 
243
285
  else:
@@ -247,7 +289,9 @@ class AsyncClient:
247
289
  c.status = 'connecting'
248
290
  self._active_connections[domain] = c
249
291
 
292
+ devLog(request, '1.2.6', 10, f'Connecting to {domain}...')
250
293
  data = await self.getDNS(domain)
294
+ devLog(request, '1.2.7', 10, f'Got DNS for {domain}: {data}')
251
295
 
252
296
  data = data.split(':')
253
297
 
@@ -258,7 +302,7 @@ class AsyncClient:
258
302
 
259
303
  c._disconnect_signal = f # type: ignore
260
304
  c._domain = domain # type: ignore
261
-
305
+ devLog(request, '1.2.8', 10, f'Creating QuicClient for {domain}...')
262
306
  await c.connect(data[0], int(data[1]), keep_alive=keep_alive)
263
307
  await c.connect_future
264
308
 
@@ -274,13 +318,31 @@ class AsyncClient:
274
318
  def _return_token(self, bigToken: str, s: bool = True) -> str:
275
319
  return bigToken[:128] if s else bigToken[128:]
276
320
 
321
+ async def _resolve_requests_transport(self, request: GNRequest) -> GNRequest:
322
+
323
+ if request.transportObject.routeProtocol.dev:
324
+ if request.cookies is not None:
325
+ data: Optional[dict] = request.cookies.get('gn', {}).get('request', {}).get('transport', {}).get('::dev')
326
+ if data is not None:
327
+ data['params']['logs']['data'] = []
328
+ data['params']['data']['data'] = {}
329
+ request._devDataLog = data['params']['logs']['data']
330
+ request._devDataLogLevel = _log_levels[data['params']['logs']['data']]
331
+ request._devData = data['params']['data']['data']
332
+ request._devDataRange = data['params']['range']
333
+
334
+ return request
277
335
 
278
336
  async def request(self, request: Union[GNRequest, AsyncGenerator[GNRequest, Any]], keep_alive: bool = True, restart_connection: bool = False, reconnect_wait: float = 10) -> GNResponse:
337
+ devLog(request, '1.1.1', 10, f'Request starting... {request}: keep_alive={keep_alive}, restart_connection={restart_connection}, reconnect_wait={reconnect_wait}')
338
+
279
339
  if isinstance(request, GNRequest):
340
+ devLog(request, '1.1.2', 10, 'Request is GNRequest')
280
341
 
342
+ request = await self._resolve_requests_transport(request)
281
343
 
282
- c = await self.connect(request.url.hostname, restart_connection, reconnect_wait, keep_alive=keep_alive)
283
-
344
+ c = await self.connect(request, restart_connection, reconnect_wait, keep_alive=keep_alive)
345
+ devLog(request, '1.1.3', 10, f'Connected: {c.status}')
284
346
 
285
347
 
286
348
  for f in self.__request_callbacks.values():
@@ -294,6 +356,7 @@ class AsyncClient:
294
356
  return r
295
357
 
296
358
  else:
359
+
297
360
  c: Optional[QuicClient] = None
298
361
 
299
362
  async def wrapped(request) -> AsyncGenerator[GNRequest, None]:
@@ -307,7 +370,7 @@ class AsyncClient:
307
370
 
308
371
  nonlocal c
309
372
  if c is None: # инициализируем при первом req
310
- c = await self.connect(request.url.hostname, restart_connection, reconnect_wait, keep_alive=keep_alive)
373
+ c = await self.connect(request, restart_connection, reconnect_wait, keep_alive=keep_alive)
311
374
 
312
375
  yield req
313
376
 
@@ -559,6 +622,7 @@ class RawQuicClient(QuicConnectionProtocol):
559
622
  if isinstance(request, GNRequest):
560
623
  blob = request.serialize(2)
561
624
  sid = self._quic.get_next_available_stream_id()
625
+ devLog(request, '1.3.1', 10, f'Sending request on stream {sid}')
562
626
  self._enqueue(sid, blob, True, False)
563
627
  self._schedule_flush()
564
628
 
@@ -719,7 +783,9 @@ class QuicClient:
719
783
  raise RuntimeError("Not connected")
720
784
 
721
785
  resp = await self._quik_core.request(request)
722
- return GNResponse.deserialize(resp, 2)
786
+ r = GNResponse.deserialize(resp, 2)
787
+ devLog(request, '1.4.1', 10, f'Response received: {r}')
788
+ return r
723
789
 
724
790
  async def asyncRequestStream(self, request: Union[GNRequest, AsyncGenerator[GNRequest, Any]]) -> AsyncGenerator[GNResponse, None]:
725
791
 
@@ -2,7 +2,6 @@
2
2
  import inspect, datetime, functools, threading
3
3
  from inspect import Parameter, _empty
4
4
  from typing import Any, Union, get_origin, get_args
5
-
6
5
  _NoneType = type(None)
7
6
  _KEYTYPES = (str, bytes, int)
8
7
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GNServer
3
- Version: 0.0.0.0.36
3
+ Version: 0.0.0.0.38
4
4
  Summary: GNServer
5
5
  Home-page: https://github.com/KeyisB/libs/tree/main/GNServer
6
6
  Author: KeyisB
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GNServer
3
- Version: 0.0.0.0.36
3
+ Version: 0.0.0.0.38
4
4
  Summary: GNServer
5
5
  Home-page: https://github.com/KeyisB/libs/tree/main/GNServer
6
6
  Author: KeyisB
@@ -5,7 +5,7 @@ filesName = 'GNServer'
5
5
 
6
6
  setup(
7
7
  name=name,
8
- version='0.0.0.0.36',
8
+ version='0.0.0.0.38',
9
9
  author="KeyisB",
10
10
  author_email="keyisb.pip@gmail.com",
11
11
  description=name,
File without changes
File without changes
File without changes