GNServer 0.0.0.0.21__tar.gz → 0.0.0.0.23__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.
@@ -31,6 +31,7 @@ DEALINGS IN THE SOFTWARE.
31
31
 
32
32
  from ._app import App, GNExceptions
33
33
  from KeyisBClient.gn import GNRequest, GNResponse, CORSObject, FileObject, TemplateObject
34
+ from KeyisBClient import Url
34
35
 
35
36
 
36
37
 
@@ -2,6 +2,7 @@
2
2
 
3
3
 
4
4
  import re
5
+ import sys
5
6
  import uuid
6
7
  import anyio
7
8
  import decimal
@@ -770,7 +771,7 @@ class App:
770
771
 
771
772
  async def _handle_request(self, request: gn.GNRequest, mode: int):
772
773
 
773
- request.client._data['remote_addr'] = self._quic._network_paths[0].addr[0]
774
+ request.client._data['remote_addr'] = self._quic._network_paths[0].addr
774
775
 
775
776
  try:
776
777
 
@@ -829,6 +830,11 @@ class App:
829
830
  wait: bool = True,
830
831
  run: Optional[Callable] = None
831
832
  ):
833
+ """
834
+ # Запустить сервер
835
+
836
+ Запускает сервер в главном процессе asyncio.run()
837
+ """
832
838
 
833
839
  self.domain = domain
834
840
 
@@ -863,3 +869,27 @@ class App:
863
869
  await asyncio.Event().wait()
864
870
 
865
871
  asyncio.run(_main())
872
+
873
+
874
+ def runByVMHost(self):
875
+ """
876
+ # Запусить через VM-host
877
+
878
+ Заупскает сервер через процесс vm-host
879
+ """
880
+ argv = sys.argv[1:]
881
+ command = argv[0]
882
+ if command == 'gn:vm-host:start':
883
+ domain = argv[1]
884
+ port = int(argv[2])
885
+ cert_path = argv[3]
886
+ key_path = argv[4]
887
+ host = argv[5]
888
+
889
+ self.run(
890
+ domain=domain,
891
+ port=port,
892
+ cert_path=cert_path,
893
+ key_path=key_path,
894
+ host=host
895
+ )
@@ -0,0 +1 @@
1
+ from ._models import TTLDict
@@ -0,0 +1,74 @@
1
+ import time
2
+ import asyncio
3
+ from typing import Optional
4
+
5
+
6
+
7
+ class TTLDict:
8
+ def __init__(self, default_ttl: int = 60, cleanup_interval: int = 300):
9
+ """
10
+ :param default_ttl: TTL по умолчанию (сек), если при записи не указан
11
+ :param cleanup_interval: периодическая очистка от просроченных ключей (сек), по умолчанию 5 мин
12
+ """
13
+
14
+ self._store = {}
15
+ self._default_ttl = default_ttl
16
+ self._cleanup_interval = cleanup_interval
17
+ self._task = None
18
+
19
+ def set(self, key, value, ttl: Optional[int] = None):
20
+ if ttl is None:
21
+ ttl = self._default_ttl
22
+ expire_at = time.monotonic() + ttl
23
+ self._store[key] = (value, expire_at)
24
+
25
+ if self._task is None:
26
+ loop = asyncio.get_running_loop()
27
+ self._task = loop.create_task(self._cleanup_worker())
28
+
29
+ def get(self, key):
30
+ now = time.monotonic()
31
+ item = self._store.get(key)
32
+ if not item:
33
+ return None
34
+
35
+ value, expire_at = item
36
+ if expire_at < now:
37
+ del self._store[key]
38
+ return None
39
+ return value
40
+
41
+ def __setitem__(self, key, value):
42
+ self.set(key, value, self._default_ttl)
43
+
44
+ def __getitem__(self, key):
45
+ return self.get(key)
46
+
47
+ def __contains__(self, key):
48
+ return self.get(key) is not None
49
+
50
+ def __len__(self):
51
+ return len(self._store)
52
+
53
+ def __repr__(self):
54
+ return f"<TTLDict size={len(self._store)}>"
55
+
56
+ async def _cleanup_worker(self):
57
+ while True:
58
+ await asyncio.sleep(self._cleanup_interval)
59
+ self.cleanup()
60
+
61
+ def cleanup(self):
62
+ """Удалить все просроченные ключи"""
63
+ now = time.monotonic()
64
+ expired = [k for k, (_, exp) in self._store.items() if exp < now]
65
+ for k in expired:
66
+ self._store.pop(k, None)
67
+
68
+ async def stop(self):
69
+ """Остановить фон очистки"""
70
+ self._task.cancel()
71
+ try:
72
+ await self._task
73
+ except asyncio.CancelledError:
74
+ pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GNServer
3
- Version: 0.0.0.0.21
3
+ Version: 0.0.0.0.23
4
4
  Summary: GNServer
5
5
  Home-page: https://github.com/KeyisB/libs/tree/main/GNServer
6
6
  Author: KeyisB
@@ -11,4 +11,6 @@ GNServer/GNServer.egg-info/PKG-INFO
11
11
  GNServer/GNServer.egg-info/SOURCES.txt
12
12
  GNServer/GNServer.egg-info/dependency_links.txt
13
13
  GNServer/GNServer.egg-info/requires.txt
14
- GNServer/GNServer.egg-info/top_level.txt
14
+ GNServer/GNServer.egg-info/top_level.txt
15
+ GNServer/GNServer/tools/__init__.py
16
+ GNServer/GNServer/tools/_models.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GNServer
3
- Version: 0.0.0.0.21
3
+ Version: 0.0.0.0.23
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.21',
8
+ version='0.0.0.0.23',
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